aboutsummaryrefslogtreecommitdiff
path: root/mp/src/public/istudiorender.h
diff options
context:
space:
mode:
authorJørgen P. Tjernø <[email protected]>2013-12-02 19:31:46 -0800
committerJørgen P. Tjernø <[email protected]>2013-12-02 19:46:31 -0800
commitf56bb35301836e56582a575a75864392a0177875 (patch)
treede61ddd39de3e7df52759711950b4c288592f0dc /mp/src/public/istudiorender.h
parentMark some more files as text. (diff)
downloadsource-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz
source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/public/istudiorender.h')
-rw-r--r--mp/src/public/istudiorender.h742
1 files changed, 371 insertions, 371 deletions
diff --git a/mp/src/public/istudiorender.h b/mp/src/public/istudiorender.h
index 64935bba..f0af6115 100644
--- a/mp/src/public/istudiorender.h
+++ b/mp/src/public/istudiorender.h
@@ -1,371 +1,371 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//===========================================================================//
-
-#ifndef ISTUDIORENDER_H
-#define ISTUDIORENDER_H
-#ifdef _WIN32
-#pragma once
-#endif
-
-#include "tier1/interface.h"
-#include "mathlib/vector.h"
-#include "mathlib/vector4d.h"
-#include "tier1/utlbuffer.h"
-#include "tier1/utlvector.h"
-#include "materialsystem/imaterial.h"
-#include "materialsystem/imaterialsystem.h"
-#include "appframework/IAppSystem.h"
-#include "datacache/imdlcache.h"
-#include "studio.h"
-
-
-//-----------------------------------------------------------------------------
-// forward declarations
-//-----------------------------------------------------------------------------
-struct studiohdr_t;
-struct studiomeshdata_t;
-class Vector;
-struct LightDesc_t;
-class IMaterial;
-struct studiohwdata_t;
-struct Ray_t;
-class Vector4D;
-class IMaterialSystem;
-struct matrix3x4_t;
-class IMesh;
-struct vertexFileHeader_t;
-struct FlashlightState_t;
-class VMatrix;
-namespace OptimizedModel { struct FileHeader_t; }
-class IPooledVBAllocator;
-
-// undone: what's the standard for function type naming?
-typedef void (*StudioRender_Printf_t)( PRINTF_FORMAT_STRING const char *fmt, ... );
-
-struct StudioRenderConfig_t
-{
- float fEyeShiftX; // eye X position
- float fEyeShiftY; // eye Y position
- float fEyeShiftZ; // eye Z position
- float fEyeSize; // adjustment to iris textures
- float fEyeGlintPixelWidthLODThreshold;
-
- int maxDecalsPerModel;
- int drawEntities;
- int skin;
- int fullbright;
-
- bool bEyeMove : 1; // look around
- bool bSoftwareSkin : 1;
- bool bNoHardware : 1;
- bool bNoSoftware : 1;
- bool bTeeth : 1;
- bool bEyes : 1;
- bool bFlex : 1;
- bool bWireframe : 1;
- bool bDrawNormals : 1;
- bool bDrawTangentFrame : 1;
- bool bDrawZBufferedWireframe : 1;
- bool bSoftwareLighting : 1;
- bool bShowEnvCubemapOnly : 1;
- bool bWireframeDecals : 1;
-
- // Reserved for future use
- int m_nReserved[4];
-};
-
-
-
-//-----------------------------------------------------------------------------
-// Studio render interface
-//-----------------------------------------------------------------------------
-DECLARE_POINTER_HANDLE( StudioDecalHandle_t );
-#define STUDIORENDER_DECAL_INVALID ( (StudioDecalHandle_t)0 )
-
-enum
-{
- ADDDECAL_TO_ALL_LODS = -1
-};
-
-
-//-----------------------------------------------------------------------------
-// DrawModel flags
-//-----------------------------------------------------------------------------
-enum
-{
- STUDIORENDER_DRAW_ENTIRE_MODEL = 0,
- STUDIORENDER_DRAW_OPAQUE_ONLY = 0x01,
- STUDIORENDER_DRAW_TRANSLUCENT_ONLY = 0x02,
- STUDIORENDER_DRAW_GROUP_MASK = 0x03,
-
- STUDIORENDER_DRAW_NO_FLEXES = 0x04,
- STUDIORENDER_DRAW_STATIC_LIGHTING = 0x08,
-
- STUDIORENDER_DRAW_ACCURATETIME = 0x10, // Use accurate timing when drawing the model.
- STUDIORENDER_DRAW_NO_SHADOWS = 0x20,
- STUDIORENDER_DRAW_GET_PERF_STATS = 0x40,
-
- STUDIORENDER_DRAW_WIREFRAME = 0x80,
-
- STUDIORENDER_DRAW_ITEM_BLINK = 0x100,
-
- STUDIORENDER_SHADOWDEPTHTEXTURE = 0x200,
-
- STUDIORENDER_SSAODEPTHTEXTURE = 0x1000,
-
- STUDIORENDER_GENERATE_STATS = 0x8000,
-};
-
-
-//-----------------------------------------------------------------------------
-// Standard model vertex formats
-//-----------------------------------------------------------------------------
-// FIXME: remove these (materials/shaders should drive vertex format). Need to
-// list required forcedmaterialoverrides in models/bsps (rather than
-// all models supporting all possible overrides, as they do currently).
-#define VERTEX_TEXCOORD0_2D ( ( (uint64) 2 ) << ( TEX_COORD_SIZE_BIT + ( 3*0 ) ) )
-enum MaterialVertexFormat_t
-{
- MATERIAL_VERTEX_FORMAT_MODEL_SKINNED = (VertexFormat_t) VERTEX_POSITION | VERTEX_COLOR | VERTEX_NORMAL | VERTEX_TEXCOORD0_2D | VERTEX_BONEWEIGHT(2) | VERTEX_BONE_INDEX | VERTEX_USERDATA_SIZE(4),
- MATERIAL_VERTEX_FORMAT_MODEL_SKINNED_DX7 = (VertexFormat_t) VERTEX_POSITION | VERTEX_COLOR | VERTEX_NORMAL | VERTEX_TEXCOORD0_2D | VERTEX_BONEWEIGHT(2) | VERTEX_BONE_INDEX,
- MATERIAL_VERTEX_FORMAT_MODEL = (VertexFormat_t) VERTEX_POSITION | VERTEX_COLOR | VERTEX_NORMAL | VERTEX_TEXCOORD0_2D | VERTEX_USERDATA_SIZE(4),
- MATERIAL_VERTEX_FORMAT_MODEL_DX7 = (VertexFormat_t) VERTEX_POSITION | VERTEX_COLOR | VERTEX_NORMAL | VERTEX_TEXCOORD0_2D,
- MATERIAL_VERTEX_FORMAT_COLOR = (VertexFormat_t) VERTEX_SPECULAR
-};
-
-
-//-----------------------------------------------------------------------------
-// What kind of material override is it?
-//-----------------------------------------------------------------------------
-enum OverrideType_t
-{
- OVERRIDE_NORMAL = 0,
- OVERRIDE_BUILD_SHADOWS,
- OVERRIDE_DEPTH_WRITE,
- OVERRIDE_SSAO_DEPTH_WRITE,
-};
-
-
-//-----------------------------------------------------------------------------
-// DrawModel info
-//-----------------------------------------------------------------------------
-
-// Special flag for studio models that have a compiled in shadow lod version
-// It's negative 2 since positive numbers == use a regular slot and -1 means
-// have studiorender compute a value instead
-enum
-{
- USESHADOWLOD = -2,
-};
-
-// beyond this number of materials, you won't get info back from DrawModel
-#define MAX_DRAW_MODEL_INFO_MATERIALS 8
-
-struct DrawModelResults_t
-{
- int m_ActualTriCount;
- int m_TextureMemoryBytes;
- int m_NumHardwareBones;
- int m_NumBatches;
- int m_NumMaterials;
- int m_nLODUsed;
- int m_flLODMetric;
- CFastTimer m_RenderTime;
- CUtlVectorFixed<IMaterial *,MAX_DRAW_MODEL_INFO_MATERIALS> m_Materials;
-};
-
-struct ColorMeshInfo_t
-{
- // A given color mesh can own a unique Mesh, or it can use a shared Mesh
- // (in which case it uses a sub-range defined by m_nVertOffset and m_nNumVerts)
- IMesh * m_pMesh;
- IPooledVBAllocator * m_pPooledVBAllocator;
- int m_nVertOffsetInBytes;
- int m_nNumVerts;
-};
-
-struct DrawModelInfo_t
-{
- studiohdr_t *m_pStudioHdr;
- studiohwdata_t *m_pHardwareData;
- StudioDecalHandle_t m_Decals;
- int m_Skin;
- int m_Body;
- int m_HitboxSet;
- void *m_pClientEntity;
- int m_Lod;
- ColorMeshInfo_t *m_pColorMeshes;
- bool m_bStaticLighting;
- Vector m_vecAmbientCube[6]; // ambient, and lights that aren't in locallight[]
- int m_nLocalLightCount;
- LightDesc_t m_LocalLightDescs[4];
-};
-
-struct GetTriangles_Vertex_t
-{
- Vector m_Position;
- Vector m_Normal;
- Vector4D m_TangentS;
- Vector2D m_TexCoord;
- Vector4D m_BoneWeight;
- int m_BoneIndex[4];
- int m_NumBones;
-};
-
-struct GetTriangles_MaterialBatch_t
-{
- IMaterial *m_pMaterial;
- CUtlVector<GetTriangles_Vertex_t> m_Verts;
- CUtlVector<int> m_TriListIndices;
-};
-
-struct GetTriangles_Output_t
-{
- CUtlVector<GetTriangles_MaterialBatch_t> m_MaterialBatches;
- matrix3x4_t m_PoseToWorld[MAXSTUDIOBONES];
-};
-
-
-struct model_array_instance_t
-{
- matrix3x4_t modelToWorld;
-
- // UNDONE: Per instance lighting values?
-};
-
-//-----------------------------------------------------------------------------
-// Cache Callback Function
-// implementation can either statically persist data (tools) or lru cache (engine) it.
-// caller returns base pointer to resident data.
-// code expectes data to be dynamic and invokes cache callback prior to iterative access.
-// virtualModel is member passed in via studiohdr_t and passed back for model identification.
-//-----------------------------------------------------------------------------
-#define STUDIO_DATA_CACHE_INTERFACE_VERSION "VStudioDataCache005"
-
-abstract_class IStudioDataCache : public IAppSystem
-{
-public:
- virtual bool VerifyHeaders( studiohdr_t *pStudioHdr ) = 0;
- virtual vertexFileHeader_t *CacheVertexData( studiohdr_t *pStudioHdr ) = 0;
-};
-
-
-//-----------------------------------------------------------------------------
-// Studio render interface
-//-----------------------------------------------------------------------------
-#define STUDIO_RENDER_INTERFACE_VERSION "VStudioRender025"
-
-abstract_class IStudioRender : public IAppSystem
-{
-public:
- virtual void BeginFrame( void ) = 0;
- virtual void EndFrame( void ) = 0;
-
- // Used for the mat_stub console command.
- virtual void Mat_Stub( IMaterialSystem *pMatSys ) = 0;
-
- // Updates the rendering configuration
- virtual void UpdateConfig( const StudioRenderConfig_t& config ) = 0;
- virtual void GetCurrentConfig( StudioRenderConfig_t& config ) = 0;
-
- // Load, unload model data
- virtual bool LoadModel( studiohdr_t *pStudioHdr, void *pVtxData, studiohwdata_t *pHardwareData ) = 0;
- virtual void UnloadModel( studiohwdata_t *pHardwareData ) = 0;
-
- // Refresh the studiohdr since it was lost...
- virtual void RefreshStudioHdr( studiohdr_t* pStudioHdr, studiohwdata_t* pHardwareData ) = 0;
-
- // This is needed to do eyeglint and calculate the correct texcoords for the eyes.
- virtual void SetEyeViewTarget( const studiohdr_t *pStudioHdr, int nBodyIndex, const Vector& worldPosition ) = 0;
-
- // Methods related to lighting state
- // NOTE: SetAmbientLightColors assumes that the arraysize is the same as
- // returned from GetNumAmbientLightSamples
- virtual int GetNumAmbientLightSamples() = 0;
- virtual const Vector *GetAmbientLightDirections() = 0;
- virtual void SetAmbientLightColors( const Vector4D *pAmbientOnlyColors ) = 0;
- virtual void SetAmbientLightColors( const Vector *pAmbientOnlyColors ) = 0;
- virtual void SetLocalLights( int numLights, const LightDesc_t *pLights ) = 0;
-
- // Sets information about the camera location + orientation
- virtual void SetViewState( const Vector& viewOrigin, const Vector& viewRight,
- const Vector& viewUp, const Vector& viewPlaneNormal ) = 0;
-
- // Allocates flex weights for use in rendering
- // NOTE: Pass in a non-null second parameter to lock delayed flex weights
- virtual void LockFlexWeights( int nWeightCount, float **ppFlexWeights, float **ppFlexDelayedWeights = NULL ) = 0;
- virtual void UnlockFlexWeights() = 0;
-
- // Used to allocate bone matrices to be used to pass into DrawModel
- virtual matrix3x4_t* LockBoneMatrices( int nBoneCount ) = 0;
- virtual void UnlockBoneMatrices() = 0;
-
- // LOD stuff
- virtual int GetNumLODs( const studiohwdata_t &hardwareData ) const = 0;
- virtual float GetLODSwitchValue( const studiohwdata_t &hardwareData, int lod ) const = 0;
- virtual void SetLODSwitchValue( studiohwdata_t &hardwareData, int lod, float switchValue ) = 0;
-
- // Sets the color/alpha modulation
- virtual void SetColorModulation( float const* pColor ) = 0;
- virtual void SetAlphaModulation( float flAlpha ) = 0;
-
- // Draws the model
- virtual void DrawModel( DrawModelResults_t *pResults, const DrawModelInfo_t& info,
- matrix3x4_t *pBoneToWorld, float *pFlexWeights, float *pFlexDelayedWeights, const Vector &modelOrigin, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL ) = 0;
-
- // Methods related to static prop rendering
- virtual void DrawModelStaticProp( const DrawModelInfo_t& drawInfo, const matrix3x4_t &modelToWorld, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL ) = 0;
- virtual void DrawStaticPropDecals( const DrawModelInfo_t &drawInfo, const matrix3x4_t &modelToWorld ) = 0;
- virtual void DrawStaticPropShadows( const DrawModelInfo_t &drawInfo, const matrix3x4_t &modelToWorld, int flags ) = 0;
-
- // Causes a material to be used instead of the materials the model was compiled with
- virtual void ForcedMaterialOverride( IMaterial *newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL ) = 0;
-
- // Create, destroy list of decals for a particular model
- virtual StudioDecalHandle_t CreateDecalList( studiohwdata_t *pHardwareData ) = 0;
- virtual void DestroyDecalList( StudioDecalHandle_t handle ) = 0;
-
- // Add decals to a decal list by doing a planar projection along the ray
- // The BoneToWorld matrices must be set before this is called
- virtual void AddDecal( StudioDecalHandle_t handle, studiohdr_t *pStudioHdr, matrix3x4_t *pBoneToWorld,
- const Ray_t & ray, const Vector& decalUp, IMaterial* pDecalMaterial, float radius, int body, bool noPokethru = false, int maxLODToDecal = ADDDECAL_TO_ALL_LODS ) = 0;
-
- // Compute the lighting at a point and normal
- virtual void ComputeLighting( const Vector* pAmbient, int lightCount,
- LightDesc_t* pLights, const Vector& pt, const Vector& normal, Vector& lighting ) = 0;
-
- // Compute the lighting at a point, constant directional component is passed
- // as flDirectionalAmount
- virtual void ComputeLightingConstDirectional( const Vector* pAmbient, int lightCount,
- LightDesc_t* pLights, const Vector& pt, const Vector& normal, Vector& lighting, float flDirectionalAmount ) = 0;
-
- // Shadow state (affects the models as they are rendered)
- virtual void AddShadow( IMaterial* pMaterial, void* pProxyData, FlashlightState_t *m_pFlashlightState = NULL, VMatrix *pWorldToTexture = NULL, ITexture *pFlashlightDepthTexture = NULL ) = 0;
- virtual void ClearAllShadows() = 0;
-
- // Gets the model LOD; pass in the screen size in pixels of a sphere
- // of radius 1 that has the same origin as the model to get the LOD out...
- virtual int ComputeModelLod( studiohwdata_t* pHardwareData, float unitSphereSize, float *pMetric = NULL ) = 0;
-
- // Return a number that is usable for budgets, etc.
- // Things that we care about:
- // 1) effective triangle count (factors in batch sizes, state changes, etc)
- // 2) texture memory usage
- // Get Triangles returns the LOD used
- virtual void GetPerfStats( DrawModelResults_t *pResults, const DrawModelInfo_t &info, CUtlBuffer *pSpewBuf = NULL ) const = 0;
- virtual void GetTriangles( const DrawModelInfo_t& info, matrix3x4_t *pBoneToWorld, GetTriangles_Output_t &out ) = 0;
-
- // Returns materials used by a particular model
- virtual int GetMaterialList( studiohdr_t *pStudioHdr, int count, IMaterial** ppMaterials ) = 0;
- virtual int GetMaterialListFromBodyAndSkin( MDLHandle_t studio, int nSkin, int nBody, int nCountOutputMaterials, IMaterial** ppOutputMaterials ) = 0;
- // draw an array of models with the same state
- virtual void DrawModelArray( const DrawModelInfo_t &drawInfo, int arrayCount, model_array_instance_t *pInstanceData, int instanceStride, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL ) = 0;
-};
-
-extern IStudioRender *g_pStudioRender;
-
-#endif // ISTUDIORENDER_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//===========================================================================//
+
+#ifndef ISTUDIORENDER_H
+#define ISTUDIORENDER_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "tier1/interface.h"
+#include "mathlib/vector.h"
+#include "mathlib/vector4d.h"
+#include "tier1/utlbuffer.h"
+#include "tier1/utlvector.h"
+#include "materialsystem/imaterial.h"
+#include "materialsystem/imaterialsystem.h"
+#include "appframework/IAppSystem.h"
+#include "datacache/imdlcache.h"
+#include "studio.h"
+
+
+//-----------------------------------------------------------------------------
+// forward declarations
+//-----------------------------------------------------------------------------
+struct studiohdr_t;
+struct studiomeshdata_t;
+class Vector;
+struct LightDesc_t;
+class IMaterial;
+struct studiohwdata_t;
+struct Ray_t;
+class Vector4D;
+class IMaterialSystem;
+struct matrix3x4_t;
+class IMesh;
+struct vertexFileHeader_t;
+struct FlashlightState_t;
+class VMatrix;
+namespace OptimizedModel { struct FileHeader_t; }
+class IPooledVBAllocator;
+
+// undone: what's the standard for function type naming?
+typedef void (*StudioRender_Printf_t)( PRINTF_FORMAT_STRING const char *fmt, ... );
+
+struct StudioRenderConfig_t
+{
+ float fEyeShiftX; // eye X position
+ float fEyeShiftY; // eye Y position
+ float fEyeShiftZ; // eye Z position
+ float fEyeSize; // adjustment to iris textures
+ float fEyeGlintPixelWidthLODThreshold;
+
+ int maxDecalsPerModel;
+ int drawEntities;
+ int skin;
+ int fullbright;
+
+ bool bEyeMove : 1; // look around
+ bool bSoftwareSkin : 1;
+ bool bNoHardware : 1;
+ bool bNoSoftware : 1;
+ bool bTeeth : 1;
+ bool bEyes : 1;
+ bool bFlex : 1;
+ bool bWireframe : 1;
+ bool bDrawNormals : 1;
+ bool bDrawTangentFrame : 1;
+ bool bDrawZBufferedWireframe : 1;
+ bool bSoftwareLighting : 1;
+ bool bShowEnvCubemapOnly : 1;
+ bool bWireframeDecals : 1;
+
+ // Reserved for future use
+ int m_nReserved[4];
+};
+
+
+
+//-----------------------------------------------------------------------------
+// Studio render interface
+//-----------------------------------------------------------------------------
+DECLARE_POINTER_HANDLE( StudioDecalHandle_t );
+#define STUDIORENDER_DECAL_INVALID ( (StudioDecalHandle_t)0 )
+
+enum
+{
+ ADDDECAL_TO_ALL_LODS = -1
+};
+
+
+//-----------------------------------------------------------------------------
+// DrawModel flags
+//-----------------------------------------------------------------------------
+enum
+{
+ STUDIORENDER_DRAW_ENTIRE_MODEL = 0,
+ STUDIORENDER_DRAW_OPAQUE_ONLY = 0x01,
+ STUDIORENDER_DRAW_TRANSLUCENT_ONLY = 0x02,
+ STUDIORENDER_DRAW_GROUP_MASK = 0x03,
+
+ STUDIORENDER_DRAW_NO_FLEXES = 0x04,
+ STUDIORENDER_DRAW_STATIC_LIGHTING = 0x08,
+
+ STUDIORENDER_DRAW_ACCURATETIME = 0x10, // Use accurate timing when drawing the model.
+ STUDIORENDER_DRAW_NO_SHADOWS = 0x20,
+ STUDIORENDER_DRAW_GET_PERF_STATS = 0x40,
+
+ STUDIORENDER_DRAW_WIREFRAME = 0x80,
+
+ STUDIORENDER_DRAW_ITEM_BLINK = 0x100,
+
+ STUDIORENDER_SHADOWDEPTHTEXTURE = 0x200,
+
+ STUDIORENDER_SSAODEPTHTEXTURE = 0x1000,
+
+ STUDIORENDER_GENERATE_STATS = 0x8000,
+};
+
+
+//-----------------------------------------------------------------------------
+// Standard model vertex formats
+//-----------------------------------------------------------------------------
+// FIXME: remove these (materials/shaders should drive vertex format). Need to
+// list required forcedmaterialoverrides in models/bsps (rather than
+// all models supporting all possible overrides, as they do currently).
+#define VERTEX_TEXCOORD0_2D ( ( (uint64) 2 ) << ( TEX_COORD_SIZE_BIT + ( 3*0 ) ) )
+enum MaterialVertexFormat_t
+{
+ MATERIAL_VERTEX_FORMAT_MODEL_SKINNED = (VertexFormat_t) VERTEX_POSITION | VERTEX_COLOR | VERTEX_NORMAL | VERTEX_TEXCOORD0_2D | VERTEX_BONEWEIGHT(2) | VERTEX_BONE_INDEX | VERTEX_USERDATA_SIZE(4),
+ MATERIAL_VERTEX_FORMAT_MODEL_SKINNED_DX7 = (VertexFormat_t) VERTEX_POSITION | VERTEX_COLOR | VERTEX_NORMAL | VERTEX_TEXCOORD0_2D | VERTEX_BONEWEIGHT(2) | VERTEX_BONE_INDEX,
+ MATERIAL_VERTEX_FORMAT_MODEL = (VertexFormat_t) VERTEX_POSITION | VERTEX_COLOR | VERTEX_NORMAL | VERTEX_TEXCOORD0_2D | VERTEX_USERDATA_SIZE(4),
+ MATERIAL_VERTEX_FORMAT_MODEL_DX7 = (VertexFormat_t) VERTEX_POSITION | VERTEX_COLOR | VERTEX_NORMAL | VERTEX_TEXCOORD0_2D,
+ MATERIAL_VERTEX_FORMAT_COLOR = (VertexFormat_t) VERTEX_SPECULAR
+};
+
+
+//-----------------------------------------------------------------------------
+// What kind of material override is it?
+//-----------------------------------------------------------------------------
+enum OverrideType_t
+{
+ OVERRIDE_NORMAL = 0,
+ OVERRIDE_BUILD_SHADOWS,
+ OVERRIDE_DEPTH_WRITE,
+ OVERRIDE_SSAO_DEPTH_WRITE,
+};
+
+
+//-----------------------------------------------------------------------------
+// DrawModel info
+//-----------------------------------------------------------------------------
+
+// Special flag for studio models that have a compiled in shadow lod version
+// It's negative 2 since positive numbers == use a regular slot and -1 means
+// have studiorender compute a value instead
+enum
+{
+ USESHADOWLOD = -2,
+};
+
+// beyond this number of materials, you won't get info back from DrawModel
+#define MAX_DRAW_MODEL_INFO_MATERIALS 8
+
+struct DrawModelResults_t
+{
+ int m_ActualTriCount;
+ int m_TextureMemoryBytes;
+ int m_NumHardwareBones;
+ int m_NumBatches;
+ int m_NumMaterials;
+ int m_nLODUsed;
+ int m_flLODMetric;
+ CFastTimer m_RenderTime;
+ CUtlVectorFixed<IMaterial *,MAX_DRAW_MODEL_INFO_MATERIALS> m_Materials;
+};
+
+struct ColorMeshInfo_t
+{
+ // A given color mesh can own a unique Mesh, or it can use a shared Mesh
+ // (in which case it uses a sub-range defined by m_nVertOffset and m_nNumVerts)
+ IMesh * m_pMesh;
+ IPooledVBAllocator * m_pPooledVBAllocator;
+ int m_nVertOffsetInBytes;
+ int m_nNumVerts;
+};
+
+struct DrawModelInfo_t
+{
+ studiohdr_t *m_pStudioHdr;
+ studiohwdata_t *m_pHardwareData;
+ StudioDecalHandle_t m_Decals;
+ int m_Skin;
+ int m_Body;
+ int m_HitboxSet;
+ void *m_pClientEntity;
+ int m_Lod;
+ ColorMeshInfo_t *m_pColorMeshes;
+ bool m_bStaticLighting;
+ Vector m_vecAmbientCube[6]; // ambient, and lights that aren't in locallight[]
+ int m_nLocalLightCount;
+ LightDesc_t m_LocalLightDescs[4];
+};
+
+struct GetTriangles_Vertex_t
+{
+ Vector m_Position;
+ Vector m_Normal;
+ Vector4D m_TangentS;
+ Vector2D m_TexCoord;
+ Vector4D m_BoneWeight;
+ int m_BoneIndex[4];
+ int m_NumBones;
+};
+
+struct GetTriangles_MaterialBatch_t
+{
+ IMaterial *m_pMaterial;
+ CUtlVector<GetTriangles_Vertex_t> m_Verts;
+ CUtlVector<int> m_TriListIndices;
+};
+
+struct GetTriangles_Output_t
+{
+ CUtlVector<GetTriangles_MaterialBatch_t> m_MaterialBatches;
+ matrix3x4_t m_PoseToWorld[MAXSTUDIOBONES];
+};
+
+
+struct model_array_instance_t
+{
+ matrix3x4_t modelToWorld;
+
+ // UNDONE: Per instance lighting values?
+};
+
+//-----------------------------------------------------------------------------
+// Cache Callback Function
+// implementation can either statically persist data (tools) or lru cache (engine) it.
+// caller returns base pointer to resident data.
+// code expectes data to be dynamic and invokes cache callback prior to iterative access.
+// virtualModel is member passed in via studiohdr_t and passed back for model identification.
+//-----------------------------------------------------------------------------
+#define STUDIO_DATA_CACHE_INTERFACE_VERSION "VStudioDataCache005"
+
+abstract_class IStudioDataCache : public IAppSystem
+{
+public:
+ virtual bool VerifyHeaders( studiohdr_t *pStudioHdr ) = 0;
+ virtual vertexFileHeader_t *CacheVertexData( studiohdr_t *pStudioHdr ) = 0;
+};
+
+
+//-----------------------------------------------------------------------------
+// Studio render interface
+//-----------------------------------------------------------------------------
+#define STUDIO_RENDER_INTERFACE_VERSION "VStudioRender025"
+
+abstract_class IStudioRender : public IAppSystem
+{
+public:
+ virtual void BeginFrame( void ) = 0;
+ virtual void EndFrame( void ) = 0;
+
+ // Used for the mat_stub console command.
+ virtual void Mat_Stub( IMaterialSystem *pMatSys ) = 0;
+
+ // Updates the rendering configuration
+ virtual void UpdateConfig( const StudioRenderConfig_t& config ) = 0;
+ virtual void GetCurrentConfig( StudioRenderConfig_t& config ) = 0;
+
+ // Load, unload model data
+ virtual bool LoadModel( studiohdr_t *pStudioHdr, void *pVtxData, studiohwdata_t *pHardwareData ) = 0;
+ virtual void UnloadModel( studiohwdata_t *pHardwareData ) = 0;
+
+ // Refresh the studiohdr since it was lost...
+ virtual void RefreshStudioHdr( studiohdr_t* pStudioHdr, studiohwdata_t* pHardwareData ) = 0;
+
+ // This is needed to do eyeglint and calculate the correct texcoords for the eyes.
+ virtual void SetEyeViewTarget( const studiohdr_t *pStudioHdr, int nBodyIndex, const Vector& worldPosition ) = 0;
+
+ // Methods related to lighting state
+ // NOTE: SetAmbientLightColors assumes that the arraysize is the same as
+ // returned from GetNumAmbientLightSamples
+ virtual int GetNumAmbientLightSamples() = 0;
+ virtual const Vector *GetAmbientLightDirections() = 0;
+ virtual void SetAmbientLightColors( const Vector4D *pAmbientOnlyColors ) = 0;
+ virtual void SetAmbientLightColors( const Vector *pAmbientOnlyColors ) = 0;
+ virtual void SetLocalLights( int numLights, const LightDesc_t *pLights ) = 0;
+
+ // Sets information about the camera location + orientation
+ virtual void SetViewState( const Vector& viewOrigin, const Vector& viewRight,
+ const Vector& viewUp, const Vector& viewPlaneNormal ) = 0;
+
+ // Allocates flex weights for use in rendering
+ // NOTE: Pass in a non-null second parameter to lock delayed flex weights
+ virtual void LockFlexWeights( int nWeightCount, float **ppFlexWeights, float **ppFlexDelayedWeights = NULL ) = 0;
+ virtual void UnlockFlexWeights() = 0;
+
+ // Used to allocate bone matrices to be used to pass into DrawModel
+ virtual matrix3x4_t* LockBoneMatrices( int nBoneCount ) = 0;
+ virtual void UnlockBoneMatrices() = 0;
+
+ // LOD stuff
+ virtual int GetNumLODs( const studiohwdata_t &hardwareData ) const = 0;
+ virtual float GetLODSwitchValue( const studiohwdata_t &hardwareData, int lod ) const = 0;
+ virtual void SetLODSwitchValue( studiohwdata_t &hardwareData, int lod, float switchValue ) = 0;
+
+ // Sets the color/alpha modulation
+ virtual void SetColorModulation( float const* pColor ) = 0;
+ virtual void SetAlphaModulation( float flAlpha ) = 0;
+
+ // Draws the model
+ virtual void DrawModel( DrawModelResults_t *pResults, const DrawModelInfo_t& info,
+ matrix3x4_t *pBoneToWorld, float *pFlexWeights, float *pFlexDelayedWeights, const Vector &modelOrigin, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL ) = 0;
+
+ // Methods related to static prop rendering
+ virtual void DrawModelStaticProp( const DrawModelInfo_t& drawInfo, const matrix3x4_t &modelToWorld, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL ) = 0;
+ virtual void DrawStaticPropDecals( const DrawModelInfo_t &drawInfo, const matrix3x4_t &modelToWorld ) = 0;
+ virtual void DrawStaticPropShadows( const DrawModelInfo_t &drawInfo, const matrix3x4_t &modelToWorld, int flags ) = 0;
+
+ // Causes a material to be used instead of the materials the model was compiled with
+ virtual void ForcedMaterialOverride( IMaterial *newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL ) = 0;
+
+ // Create, destroy list of decals for a particular model
+ virtual StudioDecalHandle_t CreateDecalList( studiohwdata_t *pHardwareData ) = 0;
+ virtual void DestroyDecalList( StudioDecalHandle_t handle ) = 0;
+
+ // Add decals to a decal list by doing a planar projection along the ray
+ // The BoneToWorld matrices must be set before this is called
+ virtual void AddDecal( StudioDecalHandle_t handle, studiohdr_t *pStudioHdr, matrix3x4_t *pBoneToWorld,
+ const Ray_t & ray, const Vector& decalUp, IMaterial* pDecalMaterial, float radius, int body, bool noPokethru = false, int maxLODToDecal = ADDDECAL_TO_ALL_LODS ) = 0;
+
+ // Compute the lighting at a point and normal
+ virtual void ComputeLighting( const Vector* pAmbient, int lightCount,
+ LightDesc_t* pLights, const Vector& pt, const Vector& normal, Vector& lighting ) = 0;
+
+ // Compute the lighting at a point, constant directional component is passed
+ // as flDirectionalAmount
+ virtual void ComputeLightingConstDirectional( const Vector* pAmbient, int lightCount,
+ LightDesc_t* pLights, const Vector& pt, const Vector& normal, Vector& lighting, float flDirectionalAmount ) = 0;
+
+ // Shadow state (affects the models as they are rendered)
+ virtual void AddShadow( IMaterial* pMaterial, void* pProxyData, FlashlightState_t *m_pFlashlightState = NULL, VMatrix *pWorldToTexture = NULL, ITexture *pFlashlightDepthTexture = NULL ) = 0;
+ virtual void ClearAllShadows() = 0;
+
+ // Gets the model LOD; pass in the screen size in pixels of a sphere
+ // of radius 1 that has the same origin as the model to get the LOD out...
+ virtual int ComputeModelLod( studiohwdata_t* pHardwareData, float unitSphereSize, float *pMetric = NULL ) = 0;
+
+ // Return a number that is usable for budgets, etc.
+ // Things that we care about:
+ // 1) effective triangle count (factors in batch sizes, state changes, etc)
+ // 2) texture memory usage
+ // Get Triangles returns the LOD used
+ virtual void GetPerfStats( DrawModelResults_t *pResults, const DrawModelInfo_t &info, CUtlBuffer *pSpewBuf = NULL ) const = 0;
+ virtual void GetTriangles( const DrawModelInfo_t& info, matrix3x4_t *pBoneToWorld, GetTriangles_Output_t &out ) = 0;
+
+ // Returns materials used by a particular model
+ virtual int GetMaterialList( studiohdr_t *pStudioHdr, int count, IMaterial** ppMaterials ) = 0;
+ virtual int GetMaterialListFromBodyAndSkin( MDLHandle_t studio, int nSkin, int nBody, int nCountOutputMaterials, IMaterial** ppOutputMaterials ) = 0;
+ // draw an array of models with the same state
+ virtual void DrawModelArray( const DrawModelInfo_t &drawInfo, int arrayCount, model_array_instance_t *pInstanceData, int instanceStride, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL ) = 0;
+};
+
+extern IStudioRender *g_pStudioRender;
+
+#endif // ISTUDIORENDER_H