simpleIrrlicht - Irrlicht in "Einfach"

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

Worklogs simpleIrrlicht - Irrlicht in "Einfach"

Der Tag des Lichts

Samstag, 5. Juni 2010 von Farbfinsternis
Heute habe ich das Repository reorganisiert so dass man nun nach einem Checkout den erwarteten Tree vorfindet:
    sedm.mod
  • bo3d.mod
  • blitz3dogre.mod
  • ois.mod
  • bo3d_source (C Source des Projektes)


Daneben gab es noch ordentlich was neues im prozedualen Baum und richtig viel in der Klasse Light. Die Hälfte von Ogre::Light dürfte ich nun haben.

Hier mal die Liste von r21 und r22:
Code: [AUSKLAPPEN]

changed:   reorganize the svn trunk
added:      C-Source
added:      Light.setDiffuseColour(red:Float, green:Float, blue:Float)
added:      Light.setSpecularColour(red:Float, green:Float, blue:Float)
added:      (procedual) LightColor(light:Int, red:Float, green:Float, blue:Float)
added:      (procedual) LightSpecColor(light:Int, red:Float, green:Float, blue:Float)
added:      axisalignedbox.bmx
added:      Type AxisAlignedBox
added:      Light.getDiffuseColour:ColourValue()
added:      Light.getSpecularColour:ColourValue()
added:      Light.setAttenuation(range:Float, constant:Float, linear:Float, quadratic:Float)
added:      Light.getAttenuationRange:Float()
added:      Light.getAttenuationQuadric:Float()
added:      Light.getAttenuationLinear:Float()
added:      Light.getAttenuationConstant:Float()
added:      Light.getPosition:Vector3()
added:      Light.setDirection(x:Float, y:Float, z:Float)
added:      Light.getDirection:Vector3()
added:      Light.setSpotlightRange(innerAngle:Float, outerAngle:Float, falloff:Float)
added:      Light.setSpotlightInnerAngle(angle:Float)
added:      Light.setSpotlightOuterAngle(angle:Float)
added:      Light.setSpotlightFalloff(falloff:Float)
added:      Light.getSpotlightInnerAngle:Float()
added:      Light.getSpotlightOuterAngle:Float()
added:      Light.getSpotlightFalloff:Float()
added:      Light.setPowerScale(power:Float)
added:      Light.getPowerScale:Float()
added:      Light.getMovableType:String()
added:      Light.setVisible(visible:Byte)
added:      Light.setShadowFarDistance(distance:Float)
added:      Light.setShadowFarClipDistance(farClip:Float)
added:      Light.resetShadowFarDistance()
added:      Light.setShadowNearClipDistance(nearClip:Float)
added:      Light.getShadowFarDistance:Float()
added:      Light.getShadowNearClipDistance:Float()
added:      Light.getShadowFarClipDistance:Float()
added:      Light.getName:String()
added:      Light.getParentNode:SceneNode()
added:      Light.getParentSceneNode:SceneNode()
added:      Camera.getPosition:Vector3()
added:      (procedual) LightRange(light:Int, range:Float)
added:      (procedual) LightConeAngles(light:Int, innerAngler:Float, outerAngle:Float)
added:      (procedual) EntityX:Float(entity:Int)
added:      (procedual) EntityY:Float(entity:Int)
added:      (procedual) EntityZ:Float(entity:Int)
added:      (procedual) PointEntity(entity:int, target:Int)

Einen neuen Screenshot kann ich leider nicht präsentieren ... das Blöde an so einer Portierung ist dass man tausende Zeilen Code schreiben kann, ohne dass sich auf dem Schirm was ändert Wink

Weitere Trennungen

Freitag, 4. Juni 2010 von Farbfinsternis
Um die Benutzer des LowLevel PI mit sowenig "Trash" wie möglich zu belasten habe ich nun auch das HighLevel Interface als eigenes Modul implementiert. Somit besteht das Päckchen, welches man sich aus dem SVN ziehen kann, nun aus:

  • sedm.mod

      sedm.blitz3dogre (HighLevel Blitz3D-like)
      sedm.bo3d (LowLevel)
      sedm.ois (Open Input System)


So kann nun ein LowLevel Benutzer selbst entscheiden ob er OIS als InputSystem benötigt und es werden nicht mehr dutzende Funktionen doppelt deklariert weil er das HighLevel Interface mit "an der Backe hat". Wer lieber direkt so programmieren will wie es die Ogre3D Tutorials beschreiben verwendet eben Framework sedm.bo3d, wer lieber im Blitz3D Style bastelt verwendet Framework sedm.blitz3dogre. Wer dann noch auf BlitzMax Input verzichten will kann noch ein Import sedm.ois nachschieben ... letzteres benötigt dann noch die DLLs "OIS.dll" und "bOIS.dll".
Bullet wird natürlich auch wieder als Physik System verwendet, aber auch das werde ich als eigenes Module definieren damit nicht jeder auf Bullet setzen muss sondern auch alternative Systeme implementiert werden können. Außer das HighLevel Interface, das muss mit Bullet arbeiten.

Revision 15 ist nun wieder halbwegs stabil, es kann aber sein dass hier und da noch was hakt.

Neu hinzugekommen sind ein paar Licht-Geschichten, ansonsten war ich mit optimieren und trennen gut ausgelastet. Nebenbei habe ich noch Vorbereitungen getroffen den Kram für Linux zu kompilieren, das will ich dann nächste Woche probieren.

Optimiert wurde im HighLevel Part das selektieren des EntityTypes so dass alle verfügbaren Entities nun einen Hauch schneller bewegt und rotiert werden können.

Das HighLevel Interface "klaut" nun auf jeden Fall immer das BlitzMax Graphics() Fenster, wer OpenGL haben möchte muss das vor Graphics3D() mit SetRenderer(RSS_OPENGL) bekannt machen.

PositionEntity(), MoveEntity() und TurnEntity() besitzen nun den zusätzlichen Parameter "relativeTo" mit dem bestimmt werden kann in welchem Bezug die Translation passieren soll: TS_LOCAL, TS_PARENT oder TS_WORLD.

Das HighLevel Interface baut nun nicht mehr auf noch weiteren Klassen auf da das unsinnig ist. Die prozedualen Funktionen sind nun direkt durch das LowLevel API definiert.

Was nicht passt wird passend gemacht

Donnerstag, 3. Juni 2010 von Farbfinsternis
Um das Modul Crossplatform-fähig zu halten (zu machen) war es mir wichtig dass man seinen Ogre3D Output in einen eigenen Context quetschen darf. Im Zuge dieser Bemühungen ist mir aufgefallen dass ich nicht unbedingt OIS als Inputsystem verwenden muss, solange es sich um den BlitzMax Part handelt (Blitz3D will einfach nicht sein Fenster abgeben). Also habe ich OIS als eigenständige DLL "ge-wrapped" und operiere nun die OIS Bestandteile wieder aus dem Modul heraus.

Wie man im letzten Beitrag sehen kann ist es nun ohne Weiteres Möglich Ogre3D in ein MaxGUI Canvas zu pressen oder gleich das gesamte BlitzMax Graphics() Fenster (windowed oder Fullscreen) zu verwenden. Die Events können wie in BMax gewohnt gehandhabt werden: Per PolledInput oder per EventQueue.

Zwar bedeutet dies dass Blitz3D eine weitere DECLS und eine weitere DLL (nur 14kb) bekommt, aber ich denke damit kann die Blitz3D Fraktion leben Wink

OIS ist nicht vollständig übertragen, lediglich KeyDown, MouseX, MouseY, MouseXSpeed und MouseYSpeed stehen derzeit zu Verfügung. Den ganzen Pad-Kram baue ich aber auch noch mit ein.

Hier noch der Code für das Canvas Sample (der ist etwas länger weil ich diesen Colorpicker aus den bmax.com Codearchives mit eingefügt habe):
BlitzMax: [AUSKLAPPEN]

SuperStrict

Framework sedm.bo3d
Import maxgui.drivers
Import brl.eventqueue
Import brl.d3d9max2d
Import brl.timer

AddHook(EmitEventHook,TColorPicker.EventHandler,Null,1)

Type TColorPicker Extends TProxyGadget

Global list:TList=New TList

Field panel:TGadget
Field textfield:TGadget
Field button:TGadget
Field r:Int,g:Int,b:Int
Field link:TLink

Method CleanUp()
link.remove()
Super.CleanUp()
EndMethod

Function Create:TColorPicker(x:Int,y:Int,width:Int,height:Int,group:TGadget)
Local colorpicker:TColorPicker=New TColorPicker
colorpicker.panel=CreatePanel(x,y,width,height,group)
colorpicker.setproxy(colorpicker.panel)
colorpicker.textfield=CreateTextField(0,0,colorpicker.panel.ClientWidth()-colorpicker.panel.ClientHeight(),colorpicker.panel.ClientHeight(),colorpicker.panel)
colorpicker.button=CreateButton("",colorpicker.panel.ClientWidth()-colorpicker.panel.ClientHeight(),0,colorpicker.panel.ClientHeight(),colorpicker.panel.ClientHeight(),colorpicker.panel)
SetGadgetLayout colorpicker.textfield,1,1,1,1
SetGadgetLayout colorpicker.button,0,1,1,1
SetGadgetText colorpicker.textfield,"255,255,255"
SetGadgetColor colorpicker.button,255,255,255
SetGadgetFilter colorpicker.textfield,filter
colorpicker.link=list.addlast(colorpicker)
Return colorpicker
EndFunction

Function Filter:Int(event:TEvent,context:Object)
If event.ID=EVENT_KEYCHAR
If event.data=KEY_BACKSPACE Return 1
If event.data=KEY_COMMA Return 1
If event.data<48 Or event.data>57 Return 0
EndIf
Return 1
EndFunction

Method SetColor(r:Int,g:Int,b:Int)
Self.r=r
Self.g=g
Self.b=b
SetGadgetText textfield,r+","+g+","+b
SetGadgetColor button,r,g,b
EndMethod

Method EventHook:TEvent(event:TEvent)
If event.id=EVENT_GADGETLOSTFOCUS And event.source=textfield
Local sarr:String[]=GadgetText(textfield).split(",")
If sarr.length=3
SetColor Int(sarr[0]),Int(sarr[1]),Int(sarr[2])
Else
SetColor r,g,b
EndIf
Return CreateEvent(EVENT_GADGETACTION,Self,b+(g Shl 8)+(r Shl 16)+(255 Shl 24))
EndIf
If event.id=EVENT_GADGETACTION And event.source=button
If RequestColor(r,g,b)
SetColor(RequestedRed(),RequestedGreen(),RequestedBlue())
Return CreateEvent(EVENT_GADGETACTION,Self,b+(g Shl 8)+(r Shl 16)+(255 Shl 24))
Else
Return Null
EndIf
EndIf
Return Null
EndMethod

Function EventHandler:Object(id:Int,data:Object,context:Object)
If list.isempty() Return data
Local event:TEvent
Local colorpicker:TColorPicker
event=TEvent(data)
If event
For colorpicker=EachIn list
If colorpicker.button=event.source Or colorpicker.textfield=event.source
Return colorpicker.EventHook(event)
EndIf
Next
EndIf
Return data
EndFunction

EndType

Function CreateColorPicker:TColorPicker(x:Int,y:Int,width:Int,height:Int,group:TGadget)
Return TColorPicker.Create(x,y,width,height,group)
EndFunction


Local desk:TGadget = Desktop()

Local win:TGadget = CreateWindow("Ogre3D Canvas", (desk.GetWidth()/2)-400, (desk.GetHeight()/2)-300, 800, 600, Null, WINDOW_TITLEBAR|WINDOW_STATUS)
Local w:Int = ClientWidth(win)
Local h:Int = ClientHeight(win)

Local lbl:TGadget = CreateLabel("Select Backgroundcolor", 4, 4, 190, 20, win)
Local cp:TGadget = CreateColorPicker(4, 24, 190, 20, win)
SetGadgetLayout cp,1,1,1,0
SetGadgetColor cp,255,0,0

Local canvas:TGadget = CreateCanvas(200, 4, w - 204, h - 8, win)
Local chwnd:Int = QueryGadget(canvas, QUERY_HWND_CLIENT)

' init Ogre3D
Local r:Root = Root.Create()

Local rs:RenderSystem = r.getRenderSystemByName("Direct3D9 Rendering Subsystem")
r.setRenderSystem(rs)
r.initialise(False)

Local tags:String = ""
tags:+ "externalWindowHandle|" + String(chwnd) + "|"
tags:+ "left|" + String(0) + "|"
tags:+ "top|" + String(0) + "|"

Local owin:RenderWindow = r.createRenderWindow("Ogre3D", ClientWidth(canvas), ClientHeight(canvas), False, tags)

Local Log:LogManager = New LogManager

Log.logMessage("let's go!")

Local scene:SceneManager = r.createSceneManager()
Local res:ResourceGroupManager = New ResourceGroupManager
Local rsn:SceneNode = scene.getRootSceneNode()
'Local inp:OIS = OIS.Init(owin)

Local cam:Camera = scene.createCamera()
Local vport:Viewport = owin.addViewPort(cam)
Local ww:Int = vport.getActualWidth()
Local hh:Int = vport.getActualHeight()
cam.setAspectRatio(ww / hh)
cam.setNearClipDistance(0.1)

Local piv:SceneNode = rsn.createChildSceneNode("player")
piv.attachObject(cam)

vport.setBackgroundColour(0.3, 0.5, 0.9)
vport.setCamera(cam)

res.addResourceLocation("media", "FileSystem", "myFiles")
res.initialiseResourceGroup("myFiles")

Local box:Entity = scene.createEntity("", "box.mesh", "myFiles")
Local cs:SceneNode = rsn.createChildSceneNode()

cs.attachObject(box)

Local timer:TTimer = CreateTimer(60)

Local keycodes:Byte[256]
For Local i:Int = 0 To 255
keycodes[i] = False
Next

Local buttons:Byte[6]
For Local i:Int = 0 To 5
buttons[i] = False
Next


Local mx:Int
Local my:Int

Type TMouse
Field lastX:Int
Field lastY:Int

Method MouseXSpeed:Int(x:Int)
Return x - lastX
End Method

Method MouseYSpeed:Int(y:Int)
Return y - lastY
End Method

Method Update(x:Int, y:Int)
lastx = x
lasty = y
End Method
End Type
Local m:TMouse = New TMouse

Repeat
WaitEvent()

Select EventID()
Case EVENT_APPTERMINATE, EVENT_WINDOWCLOSE
Exit

Case EVENT_TIMERTICK
If keycodes[KEY_W] Then piv.translate(0.0, 0.0, -1.0, TS_LOCAL)
If keycodes[KEY_A] Then piv.translate(-1.0, 0.0, 0.0, TS_LOCAL)
If keycodes[KEY_S] Then piv.translate(0.0, 0.0, 1.0, TS_LOCAL)
If keycodes[KEY_D] Then piv.translate(1.0, 0.0, 0.0, TS_LOCAL)

If buttons[2]
cam.pitch(-m.MouseYSpeed(my) * 0.01)
piv.yaw(-m.MouseXSpeed(mx) * 0.01, TS_LOCAL)
EndIf

r.renderOneFrame()
m.Update(mx, my)

Case EVENT_KEYDOWN
keycodes[EventData()] = True

Case EVENT_KEYUP
keycodes[EventData()] = False

Case EVENT_MOUSEMOVE
mx = EventX()
my = EventY()

Case EVENT_MOUSEDOWN
buttons[EventData()] = True

Case EVENT_MOUSEUP
buttons[EventData()] = False

Case EVENT_GADGETACTION
Select EventSource()
Case cp
Local r:Int = RequestedRed()
Local g:Int = RequestedGreen()
Local b:Int = RequestedBlue()
vport.setBackgroundColour((1.0/255.0) * Float(r), (1.0/255.0) * Float(g), (1.0/255.0) * Float(b))
End Select
End Select
Forever

r.Shutdown()
End


...und noch ein kurzes Sample das zeigt wie das OIS Modul benutzt wird:
BlitzMax: [AUSKLAPPEN]

SuperStrict

Import sedm.OIS
Import brl.d3d7max2d

Graphics 800, 600
Local hwnd:Int = GetForegroundWindow()

Local inp:TOIS = TOIS.Init(hwnd, GraphicsWidth(), GraphicsHeight())

SetColor(255, 255, 255)
Repeat
Cls

inp.Update()

Local m:String = ""
m:+ "MouseX(): " + String(inp.MouseX()) + " "
m:+ "MouseY(): " + String(inp.MouseY()) + " "
m:+ "MouseXSpeed(): " + String(inp.MouseXSpeed()) + " "
m:+ "MouseYSpeed(): " + String(inp.MouseYSpeed())
DrawText(m, 10, 10)

Flip()
Until inp.KeyDown(1)

End

Ogre3D im MaxGUI Canvas

Donnerstag, 3. Juni 2010 von Farbfinsternis
Teaser:
user posted image

gimme all the overhead!

Mittwoch, 2. Juni 2010 von Farbfinsternis
Es ist schon irre wieviel Overhead man erzeugen kann, so ist bspw. die Methode "setPosition" vielfach implementiert weil man in Ogre nicht mal eben auf irgendeine Basisklasse casten kann die "setPosition" auf jeden Fall für alle beweglichen Objekte bereithält. Ironischerweise gibt es eine Klasse "MovableObject" ... man sollte allerdings nicht davon ausgehen dass sich damit eine Kamera bewegen lässt Wink

Egal, Revision 11 ist am Start und kann wieder ein kleines bisschen mehr als Revision 10 (wer hätte das gedacht oder daran geglaubt)

Code: [AUSKLAPPEN]

added   : Entity.setPosition(x:Float, y:Float, z:Float)
added   : Entity.translate(x:Float, y:Float, z:Float)
added   : Entity.pitch(radian:Float, relativeTo:Int)
added   : Entity.yaw(radian:Float, relativeTo:Int)
added   : Entity.roll(radian:Float, relativeTo:Int)
added   : Entity.Turn(x:Float, y:Float, z:Float, relativeTo:Int)
added   : Camera.Turn(x:Float, y:Float, z:Float)
added   : Entity.Load:Entity(filename:String, meshName:String)
added   : Entity.getPosition:Vector3()
added   : SceneNode.getPosition:Vector3()
added   : /b3d/b3d_input.bmx
added   : (procedual) KeyDown:Byte(keycode:Int)
added   : (procedual) MouseDown:Byte(button:Int)
added   : (procedual) MouseXSpeed:Int()
added   : (procedual) MouseYSpeed:Int()
added   : (procedual) Entities to PositionEntity(), MoveEntity(), TurnEntity()
added   : (procedual) SceneNodes to PositionEntity(), MoveEntity(), TurnEntity()
added   : (DLL) boVec3* o_scenenode_getPosition(Ogre::SceneNode* node)
added   : (DLL) Ogre::SceneNode* o_entity_getParentSceneNode(Ogre::Entity* entity)

removed   : TMesh


user posted image

Da ich nun das Input Device auf Blitz3D Niveau durchgeschliffen habe, kann man jetzt im Blitz3D-like Sample mittels Mouse + rechte Maustaste + W, A, S, D ein bisschen um die Box herumfliegen.

Der Stand der Dinge in Sachen Blitz3D-like Interface:
BlitzMax: [AUSKLAPPEN]

Framework sedm.bo3d

Graphics3D(800, 600)

cam = createCamera()
player = CreatePivot()

CameraClsColor(cam, 0.3, 0.4, 0.6)
CameraRange(cam, 0.1, 1000)

EntityParent(cam, player)
PositionEntity(player, 0.0, 0.0, -40.0)

box = LoadMesh("media/box.mesh")
ground = LoadMesh("media/ground.mesh")

PositionEntity(ground, 0.0, -5.0, 0.0)

Repeat
mx = MouseXSpeed()
my = MouseYSpeed()

If KeyDown(KC_W) Then MoveEntity(player, 0.0, 0.0, 0.01)
If KeyDown(KC_A) Then MoveEntity(player, -0.01, 0.0, 0.0)
If KeyDown(KC_S) Then MoveEntity(player, 0.0, 0.0, -0.01)
If KeyDown(KC_D) Then MoveEntity(player, 0.01, 0.0, 0.0)

If MouseDown(2)
TurnEntity(player, 0.0, -mx * 0.01, 0.0)
TurnEntity(cam, -my * 0.01, 0.0, 0.0)
EndIf

RenderWorld()
Until KeyDown(KC_ESCAPE)

EndGraphics()
End


ja, ja, ja jetzt wird wieder in die Hände gespuckt ...

ach ja ... den ganzen Stuff kann man selbstverständlich wieder via SVN beziehen.

Mühsam nährt sich das Ogre-Tier

Dienstag, 1. Juni 2010 von Farbfinsternis
Soeben ist r10 an den Start gegangen. Es wurden wieder ein paar Details hinzugefügt. Jetzt sieht das Blitz3D-like BlitzMax Sample so aus:

BlitzMax: [AUSKLAPPEN]

Framework sedm.bo3d

Graphics3D(800, 600)

cam = createCamera()

CameraClsColor(cam, 0.3, 0.4, 0.6)
CameraRange(cam, 0.1, 1000)
PositionEntity(cam, 0.0, 0.0, 20.0)

box = LoadMesh("media/box.mesh")
ground = LoadMesh("media/ground.mesh")

RenderWorld()

Delay(1000)
EndGraphics()
End


Die Änderungen kann man (wie immer) dem SVN entnehmen.

aufregend sieht anders aus.....
user posted image

Wie geht dat denn mit diesem SVN?!?

Montag, 31. Mai 2010 von Farbfinsternis
Mit diesem Eintrag möchte ich kurz erklären wie Windows User an das SVN Archiv kommen.

Zuerstmal müsst Ihr Euch "TortoiseSVN" herunterladen ( http://tortoisesvn.tigris.org/ ) und installieren. Danach findet ihr im Explorer-KontextMenü ein paar neue Punkte.

Geht nun an den Ort an dem Ihr BlitzOgre3D installieren wollt, i.d.R. sollte das BlitzMax/mod/sedm.mod/ sein. Hier tätigt Ihr einen Rechtsklick und wählt dann "SVN Checkout". Das Fensterchen fragt Euch nun nach der URL des Repository. Tragt hier folgendes ein: https://bo3d.googlecode.com/svn/trunk/
Achtet darauf dass sich im Textfeld darunter der Pfad ändert. Das letzte Ende müsst Ihr nun nur noch in "bo3d.mod" ändern.
Nachdem das alles passiert ist die Einstellungen bestätigen und zugucken wie SVN die Mod auf Eure Platte schaufelt.

Bemerkung: Normalerweise muss das Mod nicht neu kompiliert werden da ich immer Release und Debug Compiles (ST/MT) beilege. Sollte trotzdem etwas nicht funktionieren kompiliert das Mod einfach nochmal durch.

SVN wird ab jetzt stets darüber wachen ob das Mod noch aktuell ist. Ist dies nicht der Fall wird es Euch durch ein rotes Ausrufezeichen am Icon des Ordners bo3d.mod angezeigt. Wenn dieses Icon erscheint müsst Ihr nur rechts auf den Ordner klicken und "SVN Update" auswählen, dann werden alle spannenden Neuigkeiten direkt herunter geladen.


Vielen Dank für Ihre Aufmerksamkeit.

r9

Montag, 31. Mai 2010 von Farbfinsternis
Der Titel sagt es ... das SVN ist nun in der Revision 9. Diese Revision bringt zum einen kleine Erweiterungen für die BlitzMax HighLevel API und führt zum anderen das prozeduale Blitz3D API in BlitzMax ein. Die genauen Änderungen könnte Ihr im SVN unter "Source -> Changes" einsehen.

Heute hatte ich leider nur sehr wenig Zeit daran zu arbeiten, ich hoffe dass ich morgen ein bis zwei Stunden mehr investieren kann. Da ich nun alle Versionen gleichzeitig betreuen will kommen alle Versionen etwas langsamer voran. Aber so haben Blitz3D/BlitzPlus und BlitzMax User bald wieder den gleichen Stand.

Das Example für BlitzMax im Blitz3D Style welches nichts weiter tut als ein Fenster zu öffnen, es blau zu machen und nach einer Sekunde wieder zu schliessen:
BlitzMax: [AUSKLAPPEN]


Framework sedm.bo3d

Graphics3D(800, 600)
Local cam = createCamera()
CameraClsColor(cam, 0.3, 0.4, 0.6)
RenderWorld()

Delay(1000)
EndGraphics()
End

SVN aktiv

Sonntag, 30. Mai 2010 von Farbfinsternis
Jeder der sich interessiert fühlt kann nun schneller auf dem neuesten Stand sein als durch dieses Worklog. Unter http://code.google.com/p/bo3d/ habe ich ein SVN Repository eingerichtet. Wer sich das auf die Platte tut kann jede Erweiterung/Änderung live mitverfolgen.
Wer sich dazu berufen fühlt die Wikis etc. zu füllen und so aktiv mitzumachen darf dies in den Comments gern kundtun.

Blitz3D/BlitzPlus wieder am Start

Samstag, 29. Mai 2010 von Farbfinsternis
Nach der Umstellung auf eine LowLevel API war es etwas knifflig die Sache wieder für Blitz3D und BlitzPlus zu portieren, aber das ist mir nun gelungen.

Während die LowLevel API es nun auch Blitz3D/BlitzPlus Users gestattet direkt mit den Ogre3D Funktionen zu arbeiten, überschreibt die Highlevel-API einfach die Blitz3D Befehle.
Um das zu veranschaulichen zeige ich hier mal die beiden Examples (im nachfolgenden Zip-Archiv enthalten):

Blitz3D/BlitzPlus Lowlevel API:
BlitzBasic: [AUSKLAPPEN]


Include "bo3d/ogre.bb"

Local root% = ogre_CreateRoot()
Local rs% = ogre_getRenderSystemByName(root, "Direct3D9 Rendering Subsystem")

ogre_setRenderSystem(root, rs)
ogre_initialise(root, False)

Local win% = ogre_createRenderWindow(root, "BlitzOgre3D", 800, 600, 0)
Local scene% = ogre_createSceneManager(root)
Local rootnode% = ogre_getRootSceneNode(scene)
Local inp% = ogre_createInputSystem(win)
Local keyb% = ogre_createKeyboardHandler(inp)
Local mouse% = ogre_createMouseHandler(inp)

Local cam% = ogre_createCamera(scene)
Local vport% = ogre_addViewPort(win, cam)
Local w% = ogre_getActualWidth(vport)
Local h% = ogre_getActualHeight(vport)

ogre_setAspectRatio(cam, w/h)
ogre_setNearClipDistance(cam, 0.1)


Local piv% = ogre_createChildSceneNode(rootnode, "player")
ogre_attachObject(piv, cam)
ogre_scenenode_setPosition(piv, 0.0, 5.0, 10.0)

ogre_setBackgroundColour(vport, 0.3, 0.5, 0.9)

ogre_addResourceLocation("media", "FileSystem", "myFiles")
ogre_initialiseResourceGroup("myFiles")

box% = ogre_createEntity(scene, "box.mesh", "", "myFiles")
cs% = ogre_createChildSceneNode(rootnode, "")

ogre_attachObject(cs, box)

Repeat
ogre_messagePump()

ogre_captureKeyboard(keyb)
ogre_captureMouse(mouse)

Local msx% = ogre_getRelMouseX(mouse)
Local msy% = ogre_getRelMouseY(mouse)

If ogre_isKeyDown(keyb, KC_ESCAPE) Then Exit
If ogre_isMouseDown(mouse, MB_LEFT) Then Exit

If ogre_isKeyDown(keyb, KC_S) Then ogre_scenenode_translate(piv, 0.0, 0.0, 0.01, TS_LOCAL)
If ogre_isKeyDown(keyb, KC_W) Then ogre_scenenode_translate(piv, 0.0, 0.0, -0.01, TS_LOCAL)
If ogre_isKeyDown(keyb, KC_A) Then ogre_scenenode_translate(piv, -0.01, 0.0, 0.0, TS_LOCAL)
If ogre_isKeyDown(keyb, KC_D) Then ogre_scenenode_translate(piv, 0.01, 0.0, 0.0, TS_LOCAL)

If ogre_isMouseDown(mouse, MB_Right)
ogre_camera_pitch(cam, -msy * 0.01)
ogre_scenenode_yaw(piv, -msx * 0.01, TS_LOCAL)
End If

ogre_renderOneFrame(root)
Forever

ogre_free(root)

End



Blitz3D/BlitzPlus Highlevel API:
BlitzBasic: [AUSKLAPPEN]


Include "bo3d/ogre.bb"

Graphics3D(800, 600, 32, 0)

Local piv% = CreatePivot()
Local cam% = CreateCamera()

EntityParent(cam, piv)

PositionEntity(piv, 0.0, 5.0, 10.0)
CameraClsColor(cam, 0.3, 0.5, 0.9)
CameraRange(cam, 0.1, 1000)

box% = LoadMesh("media\box.mesh")

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

If KeyDown(KC_ESCAPE) Then Exit
If MouseDown(MB_LEFT) Then Exit

If KeyDown(KC_S) Then MoveEntity(piv, 0.0, 0.0, 0.01)
If KeyDown(KC_W) Then MoveEntity(piv, 0.0, 0.0, -0.01)
If KeyDown(KC_A) Then MoveEntity(piv, -0.01, 0.0, 0.0)
If KeyDown(KC_D) Then MoveEntity(piv, 0.01, 0.0, 0.0)

If MouseDown(MB_Right)
TurnEntity(cam, -msy * 0.01, 0.0, 0.0)
TurnEntity(piv, 0.0, -msx * 0.01, 0.0)
End If

RenderWorld()
Forever

EndGraphics()

End


Testen könnt ihr den Krimskrams mit folgendem Archiv:
>> BlitzOgre3D für Blitz3D/BlitzPlus (ca. 7MB) <<

Während der Portierung musste ich noch ein paar Sachen in den Wrapper einfügen die ich nun erstmal nach BlitzMax übertragen muss. Desweiteren will ich auch für BlitzMax das HighLevel API implementieren.

stay tuned Folks!

[EDIT]
TurnEntity() funktioniert nun auch für Cameras und Pivots. Das Archiv will ich für so eine kleine Änderung nicht neu hochladen ... aber für die Interessierten ist es ja vielleicht gut zu wissen.
[/EDIT]

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