Explorar el Código

Physics updates.

Mark Sibly hace 7 años
padre
commit
71752b7d83

+ 21 - 20
modules/mojo3d/components/collider.monkey2

@@ -1,6 +1,15 @@
 
 Namespace mojo3d
 
+#Import "native/internaledges.cpp"
+#Import "native/internaledges.h"
+
+Extern Private
+ 
+Function CreateInternalEdgeInfo( mesh:btBvhTriangleMeshShape )="bbBullet::createInternalEdgeInfo"
+	
+Public
+	
 Class Entity Extension
 	
 	Property Collider:Collider()
@@ -12,7 +21,7 @@ End
 
 Class Collider Extends Component
 	
-	Const Type:=New ComponentType( "Collider",-1,ComponentTypeFlags.Singleton )
+	Const Type:=New ComponentType( "Collider",10,ComponentTypeFlags.Singleton )
 	
 	Method New( entity:Entity )
 		
@@ -21,30 +30,25 @@ Class Collider Extends Component
 	
 	Property Margin:Float()
 		
-		Return btShape.getMargin()
+		Return Validate().getMargin()
 	
 	Setter( margin:Float )
 		
-		btShape.setMargin( margin )
+		Validate().setMargin( margin )
 	End
 
 	Method CalculateLocalInertia:Vec3f( mass:Float )
 		
-		Return btShape.calculateLocalInertia( mass )
+		Return Validate().calculateLocalInertia( mass )
 	End
+	
+	Method Validate:btCollisionShape()
 
-	Property btShape:btCollisionShape()
-		
 		If Not _btshape _btshape=OnCreate()
 	
 		Return _btshape
 	End
 	
-	Property Seq:Int()
-		
-		Return _seq
-	End
-
 Protected
 
 	Method OnCreate:btCollisionShape() Abstract
@@ -54,12 +58,12 @@ Protected
 		If Not _btshape Return
 		
 		_btshape.destroy()
+		
 		_btshape=Null
 		
-		_gseq+=1
-		_seq=_gseq
+		Entity.RigidBody?.ColliderInvalidated()
 	End
-
+	
 	function SetOrigin:btCollisionShape( shape:btCollisionShape,origin:Vec3f )
 		
 		If origin=Null Return shape
@@ -73,12 +77,8 @@ Protected
 	
 	Private
 	
-	Global _gseq:Int
-
 	Field _btshape:btCollisionShape
 	
-	Field _seq:Int
-	
 End
 
 Class ConvexCollider Extends Collider
@@ -120,7 +120,7 @@ Class BoxCollider Extends ConvexCollider
 	End
 	
 	Method OnCreate:btCollisionShape() Override
-		
+
 		Local shape:=New btBoxShape( _box.Size/2 )
 		
 		Return SetOrigin( shape,_box.Center )
@@ -134,6 +134,7 @@ End
 Class SphereCollider Extends ConvexCollider
 	
 	Method New( Entity:Entity )
+		
 		Super.New( Entity )
 	End
 	
@@ -516,7 +517,7 @@ Class MeshCollider Extends ConcaveCollider
 		
 		Local shape:=New btBvhTriangleMeshShape( _btmesh,True,True )
 		
-		'CreateInternalEdgeInfo( shape )
+		CreateInternalEdgeInfo( shape )
 		
 		Return shape
 	End

+ 35 - 0
modules/mojo3d/components/native/internaledges.cpp

@@ -0,0 +1,35 @@
+
+#include "internaledges.h"
+
+#include "BulletCollision/CollisionDispatch/btInternalEdgeUtility.h"
+
+namespace{
+
+	bool CustomMaterialCombinerCallback( btManifoldPoint& cp,const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper *colObj1Wrap,int partId1,int index1 ){
+	
+		btAdjustInternalEdgeContacts( cp,colObj1Wrap,colObj0Wrap,partId1,index1 );
+		
+//		cp.m_combinedRestitution=colObj0Wrap->getCollisionObject()->getRestitution() * colObj1Wrap->getCollisionObject()->getRestitution();
+		
+//		cp.m_combinedFriction=0;
+		
+		return false;
+	}
+}
+
+namespace bbBullet{
+
+	void createInternalEdgeInfo( btBvhTriangleMeshShape *mesh ){
+	
+		// enable callback
+		gContactAddedCallback=CustomMaterialCombinerCallback;
+
+		// create edge info
+		btTriangleInfoMap *info=new btTriangleInfoMap();
+		
+		btGenerateInternalEdgeInfo( mesh,info );
+
+		mesh->setTriangleInfoMap( info );
+	}
+
+}

+ 12 - 0
modules/mojo3d/components/native/internaledges.h

@@ -0,0 +1,12 @@
+
+#ifndef BB_INTERNAL_EDGES_H
+#define BB_INTERNAL_EDGES_H
+
+#include "btBulletDynamicsCommon.h"
+
+namespace bbBullet{
+
+	void createInternalEdgeInfo( btBvhTriangleMeshShape *mesh );
+}
+
+#endif

+ 92 - 95
modules/mojo3d/components/rigidbody.monkey2

@@ -1,14 +1,4 @@
 
-#rem
-
-Notes:
-
-* Have to remove/add bodies from world if collision shape changes. http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=5194
-
-* default btCollsionObject activationState=ACTIVE_TAG (1)?
-
-#end
-
 Namespace mojo3d
 
 Private
@@ -22,7 +12,7 @@ Class MotionState Extends btMotionState
 	
 	Method getWorldTransform( tform:btTransform Ptr ) Override
 		
-		If Not _entity.RigidBody.Kinematic Print "Dynamic getWorldTransform! Position="+_entity.Position
+'		If Not _entity.RigidBody.Kinematic Print "Dynamic getWorldTransform! Position="+_entity.Position
 
 		tform->setOrigin( _entity.Position )
 		
@@ -31,7 +21,7 @@ Class MotionState Extends btMotionState
 	
 	Method setWorldTransform( tform:btTransform Ptr ) Override
 		
-		If _entity.RigidBody.Kinematic Print "Kinematic setWorldTransform!"
+'		If _entity.RigidBody.Kinematic Print "Kinematic setWorldTransform!"
 		
 		_entity.Position=tform->getOrigin()
 		
@@ -56,24 +46,22 @@ End
 
 Class RigidBody Extends Component
 	
-	Const Type:=New ComponentType( "RigidBody",1,ComponentTypeFlags.Singleton )
+	Const Type:=New ComponentType( "RigidBody",-10,ComponentTypeFlags.Singleton )
 	
 	Method New( entity:Entity )
 		
 		Super.New( entity,Type )
 		
+		_btmotion=New MotionState( entity )
+		
 		Local collider:=entity.Collider
 		Local inertia:btVector3=collider?.CalculateLocalInertia( _mass )
 		
-		_btmotion=New MotionState( entity )
-		
-		_btbody=New btRigidBody( _mass,_btmotion,collider.btShape,inertia )
+		_btbody=New btRigidBody( _mass,_btmotion,collider?.Validate(),inertia )
 		
-		Kinematic=False
-		Mass=1
-		Friction=1
-		RollingFriction=1
 		Restitution=0
+		RollingFriction=0
+		Friction=1
 		CollisionGroup=1
 		CollisionMask=1
 	End
@@ -84,9 +72,9 @@ Class RigidBody Extends Component
 		
 		Kinematic=body.Kinematic
 		Mass=body.Mass
+		Restitution=body.Restitution
 		Friction=body.Friction
 		RollingFriction=body.RollingFriction
-		Restitution=body.Restitution
 		CollisionGroup=body.CollisionGroup
 		CollisionMask=body.CollisionMask
 	End
@@ -108,8 +96,6 @@ Class RigidBody Extends Component
 			_btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_KINEMATIC_OBJECT )
 			_btbody.forceActivationState( ACTIVE_TAG )
 		Endif
-			
-'		_dirty|=Dirty.Kinematic
 	End
 	
 	Property Mass:Float()
@@ -124,11 +110,19 @@ Class RigidBody Extends Component
 		
 		Local collider:=Entity.Collider
 		Local inertia:=collider?.CalculateLocalInertia( _mass )
-		_btbody.setMassProps( _mass,inertia )
 		
-'		_dirty|=Dirty.Mass
+		_btbody.setMassProps( _mass,inertia )
 	End
 
+	Property Restitution:Float()
+		
+		Return _btbody.getRestitution()
+		
+	Setter( restitution:Float )
+		
+		_btbody.setRestitution( restitution )
+	End
+	
 	Property Friction:Float()
 		
 		Return _btbody.getFriction()
@@ -147,15 +141,6 @@ Class RigidBody Extends Component
 		_btbody.setRollingFriction( friction )
 	End
 	
-	Property Restitution:Float()
-		
-		Return _btbody.getRestitution()
-		
-	Setter( restitution:Float )
-		
-		_btbody.setRestitution( restitution )
-	End
-	
 	Property LinearVelocity:Vec3f()
 		
 		Return _btbody.getLinearVelocity()
@@ -181,6 +166,8 @@ Class RigidBody Extends Component
 	Setter( collGroup:Short )
 		
 		_collGroup=collGroup
+		
+		_dirty|=Dirty.Collisions
 	End
 	
 	Property CollisionMask:Short()
@@ -190,6 +177,8 @@ Class RigidBody Extends Component
 	Setter( collMask:Short )
 		
 		_collMask=collMask
+		
+		_dirty|=Dirty.Collisions
 	End
 	
 	Property btBody:btRigidBody()
@@ -202,6 +191,36 @@ Class RigidBody Extends Component
 		_btbody.clearForces()
 	End
 
+	Method ApplyForce( force:Vec3f )
+		
+		_btbody.applyCentralForce( force )
+	End
+	
+	Method ApplyForce( force:Vec3f,offset:Vec3f )
+		
+		_btbody.applyForce( force,offset )
+	End
+	
+	Method ApplyImpulse( impulse:Vec3f )
+		
+		_btbody.applyCentralImpulse( impulse )
+	End
+	
+	Method ApplyImpulse( impulse:Vec3f,offset:Vec3f )
+		
+		_btbody.applyForce( impulse,offset )
+	End
+	
+	Method ApplyTorque( torque:Vec3f )
+		
+		_btbody.applyTorque( torque )
+	End
+		
+	Method ApplyTorqueImpulse( torque:Vec3f )
+
+		_btbody.applyTorqueImpulse( torque )
+	End
+	
 	Protected
 	
 	Method OnCopy:RigidBody( entity:Entity ) Override
@@ -211,41 +230,8 @@ Class RigidBody Extends Component
 
 	Method OnBeginUpdate() Override
 		
-'		Validate()
-		
-		Local collider:=Entity.Collider
+		Validate()
 		
-		Local seq:=collider?.Seq
-		
-		If seq<>_colliderseq
-			
-			If _rvisible
-				If Entity.ReallyVisible 
-					World.btWorld.removeRigidBody( _btbody )
-				Else
-					_rvisible=False
-					World.Remove( Self )
-				Endif
-			Endif
-			
-			_btbody.setCollisionShape( collider?.btShape )
-			Local inertia:btVector3=collider?.CalculateLocalInertia( _mass )
-			_btbody.setMassProps( _mass,inertia )
-			
-			If _rvisible World.btWorld.addRigidBody( _btbody )
-			
-			_colliderseq=seq
-			
-		Endif
-			
-		If Entity.ReallyVisible<>_rvisible
-			
-			_rvisible=Entity.ReallyVisible
-
-			If _rvisible World.Add( Self ) Else World.Remove( Self )
-				
-		Endif
-
 		If Not _kinematic And Entity.Seq<>_seq 
 			
 			_btbody.setWorldTransform( Entity.Matrix )
@@ -255,14 +241,6 @@ Class RigidBody Extends Component
 	
 	Method OnUpdate( elapsed:Float ) Override
 		
-'		If _kinematic Return
-		
-'		Local tform:=_btbody.getWorldTransform()
-		
-'		Entity.Position=tform.getOrigin()
-		
-'		Entity.Basis=tform.getBasis()
-		
 		_seq=Entity.Seq
 	End
 	
@@ -270,13 +248,18 @@ Class RigidBody Extends Component
 		
 		If Not _rvisible Return
 		
-		_rvisible=False
-		
 		World.Remove( Self )
+		
+		_rvisible=False
 	End
 	
 	Internal
 	
+	Method ColliderInvalidated()
+		
+		_dirty|=Dirty.Collider
+	End
+	
 	Property World:World()
 		
 		Return Entity.Scene.World
@@ -285,12 +268,12 @@ Class RigidBody Extends Component
 	Private
 	
 	Enum Dirty
-		Mass=1
-		Kinematic=2
+		Collider=1
+		Collisions=2
 	End
 	
-	Field _kinematic:Bool=False
 	Field _mass:Float=1
+	Field _kinematic:Bool=False
 	Field _collGroup:Short=1
 	Field _collMask:Short=1
 
@@ -301,29 +284,43 @@ Class RigidBody Extends Component
 	Field _colliderseq:Int
 	Field _rvisible:Bool
 	Field _seq:Int
-	
+
 	Method Validate()
 		
-		If Not _dirty Return
+		Local rvisible:=Entity.ReallyVisible
 		
-		If _dirty & Dirty.Mass
-
+		If rvisible=_rvisible And Not _dirty Return
+		
+		If Not rvisible Return
+		
+		'Have to remove/add bodies from world if collision shape changes. http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=5194
+		'
+		If _rvisible
+			
+			World.Remove( Self )
+			
+			_rvisible=False
+		Endif
+		
+		If _dirty & Dirty.Collider
+			
 			Local collider:=Entity.Collider
+			
+			_btbody.setCollisionShape( collider?.Validate() )
+			
 			Local inertia:btVector3=collider?.CalculateLocalInertia( _mass )
+			
 			_btbody.setMassProps( _mass,inertia )
 		Endif
-		
-		If _dirty & Dirty.Kinematic
+	
+		If _rvisible<>rvisible
 			
-			If _kinematic
-				_btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_KINEMATIC_OBJECT )
-				_btbody.setActivationState( DISABLE_DEACTIVATION )
-			Else
-				_btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_KINEMATIC_OBJECT )
-				_btbody.forceActivationState( ACTIVE_TAG )
-			Endif
+			If rvisible World.Add( Self ) Else World.Remove( Self )
+				
+			_rvisible=rvisible
 		Endif
-		
+	
 		_dirty=Null
 	End
+	
 End

+ 13 - 0
modules/mojo3d/scene/scene.monkey2

@@ -84,6 +84,17 @@ Class Scene
 		_clearColor=color
 	End
 	
+	#rem monkeydoc Scene update rate.
+	#end
+	Property UpdateRate:Float()
+		
+		Return _updateRate
+	
+	Setter( updateRate:Float )
+		
+		_updateRate=updateRate
+	End
+	
 	#rem monkeydoc Ambient diffuse lighting.
 	#end
 	Property AmbientLight:Color()
@@ -243,6 +254,8 @@ Class Scene
 	Field _clearColor:Color
 	Field _ambientDiffuse:Color
 	
+	Field _updateRate:Float=60
+	
 	Field _rootEntities:=New Stack<Entity>
 	Field _cameras:=New Stack<Camera>
 	Field _lights:=New Stack<Light>

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

@@ -66,7 +66,7 @@ Class World
 		
 		Local btresult:=New btCollisionWorld.ClosestConvexResultCallback( castFrom.t,castTo.t )
 		
-		_btworld.convexSweepTest( Cast<btConvexShape>( collider.btShape ),castFrom,castTo,Cast<btCollisionWorld.ConvexResultCallback Ptr>( Varptr btresult ),0 )
+		_btworld.convexSweepTest( Cast<btConvexShape>( collider.Validate() ),castFrom,castTo,Cast<btCollisionWorld.ConvexResultCallback Ptr>( Varptr btresult ),0 )
 		
 		If Not btresult.hasHit() Return Null
 		
@@ -82,7 +82,7 @@ Class World
 		
 		resetCollisions()
 		
-		_btworld.stepSimulation( 1.0/60.0 )
+		_btworld.stepSimulation( 1.0/_scene.UpdateRate )
 		
 		Local n:=getNumCollisions()
 		
@@ -119,7 +119,7 @@ Class World
 	
 	Method Add( body:RigidBody )
 		
-		Print "World.Add( RigidBody )"
+'		Print "World.Add( RigidBody )"
 		
 		_bodies.Add( body )
 		
@@ -132,7 +132,7 @@ Class World
 	
 	Method Remove( body:RigidBody )
 		
-		Print "World.Remove( RigidBody )"
+'		Print "World.Remove( RigidBody )"
 		
 		Local btbody:=body.btBody