rigidbody.monkey2 6.7 KB

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