//========= 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 ¶ms); // 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