New ODE 0.5 wrapper for Blitz3D

Blitz3D Forums/Blitz3D Programming/New ODE 0.5 wrapper for Blitz3D

Hi :) i'm testing ODE i have made a little include for setup easily
box and sphere :)

; ----------------------------
; Global ODE space
; ----------------------------
Global ODE_Space

; --------------------------
; ODE Object Type
; --------------------------
Type ODE_Object
	Field ObjectBody
	Field ObjectMesh
	Field ObjectGeom

	Field ObjectFake

	Field ObjectMass#

	Field ObjectRotX#
	Field ObjectRotY#
	Field ObjectRotZ#
	
	Field ObjectPx#
	Field ObjectPy#
	Field ObjectPz#

	Field ObjectScaleX#
	Field ObjectScaleY#
	Field ObjectScaleZ#
End Type

; ---------------------------
; Setup easily world
; ---------------------------
Function ODE_InitWorld(Gravity#=-1.5,Bounce#=0.05)
	ODE_Space = ODE_dWorldCreate()
	ODE_dWorldSetGravity(0, Gravity#, 0)

	ODE_dSetContactMode(dContactBounce + dContactSoftERP + dContactSoftCFM)
	
	ODE_dSetBOUNCE(Bounce#)
	ODE_dSetSOFT_ERP(0.4)
	ODE_dSetSOFT_CFM(0.8)
End Function

; --------------------------
; Setup easily cube
; --------------------------
Function ODE_CreateCube(Px#,Py#,Pz#,RotX#,RotY#,RotZ#,ScaleX#,ScaleY#,ScaleZ#,Mass#=10,Red=255,Green=255,Blue=255)
	G.ODE_Object = New ODE_Object

	G\ObjectMass#=Mass#
	
	G\ObjectScaleX#=ScaleX#
	G\ObjectScaleY#=ScaleY#
	G\ObjectScaleZ#=ScaleZ#

	G\ObjectBody = ODE_dBodyCreate()
	G\ObjectGeom = ODE_dCreateBox(ODE_Space, G\ObjectScaleX#*2,G\ObjectScaleY#*2,G\ObjectScaleZ#*2, G\ObjectMass#)
	ODE_dGeomSetBody G\ObjectGeom, G\ObjectBody

	G\ObjectRotX#=RotX#
	G\ObjectRotY#=RotY#
	G\ObjectRotZ#=RotZ#
	
	G\ObjectPx#=Px#
	G\ObjectPy#=Py#
	G\ObjectPz#=Pz#

	ODE_dBodySetPosition(G\ObjectBody, G\ObjectPx#,G\ObjectPy#,G\ObjectPz#)
	ODE_dBodySetRotation(G\ObjectBody, G\ObjectRotX#,G\ObjectRotY#,G\ObjectRotZ#)

	G\ObjectMesh = CreateCube()

	PositionEntity G\ObjectMesh,G\ObjectPx#,G\ObjectPy#,G\ObjectPz#
	ScaleEntity G\ObjectMesh,G\ObjectScaleX#,G\ObjectScaleY#,G\ObjectScaleZ#
	EntityColor G\ObjectMesh, Red,Green,Blue
End Function

; -----------------------------
; Setup easily sphere
; -----------------------------
Function ODE_CreateSphere(Px#,Py#,Pz#,Scale#,Mass#=10,Red=255,Green=255,Blue=255)
	G.ODE_Object = New ODE_Object

	G\ObjectMass#=Mass#

	G\ObjectScaleX#=Scale#
	G\ObjectScaleY#=Scale#
	G\ObjectScaleZ#=Scale#

	G\ObjectBody = ODE_dBodyCreate()
	G\ObjectGeom = ODE_dCreateSphere(ODE_Space,G\ObjectScaleX#, G\ObjectMass#)
	ODE_dGeomSetBody G\ObjectGeom, G\ObjectBody
	
	G\ObjectPx#=Px#
	G\ObjectPy#=Py#
	G\ObjectPz#=Pz#
	
	ODE_dBodySetPosition(G\ObjectBody, G\ObjectPx#,G\ObjectPy#,G\ObjectPz#)

	G\ObjectMesh = CreateSphere()

	PositionEntity G\ObjectMesh,G\ObjectPx#,G\ObjectPy#,G\ObjectPz#
	ScaleEntity G\ObjectMesh,G\ObjectScaleX#,G\ObjectScaleY#,G\ObjectScaleZ#
	EntityColor G\ObjectMesh, Red,Green,Blue
End Function

; -------------------------------
; Setup easily cylinder
; -------------------------------
Function ODE_CreateCylinder(Px#,Py#,Pz#,RotX#,RotY#,RotZ#,Radius#,Height#,Mass#=10,Red=255,Green=255,Blue=255)
	G.ODE_Object = New ODE_Object

	G\ObjectMass#=Mass#

	G\ObjectScaleX#=Radius#
	G\ObjectScaleY#=Height#
	G\ObjectScaleZ#=Radius#

	G\ObjectBody = ODE_dBodyCreate()
	G\ObjectGeom = ODE_dCreateCCylinder(ODE_Space,G\ObjectScaleX#, G\ObjectScaleY#*2,G\ObjectMass#)
	ODE_dGeomSetBody G\ObjectGeom, G\ObjectBody
	
	G\ObjectPx#=Px#
	G\ObjectPy#=Py#
	G\ObjectPz#=Pz#

	G\ObjectRotX#=RotX#
	G\ObjectRotY#=RotY#
	G\ObjectRotZ#=RotZ#

	ODE_dBodySetPosition(G\ObjectBody, G\ObjectPx#,G\ObjectPy#,G\ObjectPz#)
	ODE_dBodySetRotation(G\ObjectBody, G\ObjectRotX#,G\ObjectRotY#,G\ObjectRotZ#)
	
	G\ObjectMesh = CreatePivot()
	G\ObjectFake=CreateCylinder(8,1,G\ObjectMesh)
	
	RotateEntity G\ObjectFake, 90, 0, 0
	PositionEntity G\ObjectMesh,G\ObjectPx#,G\ObjectPy#,G\ObjectPz#
	ScaleEntity G\ObjectFake,G\ObjectScaleX#,G\ObjectScaleY#,G\ObjectScaleZ#
	EntityColor G\ObjectFake, Red,Green,Blue

	RotateEntity G\ObjectMesh,G\ObjectRotX#,G\ObjectRotY#,G\ObjectRotZ#
End Function

; ---------------------
; Update physic
; ---------------------
Function ODE_UpdatePhysic(Time#=0.1)
	For G.ODE_Object = Each ODE_Object
		PositionEntity G\ObjectMesh, ODE_dGeomGetPositionX(G\ObjectGeom), ODE_dGeomGetPositionY(G\ObjectGeom), ODE_dGeomGetPositionZ(G\ObjectGeom)
		RotateEntity G\ObjectMesh, ODE_dGeomGetPitch(G\ObjectGeom), ODE_dGeomGetYaw(G\ObjectGeom), ODE_dGeomGetRoll(G\ObjectGeom), 1
	Next
End Function



This is a test code
---------------------------



; ------------------------
; Freelook cam var
; ------------------------
Global Mouse_X_Speed#
Global Mouse_Y_Speed#
Global Camera_VelX#
Global Camera_VelZ#
Global Camera_Pitch
Global Camera_Yaw

Include "BlitzODE.bb"
Include "Inc_ODEStuff.bb"

;------ Initialize Graphics --------
Graphics3D 800, 600,16,2
SetBuffer BackBuffer()

cam = CreateCamera()
PositionEntity cam, 0, 10, -25

lh = CreateLight(2)
PositionEntity lh,50,50,50
LightRange lh,100
LightColor lh,255,200,150


plane = CreatePlane()
mirror = CreateMirror(plane)
EntityColor plane, 0, 0, 150
EntityAlpha plane, .8
PositionEntity plane,0,-0.3,0

SeedRnd MilliSecs()
;--------- Initialize ODE ----------
ODE_InitWorld()


;------- Create siple cube ---------
For i=5 To 40 Step 2
Mass#=Rnd(5,10)
ODE_CreateCube(Rnd(-5,5),i,Rnd(-5,5),0,0,0,1,1,1,Mass#,Rnd(255),Rnd(255),Rnd(255))
ODE_CreateSphere(Rnd(-5,5),i,Rnd(-5,5),1,Mass#,Rnd(255),Rnd(255),Rnd(255))

ODE_CreateCylinder(Rnd(-5,5),i,Rnd(-5,5),45,50,65,1,3,Mass#,Rnd(255),Rnd(255),Rnd(255))
 
Next

;mesh=LoadMesh("002.b3d")
;ODE_dTriMeshCreate%(mesh)

;-----------------------------------

ODE_UpdatePhysic()

;-----------------------------------

gameFPS = 50.0
framePeriod = 1000 / gameFPS
frameTime = MilliSecs () - framePeriod

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

While Not KeyHit(1)
	Repeat
		frameElapsed = MilliSecs () - frameTime
	Until frameElapsed
	
	frameTicks = frameElapsed / framePeriod
	frameTween# = Float(frameElapsed Mod framePeriod) / Float(framePeriod)
	For frameLimit = 1 To frameTicks
		If frameLimit = frameTicks Then CaptureWorld
		frameTime = frameTime + framePeriod

            ;------------ Update physics world ----------		

		
	ODE_dWorldQuickStep 0.1
            ;--------------------------------------------

	Next

		If KeyHit(57)
			For G.ODE_Object = Each ODE_Object
				ODE_dBodyEnable G\ObjectBody
				ODE_dBodyAddForce G\ObjectBody, 0, Rnd(20, 50), 0
				ODE_dBodyAddTorque G\ObjectBody, Rnd(-30, 10), Rnd(-10, 10), Rnd(-10, 10)
			Next
		EndIf
		
	;---- Set geometry position and rotation ----

	ODE_UpdatePhysic()

Proc_Freelook(Cam,1.05,0.01) 
	;--------------------------------------------

	RenderWorld frameTween#
	
	Flip 0
Wend

ODE_dCloseODE()
End

Function Proc_Freelook(CamEntity,Velocity#,Speed#)
 Mouse_X_Speed#=MouseXSpeed()*0.5
 Mouse_Y_Speed#=MouseYSpeed()*0.5

 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
 Camera_Pitch=Camera_Pitch+Mouse_Y_Speed#
 Camera_Yaw=Camera_Yaw+Mouse_X_Speed#


 RotateEntity CamEntity,Camera_Pitch,-Camera_Yaw,0

 If KeyDown(203) Then
   Camera_VelX=Camera_VelX-Speed#
 ElseIf  KeyDown(205)
   Camera_VelX=Camera_VelX+Speed#
 EndIf
 If KeyDown(208) Then
   Camera_VelZ=Camera_VelZ-Speed#
 ElseIf  KeyDown(200)
   Camera_VelZ=Camera_VelZ+Speed#
 EndIf
 
 Camera_VelX=Camera_VelX/velocity#
 Camera_VelZ=Camera_VelZ/velocity#
 MoveEntity CamEntity,Camera_VelX,0,Camera_VelZ

 If KeyDown(200) Then
   MoveEntity CamEntity,0,0,Speed#
 EndIf

 If KeyDown(208) Then
   MoveEntity CamEntity,0,0,-Speed#
 EndIf

 If KeyDown(205) Then
   MoveEntity CamEntity,Speed#,0,0
 EndIf

 If KeyDown(203) Then
   MoveEntity CamEntity,-Speed#,0,0
 EndIf
End Function