csgo-2018-source/hammer/mapstudiomodel.h
2021-07-24 21:11:47 -07:00

155 lines
4.8 KiB
C++

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef MAPSTUDIOMODEL_H
#define MAPSTUDIOMODEL_H
#ifdef _WIN32
#pragma once
#endif
#include "MapHelper.h"
#include "StudioModel.h"
class CRender2D;
class CRender3D;
class CMapStudioModel : public CMapHelper
{
public:
//
// Factories.
//
static CMapClass *CreateMapStudioModel(CHelperInfo *pHelperInfo, CMapEntity *pParent);
static CMapStudioModel *CreateMapStudioModel(const char *pszModelPath, bool bOrientedBBox, bool bReversePitch);
static void AdvanceAnimation(float flInterval);
//
// Construction/destruction:
//
CMapStudioModel(void);
~CMapStudioModel(void);
DECLARE_MAPCLASS(CMapStudioModel,CMapHelper)
void CalcBounds(BOOL bFullUpdate = FALSE);
float GetBoundingRadius( void );
virtual CMapClass *Copy(bool bUpdateDependencies);
virtual CMapClass *CopyFrom(CMapClass *pFrom, bool bUpdateDependencies);
void Initialize(void);
void Render2D(CRender2D *pRender);
void Render3D(CRender3D *pRender);
void GetAngles(QAngle& pfAngles);
void SetAngles(QAngle& fAngles);
void OnParentKeyChanged(const char* szKey, const char* szValue);
bool RenderPreload(CRender3D *pRender, bool bNewContext);
int SerializeRMF(std::fstream &File, BOOL bRMF);
int SerializeMAP(std::fstream &File, BOOL bRMF);
static void SetRenderDistance(float fRenderDistance);
static void EnableAnimation(BOOL bEnable);
bool IsVisualElement(void) { return(true); }
bool ShouldRenderLast();
const char* GetDescription() { return("Studio model"); }
int GetFrame(void);
int GetMaxFrame(void);
void SetFrame(int nFrame);
int GetSequence(void);
int GetSequenceCount(void);
void GetSequenceName(int nIndex, char *szName);
void SetSequence(int nIndex);
const char *GetModelName(void);
// Returns the index of the sequence (does a case-insensitive search).
// Returns -1 if the sequence doesn't exist.
int GetSequenceIndex( const char *pSequenceName ) const;
protected:
float ComputeFade( CRender3D *pRender );
float ComputeScreenFade( CRender3D *pRender );
float ComputeScreenFade( CRender3D *pRender, float flMinSize, float flMaxSize );
float ComputeScreenFadeInternal( CRender3D *pRender, float flMinSize, float flMaxSize );
float ComputeDistanceFade( CRender3D *pRender );
float ComputeLevelFade( CRender3D *pRender );
void GetRenderAngles(QAngle &Angles);
//
// Implements CMapAtom transformation functions.
//
void DoTransform(const VMatrix &matrix);
inline void ReversePitch(bool bReversePitch);
inline void SetOrientedBounds(bool bOrientedBounds);
StudioModel *m_pStudioModel; // Pointer to a studio model in the model cache.
QAngle m_Angles; // Euler angles of this studio model.
float m_flPitch; // Pitch (stored separately for lights -- yuck!)
bool m_bPitchSet;
int m_Skin; // the model skin
int m_BodyGroup; // Bodygroups
bool m_bOrientedBounds; // Whether the bounding box should consider the orientation of the model.
// Note that this is not a true oriented bounding box, but an axial box
// indicating the extents of the oriented model.
bool m_bReversePitch; // Lights negate pitch, so models representing light sources in Hammer
// must do so as well.
float m_flFadeScale; // Multiplied by distance to camera before calculating fade.
float m_flFadeMinDist; // The distance/pixels at which this model is fully visible.
float m_flFadeMaxDist; // The distance/pixels at which this model is fully invisible.
Color m_ModelRenderColor;
int m_iSolid; // The collision setting of this model: 0 = not solid, 2 = bounding box, 6 = vphysics
//
// Data that is common to all studio models.
//
static float m_fRenderDistance; // Distance beyond which studio models render as bounding boxes.
static BOOL m_bAnimateModels; // Whether to animate studio models.
};
//-----------------------------------------------------------------------------
// Purpose: Sets whether this object has an oriented or axial bounding box.
// Note that this is not a true oriented bounding box, but an axial box
// indicating the extents of the oriented model.
//-----------------------------------------------------------------------------
void CMapStudioModel::SetOrientedBounds(bool bOrientedBounds)
{
m_bOrientedBounds = bOrientedBounds;
}
//-----------------------------------------------------------------------------
// Purpose: Sets whether this object negates pitch.
//-----------------------------------------------------------------------------
void CMapStudioModel::ReversePitch(bool bReversePitch)
{
m_bReversePitch = bReversePitch;
}
#endif // MAPSTUDIOMODEL_H