4303 lines
97 KiB
C++
4303 lines
97 KiB
C++
/*=============================================================================
|
|
Shader.h : Shaders declarations.
|
|
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
|
|
|
|
Revision history:
|
|
* Created by Khonich Andrey
|
|
|
|
=============================================================================*/
|
|
|
|
#ifndef __SHADER_H__
|
|
#define __SHADER_H__
|
|
|
|
#include <string>
|
|
#include <Names.h>
|
|
#include "../Defs.h"
|
|
|
|
|
|
// Shader.h
|
|
// Shader pipeline common declarations.
|
|
|
|
class CSunFlares;
|
|
class CCObject;
|
|
struct SShaderPass;
|
|
struct STexPic;
|
|
struct SShader;
|
|
struct SLightMaterial;
|
|
struct SShaderTexUnit;
|
|
struct SMatrixTransform;
|
|
struct SShaderPassHW;
|
|
class CRendElement;
|
|
|
|
#define MAX_SHADERS 4096
|
|
#define MAX_SHADER_RES 16384
|
|
#define SHADER_VERSION 1.00
|
|
|
|
//=========================================================
|
|
|
|
/*----------------------------------------------------------------------------
|
|
TDList.
|
|
----------------------------------------------------------------------------*/
|
|
|
|
//
|
|
// Simple double-linked list template.
|
|
//
|
|
template< class T > class TDList : public T
|
|
{
|
|
public:
|
|
TDList* Next;
|
|
TDList** PrevLink;
|
|
void Unlink()
|
|
{
|
|
if( Next )
|
|
Next->PrevLink = PrevLink;
|
|
if (PrevLink)
|
|
*PrevLink = Next;
|
|
}
|
|
void Link( TDList*& Before )
|
|
{
|
|
if( Before )
|
|
Before->PrevLink = &Next;
|
|
Next = Before;
|
|
PrevLink = &Before;
|
|
Before = this;
|
|
}
|
|
};
|
|
|
|
|
|
//=========================================================
|
|
|
|
#define MAX_ORIENTS 64
|
|
|
|
#define FOR_ORTHO 1
|
|
|
|
struct SCoord
|
|
{
|
|
Vec3d m_Org;
|
|
Vec3d m_Vecs[3]; //forward, right, up (matrix 3x3)
|
|
};
|
|
|
|
// Polygon orientation types
|
|
struct SOrient
|
|
{
|
|
SCoord m_Coord;
|
|
uint m_Flags;
|
|
};
|
|
|
|
//===========================================================
|
|
|
|
struct SPair
|
|
{
|
|
std::string MacroName;
|
|
std::string Macro;
|
|
};
|
|
|
|
struct SFXParam
|
|
{
|
|
std::string m_Name; // Parameter name
|
|
EParamType m_Type; // Parameter type
|
|
int m_nRows; // Matrix rows
|
|
int m_nColumns; // Matrix columns
|
|
UParamVal m_Value; // Default value
|
|
std::string m_Annotations; // Additional parameters (scripts)
|
|
std::string m_Assign; // Parameter app handling type
|
|
SFXParam()
|
|
{
|
|
m_Type = eType_UNKNOWN;
|
|
m_Value.m_Color[0] = m_Value.m_Color[1] = m_Value.m_Color[2] = m_Value.m_Color[3] = 0;
|
|
m_nRows = 0;
|
|
m_nColumns = 0;
|
|
}
|
|
};
|
|
|
|
struct SFXStruct
|
|
{
|
|
std::string m_Name;
|
|
std::string m_Struct;
|
|
};
|
|
|
|
struct SFXSampler
|
|
{
|
|
std::string m_Name;
|
|
int m_nTextureID;
|
|
int m_nFilterFlag;
|
|
};
|
|
|
|
struct SFXTexture
|
|
{
|
|
int m_nResourceSlot;
|
|
ETexType m_nResType;
|
|
std::string m_Name;
|
|
std::string m_ResName;
|
|
};
|
|
|
|
enum EShaderVersion
|
|
{
|
|
eSHV_Unknown,
|
|
eSHV_PS_Auto,
|
|
eSHV_PS_1_1,
|
|
eSHV_PS_1_3,
|
|
eSHV_PS_1_4,
|
|
eSHV_PS_2_0,
|
|
eSHV_PS_2_x,
|
|
eSHV_PS_3_0,
|
|
|
|
eSHV_VS_Auto,
|
|
eSHV_VS_1_1,
|
|
eSHV_VS_2_0,
|
|
eSHV_VS_2_a,
|
|
eSHV_VS_3_0,
|
|
};
|
|
//=============================================================================
|
|
|
|
// Volume fog definitions
|
|
struct SFogInfo
|
|
{
|
|
CFColor m_FogColor;
|
|
int m_FogAxis;
|
|
float m_FogDensity;
|
|
SWaveForm m_WaveFogGen;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SFogInfo);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
struct SMFog
|
|
{
|
|
int m_NumBrush;
|
|
float m_SideDists[6];
|
|
CFColor m_Color;
|
|
float m_fMaxDist;
|
|
SFogInfo m_FogInfo;
|
|
Vec3d m_Normal;
|
|
float m_Dist;
|
|
bool bCaustics;
|
|
};
|
|
|
|
struct SSkyInfo
|
|
{
|
|
STexPic *m_SkyBox[3];
|
|
float m_fSkyLayerHeight;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SSkyInfo);
|
|
return nSize;
|
|
}
|
|
SSkyInfo()
|
|
{
|
|
memset(this, 0, sizeof(SSkyInfo));
|
|
}
|
|
~SSkyInfo();
|
|
};
|
|
|
|
//=================================================================
|
|
// Normals generating types
|
|
enum EEvalNormal
|
|
{
|
|
eNORM_Identity,
|
|
eNORM_Front,
|
|
eNORM_Back,
|
|
eNORM_Custom,
|
|
eNORM_Wave,
|
|
eNORM_Edge,
|
|
eNORM_InvEdge,
|
|
};
|
|
|
|
// ================================================================
|
|
// RGB generating types
|
|
enum EEvalRGB
|
|
{
|
|
eERGB_NoFill=0,
|
|
eERGB_FromClient,
|
|
eERGB_Identity,
|
|
eERGB_Object,
|
|
eERGB_OneMinusObject,
|
|
eERGB_RE,
|
|
eERGB_OneMinusRE,
|
|
eERGB_OneMinusFromClient,
|
|
eERGB_World,
|
|
eERGB_Wave,
|
|
eERGB_Noise,
|
|
eERGB_Comps,
|
|
|
|
eERGB_Fixed,
|
|
eERGB_StyleColor,
|
|
eERGB_StyleIntens,
|
|
};
|
|
|
|
// Alpha generating types
|
|
enum EEvalAlpha
|
|
{
|
|
eEALPHA_NoFill=0,
|
|
eEALPHA_FromClient,
|
|
eEALPHA_Identity,
|
|
eEALPHA_Object,
|
|
eEALPHA_OneMinusObject,
|
|
eEALPHA_RE,
|
|
eEALPHA_OneMinusRE,
|
|
eEALPHA_OneMinusFromClient,
|
|
eEALPHA_World,
|
|
eEALPHA_Wave,
|
|
eEALPHA_Noise,
|
|
eEALPHA_Portal,
|
|
eEALPHA_Comps,
|
|
|
|
eEALPHA_Fixed,
|
|
eEALPHA_Beam,
|
|
eEALPHA_Style,
|
|
};
|
|
|
|
struct SStencil
|
|
{
|
|
int m_State;
|
|
int m_FuncRef;
|
|
int m_FuncMask;
|
|
|
|
SStencil()
|
|
{
|
|
m_State = 0;
|
|
m_FuncRef = 0;
|
|
m_FuncMask = 0;
|
|
}
|
|
void mfSet();
|
|
int Size() {return sizeof(*this);};
|
|
};
|
|
|
|
#define ESF_STATE 1
|
|
#define ESF_ALPHAGEN 2
|
|
#define ESF_RGBGEN 4
|
|
#define ESF_COLORMASK 8
|
|
#define ESF_POLYLINE 0x10
|
|
#define ESF_NOCULL 0x20
|
|
#define ESF_CULLFRONT 0x40
|
|
|
|
struct SEfState
|
|
{
|
|
SStencil *m_Stencil;
|
|
int m_Flags;
|
|
int m_State;
|
|
bool m_bClearStencil;
|
|
EEvalAlpha m_eEvalAlpha;
|
|
EEvalRGB m_eEvalRGB;
|
|
byte m_FixedColor[4];
|
|
byte m_ColorMask[4];
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SEfState);
|
|
if (m_Stencil)
|
|
nSize += m_Stencil->Size();
|
|
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
|
|
// Blending components for fog calculation
|
|
enum EFogBlendComponents
|
|
{
|
|
eFBLC_None,
|
|
eFBLC_OnlyColor,
|
|
eFBLC_ColorAlpha,
|
|
eFBLC_OnlyAlpha
|
|
};
|
|
|
|
struct SParam;
|
|
struct SCGParam4f;
|
|
|
|
struct SRGBGenNoise
|
|
{
|
|
float m_ConstR;
|
|
float m_RangeR;
|
|
|
|
float m_ConstG;
|
|
float m_RangeG;
|
|
|
|
float m_ConstB;
|
|
float m_RangeB;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SRGBGenNoise);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
struct SAlphaGenNoise
|
|
{
|
|
float m_ConstA;
|
|
float m_RangeA;
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SAlphaGenNoise);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
#ifdef WIN64
|
|
#pragma warning( push ) //AMD Port
|
|
#pragma warning( disable : 4267 )
|
|
#endif
|
|
|
|
struct SCGScript
|
|
{
|
|
CName m_Name;
|
|
char *m_Script;
|
|
|
|
~SCGScript()
|
|
{
|
|
}
|
|
SCGScript()
|
|
{
|
|
m_Script = NULL;
|
|
}
|
|
|
|
void Release()
|
|
{
|
|
SAFE_DELETE_ARRAY(m_Script);
|
|
mfRemoveFromList();
|
|
delete this;
|
|
}
|
|
void mfRemoveFromList();
|
|
|
|
int Size(bool bShared)
|
|
{
|
|
bool bOk = false;
|
|
if (bShared)
|
|
{
|
|
if (m_Name.GetIndex())
|
|
bOk = true;
|
|
}
|
|
else
|
|
{
|
|
if (!m_Name.GetIndex())
|
|
bOk = true;
|
|
}
|
|
if (!bOk)
|
|
return 0;
|
|
int nSize = sizeof(*this);
|
|
if (m_Script)
|
|
nSize += strlen(m_Script)+1;
|
|
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
#ifdef WIN64
|
|
#pragma warning( pop ) //AMD Port
|
|
#endif
|
|
|
|
//=============================================================================
|
|
// Vertex programms / Vertex shaders (VP/VS)
|
|
|
|
// References in script files
|
|
struct SRefEfs
|
|
{
|
|
int m_Ind;
|
|
int m_Offset;
|
|
int m_Size;
|
|
};
|
|
|
|
// References for loaded Shaders
|
|
struct SRefEfsLoaded
|
|
{
|
|
SShader *m_Ef;
|
|
};
|
|
|
|
//=====================================================================
|
|
|
|
|
|
typedef std::map<string,SRefEfs*> ShaderFilesMap;
|
|
typedef ShaderFilesMap::iterator ShaderFilesMapItor;
|
|
|
|
typedef std::map<string,SRefEfsLoaded> LoadedShadersMap;
|
|
typedef LoadedShadersMap::iterator LoadedShadersMapItor;
|
|
|
|
typedef std::map<string,string> ShaderMacro;
|
|
typedef ShaderMacro::iterator ShaderMacroItor;
|
|
|
|
struct SLocalMacros
|
|
{
|
|
int m_nOffset;
|
|
ShaderMacro *m_Macros;
|
|
};
|
|
|
|
//======================================================================
|
|
|
|
static _inline float *sfparam(Vec3 param)
|
|
{
|
|
static float sparam[4];
|
|
sparam[0] = param.x;
|
|
sparam[1] = param.y;
|
|
sparam[2] = param.z;
|
|
sparam[3] = 1.0f;
|
|
|
|
return &sparam[0];
|
|
}
|
|
|
|
static _inline float *sfparam(float param)
|
|
{
|
|
static float sparam[4];
|
|
sparam[0] = param;
|
|
sparam[1] = 0;
|
|
sparam[2] = 0;
|
|
sparam[3] = 1.0f;
|
|
return &sparam[0];
|
|
}
|
|
|
|
static _inline float *sfparam(float param0, float param1, float param2, float param3)
|
|
{
|
|
static float sparam[4];
|
|
sparam[0] = param0;
|
|
sparam[1] = param1;
|
|
sparam[2] = param2;
|
|
sparam[3] = param3;
|
|
return &sparam[0];
|
|
}
|
|
|
|
// Vertex program and pixel shader per-instance flags
|
|
#define VPVST_FOGGLOBAL 1
|
|
#define VPVST_CLIPPLANES3 2
|
|
#define VPVST_SPECANTIALIAS 4
|
|
#define VPVST_NOFOG 8
|
|
#define VPVST_NOISE 0x10
|
|
#define VPVST_HDR 0x20
|
|
#define VPVST_HDRLM 0x40
|
|
#define VPVST_HDRREAL 0x80
|
|
#define VPVST_INSTANCING_NOROT 0x10000000
|
|
#define VPVST_INSTANCING_ROT 0x20000000
|
|
#define VPVST_3DC 0x40000000
|
|
#define VPVST_3DC_A 0x80000000
|
|
|
|
#define VPVST_TCM0 RBMF_TCM0
|
|
#define VPVST_TCGOL0 RBMF_TCGOL0
|
|
#define VPVST_TCGRM0 RBMF_TCGRM0
|
|
#define VPVST_TCGNM0 RBMF_TCGNM0
|
|
#define VPVST_TCGSM0 RBMF_TCGSM0
|
|
#define VPVST_TCMASK (RBMF_TCG | RBMF_TCM)
|
|
|
|
// Vertex program flags (m_Flags)
|
|
#define VPFI_NOFOG 1
|
|
#define VPFI_UNIFIEDPOS 2
|
|
#define VPFI_AUTOENUMTC 4
|
|
#define VPFI_NOISE 8
|
|
#define VPFI_DEFAULTPOS 0x10
|
|
#define VPFI_VS20ONLY 0x20
|
|
#define VPFI_PROJECTED 0x40
|
|
#define VPFI_VS30ONLY 0x80
|
|
#define VPFI_SUPPORTS_INSTANCING 0x100
|
|
#define VPFI_SUPPORTS_MULTILIGHTS 0x200
|
|
|
|
#define VPFI_PRECACHEPHASE 0x400
|
|
#define VPFI_WASGENERATED 0x800
|
|
#define VPFI_NOSPECULAR 0x1000
|
|
#define VPFI_FX 0x2000
|
|
|
|
// Vertex program input flags (passed via mfSet function)
|
|
#define VPF_SETPOINTERSFORSHADER 1
|
|
#define VPF_SETPOINTERSFORPASS 2
|
|
#define VPF_DONTSETMATRICES 4
|
|
#define VPF_INSTANCING_NOROTATE 8
|
|
#define VPF_INSTANCING_ROTATE 16
|
|
|
|
class CVProgram
|
|
{
|
|
public:
|
|
static CVProgram *m_LastVP;
|
|
static int m_LastTypeVP;
|
|
static int m_LastLTypeVP;
|
|
|
|
int m_nRefCounter;
|
|
int m_Frame;
|
|
uint64 m_nMaskGen;
|
|
int m_nFailed;
|
|
static int m_FrameObj;
|
|
int m_FrameLoad;
|
|
int m_Flags;
|
|
int m_Id;
|
|
FILETIME m_WriteTime;
|
|
ShaderMacro m_Macros;
|
|
string m_Name;
|
|
bool m_bCGType;
|
|
int m_CGProfileType;
|
|
|
|
public:
|
|
CVProgram()
|
|
{
|
|
m_nRefCounter = 0;
|
|
m_Id = 0;
|
|
m_Flags = 0;
|
|
m_nMaskGen = 0;
|
|
}
|
|
_inline const char * mfGetName()
|
|
{
|
|
return m_Name.c_str();
|
|
}
|
|
virtual ~CVProgram() {}
|
|
|
|
#if !defined(PS2) && !defined (GC) && !defined (NULL_RENDERER)
|
|
static TArray<CVProgram *> m_VPrograms;
|
|
#endif
|
|
static CVProgram *mfForName(const char *name, std::vector<SFXStruct>& Structs, std::vector<SPair>& Macros, char *entryFunc, EShaderVersion eSHV, uint64 nMaskGen=0);
|
|
static CVProgram *mfForName(const char *name, uint64 nMaskGen=0);
|
|
static void mfClearAll();
|
|
static void mfReloadScript(const char *szPath, const char *szName, int nFlags, uint64 nMaskGen);
|
|
|
|
virtual void Release() = 0;
|
|
virtual void mfReload(int nFlags);
|
|
virtual int Size() = 0;
|
|
virtual bool mfCompile(char *scr) {return 0;}
|
|
virtual bool mfSet(bool bStat, SShaderPassHW *slw, int nFlags=VPF_SETPOINTERSFORSHADER) {return 0;}
|
|
virtual void mfSetVariables(bool bObj, TArray<SCGParam4f>* Vars) {}
|
|
virtual void mfSetStateMatrices() {}
|
|
virtual void mfReset() {}
|
|
virtual void mfPrecache() {}
|
|
virtual bool mfHasPointer(ESrcPointer ePtr) {return false;}
|
|
virtual const char *mfGetCurScript() {return NULL;}
|
|
virtual void mfGatherFXParameters(const char *buf, SShaderPassHW *pSHPass, std::vector<SFXParam>& Params, std::vector<SFXSampler>& Samplers, std::vector<SFXTexture>& Textures, SShader *ef) = 0;
|
|
virtual void mfPostLoad() = 0;
|
|
virtual int mfVertexFormat(bool &bUseTangents, bool &bUseLM) = 0;
|
|
};
|
|
|
|
void SkipCharacters(char **buf, const char *toSkip);
|
|
|
|
_inline char *sGetFuncName(const char *pFunc)
|
|
{
|
|
static char func[128];
|
|
const char *b = pFunc;
|
|
while(*b > 0x20) { b++; }
|
|
while(*b <= 0x20) { b++; }
|
|
int n = 0;
|
|
while(*b > 0x20 && *b != '(') { func[n++] = *b++; }
|
|
func[n] = 0;
|
|
|
|
return func;
|
|
}
|
|
|
|
//=============================================================================
|
|
// Pixel shaders (PS)
|
|
|
|
// Pixel shader flags (m_Flags)
|
|
#define PSFI_NOFOG 1
|
|
#define PSFI_PS20ONLY 2
|
|
#define PSFI_AUTOENUMTC 4
|
|
#define PSFI_PS30ONLY 8
|
|
#define PSFI_SUPPORTS_INSTANCING 0x10
|
|
#define PSFI_SUPPORTS_MULTILIGHTS 0x20
|
|
#define PSFI_PRECACHEPHASE 0x100
|
|
#define PSFI_WASGENERATED 0x200
|
|
#define PSFI_NOSPECULAR 0x400
|
|
#define PSFI_FX 0x800
|
|
#define PSFI_MRT 0x1000
|
|
#define PSFI_PS2XONLY 0x2000
|
|
|
|
// Pixel shader input flags (passed via mfSet function)
|
|
#define PSF_INSTANCING 1
|
|
|
|
class CPShader
|
|
{
|
|
public:
|
|
static CPShader *m_CurRC;
|
|
|
|
static CPShader *m_LastVP;
|
|
static int m_LastTypeVP;
|
|
static int m_LastLTypeVP;
|
|
|
|
int m_nRefCounter;
|
|
int m_Frame;
|
|
uint64 m_nMaskGen;
|
|
int m_nFailed;
|
|
int m_FrameLoad;
|
|
int m_Flags;
|
|
int m_Id;
|
|
FILETIME m_WriteTime;
|
|
ShaderMacro m_Macros;
|
|
string m_Name;
|
|
bool m_bActive;
|
|
bool m_bCGType;
|
|
int m_CGProfileType;
|
|
|
|
public:
|
|
CPShader()
|
|
{
|
|
m_Id = 0;
|
|
m_nRefCounter = 0;
|
|
m_bActive = false;
|
|
m_Flags = 0;
|
|
m_nMaskGen = 0;
|
|
}
|
|
virtual ~CPShader() {}
|
|
|
|
_inline const char * mfGetName()
|
|
{
|
|
return m_Name.c_str();
|
|
}
|
|
|
|
#if !defined(PS2) && !defined (GC) && !defined (NULL_RENDERER)
|
|
static TArray<CPShader *> m_PShaders;
|
|
|
|
static CPShader *mfForName(const char *name, uint64 nMaskGen=0);
|
|
static CPShader *mfForName(const char *name, std::vector<SFXStruct>& Structs, std::vector<SPair>& Macros, char *entryFunc, EShaderVersion eSHV, uint64 nMaskGen=0);
|
|
#endif
|
|
static void mfClearAll();
|
|
static void mfReloadScript(const char *szPath, const char *szName, int nFlags, uint64 nMaskGen);
|
|
|
|
virtual void Release() = 0;
|
|
virtual void mfReload(int nFlags);
|
|
virtual void mfEnable() = 0;
|
|
virtual void mfDisable() = 0;
|
|
virtual int Size() = 0;
|
|
virtual bool mfCompile(char *scr) {return 0;}
|
|
virtual void mfReset() {}
|
|
virtual void mfPrecache() {}
|
|
virtual bool mfIsCombiner() = 0;
|
|
virtual bool mfSet(bool bStat, SShaderPassHW *slw=NULL, int nFlags=0) {return 0;}
|
|
virtual void mfSetVariables(bool bObj, TArray<SCGParam4f>* Vars) {}
|
|
virtual const char *mfGetCurScript() {return NULL;}
|
|
virtual void mfGatherFXParameters(const char *buf, SShaderPassHW *pSHPass, std::vector<SFXParam>& Params, std::vector<SFXSampler>& Samplers, std::vector<SFXTexture>& Textures, SShader *ef) = 0;
|
|
virtual void mfPostLoad() = 0;
|
|
};
|
|
|
|
_inline CPShader *PShaderForName(CPShader *&Store, const char *szName)
|
|
{
|
|
#ifndef NULL_RENDERER
|
|
if (!Store)
|
|
Store = CPShader::mfForName(szName);
|
|
assert(Store);
|
|
#endif
|
|
return Store;
|
|
}
|
|
|
|
_inline CVProgram *VShaderForName(CVProgram *&Store, const char *szName)
|
|
{
|
|
#ifndef NULL_RENDERER
|
|
if (!Store)
|
|
Store = CVProgram::mfForName(szName);
|
|
assert(Store);
|
|
#endif
|
|
return Store;
|
|
}
|
|
|
|
#define SHADER_BIND_SAMPLER 0x08000000
|
|
|
|
#define NUM_PPLIGHTS_PERPASS_PS30 4
|
|
#define NUM_PPLIGHTS_PERPASS_PS2X 3
|
|
|
|
//=============================================================================
|
|
|
|
struct SShaderCacheHeader
|
|
{
|
|
int m_SizeOf;
|
|
ushort m_MajorVer;
|
|
ushort m_MinorVer;
|
|
SShaderCacheHeader()
|
|
{
|
|
m_SizeOf = sizeof(SShaderCacheHeader);
|
|
}
|
|
};
|
|
|
|
struct SShaderCacheHeaderItem
|
|
{
|
|
int m_nMask;
|
|
int m_nVariables;
|
|
};
|
|
struct SShaderCacheHeaderItemVar
|
|
{
|
|
char m_Name[60];
|
|
short m_Reg;
|
|
short m_nCount;
|
|
};
|
|
|
|
struct SShaderCache
|
|
{
|
|
CName m_Name;
|
|
SShaderCacheHeader m_Header;
|
|
class CResFile *m_pRes;
|
|
SShaderCache()
|
|
{
|
|
m_pRes = NULL;
|
|
}
|
|
~SShaderCache();
|
|
};
|
|
|
|
_inline void SortLightTypes(int Types[4], int nCount)
|
|
{
|
|
switch(nCount)
|
|
{
|
|
case 2:
|
|
if (Types[0] > Types[1])
|
|
Exchange(Types[0], Types[1]);
|
|
break;
|
|
case 3:
|
|
if (Types[0] > Types[1])
|
|
Exchange(Types[0], Types[1]);
|
|
if (Types[0] > Types[2])
|
|
Exchange(Types[0], Types[2]);
|
|
if (Types[1] > Types[2])
|
|
Exchange(Types[1], Types[2]);
|
|
break;
|
|
case 4:
|
|
{
|
|
for (int i=0; i<4; i++)
|
|
{
|
|
for (int j=i; j<4; j++)
|
|
{
|
|
if (Types[i] > Types[j])
|
|
Exchange(Types[i], Types[j]);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
//=============================================================================
|
|
// Static and dynamic Parameters for RC, PS and VP/VS
|
|
|
|
enum EParamComp
|
|
{
|
|
EParamComp_Unknown,
|
|
EParamComp_LightMatrix,
|
|
EParamComp_ObjMatrix,
|
|
EParamComp_ObjScale,
|
|
EParamComp_User,
|
|
EParamComp_CameraMatrix,
|
|
EParamComp_PlantsTMoving,
|
|
EParamComp_FogMatrix,
|
|
EParamComp_VFogMatrix,
|
|
EParamComp_FogEnterMatrix,
|
|
EParamComp_EnvColor,
|
|
EParamComp_Matrix,
|
|
EParamComp_WaterProjMatrix,
|
|
EParamComp_WaterLevel,
|
|
EParamComp_TexProjMatrix,
|
|
EParamComp_BumpAmount,
|
|
EParamComp_GeomCenter,
|
|
EParamComp_Const,
|
|
EParamComp_Wave,
|
|
EParamComp_ObjWave,
|
|
EParamComp_LightIntens,
|
|
EParamComp_SunDirect,
|
|
EParamComp_SunFlarePos,
|
|
EParamComp_LightPos,
|
|
EParamComp_OSLightPos,
|
|
EParamComp_SLightPos,
|
|
EParamComp_FromRE,
|
|
EParamComp_REColor,
|
|
EParamComp_TempMatr,
|
|
EParamComp_VolFogColor,
|
|
EParamComp_VolFogDensity,
|
|
EParamComp_ObjRefrFactor,
|
|
EParamComp_FromObject,
|
|
EParamComp_ObjVal,
|
|
EParamComp_ObjColor,
|
|
EParamComp_Bending,
|
|
EParamComp_SunColor,
|
|
EParamComp_WorldColor,
|
|
EParamComp_LightDirectFactor,
|
|
EParamComp_LightBright,
|
|
EParamComp_LightColor,
|
|
EParamComp_DiffuseColor,
|
|
EParamComp_SpecularPower,
|
|
EParamComp_SpecLightColor,
|
|
EParamComp_AmbLightColor,
|
|
EParamComp_CameraAngle,
|
|
EParamComp_CameraPos,
|
|
EParamComp_ObjPos,
|
|
EParamComp_OSCameraPos,
|
|
EParamComp_SCameraPos,
|
|
EParamComp_ClipPlane,
|
|
EParamComp_Time,
|
|
EParamComp_Distance,
|
|
EParamComp_MinDistance,
|
|
EParamComp_MinLightDistance,
|
|
EParamComp_Random,
|
|
EParamComp_Fog,
|
|
EParamComp_HeatFactor,
|
|
EParamComp_Opacity,
|
|
EParamComp_MatrixTCG,
|
|
EParamComp_MatrixTCM,
|
|
EParamComp_FlashBangBrightness,
|
|
EParamComp_ScreenSize,
|
|
EParamComp_DofFocalParams,
|
|
EParamComp_LightOcclusion,
|
|
EParamComp_LightOcclusions,
|
|
|
|
EParamComp_LightsColor,
|
|
EParamComp_SpecLightsColor,
|
|
EParamComp_LightsIntens,
|
|
EParamComp_OSLightsPos,
|
|
EParamComp_LightsType,
|
|
EParamComp_LightsNum,
|
|
};
|
|
|
|
struct SParamComp
|
|
{
|
|
byte m_eType;
|
|
byte m_bDependsOnObject;
|
|
|
|
SParamComp()
|
|
{
|
|
m_eType = EParamComp_Unknown;
|
|
m_bDependsOnObject = 0;
|
|
}
|
|
virtual ~SParamComp() {}
|
|
virtual float mfGet() { return 0; }
|
|
virtual void mfGet4f(vec4_t v) {}
|
|
virtual bool mfIsEqual(SParamComp *p) = 0;
|
|
virtual void mfCopy(const SParamComp* pc) = 0;
|
|
virtual int Size() = 0;
|
|
|
|
static SParamComp *mfAdd(SParamComp *pPC);
|
|
|
|
static TArray<SParamComp *> m_ParamComps;
|
|
};
|
|
|
|
#ifdef WIN64
|
|
#pragma warning( push ) //AMD Port
|
|
#pragma warning( disable : 4267 )
|
|
#endif
|
|
|
|
struct SParamComp_User : public SParamComp
|
|
{
|
|
bool m_bTimeModulate;
|
|
CName m_Name;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(SParamComp_User);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_User()
|
|
{
|
|
m_eType = EParamComp_User;
|
|
m_bTimeModulate = false;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_User *src = (SParamComp_User *)p;
|
|
if (m_eType == src->m_eType && m_Name == src->m_Name && m_bTimeModulate == src->m_bTimeModulate)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_User *src = (SParamComp_User *)p;
|
|
m_eType = src->m_eType;
|
|
m_Name = src->m_Name;
|
|
m_bTimeModulate = src->m_bTimeModulate;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
#ifdef WIN64
|
|
#pragma warning( pop ) //AMD Port
|
|
#endif
|
|
|
|
|
|
struct SParamComp_FlashBangBrightness : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(SParamComp_FlashBangBrightness);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_FlashBangBrightness()
|
|
{
|
|
m_eType = EParamComp_FlashBangBrightness;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_FlashBangBrightness *src = (SParamComp_FlashBangBrightness *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_FlashBangBrightness *src = (SParamComp_FlashBangBrightness *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_ScreenSize : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
int m_Op; // 0(NoOp), 1(+), 2(*), 3(/), 4(-)
|
|
float m_Sign;
|
|
float m_Operand;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_ScreenSize()
|
|
{
|
|
m_eType = EParamComp_ScreenSize;
|
|
m_Op = 0;
|
|
m_Sign = 0;
|
|
m_Operand = 0;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ScreenSize *src = (SParamComp_ScreenSize *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_Op == src->m_Op && m_Sign == src->m_Sign && m_Operand == src->m_Operand)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ScreenSize *src = (SParamComp_ScreenSize *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Op = src->m_Op;
|
|
m_Sign = src->m_Sign;
|
|
m_Operand = src->m_Operand;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_DofFocalParams : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
int m_Op; // 0(NoOp), 1(+), 2(*), 3(/), 4(-)
|
|
float m_Sign;
|
|
float m_Operand;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_DofFocalParams()
|
|
{
|
|
m_eType = EParamComp_DofFocalParams;
|
|
m_Op = 0;
|
|
m_Sign = 0;
|
|
m_Operand = 0;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_DofFocalParams *src = (SParamComp_DofFocalParams *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_Op == src->m_Op && m_Sign == src->m_Sign && m_Operand == src->m_Operand)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_DofFocalParams *src = (SParamComp_DofFocalParams *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Op = src->m_Op;
|
|
m_Sign = src->m_Sign;
|
|
m_Operand = src->m_Operand;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_VFogMatrix : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(SParamComp_VFogMatrix);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_VFogMatrix()
|
|
{
|
|
m_eType = EParamComp_VFogMatrix;
|
|
}
|
|
virtual ~SParamComp_VFogMatrix()
|
|
{
|
|
}
|
|
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_VFogMatrix *src = (SParamComp_VFogMatrix *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_VFogMatrix *src = (SParamComp_VFogMatrix *)p;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_FogMatrix : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(SParamComp_FogMatrix);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_FogMatrix()
|
|
{
|
|
m_eType = EParamComp_FogMatrix;
|
|
}
|
|
virtual ~SParamComp_FogMatrix()
|
|
{
|
|
}
|
|
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_FogMatrix *src = (SParamComp_FogMatrix *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_FogMatrix *src = (SParamComp_FogMatrix *)p;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_FogEnterMatrix : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(SParamComp_FogEnterMatrix);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_FogEnterMatrix()
|
|
{
|
|
m_eType = EParamComp_FogEnterMatrix;
|
|
}
|
|
virtual ~SParamComp_FogEnterMatrix()
|
|
{
|
|
}
|
|
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_FogEnterMatrix *src = (SParamComp_FogEnterMatrix *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_FogEnterMatrix *src = (SParamComp_FogEnterMatrix *)p;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_EnvColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(SParamComp_EnvColor);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_EnvColor()
|
|
{
|
|
m_eType = EParamComp_EnvColor;
|
|
}
|
|
virtual ~SParamComp_EnvColor()
|
|
{
|
|
}
|
|
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_EnvColor *src = (SParamComp_EnvColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_EnvColor *src = (SParamComp_EnvColor *)p;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_Matrix : public SParamComp
|
|
{
|
|
static SShader *m_pLastShader;
|
|
static Matrix44 m_LastMatrix;
|
|
static int m_Frame;
|
|
int m_Offs;
|
|
TArray<SMatrixTransform> m_Transforms;
|
|
|
|
virtual int Size();
|
|
|
|
SParamComp_Matrix()
|
|
{
|
|
m_eType = EParamComp_Matrix;
|
|
}
|
|
virtual ~SParamComp_Matrix()
|
|
{
|
|
m_Transforms.Free();
|
|
}
|
|
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p);
|
|
//{
|
|
// SParamComp_Matrix *src = (SParamComp_Matrix *)p;
|
|
// m_eType = src->m_eType;
|
|
// m_Offs = src->m_Offs;
|
|
// m_Transforms.Copy(src->m_Transforms);
|
|
// m_bDependsOnObject = 1;
|
|
//}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_ObjScale : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_ObjScale()
|
|
{
|
|
m_eType = EParamComp_ObjScale;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ObjScale *src = (SParamComp_ObjScale *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ObjScale *src = (SParamComp_ObjScale *)p;
|
|
m_eType = src->m_eType;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_ObjMatrix : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_ObjMatrix()
|
|
{
|
|
m_eType = EParamComp_ObjMatrix;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ObjMatrix *src = (SParamComp_ObjMatrix *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ObjMatrix *src = (SParamComp_ObjMatrix *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_CameraMatrix : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_CameraMatrix()
|
|
{
|
|
m_eType = EParamComp_CameraMatrix;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_CameraMatrix *src = (SParamComp_CameraMatrix *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_CameraMatrix *src = (SParamComp_CameraMatrix *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_LightMatrix : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_LightMatrix()
|
|
{
|
|
m_eType = EParamComp_LightMatrix;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightMatrix *src = (SParamComp_LightMatrix *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightMatrix *src = (SParamComp_LightMatrix *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_WaterProjMatrix : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_WaterProjMatrix()
|
|
{
|
|
m_eType = EParamComp_WaterProjMatrix;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_WaterProjMatrix *src = (SParamComp_WaterProjMatrix *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_WaterProjMatrix *src = (SParamComp_WaterProjMatrix *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_TexProjMatrix : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
int m_Stage;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_TexProjMatrix()
|
|
{
|
|
m_eType = EParamComp_TexProjMatrix;
|
|
m_Stage = 0xf;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_TexProjMatrix *src = (SParamComp_TexProjMatrix *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_Stage == src->m_Stage)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_TexProjMatrix *src = (SParamComp_TexProjMatrix *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Stage = src->m_Stage;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_Const : public SParamComp
|
|
{
|
|
float m_Val;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_Const()
|
|
{
|
|
m_eType = EParamComp_Const;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_Const *src = (SParamComp_Const *)p;
|
|
if (m_eType == src->m_eType && m_Val == src->m_Val)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Const *src = (SParamComp_Const *)p;
|
|
m_eType = src->m_eType;
|
|
m_Val = src->m_Val;
|
|
}
|
|
virtual float mfGet() { return m_Val; }
|
|
};
|
|
|
|
struct SParamComp_Wave : public SParamComp
|
|
{
|
|
SWaveForm m_WF;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
|
|
SParamComp_Wave()
|
|
{
|
|
m_eType = EParamComp_Wave;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_Wave *src = (SParamComp_Wave *)p;
|
|
if (m_eType == src->m_eType && m_WF == src->m_WF)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Wave *src = (SParamComp_Wave *)p;
|
|
m_eType = src->m_eType;
|
|
m_WF = src->m_WF;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_ObjWave : public SParamComp
|
|
{
|
|
bool m_bObjX;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_ObjWave()
|
|
{
|
|
m_eType = EParamComp_ObjWave;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ObjWave *src = (SParamComp_ObjWave *)p;
|
|
if (m_eType == src->m_eType && m_bObjX == src->m_bObjX)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ObjWave *src = (SParamComp_ObjWave *)p;
|
|
m_eType = src->m_eType;
|
|
m_bObjX = src->m_bObjX;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_WaterLevel : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_WaterLevel()
|
|
{
|
|
m_eType = EParamComp_WaterLevel;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_WaterLevel *src = (SParamComp_WaterLevel *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_WaterLevel *src = (SParamComp_WaterLevel *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_SunDirect : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_SunDirect()
|
|
{
|
|
m_eType = EParamComp_SunDirect;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_SunDirect *src = (SParamComp_SunDirect *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_SunDirect *src = (SParamComp_SunDirect *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_SunFlarePos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_SunFlarePos()
|
|
{
|
|
m_eType = EParamComp_SunFlarePos;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_SunFlarePos *src = (SParamComp_SunFlarePos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_SunFlarePos *src = (SParamComp_SunFlarePos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_LightPos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightPos()
|
|
{
|
|
m_eType = EParamComp_LightPos;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightPos *src = (SParamComp_LightPos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightPos *src = (SParamComp_LightPos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_LightIntens : public SParamComp
|
|
{
|
|
bool m_bInv;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightIntens()
|
|
{
|
|
m_eType = EParamComp_LightIntens;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightIntens *src = (SParamComp_LightIntens *)p;
|
|
if (m_eType == src->m_eType && m_bInv == src->m_bInv)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightIntens *src = (SParamComp_LightIntens *)p;
|
|
m_eType = src->m_eType;
|
|
m_bInv = src->m_bInv;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
struct SParamComp_LightsIntens : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightsIntens()
|
|
{
|
|
m_eType = EParamComp_LightsIntens;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightsIntens *src = (SParamComp_LightsIntens *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightsIntens *src = (SParamComp_LightsIntens *)p;
|
|
m_eType = src->m_eType;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
|
|
struct SParamComp_LightBright : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightBright()
|
|
{
|
|
m_eType = EParamComp_LightBright;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightBright *src = (SParamComp_LightBright *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightBright *src = (SParamComp_LightBright *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_LightDirectFactor : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightDirectFactor()
|
|
{
|
|
m_eType = EParamComp_LightDirectFactor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightDirectFactor *src = (SParamComp_LightDirectFactor *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightDirectFactor *src = (SParamComp_LightDirectFactor *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_OSLightPos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_OSLightPos()
|
|
{
|
|
m_eType = EParamComp_OSLightPos;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_OSLightPos *src = (SParamComp_OSLightPos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_OSLightPos *src = (SParamComp_OSLightPos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
struct SParamComp_OSLightsPos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_OSLightsPos()
|
|
{
|
|
m_eType = EParamComp_OSLightsPos;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_OSLightsPos *src = (SParamComp_OSLightsPos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_OSLightsPos *src = (SParamComp_OSLightsPos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_LightsType : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightsType()
|
|
{
|
|
m_eType = EParamComp_LightsType;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightsType *src = (SParamComp_LightsType *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightsType *src = (SParamComp_LightsType *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
struct SParamComp_LightsNum : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightsNum()
|
|
{
|
|
m_eType = EParamComp_LightsNum;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightsNum *src = (SParamComp_LightsNum *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightsNum *src = (SParamComp_LightsNum *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet(void);
|
|
};
|
|
|
|
struct SParamComp_SLightPos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_SLightPos()
|
|
{
|
|
m_eType = EParamComp_SLightPos;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_SLightPos *src = (SParamComp_SLightPos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_SLightPos *src = (SParamComp_SLightPos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_SCameraPos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_SCameraPos()
|
|
{
|
|
m_eType = EParamComp_SCameraPos;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_SCameraPos *src = (SParamComp_SCameraPos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_SCameraPos *src = (SParamComp_SCameraPos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_LightOcclusion : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightOcclusion()
|
|
{
|
|
m_eType = EParamComp_LightOcclusion;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightOcclusion *src = (SParamComp_LightOcclusion *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightOcclusion *src = (SParamComp_LightOcclusion *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_LightOcclusions : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightOcclusions()
|
|
{
|
|
m_eType = EParamComp_LightOcclusions;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightOcclusions *src = (SParamComp_LightOcclusions *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightOcclusions *src = (SParamComp_LightOcclusions *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_VolFogColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_VolFogColor()
|
|
{
|
|
m_eType = EParamComp_VolFogColor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_VolFogColor *src = (SParamComp_VolFogColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_VolFogColor *src = (SParamComp_VolFogColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_VolFogDensity : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_VolFogDensity()
|
|
{
|
|
m_eType = EParamComp_VolFogDensity;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_VolFogDensity *src = (SParamComp_VolFogDensity *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_VolFogDensity *src = (SParamComp_VolFogDensity *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_FromRE : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_FromRE()
|
|
{
|
|
m_eType = EParamComp_FromRE;
|
|
m_Offs = -1;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_FromRE *src = (SParamComp_FromRE *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_FromRE *src = (SParamComp_FromRE *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_REColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_REColor()
|
|
{
|
|
m_eType = EParamComp_REColor;
|
|
m_Offs = -1;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_REColor *src = (SParamComp_REColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_REColor *src = (SParamComp_REColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_TempMatr : public SParamComp
|
|
{
|
|
int m_MatrID0;
|
|
int m_MatrID1;
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_TempMatr()
|
|
{
|
|
m_eType = EParamComp_TempMatr;
|
|
m_MatrID0 = 0;
|
|
m_MatrID1 = 0;
|
|
m_Offs = -1;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_TempMatr *src = (SParamComp_TempMatr *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_MatrID0 == src->m_MatrID0 && m_MatrID1 == src->m_MatrID1)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_TempMatr *src = (SParamComp_TempMatr *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_MatrID0 = src->m_MatrID0;
|
|
m_MatrID1 = src->m_MatrID1;
|
|
}
|
|
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_ObjRefrFactor : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_ObjRefrFactor()
|
|
{
|
|
m_eType = EParamComp_ObjRefrFactor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ObjRefrFactor *src = (SParamComp_ObjRefrFactor *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ObjRefrFactor *src = (SParamComp_ObjRefrFactor *)p;
|
|
m_eType = src->m_eType;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_FromObject : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_FromObject()
|
|
{
|
|
m_eType = EParamComp_FromObject;
|
|
m_Offs = 0;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_FromObject *src = (SParamComp_FromObject *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_FromObject *src = (SParamComp_FromObject *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_WorldColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_WorldColor()
|
|
{
|
|
m_eType = EParamComp_WorldColor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_WorldColor *src = (SParamComp_WorldColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_WorldColor *src = (SParamComp_WorldColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_SunColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
float m_Mult;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_SunColor()
|
|
{
|
|
m_eType = EParamComp_SunColor;
|
|
m_Mult = 1.0f;
|
|
m_Offs = 0;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_SunColor *src = (SParamComp_SunColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_Mult == src->m_Mult)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_SunColor *src = (SParamComp_SunColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Mult = src->m_Mult;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
|
|
struct SParamComp_ObjVal : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_ObjVal()
|
|
{
|
|
m_eType = EParamComp_ObjVal;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ObjVal *src = (SParamComp_ObjVal *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ObjVal *src = (SParamComp_ObjVal *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_GeomCenter : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_GeomCenter()
|
|
{
|
|
m_eType = EParamComp_GeomCenter;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_GeomCenter *src = (SParamComp_GeomCenter *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_GeomCenter *src = (SParamComp_GeomCenter *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_Bending : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_Bending()
|
|
{
|
|
m_eType = EParamComp_Bending;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_Bending *src = (SParamComp_Bending *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Bending *src = (SParamComp_Bending *)p;
|
|
m_eType = src->m_eType;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_ObjColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_ObjColor()
|
|
{
|
|
m_eType = EParamComp_ObjColor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ObjColor *src = (SParamComp_ObjColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ObjColor *src = (SParamComp_ObjColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_LightColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightColor()
|
|
{
|
|
m_eType = EParamComp_LightColor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightColor *src = (SParamComp_LightColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightColor *src = (SParamComp_LightColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_LightsColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_LightsColor()
|
|
{
|
|
m_eType = EParamComp_LightsColor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_LightsColor *src = (SParamComp_LightsColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_LightsColor *src = (SParamComp_LightsColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_DiffuseColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_DiffuseColor()
|
|
{
|
|
m_eType = EParamComp_DiffuseColor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_DiffuseColor *src = (SParamComp_DiffuseColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_DiffuseColor *src = (SParamComp_DiffuseColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_SpecularPower : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_SpecularPower()
|
|
{
|
|
m_eType = EParamComp_SpecularPower;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_SpecularPower *src = (SParamComp_SpecularPower *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_SpecularPower *src = (SParamComp_SpecularPower *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_SpecLightColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_SpecLightColor()
|
|
{
|
|
m_eType = EParamComp_SpecLightColor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_SpecLightColor *src = (SParamComp_SpecLightColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_SpecLightColor *src = (SParamComp_SpecLightColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
struct SParamComp_SpecLightsColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_SpecLightsColor()
|
|
{
|
|
m_eType = EParamComp_SpecLightsColor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_SpecLightsColor *src = (SParamComp_SpecLightsColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_SpecLightsColor *src = (SParamComp_SpecLightsColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_AmbLightColor : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
float m_fMul;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_AmbLightColor()
|
|
{
|
|
m_eType = EParamComp_AmbLightColor;
|
|
m_fMul = 1.0f;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_AmbLightColor *src = (SParamComp_AmbLightColor *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_fMul == src->m_fMul)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_AmbLightColor *src = (SParamComp_AmbLightColor *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_fMul = src->m_fMul;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_BumpAmount : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_BumpAmount()
|
|
{
|
|
m_eType = EParamComp_BumpAmount;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_BumpAmount *src = (SParamComp_BumpAmount *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_BumpAmount *src = (SParamComp_BumpAmount *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_Fog : public SParamComp
|
|
{
|
|
int m_Type;
|
|
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_Fog()
|
|
{
|
|
m_eType = EParamComp_Fog;
|
|
m_Type = -1;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_Fog *src = (SParamComp_Fog *)p;
|
|
if (m_eType == src->m_eType && m_Type == src->m_Type)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Fog *src = (SParamComp_Fog *)p;
|
|
m_eType = src->m_eType;
|
|
m_Type = src->m_Type;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_PlantsTMoving : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
static Matrix44 m_Matrix;
|
|
static float m_LastAX;
|
|
static float m_LastAY;
|
|
SWaveForm m_WFX;
|
|
SWaveForm m_WFY;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_PlantsTMoving()
|
|
{
|
|
m_eType = EParamComp_PlantsTMoving;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_PlantsTMoving *src = (SParamComp_PlantsTMoving *)p;
|
|
if (m_eType == src->m_eType && m_WFX == src->m_WFX && m_WFY == src->m_WFY && m_Offs == src->m_Offs)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_PlantsTMoving *src = (SParamComp_PlantsTMoving *)p;
|
|
m_eType = src->m_eType;
|
|
m_WFX = src->m_WFX;
|
|
m_WFY = src->m_WFY;
|
|
m_Offs = src->m_Offs;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_CameraAngle : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
int m_Op; // 0(NoOp), 1(+), 2(*), 3(/), 4(-)
|
|
float m_Sign;
|
|
float m_Operand;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_CameraAngle()
|
|
{
|
|
m_eType = EParamComp_CameraAngle;
|
|
m_Op = 0;
|
|
m_Sign = 0;
|
|
m_Operand = 0;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_CameraAngle *src = (SParamComp_CameraAngle *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_Op == src->m_Op && m_Sign == src->m_Sign && m_Operand == src->m_Operand)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_CameraAngle *src = (SParamComp_CameraAngle *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Op = src->m_Op;
|
|
m_Sign = src->m_Sign;
|
|
m_Operand = src->m_Operand;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_CameraPos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
int m_Op; // 0(NoOp), 1(+), 2(*), 3(/), 4(-)
|
|
float m_Sign;
|
|
float m_Operand;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_CameraPos()
|
|
{
|
|
m_eType = EParamComp_CameraPos;
|
|
m_Op = 0;
|
|
m_Sign = 1.0f;
|
|
m_Operand = 0;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_CameraPos *src = (SParamComp_CameraPos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_Op == src->m_Op && m_Sign == src->m_Sign && m_Operand == src->m_Operand)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_CameraPos *src = (SParamComp_CameraPos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Op = src->m_Op;
|
|
m_Sign = src->m_Sign;
|
|
m_Operand = src->m_Operand;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_ObjPos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
int m_Op; // 0(NoOp), 1(+), 2(*), 3(/), 4(-)
|
|
float m_Sign;
|
|
float m_Operand;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_ObjPos()
|
|
{
|
|
m_eType = EParamComp_ObjPos;
|
|
m_Op = 0;
|
|
m_Sign = 0;
|
|
m_Operand = 0;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ObjPos *src = (SParamComp_ObjPos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_Op == src->m_Op && m_Sign == src->m_Sign && m_Operand == src->m_Operand)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ObjPos *src = (SParamComp_ObjPos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Op = src->m_Op;
|
|
m_Sign = src->m_Sign;
|
|
m_Operand = src->m_Operand;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_OSCameraPos : public SParamComp
|
|
{
|
|
int m_Offs;
|
|
int m_Op; // 0(NoOp), 1(+), 2(*), 3(/), 4(-)
|
|
float m_Sign;
|
|
float m_Operand;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_OSCameraPos()
|
|
{
|
|
m_eType = EParamComp_OSCameraPos;
|
|
m_Op = 0;
|
|
m_Sign = 1.0f;
|
|
m_Operand = 0;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_OSCameraPos *src = (SParamComp_OSCameraPos *)p;
|
|
if (m_eType == src->m_eType && m_Offs == src->m_Offs && m_Op == src->m_Op && m_Sign == src->m_Sign && m_Operand == src->m_Operand)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_OSCameraPos *src = (SParamComp_OSCameraPos *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Op = src->m_Op;
|
|
m_Sign = src->m_Sign;
|
|
m_Operand = src->m_Operand;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_ClipPlane : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_ClipPlane()
|
|
{
|
|
m_eType = EParamComp_ClipPlane;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_ClipPlane *src = (SParamComp_ClipPlane *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_ClipPlane *src = (SParamComp_ClipPlane *)p;
|
|
m_eType = src->m_eType;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_MatrixTCG : public SParamComp
|
|
{
|
|
int m_Stage;
|
|
int m_Row;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_MatrixTCG()
|
|
{
|
|
m_eType = EParamComp_MatrixTCG;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_MatrixTCG *src = (SParamComp_MatrixTCG *)p;
|
|
if (m_eType == src->m_eType && m_Stage == src->m_Stage && m_Row == src->m_Row)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_MatrixTCG *src = (SParamComp_MatrixTCG *)p;
|
|
m_eType = src->m_eType;
|
|
m_Stage = src->m_Stage;
|
|
m_Row = src->m_Row;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_MatrixTCM : public SParamComp
|
|
{
|
|
int m_Stage;
|
|
int m_Row;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_MatrixTCM()
|
|
{
|
|
m_eType = EParamComp_MatrixTCM;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_MatrixTCM *src = (SParamComp_MatrixTCM *)p;
|
|
if (m_eType == src->m_eType && m_Stage == src->m_Stage && m_Row == src->m_Row)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_MatrixTCM *src = (SParamComp_MatrixTCM *)p;
|
|
m_eType = src->m_eType;
|
|
m_Stage = src->m_Stage;
|
|
m_Row = src->m_Row;
|
|
m_bDependsOnObject = 0;
|
|
}
|
|
virtual void mfGet4f(vec4_t v);
|
|
};
|
|
|
|
struct SParamComp_Time : public SParamComp
|
|
{
|
|
float m_Scale;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_Time()
|
|
{
|
|
m_eType = EParamComp_Time;
|
|
m_Scale = 1.0f;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_Time *src = (SParamComp_Time *)p;
|
|
if (m_eType == src->m_eType && m_Scale == src->m_Scale)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Time *src = (SParamComp_Time *)p;
|
|
m_eType = src->m_eType;
|
|
m_Scale = src->m_Scale;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_Distance : public SParamComp
|
|
{
|
|
float m_Scale;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_Distance()
|
|
{
|
|
m_eType = EParamComp_Distance;
|
|
m_Scale = 1.0f;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_Distance *src = (SParamComp_Distance *)p;
|
|
if (m_eType == src->m_eType && m_Scale == src->m_Scale)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Distance *src = (SParamComp_Distance *)p;
|
|
m_eType = src->m_eType;
|
|
m_Scale = src->m_Scale;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_MinDistance : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_MinDistance()
|
|
{
|
|
m_eType = EParamComp_MinDistance;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_MinDistance *src = (SParamComp_MinDistance *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_MinDistance *src = (SParamComp_MinDistance *)p;
|
|
m_eType = src->m_eType;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
struct SParamComp_MinLightDistance : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_MinLightDistance()
|
|
{
|
|
m_eType = EParamComp_MinLightDistance;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_MinLightDistance *src = (SParamComp_MinLightDistance *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_MinLightDistance *src = (SParamComp_MinLightDistance *)p;
|
|
m_eType = src->m_eType;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
|
|
struct SParamComp_Random : public SParamComp
|
|
{
|
|
float m_Scale;
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_Random()
|
|
{
|
|
m_eType = EParamComp_Random;
|
|
m_Scale = 1.0f;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_Random *src = (SParamComp_Random *)p;
|
|
if (m_eType == src->m_eType && m_Scale == src->m_Scale)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Random *src = (SParamComp_Random *)p;
|
|
m_eType = src->m_eType;
|
|
m_Scale = src->m_Scale;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_HeatFactor : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_HeatFactor()
|
|
{
|
|
m_eType = EParamComp_HeatFactor;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_HeatFactor *src = (SParamComp_HeatFactor *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_HeatFactor *src = (SParamComp_HeatFactor *)p;
|
|
m_eType = src->m_eType;
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
struct SParamComp_Opacity : public SParamComp
|
|
{
|
|
virtual int Size()
|
|
{
|
|
int nSize = sizeof(*this);
|
|
return nSize;
|
|
}
|
|
SParamComp_Opacity()
|
|
{
|
|
m_eType = EParamComp_Opacity;
|
|
}
|
|
virtual bool mfIsEqual(SParamComp *p)
|
|
{
|
|
SParamComp_Opacity *src = (SParamComp_Opacity *)p;
|
|
if (m_eType == src->m_eType)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Opacity *src = (SParamComp_Opacity *)p;
|
|
m_eType = src->m_eType;
|
|
}
|
|
virtual float mfGet();
|
|
};
|
|
|
|
#define PF_CGTYPE 1
|
|
#define PF_CANMERGED 2
|
|
#define PF_DONTALLOW_DYNMERGE 4
|
|
#define PF_INTEGER 8
|
|
|
|
struct SParam
|
|
{
|
|
static vec4_t m_sFVals;
|
|
unsigned int m_Flags;
|
|
unsigned int m_Reg;
|
|
SParamComp *m_Comps[4];
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SParam);
|
|
return nSize;
|
|
}
|
|
SParam& operator = (const SParam& sl)
|
|
{
|
|
int i;
|
|
|
|
m_Reg = sl.m_Reg;
|
|
for (i=0; i<4; i++)
|
|
{
|
|
m_Comps[i] = sl.m_Comps[i];
|
|
}
|
|
m_Flags = sl.m_Flags;
|
|
return *this;
|
|
}
|
|
|
|
SParam()
|
|
{
|
|
m_Flags = 0;
|
|
m_Reg = 0;
|
|
m_Comps[0] = m_Comps[1] = m_Comps[2] = m_Comps[3] = NULL;
|
|
}
|
|
float *mfGet()
|
|
{
|
|
if (m_Flags & PF_CANMERGED)
|
|
{
|
|
m_Comps[0]->mfGet4f(m_sFVals);
|
|
}
|
|
else
|
|
{
|
|
for (int i=0; i<4; i++)
|
|
{
|
|
if (m_Comps[i])
|
|
m_sFVals[i] = m_Comps[i]->mfGet();
|
|
else
|
|
m_sFVals[i] = 0;
|
|
}
|
|
}
|
|
return m_sFVals;
|
|
}
|
|
bool mfIsValid()
|
|
{
|
|
if (m_Comps[0] || m_Comps[1] || m_Comps[2] || m_Comps[3])
|
|
return true;
|
|
return false;
|
|
}
|
|
void mfOptimize()
|
|
{
|
|
if ((m_Comps[0] && m_Comps[0]->m_eType == EParamComp_ObjWave) ||
|
|
(m_Comps[1] && m_Comps[1]->m_eType == EParamComp_ObjWave) ||
|
|
(m_Comps[2] && m_Comps[2]->m_eType == EParamComp_ObjWave) ||
|
|
(m_Comps[3] && m_Comps[3]->m_eType == EParamComp_ObjWave))
|
|
{
|
|
m_Flags |= PF_DONTALLOW_DYNMERGE;
|
|
}
|
|
else
|
|
if ((m_Comps[0] && m_Comps[0]->m_eType == EParamComp_PlantsTMoving) ||
|
|
(m_Comps[1] && m_Comps[1]->m_eType == EParamComp_PlantsTMoving) ||
|
|
(m_Comps[2] && m_Comps[2]->m_eType == EParamComp_PlantsTMoving) ||
|
|
(m_Comps[3] && m_Comps[3]->m_eType == EParamComp_PlantsTMoving))
|
|
{
|
|
m_Flags |= PF_DONTALLOW_DYNMERGE;
|
|
}
|
|
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_WorldColor &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_WorldColor &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_WorldColor &&
|
|
(!m_Comps[3] || m_Comps[3]->m_eType == EParamComp_Opacity))
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_LightColor &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_LightColor &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_LightColor &&
|
|
(!m_Comps[3] || m_Comps[3]->m_eType == EParamComp_Opacity))
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_DiffuseColor &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_DiffuseColor &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_DiffuseColor &&
|
|
(!m_Comps[3] || m_Comps[3]->m_eType == EParamComp_Opacity))
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_SpecLightColor &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_SpecLightColor &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_SpecLightColor &&
|
|
(!m_Comps[3] || m_Comps[3]->m_eType == EParamComp_Opacity))
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_SunColor &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_SunColor &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_SunColor &&
|
|
!m_Comps[3])
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_AmbLightColor &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_AmbLightColor &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_AmbLightColor &&
|
|
m_Comps[3] && m_Comps[3]->m_eType == EParamComp_Opacity)
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_ObjWave &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_ObjWave &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_Bending)
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_PlantsTMoving &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_PlantsTMoving &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_PlantsTMoving &&
|
|
m_Comps[3] && m_Comps[3]->m_eType == EParamComp_PlantsTMoving)
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_OSLightPos &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_OSLightPos &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_OSLightPos)
|
|
{
|
|
if (!m_Comps[3] || m_Comps[3]->m_eType == EParamComp_OSLightPos || (m_Comps[3]->m_eType == EParamComp_Const && m_Comps[3]->mfGet() == 1.0f))
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_SLightPos &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_SLightPos &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_SLightPos &&
|
|
m_Comps[3] && m_Comps[3]->m_eType == EParamComp_MinLightDistance)
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_LightOcclusion &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_LightOcclusion &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_LightOcclusion &&
|
|
m_Comps[3] && m_Comps[3]->m_eType == EParamComp_LightOcclusion)
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_OSCameraPos &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_OSCameraPos &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_OSCameraPos)
|
|
{
|
|
if (!m_Comps[3] || m_Comps[3]->m_eType == EParamComp_OSCameraPos || (m_Comps[3]->m_eType == EParamComp_Const && m_Comps[3]->mfGet() == 1.0f))
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_SCameraPos &&
|
|
m_Comps[1] && m_Comps[1]->m_eType == EParamComp_SCameraPos &&
|
|
m_Comps[2] && m_Comps[2]->m_eType == EParamComp_SCameraPos &&
|
|
m_Comps[3] && m_Comps[3]->m_eType == EParamComp_MinDistance)
|
|
{
|
|
m_Flags |= PF_CANMERGED;
|
|
return;
|
|
}
|
|
|
|
if (m_Comps[0] && m_Comps[0]->m_eType == EParamComp_LightIntens)
|
|
{
|
|
SParamComp_LightIntens *pcLS = (SParamComp_LightIntens *)m_Comps[0];
|
|
if (!pcLS->m_bInv)
|
|
{
|
|
if (m_Comps[1] && m_Comps[1]->m_eType == EParamComp_LightIntens)
|
|
{
|
|
pcLS = (SParamComp_LightIntens *)m_Comps[1];
|
|
if (pcLS->m_bInv)
|
|
{
|
|
if (m_Comps[2] && m_Comps[2]->m_eType == EParamComp_Const)
|
|
{
|
|
SParamComp_Const *pcCS = (SParamComp_Const *)m_Comps[2];
|
|
if (pcCS->m_Val == 0.5f)
|
|
{
|
|
bool bMerge = false;
|
|
if (!m_Comps[3])
|
|
bMerge = true;
|
|
else
|
|
if (m_Comps[3]->m_eType == EParamComp_Const)
|
|
{
|
|
SParamComp_Const *pcCS = (SParamComp_Const *)m_Comps[3];
|
|
if (pcCS->m_Val == 0)
|
|
bMerge = true;
|
|
}
|
|
if (bMerge)
|
|
m_Flags |= PF_CANMERGED;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
enum ECGParam
|
|
{
|
|
ECGP_Unknown,
|
|
ECGP_Float4,
|
|
ECGP_Matr_World,
|
|
ECGP_Matr_ViewProj,
|
|
ECGP_Matr_View,
|
|
ECGP_Matr_View_I,
|
|
ECGP_Matr_View_T,
|
|
ECGP_Matr_View_IT,
|
|
ECGP_Matr_Obj,
|
|
ECGP_Matr_Obj_I,
|
|
ECGP_Matr_Obj_T,
|
|
ECGP_Matr_Obj_IT,
|
|
};
|
|
|
|
struct SCGBind
|
|
{
|
|
CName m_Name;
|
|
int m_dwBind;
|
|
int m_dwFrameCreated;
|
|
short m_nComponents;
|
|
short m_nBindComponents;
|
|
SCGBind *m_pNext;
|
|
SCGBind()
|
|
{
|
|
m_nComponents = 1;
|
|
m_nBindComponents = 1;
|
|
m_pNext = NULL;
|
|
m_dwBind = 0;
|
|
m_dwFrameCreated = 0;
|
|
}
|
|
};
|
|
|
|
struct SCGBindConst : SCGBind
|
|
{
|
|
float m_Val[4];
|
|
};
|
|
|
|
struct SCGParam : SCGBind
|
|
{
|
|
ECGParam m_eCGParamType;
|
|
SCGParam()
|
|
{
|
|
m_eCGParamType = ECGP_Unknown;
|
|
}
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SCGParam);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
struct SCGParam4f : public SParam, SCGParam
|
|
{
|
|
SCGParam4f()
|
|
{
|
|
m_Flags = PF_CGTYPE;
|
|
}
|
|
};
|
|
|
|
struct SCGMatrix : SCGParam
|
|
{
|
|
};
|
|
|
|
//=========================================================================
|
|
// HW matrix transformation types
|
|
struct SMatrixTransform
|
|
{
|
|
SParam m_Params[4];
|
|
int m_Matrix;
|
|
int m_Offs;
|
|
int m_Stage;
|
|
|
|
virtual void mfSet(bool bSet) {};
|
|
virtual void mfSet(Matrix44& matr) {};
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SMatrixTransform);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
struct SMatrixTransform_Identity : public SMatrixTransform
|
|
{
|
|
virtual void mfSet(bool bSet);
|
|
virtual void mfSet(Matrix44& matr);
|
|
};
|
|
|
|
struct SMatrixTransform_Scale : public SMatrixTransform
|
|
{
|
|
virtual void mfSet(bool bSet);
|
|
virtual void mfSet(Matrix44& matr);
|
|
};
|
|
|
|
struct SMatrixTransform_Translate : public SMatrixTransform
|
|
{
|
|
virtual void mfSet(bool bSet);
|
|
virtual void mfSet(Matrix44& matr);
|
|
};
|
|
|
|
struct SMatrixTransform_Matrix : public SMatrixTransform
|
|
{
|
|
virtual void mfSet(bool bSet);
|
|
virtual void mfSet(Matrix44& matr);
|
|
};
|
|
|
|
struct SMatrixTransform_LightCMProject : public SMatrixTransform
|
|
{
|
|
virtual void mfSet(bool bSet);
|
|
virtual void mfSet(Matrix44& matr);
|
|
};
|
|
|
|
struct SMatrixTransform_Rotate : public SMatrixTransform
|
|
{
|
|
virtual void mfSet(bool bSet);
|
|
virtual void mfSet(Matrix44& matr);
|
|
};
|
|
|
|
|
|
//=========================================================================
|
|
// Dynamic lights evaluating via shaders
|
|
|
|
enum ELightStyle
|
|
{
|
|
eLS_Intensity,
|
|
eLS_RGB,
|
|
};
|
|
|
|
enum ELightMoveType
|
|
{
|
|
eLMT_Wave,
|
|
eLMT_Patch,
|
|
};
|
|
|
|
struct SLightMove
|
|
{
|
|
ELightMoveType m_eLMType;
|
|
SWaveForm m_Wave;
|
|
Vec3d m_Dir;
|
|
float m_fSpeed;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SLightMove);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
//
|
|
struct SLightEval
|
|
{
|
|
SLightEval()
|
|
{
|
|
memset(this, 0, sizeof(SLightEval));
|
|
}
|
|
|
|
SLightMove *m_LightMove;
|
|
ELightStyle m_EStyleType;
|
|
int m_LightStyle;
|
|
SParam m_ProjRotate;
|
|
Vec3d m_LightRotate;
|
|
Vec3d m_LightOffset;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SLightEval);
|
|
if (m_LightMove)
|
|
nSize += m_LightMove->Size();
|
|
|
|
return nSize;
|
|
}
|
|
~SLightEval()
|
|
{
|
|
SAFE_DELETE(m_LightMove);
|
|
}
|
|
};
|
|
|
|
class CLightStyle
|
|
{
|
|
public:
|
|
TArray<CFColor> m_Map;
|
|
float m_TimeIncr;
|
|
CFColor m_Color;
|
|
float m_fIntensity;
|
|
float m_LastTime;
|
|
|
|
static TArray <CLightStyle *> m_LStyles;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(CLightStyle);
|
|
nSize += m_Map.GetSize() * sizeof(CFColor);
|
|
return nSize;
|
|
}
|
|
|
|
CLightStyle()
|
|
{
|
|
m_LastTime = 0;
|
|
m_fIntensity = 1.0f;
|
|
m_Color = Col_White;
|
|
m_TimeIncr = 60.0f;
|
|
}
|
|
static _inline CLightStyle *mfGetStyle(int nStyle, float fTime)
|
|
{
|
|
if (nStyle >= m_LStyles.Num() || !m_LStyles[nStyle])
|
|
return NULL;
|
|
m_LStyles[nStyle]->mfUpdate(fTime);
|
|
return m_LStyles[nStyle];
|
|
}
|
|
_inline void mfUpdate(float fTime)
|
|
{
|
|
float m = fTime * m_TimeIncr;
|
|
if (m != m_LastTime)
|
|
{
|
|
m_LastTime = m;
|
|
if (m_Map.Num())
|
|
{
|
|
if (m_Map.Num() == 1)
|
|
{
|
|
m_Color = m_Map[0];
|
|
}
|
|
else
|
|
{
|
|
int first = (int)QInt(m);
|
|
int second = (first + 1);
|
|
CFColor A = m_Map[first % m_Map.Num()];
|
|
CFColor B = m_Map[second % m_Map.Num()];
|
|
float fLerp = m-(float)first;
|
|
m_Color = LERP(A, B, fLerp);
|
|
}
|
|
m_fIntensity = (m_Color.r * 0.3f) + (m_Color.g * 0.59f) + (m_Color.b * 0.11f);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
#ifndef GL_BYTE
|
|
|
|
#define GL_BYTE 0x1400
|
|
#define GL_UNSIGNED_BYTE 0x1401
|
|
#define GL_SHORT 0x1402
|
|
#define GL_UNSIGNED_SHORT 0x1403
|
|
#define GL_INT 0x1404
|
|
#define GL_UNSIGNED_INT 0x1405
|
|
#define GL_FLOAT 0x1406
|
|
#define GL_2_BYTES 0x1407
|
|
#define GL_3_BYTES 0x1408
|
|
#define GL_4_BYTES 0x1409
|
|
#define GL_DOUBLE 0x140A
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define PFE_POINTER_VERT 1
|
|
#define PFE_POINTER_NORMAL 2
|
|
#define PFE_POINTER_COLOR 4
|
|
#define PFE_POINTER_SECCOLOR 8
|
|
#define PFE_POINTER_FOGCOORD 0x10
|
|
#define PFE_POINTER_TEX0 0x20
|
|
|
|
struct SArrayPointer
|
|
{
|
|
static int m_CurEnabled;
|
|
static int m_LastEnabled;
|
|
static int m_CurEnabledPass;
|
|
static int m_LastEnabledPass;
|
|
|
|
ESrcPointer ePT; // Current source (data place)
|
|
EDstPointer eDst; // Destination target
|
|
int Stage;
|
|
int Type;
|
|
int NumComponents;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SArrayPointer);
|
|
return nSize;
|
|
}
|
|
|
|
SArrayPointer()
|
|
{
|
|
ePT = eSrcPointer_Unknown;
|
|
Type = 0;
|
|
Stage = 0;
|
|
NumComponents = 0;
|
|
}
|
|
bool operator == (SArrayPointer p)
|
|
{
|
|
if (ePT==p.ePT && Stage==p.Stage && Type==p.Type && NumComponents==p.NumComponents)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
virtual void mfSet(int Id) {}
|
|
virtual bool mfCompile(char *scr, SShader *ef) {return false;}
|
|
virtual const char *mfGetName() {return NULL;}
|
|
|
|
static TArray<SArrayPointer *> m_Arrays;
|
|
static SArrayPointer *AddNew(SArrayPointer& New);
|
|
};
|
|
|
|
struct SArrayPointer_Vertex : public SArrayPointer
|
|
{
|
|
static void *m_pLastPointer;
|
|
static int m_nFrameCreateBuf;
|
|
virtual void mfSet(int Id);
|
|
virtual bool mfCompile(char *scr, SShader *ef);
|
|
};
|
|
|
|
struct SArrayPointer_Normal : public SArrayPointer
|
|
{
|
|
static void *m_pLastPointer;
|
|
static int m_nFrameCreateBuf;
|
|
SArrayPointer_Normal()
|
|
{
|
|
ePT = eSrcPointer_Normal;
|
|
eDst = eDstPointer_Normal;
|
|
NumComponents = 3;
|
|
Type = GL_FLOAT;
|
|
}
|
|
virtual void mfSet(int Id);
|
|
virtual bool mfCompile(char *scr, SShader *ef);
|
|
};
|
|
|
|
struct SArrayPointer_Texture : public SArrayPointer
|
|
{
|
|
static void *m_pLastPointer[8];
|
|
static int m_nFrameCreateBuf[8];
|
|
virtual void mfSet(int Id);
|
|
virtual bool mfCompile(char *scr, SShader *ef);
|
|
};
|
|
|
|
struct SArrayPointer_Color : public SArrayPointer
|
|
{
|
|
static void *m_pLastPointer;
|
|
static int m_nFrameCreateBuf;
|
|
virtual void mfSet(int Id);
|
|
virtual bool mfCompile(char *scr, SShader *ef);
|
|
};
|
|
|
|
struct SArrayPointer_SecColor : public SArrayPointer_Color
|
|
{
|
|
static void *m_pLastPointer;
|
|
static int m_nFrameCreateBuf;
|
|
virtual void mfSet(int Id);
|
|
virtual bool mfCompile(char *scr, SShader *ef);
|
|
};
|
|
|
|
//================================================================
|
|
// Deformations / Morphing
|
|
enum EDeformType
|
|
{
|
|
eDT_Unknown,
|
|
eDT_Wave,
|
|
eDT_VerticalWave,
|
|
eDT_Bulge,
|
|
eDT_Squeeze,
|
|
eDT_FromCenter,
|
|
eDT_Flare,
|
|
eDT_Beam,
|
|
};
|
|
|
|
// Deformation stage definition
|
|
struct SDeform
|
|
{
|
|
EDeformType m_eType;
|
|
SWaveForm m_DeformGen;
|
|
float m_ScaleVerts;
|
|
float m_fFlareSize;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SDeform);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
|
|
//=========================================================================
|
|
// HW Shader Layer
|
|
|
|
struct ICVar;
|
|
|
|
#define SHPF_TANGENTS 1
|
|
#define SHPF_LMTC 2
|
|
#define SHPF_NORMALS 4
|
|
#define SHPF_AMBIENT 8
|
|
#define SHPF_HASLM 16
|
|
#define SHPF_SHADOW 32
|
|
#define SHPF_RADIOSITY 64
|
|
#define SHPF_ALLOW_SPECANTIALIAS 128
|
|
#define SHPF_BUMP 256
|
|
#define SHPF_USEDSECONDRS 512
|
|
|
|
struct CVarCond
|
|
{
|
|
ICVar *m_Var;
|
|
float m_Val;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(CVarCond);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
// General Shader Pass definitions (include Texture layers for Multitexturing)
|
|
struct SShaderPass
|
|
{
|
|
TArray <SShaderTexUnit> m_TUnits; // List of texture units
|
|
|
|
uint m_RenderState; // Render state flags
|
|
uint m_SecondRenderState; // Render state flags for all subsequent passes
|
|
|
|
SWaveForm *m_WaveEvalRGB; // Wave form definition for RGB evaluation (usually software evaluations)
|
|
SRGBGenNoise *m_RGBNoise; // Noise parameters definition for RGB evaluation
|
|
SParam *m_RGBComps; // Components declarations for RGB evaluation
|
|
|
|
EEvalRGB m_eEvalRGB; // Type of RGB evaluation
|
|
|
|
SWaveForm *m_WaveEvalAlpha; // Wave form definition for Alpha evaluation (usually software evaluations)
|
|
SAlphaGenNoise *m_ANoise; // Noise parameters definition for Alpha evaluation
|
|
EEvalAlpha m_eEvalAlpha; // Type of Alpha evaluation
|
|
|
|
UCol m_FixedColor; // Constant RGBA values
|
|
ushort m_Flags; // Different usefull Pass flags (SHPF_)
|
|
byte m_Style; // Light style Id for RGBA animating using LightStyle tables
|
|
|
|
//=====================================================
|
|
|
|
SShaderPass()
|
|
{
|
|
m_RenderState = GS_DEPTHWRITE;
|
|
m_SecondRenderState = GS_BLSRC_ONE | GS_BLDST_ONE;
|
|
|
|
m_WaveEvalRGB = NULL;
|
|
m_RGBNoise = NULL;
|
|
m_RGBComps = NULL;
|
|
m_eEvalRGB = eERGB_NoFill;
|
|
|
|
m_WaveEvalAlpha = NULL;
|
|
m_ANoise = NULL;
|
|
m_eEvalAlpha = eEALPHA_NoFill;
|
|
m_FixedColor.dcolor = -1;
|
|
m_Flags = 0;
|
|
m_Style = 0;
|
|
}
|
|
|
|
int Size()
|
|
{
|
|
int i;
|
|
int nSize = sizeof(SShaderPass);
|
|
for (i=0; i<m_TUnits.Num(); i++)
|
|
{
|
|
nSize += m_TUnits[i].Size();
|
|
}
|
|
if (m_WaveEvalRGB)
|
|
nSize += m_WaveEvalRGB->Size();
|
|
if (m_WaveEvalAlpha)
|
|
nSize += m_WaveEvalAlpha->Size();
|
|
if (m_RGBComps)
|
|
nSize += m_RGBComps->Size();
|
|
if (m_RGBNoise)
|
|
nSize += m_RGBNoise->Size();
|
|
if (m_ANoise)
|
|
nSize += m_ANoise->Size();
|
|
|
|
return nSize;
|
|
}
|
|
SShaderPass& operator = (const SShaderPass& sl)
|
|
{
|
|
memcpy(this, &sl, sizeof(SShaderPass));
|
|
if (sl.m_WaveEvalAlpha)
|
|
{
|
|
m_WaveEvalAlpha = new SWaveForm;
|
|
*m_WaveEvalAlpha = *sl.m_WaveEvalAlpha;
|
|
}
|
|
if (sl.m_RGBComps)
|
|
{
|
|
m_RGBComps = new SParam;
|
|
*m_RGBComps = *sl.m_RGBComps;
|
|
}
|
|
if (sl.m_WaveEvalRGB)
|
|
{
|
|
m_WaveEvalRGB = new SWaveForm;
|
|
*m_WaveEvalRGB = *sl.m_WaveEvalRGB;
|
|
}
|
|
TArray<SShaderTexUnit> L;
|
|
m_TUnits = L;
|
|
if (sl.m_TUnits.Num())
|
|
{
|
|
mfAddNewTexUnits(sl.m_TUnits.Num());
|
|
for (int j=0; j<sl.m_TUnits.Num(); j++)
|
|
{
|
|
sl.m_TUnits[j].mfCopy(&m_TUnits[j]);
|
|
}
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
void mfAddNewTexUnits(int nums)
|
|
{
|
|
SShaderTexUnit tl;
|
|
for (int i=0; i<nums; i++)
|
|
{
|
|
m_TUnits.AddElem(tl);
|
|
}
|
|
m_TUnits.Shrink();
|
|
}
|
|
void mfFree()
|
|
{
|
|
if (m_WaveEvalAlpha)
|
|
{
|
|
delete m_WaveEvalAlpha;
|
|
m_WaveEvalAlpha = NULL;
|
|
}
|
|
if (m_WaveEvalRGB)
|
|
{
|
|
delete m_WaveEvalRGB;
|
|
m_WaveEvalRGB = NULL;
|
|
}
|
|
for (int j=0; j<m_TUnits.Num(); j++)
|
|
{
|
|
SShaderTexUnit *tl = &m_TUnits[j];
|
|
tl->mfFree();
|
|
}
|
|
m_TUnits.Free();
|
|
if (m_RGBComps)
|
|
delete m_RGBComps;
|
|
}
|
|
bool mfSetTextures();
|
|
void mfResetTextures();
|
|
};
|
|
|
|
enum EShaderPassType
|
|
{
|
|
eSHP_General = 0,
|
|
eSHP_Light,
|
|
eSHP_DiffuseLight,
|
|
eSHP_SpecularLight,
|
|
eSHP_MultiLights,
|
|
eSHP_Shadow,
|
|
eSHP_MultiShadows,
|
|
eSHP_Fur,
|
|
eSHP_SimulatedFur,
|
|
eSHP_MAX,
|
|
};
|
|
|
|
// Shader pass definition for HW shaders
|
|
struct SShaderPassHW : public SShaderPass
|
|
{
|
|
EShaderPassType m_ePassType;
|
|
int m_LMFlags; // Light material flags (LMF_)
|
|
int m_LightFlags; // Dynamic light sources flag (DLF_)
|
|
int m_nAmbMaxLights; // Number of PP light sources if ambient pass is present
|
|
|
|
CVProgram *m_VProgram; // Pointer to the vertex shader for the current pass
|
|
TArray<SCGParam4f> m_VPParamsNoObj; // Vertex shader parameters
|
|
TArray<SCGParam4f> m_VPParamsObj; // Vertex shader parameters
|
|
|
|
CPShader *m_FShader; // Pointer to fragment shader (could be CG PShader or register combiner)
|
|
TArray<SCGParam4f> *m_CGFSParamsNoObj; // Pixel shader parameters
|
|
TArray<SCGParam4f> *m_CGFSParamsObj; // Pixel shader parameters
|
|
|
|
TArray<SArrayPointer *> m_Pointers; // Vertex attributes definitions
|
|
TArray<SMatrixTransform> *m_MatrixOps; // Matrix transformations
|
|
TArray<SDeform> *m_Deforms; // Deform stages (software evaluation)
|
|
|
|
SShaderPassHW();
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SShaderPassHW) - sizeof(SShaderPass);
|
|
nSize += SShaderPass::Size();
|
|
nSize += sizeof(SCGParam4f) * m_VPParamsNoObj.GetSize();
|
|
nSize += sizeof(SCGParam4f) * m_VPParamsObj.GetSize();
|
|
if (m_CGFSParamsNoObj)
|
|
nSize += sizeof(SParam) * m_CGFSParamsNoObj->GetSize();
|
|
if (m_CGFSParamsObj)
|
|
nSize += sizeof(SParam) * m_CGFSParamsObj->GetSize();
|
|
if (m_MatrixOps)
|
|
nSize += m_MatrixOps->GetSize() * sizeof(SMatrixTransform) + 12;
|
|
if (m_Deforms)
|
|
{
|
|
for (int i=0; i<m_Deforms->GetSize(); i++)
|
|
{
|
|
nSize += m_Deforms->Get(i).Size();
|
|
}
|
|
}
|
|
return nSize;
|
|
}
|
|
void mfFree()
|
|
{
|
|
SShaderPass::mfFree();
|
|
|
|
if (m_CGFSParamsNoObj)
|
|
delete m_CGFSParamsNoObj;
|
|
if (m_CGFSParamsObj)
|
|
delete m_CGFSParamsObj;
|
|
m_Pointers.Free();
|
|
m_VPParamsNoObj.Free();
|
|
m_VPParamsObj.Free();
|
|
SAFE_DELETE(m_MatrixOps);
|
|
SAFE_DELETE(m_Deforms);
|
|
SAFE_RELEASE(m_VProgram);
|
|
SAFE_RELEASE(m_FShader);
|
|
}
|
|
|
|
SShaderPassHW& operator = (const SShaderPassHW& sl)
|
|
{
|
|
SShaderPass *dsl = (SShaderPass *)this;
|
|
*dsl = sl;
|
|
|
|
if (sl.m_VPParamsNoObj.Num())
|
|
m_VPParamsNoObj.Copy(sl.m_VPParamsNoObj);
|
|
if (sl.m_CGFSParamsNoObj)
|
|
{
|
|
m_CGFSParamsNoObj = new TArray<SCGParam4f>;
|
|
m_CGFSParamsNoObj->Copy(*sl.m_CGFSParamsNoObj);
|
|
}
|
|
if (sl.m_CGFSParamsObj)
|
|
{
|
|
m_CGFSParamsObj = new TArray<SCGParam4f>;
|
|
m_CGFSParamsObj->Copy(*sl.m_CGFSParamsObj);
|
|
}
|
|
if (sl.m_VPParamsObj.Num())
|
|
m_VPParamsObj.Copy(sl.m_VPParamsObj);
|
|
|
|
if (sl.m_Deforms)
|
|
{
|
|
m_Deforms = new TArray<SDeform>;
|
|
m_Deforms->Copy(*sl.m_Deforms);
|
|
}
|
|
|
|
if (sl.m_Pointers.Num())
|
|
{
|
|
m_Pointers.Copy(sl.m_Pointers);
|
|
}
|
|
|
|
if (sl.m_MatrixOps)
|
|
{
|
|
m_MatrixOps = new TArray<SMatrixTransform>;
|
|
m_MatrixOps->Copy(*sl.m_MatrixOps);
|
|
}
|
|
if (sl.m_VProgram)
|
|
sl.m_VProgram->m_nRefCounter++;
|
|
if (sl.m_FShader)
|
|
sl.m_FShader->m_nRefCounter++;
|
|
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
//===================================================================================
|
|
// Hardware Stage for HW only Shaders
|
|
|
|
#define SHCF_NOLIGHTS 1
|
|
#define SHCF_SINGLELIGHT 2
|
|
#define SHCF_MULTIPLELIGHTS 4
|
|
#define SHCF_ONLYDIRECTIONAL 0x10
|
|
#define SHCF_HASPROJECTEDLIGHTS 0x20
|
|
#define SHCF_LIGHT (SHCF_ONLYDIRECTIONAL | SHCF_HASPROJECTEDLIGHTS | SHCF_MULTIPLELIGHTS | SHCF_SINGLELIGHT | SHCF_NOLIGHTS | SHCF_HEATVISION)
|
|
#define SHCF_IGNOREDIRECTIONAL 0x40
|
|
#define SHCF_HASVCOLORS 0x80
|
|
#define SHCF_HASALPHATEST 0x100
|
|
#define SHCF_HASALPHABLEND 0x200
|
|
#define SHCF_INFOGVOLUME 0x400
|
|
#define SHCF_HASLM 0x800
|
|
#define SHCF_RETEXBIND1 0x1000
|
|
#define SHCF_RETEXBIND2 0x2000
|
|
#define SHCF_RETEXBIND3 0x3000
|
|
#define SHCF_RETEXBIND4 0x4000
|
|
#define SHCF_RETEXBIND5 0x5000
|
|
#define SHCF_RETEXBIND6 0x6000
|
|
#define SHCF_RETEXBIND7 0x7000
|
|
#define SHCF_RETEXBIND_MASK 0x7000
|
|
#define SHCF_HASDOT3LM 0x8000
|
|
#define SHCF_HASRESOURCE 0x10000
|
|
#define SHCF_SPECULAR FOB_SPECULAR
|
|
#define SHCF_BENDED FOB_BENDED
|
|
#define SHCF_ALPHABLENDED FOB_HASALPHA
|
|
#define SHCF_NOBUMP FOB_NOBUMP
|
|
#define SHCF_INSHADOW FOB_INSHADOW
|
|
#define SHCF_HEATVISION FOB_HEATVISION
|
|
#define SHCF_HOTAMBIENT FOB_HOTAMBIENT
|
|
#define SHCF_ENVLCMAP FOB_ENVLIGHTING
|
|
|
|
// Hardware technique conditions:
|
|
// Render pipeline choses appropriate technique based on some flags, console variables,
|
|
// parameters (conditions).
|
|
// Number of conditions (in the list: m_HWConditions) should be exactly the same as number of HW techniques (in the list: m_HWTechniques)
|
|
struct SHWConditions
|
|
{
|
|
int m_Flags; // conditions flags
|
|
int m_NumVars; // number of console variables
|
|
CVarCond *m_Vars; // list of the console variables
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SHWConditions);
|
|
for (int i=0; i<m_NumVars; i++)
|
|
{
|
|
nSize += m_Vars[i].Size();
|
|
}
|
|
return nSize;
|
|
}
|
|
|
|
SHWConditions()
|
|
{
|
|
m_Flags = 0;
|
|
m_NumVars = 0;
|
|
m_Vars = NULL;
|
|
}
|
|
};
|
|
|
|
#define FHF_TANGENTS SHPF_TANGENTS
|
|
#define FHF_LMTC SHPF_LMTC
|
|
#define FHF_NORMALS SHPF_NORMALS
|
|
#define FHF_FIRSTLIGHT 8
|
|
#define FHF_FORANIM 0x10
|
|
#define FHF_TERRAIN 0x20
|
|
#define FHF_NOMERGE 0x40
|
|
|
|
struct SShaderTechnique
|
|
{
|
|
int m_Id; // Technique Id (order in tech. list Id)
|
|
ECull m_eCull; // Culling type
|
|
TArray<SArrayPointer *> m_Pointers; // Vertex attributes definitions
|
|
TArray<SMatrixTransform> *m_MatrixOps; // Matrix transformations
|
|
TArray <SShaderPassHW> m_Passes; // General passes
|
|
int m_Flags; // Different flags (FHF_)
|
|
|
|
int Size()
|
|
{
|
|
int i;
|
|
int nSize = sizeof(SShaderTechnique);
|
|
nSize += m_Pointers.GetSize() * sizeof(SArrayPointer *);
|
|
if (m_MatrixOps)
|
|
{
|
|
nSize += 12;
|
|
for (i=0; i<m_MatrixOps->GetSize(); i++)
|
|
{
|
|
nSize += m_MatrixOps->Get(i).Size();
|
|
}
|
|
}
|
|
for (i=0; i<m_Passes.GetSize(); i++)
|
|
{
|
|
nSize += m_Passes[i].Size();
|
|
}
|
|
return nSize;
|
|
}
|
|
SShaderTechnique()
|
|
{
|
|
m_MatrixOps = NULL;
|
|
m_Flags = 0;
|
|
m_eCull = (ECull)-1;
|
|
}
|
|
SShaderTechnique& operator = (const SShaderTechnique& sl)
|
|
{
|
|
memcpy(this, &sl, sizeof(SShaderTechnique));
|
|
if (sl.m_Passes.Num())
|
|
{
|
|
m_Passes.Copy(sl.m_Passes);
|
|
for (int i=0; i<sl.m_Passes.Num(); i++)
|
|
{
|
|
const SShaderPassHW *s = &sl.m_Passes[i];
|
|
SShaderPassHW *d = &m_Passes[i];
|
|
*d = *s;
|
|
}
|
|
}
|
|
|
|
if (sl.m_Pointers.Num())
|
|
{
|
|
m_Pointers.Copy(sl.m_Pointers);
|
|
}
|
|
|
|
if (sl.m_MatrixOps)
|
|
{
|
|
m_MatrixOps = new TArray<SMatrixTransform>;
|
|
m_MatrixOps->Copy(*sl.m_MatrixOps);
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
~SShaderTechnique()
|
|
{
|
|
for (int i=0; i<m_Passes.Num(); i++)
|
|
{
|
|
SShaderPassHW *sl = &m_Passes[i];
|
|
|
|
sl->mfFree();
|
|
}
|
|
m_Passes.Free();
|
|
}
|
|
|
|
#ifdef DEBUGALLOC
|
|
#undef new
|
|
#endif
|
|
void* operator new( size_t Size ) { void *ptr = malloc(Size); memset(ptr, 0, Size); return ptr; }
|
|
void operator delete( void *Ptr ) { free(Ptr); }
|
|
#ifdef DEBUGALLOC
|
|
#define new DEBUG_CLIENTBLOCK
|
|
#endif
|
|
};
|
|
|
|
//===============================================================================
|
|
|
|
//Timur[9/16/2002]
|
|
struct SMapTexInfoOld
|
|
{
|
|
char name[64];
|
|
float shift[2];
|
|
float rotate;
|
|
float scale[2];
|
|
int contents;
|
|
int flags;
|
|
int value;
|
|
|
|
SMapTexInfoOld()
|
|
{
|
|
memset(this, 0, sizeof(SMapTexInfoOld));
|
|
strcpy(name, "T00/notex");
|
|
scale[0] = scale[1] = 0.5f;
|
|
}
|
|
~SMapTexInfoOld()
|
|
{
|
|
}
|
|
void SetName(const char *p)
|
|
{
|
|
strcpy(name, p);
|
|
}
|
|
};
|
|
|
|
|
|
struct SNormalsGen
|
|
{
|
|
EEvalNormal m_eNormal;
|
|
Vec3d m_CustomNormal;
|
|
SWaveForm m_WaveEvalNormal;
|
|
|
|
int Size()
|
|
{
|
|
int nSize = sizeof(SNormalsGen);
|
|
return nSize;
|
|
}
|
|
};
|
|
|
|
// Fill type/components (for optimal update)
|
|
#define FLT_BASE 1
|
|
#define FLT_COL 2
|
|
#define FLT_LM 4
|
|
#define FLT_SYSBASE 8
|
|
#define FLT_SYSLM 16
|
|
#define FLT_N 32
|
|
|
|
struct SSideMaterial;
|
|
|
|
// General Shader structure
|
|
struct SShader : public IShader
|
|
{
|
|
string m_Name; // } FIXME: This fields order is very important
|
|
int m_Id; // } (see SShader::operator =)
|
|
|
|
int m_nRefCounter;
|
|
float m_fProfileTime;
|
|
uint m_Flags; // Different usefull flags EF_ (see IShader.h)
|
|
uint m_Flags2; // Different usefull flags EF2_ (see IShader.h)
|
|
uint m_Flags3; // Different usefull flags EF3_ (see IShader.h)
|
|
ECull m_eCull; // Base shader culling type (Can be overriden by Pass m_eCull value)
|
|
EF_Sort m_eSort; // Sort category eS_ (see IShader.h)
|
|
EShClass m_eClass; // Shader class eSH_ (see IShader.h)
|
|
float m_fUpdateFactor; // Updating time factor for drawing to the texture
|
|
uint m_DLDFlags; // Preprocessor shader flags for "DrawLowDetail" function (see I3DEngine.h)
|
|
int m_nPreprocess; // Preprocess flags for shader (see IShader.h)
|
|
|
|
SEfTemplates *m_Templates; // List of all templates registered in this shader
|
|
int m_VertexFormatId; // Base vertex format for the shader (see VertexFormats.h)
|
|
|
|
/////////////////////////////////////////////////////////
|
|
// Passes definitions (only common shaders)
|
|
/////////////////////////////////////////////////////////
|
|
TArray<SShaderPass> m_Passes;
|
|
/////////////////////////////////////////////////////////
|
|
|
|
// Hardware techniques (only HW shaders)
|
|
TArray<SHWConditions> m_HWConditions; // List of all conditions
|
|
TArray <SShaderTechnique *> m_HWTechniques;
|
|
CVProgram *m_DefaultVProgram;
|
|
TArray<SShaderParam> m_PublicParams; // Shader public params (can be enumerated by func.: GetPublicParams)
|
|
|
|
TArray<SDeform> *m_Deforms; // Deform stages (software evaluation)
|
|
SNormalsGen *m_NormGen; // Custom Generating of Normals (software evaluation)
|
|
SFogInfo *m_FogInfo; // Volume fog info
|
|
SSkyInfo *m_Sky; // Sky zone info
|
|
CSunFlares *m_Flares; // Lens flares from the sun/light source
|
|
TArray<CRendElement *> m_REs; // List of all render elements registered in the shader
|
|
|
|
SLightEval *m_EvalLights; // Light evaluation parameters (only for light shaders)
|
|
int m_LMFlags; // Light material types flag
|
|
|
|
SEfState *m_State; // Special state (valid only for state shaders)
|
|
|
|
uint64 m_nMaskGen;
|
|
SShaderGen *m_ShaderGenParams; // BitMask params used in automatic script generation
|
|
TArray<SShader *> *m_DerivedShaders;
|
|
SShader *m_pGenShader;
|
|
|
|
int m_nRefreshFrame; // Current frame for shader reloading (to avoid multiple reloading)
|
|
|
|
FILETIME m_WriteTime;
|
|
|
|
//============================================================================
|
|
|
|
void mfFree();
|
|
SShader()
|
|
{
|
|
m_fProfileTime = 0;
|
|
m_eSort = eS_Unknown;
|
|
}
|
|
virtual ~SShader();
|
|
|
|
//===================================================================================
|
|
|
|
// IShader interface
|
|
virtual void AddRef() { m_nRefCounter++; };
|
|
virtual int GetID() { return m_Id; }
|
|
virtual int GetRefCount() { return m_nRefCounter; }
|
|
virtual const char *GetName() { return m_Name.c_str(); }
|
|
virtual EF_Sort GetSort() { return m_eSort; }
|
|
virtual int GetCull() { return m_eCull; }
|
|
virtual int GetFlags() { return m_Flags; }
|
|
virtual int GetFlags2() { return m_Flags2; }
|
|
virtual int GetFlags3() { return m_Flags3; }
|
|
virtual int GetLFlags() { return m_LMFlags; }
|
|
virtual void SetFlags3(int Flags) { m_Flags3 |= Flags; }
|
|
virtual int GetRenderFlags() { return m_DLDFlags; }
|
|
virtual void SetRenderFlags(int nFlags) { m_DLDFlags = nFlags; }
|
|
virtual bool Reload(int nFlags);
|
|
virtual TArray<CRendElement *> *GetREs () { return &m_REs; }
|
|
virtual bool AddTemplate(SRenderShaderResources *Res, int& TemplId, const char *Name=NULL, bool bSetPreferred=true, uint64 nMaskGen=0);
|
|
virtual void RemoveTemplate(int TemplId);
|
|
virtual IShader *GetTemplate(int num) { return (IShader *)mfGetTemplate(num); }
|
|
virtual SEfTemplates *GetTemplates () { return m_Templates; }
|
|
virtual int GetTexId ();
|
|
virtual unsigned int GetUsedTextureTypes (void);
|
|
virtual uint GetPreprocessFlags() { return m_nPreprocess; }
|
|
virtual int GetVertexFormat(void) { return m_VertexFormatId; }
|
|
virtual uint64 GetGenerationMask() { return m_nMaskGen; }
|
|
virtual SShaderGen* GetGenerationParams()
|
|
{
|
|
if (m_ShaderGenParams)
|
|
return m_ShaderGenParams;
|
|
if (m_pGenShader)
|
|
return m_pGenShader->m_ShaderGenParams;
|
|
return NULL;
|
|
}
|
|
|
|
virtual TArray<SShaderParam>& GetPublicParams()
|
|
{
|
|
return m_PublicParams;
|
|
}
|
|
virtual void Release(bool bForce=false)
|
|
{
|
|
#ifndef NULL_RENDERER
|
|
if (!bForce)
|
|
{
|
|
if (m_Flags & EF_SYSTEM)
|
|
return;
|
|
m_nRefCounter--;
|
|
if (m_nRefCounter)
|
|
return;
|
|
}
|
|
delete this;
|
|
#endif
|
|
}
|
|
|
|
//=======================================================================================
|
|
|
|
virtual void mfNewTemplates()
|
|
{
|
|
m_Templates = new SEfTemplates;
|
|
}
|
|
virtual void mfDeleteTemplates()
|
|
{
|
|
delete m_Templates;
|
|
m_Templates = NULL;
|
|
}
|
|
|
|
SShader *mfGetTemplate(int num)
|
|
{
|
|
if (m_Templates)
|
|
{
|
|
if (num>=0 && num < m_Templates->m_TemplShaders.Num() && m_Templates->m_TemplShaders[num])
|
|
return m_Templates->m_TemplShaders[num];
|
|
else
|
|
if (m_Templates->m_Preferred)
|
|
return m_Templates->m_Preferred;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
virtual bool mfSetOpacity(float Opa, int Mode); // Mode=0 - Opacity, Mode=1 - Additive
|
|
virtual void mfAddDeform(SDeform& ds)
|
|
{
|
|
if (!m_Deforms)
|
|
m_Deforms = new TArray<SDeform>;
|
|
m_Deforms->AddElem(ds);
|
|
}
|
|
virtual void mfRemoveDeform(int nOffset)
|
|
{
|
|
if (!m_Deforms)
|
|
return;
|
|
m_Deforms->Remove(nOffset, 1);
|
|
if (!m_Deforms->Num())
|
|
{
|
|
m_Deforms->Free();
|
|
delete [] m_Deforms;
|
|
m_Deforms = NULL;
|
|
}
|
|
}
|
|
virtual ITexPic *GetBaseTexture(int *nPass, int *nTU);
|
|
|
|
SShader& operator = (const SShader& src);
|
|
STexPic *mfFindBaseTexture(TArray<SShaderPass>& Passes, int *nPass, int *nTU, int nT);
|
|
STexPic *mfFindBaseTexture(TArray<SShaderPassHW>& Passes, int *nPass, int *nTU, int nT);
|
|
|
|
int mfSize();
|
|
|
|
// All loaded shaders list
|
|
static TArray<SShader *> m_Shaders_known;
|
|
static TArray<SRenderShaderResources *> m_ShaderResources_known;
|
|
|
|
virtual bool mfIsValidTime(CCObject *obj, float curtime);
|
|
virtual int Size(int Flags)
|
|
{
|
|
return mfSize();
|
|
}
|
|
|
|
#ifdef DEBUGALLOC
|
|
#undef new
|
|
#endif
|
|
void* operator new( size_t Size ) { void *ptr = malloc(Size); memset(ptr, 0, Size); return ptr; }
|
|
void operator delete( void *Ptr ) { free(Ptr); }
|
|
#ifdef DEBUGALLOC
|
|
#define new DEBUG_CLIENTBLOCK
|
|
#endif
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
inline void
|
|
SParamComp_Matrix::mfCopy(const SParamComp* p)
|
|
{
|
|
SParamComp_Matrix *src = (SParamComp_Matrix *)p;
|
|
m_eType = src->m_eType;
|
|
m_Offs = src->m_Offs;
|
|
m_Transforms.Copy(src->m_Transforms);
|
|
m_bDependsOnObject = 1;
|
|
}
|
|
|
|
|
|
#endif
|
|
|