Explorar o código

Added simple constraints, just PointToPoint for now...

Mark Sibly %!s(int64=7) %!d(string=hai) anos
pai
achega
dc67831d92

+ 28 - 0
modules/bullet/bullet.monkey2

@@ -229,6 +229,9 @@ Class btDynamicsWorld Extends btCollisionWorld
 		
 		
 	Method removeRigidBody( body:btRigidBody ) Virtual
 	Method removeRigidBody( body:btRigidBody ) Virtual
 		
 		
+	Method addConstraint( constraint:btTypedConstraint,disableCollisionsBetweenLinkedBodies:Bool=False )
+		
+	Method removeConstraint( constraint:btTypedConstraint )
 End
 End
 
 
 Class btDiscreteDynamicsWorld Extends btDynamicsWorld
 Class btDiscreteDynamicsWorld Extends btDynamicsWorld
@@ -565,3 +568,28 @@ Class btRigidBody Extends btCollisionObject
 		
 		
 End
 End
 
 
+Class btTypedConstraint Extends btObject
+	
+End
+
+Class btPoint2PointConstraint Extends btTypedConstraint="bbBullet::Point2PointConstraint"
+	
+	Method New( rbA:btRigidBody,rbB:btRigidBody,pivotInA:btVector3,pivotInB:btVector3 )
+
+	Method New( rbA:btRigidBody,pivotInA:btVector3 )
+		
+	Method setPivotA( pivotA:btVector3 )
+		
+	Method setPivotB( pivotB:btVector3 )
+		
+	Method getPivotA:btVector3()
+		
+	Method getPivotB:btVector3()
+		
+	Method setParam( num:Int,value:btScalar,axis:Int=-1 )
+
+	Method getParam:btScalar( num:Int,axis:Int=-1 )
+		
+End
+
+

+ 9 - 0
modules/bullet/bullet_glue.h

@@ -10,6 +10,15 @@ namespace bbBullet{
 	
 	
 	btTransform getWorldTransform( btMotionState *self );
 	btTransform getWorldTransform( btMotionState *self );
 	
 	
+	struct Point2PointConstraint : public btPoint2PointConstraint{
+		
+		Point2PointConstraint(btRigidBody* rbA,btRigidBody* rbB, const btVector3& pivotInA,const btVector3& pivotInB):
+		btPoint2PointConstraint(*rbA,*rbB,pivotInA,pivotInB){}
+
+		Point2PointConstraint(btRigidBody* rbA,const btVector3& pivotInA):
+		btPoint2PointConstraint(*rbA,pivotInA){}
+	};
+	
 	struct MotionState : public btMotionState{
 	struct MotionState : public btMotionState{
 		
 		
 		virtual void setWorldTransform( btTransform *worldTrans ){
 		virtual void setWorldTransform( btTransform *worldTrans ){

+ 1 - 0
modules/mojo3d/mojo3d.monkey2

@@ -30,6 +30,7 @@ Using reflection..
 #Import "scene/components/animator"
 #Import "scene/components/animator"
 #Import "scene/components/rigidbody"
 #Import "scene/components/rigidbody"
 #Import "scene/components/collider"
 #Import "scene/components/collider"
+#Import "scene/components/constraint"
 #Import "scene/components/behaviour"
 #Import "scene/components/behaviour"
 #Import "scene/components/flybehaviour"
 #Import "scene/components/flybehaviour"
 #Import "scene/components/movebehaviour"
 #Import "scene/components/movebehaviour"

+ 127 - 0
modules/mojo3d/scene/components/constraint.monkey2

@@ -0,0 +1,127 @@
+Namespace mojo3d
+
+Class Constraint Extends Component
+	
+	Const Type:=New ComponentType( "Constraint",-20,ComponentTypeFlags.Singleton )
+	
+	Method New( entity:Entity )
+		
+		Super.New( entity,Type )
+	End
+	
+	Method New( entity:Entity,constraint:Constraint )
+		
+		Super.New( entity,Type )
+	End
+	
+Protected
+
+	Field _rvisible:Bool
+
+	Field _btconstraint:btTypedConstraint
+	
+	Method OnCreate() Abstract
+	
+	Method OnBeginUpdate() Override
+		
+		Validate()
+	End
+
+	Method OnDestroy() Override
+		
+		If Not _btconstraint Return
+		
+		Entity.Scene.World.btWorld.removeConstraint( _btconstraint )
+		_btconstraint.destroy()
+		_btconstraint=Null
+	End
+	
+	Method Validate()
+
+		Local rvisible:=Entity.ReallyVisible
+		
+		If rvisible=_rvisible Return
+		
+		If rvisible
+			If Not _btconstraint OnCreate()
+			Entity.Scene.World.btWorld.addConstraint( _btconstraint )
+		Else
+			If _btconstraint Entity.Scene.World.btWorld.removeConstraint( _btconstraint )
+		Endif
+		
+		_rvisible=rvisible
+	End
+	
+End
+
+Class PointToPointConstraint Extends Constraint
+	
+	Method New( entity:Entity )
+		
+		Super.New( entity )
+		
+		AddInstance()
+	End
+	
+	Method New( entity:Entity,constraint:PointToPointConstraint )
+		
+		Super.New( entity,constraint )
+		
+		Pivot=constraint.Pivot
+		ConnectedBody=constraint.ConnectedBody
+		ConnectedPivot=constraint.ConnectedPivot
+		
+		AddInstance( constraint )
+	End
+	
+	[jsonify=1]
+	Property Pivot:Vec3f()
+		
+		Return _pivot1
+		
+	Setter( pivot:Vec3f )
+		
+		_pivot1=pivot
+	End
+	
+	[jsonify=1]
+	Property ConnectedBody:RigidBody()
+		
+		Return _connected
+		
+	Setter( body:RigidBody )
+		
+		_connected=body
+	End
+	
+	[jsonify=1]
+	Property ConnectedPivot:Vec3f()
+	
+		Return _pivot2
+	
+	Setter( pivot:Vec3f )
+		
+		_pivot2=pivot
+	End
+	
+	Protected
+	
+	Field _connected:RigidBody
+	Field _pivot1:Vec3f
+	Field _pivot2:Vec3f
+	
+	Method OnCreate() Override
+		
+		Local btBody1:=Entity.GetComponent<RigidBody>().btBody
+		Assert( btBody1,"PointToPointConstraint: No rigid body" )
+		
+		If _connected
+			Local btBody2:=_connected.btBody
+			Assert( btBody2,"PointToPointConstraint: No rigid body" )
+			_btconstraint=New btPoint2PointConstraint( btBody1,btBody2,_pivot1,_pivot2 )
+		Else
+			_btconstraint=New btPoint2PointConstraint( btBody1,_pivot1 )
+		End
+	End
+		
+End

+ 0 - 2
modules/mojo3d/scene/components/rigidbody.monkey2

@@ -325,8 +325,6 @@ Class RigidBody Extends Component
 			
 			
 			_btbody.setCollisionShape( collider?.Validate() )
 			_btbody.setCollisionShape( collider?.Validate() )
 
 
-'			_btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_KINEMATIC_OBJECT )
-			
 '			If Cast<MeshCollider>( collider )
 '			If Cast<MeshCollider>( collider )
 '				_btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
 '				_btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
 '			Else
 '			Else

+ 5 - 4
modules/mojo3d/scene/world.monkey2

@@ -91,7 +91,7 @@ Class World
 		
 		
 		resetCollisions()
 		resetCollisions()
 		
 		
-		_btworld.stepSimulation( elapsed )',_scene.MaxSubSteps,1.0/_scene.UpdateRate )
+		_btworld.stepSimulation( elapsed,_scene.MaxSubSteps,1.0/_scene.UpdateRate )
 		
 		
 		Local n:=getNumCollisions()
 		Local n:=getNumCollisions()
 		
 		
@@ -116,7 +116,6 @@ Class World
 		Next
 		Next
 		
 		
 		resetCollisions()
 		resetCollisions()
-		
 	End
 	End
 	
 	
 	Property btWorld:btDynamicsWorld()
 	Property btWorld:btDynamicsWorld()
@@ -136,6 +135,8 @@ Class World
 		
 		
 		btbody.setUserPointer( Cast<Void Ptr>( body ) )
 		btbody.setUserPointer( Cast<Void Ptr>( body ) )
 		
 		
+'		btbody.setWorldTransform( body.Entity.Matrix )
+		
 		_btworld.addRigidBody( btbody,body.CollisionGroup,body.CollisionMask )
 		_btworld.addRigidBody( btbody,body.CollisionGroup,body.CollisionMask )
 	End
 	End
 	
 	
@@ -158,8 +159,8 @@ Class World
 	
 	
 	Field _btworld:btDynamicsWorld
 	Field _btworld:btDynamicsWorld
 	
 	
-	Field _newBodies:=New Stack<RigidBody>
-	
 	Field _bodies:=New Stack<RigidBody>
 	Field _bodies:=New Stack<RigidBody>
+	
+	Field _constraints:=New Stack<Constraint>
 
 
 End
 End

+ 103 - 0
modules/mojo3d/tests/constraints.monkey2

@@ -0,0 +1,103 @@
+Namespace myapp
+
+#Import "<std>"
+#Import "<mojo>"
+#Import "<mojo3d>"
+
+#Import "assets/"
+
+Using std..
+Using mojo..
+Using mojo3d..
+
+Class MyWindow Extends Window
+	
+	Field _scene:Scene
+	
+	Field _camera:Camera
+	
+	Field _light:Light
+	
+	Field _ground:Model
+	
+	Method New( title:String="Simple mojo app",width:Int=640,height:Int=480,flags:WindowFlags=WindowFlags.Resizable )
+
+		Super.New( title,width,height,flags )
+		
+		_scene=New Scene
+		
+		'create camera
+		'
+		_camera=New Camera( Self )
+		_camera.Name="Camera"
+		_camera.Near=.1
+		_camera.Far=60
+		_camera.Move( 0,10,-10 )
+		New FlyBehaviour( _camera )
+		
+		'create light
+		'
+		_light=New Light
+		_light.RotateX( 75,15 )
+		_light.CastsShadow=true
+		
+		'create ground
+		'
+		Local groundBox:=New Boxf( -60,-1,-60,60,0,60 )
+		_ground=Model.CreateBox( groundBox,16,16,16,New PbrMaterial( Color.Green ) )
+		_ground.Name="Ground"
+		Local groundCollider:=New BoxCollider( _ground )
+		groundCollider.Box=groundBox
+		Local groundBody:=New RigidBody( _ground )
+		groundBody.Mass=0
+		
+		Local modelBox:=New Boxf( -.5,.5 )
+		Local modelMaterial:=New PbrMaterial( Color.Orange )
+		Local model:=Model.CreateBox( modelBox,1,1,1,modelMaterial )
+		Local modelCollider:=model.AddComponent<BoxCollider>()
+		modelCollider.Box=modelBox
+		Local modelBody:=model.AddComponent<RigidBody>()
+
+		Local prev:Model
+		
+		For Local i:=0 Until 100
+			
+			Local copy:=model.Copy()
+			copy.Move( 0,1+i*1.2,0 )
+			
+			If prev
+				Local constraint:=prev.AddComponent<PointToPointConstraint>()
+				constraint.Pivot=New Vec3f( 0,.6,0 )
+				constraint.ConnectedBody=copy.RigidBody
+				constraint.ConnectedPivot=New Vec3f( 0,-.6,0 )
+			Endif
+			
+			prev=copy
+		Next
+		
+		prev.RigidBody.Mass=0
+		
+		model.Destroy()
+	End
+	
+	Method OnRender( canvas:Canvas ) Override
+		
+		RequestRender()
+		
+		_scene.Update()
+		
+		_scene.Render( canvas )
+		
+		canvas.DrawText( "FPS="+App.FPS,0,0 )
+	End
+	
+End
+
+Function Main()
+
+	New AppInstance
+	
+	New MyWindow
+	
+	App.Run()
+End