diff options
author | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 |
commit | 15740faf9fe9fe4be08965098bbf2947e096aeeb (patch) | |
tree | a730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Graphics/ParticleSystem/ParticleCollisionEvents.cpp |
Diffstat (limited to 'Runtime/Graphics/ParticleSystem/ParticleCollisionEvents.cpp')
-rw-r--r-- | Runtime/Graphics/ParticleSystem/ParticleCollisionEvents.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/Runtime/Graphics/ParticleSystem/ParticleCollisionEvents.cpp b/Runtime/Graphics/ParticleSystem/ParticleCollisionEvents.cpp new file mode 100644 index 0000000..dfefc6a --- /dev/null +++ b/Runtime/Graphics/ParticleSystem/ParticleCollisionEvents.cpp @@ -0,0 +1,122 @@ +#include "UnityPrefix.h" +#include "ParticleCollisionEvents.h" + +#include "Runtime/Scripting/ScriptingUtility.h" +#include "Runtime/Threads/Thread.h" + +CollisionEvents::CollisionEvents (): currentCollisionEventThreadArray(0) +{ +} + +void CollisionEvents::Clear () +{ + collisionEvents[0].clear (); + collisionEvents[1].clear (); +} + +bool CollisionEvents::AddEvent (const ParticleCollisionEvent& event) +{ + GetCollisionEventThreadArray ().push_back (event); + return true; +} + +int CollisionEvents::GetCollisionEventCount () const +{ + return GetCollisionEventScriptArray ().size (); +} + +void CollisionEvents::SwapCollisionEventArrays () +{ + Assert (Thread::CurrentThreadIsMainThread ()); + currentCollisionEventThreadArray = (currentCollisionEventThreadArray+1)%2; + collisionEvents[currentCollisionEventThreadArray].clear (); +} + +dynamic_array<ParticleCollisionEvent>& CollisionEvents::GetCollisionEventThreadArray () +{ + return collisionEvents[currentCollisionEventThreadArray]; +} + +const dynamic_array<ParticleCollisionEvent>& CollisionEvents::GetCollisionEventScriptArray () const +{ + const int currentCollisionEventScriptArray = (currentCollisionEventThreadArray+1)%2; + return collisionEvents[currentCollisionEventScriptArray]; +} + +struct SortCollisionEventsByGameObject { + bool operator()( const ParticleCollisionEvent& ra, const ParticleCollisionEvent& rb ) const; +}; + +bool SortCollisionEventsByGameObject::operator()( const ParticleCollisionEvent& ra, const ParticleCollisionEvent& rb ) const +{ + return ra.m_RigidBodyOrColliderInstanceID < rb.m_RigidBodyOrColliderInstanceID; +} + +void CollisionEvents::SortCollisionEventThreadArray () +{ + std::sort (GetCollisionEventThreadArray ().begin (), GetCollisionEventThreadArray ().end (), SortCollisionEventsByGameObject ()); +} + +static GameObject* GetGameObjectFromInstanceID (int instanceId) +{ + Object* temp = Object::IDToPointer (instanceId); + if ( temp ) + { + return (reinterpret_cast<Unity::Component*> (temp))->GetGameObjectPtr (); + } + return NULL; +} + +static int GetGameObjectIDFromInstanceID (int instanceId) +{ + Object* temp = Object::IDToPointer (instanceId); + if ( temp ) + { + return (reinterpret_cast<Unity::Component*> (temp))->GetGameObjectInstanceID (); + } + return 0; +} + +void CollisionEvents::SendCollisionEvents (Unity::Component& particleSystem) const +{ + const dynamic_array<ParticleCollisionEvent>& scriptEventArray = GetCollisionEventScriptArray (); + GameObject* pParticleSystem = &particleSystem.GetGameObject (); + GameObject* collideeGO = NULL; + int currentId = -1; + for (int e = 0; e < scriptEventArray.size (); ++e) + { + if (currentId != scriptEventArray[e].m_RigidBodyOrColliderInstanceID) + { + collideeGO = GetGameObjectFromInstanceID (scriptEventArray[e].m_RigidBodyOrColliderInstanceID); + if (!collideeGO) + continue; + currentId = scriptEventArray[e].m_RigidBodyOrColliderInstanceID; + pParticleSystem->SendMessage (kParticleCollisionEvent, collideeGO, ClassID (GameObject)); // send message to particle system + collideeGO->SendMessage (kParticleCollisionEvent, pParticleSystem, ClassID (GameObject)); // send message to object collided with + } + } +} + +int CollisionEvents::GetCollisionEvents (int instanceId, MonoParticleCollisionEvent* collisionEvents, int size) const +{ + const dynamic_array<ParticleCollisionEvent>& scriptEventArray = GetCollisionEventScriptArray (); + dynamic_array<ParticleCollisionEvent>::const_iterator iter = scriptEventArray.begin (); + for (; iter != scriptEventArray.end (); ++iter) + { + if (instanceId == GetGameObjectIDFromInstanceID (iter->m_RigidBodyOrColliderInstanceID)) + { + int count = 0; + while (iter != scriptEventArray.end () && GetGameObjectIDFromInstanceID (iter->m_RigidBodyOrColliderInstanceID) == instanceId && count < size) + { + collisionEvents[count].m_Intersection = iter->m_Intersection; + collisionEvents[count].m_Normal = iter->m_Normal; + collisionEvents[count].m_Velocity = iter->m_Velocity; + collisionEvents[count].m_ColliderInstanceID = iter->m_ColliderInstanceID; + count++; + iter++; + } + return count; + } + } + return 0; +} |