summaryrefslogtreecommitdiff
path: root/Runtime/Filters/Particles/EllipsoidParticleEmitter.cpp
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/Filters/Particles/EllipsoidParticleEmitter.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Filters/Particles/EllipsoidParticleEmitter.cpp')
-rw-r--r--Runtime/Filters/Particles/EllipsoidParticleEmitter.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/Runtime/Filters/Particles/EllipsoidParticleEmitter.cpp b/Runtime/Filters/Particles/EllipsoidParticleEmitter.cpp
new file mode 100644
index 0000000..0401fa2
--- /dev/null
+++ b/Runtime/Filters/Particles/EllipsoidParticleEmitter.cpp
@@ -0,0 +1,110 @@
+#include "UnityPrefix.h"
+#include "Runtime/Core/Callbacks/GlobalCallbacks.h"
+#include "EllipsoidParticleEmitter.h"
+#include "Runtime/Input/TimeManager.h"
+#include "Runtime/Graphics/Transform.h"
+#include "Runtime/Math/Random/Random.h"
+#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
+
+using namespace std;
+
+Rand gEllipsoidEmitterRand (3);
+
+EllipsoidParticleEmitter::EllipsoidParticleEmitter (MemLabelId label, ObjectCreationMode mode)
+: Super(label, mode)
+{
+ m_Ellipsoid = Vector3f (1, 1, 1);
+ m_MinEmitterRange = 0.0F;
+}
+
+EllipsoidParticleEmitter::~EllipsoidParticleEmitter ()
+{
+}
+
+static void ResetEllipsoidEmitterRand ()
+{
+ gEllipsoidEmitterRand.SetSeed (3);
+}
+
+void EllipsoidParticleEmitter::InitializeClass ()
+{
+ GlobalCallbacks::Get().resetRandomAfterLevelLoad.Register(ResetEllipsoidEmitterRand);
+}
+
+void EllipsoidParticleEmitter::CleanupClass ()
+{
+ GlobalCallbacks::Get().resetRandomAfterLevelLoad.Unregister(ResetEllipsoidEmitterRand);
+}
+
+
+void EllipsoidParticleEmitter::SetupParticles (
+ ParticleArray& particles,
+ const Vector3f& velocityOffset,
+ const Matrix3x3f& rotation,
+ int firstIndex)
+{
+ float deltaTime = GetDeltaTime ();
+ MinMaxAABB& aabb = m_PrivateInfo.aabb;
+ for (int i = firstIndex;i<particles.size ();i++)
+ {
+ SetupParticle (particles[i], velocityOffset, rotation, deltaTime);
+ aabb.Encapsulate (particles[i].position);
+ }
+}
+
+void EllipsoidParticleEmitter::SetupParticle (
+ Particle& p,
+ const Vector3f& velocityOffset,
+ const Matrix3x3f& rotation,
+ float deltaTime)
+{
+ InitParticleEnergy(gEllipsoidEmitterRand, p, deltaTime);
+
+ // Set particle starting position
+ p.position = m_PreviousEmitterPos;
+ p.position += velocityOffset * RangedRandom (gEllipsoidEmitterRand, 0.0F, deltaTime);
+ p.position += (m_EmitterPos - m_PreviousEmitterPos) * Random01 (gEllipsoidEmitterRand);
+ Vector3f insideEllipsoidPosition = RandomPointBetweenEllipsoid (gEllipsoidEmitterRand, m_Ellipsoid, m_MinEmitterRange);
+ p.position += rotation.MultiplyVector3 (insideEllipsoidPosition);
+
+ // Set velocity
+ p.velocity = velocityOffset;
+ p.velocity += rotation.MultiplyVector3 (RandomPointInsideEllipsoid (gEllipsoidEmitterRand, m_RndVelocity));
+
+ p.rotation = m_RndInitialRotations ? RangedRandom (gEllipsoidEmitterRand, 0.0f, 2*kPI):0.0F;
+ float angularVelocity = m_AngularVelocity;
+#if SUPPORT_REPRODUCE_LOG
+ if (m_RndAngularVelocity > Vector3f::epsilon)
+#endif
+ angularVelocity += RangedRandom (gEllipsoidEmitterRand, -m_RndAngularVelocity, m_RndAngularVelocity);
+ p.angularVelocity = Deg2Rad(angularVelocity);
+
+// Vector3f ellipsoidRelativeDirection = NormalizeSafe (insideEllipsoidPosition);
+// p.velocity += rotation.MultiplyVector3 (Cross (ellipsoidRelativeDirection, info.tangentVelocity));
+
+ Vector3f uTangent (insideEllipsoidPosition.z, 0.0F, -insideEllipsoidPosition.x);
+ Vector3f vTangent (insideEllipsoidPosition.x, 0.0F, -insideEllipsoidPosition.y);
+ uTangent = NormalizeSafe (uTangent);
+ vTangent = NormalizeSafe (vTangent);
+ Vector3f normal = NormalizeSafe (insideEllipsoidPosition);
+ p.velocity += rotation.MultiplyVector3 (uTangent * m_TangentVelocity.x);
+ p.velocity += rotation.MultiplyVector3 (vTangent * m_TangentVelocity.y);
+ p.velocity += rotation.MultiplyVector3 (normal * m_TangentVelocity.z);
+
+ p.color = ColorRGBA32 (255, 255, 255, 255);
+
+ // Set size
+ p.size = RangedRandom (gEllipsoidEmitterRand, m_MinSize, m_MaxSize);
+}
+
+IMPLEMENT_CLASS_HAS_INIT (EllipsoidParticleEmitter)
+IMPLEMENT_OBJECT_SERIALIZE (EllipsoidParticleEmitter)
+
+template<class TransferFunction> inline
+void EllipsoidParticleEmitter::Transfer (TransferFunction& transfer)
+{
+ Super::Transfer (transfer);
+ transfer.Align();
+ TRANSFER_SIMPLE (m_Ellipsoid);
+ TRANSFER (m_MinEmitterRange);
+}