DXScene Objekte zur Runtime erstellen und verwalten



  • 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.



  • Vielen Dank! Mit deinem Beispiel bin ich auch drauf gekommen das ich die namespaces ja auskommentiert habe. Finde es bei Tutorials nämlich nicht sinnvoll sowas zu tun, da ich wissen möchte woher jeder Befehl kommt. habe vor jeden Befehl nun entsprechende namespaces hinzugefügt und kann es erfolgreich compilieren.

    Allerdings habe ich keinerlei Ausgabe, aber meine CPU lädt ist voll belegt.
    Mein Quelltext:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
    	HWND hIrrlichtWindow = Panel1->Handle;
    	irr::SIrrlichtCreationParameters param;
    	param.Bits = 16;
    	param.WindowId = hIrrlichtWindow;
    	param.DriverType = irr::video::EDT_DIRECT3D9;
    	irr::IrrlichtDevice* device = irr::createDeviceEx(param);
    	if (!device)
    	{
    		ShowMessage("Error: createDeviceEx()");
    		return ;
    	}
    
    	irr::video::IVideoDriver* driver = device->getVideoDriver();
    	irr::scene::ISceneManager* smgr = device->getSceneManager();
    	irr::gui::IGUIEnvironment* guienv = device->getGUIEnvironment();
    
    	device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
    	//guienv->addStaticText(L"Hello World! This is the Irrlicht Software renderer!", core::rect<s32>(10,10,260,22), true);
    
    	irr::scene::IAnimatedMesh* mesh = smgr->getMesh("sydney.md2");
    	if (!mesh)
    	{
    		ShowMessage("Error: getMesh()");
    		return ;
    	}
    	irr::scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh);
    
    	if (node)
    	{
    		node->setMaterialFlag(irr::video::EMF_LIGHTING, false);
    		node->setMD2Animation(irr::scene::EMAT_STAND);
    		node->setMaterialTexture( 0, driver->getTexture("sydney.bmp") );
    	}
    
    	smgr->addCameraSceneNode(0, irr::core::vector3df(0,30,-40), irr::core::vector3df(0,5,0));
    	while (device->run())
    	{
    		driver->beginScene(true, true, irr::video::SColor(255,100,101,140));
    
    		smgr->drawAll();
    		guienv->drawAll();
    
    		driver->endScene();
    	}
    	device->drop();
    }
    //---------------------------------------------------------------------------
    

    Debug-Ausgabe: Irrlicht Engine version 1.5 Prozess Tutorial.exe (2408)
    Debug-Ausgabe: Microsoft Windows XP Service Pack 3 (Build 2600) Prozess Tutorial.exe (2408)
    Debug-Ausgabe: Using renderer: Direct3D 9.0 Prozess Tutorial.exe (2408)
    Modul laden: d3d9.dll. Ohne Debug-Infos. Basisadresse: $4FD50000. Prozess Tutorial.exe (2408)
    Modul laden: d3d8thk.dll. Ohne Debug-Infos. Basisadresse: $6DE80000. Prozess Tutorial.exe (2408)
    Debug-Ausgabe: NVIDIA Quadro NVS 55/280 PCI nv4_disp.dll 6.14.11.6250 Prozess Tutorial.exe (2408)
    Debug-Ausgabe: Could not load shader function D3DXAssembleShader from dll, shaders disabled: d3dx9_40.dll Prozess Tutorial.exe (2408)
    Debug-Ausgabe: Could not create vertex shader. Prozess Tutorial.exe (2408)
    Debug-Ausgabe: Could not create vertex shader. Prozess Tutorial.exe (2408)
    Debug-Ausgabe: Loaded mesh: sydney.md2 Prozess Tutorial.exe (2408)
    Debug-Ausgabe: Loaded texture: C:\Entwicklung\Komponenten\Irrlicht 3D Engine\Ablage 2009\Tutorial 01\sydney.bmp Prozess Tutorial.exe (2408)

    Irgendwie habe ich ein Problem mit "vertex shader" .
    Fehlt was in meiner LIB?



  • Setz mal deinen Code in einen Button OnClick Ereigniss

    bei FormShow wird dir nichts dargestellt.



  • Ja stimmt, Nun geht es. 🙄
    Wie startet man das am kleversten mit dem Start der Anwendung? Über einen TTimer eventuell?

    Weiß eventuell jemand warum
    1. device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
    bei mir den Form1->Caption nicht ändert?

    2. guienv->addStaticText(L"Hello World! This is the Irrlicht renderer!", irr::core::rectirr::s32(10,10,300,50), true);
    ist sehr unleserlich. Waran kann das liegen?

    3. Wenn ich oben im TForm auf das "X" Schließsymbol drücke, dann stopt erstmal nur die Animation, wenn ich nochmal drauf drücke beendet sich auch die Anwendung. Das selbe Spiel beim Taskpopup und "Schließen". Warum ist dies so, warum beendet sich nicht gleich die Anwendung? Muss ich da etwas beachten?

    Sonst freut es mich schonmal rießig das ich Tutorial 1 mit eurer und vor allem VergissEs Hilfe geschafft habe. 😃



  • Mit device->setWindowCaption(L"Hello World! - Irrlicht Engine Demo");
    würdest du den Caption ändern wenn du das Fenster über Irrlicht erstellst
    aber du verwendest ja "nur" den Panel Handle als Ausgabe somit musst du zum ändern des Fenster Caption VCL typisch vorgehen.

    Caption = "Hello World! - Irrlicht Engine Demo";
    


  • Ja stimmt, ich gebe ihm ja nur das Panel Handle. Das habe ich gar nicht berücksichtigt. Damit wäre Punkt 1 geklärt. 😉



  • zu Punkt 2:
    Schriftgröße zu klein?
    Auflösung zu klein?
    Kamera zu weit weg?

    zu Punkt 3:
    Der Thread wird erst beendet dann beim zweiten klick beendet die Anwendung.
    Also vorher erst Irrlicht beenden dann Programm schliessen lassen.


Anmelden zum Antworten