simpleIrrlicht - Irrlicht in "Einfach"
Gehe zu Seite Zurück 1, 2, 3 ... 5, 6, 7 ... 13, 14, 15 Weiter

Der Tag des Lichts

Heute habe ich das Repository reorganisiert so dass man nun nach einem Checkout den erwarteten Tree vorfindet:
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
- 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

Weitere Trennungen

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:
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.
- 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

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
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]
...und noch ein kurzes Sample das zeigt wie das OIS Modul benutzt wird:
BlitzMax: [AUSKLAPPEN]
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

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
gimme all the overhead!

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
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
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]
ja, ja, ja jetzt wird wieder in die Hände gespuckt ...
ach ja ... den ganzen Stuff kann man selbstverständlich wieder via SVN beziehen.

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

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

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]
Die Änderungen kann man (wie immer) dem SVN entnehmen.
aufregend sieht anders 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.....

Wie geht dat denn mit diesem SVN?!?

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

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

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

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]
Blitz3D/BlitzPlus Highlevel API:
BlitzBasic: [AUSKLAPPEN]
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]
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