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.
140 lines
3.5 KiB
140 lines
3.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// A class representing a mesh |
|
// |
|
//============================================================================= |
|
|
|
#ifndef DMETESTMESH_H |
|
#define DMETESTMESH_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "movieobjects/dmeshape.h" |
|
#include "datacache/imdlcache.h" |
|
|
|
#include "mathlib/vector.h" |
|
#include <string> |
|
#include <vector> |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Forward declarations |
|
//----------------------------------------------------------------------------- |
|
class CDmeTransform; |
|
class IMorph; |
|
class IMaterial; |
|
struct SubdivMesh_t; |
|
class IMesh; |
|
class CDmeDrawSettings; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// First attempt at making a hacky SMD loader - clean this up later |
|
//----------------------------------------------------------------------------- |
|
struct skinning_info_t |
|
{ |
|
skinning_info_t() : index( -1 ), weight( 0.0f ) |
|
{ |
|
} |
|
skinning_info_t( int i, float w ) : index( i ), weight( w ) |
|
{ |
|
} |
|
int index; |
|
float weight; |
|
bool operator<( const skinning_info_t &info ) |
|
{ |
|
return weight < info.weight; |
|
} |
|
}; |
|
|
|
struct vertex_t |
|
{ |
|
Vector coord; |
|
Vector normal; |
|
Vector2D texcoord; |
|
std::vector< skinning_info_t > skinning; |
|
|
|
static float normal_tolerance; |
|
|
|
bool operator==( const vertex_t &vert ) |
|
{ |
|
return |
|
// skinning == vert.skinning && // TODO - the original studiomdl doesn't do this, but... |
|
coord == vert.coord && |
|
texcoord == vert.texcoord && |
|
DotProduct( normal, vert.normal ) > normal_tolerance; |
|
} |
|
}; |
|
|
|
struct submesh_t |
|
{ |
|
submesh_t( const std::string &texture_name ) : texname( texture_name ) |
|
{ |
|
} |
|
std::string texname; |
|
std::vector< int > indices; |
|
std::vector< vertex_t > vertices; |
|
std::vector< CDmeTransform* > bones; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// A class representing a mesh |
|
//----------------------------------------------------------------------------- |
|
class CDmeTestMesh : public CDmeShape |
|
{ |
|
DEFINE_ELEMENT( CDmeTestMesh, CDmeShape ); |
|
|
|
public: |
|
virtual void Draw( const matrix3x4_t& shapeToWorld, CDmeDrawSettings *pDrawSettings = NULL ); |
|
|
|
static CDmeTestMesh *ReadMeshFromSMD( char *pFilename, DmFileId_t fileid ); |
|
|
|
virtual void Resolve(); |
|
|
|
private: |
|
// Addref/Release the MDL handle |
|
void ReferenceMDL( const char *pMDLName ); |
|
void UnreferenceMDL(); |
|
|
|
// Returns a mask indicating which bones to set up |
|
int BoneMask( ); |
|
|
|
// Sets up the bones |
|
void SetUpBones( CDmeTransform *pTransform, int nMaxBoneCount, matrix3x4_t *pBoneToWorld ); |
|
|
|
// For testing vertex textures |
|
void LoadMorphData( const char *pMorphFile, int nVertexCount ); |
|
void UnloadMorphData(); |
|
void LoadModelMatrix( CDmeTransform *pTransform ); |
|
void DrawBox( CDmeTransform *pTransform ); |
|
|
|
// Draws a subdivided box |
|
void DrawSubdivMesh( const SubdivMesh_t &mesh ); |
|
void DrawSubdividedBox(); |
|
|
|
// Creates/destroys the subdiv control cage |
|
void CreateControlCage( ); |
|
void DestroyControlCage( ); |
|
|
|
// Creates/destroys the morphed mesh |
|
void CreateMesh( ); |
|
void DestroyMesh( ); |
|
|
|
MDLHandle_t m_MDLHandle; |
|
IMaterial *m_pMaterial; |
|
IMesh *m_pMesh; |
|
IMorph *m_pMorph; |
|
SubdivMesh_t *m_pControlCage; |
|
|
|
//----------------------------------------------------------------------------- |
|
// First attempt at making a hacky SMD loader - clean this up later |
|
//----------------------------------------------------------------------------- |
|
|
|
std::vector< submesh_t* > m_submeshes; |
|
std::vector< CDmeTransform* > m_bones; |
|
}; |
|
|
|
#endif // DMETESTMESH_H
|
|
|