//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// // // Purpose: // // $NoKeywords: $ // //===========================================================================// #ifndef IMATERIALVAR_H #define IMATERIALVAR_H #ifdef _WIN32 #pragma once #endif #include "tier0/platform.h" #include "tier1/utlsymbol.h" #include "mathlib/vector4d.h" class IMaterial; class VMatrix; class ITexture; #define MAKE_MATERIALVAR_FOURCC(ch0, ch1, ch2, ch3) \ ((unsigned long)(ch0) | ((unsigned long)(ch1) << 8) | \ ((unsigned long)(ch2) << 16) | ((unsigned long)(ch3) << 24 )) // This fourcc is reserved. #define FOURCC_UNKNOWN MAKE_MATERIALVAR_FOURCC('U','N','K','N') //----------------------------------------------------------------------------- // Various material var types //----------------------------------------------------------------------------- enum MaterialVarType_t { MATERIAL_VAR_TYPE_FLOAT = 0, MATERIAL_VAR_TYPE_STRING, MATERIAL_VAR_TYPE_VECTOR, MATERIAL_VAR_TYPE_TEXTURE, MATERIAL_VAR_TYPE_INT, MATERIAL_VAR_TYPE_FOURCC, MATERIAL_VAR_TYPE_UNDEFINED, MATERIAL_VAR_TYPE_MATRIX, MATERIAL_VAR_TYPE_MATERIAL, }; typedef unsigned short MaterialVarSym_t; class IMaterialVar { public: typedef unsigned long FourCC; protected: // base data and accessors char* m_pStringVal; int m_intVal; Vector4D m_VecVal; // member data. total = 4 bytes uint8 m_Type : 4; uint8 m_nNumVectorComps : 3; uint8 m_bFakeMaterialVar : 1; uint8 m_nTempIndex; CUtlSymbol m_Name; public: // class factory methods static IMaterialVar* Create( IMaterial* pMaterial, char const* pKey, VMatrix const& matrix ); static IMaterialVar* Create( IMaterial* pMaterial, char const* pKey, char const* pVal ); static IMaterialVar* Create( IMaterial* pMaterial, char const* pKey, float* pVal, int numcomps ); static IMaterialVar* Create( IMaterial* pMaterial, char const* pKey, float val ); static IMaterialVar* Create( IMaterial* pMaterial, char const* pKey, int val ); static IMaterialVar* Create( IMaterial* pMaterial, char const* pKey ); static void Destroy( IMaterialVar* pVar ); static MaterialVarSym_t GetSymbol( char const* pName ); static MaterialVarSym_t FindSymbol( char const* pName ); static bool SymbolMatches( char const* pName, MaterialVarSym_t symbol ); static void DeleteUnreferencedTextures( bool enable ); virtual ITexture *GetTextureValue( void ) = 0; virtual bool IsTextureValueInternalEnvCubemap( void ) const = 0; virtual char const * GetName( void ) const = 0; virtual MaterialVarSym_t GetNameAsSymbol() const = 0; virtual void SetFloatValue( float val ) = 0; virtual void SetIntValue( int val ) = 0; virtual void SetStringValue( char const *val ) = 0; virtual char const * GetStringValue( void ) const = 0; // Use FourCC values to pass app-defined data structures between // the proxy and the shader. The shader should ignore the data if // its FourCC type not correct. virtual void SetFourCCValue( FourCC type, void *pData ) = 0; virtual void GetFourCCValue( FourCC *type, void **ppData ) = 0; // Vec (dim 2-4) virtual void SetVecValue( float const* val, int numcomps ) = 0; virtual void SetVecValue( float x, float y ) = 0; virtual void SetVecValue( float x, float y, float z ) = 0; virtual void SetVecValue( float x, float y, float z, float w ) = 0; virtual void GetLinearVecValue( float *val, int numcomps ) const = 0; // revisit: is this a good interface for textures? virtual void SetTextureValue( ITexture * ) = 0; virtual IMaterial * GetMaterialValue( void ) = 0; virtual void SetMaterialValue( IMaterial * ) = 0; virtual bool IsDefined() const = 0; virtual void SetUndefined() = 0; // Matrix virtual void SetMatrixValue( VMatrix const& matrix ) = 0; virtual const VMatrix &GetMatrixValue( ) = 0; virtual bool MatrixIsIdentity() const = 0; // Copy.... virtual void CopyFrom( IMaterialVar *pMaterialVar ) = 0; virtual void SetValueAutodetectType( char const *val ) = 0; virtual IMaterial * GetOwningMaterial() = 0; //set just 1 component virtual void SetVecComponentValue( float fVal, int nComponent ) = 0; protected: virtual int GetIntValueInternal( void ) const = 0; virtual float GetFloatValueInternal( void ) const = 0; virtual float const* GetVecValueInternal( ) const = 0; virtual void GetVecValueInternal( float *val, int numcomps ) const = 0; virtual int VectorSizeInternal() const = 0; public: FORCEINLINE MaterialVarType_t GetType( void ) const { return ( MaterialVarType_t )m_Type; } FORCEINLINE bool IsTexture() const { return m_Type == MATERIAL_VAR_TYPE_TEXTURE; } FORCEINLINE operator ITexture*() { return GetTextureValue(); } // NOTE: Fast methods should only be called in thread-safe situations FORCEINLINE int GetIntValueFast( void ) const { // Set methods for float and vector update this return m_intVal; } FORCEINLINE float GetFloatValueFast( void ) const { return m_VecVal[0]; } FORCEINLINE float const* GetVecValueFast( ) const { return m_VecVal.Base(); } FORCEINLINE void GetVecValueFast( float *val, int numcomps ) const { Assert( ( numcomps >0 ) && ( numcomps <= 4 ) ); for( int i=0 ; i < numcomps; i++ ) { val[i] = m_VecVal[ i ]; } } FORCEINLINE int VectorSizeFast() const { return m_nNumVectorComps; } #ifdef FAST_MATERIALVAR_ACCESS FORCEINLINE int GetIntValue( void ) const { return GetIntValueFast(); } FORCEINLINE float GetFloatValue( void ) const { return GetFloatValueFast(); } FORCEINLINE float const* GetVecValue( ) const { return GetVecValueFast(); } FORCEINLINE void GetVecValue( float *val, int numcomps ) const { GetVecValueFast( val, numcomps ); } FORCEINLINE int VectorSize() const { return VectorSizeFast(); } #else // !FAST_MATERIALVAR_ACCESS FORCEINLINE int GetIntValue( void ) const { return GetIntValueInternal(); } FORCEINLINE float GetFloatValue( void ) const { return GetFloatValueInternal(); } FORCEINLINE float const* GetVecValue( ) const { return GetVecValueInternal(); } FORCEINLINE void GetVecValue( float *val, int numcomps ) const { return GetVecValueInternal( val, numcomps ); } FORCEINLINE int VectorSize() const { return VectorSizeInternal(); } #endif private: FORCEINLINE void SetTempIndex( int nIndex ) { m_nTempIndex = nIndex; } friend void EnableThreadedMaterialVarAccess( bool bEnable, IMaterialVar **ppParams, int nVarCount ); }; #endif // IMATERIALVAR_H