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.
151 lines
4.2 KiB
151 lines
4.2 KiB
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
#ifndef STUDIOMODEL_H
|
|
#define STUDIOMODEL_H
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#ifndef byte
|
|
typedef unsigned char byte;
|
|
#endif // byte
|
|
|
|
#include "hammer_mathlib.h"
|
|
#include "studio.h"
|
|
#include "UtlVector.h"
|
|
#include "datacache/imdlcache.h"
|
|
#include "FileChangeWatcher.h"
|
|
|
|
|
|
class StudioModel;
|
|
class CMaterial;
|
|
class CRender3D;
|
|
class CRender2D;
|
|
|
|
|
|
struct ModelCache_t
|
|
{
|
|
StudioModel *pModel;
|
|
char *pszPath;
|
|
int nRefCount;
|
|
};
|
|
|
|
#define MAX_STUDIOMODELCACHE 2048
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Defines an interface to a cache of studio models.
|
|
//-----------------------------------------------------------------------------
|
|
class CStudioModelCache
|
|
{
|
|
public:
|
|
|
|
static StudioModel *FindModel(const char *pszModelPath);
|
|
static StudioModel *CreateModel(const char *pszModelPath);
|
|
static void ReloadModel( const char *pszModelPath );
|
|
|
|
static void AddRef(StudioModel *pModel);
|
|
static void Release(StudioModel *pModel);
|
|
static void AdvanceAnimation(float flInterval);
|
|
|
|
protected:
|
|
|
|
static BOOL AddModel(StudioModel *pModel, const char *pszModelPath);
|
|
static void RemoveModel(StudioModel *pModel);
|
|
|
|
static ModelCache_t m_Cache[MAX_STUDIOMODELCACHE];
|
|
static int m_nItems;
|
|
};
|
|
|
|
|
|
// Calling these will monitor the filesystem for changes to model files and automatically
|
|
// incorporate changes to the models.
|
|
void InitStudioFileChangeWatcher();
|
|
void UpdateStudioFileChangeWatcher();
|
|
|
|
|
|
class StudioModel
|
|
{
|
|
public:
|
|
|
|
static bool Initialize( void );
|
|
static void Shutdown( void ); // garymcthack - need to call this.
|
|
|
|
StudioModel(void);
|
|
~StudioModel(void);
|
|
|
|
void FreeModel ();
|
|
bool LoadModel( const char *modelname );
|
|
bool PostLoadModel ( const char *modelname );
|
|
void DrawModel3D( CRender3D *pRender, const Color &color, float flAlpha, bool bWireframe);
|
|
void DrawModel2D( CRender2D *pRender, float flAlpha, bool bWireFrame);
|
|
void AdvanceFrame( float dt );
|
|
|
|
void ExtractBbox( Vector &mins, Vector &maxs );
|
|
void ExtractClippingBbox( Vector &mins, Vector &maxs );
|
|
void ExtractMovementBbox( Vector &mins, Vector &maxs );
|
|
void RotateBbox( Vector &Mins, Vector &Maxs, const QAngle &Angles );
|
|
|
|
void SetFrame( int nFrame );
|
|
int GetMaxFrame( void );
|
|
|
|
int SetSequence( int iSequence );
|
|
int GetSequence( void );
|
|
int GetSequenceCount( void );
|
|
void GetSequenceName( int nIndex, char *szName );
|
|
void GetSequenceInfo( float *pflFrameRate, float *pflGroundSpeed );
|
|
const char *GetModelName( void );
|
|
int SetBodygroup( int iGroup, int iValue );
|
|
int SetBodygroups( int iValue );
|
|
int SetSkin( int iValue );
|
|
void SetOrigin( float x, float y, float z );
|
|
void GetOrigin( float &x, float &y, float &z );
|
|
void SetOrigin( const Vector &v );
|
|
void GetOrigin( Vector &v );
|
|
void SetAngles( QAngle& pfAngles );
|
|
bool IsTranslucent();
|
|
|
|
private:
|
|
CStudioHdr *m_pStudioHdr;
|
|
CStudioHdr *GetStudioHdr() const;
|
|
studiohdr_t* GetStudioRenderHdr() const;
|
|
studiohwdata_t* GetHardwareData();
|
|
|
|
// entity settings
|
|
Vector m_origin;
|
|
QAngle m_angles;
|
|
int m_sequence; // sequence index
|
|
float m_cycle; // pos in animation cycle
|
|
int m_bodynum; // bodypart selection
|
|
int m_skinnum; // skin group selection
|
|
byte m_controller[MAXSTUDIOBONECTRLS]; // bone controllers
|
|
float m_poseParameter[MAXSTUDIOPOSEPARAM]; // animation blending
|
|
byte m_mouth; // mouth position
|
|
char* m_pModelName; // model file name
|
|
|
|
Vector *m_pPosePos;
|
|
QuaternionAligned *m_pPoseAng;
|
|
|
|
// internal data
|
|
MDLHandle_t m_MDLHandle;
|
|
mstudiomodel_t *m_pModel;
|
|
|
|
void SetUpBones ( bool bUpdatePose, matrix3x4a_t* pBoneToWorld );
|
|
void SetupModel ( int bodypart );
|
|
|
|
void LoadStudioRender( void );
|
|
|
|
bool LoadVVDFile( const char *modelname );
|
|
bool LoadVTXFile( const char *modelname );
|
|
};
|
|
|
|
|
|
extern Vector g_vright; // needs to be set to viewer's right in order for chrome to work
|
|
extern float g_lambert; // modifier for pseudo-hemispherical lighting
|
|
|
|
|
|
#endif // STUDIOMODEL_H
|