summaryrefslogtreecommitdiff
path: root/public/movieobjects/dmetestmesh.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/movieobjects/dmetestmesh.h')
-rw-r--r--public/movieobjects/dmetestmesh.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/public/movieobjects/dmetestmesh.h b/public/movieobjects/dmetestmesh.h
new file mode 100644
index 0000000..a0278ac
--- /dev/null
+++ b/public/movieobjects/dmetestmesh.h
@@ -0,0 +1,140 @@
+//========= 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