summaryrefslogtreecommitdiff
path: root/studiorender/studiorendercontext.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 /studiorender/studiorendercontext.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'studiorender/studiorendercontext.h')
-rw-r--r--studiorender/studiorendercontext.h246
1 files changed, 246 insertions, 0 deletions
diff --git a/studiorender/studiorendercontext.h b/studiorender/studiorendercontext.h
new file mode 100644
index 0000000..c5e654b
--- /dev/null
+++ b/studiorender/studiorendercontext.h
@@ -0,0 +1,246 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//===========================================================================//
+
+#ifndef STUDIORENDERCONTEXT_H
+#define STUDIORENDERCONTEXT_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "istudiorender.h"
+#include "tier3/tier3.h"
+#include "studio.h"
+#include "tier1/delegates.h"
+#include "tier1/memstack.h"
+#include "studiorender.h"
+
+
+//-----------------------------------------------------------------------------
+// Foward declarations
+//-----------------------------------------------------------------------------
+class IStudioDataCache;
+class CStudioRender;
+
+
+//-----------------------------------------------------------------------------
+// Global interfaces
+//-----------------------------------------------------------------------------
+extern IStudioDataCache *g_pStudioDataCache;
+extern CStudioRender *g_pStudioRenderImp;
+
+IMaterial* GetModelSpecificDecalMaterial( IMaterial* pDecalMaterial );
+
+//-----------------------------------------------------------------------------
+// Internal config structure
+//-----------------------------------------------------------------------------
+struct StudioRenderConfigInternal_t : public StudioRenderConfig_t
+{
+ bool m_bSupportsVertexAndPixelShaders : 1;
+ bool m_bSupportsOverbright : 1;
+ bool m_bEnableHWMorph : 1;
+ bool m_bStatsMode : 1;
+};
+
+
+//-----------------------------------------------------------------------------
+// All the data needed to render a studiomodel
+//-----------------------------------------------------------------------------
+struct FlexWeights_t
+{
+ float *m_pFlexWeights;
+ float *m_pFlexDelayedWeights;
+};
+
+struct StudioRenderContext_t
+{
+ StudioRenderConfigInternal_t m_Config;
+ Vector m_ViewTarget;
+ Vector m_ViewOrigin;
+ Vector m_ViewRight;
+ Vector m_ViewUp;
+ Vector m_ViewPlaneNormal;
+ Vector4D m_LightBoxColors[6];
+ LightDesc_t m_LocalLights[MAXLOCALLIGHTS];
+ int m_NumLocalLights;
+ float m_ColorMod[3];
+ float m_AlphaMod;
+ IMaterial* m_pForcedMaterial;
+ OverrideType_t m_nForcedMaterialType;
+};
+
+
+//-----------------------------------------------------------------------------
+// Helper to queue up calls if necessary
+//-----------------------------------------------------------------------------
+#define QUEUE_STUDIORENDER_CALL( FuncName, ClassName, pObject, ... ) \
+ CMatRenderContextPtr pRenderContext( g_pMaterialSystem ); \
+ ICallQueue *pCallQueue = pRenderContext->GetCallQueue(); \
+ if ( !pCallQueue || studio_queue_mode.GetInt() == 0 ) \
+ { \
+ pObject->FuncName( __VA_ARGS__ ); \
+ } \
+ else \
+ { \
+ pCallQueue->QueueCall( pObject, &ClassName::FuncName, ##__VA_ARGS__ ); \
+ }
+
+#define QUEUE_STUDIORENDER_CALL_RC( FuncName, ClassName, pObject, pRenderContext, ... ) \
+ ICallQueue *pCallQueue = pRenderContext->GetCallQueue(); \
+ if ( !pCallQueue || studio_queue_mode.GetInt() == 0 ) \
+ { \
+ pObject->FuncName( __VA_ARGS__ ); \
+ } \
+ else \
+ { \
+ pCallQueue->QueueCall( pObject, &ClassName::FuncName, ##__VA_ARGS__ ); \
+ }
+
+
+//-----------------------------------------------------------------------------
+// Implementation of IStudioRender
+//-----------------------------------------------------------------------------
+class CStudioRenderContext : public CTier3AppSystem< IStudioRender >
+{
+ typedef CTier3AppSystem< IStudioRender > BaseClass;
+
+ // Methods of IAppSystem
+public:
+ virtual bool Connect( CreateInterfaceFn factory );
+ virtual void Disconnect();
+ virtual void *QueryInterface( const char *pInterfaceName );
+ virtual InitReturnVal_t Init();
+ virtual void Shutdown();
+
+ // Methods of IStudioRender
+public:
+ virtual void BeginFrame( void );
+ virtual void EndFrame( void );
+ virtual void Mat_Stub( IMaterialSystem *pMatSys );
+ virtual void UpdateConfig( const StudioRenderConfig_t& config );
+ virtual void GetCurrentConfig( StudioRenderConfig_t& config );
+ virtual bool LoadModel(studiohdr_t *pStudioHdr, void *pVtxData, studiohwdata_t *pHardwareData);
+ virtual void UnloadModel( studiohwdata_t *pHardwareData );
+ virtual void RefreshStudioHdr( studiohdr_t* pStudioHdr, studiohwdata_t* pHardwareData );
+ virtual void SetEyeViewTarget( const studiohdr_t *pStudioHdr, int nBodyIndex, const Vector& worldPosition );
+ virtual void SetAmbientLightColors( const Vector *pAmbientOnlyColors );
+ virtual void SetAmbientLightColors( const Vector4D *pAmbientOnlyColors );
+ virtual void SetLocalLights( int numLights, const LightDesc_t *pLights );
+ virtual int GetNumAmbientLightSamples();
+ virtual const Vector *GetAmbientLightDirections();
+ virtual void SetViewState( const Vector& viewOrigin, const Vector& viewRight, const Vector& viewUp, const Vector& viewPlaneNormal );
+ virtual int GetNumLODs( const studiohwdata_t &hardwareData ) const;
+ virtual float GetLODSwitchValue( const studiohwdata_t &hardwareData, int lod ) const;
+ virtual void SetLODSwitchValue( studiohwdata_t &hardwareData, int lod, float switchValue );
+ virtual void SetColorModulation( const float* pColor );
+ virtual void SetAlphaModulation( float alpha );
+ virtual void DrawModel( DrawModelResults_t *pResults, const DrawModelInfo_t& info, matrix3x4_t *pCustomBoneToWorld, float *pFlexWeights, float *pFlexDelayedWeights, const Vector& origin, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL );
+ virtual void DrawModelArray( const DrawModelInfo_t &drawInfo, int arrayCount, model_array_instance_t *pInstanceData, int instanceStride, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL );
+ virtual void DrawModelStaticProp( const DrawModelInfo_t& info, const matrix3x4_t &modelToWorld, int flags = STUDIORENDER_DRAW_ENTIRE_MODEL );
+ virtual void DrawStaticPropDecals( const DrawModelInfo_t &drawInfo, const matrix3x4_t &modelToWorld );
+ virtual void DrawStaticPropShadows( const DrawModelInfo_t &drawInfo, const matrix3x4_t &modelToWorld, int flags );
+ virtual void ForcedMaterialOverride( IMaterial *newMaterial, OverrideType_t nOverrideType = OVERRIDE_NORMAL );
+ DELEGATE_TO_OBJECT_1( StudioDecalHandle_t, CreateDecalList, studiohwdata_t *, g_pStudioRenderImp );
+ virtual void DestroyDecalList( StudioDecalHandle_t handle );
+ 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, int maxLODToDecal = ADDDECAL_TO_ALL_LODS );
+ virtual void ComputeLighting( const Vector* pAmbient, int lightCount, LightDesc_t* pLights, const Vector& pt, const Vector& normal, Vector& lighting );
+ virtual void ComputeLightingConstDirectional( const Vector* pAmbient, int lightCount, LightDesc_t* pLights, const Vector& pt, const Vector& normal, Vector& lighting, float flDirectionalAmount );
+ virtual void AddShadow( IMaterial* pMaterial, void* pProxyData, FlashlightState_t *pFlashlightState, VMatrix *pWorldToTexture, ITexture *pFlashlightDepthTexture );
+ virtual void ClearAllShadows();
+ virtual int ComputeModelLod( studiohwdata_t* pHardwareData, float flUnitSphereSize, float *pMetric = NULL );
+ virtual void GetPerfStats( DrawModelResults_t *pResults, const DrawModelInfo_t &info, CUtlBuffer *pSpewBuf = NULL ) const;
+ virtual void GetTriangles( const DrawModelInfo_t& info, matrix3x4_t *pBoneToWorld, GetTriangles_Output_t &out );
+ virtual int GetMaterialList( studiohdr_t *pStudioHdr, int count, IMaterial** ppMaterials );
+ virtual int GetMaterialListFromBodyAndSkin( MDLHandle_t studio, int nSkin, int nBody, int nCountOutputMaterials, IMaterial** ppOutputMaterials );
+ virtual matrix3x4_t* LockBoneMatrices( int nCount );
+ virtual void UnlockBoneMatrices();
+ virtual void LockFlexWeights( int nWeightCount, float **ppFlexWeights, float **ppFlexDelayedWeights = NULL );
+ virtual void UnlockFlexWeights();
+ virtual void GetMaterialOverride( IMaterial** ppOutForcedMaterial, OverrideType_t* pOutOverrideType );
+
+ // Other public methods
+public:
+ CStudioRenderContext();
+ virtual ~CStudioRenderContext();
+
+private:
+ // Load, unload materials
+ void LoadMaterials( studiohdr_t *phdr, OptimizedModel::FileHeader_t *, studioloddata_t &lodData, int lodID );
+
+ // Determines material flags
+ void ComputeMaterialFlags( studiohdr_t *phdr, studioloddata_t &lodData, IMaterial *pMaterial );
+
+ // Creates, destroys static meshes
+ void R_StudioCreateStaticMeshes( studiohdr_t *pStudioHdr, OptimizedModel::FileHeader_t* pVtxHdr,
+ studiohwdata_t *pStudioHWData, int lodID, int *pColorMeshID );
+ void R_StudioCreateSingleMesh( studiohdr_t *pStudioHdr, studioloddata_t *pStudioLodData,
+ mstudiomesh_t* pMesh, OptimizedModel::MeshHeader_t* pVtxMesh, int numBones,
+ studiomeshdata_t* pMeshData, int *pColorMeshID );
+ void R_StudioDestroyStaticMeshes( int numStudioMeshes, studiomeshdata_t **ppStudioMeshes );
+
+ // Determine if any strip groups shouldn't be morphed
+ void DetermineHWMorphing( mstudiomodel_t *pModel, OptimizedModel::ModelLODHeader_t *pVtxLOD );
+
+ // Count deltas affecting a particular stripgroup
+ int CountDeltaFlexedStripGroups( mstudiomodel_t *pModel, OptimizedModel::ModelLODHeader_t *pVtxLOD );
+
+ // Count vertices affected by deltas in a particular strip group
+ int CountFlexedVertices( mstudiomesh_t* pMesh, OptimizedModel::StripGroupHeader_t* pStripGroup );
+
+ // Builds morph data
+ void R_StudioBuildMorph( studiohdr_t *pStudioHdr, studiomeshgroup_t* pMeshGroup, mstudiomesh_t* pMesh,
+ OptimizedModel::StripGroupHeader_t *pStripGroup );
+
+ // Builds the decal bone remap for a particular mesh
+ void ComputeHWMorphDecalBoneRemap( studiohdr_t *pStudioHdr, OptimizedModel::FileHeader_t *pVtxHdr, studiohwdata_t *pStudioHWData, int nLOD );
+ void BuildDecalBoneMap( studiohdr_t *pStudioHdr, int *pUsedBones, int *pBoneRemap, int *pMaxBoneCount, mstudiomesh_t* pMesh, OptimizedModel::StripGroupHeader_t* pStripGroup );
+
+ // Helper methods used to construct static meshes
+ int GetNumBoneWeights( const OptimizedModel::StripGroupHeader_t *pGroup );
+ VertexFormat_t CalculateVertexFormat( const studiohdr_t *pStudioHdr, const studioloddata_t *pStudioLodData,
+ const mstudiomesh_t* pMesh, OptimizedModel::StripGroupHeader_t *pGroup, bool bIsHwSkinned );
+ bool MeshNeedsTangentSpace( studiohdr_t *pStudioHdr, studioloddata_t *pStudioLodData, mstudiomesh_t* pMesh );
+ void R_StudioBuildMeshGroup( const char *pModelName, bool bNeedsTangentSpace, studiomeshgroup_t* pMeshGroup,
+ OptimizedModel::StripGroupHeader_t *pStripGroup, mstudiomesh_t* pMesh,
+ studiohdr_t *pStudioHdr, VertexFormat_t vertexFormat );
+ void R_StudioBuildMeshStrips( studiomeshgroup_t* pMeshGroup,
+ OptimizedModel::StripGroupHeader_t *pStripGroup );
+ template <VertexCompressionType_t T> bool R_AddVertexToMesh( const char *pModelName, bool bNeedsTangentSpace, CMeshBuilder& meshBuilder,
+ OptimizedModel::Vertex_t* pVertex, mstudiomesh_t* pMesh, const mstudio_meshvertexdata_t *vertData, bool hwSkin );
+
+ // This will generate random flex data that has a specified # of non-zero values
+ void GenerateRandomFlexWeights( int nWeightCount, float* pWeights, float *pDelayedWeights );
+
+ // Computes LOD
+ int ComputeRenderLOD( IMatRenderContext *pRenderContext, const DrawModelInfo_t& info, const Vector &origin, float *pMetric );
+
+ // This invokes proxies of all materials that are queued to be rendered
+ void InvokeBindProxies( const DrawModelInfo_t &info );
+
+ // Did this matrix come from our allocator?
+ bool IsInternallyAllocated( const matrix3x4_t *pBoneToWorld );
+
+ // Did this flex weights come from our allocator?
+ bool IsInternallyAllocated( const float *pFlexWeights );
+
+private:
+ StudioRenderContext_t m_RC;
+
+ // Used by the lighting computation methods,
+ // this is only here to prevent constructors in lightpos_t from being repeatedly run
+ lightpos_t m_pLightPos[MAXLIGHTCOMPUTE];
+};
+
+
+//-----------------------------------------------------------------------------
+// Inline methods
+//-----------------------------------------------------------------------------
+inline int CStudioRenderContext::ComputeModelLod( studiohwdata_t *pHardwareData, float flUnitSphereSize, float *pMetric )
+{
+ return ComputeModelLODAndMetric( pHardwareData, flUnitSphereSize, pMetric );
+}
+
+
+#endif // STUDIORENDERCONTEXT_H