simpleIrrlicht - Irrlicht in "Einfach"

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

Worklogs simpleIrrlicht - Irrlicht in "Einfach"

Frauen und Kinder zuerst

Mittwoch, 12. September 2012 von Farbfinsternis
Ich wurde gefragt warum ich das Ganze jetzt nochmals neu auflege. Die Antwort: Tue ich nicht. Der alte C++ Code wird per Copy & Paste in das neue Projekt geschubst und dann auf den neuesten Stand gebracht.

Beispielsweise erhalten jetzt alle Funktionen einen Try...Catch Block um wirklich jeden Fehler abfangen zu können. Desweiteren switche ich nicht mehr jeden Kram sondern caste die Pointer die mir Ogre3D liefert in ein unsigned long.

Eine weitere Änderung: Viele Funktionen arbeiten nicht mehr direkt auf den Ogre Objekten sondern auf einer Node an die jedes Objekt gehangen wird. Zwar müssen ohnehin einige Objekte in Ogre an Nodes gehangen werden, ich habe das aber für alle Objekte eingeführt so dass ich stets eine Node zur Verfügung habe wenn positioniert, transliert, rotiert, mastrubiert or whatever wird.

Außerdem gibt es noch eine Änderung die zwar allgemein gesehen eher banal ist, mir aber einiges bedeutet: Es sollen keine Warnungen mehr ausgegeben werden wenn die DLL kompiliert wird. Bisher ist mir das recht gut gelungen, das Projekt kompiliert fehlerfrei durch.

Abschließend das ChangeLog für heute....

Code: [AUSKLAPPEN]

added      : TLight.LightDiffuseColor()
added      : TLight.LightRange()
added      : TLight.LightConeAngles()
added      : LightColor()
added      : LightRange()
added      : LightConeAngles()
added      : TCamera.CameraRange()
added      : TCamera.CameraProjMode()
added      : CameraRange()
added      : CameraProjMode()
added      : TEntity.EntityX()
added      : TEntity.EntityY()
added      : TEntity.EntityZ()
added      : TEntity.EntityPitch()
added      : TEntity.EntityYaw()
added      : TEntity.EntityRoll()
added      : EntityX()
added      : EntityY()
added      : EntityZ()
added      : EntityPitch()
added      : EntityYaw()
added      : EntityRoll()

bo3D Docs

Dienstag, 11. September 2012 von Farbfinsternis
Es ist schwieriger und langatmiger ein bestehendes System zu dokumentieren, als ein System während der Entwicklung mit Docs zu versorgen. Also habe ich eine bo3D Site von Grund auf neu entwickelt und ein eigenes Dokumentations-Modul implementiert. Es beinhaltet Geshi für das Syntax-Highlighting und ein Kommentar-System für Fragen welche die entsprechenden Funktionen betreffen.

Da Blitz3D nur schwierig mit Ogre3D zu simulieren ist, habe ich den Funktionen "Color-States" verpasst.

Grün = Vollständig implementiert
Orange = Teilweise implementiert oder mit kleinen Fehlern
Rot = Nicht implementiert oder extrem fehlerhaft implementiert

Oft beinhaltet die Doku einen Hinweis darauf warum die Funktion nicht grün angezeigt wird.

Es gibt derzeit nur wenige Inhalte und es kann hin und wieder Darstellungsfehler geben. Dennoch könnt Ihr Euch die Site schon mal anschauen, vielleicht gibt es ja jetzt schon Verbesserungsvorschläge.

http://www.colorflow.de/bo3d

Zu bo3D selbst:
BlitzMax hat mir gezeigt dass es ohne OOP Interface kaum geht. Ziel ist immer noch Blitz3D exakt zu kopieren und erst danach die Möglichkeiten zu erweitern, aber bo3D nutzt dennoch die Möglichkeit von BlitzMax objektorientiert zu arbeiten. Ohne dass mir jetzt direkt ein Einsatzzweck einfällt ist es mit dem OOP Interface möglich mehrere Instanzen der Ogre3D Engine zu initialisieren.

Primär ist aber das prozeduale Interface und alle Funktionen liefern Handles anstelle von Objekten. Es soll so einfach wie Blitz3D sein und später wesentlich mehr können.

0.13

Freitag, 7. September 2012 von Farbfinsternis
Die erste Version des "Rewrite" ist nun verfügbar und kann als Modul für BlitzMax unter www.colorflow.de/pub/bo3d/bo3d.mod.zip herunter geladen werden. Ein Sample liegt ausführbar und als Source bei.

Hier noch das bisherige Changelog:
Code: [AUSKLAPPEN]

09-07-2012 - v0.13
added      : TMesh.LoadMesh()
added      : TLight.CreateLight()
added      : TOgre.AmbientLight()
added      : TOgre.addResourceLocation()
added      : LoadMesh()
added      : CreateLight()
added      : AmbientLight()
added      : SetRenderer()
added      : isMouseDown()
fixed      : TurnEntity()


09-05-2012 - v0.12
added      : TEntity.TranslateEntity()
added      : TCamera.CreateCamera()
added      : TCamera.CameraClsColor()
added      : CreateCamera()
added      : CameraClsColor()
added      : TranslateEntity()
changed      : parameter "global" added to PositionEntity()
changed      : parameter "global" added to RotateEntity()


09-04-2012 - v0.11
added      : TEntity.EntityParent()
added      : TEntity.PositionEntity()
added      : TEntity.RotateEntity()
added      : TEntity.MoveEntity()
added      : TEntity.TurnEntity()
added      : EntityParent()
added      : PositionEntity()
added      : RotateEntity()
added      : MoveEntity()
added      : TurnEntity()


09-03-2012 - v0.10
added      : TOgre.Graphics3D()
added      : TOgre.EndGraphics3D()
added      : TOgre.RenderWorld()
added      : Graphics3D()
added      : EndGraphics3D()
added      : RenderWorld()
added      : WinTitle()
changed      : start to rewrite the code with Ogre3D V1.8

Weiter gehts...

Mittwoch, 29. August 2012 von Farbfinsternis
Nachdem ewig nix passiert ist hat mich überraschender Weise die kostenlose BlitzPlus Version animiert wieder Hand an den Wrapper zu legen. Er basiert nun auf der aktuellen Ogre Version 1.8 und hat einige Änderungen erfahren.

So ist nun das Ziel Blitz3D möglichst exakt zu kopieren. Es gibt keine Objekte mehr, nur noch Handles. Das meiste passiert direkt im Wrapper für alle Targets (BlitzPlus, Blitz3D, BlitzMax). "CreateCamera" beispielsweise liefert in BlitzPlus und Blitz3D nur noch ein Integer als Handle, in BlitzMax ein Byte Ptr. Es gibt kein OOP Interface mehr, alle Funktionen werden prozedual aufgerufen. Während zuvor noch BlitzMax nach dem Typ des Objekts suchte um die entsprechende Funktion der DLL aufzurufen, übernimmt nun die DLL selbst diesen Job.

Namen für Objekte sind nicht mehr notwendig, Ogre liefert selbst einen NameGenerator und ich dachte mir es wäre besser diesen zu benutzen als den Blitz3D Befehlsschatz zu verwässern.

Unverändert ist die Tatsache dass es eine Schicht zwischen DLL und dem Blitz-Dialekt gibt. Dies ist aber einzig dem Umstand geschuldet dass ich so Funktionsparameter optional machen kann.

Ziel ist es nun möglichst alle Blitz3D Funktionen zu implementieren und erst dann zu versuchen die Vorzüge von Ogre3D zu übertragen.

Weiter gehts....

Kollision oder Physik?

Dienstag, 15. November 2011 von Farbfinsternis
Der Wrapper bereitet eine bo3D Scene in jedem Fall dafür vor echte Physik mittels Bullet zu verwenden. Damit man aber auch mit Kollisionen wie in Blitz3D arbeiten kann, habe ich eingebaut dass ein EntityMass(myEntity, -1) dafür sorgt dass das Entity zwar an Kollisionen teilnehmen darf, aber nicht von anderen Objekten in seinen Koordinaten beeinflusst wird. Die Vorgehensweise entspricht der von Blitz3D. Gibt man dem Objekt eine Masse > -1 (0 ist auch eine Masse!) wird seine Kollision auch registriert, aber das Objekt reagiert gleichzeitig auch auf die physikalischen Gegebenheiten seiner Umgebung.

Es wird eventuell etwas kompilizierter Kollisionen zu verwalten als in Blitz3D, aber der Freiraum macht es dann vielleicht auch wieder wett.

Physik und so ...

Donnerstag, 10. November 2011 von Farbfinsternis
Dank Bullet 2.79 muss nun keine weitere DLL für Physics mehr "mit geschleppt" werden. Bullet ist nun integraler Bestandteil des Wrappers. Die Implementation sieht derzeit eine Gravitation von 10.0 auf der Y Achse vor, von 9.81 zu 10.0 ist es nun wirklich nicht weit Wink

TOgre wurde um die Methode setGravity() erweitert und TEntity kennt nun die Methode createPhysicsBox(). Letztere Methode erzeugt eine Box in der Größe des Entity. Prozedual wurde das Interface noch nicht erweitert. Ich gedenke ein Entity mit EntityMass(entity:TEntity, form:Int) auszustatten. Der Parameter "form" soll dann ENTITY_AS_BOX, ENTITY_AS_SPHERE oder ENTITY_AS_MESH sein können. Ersteres bildet eine Box um die maximalen Ausmaße des Entity, zweiteres eine Kugel und letzteres definiert das Entity (Mesh) als Physik-Entity welches durch seine Polygone exakt definiert wird.

In BlitzMax sorgt nun das Modul selbst dafür dass die Debug-DLLs oder die Release-DLLs verwendet werden. Voraussetzung ist hier natürlich dass eine entsprechende Plugins-Config bereit steht und auch die Debug-DLLs im Falle des Falles am Start sind.

In Blitz3D/BlitzPlus muss der geneigte User selbst umkopieren und sortieren um sicherzustellen dass die richtigen Daten verfügbar sind.

Ein Zwischenstand kann unter http://bo3d.sedm.de/downloads/bo3d.mod.0.27.zip (ca. 12MB) herunter geladen werden. Blitz3D/BlitzPlus ist dort nicht dabei!

Viel Spaß und seid gespannt auf 0.28!

OIS und bo3D

Freitag, 20. Mai 2011 von Farbfinsternis
In letzter Zeit habe ich mich wieder um den Lowlevel Wrapper gekümmert. Bei dem ist jetzt "Root" komplett, "SceneManager" fast und alle anderen Klassen haben die eine oder andere Methode. Ist halt ein Haufen Stuff und mit etwa 300 implementierten ethoden habe ich am Maß nur genippt.

Anders sieht es bei OIS aus. Der Wrapper sollte anfänglich nur das Notwendigste bereit stellen, aber ich dachte mir: Hey, mal alles auf einem Gamepad nutzen zu können ist ja auch nicht verkehrt. OIS ist nun zu etwa 80% übersetzt. Was mir noch etwas Bauchschmerzen bereitet sind die Listener und die Effects für ForceFeedback, aber da sehe ich schon ein wenig Licht am Ende des Tunnels.

Hier mal das Beispielprogramm für OIS wie es derzeit aussieht:
BlitzMax: [AUSKLAPPEN]
Framework brl.d3d9max2d 
Import sedm.ois

Local g:TGraphics = Graphics(800, 600)
Local drv:TD3D9Graphics = TD3D9Graphics(TMax2DGraphics(g)._graphics)
Local hWnd:Int = drv._hWnd
Local w:Int = drv._width
Local h:Int = drv._height


Local inpMan:TInputManager = TInputManager.createInputSystem(hWnd)

Local mouse:TMouse = inpMan.createMouse(False)
Local mState:TMouseState = mouse.getMouseState()
mState.setWidth(mouse, w)
mState.setHeight(mouse, h)

Local keyb:TKeyboard = inpMan.createKeyboard(False)
Local js:TJoystick = inpMan.createJoyStick(False)

Local OISVersion:String = inpMan.getVersionName()
Local OISSystem:String = inpMan.inputSystemName()

Repeat
Cls()

mouse.Capture()
keyb.Capture()

Local mx:Int = mouse.getMouseState().xAbs
Local my:Int = mouse.getMouseState().yAbs

DrawText("MouseX: " + String(mx) + ", MouseY: " + String(my), 10, 10)
DrawText("OIS-Version: " + OISVersion, 10, 30)
DrawText("Input-System: " + OISSystem, 10, 50)

If mouse.buttonDown(MB_Left) Then DrawText("Left Mousebutton down!", 10, 90)
If mouse.buttonDown(MB_Right) Then DrawText("Right Mousebutton down!", 10, 90)
If mouse.buttonDown(MB_Middle) Then DrawText("Middle Mousebutton down!", 10, 90)

DrawRect(mx - 2, my - 2, 4, 4)

Flip()

Until keyb.isKeyDown(KC_ESCAPE) Or AppTerminate()

inpMan.destroyInputObject(mouse)
inpMan.destroyInputObject(keyb)

End


Sieht auf den ersten Blick vielleicht etwas kompliziert aus, aber mit etwas Einarbeitung kann man gut damit umgehen. Abgesehen davon dass ich die blöde Angewohnheit habe alles auf einen funktionalen Basic-Syntax herunter zu brechen ... aber das ist dann ein anderer Beitrag in diesem Worklog.

Gamepads raus!

Freitag, 6. Mai 2011 von Farbfinsternis
Heute habe ich mich wieder ein wenig um das InputSystem gekümmert. So kann man jetzt die Mauskoordinaten erfragen und, vor Allem, Gamepads und Joysticks verwenden. Ihr könnt soviele Joysticks an Eure Kiste klemmen wie Ihr wollt und dem Wrapper ist es auch egal ob ihr eine Bazzillion Analogsticks und eine Fantastillion Buttons auf den Dingern habt.

Changelog:
Code: [AUSKLAPPEN]
added   : TOgre.mouseX:Int()
added   : TOgre.mouseY:Int()
added   : TOgre.countJoysticks:Int()
added   : TOgre.countJoyButtons:Int(joystick:Int)
added   : TOgre.countJoyAxes:Int(joystick:Int)
added   : TOgre.joyAxis:Int(joystick:Int, axis:Int)
added   : TOgre.joyButton:Int(joystick:Int, button:Int)
added   : MouseX()
added   : MouseY()
added   : CountJoysticks:Int()
added   : CountJoyButtons:Int(joystick:Int)
added   : CountJoyAxes:Int(joystick:Int)
added   : JoyAxis:Int(joystick:Int, axis:Int)
added   : JoyButton:Int(joystick:Int, button:Int)


Ein Executable zum testen liegt sowohl der BlitzPlus/Blitz3D als auch der BlitzMax Version bei.

>> Download 0.26 für BlitzMax (ca. 244kb) << (es wird Version 0.22 benötigt)
>> Download 0.26 für BlitzPlus/Blitz3D (ca. 1,3MB) << (es wird Version 0.23 benötigt)

Vertex Control

Donnerstag, 5. Mai 2011 von Farbfinsternis
Heute fällt das Update etwas kleiner aus da ich wesentlich weniger Zeit dafür hatte. Neu hinzugekommen ist die Möglichkeit Vertices einen Farbwert zu geben (VertexColor) und eine Normale (VertexNormal). Außerdem wurde AddVertex() so erweitert dass man der Funktion nun auch UVW-Koordinaten übergeben kann.

Beispiel VertexColors...
user posted image

... und der Source dazu
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework sedm.bogre

InitOgre(OGRE_DX9, "Vertex-Colours")
Graphics3D(1024, 768, 32)

AmbientLight(0, 0, 0)

Local cam:TCamera = createCamera()
Local light:TLight = createLight()

PositionEntity(light, -200, 200, 200)
CameraRange(cam)
CameraClsColor(cam, 90, 128, 255)
PositionEntity(cam, 0.0, 0.0, 200)

Local mesh:TMesh = CreateMesh("myMesh")

MeshBeginBuild(mesh, "BaseWhiteNoLighting")

AddVertex(mesh, -50, -50, 0); VertexColor(mesh, 255, 0, 0)
AddVertex(mesh, 50, -50, 0) ; VertexColor(mesh, 255, 255, 0)
AddVertex(mesh, 50, 50, 0) ; VertexColor(mesh, 0, 255, 0)
AddVertex(mesh, -50, 50, 0) ; VertexColor(mesh, 0, 0, 255)

VertexIndex(mesh, 0)
VertexIndex(mesh, 1)
VertexIndex(mesh, 3)
VertexIndex(mesh, 1)
VertexIndex(mesh, 2)
VertexIndex(mesh, 3)

MeshEndBuild(mesh)


Repeat
turnEntity(mesh, 0, 0.05, 0)
RenderWorld()
Until KeyHit(KC_ESCAPE)

EndGraphics3D()


Changelog für heute:
Code: [AUSKLAPPEN]
added   : TMesh.vertexNormal(x:Float, y:Float, z:Float)
added   : TMesh.vertexColor(r:Float, g:Float, b:Float, a:Float = 255.0)
added   : VertexNormal(mesh:TMesh, x:Float, y:Float, z:Float)
added   : VertexColor(mesh:TMesh, r:Float, g:Float, b:Float, a:Float = 255.0)
changed   : AddVertex() bzw. TMesh.addVertex() hat nun die zusätzlichen Parameter u, v, w für Texturkoordinaten


Und natürlich die Downloads:
>> Download v0.25 für BlitzPlus/Blitz3D (ca. 1,3MB) << (es wird v0.23 benötigt!)
>> Download v0.25 für BlitzMax (ca. 200kb) << (es wird v0.22 benötigt!)

Create a Mesh

Mittwoch, 4. Mai 2011 von Farbfinsternis
Heute habe ich die ersten Funktionen implementiert um manuell Meshes erstellen zu können. In Ogre3D läuft das ein klein wenig anders ab als in Blitz3D, aber man gewöhnt sich dran.

Hier der Source der ein einfaches Quadrat erstellt und dieses dann drehen lässt.
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework sedm.bogre

InitOgre()
Graphics3D()

AmbientLight(0, 0, 0)

Local cam:TCamera = createCamera()
Local light:TLight = createLight()

PositionEntity(light, -200, 200, 200)
CameraRange(cam)
CameraClsColor(cam, 90, 128, 255)
PositionEntity(cam, 0.0, 0.0, 200)

Local mesh:TMesh = CreateMesh("myMesh")

MeshBeginBuild(mesh, "BaseStandardWhite")', OT_LINE_STRIP)

AddVertex(mesh, -50, -50, 0)
AddVertex(mesh, 50, -50, 0)
AddVertex(mesh, 50, 50, 0)
AddVertex(mesh, -50, 50, 0)

VertexIndex(mesh, 0)
VertexIndex(mesh, 1)
VertexIndex(mesh, 3)
VertexIndex(mesh, 1)
VertexIndex(mesh, 2)
VertexIndex(mesh, 3)

MeshEndBuild(mesh)


Repeat
turnEntity(mesh, 0, 0.05, 0)
RenderWorld()
Until KeyHit(KC_ESCAPE)

EndGraphics3D()


>> Download 0.24 für BlitzMax (ca. 260kb) <<
>> Download 0.24 für BlitzPlus/Blitz3D (ca. 1,3MB) <<

Es liegen ausführbare Beispiele bei.

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