rigidbody.monkey2 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. Namespace mojo3d
  2. Private
  3. Class MotionState Extends btMotionState
  4. Method New( entity:Entity )
  5. _entity=entity
  6. End
  7. Method getWorldTransform( tform:btTransform Ptr ) Override
  8. ' If Not _entity.RigidBody.Kinematic Print "Dynamic getWorldTransform! Position="+_entity.Position
  9. tform->setOrigin( _entity.Position )
  10. tform->setBasis( _entity.Basis )
  11. End
  12. Method setWorldTransform( tform:btTransform Ptr ) Override
  13. ' If _entity.RigidBody.Kinematic Print "Kinematic setWorldTransform!"
  14. _entity.Position=tform->getOrigin()
  15. _entity.Basis=tform->getBasis()
  16. End
  17. Private
  18. Field _entity:Entity
  19. End
  20. Public
  21. Class Entity Extension
  22. Property RigidBody:RigidBody()
  23. Return Cast<RigidBody>( GetComponent( RigidBody.Type ) )
  24. End
  25. End
  26. Class RigidBody Extends Component
  27. Const Type:=New ComponentType( "RigidBody",-10,ComponentTypeFlags.Singleton )
  28. Method New( entity:Entity )
  29. Super.New( entity,Type )
  30. _btmotion=New MotionState( entity )
  31. Local collider:=entity.Collider
  32. Local inertia:btVector3=collider?.CalculateLocalInertia( _mass )
  33. _btbody=New btRigidBody( _mass,_btmotion,collider?.Validate(),inertia )
  34. ' If Cast<MeshCollider>( collider )
  35. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
  36. ' Else
  37. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
  38. ' Endif
  39. Restitution=0
  40. RollingFriction=0
  41. Friction=1
  42. CollisionGroup=1
  43. CollisionMask=1
  44. End
  45. Method New( entity:Entity,body:RigidBody )
  46. Self.New( entity )
  47. Kinematic=body.Kinematic
  48. Mass=body.Mass
  49. Restitution=body.Restitution
  50. Friction=body.Friction
  51. RollingFriction=body.RollingFriction
  52. CollisionGroup=body.CollisionGroup
  53. CollisionMask=body.CollisionMask
  54. End
  55. Property Kinematic:Bool()
  56. Return _kinematic
  57. Setter( kinematic:Bool )
  58. If kinematic=_kinematic Return
  59. _kinematic=kinematic
  60. If _kinematic
  61. _btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_KINEMATIC_OBJECT )
  62. _btbody.setActivationState( DISABLE_DEACTIVATION )
  63. Else
  64. _btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_KINEMATIC_OBJECT )
  65. _btbody.forceActivationState( ACTIVE_TAG )
  66. Endif
  67. End
  68. Property Mass:Float()
  69. Return _mass
  70. Setter( mass:Float )
  71. If mass=_mass Return
  72. _mass=mass
  73. Local collider:=Entity.Collider
  74. Local inertia:=collider?.CalculateLocalInertia( _mass )
  75. _btbody.setMassProps( _mass,inertia )
  76. End
  77. Property Restitution:Float()
  78. Return _btbody.getRestitution()
  79. Setter( restitution:Float )
  80. _btbody.setRestitution( restitution )
  81. End
  82. Property Friction:Float()
  83. Return _btbody.getFriction()
  84. Setter( friction:Float )
  85. _btbody.setFriction( friction )
  86. End
  87. Property RollingFriction:Float()
  88. Return _btbody.getRollingFriction()
  89. Setter( friction:Float )
  90. _btbody.setRollingFriction( friction )
  91. End
  92. Property LinearVelocity:Vec3f()
  93. Return _btbody.getLinearVelocity()
  94. Setter( velocity:Vec3f )
  95. _btbody.setLinearVelocity( velocity )
  96. End
  97. Property AngularVelocity:Vec3f()
  98. Return _btbody.getAngularVelocity()
  99. Setter( avelocity:Vec3f )
  100. _btbody.setAngularVelocity( avelocity )
  101. End
  102. Property CollisionGroup:Short()
  103. Return _collGroup
  104. Setter( collGroup:Short )
  105. _collGroup=collGroup
  106. _dirty|=Dirty.Collisions
  107. End
  108. Property CollisionMask:Short()
  109. Return _collMask
  110. Setter( collMask:Short )
  111. _collMask=collMask
  112. _dirty|=Dirty.Collisions
  113. End
  114. Property btBody:btRigidBody()
  115. Return _btbody
  116. End
  117. Method ClearForces()
  118. _btbody.clearForces()
  119. End
  120. Method ApplyForce( force:Vec3f )
  121. _btbody.applyCentralForce( force )
  122. _btbody.forceActivationState( ACTIVE_TAG )
  123. End
  124. Method ApplyForce( force:Vec3f,offset:Vec3f )
  125. _btbody.applyForce( force,offset )
  126. _btbody.forceActivationState( ACTIVE_TAG )
  127. End
  128. Method ApplyImpulse( impulse:Vec3f )
  129. _btbody.applyCentralImpulse( impulse )
  130. _btbody.forceActivationState( ACTIVE_TAG )
  131. End
  132. Method ApplyImpulse( impulse:Vec3f,offset:Vec3f )
  133. _btbody.applyForce( impulse,offset )
  134. _btbody.forceActivationState( ACTIVE_TAG )
  135. End
  136. Method ApplyTorque( torque:Vec3f )
  137. _btbody.applyTorque( torque )
  138. _btbody.forceActivationState( ACTIVE_TAG )
  139. End
  140. Method ApplyTorqueImpulse( torque:Vec3f )
  141. _btbody.applyTorqueImpulse( torque )
  142. _btbody.forceActivationState( ACTIVE_TAG )
  143. End
  144. Protected
  145. Method OnCopy:RigidBody( entity:Entity ) Override
  146. Return New RigidBody( entity,Self )
  147. End
  148. Method OnBeginUpdate() Override
  149. Validate()
  150. If Not _kinematic And Entity.Seq<>_seq
  151. _btbody.setWorldTransform( Entity.Matrix )
  152. Endif
  153. End
  154. Method OnUpdate( elapsed:Float ) Override
  155. _seq=Entity.Seq
  156. End
  157. Method OnDestroy() Override
  158. If Not _rvisible Return
  159. World.Remove( Self )
  160. _rvisible=False
  161. End
  162. Internal
  163. Method ColliderInvalidated()
  164. _dirty|=Dirty.Collider
  165. End
  166. Property World:World()
  167. Return Entity.Scene.World
  168. End
  169. Private
  170. Enum Dirty
  171. Collider=1
  172. Collisions=2
  173. End
  174. Field _mass:Float=1
  175. Field _kinematic:Bool=False
  176. Field _collGroup:Short=1
  177. Field _collMask:Short=1
  178. Field _btmotion:MotionState
  179. Field _btbody:btRigidBody
  180. Field _dirty:Dirty=Null
  181. Field _colliderseq:Int
  182. Field _rvisible:Bool
  183. Field _seq:Int
  184. Method Validate()
  185. Local rvisible:=Entity.ReallyVisible
  186. If rvisible=_rvisible And Not _dirty Return
  187. If Not rvisible Return
  188. 'Have to remove/add bodies from world if collision shape changes. http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=5194
  189. '
  190. If _rvisible
  191. World.Remove( Self )
  192. _rvisible=False
  193. Endif
  194. If _dirty & Dirty.Collider
  195. Local collider:=Entity.Collider
  196. _btbody.setCollisionShape( collider?.Validate() )
  197. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_KINEMATIC_OBJECT )
  198. ' If Cast<MeshCollider>( collider )
  199. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
  200. ' Else
  201. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
  202. ' Endif
  203. Local inertia:btVector3=collider?.CalculateLocalInertia( _mass )
  204. _btbody.setMassProps( _mass,inertia )
  205. Endif
  206. If _rvisible<>rvisible
  207. If rvisible World.Add( Self ) Else World.Remove( Self )
  208. _rvisible=rvisible
  209. Endif
  210. _dirty=Null
  211. End
  212. End