From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- .../Filters/Particles/EllipsoidParticleEmitter.cpp | 110 +++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 Runtime/Filters/Particles/EllipsoidParticleEmitter.cpp (limited to 'Runtime/Filters/Particles/EllipsoidParticleEmitter.cpp') 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 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 inline +void EllipsoidParticleEmitter::Transfer (TransferFunction& transfer) +{ + Super::Transfer (transfer); + transfer.Align(); + TRANSFER_SIMPLE (m_Ellipsoid); + TRANSFER (m_MinEmitterRange); +} -- cgit v1.1-26-g67d0