/******************************************************************** Noppen Bumpmap für eine Kugel Plugin für Cinema Version 7.0 (c) Jürgen Meier (www.3d-meier.de) Version : 1.00 18.05.2004 *********************************************************************/ // Globale Variablen und Konstanten // Plugin ID Nummer const var cPluginID = 1016025; // Pluginname const var cPlugName = "Noppen"; // Pluginhilfstext const var cPlugHelp = "Erzeugt Noppen für eine Kugel"; // Objektname const var cObjName = "Noppen"; // Index var i,k,zz,f; // Koordinaten der Punkte var x,y,z; // Breite des Menütextes var Breite=150; // Maximalwerte var cMaxFloat=1000000; var cMaxInt=100000000; // Objektvariable var qObj; // Dialogvariable var gDial; // Attraktorspezifische Variablen // Konstanten var a=0.0; var b=0.0; var c=630; var d=2.0; // Radius var Radius=5.0; // ****************************************************************** // Funktion zum Objekt aktivieren (c) h.g.seib // ****************************************************************** fSetActiveObject(vDoc,vObj) { // Aktives Objekt ermitteln var vAObj = GetActiveObject(vDoc); // Active object Bit bzw. Flag setzen if (vAObj) vAObj->DelBit(BIT_AOBJ); vObj->SetBit(BIT_AOBJ); // Änderung im Dokument bekanngeben (neues Objekt selektiert) GeEventAdd(NEW_ACTIVE_OBJECT); } // ****************************************************************** // Funktion zur Berechnung des Attraktors fAttraktor(vDoc) { // Nullobjekt erzeugen var attraktor = new(NullObject); // Name zuweisen attraktor->SetName(cObjName); // Nullobjekt in die Szene einfügen vDoc->InsertObject(attraktor,NULL,NULL); // Neues Primitive Object erzeugen var kugel = new(PrimitiveObject); // Aus dem Primitive Object eine Kugel machen kugel->SetPrimitiveType(PRIMITIVE_SPHERE); // Container erzeugen var sc = kugel->GetContainer(); // Radius der Kugel setzen sc->SetData(PRIM_SPHERE_RAD,Radius); // Container Variablen zurückgeben kugel->SetContainer(sc); // Name zuweisen kugel->SetName("Kugel"); // Objekt in der Dokumenthierarchie positionieren vDoc->InsertObject(kugel,attraktor,NULL); // Bumpmap berechnen i=0; k=0; zz=0; do { // y= k*(2*Radius+d); // Faktor berechnen f=Radius/(Radius*cos(y/100)); // Erste Kugel positionieren // Inde zurücketzen i=0; kugel->SetPosition(vector(a,y,0)); kugel->SetScale(vector(1*f,1,1)); // Restliche Punkte berechnen do { // Instanz der Kugel erzeugen var instanz = new(InstanceObject); var ic = instanz->GetContainer(); // Instanz auf Kugel setzen ic->SetData(INSTANCEOBJECT_SOURCE,"Kugel"); instanz->SetContainer(ic); // Name zuweisen instanz->SetName("I-Kugel"+tostring(zz)); // Instanz positionieren x=i*(2*Radius+d); x=x*abs(f); instanz->SetPosition(vector(a+x,y,0)); instanz->SetScale(vector(1*f,1,1)); // Objekt in der Dokumenthierarchie positionieren if (a+x>=b && a+x<=c) { vDoc->InsertObject(instanz,attraktor,NULL); GeEventAdd(DOCUMENT_CHANGED); // Zähler erhöhen zz=zz+1; } // Index i erhöhen i=i+1; } while (a+x<645); // Index k erhöhen k=k+1; } while (y<158-Radius-d); // Objekt aktivieren fSetActiveObject(vDoc,attraktor); GeEventAdd(DOCUMENT_CHANGED); return TRUE; } // ****************************************************************** // Ableitung der Klasse MyDialog von GeDialog // ****************************************************************** class MyDialog : GeDialog { public: MyDialog(); CreateLayout(); Init(); CoreMessage(vID,vMSG); Command(vID,vMSG); } // ****************************************************************** // Deklaration des Konstruktors MyDialog::MyDialog() { // Konstruktor der parent class aufrufen super(cPluginID); } // ****************************************************************** // Deklaration der Methode CreateLayout MyDialog::CreateLayout() { // Plugintitel setzen SetTitle(cPlugName); // Gruppe für die Konstanten AddGroupBeginV(1000,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," Offset x",0); AddEditNumber(2000,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," x Min",0); AddEditNumber(2001,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," x Max",0); AddEditNumber(2002,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); // Gruppe für die Parameter der Kugel AddGroupBeginV(1002,BFH_CENTER,2,"",0); { AddStaticText(0,BFH_LEFT,Breite,0," Radius Kugel",0); AddEditNumber(2502,BFH_LEFT,100,0); AddStaticText(0,BFH_LEFT,Breite,0," Abstand d",0); AddEditNumber(2003,BFH_LEFT,100,0); } // Vertikal orientierte Gruppe schliessen AddGroupEnd(); // Waagerechte Trennlinie AddSeparatorH(0); // Button für den Start der Berechnung AddButton (3000,BFH_CENTER,200,0,"Start"); return TRUE; } // ****************************************************************** // Deklaration der Methode Init MyDialog::Init() { // Startwerte setzen SetFloat(2000,a,-cMaxFloat,cMaxFloat,0); SetFloat(2001,b,-cMaxFloat,cMaxFloat,0); SetFloat(2002,c,-cMaxFloat,cMaxFloat,0); SetFloat(2003,d,-cMaxFloat,cMaxFloat,0); SetFloat(2502,Radius,-cMaxFloat,cMaxFloat,0); return TRUE; } // ****************************************************************** // Deklaration der Methode CoreMessage MyDialog::CoreMessage(vID,vMSG) { switch (vID) { case NEW_DOCUMENT: case DOCUMENT_CHANGED: case NEW_ACTIVE_OBJECT: case ACTIVE_OBJECT_CHANGED: return TRUE; break; } return FALSE; } // ****************************************************************** // Deklaration der Methode Command MyDialog::Command(vID,vMSG) { var vDoc; // StopAllThreads(); switch (vID) { case 3000 : // Start Button gedrückt { vDoc = GetActiveDocument(); if (!vDoc) return FALSE; fAttraktor(vDoc); } case 2000 : a=GetFloat(2000); case 2001 : b=GetFloat(2001); case 2002 : c=GetFloat(2002); case 2003 : d=GetFloat(2003); case 2502 : Radius=GetFloat(2502); } return TRUE; } // ****************************************************************** // Ableitung der Klasse MyMenuPlugin von MenuPlugin // ****************************************************************** class MyMenuPlugin : MenuPlugin { public: MyMenuPlugin(); GetID(); GetName(); GetHelp(); Execute(doc); RestoreLayout(secret); } // ****************************************************************** // Deklaration des Konstruktors MyMenuPlugin::MyMenuPlugin() { super(); } // ****************************************************************** // Deklaration der Methode GetID MyMenuPlugin::GetID() { return cPluginID; } // ****************************************************************** // Deklaration der Methode GetName MyMenuPlugin::GetName() { return cPlugName; } // ****************************************************************** // Deklaration der Methode GetHelp MyMenuPlugin::GetHelp() { return cPlugHelp; } // ****************************************************************** // Deklaration der Methode Execute MyMenuPlugin::Execute(doc) { if (!gDial) gDial=new(MyDialog); gDial->Open(TRUE,-1,-1); } // ****************************************************************** // Deklaration der Methode RestoreLayout MyMenuPlugin::RestoreLayout(secret) { if (!gDial) gDial=new(MyDialog); gDial->RestoreLayout(secret); } // ****************************************************************** main() { Register(MyMenuPlugin); }