You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.0 KiB
108 lines
3.0 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// A class representing a Dag (directed acyclic graph) node used for holding transforms, lights, cameras and shapes
|
||
|
//
|
||
|
//=============================================================================
|
||
|
|
||
|
#ifndef DMEDAG_H
|
||
|
#define DMEDAG_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "tier1/utlstack.h"
|
||
|
#include "datamodel/dmelement.h"
|
||
|
#include "datamodel/dmattribute.h"
|
||
|
#include "datamodel/dmattributevar.h"
|
||
|
#include "movieobjects/dmeshape.h"
|
||
|
#include "movieobjects/dmetransform.h"
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Forward declarations
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CDmeTransform;
|
||
|
class CDmeShape;
|
||
|
class CDmeDrawSettings;
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// A class representing a camera
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CDmeDag : public CDmElement
|
||
|
{
|
||
|
DEFINE_ELEMENT( CDmeDag, CDmElement );
|
||
|
|
||
|
public:
|
||
|
// Accessors
|
||
|
CDmeTransform *GetTransform();
|
||
|
CDmeShape *GetShape();
|
||
|
|
||
|
// Changes the shage
|
||
|
void SetShape( CDmeShape *pShape );
|
||
|
|
||
|
bool IsVisible() const;
|
||
|
void SetVisible( bool bVisible = true );
|
||
|
|
||
|
// child helpers
|
||
|
const CUtlVector< DmElementHandle_t > &GetChildren() const;
|
||
|
int GetChildCount() const;
|
||
|
CDmeDag *GetChild( int i ) const;
|
||
|
void AddChild( CDmeDag* pDag );
|
||
|
void RemoveChild( int i );
|
||
|
void RemoveChild( const CDmeDag *pChild, bool bRecurse = false );
|
||
|
int FindChild( const CDmeDag *pChild ) const;
|
||
|
int FindChild( CDmeDag *&pParent, const CDmeDag *pChild );
|
||
|
int FindChild( const char *name ) const;
|
||
|
CDmeDag *FindOrAddChild( const char *name );
|
||
|
|
||
|
// Recursively render the Dag hierarchy
|
||
|
virtual void Draw( CDmeDrawSettings *pDrawSettings = NULL );
|
||
|
void GetBoundingSphere( Vector ¢er, float &radius ) const
|
||
|
{
|
||
|
matrix3x4_t identity;
|
||
|
SetIdentityMatrix( identity );
|
||
|
GetBoundingSphere( center, radius, identity );
|
||
|
}
|
||
|
|
||
|
void GetShapeToWorldTransform( matrix3x4_t &mat );
|
||
|
|
||
|
void GetLocalMatrix( matrix3x4_t &mat );
|
||
|
|
||
|
void GetWorldMatrix( matrix3x4_t &mat );
|
||
|
|
||
|
void GetParentWorldMatrix( matrix3x4_t &mat );
|
||
|
|
||
|
static void DrawUsingEngineCoordinates( bool bEnable );
|
||
|
|
||
|
// Transform from DME to engine coordinates
|
||
|
static void DmeToEngineMatrix( matrix3x4_t& dmeToEngine );
|
||
|
static void EngineToDmeMatrix( matrix3x4_t& engineToDme );
|
||
|
|
||
|
protected:
|
||
|
void GetBoundingSphere( Vector ¢er, float &radius, const matrix3x4_t &pMat ) const;
|
||
|
|
||
|
void PushDagTransform();
|
||
|
void PopDagTransform();
|
||
|
CDmAttribute *GetVisibilityAttribute();
|
||
|
|
||
|
CDmaVar< bool > m_Visible;
|
||
|
CDmaElement< CDmeTransform > m_Transform;
|
||
|
CDmaElement< CDmeShape > m_Shape;
|
||
|
CDmaElementArray< CDmeDag > m_Children;
|
||
|
|
||
|
private:
|
||
|
struct TransformInfo_t
|
||
|
{
|
||
|
CDmeTransform *m_pTransform;
|
||
|
matrix3x4_t m_DagToWorld;
|
||
|
bool m_bComputedDagToWorld;
|
||
|
};
|
||
|
|
||
|
static CUtlStack<TransformInfo_t> s_TransformStack;
|
||
|
static bool s_bDrawUsingEngineCoordinates;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // DMEDAG_H
|