diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/sheetsimulator.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/sheetsimulator.h')
| -rw-r--r-- | game/shared/sheetsimulator.h | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/game/shared/sheetsimulator.h b/game/shared/sheetsimulator.h new file mode 100644 index 0000000..aac523e --- /dev/null +++ b/game/shared/sheetsimulator.h @@ -0,0 +1,213 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef SHEETSIMULATOR_H +#define SHEETSIMULATOR_H +#ifdef _WIN32 +#pragma once +#endif + +#include "mathlib/mathlib.h" +#include "mathlib/vector.h" +#include "utlvector.h" + + +// Uncomment this for client-side simulation +//#define CLIENT_SIDE_SIMULATION 1 + +//----------------------------------------------------------------------------- +// Simulates a sheet +//----------------------------------------------------------------------------- + +class CGameTrace; +typedef CGameTrace trace_t; +//struct trace_t; +typedef void (*TraceLineFunc_t)(const Vector &vecStart, const Vector &vecEnd, + unsigned int mask, int collisionGroup, trace_t *ptr); +typedef void (*TraceHullFunc_t)(const Vector &vecStart, const Vector &vecEnd, + const Vector &hullMin, const Vector &hullMax, + unsigned int mask, int collisionGroup, trace_t *ptr); + + +class CSheetSimulator +{ +public: + CSheetSimulator( TraceLineFunc_t traceline, TraceHullFunc_t traceHull ); + ~CSheetSimulator(); + + void Init( int w, int h, int fixedPointCount ); + + // orientation + void SetPosition( const Vector& origin, const QAngle& angles ); + + // Makes a spring + void AddSpring( int p1, int p2, float restLength ); + void AddFixedPointSpring( int fixedPoint, int p, float restLength ); + + // spring constants.... + void SetPointSpringConstant( float constant ); + void SetFixedSpringConstant( float constant ); + + // Used for both kinds of springs + void SetSpringDampConstant( float damp ); + void SetViscousDrag( float drag ); + + // Sets the collision group + void SetCollisionGroup( int group ); + + // Sets the bounding box used for collision vs world + void SetBoundingBox( Vector& mins, Vector& maxs ); + + // Computes the bounding box + void ComputeBounds( Vector& mins, Vector& maxs ); + + // simulation + void Simulate( float dt ); + void Simulate( float dt, int steps ); + + // get at the points + int NumHorizontal() const; + int NumVertical() const; + int PointCount() const; + + // Fixed points + Vector& GetFixedPoint( int i ); + + // Point masses + const Vector& GetPoint( int x, int y ) const; + const Vector& GetPoint( int i ) const; + + // For iterative collision detection + void DetectCollision( int i, float flOffset ); + void InitPosition( int i ); + + // For offseting the control points + void SetControlPointOffset( const Vector& offset ); + + // Gravity + void SetGravityConstant( float g ); + void AddGravityForce( int particle ); + +protected: + struct Particle_t + { + float m_Mass; + Vector m_Position; + Vector m_Velocity; + Vector m_Force; + int m_Collided; + int m_CollisionPlane; + float m_CollisionDist; + }; + + struct Spring_t + { + int m_Particle1; + int m_Particle2; + float m_RestLength; + }; + + inline int NumParticles() const + { + return m_HorizontalCount * m_VerticalCount; + } + + // simulator + void EulerStep( float dt ); + void ComputeControlPoints(); + void ClearForces(); + void ComputeForces(); + void TestVertAgainstPlane( int vert, int plane, bool bFarTest = true ); + void SatisfyCollisionConstraints(); + void DetermineBestCollisionPlane( bool bFarTest = true ); + void ClampPointsToCollisionPlanes(); + + // How many particles horiz + vert? + int m_HorizontalCount; + int m_VerticalCount; + + // The particles + Particle_t* m_Particle; + + // Output position after simulation + Vector* m_OutputPosition; + + // fixed points + int m_FixedPointCount; + Vector* m_pFixedPoint; + Vector* m_ControlPoints; + + CUtlVector<Spring_t> m_Springs; + CUtlVector<int> m_Gravity; + + // raycasting methods + TraceLineFunc_t m_TraceLine; + TraceHullFunc_t m_TraceHull; + + // Spring constants + float m_FixedSpringConstant; + float m_PointSpringConstant; + float m_DampConstant; + float m_ViscousDrag; + + // Collision group + int m_CollisionGroup; + + // position + orientation + Vector m_Origin; + QAngle m_Angles; + + // collision box + Vector m_FrustumBoxMin; + Vector m_FrustumBoxMax; + + // Collision planes + cplane_t* m_pCollisionPlanes; + bool* m_pValidCollisionPlane; + + // Control point offset + Vector m_ControlPointOffset; + + // Gravity + float m_GravityConstant; +}; + + +//----------------------------------------------------------------------------- +// Class to help dealing with the iterative computation +//----------------------------------------------------------------------------- + +class CIterativeSheetSimulator : public CSheetSimulator +{ +public: + CIterativeSheetSimulator( TraceLineFunc_t traceline, TraceHullFunc_t traceHull ); + + void BeginSimulation( float dt, int steps, int substeps, int collisionCount ); + + // Returns true if it just did a simulation step + bool Think( ); + bool IsDone() const { return m_SimulationSteps == 0; } + + int StepsRemaining( ) const { return m_SimulationSteps; } + +private: + CIterativeSheetSimulator( const CIterativeSheetSimulator & ); // not defined, not accessible + + // Iterative collision detection + void DetectCollisions( void ); + + float m_TimeStep; + float m_SubSteps; + char m_TotalSteps; + char m_SimulationSteps; + char m_CollisionCount; + char m_CurrentCollisionPt; + bool m_InitialPass; +}; + + +#endif // TF_SHIELD_SHARED_H |