This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

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