DXScene Objekte zur Runtime erstellen und verwalten
-
~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.htmlDazu 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(¶m); // 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.
-
zu Punkt 2:
Das ist der standard Font aus dem Irrlicht Tutorial 01, da es 2D Anzeige ist kann Kamera nicht zu weit entfernt sein. Aber du hast Recht, wenn ich das Fenster etwas größer mache, dann ist er lesbar. Verstehe das nur nicht. Ist das ein Bug?
Ich definiere doch ein Rechteck in dem der Text erscheinen soll (WordWrap damit möglich).zu Punkt 3:
So beenden schlägt leider völlig fehl, dann bekomme ich eine Errormeldung: "Pure virtual function called"void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { if (device) { device->closeDevice(); device->drop(); } }
~dxscene schrieb:
Wie startet man das am kleversten mit dem Start der Anwendung? Über einen TTimer eventuell?
Wenn man es nicht in OnShow starten kann fällt mir nichts anderes ein. Gibt es andere Möglichkeiten? Weil ein Timer ist doch sehr unsicher. Was ist wenn das Programm mal länger brauch weil Festplattenzugriff anderer Programme oder Systemauslastung den Start verzögern. Dann dürfte so ein Timer, wenn er nicht gerade auf 10s steht, eventuell in die Hose gehen.
-
So ... auf der Schnelle mal was zusammen geklatscht.
Projekt CPP
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <tchar.h> #include "Form_Main.h" //--------------------------------------------------------------------------- USEFORM("Form_Main.cpp", FormMain); //--------------------------------------------------------------------------- WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { try { Application->Initialize(); Application->MainFormOnTaskBar = true; Application->CreateForm(__classid(TFormMain), &FormMain); FormMain->InitIrrlicht(); FormMain->Show(); FormMain->RunIrrlicht(); //Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //---------------------------------------------------------------------------
Form H
//--------------------------------------------------------------------------- #ifndef Form_MainH #define Form_MainH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <irrlicht.h> //--------------------------------------------------------------------------- class TFormMain : public TForm { __published: // IDE-verwaltete Komponenten TPanel *Panel1; TLabel *Label1; TLabel *lblFPS; private: // Benutzer Deklarationen irr::IrrlichtDevice* device; irr::video::IVideoDriver* driver; irr::scene::ISceneManager* smgr; public: // Benutzer Deklarationen __fastcall TFormMain(TComponent* Owner); void InitIrrlicht(); void RunIrrlicht(); }; //--------------------------------------------------------------------------- extern PACKAGE TFormMain *FormMain; //--------------------------------------------------------------------------- #endif
Form CPP
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Form_Main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TFormMain *FormMain; //--------------------------------------------------------------------------- __fastcall TFormMain::TFormMain(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void TFormMain::InitIrrlicht() { HWND hIrrlichtWindow = Panel1->Handle; irr::SIrrlichtCreationParameters param; param.WindowId = hIrrlichtWindow; param.DriverType = irr::video::EDT_OPENGL; device = irr::createDeviceEx(param); smgr = device->getSceneManager(); // setup a simple 3d scene driver = device->getVideoDriver(); irr::scene::ICameraSceneNode* cam = smgr->addCameraSceneNode(); cam->setTarget(irr::core::vector3df(0,0,0)); irr::scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(irr::core::vector3df(0,10,0), 30.0f); cam->addAnimator(anim); anim->drop(); irr::scene::ISceneNode* cube = smgr->addCubeSceneNode(25); cube->setMaterialFlag(irr::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")); } //--------------------------------------------------------------------------- void TFormMain::RunIrrlicht() { while (device->run()) { driver->beginScene(true, true, 0); smgr->drawAll(); driver->endScene(); lblFPS->Caption = (int)driver->getFPS(); } device->closeDevice(); device->drop(); } //---------------------------------------------------------------------------
-
Schnell zusammen geklatscht und funktioniert prima!
Danke dir für den tollen Support! Werde die Tage mir mal Zeit nehmen und Irrlicht nun besser zu verstehen.
-
Ich habe hier nen billig Rechner der bei 3D Sachen sofort den Lüfter hoch jagd und im Zeitalter des Stromsparends würde mich sehr eine Optimierung der Anzeige interessieren. Ich hätte gern das Irrlicht nur was macht und berechnet, wenn sich etwas verändert und man gegebenenfalls auch "Pause" drücken kann.
Optimal wäre wenn das Irrlicht erkennen würde und eine Variable dafür zur Verfügung stellt. Dahingehend fand ich leider nichts. Ich dachte da erstmal an einen Schalter welcher eine Boolean setzt oder wenn das Fenster nicht mehr den Focus hat.
void TFormMain::RunIrrlicht() { while (device->run()) { if (irrlicht_on) { driver->beginScene(true, true, 0); smgr->drawAll(); driver->endScene(); Caption = (int)driver->getFPS(); } } device->closeDevice(); device->drop(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::Button2Click(TObject *Sender) { irrlicht_on = !irrlicht_on; }
Leider bleibt damit der CPU-Load und er rechnet scheinbar im Hintergrund weiter. Sobald ich die Animation weiterlaufen lassen will ist die schon weitergelaufen, ich habe lediglich die Darstellung angehalten.
Hat für so etwas jemand eine Lösung?
-
Mal eine Frage, welche Anwendung hast du vor zu Entwickeln?
nun keine Animation mehr ?
also einfaches Bildrendern nach Bedarf?
Evtl. ist ja Irrlicht dann nicht das richtige für deine Zwecke.
-
So wieder eine "normale" Projekt CPP
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include <tchar.h> #include "Form_Main.h" //--------------------------------------------------------------------------- USEFORM("Form_Main.cpp", FormMain); //--------------------------------------------------------------------------- WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { try { Application->Initialize(); Application->MainFormOnTaskBar = true; Application->CreateForm(__classid(TFormMain), &FormMain); FormMain->Show(); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } //---------------------------------------------------------------------------
und
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Form_Main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TFormMain *FormMain; //--------------------------------------------------------------------------- __fastcall TFormMain::TFormMain(TComponent* Owner) : TForm(Owner) { irrlicht_on=false; HWND hIrrlichtWindow = Panel1->Handle; irr::SIrrlichtCreationParameters param; param.WindowId = hIrrlichtWindow; param.DriverType = irr::video::EDT_OPENGL; device = irr::createDeviceEx(param); smgr = device->getSceneManager(); // setup a simple 3d scene driver = device->getVideoDriver(); InitIrrlicht(); } //--------------------------------------------------------------------------- __fastcall TFormMain::~TFormMain() { device->closeDevice(); device->drop(); } //--------------------------------------------------------------------------- void TFormMain::InitIrrlicht() { irr::scene::ICameraSceneNode* cam = smgr->addCameraSceneNode(); cam->setTarget(irr::core::vector3df(0,0,0)); irr::scene::ISceneNodeAnimator* anim = smgr->createFlyCircleAnimator(irr::core::vector3df(0,10,0), 30.0f); cam->addAnimator(anim); anim->drop(); irr::scene::ISceneNode* cube = smgr->addCubeSceneNode(25); cube->setMaterialFlag(irr::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")); } //--------------------------------------------------------------------------- void TFormMain::RunIrrlicht() { while (device->run() && irrlicht_on) { driver->beginScene(true, true, 0); smgr->drawAll(); driver->endScene(); lblFPS->Caption = (int)driver->getFPS(); } } //--------------------------------------------------------------------------- void __fastcall TFormMain::Button2Click(TObject *Sender) { irrlicht_on = !irrlicht_on; if (irrlicht_on) { RunIrrlicht(); } } //---------------------------------------------------------------------------
-
Vielen Dank! Klappt super, allerdings ist auch hier das sich die Kamera während der Pause weitergedreht hat. Denn wenn ich die Pause aufhebe, ist die Skybox und die Kamera ganz woanders.
Liegt vermutlich an createFlyCircleAnimator(), kann man solche Animations-Funktionen nicht auch pausieren?
Mal eine Frage, welche Anwendung hast du vor zu Entwickeln?
Ich möchte gern ein kleines Spielchen machen. 4 Gewinnt oder ein Schiebepuzzle. Ich habe nur einen billig PC und wenn ich 3D laufen lasse heult der PC Lüfter hoch das einem die Ohren weh tun und da bei solchen Spielen auf Benutzereingaben gewartet wird brauch man ja nur dann die Szene neu darstellen. So dachte ich mir das zumindest.