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.
349 lines
13 KiB
349 lines
13 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//===========================================================================// |
|
|
|
#ifndef ISHADERDYNAMIC_H |
|
#define ISHADERDYNAMIC_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "shaderapi/shareddefs.h" |
|
#include "materialsystem/imaterial.h" |
|
#include "materialsystem/imaterialsystem.h" |
|
#include "tier0/basetypes.h" |
|
|
|
|
|
typedef intp ShaderAPITextureHandle_t; |
|
|
|
//----------------------------------------------------------------------------- |
|
// forward declarations |
|
//----------------------------------------------------------------------------- |
|
class CMeshBuilder; |
|
class IMaterialVar; |
|
struct LightDesc_t; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// State from ShaderAPI used to select proper vertex and pixel shader combos |
|
//----------------------------------------------------------------------------- |
|
struct LightState_t |
|
{ |
|
int m_nNumLights; |
|
bool m_bAmbientLight; |
|
bool m_bStaticLightTexel; |
|
bool m_bStaticLightVertex; |
|
inline int HasDynamicLight() { return (m_bAmbientLight || (m_nNumLights > 0)) ? 1 : 0; } |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Color correction info |
|
//----------------------------------------------------------------------------- |
|
struct ShaderColorCorrectionInfo_t |
|
{ |
|
bool m_bIsEnabled; |
|
int m_nLookupCount; |
|
float m_flDefaultWeight; |
|
float m_pLookupWeights[4]; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// the 3D shader API interface |
|
// This interface is all that shaders see. |
|
//----------------------------------------------------------------------------- |
|
enum StandardTextureId_t |
|
{ |
|
// Lightmaps |
|
TEXTURE_LIGHTMAP = 0, |
|
TEXTURE_LIGHTMAP_FULLBRIGHT, |
|
TEXTURE_LIGHTMAP_BUMPED, |
|
TEXTURE_LIGHTMAP_BUMPED_FULLBRIGHT, |
|
|
|
// Flat colors |
|
TEXTURE_WHITE, |
|
TEXTURE_BLACK, |
|
TEXTURE_GREY, |
|
TEXTURE_GREY_ALPHA_ZERO, |
|
|
|
// Normalmaps |
|
TEXTURE_NORMALMAP_FLAT, |
|
|
|
// Normalization |
|
TEXTURE_NORMALIZATION_CUBEMAP, |
|
TEXTURE_NORMALIZATION_CUBEMAP_SIGNED, |
|
|
|
// Frame-buffer textures |
|
TEXTURE_FRAME_BUFFER_FULL_TEXTURE_0, |
|
TEXTURE_FRAME_BUFFER_FULL_TEXTURE_1, |
|
|
|
// Color correction |
|
TEXTURE_COLOR_CORRECTION_VOLUME_0, |
|
TEXTURE_COLOR_CORRECTION_VOLUME_1, |
|
TEXTURE_COLOR_CORRECTION_VOLUME_2, |
|
TEXTURE_COLOR_CORRECTION_VOLUME_3, |
|
|
|
// An alias to the Back Frame Buffer |
|
TEXTURE_FRAME_BUFFER_ALIAS, |
|
|
|
// Noise for shadow mapping algorithm |
|
TEXTURE_SHADOW_NOISE_2D, |
|
|
|
// A texture in which morph data gets accumulated (vs30, fast vertex textures required) |
|
TEXTURE_MORPH_ACCUMULATOR, |
|
|
|
// A texture which contains morph weights |
|
TEXTURE_MORPH_WEIGHTS, |
|
|
|
// A snapshot of the frame buffer's depth. Currently only valid on the 360 |
|
TEXTURE_FRAME_BUFFER_FULL_DEPTH, |
|
|
|
// A snapshot of the frame buffer's depth. Currently only valid on the 360 |
|
TEXTURE_IDENTITY_LIGHTWARP, |
|
|
|
// Equivalent to the debug material for mat_luxels, in convenient texture form. |
|
TEXTURE_DEBUG_LUXELS, |
|
|
|
TEXTURE_MAX_STD_TEXTURES = 32 |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Viewport structure |
|
//----------------------------------------------------------------------------- |
|
#define SHADER_VIEWPORT_VERSION 1 |
|
struct ShaderViewport_t |
|
{ |
|
int m_nVersion; |
|
int m_nTopLeftX; |
|
int m_nTopLeftY; |
|
int m_nWidth; |
|
int m_nHeight; |
|
float m_flMinZ; |
|
float m_flMaxZ; |
|
|
|
ShaderViewport_t() : m_nVersion( SHADER_VIEWPORT_VERSION ) {} |
|
|
|
void Init() |
|
{ |
|
memset( this, 0, sizeof(ShaderViewport_t) ); |
|
m_nVersion = SHADER_VIEWPORT_VERSION; |
|
} |
|
|
|
void Init( int x, int y, int nWidth, int nHeight, float flMinZ = 0.0f, float flMaxZ = 1.0f ) |
|
{ |
|
m_nVersion = SHADER_VIEWPORT_VERSION; |
|
m_nTopLeftX = x; m_nTopLeftY = y; m_nWidth = nWidth; m_nHeight = nHeight; |
|
m_flMinZ = flMinZ; |
|
m_flMaxZ = flMaxZ; |
|
} |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// The Shader interface versions |
|
//----------------------------------------------------------------------------- |
|
#define SHADERDYNAMIC_INTERFACE_VERSION "ShaderDynamic001" |
|
abstract_class IShaderDynamicAPI |
|
{ |
|
public: |
|
|
|
virtual void SetViewports( int nCount, const ShaderViewport_t* pViewports ) = 0; |
|
virtual int GetViewports( ShaderViewport_t* pViewports, int nMax ) const = 0; |
|
|
|
// returns the current time in seconds.... |
|
virtual double CurrentTime() const = 0; |
|
|
|
// Gets the lightmap dimensions |
|
virtual void GetLightmapDimensions( int *w, int *h ) = 0; |
|
|
|
// Scene fog state. |
|
// This is used by the shaders for picking the proper vertex shader for fogging based on dynamic state. |
|
virtual MaterialFogMode_t GetSceneFogMode( ) = 0; |
|
virtual void GetSceneFogColor( unsigned char *rgb ) = 0; |
|
|
|
// stuff related to matrix stacks |
|
virtual void MatrixMode( MaterialMatrixMode_t matrixMode ) = 0; |
|
virtual void PushMatrix() = 0; |
|
virtual void PopMatrix() = 0; |
|
virtual void LoadMatrix( float *m ) = 0; |
|
virtual void MultMatrix( float *m ) = 0; |
|
virtual void MultMatrixLocal( float *m ) = 0; |
|
virtual void GetMatrix( MaterialMatrixMode_t matrixMode, float *dst ) = 0; |
|
virtual void LoadIdentity( void ) = 0; |
|
virtual void LoadCameraToWorld( void ) = 0; |
|
virtual void Ortho( double left, double right, double bottom, double top, double zNear, double zFar ) = 0; |
|
virtual void PerspectiveX( double fovx, double aspect, double zNear, double zFar ) = 0; |
|
virtual void PickMatrix( int x, int y, int width, int height ) = 0; |
|
virtual void Rotate( float angle, float x, float y, float z ) = 0; |
|
virtual void Translate( float x, float y, float z ) = 0; |
|
virtual void Scale( float x, float y, float z ) = 0; |
|
virtual void ScaleXY( float x, float y ) = 0; |
|
|
|
// Sets the color to modulate by |
|
virtual void Color3f( float r, float g, float b ) = 0; |
|
virtual void Color3fv( float const* pColor ) = 0; |
|
virtual void Color4f( float r, float g, float b, float a ) = 0; |
|
virtual void Color4fv( float const* pColor ) = 0; |
|
|
|
virtual void Color3ub( unsigned char r, unsigned char g, unsigned char b ) = 0; |
|
virtual void Color3ubv( unsigned char const* pColor ) = 0; |
|
virtual void Color4ub( unsigned char r, unsigned char g, unsigned char b, unsigned char a ) = 0; |
|
virtual void Color4ubv( unsigned char const* pColor ) = 0; |
|
|
|
// Sets the constant register for vertex and pixel shaders |
|
virtual void SetVertexShaderConstant( int var, float const* pVec, int numConst = 1, bool bForce = false ) = 0; |
|
virtual void SetPixelShaderConstant( int var, float const* pVec, int numConst = 1, bool bForce = false ) = 0; |
|
|
|
// Sets the default *dynamic* state |
|
virtual void SetDefaultState() = 0; |
|
|
|
// Get the current camera position in world space. |
|
virtual void GetWorldSpaceCameraPosition( float* pPos ) const = 0; |
|
|
|
virtual int GetCurrentNumBones( void ) const = 0; |
|
virtual int GetCurrentLightCombo( void ) const = 0; |
|
|
|
virtual MaterialFogMode_t GetCurrentFogType( void ) const = 0; |
|
|
|
// fixme: move this to shadow state |
|
virtual void SetTextureTransformDimension( TextureStage_t textureStage, int dimension, bool projected ) = 0; |
|
virtual void DisableTextureTransform( TextureStage_t textureStage ) = 0; |
|
virtual void SetBumpEnvMatrix( TextureStage_t textureStage, float m00, float m01, float m10, float m11 ) = 0; |
|
|
|
// Sets the vertex and pixel shaders |
|
virtual void SetVertexShaderIndex( int vshIndex = -1 ) = 0; |
|
virtual void SetPixelShaderIndex( int pshIndex = 0 ) = 0; |
|
|
|
// Get the dimensions of the back buffer. |
|
virtual void GetBackBufferDimensions( int& width, int& height ) const = 0; |
|
|
|
// FIXME: The following 6 methods used to live in IShaderAPI |
|
// and were moved for stdshader_dx8. Let's try to move them back! |
|
|
|
// Get the lights |
|
virtual int GetMaxLights( void ) const = 0; |
|
virtual const LightDesc_t& GetLight( int lightNum ) const = 0; |
|
|
|
virtual void SetPixelShaderFogParams( int reg ) = 0; |
|
|
|
// Render state for the ambient light cube |
|
virtual void SetVertexShaderStateAmbientLightCube() = 0; |
|
virtual void SetPixelShaderStateAmbientLightCube( int pshReg, bool bForceToBlack = false ) = 0; |
|
virtual void CommitPixelShaderLighting( int pshReg ) = 0; |
|
|
|
// Use this to get the mesh builder that allows us to modify vertex data |
|
virtual CMeshBuilder* GetVertexModifyBuilder() = 0; |
|
virtual bool InFlashlightMode() const = 0; |
|
virtual const FlashlightState_t &GetFlashlightState( VMatrix &worldToTexture ) const = 0; |
|
virtual bool InEditorMode() const = 0; |
|
|
|
// Gets the bound morph's vertex format; returns 0 if no morph is bound |
|
virtual MorphFormat_t GetBoundMorphFormat() = 0; |
|
|
|
// Binds a standard texture |
|
virtual void BindStandardTexture( Sampler_t sampler, StandardTextureId_t id ) = 0; |
|
|
|
virtual ITexture *GetRenderTargetEx( int nRenderTargetID ) = 0; |
|
|
|
virtual void SetToneMappingScaleLinear( const Vector &scale ) = 0; |
|
virtual const Vector &GetToneMappingScaleLinear( void ) const = 0; |
|
virtual float GetLightMapScaleFactor( void ) const = 0; |
|
|
|
virtual void LoadBoneMatrix( int boneIndex, const float *m ) = 0; |
|
|
|
virtual void PerspectiveOffCenterX( double fovx, double aspect, double zNear, double zFar, double bottom, double top, double left, double right ) = 0; |
|
|
|
virtual void SetFloatRenderingParameter(int parm_number, float value) = 0; |
|
|
|
virtual void SetIntRenderingParameter(int parm_number, int value) = 0 ; |
|
virtual void SetVectorRenderingParameter(int parm_number, Vector const &value) = 0 ; |
|
|
|
virtual float GetFloatRenderingParameter(int parm_number) const = 0 ; |
|
|
|
virtual int GetIntRenderingParameter(int parm_number) const = 0 ; |
|
|
|
virtual Vector GetVectorRenderingParameter(int parm_number) const = 0 ; |
|
|
|
// stencil buffer operations. |
|
virtual void SetStencilEnable(bool onoff) = 0; |
|
virtual void SetStencilFailOperation(StencilOperation_t op) = 0; |
|
virtual void SetStencilZFailOperation(StencilOperation_t op) = 0; |
|
virtual void SetStencilPassOperation(StencilOperation_t op) = 0; |
|
virtual void SetStencilCompareFunction(StencilComparisonFunction_t cmpfn) = 0; |
|
virtual void SetStencilReferenceValue(int ref) = 0; |
|
virtual void SetStencilTestMask(uint32 msk) = 0; |
|
virtual void SetStencilWriteMask(uint32 msk) = 0; |
|
virtual void ClearStencilBufferRectangle( int xmin, int ymin, int xmax, int ymax,int value) = 0; |
|
|
|
virtual void GetDXLevelDefaults(uint &max_dxlevel,uint &recommended_dxlevel) = 0; |
|
|
|
virtual const FlashlightState_t &GetFlashlightStateEx( VMatrix &worldToTexture, ITexture **pFlashlightDepthTexture ) const = 0; |
|
|
|
virtual float GetAmbientLightCubeLuminance() = 0; |
|
|
|
virtual void GetDX9LightState( LightState_t *state ) const = 0; |
|
virtual int GetPixelFogCombo( ) = 0; //0 is either range fog, or no fog simulated with rigged range fog values. 1 is height fog |
|
|
|
virtual void BindStandardVertexTexture( VertexTextureSampler_t sampler, StandardTextureId_t id ) = 0; |
|
|
|
// Is hardware morphing enabled? |
|
virtual bool IsHWMorphingEnabled( ) const = 0; |
|
|
|
virtual void GetStandardTextureDimensions( int *pWidth, int *pHeight, StandardTextureId_t id ) = 0; |
|
|
|
virtual void SetBooleanVertexShaderConstant( int var, BOOL const* pVec, int numBools = 1, bool bForce = false ) = 0; |
|
virtual void SetIntegerVertexShaderConstant( int var, int const* pVec, int numIntVecs = 1, bool bForce = false ) = 0; |
|
virtual void SetBooleanPixelShaderConstant( int var, BOOL const* pVec, int numBools = 1, bool bForce = false ) = 0; |
|
virtual void SetIntegerPixelShaderConstant( int var, int const* pVec, int numIntVecs = 1, bool bForce = false ) = 0; |
|
|
|
//Are we in a configuration that needs access to depth data through the alpha channel later? |
|
virtual bool ShouldWriteDepthToDestAlpha( void ) const = 0; |
|
|
|
|
|
// deformations |
|
virtual void PushDeformation( DeformationBase_t const *Deformation ) = 0; |
|
virtual void PopDeformation( ) = 0; |
|
virtual int GetNumActiveDeformations() const =0; |
|
|
|
|
|
// for shaders to set vertex shader constants. returns a packed state which can be used to set |
|
// the dynamic combo. returns # of active deformations |
|
virtual int GetPackedDeformationInformation( int nMaskOfUnderstoodDeformations, |
|
float *pConstantValuesOut, |
|
int nBufferSize, |
|
int nMaximumDeformations, |
|
int *pNumDefsOut ) const = 0; |
|
|
|
// This lets the lower level system that certain vertex fields requested |
|
// in the shadow state aren't actually being read given particular state |
|
// known only at dynamic state time. It's here only to silence warnings. |
|
virtual void MarkUnusedVertexFields( unsigned int nFlags, int nTexCoordCount, bool *pUnusedTexCoords ) = 0; |
|
|
|
|
|
virtual void ExecuteCommandBuffer( uint8 *pCmdBuffer ) =0; |
|
|
|
// interface for mat system to tell shaderapi about standard texture handles |
|
virtual void SetStandardTextureHandle( StandardTextureId_t nId, ShaderAPITextureHandle_t nHandle ) =0; |
|
|
|
// Interface for mat system to tell shaderapi about color correction |
|
virtual void GetCurrentColorCorrection( ShaderColorCorrectionInfo_t* pInfo ) = 0; |
|
|
|
virtual void SetPSNearAndFarZ( int pshReg ) = 0; |
|
|
|
virtual void SetDepthFeatheringPixelShaderConstant( int iConstant, float fDepthBlendScale ) = 0; |
|
}; |
|
// end class IShaderDynamicAPI |
|
|
|
//----------------------------------------------------------------------------- |
|
// Software vertex shaders |
|
//----------------------------------------------------------------------------- |
|
typedef void (*SoftwareVertexShader_t)( CMeshBuilder& meshBuilder, IMaterialVar **params, IShaderDynamicAPI *pShaderAPI ); |
|
|
|
|
|
#endif // ISHADERDYNAMIC_H
|
|
|