DXScene Objekte zur Runtime erstellen und verwalten



  • VergissEs schrieb:

    Irrlicht Engine läuft mit dem RAD 2009.

    Kennst du ein Tutorial, wie man Irrlicht in RAD2009 korrekt einbindet und besteht überhaupt die Möglichkeit die 3D Sachen in die VCL in einem Bereich anzuzeigen und somit mit der VCL und dem 3D Hand in Hand zu arbeiten? Schade das bei Irrlicht keiner ein solches Tutorial geschrieben hat.



  • Also das in einen Panel zb gerendert wird

    //Handle to the Panel
    	HWND hIrrlichtWindow = Panel1->Handle;
    
    	irr::SIrrlichtCreationParameters param;
    	param.WindowId = hIrrlichtWindow;
    	param.DriverType = video::EDT_OPENGL;
    

    Und hier ist eine Anleitung wie man es mit Borland kompliert, leider finde ich nicht mehr den original Link:

    Irrlicht Engine mit Borland-C++ kompilieren
    Standardmäßig lässt sich die Irrlicht Engine leider nur mit Visual C++ und Dev-C++ kompilieren. Für alle Borland-Liebhaber gibt es jedoch auch eine Möglichkeit, die ich hier vorstellen möchte.
    Die Engine wird in der Borland-Version die Softwarerenderer, OpenGL und Direct3D 9 unterstützen, allerdings nicht 8.1, weil hierfür in den neuen SDKs die Header fehlen.
    Ich verwende in diesem Tutorial das RAD Studio 2007 und die Irrlicht Engine in Version 1.4, es kann also sein, dass ihr etwas anders vorgehen müsst.

    Ladet die Engine herunter und entpackt sie in ein beliebiges Verzeichnis.
    Ladet die Header für Direct3D entweder hier (Zip-Archiv, 122 KB) oder mit einem DirectX-SDK herunter und entpackt sie beispielsweise in das Engine-Quelltext-Verzeichnis ("Source\Irrlicht") unter "dxsdk".
    Erstellt ein neues C++-DLL-Projekt (bei mir "Dynamische Link Bibliothek", was ein wenig gewöhnungsbedürftig übersetzt ist). Wählt als Optionen "DLL im VC++-Stil" und "Multi-Threads" (aber nicht die VCL).
    Löscht die automatisch erstellte Quelltextdatei aus dem Projekt (bei mir heißt sie "File1.cpp").
    Bennent das Projekt von "Project1.dll" in "Irrlicht.dll" um.
    Speichert die Projektdatei im Quelltextordner der Engine ab (unter "Source\Irrlicht").
    Öffnet jetzt die Projektoptionen und gebt in der Kategorie "C++-Compiler" unter "Pfade und Definitionen" bei "Definition" "IRRLICHT_EXPORTS;WIN32" an (bzw. WIN64 für 64-Bit-Compiler).
    Tragt unter "Include-Pfad" die Ordner "jpeglib", "libpng", "zlib" und "dxsdk" (je nach dem, wie ihr den Ordner genannt habt) aus dem Quelltextordner sowie das "Include"-Verzeichnis aus dem Engine-Ordner ein.
    Benennt die "Irrlicht.cpp" im Source-Ordner in "Main.cpp" (oder einen ähnlichen Namen) um.
    Löscht im Ordner "jpeglib" die Datei "jconfig.h" und benennt die "jconfig.bcc" in "jconfig.h" um.
    Fügt nun alle Quelltextdateien (.c und.cpp) aus dem Quelltextordner sowie alle aus den Unterverzeichnissen "jpeglib", "libpng" und "zlib" mit Außnahme der Dateien "example.c", "jmemansi.c", "jmemdos.c", "jmemmac.c" und "jmemname.c" aus dem "jpeglib"-Ordner und "example.c" und "pngtest.c" aus dem "libpng"-Ordner eurem Projekt hinzu.
    Öffnet jetzt die Dateien "pngerror.c" und "pngtrans.c. Löscht dort alle const-Schlüsselwörter aus den Definitionen, die zusätzlich PNG_CONST enthalten.
    Öffnet die Datei "D3D9Driver.h" aus dem Source-Ordner und fügt vor der Zeile "#include <d3d9.h>" (20) folgendes ein:
    #ifdef __BORLANDC__
    #define min(a, b) (((a) < (b)) ? (a) : (b))
    #endif
    Öffnet dann die "d3dx9math.inl" aus dem DirectX-Header-Ordner und fügt nach der Zeile "#ifdef __cplusplus" (19) folgenden Code ein:
    #ifdef __BORLANDC__
    #define sqrtf(x) ((FLOAT) sqrt(x))
    #endif
    Passt nun die "IrrCompileConfig.h" aus dem "Include"-Ordner euren Bedürfnissen an. Kommentiert einfach alle Funktionen, die ihr nicht benötigt, aus. Direct3D 8.1 muss auf jeden Fall deaktiviert werden, da hier die Headerdateien fehlen.
    Speichert alle Dateien ab. Nun sollte sich die Engine ohne Probleme kompilieren lassen.



  • Wau. Größes Dankeschön! 👍 🙂

    Wenn ich den Text google finde ich eine Seite, die leider nur 404 ausspuckt, sprich nicht mehr vorhanden ist. Was sehr schade ist. Das suchen sicherlich viele. Dort gab es auch noch ein ZIP mit den DirectX-Headern. Ich glaube ich habe die Header aber selbst gefunden, zumindest hat das nach dem Tutorial (+2 bis 3 Dateien noch entfernen rpng-x.c und sowas) fehlerfrei compiliert.

    Ich habe jetzt eine Irrlicht.dll 6.144 Bytes und Irrlicht.lib mit 84 Bytes. Das ist murxig klein und niemals richtig. Meine SQlite3.lib ist schon über 1MB die ich direkt in mein Projekt reinladen kann.

    Was habe ich noch nicht richtig eingestellt? Wie bekomme ich eine LIB, die ich ins Projekt includieren kann und somit keine externe DLL benötige und wie eine DLL welche ich gegebenenfalls auch mal extern dazulegen kann? Die Einstellungen von RAD 2009 sind mir noch etwas fremd. Bin noch BCB5 Nutzer. ^^



  • ~dxscene schrieb:

    Was habe ich noch nicht richtig eingestellt? Wie bekomme ich eine LIB, die ich ins Projekt includieren kann und somit keine externe DLL benötige

    Bei Irrlicht AFAIK gar nicht.



  • Ok, aber die DLL sollte dann wohl wesentlich größer sein. Irgendwo müssen die Informationen ja stehen.

    Ich habe im Irrlicht-Forum eine ZIP gefunden für BCB6 mit Irrlich Version 1.4 (aktuell ist 1.5) und dort im bin-Ordner ist
    D3DX8.DLL 270KB LIB-Version 26.5KB
    D3dx8d.DLL 510KB LIB-Version 27KB
    D3DX9.DLL 825KB LIB-Version 41KB
    Irrlicht.DLL 2.81MB LIB-Version 916Byte

    Die DLL dort ist gross und wozu brauch man die D3DX* Sachen?
    Denn die habe ich ja so gar nicht.



  • Hallo

    Ok, aber die DLL sollte dann wohl wesentlich größer sein.

    Dann hast du irgendwas falsch gemacht oder etwas vergessen. Geh nochmal die Arbeitsschritte von VergissEs durch

    wozu brauch man die D3DX* Sachen?

    Auch Irrlicht setzt unter Windows auf DirectX auf. Sonst müßte es sich ja selber um die Treiber für die Unterstützung durch die Grafikkarten kümmern.

    bis bald
    akari



  • Ich habe aus den Sourcecode von Irrlicht eine LIB erstellt und diese dann in RAD eingebunden ohne DLL die lib hat eine größe von ca 7,8 MB Release



  • Wau das richtig groß 😉

    Ups habe vergessen CPP einzubinden 🙄
    So jetzt compiliert er richtig was los, aber ich erhalten einen Fehler bei

    [BCC32 Fataler Fehler] CImageLoaderWAL.h(28): F1003 error-Direktive: compiler not supported

    #ifdef _MSC_VER
    #	pragma pack( push, packing )
    #	pragma pack( 1 )
    #	define PACK_STRUCT
    #elif defined( __GNUC__ )
    #	define PACK_STRUCT	__attribute__((packed))
    #else
    #	error compiler not supported
    #endif
    

    Ich habe im letzten Punkt

    Passt nun die "IrrCompileConfig.h" aus dem "Include"-Ordner euren Bedürfnissen an. Kommentiert einfach alle Funktionen, die ihr nicht benötigt, aus. Direct3D 8.1 muss auf jeden Fall deaktiviert werden, da hier die Headerdateien fehlen.
    Speichert alle Dateien ab. Nun sollte sich die Engine ohne Probleme kompilieren lassen.

    Nichts angepasst, weil ich nicht wüsste was. Habe ja Header für DX8 und DX9.
    Kannst du was zu dem Fehler sagen? Habe Irrlicht 1.5 Source hier. So wie ich das rauslese fehlt was für RAD Compiler.



  • ~dxscene schrieb:

    #ifdef _MSC_VER
    #	pragma pack( push, packing )
    #	pragma pack( 1 )
    #	define PACK_STRUCT
    #elif defined( __GNUC__ )
    #	define PACK_STRUCT	__attribute__((packed))
    #else
    #	error compiler not supported
    #endif
    
    #ifdef _MSC_VER
    #	pragma pack( push, packing )
    #	pragma pack( 1 )
    #	define PACK_STRUCT
    #elif defined(__BORLANDC__)
    #	pragma pack(push, 1) /* analog #pragma pack(pop) auf der anderen Seite */
    #elif defined( __GNUC__ )
    #	define PACK_STRUCT	__attribute__((packed))
    #else
    #	error compiler not supported
    #endif
    


  • Danke schön 😉 , hatte erstmal den Inhalt von MSC_VER genommen, damit ich weiter compilieren kann, denn das dauert laaaange.. Viele Minuten. 😮

    Ich habe nach über 600 Warnungen diesen Fehler:
    [ILINK32 Fehler] Fatal: Datei D3DX8.LIB kann nicht geöffnet werden

    Ich habe aber unter Optionen -> C++ Compiler -> Verzeichnisse und Bedingungen -> Include Dateisuchpfad den Pfad C:\DXSDK\lib eingegeben und dort liegt auch eine d3dx8.lib (2.04MB) von Original DX8SDK.

    Ich lade gerade DX9SDK runter, da mir die libs für DX9 fehlen.

    @VergissEs
    Hast du das Archiv mit den DXZeugs noch? Kannst du bitte den Inhalt auflisten? Mir scheint ja irgendwas zu fehlen. 😞



  • ~dxscene schrieb:

    [ILINK32 Fehler] Fatal: Datei D3DX8.LIB kann nicht geöffnet werden

    Ich habe aber unter Optionen -> C++ Compiler -> Verzeichnisse und Bedingungen -> Include Dateisuchpfad den Pfad C:\DXSDK\lib eingegeben und dort liegt auch eine d3dx8.lib (2.04MB) von Original DX8SDK.

    Das hilft herzlich wenig; das DirectX-SDK enthält COFF-Libraries, C++Builder benutzt aber das OMF-Format. Lade dir ggf. unter http://www.clootie.ru/cbuilder/index.html die nötigen Libraries herunter.



  • http://www.magixsoft.de/dxsdk.zip

    und dann in der include/IrrCompileConfig.h
    Zeile 86

    #if defined(_IRR_WINDOWS_API_) && (!defined(__GNUC__) || defined(IRR_COMPILE_WITH_DX9_DEV_PACK))
    
    //#define _IRR_COMPILE_WITH_DIRECT3D_8_
    #define _IRR_COMPILE_WITH_DIRECT3D_9_
    
    #endif
    


  • @audacia
    Wau danke schön! Auf der Seite vermisse ich leider ein Tutorial, wie man dies selber machen kann. Was passiert wenn es von dort mal keinen Support mehr gibt?

    @VergissEs
    Vielen Dank! Deine sind neuer. Ich habe aber jetzt mal, da so schnell fertig, die neuesten aus der DX9SDK genommen.

    Fügt nun alle Quelltextdateien (.c und.cpp) aus dem Quelltextordner sowie alle aus den Unterverzeichnissen "jpeglib", "libpng" und "zlib" mit Außnahme der Dateien "example.c", "jmemansi.c", "jmemdos.c", "jmemmac.c" und "jmemname.c" aus dem "jpeglib"-Ordner und "example.c" und "pngtest.c" aus dem "libpng"-Ordner eurem Projekt hinzu.
    Öffnet jetzt die Dateien "pngerror.c" und "pngtrans.c. Löscht dort alle const-Schlüsselwörter aus den Definitionen, die zusätzlich PNG_CONST enthalten.

    Genau das habe ich so gemacht. Trotzdem erhalte ich nun dieses:

    [ILINK32 Fehler] Error: Nicht auflösbares externes '_crc32' referenziert von \RELEASE\PNG.OBJ
    [ILINK32 Fehler] Error: Nicht auflösbares externes '_deflateInit2_' referenziert von \PNGWUTIL.OBJ
    [ILINK32 Fehler] Error: Nicht auflösbares externes '_deflateReset' referenziert von \RELEASE\PNGWUTIL.OBJ
    [ILINK32 Fehler] Error: Nicht auflösbares externes '_deflate' referenziert von \PNGWUTIL.OBJ
    [ILINK32 Fehler] Error: Nicht auflösbares externes '_deflateEnd' referenziert von \RELEASE\PNGWRITE.OBJ

    crc32() ist zum Beispiel auch nirgends definiert. Woher will Irrlicht das jetzt nehmen?



  • Öffnet jetzt die Projektoptionen und gebt in der Kategorie "C++-Compiler" unter "Pfade und Definitionen" bei "Definition" "IRRLICHT_EXPORTS;WIN32" an (bzw. WIN64 für 64-Bit-Compiler).
    Tragt unter "Include-Pfad" die Ordner "jpeglib", "libpng", "zlib" und "dxsdk" (je nach dem, wie ihr den Ordner genannt habt) aus dem Quelltextordner sowie das "Include"-Verzeichnis aus dem Engine-Ordner ein.

    das haste auch schon gemacht?



  • ~dxscene schrieb:

    crc32() ist zum Beispiel auch nirgends definiert.

    Mein Fehler. 🙄

    Ich bekomme aber nach 5min compilieren immer noch nur eine DLL mit 3MB und eine LIB mit 900Byte. Ich habe im Release Ordner 356 Dateien mit insgesamt 68.7MB.

    @VergissEs
    Hatte "zlib" vergessen, nachdem ich in RAD die Ansicht auf Verzeichnisliste gesetzt habe sah ich es. War mir sicher das auch hinzugefügt zu haben. Aber wieso bekomme ich keine 7MB LIB? 😞
    Mein Release Ordner ist prall und voll.



  • 7,8 MB habe ich beim erstellen einer statischen lib bekommen für die DLL scheinen mir deine Größenangaben zu stimmen



  • ~dxscene schrieb:

    Ich bekomme aber nach 5min compilieren immer noch nur eine DLL mit 3MB und eine LIB mit 900Byte. Ich habe im Release Ordner 356 Dateien mit insgesamt 68.7MB.

    Du kannst die .lib-Datei mit TDUMP analysieren. IIRC exportiert Irrlicht aber nur eine einzige Funktion aus der DLL, für alles andere werden virtuelle Factory-Funktionen benutzt, daher könnten 900 Byte durchaus passen.



  • Habe das ganze eben für static gemacht und nun auch eine Irrlicht.lib mit 8.14MB 😃
    Danke für eure tolle 1A Hilfe!



  • @VergissEs
    Würde mich freuen wenn mich kurz einführst in die Welt des Irrlichtes 😉
    Ich habe mir das Tutorial 01 auf Irrlicht angeschaut und wollte dies nun in RAD 6.0 einbauen: http://irrlicht.sourceforge.net/docu/example001.html

    Dazu habe ich unter Optionen|Verzeichnisse und Bedingungen|Include-Pfad "..\..\irrlicht-1.5\include" eingefügt. Meine mit RAD 6.0 erstelle 8MB LIB-Datei habe ich direkt in Projektverwaltung hinzugefügt.

    Jetzt meckert er:

    #include <irrlicht.h>
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	HWND hIrrlichtWindow = Panel1->Handle;
    	irr::SIrrlichtCreationParameters param;
    	//param.AntiAlias = true;
    	param.Bits = 16;
    	param.WindowId = hIrrlichtWindow;
    	param.DriverType = video::EDT_DIRECT3D9; // ERROR: E2090 Qualifizierer 'video' ist kein Name einer Klasse oder eines Namespace 
    	IrrlichtDevice* device = createDeviceEx(&param); // ERROR: E2451 Undefiniertes Symbol 'IrrlichtDevice'
    

    Liegt das an der LIB, ist diese doch nicht vollständig oder falsch eingebunden?

    Und gleich noch eine sehr wichtige Frage zur Schleife der 3D Darstellung.

    while(device->run())
    	{
    		driver->beginScene(true, true, SColor(255,100,101,140));
    
    		smgr->drawAll();
    		guienv->drawAll();
    
    		driver->endScene();
    	}
    	device->drop();
    

    Ich möchte links meine TEdits haben für diverse Eingaben und rechts das Panel zur Darstellung. Ich möchte also mit der Maus und Tastatur im Fenster rumwursteln und auch ab und an in der 3D Grafik. Diese drehen, zoomen und was man da noch so machen will. Wie muss man denn das verwalten? So eine Dauerschleife kann es ja nicht sein. Muss ich dafür Threads nehmen? Hast du zufälligerweise ein Tutorial oder Beispiel für mich, das so etwas realisiert? Wäre super nett von dir! 🙂



  • Hier mal ein Beispiel:

    #include <irrlicht.h>
    using namespace irr;
    
    	//Handle to the Panel
    	HWND hIrrlichtWindow = Panel1->Handle;
    
    	irr::SIrrlichtCreationParameters param;
    	param.WindowId = hIrrlichtWindow;
    	param.DriverType = video::EDT_OPENGL;
    
    	irr::IrrlichtDevice* device = irr::createDeviceEx(param);
    
    	// setup a simple 3d scene
    	irr::scene::ISceneManager* smgr = device->getSceneManager();
    	video::IVideoDriver* driver = device->getVideoDriver();
    
    	scene::ICameraSceneNode* cam = smgr->addCameraSceneNode();
    	cam->setTarget(core::vector3df(0,0,0));
    
    	scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(core::vector3df(0,10,0), 30.0f);
    	cam->addAnimator(anim);
    	anim->drop();
    
    	scene::ISceneNode* cube = smgr->addCubeSceneNode(25);
    	cube->setMaterialFlag(video::EMF_LIGHTING, false);
    	cube->setMaterialTexture(0, driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\rockwall.bmp"));
    
    	smgr->addSkyBoxSceneNode(
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_up.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_dn.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_lf.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_rt.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_ft.jpg"),
    		driver->getTexture("C:\\Source\\RAD2009\\irrlicht-1.5\\media\\irrlicht2_bk.jpg"));
    
    	while (device->run()) {
    
    		driver->beginScene(true, true, 0);
    
    		smgr->drawAll();
    
    		driver->endScene();
    
    		int fps = driver->getFPS();
    		lblFPS->Caption = fps;  //Label für FPS Darstellung
    
    	}
    
    	device->closeDevice();
    
    	device->drop();
    

    Setzt mal den Code in einen Button Click Ereignis zum testen und dann die Pfade der Texturen angleichen, bzw habe auch noch ein TLabel für die FPS Anzeige erstellen.

    Die while Schleife hintert den Benutzer nicht daran z.B in Edit Felder eingaben zu machen während Irrlicht "arbeitet" das ganze läuft schon in einen eigenen Thread ab.


Anmelden zum Antworten