rigidbody.monkey2 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  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 RigidBody Extends Component
  22. #rem monkeydoc Invoked when this rigid body collides with another rigid body.
  23. #end
  24. Field Collided:Void( rigidBody:RigidBody )
  25. Const Type:=New ComponentType( "RigidBody",-10,ComponentTypeFlags.Singleton )
  26. Method New( entity:Entity )
  27. Super.New( entity,Type )
  28. _btmotion=New MotionState( entity )
  29. _btbody=New btRigidBody( _mass,_btmotion,Null,Null )
  30. Kinematic=False
  31. Restitution=0
  32. Friction=1
  33. RollingFriction=0
  34. CollisionGroup=1
  35. CollisionMask=1
  36. AddInstance()
  37. End
  38. Method New( entity:Entity,body:RigidBody )
  39. Super.New( entity,Type )
  40. _mass=body.Mass
  41. _btmotion=New MotionState( entity )
  42. _btbody=New btRigidBody( _mass,_btmotion,Null,Null )
  43. Kinematic=body.Kinematic
  44. Restitution=body.Restitution
  45. Friction=body.Friction
  46. RollingFriction=body.RollingFriction
  47. CollisionGroup=body.CollisionGroup
  48. CollisionMask=body.CollisionMask
  49. AddInstance( body )
  50. End
  51. [jsonify=1]
  52. Property Kinematic:Bool()
  53. Return _kinematic
  54. Setter( kinematic:Bool )
  55. If kinematic=_kinematic Return
  56. _kinematic=kinematic
  57. If _kinematic
  58. _btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_KINEMATIC_OBJECT )
  59. _btbody.setActivationState( DISABLE_DEACTIVATION )
  60. Else
  61. _btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_KINEMATIC_OBJECT )
  62. _btbody.forceActivationState( ACTIVE_TAG )
  63. Endif
  64. End
  65. [jsonify=1]
  66. Property Mass:Float()
  67. Return _mass
  68. Setter( mass:Float )
  69. If mass=_mass Return
  70. _mass=mass
  71. _dirty|=Dirty.Mass
  72. End
  73. [jsonify=1]
  74. Property Restitution:Float()
  75. Return _btbody.getRestitution()
  76. Setter( restitution:Float )
  77. _btbody.setRestitution( restitution )
  78. End
  79. [jsonify=1]
  80. Property Friction:Float()
  81. Return _btbody.getFriction()
  82. Setter( friction:Float )
  83. _btbody.setFriction( friction )
  84. End
  85. [jsonify=1]
  86. Property RollingFriction:Float()
  87. Return _btbody.getRollingFriction()
  88. Setter( friction:Float )
  89. _btbody.setRollingFriction( friction )
  90. End
  91. [jsonify=1]
  92. Property CollisionGroup:Short()
  93. Return _collGroup
  94. Setter( collGroup:Short )
  95. _collGroup=collGroup
  96. _dirty|=Dirty.Collisions
  97. End
  98. [jsonify=1]
  99. Property CollisionMask:Short()
  100. Return _collMask
  101. Setter( collMask:Short )
  102. _collMask=collMask
  103. _dirty|=Dirty.Collisions
  104. End
  105. [jsonify=1]
  106. Property LinearDamping:Float()
  107. Return _btbody.getLinearDamping()
  108. Setter( damping:Float )
  109. _btbody.setDamping( damping,_btbody.getAngularDamping() )
  110. End
  111. [jsonify=1]
  112. Property AngularDamping:Float()
  113. Return _btbody.getAngularDamping()
  114. Setter( damping:Float )
  115. _btbody.setDamping( _btbody.getLinearDamping(),damping )
  116. End
  117. [jsonify=1]
  118. Property LinearFactor:Vec3f()
  119. Return _btbody.getLinearFactor()
  120. Setter( factor:Vec3f )
  121. _btbody.setLinearFactor( factor )
  122. End
  123. [jsonify=1]
  124. Property AngularFactor:Vec3f()
  125. Return _btbody.getAngularFactor()
  126. Setter( factor:Vec3f )
  127. _btbody.setAngularFactor( factor )
  128. End
  129. [jsonify=1]
  130. Property LinearVelocity:Vec3f()
  131. Return _btbody.getLinearVelocity()
  132. Setter( velocity:Vec3f )
  133. _btbody.setLinearVelocity( velocity )
  134. End
  135. [jsonify=1]
  136. Property AngularVelocity:Vec3f()
  137. Return _btbody.getAngularVelocity()
  138. Setter( avelocity:Vec3f )
  139. _btbody.setAngularVelocity( avelocity )
  140. End
  141. Property btBody:btRigidBody()
  142. Return _btbody
  143. End
  144. Method ClearForces()
  145. _btbody.clearForces()
  146. End
  147. Method ApplyForce( force:Vec3f )
  148. ValidateCollider()
  149. _btbody.applyCentralForce( force )
  150. _btbody.forceActivationState( ACTIVE_TAG )
  151. End
  152. Method ApplyForce( force:Vec3f,offset:Vec3f )
  153. ValidateCollider()
  154. _btbody.applyForce( force,offset )
  155. _btbody.forceActivationState( ACTIVE_TAG )
  156. End
  157. Method ApplyImpulse( impulse:Vec3f )
  158. ValidateCollider()
  159. _btbody.applyCentralImpulse( impulse )
  160. _btbody.forceActivationState( ACTIVE_TAG )
  161. End
  162. Method ApplyImpulse( impulse:Vec3f,offset:Vec3f )
  163. ValidateCollider()
  164. _btbody.applyForce( impulse,offset )
  165. _btbody.forceActivationState( ACTIVE_TAG )
  166. End
  167. Method ApplyTorque( torque:Vec3f )
  168. ValidateCollider()
  169. _btbody.applyTorque( torque )
  170. _btbody.forceActivationState( ACTIVE_TAG )
  171. End
  172. Method ApplyTorqueImpulse( torque:Vec3f )
  173. ValidateCollider()
  174. _btbody.applyTorqueImpulse( torque )
  175. _btbody.forceActivationState( ACTIVE_TAG )
  176. End
  177. Protected
  178. Method OnCopy:RigidBody( entity:Entity ) Override
  179. Local body:=New RigidBody( entity,Self )
  180. Return body
  181. End
  182. Method OnBeginUpdate() Override
  183. Validate()
  184. If Not _kinematic And Entity.Seq<>_seq
  185. _btbody.setWorldTransform( Entity.Matrix )
  186. Endif
  187. End
  188. Method OnEndUpdate() Override
  189. _seq=Entity.Seq
  190. End
  191. Method OnDestroy() Override
  192. If Not _rvisible Return
  193. World.Remove( Self )
  194. _rvisible=False
  195. End
  196. Internal
  197. Method ColliderInvalidated()
  198. _dirty|=Dirty.Collider
  199. End
  200. Private
  201. Enum Dirty
  202. Mass=1
  203. Collider=2
  204. Collisions=4
  205. All=7
  206. End
  207. Field _mass:Float=1
  208. Field _kinematic:Bool=False
  209. Field _collGroup:Short=1
  210. Field _collMask:Short=1
  211. Field _btmotion:MotionState
  212. Field _btbody:btRigidBody
  213. Field _dirty:Dirty=Dirty.All
  214. Field _colliderseq:Int
  215. Field _rvisible:Bool
  216. Field _seq:Int
  217. Property World:World()
  218. Return Entity.Scene.World
  219. End
  220. Method ValidateCollider()
  221. If (_dirty & (Dirty.Collider|Dirty.Mass))=0 Return
  222. _dirty &= ~(Dirty.Collider|Dirty.Mass)
  223. If _rvisible
  224. World.Remove( Self )
  225. _rvisible=False
  226. Endif
  227. Local collider:=Entity.Collider
  228. _btbody.setCollisionShape( collider?.Validate() )
  229. ' If Cast<MeshCollider>( collider )
  230. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
  231. ' Else
  232. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
  233. ' Endif
  234. Local inertia:btVector3=collider?.CalculateLocalInertia( _mass )
  235. _btbody.setMassProps( _mass,inertia )
  236. _btbody.updateInertiaTensor()
  237. End
  238. Method Validate()
  239. Local rvisible:=Entity.ReallyVisible
  240. If rvisible=_rvisible And Not _dirty Return
  241. 'remove from world
  242. '
  243. If _rvisible
  244. World.Remove( Self )
  245. _rvisible=False
  246. Endif
  247. 'don't bother to validate if not visible
  248. '
  249. If Not rvisible Return
  250. 'validate collider/mass
  251. '
  252. ValidateCollider()
  253. 'add to world
  254. '
  255. World.Add( Self )
  256. _rvisible=True
  257. _dirty=Null
  258. End
  259. End