summaryrefslogtreecommitdiff
path: root/public/optimize.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /public/optimize.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'public/optimize.h')
-rw-r--r--public/optimize.h257
1 files changed, 257 insertions, 0 deletions
diff --git a/public/optimize.h b/public/optimize.h
new file mode 100644
index 0000000..4a14bf3
--- /dev/null
+++ b/public/optimize.h
@@ -0,0 +1,257 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef OPTIMIZE_H
+#define OPTIMIZE_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "studio.h"
+
+
+// NOTE: You can change this without affecting the vtx file format.
+#define MAX_NUM_BONES_PER_TRI ( MAX_NUM_BONES_PER_VERT * 3 )
+#define MAX_NUM_BONES_PER_STRIP 512
+
+#define OPTIMIZED_MODEL_FILE_VERSION 7
+
+extern bool g_bDumpGLViewFiles;
+
+struct s_bodypart_t;
+
+namespace OptimizedModel
+{
+
+#pragma pack(1)
+
+struct BoneStateChangeHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ int hardwareID;
+ int newBoneID;
+};
+
+struct Vertex_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ // these index into the mesh's vert[origMeshVertID]'s bones
+ unsigned char boneWeightIndex[MAX_NUM_BONES_PER_VERT];
+ unsigned char numBones;
+
+ unsigned short origMeshVertID;
+
+ // for sw skinned verts, these are indices into the global list of bones
+ // for hw skinned verts, these are hardware bone indices
+ char boneID[MAX_NUM_BONES_PER_VERT];
+};
+
+enum StripHeaderFlags_t {
+ STRIP_IS_TRILIST = 0x01,
+ STRIP_IS_TRISTRIP = 0x02
+};
+
+// a strip is a piece of a stripgroup that is divided by bones
+// (and potentially tristrips if we remove some degenerates.)
+struct StripHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ // indexOffset offsets into the mesh's index array.
+ int numIndices;
+ int indexOffset;
+
+ // vertexOffset offsets into the mesh's vert array.
+ int numVerts;
+ int vertOffset;
+
+ // use this to enable/disable skinning.
+ // May decide (in optimize.cpp) to put all with 1 bone in a different strip
+ // than those that need skinning.
+ short numBones;
+
+ unsigned char flags;
+
+ int numBoneStateChanges;
+ int boneStateChangeOffset;
+ inline BoneStateChangeHeader_t *pBoneStateChange( int i ) const
+ {
+ return (BoneStateChangeHeader_t *)(((byte *)this) + boneStateChangeOffset) + i;
+ };
+};
+
+enum StripGroupFlags_t
+{
+ STRIPGROUP_IS_FLEXED = 0x01,
+ STRIPGROUP_IS_HWSKINNED = 0x02,
+ STRIPGROUP_IS_DELTA_FLEXED = 0x04,
+ STRIPGROUP_SUPPRESS_HW_MORPH = 0x08, // NOTE: This is a temporary flag used at run time.
+};
+
+// a locking group
+// a single vertex buffer
+// a single index buffer
+struct StripGroupHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ // These are the arrays of all verts and indices for this mesh. strips index into this.
+ int numVerts;
+ int vertOffset;
+ inline Vertex_t *pVertex( int i ) const
+ {
+ return (Vertex_t *)(((byte *)this) + vertOffset) + i;
+ };
+
+ int numIndices;
+ int indexOffset;
+ inline unsigned short *pIndex( int i ) const
+ {
+ return (unsigned short *)(((byte *)this) + indexOffset) + i;
+ };
+
+ int numStrips;
+ int stripOffset;
+ inline StripHeader_t *pStrip( int i ) const
+ {
+ return (StripHeader_t *)(((byte *)this) + stripOffset) + i;
+ };
+
+ unsigned char flags;
+};
+
+enum MeshFlags_t {
+ // these are both material properties, and a mesh has a single material.
+ MESH_IS_TEETH = 0x01,
+ MESH_IS_EYES = 0x02
+};
+
+// a collection of locking groups:
+// up to 4:
+// non-flexed, hardware skinned
+// flexed, hardware skinned
+// non-flexed, software skinned
+// flexed, software skinned
+//
+// A mesh has a material associated with it.
+struct MeshHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ int numStripGroups;
+ int stripGroupHeaderOffset;
+ inline StripGroupHeader_t *pStripGroup( int i ) const
+ {
+ StripGroupHeader_t *pDebug = (StripGroupHeader_t *)(((byte *)this) + stripGroupHeaderOffset) + i;
+ return pDebug;
+ };
+ unsigned char flags;
+};
+
+struct ModelLODHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ int numMeshes;
+ int meshOffset;
+ float switchPoint;
+ inline MeshHeader_t *pMesh( int i ) const
+ {
+ MeshHeader_t *pDebug = (MeshHeader_t *)(((byte *)this) + meshOffset) + i;
+ return pDebug;
+ };
+};
+
+// This maps one to one with models in the mdl file.
+// There are a bunch of model LODs stored inside potentially due to the qc $lod command
+struct ModelHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ int numLODs; // garymcthack - this is also specified in FileHeader_t
+ int lodOffset;
+ inline ModelLODHeader_t *pLOD( int i ) const
+ {
+ ModelLODHeader_t *pDebug = ( ModelLODHeader_t *)(((byte *)this) + lodOffset) + i;
+ return pDebug;
+ };
+};
+
+struct BodyPartHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ int numModels;
+ int modelOffset;
+ inline ModelHeader_t *pModel( int i ) const
+ {
+ ModelHeader_t *pDebug = (ModelHeader_t *)(((byte *)this) + modelOffset) + i;
+ return pDebug;
+ };
+};
+
+struct MaterialReplacementHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ short materialID;
+ int replacementMaterialNameOffset;
+ inline const char *pMaterialReplacementName( void )
+ {
+ const char *pDebug = (const char *)(((byte *)this) + replacementMaterialNameOffset);
+ return pDebug;
+ }
+};
+
+struct MaterialReplacementListHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ int numReplacements;
+ int replacementOffset;
+ inline MaterialReplacementHeader_t *pMaterialReplacement( int i ) const
+ {
+ MaterialReplacementHeader_t *pDebug = ( MaterialReplacementHeader_t *)(((byte *)this) + replacementOffset) + i;
+ return pDebug;
+ }
+};
+
+struct FileHeader_t
+{
+ DECLARE_BYTESWAP_DATADESC();
+ // file version as defined by OPTIMIZED_MODEL_FILE_VERSION
+ int version;
+
+ // hardware params that affect how the model is to be optimized.
+ int vertCacheSize;
+ unsigned short maxBonesPerStrip;
+ unsigned short maxBonesPerTri;
+ int maxBonesPerVert;
+
+ // must match checkSum in the .mdl
+ int checkSum;
+
+ int numLODs; // garymcthack - this is also specified in ModelHeader_t and should match
+
+ // one of these for each LOD
+ int materialReplacementListOffset;
+ MaterialReplacementListHeader_t *pMaterialReplacementList( int lodID ) const
+ {
+ MaterialReplacementListHeader_t *pDebug =
+ (MaterialReplacementListHeader_t *)(((byte *)this) + materialReplacementListOffset) + lodID;
+ return pDebug;
+ }
+
+ int numBodyParts;
+ int bodyPartOffset;
+ inline BodyPartHeader_t *pBodyPart( int i ) const
+ {
+ BodyPartHeader_t *pDebug = (BodyPartHeader_t *)(((byte *)this) + bodyPartOffset) + i;
+ return pDebug;
+ };
+};
+
+#pragma pack()
+
+void WriteOptimizedFiles( studiohdr_t *phdr, s_bodypart_t *pSrcBodyParts );
+
+}; // namespace OptimizedModel
+
+#endif // OPTIMIZE_H