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.
164 lines
10 KiB
164 lines
10 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef CMATERIAL_QUEUEFRIENDLY_H |
|
#define CMATERIAL_QUEUEFRIENDLY_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "imaterialinternal.h" |
|
|
|
class CMaterial_QueueFriendly : public IMaterialInternal //wraps a CMaterial with queue friendly functions for game/engine code. materialsystem/shaderapi code should use CMaterial directly. |
|
{ |
|
public: |
|
CMaterial_QueueFriendly() : m_pRealTimeVersion(NULL) {} |
|
|
|
virtual const char * GetName() const; |
|
virtual const char * GetTextureGroupName() const; |
|
virtual PreviewImageRetVal_t GetPreviewImageProperties( int *width, int *height, ImageFormat *imageFormat, bool* isTranslucent ) const; |
|
virtual PreviewImageRetVal_t GetPreviewImage( unsigned char *data, int width, int height, ImageFormat imageFormat ) const; |
|
|
|
virtual int GetMappingWidth( ); |
|
virtual int GetMappingHeight( ); |
|
virtual int GetNumAnimationFrames( ); |
|
virtual bool InMaterialPage( void ); |
|
virtual void GetMaterialOffset( float *pOffset ); |
|
virtual void GetMaterialScale( float *pScale ); |
|
virtual IMaterial *GetMaterialPage( void ); |
|
virtual void IncrementReferenceCount( void ); |
|
virtual int GetEnumerationID( void ) const; |
|
virtual bool HasProxy( void ) const; |
|
virtual void GetReflectivity( Vector& reflect ); |
|
virtual bool GetPropertyFlag( MaterialPropertyTypes_t type ); |
|
virtual bool IsTwoSided(); |
|
virtual int ShaderParamCount() const; |
|
virtual bool IsErrorMaterial() const; //should probably return the realtime error material instead of this wrapper for it |
|
virtual bool IsSpriteCard(); //lets just assume nobody changes the shader to spritecard and immediately asks if it's a spritecard |
|
|
|
|
|
|
|
//TODO: Investigate if these are likely to change at all when setting vars/flags |
|
virtual bool IsAlphaTested(); |
|
virtual bool IsVertexLit(); |
|
virtual VertexFormat_t GetVertexFormat() const; |
|
virtual bool UsesEnvCubemap( void ); |
|
virtual bool NeedsTangentSpace( void ); |
|
virtual bool NeedsSoftwareSkinning( void ); |
|
virtual int GetNumPasses( void ); |
|
virtual int GetTextureMemoryBytes( void ); |
|
virtual bool NeedsLightmapBlendAlpha( void ); |
|
virtual bool NeedsSoftwareLighting( void ); |
|
virtual MorphFormat_t GetMorphFormat() const; |
|
|
|
//TODO: Investigate if this can change over the course of a frame. |
|
virtual void GetLowResColorSample( float s, float t, float *color ) const; |
|
|
|
|
|
//Functions that need to be queue friendly, the whole reason for this wrapper class. |
|
virtual IMaterialVar * FindVar( const char *varName, bool *found, bool complain = true ); |
|
virtual IMaterialVar * FindVarFast( char const *pVarName, unsigned int *pToken ); |
|
virtual IMaterialVar **GetShaderParams( void ); |
|
virtual void DecrementReferenceCount( void ); |
|
virtual void DeleteIfUnreferenced(); |
|
virtual void RecomputeStateSnapshots(); |
|
virtual bool IsTranslucent(); |
|
virtual bool NeedsPowerOfTwoFrameBufferTexture( bool bCheckSpecificToThisFrame = true ); |
|
virtual bool NeedsFullFrameBufferTexture( bool bCheckSpecificToThisFrame = true ); |
|
virtual void AlphaModulate( float alpha ); |
|
virtual void ColorModulate( float r, float g, float b ); |
|
virtual void SetMaterialVarFlag( MaterialVarFlags_t flag, bool on ); |
|
virtual bool GetMaterialVarFlag( MaterialVarFlags_t flag ) const; |
|
virtual void SetShader( const char *pShaderName ); |
|
virtual void SetShaderAndParams( KeyValues *pKeyValues ); |
|
virtual const char * GetShaderName() const; |
|
virtual void Refresh(); |
|
virtual void RefreshPreservingMaterialVars(); |
|
virtual void SetUseFixedFunctionBakedLighting( bool bEnable ); |
|
virtual float GetAlphaModulation(); |
|
virtual void GetColorModulation( float *r, float *g, float *b ); |
|
virtual void CallBindProxy( void *proxyData ); |
|
virtual IMaterial *CheckProxyReplacement( void *proxyData ); |
|
virtual void PrecacheMappingDimensions( ); |
|
virtual void FindRepresentativeTexture( void ); |
|
virtual bool WasReloadedFromWhitelist() { return m_pRealTimeVersion->WasReloadedFromWhitelist(); } |
|
virtual bool IsPrecached( ) const { return m_pRealTimeVersion->IsPrecached(); } |
|
|
|
|
|
#define QUEUEFRIENDLY_USED_INTERNALLY_ASSERT AssertMsg( 0, "CMaterial_QueueFriendly used internally within materialsystem. Update the calling code to use a realtime CMaterial." ) |
|
|
|
//------------------------------------------------------------------------------ |
|
// IMaterialInternal interfaces. Internal systems should not be using this queue |
|
// wrapper class at all. Switch to the real time pointer in the calling code. |
|
//------------------------------------------------------------------------------ |
|
virtual int GetReferenceCount( ) const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->GetReferenceCount(); } |
|
virtual void SetEnumerationID( int id ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->SetEnumerationID( id ); } |
|
virtual void SetNeedsWhiteLightmap( bool val ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->SetNeedsWhiteLightmap( val ); } |
|
virtual bool GetNeedsWhiteLightmap( ) const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->GetNeedsWhiteLightmap(); } |
|
virtual void Uncache( bool bPreserveVars = false ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->Uncache( bPreserveVars ); } |
|
virtual void Precache() { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->Precache(); } |
|
// If provided, pKeyValues and pPatchKeyValues should come from LoadVMTFile() |
|
virtual bool PrecacheVars( KeyValues *pKeyValues = NULL, KeyValues *pPatchKeyValues = NULL, CUtlVector<FileNameHandle_t> *pIncludes = NULL, int nFindContext = MATERIAL_FINDCONTEXT_NONE ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->PrecacheVars( pKeyValues, pPatchKeyValues, pIncludes, nFindContext ); } |
|
virtual void ReloadTextures() { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->ReloadTextures(); } |
|
virtual void SetMinLightmapPageID( int pageID ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->SetMinLightmapPageID( pageID ); } |
|
virtual void SetMaxLightmapPageID( int pageID ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->SetMaxLightmapPageID( pageID ); } |
|
virtual int GetMinLightmapPageID( ) const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->GetMinLightmapPageID(); } |
|
virtual int GetMaxLightmapPageID( ) const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->GetMaxLightmapPageID(); } |
|
virtual IShader *GetShader() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->GetShader(); } |
|
virtual bool IsPrecachedVars() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->IsPrecachedVars(); } |
|
virtual void DrawMesh( VertexCompressionType_t vertexCompression ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->DrawMesh( vertexCompression ); } |
|
virtual VertexFormat_t GetVertexUsage() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->GetVertexUsage(); } |
|
virtual bool PerformDebugTrace() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->PerformDebugTrace(); } |
|
virtual bool NoDebugOverride() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->NoDebugOverride(); } |
|
virtual void ToggleSuppression() { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->ToggleSuppression(); } |
|
virtual bool IsSuppressed() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->IsSuppressed(); } |
|
virtual void ToggleDebugTrace() { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->ToggleDebugTrace(); } |
|
virtual bool UseFog() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->UseFog(); } |
|
virtual void AddMaterialVar( IMaterialVar *pMaterialVar ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->AddMaterialVar( pMaterialVar ); } |
|
virtual ShaderRenderState_t *GetRenderState() { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->GetRenderState(); } |
|
virtual bool IsManuallyCreated() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->IsManuallyCreated(); } |
|
virtual bool NeedsFixedFunctionFlashlight() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->NeedsFixedFunctionFlashlight(); } |
|
virtual bool IsUsingVertexID() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->IsUsingVertexID(); } |
|
virtual void MarkAsPreloaded( bool bSet ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->MarkAsPreloaded( bSet ); } |
|
virtual bool IsPreloaded() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->IsPreloaded(); } |
|
virtual void ArtificialAddRef() { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->ArtificialAddRef(); } |
|
virtual void ArtificialRelease() { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->ArtificialRelease(); } |
|
virtual void ReportVarChanged( IMaterialVar *pVar ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; m_pRealTimeVersion->ReportVarChanged( pVar ); } |
|
virtual uint32 GetChangeID() const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->GetChangeID(); } |
|
virtual bool IsTranslucentInternal( float fAlphaModulation ) const { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->IsTranslucentInternal( fAlphaModulation ); } |
|
|
|
virtual void DecideShouldReloadFromWhitelist( IFileList *pFileList ) { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->DecideShouldReloadFromWhitelist( pFileList ); } |
|
virtual void ReloadFromWhitelistIfMarked() { QUEUEFRIENDLY_USED_INTERNALLY_ASSERT; return m_pRealTimeVersion->ReloadFromWhitelistIfMarked(); } |
|
|
|
virtual bool IsRealTimeVersion( void ) const; |
|
virtual IMaterialInternal *GetRealTimeVersion( void ); |
|
virtual IMaterialInternal *GetQueueFriendlyVersion( void ); |
|
|
|
void SetRealTimeVersion( IMaterialInternal *pRealTimeVersion ) |
|
{ |
|
m_pRealTimeVersion = pRealTimeVersion; |
|
m_nReferenceCount = m_pRealTimeVersion->GetReferenceCount(); |
|
} |
|
void UpdateToRealTime( void ); //update cached off variables using the real time version as a base. |
|
|
|
|
|
protected: |
|
IMaterialInternal *m_pRealTimeVersion; //the material we're wrapping with queued delays |
|
|
|
private: |
|
//some calls need to know what state the material would be in right now if the queue had completed. |
|
float m_fAlphaModulationOnQueueCompletion; |
|
Vector m_vColorModulationOnQueueCompletion; |
|
int m_nReferenceCount; // Only ever accessed from the main thread. |
|
}; |
|
|
|
|
|
|
|
#endif //#ifndef CMATERIAL_QUEUEFRIENDLY_H |
|
|
|
|