world.monkey2 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. Namespace mojo3d
  2. #Import "native/collisiondetect.cpp"
  3. #Import "native/collisiondetect.h"
  4. Extern Private
  5. Function initCollisions( world:btDynamicsWorld )
  6. Function resetCollisions()
  7. Function getNumCollisions:Int()
  8. Function getCollisions:Void Ptr Ptr()
  9. Public
  10. Class World
  11. Method New( scene:Scene )
  12. _scene=scene
  13. Local broadphase:=New btDbvtBroadphase()
  14. Local config:=New btDefaultCollisionConfiguration()
  15. Local dispatcher:=New btCollisionDispatcher( config )
  16. Local solver:=New btSequentialImpulseConstraintSolver()
  17. _btworld=New btDiscreteDynamicsWorld( dispatcher,broadphase,solver,config )
  18. ' //from BenchmarkDemo.cpp!
  19. ' ///the following 3 lines increase the performance dramatically, with a little bit of loss of quality
  20. ' m_dynamicsWorld->getSolverInfo().m_solverMode |=SOLVER_ENABLE_FRICTION_DIRECTION_CACHING; //don't recalculate friction values each frame
  21. ' m_dynamicsWorld->getSolverInfo().m_numIterations = 5; //few solver iterations
  22. ' //m_defaultContactProcessingThreshold = 0.f;//used when creating bodies: body->setContactProcessingThreshold(...);
  23. initCollisions( _btworld )
  24. Gravity=New Vec3f( 0,-9.81,0 )
  25. End
  26. Property Scene:Scene()
  27. Return _scene
  28. End
  29. Property Gravity:Vec3f()
  30. Return _btworld.getGravity()
  31. Setter( gravity:Vec3f )
  32. _btworld.setGravity( gravity )
  33. End
  34. Method RayCast:RayCastResult( rayFrom:Vec3f,rayTo:Vec3f,collisionMask:Int )
  35. Local btresult:=New btCollisionWorld.ClosestRayResultCallback( rayFrom,rayTo )
  36. btresult.m_collisionFilterGroup=collisionMask
  37. btresult.m_collisionFilterMask=collisionMask
  38. _btworld.rayTest( rayFrom,rayTo,Cast<btCollisionWorld.RayResultCallback Ptr>( Varptr btresult ) )
  39. If Not btresult.hasHit() Return Null
  40. Return New RayCastResult( Varptr btresult )
  41. End
  42. Method ConvexSweep:RayCastResult( collider:ConvexCollider,castFrom:AffineMat4f,castTo:AffineMat4f,collisionMask:Int )
  43. Local btresult:=New btCollisionWorld.ClosestConvexResultCallback( castFrom.t,castTo.t )
  44. btresult.m_collisionFilterGroup=collisionMask
  45. btresult.m_collisionFilterMask=collisionMask
  46. _btworld.convexSweepTest( Cast<btConvexShape>( collider.Validate() ),castFrom,castTo,Cast<btCollisionWorld.ConvexResultCallback Ptr>( Varptr btresult ),0 )
  47. If Not btresult.hasHit() Return Null
  48. Return New RayCastResult( Varptr btresult )
  49. End
  50. Method ConvexSweep:RayCastResult( collider:ConvexCollider,castFrom:Vec3f,castTo:Vec3f,collisionMask:Int )
  51. Return ConvexSweep( collider,AffineMat4f.Translation( castFrom ),AffineMat4f.Translation( castTo ),collisionMask )
  52. End
  53. Method Update( elapsed:Float )
  54. resetCollisions()
  55. _btworld.stepSimulation( elapsed,_scene.MaxSubSteps,1.0/_scene.UpdateRate )
  56. Local n:=getNumCollisions()
  57. Local p:=getCollisions()
  58. For Local i:=0 Until n
  59. Local body0:=Cast<RigidBody>( p[i*2] )
  60. Local body1:=Cast<RigidBody>( p[i*2+1] )
  61. Local entity0:=body0.Entity
  62. Local entity1:=body1.Entity
  63. entity0.Collide( body1 )
  64. entity1.Collide( body0 )
  65. ' body0.Entity.Collide( body1 )
  66. ' body1.Entity.Collide( body0 )
  67. ' Print "Collision:"+entity0.Name+"->"+entity1.Name
  68. Next
  69. resetCollisions()
  70. End
  71. Property btWorld:btDynamicsWorld()
  72. Return _btworld
  73. End
  74. Internal
  75. Method Add( body:RigidBody )
  76. ' Print "World.Add( RigidBody )"
  77. _bodies.Add( body )
  78. Local btbody:=body.btBody
  79. btbody.setUserPointer( Cast<Void Ptr>( body ) )
  80. ' btbody.setWorldTransform( body.Entity.Matrix )
  81. _btworld.addRigidBody( btbody,body.CollisionGroup,body.CollisionMask )
  82. End
  83. Method Remove( body:RigidBody )
  84. ' Print "World.Remove( RigidBody )"
  85. Local btbody:=body.btBody
  86. _btworld.removeRigidBody( btbody )
  87. body.btBody.setUserPointer( Null )
  88. _bodies.Remove( body )
  89. End
  90. Private
  91. Field _scene:Scene
  92. Field _btworld:btDynamicsWorld
  93. Field _bodies:=New Stack<RigidBody>
  94. Field _constraints:=New Stack<Constraint>
  95. End