summaryrefslogtreecommitdiff
path: root/public/shaderlib/BaseShader.h
diff options
context:
space:
mode:
Diffstat (limited to 'public/shaderlib/BaseShader.h')
-rw-r--r--public/shaderlib/BaseShader.h341
1 files changed, 341 insertions, 0 deletions
diff --git a/public/shaderlib/BaseShader.h b/public/shaderlib/BaseShader.h
new file mode 100644
index 0000000..6119183
--- /dev/null
+++ b/public/shaderlib/BaseShader.h
@@ -0,0 +1,341 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+// This is what all shaders inherit from.
+//===========================================================================//
+
+#ifndef BASESHADER_H
+#define BASESHADER_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "materialsystem/IShader.h"
+#include "materialsystem/imaterialvar.h"
+#include "materialsystem/ishaderapi.h"
+#include "materialsystem/imaterialsystemhardwareconfig.h"
+#include "shaderlib/BaseShader.h"
+#include "convar.h"
+
+//-----------------------------------------------------------------------------
+// Forward declarations
+//-----------------------------------------------------------------------------
+class IMaterialVar;
+
+//-----------------------------------------------------------------------------
+// Standard material vars
+//-----------------------------------------------------------------------------
+// Note: if you add to these, add to s_StandardParams in CBaseShader.cpp
+enum ShaderMaterialVars_t
+{
+ FLAGS = 0,
+ FLAGS_DEFINED, // mask indicating if the flag was specified
+ FLAGS2,
+ FLAGS_DEFINED2,
+ COLOR,
+ ALPHA,
+ BASETEXTURE,
+ FRAME,
+ BASETEXTURETRANSFORM,
+ FLASHLIGHTTEXTURE,
+ FLASHLIGHTTEXTUREFRAME,
+ COLOR2,
+ SRGBTINT,
+
+ NUM_SHADER_MATERIAL_VARS
+};
+
+
+// Alpha belnd mode enums. Moved from basevsshader
+enum BlendType_t
+{
+ // no alpha blending
+ BT_NONE = 0,
+
+
+
+ // src * srcAlpha + dst * (1-srcAlpha)
+ // two passes for HDR:
+ // pass 1:
+ // color: src * srcAlpha + dst * (1-srcAlpha)
+ // alpha: srcAlpha * zero + dstAlpha * (1-srcAlpha)
+ // pass 2:
+ // color: none
+ // alpha: srcAlpha * one + dstAlpha * one
+ //
+ BT_BLEND,
+
+
+
+ // src * one + dst * one
+ // one pass for HDR
+ BT_ADD,
+
+
+
+ // Why do we ever use this instead of using premultiplied alpha?
+ // src * srcAlpha + dst * one
+ // two passes for HDR
+ // pass 1:
+ // color: src * srcAlpha + dst * one
+ // alpha: srcAlpha * one + dstAlpha * one
+ // pass 2:
+ // color: none
+ // alpha: srcAlpha * one + dstAlpha * one
+ BT_BLENDADD
+};
+
+
+//-----------------------------------------------------------------------------
+// Base class for shaders, contains helper methods.
+//-----------------------------------------------------------------------------
+class CBaseShader : public IShader
+{
+public:
+ // constructor
+ CBaseShader();
+
+ // Methods inherited from IShader
+ virtual char const* GetFallbackShader( IMaterialVar** params ) const { return 0; }
+ virtual int GetNumParams( ) const;
+ virtual char const* GetParamName( int paramIndex ) const;
+ virtual char const* GetParamHelp( int paramIndex ) const;
+ virtual ShaderParamType_t GetParamType( int paramIndex ) const;
+ virtual char const* GetParamDefault( int paramIndex ) const;
+ virtual int GetParamFlags( int nParamIndex ) const;
+
+ virtual void InitShaderParams( IMaterialVar** ppParams, const char *pMaterialName );
+ virtual void InitShaderInstance( IMaterialVar** ppParams, IShaderInit *pShaderInit, const char *pMaterialName, const char *pTextureGroupName );
+ virtual void DrawElements( IMaterialVar **params, int nModulationFlags, IShaderShadow* pShaderShadow, IShaderDynamicAPI* pShaderAPI,
+ VertexCompressionType_t vertexCompression, CBasePerMaterialContextData **pContext );
+
+ virtual const SoftwareVertexShader_t GetSoftwareVertexShader() const { return m_SoftwareVertexShader; }
+
+ virtual int ComputeModulationFlags( IMaterialVar** params, IShaderDynamicAPI* pShaderAPI );
+ virtual bool NeedsPowerOfTwoFrameBufferTexture( IMaterialVar **params, bool bCheckSpecificToThisFrame = true ) const;
+ virtual bool NeedsFullFrameBufferTexture( IMaterialVar **params, bool bCheckSpecificToThisFrame = true ) const;
+ virtual bool IsTranslucent( IMaterialVar **params ) const;
+
+public:
+ // These functions must be implemented by the shader
+ virtual void OnInitShaderParams( IMaterialVar** ppParams, const char *pMaterialName ) {}
+ virtual void OnInitShaderInstance( IMaterialVar** ppParams, IShaderInit *pShaderInit, const char *pMaterialName ) = 0;
+ virtual void OnDrawElements( IMaterialVar **params, IShaderShadow* pShaderShadow, IShaderDynamicAPI* pShaderAPI, VertexCompressionType_t vertexCompression, CBasePerMaterialContextData **pContextDataPtr ) = 0;
+
+ // Sets the default shadow state
+ void SetInitialShadowState( );
+
+ // Draws a snapshot
+ void Draw( bool bMakeActualDrawCall = true );
+
+ // Are we currently taking a snapshot?
+ bool IsSnapshotting() const;
+
+ // Gets at the current materialvar flags
+ int CurrentMaterialVarFlags() const;
+
+ // Finds a particular parameter (works because the lowest parameters match the shader)
+ int FindParamIndex( const char *pName ) const;
+
+ // Are we using graphics?
+ bool IsUsingGraphics();
+
+ // Are we using editor materials?
+ bool CanUseEditorMaterials();
+
+ // Gets the builder...
+ CMeshBuilder* MeshBuilder();
+
+ // Loads a texture
+ void LoadTexture( int nTextureVar, int nAdditionalCreationFlags = 0 );
+
+ // Loads a bumpmap
+ void LoadBumpMap( int nTextureVar );
+
+ // Loads a cubemap
+ void LoadCubeMap( int nTextureVar, int nAdditionalCreationFlags = 0 );
+
+ // get the shaderapi handle for a texture. BE CAREFUL WITH THIS.
+ ShaderAPITextureHandle_t GetShaderAPITextureBindHandle( int nTextureVar, int nFrameVar, int nTextureChannel = 0 );
+
+
+ // Binds a texture
+ void BindTexture( Sampler_t sampler1, Sampler_t sampler2, int nTextureVar, int nFrameVar = -1 );
+ void BindTexture( Sampler_t sampler1, int nTextureVar, int nFrameVar = -1 );
+ void BindTexture( Sampler_t sampler1, ITexture *pTexture, int nFrame = 0 );
+ void BindTexture( Sampler_t sampler1, Sampler_t sampler2, ITexture *pTexture, int nFrame = 0 );
+
+ void GetTextureDimensions( float* pOutWidth, float* pOutHeight, int nTextureVar );
+
+ // Is the texture translucent?
+ bool TextureIsTranslucent( int textureVar, bool isBaseTexture );
+
+ // Returns the translucency...
+ float GetAlpha( IMaterialVar** params = NULL );
+
+ // Is the color var white?
+ bool IsWhite( int colorVar );
+
+ // Helper methods for fog
+ void FogToOOOverbright( void );
+ void FogToWhite( void );
+ void FogToBlack( void );
+ void FogToGrey( void );
+ void FogToFogColor( void );
+ void DisableFog( void );
+ void DefaultFog( void );
+
+ // Helpers for alpha blending
+ void EnableAlphaBlending( ShaderBlendFactor_t src, ShaderBlendFactor_t dst );
+ void DisableAlphaBlending();
+
+ void SetBlendingShadowState( BlendType_t nMode );
+
+ void SetNormalBlendingShadowState( int textureVar = -1, bool isBaseTexture = true );
+ void SetAdditiveBlendingShadowState( int textureVar = -1, bool isBaseTexture = true );
+ void SetDefaultBlendingShadowState( int textureVar = -1, bool isBaseTexture = true );
+ void SingleTextureLightmapBlendMode( );
+
+ // Helpers for color modulation
+ void SetColorState( int colorVar, bool setAlpha = false );
+ bool IsAlphaModulating();
+ bool IsColorModulating();
+ void ComputeModulationColor( float* color );
+ void SetModulationShadowState( int tintVar = -1 );
+ void SetModulationDynamicState( int tintVar = -1 );
+
+ // Helpers for HDR
+ bool IsHDREnabled( void );
+
+ // Loads the identity matrix into the texture
+ void LoadIdentity( MaterialMatrixMode_t matrixMode );
+
+ // Loads the camera to world transform
+ void LoadCameraToWorldTransform( MaterialMatrixMode_t matrixMode );
+ void LoadCameraSpaceSphereMapTransform( MaterialMatrixMode_t matrixMode );
+
+ // Sets a texture translation transform in fixed function
+ void SetFixedFunctionTextureTranslation( MaterialMatrixMode_t mode, int translationVar );
+ void SetFixedFunctionTextureScale( MaterialMatrixMode_t mode, int scaleVar );
+ void SetFixedFunctionTextureScaledTransform( MaterialMatrixMode_t textureTransform, int transformVar, int scaleVar );
+ void SetFixedFunctionTextureTransform( MaterialMatrixMode_t textureTransform, int transformVar );
+
+ void CleanupDynamicStateFixedFunction( );
+
+ // Fixed function Base * detail pass
+ void FixedFunctionBaseTimesDetailPass( int baseTextureVar, int frameVar,
+ int baseTextureTransformVar, int detailVar, int detailScaleVar );
+
+ // Fixed function Self illumination pass
+ void FixedFunctionSelfIlluminationPass( Sampler_t sampler,
+ int baseTextureVar, int frameVar, int baseTextureTransformVar, int selfIllumTintVar );
+
+ // Masked environment map
+ void FixedFunctionMaskedEnvmapPass( int envMapVar, int envMapMaskVar,
+ int baseTextureVar, int envMapFrameVar, int envMapMaskFrameVar,
+ int frameVar, int maskOffsetVar, int maskScaleVar, int tintVar = -1 );
+
+ // Additive masked environment map
+ void FixedFunctionAdditiveMaskedEnvmapPass( int envMapVar, int envMapMaskVar,
+ int baseTextureVar, int envMapFrameVar, int envMapMaskFrameVar,
+ int frameVar, int maskOffsetVar, int maskScaleVar, int tintVar = -1 );
+
+ // Modulate by detail texture pass
+ void FixedFunctionMultiplyByDetailPass( int baseTextureVar, int frameVar,
+ int textureOffsetVar, int detailVar, int detailScaleVar );
+
+ // Multiply by lightmap pass
+ void FixedFunctionMultiplyByLightmapPass( int baseTextureVar, int frameVar,
+ int baseTextureTransformVar, float alphaOverride = -1 );
+
+ // Helper methods for environment mapping
+ int SetShadowEnvMappingState( int envMapMaskVar, int tintVar = -1 );
+ void SetDynamicEnvMappingState( int envMapVar, int envMapMaskVar,
+ int baseTextureVar, int envMapFrameVar, int envMapMaskFrameVar,
+ int frameVar, int maskOffsetVar, int maskScaleVar, int tintVar = -1 );
+
+ bool UsingFlashlight( IMaterialVar **params ) const;
+ bool UsingEditor( IMaterialVar **params ) const;
+
+ void DrawFlashlight_dx70( IMaterialVar** params, IShaderDynamicAPI *pShaderAPI,
+ IShaderShadow* pShaderShadow,
+ int flashlightTextureVar, int flashlightTextureFrameVar,
+ bool suppress_lighting = false );
+
+ void SetFlashlightFixedFunctionTextureTransform( MaterialMatrixMode_t matrix );
+
+ void GetColorParameter( IMaterialVar** params, float *pColorOut ) const; // return tint color (color*color2)
+ void ApplyColor2Factor( float *pColorOut ) const; // (*pColorOut) *= COLOR2
+
+ static IMaterialVar **s_ppParams;
+
+protected:
+ SoftwareVertexShader_t m_SoftwareVertexShader;
+
+ static const char *s_pTextureGroupName; // Current material's texture group name.
+ static IShaderShadow *s_pShaderShadow;
+ static IShaderDynamicAPI *s_pShaderAPI;
+ static IShaderInit *s_pShaderInit;
+
+private:
+ static int s_nModulationFlags;
+ static CMeshBuilder *s_pMeshBuilder;
+};
+
+
+//-----------------------------------------------------------------------------
+// Gets at the current materialvar flags
+//-----------------------------------------------------------------------------
+inline int CBaseShader::CurrentMaterialVarFlags() const
+{
+ return s_ppParams[FLAGS]->GetIntValue();
+}
+
+//-----------------------------------------------------------------------------
+// Are we currently taking a snapshot?
+//-----------------------------------------------------------------------------
+inline bool CBaseShader::IsSnapshotting() const
+{
+ return (s_pShaderShadow != NULL);
+}
+
+//-----------------------------------------------------------------------------
+// Is the color var white?
+//-----------------------------------------------------------------------------
+inline bool CBaseShader::IsWhite( int colorVar )
+{
+ if (colorVar < 0)
+ return true;
+
+ if (!s_ppParams[colorVar]->IsDefined())
+ return true;
+
+ float color[3];
+ s_ppParams[colorVar]->GetVecValue( color, 3 );
+ return (color[0] >= 1.0f) && (color[1] >= 1.0f) && (color[2] >= 1.0f);
+}
+
+
+class CBasePerMaterialContextData // shaders can keep per material data in classes descended from this
+{
+ public:
+ uint32 m_nVarChangeID;
+ bool m_bMaterialVarsChanged; // set by mat system when material vars change. shader should rehtink and then clear the var
+
+ FORCEINLINE CBasePerMaterialContextData( void )
+ {
+ m_bMaterialVarsChanged = true;
+ m_nVarChangeID = 0xffffffff;
+ }
+
+ // virtual destructor so that derived classes can have their own data to be cleaned up on
+ // delete of material
+ virtual ~CBasePerMaterialContextData( void )
+ {
+ }
+};
+
+#endif // BASESHADER_H