This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

96 lines
2.5 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef ROPE_PHYSICS_H
#define ROPE_PHYSICS_H
#ifdef _WIN32
#pragma once
#endif
#include "networkvar.h"
#include "simple_physics.h"
class CRopeSpring {
public:
Vector *m_pNode1;
Vector *m_pNode2;
};
class CBaseRopePhysics : public CSimplePhysics::IHelper {
public:
DECLARE_CLASS_NOBASE(CBaseRopePhysics);
CBaseRopePhysics(CSimplePhysics::CNode *pNodes, int nNodes,
CRopeSpring *pSprings, float *flSpringDistsSqr);
// nNodes should be less than or equal to what you passed into the
// constructor.
void SetNumNodes(int nNodes);
// Restart timers and such.
void Restart();
void ResetSpringLength(float flSpringDist);
float GetSpringLength() const;
void ResetNodeSpringLength(int iStartNode, float flSpringDist);
// Set simulation parameters.
// If you pass in a delegate, you can be called to apply constraints.
void SetupSimulation(float flSpringDist,
CSimplePhysics::IHelper *pDelegate = 0);
// Set the physics delegate.
void SetDelegate(CSimplePhysics::IHelper *pDelegate);
void Simulate(float dt);
int NumNodes() { return m_nNodes; }
CSimplePhysics::CNode *GetNode(int iNode) { return &m_pNodes[iNode]; }
CSimplePhysics::CNode *GetFirstNode() { return &m_pNodes[0]; }
CSimplePhysics::CNode *GetLastNode() { return &m_pNodes[m_nNodes - 1]; }
public:
virtual void GetNodeForces(CSimplePhysics::CNode *pNodes, int iNode,
Vector *pAccel);
virtual void ApplyConstraints(CSimplePhysics::CNode *pNodes, int nNodes);
private:
int NumSprings() { return m_nNodes - 1; }
protected:
CSimplePhysics::IHelper *m_pDelegate;
CSimplePhysics::CNode *m_pNodes;
int m_nNodes;
CRopeSpring *m_pSprings;
float m_flSpringDist;
float m_flSpringDistSqr;
// Spring lengths per node
float *m_flNodeSpringDistsSqr;
CSimplePhysics m_Physics;
};
template <int NUM_NODES>
class CRopePhysics : public CBaseRopePhysics {
public:
CRopePhysics();
CSimplePhysics::CNode m_Nodes[NUM_NODES];
CRopeSpring m_Springs[NUM_NODES - 1];
float m_SpringDistsSqr[NUM_NODES - 1];
};
template <int NUM_NODES>
CRopePhysics<NUM_NODES>::CRopePhysics()
: CBaseRopePhysics(m_Nodes, NUM_NODES, m_Springs, m_SpringDistsSqr) {}
#endif // ROPE_PHYSICS_H