simpleIrrlicht - Irrlicht in "Einfach"

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

Worklogs simpleIrrlicht - Irrlicht in "Einfach"

Blitz3D & BlitzPlus

Dienstag, 3. Mai 2011 von Farbfinsternis
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.

user posted image
Ogre3D in Blitz3D

Nachtrag

Montag, 2. Mai 2011 von Farbfinsternis
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

Montag, 2. Mai 2011 von Farbfinsternis
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   : TEntity.countChildren:Int()
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

Sonntag, 1. Mai 2011 von Farbfinsternis
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.

user posted image

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.

user posted image

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:

user posted image

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) <<


Materials

Donnerstag, 28. April 2011 von Farbfinsternis
So langsam nimmt das Material-System Gestalt an. Gestern schrub ich ja bereits dass das Logo im Screenshot mittels einer Material-Datei erstellt wurde, neu ist nun dass man so ein Material auch "on the fly" im Code erstellen kann. Hier der Auszug aus dem Example (oop) mit dem dasselbe Ergebnis ohne Material-Datei erstellt wurde:
BlitzMax: [AUSKLAPPEN]
' jedes "HUD-Element" muss in ein Panel
Local logo:TPanel = TPanel.Create(engine.GraphicsWidth() - 266, engine.GraphicsHeight() - 74, 256, 64)
' jetzt wird ein neues Material mit dem Namen "logo" erstellt
Local mat:TMaterial = TMaterial.Create("logo")
' ein neues Material besitzt bereits eine Technique mit dem Index 0
Local tech:TTechnique = mat.getTechnique()
' die Technique hat automatisch einen Pass mit Index 0 bekommen
Local pass:TPass = tech.getPass()
' wir fügen dem Pass eine Texture hinzu
Local tex:TTextureUnit = pass.addTextureUnit("logo.png")
' das Logo soll mit Alpha Transparenz gezeichnet werden
tech.sceneBlend()
' jetzt das neue Material laden...
mat.Load()
' ...und dem Panel zuweisen.
logo.SetMaterial("logo")


Ein Material in Ogre3D besteht aus mindestens einer "Technique". Erstellt man mehrere Techniques dienen alle über dem Index 0 als Fallbacks. Beispielsweise habt ihr eine Texture mit den Maßen 4096x4096 und der Client unterstützt diese Größe nicht, dann kann man eine weitere Technique bereit halten welche eine kleinere Textur lädt.
Erstellt man ein neues Material enthält dieses automatisch eine Technique mit dem Index 0. Diese Technique widerum besitzt einen Pass mit dem Index 0. Jede Technique kann beliebig viele Render-Passes besitzen. Für das Logo benötigen wir nur einen Pass in welchem wir eine TextureUnit anlegen.
Der Technique kann man sagen wie sie über der Scene gerendert werden soll, in diesem Fall wird sie mit SBT_TRANSPARENT_ALPHA gezeichnet, insgesamt gibt es folgende Modis:

  • SBT_TRANSPARENT_ALPHA
  • SBT_TRANSPARENT_COLOUR
  • SBT_ADD
  • SBT_MODULATE
  • SBT_REPLACE

zum Schluss muss das Material noch geladen und einem Panel zugewiesen werden.

Diese Ausführungen gelten derzeit nur für Overlay Elemente. Um Meshes mit eigenen Materialien zu versorgen ist noch ein kleines bisschen mehr notwendig.

So weit für jetzt ... cya

Update

Mittwoch, 27. April 2011 von Farbfinsternis
Das Modul ist weiter gediegen ...

user posted image

Neben zahlreichen neuen Sachen ist unter anderem das Textarea wieder drin und das Panel-Material. Nun gibt es auch wieder eine objektorientierte und eine prozeduale Möglichkeit das Modul zu nutzen.

OOP:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework sedm.bogre

Local engine:TOgre = TOgre.Init(OGRE_DX9, "bOgre OOP Example")
If engine Then engine.Graphics3D(800, 600)
engine.AmbientLight(30, 30, 50)

Local cam:TCamera = TCamera.Create()
cam.clsColor(90, 128, 255)
cam.Range(0.1, 1000.0)

Local ogrehead:TMesh = TMesh.Load("media\ogrehead.mesh")
ogrehead.SetPosition(0.0, 0.0, -200.0)

Local light:TLight = TLight.Create()
light.SetPosition(-200, 200, 50)
light.color(255, 200, 150)

Local panel:TPanel = TPanel.Create(0.0, 0.0, engine.GraphicsWidth(), engine.GraphicsHeight())
Local tarea:TTextArea = TTextArea.Create(panel, 10.0, 10.0, 200.0, 100.0)
Local fnt:TFont = TFont.Load("arial.ttf", 32)
tarea.SetFont(fnt)

Local logo:TPanel = TPanel.Create(engine.GraphicsWidth() - 266, engine.GraphicsHeight() - 74, 256, 64)
logo.SetMaterial("boLogo")

Repeat
If engine.isKeyDown(KC_UP) Then ogrehead.translate(0.0, 0.0, -0.5)
If engine.isKeyDown(KC_DOWN) Then ogrehead.translate(0.0, 0.0, 0.5)
If engine.isKeyDown(KC_LEFT) Then ogrehead.translate(-0.5, 0.0, 0.0)
If engine.isKeyDown(KC_RIGHT) Then ogrehead.translate(0.5, 0.0, 0.0)
If engine.isKeyDown(KC_D) Then ogrehead.turn(0.0, 0.01, 0.0)
If engine.isKeyDown(KC_A) Then ogrehead.turn(0.0, -0.01, 0.0)

tarea.setCaption("FPS: " + String(Int(engine.GetFPS())))

engine.RenderWorld()
Until engine.isKeyDown(KC_ESCAPE)

engine.clear()


prozedual:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework sedm.bogre

InitOgre(OGRE_DX9, "Ogre3D in Blitz3D Style")
If Not Graphics3D(800, 600, 32, False) Then End
AmbientLight(30, 30, 50)

Local cam:TCamera = CreateCamera()
CameraClsColor(cam, 90, 128, 255)
CameraRange(cam, 1.0, 1000.0)

Local ogrehead:TMesh = LoadMesh("media\ogrehead.mesh")
PositionEntity(ogrehead, 0.0, 0.0, -200.0)

Local light:TLight = CreateLight()
PositionEntity(light, -200, 200, 50)
LightColor(light, 255, 200, 150)

Local panel:TPanel = CreatePanel(10, 10, 200, 100)
Local tarea:TTextArea = CreateTextArea(panel, 0, 0, 200, 100)
Local fnt:TFont = LoadFont("media\arial.ttf", 32)
TextAreaFont(tarea, fnt)

Local logo:TPanel = CreatePanel(GraphicsWidth() - 266, GraphicsHeight() - 74, 256, 64)
PanelMaterial(logo, "boLogo")

Repeat
If KeyDown(KC_UP) TranslateEntity(ogrehead, 0.0, 0.0, -0.5)
If KeyDown(KC_DOWN) TranslateEntity(ogrehead, 0.0, 0.0, 0.5)
If KeyDown(KC_LEFT) TranslateEntity(ogrehead, -0.5, 0.0, 0.0)
If KeyDown(KC_RIGHT) TranslateEntity(ogrehead, 0.5, 0.0, 0.0)
If KeyDown(KC_D) Then TurnEntity(ogrehead, 0.0, 0.01, 0.0)
If KeyDown(KC_A) Then TurnEntity(ogrehead, 0.0, -0.01, 0.0)

TextAreaCaption(tarea, "FPS: " + String(Int(GetFPS())))

RenderWorld()
Until KeyDown(KC_ESCAPE)

End


Das Materialfile für das Logo sieht so aus:
Code: [AUSKLAPPEN]
material boLogo
{
   technique
   {
      pass
      {
         ambient 1.0 1.0 1.0
         diffuse 1.0 1.0 1.0
         scene_blend alpha_blend
         
         texture_unit
         {
            texture logo.png
         }
      }
   }
}


Dieses Material wird nicht direkt per Funktion geladen, sondern automatisch wenn der entsprechende Ordner zu den Resourcelocations hinzugefügt wurde. Dies geschieht entweder dann wenn Ihr ein Mesh aus diesem Ordner lädt oder mittels der Methode "setMediaDir()".

Zum Abschluss noch das ganze Päckchen mit Modul und Examples

>> Download bOgre (ca. 5MB) <<

Den Inhalt des Päckchens einfach nach BlitzMax\mod\sedm.mod\ entpacken, vorkompilierte Libs für Windows liegen bei.

Blitz3D

Dienstag, 19. April 2011 von Farbfinsternis
user posted image
Dasselbe was ich im letzten Post für BlitzMax hochgeladen habe, kann ich Euch hier nochmal für Blitz3D anbieten.

http://bo3d.sedm.de/downloads/bogreBlitz3D.zip

BlitzBasic: [AUSKLAPPEN]
Include "include/bogre.bb"

InitOgre(OGRE_DX9, "Ogre3D in Blitz3D Style")
If Not Graphics3D(800, 600, 32, False) Then End
AmbientLight(30, 30, 50)

Local cam.TEntity = CreateCamera()
CameraClsColor(cam, 90, 128, 255)
CameraRange(cam, 1.0, 1000.0)

Local ogrehead.TEntity = LoadMesh("media\ogrehead.mesh")
PositionEntity(ogrehead, 0.0, 0.0, -200.0)

Local light.TEntity = CreateLight()
PositionEntity(light, -200, 200, 50)
LightColor(light, 255, 200, 150)


Repeat
If KeyDown(200) Then TranslateEntity(ogrehead, 0.0, 0.0, -0.5)
If KeyDown(208) Then TranslateEntity(ogrehead, 0.0, 0.0, 0.5)
If KeyDown(203) Then TranslateEntity(ogrehead, -0.5, 0.0, 0.0)
If KeyDown(205) Then TranslateEntity(ogrehead, 0.5, 0.0, 0.0)
If KeyDown(32) Then TurnEntity(ogrehead, 0.0, 0.01, 0.0)
If KeyDown(30) Then TurnEntity(ogrehead, 0.0, -0.01, 0.0)

RenderWorld()
Until KeyDown(1)

EndGraphics3D()

End


Bitte beachtet dass sich ein Ogre3D Programm nicht aus der Blitz3D IDE ausführen lässt. Unter Windows 7 geht das auch nicht mehr mit IDEal. Schade, aber Blitz3D wird halt nicht jünger. Wer noch WindowsXP oder älter nutzt kann zumindest mit IDEal direkt starten.

Im Example bewegt Ihr den Ogre mit den Cursorkeys, drehen könnt Ihr ihn mit "A" und "D".

Falls schon wieder eine DLL fehlt, lasst es mich wissen.

Ein Test

Montag, 18. April 2011 von Farbfinsternis
In den letzten Tagen habe ich getestet inwieweit sich ein Auslagern der Funktionalität in die DLL auf die Performance und das Handling auswirkt und ich muss sagen: Es sieht hervorragend aus.

Keine Angst, selbstverständlich wird auch der umfangreiche Wrapper weiter gebastelt, dies ist nur ein "Sidekick-Projekt"

user posted image

Wer das mal ausprobieren möchte kann sich sich das Modul hier herunterladen. Ein Example liegt bei. Wenn ich irgendeine DLL vergessen haben sollte wäre ich froh wenn mir das in den Comments mitgeteilt werden würde Smile

Der Source zum obigen Screenshot ist recht übersichtlich:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework sedm.bogre

InitOgre(OGRE_DX9, "Ogre3D in Blitz3D Style")
If Not Graphics3D(800, 600, 32, False) Then End
AmbientLight(30, 30, 50)

Local cam:TCamera = CreateCamera()
CameraClsColor(cam, 90, 128, 255)
CameraRange(cam, 1.0, 1000.0)

Local ogrehead:TMesh = LoadMesh("media\ogrehead.mesh")
PositionEntity(ogrehead, 0.0, 0.0, -200.0)

Local light:TLight = CreateLight()
PositionEntity(light, -200, 200, 50)
LightColor(light, 255, 200, 150)


Repeat
If KeyDown(KC_UP) TranslateEntity(ogrehead, 0.0, 0.0, -0.5)
If KeyDown(KC_DOWN) TranslateEntity(ogrehead, 0.0, 0.0, 0.5)
If KeyDown(KC_LEFT) TranslateEntity(ogrehead, -0.5, 0.0, 0.0)
If KeyDown(KC_RIGHT) TranslateEntity(ogrehead, 0.5, 0.0, 0.0)
If KeyDown(KC_D) Then TurnEntity(ogrehead, 0.0, 0.01, 0.0)
If KeyDown(KC_A) Then TurnEntity(ogrehead, 0.0, -0.01, 0.0)

RenderWorld()
Until KeyDown(1)

End

Reset

Samstag, 9. April 2011 von Farbfinsternis
Derzeit bin ich dabei bo3D "neu" zu schreiben. Logischweise schreibe ich nicht jedes Zeichen neu sondern übernehme möglichst viel aus der letzten Version. Ziel dieser Aktion ist es ein bo3D Programm so nah an Ogre3D zu bekommen, dass die vielen Tutorials die es zu Ogre3D gibt auch für bo3D nutzbar sind.
Die neue bo3D Version ist auf C++ Seite sehr viel flacher gestaltet, es werden keine Ogre3D Daten mehr in einem abstrakten Objekt gesichert, sondern direkt an BlitzMax durchgereicht. Desweiteren habe ich alles getan damit keine Funktion mehr ohne Kommentar abrauscht, jede Funktion wirft im Fall des Falles eine Exception. Außerdem gibt es nun alle Funktionen die nötig sind um ohne MemLeaks ein bo3D Programm zu beenden.

Ein einfaches bo3D Programm sieht nun so aus:
BlitzMax: [AUSKLAPPEN]
SuperStrict 

Framework sedm.bo3d

Local root:TRoot = TRoot.init()
If root <> Null
Local renderSystem:TRenderSystem = root.setRenderSystem()
If renderSystem
renderSystem.setConfigOption("Full Screen", "No")
renderSystem.setConfigOption("Video Mode","1920 x 1080 @ 32-bit colour")

Local win:TRenderWindow = root.initialize()
Local sm:TSceneManager = root.createSceneManager()
Local cam:TCamera = sm.createCamera()
Local vp:TViewport = win.addViewport(cam)
cam.setAspectRatio(vp.getActualHeight() / vp.getActualWidth())
vp.setBackgroundColour(0.2, 0.5, 1.0)

Local res:TResourceManager = New TResourceManager
res.addResourceLocation("media")

root.renderOneFrame()

Repeat
TWindowEventUtilities.messagePump()
root.renderOneFrame()
Forever

win.removeViewport(vp.getZOrder())
sm.destroyCamera(cam)
root.destroySceneManager(sm)
win.destroy()
root.shutDown()
root = Null
Else
DebugLog "oops!"
EndIf
End If

Wer diesen Source mit Ogre3D Tutorials vergleicht wird feststellen dass wir verdammt nah am Original sind Wink . Selbstverständlich wird sedm.blitz3d diese Komplexität weiterhin verbergen.


Ruhig hier, wa?

Montag, 21. März 2011 von Farbfinsternis
Zwar kümmere ich mich derzeit hauptsächlich um "Q", aber in den letzten Tagen habe ich auch an bo3D weiter gearbeitet.

Neue Features oder einen neuen Download gibt es derzeit nicht, nur die Tatsache dass sich das Modul nun auf Linux und Windows kompilieren und nutzen lässt. Dafür war einiges an Aufwand zu betreiben.

Nächste Hausnummer ist dass ich auf beiden Systemen die gleiche Funktionalität hinbekomme und auch die Blitz3D Version mal wieder ein Update erfährt.

Meine Frau ist schon richtig begeistert davon dass ich ihren Windows 7 Laptop in den nächsten Wochen verstärkt nutzen will und sie so "FarmeRama" an einer alten, lauten WinXP Mühle spielen muss Wink

stay tuned ... nächstes Update ist in Sicht.

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