208 lines
6.7 KiB
C++
208 lines
6.7 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//===========================================================================//
|
|
|
|
#ifndef IMATERIALVAR_H
|
|
#define IMATERIALVAR_H
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "../mathlib/vector4d.h"
|
|
#include "../tier0/platform.h"
|
|
#include "../tier1/utlsymbol.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 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
|