aboutsummaryrefslogtreecommitdiff
path: root/mp/src/public/materialsystem/imaterialsystem.h
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/public/materialsystem/imaterialsystem.h')
-rw-r--r--mp/src/public/materialsystem/imaterialsystem.h3516
1 files changed, 1758 insertions, 1758 deletions
diff --git a/mp/src/public/materialsystem/imaterialsystem.h b/mp/src/public/materialsystem/imaterialsystem.h
index cc125156..9a16b9db 100644
--- a/mp/src/public/materialsystem/imaterialsystem.h
+++ b/mp/src/public/materialsystem/imaterialsystem.h
@@ -1,1758 +1,1758 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//
-//===========================================================================//
-
-#ifndef IMATERIALSYSTEM_H
-#define IMATERIALSYSTEM_H
-
-#ifdef _WIN32
-#pragma once
-#endif
-
-#define OVERBRIGHT 2.0f
-#define OO_OVERBRIGHT ( 1.0f / 2.0f )
-#define GAMMA 2.2f
-#define TEXGAMMA 2.2f
-
-#include "tier1/interface.h"
-#include "tier1/refcount.h"
-#include "mathlib/vector.h"
-#include "mathlib/vector4d.h"
-#include "mathlib/vmatrix.h"
-#include "appframework/IAppSystem.h"
-#include "bitmap/imageformat.h"
-#include "texture_group_names.h"
-#include "vtf/vtf.h"
-#include "materialsystem/deformations.h"
-#include "materialsystem/imaterialsystemhardwareconfig.h"
-#include "materialsystem/IColorCorrection.h"
-
-
-//-----------------------------------------------------------------------------
-// forward declarations
-//-----------------------------------------------------------------------------
-class IMaterial;
-class IMesh;
-class IVertexBuffer;
-class IIndexBuffer;
-struct MaterialSystem_Config_t;
-class VMatrix;
-struct matrix3x4_t;
-class ITexture;
-struct MaterialSystemHardwareIdentifier_t;
-class KeyValues;
-class IShader;
-class IVertexTexture;
-class IMorph;
-class IMatRenderContext;
-class ICallQueue;
-struct MorphWeight_t;
-class IFileList;
-
-
-//-----------------------------------------------------------------------------
-// The vertex format type
-//-----------------------------------------------------------------------------
-typedef uint64 VertexFormat_t;
-
-//-----------------------------------------------------------------------------
-// important enumeration
-//-----------------------------------------------------------------------------
-
-// NOTE NOTE NOTE!!!! If you up this, grep for "NEW_INTERFACE" to see if there is anything
-// waiting to be enabled during an interface revision.
-#define MATERIAL_SYSTEM_INTERFACE_VERSION "VMaterialSystem080"
-
-#ifdef POSIX
-#define ABSOLUTE_MINIMUM_DXLEVEL 90
-#else
-#define ABSOLUTE_MINIMUM_DXLEVEL 80
-#endif
-
-enum ShaderParamType_t
-{
- SHADER_PARAM_TYPE_TEXTURE,
- SHADER_PARAM_TYPE_INTEGER,
- SHADER_PARAM_TYPE_COLOR,
- SHADER_PARAM_TYPE_VEC2,
- SHADER_PARAM_TYPE_VEC3,
- SHADER_PARAM_TYPE_VEC4,
- SHADER_PARAM_TYPE_ENVMAP, // obsolete
- SHADER_PARAM_TYPE_FLOAT,
- SHADER_PARAM_TYPE_BOOL,
- SHADER_PARAM_TYPE_FOURCC,
- SHADER_PARAM_TYPE_MATRIX,
- SHADER_PARAM_TYPE_MATERIAL,
- SHADER_PARAM_TYPE_STRING,
-};
-
-enum MaterialMatrixMode_t
-{
- MATERIAL_VIEW = 0,
- MATERIAL_PROJECTION,
-
- // Texture matrices
- MATERIAL_TEXTURE0,
- MATERIAL_TEXTURE1,
- MATERIAL_TEXTURE2,
- MATERIAL_TEXTURE3,
- MATERIAL_TEXTURE4,
- MATERIAL_TEXTURE5,
- MATERIAL_TEXTURE6,
- MATERIAL_TEXTURE7,
-
- MATERIAL_MODEL,
-
- // Total number of matrices
- NUM_MATRIX_MODES = MATERIAL_MODEL+1,
-
- // Number of texture transforms
- NUM_TEXTURE_TRANSFORMS = MATERIAL_TEXTURE7 - MATERIAL_TEXTURE0 + 1
-};
-
-// FIXME: How do I specify the actual number of matrix modes?
-const int NUM_MODEL_TRANSFORMS = 53;
-const int MATERIAL_MODEL_MAX = MATERIAL_MODEL + NUM_MODEL_TRANSFORMS;
-
-enum MaterialPrimitiveType_t
-{
- MATERIAL_POINTS = 0x0,
- MATERIAL_LINES,
- MATERIAL_TRIANGLES,
- MATERIAL_TRIANGLE_STRIP,
- MATERIAL_LINE_STRIP,
- MATERIAL_LINE_LOOP, // a single line loop
- MATERIAL_POLYGON, // this is a *single* polygon
- MATERIAL_QUADS,
- MATERIAL_INSTANCED_QUADS, // (X360) like MATERIAL_QUADS, but uses vertex instancing
-
- // This is used for static meshes that contain multiple types of
- // primitive types. When calling draw, you'll need to specify
- // a primitive type.
- MATERIAL_HETEROGENOUS
-};
-
-enum MaterialPropertyTypes_t
-{
- MATERIAL_PROPERTY_NEEDS_LIGHTMAP = 0, // bool
- MATERIAL_PROPERTY_OPACITY, // int (enum MaterialPropertyOpacityTypes_t)
- MATERIAL_PROPERTY_REFLECTIVITY, // vec3_t
- MATERIAL_PROPERTY_NEEDS_BUMPED_LIGHTMAPS // bool
-};
-
-// acceptable property values for MATERIAL_PROPERTY_OPACITY
-enum MaterialPropertyOpacityTypes_t
-{
- MATERIAL_ALPHATEST = 0,
- MATERIAL_OPAQUE,
- MATERIAL_TRANSLUCENT
-};
-
-enum MaterialBufferTypes_t
-{
- MATERIAL_FRONT = 0,
- MATERIAL_BACK
-};
-
-enum MaterialCullMode_t
-{
- MATERIAL_CULLMODE_CCW, // this culls polygons with counterclockwise winding
- MATERIAL_CULLMODE_CW // this culls polygons with clockwise winding
-};
-
-enum MaterialIndexFormat_t
-{
- MATERIAL_INDEX_FORMAT_UNKNOWN = -1,
- MATERIAL_INDEX_FORMAT_16BIT = 0,
- MATERIAL_INDEX_FORMAT_32BIT,
-};
-
-enum MaterialFogMode_t
-{
- MATERIAL_FOG_NONE,
- MATERIAL_FOG_LINEAR,
- MATERIAL_FOG_LINEAR_BELOW_FOG_Z,
-};
-
-enum MaterialHeightClipMode_t
-{
- MATERIAL_HEIGHTCLIPMODE_DISABLE,
- MATERIAL_HEIGHTCLIPMODE_RENDER_ABOVE_HEIGHT,
- MATERIAL_HEIGHTCLIPMODE_RENDER_BELOW_HEIGHT
-};
-
-enum MaterialNonInteractiveMode_t
-{
- MATERIAL_NON_INTERACTIVE_MODE_NONE = -1,
- MATERIAL_NON_INTERACTIVE_MODE_STARTUP = 0,
- MATERIAL_NON_INTERACTIVE_MODE_LEVEL_LOAD,
-
- MATERIAL_NON_INTERACTIVE_MODE_COUNT,
-};
-
-
-//-----------------------------------------------------------------------------
-// Special morph used in decalling pass
-//-----------------------------------------------------------------------------
-#define MATERIAL_MORPH_DECAL ( (IMorph*)1 )
-
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-
-enum MaterialThreadMode_t
-{
- MATERIAL_SINGLE_THREADED,
- MATERIAL_QUEUED_SINGLE_THREADED,
- MATERIAL_QUEUED_THREADED
-};
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-
-enum MaterialContextType_t
-{
- MATERIAL_HARDWARE_CONTEXT,
- MATERIAL_QUEUED_CONTEXT,
- MATERIAL_NULL_CONTEXT
-};
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-
-enum MaterialFindContext_t
-{
- MATERIAL_FINDCONTEXT_NONE,
- MATERIAL_FINDCONTEXT_ISONAMODEL,
-};
-
-//-----------------------------------------------------------------------------
-// Light structure
-//-----------------------------------------------------------------------------
-#include "mathlib/lightdesc.h"
-
-#if 0
-enum LightType_t
-{
- MATERIAL_LIGHT_DISABLE = 0,
- MATERIAL_LIGHT_POINT,
- MATERIAL_LIGHT_DIRECTIONAL,
- MATERIAL_LIGHT_SPOT,
-};
-
-enum LightType_OptimizationFlags_t
-{
- LIGHTTYPE_OPTIMIZATIONFLAGS_HAS_ATTENUATION0 = 1,
- LIGHTTYPE_OPTIMIZATIONFLAGS_HAS_ATTENUATION1 = 2,
- LIGHTTYPE_OPTIMIZATIONFLAGS_HAS_ATTENUATION2 = 4,
-};
-
-
-struct LightDesc_t
-{
- LightType_t m_Type;
- Vector m_Color;
- Vector m_Position;
- Vector m_Direction;
- float m_Range;
- float m_Falloff;
- float m_Attenuation0;
- float m_Attenuation1;
- float m_Attenuation2;
- float m_Theta;
- float m_Phi;
- // These aren't used by DX8. . used for software lighting.
- float m_ThetaDot;
- float m_PhiDot;
- unsigned int m_Flags;
-
-
- LightDesc_t() {}
-
-private:
- // No copy constructors allowed
- LightDesc_t(const LightDesc_t& vOther);
-};
-#endif
-
-#define CREATERENDERTARGETFLAGS_HDR 0x00000001
-#define CREATERENDERTARGETFLAGS_AUTOMIPMAP 0x00000002
-#define CREATERENDERTARGETFLAGS_UNFILTERABLE_OK 0x00000004
-// XBOX ONLY:
-#define CREATERENDERTARGETFLAGS_NOEDRAM 0x00000008 // inhibit allocation in 360 EDRAM
-#define CREATERENDERTARGETFLAGS_TEMP 0x00000010 // only allocates memory upon first resolve, destroyed at level end
-
-
-//-----------------------------------------------------------------------------
-// allowed stencil operations. These match the d3d operations
-//-----------------------------------------------------------------------------
-enum StencilOperation_t
-{
-#if !defined( _X360 )
- STENCILOPERATION_KEEP = 1,
- STENCILOPERATION_ZERO = 2,
- STENCILOPERATION_REPLACE = 3,
- STENCILOPERATION_INCRSAT = 4,
- STENCILOPERATION_DECRSAT = 5,
- STENCILOPERATION_INVERT = 6,
- STENCILOPERATION_INCR = 7,
- STENCILOPERATION_DECR = 8,
-#else
- STENCILOPERATION_KEEP = D3DSTENCILOP_KEEP,
- STENCILOPERATION_ZERO = D3DSTENCILOP_ZERO,
- STENCILOPERATION_REPLACE = D3DSTENCILOP_REPLACE,
- STENCILOPERATION_INCRSAT = D3DSTENCILOP_INCRSAT,
- STENCILOPERATION_DECRSAT = D3DSTENCILOP_DECRSAT,
- STENCILOPERATION_INVERT = D3DSTENCILOP_INVERT,
- STENCILOPERATION_INCR = D3DSTENCILOP_INCR,
- STENCILOPERATION_DECR = D3DSTENCILOP_DECR,
-#endif
- STENCILOPERATION_FORCE_DWORD = 0x7fffffff
-};
-
-enum StencilComparisonFunction_t
-{
-#if !defined( _X360 )
- STENCILCOMPARISONFUNCTION_NEVER = 1,
- STENCILCOMPARISONFUNCTION_LESS = 2,
- STENCILCOMPARISONFUNCTION_EQUAL = 3,
- STENCILCOMPARISONFUNCTION_LESSEQUAL = 4,
- STENCILCOMPARISONFUNCTION_GREATER = 5,
- STENCILCOMPARISONFUNCTION_NOTEQUAL = 6,
- STENCILCOMPARISONFUNCTION_GREATEREQUAL = 7,
- STENCILCOMPARISONFUNCTION_ALWAYS = 8,
-#else
- STENCILCOMPARISONFUNCTION_NEVER = D3DCMP_NEVER,
- STENCILCOMPARISONFUNCTION_LESS = D3DCMP_LESS,
- STENCILCOMPARISONFUNCTION_EQUAL = D3DCMP_EQUAL,
- STENCILCOMPARISONFUNCTION_LESSEQUAL = D3DCMP_LESSEQUAL,
- STENCILCOMPARISONFUNCTION_GREATER = D3DCMP_GREATER,
- STENCILCOMPARISONFUNCTION_NOTEQUAL = D3DCMP_NOTEQUAL,
- STENCILCOMPARISONFUNCTION_GREATEREQUAL = D3DCMP_GREATEREQUAL,
- STENCILCOMPARISONFUNCTION_ALWAYS = D3DCMP_ALWAYS,
-#endif
-
- STENCILCOMPARISONFUNCTION_FORCE_DWORD = 0x7fffffff
-};
-
-
-//-----------------------------------------------------------------------------
-// Enumeration for the various fields capable of being morphed
-//-----------------------------------------------------------------------------
-enum MorphFormatFlags_t
-{
- MORPH_POSITION = 0x0001, // 3D
- MORPH_NORMAL = 0x0002, // 3D
- MORPH_WRINKLE = 0x0004, // 1D
- MORPH_SPEED = 0x0008, // 1D
- MORPH_SIDE = 0x0010, // 1D
-};
-
-
-//-----------------------------------------------------------------------------
-// The morph format type
-//-----------------------------------------------------------------------------
-typedef unsigned int MorphFormat_t;
-
-
-//-----------------------------------------------------------------------------
-// Standard lightmaps
-//-----------------------------------------------------------------------------
-enum StandardLightmap_t
-{
- MATERIAL_SYSTEM_LIGHTMAP_PAGE_WHITE = -1,
- MATERIAL_SYSTEM_LIGHTMAP_PAGE_WHITE_BUMP = -2,
- MATERIAL_SYSTEM_LIGHTMAP_PAGE_USER_DEFINED = -3
-};
-
-
-struct MaterialSystem_SortInfo_t
-{
- IMaterial *material;
- int lightmapPageID;
-};
-
-
-#define MAX_FB_TEXTURES 4
-
-//-----------------------------------------------------------------------------
-// Information about each adapter
-//-----------------------------------------------------------------------------
-enum
-{
- MATERIAL_ADAPTER_NAME_LENGTH = 512
-};
-
-struct MaterialAdapterInfo_t
-{
- char m_pDriverName[MATERIAL_ADAPTER_NAME_LENGTH];
- unsigned int m_VendorID;
- unsigned int m_DeviceID;
- unsigned int m_SubSysID;
- unsigned int m_Revision;
- int m_nDXSupportLevel; // This is the *preferred* dx support level
- int m_nMaxDXSupportLevel;
- unsigned int m_nDriverVersionHigh;
- unsigned int m_nDriverVersionLow;
-};
-
-
-//-----------------------------------------------------------------------------
-// Video mode info..
-//-----------------------------------------------------------------------------
-struct MaterialVideoMode_t
-{
- int m_Width; // if width and height are 0 and you select
- int m_Height; // windowed mode, it'll use the window size
- ImageFormat m_Format; // use ImageFormats (ignored for windowed mode)
- int m_RefreshRate; // 0 == default (ignored for windowed mode)
-};
-
-// fixme: should move this into something else.
-struct FlashlightState_t
-{
- FlashlightState_t()
- {
- m_bEnableShadows = false; // Provide reasonable defaults for shadow depth mapping parameters
- m_bDrawShadowFrustum = false;
- m_flShadowMapResolution = 1024.0f;
- m_flShadowFilterSize = 3.0f;
- m_flShadowSlopeScaleDepthBias = 16.0f;
- m_flShadowDepthBias = 0.0005f;
- m_flShadowJitterSeed = 0.0f;
- m_flShadowAtten = 0.0f;
- m_bScissor = false;
- m_nLeft = -1;
- m_nTop = -1;
- m_nRight = -1;
- m_nBottom = -1;
- m_nShadowQuality = 0;
- }
-
- Vector m_vecLightOrigin;
- Quaternion m_quatOrientation;
- float m_NearZ;
- float m_FarZ;
- float m_fHorizontalFOVDegrees;
- float m_fVerticalFOVDegrees;
- float m_fQuadraticAtten;
- float m_fLinearAtten;
- float m_fConstantAtten;
- float m_Color[4];
- ITexture *m_pSpotlightTexture;
- int m_nSpotlightTextureFrame;
-
- // Shadow depth mapping parameters
- bool m_bEnableShadows;
- bool m_bDrawShadowFrustum;
- float m_flShadowMapResolution;
- float m_flShadowFilterSize;
- float m_flShadowSlopeScaleDepthBias;
- float m_flShadowDepthBias;
- float m_flShadowJitterSeed;
- float m_flShadowAtten;
- int m_nShadowQuality;
-
- // Getters for scissor members
- bool DoScissor() { return m_bScissor; }
- int GetLeft() { return m_nLeft; }
- int GetTop() { return m_nTop; }
- int GetRight() { return m_nRight; }
- int GetBottom() { return m_nBottom; }
-
-private:
-
- friend class CShadowMgr;
-
- bool m_bScissor;
- int m_nLeft;
- int m_nTop;
- int m_nRight;
- int m_nBottom;
-};
-
-//-----------------------------------------------------------------------------
-// Flags to be used with the Init call
-//-----------------------------------------------------------------------------
-enum MaterialInitFlags_t
-{
- MATERIAL_INIT_ALLOCATE_FULLSCREEN_TEXTURE = 0x2,
- MATERIAL_INIT_REFERENCE_RASTERIZER = 0x4,
-};
-
-//-----------------------------------------------------------------------------
-// Flags to specify type of depth buffer used with RT
-//-----------------------------------------------------------------------------
-
-// GR - this is to add RT with no depth buffer bound
-
-enum MaterialRenderTargetDepth_t
-{
- MATERIAL_RT_DEPTH_SHARED = 0x0,
- MATERIAL_RT_DEPTH_SEPARATE = 0x1,
- MATERIAL_RT_DEPTH_NONE = 0x2,
- MATERIAL_RT_DEPTH_ONLY = 0x3,
-};
-
-//-----------------------------------------------------------------------------
-// A function to be called when we need to release all vertex buffers
-// NOTE: The restore function will tell the caller if all the vertex formats
-// changed so that it can flush caches, etc. if it needs to (for dxlevel support)
-//-----------------------------------------------------------------------------
-enum RestoreChangeFlags_t
-{
- MATERIAL_RESTORE_VERTEX_FORMAT_CHANGED = 0x1,
-};
-
-
-// NOTE: All size modes will force the render target to be smaller than or equal to
-// the size of the framebuffer.
-enum RenderTargetSizeMode_t
-{
- RT_SIZE_NO_CHANGE=0, // Only allowed for render targets that don't want a depth buffer
- // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer).
- RT_SIZE_DEFAULT=1, // Don't play with the specified width and height other than making sure it fits in the framebuffer.
- RT_SIZE_PICMIP=2, // Apply picmip to the render target's width and height.
- RT_SIZE_HDR=3, // frame_buffer_width / 4
- RT_SIZE_FULL_FRAME_BUFFER=4, // Same size as frame buffer, or next lower power of 2 if we can't do that.
- RT_SIZE_OFFSCREEN=5, // Target of specified size, don't mess with dimensions
- RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP=6, // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures.
- RT_SIZE_REPLAY_SCREENSHOT = 7 // Rounded down to power of 2, essentially...
-};
-
-typedef void (*MaterialBufferReleaseFunc_t)( );
-typedef void (*MaterialBufferRestoreFunc_t)( int nChangeFlags ); // see RestoreChangeFlags_t
-typedef void (*ModeChangeCallbackFunc_t)( void );
-
-typedef int VertexBufferHandle_t;
-typedef unsigned short MaterialHandle_t;
-
-DECLARE_POINTER_HANDLE( OcclusionQueryObjectHandle_t );
-#define INVALID_OCCLUSION_QUERY_OBJECT_HANDLE ( (OcclusionQueryObjectHandle_t)0 )
-
-class IMaterialProxyFactory;
-class ITexture;
-class IMaterialSystemHardwareConfig;
-class CShadowMgr;
-
-DECLARE_POINTER_HANDLE( MaterialLock_t );
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-
-abstract_class IMaterialSystem : public IAppSystem
-{
-public:
-
- // Placeholder for API revision
- virtual bool Connect( CreateInterfaceFn factory ) = 0;
- virtual void Disconnect() = 0;
- virtual void *QueryInterface( const char *pInterfaceName ) = 0;
- virtual InitReturnVal_t Init() = 0;
- virtual void Shutdown() = 0;
-
- //---------------------------------------------------------
- // Initialization and shutdown
- //---------------------------------------------------------
-
- // Call this to initialize the material system
- // returns a method to create interfaces in the shader dll
- virtual CreateInterfaceFn Init( char const* pShaderAPIDLL,
- IMaterialProxyFactory *pMaterialProxyFactory,
- CreateInterfaceFn fileSystemFactory,
- CreateInterfaceFn cvarFactory=NULL ) = 0;
-
- // Call this to set an explicit shader version to use
- // Must be called before Init().
- virtual void SetShaderAPI( char const *pShaderAPIDLL ) = 0;
-
- // Must be called before Init(), if you're going to call it at all...
- virtual void SetAdapter( int nAdapter, int nFlags ) = 0;
-
- // Call this when the mod has been set up, which may occur after init
- // At this point, the game + gamebin paths have been set up
- virtual void ModInit() = 0;
- virtual void ModShutdown() = 0;
-
- //---------------------------------------------------------
- //
- //---------------------------------------------------------
- virtual void SetThreadMode( MaterialThreadMode_t mode, int nServiceThread = -1 ) = 0;
- virtual MaterialThreadMode_t GetThreadMode( ) = 0;
- virtual bool IsRenderThreadSafe( ) = 0;
- virtual void ExecuteQueued() = 0;
-
- //---------------------------------------------------------
- // Config management
- //---------------------------------------------------------
-
- virtual IMaterialSystemHardwareConfig *GetHardwareConfig( const char *pVersion, int *returnCode ) = 0;
-
-
- // Call this before rendering each frame with the current config
- // for the material system.
- // Will do whatever is necessary to get the material system into the correct state
- // upon configuration change. .doesn't much else otherwise.
- virtual bool UpdateConfig( bool bForceUpdate ) = 0;
-
- // Force this to be the config; update all material system convars to match the state
- // return true if lightmaps need to be redownloaded
- virtual bool OverrideConfig( const MaterialSystem_Config_t &config, bool bForceUpdate ) = 0;
-
- // Get the current config for this video card (as last set by UpdateConfig)
- virtual const MaterialSystem_Config_t &GetCurrentConfigForVideoCard() const = 0;
-
- // Gets *recommended* configuration information associated with the display card,
- // given a particular dx level to run under.
- // Use dxlevel 0 to use the recommended dx level.
- // The function returns false if an invalid dxlevel was specified
-
- // UNDONE: To find out all convars affected by configuration, we'll need to change
- // the dxsupport.pl program to output all column headers into a single keyvalue block
- // and then we would read that in, and send it back to the client
- virtual bool GetRecommendedConfigurationInfo( int nDXLevel, KeyValues * pKeyValues ) = 0;
-
-
- // -----------------------------------------------------------
- // Device methods
- // -----------------------------------------------------------
-
- // Gets the number of adapters...
- virtual int GetDisplayAdapterCount() const = 0;
-
- // Returns the current adapter in use
- virtual int GetCurrentAdapter() const = 0;
-
- // Returns info about each adapter
- virtual void GetDisplayAdapterInfo( int adapter, MaterialAdapterInfo_t& info ) const = 0;
-
- // Returns the number of modes
- virtual int GetModeCount( int adapter ) const = 0;
-
- // Returns mode information..
- virtual void GetModeInfo( int adapter, int mode, MaterialVideoMode_t& info ) const = 0;
-
- virtual void AddModeChangeCallBack( ModeChangeCallbackFunc_t func ) = 0;
-
- // Returns the mode info for the current display device
- virtual void GetDisplayMode( MaterialVideoMode_t& mode ) const = 0;
-
- // Sets the mode...
- virtual bool SetMode( void* hwnd, const MaterialSystem_Config_t &config ) = 0;
-
- virtual bool SupportsMSAAMode( int nMSAAMode ) = 0;
-
- // FIXME: REMOVE! Get video card identitier
- virtual const MaterialSystemHardwareIdentifier_t &GetVideoCardIdentifier( void ) const = 0;
-
- // Use this to spew information about the 3D layer
- virtual void SpewDriverInfo() const = 0;
-
- virtual void GetDXLevelDefaults(uint &max_dxlevel,uint &recommended_dxlevel) = 0;
-
- // Get the image format of the back buffer. . useful when creating render targets, etc.
- virtual void GetBackBufferDimensions( int &width, int &height) const = 0;
- virtual ImageFormat GetBackBufferFormat() const = 0;
-
- virtual bool SupportsHDRMode( HDRType_t nHDRModede ) = 0;
-
-
- // -----------------------------------------------------------
- // Window methods
- // -----------------------------------------------------------
-
- // Creates/ destroys a child window
- virtual bool AddView( void* hwnd ) = 0;
- virtual void RemoveView( void* hwnd ) = 0;
-
- // Sets the view
- virtual void SetView( void* hwnd ) = 0;
-
-
- // -----------------------------------------------------------
- // Control flow
- // -----------------------------------------------------------
-
- virtual void BeginFrame( float frameTime ) = 0;
- virtual void EndFrame( ) = 0;
- virtual void Flush( bool flushHardware = false ) = 0;
-
- /// FIXME: This stuff needs to be cleaned up and abstracted.
- // Stuff that gets exported to the launcher through the engine
- virtual void SwapBuffers( ) = 0;
-
- // Flushes managed textures from the texture cacher
- virtual void EvictManagedResources() = 0;
-
- virtual void ReleaseResources(void) = 0;
- virtual void ReacquireResources(void ) = 0;
-
-
- // -----------------------------------------------------------
- // Device loss/restore
- // -----------------------------------------------------------
-
- // Installs a function to be called when we need to release vertex buffers + textures
- virtual void AddReleaseFunc( MaterialBufferReleaseFunc_t func ) = 0;
- virtual void RemoveReleaseFunc( MaterialBufferReleaseFunc_t func ) = 0;
-
- // Installs a function to be called when we need to restore vertex buffers
- virtual void AddRestoreFunc( MaterialBufferRestoreFunc_t func ) = 0;
- virtual void RemoveRestoreFunc( MaterialBufferRestoreFunc_t func ) = 0;
-
- // Release temporary HW memory...
- virtual void ResetTempHWMemory( bool bExitingLevel = false ) = 0;
-
- // For dealing with device lost in cases where SwapBuffers isn't called all the time (Hammer)
- virtual void HandleDeviceLost() = 0;
-
-
- // -----------------------------------------------------------
- // Shaders
- // -----------------------------------------------------------
-
- // Used to iterate over all shaders for editing purposes
- // GetShaders returns the number of shaders it actually found
- virtual int ShaderCount() const = 0;
- virtual int GetShaders( int nFirstShader, int nMaxCount, IShader **ppShaderList ) const = 0;
-
- // FIXME: Is there a better way of doing this?
- // Returns shader flag names for editors to be able to edit them
- virtual int ShaderFlagCount() const = 0;
- virtual const char * ShaderFlagName( int nIndex ) const = 0;
-
- // Gets the actual shader fallback for a particular shader
- virtual void GetShaderFallback( const char *pShaderName, char *pFallbackShader, int nFallbackLength ) = 0;
-
-
- // -----------------------------------------------------------
- // Material proxies
- // -----------------------------------------------------------
-
- virtual IMaterialProxyFactory *GetMaterialProxyFactory() = 0;
-
- // Sets the material proxy factory. Calling this causes all materials to be uncached.
- virtual void SetMaterialProxyFactory( IMaterialProxyFactory* pFactory ) = 0;
-
-
- // -----------------------------------------------------------
- // Editor mode
- // -----------------------------------------------------------
-
- // Used to enable editor materials. Must be called before Init.
- virtual void EnableEditorMaterials() = 0;
-
-
- // -----------------------------------------------------------
- // Stub mode mode
- // -----------------------------------------------------------
-
- // Force it to ignore Draw calls.
- virtual void SetInStubMode( bool bInStubMode ) = 0;
-
-
- //---------------------------------------------------------
- // Debug support
- //---------------------------------------------------------
-
- virtual void DebugPrintUsedMaterials( const char *pSearchSubString, bool bVerbose ) = 0;
- virtual void DebugPrintUsedTextures( void ) = 0;
-
- virtual void ToggleSuppressMaterial( char const* pMaterialName ) = 0;
- virtual void ToggleDebugMaterial( char const* pMaterialName ) = 0;
-
-
- //---------------------------------------------------------
- // Misc features
- //---------------------------------------------------------
- //returns whether fast clipping is being used or not - needed to be exposed for better per-object clip behavior
- virtual bool UsingFastClipping( void ) = 0;
-
- virtual int StencilBufferBits( void ) = 0; //number of bits per pixel in the stencil buffer
-
-
- //---------------------------------------------------------
- // Material and texture management
- //---------------------------------------------------------
-
- // uncache all materials. . good for forcing reload of materials.
- virtual void UncacheAllMaterials( ) = 0;
-
- // Remove any materials from memory that aren't in use as determined
- // by the IMaterial's reference count.
- virtual void UncacheUnusedMaterials( bool bRecomputeStateSnapshots = false ) = 0;
-
- // Load any materials into memory that are to be used as determined
- // by the IMaterial's reference count.
- virtual void CacheUsedMaterials( ) = 0;
-
- // Force all textures to be reloaded from disk.
- virtual void ReloadTextures( ) = 0;
-
- // Reloads materials
- virtual void ReloadMaterials( const char *pSubString = NULL ) = 0;
-
- // Create a procedural material. The keyvalues looks like a VMT file
- virtual IMaterial * CreateMaterial( const char *pMaterialName, KeyValues *pVMTKeyValues ) = 0;
-
- // Find a material by name.
- // The name of a material is a full path to
- // the vmt file starting from "hl2/materials" (or equivalent) without
- // a file extension.
- // eg. "dev/dev_bumptest" refers to somethign similar to:
- // "d:/hl2/hl2/materials/dev/dev_bumptest.vmt"
- //
- // Most of the texture groups for pTextureGroupName are listed in texture_group_names.h.
- //
- // Note: if the material can't be found, this returns a checkerboard material. You can
- // find out if you have that material by calling IMaterial::IsErrorMaterial().
- // (Or use the global IsErrorMaterial function, which checks if it's null too).
- virtual IMaterial * FindMaterial( char const* pMaterialName, const char *pTextureGroupName, bool complain = true, const char *pComplainPrefix = NULL ) = 0;
-
- // Query whether a material is loaded (eg, whether FindMaterial will be nonblocking)
- virtual bool IsMaterialLoaded( char const* pMaterialName ) = 0;
-
- //---------------------------------
- // This is the interface for knowing what materials are available
- // is to use the following functions to get a list of materials. The
- // material names will have the full path to the material, and that is the
- // only way that the directory structure of the materials will be seen through this
- // interface.
- // NOTE: This is mostly for worldcraft to get a list of materials to put
- // in the "texture" browser.in Worldcraft
- virtual MaterialHandle_t FirstMaterial() const = 0;
-
- // returns InvalidMaterial if there isn't another material.
- // WARNING: you must call GetNextMaterial until it returns NULL,
- // otherwise there will be a memory leak.
- virtual MaterialHandle_t NextMaterial( MaterialHandle_t h ) const = 0;
-
- // This is the invalid material
- virtual MaterialHandle_t InvalidMaterial() const = 0;
-
- // Returns a particular material
- virtual IMaterial* GetMaterial( MaterialHandle_t h ) const = 0;
-
- // Get the total number of materials in the system. These aren't just the used
- // materials, but the complete collection.
- virtual int GetNumMaterials( ) const = 0;
-
- //---------------------------------
-
- virtual void SetAsyncTextureLoadCache( void* hFileCache ) = 0;
-
- virtual ITexture * FindTexture( char const* pTextureName, const char *pTextureGroupName, bool complain = true, int nAdditionalCreationFlags = 0 ) = 0;
-
- // Checks to see if a particular texture is loaded
- virtual bool IsTextureLoaded( char const* pTextureName ) const = 0;
-
- // Creates a procedural texture
- virtual ITexture * CreateProceduralTexture( const char *pTextureName,
- const char *pTextureGroupName,
- int w,
- int h,
- ImageFormat fmt,
- int nFlags ) = 0;
-
- //
- // Render targets
- //
- virtual void BeginRenderTargetAllocation() = 0;
- virtual void EndRenderTargetAllocation() = 0; // Simulate an Alt-Tab in here, which causes a release/restore of all resources
-
- // Creates a render target
- // If depth == true, a depth buffer is also allocated. If not, then
- // the screen's depth buffer is used.
- // Creates a texture for use as a render target
- virtual ITexture * CreateRenderTargetTexture( int w,
- int h,
- RenderTargetSizeMode_t sizeMode, // Controls how size is generated (and regenerated on video mode change).
- ImageFormat format,
- MaterialRenderTargetDepth_t depth = MATERIAL_RT_DEPTH_SHARED ) = 0;
-
- virtual ITexture * CreateNamedRenderTargetTextureEx( const char *pRTName, // Pass in NULL here for an unnamed render target.
- int w,
- int h,
- RenderTargetSizeMode_t sizeMode, // Controls how size is generated (and regenerated on video mode change).
- ImageFormat format,
- MaterialRenderTargetDepth_t depth = MATERIAL_RT_DEPTH_SHARED,
- unsigned int textureFlags = TEXTUREFLAGS_CLAMPS | TEXTUREFLAGS_CLAMPT,
- unsigned int renderTargetFlags = 0 ) = 0;
-
- virtual ITexture * CreateNamedRenderTargetTexture( const char *pRTName,
- int w,
- int h,
- RenderTargetSizeMode_t sizeMode, // Controls how size is generated (and regenerated on video mode change).
- ImageFormat format,
- MaterialRenderTargetDepth_t depth = MATERIAL_RT_DEPTH_SHARED,
- bool bClampTexCoords = true,
- bool bAutoMipMap = false ) = 0;
-
- // Must be called between the above Begin-End calls!
- virtual ITexture * CreateNamedRenderTargetTextureEx2( const char *pRTName, // Pass in NULL here for an unnamed render target.
- int w,
- int h,
- RenderTargetSizeMode_t sizeMode, // Controls how size is generated (and regenerated on video mode change).
- ImageFormat format,
- MaterialRenderTargetDepth_t depth = MATERIAL_RT_DEPTH_SHARED,
- unsigned int textureFlags = TEXTUREFLAGS_CLAMPS | TEXTUREFLAGS_CLAMPT,
- unsigned int renderTargetFlags = 0 ) = 0;
-
- // -----------------------------------------------------------
- // Lightmaps
- // -----------------------------------------------------------
-
- // To allocate lightmaps, sort the whole world by material twice.
- // The first time through, call AllocateLightmap for every surface.
- // that has a lightmap.
- // The second time through, call AllocateWhiteLightmap for every
- // surface that expects to use shaders that expect lightmaps.
- virtual void BeginLightmapAllocation( ) = 0;
- virtual void EndLightmapAllocation( ) = 0;
-
- // returns the sorting id for this surface
- virtual int AllocateLightmap( int width, int height,
- int offsetIntoLightmapPage[2],
- IMaterial *pMaterial ) = 0;
- // returns the sorting id for this surface
- virtual int AllocateWhiteLightmap( IMaterial *pMaterial ) = 0;
-
- // lightmaps are in linear color space
- // lightmapPageID is returned by GetLightmapPageIDForSortID
- // lightmapSize and offsetIntoLightmapPage are returned by AllocateLightmap.
- // You should never call UpdateLightmap for a lightmap allocated through
- // AllocateWhiteLightmap.
- virtual void UpdateLightmap( int lightmapPageID, int lightmapSize[2],
- int offsetIntoLightmapPage[2],
- float *pFloatImage, float *pFloatImageBump1,
- float *pFloatImageBump2, float *pFloatImageBump3 ) = 0;
-
- // fixme: could just be an array of ints for lightmapPageIDs since the material
- // for a surface is already known.
- virtual int GetNumSortIDs( ) = 0;
- virtual void GetSortInfo( MaterialSystem_SortInfo_t *sortInfoArray ) = 0;
-
- // Read the page size of an existing lightmap by sort id (returned from AllocateLightmap())
- virtual void GetLightmapPageSize( int lightmap, int *width, int *height ) const = 0;
-
- virtual void ResetMaterialLightmapPageInfo() = 0;
-
-
-
- virtual void ClearBuffers( bool bClearColor, bool bClearDepth, bool bClearStencil = false ) = 0;
-
- // -----------------------------------------------------------
- // X360 specifics
- // -----------------------------------------------------------
-
-#if defined( _X360 )
- virtual void ListUsedMaterials( void ) = 0;
- virtual HXUIFONT OpenTrueTypeFont( const char *pFontname, int tall, int style ) = 0;
- virtual void CloseTrueTypeFont( HXUIFONT hFont ) = 0;
- virtual bool GetTrueTypeFontMetrics( HXUIFONT hFont, XUIFontMetrics *pFontMetrics, XUICharMetrics charMetrics[256] ) = 0;
- // Render a sequence of characters and extract the data into a buffer
- // For each character, provide the width+height of the font texture subrect,
- // an offset to apply when rendering the glyph, and an offset into a buffer to receive the RGBA data
- virtual bool GetTrueTypeGlyphs( HXUIFONT hFont, int numChars, wchar_t *pWch, int *pOffsetX, int *pOffsetY, int *pWidth, int *pHeight, unsigned char *pRGBA, int *pRGBAOffset ) = 0;
- virtual void PersistDisplay() = 0;
- virtual void *GetD3DDevice() = 0;
- virtual bool OwnGPUResources( bool bEnable ) = 0;
-#endif
-
- // -----------------------------------------------------------
- // Access the render contexts
- // -----------------------------------------------------------
- virtual IMatRenderContext * GetRenderContext() = 0;
-
- virtual bool SupportsShadowDepthTextures( void ) = 0;
- virtual void BeginUpdateLightmaps( void ) = 0;
- virtual void EndUpdateLightmaps( void ) = 0;
-
- // -----------------------------------------------------------
- // Methods to force the material system into non-threaded, non-queued mode
- // -----------------------------------------------------------
- virtual MaterialLock_t Lock() = 0;
- virtual void Unlock( MaterialLock_t ) = 0;
-
- // Vendor-dependent shadow depth texture format
- virtual ImageFormat GetShadowDepthTextureFormat() = 0;
-
- virtual bool SupportsFetch4( void ) = 0;
-
- // Create a custom render context. Cannot be used to create MATERIAL_HARDWARE_CONTEXT
- virtual IMatRenderContext *CreateRenderContext( MaterialContextType_t type ) = 0;
-
- // Set a specified render context to be the global context for the thread. Returns the prior context.
- virtual IMatRenderContext *SetRenderContext( IMatRenderContext * ) = 0;
-
- virtual bool SupportsCSAAMode( int nNumSamples, int nQualityLevel ) = 0;
-
- virtual void RemoveModeChangeCallBack( ModeChangeCallbackFunc_t func ) = 0;
-
- // Finds or create a procedural material.
- virtual IMaterial * FindProceduralMaterial( const char *pMaterialName, const char *pTextureGroupName, KeyValues *pVMTKeyValues ) = 0;
-
- virtual ImageFormat GetNullTextureFormat() = 0;
-
- virtual void AddTextureAlias( const char *pAlias, const char *pRealName ) = 0;
- virtual void RemoveTextureAlias( const char *pAlias ) = 0;
-
- // returns a lightmap page ID for this allocation, -1 if none available
- // frameID is a number that should be changed every frame to prevent locking any textures that are
- // being used to draw in the previous frame
- virtual int AllocateDynamicLightmap( int lightmapSize[2], int *pOutOffsetIntoPage, int frameID ) = 0;
-
- virtual void SetExcludedTextures( const char *pScriptName ) = 0;
- virtual void UpdateExcludedTextures( void ) = 0;
-
- virtual bool IsInFrame( ) const = 0;
-
- virtual void CompactMemory() = 0;
-
- // For sv_pure mode. The filesystem figures out which files the client needs to reload to be "pure" ala the server's preferences.
- virtual void ReloadFilesInList( IFileList *pFilesToReload ) = 0;
- virtual bool AllowThreading( bool bAllow, int nServiceThread ) = 0;
-
- // Extended version of FindMaterial().
- // Contains context in so it can make decisions (i.e. if it's a model, ignore certain cheat parameters)
- virtual IMaterial * FindMaterialEx( char const* pMaterialName, const char *pTextureGroupName, int nContext, bool complain = true, const char *pComplainPrefix = NULL ) = 0;
-
-#ifdef DX_TO_GL_ABSTRACTION
- virtual void DoStartupShaderPreloading( void ) = 0;
-#endif
-};
-
-
-//-----------------------------------------------------------------------------
-//
-//-----------------------------------------------------------------------------
-abstract_class IMatRenderContext : public IRefCounted
-{
-public:
- virtual void BeginRender() = 0;
- virtual void EndRender() = 0;
-
- virtual void Flush( bool flushHardware = false ) = 0;
-
- virtual void BindLocalCubemap( ITexture *pTexture ) = 0;
-
- // pass in an ITexture (that is build with "rendertarget" "1") or
- // pass in NULL for the regular backbuffer.
- virtual void SetRenderTarget( ITexture *pTexture ) = 0;
- virtual ITexture * GetRenderTarget( void ) = 0;
-
- virtual void GetRenderTargetDimensions( int &width, int &height) const = 0;
-
- // Bind a material is current for rendering.
- virtual void Bind( IMaterial *material, void *proxyData = 0 ) = 0;
- // Bind a lightmap page current for rendering. You only have to
- // do this for materials that require lightmaps.
- virtual void BindLightmapPage( int lightmapPageID ) = 0;
-
- // inputs are between 0 and 1
- virtual void DepthRange( float zNear, float zFar ) = 0;
-
- virtual void ClearBuffers( bool bClearColor, bool bClearDepth, bool bClearStencil = false ) = 0;
-
- // read to a unsigned char rgb image.
- virtual void ReadPixels( int x, int y, int width, int height, unsigned char *data, ImageFormat dstFormat ) = 0;
-
- // Sets lighting
- virtual void SetAmbientLight( float r, float g, float b ) = 0;
- virtual void SetLight( int lightNum, const LightDesc_t& desc ) = 0;
-
- // The faces of the cube are specified in the same order as cubemap textures
- virtual void SetAmbientLightCube( Vector4D cube[6] ) = 0;
-
- // Blit the backbuffer to the framebuffer texture
- virtual void CopyRenderTargetToTexture( ITexture *pTexture ) = 0;
-
- // Set the current texture that is a copy of the framebuffer.
- virtual void SetFrameBufferCopyTexture( ITexture *pTexture, int textureIndex = 0 ) = 0;
- virtual ITexture *GetFrameBufferCopyTexture( int textureIndex ) = 0;
-
- //
- // end vertex array api
- //
-
- // matrix api
- virtual void MatrixMode( MaterialMatrixMode_t matrixMode ) = 0;
- virtual void PushMatrix( void ) = 0;
- virtual void PopMatrix( void ) = 0;
- virtual void LoadMatrix( VMatrix const& matrix ) = 0;
- virtual void LoadMatrix( matrix3x4_t const& matrix ) = 0;
- virtual void MultMatrix( VMatrix const& matrix ) = 0;
- virtual void MultMatrix( matrix3x4_t const& matrix ) = 0;
- virtual void MultMatrixLocal( VMatrix const& matrix ) = 0;
- virtual void MultMatrixLocal( matrix3x4_t const& matrix ) = 0;
- virtual void GetMatrix( MaterialMatrixMode_t matrixMode, VMatrix *matrix ) = 0;
- virtual void GetMatrix( MaterialMatrixMode_t matrixMode, matrix3x4_t *matrix ) = 0;
- virtual void LoadIdentity( void ) = 0;
- virtual void Ortho( double left, double top, double right, double bottom, 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;
- // end matrix api
-
- // Sets/gets the viewport
- virtual void Viewport( int x, int y, int width, int height ) = 0;
- virtual void GetViewport( int& x, int& y, int& width, int& height ) const = 0;
-
- // The cull mode
- virtual void CullMode( MaterialCullMode_t cullMode ) = 0;
-
- // end matrix api
-
- // This could easily be extended to a general user clip plane
- virtual void SetHeightClipMode( MaterialHeightClipMode_t nHeightClipMode ) = 0;
- // garymcthack : fog z is always used for heightclipz for now.
- virtual void SetHeightClipZ( float z ) = 0;
-
- // Fog methods...
- virtual void FogMode( MaterialFogMode_t fogMode ) = 0;
- virtual void FogStart( float fStart ) = 0;
- virtual void FogEnd( float fEnd ) = 0;
- virtual void SetFogZ( float fogZ ) = 0;
- virtual MaterialFogMode_t GetFogMode( void ) = 0;
-
- virtual void FogColor3f( float r, float g, float b ) = 0;
- virtual void FogColor3fv( float const* rgb ) = 0;
- virtual void FogColor3ub( unsigned char r, unsigned char g, unsigned char b ) = 0;
- virtual void FogColor3ubv( unsigned char const* rgb ) = 0;
-
- virtual void GetFogColor( unsigned char *rgb ) = 0;
-
- // Sets the number of bones for skinning
- virtual void SetNumBoneWeights( int numBones ) = 0;
-
- // Creates/destroys Mesh
- virtual IMesh* CreateStaticMesh( VertexFormat_t fmt, const char *pTextureBudgetGroup, IMaterial * pMaterial = NULL ) = 0;
- virtual void DestroyStaticMesh( IMesh* mesh ) = 0;
-
- // Gets the dynamic mesh associated with the currently bound material
- // note that you've got to render the mesh before calling this function
- // a second time. Clients should *not* call DestroyStaticMesh on the mesh
- // returned by this call.
- // Use buffered = false if you want to not have the mesh be buffered,
- // but use it instead in the following pattern:
- // meshBuilder.Begin
- // meshBuilder.End
- // Draw partial
- // Draw partial
- // Draw partial
- // meshBuilder.Begin
- // meshBuilder.End
- // etc
- // Use Vertex or Index Override to supply a static vertex or index buffer
- // to use in place of the dynamic buffers.
- //
- // If you pass in a material in pAutoBind, it will automatically bind the
- // material. This can be helpful since you must bind the material you're
- // going to use BEFORE calling GetDynamicMesh.
- virtual IMesh* GetDynamicMesh(
- bool buffered = true,
- IMesh* pVertexOverride = 0,
- IMesh* pIndexOverride = 0,
- IMaterial *pAutoBind = 0 ) = 0;
-
- // ------------ New Vertex/Index Buffer interface ----------------------------
- // Do we need support for bForceTempMesh and bSoftwareVertexShader?
- // I don't think we use bSoftwareVertexShader anymore. .need to look into bForceTempMesh.
- virtual IVertexBuffer *CreateStaticVertexBuffer( VertexFormat_t fmt, int nVertexCount, const char *pTextureBudgetGroup ) = 0;
- virtual IIndexBuffer *CreateStaticIndexBuffer( MaterialIndexFormat_t fmt, int nIndexCount, const char *pTextureBudgetGroup ) = 0;
- virtual void DestroyVertexBuffer( IVertexBuffer * ) = 0;
- virtual void DestroyIndexBuffer( IIndexBuffer * ) = 0;
- // Do we need to specify the stream here in the case of locking multiple dynamic VBs on different streams?
- virtual IVertexBuffer *GetDynamicVertexBuffer( int streamID, VertexFormat_t vertexFormat, bool bBuffered = true ) = 0;
- virtual IIndexBuffer *GetDynamicIndexBuffer( MaterialIndexFormat_t fmt, bool bBuffered = true ) = 0;
- virtual void BindVertexBuffer( int streamID, IVertexBuffer *pVertexBuffer, int nOffsetInBytes, int nFirstVertex, int nVertexCount, VertexFormat_t fmt, int nRepetitions = 1 ) = 0;
- virtual void BindIndexBuffer( IIndexBuffer *pIndexBuffer, int nOffsetInBytes ) = 0;
- virtual void Draw( MaterialPrimitiveType_t primitiveType, int firstIndex, int numIndices ) = 0;
- // ------------ End ----------------------------
-
- // Selection mode methods
- virtual int SelectionMode( bool selectionMode ) = 0;
- virtual void SelectionBuffer( unsigned int* pBuffer, int size ) = 0;
- virtual void ClearSelectionNames( ) = 0;
- virtual void LoadSelectionName( int name ) = 0;
- virtual void PushSelectionName( int name ) = 0;
- virtual void PopSelectionName() = 0;
-
- // Sets the Clear Color for ClearBuffer....
- virtual void ClearColor3ub( unsigned char r, unsigned char g, unsigned char b ) = 0;
- virtual void ClearColor4ub( unsigned char r, unsigned char g, unsigned char b, unsigned char a ) = 0;
-
- // Allows us to override the depth buffer setting of a material
- virtual void OverrideDepthEnable( bool bEnable, bool bDepthEnable ) = 0;
-
- // FIXME: This is a hack required for NVidia/XBox, can they fix in drivers?
- virtual void DrawScreenSpaceQuad( IMaterial* pMaterial ) = 0;
-
- // For debugging and building recording files. This will stuff a token into the recording file,
- // then someone doing a playback can watch for the token.
- virtual void SyncToken( const char *pToken ) = 0;
-
- // FIXME: REMOVE THIS FUNCTION!
- // The only reason why it's not gone is because we're a week from ship when I found the bug in it
- // and everything's tuned to use it.
- // It's returning values which are 2x too big (it's returning sphere diameter x2)
- // Use ComputePixelDiameterOfSphere below in all new code instead.
- virtual float ComputePixelWidthOfSphere( const Vector& origin, float flRadius ) = 0;
-
- //
- // Occlusion query support
- //
-
- // Allocate and delete query objects.
- virtual OcclusionQueryObjectHandle_t CreateOcclusionQueryObject( void ) = 0;
- virtual void DestroyOcclusionQueryObject( OcclusionQueryObjectHandle_t ) = 0;
-
- // Bracket drawing with begin and end so that we can get counts next frame.
- virtual void BeginOcclusionQueryDrawing( OcclusionQueryObjectHandle_t ) = 0;
- virtual void EndOcclusionQueryDrawing( OcclusionQueryObjectHandle_t ) = 0;
-
- // Get the number of pixels rendered between begin and end on an earlier frame.
- // Calling this in the same frame is a huge perf hit!
- virtual int OcclusionQuery_GetNumPixelsRendered( OcclusionQueryObjectHandle_t ) = 0;
-
- virtual void SetFlashlightMode( bool bEnable ) = 0;
-
- virtual void SetFlashlightState( const FlashlightState_t &state, const VMatrix &worldToTexture ) = 0;
-
- // Gets the current height clip mode
- virtual MaterialHeightClipMode_t GetHeightClipMode( ) = 0;
-
- // This returns the diameter of the sphere in pixels based on
- // the current model, view, + projection matrices and viewport.
- virtual float ComputePixelDiameterOfSphere( const Vector& vecAbsOrigin, float flRadius ) = 0;
-
- // By default, the material system applies the VIEW and PROJECTION matrices to the user clip
- // planes (which are specified in world space) to generate projection-space user clip planes
- // Occasionally (for the particle system in hl2, for example), we want to override that
- // behavior and explictly specify a ViewProj transform for user clip planes
- virtual void EnableUserClipTransformOverride( bool bEnable ) = 0;
- virtual void UserClipTransform( const VMatrix &worldToView ) = 0;
-
- virtual bool GetFlashlightMode() const = 0;
-
- // Used to make the handle think it's never had a successful query before
- virtual void ResetOcclusionQueryObject( OcclusionQueryObjectHandle_t ) = 0;
-
- // FIXME: Remove
- virtual void Unused3() {}
-
- // Creates/destroys morph data associated w/ a particular material
- virtual IMorph *CreateMorph( MorphFormat_t format, const char *pDebugName ) = 0;
- virtual void DestroyMorph( IMorph *pMorph ) = 0;
-
- // Binds the morph data for use in rendering
- virtual void BindMorph( IMorph *pMorph ) = 0;
-
- // Sets flexweights for rendering
- virtual void SetFlexWeights( int nFirstWeight, int nCount, const MorphWeight_t* pWeights ) = 0;
-
- // FIXME: Remove
- virtual void Unused4() {};
- virtual void Unused5() {};
- virtual void Unused6() {};
- virtual void Unused7() {};
- virtual void Unused8() {};
-
- // Read w/ stretch to a host-memory buffer
- virtual void ReadPixelsAndStretch( Rect_t *pSrcRect, Rect_t *pDstRect, unsigned char *pBuffer, ImageFormat dstFormat, int nDstStride ) = 0;
-
- // Gets the window size
- virtual void GetWindowSize( int &width, int &height ) const = 0;
-
- // This function performs a texture map from one texture map to the render destination, doing
- // all the necessary pixel/texel coordinate fix ups. fractional values can be used for the
- // src_texture coordinates to get linear sampling - integer values should produce 1:1 mappings
- // for non-scaled operations.
- virtual void DrawScreenSpaceRectangle(
- IMaterial *pMaterial,
- int destx, int desty,
- int width, int height,
- float src_texture_x0, float src_texture_y0, // which texel you want to appear at
- // destx/y
- float src_texture_x1, float src_texture_y1, // which texel you want to appear at
- // destx+width-1, desty+height-1
- int src_texture_width, int src_texture_height, // needed for fixup
- void *pClientRenderable = NULL,
- int nXDice = 1,
- int nYDice = 1 )=0;
-
- virtual void LoadBoneMatrix( int boneIndex, const matrix3x4_t& matrix ) = 0;
-
- // This version will push the current rendertarget + current viewport onto the stack
- virtual void PushRenderTargetAndViewport( ) = 0;
-
- // This version will push a new rendertarget + a maximal viewport for that rendertarget onto the stack
- virtual void PushRenderTargetAndViewport( ITexture *pTexture ) = 0;
-
- // This version will push a new rendertarget + a specified viewport onto the stack
- virtual void PushRenderTargetAndViewport( ITexture *pTexture, int nViewX, int nViewY, int nViewW, int nViewH ) = 0;
-
- // This version will push a new rendertarget + a specified viewport onto the stack
- virtual void PushRenderTargetAndViewport( ITexture *pTexture, ITexture *pDepthTexture, int nViewX, int nViewY, int nViewW, int nViewH ) = 0;
-
- // This will pop a rendertarget + viewport
- virtual void PopRenderTargetAndViewport( void ) = 0;
-
- // Binds a particular texture as the current lightmap
- virtual void BindLightmapTexture( ITexture *pLightmapTexture ) = 0;
-
- // Blit a subrect of the current render target to another texture
- virtual void CopyRenderTargetToTextureEx( ITexture *pTexture, int nRenderTargetID, Rect_t *pSrcRect, Rect_t *pDstRect = NULL ) = 0;
- virtual void CopyTextureToRenderTargetEx( int nRenderTargetID, ITexture *pTexture, Rect_t *pSrcRect, Rect_t *pDstRect = NULL ) = 0;
-
- // Special off-center perspective matrix for DoF, MSAA jitter and poster rendering
- virtual void PerspectiveOffCenterX( double fovx, double aspect, double zNear, double zFar, double bottom, double top, double left, double right ) = 0;
-
- // Rendering parameters control special drawing modes withing the material system, shader
- // system, shaders, and engine. renderparm.h has their definitions.
- 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;
-
- // 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 SetRenderTargetEx( int nRenderTargetID, ITexture *pTexture ) = 0;
-
- // rendering clip planes, beware that only the most recently pushed plane will actually be used in a sizeable chunk of hardware configurations
- // and that changes to the clip planes mid-frame while UsingFastClipping() is true will result unresolvable depth inconsistencies
- virtual void PushCustomClipPlane( const float *pPlane ) = 0;
- virtual void PopCustomClipPlane( void ) = 0;
-
- // Returns the number of vertices + indices we can render using the dynamic mesh
- // Passing true in the second parameter will return the max # of vertices + indices
- // we can use before a flush is provoked and may return different values
- // if called multiple times in succession.
- // Passing false into the second parameter will return
- // the maximum possible vertices + indices that can be rendered in a single batch
- virtual void GetMaxToRender( IMesh *pMesh, bool bMaxUntilFlush, int *pMaxVerts, int *pMaxIndices ) = 0;
-
- // Returns the max possible vertices + indices to render in a single draw call
- virtual int GetMaxVerticesToRender( IMaterial *pMaterial ) = 0;
- virtual int GetMaxIndicesToRender( ) = 0;
- virtual void DisableAllLocalLights() = 0;
- virtual int CompareMaterialCombos( IMaterial *pMaterial1, IMaterial *pMaterial2, int lightMapID1, int lightMapID2 ) = 0;
-
- virtual IMesh *GetFlexMesh() = 0;
-
- virtual void SetFlashlightStateEx( const FlashlightState_t &state, const VMatrix &worldToTexture, ITexture *pFlashlightDepthTexture ) = 0;
-
- // Returns the currently bound local cubemap
- virtual ITexture *GetLocalCubemap( ) = 0;
-
- // This is a version of clear buffers which will only clear the buffer at pixels which pass the stencil test
- virtual void ClearBuffersObeyStencil( bool bClearColor, bool bClearDepth ) = 0;
-
- //enables/disables all entered clipping planes, returns the input from the last time it was called.
- virtual bool EnableClipping( bool bEnable ) = 0;
-
- //get fog distances entered with FogStart(), FogEnd(), and SetFogZ()
- virtual void GetFogDistances( float *fStart, float *fEnd, float *fFogZ ) = 0;
-
- // Hooks for firing PIX events from outside the Material System...
- virtual void BeginPIXEvent( unsigned long color, const char *szName ) = 0;
- virtual void EndPIXEvent() = 0;
- virtual void SetPIXMarker( unsigned long color, const char *szName ) = 0;
-
- // Batch API
- // from changelist 166623:
- // - replaced obtuse material system batch usage with an explicit and easier to thread API
- virtual void BeginBatch( IMesh* pIndices ) = 0;
- virtual void BindBatch( IMesh* pVertices, IMaterial *pAutoBind = NULL ) = 0;
- virtual void DrawBatch(int firstIndex, int numIndices ) = 0;
- virtual void EndBatch() = 0;
-
- // Raw access to the call queue, which can be NULL if not in a queued mode
- virtual ICallQueue *GetCallQueue() = 0;
-
- // Returns the world-space camera position
- virtual void GetWorldSpaceCameraPosition( Vector *pCameraPos ) = 0;
- virtual void GetWorldSpaceCameraVectors( Vector *pVecForward, Vector *pVecRight, Vector *pVecUp ) = 0;
-
- // Tone mapping
- virtual void ResetToneMappingScale( float monoscale) = 0; // set scale to monoscale instantly with no chasing
- virtual void SetGoalToneMappingScale( float monoscale) = 0; // set scale to monoscale instantly with no chasing
-
- // call TurnOnToneMapping before drawing the 3d scene to get the proper interpolated brightness
- // value set.
- virtual void TurnOnToneMapping() = 0;
-
- // Set a linear vector color scale for all 3D rendering.
- // A value of [1.0f, 1.0f, 1.0f] should match non-tone-mapped rendering.
- virtual void SetToneMappingScaleLinear( const Vector &scale ) = 0;
-
- virtual Vector GetToneMappingScaleLinear( void ) = 0;
- virtual void SetShadowDepthBiasFactors( float fSlopeScaleDepthBias, float fDepthBias ) = 0;
-
- // Apply stencil operations to every pixel on the screen without disturbing depth or color buffers
- virtual void PerformFullScreenStencilOperation( void ) = 0;
-
- // Sets lighting origin for the current model (needed to convert directional lights to points)
- virtual void SetLightingOrigin( Vector vLightingOrigin ) = 0;
-
- // Set scissor rect for rendering
- virtual void SetScissorRect( const int nLeft, const int nTop, const int nRight, const int nBottom, const bool bEnableScissor ) = 0;
-
- // Methods used to build the morph accumulator that is read from when HW morph<ing is enabled.
- virtual void BeginMorphAccumulation() = 0;
- virtual void EndMorphAccumulation() = 0;
- virtual void AccumulateMorph( IMorph* pMorph, int nMorphCount, const MorphWeight_t* pWeights ) = 0;
-
- virtual void PushDeformation( DeformationBase_t const *Deformation ) = 0;
- virtual void PopDeformation( ) = 0;
- virtual int GetNumActiveDeformations() const = 0;
-
- virtual bool GetMorphAccumulatorTexCoord( Vector2D *pTexCoord, IMorph *pMorph, int nVertex ) = 0;
-
- // Version of get dynamic mesh that specifies a specific vertex format
- virtual IMesh* GetDynamicMeshEx( VertexFormat_t vertexFormat, bool bBuffered = true,
- IMesh* pVertexOverride = 0, IMesh* pIndexOverride = 0, IMaterial *pAutoBind = 0 ) = 0;
-
- virtual void FogMaxDensity( float flMaxDensity ) = 0;
-
-#if defined( _X360 )
- //Seems best to expose GPR allocation to scene rendering code. 128 total to split between vertex/pixel shaders (pixel will be set to 128 - vertex). Minimum value of 16. More GPR's = more threads.
- virtual void PushVertexShaderGPRAllocation( int iVertexShaderCount = 64 ) = 0;
- virtual void PopVertexShaderGPRAllocation( void ) = 0;
-#endif
-
- virtual IMaterial *GetCurrentMaterial() = 0;
- virtual int GetCurrentNumBones() const = 0;
- virtual void *GetCurrentProxy() = 0;
-
- // Color correction related methods..
- // Client cannot call IColorCorrectionSystem directly because it is not thread-safe
- // FIXME: Make IColorCorrectionSystem threadsafe?
- virtual void EnableColorCorrection( bool bEnable ) = 0;
- virtual ColorCorrectionHandle_t AddLookup( const char *pName ) = 0;
- virtual bool RemoveLookup( ColorCorrectionHandle_t handle ) = 0;
- virtual void LockLookup( ColorCorrectionHandle_t handle ) = 0;
- virtual void LoadLookup( ColorCorrectionHandle_t handle, const char *pLookupName ) = 0;
- virtual void UnlockLookup( ColorCorrectionHandle_t handle ) = 0;
- virtual void SetLookupWeight( ColorCorrectionHandle_t handle, float flWeight ) = 0;
- virtual void ResetLookupWeights( ) = 0;
- virtual void SetResetable( ColorCorrectionHandle_t handle, bool bResetable ) = 0;
-
- //There are some cases where it's simply not reasonable to update the full screen depth texture (mostly on PC).
- //Use this to mark it as invalid and use a dummy texture for depth reads.
- virtual void SetFullScreenDepthTextureValidityFlag( bool bIsValid ) = 0;
-
- // A special path used to tick the front buffer while loading on the 360
- virtual void SetNonInteractivePacifierTexture( ITexture *pTexture, float flNormalizedX, float flNormalizedY, float flNormalizedSize ) = 0;
- virtual void SetNonInteractiveTempFullscreenBuffer( ITexture *pTexture, MaterialNonInteractiveMode_t mode ) = 0;
- virtual void EnableNonInteractiveMode( MaterialNonInteractiveMode_t mode ) = 0;
- virtual void RefreshFrontBufferNonInteractive() = 0;
- // Allocates temp render data. Renderdata goes out of scope at frame end in multicore
- // Renderdata goes out of scope after refcount goes to zero in singlecore.
- // Locking/unlocking increases + decreases refcount
- virtual void * LockRenderData( int nSizeInBytes ) = 0;
- virtual void UnlockRenderData( void *pData ) = 0;
-
- // Typed version. If specified, pSrcData is copied into the locked memory.
- template< class E > E* LockRenderDataTyped( int nCount, const E* pSrcData = NULL );
-
- // Temp render data gets immediately freed after it's all unlocked in single core.
- // This prevents it from being freed
- virtual void AddRefRenderData() = 0;
- virtual void ReleaseRenderData() = 0;
-
- // Returns whether a pointer is render data. NOTE: passing NULL returns true
- virtual bool IsRenderData( const void *pData ) const = 0;
- virtual void PrintfVA( char *fmt, va_list vargs ) = 0;
- virtual void Printf( PRINTF_FORMAT_STRING char *fmt, ... ) = 0;
- virtual float Knob( char *knobname, float *setvalue = NULL ) = 0;
- // Allows us to override the alpha write setting of a material
- virtual void OverrideAlphaWriteEnable( bool bEnable, bool bAlphaWriteEnable ) = 0;
- virtual void OverrideColorWriteEnable( bool bOverrideEnable, bool bColorWriteEnable ) = 0;
-
- virtual void ClearBuffersObeyStencilEx( bool bClearColor, bool bClearAlpha, bool bClearDepth ) = 0;
-};
-
-template< class E > inline E* IMatRenderContext::LockRenderDataTyped( int nCount, const E* pSrcData )
-{
- int nSizeInBytes = nCount * sizeof(E);
- E *pDstData = (E*)LockRenderData( nSizeInBytes );
- if ( pSrcData && pDstData )
- {
- memcpy( pDstData, pSrcData, nSizeInBytes );
- }
- return pDstData;
-}
-
-
-//-----------------------------------------------------------------------------
-// Utility class for addreffing/releasing render data (prevents freeing on single core)
-//-----------------------------------------------------------------------------
-class CMatRenderDataReference
-{
-public:
- CMatRenderDataReference();
- CMatRenderDataReference( IMatRenderContext* pRenderContext );
- ~CMatRenderDataReference();
- void Lock( IMatRenderContext *pRenderContext );
- void Release();
-
-private:
- IMatRenderContext *m_pRenderContext;
-};
-
-
-inline CMatRenderDataReference::CMatRenderDataReference()
-{
- m_pRenderContext = NULL;
-}
-
-inline CMatRenderDataReference::CMatRenderDataReference( IMatRenderContext* pRenderContext )
-{
- m_pRenderContext = NULL;
- Lock( pRenderContext );
-}
-
-inline CMatRenderDataReference::~CMatRenderDataReference()
-{
- Release();
-}
-
-inline void CMatRenderDataReference::Lock( IMatRenderContext* pRenderContext )
-{
- if ( !m_pRenderContext )
- {
- m_pRenderContext = pRenderContext;
- m_pRenderContext->AddRefRenderData( );
- }
-}
-
-inline void CMatRenderDataReference::Release()
-{
- if ( m_pRenderContext )
- {
- m_pRenderContext->ReleaseRenderData( );
- m_pRenderContext = NULL;
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// Utility class for locking/unlocking render data
-//-----------------------------------------------------------------------------
-template< typename E >
-class CMatRenderData
-{
-public:
- CMatRenderData( IMatRenderContext* pRenderContext );
- CMatRenderData( IMatRenderContext* pRenderContext, int nCount, const E *pSrcData = NULL );
- ~CMatRenderData();
- E* Lock( int nCount, const E* pSrcData = NULL );
- void Release();
- bool IsValid() const;
- const E* Base() const;
- E* Base();
- const E& operator[]( int i ) const;
- E& operator[]( int i );
-
-private:
- IMatRenderContext* m_pRenderContext;
- E *m_pRenderData;
- int m_nCount;
- bool m_bNeedsUnlock;
-};
-
-template< typename E >
-inline CMatRenderData<E>::CMatRenderData( IMatRenderContext* pRenderContext )
-{
- m_pRenderContext = pRenderContext;
- m_nCount = 0;
- m_pRenderData = 0;
- m_bNeedsUnlock = false;
-}
-
-template< typename E >
-inline CMatRenderData<E>::CMatRenderData( IMatRenderContext* pRenderContext, int nCount, const E* pSrcData )
-{
- m_pRenderContext = pRenderContext;
- m_nCount = 0;
- m_pRenderData = 0;
- m_bNeedsUnlock = false;
- Lock( nCount, pSrcData );
-}
-
-template< typename E >
-inline CMatRenderData<E>::~CMatRenderData()
-{
- Release();
-}
-
-template< typename E >
-inline bool CMatRenderData<E>::IsValid() const
-{
- return m_pRenderData != NULL;
-}
-
-template< typename E >
-inline E* CMatRenderData<E>::Lock( int nCount, const E* pSrcData )
-{
- m_nCount = nCount;
- if ( pSrcData && m_pRenderContext->IsRenderData( pSrcData ) )
- {
- // Yes, we're const-casting away, but that should be ok since
- // the src data is render data
- m_pRenderData = const_cast<E*>( pSrcData );
- m_pRenderContext->AddRefRenderData();
- m_bNeedsUnlock = false;
- return m_pRenderData;
- }
- m_pRenderData = m_pRenderContext->LockRenderDataTyped<E>( nCount, pSrcData );
- m_bNeedsUnlock = true;
- return m_pRenderData;
-}
-
-template< typename E >
-inline void CMatRenderData<E>::Release()
-{
- if ( m_pRenderContext && m_pRenderData )
- {
- if ( m_bNeedsUnlock )
- {
- m_pRenderContext->UnlockRenderData( m_pRenderData );
- }
- else
- {
- m_pRenderContext->ReleaseRenderData();
- }
- }
- m_pRenderData = NULL;
- m_nCount = 0;
- m_bNeedsUnlock = false;
-}
-
-template< typename E >
-inline E* CMatRenderData<E>::Base()
-{
- return m_pRenderData;
-}
-
-template< typename E >
-inline const E* CMatRenderData<E>::Base() const
-{
- return m_pRenderData;
-}
-
-template< typename E >
-inline E& CMatRenderData<E>::operator[]( int i )
-{
- Assert( ( i >= 0 ) && ( i < m_nCount ) );
- return m_pRenderData[i];
-}
-
-template< typename E >
-inline const E& CMatRenderData<E>::operator[]( int i ) const
-{
- Assert( ( i >= 0 ) && ( i < m_nCount ) );
- return m_pRenderData[i];
-}
-
-
-//-----------------------------------------------------------------------------
-
-class CMatRenderContextPtr : public CRefPtr<IMatRenderContext>
-{
- typedef CRefPtr<IMatRenderContext> BaseClass;
-public:
- CMatRenderContextPtr() {}
- CMatRenderContextPtr( IMatRenderContext *pInit ) : BaseClass( pInit ) { if ( BaseClass::m_pObject ) BaseClass::m_pObject->BeginRender(); }
- CMatRenderContextPtr( IMaterialSystem *pFrom ) : BaseClass( pFrom->GetRenderContext() ) { if ( BaseClass::m_pObject ) BaseClass::m_pObject->BeginRender(); }
- ~CMatRenderContextPtr() { if ( BaseClass::m_pObject ) BaseClass::m_pObject->EndRender(); }
-
- IMatRenderContext *operator=( IMatRenderContext *p ) { if ( p ) p->BeginRender(); return BaseClass::operator=( p ); }
-
- void SafeRelease() { if ( BaseClass::m_pObject ) BaseClass::m_pObject->EndRender(); BaseClass::SafeRelease(); }
- void AssignAddRef( IMatRenderContext *pFrom ) { if ( BaseClass::m_pObject ) BaseClass::m_pObject->EndRender(); BaseClass::AssignAddRef( pFrom ); BaseClass::m_pObject->BeginRender(); }
-
- void GetFrom( IMaterialSystem *pFrom ) { AssignAddRef( pFrom->GetRenderContext() ); }
-
-
-private:
- CMatRenderContextPtr( const CMatRenderContextPtr &from );
- void operator=( const CMatRenderContextPtr &from );
-
-};
-
-//-----------------------------------------------------------------------------
-// Helper class for begin/end of pix event via constructor/destructor
-//-----------------------------------------------------------------------------
-#define PIX_VALVE_ORANGE 0xFFF5940F
-
-class PIXEvent
-{
-public:
- PIXEvent( IMatRenderContext *pRenderContext, const char *szName, unsigned long color = PIX_VALVE_ORANGE )
- {
- m_pRenderContext = pRenderContext;
- Assert( m_pRenderContext );
- Assert( szName );
- m_pRenderContext->BeginPIXEvent( color, szName );
- }
- ~PIXEvent()
- {
- m_pRenderContext->EndPIXEvent();
- }
-private:
- IMatRenderContext *m_pRenderContext;
-};
-
-
-// Also be sure to enable PIX_INSTRUMENTATION in shaderdevicedx8.h
-//#define PIX_ENABLE 1 // set this to 1 and build engine/studiorender to enable pix events in the engine
-
-#if PIX_ENABLE
-# define PIXEVENT PIXEvent _pixEvent
-#else
-# define PIXEVENT
-#endif
-
-//-----------------------------------------------------------------------------
-
-#ifdef MATERIAL_SYSTEM_DEBUG_CALL_QUEUE
-#include "tier1/callqueue.h"
-#include "tier1/fmtstr.h"
-static void DoMatSysQueueMark( IMaterialSystem *pMaterialSystem, const char *psz )
-{
- CMatRenderContextPtr pRenderContext( pMaterialSystem );
- if ( pRenderContext->GetCallQueue() )
- pRenderContext->GetCallQueue()->QueueCall( Plat_DebugString, CUtlEnvelope<const char *>( psz ) );
-}
-
-#define MatSysQueueMark( pMaterialSystem, ...) DoMatSysQueueMark( pMaterialSystem, CFmtStr( __VA_ARGS__ ) )
-#else
-#define MatSysQueueMark( msg, ...) ((void)0)
-#endif
-
-//-----------------------------------------------------------------------------
-
-extern IMaterialSystem *materials;
-extern IMaterialSystem *g_pMaterialSystem;
-
-#endif // IMATERIALSYSTEM_H
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//===========================================================================//
+
+#ifndef IMATERIALSYSTEM_H
+#define IMATERIALSYSTEM_H
+
+#ifdef _WIN32
+#pragma once
+#endif
+
+#define OVERBRIGHT 2.0f
+#define OO_OVERBRIGHT ( 1.0f / 2.0f )
+#define GAMMA 2.2f
+#define TEXGAMMA 2.2f
+
+#include "tier1/interface.h"
+#include "tier1/refcount.h"
+#include "mathlib/vector.h"
+#include "mathlib/vector4d.h"
+#include "mathlib/vmatrix.h"
+#include "appframework/IAppSystem.h"
+#include "bitmap/imageformat.h"
+#include "texture_group_names.h"
+#include "vtf/vtf.h"
+#include "materialsystem/deformations.h"
+#include "materialsystem/imaterialsystemhardwareconfig.h"
+#include "materialsystem/IColorCorrection.h"
+
+
+//-----------------------------------------------------------------------------
+// forward declarations
+//-----------------------------------------------------------------------------
+class IMaterial;
+class IMesh;
+class IVertexBuffer;
+class IIndexBuffer;
+struct MaterialSystem_Config_t;
+class VMatrix;
+struct matrix3x4_t;
+class ITexture;
+struct MaterialSystemHardwareIdentifier_t;
+class KeyValues;
+class IShader;
+class IVertexTexture;
+class IMorph;
+class IMatRenderContext;
+class ICallQueue;
+struct MorphWeight_t;
+class IFileList;
+
+
+//-----------------------------------------------------------------------------
+// The vertex format type
+//-----------------------------------------------------------------------------
+typedef uint64 VertexFormat_t;
+
+//-----------------------------------------------------------------------------
+// important enumeration
+//-----------------------------------------------------------------------------
+
+// NOTE NOTE NOTE!!!! If you up this, grep for "NEW_INTERFACE" to see if there is anything
+// waiting to be enabled during an interface revision.
+#define MATERIAL_SYSTEM_INTERFACE_VERSION "VMaterialSystem080"
+
+#ifdef POSIX
+#define ABSOLUTE_MINIMUM_DXLEVEL 90
+#else
+#define ABSOLUTE_MINIMUM_DXLEVEL 80
+#endif
+
+enum ShaderParamType_t
+{
+ SHADER_PARAM_TYPE_TEXTURE,
+ SHADER_PARAM_TYPE_INTEGER,
+ SHADER_PARAM_TYPE_COLOR,
+ SHADER_PARAM_TYPE_VEC2,
+ SHADER_PARAM_TYPE_VEC3,
+ SHADER_PARAM_TYPE_VEC4,
+ SHADER_PARAM_TYPE_ENVMAP, // obsolete
+ SHADER_PARAM_TYPE_FLOAT,
+ SHADER_PARAM_TYPE_BOOL,
+ SHADER_PARAM_TYPE_FOURCC,
+ SHADER_PARAM_TYPE_MATRIX,
+ SHADER_PARAM_TYPE_MATERIAL,
+ SHADER_PARAM_TYPE_STRING,
+};
+
+enum MaterialMatrixMode_t
+{
+ MATERIAL_VIEW = 0,
+ MATERIAL_PROJECTION,
+
+ // Texture matrices
+ MATERIAL_TEXTURE0,
+ MATERIAL_TEXTURE1,
+ MATERIAL_TEXTURE2,
+ MATERIAL_TEXTURE3,
+ MATERIAL_TEXTURE4,
+ MATERIAL_TEXTURE5,
+ MATERIAL_TEXTURE6,
+ MATERIAL_TEXTURE7,
+
+ MATERIAL_MODEL,
+
+ // Total number of matrices
+ NUM_MATRIX_MODES = MATERIAL_MODEL+1,
+
+ // Number of texture transforms
+ NUM_TEXTURE_TRANSFORMS = MATERIAL_TEXTURE7 - MATERIAL_TEXTURE0 + 1
+};
+
+// FIXME: How do I specify the actual number of matrix modes?
+const int NUM_MODEL_TRANSFORMS = 53;
+const int MATERIAL_MODEL_MAX = MATERIAL_MODEL + NUM_MODEL_TRANSFORMS;
+
+enum MaterialPrimitiveType_t
+{
+ MATERIAL_POINTS = 0x0,
+ MATERIAL_LINES,
+ MATERIAL_TRIANGLES,
+ MATERIAL_TRIANGLE_STRIP,
+ MATERIAL_LINE_STRIP,
+ MATERIAL_LINE_LOOP, // a single line loop
+ MATERIAL_POLYGON, // this is a *single* polygon
+ MATERIAL_QUADS,
+ MATERIAL_INSTANCED_QUADS, // (X360) like MATERIAL_QUADS, but uses vertex instancing
+
+ // This is used for static meshes that contain multiple types of
+ // primitive types. When calling draw, you'll need to specify
+ // a primitive type.
+ MATERIAL_HETEROGENOUS
+};
+
+enum MaterialPropertyTypes_t
+{
+ MATERIAL_PROPERTY_NEEDS_LIGHTMAP = 0, // bool
+ MATERIAL_PROPERTY_OPACITY, // int (enum MaterialPropertyOpacityTypes_t)
+ MATERIAL_PROPERTY_REFLECTIVITY, // vec3_t
+ MATERIAL_PROPERTY_NEEDS_BUMPED_LIGHTMAPS // bool
+};
+
+// acceptable property values for MATERIAL_PROPERTY_OPACITY
+enum MaterialPropertyOpacityTypes_t
+{
+ MATERIAL_ALPHATEST = 0,
+ MATERIAL_OPAQUE,
+ MATERIAL_TRANSLUCENT
+};
+
+enum MaterialBufferTypes_t
+{
+ MATERIAL_FRONT = 0,
+ MATERIAL_BACK
+};
+
+enum MaterialCullMode_t
+{
+ MATERIAL_CULLMODE_CCW, // this culls polygons with counterclockwise winding
+ MATERIAL_CULLMODE_CW // this culls polygons with clockwise winding
+};
+
+enum MaterialIndexFormat_t
+{
+ MATERIAL_INDEX_FORMAT_UNKNOWN = -1,
+ MATERIAL_INDEX_FORMAT_16BIT = 0,
+ MATERIAL_INDEX_FORMAT_32BIT,
+};
+
+enum MaterialFogMode_t
+{
+ MATERIAL_FOG_NONE,
+ MATERIAL_FOG_LINEAR,
+ MATERIAL_FOG_LINEAR_BELOW_FOG_Z,
+};
+
+enum MaterialHeightClipMode_t
+{
+ MATERIAL_HEIGHTCLIPMODE_DISABLE,
+ MATERIAL_HEIGHTCLIPMODE_RENDER_ABOVE_HEIGHT,
+ MATERIAL_HEIGHTCLIPMODE_RENDER_BELOW_HEIGHT
+};
+
+enum MaterialNonInteractiveMode_t
+{
+ MATERIAL_NON_INTERACTIVE_MODE_NONE = -1,
+ MATERIAL_NON_INTERACTIVE_MODE_STARTUP = 0,
+ MATERIAL_NON_INTERACTIVE_MODE_LEVEL_LOAD,
+
+ MATERIAL_NON_INTERACTIVE_MODE_COUNT,
+};
+
+
+//-----------------------------------------------------------------------------
+// Special morph used in decalling pass
+//-----------------------------------------------------------------------------
+#define MATERIAL_MORPH_DECAL ( (IMorph*)1 )
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+enum MaterialThreadMode_t
+{
+ MATERIAL_SINGLE_THREADED,
+ MATERIAL_QUEUED_SINGLE_THREADED,
+ MATERIAL_QUEUED_THREADED
+};
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+enum MaterialContextType_t
+{
+ MATERIAL_HARDWARE_CONTEXT,
+ MATERIAL_QUEUED_CONTEXT,
+ MATERIAL_NULL_CONTEXT
+};
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+enum MaterialFindContext_t
+{
+ MATERIAL_FINDCONTEXT_NONE,
+ MATERIAL_FINDCONTEXT_ISONAMODEL,
+};
+
+//-----------------------------------------------------------------------------
+// Light structure
+//-----------------------------------------------------------------------------
+#include "mathlib/lightdesc.h"
+
+#if 0
+enum LightType_t
+{
+ MATERIAL_LIGHT_DISABLE = 0,
+ MATERIAL_LIGHT_POINT,
+ MATERIAL_LIGHT_DIRECTIONAL,
+ MATERIAL_LIGHT_SPOT,
+};
+
+enum LightType_OptimizationFlags_t
+{
+ LIGHTTYPE_OPTIMIZATIONFLAGS_HAS_ATTENUATION0 = 1,
+ LIGHTTYPE_OPTIMIZATIONFLAGS_HAS_ATTENUATION1 = 2,
+ LIGHTTYPE_OPTIMIZATIONFLAGS_HAS_ATTENUATION2 = 4,
+};
+
+
+struct LightDesc_t
+{
+ LightType_t m_Type;
+ Vector m_Color;
+ Vector m_Position;
+ Vector m_Direction;
+ float m_Range;
+ float m_Falloff;
+ float m_Attenuation0;
+ float m_Attenuation1;
+ float m_Attenuation2;
+ float m_Theta;
+ float m_Phi;
+ // These aren't used by DX8. . used for software lighting.
+ float m_ThetaDot;
+ float m_PhiDot;
+ unsigned int m_Flags;
+
+
+ LightDesc_t() {}
+
+private:
+ // No copy constructors allowed
+ LightDesc_t(const LightDesc_t& vOther);
+};
+#endif
+
+#define CREATERENDERTARGETFLAGS_HDR 0x00000001
+#define CREATERENDERTARGETFLAGS_AUTOMIPMAP 0x00000002
+#define CREATERENDERTARGETFLAGS_UNFILTERABLE_OK 0x00000004
+// XBOX ONLY:
+#define CREATERENDERTARGETFLAGS_NOEDRAM 0x00000008 // inhibit allocation in 360 EDRAM
+#define CREATERENDERTARGETFLAGS_TEMP 0x00000010 // only allocates memory upon first resolve, destroyed at level end
+
+
+//-----------------------------------------------------------------------------
+// allowed stencil operations. These match the d3d operations
+//-----------------------------------------------------------------------------
+enum StencilOperation_t
+{
+#if !defined( _X360 )
+ STENCILOPERATION_KEEP = 1,
+ STENCILOPERATION_ZERO = 2,
+ STENCILOPERATION_REPLACE = 3,
+ STENCILOPERATION_INCRSAT = 4,
+ STENCILOPERATION_DECRSAT = 5,
+ STENCILOPERATION_INVERT = 6,
+ STENCILOPERATION_INCR = 7,
+ STENCILOPERATION_DECR = 8,
+#else
+ STENCILOPERATION_KEEP = D3DSTENCILOP_KEEP,
+ STENCILOPERATION_ZERO = D3DSTENCILOP_ZERO,
+ STENCILOPERATION_REPLACE = D3DSTENCILOP_REPLACE,
+ STENCILOPERATION_INCRSAT = D3DSTENCILOP_INCRSAT,
+ STENCILOPERATION_DECRSAT = D3DSTENCILOP_DECRSAT,
+ STENCILOPERATION_INVERT = D3DSTENCILOP_INVERT,
+ STENCILOPERATION_INCR = D3DSTENCILOP_INCR,
+ STENCILOPERATION_DECR = D3DSTENCILOP_DECR,
+#endif
+ STENCILOPERATION_FORCE_DWORD = 0x7fffffff
+};
+
+enum StencilComparisonFunction_t
+{
+#if !defined( _X360 )
+ STENCILCOMPARISONFUNCTION_NEVER = 1,
+ STENCILCOMPARISONFUNCTION_LESS = 2,
+ STENCILCOMPARISONFUNCTION_EQUAL = 3,
+ STENCILCOMPARISONFUNCTION_LESSEQUAL = 4,
+ STENCILCOMPARISONFUNCTION_GREATER = 5,
+ STENCILCOMPARISONFUNCTION_NOTEQUAL = 6,
+ STENCILCOMPARISONFUNCTION_GREATEREQUAL = 7,
+ STENCILCOMPARISONFUNCTION_ALWAYS = 8,
+#else
+ STENCILCOMPARISONFUNCTION_NEVER = D3DCMP_NEVER,
+ STENCILCOMPARISONFUNCTION_LESS = D3DCMP_LESS,
+ STENCILCOMPARISONFUNCTION_EQUAL = D3DCMP_EQUAL,
+ STENCILCOMPARISONFUNCTION_LESSEQUAL = D3DCMP_LESSEQUAL,
+ STENCILCOMPARISONFUNCTION_GREATER = D3DCMP_GREATER,
+ STENCILCOMPARISONFUNCTION_NOTEQUAL = D3DCMP_NOTEQUAL,
+ STENCILCOMPARISONFUNCTION_GREATEREQUAL = D3DCMP_GREATEREQUAL,
+ STENCILCOMPARISONFUNCTION_ALWAYS = D3DCMP_ALWAYS,
+#endif
+
+ STENCILCOMPARISONFUNCTION_FORCE_DWORD = 0x7fffffff
+};
+
+
+//-----------------------------------------------------------------------------
+// Enumeration for the various fields capable of being morphed
+//-----------------------------------------------------------------------------
+enum MorphFormatFlags_t
+{
+ MORPH_POSITION = 0x0001, // 3D
+ MORPH_NORMAL = 0x0002, // 3D
+ MORPH_WRINKLE = 0x0004, // 1D
+ MORPH_SPEED = 0x0008, // 1D
+ MORPH_SIDE = 0x0010, // 1D
+};
+
+
+//-----------------------------------------------------------------------------
+// The morph format type
+//-----------------------------------------------------------------------------
+typedef unsigned int MorphFormat_t;
+
+
+//-----------------------------------------------------------------------------
+// Standard lightmaps
+//-----------------------------------------------------------------------------
+enum StandardLightmap_t
+{
+ MATERIAL_SYSTEM_LIGHTMAP_PAGE_WHITE = -1,
+ MATERIAL_SYSTEM_LIGHTMAP_PAGE_WHITE_BUMP = -2,
+ MATERIAL_SYSTEM_LIGHTMAP_PAGE_USER_DEFINED = -3
+};
+
+
+struct MaterialSystem_SortInfo_t
+{
+ IMaterial *material;
+ int lightmapPageID;
+};
+
+
+#define MAX_FB_TEXTURES 4
+
+//-----------------------------------------------------------------------------
+// Information about each adapter
+//-----------------------------------------------------------------------------
+enum
+{
+ MATERIAL_ADAPTER_NAME_LENGTH = 512
+};
+
+struct MaterialAdapterInfo_t
+{
+ char m_pDriverName[MATERIAL_ADAPTER_NAME_LENGTH];
+ unsigned int m_VendorID;
+ unsigned int m_DeviceID;
+ unsigned int m_SubSysID;
+ unsigned int m_Revision;
+ int m_nDXSupportLevel; // This is the *preferred* dx support level
+ int m_nMaxDXSupportLevel;
+ unsigned int m_nDriverVersionHigh;
+ unsigned int m_nDriverVersionLow;
+};
+
+
+//-----------------------------------------------------------------------------
+// Video mode info..
+//-----------------------------------------------------------------------------
+struct MaterialVideoMode_t
+{
+ int m_Width; // if width and height are 0 and you select
+ int m_Height; // windowed mode, it'll use the window size
+ ImageFormat m_Format; // use ImageFormats (ignored for windowed mode)
+ int m_RefreshRate; // 0 == default (ignored for windowed mode)
+};
+
+// fixme: should move this into something else.
+struct FlashlightState_t
+{
+ FlashlightState_t()
+ {
+ m_bEnableShadows = false; // Provide reasonable defaults for shadow depth mapping parameters
+ m_bDrawShadowFrustum = false;
+ m_flShadowMapResolution = 1024.0f;
+ m_flShadowFilterSize = 3.0f;
+ m_flShadowSlopeScaleDepthBias = 16.0f;
+ m_flShadowDepthBias = 0.0005f;
+ m_flShadowJitterSeed = 0.0f;
+ m_flShadowAtten = 0.0f;
+ m_bScissor = false;
+ m_nLeft = -1;
+ m_nTop = -1;
+ m_nRight = -1;
+ m_nBottom = -1;
+ m_nShadowQuality = 0;
+ }
+
+ Vector m_vecLightOrigin;
+ Quaternion m_quatOrientation;
+ float m_NearZ;
+ float m_FarZ;
+ float m_fHorizontalFOVDegrees;
+ float m_fVerticalFOVDegrees;
+ float m_fQuadraticAtten;
+ float m_fLinearAtten;
+ float m_fConstantAtten;
+ float m_Color[4];
+ ITexture *m_pSpotlightTexture;
+ int m_nSpotlightTextureFrame;
+
+ // Shadow depth mapping parameters
+ bool m_bEnableShadows;
+ bool m_bDrawShadowFrustum;
+ float m_flShadowMapResolution;
+ float m_flShadowFilterSize;
+ float m_flShadowSlopeScaleDepthBias;
+ float m_flShadowDepthBias;
+ float m_flShadowJitterSeed;
+ float m_flShadowAtten;
+ int m_nShadowQuality;
+
+ // Getters for scissor members
+ bool DoScissor() { return m_bScissor; }
+ int GetLeft() { return m_nLeft; }
+ int GetTop() { return m_nTop; }
+ int GetRight() { return m_nRight; }
+ int GetBottom() { return m_nBottom; }
+
+private:
+
+ friend class CShadowMgr;
+
+ bool m_bScissor;
+ int m_nLeft;
+ int m_nTop;
+ int m_nRight;
+ int m_nBottom;
+};
+
+//-----------------------------------------------------------------------------
+// Flags to be used with the Init call
+//-----------------------------------------------------------------------------
+enum MaterialInitFlags_t
+{
+ MATERIAL_INIT_ALLOCATE_FULLSCREEN_TEXTURE = 0x2,
+ MATERIAL_INIT_REFERENCE_RASTERIZER = 0x4,
+};
+
+//-----------------------------------------------------------------------------
+// Flags to specify type of depth buffer used with RT
+//-----------------------------------------------------------------------------
+
+// GR - this is to add RT with no depth buffer bound
+
+enum MaterialRenderTargetDepth_t
+{
+ MATERIAL_RT_DEPTH_SHARED = 0x0,
+ MATERIAL_RT_DEPTH_SEPARATE = 0x1,
+ MATERIAL_RT_DEPTH_NONE = 0x2,
+ MATERIAL_RT_DEPTH_ONLY = 0x3,
+};
+
+//-----------------------------------------------------------------------------
+// A function to be called when we need to release all vertex buffers
+// NOTE: The restore function will tell the caller if all the vertex formats
+// changed so that it can flush caches, etc. if it needs to (for dxlevel support)
+//-----------------------------------------------------------------------------
+enum RestoreChangeFlags_t
+{
+ MATERIAL_RESTORE_VERTEX_FORMAT_CHANGED = 0x1,
+};
+
+
+// NOTE: All size modes will force the render target to be smaller than or equal to
+// the size of the framebuffer.
+enum RenderTargetSizeMode_t
+{
+ RT_SIZE_NO_CHANGE=0, // Only allowed for render targets that don't want a depth buffer
+ // (because if they have a depth buffer, the render target must be less than or equal to the size of the framebuffer).
+ RT_SIZE_DEFAULT=1, // Don't play with the specified width and height other than making sure it fits in the framebuffer.
+ RT_SIZE_PICMIP=2, // Apply picmip to the render target's width and height.
+ RT_SIZE_HDR=3, // frame_buffer_width / 4
+ RT_SIZE_FULL_FRAME_BUFFER=4, // Same size as frame buffer, or next lower power of 2 if we can't do that.
+ RT_SIZE_OFFSCREEN=5, // Target of specified size, don't mess with dimensions
+ RT_SIZE_FULL_FRAME_BUFFER_ROUNDED_UP=6, // Same size as the frame buffer, rounded up if necessary for systems that can't do non-power of two textures.
+ RT_SIZE_REPLAY_SCREENSHOT = 7 // Rounded down to power of 2, essentially...
+};
+
+typedef void (*MaterialBufferReleaseFunc_t)( );
+typedef void (*MaterialBufferRestoreFunc_t)( int nChangeFlags ); // see RestoreChangeFlags_t
+typedef void (*ModeChangeCallbackFunc_t)( void );
+
+typedef int VertexBufferHandle_t;
+typedef unsigned short MaterialHandle_t;
+
+DECLARE_POINTER_HANDLE( OcclusionQueryObjectHandle_t );
+#define INVALID_OCCLUSION_QUERY_OBJECT_HANDLE ( (OcclusionQueryObjectHandle_t)0 )
+
+class IMaterialProxyFactory;
+class ITexture;
+class IMaterialSystemHardwareConfig;
+class CShadowMgr;
+
+DECLARE_POINTER_HANDLE( MaterialLock_t );
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+abstract_class IMaterialSystem : public IAppSystem
+{
+public:
+
+ // Placeholder for API revision
+ virtual bool Connect( CreateInterfaceFn factory ) = 0;
+ virtual void Disconnect() = 0;
+ virtual void *QueryInterface( const char *pInterfaceName ) = 0;
+ virtual InitReturnVal_t Init() = 0;
+ virtual void Shutdown() = 0;
+
+ //---------------------------------------------------------
+ // Initialization and shutdown
+ //---------------------------------------------------------
+
+ // Call this to initialize the material system
+ // returns a method to create interfaces in the shader dll
+ virtual CreateInterfaceFn Init( char const* pShaderAPIDLL,
+ IMaterialProxyFactory *pMaterialProxyFactory,
+ CreateInterfaceFn fileSystemFactory,
+ CreateInterfaceFn cvarFactory=NULL ) = 0;
+
+ // Call this to set an explicit shader version to use
+ // Must be called before Init().
+ virtual void SetShaderAPI( char const *pShaderAPIDLL ) = 0;
+
+ // Must be called before Init(), if you're going to call it at all...
+ virtual void SetAdapter( int nAdapter, int nFlags ) = 0;
+
+ // Call this when the mod has been set up, which may occur after init
+ // At this point, the game + gamebin paths have been set up
+ virtual void ModInit() = 0;
+ virtual void ModShutdown() = 0;
+
+ //---------------------------------------------------------
+ //
+ //---------------------------------------------------------
+ virtual void SetThreadMode( MaterialThreadMode_t mode, int nServiceThread = -1 ) = 0;
+ virtual MaterialThreadMode_t GetThreadMode( ) = 0;
+ virtual bool IsRenderThreadSafe( ) = 0;
+ virtual void ExecuteQueued() = 0;
+
+ //---------------------------------------------------------
+ // Config management
+ //---------------------------------------------------------
+
+ virtual IMaterialSystemHardwareConfig *GetHardwareConfig( const char *pVersion, int *returnCode ) = 0;
+
+
+ // Call this before rendering each frame with the current config
+ // for the material system.
+ // Will do whatever is necessary to get the material system into the correct state
+ // upon configuration change. .doesn't much else otherwise.
+ virtual bool UpdateConfig( bool bForceUpdate ) = 0;
+
+ // Force this to be the config; update all material system convars to match the state
+ // return true if lightmaps need to be redownloaded
+ virtual bool OverrideConfig( const MaterialSystem_Config_t &config, bool bForceUpdate ) = 0;
+
+ // Get the current config for this video card (as last set by UpdateConfig)
+ virtual const MaterialSystem_Config_t &GetCurrentConfigForVideoCard() const = 0;
+
+ // Gets *recommended* configuration information associated with the display card,
+ // given a particular dx level to run under.
+ // Use dxlevel 0 to use the recommended dx level.
+ // The function returns false if an invalid dxlevel was specified
+
+ // UNDONE: To find out all convars affected by configuration, we'll need to change
+ // the dxsupport.pl program to output all column headers into a single keyvalue block
+ // and then we would read that in, and send it back to the client
+ virtual bool GetRecommendedConfigurationInfo( int nDXLevel, KeyValues * pKeyValues ) = 0;
+
+
+ // -----------------------------------------------------------
+ // Device methods
+ // -----------------------------------------------------------
+
+ // Gets the number of adapters...
+ virtual int GetDisplayAdapterCount() const = 0;
+
+ // Returns the current adapter in use
+ virtual int GetCurrentAdapter() const = 0;
+
+ // Returns info about each adapter
+ virtual void GetDisplayAdapterInfo( int adapter, MaterialAdapterInfo_t& info ) const = 0;
+
+ // Returns the number of modes
+ virtual int GetModeCount( int adapter ) const = 0;
+
+ // Returns mode information..
+ virtual void GetModeInfo( int adapter, int mode, MaterialVideoMode_t& info ) const = 0;
+
+ virtual void AddModeChangeCallBack( ModeChangeCallbackFunc_t func ) = 0;
+
+ // Returns the mode info for the current display device
+ virtual void GetDisplayMode( MaterialVideoMode_t& mode ) const = 0;
+
+ // Sets the mode...
+ virtual bool SetMode( void* hwnd, const MaterialSystem_Config_t &config ) = 0;
+
+ virtual bool SupportsMSAAMode( int nMSAAMode ) = 0;
+
+ // FIXME: REMOVE! Get video card identitier
+ virtual const MaterialSystemHardwareIdentifier_t &GetVideoCardIdentifier( void ) const = 0;
+
+ // Use this to spew information about the 3D layer
+ virtual void SpewDriverInfo() const = 0;
+
+ virtual void GetDXLevelDefaults(uint &max_dxlevel,uint &recommended_dxlevel) = 0;
+
+ // Get the image format of the back buffer. . useful when creating render targets, etc.
+ virtual void GetBackBufferDimensions( int &width, int &height) const = 0;
+ virtual ImageFormat GetBackBufferFormat() const = 0;
+
+ virtual bool SupportsHDRMode( HDRType_t nHDRModede ) = 0;
+
+
+ // -----------------------------------------------------------
+ // Window methods
+ // -----------------------------------------------------------
+
+ // Creates/ destroys a child window
+ virtual bool AddView( void* hwnd ) = 0;
+ virtual void RemoveView( void* hwnd ) = 0;
+
+ // Sets the view
+ virtual void SetView( void* hwnd ) = 0;
+
+
+ // -----------------------------------------------------------
+ // Control flow
+ // -----------------------------------------------------------
+
+ virtual void BeginFrame( float frameTime ) = 0;
+ virtual void EndFrame( ) = 0;
+ virtual void Flush( bool flushHardware = false ) = 0;
+
+ /// FIXME: This stuff needs to be cleaned up and abstracted.
+ // Stuff that gets exported to the launcher through the engine
+ virtual void SwapBuffers( ) = 0;
+
+ // Flushes managed textures from the texture cacher
+ virtual void EvictManagedResources() = 0;
+
+ virtual void ReleaseResources(void) = 0;
+ virtual void ReacquireResources(void ) = 0;
+
+
+ // -----------------------------------------------------------
+ // Device loss/restore
+ // -----------------------------------------------------------
+
+ // Installs a function to be called when we need to release vertex buffers + textures
+ virtual void AddReleaseFunc( MaterialBufferReleaseFunc_t func ) = 0;
+ virtual void RemoveReleaseFunc( MaterialBufferReleaseFunc_t func ) = 0;
+
+ // Installs a function to be called when we need to restore vertex buffers
+ virtual void AddRestoreFunc( MaterialBufferRestoreFunc_t func ) = 0;
+ virtual void RemoveRestoreFunc( MaterialBufferRestoreFunc_t func ) = 0;
+
+ // Release temporary HW memory...
+ virtual void ResetTempHWMemory( bool bExitingLevel = false ) = 0;
+
+ // For dealing with device lost in cases where SwapBuffers isn't called all the time (Hammer)
+ virtual void HandleDeviceLost() = 0;
+
+
+ // -----------------------------------------------------------
+ // Shaders
+ // -----------------------------------------------------------
+
+ // Used to iterate over all shaders for editing purposes
+ // GetShaders returns the number of shaders it actually found
+ virtual int ShaderCount() const = 0;
+ virtual int GetShaders( int nFirstShader, int nMaxCount, IShader **ppShaderList ) const = 0;
+
+ // FIXME: Is there a better way of doing this?
+ // Returns shader flag names for editors to be able to edit them
+ virtual int ShaderFlagCount() const = 0;
+ virtual const char * ShaderFlagName( int nIndex ) const = 0;
+
+ // Gets the actual shader fallback for a particular shader
+ virtual void GetShaderFallback( const char *pShaderName, char *pFallbackShader, int nFallbackLength ) = 0;
+
+
+ // -----------------------------------------------------------
+ // Material proxies
+ // -----------------------------------------------------------
+
+ virtual IMaterialProxyFactory *GetMaterialProxyFactory() = 0;
+
+ // Sets the material proxy factory. Calling this causes all materials to be uncached.
+ virtual void SetMaterialProxyFactory( IMaterialProxyFactory* pFactory ) = 0;
+
+
+ // -----------------------------------------------------------
+ // Editor mode
+ // -----------------------------------------------------------
+
+ // Used to enable editor materials. Must be called before Init.
+ virtual void EnableEditorMaterials() = 0;
+
+
+ // -----------------------------------------------------------
+ // Stub mode mode
+ // -----------------------------------------------------------
+
+ // Force it to ignore Draw calls.
+ virtual void SetInStubMode( bool bInStubMode ) = 0;
+
+
+ //---------------------------------------------------------
+ // Debug support
+ //---------------------------------------------------------
+
+ virtual void DebugPrintUsedMaterials( const char *pSearchSubString, bool bVerbose ) = 0;
+ virtual void DebugPrintUsedTextures( void ) = 0;
+
+ virtual void ToggleSuppressMaterial( char const* pMaterialName ) = 0;
+ virtual void ToggleDebugMaterial( char const* pMaterialName ) = 0;
+
+
+ //---------------------------------------------------------
+ // Misc features
+ //---------------------------------------------------------
+ //returns whether fast clipping is being used or not - needed to be exposed for better per-object clip behavior
+ virtual bool UsingFastClipping( void ) = 0;
+
+ virtual int StencilBufferBits( void ) = 0; //number of bits per pixel in the stencil buffer
+
+
+ //---------------------------------------------------------
+ // Material and texture management
+ //---------------------------------------------------------
+
+ // uncache all materials. . good for forcing reload of materials.
+ virtual void UncacheAllMaterials( ) = 0;
+
+ // Remove any materials from memory that aren't in use as determined
+ // by the IMaterial's reference count.
+ virtual void UncacheUnusedMaterials( bool bRecomputeStateSnapshots = false ) = 0;
+
+ // Load any materials into memory that are to be used as determined
+ // by the IMaterial's reference count.
+ virtual void CacheUsedMaterials( ) = 0;
+
+ // Force all textures to be reloaded from disk.
+ virtual void ReloadTextures( ) = 0;
+
+ // Reloads materials
+ virtual void ReloadMaterials( const char *pSubString = NULL ) = 0;
+
+ // Create a procedural material. The keyvalues looks like a VMT file
+ virtual IMaterial * CreateMaterial( const char *pMaterialName, KeyValues *pVMTKeyValues ) = 0;
+
+ // Find a material by name.
+ // The name of a material is a full path to
+ // the vmt file starting from "hl2/materials" (or equivalent) without
+ // a file extension.
+ // eg. "dev/dev_bumptest" refers to somethign similar to:
+ // "d:/hl2/hl2/materials/dev/dev_bumptest.vmt"
+ //
+ // Most of the texture groups for pTextureGroupName are listed in texture_group_names.h.
+ //
+ // Note: if the material can't be found, this returns a checkerboard material. You can
+ // find out if you have that material by calling IMaterial::IsErrorMaterial().
+ // (Or use the global IsErrorMaterial function, which checks if it's null too).
+ virtual IMaterial * FindMaterial( char const* pMaterialName, const char *pTextureGroupName, bool complain = true, const char *pComplainPrefix = NULL ) = 0;
+
+ // Query whether a material is loaded (eg, whether FindMaterial will be nonblocking)
+ virtual bool IsMaterialLoaded( char const* pMaterialName ) = 0;
+
+ //---------------------------------
+ // This is the interface for knowing what materials are available
+ // is to use the following functions to get a list of materials. The
+ // material names will have the full path to the material, and that is the
+ // only way that the directory structure of the materials will be seen through this
+ // interface.
+ // NOTE: This is mostly for worldcraft to get a list of materials to put
+ // in the "texture" browser.in Worldcraft
+ virtual MaterialHandle_t FirstMaterial() const = 0;
+
+ // returns InvalidMaterial if there isn't another material.
+ // WARNING: you must call GetNextMaterial until it returns NULL,
+ // otherwise there will be a memory leak.
+ virtual MaterialHandle_t NextMaterial( MaterialHandle_t h ) const = 0;
+
+ // This is the invalid material
+ virtual MaterialHandle_t InvalidMaterial() const = 0;
+
+ // Returns a particular material
+ virtual IMaterial* GetMaterial( MaterialHandle_t h ) const = 0;
+
+ // Get the total number of materials in the system. These aren't just the used
+ // materials, but the complete collection.
+ virtual int GetNumMaterials( ) const = 0;
+
+ //---------------------------------
+
+ virtual void SetAsyncTextureLoadCache( void* hFileCache ) = 0;
+
+ virtual ITexture * FindTexture( char const* pTextureName, const char *pTextureGroupName, bool complain = true, int nAdditionalCreationFlags = 0 ) = 0;
+
+ // Checks to see if a particular texture is loaded
+ virtual bool IsTextureLoaded( char const* pTextureName ) const = 0;
+
+ // Creates a procedural texture
+ virtual ITexture * CreateProceduralTexture( const char *pTextureName,
+ const char *pTextureGroupName,
+ int w,
+ int h,
+ ImageFormat fmt,
+ int nFlags ) = 0;
+
+ //
+ // Render targets
+ //
+ virtual void BeginRenderTargetAllocation() = 0;
+ virtual void EndRenderTargetAllocation() = 0; // Simulate an Alt-Tab in here, which causes a release/restore of all resources
+
+ // Creates a render target
+ // If depth == true, a depth buffer is also allocated. If not, then
+ // the screen's depth buffer is used.
+ // Creates a texture for use as a render target
+ virtual ITexture * CreateRenderTargetTexture( int w,
+ int h,
+ RenderTargetSizeMode_t sizeMode, // Controls how size is generated (and regenerated on video mode change).
+ ImageFormat format,
+ MaterialRenderTargetDepth_t depth = MATERIAL_RT_DEPTH_SHARED ) = 0;
+
+ virtual ITexture * CreateNamedRenderTargetTextureEx( const char *pRTName, // Pass in NULL here for an unnamed render target.
+ int w,
+ int h,
+ RenderTargetSizeMode_t sizeMode, // Controls how size is generated (and regenerated on video mode change).
+ ImageFormat format,
+ MaterialRenderTargetDepth_t depth = MATERIAL_RT_DEPTH_SHARED,
+ unsigned int textureFlags = TEXTUREFLAGS_CLAMPS | TEXTUREFLAGS_CLAMPT,
+ unsigned int renderTargetFlags = 0 ) = 0;
+
+ virtual ITexture * CreateNamedRenderTargetTexture( const char *pRTName,
+ int w,
+ int h,
+ RenderTargetSizeMode_t sizeMode, // Controls how size is generated (and regenerated on video mode change).
+ ImageFormat format,
+ MaterialRenderTargetDepth_t depth = MATERIAL_RT_DEPTH_SHARED,
+ bool bClampTexCoords = true,
+ bool bAutoMipMap = false ) = 0;
+
+ // Must be called between the above Begin-End calls!
+ virtual ITexture * CreateNamedRenderTargetTextureEx2( const char *pRTName, // Pass in NULL here for an unnamed render target.
+ int w,
+ int h,
+ RenderTargetSizeMode_t sizeMode, // Controls how size is generated (and regenerated on video mode change).
+ ImageFormat format,
+ MaterialRenderTargetDepth_t depth = MATERIAL_RT_DEPTH_SHARED,
+ unsigned int textureFlags = TEXTUREFLAGS_CLAMPS | TEXTUREFLAGS_CLAMPT,
+ unsigned int renderTargetFlags = 0 ) = 0;
+
+ // -----------------------------------------------------------
+ // Lightmaps
+ // -----------------------------------------------------------
+
+ // To allocate lightmaps, sort the whole world by material twice.
+ // The first time through, call AllocateLightmap for every surface.
+ // that has a lightmap.
+ // The second time through, call AllocateWhiteLightmap for every
+ // surface that expects to use shaders that expect lightmaps.
+ virtual void BeginLightmapAllocation( ) = 0;
+ virtual void EndLightmapAllocation( ) = 0;
+
+ // returns the sorting id for this surface
+ virtual int AllocateLightmap( int width, int height,
+ int offsetIntoLightmapPage[2],
+ IMaterial *pMaterial ) = 0;
+ // returns the sorting id for this surface
+ virtual int AllocateWhiteLightmap( IMaterial *pMaterial ) = 0;
+
+ // lightmaps are in linear color space
+ // lightmapPageID is returned by GetLightmapPageIDForSortID
+ // lightmapSize and offsetIntoLightmapPage are returned by AllocateLightmap.
+ // You should never call UpdateLightmap for a lightmap allocated through
+ // AllocateWhiteLightmap.
+ virtual void UpdateLightmap( int lightmapPageID, int lightmapSize[2],
+ int offsetIntoLightmapPage[2],
+ float *pFloatImage, float *pFloatImageBump1,
+ float *pFloatImageBump2, float *pFloatImageBump3 ) = 0;
+
+ // fixme: could just be an array of ints for lightmapPageIDs since the material
+ // for a surface is already known.
+ virtual int GetNumSortIDs( ) = 0;
+ virtual void GetSortInfo( MaterialSystem_SortInfo_t *sortInfoArray ) = 0;
+
+ // Read the page size of an existing lightmap by sort id (returned from AllocateLightmap())
+ virtual void GetLightmapPageSize( int lightmap, int *width, int *height ) const = 0;
+
+ virtual void ResetMaterialLightmapPageInfo() = 0;
+
+
+
+ virtual void ClearBuffers( bool bClearColor, bool bClearDepth, bool bClearStencil = false ) = 0;
+
+ // -----------------------------------------------------------
+ // X360 specifics
+ // -----------------------------------------------------------
+
+#if defined( _X360 )
+ virtual void ListUsedMaterials( void ) = 0;
+ virtual HXUIFONT OpenTrueTypeFont( const char *pFontname, int tall, int style ) = 0;
+ virtual void CloseTrueTypeFont( HXUIFONT hFont ) = 0;
+ virtual bool GetTrueTypeFontMetrics( HXUIFONT hFont, XUIFontMetrics *pFontMetrics, XUICharMetrics charMetrics[256] ) = 0;
+ // Render a sequence of characters and extract the data into a buffer
+ // For each character, provide the width+height of the font texture subrect,
+ // an offset to apply when rendering the glyph, and an offset into a buffer to receive the RGBA data
+ virtual bool GetTrueTypeGlyphs( HXUIFONT hFont, int numChars, wchar_t *pWch, int *pOffsetX, int *pOffsetY, int *pWidth, int *pHeight, unsigned char *pRGBA, int *pRGBAOffset ) = 0;
+ virtual void PersistDisplay() = 0;
+ virtual void *GetD3DDevice() = 0;
+ virtual bool OwnGPUResources( bool bEnable ) = 0;
+#endif
+
+ // -----------------------------------------------------------
+ // Access the render contexts
+ // -----------------------------------------------------------
+ virtual IMatRenderContext * GetRenderContext() = 0;
+
+ virtual bool SupportsShadowDepthTextures( void ) = 0;
+ virtual void BeginUpdateLightmaps( void ) = 0;
+ virtual void EndUpdateLightmaps( void ) = 0;
+
+ // -----------------------------------------------------------
+ // Methods to force the material system into non-threaded, non-queued mode
+ // -----------------------------------------------------------
+ virtual MaterialLock_t Lock() = 0;
+ virtual void Unlock( MaterialLock_t ) = 0;
+
+ // Vendor-dependent shadow depth texture format
+ virtual ImageFormat GetShadowDepthTextureFormat() = 0;
+
+ virtual bool SupportsFetch4( void ) = 0;
+
+ // Create a custom render context. Cannot be used to create MATERIAL_HARDWARE_CONTEXT
+ virtual IMatRenderContext *CreateRenderContext( MaterialContextType_t type ) = 0;
+
+ // Set a specified render context to be the global context for the thread. Returns the prior context.
+ virtual IMatRenderContext *SetRenderContext( IMatRenderContext * ) = 0;
+
+ virtual bool SupportsCSAAMode( int nNumSamples, int nQualityLevel ) = 0;
+
+ virtual void RemoveModeChangeCallBack( ModeChangeCallbackFunc_t func ) = 0;
+
+ // Finds or create a procedural material.
+ virtual IMaterial * FindProceduralMaterial( const char *pMaterialName, const char *pTextureGroupName, KeyValues *pVMTKeyValues ) = 0;
+
+ virtual ImageFormat GetNullTextureFormat() = 0;
+
+ virtual void AddTextureAlias( const char *pAlias, const char *pRealName ) = 0;
+ virtual void RemoveTextureAlias( const char *pAlias ) = 0;
+
+ // returns a lightmap page ID for this allocation, -1 if none available
+ // frameID is a number that should be changed every frame to prevent locking any textures that are
+ // being used to draw in the previous frame
+ virtual int AllocateDynamicLightmap( int lightmapSize[2], int *pOutOffsetIntoPage, int frameID ) = 0;
+
+ virtual void SetExcludedTextures( const char *pScriptName ) = 0;
+ virtual void UpdateExcludedTextures( void ) = 0;
+
+ virtual bool IsInFrame( ) const = 0;
+
+ virtual void CompactMemory() = 0;
+
+ // For sv_pure mode. The filesystem figures out which files the client needs to reload to be "pure" ala the server's preferences.
+ virtual void ReloadFilesInList( IFileList *pFilesToReload ) = 0;
+ virtual bool AllowThreading( bool bAllow, int nServiceThread ) = 0;
+
+ // Extended version of FindMaterial().
+ // Contains context in so it can make decisions (i.e. if it's a model, ignore certain cheat parameters)
+ virtual IMaterial * FindMaterialEx( char const* pMaterialName, const char *pTextureGroupName, int nContext, bool complain = true, const char *pComplainPrefix = NULL ) = 0;
+
+#ifdef DX_TO_GL_ABSTRACTION
+ virtual void DoStartupShaderPreloading( void ) = 0;
+#endif
+};
+
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+abstract_class IMatRenderContext : public IRefCounted
+{
+public:
+ virtual void BeginRender() = 0;
+ virtual void EndRender() = 0;
+
+ virtual void Flush( bool flushHardware = false ) = 0;
+
+ virtual void BindLocalCubemap( ITexture *pTexture ) = 0;
+
+ // pass in an ITexture (that is build with "rendertarget" "1") or
+ // pass in NULL for the regular backbuffer.
+ virtual void SetRenderTarget( ITexture *pTexture ) = 0;
+ virtual ITexture * GetRenderTarget( void ) = 0;
+
+ virtual void GetRenderTargetDimensions( int &width, int &height) const = 0;
+
+ // Bind a material is current for rendering.
+ virtual void Bind( IMaterial *material, void *proxyData = 0 ) = 0;
+ // Bind a lightmap page current for rendering. You only have to
+ // do this for materials that require lightmaps.
+ virtual void BindLightmapPage( int lightmapPageID ) = 0;
+
+ // inputs are between 0 and 1
+ virtual void DepthRange( float zNear, float zFar ) = 0;
+
+ virtual void ClearBuffers( bool bClearColor, bool bClearDepth, bool bClearStencil = false ) = 0;
+
+ // read to a unsigned char rgb image.
+ virtual void ReadPixels( int x, int y, int width, int height, unsigned char *data, ImageFormat dstFormat ) = 0;
+
+ // Sets lighting
+ virtual void SetAmbientLight( float r, float g, float b ) = 0;
+ virtual void SetLight( int lightNum, const LightDesc_t& desc ) = 0;
+
+ // The faces of the cube are specified in the same order as cubemap textures
+ virtual void SetAmbientLightCube( Vector4D cube[6] ) = 0;
+
+ // Blit the backbuffer to the framebuffer texture
+ virtual void CopyRenderTargetToTexture( ITexture *pTexture ) = 0;
+
+ // Set the current texture that is a copy of the framebuffer.
+ virtual void SetFrameBufferCopyTexture( ITexture *pTexture, int textureIndex = 0 ) = 0;
+ virtual ITexture *GetFrameBufferCopyTexture( int textureIndex ) = 0;
+
+ //
+ // end vertex array api
+ //
+
+ // matrix api
+ virtual void MatrixMode( MaterialMatrixMode_t matrixMode ) = 0;
+ virtual void PushMatrix( void ) = 0;
+ virtual void PopMatrix( void ) = 0;
+ virtual void LoadMatrix( VMatrix const& matrix ) = 0;
+ virtual void LoadMatrix( matrix3x4_t const& matrix ) = 0;
+ virtual void MultMatrix( VMatrix const& matrix ) = 0;
+ virtual void MultMatrix( matrix3x4_t const& matrix ) = 0;
+ virtual void MultMatrixLocal( VMatrix const& matrix ) = 0;
+ virtual void MultMatrixLocal( matrix3x4_t const& matrix ) = 0;
+ virtual void GetMatrix( MaterialMatrixMode_t matrixMode, VMatrix *matrix ) = 0;
+ virtual void GetMatrix( MaterialMatrixMode_t matrixMode, matrix3x4_t *matrix ) = 0;
+ virtual void LoadIdentity( void ) = 0;
+ virtual void Ortho( double left, double top, double right, double bottom, 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;
+ // end matrix api
+
+ // Sets/gets the viewport
+ virtual void Viewport( int x, int y, int width, int height ) = 0;
+ virtual void GetViewport( int& x, int& y, int& width, int& height ) const = 0;
+
+ // The cull mode
+ virtual void CullMode( MaterialCullMode_t cullMode ) = 0;
+
+ // end matrix api
+
+ // This could easily be extended to a general user clip plane
+ virtual void SetHeightClipMode( MaterialHeightClipMode_t nHeightClipMode ) = 0;
+ // garymcthack : fog z is always used for heightclipz for now.
+ virtual void SetHeightClipZ( float z ) = 0;
+
+ // Fog methods...
+ virtual void FogMode( MaterialFogMode_t fogMode ) = 0;
+ virtual void FogStart( float fStart ) = 0;
+ virtual void FogEnd( float fEnd ) = 0;
+ virtual void SetFogZ( float fogZ ) = 0;
+ virtual MaterialFogMode_t GetFogMode( void ) = 0;
+
+ virtual void FogColor3f( float r, float g, float b ) = 0;
+ virtual void FogColor3fv( float const* rgb ) = 0;
+ virtual void FogColor3ub( unsigned char r, unsigned char g, unsigned char b ) = 0;
+ virtual void FogColor3ubv( unsigned char const* rgb ) = 0;
+
+ virtual void GetFogColor( unsigned char *rgb ) = 0;
+
+ // Sets the number of bones for skinning
+ virtual void SetNumBoneWeights( int numBones ) = 0;
+
+ // Creates/destroys Mesh
+ virtual IMesh* CreateStaticMesh( VertexFormat_t fmt, const char *pTextureBudgetGroup, IMaterial * pMaterial = NULL ) = 0;
+ virtual void DestroyStaticMesh( IMesh* mesh ) = 0;
+
+ // Gets the dynamic mesh associated with the currently bound material
+ // note that you've got to render the mesh before calling this function
+ // a second time. Clients should *not* call DestroyStaticMesh on the mesh
+ // returned by this call.
+ // Use buffered = false if you want to not have the mesh be buffered,
+ // but use it instead in the following pattern:
+ // meshBuilder.Begin
+ // meshBuilder.End
+ // Draw partial
+ // Draw partial
+ // Draw partial
+ // meshBuilder.Begin
+ // meshBuilder.End
+ // etc
+ // Use Vertex or Index Override to supply a static vertex or index buffer
+ // to use in place of the dynamic buffers.
+ //
+ // If you pass in a material in pAutoBind, it will automatically bind the
+ // material. This can be helpful since you must bind the material you're
+ // going to use BEFORE calling GetDynamicMesh.
+ virtual IMesh* GetDynamicMesh(
+ bool buffered = true,
+ IMesh* pVertexOverride = 0,
+ IMesh* pIndexOverride = 0,
+ IMaterial *pAutoBind = 0 ) = 0;
+
+ // ------------ New Vertex/Index Buffer interface ----------------------------
+ // Do we need support for bForceTempMesh and bSoftwareVertexShader?
+ // I don't think we use bSoftwareVertexShader anymore. .need to look into bForceTempMesh.
+ virtual IVertexBuffer *CreateStaticVertexBuffer( VertexFormat_t fmt, int nVertexCount, const char *pTextureBudgetGroup ) = 0;
+ virtual IIndexBuffer *CreateStaticIndexBuffer( MaterialIndexFormat_t fmt, int nIndexCount, const char *pTextureBudgetGroup ) = 0;
+ virtual void DestroyVertexBuffer( IVertexBuffer * ) = 0;
+ virtual void DestroyIndexBuffer( IIndexBuffer * ) = 0;
+ // Do we need to specify the stream here in the case of locking multiple dynamic VBs on different streams?
+ virtual IVertexBuffer *GetDynamicVertexBuffer( int streamID, VertexFormat_t vertexFormat, bool bBuffered = true ) = 0;
+ virtual IIndexBuffer *GetDynamicIndexBuffer( MaterialIndexFormat_t fmt, bool bBuffered = true ) = 0;
+ virtual void BindVertexBuffer( int streamID, IVertexBuffer *pVertexBuffer, int nOffsetInBytes, int nFirstVertex, int nVertexCount, VertexFormat_t fmt, int nRepetitions = 1 ) = 0;
+ virtual void BindIndexBuffer( IIndexBuffer *pIndexBuffer, int nOffsetInBytes ) = 0;
+ virtual void Draw( MaterialPrimitiveType_t primitiveType, int firstIndex, int numIndices ) = 0;
+ // ------------ End ----------------------------
+
+ // Selection mode methods
+ virtual int SelectionMode( bool selectionMode ) = 0;
+ virtual void SelectionBuffer( unsigned int* pBuffer, int size ) = 0;
+ virtual void ClearSelectionNames( ) = 0;
+ virtual void LoadSelectionName( int name ) = 0;
+ virtual void PushSelectionName( int name ) = 0;
+ virtual void PopSelectionName() = 0;
+
+ // Sets the Clear Color for ClearBuffer....
+ virtual void ClearColor3ub( unsigned char r, unsigned char g, unsigned char b ) = 0;
+ virtual void ClearColor4ub( unsigned char r, unsigned char g, unsigned char b, unsigned char a ) = 0;
+
+ // Allows us to override the depth buffer setting of a material
+ virtual void OverrideDepthEnable( bool bEnable, bool bDepthEnable ) = 0;
+
+ // FIXME: This is a hack required for NVidia/XBox, can they fix in drivers?
+ virtual void DrawScreenSpaceQuad( IMaterial* pMaterial ) = 0;
+
+ // For debugging and building recording files. This will stuff a token into the recording file,
+ // then someone doing a playback can watch for the token.
+ virtual void SyncToken( const char *pToken ) = 0;
+
+ // FIXME: REMOVE THIS FUNCTION!
+ // The only reason why it's not gone is because we're a week from ship when I found the bug in it
+ // and everything's tuned to use it.
+ // It's returning values which are 2x too big (it's returning sphere diameter x2)
+ // Use ComputePixelDiameterOfSphere below in all new code instead.
+ virtual float ComputePixelWidthOfSphere( const Vector& origin, float flRadius ) = 0;
+
+ //
+ // Occlusion query support
+ //
+
+ // Allocate and delete query objects.
+ virtual OcclusionQueryObjectHandle_t CreateOcclusionQueryObject( void ) = 0;
+ virtual void DestroyOcclusionQueryObject( OcclusionQueryObjectHandle_t ) = 0;
+
+ // Bracket drawing with begin and end so that we can get counts next frame.
+ virtual void BeginOcclusionQueryDrawing( OcclusionQueryObjectHandle_t ) = 0;
+ virtual void EndOcclusionQueryDrawing( OcclusionQueryObjectHandle_t ) = 0;
+
+ // Get the number of pixels rendered between begin and end on an earlier frame.
+ // Calling this in the same frame is a huge perf hit!
+ virtual int OcclusionQuery_GetNumPixelsRendered( OcclusionQueryObjectHandle_t ) = 0;
+
+ virtual void SetFlashlightMode( bool bEnable ) = 0;
+
+ virtual void SetFlashlightState( const FlashlightState_t &state, const VMatrix &worldToTexture ) = 0;
+
+ // Gets the current height clip mode
+ virtual MaterialHeightClipMode_t GetHeightClipMode( ) = 0;
+
+ // This returns the diameter of the sphere in pixels based on
+ // the current model, view, + projection matrices and viewport.
+ virtual float ComputePixelDiameterOfSphere( const Vector& vecAbsOrigin, float flRadius ) = 0;
+
+ // By default, the material system applies the VIEW and PROJECTION matrices to the user clip
+ // planes (which are specified in world space) to generate projection-space user clip planes
+ // Occasionally (for the particle system in hl2, for example), we want to override that
+ // behavior and explictly specify a ViewProj transform for user clip planes
+ virtual void EnableUserClipTransformOverride( bool bEnable ) = 0;
+ virtual void UserClipTransform( const VMatrix &worldToView ) = 0;
+
+ virtual bool GetFlashlightMode() const = 0;
+
+ // Used to make the handle think it's never had a successful query before
+ virtual void ResetOcclusionQueryObject( OcclusionQueryObjectHandle_t ) = 0;
+
+ // FIXME: Remove
+ virtual void Unused3() {}
+
+ // Creates/destroys morph data associated w/ a particular material
+ virtual IMorph *CreateMorph( MorphFormat_t format, const char *pDebugName ) = 0;
+ virtual void DestroyMorph( IMorph *pMorph ) = 0;
+
+ // Binds the morph data for use in rendering
+ virtual void BindMorph( IMorph *pMorph ) = 0;
+
+ // Sets flexweights for rendering
+ virtual void SetFlexWeights( int nFirstWeight, int nCount, const MorphWeight_t* pWeights ) = 0;
+
+ // FIXME: Remove
+ virtual void Unused4() {};
+ virtual void Unused5() {};
+ virtual void Unused6() {};
+ virtual void Unused7() {};
+ virtual void Unused8() {};
+
+ // Read w/ stretch to a host-memory buffer
+ virtual void ReadPixelsAndStretch( Rect_t *pSrcRect, Rect_t *pDstRect, unsigned char *pBuffer, ImageFormat dstFormat, int nDstStride ) = 0;
+
+ // Gets the window size
+ virtual void GetWindowSize( int &width, int &height ) const = 0;
+
+ // This function performs a texture map from one texture map to the render destination, doing
+ // all the necessary pixel/texel coordinate fix ups. fractional values can be used for the
+ // src_texture coordinates to get linear sampling - integer values should produce 1:1 mappings
+ // for non-scaled operations.
+ virtual void DrawScreenSpaceRectangle(
+ IMaterial *pMaterial,
+ int destx, int desty,
+ int width, int height,
+ float src_texture_x0, float src_texture_y0, // which texel you want to appear at
+ // destx/y
+ float src_texture_x1, float src_texture_y1, // which texel you want to appear at
+ // destx+width-1, desty+height-1
+ int src_texture_width, int src_texture_height, // needed for fixup
+ void *pClientRenderable = NULL,
+ int nXDice = 1,
+ int nYDice = 1 )=0;
+
+ virtual void LoadBoneMatrix( int boneIndex, const matrix3x4_t& matrix ) = 0;
+
+ // This version will push the current rendertarget + current viewport onto the stack
+ virtual void PushRenderTargetAndViewport( ) = 0;
+
+ // This version will push a new rendertarget + a maximal viewport for that rendertarget onto the stack
+ virtual void PushRenderTargetAndViewport( ITexture *pTexture ) = 0;
+
+ // This version will push a new rendertarget + a specified viewport onto the stack
+ virtual void PushRenderTargetAndViewport( ITexture *pTexture, int nViewX, int nViewY, int nViewW, int nViewH ) = 0;
+
+ // This version will push a new rendertarget + a specified viewport onto the stack
+ virtual void PushRenderTargetAndViewport( ITexture *pTexture, ITexture *pDepthTexture, int nViewX, int nViewY, int nViewW, int nViewH ) = 0;
+
+ // This will pop a rendertarget + viewport
+ virtual void PopRenderTargetAndViewport( void ) = 0;
+
+ // Binds a particular texture as the current lightmap
+ virtual void BindLightmapTexture( ITexture *pLightmapTexture ) = 0;
+
+ // Blit a subrect of the current render target to another texture
+ virtual void CopyRenderTargetToTextureEx( ITexture *pTexture, int nRenderTargetID, Rect_t *pSrcRect, Rect_t *pDstRect = NULL ) = 0;
+ virtual void CopyTextureToRenderTargetEx( int nRenderTargetID, ITexture *pTexture, Rect_t *pSrcRect, Rect_t *pDstRect = NULL ) = 0;
+
+ // Special off-center perspective matrix for DoF, MSAA jitter and poster rendering
+ virtual void PerspectiveOffCenterX( double fovx, double aspect, double zNear, double zFar, double bottom, double top, double left, double right ) = 0;
+
+ // Rendering parameters control special drawing modes withing the material system, shader
+ // system, shaders, and engine. renderparm.h has their definitions.
+ 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;
+
+ // 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 SetRenderTargetEx( int nRenderTargetID, ITexture *pTexture ) = 0;
+
+ // rendering clip planes, beware that only the most recently pushed plane will actually be used in a sizeable chunk of hardware configurations
+ // and that changes to the clip planes mid-frame while UsingFastClipping() is true will result unresolvable depth inconsistencies
+ virtual void PushCustomClipPlane( const float *pPlane ) = 0;
+ virtual void PopCustomClipPlane( void ) = 0;
+
+ // Returns the number of vertices + indices we can render using the dynamic mesh
+ // Passing true in the second parameter will return the max # of vertices + indices
+ // we can use before a flush is provoked and may return different values
+ // if called multiple times in succession.
+ // Passing false into the second parameter will return
+ // the maximum possible vertices + indices that can be rendered in a single batch
+ virtual void GetMaxToRender( IMesh *pMesh, bool bMaxUntilFlush, int *pMaxVerts, int *pMaxIndices ) = 0;
+
+ // Returns the max possible vertices + indices to render in a single draw call
+ virtual int GetMaxVerticesToRender( IMaterial *pMaterial ) = 0;
+ virtual int GetMaxIndicesToRender( ) = 0;
+ virtual void DisableAllLocalLights() = 0;
+ virtual int CompareMaterialCombos( IMaterial *pMaterial1, IMaterial *pMaterial2, int lightMapID1, int lightMapID2 ) = 0;
+
+ virtual IMesh *GetFlexMesh() = 0;
+
+ virtual void SetFlashlightStateEx( const FlashlightState_t &state, const VMatrix &worldToTexture, ITexture *pFlashlightDepthTexture ) = 0;
+
+ // Returns the currently bound local cubemap
+ virtual ITexture *GetLocalCubemap( ) = 0;
+
+ // This is a version of clear buffers which will only clear the buffer at pixels which pass the stencil test
+ virtual void ClearBuffersObeyStencil( bool bClearColor, bool bClearDepth ) = 0;
+
+ //enables/disables all entered clipping planes, returns the input from the last time it was called.
+ virtual bool EnableClipping( bool bEnable ) = 0;
+
+ //get fog distances entered with FogStart(), FogEnd(), and SetFogZ()
+ virtual void GetFogDistances( float *fStart, float *fEnd, float *fFogZ ) = 0;
+
+ // Hooks for firing PIX events from outside the Material System...
+ virtual void BeginPIXEvent( unsigned long color, const char *szName ) = 0;
+ virtual void EndPIXEvent() = 0;
+ virtual void SetPIXMarker( unsigned long color, const char *szName ) = 0;
+
+ // Batch API
+ // from changelist 166623:
+ // - replaced obtuse material system batch usage with an explicit and easier to thread API
+ virtual void BeginBatch( IMesh* pIndices ) = 0;
+ virtual void BindBatch( IMesh* pVertices, IMaterial *pAutoBind = NULL ) = 0;
+ virtual void DrawBatch(int firstIndex, int numIndices ) = 0;
+ virtual void EndBatch() = 0;
+
+ // Raw access to the call queue, which can be NULL if not in a queued mode
+ virtual ICallQueue *GetCallQueue() = 0;
+
+ // Returns the world-space camera position
+ virtual void GetWorldSpaceCameraPosition( Vector *pCameraPos ) = 0;
+ virtual void GetWorldSpaceCameraVectors( Vector *pVecForward, Vector *pVecRight, Vector *pVecUp ) = 0;
+
+ // Tone mapping
+ virtual void ResetToneMappingScale( float monoscale) = 0; // set scale to monoscale instantly with no chasing
+ virtual void SetGoalToneMappingScale( float monoscale) = 0; // set scale to monoscale instantly with no chasing
+
+ // call TurnOnToneMapping before drawing the 3d scene to get the proper interpolated brightness
+ // value set.
+ virtual void TurnOnToneMapping() = 0;
+
+ // Set a linear vector color scale for all 3D rendering.
+ // A value of [1.0f, 1.0f, 1.0f] should match non-tone-mapped rendering.
+ virtual void SetToneMappingScaleLinear( const Vector &scale ) = 0;
+
+ virtual Vector GetToneMappingScaleLinear( void ) = 0;
+ virtual void SetShadowDepthBiasFactors( float fSlopeScaleDepthBias, float fDepthBias ) = 0;
+
+ // Apply stencil operations to every pixel on the screen without disturbing depth or color buffers
+ virtual void PerformFullScreenStencilOperation( void ) = 0;
+
+ // Sets lighting origin for the current model (needed to convert directional lights to points)
+ virtual void SetLightingOrigin( Vector vLightingOrigin ) = 0;
+
+ // Set scissor rect for rendering
+ virtual void SetScissorRect( const int nLeft, const int nTop, const int nRight, const int nBottom, const bool bEnableScissor ) = 0;
+
+ // Methods used to build the morph accumulator that is read from when HW morph<ing is enabled.
+ virtual void BeginMorphAccumulation() = 0;
+ virtual void EndMorphAccumulation() = 0;
+ virtual void AccumulateMorph( IMorph* pMorph, int nMorphCount, const MorphWeight_t* pWeights ) = 0;
+
+ virtual void PushDeformation( DeformationBase_t const *Deformation ) = 0;
+ virtual void PopDeformation( ) = 0;
+ virtual int GetNumActiveDeformations() const = 0;
+
+ virtual bool GetMorphAccumulatorTexCoord( Vector2D *pTexCoord, IMorph *pMorph, int nVertex ) = 0;
+
+ // Version of get dynamic mesh that specifies a specific vertex format
+ virtual IMesh* GetDynamicMeshEx( VertexFormat_t vertexFormat, bool bBuffered = true,
+ IMesh* pVertexOverride = 0, IMesh* pIndexOverride = 0, IMaterial *pAutoBind = 0 ) = 0;
+
+ virtual void FogMaxDensity( float flMaxDensity ) = 0;
+
+#if defined( _X360 )
+ //Seems best to expose GPR allocation to scene rendering code. 128 total to split between vertex/pixel shaders (pixel will be set to 128 - vertex). Minimum value of 16. More GPR's = more threads.
+ virtual void PushVertexShaderGPRAllocation( int iVertexShaderCount = 64 ) = 0;
+ virtual void PopVertexShaderGPRAllocation( void ) = 0;
+#endif
+
+ virtual IMaterial *GetCurrentMaterial() = 0;
+ virtual int GetCurrentNumBones() const = 0;
+ virtual void *GetCurrentProxy() = 0;
+
+ // Color correction related methods..
+ // Client cannot call IColorCorrectionSystem directly because it is not thread-safe
+ // FIXME: Make IColorCorrectionSystem threadsafe?
+ virtual void EnableColorCorrection( bool bEnable ) = 0;
+ virtual ColorCorrectionHandle_t AddLookup( const char *pName ) = 0;
+ virtual bool RemoveLookup( ColorCorrectionHandle_t handle ) = 0;
+ virtual void LockLookup( ColorCorrectionHandle_t handle ) = 0;
+ virtual void LoadLookup( ColorCorrectionHandle_t handle, const char *pLookupName ) = 0;
+ virtual void UnlockLookup( ColorCorrectionHandle_t handle ) = 0;
+ virtual void SetLookupWeight( ColorCorrectionHandle_t handle, float flWeight ) = 0;
+ virtual void ResetLookupWeights( ) = 0;
+ virtual void SetResetable( ColorCorrectionHandle_t handle, bool bResetable ) = 0;
+
+ //There are some cases where it's simply not reasonable to update the full screen depth texture (mostly on PC).
+ //Use this to mark it as invalid and use a dummy texture for depth reads.
+ virtual void SetFullScreenDepthTextureValidityFlag( bool bIsValid ) = 0;
+
+ // A special path used to tick the front buffer while loading on the 360
+ virtual void SetNonInteractivePacifierTexture( ITexture *pTexture, float flNormalizedX, float flNormalizedY, float flNormalizedSize ) = 0;
+ virtual void SetNonInteractiveTempFullscreenBuffer( ITexture *pTexture, MaterialNonInteractiveMode_t mode ) = 0;
+ virtual void EnableNonInteractiveMode( MaterialNonInteractiveMode_t mode ) = 0;
+ virtual void RefreshFrontBufferNonInteractive() = 0;
+ // Allocates temp render data. Renderdata goes out of scope at frame end in multicore
+ // Renderdata goes out of scope after refcount goes to zero in singlecore.
+ // Locking/unlocking increases + decreases refcount
+ virtual void * LockRenderData( int nSizeInBytes ) = 0;
+ virtual void UnlockRenderData( void *pData ) = 0;
+
+ // Typed version. If specified, pSrcData is copied into the locked memory.
+ template< class E > E* LockRenderDataTyped( int nCount, const E* pSrcData = NULL );
+
+ // Temp render data gets immediately freed after it's all unlocked in single core.
+ // This prevents it from being freed
+ virtual void AddRefRenderData() = 0;
+ virtual void ReleaseRenderData() = 0;
+
+ // Returns whether a pointer is render data. NOTE: passing NULL returns true
+ virtual bool IsRenderData( const void *pData ) const = 0;
+ virtual void PrintfVA( char *fmt, va_list vargs ) = 0;
+ virtual void Printf( PRINTF_FORMAT_STRING char *fmt, ... ) = 0;
+ virtual float Knob( char *knobname, float *setvalue = NULL ) = 0;
+ // Allows us to override the alpha write setting of a material
+ virtual void OverrideAlphaWriteEnable( bool bEnable, bool bAlphaWriteEnable ) = 0;
+ virtual void OverrideColorWriteEnable( bool bOverrideEnable, bool bColorWriteEnable ) = 0;
+
+ virtual void ClearBuffersObeyStencilEx( bool bClearColor, bool bClearAlpha, bool bClearDepth ) = 0;
+};
+
+template< class E > inline E* IMatRenderContext::LockRenderDataTyped( int nCount, const E* pSrcData )
+{
+ int nSizeInBytes = nCount * sizeof(E);
+ E *pDstData = (E*)LockRenderData( nSizeInBytes );
+ if ( pSrcData && pDstData )
+ {
+ memcpy( pDstData, pSrcData, nSizeInBytes );
+ }
+ return pDstData;
+}
+
+
+//-----------------------------------------------------------------------------
+// Utility class for addreffing/releasing render data (prevents freeing on single core)
+//-----------------------------------------------------------------------------
+class CMatRenderDataReference
+{
+public:
+ CMatRenderDataReference();
+ CMatRenderDataReference( IMatRenderContext* pRenderContext );
+ ~CMatRenderDataReference();
+ void Lock( IMatRenderContext *pRenderContext );
+ void Release();
+
+private:
+ IMatRenderContext *m_pRenderContext;
+};
+
+
+inline CMatRenderDataReference::CMatRenderDataReference()
+{
+ m_pRenderContext = NULL;
+}
+
+inline CMatRenderDataReference::CMatRenderDataReference( IMatRenderContext* pRenderContext )
+{
+ m_pRenderContext = NULL;
+ Lock( pRenderContext );
+}
+
+inline CMatRenderDataReference::~CMatRenderDataReference()
+{
+ Release();
+}
+
+inline void CMatRenderDataReference::Lock( IMatRenderContext* pRenderContext )
+{
+ if ( !m_pRenderContext )
+ {
+ m_pRenderContext = pRenderContext;
+ m_pRenderContext->AddRefRenderData( );
+ }
+}
+
+inline void CMatRenderDataReference::Release()
+{
+ if ( m_pRenderContext )
+ {
+ m_pRenderContext->ReleaseRenderData( );
+ m_pRenderContext = NULL;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Utility class for locking/unlocking render data
+//-----------------------------------------------------------------------------
+template< typename E >
+class CMatRenderData
+{
+public:
+ CMatRenderData( IMatRenderContext* pRenderContext );
+ CMatRenderData( IMatRenderContext* pRenderContext, int nCount, const E *pSrcData = NULL );
+ ~CMatRenderData();
+ E* Lock( int nCount, const E* pSrcData = NULL );
+ void Release();
+ bool IsValid() const;
+ const E* Base() const;
+ E* Base();
+ const E& operator[]( int i ) const;
+ E& operator[]( int i );
+
+private:
+ IMatRenderContext* m_pRenderContext;
+ E *m_pRenderData;
+ int m_nCount;
+ bool m_bNeedsUnlock;
+};
+
+template< typename E >
+inline CMatRenderData<E>::CMatRenderData( IMatRenderContext* pRenderContext )
+{
+ m_pRenderContext = pRenderContext;
+ m_nCount = 0;
+ m_pRenderData = 0;
+ m_bNeedsUnlock = false;
+}
+
+template< typename E >
+inline CMatRenderData<E>::CMatRenderData( IMatRenderContext* pRenderContext, int nCount, const E* pSrcData )
+{
+ m_pRenderContext = pRenderContext;
+ m_nCount = 0;
+ m_pRenderData = 0;
+ m_bNeedsUnlock = false;
+ Lock( nCount, pSrcData );
+}
+
+template< typename E >
+inline CMatRenderData<E>::~CMatRenderData()
+{
+ Release();
+}
+
+template< typename E >
+inline bool CMatRenderData<E>::IsValid() const
+{
+ return m_pRenderData != NULL;
+}
+
+template< typename E >
+inline E* CMatRenderData<E>::Lock( int nCount, const E* pSrcData )
+{
+ m_nCount = nCount;
+ if ( pSrcData && m_pRenderContext->IsRenderData( pSrcData ) )
+ {
+ // Yes, we're const-casting away, but that should be ok since
+ // the src data is render data
+ m_pRenderData = const_cast<E*>( pSrcData );
+ m_pRenderContext->AddRefRenderData();
+ m_bNeedsUnlock = false;
+ return m_pRenderData;
+ }
+ m_pRenderData = m_pRenderContext->LockRenderDataTyped<E>( nCount, pSrcData );
+ m_bNeedsUnlock = true;
+ return m_pRenderData;
+}
+
+template< typename E >
+inline void CMatRenderData<E>::Release()
+{
+ if ( m_pRenderContext && m_pRenderData )
+ {
+ if ( m_bNeedsUnlock )
+ {
+ m_pRenderContext->UnlockRenderData( m_pRenderData );
+ }
+ else
+ {
+ m_pRenderContext->ReleaseRenderData();
+ }
+ }
+ m_pRenderData = NULL;
+ m_nCount = 0;
+ m_bNeedsUnlock = false;
+}
+
+template< typename E >
+inline E* CMatRenderData<E>::Base()
+{
+ return m_pRenderData;
+}
+
+template< typename E >
+inline const E* CMatRenderData<E>::Base() const
+{
+ return m_pRenderData;
+}
+
+template< typename E >
+inline E& CMatRenderData<E>::operator[]( int i )
+{
+ Assert( ( i >= 0 ) && ( i < m_nCount ) );
+ return m_pRenderData[i];
+}
+
+template< typename E >
+inline const E& CMatRenderData<E>::operator[]( int i ) const
+{
+ Assert( ( i >= 0 ) && ( i < m_nCount ) );
+ return m_pRenderData[i];
+}
+
+
+//-----------------------------------------------------------------------------
+
+class CMatRenderContextPtr : public CRefPtr<IMatRenderContext>
+{
+ typedef CRefPtr<IMatRenderContext> BaseClass;
+public:
+ CMatRenderContextPtr() {}
+ CMatRenderContextPtr( IMatRenderContext *pInit ) : BaseClass( pInit ) { if ( BaseClass::m_pObject ) BaseClass::m_pObject->BeginRender(); }
+ CMatRenderContextPtr( IMaterialSystem *pFrom ) : BaseClass( pFrom->GetRenderContext() ) { if ( BaseClass::m_pObject ) BaseClass::m_pObject->BeginRender(); }
+ ~CMatRenderContextPtr() { if ( BaseClass::m_pObject ) BaseClass::m_pObject->EndRender(); }
+
+ IMatRenderContext *operator=( IMatRenderContext *p ) { if ( p ) p->BeginRender(); return BaseClass::operator=( p ); }
+
+ void SafeRelease() { if ( BaseClass::m_pObject ) BaseClass::m_pObject->EndRender(); BaseClass::SafeRelease(); }
+ void AssignAddRef( IMatRenderContext *pFrom ) { if ( BaseClass::m_pObject ) BaseClass::m_pObject->EndRender(); BaseClass::AssignAddRef( pFrom ); BaseClass::m_pObject->BeginRender(); }
+
+ void GetFrom( IMaterialSystem *pFrom ) { AssignAddRef( pFrom->GetRenderContext() ); }
+
+
+private:
+ CMatRenderContextPtr( const CMatRenderContextPtr &from );
+ void operator=( const CMatRenderContextPtr &from );
+
+};
+
+//-----------------------------------------------------------------------------
+// Helper class for begin/end of pix event via constructor/destructor
+//-----------------------------------------------------------------------------
+#define PIX_VALVE_ORANGE 0xFFF5940F
+
+class PIXEvent
+{
+public:
+ PIXEvent( IMatRenderContext *pRenderContext, const char *szName, unsigned long color = PIX_VALVE_ORANGE )
+ {
+ m_pRenderContext = pRenderContext;
+ Assert( m_pRenderContext );
+ Assert( szName );
+ m_pRenderContext->BeginPIXEvent( color, szName );
+ }
+ ~PIXEvent()
+ {
+ m_pRenderContext->EndPIXEvent();
+ }
+private:
+ IMatRenderContext *m_pRenderContext;
+};
+
+
+// Also be sure to enable PIX_INSTRUMENTATION in shaderdevicedx8.h
+//#define PIX_ENABLE 1 // set this to 1 and build engine/studiorender to enable pix events in the engine
+
+#if PIX_ENABLE
+# define PIXEVENT PIXEvent _pixEvent
+#else
+# define PIXEVENT
+#endif
+
+//-----------------------------------------------------------------------------
+
+#ifdef MATERIAL_SYSTEM_DEBUG_CALL_QUEUE
+#include "tier1/callqueue.h"
+#include "tier1/fmtstr.h"
+static void DoMatSysQueueMark( IMaterialSystem *pMaterialSystem, const char *psz )
+{
+ CMatRenderContextPtr pRenderContext( pMaterialSystem );
+ if ( pRenderContext->GetCallQueue() )
+ pRenderContext->GetCallQueue()->QueueCall( Plat_DebugString, CUtlEnvelope<const char *>( psz ) );
+}
+
+#define MatSysQueueMark( pMaterialSystem, ...) DoMatSysQueueMark( pMaterialSystem, CFmtStr( __VA_ARGS__ ) )
+#else
+#define MatSysQueueMark( msg, ...) ((void)0)
+#endif
+
+//-----------------------------------------------------------------------------
+
+extern IMaterialSystem *materials;
+extern IMaterialSystem *g_pMaterialSystem;
+
+#endif // IMATERIALSYSTEM_H