ParticleCollisionEvents.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. //
  2. // ParticleCollisionEvents.cpp
  3. // cocos2d_libs
  4. //
  5. // Created by 徐俊杰 on 2020/4/24.
  6. //
  7. #include "rparticle/ParticleCollisionEvents.h"
  8. NS_RRP_BEGIN
  9. CollisionEvents::CollisionEvents (): currentCollisionEventThreadArray(0)
  10. {
  11. }
  12. void CollisionEvents::Clear ()
  13. {
  14. collisionEvents[0].clear ();
  15. collisionEvents[1].clear ();
  16. }
  17. bool CollisionEvents::AddEvent (const ParticleCollisionEvent& event)
  18. {
  19. GetCollisionEventThreadArray ().push_back (event);
  20. return true;
  21. }
  22. int CollisionEvents::GetCollisionEventCount () const
  23. {
  24. return GetCollisionEventScriptArray ().size ();
  25. }
  26. void CollisionEvents::SwapCollisionEventArrays ()
  27. {
  28. /*
  29. Assert (Thread::CurrentThreadIsMainThread ());
  30. */
  31. currentCollisionEventThreadArray = (currentCollisionEventThreadArray+1)%2;
  32. collisionEvents[currentCollisionEventThreadArray].clear ();
  33. }
  34. dynamic_array<ParticleCollisionEvent>& CollisionEvents::GetCollisionEventThreadArray ()
  35. {
  36. return collisionEvents[currentCollisionEventThreadArray];
  37. }
  38. const dynamic_array<ParticleCollisionEvent>& CollisionEvents::GetCollisionEventScriptArray () const
  39. {
  40. const int currentCollisionEventScriptArray = (currentCollisionEventThreadArray+1)%2;
  41. return collisionEvents[currentCollisionEventScriptArray];
  42. }
  43. struct SortCollisionEventsByGameObject {
  44. bool operator()( const ParticleCollisionEvent& ra, const ParticleCollisionEvent& rb ) const;
  45. };
  46. bool SortCollisionEventsByGameObject::operator()( const ParticleCollisionEvent& ra, const ParticleCollisionEvent& rb ) const
  47. {
  48. return ra.m_RigidBodyOrColliderInstanceID < rb.m_RigidBodyOrColliderInstanceID;
  49. }
  50. void CollisionEvents::SortCollisionEventThreadArray ()
  51. {
  52. std::sort (GetCollisionEventThreadArray ().begin (), GetCollisionEventThreadArray ().end (), SortCollisionEventsByGameObject ());
  53. }
  54. /*
  55. static GameObject* GetGameObjectFromInstanceID (int instanceId)
  56. {
  57. Object* temp = Object::IDToPointer (instanceId);
  58. if ( temp )
  59. {
  60. return (reinterpret_cast<Unity::Component*> (temp))->GetGameObjectPtr ();
  61. }
  62. return NULL;
  63. }
  64. static int GetGameObjectIDFromInstanceID (int instanceId)
  65. {
  66. Object* temp = Object::IDToPointer (instanceId);
  67. if ( temp )
  68. {
  69. return (reinterpret_cast<Unity::Component*> (temp))->GetGameObjectInstanceID ();
  70. }
  71. return 0;
  72. }
  73. */
  74. /*
  75. void CollisionEvents::SendCollisionEvents (Unity::Component& particleSystem) const
  76. {
  77. const dynamic_array<ParticleCollisionEvent>& scriptEventArray = GetCollisionEventScriptArray ();
  78. GameObject* pParticleSystem = &particleSystem.GetGameObject ();
  79. GameObject* collideeGO = NULL;
  80. int currentId = -1;
  81. for (int e = 0; e < scriptEventArray.size (); ++e)
  82. {
  83. if (currentId != scriptEventArray[e].m_RigidBodyOrColliderInstanceID)
  84. {
  85. collideeGO = GetGameObjectFromInstanceID (scriptEventArray[e].m_RigidBodyOrColliderInstanceID);
  86. if (!collideeGO)
  87. continue;
  88. currentId = scriptEventArray[e].m_RigidBodyOrColliderInstanceID;
  89. pParticleSystem->SendMessage (kParticleCollisionEvent, collideeGO, ClassID (GameObject)); // send message to particle system
  90. collideeGO->SendMessage (kParticleCollisionEvent, pParticleSystem, ClassID (GameObject)); // send message to object collided with
  91. }
  92. }
  93. }
  94. */
  95. int CollisionEvents::GetCollisionEvents (int instanceId, MonoParticleCollisionEvent* collisionEvents, int size) const
  96. {
  97. const dynamic_array<ParticleCollisionEvent>& scriptEventArray = GetCollisionEventScriptArray ();
  98. dynamic_array<ParticleCollisionEvent>::const_iterator iter = scriptEventArray.begin ();
  99. for (; iter != scriptEventArray.end (); ++iter)
  100. {
  101. /*
  102. if (instanceId == GetGameObjectIDFromInstanceID (iter->m_RigidBodyOrColliderInstanceID))
  103. {
  104. int count = 0;
  105. while (iter != scriptEventArray.end () && GetGameObjectIDFromInstanceID (iter->m_RigidBodyOrColliderInstanceID) == instanceId && count < size)
  106. {
  107. collisionEvents[count].m_Intersection = iter->m_Intersection;
  108. collisionEvents[count].m_Normal = iter->m_Normal;
  109. collisionEvents[count].m_Velocity = iter->m_Velocity;
  110. collisionEvents[count].m_ColliderInstanceID = iter->m_ColliderInstanceID;
  111. count++;
  112. iter++;
  113. }
  114. return count;
  115. }
  116. */
  117. }
  118. return 0;
  119. }
  120. NS_RRP_END