rigidbody.monkey2 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  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. Property LinearVelocity:Vec3f()
  115. Return _btbody.getLinearVelocity()
  116. Setter( velocity:Vec3f )
  117. _btbody.setLinearVelocity( velocity )
  118. End
  119. Property AngularVelocity:Vec3f()
  120. Return _btbody.getAngularVelocity()
  121. Setter( avelocity:Vec3f )
  122. _btbody.setAngularVelocity( avelocity )
  123. End
  124. Property btBody:btRigidBody()
  125. Return _btbody
  126. End
  127. Method ClearForces()
  128. _btbody.clearForces()
  129. End
  130. Method ApplyForce( force:Vec3f )
  131. _btbody.applyCentralForce( force )
  132. _btbody.forceActivationState( ACTIVE_TAG )
  133. End
  134. Method ApplyForce( force:Vec3f,offset:Vec3f )
  135. _btbody.applyForce( force,offset )
  136. _btbody.forceActivationState( ACTIVE_TAG )
  137. End
  138. Method ApplyImpulse( impulse:Vec3f )
  139. _btbody.applyCentralImpulse( impulse )
  140. _btbody.forceActivationState( ACTIVE_TAG )
  141. End
  142. Method ApplyImpulse( impulse:Vec3f,offset:Vec3f )
  143. _btbody.applyForce( impulse,offset )
  144. _btbody.forceActivationState( ACTIVE_TAG )
  145. End
  146. Method ApplyTorque( torque:Vec3f )
  147. _btbody.applyTorque( torque )
  148. _btbody.forceActivationState( ACTIVE_TAG )
  149. End
  150. Method ApplyTorqueImpulse( torque:Vec3f )
  151. _btbody.applyTorqueImpulse( torque )
  152. _btbody.forceActivationState( ACTIVE_TAG )
  153. End
  154. Protected
  155. Method OnCopy:RigidBody( entity:Entity ) Override
  156. Local body:=New RigidBody( entity,Self )
  157. Return body
  158. End
  159. Method OnBeginUpdate() Override
  160. Validate()
  161. If Not _kinematic And Entity.Seq<>_seq
  162. _btbody.setWorldTransform( Entity.Matrix )
  163. Endif
  164. End
  165. Method OnUpdate( elapsed:Float ) Override
  166. _seq=Entity.Seq
  167. End
  168. Method OnDestroy() Override
  169. If Not _rvisible Return
  170. World.Remove( Self )
  171. _rvisible=False
  172. End
  173. Internal
  174. Method ColliderInvalidated()
  175. _dirty|=Dirty.Collider
  176. End
  177. Property World:World()
  178. Return Entity.Scene.World
  179. End
  180. Private
  181. Enum Dirty
  182. Mass=1
  183. Collider=2
  184. Collisions=4
  185. All=7
  186. End
  187. Field _mass:Float=1
  188. Field _kinematic:Bool=False
  189. Field _collGroup:Short=1
  190. Field _collMask:Short=1
  191. Field _btmotion:MotionState
  192. Field _btbody:btRigidBody
  193. Field _dirty:Dirty=Dirty.All
  194. Field _colliderseq:Int
  195. Field _rvisible:Bool
  196. Field _seq:Int
  197. Method Validate()
  198. Local rvisible:=Entity.ReallyVisible
  199. If rvisible=_rvisible And Not _dirty Return
  200. If Not rvisible Return
  201. 'Have to remove/add bodies from world if collision shape changes. http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=5194
  202. '
  203. If _rvisible And (_dirty & Dirty.Collider)
  204. World.Remove( Self )
  205. _rvisible=False
  206. Endif
  207. If _dirty & (Dirty.Collider|Dirty.Mass)
  208. Local collider:=Entity.Collider
  209. _btbody.setCollisionShape( collider?.Validate() )
  210. ' If Cast<MeshCollider>( collider )
  211. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() | btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
  212. ' Else
  213. ' _btbody.setCollisionFlags( _btbody.getCollisionFlags() & ~btCollisionObject.CF_CUSTOM_MATERIAL_CALLBACK )
  214. ' Endif
  215. Local inertia:btVector3=collider?.CalculateLocalInertia( _mass )
  216. _btbody.setMassProps( _mass,inertia )
  217. _btbody.updateInertiaTensor()
  218. Endif
  219. If _rvisible<>rvisible
  220. If rvisible World.Add( Self ) Else World.Remove( Self )
  221. _rvisible=rvisible
  222. Endif
  223. _dirty=Null
  224. End
  225. End