Plasma Engine  2.0
Loading...
Searching...
No Matches
RopeSimulator.h
1#pragma once
2
3#include <Foundation/Containers/DynamicArray.h>
4#include <Foundation/Math/Vec3.h>
5#include <Foundation/SimdMath/SimdFloat.h>
6#include <Foundation/SimdMath/SimdVec4f.h>
7#include <GameEngine/GameEngineDLL.h>
8
16class PL_GAMEENGINE_DLL plRopeSimulator
17{
18public:
19 struct Node
20 {
21 plSimdVec4f m_vPosition = plSimdVec4f::MakeZero();
22 plSimdVec4f m_vPreviousPosition = plSimdVec4f::MakeZero();
23
24 // could add per node acceleration
25 // could add per node mass
26 };
27
28public:
31
34 plVec3 m_vAcceleration = plVec3(0, 0, -10);
35
38
41 float m_fDampingFactor = 0.995f;
42
44 float m_fSegmentLength = 0.1f;
45
46 bool m_bFirstNodeIsFixed = true;
47 bool m_bLastNodeIsFixed = true;
48
49 void SimulateRope(const plTime& diff);
50 void SimulateStep(const plSimdFloat fDiffSqr, plUInt32 uiMaxIterations, plSimdFloat fAllowedError);
51 void SimulateTillEquilibrium(plSimdFloat fAllowedMovement = 0.005f, plUInt32 uiMaxIterations = 1000);
52 bool HasEquilibrium(plSimdFloat fAllowedMovement) const;
53 float GetTotalLength() const;
54 plSimdVec4f GetPositionAtLength(float fLength) const;
55
56private:
57 plSimdFloat EnforceDistanceConstraint();
58 void UpdateNodePositions(const plSimdFloat tDiffSqr);
59 plSimdVec4f MoveTowards(const plSimdVec4f posThis, const plSimdVec4f posNext, plSimdFloat factor, const plSimdVec4f fallbackDir, plSimdFloat& inout_fError);
60
61 plTime m_LeftOverTimeStep;
62};
Definition DynamicArray.h:81
A simple simulator for swinging and hanging ropes.
Definition RopeSimulator.h:17
plDynamicArray< Node, plAlignedAllocatorWrapper > m_Nodes
All the nodes in the rope.
Definition RopeSimulator.h:37
Definition SimdFloat.h:7
A 4-component SIMD vector class.
Definition SimdVec4f.h:8
static plSimdVec4f MakeZero()
Creates an plSimdVec4f that is initialized to zero.
Definition SimdVec4f_inl.h:8
Definition RopeSimulator.h:20
The time class encapsulates a double value storing the time in seconds.
Definition Time.h:12