summaryrefslogtreecommitdiff
path: root/Runtime/Graphics/ParticleSystem/Modules/CollisionModule.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Graphics/ParticleSystem/Modules/CollisionModule.h
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Graphics/ParticleSystem/Modules/CollisionModule.h')
-rw-r--r--Runtime/Graphics/ParticleSystem/Modules/CollisionModule.h62
1 files changed, 62 insertions, 0 deletions
diff --git a/Runtime/Graphics/ParticleSystem/Modules/CollisionModule.h b/Runtime/Graphics/ParticleSystem/Modules/CollisionModule.h
new file mode 100644
index 0000000..77b5541
--- /dev/null
+++ b/Runtime/Graphics/ParticleSystem/Modules/CollisionModule.h
@@ -0,0 +1,62 @@
+#pragma once
+#include "ParticleSystemModule.h"
+#include "Runtime/BaseClasses/BitField.h"
+#include "Runtime/BaseClasses/GameObject.h"
+#include "Runtime/Geometry/Plane.h"
+#include "Runtime/Utilities/SpatialHash.h"
+
+struct ParticleSystemParticles;
+class Transform;
+
+class CollisionModule : public ParticleSystemModule
+{
+public:
+ DECLARE_MODULE (CollisionModule)
+ CollisionModule ();
+
+ void AllocateAndCache(const ParticleSystemReadOnlyState& roState, ParticleSystemState& state);
+ static void FreeCache(ParticleSystemState& state);
+
+#if UNITY_EDITOR
+ float GetEnergyLoss() const { return m_EnergyLossOnCollision; }
+ void SetEnergyLoss(float value) { m_EnergyLossOnCollision = value; };
+ float GetMinKillSpeed() const { return m_MinKillSpeed; }
+ void SetMinKillSpeed(float value) { m_MinKillSpeed = value; };
+#endif
+
+ bool GetUsesCollisionMessages () const {return m_CollisionMessages;}
+ bool IsWorldCollision() const {return m_Type==kWorldCollision;}
+ bool IsApproximate() const {return m_Quality>0;}
+ int GetQuality() const {return m_Quality;}
+
+ void Update (const ParticleSystemReadOnlyState& roState, ParticleSystemState& state, ParticleSystemParticles& ps, size_t fromIndex, float dt);
+
+ void CheckConsistency ();
+
+ template<class TransferFunction>
+ void Transfer (TransferFunction& transfer);
+
+private:
+ void ClearPrimitives();
+
+ enum { kPlaneCollision, kWorldCollision };
+ enum { kMaxNumPrimitives = 6 };
+
+ PlaneColliderCache m_ColliderCache;
+
+ // Serialized
+ int m_Type;
+ float m_Dampen;
+ float m_Bounce;
+ float m_EnergyLossOnCollision;
+ float m_MinKillSpeed;
+ float m_ParticleRadius;
+ /// Collides the particles with every collider whose layerMask & m_CollidesWith != 0
+ BitField m_CollidesWith;
+ /// Perform approximate world particle collisions
+ int m_Quality; // selected quality, 0 is high (no approximations), 1 is medium (approximate), 2 is low (approximate)
+ float m_VoxelSize;
+ bool m_CollisionMessages;
+ PPtr<Transform> m_Primitives [kMaxNumPrimitives];
+};
+