JV-ODE Physics Thread 3

Blitz3D Forums/Blitz3D Userlibs/JV-ODE Physics Thread 3

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

; ###################################################################################################
; #									   JV-ODE - Ragdoll Demo										#
; #									Code by Jim Williams (VIP3R)									#
; ###################################################################################################

AppTitle "JV-ODE - Ragdoll Demo"

Include "JV-ODE.bb"

Graphics3D 800,600,0,2

Global RagDollMax=3

Dim Head(RagDollMax)
Dim BodyU(RagDollMax)
Dim BodyL(RagDollMax)
Dim LArmU(RagDollMax)
Dim LArmL(RagDollMax)
Dim RArmU(RagDollMax)
Dim RArmL(RagDollMax)
Dim LLegU(RagDollMax)
Dim LLegL(RagDollMax)
Dim RLegU(RagDollMax)
Dim RLegL(RagDollMax)
Dim LFoot(RagDollMax)
Dim RFoot(RagDollMax)

Dim RDJoint(RagDollMax,12)

Type ODEGeom
	Field body
	Field geom
	Field mesh
End Type

; ###################################################################################################

; ### Setup ODE

Global World=dWorldCreate()
Global Space=dHashSpaceCreate(0)
Global ContactGroup=dJointGroupCreate(0)

dWorldSetAutoDisableFlag(World,1)
dWorldSetGravity(World,0,-0.98,0)
dContactSetMode(dContactSlip1+dContactBounce)
dContactSetBounce(0.0)
dSetInternalContactSurfaceMode(1)

; ### Create light

Global Light=CreateLight()

RotateEntity Light,45,-90,0
LightColor Light,255,255,255
AmbientLight 130,130,130

; ### Create camera

Global Camera=CreateCamera()
CameraClsColor Camera,0,0,0
CameraRange Camera,1,1000
PositionEntity Camera,0,20,-50
RotateEntity Camera,20,0,0
CameraZoom Camera,2

; ### Create plane

dCreatePlane(Space,0,1,0,0)

Plane=CreatePlane()

EntityAlpha Plane,0.8

PlaneTexture=CreateTexture(128,128,9)

ClsColor 0,150,80
Cls

Color 200,200,200

Rect 0,0,64,64,1
Rect 64,64,64,64,1

CopyRect 0,0,128,128,0,0,BackBuffer(),TextureBuffer(PlaneTexture)
ScaleTexture PlaneTexture,20,20
EntityTexture Plane,PlaneTexture,0,0

Color 255,255,255

Mirror=CreateMirror()

; ###################################################################################################

CreateRagDoll(count)
; ### Box

cube.ODEGeom=New ODEGeom
cube\geom=dCreateBox(Space,10,2,10)
dGeomSetPosition(cube\geom,0,1,0)
dGeomContactSetBounce(cube\geom,0.80)
dGeomContactSetMu(cube\geom,100)
cube\mesh=CreateCube()
EntityPickMode cube\mesh,2
ScaleMesh cube\mesh,5,1,5
PositionEntity cube\mesh,0,1,0
EntityColor cube\mesh,250,210,0

dBodySetTorque(BodyU(0),50,0,0)

box.ODEGeom=New ODEGeom
box\body=dBodyCreate(World)
dBodySetRotation(box\body,0,0,0)
dBodySetPosition(box\body,-4,20,0)
dBodySetAutoDisableFlag(box\body,1)
box\geom=dCreateBox(Space,2,2,2)
dGeomSetBody(box\geom,box\body)
box\mesh=CreateCube()
EntityPickMode box\mesh,2
ScaleMesh box\mesh,1,1,1

dBodySetTorque(box\body,0,0,0)


While Not KeyHit(1)

	UpdateControls()

	PTime=MilliSecs()

	UpdateGeoms()

	dSpaceCollide(Space,World,ContactGroup)
	dWorldQuickStep(World,0.1)
	dJointGroupEmpty(ContactGroup)

	PhysicsTime#=MilliSecs()-PTime

	UpdateWorld

	RenderWorld

	Text 0,0,"JV-ODE Version "+dGetVersion()
	Text 0,15,"Physics Time:"+PhysicsTime
	Text 300,0,"F1 - Drop RagDoll 1"
	Text 300,15,"F2 - Drop RagDoll 2"
	Text 300,30,"F3 - Drop RagDoll 3"
	Text 300,50,"Space - Throw RagDolls"
	Text 300,65,"Arrow Keys - Move Camera"
	Text 580,0,"F4 - Attach RagDoll 1"
	Text 580,15,"F5 - Attach RagDoll 2"
	Text 580,30,"F6 - Attach RagDoll 3"
	Text 580,50,"L Mouse Button - Push Body"
	Text 580,65,"R Mouse Button - Pull Body"

	Flip

Wend

dJointGroupDestroy(ContactGroup)
dSpaceDestroy(Space)
dWorldDestroy(World)
dCloseODE()

End

; ###################################################################################################

Function CreateRagDoll(rd)
xp=0
yp=20
zp=0

; ### RagDoll Dimensions

headrad#=0.4
bodytx#=1.5
bodyty#=1.5
bodytz#=0.5
bodybx#=1.5
bodyby#=0.75
bodybz#=0.5
larmrad#=0.15
larmlen#=0.9
rarmrad#=0.15
rarmlen#=0.9
llegrad#=0.25
lleglen#=0.8
rlegrad#=0.25
rleglen#=0.8
feetx#=0.5
feety#=0.25
feetz#=1.0

; ### Create Head

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
Head(rd)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp,yp,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateSphere(Space,headrad)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateSphere()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,headrad,headrad,headrad
EntityColor ode\mesh,255,255,255

; ### Create Body (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
BodyU(rd)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp,yp-1.25,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateBox(Space,bodytx,bodyty,bodytz)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,bodytx*0.5,bodyty*0.5,bodytz*0.5
EntityColor ode\mesh,0,200,200

; ### Create Body (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
BodyL(rd)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp,yp-2.5,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateBox(Space,bodybx,bodyby,bodybz)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,bodybx*0.5,bodyby*0.5,bodybz*0.5
EntityColor ode\mesh,0,100,100

; ### Create Left Arm (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
LArmU(rd)=ode\body
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,xp+1,yp-1.25,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateCCylinder(Space,larmrad,larmlen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,larmrad,(larmlen*0.5)+larmrad,larmrad
RotateMesh ode\mesh,90,0,0
EntityColor ode\mesh,255,0,0

; ### Create Left Arm (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
LArmL(rd)=ode\body
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,xp+1,yp-2.5,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateCCylinder(Space,larmrad,larmlen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,larmrad,(larmlen*0.5)+larmrad,larmrad
RotateMesh ode\mesh,90,0,0
EntityColor ode\mesh,125,0,0

; ### Create Right Arm (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RArmU(rd)=ode\body
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,xp-1,yp-1.25,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateCCylinder(Space,rarmrad,rarmlen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,rarmrad,(rarmlen*0.5)+rarmrad,rarmrad
RotateMesh ode\mesh,90,0,0
EntityColor ode\mesh,0,255,0

; ### Create Right Arm (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RArmL(rd)=ode\body
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,xp-1,yp-2.5,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateCCylinder(Space,rarmrad,rarmlen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,rarmrad,(rarmlen*0.5)+rarmrad,rarmrad
RotateMesh ode\mesh,90,0,0
EntityColor ode\mesh,0,125,0

; ### Create Left Leg (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
LLegU(rd)=ode\body
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,xp+0.5,yp-3.6,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateCCylinder(Space,llegrad,lleglen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,llegrad,(lleglen*0.5)+llegrad,llegrad
RotateMesh ode\mesh,90,0,0
EntityColor ode\mesh,255,0,0

; ### Create Left Leg (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
LLegL(rd)=ode\body
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,xp+0.5,yp-4.9,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateCCylinder(Space,llegrad,lleglen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,llegrad,(lleglen*0.5)+llegrad,llegrad
RotateMesh ode\mesh,90,0,0
EntityColor ode\mesh,125,0,0

; ### Create Right Leg (Upper)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RLegU(rd)=ode\body
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,xp-0.5,yp-3.6,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateCCylinder(Space,rlegrad,rleglen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,rlegrad,(rleglen*0.5)+rlegrad,rlegrad
RotateMesh ode\mesh,90,0,0
EntityColor ode\mesh,0,255,0

; ### Create Right Leg (Lower)

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RLegL(rd)=ode\body
dBodySetRotation(ode\body,90,0,0)
dBodySetPosition(ode\body,xp-0.5,yp-4.9,zp)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateCCylinder(Space,rlegrad,rleglen)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCylinder(8)
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,rlegrad,(rleglen*0.5)+rlegrad,rlegrad
RotateMesh ode\mesh,90,0,0
EntityColor ode\mesh,0,125,0

; ### Create Left Foot

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
LFoot(rd)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp+0.5,yp-5.7,zp-0.25)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateBox(Space,feetx,feety,feetz)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,feetx*0.5,feety*0.5,feetz*0.5
EntityColor ode\mesh,200,0,100

; ### Create Right Foot

ode.ODEGeom=New ODEGeom
ode\body=dBodyCreate(World)
RFoot(rd)=ode\body
dBodySetRotation(ode\body,0,0,0)
dBodySetPosition(ode\body,xp-0.5,yp-5.7,zp-0.25)
dBodySetAutoDisableFlag(ode\body,1)
ode\geom=dCreateBox(Space,feetx,feety,feetz)
dGeomSetBody(ode\geom,ode\body)
ode\mesh=CreateCube()
EntityPickMode ode\mesh,2
ScaleMesh ode\mesh,feetx*0.5,feety*0.5,feetz*0.5
EntityColor ode\mesh,100,200,0

; ***** JOINTS JOINTS JOINTS *****
; ### Head To Body (Upper)

RDJoint(rd,1)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,1),Head(rd),BodyU(rd))
dJointSetHingeAxis(RDJoint(rd,1),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,1),xp,yp-0.25,zp)
dJointSetHingeParam(RDJoint(rd,1),dParamLoStop,-0.5)
dJointSetHingeParam(RDJoint(rd,1),dParamHiStop,0.5)
dJointSetHingeParam(RDJoint(rd,1),dParamBounce,0.0)

; ### Body (Upper) To Body (Lower)

RDJoint(rd,2)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,2),BodyU(rd),BodyL(rd))
dJointSetHingeAxis(RDJoint(rd,2),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,2),xp,yp-2,zp)
dJointSetHingeParam(RDJoint(rd,2),dParamLoStop,-0.25)
dJointSetHingeParam(RDJoint(rd,2),dParamHiStop,0.25)
dJointSetHingeParam(RDJoint(rd,2),dParamBounce,0.0)

; ### Left Arm (Upper) To Body (Upper)

RDJoint(rd,3)=dJointCreateUniversal(World,0)
dJointAttach(RDJoint(rd,3),LArmU(rd),BodyU(rd))
dJointSetUniversalAxis1(RDJoint(rd,3),1,0,0)
dJointSetUniversalAxis2(RDJoint(rd,3),0,0,1)
dJointSetUniversalAnchor(RDJoint(rd,3),xp+1,yp-0.75,zp)
dJointSetUniversalParam(RDJoint(rd,3),dParamLoStop,-1.141)
dJointSetUniversalParam(RDJoint(rd,3),dParamHiStop,1.141)
dJointSetUniversalParam(RDJoint(rd,3),dParamLoStop2,0.0)
dJointSetUniversalParam(RDJoint(rd,3),dParamHiStop2,3.000)

; ### Left Arm (Lower) To Left Arm (Upper)

RDJoint(rd,4)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,4),LArmL(rd),LArmU(rd))
dJointSetHingeAxis(RDJoint(rd,4),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,4),xp+1,yp-2,zp)
dJointSetHingeParam(RDJoint(rd,4),dParamLoStop,0.0)
dJointSetHingeParam(RDJoint(rd,4),dParamHiStop,2.0)

; ### Right Arm (Upper) To Body (Upper)

RDJoint(rd,5)=dJointCreateUniversal(World,0)
dJointAttach(RDJoint(rd,5),RArmU(rd),BodyU(rd))
dJointSetUniversalAxis1(RDJoint(rd,5),1,0,0)
dJointSetUniversalAxis2(RDJoint(rd,5),0,0,-1)
dJointSetUniversalAnchor(RDJoint(rd,5),xp-1,yp-0.75,zp)
dJointSetUniversalParam(RDJoint(rd,5),dParamLoStop,-1.141)
dJointSetUniversalParam(RDJoint(rd,5),dParamHiStop,1.141)
dJointSetUniversalParam(RDJoint(rd,5),dParamLoStop2,0.0)
dJointSetUniversalParam(RDJoint(rd,5),dParamHiStop2,3.000)

; ### Right Arm (Lower) To Right Arm (Upper)

RDJoint(rd,6)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,6),RArmL(rd),RArmU(rd))
dJointSetHingeAxis(RDJoint(rd,6),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,6),xp-1,yp-2,zp)
dJointSetHingeParam(RDJoint(rd,6),dParamLoStop,0.0)
dJointSetHingeParam(RDJoint(rd,6),dParamHiStop,2.0)

; ### Left Leg (Upper) To Body (Lower)

RDJoint(rd,7)=dJointCreateUniversal(World,0)
dJointAttach(RDJoint(rd,7),LLegU(rd),BodyL(rd))
dJointSetUniversalAxis1(RDJoint(rd,7),1,0,0)
dJointSetUniversalAxis2(RDJoint(rd,7),0,0,1)
dJointSetUniversalAnchor(RDJoint(rd,7),xp+0.7,yp-2.5,zp)
dJointSetUniversalParam(RDJoint(rd,7),dParamLoStop,-1.0)
dJointSetUniversalParam(RDJoint(rd,7),dParamHiStop,1.0)
dJointSetUniversalParam(RDJoint(rd,7),dParamLoStop2,-0.0)
dJointSetUniversalParam(RDJoint(rd,7),dParamHiStop2,1.500)

; ### Left Leg (Lower) To Left Leg (Upper)

RDJoint(rd,8)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,8),LLegL(rd),LLegU(rd))
dJointSetHingeAxis(RDJoint(rd,8),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,8),xp+1,yp-4.25,zp)
dJointSetHingeParam(RDJoint(rd,8),dParamLoStop,-2.0)
dJointSetHingeParam(RDJoint(rd,8),dParamHiStop,0.0)

; ### Right Leg (Upper) To Body (Lower)

RDJoint(rd,9)=dJointCreateUniversal(World,0)
dJointAttach(RDJoint(rd,9),RLegU(rd),BodyL(rd))
dJointSetUniversalAxis1(RDJoint(rd,9),1,0,0)
dJointSetUniversalAxis2(RDJoint(rd,9),0,0,1)
dJointSetUniversalAnchor(RDJoint(rd,9),xp-0.7,yp-2.75,zp)
dJointSetUniversalParam(RDJoint(rd,9),dParamLoStop,-1.0)
dJointSetUniversalParam(RDJoint(rd,9),dParamHiStop,1.0)
dJointSetUniversalParam(RDJoint(rd,9),dParamLoStop2,-0.0)
dJointSetUniversalParam(RDJoint(rd,9),dParamHiStop2,1.500)

; ### Right Leg (Lower) To Right Leg (Upper)

RDJoint(rd,10)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,10),RLegL(rd),RLegU(rd))
dJointSetHingeAxis(RDJoint(rd,10),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,10),xp-1,yp-4.25,zp)
dJointSetHingeParam(RDJoint(rd,10),dParamLoStop,-2.0)
dJointSetHingeParam(RDJoint(rd,10),dParamHiStop,0.0)

; ### Left Foot To Left Leg (Lower)

RDJoint(rd,11)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,11),LFoot(rd),LLegL(rd))
dJointSetHingeAxis(RDJoint(rd,11),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,11),xp+1,yp-5.5,zp)
dJointSetHingeParam(RDJoint(rd,11),dParamLoStop,-0.25)
dJointSetHingeParam(RDJoint(rd,11),dParamHiStop,0.25)

; ### Right Foot To Right Leg (Lower)

RDJoint(rd,12)=dJointCreateHinge(World,0)
dJointAttach(RDJoint(rd,12),RFoot(rd),RLegL(rd))
dJointSetHingeAxis(RDJoint(rd,12),1,0,0)
dJointSetHingeAnchor(RDJoint(rd,12),xp-1,yp-5.5,zp)
dJointSetHingeParam(RDJoint(rd,12),dParamLoStop,-0.25)
dJointSetHingeParam(RDJoint(rd,12),dParamHiStop,0.25)

End Function

; ###################################################################################################

Function UpdateControls()

If KeyDown(59)=1 Then dJointAttach(RDJoint(1,0),0,0)
If KeyDown(60)=1 Then dJointAttach(RDJoint(2,0),0,0)
If KeyDown(61)=1 Then dJointAttach(RDJoint(3,0),0,0)

If KeyDown(62)=1 Then dJointAttach(RDJoint(1,0),0,Head(1))
If KeyDown(63)=1 Then dJointAttach(RDJoint(2,0),0,Head(2))
If KeyDown(64)=1 Then dJointAttach(RDJoint(3,0),0,Head(3))

If KeyDown(57)=1
;	dBodyAddForce Head(1),0,20,0
;	dBodyAddForce Head(2),0,20,0
;	dBodyAddForce Head(3),0,20,0
dJointSetBallAnchor(RDJoint(1,0),40,100,10)
;		dBodySetPosition (Head(1),dBodyGetPositionX(Head(1))+1,dBodyGetPositionY(Head(1))+1, dBodyGetPositionZ(Head(1))+1)

	End If

If KeyDown(200)=1 Then PositionEntity Camera,EntityX(Camera),EntityY(Camera),EntityZ(Camera)+0.3
If KeyDown(208)=1 Then PositionEntity Camera,EntityX(Camera),EntityY(Camera),EntityZ(Camera)-0.3
If KeyDown(203)=1 Then PositionEntity Camera,EntityX(Camera)-0.3,EntityY(Camera),EntityZ(Camera)
If KeyDown(205)=1 Then PositionEntity Camera,EntityX(Camera)+0.3,EntityY(Camera),EntityZ(Camera)

If MouseDown(1)=1
	CameraPick(Camera,MouseX(),MouseY())
	If PickedEntity()
		For ode.ODEGeom=Each ODEGeom
			If ode\mesh=PickedEntity()
				dBodyEnable(ode\body)
				dBodyAddForce ode\body,-20*PickedNX#(),-20*PickedNY#(),-20*PickedNZ#()
				End If
		Next
		End If
	End If

If MouseDown(2)=1
	CameraPick(Camera,MouseX(),MouseY())
	If PickedEntity()
		For ode.ODEGeom=Each ODEGeom
			If ode\mesh=PickedEntity()
				dBodyEnable(ode\body)
				dBodyAddForce ode\body,20*PickedNX#(),20*PickedNY#(),20*PickedNZ#()
				End If
		Next
		End If
	End If

End Function

; ###################################################################################################

Function UpdateGeoms()
	For ode.ODEGeom=Each ODEGeom	
		If ode\body
			If dBodyIsEnabled(ode\body)
				RotateEntity ode\mesh,dGeomGetPitch#(ode\geom),dGeomGetYaw#(ode\geom),dGeomGetRoll#(ode\geom)
				PositionEntity ode\mesh,dGeomGetPositionX#(ode\geom),dGeomGetPositionY#(ode\geom),dGeomGetPositionZ#(ode\geom)
			End If
		EndIf
	Next
End Function

; ###################################################################################################


Here's a modifed Ragdoll demo. At this first test it seems simple joined objects work okay. Not sure why my program seemed otherwise - something to look into (maybe to do with mass?).
If you comment out all the object creation and joint creation for all limbs, leaving only head, upper and lower bodies, it bounces as high as the cube. As is, when the doll hits, though the bulk of the body hits and looking at it you'd expect a big bounce, the doll lands dead. Up the torque so it lands on it's head and the bounce is still just as limited.