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

143 lines
4.2 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Physics constraint entities
//
// $NoKeywords: $
//===========================================================================//
#ifndef PHYSCONSTRAINT_H
#define PHYSCONSTRAINT_H
#ifdef _WIN32
#pragma once
#endif
#include "vphysics/constraints.h"
struct hl_constraint_info_t {
hl_constraint_info_t() {
pObjects[0] = pObjects[1] = NULL;
pGroup = NULL;
anchorPosition[0].Init();
anchorPosition[1].Init();
swapped = false;
massScale[0] = massScale[1] = 1.0f;
}
Vector anchorPosition[2];
IPhysicsObject *pObjects[2];
IPhysicsConstraintGroup *pGroup;
float massScale[2];
bool swapped;
};
abstract_class CPhysConstraint : public CLogicalEntity {
DECLARE_CLASS(CPhysConstraint, CLogicalEntity);
public:
CPhysConstraint();
~CPhysConstraint();
DECLARE_DATADESC();
void Spawn(void);
void Precache(void);
void Activate(void);
void ClearStaticFlag(IPhysicsObject * pObj);
virtual void Deactivate();
void OnBreak(void);
void InputBreak(inputdata_t & inputdata);
void InputOnBreak(inputdata_t & inputdata);
void InputTurnOn(inputdata_t & inputdata);
void InputTurnOff(inputdata_t & inputdata);
int DrawDebugTextOverlays();
void DrawDebugGeometryOverlays();
void GetBreakParams(constraint_breakableparams_t & params,
const hl_constraint_info_t &info);
// the notify system calls this on the constrained entities - used to detect
// & follow teleports
void NotifySystemEvent(CBaseEntity * pNotify,
notify_system_event_t eventType,
const notify_system_event_params_t &params);
// gets called at setup time on first init and restore
virtual void OnConstraintSetup(hl_constraint_info_t & info);
// return the internal constraint object (used by sound gadgets)
inline IPhysicsConstraint *GetPhysConstraint() { return m_pConstraint; }
string_t GetNameAttach1(void) { return m_nameAttach1; }
string_t GetNameAttach2(void) { return m_nameAttach2; }
protected:
void GetConstraintObjects(hl_constraint_info_t & info);
void SetupTeleportationHandling(hl_constraint_info_t & info);
bool ActivateConstraint(void);
virtual IPhysicsConstraint *CreateConstraint(
IPhysicsConstraintGroup * pGroup, const hl_constraint_info_t &info) = 0;
IPhysicsConstraint *m_pConstraint;
// These are "template" values used to construct the hinge
string_t m_nameAttach1;
string_t m_nameAttach2;
string_t m_breakSound;
string_t m_nameSystem;
float m_forceLimit;
float m_torqueLimit;
unsigned int m_teleportTick;
float m_minTeleportDistance;
COutputEvent m_OnBreak;
};
//-----------------------------------------------------------------------------
// Purpose: Fixed breakable constraint
//-----------------------------------------------------------------------------
class CPhysFixed : public CPhysConstraint {
DECLARE_CLASS(CPhysFixed, CPhysConstraint);
public:
IPhysicsConstraint *CreateConstraint(IPhysicsConstraintGroup *pGroup,
const hl_constraint_info_t &info);
// just for debugging - move to the position of the reference entity
void MoveToRefPosition() {
if (m_pConstraint) {
matrix3x4_t xformRef;
m_pConstraint->GetConstraintTransform(&xformRef, NULL);
IPhysicsObject *pObj = m_pConstraint->GetReferenceObject();
if (pObj && pObj->IsMoveable()) {
Vector pos, posWorld;
MatrixPosition(xformRef, pos);
pObj->LocalToWorld(&posWorld, pos);
SetAbsOrigin(posWorld);
}
}
}
int DrawDebugTextOverlays() {
if (m_debugOverlays & OVERLAY_TEXT_BIT) {
MoveToRefPosition();
}
return BaseClass::DrawDebugTextOverlays();
}
void DrawDebugGeometryOverlays() {
if (m_debugOverlays &
(OVERLAY_BBOX_BIT | OVERLAY_PIVOT_BIT | OVERLAY_ABSBOX_BIT)) {
MoveToRefPosition();
}
BaseClass::DrawDebugGeometryOverlays();
}
};
#endif // PHYSCONSTRAINT_H