96 lines
2.5 KiB
C++
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
|