bo3D - Ogre3D für BlitzPlus/Blitz3D/BlitzMax
Kollision oder Physik?
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 ...
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
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
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!
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.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
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...
... 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.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
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.
Blitz3D & BlitzPlus
Nun sind wieder alle Versionen auf dem gleichen Stand. Die Version für Blitz3D und BlitzPlus könnt Ihr Euch hier herunterladen (ca. 6MB).
Bitte beachtet dass sich Ogre3D Programme nicht aus der Oginal IDE von Blitz3D ausführen lassen! Bei BlitzPlus wird es ähnlich aussehen. Allerdings funktioniert das mit IDEal bis WindowsXP und unter Windows7 hin und wieder im Debugmode. Wer aber unbedingt mit der Original IDE arbeiten will muss zunächst ein Executable erstellen und dann dieses testen.
Ein ausführbares Example liegt dem Archiv bei.
Ogre3D in Blitz3D
Nachtrag
Ich musste die Funktionsnamen in der Library ändern damit die entsprechenden Funktionen nicht mitten in der Dokumentation auftauchen. Alles was das Präfix "z_" trägt sollte unbedingt gemieden werden. Verwendet bitte ausschliesslich die Funktionen und Methoden die auch direkt dokumentiert sind. Einen entsprechenden Hinweis habe ich auch nochmal in die Dokumentation gepackt.
Hier das Update auf 0.231 welches die die Libs mit den umbenannten Funktionsnamen enthält. Auch hier wird zunächst das 11MB Paket aus dem vorletzten Beitrag benötigt.
Änderungen und Neuerungen
Mit der Version 0.23 haben einige Änderungen und viele Neuerungen Einzug gehalten. Die offensichtlichste Neuerung ist dass ich nun endlich die Dokumentation nachgetragen habe. Ich empfehle die Verwendung von HotDocs, allerdings solltet Ihr Euch nicht verführen lassen die Funktionen die mit "o_" beginnen zu verwenden auch wenn diese in den Docs auftauchen. Alles was diese Funktionen machen ist hübsch in Types. Methoden und Funktionen verpackt!
Eine andere Änderung ist dass eine Camera nun intern automatisch an eine Node (Pivot) gehängt wird, das erlaubt es das Interface konsistenter zu gestalten ... Ogre3D hat jede Menge Stärken, Konsistenz gehört leider nicht dazu. Außerdem hat TCamera.create() nun den optionalen Parameter parent:TEntity. Wie sich leicht erraten lässt kann man so die Kamera direkt beim Erzeugen an ein anderes Entity hängen.
Man kann nun die SubEntities (Childs) eines Entity mittels CountChildren() zählen und sich ein Child mittels GetChild() herauspicken. Zum Thema Konsistenz: Ogre3D verbietet es mir ein SubEntity vom Typ TEntity zu sichern, ich musste hier den Typen TSubEntity einführen. Dieser leitet jedoch (wie fast alle anderen Objekte auch) von TEntity ab.
Ogre3D gestattet es nicht ein SubEntity unabhängig vom Parent zu positionieren. Behaltet also im Hinterkopf dass ein TSubEntity.setPosition() stets das Parent-Entity positioniert!
Zum Abschluss noch das Changelog für die Version 0.23 ...
Code: [AUSKLAPPEN]
added : CountChildren:Int(entity:TEntity)
added : TEntity.pitch:Float()
added : TEntity.yaw:Float()
added : TEntity.roll:Float()
added : TEntity.name:String()
added : EntityPitch:Float(entity:TEntity)
added : EntityYaw:Float(entity:TEntity)
added : EntityRoll:Float(entity:TEntity)
added : EntityName:String(entity:TEntity)
added : ShowEntity(entity:TEntity)
added : TSubEntity Extends TEntity
added : TEntity.getChild:TSubEntity(index:Int)
added : GetChild:TSubEntity(entity:TEntity, index:Int)
changed : Kameras werden nicht mehr direkt transformiert sondern besitzen eine Parent-Node
changed : TCamera.create() um den Parameter "parent:TEntity" erweitert
changed : CreateCamera() um den Parameter "parent:TEntity" erweitert
changed : KeyUp() heisst nun KeyHit()
changed : HideEntity() hat nur noch den Parameter entity:TEntity
changed : Das Positionieren eines Childs produziert nun keinen Fehler mehr, sondern positioniert das Parent-Entity
changed : LoadMesh() bzw. TMesh.Load() hat nun den zusätzlichen, optionalen Parameter "meshName"
changed : Dokumentation nachgetragen
... und den Downloadlink auf die aktuelle Version
>> Download bo3D V0.23 (ca. 174kb) <<
Beachte: Diese Version setzt voraus dass Ihr die Version 0.22 aus meinem letzten Beitrag installiert habt!
EntityControl
In Vorbereitung auf die Integration von "Terrain" ist nun die Überprüfung integriert ob das Zielsystem eine unendlich weit entfernte Clipping-Plane unterstützt. Wird das OOP Interface verwendet prüft man mit TOgre.infiniteFarPlane() ob dies unterstützt wird. Ist dies der Fall setzt man die Far-Range der Camera auf 0, ansonsten auf einen sehr großen Wert. Das prozeduale Interface stellt die Funktion InfiniteCamera() zur Verfügung. Auch diese Funktion prüft ob das System eine unendlich weit entfernte Clipping-Plane unterstützt, ist dies der Fall wird auch hier die Far-Range auf 0 gesetzt, ansonsten auf 50000.
Desweiteren kann man nun auch im Debug-Modus vernünftig arbeiten, ich habe entsprechende Funktionalität eingebastelt dass im Debug-Mode auch die entsprechenden Ogre-Libraries geladen werden. Leider explodiert damit auch die Archiv-Größe weil die OgreMain_d.dll schlapp 20MB groß ist.
Auch neu ist die Funktion TEntity.setColor(), bzw. EntityColor(). Hierbei ist folgendes zu beachten: Viele Meshes in Ogre3D bestehen aus einer Vielzahl von einzelnen Teilen die auch alle separat von der Engine verwaltet werden. EntityColor() iteriert durch alle Subentities und färbt auch diese! Beim Ogre Mesh sind es immerhin 6 Entities die EntityColor() einfärben muss.
TEntity.setAlpha(), bzw. EntityAlpha() setzen die Transparenz eines Entities. Auch hier sind alle Subentities betroffen. Außerdem ist zu beachten dass diese Funktion den SceneBlendType des Materials ändern muss damit ein Effekt auftritt. Speziell wird der Typ nach SBT_TRANSPARENT_ALPHA geändert.
Etwas mehr Kontrolle über die Entity-Farbe geben die neuen Funktionen EntityDiffuseColor(), EntityAmbientColor(), EntitySpecularColor() und EntitySelfIllumination(). Diese Funktionen besitzen den zusätzlichen Parameter "subEntity" über den bestimmt werden kann welches "Unter-Entity" beeinflusst werden soll. Es ist zu beachten dass der Wrapper kein "EntityFX" zur Verfügung stellt. Die Dinge die diese Funktion bewirkt müssen hier mittels einzelner Funktionen hergestellt werden. Bspw. "EntityFX(myEntity, 1)" entspricht "EntitySelfIllumination(myEntity, 255, 255, 255). Ich finde diese Vorgehensweise besser weil so wesentlich genauer bestimmt werden kann wie das Entity "leuchten" soll.
Bei EntityBlend() ist zu beachten dass diese Funktion nicht exakt so arbeitet wie man das von Blitz3D gewohnt ist. Folgendes Bild zeigt die Ergebnisse der einzelnen Modi:
Auch die Funktion HideEntity() arbeitet etwas anders als in Blitz3D. Hier muss mit dem zweiten Paramter angegeben werden ob das Entity versteckt werden soll oder nicht. Übergibt man der Funktion also "True" wird das Entity versteckt, übergibt man ihr "False" taucht es wieder auf.
Hier nocheinmal das komplette Modul, inklusive Example und DebugLibs. Das nächste Mal werde ich dann nur noch die Änderungen verpacken.
>> Download bo3D (ca. 11MB) <<
Gehe zu Seite 1, 2, 3 ... 12, 13, 14 Weiter



