simpleIrrlicht - Irrlicht in "Einfach"

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2, 3, 4, 5 ... 13, 14, 15  Weiter

Worklogs simpleIrrlicht - Irrlicht in "Einfach"

Linux Pre-Release

Sonntag, 29. August 2010 von Farbfinsternis
Hier ist ein Päckchen für Linux das noch nicht in Gänze getestet worden ist. Als erstes muss der Inhalt des Library-Paketes (ca. 34MB) nach /usr/local/lib/ kopiert werden, dann die Module (ca. 4MB) nach /BlitzMax/mod/

Das Modul und das beiliegende Example habe ich vorkompiliert.


bo3d.mod

Mittwoch, 25. August 2010 von Farbfinsternis
Sowohl bullet.mod als auch bo3d.mod sind nun vollständig nach Linux portiert.

user posted image

Nun versuche ich das SVN einem Update zu unterziehen. Stay aufgedreht.

OIS und Overlays

Freitag, 20. August 2010 von Farbfinsternis
OIS ist nun beinahe vollständig implementiert (es fehlt noch die Joystick/Gamepad Unterstützung) und die Overlays sind teilweise reimplementiert.

Ich habe das Modul sedm.blitz3d.mod zur "Chefsache" erklärt. Das LowLevel Modul ist scheiße viel Arbeit, wesentlich langsamer, wesentlich anfälliger für MemLeaks und für allgemeine Fehler und eigentlich total egal. Wer Ogre3D mit der originalen Struktur programmieren will darf das gerne tun indem er sich den C++/C#/Java/Objective-C/Python Kompiler seines geringsten Mißtrauens aussucht. Zudem ist bo3D OpenSource, so dass jeder der das möchte selbst einbauen kann was ihn so brennend interessiert.
Nun muss aber niemand Angst haben dass bo3D ein reines prozeduales Interface bietet. Das prozeduale Interface baut nur auf dem OOP Interface auf. Das Objekt ogreData liefert Basisfunktionalitäten, mycam:TCamera = new TCamera erzeugt eine Kamera wie es auch CreateCamera() tut, nur mischen darf man es nicht. Wer OOP basteln möchte erzeugt eine Instanz von "TOgreData" und arbeitet damit.

Noch eine kurze Ausführung zu Texturen etc.: In Ogre3D werden Texturen nicht direkt als Bitmap geladen wie in Blitz3D. Stattdessen lädt man Materialien. Existiert also ein File namens "myCoolGameMedia/texture/brick.jpg" lässt sich "brick.jpg" nicht einfach so laden und verwenden, es muss in einem Material-File definiert sein welches Material-File sich um "brick.jpg" kümmert. Anfangs habe ich darüber nachgedacht das so zu wrappen dass ich den Krimskram per Code erstelle (Material, dessen Eigenschaften, etc.), bin aber zu dem Schluß gekommen dass das originale Ogre3D Material System viel mächtiger ist und es auch einfacher ist ein Material-File zu ändern als das gesamte Projekt neu zu kompilieren.

Beispiel:
Du hast ein Material-File namens "myGameWalls.material", jetzt kannst Du verschiedenste Walls in diesem File definieren. Jedes Material im File "myGameWalls.material" bekommt einen eigenen Namen, z.B. "UrbanBrickWall" und wird über diesen Namen geladen. Man lädt also eine Texture nicht mittels "data/myWallTexture.jpg", sondern über "data/UrbanBrickWall.

Texturen, Modelle, Grafiken, Fonts etc lassen sich auch direkt aus ZIP-Archiven laden. Wenn sich die Game-Data im "media.zip" befinden darf man schreiben: "media.zip/myCoolMaterial". Bis dahin unbekannte Verzeichnisse werden automatisch der ResourceGroup hinzugefügt und initialisiert.

Overlays:
Auch hier habe ich den Blitz3D Syntax zum Vorbild genommen und einige Sachen vereinfacht. Wer Blitz3D zu einseitig findet darf sein Panel natürlich auch per "myPanel:TPanel = new TPanel" erzeugen und dann auf die Methoden des Objekts TPanel zugreifen, für alle anderen gibt es Funktionen, sowie die Extra Funktion "Panel" mit der man alle Schritte zur Anzeige eines Panels erledigen kann:
Code: [AUSKLAPPEN]

Local myPanel:Int = Panel("Logo", 10, 10, 200, 50)

Das erzeugt ein Panel an Position 10, 10 mit den Ausmaßen 200, 50 und dem Material "Logo".


So ... ich bastle dann noch ein bisschen weiter, zum Abschluss noch den Source des aktuellen Examples für Linux:
BlitzMax: [AUSKLAPPEN]

SuperStrict

Framework sedm.blitz3d

Graphics3D(800, 600)


Local cam:Int = CreateCamera()
CameraClsColor(cam, 0.5, 0.6, 0.7)

Local panel:Int = Panel("data/bo3Dlogo", 10, 10, 350, 250)

Local lmx:Int = MouseX()
Local lmy:Int = MouseY()
Local lmz:Int = MouseZ()
Repeat
RenderWorld()
Until KeyHit(1)

EndOgre()
End

OIS, Blitz3D und so

Donnerstag, 19. August 2010 von Farbfinsternis
Das Extra-Modul für den "Blitz3D like" Syntax lass ich nun doch erhalten da ich einsehen musste dass es für den enthusiastischen Blitz3D User evtl. zu kompliziert sein dürfte sich selbst um die Initialisierung und Aktualisierung von OIS und Bullet zu kümmern. Also habe ich den Code aus bo3d.mod ausgelagert und in blitz3d.mod implementiert.
OIS läuft nun wieder und ich baue die restlichen Funktionen ein (derzeit existiert nur KeyDown()). Damit KeyDown(), MouseDown() etc. nicht kollidieren ist es erforderlich das Modul als Framework einzusetzen.

Ein gelbes Fenster mit ohne alles ....
BlitzMax: [AUSKLAPPEN]

SuperStrict

Framework sedm.blitz3d

Graphics3D(800, 600)
Local cam:Int = CreateCamera()
CameraClsColor(cam, 1.0, 1.0, 0.0)

Repeat
RenderWorld()
Until KeyDown(1)

EndOgre()
End

Linux rennt...

Mittwoch, 18. August 2010 von Farbfinsternis
... und das ist wörtlich zu nehmen. Ich konnte den Fehler lokalisieren und ausmerzen und nun rennt die Linux Version noch schneller als unter Windows. Um den Fehler zu finden habe ich diverse Dinge direkt in C++ in "Blitz3D like" Funktionen verpackt (was ja letzten Endes auch geholfen hat den Fehler zu finden) und musste feststellen dass das wesentlich schneller ist als die Blitz3D Funktionen in BMax nachzubauen. Somit werde ich das so übernehmen und das Modul "blitzogre3d.mod" wird überflüssig.
Als nächstes muss ich noch ois.mod neu bauen (da ist mir irgendwie und blöderweise der Source abhanden gekommen als ich von Windows auf Linux migriert bin) und bullet.mod anpassen. Wenn das alles passiert ist werde ich mich darum kümmern dass auch die Windows Version wieder läuft (fahre hier Windows 7 in einer Sandkiste (VBox)).

Nochwas zur Linux Version: bo3D ist dort eine statische Lib, muss also nicht mitgeliefert werden da sie direkt in das Modul kompiliert wird, allerdings sind die Bibliotheken und Plugins von Ogre wesentlich größer als unter Windows die DLLs. Keine Ahnung warum das so sein muss, aber es ist nunmal so. Ich werde deshalb die Bibliotheken als separaten Download anbieten um den Kram nicht mit jedem Sample neu hochladen zu müssen. Im beigelegten Readme ist dann exakt beschrieben wo die Files hin müssen, evtl. packe ich ein Bash bei welches die Installation erledigt.

So ... nun zurück an den Source, wir haben noch einiges vor. Wenn alles gut geht klappt es vielleicht doch noch mit einem neuen Release zum Wochenende. Stay gespannt!

Linux

Montag, 16. August 2010 von Farbfinsternis
Es ist faszinierend wieviel Aufwand man manchmal betreiben muss um eine sehr einfache Sache zu bewegen. Im Moment habe ich den Eindruck einen Braunkohlebagger zu benötigen um einen Gummiball zu bewegen.

Wie viele wissen baue ich derzeit an der Linux Version des Wrappers und ich war dem Aufgeben heute so nahe wie nie, wenn da nicht Brucey den nötigen Hint geliefert hätte. Jeder der die Linux Version verwenden möchte muss später in der Lage sein Ogre3D, OIS und Bullet für sein System zu kompilieren da vorgefertigte Libs scheinbar nicht überall funktionieren. Wer seine Ogre3D Linux Applikation weitergeben möchte muss ungefähr 70MB an Libs mitliefern (unter Windows sind es vergleichsweise schmale 15MB).
Für Linux musste ich den Source dramatisch umbauen, bspw. musste ich alle Extern Blöcke in die Includes verschieben in denen die enthaltenen Funktionen verwendet werden weil Linux sonst behauptet dass die entsprechenden Funktionen nicht deklariert wurden. Im Moment lassen sich die Module nicht unter Windows kompilieren da ein "Extern" unter Windows anders "bestückt" sein muss als unter Linux, außerdem funktioniert der CD-Switch noch nicht ganz. Den musste ich einbauen weil es unter Linux kein "__stdcall" oder ein "dllexport blablabla" gibt.
Dann hatte ich die letzte Version ja noch darauf aufgebaut dass die jeweilgen Fenster der API verwendet werden, was ja wie bekannt furchtbar in die Hose gegangen ist. Um das zu reparieren musste ich furchtbar viele Fälle testen und einiges umbauen. Blitz3D reagiert auf ein externes Fenster anders als BlitzMax unter Windows und widerum noch anders unter Linux, wenn sich jemand nach MacOSX erkundigt darf er gerne hier antreten und sich seine Watschen abholen Wink

Im Moment läuft das Example soweit dass kurz der Kontext initialisiert wird und danach direkt mit einem vielsagenden "Segmentation Fault" abgebrochen wird ... das muss jetzt nicht direkt am Source liegen, sondern kann auch mit der Umgebung zusammenhängen (Plugins, Media-Files, etc.)

Derzeit schraube ich ein neues Example (speziell für Linux) zusammen um dort Schritt für Schritt zu erkunden wo es hakt. Gern würde ich ein Release der neuen Version zum Wochenende versprechen, aber ihr solltet Euch nicht darauf verlassen.

Mal die Kirche im Dorf lassen

Sonntag, 27. Juni 2010 von Farbfinsternis
Ich bin mir nun zu 99% sicher dass der DX7 Kontext nicht das hüpfende Komma ist. Da ich die Funktion RenderWorld() überschreibe kommt B3D garnicht dazu etwas in den Buffer zu schreiben. FastExt übernimmt nur den Render-Hook weil es selbst in den Buffer schreiben will ohne die Originalausgabe zu vermeiden. bo3D jedoch übernimmt das Rendering komplett und lässt keinerlei 3D/2D Möglichkeiten von B3D mehr zu.

Dass bei vielen nur ein MAV oder nur ein schwarzer Screen kommt wird daran liegen dass das Sample Techniken verwendet die deren Hardware nicht oder nur unzurreichend unterstützt. Um das heraus zu finden werde ich nachher mal ein "Barbone Example" zusammen schustern.
Desweiteren werde ich die Prüfung der Capabilities einbauen, das habe ich bisher vermieden weil es ein Heidenaufwand ist Wink

stay tuned.

Ein Schritt vor, zwei zurück.

Freitag, 25. Juni 2010 von Farbfinsternis
Offensichtlich funktioniert die Übernahme der gegebenen Fenster nur im Promille-Bereich der User. Demzufolge werde ich OIS (Open Input System) wieder einführen und Ogre3D wieder seine eigenen Funktionen verwenden lassen um das Fenster zu öffnen. Die Möglichkeit das Fenster des Hosts zu übernehmen lasse ich erstmal noch drin, vielleicht findet sich ja noch ein Geek der mir erklären kann was da schief läuft.
Das alles bedeutet für Blitz3D User dass noch eine weitere DECLS dazu kommt, nämlich die für die OIS.dll.

Parallel habe ich mir gerade eine Env aufgesetzt mit der ich erneut versuchen will alle Libs statisch gegen die bo3d.dll zu linken, mal gucken was dabei rum kommt.

Stay tuned Folks, es gibt bald wieder was zum testen.

Blitz3D wieder...

Donnerstag, 24. Juni 2010 von Farbfinsternis
Die heutige Revision 50 beinhaltet beinahe ausschliesslich Updates für die Blitz3D Version. So bin ich wieder zurück auf Handles bei den Entities gegegangen weil ich die Funktionen Object und Handle komplett verdrängt hatte. Nun darf man ein Entity wieder direkt beim erstellen "parenten".

Desweiteren habe ich Bullet hinzugefügt was man sich schön im Sample anschauen kann. Der Bullet Wrapper ist nicht von Ogre3D abhängig und kann auch für normale Blitz3D Programme ohne bo3D genutzt werden. Da Ogre3D und Bullet hin und wieder Strukturzeiger erwarten oder zurückgeben musste ich mir noch die Funktion RtlMoveMemory() aus der Kernel32.dll durchschleifen. Da es mir bewusst ist dass der Eine oder Andere Blitz3D User bereits eine sehr umfangreiche Kernel32.decls besitzt, habe ich diese Funktion für mich in die bo3d_kernel32.decls gepackt. Wer noch keine kernel32.decls besitzt und dennoch den schönen Befehl "CopyMemory()" benutzen will, kann dies natürlich auch ohne bo3D tun.

Die Funktion ScreenFX() ist nun auch in Blitz3D verfügbar, wenn gleich diese noch nicht ganz rund läuft.

Weiterhin habe ich Graphics3D() in die Funktion OgreGraphics3D() verlagert so dass man einige Parameter nicht mehr zweimal angeben muss. OgreGraphics3D() hieß gestern noch StartOgre3D().

Ganz wichtig: Obwohl der Wrapper mittlerweile wesentlich runder und schneller läuft als noch vor ein paar Wochen, so kann die Blitz3D IDE noch immer nicht direkt kompilieren. Entweder Ihr erstellt immer erst ein Executable welches Ihr dann testet, oder Ihr nehmt gleich eine bessere IDE. Ich kann hier nur IDEal empfehlen!

Changelog:
Code: [AUSKLAPPEN]

06-24-2010 v0.1

changed: CreateCamera() stores the cameraviewport in TEntity
changed: CreateLight() stores the LightType in TEntity
changed: StartOgre3D() renamed to OgreGraphics3D(), it replaced now Graphics3D()
changed: Entities now representet by Handles instead by Objects
changed: all Create...() functions now have the parameter "parent%"
added: CameraClsColor(camera%, red#, green#, blue#)
added: ScreenFX(camera%, fx$)
added: ShadowTexSize(texture_size%)
added: RenderWorld(time_since_last_frame#)
added: LightRange()
added: LightConeAngles(light%, inner_angle#, outer_angle#)
added: LightShadowRange(light%, nearShadowDistance#, farShadowDistance#)
added: bo3d_kernel32.decls (prevents that bo3d collides with an existing kernel32.dll)
added: MeshWidth#(mesh%)
added: MeshHeight#(mesh%)
added: MeshDepth#(mesh%)
added: EntityX#(entity%)
added: EntityY#(entity%)
added: EntityZ#(entity%)
added: FreeEntity(entity%)
added: CopyEntity%(entity%, parent%)
added: DynamicEntity(entity%, mass#, shapeType%, playerControlled%)
added: UpdateWorld()
fixed: o_aab_getSize%(axisAlignedBox%)


user posted image

Der Quelltext des aktualisierten Examples
BlitzBasic: [AUSKLAPPEN]

;====================================================================
;
; Ogre3D Wrapper for Blitz3D
;
; Example01
;
;====================================================================

Include "bo3d/bo.bb"

OgreGraphics3D(800, 600, 32, False, True)

; Parameter "directory" can be a folder or a Zip-Archive.
; Archive extensions can be: .zip, .dat or .pak
; if you need an own extension, take a look into root.bb
; and add your extension to the SELECT ext ... CASE in
; function "SetMediaDir()"
SetMediaDir("media.zip", True)

AmbientLight 0.0, 0.0, 0.0


; let's create a pivot for "player control"
piv = CreatePivot()


; we need a camera
cam = CreateCamera(piv)
CameraRange cam, 0.1, 5000.0

PositionEntity(piv, 0.0, 10.0, -50.0)


; let's turn the light on
light = CreateLight(LT_POINT)
PositionEntity light, -100, 100, -100
LightRange(light, 500)
LightShadowRange(light)


; load a simple mesh from media.zip
box = LoadMesh("box.mesh")
PositionEntity box, 0.0, 50.0, 0.0

; load the ground mesh
ground = LoadMesh("ground.mesh")
PositionEntity ground, 0.0, -5.0, 0.0
DynamicEntity(ground, 0.0) ; mass = 0.0 = static mesh


; we want some shadows
ShadowStyle(ST_STENCIL_MOD)
EntityShadow(box)
EntityShadow(ground, False)


; create the Skybox.
; remind that you don't load a mesh or a texture. "SkyBox"
; is a material inside "media.zip\skybox.material". You can
; edit *.material files with a texteditor.
SkyBox("SkyBox")


MoveMouse 400, 300

Repeat
; Cls is not needed

Local msx# = MouseXSpeed()
Local msy# = MouseYSpeed()

If KeyDown(1) Then Exit
If KeyDown(208) Or KeyDown(31) Then MoveEntity piv, 0.0, 0.0, -0.1
If KeyDown(200) Or KeyDown(17) Then MoveEntity piv, 0.0, 0.0, 0.1
If KeyDown(203) Or KeyDown(30) Then MoveEntity piv, -0.1, 0.0, 0.0
If KeyDown(205) Or KeyDown(32) Then MoveEntity piv, 0.1, 0.0, 0.0

If KeyHit(57)
Local bb = CopyEntity(box)
PositionEntity(bb, Rnd(-10.0, 10.0), 50.0, Rnd(-10.0, 10.0))
DynamicEntity(bb)
EndIf

TurnEntity piv, 0.0, -msx * 0.005, 0.0
TurnEntity cam, -msy * 0.005, 0.0, 0.0

MoveMouse 400, 300

UpdateWorld
RenderWorld

; Flip is not needed
Forever

StopOgre3D()

End


Ich habe ein Päckchen hochgeladen mit dem Ihr das Ganze auch ohne SVN testen könnt:

>> Download Ogre3D für Blitz3D Revision 50 (ca. 9MB) <<

[EDIT]
1. Der Wrapper funktioniert aktuell nicht auf Rechnern mit einer GPU von Intel. Danke an Tobchen fürs testen, ich arbeite an der Problematik.

2. Es funktioniert noch immer nicht einen OpenGL Kontext in das Blitz3D Fenster zu zwingen. Auch daran wird fleissig gebastelt.
[/EDIT]

Blitz3D darf auch wieder mitspielen

Mittwoch, 23. Juni 2010 von Farbfinsternis
Es ist mir nun gelungen dem Blitz3D Graphics3D() Fenster den Ogre3D Kontext aufzuzwingen (derzeit nur DirectX9, OpenGL will noch nicht). Somit ist Blitz3D wieder im Rennen und ich habe das Projekt ins SVN integriert. Derzeit habe ich noch keinen "featured Download" der auch den Blitz3D Wrapper beinhaltet aber ich denke das ich das Päckchen bis Sonntag hochladen kann, bis dahin könnt Ihr Euch ja mit SVN vertraut machen und so wieder etwas dazu lernen.

Der Vorteil eines Ogre3D Kontext im Blitz3D Fenster ist dass ich nun auch für Blitz3D keinen externen Inputhandler mehr benötige, Ihr könnt also ganz normal die Input-Funktionen von Blitz3D verwenden.

In der letzten Version des Blitz3D Wrappers habe ich noch Integer als Objekt-Handles verwendet. Das zog allerdings den Nachteil mit sich dass ich bei diversen Operationen eine Liste iterieren musste um an den Zeiger auf das entsprechende Ogre-Objekt zu kommen. Da das einfach zuviel wird wenn man mal mehr als zwei Kisten auf dem Screen hat bin ich nun wieder auf das Objekt-System umgestiegen. Alle Entities sind vom Typ TEntity. Zwar kann man so nicht einfach so einen alten B3D Code auf Ogre ausführen, aber irgendwas ist ja immer.

Leider kann man Funktionsparameter die vom Typ "User defined Type" sind nicht optional machen, weshalb bei allen "Create..." Funktionen der Parameter "parent" wegfällt. Wer was "parenten" will muss das nachträglich per "EntityParent()" erledigen.

Neu eingeführt habe ich die Funktion "SetMediaDir()". Diese greift dem voraus was alle "Load..." Funktionen des Wrappers machen: Den Pfad vom Dateinamen trennen, prüfen ob es ein Archiv ist und dann das Ganze dem ResourceManager übergeben. Der Vorteil? Man kann sich nach einem "SetMediaDir()" die Angabe des Pfades sparen und schreibt nur noch welche Datei man laden möchte. Optional kann man noch "recursive" auf "True" setzen, dann werden auch alle Unterordner mit einbezogen.
Möchtet Ihr die Daten aus einem Archiv lesen fügt Ihr einfach die Endung des Archivs mit an. Derzeit unterstützt sind ".zip", ".dat" und ".pak". Beispiel:
BlitzBasic: [AUSKLAPPEN]
SetMediaDir("media.pak", True)


Zum Abschluss wieder ein Screenshot (der Blitz3D Version) und der Source des dahinter steckenden Samples:
user posted image

BlitzBasic: [AUSKLAPPEN]

;====================================================================
;
; Ogre3D Wrapper for Blitz3D
;
; Example01
;
;====================================================================

Include "bo3d/bo.bb"

Graphics3D 800, 600, 32, 2

StartOgre3D()

; Parameter "directory" can be a folder or a Zip-Archive.
; Archive extensions can be: .zip, .dat or .pak
; if you need an own extension, take a look into root.bb
; and add your extension to the SELECT ext ... CASE in
; function "SetMediaDir()"
SetMediaDir("media.zip", True)

AmbientLight 0.0, 0.0, 0.0

; we need a camera
cam.TEntity = CreateCamera()
CameraRange cam, 0.1, 5000.0

; let's create a pivot for "player control"
piv.TEntity = CreatePivot()
EntityParent cam, piv
PositionEntity(piv, 0.0, 10.0, -50.0)

; let's turn the ligt on
light.TEntity = CreateLight(LT_POINT)
PositionEntity light, -10, 100, -100


; load a simple mesh from media.zip
box.TEntity = LoadMesh("box.mesh")
PositionEntity box, 0.0, 0.0, 0.0

; load the ground mesh
ground.TEntity = LoadMesh("ground.mesh")
PositionEntity ground, 0.0, -5.0, 0.0

; we want some shadows
ShadowStyle()

EntityShadow(box)
EntityShadow(ground, False)

; create the Skybox.
; remind that you don't load a mesh or a texture. "SkyBox"
; is a material inside "media.zip\skybox.material". You can
; edit *.material files with a texteditor.
SkyBox("SkyBox")

MoveMouse 400, 300

Repeat
Local msx# = MouseXSpeed()
Local msy# = MouseYSpeed()

If KeyDown(1) Then Exit
If KeyDown(208) Or KeyDown(31) Then MoveEntity piv, 0.0, 0.0, -0.01
If KeyDown(200) Or KeyDown(17) Then MoveEntity piv, 0.0, 0.0, 0.01
If KeyDown(203) Or KeyDown(30) Then MoveEntity piv, -0.01, 0.0, 0.0
If KeyDown(205) Or KeyDown(32) Then MoveEntity piv, 0.01, 0.0, 0.0

TurnEntity piv, 0.0, -msx * 0.01, 0.0
TurnEntity cam, -msy * 0.01, 0.0, 0.0

MoveMouse 400, 300
o_renderOneFrame(ogre3d\ogre_root, 0.0)
Forever

StopOgre3D()

End


Wie der findige Beobachter sieht habe ich "RenderWorld()" nicht implementiert ... Asche auf mein Haupt.

Gehe zu Seite Zurück  1, 2, 3, 4, 5 ... 13, 14, 15  Weiter