summaryrefslogtreecommitdiff
path: root/materialsystem/cmaterial_queuefriendly.cpp
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 /materialsystem/cmaterial_queuefriendly.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'materialsystem/cmaterial_queuefriendly.cpp')
-rw-r--r--materialsystem/cmaterial_queuefriendly.cpp410
1 files changed, 410 insertions, 0 deletions
diff --git a/materialsystem/cmaterial_queuefriendly.cpp b/materialsystem/cmaterial_queuefriendly.cpp
new file mode 100644
index 0000000..d6a9097
--- /dev/null
+++ b/materialsystem/cmaterial_queuefriendly.cpp
@@ -0,0 +1,410 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+
+#include "cmaterial_queuefriendly.h"
+#include "tier1/callqueue.h"
+#include "materialsystem_global.h"
+
+
+#define USE_QUEUED_MATERIAL_CALLS //uncomment to queue up material changing calls. Comment out to always use instant calls.
+
+
+#ifdef USE_QUEUED_MATERIAL_CALLS
+
+#define QUEUE_MATERIAL_CALL( FuncName, ... ) \
+ { \
+ ICallQueue *pCallQueue = materials->GetRenderContext()->GetCallQueue(); \
+ if ( !pCallQueue ) \
+ { \
+ m_pRealTimeVersion->FuncName( __VA_ARGS__ ); \
+ } \
+ else \
+ { \
+ pCallQueue->QueueCall( m_pRealTimeVersion, &IMaterialInternal::FuncName, ##__VA_ARGS__ ); \
+ } \
+ }
+
+#else
+
+#define QUEUE_MATERIAL_CALL( FuncName, ... ) m_pRealTimeVersion->FuncName( __VA_ARGS__ );
+
+#endif
+
+
+const char *CMaterial_QueueFriendly::GetName() const
+{
+ return m_pRealTimeVersion->GetName();
+}
+
+const char *CMaterial_QueueFriendly::GetTextureGroupName() const
+{
+ return m_pRealTimeVersion->GetTextureGroupName();
+}
+
+PreviewImageRetVal_t CMaterial_QueueFriendly::GetPreviewImageProperties( int *width, int *height, ImageFormat *imageFormat, bool* isTranslucent ) const
+{
+ return m_pRealTimeVersion->GetPreviewImageProperties( width, height, imageFormat, isTranslucent );
+}
+
+PreviewImageRetVal_t CMaterial_QueueFriendly::GetPreviewImage( unsigned char *data, int width, int height, ImageFormat imageFormat ) const
+{
+ return m_pRealTimeVersion->GetPreviewImage( data, width, height, imageFormat );
+}
+
+int CMaterial_QueueFriendly::GetMappingWidth( )
+{
+ return m_pRealTimeVersion->GetMappingWidth();
+}
+
+int CMaterial_QueueFriendly::GetMappingHeight( )
+{
+ return m_pRealTimeVersion->GetMappingHeight();
+}
+
+int CMaterial_QueueFriendly::GetNumAnimationFrames( )
+{
+ return m_pRealTimeVersion->GetNumAnimationFrames();
+}
+
+bool CMaterial_QueueFriendly::InMaterialPage( void )
+{
+ return m_pRealTimeVersion->InMaterialPage();
+}
+
+void CMaterial_QueueFriendly::GetMaterialOffset( float *pOffset )
+{
+ m_pRealTimeVersion->GetMaterialOffset( pOffset );
+}
+
+void CMaterial_QueueFriendly::GetMaterialScale( float *pScale )
+{
+ m_pRealTimeVersion->GetMaterialScale( pScale );
+}
+
+IMaterial *CMaterial_QueueFriendly::GetMaterialPage( void )
+{
+ return m_pRealTimeVersion->GetMaterialPage();
+}
+
+void CMaterial_QueueFriendly::IncrementReferenceCount( void )
+{
+ Assert( ThreadInMainThread() );
+ ++m_nReferenceCount;
+ m_pRealTimeVersion->IncrementReferenceCount();
+}
+
+int CMaterial_QueueFriendly::GetEnumerationID( void ) const
+{
+ return m_pRealTimeVersion->GetEnumerationID();
+}
+
+bool CMaterial_QueueFriendly::HasProxy( void ) const
+{
+ return m_pRealTimeVersion->HasProxy();
+}
+
+void CMaterial_QueueFriendly::GetReflectivity( Vector& reflect )
+{
+ m_pRealTimeVersion->GetReflectivity( reflect );
+}
+
+bool CMaterial_QueueFriendly::GetPropertyFlag( MaterialPropertyTypes_t type )
+{
+ return m_pRealTimeVersion->GetPropertyFlag( type );
+}
+
+bool CMaterial_QueueFriendly::IsTwoSided()
+{
+ return m_pRealTimeVersion->IsTwoSided();
+}
+
+int CMaterial_QueueFriendly::ShaderParamCount() const
+{
+ return m_pRealTimeVersion->ShaderParamCount();
+}
+
+bool CMaterial_QueueFriendly::IsErrorMaterial() const
+{
+ return m_pRealTimeVersion->IsErrorMaterial();
+}
+
+bool CMaterial_QueueFriendly::IsSpriteCard()
+{
+ return m_pRealTimeVersion->IsSpriteCard();
+}
+
+
+
+//TODO: Investigate if these are likely to change at all when setting vars/flags
+bool CMaterial_QueueFriendly::IsAlphaTested()
+{
+ return m_pRealTimeVersion->IsAlphaTested();
+}
+
+bool CMaterial_QueueFriendly::IsVertexLit()
+{
+ return m_pRealTimeVersion->IsVertexLit();
+}
+
+VertexFormat_t CMaterial_QueueFriendly::GetVertexFormat() const
+{
+ return m_pRealTimeVersion->GetVertexFormat();
+}
+
+bool CMaterial_QueueFriendly::UsesEnvCubemap( void )
+{
+ return m_pRealTimeVersion->UsesEnvCubemap();
+}
+
+bool CMaterial_QueueFriendly::NeedsTangentSpace( void )
+{
+ return m_pRealTimeVersion->NeedsTangentSpace();
+}
+
+bool CMaterial_QueueFriendly::NeedsSoftwareSkinning( void )
+{
+ return m_pRealTimeVersion->NeedsSoftwareSkinning();
+}
+
+int CMaterial_QueueFriendly::GetNumPasses( void )
+{
+ return m_pRealTimeVersion->GetNumPasses();
+}
+
+int CMaterial_QueueFriendly::GetTextureMemoryBytes( void )
+{
+ return m_pRealTimeVersion->GetTextureMemoryBytes();
+}
+
+bool CMaterial_QueueFriendly::NeedsLightmapBlendAlpha( void )
+{
+ return m_pRealTimeVersion->NeedsLightmapBlendAlpha();
+}
+
+bool CMaterial_QueueFriendly::NeedsSoftwareLighting( void )
+{
+ return m_pRealTimeVersion->NeedsSoftwareLighting();
+}
+
+MorphFormat_t CMaterial_QueueFriendly::GetMorphFormat() const
+{
+ return m_pRealTimeVersion->GetMorphFormat();
+}
+
+void CMaterial_QueueFriendly::GetLowResColorSample( float s, float t, float *color ) const
+{
+ if ( m_pRealTimeVersion )
+ m_pRealTimeVersion->GetLowResColorSample( s, t, color );
+ else
+ color[ 0 ] = color[ 1 ] = color[ 2 ] = 0.0f;
+}
+
+
+
+IMaterialVar *CMaterial_QueueFriendly::FindVar( const char *varName, bool *found, bool complain )
+{
+ //TODO: return a queue friendly variable that can be get/set
+ return m_pRealTimeVersion->FindVar( varName, found, complain );
+}
+
+IMaterialVar *CMaterial_QueueFriendly::FindVarFast( char const *pVarName, unsigned int *pToken )
+{
+ //TODO: return a queue friendly variable that can be get/set
+ return m_pRealTimeVersion->FindVarFast( pVarName, pToken );
+}
+
+IMaterialVar **CMaterial_QueueFriendly::GetShaderParams( void )
+{
+ //TODO: return queue friendly variables that can be get/set
+ return m_pRealTimeVersion->GetShaderParams();
+}
+
+void CMaterial_QueueFriendly::DecrementReferenceCount( void )
+{
+ Assert( ThreadInMainThread() );
+ --m_nReferenceCount;
+ QUEUE_MATERIAL_CALL( DecrementReferenceCount );
+}
+
+void CMaterial_QueueFriendly::DeleteIfUnreferenced()
+{
+ Assert( ThreadInMainThread() );
+ if ( m_nReferenceCount > 0 )
+ return;
+
+ MaterialSystem()->RemoveMaterial( GetRealTimeVersion() );
+ QUEUE_MATERIAL_CALL( DeleteIfUnreferenced );
+}
+
+void CMaterial_QueueFriendly::RecomputeStateSnapshots()
+{
+ QUEUE_MATERIAL_CALL( RecomputeStateSnapshots );
+}
+
+
+bool CMaterial_QueueFriendly::IsTranslucent()
+{
+ //TODO: need to base this as if the queued state is 100% up to date
+ return m_pRealTimeVersion->IsTranslucentInternal( GetMaterialVarFlag( MATERIAL_VAR_IGNORE_ALPHA_MODULATION ) ? 1.0f : m_fAlphaModulationOnQueueCompletion );
+}
+
+bool CMaterial_QueueFriendly::NeedsPowerOfTwoFrameBufferTexture( bool bCheckSpecificToThisFrame )
+{
+ //bCheckSpecificToThisFrame scares me a bit.
+ return m_pRealTimeVersion->NeedsPowerOfTwoFrameBufferTexture( bCheckSpecificToThisFrame );
+}
+
+bool CMaterial_QueueFriendly::NeedsFullFrameBufferTexture( bool bCheckSpecificToThisFrame )
+{
+ //bCheckSpecificToThisFrame scares me a bit.
+ return m_pRealTimeVersion->NeedsFullFrameBufferTexture( bCheckSpecificToThisFrame );
+}
+
+void CMaterial_QueueFriendly::AlphaModulate( float alpha )
+{
+ QUEUE_MATERIAL_CALL( AlphaModulate, alpha );
+ m_fAlphaModulationOnQueueCompletion = alpha;
+}
+
+void CMaterial_QueueFriendly::ColorModulate( float r, float g, float b )
+{
+ QUEUE_MATERIAL_CALL( ColorModulate, r, g, b );
+ m_vColorModulationOnQueueCompletion.Init( r, g, b );
+}
+
+void CMaterial_QueueFriendly::SetMaterialVarFlag( MaterialVarFlags_t flag, bool on )
+{
+ QUEUE_MATERIAL_CALL( SetMaterialVarFlag, flag, on );
+}
+bool CMaterial_QueueFriendly::GetMaterialVarFlag( MaterialVarFlags_t flag ) const
+{
+ //TODO: somehow mix both queued and real time states
+ return m_pRealTimeVersion->GetMaterialVarFlag( flag );
+}
+
+void CMaterial_QueueFriendly::SetShader( const char *pShaderName )
+{
+ //TODO: queue it and investigate, seems like a grenade.
+ m_pRealTimeVersion->SetShader( pShaderName );
+}
+
+void CMaterial_QueueFriendly::SetShaderAndParams( KeyValues *pKeyValues )
+{
+ //TODO: queue it and investigate, seems like a grenade.
+ m_pRealTimeVersion->SetShaderAndParams( pKeyValues );
+}
+
+const char *CMaterial_QueueFriendly::GetShaderName() const
+{
+ //TODO: return as if the queue is up to date. Someone could have set the shader very recently
+ return m_pRealTimeVersion->GetShaderName();
+}
+
+void CMaterial_QueueFriendly::Refresh()
+{
+ //TODO: Investigate, this one seems like a grenade.
+ m_pRealTimeVersion->Refresh();
+ //QUEUE_MATERIAL_CALL( Refresh );
+}
+
+void CMaterial_QueueFriendly::RefreshPreservingMaterialVars()
+{
+ //TODO: Investigate, this one seems like a grenade.
+ m_pRealTimeVersion->RefreshPreservingMaterialVars();
+ //QUEUE_MATERIAL_CALL( RefreshPreservingMaterialVars );
+}
+
+void CMaterial_QueueFriendly::SetUseFixedFunctionBakedLighting( bool bEnable )
+{
+ QUEUE_MATERIAL_CALL( SetUseFixedFunctionBakedLighting, bEnable );
+}
+
+float CMaterial_QueueFriendly::GetAlphaModulation()
+{
+#ifdef USE_QUEUED_MATERIAL_CALLS
+ return m_fAlphaModulationOnQueueCompletion;
+#else
+ return m_pRealTimeVersion->GetAlphaModulation();
+#endif
+}
+
+void CMaterial_QueueFriendly::GetColorModulation( float *r, float *g, float *b )
+{
+#ifdef USE_QUEUED_MATERIAL_CALLS
+ *r = m_vColorModulationOnQueueCompletion.x;
+ *g = m_vColorModulationOnQueueCompletion.y;
+ *b = m_vColorModulationOnQueueCompletion.z;
+#else
+ m_pRealTimeVersion->GetColorModulation( r, g, b );
+#endif
+}
+
+void CMaterial_QueueFriendly::CallBindProxy( void *proxyData )
+{
+ //TODO: queue it? Investigate.
+ return m_pRealTimeVersion->CallBindProxy( proxyData );
+}
+
+IMaterial *CMaterial_QueueFriendly::CheckProxyReplacement( void *proxyData )
+{
+ return m_pRealTimeVersion->CheckProxyReplacement( proxyData );
+}
+
+void CMaterial_QueueFriendly::PrecacheMappingDimensions()
+{
+ return m_pRealTimeVersion->PrecacheMappingDimensions();
+}
+
+void CMaterial_QueueFriendly::FindRepresentativeTexture()
+{
+ return m_pRealTimeVersion->FindRepresentativeTexture();
+}
+
+bool CMaterial_QueueFriendly::IsRealTimeVersion( void ) const
+{
+ return false;
+}
+
+IMaterialInternal *CMaterial_QueueFriendly::GetRealTimeVersion( void )
+{
+ return m_pRealTimeVersion;
+}
+
+IMaterialInternal *CMaterial_QueueFriendly::GetQueueFriendlyVersion( void )
+{
+ return this;
+}
+
+
+void CMaterial_QueueFriendly::UpdateToRealTime( void )
+{
+ m_fAlphaModulationOnQueueCompletion = m_pRealTimeVersion->GetAlphaModulation();
+ m_pRealTimeVersion->GetColorModulation( &m_vColorModulationOnQueueCompletion.x,
+ &m_vColorModulationOnQueueCompletion.y,
+ &m_vColorModulationOnQueueCompletion.z );
+
+ m_nReferenceCount = m_pRealTimeVersion->GetReferenceCount();
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+