simpleIrrlicht - Irrlicht in "Einfach"

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2, 3 ... 8, 9, 10 ... 13, 14, 15  Weiter

Worklogs simpleIrrlicht - Irrlicht in "Einfach"

Was noch fehlte...

Donnerstag, 29. April 2010 von Farbfinsternis
Einige die das beigelegte Example ausführen wollten sind wahrscheinlich darüber gestolpert dass zwei DLLs fehlen. Ich möchte diese hiermit nachreichen.

>> missed things (ca. 2,4MB) <<

0.3

Donnerstag, 29. April 2010 von Farbfinsternis
Heute stand ein bisschen Bugfixing und Optimierung auf dem Plan, außerdem sind eine handvoll Funktionen dazugekommen.

Das Changelog (jetzt ganz frisch eingeführt):
Zitat:

V0.3 29.04.2010

hinzugefügt : WBuffer(enable%)
hinzugefügt : Dither(enable%)
hinzugefügt : AntiAlias(value%)
hinzugefügt : WireFrame(cam.Obj, enable%)
hinzugefügt : HWMultiTex(enable%)
hinzugefügt : CameraProjMode(cam.Obj, mode%)
hinzugefügt : CameraRange(cam.Obj, near#, far#)
hinzugefügt : DebugLog(message$)


V0.2 28.04.2010
hinzugefügt : Graphics3D()
hinzugefügt : EndGraphics3D()
hinzugefügt : RenderWorld()
hinzugefügt : CreateCamera()
hinzugefügt : CameraClsColor()
hinzugefügt : PositionEntity()
hinzugefügt : MoveEntity()
hinzugefügt : TurnEntity()
hinzugefügt : CreateLight()
hinzugefügt : LightColor()
hinzugefügt : AmbientLight()
hinzugefügt : LoadMesh()
hinzugefügt : KeyDown()
hinzugefügt : KeyHit()


Ein paar Bemerkungen zu den Funktionen:

Dither()
Soetwas gibt es im Jahr 2010 nicht mehr und in Ogre schon garnicht. Wer meint er müsse mit 16Bit Screens hantieren sollte von modernen 3D Engines die Finger lassen.
Ich habe die Funktion dennoch überschrieben damit der YAN sich nicht über Fehlermeldungen wundert. Das werde ich übrigens mit allen Blitz3D Funktionen tun die in Ogre keine Funktion mehr haben.

AntiAlias()
Im Gegensatz zu Blitz3D gibt man hier nicht an ob man FSAA nutzen will oder nicht, sondern wie stark das FSAA eingesetzt werden soll (0, 2, 4, 8 etc.). Hierbei ist zu beachten dass das nicht zur Laufzeit umgesetzt wird sondern erst nach dem nächsten Start der App zur Verfügung steht

HWMultiTex()
Siehe Dither()

CameraProjMode()
Funktioniert schon, sieht aber noch nicht so aus wie in Blitz3D und die Mode 0 existiert nicht.
Dass es nicht so aussieht wie in Blitz3D liegt nicht daran dass der orthographische Modus nicht orthographisch ist, sondern daran dass Mark da ein bisschen getrickst hat damit der User nach dem Umschalten die Scene im Selben Zoom sieht wie in der Perspektive. Das tweake ich aber noch damit das mit Ogre genauso funktioniert.
Mode 0 ist mir nicht ganz geheuer. In Blitz3D ist es die schnellere Möglichkeit eine Camera zu "verstecken", in Ogre ist "Kamera verstecken" immer schnell. Wahrscheinlich werde ich bei Mode 0 einfach HideEntity() aufrufen ... mal gucken.

DebugLog()
Da simpleOgre noch immer nicht aus der IDE gestartet werden kann (warum auch immer, ich habe keinen blassen Schimmer) habe ich DebugLog() überschrieben. Die Funktion schreibt seine Ausgaben in die datei "s3d.log"

Jetzt noch der Code des aktuellen Examples und danach der Download-Link für die V0.3 (ein Executable liegt bei)
BlitzBasic: [AUSKLAPPEN]

Include "ogre\simpleOgre.bb"


If Graphics3D()
cam.Obj = CreateCamera()
CameraClsColor(cam, 0.1, 0.3, 0.7)
PositionEntity(cam, 0.0, 0.0, 160.0)
CameraRange(cam, 0.1, 600)

AmbientLight(0.4, 0.4, 0.4)
light.Obj = CreateLight()
PositionEntity(light, -1600, 1600, 1600)
LightColor(light, 255, 255, 0)

mesh.Obj = LoadMesh("media\robot.mesh")
PositionEntity(mesh, 0.0, -60, 0.0)

wf% = 0
exit_flag% = False
Repeat
If KeyDown(1) Then exit_flag = True

If KeyDown(200) Then MoveEntity(cam, 0, 0, -0.01)
If KeyDown(208) Then MoveEntity(cam, 0, 0, 0.01)
If KeyDown(203) Then MoveEntity(cam, -0.01, 0, 0)
If KeyDown(205) Then MoveEntity(cam, 0.01, 0, 0)

If KeyHit(17) Then WireFrame(cam, wf) : wf = 1 - wf : DebugLog "Sende " + wf
If KeyHit(25) Then CameraProjMode(cam, 1)
If KeyHit(24) Then CameraProjMode(cam, 2)
TurnEntity(mesh, 0.0, 0.0001, 0.0)

RenderWorld()
Until exit_flag% = True

EndGraphics()
EndIf

End


>> Download simpleOgre 0.3 (ca. 5,5MB) <<

0.2

Mittwoch, 28. April 2010 von Farbfinsternis
Es hat sich wieder ein klein wenig getan und das wollte ich meinem Worklog nicht vorenthalten.

Was geht...

  • Graphics3D() ; noch ohne Parameter da das OgreConfig Tool verwendet wird
  • EndGraphics3D() ; ganz wichtig! Immer am Ende aufrufen!
  • RenderWorld() ; Zeit seit letztem Update schon als Parameter vorhanden, aber noch nicht implementiert
  • CreateCamera()
  • CameraClsColor()
  • PositionEntity()
  • MoveEntity()
  • TurnEntity()
  • CreateLight()
  • LightColor()
  • AmbientLight()
  • LoadMesh() ; Achtung! Ogre3D kennt kein *.b3d, Meshes müssen als *.mesh vorliegen
  • KeyDown()
  • KeyHit()


Leider kann man Ogre-Programme noch immer nicht aus der IDE starten und ich habe keinen Anhaltspunkt woran das liegt. Aber zumindest konnte ich einige MemLeaks entfernen und das Ganze ein wenig ausbauen.

user posted image

Hier noch der Download Link für 0.2
simpleOgre 0.2 (ca. 5MB)

Eine ausführbare Datei liegt bei. Es kann sein dass wegen einer DLL gemeckert wird, schreibt dann einfach in die Kommentare welche das ist und ich lege sie bei.

[EDIT]
Ganz vergessen, ich packe doch immer den Source des Examples dazu Wink

BlitzBasic: [AUSKLAPPEN]

Include "ogre\simpleOgre.bb"

If Graphics3D()
cam.Obj = CreateCamera()
CameraClsColor(cam, 0.1, 0.3, 0.7)
PositionEntity(cam, 0.0, 0.0, 160.0)

AmbientLight(0.4, 0.4, 0.4)
light.Obj = CreateLight()
PositionEntity(light, -1600, 1600, 1600)
LightColor(light, 255, 255, 0)

mesh.Obj = LoadMesh("media\ogrehead.mesh")

exit_flag% = False
Repeat
If KeyDown(1) Then exit_flag = True

If KeyDown(200) Then MoveEntity(cam, 0, 0, -0.01)
If KeyDown(208) Then MoveEntity(cam, 0, 0, 0.01)
If KeyDown(203) Then MoveEntity(cam, -0.01, 0, 0)
If KeyDown(205) Then MoveEntity(cam, 0.01, 0, 0)

TurnEntity(mesh, 0.0, 0.0001, 0.0)

RenderWorld()
Until exit_flag% = True
EndIf

EndGraphics()

End

[/EDIT]

Ein Tännchen ... Attention!

Montag, 26. April 2010 von Farbfinsternis
Ich verlinke hier das Archiv, es sollte aber wirklich nur von Usern verwendet werden die nicht eben gerade Blitz3D von einem russischen Server gezogen haben!

simpleOgre V0.1 (ca. 3,5MB)

Enthalten sind:

  • Includes "ogre_keycodes.bb" und "simpleOgre.bb"
  • Plugins, DLLs und Configs für Ogre und OIS
  • simpleOgre_Example.bb
  • simpleOgre.decls
  • gaaanz viel Liebe zum Produkt


Nochmal für die Legastheniker : Um dieses Päckchen schon jetzt auszuprobieren musst Du folgendes wissen und können:

  • Du musst wissen wie man ein Include in den eigenen Source einbindet
  • Du musst wissen wo man eine DECLS platziert
  • Du musst wissen wo die DLLs hinkommen
  • Du musst wissen wie man ein Executable erzeugt denn nur diese funktionieren mit simpleOgre, der Blitz3D Compiler mag zur Laufzeit in der IDE gar kein Ogre haben ... muss wohl sowas wie Fremdenhass sein.
  • Du darfst keine Angst vor einem MemLeak haben denn simpleOgre hat vermutlich ein dutzend davon in der Jackentasche


Wenn Du obige Liste komplett knickst weil Du ein alter Hase bist, kannst Du Dich schon jetzt auf eine super Lib freuen denn simpleOgre hat zwei Zweige:

1. Zweig: Es gibt alles was Blitz3D kann + Echtzeit-Schatten
2. Zweig: Es gibt alles was Ogre kann, aber ein bisschen komplizierter und aufwändiger.

Ogre knutscht mit Blitz3D

Montag, 26. April 2010 von Farbfinsternis
Irgendwas läuft mit diesem prüden BlitzCC falsch, die Sau will einfach nichts von Ogre wissen. Die gute Nachricht: Wenn man ein Executable erstellt gehts.

Der spektakulärste Screenshot ever: Wink
user posted image

In Blitz3D sieht das dann so aus:
BlitzBasic: [AUSKLAPPEN]

Include "simpleOgre.bb"

If Graphics3D()
cam% = CreateCamera()
CameraClsColor(cam, 0.5, 0.7, 1.0)

exit_flag% = False
Repeat
If KeyDown(KEY_ESCAPE) Then exit_flag = True

RenderWorld()
Until exit_flag% = True
EndIf

End


Ganz wichtig: Ums Verrecken nicht versuchen die Funktionen aus der DECLS selbst zu verwenden, es sei denn Du weißt ganz genau was Du da tust! Außerdem: Die Blitz3D KeyCodes funktionieren nicht mit Ogre! Es müssen die Konstanten aus dem Include "ogre_keycodes.bb" verwendet werden. Ein Dankeschön an dieser Stelle an Artemis der mir die Arbeit abgenommen hat die HexKeys in Interger umzuwandeln, ein entsprechendes Credit findet sich auch im Source und später in den Dokus.

Es gibt noch ein bis acht MemLeaks die ich stopfen muss bevor ich etwas zum ausprobieren hochladen kann, aber ich denke dass es Ende der Woche soweit sein wird.

Ogre == OOP

Freitag, 23. April 2010 von Farbfinsternis
Mein erster Ansatz, Ogre direkt prozedual herunter zu brechen, hat jetzt nicht in allen Details funktioniert. Grund dafür ist (unter Anderem) dass Ogre stark Gebrauch von sogenannten "Singletons" macht und auch sonst alles nutzt was C++ an Features so zu bieten hat.
Ich habe nun ein Framework zusammen gestrickt welches den Ogre-Regeln folgt und setzt dort oben drauf ein prozeduales Interface.
Das funktioniert bisher hervorragend und ich denke das ich auch bald etwas zum Download und testen anbieten kann.

Knifflig

Donnerstag, 22. April 2010 von Farbfinsternis
Ein Mesh in Ogre3D zu laden ist jetzt nicht so einfach wie man das von Blitz3D her gewohnt ist, auch die Sache mit den Parents verhält sich um einiges anders. Mal ganz davon abgesehen dass es OIS scheinbar nicht mag wenn man händisch "per Frame" nachfragt ob was passiert ist. Aber der Reihe nach.


Resourcen laden geht leider nicht direkt so wie man das von Blitz3D her gewohnt ist. Man muss zunächst dem ResourceManager mitteilen wo sich denn die Sachen befinden. Mit dieser Geschichte kämpfe ich noch.
Mein Ziel ist es dass man wie gewohnt ein Mesh laden kann indem man einen Pfad angibt, simpleOgre soll dann selbst prüfen ob der Pfad dem ResourceManager bereits bekannt ist und dann das File laden, ansonsten soll er die neue Resource anlegen.
Das ist allerdings ne Menge Overhead. Die zweite Möglichkeit wäre es eine Funktion einzubauen mittels derer die ResourcePaths definiert werden.

Parents in Ogre sind ein klein bisschen anders als in Blitz3D ... eigentlich sogar ganz anders. Man kann bspw. kein Mesh einfach so an ein anderes hängen, man benötigt dafür eine SceneNode. D.h. dass man sich vorher etwas genauer einen Plan machen muss was man wohin hängen will da Entities nur an Pivots gehangen werden können. Eine Kamera kann nicht an ein Mesh gehangen werden, das heißt dass man eine SceneNode erstellen muss (CreatePivot() ist bereits implementiert) an die das Mesh gehangen wird, dann wird die Camera ebenfalls an die Node gehangen und es können beide zusammen behandelt werden. Vielleicht kann ich auch dafür etwas Overhead produzieren, mal schauen inwieweit Ogre mich da unterstützt.

OIS ist derzeit das Mittel meiner Wahl um auf Input zu reagieren (Keyboard, Mouse, Joystick). Normalerweise hängt man diese Abfrage an einen Listener der dann alle Naselang mal nachguckt ob sich was im InputBuffer befindet. Bei einer detailgetreuen Blitz3D nachbildung entsteht aber das Problem dass man das direkt und bei jedem Frame machen muss. Auf meiner 3GHz DualCore Kiste erzeugt das ganz schnell einen StackOverflow. Nun muss ich mir überlegen wie ich auch hier mittels Listener und externen Objekten etwas basteln kann das auf allen Kisten funktioniert.

---

Ogre ist eine verdammt komplizierte Engine, aber sie ist genauso kraftvoll wie sie komplex ist ... weitergebastelt Soldat, es gibt keine Probleme ... nur Lösungen!

Wir zähmen das Beast

Mittwoch, 21. April 2010 von Farbfinsternis
Was bisher funktioniert


  • Engine initialisieren mittels Graphics3D
  • Engine entladen. Ganz wichtig! Immer am Ende einer simple3D App "EndGraphics3D()" aufrufen sonst gibbet unschöne MemLeaks
  • Kamera erstellen : CreateCamera(parent:Object, entity_name:String)
  • RenderWorld()
  • KeyDown()


Objekte in Ogre haben stets einen Namen. In simple3D habe ich ein System eingebaut das selbstständig Namen für die Objekte vergibt, aber man sollte diese nach Möglichkeit selbst definieren da diese Namen in Ogre immer wieder auftauchen.

RenderWorld() hat in Ogre noch den Parameter "Zeit seit dem letzten Rendering", dieser ist derzeit noch nicht implementiert, das wird aber noch getan. Er dient dazu das Rendering zu skalieren, so dass eine Objektbewegung auf einem 2.0GHz Singlecore genauso schnell verläuft wie auf einem 3.0GHz Quadcore.

KeyDown() überschreibt die BMax eigene Funktion und nutzt auch eigene KeyCodes ... diese habe ich aber so benannt wie in BRL.KeyCodes. Warum das wichtig ist? Deshalb: Wer sich sedm.simpleogre auf die Platte bügelt sollte von da an nur noch Frameworks in seinen Apps nutzen, sonst hakeln sich die Mods gegenseitig.
Als ich ankündigte dass ich simple3D auf Ogre umstelle ging ich noch davon aus dass ich den EventQueue von BMax auf das Ogre Fenster anwenden kann. Das ist leider so einfach nicht möglich, weshalb ich nun OIS für das EventHandling verwende.

Graphics3D() zeigt atm auf jeden Fall den Ogre ConfigDialog an. Das wird sich aber noch ändern. Zum Einen werde ich noch restoreConfig() einbauen für den Fall dass der User die App nicht zum ersten Mal startet, das bewirkt dass die vom ConfigDialog gesicherte Cfg verwendet wird ... zum Anderen wird es später die Funktion Graphics3DEx() geben. Der Grund ist dass man für ein Graphics3D() ohne showConfigDialog() wesentlich mehr Parameter benötigt als man das von Blitz3D gewohnt ist.

Da Graphics3D() mit showConfigDialog() arbeitet fällt die Wahl des Rendersystems aus, mit Graphics3DEx() wird man dann die Wahl zwischen OpenGL und DirectX9/10/11 haben.

Soweit so gut ... zum Abschluss noch das Programm mit dem ich derzeit das Modul teste:

BlitzMax: [AUSKLAPPEN]
SuperStrict 

Framework sedm.simpleogre ' Wichtig, es werden diverse BMax Sachen überschrieben

' immer prüfen ob das Initialisieren der Engine geklappt hat!
If Not Graphics3D(800, 600, 32, 1, 1) Then RuntimeError "can't initialise Ogre Engine"

Local cam:TCamera = CreateCamera()

Local exit_flag:Byte = False
Repeat
If KeyDown(KEY_ESCAPE) Then exit_flag = True

RenderWorld()
Until exit_flag = True

EndGraphics3D() 'Gaaaanz wichtig, sonst gibts lustige MemLeaks

End

Stille

Dienstag, 20. April 2010 von Farbfinsternis
Ruhig hier, wa?

Das liegt daran dass ich simple3D gerade auf Ogre umstelle. RenderWindow erstellen klappt schonmal, jetzt muss der dreckige Rest noch erledigt werden.

Leider funkt der Mist derzeit nur in BMax, aber ich denke es wird sich herausfinden lassen was in B3D schief läuft.

Weiter gehts

Mittwoch, 6. Januar 2010 von Farbfinsternis
PanzerZ ist auf dem Weg spielbar zu werden und ich habe somit die Arbeit an simple3D wieder aufgenommen. Wie ich schon angekündigt habe wird der Source komplett überarbeitet. So gibt es nun drei DLLs -> s3d.dll (Irrlicht), s3dn.dll (Newton) und s3dk.dll (Irrklang). So kann jeder User selbst entscheiden was er verwenden will und was nicht. Ich gehe davon aus dass das nächste Release in zwei Wochen erscheinen wird.

Gehe zu Seite Zurück  1, 2, 3 ... 8, 9, 10 ... 13, 14, 15  Weiter