123
This commit is contained in:
18
RenderDll/Common/RendElements/CRE2DQuad.cpp
Normal file
18
RenderDll/Common/RendElements/CRE2DQuad.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
#include "CRE2DQuad.h"
|
||||
|
||||
|
||||
void *CRE2DQuad::mfGetPointer(ESrcPointer ePT, int *Stride, int Type, ESrcPointer Dst, int Flags)
|
||||
{
|
||||
*Stride = sizeof(m_arrVerts[0]);
|
||||
|
||||
switch(ePT)
|
||||
{
|
||||
case eSrcPointer_Vert:
|
||||
return &m_arrVerts[0].xyz.x;
|
||||
case eSrcPointer_Tex:
|
||||
return &m_arrVerts[0].st[0];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
243
RenderDll/Common/RendElements/CREBeam.cpp
Normal file
243
RenderDll/Common/RendElements/CREBeam.cpp
Normal file
@@ -0,0 +1,243 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
#include "I3dengine.h"
|
||||
|
||||
void CREBeam::mfPrepare(void)
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
int Features = gRenDev->GetFeatures();
|
||||
|
||||
if (!m_pBuffer)
|
||||
{
|
||||
I3DEngine *eng = (I3DEngine *)iSystem->GetI3DEngine();
|
||||
IStatObj *pObj = eng->MakeObject(m_ModelName.c_str(), NULL, evs_ShareAndSortForCache, false, false);
|
||||
m_pBuffer = pObj->GetLeafBuffer();
|
||||
if (!m_pBuffer)
|
||||
{
|
||||
gRenDev->m_RP.m_pRE = NULL;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
return;
|
||||
}
|
||||
Vec3d Mins = m_pBuffer->m_vBoxMin;
|
||||
Vec3d Maxs = m_pBuffer->m_vBoxMax;
|
||||
|
||||
m_fLengthScale = Maxs.x;
|
||||
m_fWidthScale = Maxs.z;
|
||||
}
|
||||
|
||||
CLeafBuffer *lb = m_pBuffer;
|
||||
CMatInfo *mi = &(*lb->m_pMats)[0];
|
||||
|
||||
gRenDev->m_RP.m_pShader = (SShader *)mi->shaderItem.m_pShader->GetTemplate(-1);
|
||||
gRenDev->m_RP.m_pShaderResources = mi->shaderItem.m_pShaderResources;
|
||||
gRenDev->m_RP.m_pRE = mi->pRE;
|
||||
|
||||
// Choose appropriate shader technique depend on some input parameters
|
||||
if (gRenDev->m_RP.m_pShader->m_HWTechniques.Num())
|
||||
{
|
||||
int nHW = gRenDev->EF_SelectHWTechnique(gRenDev->m_RP.m_pShader);
|
||||
if (nHW >= 0)
|
||||
gRenDev->m_RP.m_pCurTechnique = gRenDev->m_RP.m_pShader->m_HWTechniques[nHW];
|
||||
else
|
||||
gRenDev->m_RP.m_pCurTechnique = NULL;
|
||||
}
|
||||
else
|
||||
gRenDev->m_RP.m_pCurTechnique = NULL;
|
||||
|
||||
CCObject *obj = gRenDev->m_RP.m_pCurObject;
|
||||
obj->m_RE = this;
|
||||
UParamVal pv;
|
||||
pv.m_Float = m_fLengthScale;
|
||||
SShaderParam::SetParam("origlength", &gRenDev->m_RP.m_pShader->m_PublicParams, pv, -1);
|
||||
|
||||
pv.m_Float = m_fWidthScale;
|
||||
SShaderParam::SetParam("origwidth", &gRenDev->m_RP.m_pShader->m_PublicParams, pv, -1);
|
||||
|
||||
pv.m_Float = m_fLength;
|
||||
SShaderParam::SetParam("length", &gRenDev->m_RP.m_pShader->m_PublicParams, pv, -1);
|
||||
|
||||
pv.m_Float = m_fStartRadius;
|
||||
SShaderParam::SetParam("startradius", &gRenDev->m_RP.m_pShader->m_PublicParams, pv, -1);
|
||||
|
||||
pv.m_Float = m_fEndRadius;
|
||||
SShaderParam::SetParam("endradius", &gRenDev->m_RP.m_pShader->m_PublicParams, pv, -1);
|
||||
|
||||
pv.m_Color[0] = m_StartColor[0];
|
||||
pv.m_Color[1] = m_StartColor[1];
|
||||
pv.m_Color[2] = m_StartColor[2];
|
||||
pv.m_Color[3] = m_StartColor[3];
|
||||
if (m_LightStyle == 0)
|
||||
{
|
||||
pv.m_Color[0] = obj->m_Color[0];
|
||||
pv.m_Color[1] = obj->m_Color[1];
|
||||
pv.m_Color[2] = obj->m_Color[2];
|
||||
}
|
||||
SShaderParam::SetParam("startcolor", &gRenDev->m_RP.m_pShader->m_PublicParams, pv, -1);
|
||||
|
||||
pv.m_Color[0] = m_EndColor[0];
|
||||
pv.m_Color[1] = m_EndColor[1];
|
||||
pv.m_Color[2] = m_EndColor[2];
|
||||
pv.m_Color[3] = m_EndColor[3];
|
||||
if (m_LightStyle == 0)
|
||||
{
|
||||
pv.m_Color[0] = obj->m_Color[0];
|
||||
pv.m_Color[1] = obj->m_Color[1];
|
||||
pv.m_Color[2] = obj->m_Color[2];
|
||||
}
|
||||
SShaderParam::SetParam("endcolor", &gRenDev->m_RP.m_pShader->m_PublicParams, pv, -1);
|
||||
|
||||
obj->m_ShaderParams = &gRenDev->m_RP.m_pShader->m_PublicParams;
|
||||
|
||||
gRenDev->m_RP.m_FirstVertex = mi->nFirstVertId;
|
||||
gRenDev->m_RP.m_RendNumIndices = mi->nNumIndices;
|
||||
gRenDev->m_RP.m_RendNumVerts = mi->nNumVerts;
|
||||
gRenDev->m_RP.m_FirstIndex = mi->nFirstIndexId;
|
||||
}
|
||||
|
||||
bool CREBeam::mfCompile(SShader *ef, char *scr)
|
||||
{
|
||||
char* name;
|
||||
long cmd;
|
||||
char *params;
|
||||
char *data;
|
||||
|
||||
enum {eModel = 1, eLength, eStartRadius, eEndRadius, eStartColor, eEndColor, eLightStyle};
|
||||
static tokenDesc commands[] =
|
||||
{
|
||||
{eModel, "Model"},
|
||||
{eStartRadius, "StartRadius"},
|
||||
{eEndRadius, "EndRadius"},
|
||||
{eStartColor, "StartColor"},
|
||||
{eEndColor, "EndColor"},
|
||||
{eLightStyle, "LightStyle"},
|
||||
{eLength, "Length"},
|
||||
{0, 0},
|
||||
};
|
||||
|
||||
I3DEngine *eng = (I3DEngine *)iSystem->GetI3DEngine();
|
||||
|
||||
while ((cmd = shGetObject (&scr, commands, &name, ¶ms)) > 0)
|
||||
{
|
||||
data = NULL;
|
||||
if (name)
|
||||
data = name;
|
||||
else
|
||||
if (params)
|
||||
data = params;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case eModel:
|
||||
{
|
||||
m_ModelName = data;
|
||||
//IStatObj *pObj = eng->MakeObject(data, NULL, 0, false, false);
|
||||
//m_pBuffer = pObj->GetLeafBuffer();
|
||||
}
|
||||
break;
|
||||
|
||||
case eStartRadius:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing StartRadius argument for Beam Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
m_fStartRadius = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eEndRadius:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing EndRadius argument for Beam Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
m_fEndRadius = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eLightStyle:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing LightStyle argument for Beam Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
m_LightStyle = shGetInt(data);
|
||||
break;
|
||||
|
||||
case eLength:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing Length argument for Beam Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
m_fLength = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eStartColor:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing StartColor argument for Beam Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
shGetColor(data, m_StartColor);
|
||||
break;
|
||||
|
||||
case eEndColor:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing EndColor argument for Beam Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
shGetColor(data, m_EndColor);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!m_ModelName.c_str()[0])
|
||||
return false;
|
||||
SShaderParam *sp;
|
||||
|
||||
sp = new SShaderParam;
|
||||
strcpy(sp->m_Name, "origlength");
|
||||
sp->m_Type = eType_FLOAT;
|
||||
sp->m_Value.m_Float = 10.0f;
|
||||
m_ShaderParams.AddElem(sp);
|
||||
|
||||
sp = new SShaderParam;
|
||||
strcpy(sp->m_Name, "origwidth");
|
||||
sp->m_Type = eType_FLOAT;
|
||||
sp->m_Value.m_Float = 1.0f;
|
||||
m_ShaderParams.AddElem(sp);
|
||||
|
||||
sp = new SShaderParam;
|
||||
strcpy(sp->m_Name, "startradius");
|
||||
sp->m_Type = eType_FLOAT;
|
||||
sp->m_Value.m_Float = 0.1f;
|
||||
m_ShaderParams.AddElem(sp);
|
||||
|
||||
sp = new SShaderParam;
|
||||
strcpy(sp->m_Name, "endradius");
|
||||
sp->m_Type = eType_FLOAT;
|
||||
sp->m_Value.m_Float = 1.0f;
|
||||
m_ShaderParams.AddElem(sp);
|
||||
|
||||
sp = new SShaderParam;
|
||||
strcpy(sp->m_Name, "startcolor");
|
||||
sp->m_Type = eType_FCOLOR;
|
||||
sp->m_Value.m_Color[0] = 1.0f;
|
||||
sp->m_Value.m_Color[1] = 1.0f;
|
||||
sp->m_Value.m_Color[2] = 1.0f;
|
||||
sp->m_Value.m_Color[3] = 1.0f;
|
||||
m_ShaderParams.AddElem(sp);
|
||||
|
||||
sp = new SShaderParam;
|
||||
strcpy(sp->m_Name, "endcolor");
|
||||
sp->m_Type = eType_FCOLOR;
|
||||
sp->m_Value.m_Color[0] = 1.0f;
|
||||
sp->m_Value.m_Color[1] = 1.0f;
|
||||
sp->m_Value.m_Color[2] = 1.0f;
|
||||
sp->m_Value.m_Color[3] = 0.1f;
|
||||
m_ShaderParams.AddElem(sp);
|
||||
|
||||
return true;
|
||||
}
|
||||
50
RenderDll/Common/RendElements/CREBeam.h
Normal file
50
RenderDll/Common/RendElements/CREBeam.h
Normal file
@@ -0,0 +1,50 @@
|
||||
|
||||
#ifndef __CREBEAM_H__
|
||||
#define __CREBEAM_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
|
||||
class CREBeam : public CRendElement
|
||||
{
|
||||
public:
|
||||
struct CLeafBuffer * m_pBuffer;
|
||||
float m_fFogScale;
|
||||
TArray<SShaderParam *> m_ShaderParams;
|
||||
|
||||
CFColor m_StartColor;
|
||||
CFColor m_EndColor;
|
||||
float m_fStartRadius;
|
||||
float m_fEndRadius;
|
||||
int m_LightStyle;
|
||||
float m_fLength;
|
||||
float m_fLengthScale;
|
||||
float m_fWidthScale;
|
||||
string m_ModelName;
|
||||
|
||||
public:
|
||||
CREBeam()
|
||||
{
|
||||
mfSetType(eDATA_Beam);
|
||||
m_fFogScale = 0;
|
||||
m_pBuffer = NULL;
|
||||
m_LightStyle = 0;
|
||||
m_fLength = 1.0f;
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
}
|
||||
|
||||
virtual ~CREBeam()
|
||||
{
|
||||
for (int i=0; i<m_ShaderParams.Num(); i++)
|
||||
{
|
||||
SShaderParam *pr = m_ShaderParams[i];
|
||||
SAFE_DELETE(pr);
|
||||
}
|
||||
m_ShaderParams.Free();
|
||||
}
|
||||
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfCompile(SShader *ef, char *scr);
|
||||
};
|
||||
|
||||
#endif // __CREBEAM_H__
|
||||
157
RenderDll/Common/RendElements/CREClientPoly.cpp
Normal file
157
RenderDll/Common/RendElements/CREClientPoly.cpp
Normal file
@@ -0,0 +1,157 @@
|
||||
/*=============================================================================
|
||||
CClientPoly.cpp : implementation of Client polygons RE.
|
||||
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
|
||||
|
||||
Revision history:
|
||||
* Created by Honitch Andrey
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
|
||||
|
||||
//===============================================================
|
||||
|
||||
|
||||
TArray<CREClientPoly *> CREClientPoly::mPolysStorage[4];
|
||||
|
||||
CRendElement *CREClientPoly::mfCopyConstruct(void)
|
||||
{
|
||||
CREClientPoly *cp = new CREClientPoly;
|
||||
*cp = *this;
|
||||
return cp;
|
||||
}
|
||||
|
||||
float CREClientPoly::mfDistanceToCameraSquared(const CCObject & thisObject)
|
||||
{
|
||||
CRenderer *rd = gRenDev;
|
||||
|
||||
if (m_fDistance >= 0)
|
||||
return m_fDistance;
|
||||
|
||||
Vec3d vMid;
|
||||
vMid.Set(0,0,0);
|
||||
SColorVert *tv = mVerts;
|
||||
for (int i=0; i<mNumVerts; i++, tv++)
|
||||
{
|
||||
vMid += tv->vert;
|
||||
}
|
||||
vMid /= (float)mNumVerts;
|
||||
|
||||
vMid += thisObject.GetTranslation();
|
||||
|
||||
Vec3d Delta = rd->m_RP.m_ViewOrg - vMid;
|
||||
float fDist = GetLengthSquared(Delta);
|
||||
m_fDistance = fDist;
|
||||
|
||||
return fDist;
|
||||
}
|
||||
|
||||
void CREClientPoly::mfPrepare(void)
|
||||
{
|
||||
CRenderer *rd = gRenDev;
|
||||
SShader *ef = rd->m_RP.m_pShader;
|
||||
byte *inds;
|
||||
int i, n;
|
||||
SColorVert *tv;
|
||||
|
||||
CREClientPoly::mRS.NumRendPolys++;
|
||||
|
||||
{
|
||||
//PROFILE_FRAME_TOTAL(Mesh_REPrepare_Flush3DPoly);
|
||||
rd->EF_CheckOverflow(mNumVerts, mNumIndices, this);
|
||||
}
|
||||
|
||||
{
|
||||
//PROFILE_FRAME_TOTAL(Mesh_REPrepare_3DPoly);
|
||||
|
||||
int savev = rd->m_RP.m_RendNumVerts;
|
||||
int savei = rd->m_RP.m_RendNumIndices;
|
||||
|
||||
inds = mIndices;
|
||||
n = rd->m_RP.m_RendNumVerts;
|
||||
ushort *dinds = &rd->m_RP.m_RendIndices[rd->m_RP.m_RendNumIndices];
|
||||
for (i=0; i<mNumIndices; i++, dinds++, inds++)
|
||||
{
|
||||
*dinds = *inds+n;
|
||||
}
|
||||
rd->m_RP.m_RendNumIndices += i;
|
||||
|
||||
byte *OffsT, *OffsD;
|
||||
tv = mVerts;
|
||||
UPipeVertex ptr = rd->m_RP.m_NextPtr;
|
||||
switch(rd->m_RP.m_CurVFormat)
|
||||
{
|
||||
case VERTEX_FORMAT_P3F_COL4UB_TEX2F:
|
||||
OffsT = rd->m_RP.m_OffsT + ptr.PtrB;
|
||||
OffsD = rd->m_RP.m_OffsD + ptr.PtrB;
|
||||
for (i=0; i<mNumVerts; i++, tv++, ptr.PtrB+=rd->m_RP.m_Stride, OffsT+=rd->m_RP.m_Stride, OffsD+=rd->m_RP.m_Stride)
|
||||
{
|
||||
*(Vec3 *)ptr.PtrB = tv->vert;
|
||||
*(float *)(OffsT) = tv->dTC[0];
|
||||
*(float *)(OffsT+4) = tv->dTC[1];
|
||||
*(uint *)OffsD = tv->color.dcolor;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
}
|
||||
if (rd->m_RP.m_OffsD && gbRgb)
|
||||
{
|
||||
OffsD = rd->m_RP.m_OffsD + rd->m_RP.m_NextPtr.PtrB;
|
||||
for (i=0; i<mNumVerts; i++, OffsD+=rd->m_RP.m_Stride)
|
||||
{
|
||||
*(uint *)(OffsD) = COLCONV(*(uint *)(OffsD));
|
||||
}
|
||||
}
|
||||
|
||||
gRenDev->m_RP.m_NextPtr = ptr;
|
||||
gRenDev->m_RP.m_RendNumVerts += mNumVerts;
|
||||
|
||||
CREClientPoly::mRS.NumVerts += gRenDev->m_RP.m_RendNumVerts - savev;
|
||||
CREClientPoly::mRS.NumIndices += gRenDev->m_RP.m_RendNumIndices - savei;
|
||||
}
|
||||
}
|
||||
|
||||
bool CREClientPoly::mfCullBox(Vec3d& vmin, Vec3d& vmax)
|
||||
{
|
||||
CREClientPoly::mRS.NumOccPolys++;
|
||||
|
||||
//if(gfCullBox(vmin, vmax))
|
||||
// return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
|
||||
SClientPolyStat CREClientPoly::mRS;
|
||||
|
||||
void CREClientPoly::mfPrintStat()
|
||||
{
|
||||
/* char str[1024];
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Indices: %i\n", mRS.NumIndices);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Verts: %i\n", mRS.NumVerts);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Render Client Polys: %i\n", mRS.NumRendPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Occluded Client Polys: %i\n", mRS.NumOccPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
gRenDev->mfPrintString ("\nClient Polygons status info:\n", PS_TRANSPARENT | PS_UP);*/
|
||||
}
|
||||
54
RenderDll/Common/RendElements/CREClientPoly.h
Normal file
54
RenderDll/Common/RendElements/CREClientPoly.h
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
#ifndef __CRECLIENTPOLY_H__
|
||||
#define __CRECLIENTPOLY_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
struct SClientPolyStat
|
||||
{
|
||||
int NumOccPolys;
|
||||
int NumRendPolys;
|
||||
int NumVerts;
|
||||
int NumIndices;
|
||||
};
|
||||
|
||||
//#define MAX_CLIENTPOLY_VERTS 16
|
||||
#define MAX_CLIENTPOLY_VERTS 32
|
||||
|
||||
class CREClientPoly : public CRendElement
|
||||
{
|
||||
public:
|
||||
SShader *mEf;
|
||||
int m_nFogID;
|
||||
short mNumVerts;
|
||||
short mNumIndices;
|
||||
CCObject *m_pObject;
|
||||
SColorVert mVerts[MAX_CLIENTPOLY_VERTS];
|
||||
byte mIndices[(MAX_CLIENTPOLY_VERTS-2)*3];
|
||||
float m_fDistance;
|
||||
|
||||
static SClientPolyStat mRS;
|
||||
static void mfPrintStat();
|
||||
|
||||
public:
|
||||
CREClientPoly()
|
||||
{
|
||||
mfSetType(eDATA_ClientPoly);
|
||||
mNumVerts = 0;
|
||||
mEf = NULL;
|
||||
m_pObject = NULL;
|
||||
mfSetFlags(FCEF_TRANSFORM | FCEF_NEEDFILLBUF);
|
||||
}
|
||||
|
||||
virtual ~CREClientPoly() {};
|
||||
|
||||
virtual void mfPrepare();
|
||||
|
||||
bool mfCullBox(Vec3d& vmin, Vec3d& vmax);
|
||||
float mfDistanceToCameraSquared(const CCObject & thisObject);
|
||||
virtual CRendElement *mfCopyConstruct(void);
|
||||
|
||||
static TArray<CREClientPoly *> mPolysStorage[4];
|
||||
};
|
||||
|
||||
#endif // __CRECLIENTPOLY_H__
|
||||
120
RenderDll/Common/RendElements/CREClientPoly2D.cpp
Normal file
120
RenderDll/Common/RendElements/CREClientPoly2D.cpp
Normal file
@@ -0,0 +1,120 @@
|
||||
/*=============================================================================
|
||||
CClientPoly2D.cpp : implementation of 2D Client polygons RE.
|
||||
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
|
||||
|
||||
Revision history:
|
||||
* Created by Honitch Andrey
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
|
||||
#include "RenderPCH.h"
|
||||
|
||||
|
||||
//===============================================================
|
||||
|
||||
|
||||
TArray<CREClientPoly2D *> CREClientPoly2D::mPolysStorage;
|
||||
|
||||
CRendElement *CREClientPoly2D::mfCopyConstruct(void)
|
||||
{
|
||||
CREClientPoly2D *cp = new CREClientPoly2D;
|
||||
*cp = *this;
|
||||
return cp;
|
||||
}
|
||||
|
||||
void CREClientPoly2D::mfPrepare(void)
|
||||
{
|
||||
CRenderer *rd = gRenDev;
|
||||
SShader *ef = rd->m_RP.m_pShader;
|
||||
byte *inds;
|
||||
int i, n;
|
||||
SColorVert2D *tv;
|
||||
|
||||
CREClientPoly2D::mRS.NumRendPolys++;
|
||||
|
||||
int savev = rd->m_RP.m_RendNumVerts;
|
||||
int savei = rd->m_RP.m_RendNumIndices;
|
||||
|
||||
rd->EF_CheckOverflow(mNumVerts, mNumIndices/3, this);
|
||||
|
||||
rd->m_RP.m_FlagsPerFlush |= RBSI_DRAWAS2D;
|
||||
|
||||
inds = mIndices;
|
||||
n = rd->m_RP.m_RendNumVerts;
|
||||
ushort *dinds = &rd->m_RP.m_RendIndices[gRenDev->m_RP.m_RendNumIndices];
|
||||
for (i=0; i<mNumIndices; i++, dinds++, inds++)
|
||||
{
|
||||
*dinds = *inds+n;
|
||||
}
|
||||
rd->m_RP.m_RendNumIndices += i;
|
||||
|
||||
tv = mVerts;
|
||||
UPipeVertex ptr = rd->m_RP.m_NextPtr;
|
||||
byte *OffsT, *OffsD;
|
||||
switch(rd->m_RP.m_CurVFormat)
|
||||
{
|
||||
case VERTEX_FORMAT_TRP3F_COL4UB_TEX2F:
|
||||
OffsT = rd->m_RP.m_OffsT + ptr.PtrB;
|
||||
OffsD = rd->m_RP.m_OffsD + ptr.PtrB;
|
||||
for (i=0; i<mNumVerts; i++, tv++, ptr.PtrB+=rd->m_RP.m_Stride, OffsT+=rd->m_RP.m_Stride, OffsD+=rd->m_RP.m_Stride)
|
||||
{
|
||||
*(float *)(ptr.PtrB+0) = tv->vert[0];
|
||||
*(float *)(ptr.PtrB+4) = tv->vert[1];
|
||||
*(float *)(ptr.PtrB+8) = 0.0f;
|
||||
*(float *)(ptr.PtrB+12) = 1.0f;
|
||||
*(float *)(OffsT) = tv->dTC[0];
|
||||
*(float *)(OffsT+4) = tv->dTC[1];
|
||||
*(uint *)OffsD = tv->color.dcolor;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
}
|
||||
|
||||
if (rd->m_RP.m_OffsD && gbRgb)
|
||||
{
|
||||
OffsD = rd->m_RP.m_OffsD + rd->m_RP.m_NextPtr.PtrB;
|
||||
for (i=0; i<mNumVerts; i++, OffsD+=rd->m_RP.m_Stride)
|
||||
{
|
||||
*(uint *)(OffsD) = COLCONV(*(uint *)(OffsD));
|
||||
}
|
||||
}
|
||||
|
||||
rd->m_RP.m_NextPtr = ptr;
|
||||
rd->m_RP.m_RendNumVerts += mNumVerts;
|
||||
|
||||
CREClientPoly2D::mRS.NumVerts += rd->m_RP.m_RendNumVerts - savev;
|
||||
CREClientPoly2D::mRS.NumIndices += rd->m_RP.m_RendNumIndices - savei;
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
|
||||
SClientPolyStat2D CREClientPoly2D::mRS;
|
||||
|
||||
void CREClientPoly2D::mfPrintStat()
|
||||
{
|
||||
/* char str[1024];
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Indices: %i\n", mRS.NumIndices);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Verts: %i\n", mRS.NumVerts);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Render Client Polys: %i\n", mRS.NumRendPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Occluded Client Polys: %i\n", mRS.NumOccPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
gRenDev->mfPrintString ("\nClient Polygons status info:\n", PS_TRANSPARENT | PS_UP);*/
|
||||
}
|
||||
47
RenderDll/Common/RendElements/CREClientPoly2D.h
Normal file
47
RenderDll/Common/RendElements/CREClientPoly2D.h
Normal file
@@ -0,0 +1,47 @@
|
||||
|
||||
#ifndef __CRECLIENTPOLY2D_H__
|
||||
#define __CRECLIENTPOLY2D_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
struct SClientPolyStat2D
|
||||
{
|
||||
int NumOccPolys;
|
||||
int NumRendPolys;
|
||||
int NumVerts;
|
||||
int NumIndices;
|
||||
};
|
||||
|
||||
|
||||
class CREClientPoly2D : public CRendElement
|
||||
{
|
||||
public:
|
||||
SShader *mEf;
|
||||
SRenderShaderResources *m_pShaderResources;
|
||||
short mNumVerts;
|
||||
short mNumIndices;
|
||||
SColorVert2D mVerts[16];
|
||||
byte mIndices[(16-2)*3];
|
||||
|
||||
static SClientPolyStat2D mRS;
|
||||
static void mfPrintStat();
|
||||
|
||||
public:
|
||||
CREClientPoly2D()
|
||||
{
|
||||
mfSetType(eDATA_ClientPoly2D);
|
||||
mNumVerts = 0;
|
||||
mEf = NULL;
|
||||
m_pShaderResources = NULL;
|
||||
mfUpdateFlags(FCEF_TRANSFORM | FCEF_NEEDFILLBUF);
|
||||
}
|
||||
|
||||
virtual ~CREClientPoly2D() {};
|
||||
|
||||
virtual void mfPrepare();
|
||||
virtual CRendElement *mfCopyConstruct(void);
|
||||
|
||||
static TArray<CREClientPoly2D *> mPolysStorage;
|
||||
};
|
||||
|
||||
#endif // __CRECLIENTPOLY2D_H__
|
||||
17
RenderDll/Common/RendElements/CREDummy.cpp
Normal file
17
RenderDll/Common/RendElements/CREDummy.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
|
||||
void CREDummy::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
bool CREDummy::mfDraw(SShader *ef, SShaderPass *sfm)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
240
RenderDll/Common/RendElements/CREFlares.cpp
Normal file
240
RenderDll/Common/RendElements/CREFlares.cpp
Normal file
@@ -0,0 +1,240 @@
|
||||
/*=============================================================================
|
||||
CFlare.cpp : implementation of light coronas and flares RE.
|
||||
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
|
||||
|
||||
Revision history:
|
||||
* Created by Honitch Andrey
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
|
||||
#include "RenderPCH.h"
|
||||
|
||||
void CopyLightStyle(int dest, int src);
|
||||
|
||||
//===============================================================
|
||||
|
||||
CRendElement *CREFlareProp::mfCreateWorldRE(SShader *ef, SInpData *ds)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
bool CREFlareGeom::mfCullFlare(CCObject *obj, CREFlareProp *fp)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//========================================================================================
|
||||
|
||||
// Parsing
|
||||
|
||||
bool CREFlareProp::mfCompile(SShader *ef, char *scr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CREFlare::mfCompile(SShader *ef, char *scr)
|
||||
{
|
||||
char* name;
|
||||
long cmd;
|
||||
char *params;
|
||||
char *data;
|
||||
|
||||
enum {eMap = 1, eScale, eRGBStyle, eBlind, eColor, eDistFactor, eDistIntensityFactor, eMinLight, eSizeBlindScale, eSizeBlindBias, eIntensBlindScale, eIntensBlindBias, eLayer, eImportance, eFadeTime, eVisAreaScale};
|
||||
static tokenDesc commands[] =
|
||||
{
|
||||
{eRGBStyle, "RGBStyle"},
|
||||
{eScale, "Scale"},
|
||||
{eBlind, "Blind"},
|
||||
{eSizeBlindScale, "SizeBlindScale"},
|
||||
{eSizeBlindBias, "SizeBlindBias"},
|
||||
{eIntensBlindScale, "IntensBlindScale"},
|
||||
{eIntensBlindBias, "IntensBlindBias"},
|
||||
{eMinLight, "MinLight"},
|
||||
{eDistFactor, "DistFactor"},
|
||||
{eDistIntensityFactor, "DistIntensityFactor"},
|
||||
{eMap, "Map"},
|
||||
{eFadeTime, "FadeTime"},
|
||||
{eColor, "Color"},
|
||||
{eLayer, "Layer"},
|
||||
{eImportance, "Importance"},
|
||||
{eVisAreaScale, "VisAreaScale"},
|
||||
{0, 0},
|
||||
};
|
||||
|
||||
CFColor col;
|
||||
while ((cmd = shGetObject (&scr, commands, &name, ¶ms)) > 0)
|
||||
{
|
||||
data = NULL;
|
||||
if (name)
|
||||
data = name;
|
||||
else
|
||||
if (params)
|
||||
data = params;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case eMap:
|
||||
m_Map = (STexPic *)gRenDev->EF_LoadTexture(data, FT_NORESIZE, 0, eTT_Base);
|
||||
break;
|
||||
|
||||
case eColor:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing Color argument for Light Stage in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
shGetColor(data, m_fColor);
|
||||
break;
|
||||
|
||||
case eRGBStyle:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing RgbStyle argument for Light Stage in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
if (!stricmp(data, "Poly"))
|
||||
m_eLightRGB = eLIGHT_Poly;
|
||||
else
|
||||
if (!stricmp(data, "Identity"))
|
||||
m_eLightRGB = eLIGHT_Identity;
|
||||
else
|
||||
if (!strnicmp(data, "FromObj", 7) || !stricmp(data, "FromLight"))
|
||||
m_eLightRGB = eLIGHT_Object;
|
||||
else
|
||||
if (!stricmp(data, "LightStyle"))
|
||||
{
|
||||
m_eLightRGB = eLIGHT_Style;
|
||||
m_Color = CFColor(1.0f);
|
||||
if (!params || !params[0])
|
||||
{
|
||||
Warning( 0,0,"missing RgbStyle LightStyle value in Shader '%s' (use 0)\n", ef->m_Name.c_str());
|
||||
m_LightStyle = 0;
|
||||
}
|
||||
else
|
||||
m_LightStyle = shGetInt(params);
|
||||
}
|
||||
else
|
||||
if (!stricmp(data, "Fixed"))
|
||||
{
|
||||
m_eLightRGB = eLIGHT_Fixed;
|
||||
if (!params || !params[0])
|
||||
{
|
||||
Warning( 0,0,"missing RgbStyle Fixed value in Shader '%s' (use 1.0)\n", ef->m_Name.c_str());
|
||||
m_Color = CFColor(1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
CFColor col;
|
||||
shGetColor(params, col);
|
||||
m_Color = col;
|
||||
}
|
||||
}
|
||||
else
|
||||
m_eLightRGB = eLIGHT_Identity;
|
||||
break;
|
||||
|
||||
case eScale:
|
||||
if (!name)
|
||||
m_fScaleCorona = shGetFloat(data);
|
||||
else
|
||||
{
|
||||
TArray<SParam> Params;
|
||||
gRenDev->m_cEF.mfCompileParam(params, ef, &Params);
|
||||
if (Params.Num())
|
||||
m_pScaleCoronaParams = Params[0].m_Comps[0];
|
||||
}
|
||||
break;
|
||||
|
||||
case eBlind:
|
||||
m_bBlind = true;
|
||||
break;
|
||||
|
||||
case eImportance:
|
||||
m_Importance = shGetInt(data);
|
||||
break;
|
||||
|
||||
case eFadeTime:
|
||||
m_fFadeTime = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eSizeBlindScale:
|
||||
m_fSizeBlindScale = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eSizeBlindBias:
|
||||
m_fSizeBlindBias = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eIntensBlindScale:
|
||||
m_fIntensBlindScale = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eIntensBlindBias:
|
||||
m_fIntensBlindBias = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eMinLight:
|
||||
m_fMinLight = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eDistFactor:
|
||||
m_fDistSizeFactor = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eVisAreaScale:
|
||||
m_fVisAreaScale = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eDistIntensityFactor:
|
||||
m_fDistIntensityFactor = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eLayer:
|
||||
{
|
||||
if (!m_Pass)
|
||||
m_Pass = new SShaderPassHW;
|
||||
gRenDev->m_cEF.mfCompileLayer(ef, 0, params, m_Pass);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CREFlare::mfPrepare(void)
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
|
||||
switch(m_eLightRGB)
|
||||
{
|
||||
case eLIGHT_Identity:
|
||||
m_Color = CFColor(1.0f);
|
||||
break;
|
||||
case eLIGHT_Style:
|
||||
{
|
||||
if (m_LightStyle>=0 && m_LightStyle<CLightStyle::m_LStyles.Num() && CLightStyle::m_LStyles[m_LightStyle])
|
||||
{
|
||||
CLightStyle *ls = CLightStyle::m_LStyles[m_LightStyle];
|
||||
ls->mfUpdate(gRenDev->m_RP.m_RealTime);
|
||||
m_Color = m_fColor * ls->m_fIntensity;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case eLIGHT_Object:
|
||||
if (gRenDev->m_RP.m_pCurObject)
|
||||
m_Color = gRenDev->m_RP.m_pCurObject->m_Color;
|
||||
else
|
||||
m_Color = CFColor(1.0f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
190
RenderDll/Common/RendElements/CREFlares.h
Normal file
190
RenderDll/Common/RendElements/CREFlares.h
Normal file
@@ -0,0 +1,190 @@
|
||||
|
||||
#ifndef __CREFLARES_H__
|
||||
#define __CREFLARES_H__
|
||||
|
||||
//=================================================
|
||||
// Flares
|
||||
|
||||
struct SFlareFrame
|
||||
{
|
||||
int mFrame;
|
||||
float mDecayTime;
|
||||
bool mbVis;
|
||||
int mX;
|
||||
int mY;
|
||||
float mDepth;
|
||||
CFColor mColor;
|
||||
float mScale;
|
||||
};
|
||||
|
||||
class CREFlareProp;
|
||||
|
||||
class CREFlareGeom : public CRendElement
|
||||
{
|
||||
friend class CRender3D;
|
||||
|
||||
public:
|
||||
SFlareFrame mFlareFr[8];
|
||||
CFColor mColor;
|
||||
Vec3d mNormal;
|
||||
int mLightStyle;
|
||||
int mDLightStyle;
|
||||
float mBreakTime;
|
||||
float mEndBreakTime;
|
||||
|
||||
float mfGetScale(float rtime)
|
||||
{
|
||||
float scale = 1.0f;
|
||||
|
||||
if (mBreakTime && rtime+0.01>=mBreakTime && mEndBreakTime>rtime)
|
||||
{
|
||||
float time = rtime - mBreakTime;
|
||||
|
||||
if (time<0.25)
|
||||
{
|
||||
scale = 1 - time*4;
|
||||
}
|
||||
else
|
||||
{
|
||||
time = mEndBreakTime - rtime;
|
||||
if (time<1)
|
||||
scale= 1 - time;
|
||||
else
|
||||
scale = 0;
|
||||
}
|
||||
return scale;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
CREFlareGeom()
|
||||
{
|
||||
mfSetType(eDATA_FlareGeom);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
}
|
||||
virtual ~CREFlareGeom()
|
||||
{
|
||||
}
|
||||
|
||||
void mfCheckVis(CFColor &col, CCObject *obj);
|
||||
bool mfCullFlare(CCObject *obj, CREFlareProp *fp);
|
||||
};
|
||||
|
||||
enum ELightRGB
|
||||
{
|
||||
eLIGHT_Identity,
|
||||
eLIGHT_Fixed,
|
||||
eLIGHT_Poly,
|
||||
eLIGHT_Style,
|
||||
eLIGHT_Object,
|
||||
};
|
||||
|
||||
enum EEmitLight
|
||||
{
|
||||
eEMIT_Poly,
|
||||
eEMIT_Point,
|
||||
};
|
||||
|
||||
|
||||
class CREFlareProp : public CRendElement
|
||||
{
|
||||
friend class CRender3D;
|
||||
|
||||
public:
|
||||
SShader *FlareShader;
|
||||
ELightRGB eLightRGB;
|
||||
float LightColorScale;
|
||||
CFColor LightColor;
|
||||
int LightStyle;
|
||||
float offsLight;
|
||||
EEmitLight eLightEmit;
|
||||
|
||||
CREFlareProp()
|
||||
{
|
||||
mfSetType(eDATA_FlareProp);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
LightColorScale = 1;
|
||||
eLightEmit = eEMIT_Point;
|
||||
LightStyle = 0;
|
||||
FlareShader = 0;
|
||||
eLightRGB = eLIGHT_Identity;
|
||||
}
|
||||
virtual ~CREFlareProp()
|
||||
{
|
||||
}
|
||||
virtual bool mfCompile(SShader *ef, char *scr);
|
||||
virtual CRendElement *mfCreateWorldRE(SShader *ef, SInpData *ds);
|
||||
};
|
||||
|
||||
|
||||
class CREFlare : public CRendElement
|
||||
{
|
||||
friend class CRender3D;
|
||||
friend class CGLRenderer;
|
||||
|
||||
public:
|
||||
Vec3d mNormal;
|
||||
float m_fScaleCorona;
|
||||
SParamComp *m_pScaleCoronaParams;
|
||||
float m_fMinLight;
|
||||
float m_fDistSizeFactor;
|
||||
float m_fDistIntensityFactor;
|
||||
bool m_bBlind;
|
||||
float m_fSizeBlindBias;
|
||||
float m_fSizeBlindScale;
|
||||
float m_fIntensBlindBias;
|
||||
float m_fIntensBlindScale;
|
||||
float m_fFadeTime;
|
||||
float m_fVisAreaScale;
|
||||
STexPic *m_Map;
|
||||
ELightRGB m_eLightRGB;
|
||||
int m_LightStyle;
|
||||
CFColor m_fColor;
|
||||
int m_UpdateFrame;
|
||||
int m_nFrameQuery;
|
||||
SShaderPassHW *m_Pass;
|
||||
int m_Importance;
|
||||
|
||||
CREFlare()
|
||||
{
|
||||
mfSetType(eDATA_Flare);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
m_Map = NULL;
|
||||
m_fMinLight = 0.0f;
|
||||
m_eLightRGB = eLIGHT_Identity;
|
||||
m_fColor = Col_White;
|
||||
m_UpdateFrame = -1;
|
||||
m_fDistSizeFactor = 1.0f;
|
||||
m_fDistIntensityFactor = 1.0f;
|
||||
m_fSizeBlindBias = 0;
|
||||
m_nFrameQuery = -1;
|
||||
m_fSizeBlindScale = 1.0f;
|
||||
m_fIntensBlindBias = 0;
|
||||
m_fIntensBlindScale = 1.0f;
|
||||
m_fVisAreaScale = 1.0f;
|
||||
m_fFadeTime = -1.0f;
|
||||
m_bBlind = false;
|
||||
m_fScaleCorona = 0.6f;
|
||||
m_pScaleCoronaParams = NULL;
|
||||
m_Pass = NULL;
|
||||
m_Importance = 1;
|
||||
}
|
||||
virtual ~CREFlare()
|
||||
{
|
||||
if (m_Map)
|
||||
{
|
||||
m_Map->Release(false);
|
||||
m_Map = NULL;
|
||||
}
|
||||
SAFE_DELETE(m_Pass);
|
||||
}
|
||||
virtual bool mfCompile(SShader *ef, char *scr);
|
||||
virtual void mfPrepare(void);
|
||||
virtual bool mfDraw(SShader *ef, SShaderPass *sfm);
|
||||
|
||||
void mfDrawCorona(SShader *ef, CFColor &col);
|
||||
void mfDrawFlares(SShader *ef, CFColor &col);
|
||||
bool mfCheckVis(CCObject *obj);
|
||||
};
|
||||
|
||||
#endif // __CREFLARES_H__
|
||||
17
RenderDll/Common/RendElements/CREFlashBang.cpp
Normal file
17
RenderDll/Common/RendElements/CREFlashBang.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
|
||||
#if !defined(LINUX)
|
||||
|
||||
void CREFlashBang::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_FlagsPerFlush |= RBSI_DRAWAS2D;
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
#endif // !defined(LINUX)
|
||||
24
RenderDll/Common/RendElements/CREGlare.cpp
Normal file
24
RenderDll/Common/RendElements/CREGlare.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
|
||||
void CREGlare:: mfInit()
|
||||
{
|
||||
m_GlareWidth = 128;
|
||||
m_GlareHeight = 128;
|
||||
m_fGlareAmount=0;
|
||||
|
||||
mfSetType(eDATA_Glare);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
}
|
||||
|
||||
|
||||
void CREGlare::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 4;
|
||||
gRenDev->m_RP.m_FirstVertex = 0;
|
||||
}
|
||||
|
||||
39
RenderDll/Common/RendElements/CREGlare.h
Normal file
39
RenderDll/Common/RendElements/CREGlare.h
Normal file
@@ -0,0 +1,39 @@
|
||||
|
||||
#ifndef __CREGLARE_H__
|
||||
#define __CREGLARE_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
struct SByteColor
|
||||
{
|
||||
byte r,g,b,a;
|
||||
};
|
||||
|
||||
struct SLongColor
|
||||
{
|
||||
unsigned long r,g,b,a;
|
||||
};
|
||||
|
||||
class CREGlare : public CRendElement
|
||||
{
|
||||
public:
|
||||
int m_GlareWidth;
|
||||
int m_GlareHeight;
|
||||
float m_fGlareAmount;
|
||||
|
||||
public:
|
||||
CREGlare()
|
||||
{
|
||||
mfInit();
|
||||
}
|
||||
void mfInit();
|
||||
|
||||
virtual ~CREGlare()
|
||||
{
|
||||
}
|
||||
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfDraw(SShader *ef, SShaderPass *sfm);
|
||||
};
|
||||
|
||||
#endif // __CREGLARE_H__
|
||||
43
RenderDll/Common/RendElements/CREHDRProcess.cpp
Normal file
43
RenderDll/Common/RendElements/CREHDRProcess.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
=======================================================================
|
||||
FILE : CREHDRProcess.cpp
|
||||
DESC : HDR processing render element
|
||||
PROJ : Crytek Engine
|
||||
CODER: Andrey Honich
|
||||
|
||||
=======================================================================
|
||||
*/
|
||||
|
||||
#include "RenderPCH.h"
|
||||
|
||||
|
||||
// constructor/destructor
|
||||
CREHDRProcess::CREHDRProcess()
|
||||
{
|
||||
// setup screen process renderer type
|
||||
mfSetType(eDATA_HDRProcess);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
}
|
||||
|
||||
CREHDRProcess::~CREHDRProcess()
|
||||
{
|
||||
};
|
||||
|
||||
// prepare screen processing
|
||||
void CREHDRProcess:: mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_FlagsPerFlush |= RBSI_DRAWAS2D;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
void CREHDRProcess::mfReset()
|
||||
{
|
||||
}
|
||||
|
||||
void CREHDRProcess::mfActivate(int iProcess)
|
||||
{
|
||||
}
|
||||
39
RenderDll/Common/RendElements/CREHDRProcess.h
Normal file
39
RenderDll/Common/RendElements/CREHDRProcess.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
=====================================================================
|
||||
FILE : CREHDRProcess.h
|
||||
DESC : HDR processing render element
|
||||
PROJ : Crytek Engine
|
||||
CODER: Andrey Honich
|
||||
|
||||
=====================================================================
|
||||
*/
|
||||
|
||||
#ifndef __CREHDRPROCESS_H__
|
||||
#define __CREHDRPROCESS_H__
|
||||
|
||||
|
||||
// screen processing render element
|
||||
class CREHDRProcess : public CRendElement
|
||||
{
|
||||
friend class CD3D9Renderer;
|
||||
friend class CGLRenderer;
|
||||
|
||||
public:
|
||||
|
||||
// constructor/destructor
|
||||
CREHDRProcess();
|
||||
|
||||
virtual ~CREHDRProcess();
|
||||
|
||||
// prepare screen processing
|
||||
virtual void mfPrepare();
|
||||
// render screen processing
|
||||
virtual bool mfDraw(SShader *ef, SShaderPass *sfm);
|
||||
|
||||
// begin screen processing
|
||||
virtual void mfActivate(int iProcess);
|
||||
// reset
|
||||
virtual void mfReset(void);
|
||||
};
|
||||
|
||||
#endif
|
||||
31
RenderDll/Common/RendElements/CREHeat.h
Normal file
31
RenderDll/Common/RendElements/CREHeat.h
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
#ifndef __CREHEAT_H__
|
||||
#define __CREHEAT_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
|
||||
class CREHeat : public CRendElement
|
||||
{
|
||||
public:
|
||||
int m_HeatWidth;
|
||||
int m_HeatHeight;
|
||||
|
||||
public:
|
||||
CREHeat()
|
||||
{
|
||||
m_HeatWidth = CRenderer::CV_r_heatsize;
|
||||
m_HeatHeight = CRenderer::CV_r_heatsize;
|
||||
mfSetType(eDATA_Heat);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
}
|
||||
|
||||
virtual ~CREHeat()
|
||||
{
|
||||
}
|
||||
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfDraw(SShader *ef, SShadeLayer *sfm);
|
||||
};
|
||||
|
||||
#endif // __CREHEAT_H__
|
||||
96
RenderDll/Common/RendElements/CREMotionBlur.cpp
Normal file
96
RenderDll/Common/RendElements/CREMotionBlur.cpp
Normal file
@@ -0,0 +1,96 @@
|
||||
#if !defined(LINUX)
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "RendElement.h"
|
||||
#include "CREMotionBlur.h"
|
||||
|
||||
#ifdef OPENGL
|
||||
#include "..\..\XRenderOGL\GL_Renderer.h"
|
||||
#endif
|
||||
|
||||
void CREMotionBlur::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_DynLMask |= m_DynMask;
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
bool CREMotionBlur::mfDraw(SShader *ef, SShaderPass *sfm)
|
||||
{
|
||||
gRenDev->ResetToDefault();
|
||||
|
||||
static int counter=0;
|
||||
|
||||
gRenDev->EnableBlend(true);
|
||||
gRenDev->SetBlendMode();
|
||||
gRenDev->Set2DMode(true,100,100);
|
||||
gRenDev->EnableDepthWrites(false);
|
||||
gRenDev->EnableDepthTest(false);
|
||||
|
||||
for(int pass=-1; pass>-16 ; pass--)
|
||||
{
|
||||
if(!sfm->m_TUnits[0]->mfSetTexture(counter+pass))
|
||||
break;
|
||||
|
||||
gRenDev->SetEnviMode(R_MODE_MODULATE);
|
||||
gRenDev->SetMaterialColor(1,1,1,1.f/(float)fabs(pass+1));
|
||||
|
||||
struct_VERTEX_FORMAT_P3F_TEX2F data[] =
|
||||
{
|
||||
100, 100, 0, 1,1.f-1,
|
||||
100, 0, 0, 1,1.f-0,
|
||||
0, 100, 0, 0,1.f-1,
|
||||
0, 0, 0, 0,1.f-0,
|
||||
};
|
||||
|
||||
gRenDev->PushMatrix();
|
||||
gRenDev->TranslateMatrix(Vec3d(50,50,0));
|
||||
|
||||
// scale
|
||||
if(m_nEffectType == 1)
|
||||
{
|
||||
float scale = 1.0f-(float)fabs(pass/16.f)/3.0f;
|
||||
gRenDev->ScaleMatrix(scale,scale,0);
|
||||
}
|
||||
if(m_nEffectType == 2)
|
||||
{
|
||||
float scale = 1.f+(float)fabs(pass/16.f)/3;
|
||||
gRenDev->ScaleMatrix(scale,scale,0);
|
||||
}
|
||||
// rotation
|
||||
else if(m_nEffectType == 3)
|
||||
{
|
||||
gRenDev->RotateMatrix(Vec3d(0,0,pass&1 ? (float)fabs(pass/16.f)*4.0f : -(float)fabs(pass/16.f)*4.0f));
|
||||
}
|
||||
else if(m_nEffectType == 4)
|
||||
{
|
||||
gRenDev->RotateMatrix(Vec3d(0,0,pass&1 ? (float)fabs(pass/16.f)*40 : -(float)fabs(pass/16.f)*40));
|
||||
}
|
||||
// translation
|
||||
else if(m_nEffectType == 5)
|
||||
{
|
||||
gRenDev->TranslateMatrix(Vec3d(pass&1 ? (float)fabs(pass/16.f)*4.0f : -(float)fabs(pass/16.f)*4.0f,0,0));
|
||||
}
|
||||
else if(m_nEffectType == 6)
|
||||
{
|
||||
gRenDev->TranslateMatrix(Vec3d(0,pass&1 ? (float)fabs(pass/16.f)*4.0f : -(float)fabs(pass/16.f)*4.0f,0));
|
||||
}
|
||||
|
||||
gRenDev->TranslateMatrix(Vec3d(-50,-50,0));
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),4);
|
||||
gRenDev->PopMatrix();
|
||||
}
|
||||
|
||||
counter++;
|
||||
|
||||
gRenDev->Set2DMode(false,100,100);
|
||||
gRenDev->ResetToDefault();
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif // !defined(LINUX)
|
||||
2060
RenderDll/Common/RendElements/CREOcLeaf.cpp
Normal file
2060
RenderDll/Common/RendElements/CREOcLeaf.cpp
Normal file
File diff suppressed because it is too large
Load Diff
756
RenderDll/Common/RendElements/CREOcean.cpp
Normal file
756
RenderDll/Common/RendElements/CREOcean.cpp
Normal file
@@ -0,0 +1,756 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
#include "CREOcean.h"
|
||||
#include "../NvTriStrip/NVTriStrip.h"
|
||||
#include "I3dengine.h"
|
||||
|
||||
SREOceanStats CREOcean::m_RS;
|
||||
CREOcean *CREOcean::m_pStaticOcean = NULL;
|
||||
|
||||
DEFINE_ALIGNED_DATA( float, CREOcean::m_HX[OCEANGRID][OCEANGRID], 16 );
|
||||
DEFINE_ALIGNED_DATA( float, CREOcean::m_HY[OCEANGRID][OCEANGRID], 16 );
|
||||
|
||||
DEFINE_ALIGNED_DATA( float, CREOcean::m_NX[OCEANGRID][OCEANGRID], 16 );
|
||||
DEFINE_ALIGNED_DATA( float, CREOcean::m_NY[OCEANGRID][OCEANGRID], 16 );
|
||||
|
||||
DEFINE_ALIGNED_DATA( float, CREOcean::m_DX[OCEANGRID][OCEANGRID], 16 );
|
||||
DEFINE_ALIGNED_DATA( float, CREOcean::m_DY[OCEANGRID][OCEANGRID], 16 );
|
||||
|
||||
CREOcean::~CREOcean()
|
||||
{
|
||||
m_pStaticOcean = NULL;
|
||||
if (m_pBuffer)
|
||||
{
|
||||
gRenDev->ReleaseBuffer(m_pBuffer);
|
||||
m_pBuffer = NULL;
|
||||
}
|
||||
SAFE_DELETE_ARRAY(m_HMap);
|
||||
for (int i=0; i<NUM_LODS; i++)
|
||||
{
|
||||
m_pIndices[i].Free();
|
||||
}
|
||||
}
|
||||
|
||||
float CREOcean::GetWaterZElevation(float fX, float fY)
|
||||
{
|
||||
if (!m_HMap)
|
||||
return 0;
|
||||
CRenderer *r = gRenDev;
|
||||
I3DEngine *eng = (I3DEngine *)iSystem->GetI3DEngine();
|
||||
float fSize = (float)CRenderer::CV_r_oceansectorsize;
|
||||
float fHeightScale = (float)CRenderer::CV_r_oceanheightscale;
|
||||
float fWaterLevel = eng->GetWaterLevel();
|
||||
float fHScale = fabsf(gRenDev->m_RP.m_ViewOrg.z-fWaterLevel);
|
||||
float fMaxDist = eng->GetMaxViewDistance() / 1.0f;
|
||||
float fGrid = (float)OCEANGRID;
|
||||
|
||||
float fZH = GetHMap(fX, fY);
|
||||
if (fZH >= fWaterLevel)
|
||||
return fWaterLevel;
|
||||
|
||||
float fXPart = fX / fSize;
|
||||
float fYPart = fY / fSize;
|
||||
float fXLerp = (fXPart - (int)fXPart) * fGrid;
|
||||
float fYLerp = (fYPart - (int)fYPart) * fGrid;
|
||||
int nXMin = (int)fXLerp;
|
||||
int nXMax = nXMin+1;
|
||||
int nYMin = (int)fYLerp;
|
||||
int nYMax = nYMin+1;
|
||||
fXLerp = fXLerp - (int)fXLerp;
|
||||
fYLerp = fYLerp - (int)fYLerp;
|
||||
|
||||
if (fHScale < 5.0f)
|
||||
fHScale = LERP(0.1f, 0.5f, fHScale/5.0f);
|
||||
else
|
||||
if (fHScale < 20)
|
||||
fHScale = LERP(0.5f, 1.0f, (fHScale-5.0f)/15.0f);
|
||||
else
|
||||
fHScale = 1.0f;
|
||||
|
||||
float fZ00 = -m_HX[nYMin][nXMin] * fHScale;
|
||||
float fZ01 = -m_HX[nYMin][nXMax] * fHScale;
|
||||
float fZ10 = -m_HX[nYMax][nXMin] * fHScale;
|
||||
float fZ11 = -m_HX[nYMax][nXMax] * fHScale;
|
||||
float fZ0 = LERP(fZ00, fZ01, fXLerp);
|
||||
float fZ1 = LERP(fZ10, fZ11, fXLerp);
|
||||
float fZ = LERP(fZ0, fZ1, fYLerp);
|
||||
//fZ *= fHeightScale;
|
||||
|
||||
float fHeightDelta = fWaterLevel - fZH;
|
||||
fHeightScale *= CLAMP(fHeightDelta * 0.066f, 0, 1);
|
||||
|
||||
return fZ * fHeightScale + fWaterLevel;
|
||||
}
|
||||
|
||||
void CREOcean::PrepareHMap()
|
||||
{
|
||||
int nDim=0;
|
||||
|
||||
I3DEngine *eng = (I3DEngine *)iSystem->GetI3DEngine();
|
||||
m_nHMUnitSize = eng->GetHeightMapUnitSize();
|
||||
int nExp = 8;
|
||||
m_fExpandHMap = (float)nExp;
|
||||
m_fExpandHM = (float)m_nHMUnitSize * (float)nExp;
|
||||
m_fInvHMUnitSize = 1.0f / (float)m_nHMUnitSize;
|
||||
m_fTerrainSize = (float)eng->GetTerrainSize();
|
||||
eng->MakeUnderWaterSmoothHMap(m_nHMUnitSize);
|
||||
ushort *shm = eng->GetUnderWaterSmoothHMap(nDim);
|
||||
|
||||
if(!nDim)
|
||||
return; // terrain not present
|
||||
|
||||
float fWaterLevel = eng->GetWaterLevel();
|
||||
|
||||
if (m_HMap)
|
||||
delete [] m_HMap;
|
||||
int nDimO = nDim+nExp*2;
|
||||
m_nHMapSize = nDimO;
|
||||
m_HMap = new float [nDimO*nDimO];
|
||||
float f;
|
||||
for (int y=-nExp; y<nDim+nExp; y++)
|
||||
{
|
||||
for (int x=-nExp; x<nDim+nExp; x++)
|
||||
{
|
||||
if (x>0 && x<nDim-1 && y>0 && y<nDim-1)
|
||||
m_HMap[(y+nExp)*nDimO+x+nExp] = (float)shm[y*nDim+x] / 256.0f;
|
||||
else
|
||||
{
|
||||
int nX = x;
|
||||
int nY = y;
|
||||
float fLerpX = -1.0f;
|
||||
float fLerpY = -1.0f;
|
||||
|
||||
if (nX<=0)
|
||||
nX = 1;
|
||||
else
|
||||
if (nX>=nDim-1)
|
||||
nX = nDim-2;
|
||||
|
||||
if (nY<=0)
|
||||
nY = 1;
|
||||
else
|
||||
if (nY>=nDim-1)
|
||||
nY = nDim-2;
|
||||
|
||||
f = (float)shm[nY*nDim+nX] / 256.0f;
|
||||
|
||||
if (nX != x)
|
||||
fLerpX = 1.0f - fabsf((float)(nX-x)) / (float)(nExp+1);
|
||||
if (nY != y)
|
||||
fLerpY = 1.0f - fabsf((float)(nY-y)) / (float)(nExp+1);
|
||||
|
||||
float fX, fY;
|
||||
|
||||
if (fLerpX >= 0)
|
||||
fX = LERP(fWaterLevel/2.0f, f, fLerpX);
|
||||
if (fLerpY >= 0)
|
||||
fY = LERP(fWaterLevel/2.0f, f, fLerpY);
|
||||
if (fLerpX >= 0 && fLerpY >= 0)
|
||||
m_HMap[(y+nExp)*nDimO+x+nExp] = (fX + fY) / 2.0f;
|
||||
else
|
||||
if (fLerpX >= 0)
|
||||
m_HMap[(y+nExp)*nDimO+x+nExp] = fX;
|
||||
else
|
||||
if (fLerpY >= 0)
|
||||
m_HMap[(y+nExp)*nDimO+x+nExp] = fY;
|
||||
else
|
||||
m_HMap[(y+nExp)*nDimO+x+nExp] = f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CREOcean::mfPrepare()
|
||||
{
|
||||
CRenderer *rd = gRenDev;
|
||||
|
||||
if (m_nFrameLoad != rd->m_nFrameLoad)
|
||||
{
|
||||
m_nFrameLoad = rd->m_nFrameLoad;
|
||||
PrepareHMap();
|
||||
}
|
||||
|
||||
rd->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
Update(rd->m_RP.m_RealTime * m_fSpeed);
|
||||
|
||||
double time0 = 0;
|
||||
ticks(time0);
|
||||
|
||||
I3DEngine *eng = (I3DEngine *)iSystem->GetI3DEngine();
|
||||
float fWaterLevel = eng->GetWaterLevel();
|
||||
float fHScale = fabsf(gRenDev->m_RP.m_ViewOrg.z-fWaterLevel);
|
||||
if (fHScale < 5.0f)
|
||||
fHScale = LERP(0.1f, 0.5f, fHScale/5.0f);
|
||||
else
|
||||
if (fHScale < 20)
|
||||
fHScale = LERP(0.5f, 1.0f, (fHScale-5.0f)/15.0f);
|
||||
else
|
||||
fHScale = 1.0f;
|
||||
m_MinBound.Set(9999.0f, 9999.0f, 9999.0f);
|
||||
m_MaxBound.Set(-9999.0f, -9999.0f, -9999.0f);
|
||||
|
||||
if (!m_pBuffer)
|
||||
m_pBuffer = gRenDev->CreateBuffer((OCEANGRID+1)*(OCEANGRID+1), VERTEX_FORMAT_P3F_N, "Ocean", true);
|
||||
rd->UpdateBuffer(m_pBuffer, NULL, 0, 0, 0, 1);
|
||||
|
||||
static const float fScale = 1.0f / (float)OCEANGRID;
|
||||
|
||||
struct_VERTEX_FORMAT_P3F_N *pVertices = (struct_VERTEX_FORMAT_P3F_N *)m_pBuffer->m_VS[VSF_GENERAL].m_VData;
|
||||
for(int vy=0; vy<OCEANGRID+1; vy++)
|
||||
{
|
||||
int y = vy & (OCEANGRID-1);
|
||||
for(int vx=0; vx<(OCEANGRID+1); vx++)
|
||||
{
|
||||
int x = vx & (OCEANGRID-1);
|
||||
m_Pos[vy][vx][0] = vx * fScale + m_DX[y][x] * m_fChoppyWaveFactor;
|
||||
m_Pos[vy][vx][1] = vy * fScale + m_DY[y][x] * m_fChoppyWaveFactor;
|
||||
pVertices->xyz.x = m_Pos[vy][vx][0];
|
||||
pVertices->xyz.y = m_Pos[vy][vx][1];
|
||||
float fZ = -m_HX[y][x] * fHScale;
|
||||
pVertices->xyz.z = fZ;
|
||||
m_MinBound.x = min(m_Pos[vy][vx][0], m_MinBound.x);
|
||||
m_MinBound.y = min(m_Pos[vy][vx][1], m_MinBound.y);
|
||||
m_MinBound.z = min(fZ, m_MinBound.z);
|
||||
|
||||
m_MaxBound.x = max(m_Pos[vy][vx][0], m_MaxBound.x);
|
||||
m_MaxBound.y = max(m_Pos[vy][vx][1], m_MaxBound.y);
|
||||
m_MaxBound.z = max(fZ, m_MaxBound.z);
|
||||
|
||||
m_Normals[vy][vx] = Vec3d(m_NX[y][x], m_NY[y][x], 64.0f);
|
||||
pVertices->normal = m_Normals[vy][vx];
|
||||
m_Normals[vy][vx].NormalizeFast();
|
||||
|
||||
pVertices++;
|
||||
}
|
||||
}
|
||||
unticks(time0);
|
||||
m_RS.m_StatsTimeUpdateVerts = (float)(time0*1000.0*g_SecondsPerCycle);
|
||||
|
||||
UpdateTexture();
|
||||
|
||||
rd->m_RP.m_pRE = this;
|
||||
rd->m_RP.m_RendNumIndices = 0;
|
||||
rd->m_RP.m_RendNumVerts = (OCEANGRID+1)*(OCEANGRID+1);
|
||||
rd->m_RP.m_FirstVertex = 0;
|
||||
}
|
||||
|
||||
int CREOcean::GetLOD(Vec3d camera, Vec3d pos)
|
||||
{
|
||||
float dist = (pos-camera).GetLength();
|
||||
dist /= CRenderer::CV_r_oceanloddist;
|
||||
|
||||
return (int)CLAMP(dist, 0.0f, (float)(NUM_LODS-1));
|
||||
}
|
||||
|
||||
void *CREOcean::mfGetPointer(ESrcPointer ePT, int *Stride, int Type, ESrcPointer Dst, int Flags)
|
||||
{
|
||||
|
||||
switch(ePT)
|
||||
{
|
||||
case eSrcPointer_Vert:
|
||||
{
|
||||
struct_VERTEX_FORMAT_P3F_N *pVertices = (struct_VERTEX_FORMAT_P3F_N *)m_pBuffer->m_VS[VSF_GENERAL].m_VData;
|
||||
*Stride = sizeof(struct_VERTEX_FORMAT_P3F_N);
|
||||
return &pVertices->xyz.x;
|
||||
}
|
||||
case eSrcPointer_Normal:
|
||||
{
|
||||
struct_VERTEX_FORMAT_P3F_N *pVertices = (struct_VERTEX_FORMAT_P3F_N *)m_pBuffer->m_VS[VSF_GENERAL].m_VData;
|
||||
*Stride = sizeof(struct_VERTEX_FORMAT_P3F_N);
|
||||
return &pVertices->normal.x;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void CREOcean::GenerateGeometry()
|
||||
{
|
||||
m_pBuffer = gRenDev->CreateBuffer((OCEANGRID+1)*(OCEANGRID+1), VERTEX_FORMAT_P3F_N, "Ocean", true);
|
||||
|
||||
for (int lod=0; lod<NUM_LODS; lod++)
|
||||
{
|
||||
int nl = 1<<lod;
|
||||
// set indices
|
||||
int iIndex = 0;
|
||||
int yStep = (OCEANGRID+1) * nl;
|
||||
for(int a=0; a<(OCEANGRID+1)-1; a+=nl )
|
||||
{
|
||||
for(int i=0; i<(OCEANGRID+1); i+=nl, iIndex+=nl )
|
||||
{
|
||||
m_pIndices[lod].AddElem(iIndex);
|
||||
m_pIndices[lod].AddElem(iIndex + yStep);
|
||||
}
|
||||
|
||||
int iNextIndex = (a+nl) * (OCEANGRID+1);
|
||||
|
||||
if(a < (OCEANGRID+1)-1-nl)
|
||||
{
|
||||
m_pIndices[lod].AddElem(iIndex + yStep - nl);
|
||||
m_pIndices[lod].AddElem(iNextIndex);
|
||||
}
|
||||
iIndex = iNextIndex;
|
||||
}
|
||||
m_pIndices[lod].Shrink();
|
||||
}
|
||||
}
|
||||
|
||||
void CREOcean::SmoothLods_r(SOceanSector *os, float fSize, int minLod)
|
||||
{
|
||||
if (os->m_Frame != gRenDev->m_cEF.m_Frame)
|
||||
return;
|
||||
if (os->nLod > minLod+1)
|
||||
{
|
||||
os->nLod = minLod+1;
|
||||
SOceanSector *osLeft;
|
||||
SOceanSector *osRight;
|
||||
SOceanSector *osTop;
|
||||
SOceanSector *osBottom;
|
||||
|
||||
// Left
|
||||
osLeft = GetSectorByPos(os->x-fSize, os->y, false);
|
||||
// Right
|
||||
osRight = GetSectorByPos(os->x+fSize, os->y, false);
|
||||
// Top
|
||||
osTop = GetSectorByPos(os->x, os->y-fSize, false);
|
||||
// Bottom
|
||||
osBottom = GetSectorByPos(os->x, os->y+fSize, false);
|
||||
if (osLeft)
|
||||
SmoothLods_r(osLeft, fSize, os->nLod);
|
||||
if (osRight)
|
||||
SmoothLods_r(osRight, fSize, os->nLod);
|
||||
if (osTop)
|
||||
SmoothLods_r(osTop, fSize, os->nLod);
|
||||
if (osBottom)
|
||||
SmoothLods_r(osBottom, fSize, os->nLod);
|
||||
}
|
||||
}
|
||||
|
||||
void CREOcean::LinkVisSectors(float fSize)
|
||||
{
|
||||
for (int i=0; i<m_VisOceanSectors.Num(); i++)
|
||||
{
|
||||
SOceanSector *os = m_VisOceanSectors[i];
|
||||
SOceanSector *osLeft;
|
||||
SOceanSector *osRight;
|
||||
SOceanSector *osTop;
|
||||
SOceanSector *osBottom;
|
||||
|
||||
// Left
|
||||
osLeft = GetSectorByPos(os->x-fSize, os->y, false);
|
||||
// Right
|
||||
osRight = GetSectorByPos(os->x+fSize, os->y, false);
|
||||
// Top
|
||||
osTop = GetSectorByPos(os->x, os->y-fSize, false);
|
||||
// Bottom
|
||||
osBottom = GetSectorByPos(os->x, os->y+fSize, false);
|
||||
if (osLeft)
|
||||
SmoothLods_r(osLeft, fSize, os->nLod);
|
||||
if (osRight)
|
||||
SmoothLods_r(osRight, fSize, os->nLod);
|
||||
if (osTop)
|
||||
SmoothLods_r(osTop, fSize, os->nLod);
|
||||
if (osBottom)
|
||||
SmoothLods_r(osBottom, fSize, os->nLod);
|
||||
}
|
||||
}
|
||||
|
||||
void CREOcean::PostLoad(unsigned long ulSeed, float fWindDirection, float fWindSpeed, float fWaveHeight, float fDirectionalDependence, float fChoppyWavesFactor, float fSuppressSmallWavesFactor)
|
||||
{
|
||||
m_fWindX = cry_cosf( fWindDirection );
|
||||
m_fWindY = cry_sinf( fWindDirection );
|
||||
m_fWindSpeed = fWindSpeed;
|
||||
m_fWaveHeight = fWaveHeight;
|
||||
m_fDirectionalDependence = fDirectionalDependence;
|
||||
m_fChoppyWaveFactor = fChoppyWavesFactor;
|
||||
m_fSuppressSmallWavesFactor = fSuppressSmallWavesFactor;
|
||||
|
||||
m_fLargestPossibleWave = m_fWindSpeed * m_fWindSpeed / m_fGravity;
|
||||
m_fSuppressSmallWaves = m_fLargestPossibleWave * m_fSuppressSmallWavesFactor;
|
||||
|
||||
// init H0
|
||||
CRERandom kRnd( ulSeed );
|
||||
float fOneBySqrtTwo = 1.0f / cry_sqrtf(2.0f);
|
||||
int i, j;
|
||||
for(j=-OCEANGRID/2; j<=OCEANGRID/2; j++)
|
||||
{
|
||||
int y = j + OCEANGRID/2;
|
||||
for(i=-OCEANGRID/2; i<=OCEANGRID/2; i++)
|
||||
{
|
||||
int x = i + OCEANGRID/2;
|
||||
float rndX = (float)kRnd.GetGauss();
|
||||
float rndY = (float)kRnd.GetGauss();
|
||||
rndX *= fOneBySqrtTwo * cry_sqrtf(PhillipsSpectrum(2.0f*PI*i, 2.0f*PI*j));
|
||||
rndY *= fOneBySqrtTwo * cry_sqrtf(PhillipsSpectrum(2.0f*PI*i, 2.0f*PI*j));
|
||||
|
||||
m_H0X[y][x] = rndX;
|
||||
m_H0Y[y][x] = rndY;
|
||||
}
|
||||
}
|
||||
|
||||
// precalc length of K
|
||||
for(j=-OCEANGRID/2; j<OCEANGRID/2; j++)
|
||||
{
|
||||
int y = j + OCEANGRID/2;
|
||||
for(i=-OCEANGRID/2; i<OCEANGRID/2; i++)
|
||||
{
|
||||
int x = i + OCEANGRID/2;
|
||||
float fKLength = cry_sqrtf(sqrf(2.0f*PI*i) + sqrf(2.0f*PI*j));
|
||||
if( fKLength < 1e-8f )
|
||||
fKLength = 1e-8f;
|
||||
m_aKScale[y][x] = 1.0f / fKLength;
|
||||
}
|
||||
}
|
||||
|
||||
// init angular frequencies
|
||||
for(j=-OCEANGRID/2; j<OCEANGRID/2; j++)
|
||||
{
|
||||
int y = j + OCEANGRID/2;
|
||||
for(i=-OCEANGRID/2; i<OCEANGRID/2; i++)
|
||||
{
|
||||
int x = i + OCEANGRID/2;
|
||||
float fKLength = cry_sqrtf(sqrf(2.0f*PI*i) + sqrf(2.0f*PI*j));
|
||||
m_aAngularFreq[y][x] = cry_sqrtf(m_fGravity * fKLength) * cry_tanhf(fKLength * m_fDepth);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CREOcean::FFT( int iDir, float* real, float* imag )
|
||||
{
|
||||
long nn,i,i1,j,k,i2,l,l1,l2;
|
||||
float c1,c2,treal,timag,t1,t2,u1,u2,z;
|
||||
|
||||
nn = OCEANGRID;
|
||||
|
||||
// Do the bit reversal
|
||||
i2 = nn >> 1;
|
||||
j = 0;
|
||||
for( i = 0; i < nn - 1; ++i )
|
||||
{
|
||||
if( i < j )
|
||||
{
|
||||
treal = real[ i ];
|
||||
timag = imag[ i ];
|
||||
real[ i ] = real[ j ];
|
||||
imag[ i ] = imag[ j ];
|
||||
real[ j ] = treal;
|
||||
imag[ j ] = timag;
|
||||
}
|
||||
|
||||
k = i2;
|
||||
while( k <= j )
|
||||
{
|
||||
j -= k;
|
||||
k >>= 1;
|
||||
}
|
||||
|
||||
j += k;
|
||||
}
|
||||
|
||||
// Compute the FFT
|
||||
c1 = -1.0f;
|
||||
c2 = 0.0f;
|
||||
l2 = 1;
|
||||
for(l=0; l<LOG_OCEANGRID; l++)
|
||||
{
|
||||
l1 = l2;
|
||||
l2 <<= 1;
|
||||
u1 = 1.0;
|
||||
u2 = 0.0;
|
||||
for( j = 0; j < l1; ++j )
|
||||
{
|
||||
for( i = j; i < nn; i += l2 )
|
||||
{
|
||||
i1 = i + l1;
|
||||
t1 = u1 * real[i1] - u2 * imag[i1];
|
||||
t2 = u1 * imag[i1] + u2 * real[i1];
|
||||
real[i1] = real[i] - t1;
|
||||
imag[i1] = imag[i] - t2;
|
||||
real[i] += t1;
|
||||
imag[i] += t2;
|
||||
}
|
||||
|
||||
z = u1 * c1 - u2 * c2;
|
||||
u2 = u1 * c2 + u2 * c1;
|
||||
u1 = z;
|
||||
}
|
||||
|
||||
c2 = crySqrtf(( 1.0f - c1 ) / 2.0f);
|
||||
|
||||
if( 1 == iDir )
|
||||
{
|
||||
c2 = -c2;
|
||||
}
|
||||
|
||||
c1 = crySqrtf(( 1.0f + c1 ) / 2.0f);
|
||||
}
|
||||
|
||||
// Scaling for forward transform
|
||||
if( 1 == iDir )
|
||||
{
|
||||
for(i=0; i<nn; ++i)
|
||||
{
|
||||
real[i] /= (float) nn;
|
||||
imag[i] /= (float) nn;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FFTSSE_64(float* ar, float* ai);
|
||||
|
||||
void CREOcean::FFT2D(int iDir, float cmpX[OCEANGRID][OCEANGRID], float cmpY[OCEANGRID][OCEANGRID])
|
||||
{
|
||||
float real[OCEANGRID];
|
||||
float imag[OCEANGRID];
|
||||
|
||||
|
||||
#if !defined(_XBOX) && !defined(WIN64) && !defined(LINUX)
|
||||
// NOTE: AMD64 port: implement
|
||||
if ((g_CpuFlags & CPUF_SSE) && CRenderer::CV_r_sse && !(((int)&cmpX[0][0]) & 0xf) && !(((int)&cmpY[0][0]) & 0xf) && OCEANGRID == 64)
|
||||
{
|
||||
FFTSSE_64(&cmpY[0][0], &cmpX[0][0]);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
int i, j;
|
||||
|
||||
// Transform the rows
|
||||
for(j=0; j<OCEANGRID; j++)
|
||||
{
|
||||
for(i=0; i<OCEANGRID; i++)
|
||||
{
|
||||
real[i] = cmpX[j][i];
|
||||
imag[i] = cmpY[j][i];
|
||||
}
|
||||
|
||||
FFT( iDir, real, imag );
|
||||
|
||||
for(i=0; i<OCEANGRID; i++)
|
||||
{
|
||||
cmpX[j][i] = real[i];
|
||||
cmpY[j][i] = imag[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Transform the columns
|
||||
for(i=0; i<OCEANGRID; i++)
|
||||
{
|
||||
for(j=0; j<OCEANGRID; j++)
|
||||
{
|
||||
real[j] = cmpX[j][i];
|
||||
imag[j] = cmpY[j][i];
|
||||
}
|
||||
|
||||
FFT( iDir, real, imag );
|
||||
|
||||
for(j=0; j<OCEANGRID; j++)
|
||||
{
|
||||
cmpX[j][i] = real[j];
|
||||
cmpY[j][i] = imag[j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CREOcean::Update( float fTime )
|
||||
{
|
||||
double time0 = 0;
|
||||
ticks(time0);
|
||||
|
||||
float fK = 2.0f * PI;
|
||||
for(int j=-OCEANGRID/2; j<OCEANGRID/2; j++)
|
||||
{
|
||||
int jn = j & (OCEANGRID-1);
|
||||
for(int i=-OCEANGRID/2; i<OCEANGRID/2; i++)
|
||||
{
|
||||
int x = i + OCEANGRID/2;
|
||||
int y = j + OCEANGRID/2;
|
||||
unsigned int val = (int)(m_aAngularFreq[y][x] * 1024.0f / (PI*2) * fTime);
|
||||
float fSin = gRenDev->m_RP.m_tSinTable[val&0x3ff];
|
||||
float fCos = gRenDev->m_RP.m_tSinTable[(val+512)&0x3ff];
|
||||
|
||||
int x1 = -i + OCEANGRID/2;
|
||||
int y1 = -j + OCEANGRID/2;
|
||||
|
||||
float hx = (m_H0X[y][x] + m_H0X[y1][x1]) * fCos -
|
||||
(m_H0Y[y][x] + m_H0Y[y1][x1]) * fSin;
|
||||
|
||||
float hy = (m_H0X[y][x] - m_H0X[y1][x1]) * fSin +
|
||||
(m_H0Y[y][x] - m_H0Y[y1][x1]) * fCos;
|
||||
|
||||
int in = i & (OCEANGRID-1);
|
||||
|
||||
// update height
|
||||
m_HX[jn][in] = hx;
|
||||
m_HY[jn][in] = hy;
|
||||
|
||||
// update normal
|
||||
float fKx = fK * i;
|
||||
float fKy = fK * j;
|
||||
m_NX[jn][in] = (-hy * fKx - hx * fKy);
|
||||
m_NY[jn][in] = ( hx * fKx - hy * fKy);
|
||||
|
||||
// update displacement vector for choppy waves
|
||||
fKx *= m_aKScale[y][x];
|
||||
fKy *= m_aKScale[y][x];
|
||||
m_DX[jn][in] = ( hy * fKx + hx * fKy);
|
||||
m_DY[jn][in] = (-hx * fKx + hy * fKy);
|
||||
}
|
||||
}
|
||||
unticks(time0);
|
||||
m_RS.m_StatsTimeFFTTable = (float)(time0*1000.0*g_SecondsPerCycle);
|
||||
|
||||
ticks(time0);
|
||||
FFT2D(-1, m_HX, m_HY);
|
||||
FFT2D(-1, m_NX, m_NY);
|
||||
FFT2D(-1, m_DX, m_DY);
|
||||
unticks(time0);
|
||||
m_RS.m_StatsTimeFFT = (float)(time0*1000.0*g_SecondsPerCycle);
|
||||
}
|
||||
|
||||
bool CREOcean::mfCompile(SShader *ef, char *scr)
|
||||
{
|
||||
char* name;
|
||||
long cmd;
|
||||
char *params;
|
||||
char *data;
|
||||
|
||||
enum {eSeed = 1, eSpeed, eGravity, eDepth, eWindSpeed, eWindDirection, eWaveHeight, eDirectionalDependence, eChoppyWaveFactor, eSuppressSmallWavesFactor};
|
||||
static tokenDesc commands[] =
|
||||
{
|
||||
{eSpeed, "Speed"},
|
||||
{eGravity, "Gravity"},
|
||||
{eDepth, "Depth"},
|
||||
{eWindDirection, "WindDirection"},
|
||||
{eWindSpeed, "WindSpeed"},
|
||||
{eWaveHeight, "WaveHeight"},
|
||||
{eDirectionalDependence, "DirectionalDependence"},
|
||||
{eChoppyWaveFactor, "ChoppyWaveFactor"},
|
||||
{eSuppressSmallWavesFactor, "SuppressSmallWavesFactor"},
|
||||
{0, 0},
|
||||
};
|
||||
|
||||
float fWindDirection = 90.0f;
|
||||
float fWindSpeed = m_fWindSpeed;
|
||||
float fWaveHeight = m_fWaveHeight;
|
||||
float fDirectionalDependence = m_fDirectionalDependence;
|
||||
float fChoppyWaveFactor = m_fChoppyWaveFactor;
|
||||
float fSuppressSmallWavesFactor = m_fSuppressSmallWavesFactor;
|
||||
m_fSpeed = 1.0f;
|
||||
m_fGravity = 9.81f;
|
||||
m_fDepth = 10;
|
||||
|
||||
while ((cmd = shGetObject (&scr, commands, &name, ¶ms)) > 0)
|
||||
{
|
||||
data = NULL;
|
||||
if (name)
|
||||
data = name;
|
||||
else
|
||||
if (params)
|
||||
data = params;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case eGravity:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing Gravity argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
m_fGravity = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eDepth:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing Depth argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
m_fDepth = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eSpeed:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing Speed argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
m_fSpeed = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eWindDirection:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing WindDirection argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
fWindDirection = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eWindSpeed:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing WindSpeed argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
fWindSpeed = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eWaveHeight:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing WaveHeight argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
fWaveHeight = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eDirectionalDependence:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing DirectionalDependence argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
fDirectionalDependence = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eChoppyWaveFactor:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing ChoppyWaveFactor argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
fChoppyWaveFactor = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eSuppressSmallWavesFactor:
|
||||
if (!data || !data[0])
|
||||
{
|
||||
Warning( 0,0,"missing SuppressSmallWavesFactor argument for Ocean Effect in Shader '%s'\n", ef->m_Name.c_str());
|
||||
break;
|
||||
}
|
||||
fSuppressSmallWavesFactor = shGetFloat(data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
PostLoad(4357, fWindDirection, fWindSpeed, fWaveHeight, fDirectionalDependence, fChoppyWaveFactor, fSuppressSmallWavesFactor);
|
||||
m_CustomTexBind[0] = 0;
|
||||
|
||||
#if !defined(PS2) && !defined (GC) && !defined (NULL_RENDERER)
|
||||
if (!m_VPs[OVP_NOHEIGHT])
|
||||
{
|
||||
m_VPs[OVP_NOHEIGHT] = CVProgram::mfForName("CGVProgOcean_NoHeight");
|
||||
m_VPs[OVP_NOHEIGHT_SPL] = CVProgram::mfForName("CGVProgOcean_NoHeight_Splash");
|
||||
|
||||
m_VPs[OVP_HEIGHT] = CVProgram::mfForName("CGVProgOcean");
|
||||
m_VPs[OVP_HEIGHT_SPL] = CVProgram::mfForName("CGVProgOcean_Splash");
|
||||
}
|
||||
if (!m_VPQ)
|
||||
m_VPQ = CVProgram::mfForName("CGVProgOcean_SL");
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
471
RenderDll/Common/RendElements/CREOcean.h
Normal file
471
RenderDll/Common/RendElements/CREOcean.h
Normal file
@@ -0,0 +1,471 @@
|
||||
#ifndef _CREOCEAN_H_
|
||||
#define _CREOCEAN_H_
|
||||
|
||||
#include "../nvTriStrip/nvTriStrip.h"
|
||||
|
||||
struct SREOceanStats
|
||||
{
|
||||
float m_StatsTimeFFTTable;
|
||||
float m_StatsTimeFFT;
|
||||
float m_StatsTimeUpdateVerts;
|
||||
float m_StatsTimeTexUpdate;
|
||||
float m_StatsTimeRendOcean;
|
||||
int m_StatsAllocatedSectors;
|
||||
int m_StatsNumRendOceanSectors;
|
||||
};
|
||||
|
||||
#define OCEANPI 3.141592654f
|
||||
#define OCEANGRID 64
|
||||
#define LOG_OCEANGRID 6
|
||||
|
||||
#define NUM_LODS 5
|
||||
#define LOD_MASK 7
|
||||
#define LOD_LEFTSHIFT 3
|
||||
#define LOD_RIGHTSHIFT 4
|
||||
#define LOD_TOPSHIFT 5
|
||||
#define LOD_BOTTOMSHIFT 6
|
||||
|
||||
#define OSF_VISIBLE 1
|
||||
#define OSF_FIRSTTIME 2
|
||||
#define OSF_NEEDHEIGHTS 4
|
||||
#define OSF_LODUPDATED 8
|
||||
#define OSF_BLEND 0x10
|
||||
|
||||
#define OVP_NOHEIGHT 0
|
||||
#define OVP_NOHEIGHT_SPL 1
|
||||
#define OVP_HEIGHT 2
|
||||
#define OVP_HEIGHT_SPL 3
|
||||
#define NUM_OVP 4
|
||||
|
||||
#define NUM_OCEANVBS 8
|
||||
|
||||
struct SOceanSector
|
||||
{
|
||||
float x, y;
|
||||
int RenderState;
|
||||
int nLod;
|
||||
int m_Frame;
|
||||
int m_Flags;
|
||||
|
||||
SOceanSector ()
|
||||
{
|
||||
m_Flags = OSF_FIRSTTIME;
|
||||
m_Frame = -1;
|
||||
}
|
||||
};
|
||||
|
||||
struct SOceanIndicies
|
||||
{
|
||||
float m_fLastAccess;
|
||||
int m_nInds;
|
||||
ushort *m_pIndicies;
|
||||
TArray<SPrimitiveGroup> m_Groups;
|
||||
};
|
||||
|
||||
/**
|
||||
* A random number class. It implements the <em>mersenne twister</em> algorithm to produce
|
||||
* "high quality" pseudo random numbers.
|
||||
*/
|
||||
class CRERandom
|
||||
{
|
||||
public:
|
||||
enum EMersenneTwisterInitialSeed
|
||||
{
|
||||
INITIAL_SEED = 4357U
|
||||
};
|
||||
|
||||
public:
|
||||
CRERandom( unsigned long ulSeed = INITIAL_SEED ) : m_ulIndex( 0 )
|
||||
{
|
||||
SetSeed( ulSeed );
|
||||
}
|
||||
|
||||
~CRERandom() {};
|
||||
|
||||
void SetSeed( unsigned long ulSeed )
|
||||
{
|
||||
m_ulState[ 0 ] = ( ulSeed | 1 ) & 0xFFFFFFFFU;
|
||||
for( m_ulIndex = 1; m_ulIndex < N; ++m_ulIndex )
|
||||
{
|
||||
m_ulState[ m_ulIndex ] = ( m_ulState[ m_ulIndex - 1 ] * GENERATOR ) & 0xFFFFFFFFU;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long GetInteger()
|
||||
{
|
||||
if( N == m_ulIndex )
|
||||
{
|
||||
Reload();
|
||||
}
|
||||
|
||||
unsigned long ulY = m_ulState[ m_ulIndex++ ];
|
||||
ulY ^= TemperingShiftU( ulY );
|
||||
ulY ^= TemperingShiftS( ulY ) & TEMPERING_MASK_B;
|
||||
ulY ^= TemperingShiftT( ulY ) & TEMPERING_MASK_C;
|
||||
ulY ^= TemperingShiftL( ulY );
|
||||
|
||||
return( ulY );
|
||||
}
|
||||
|
||||
double Get()
|
||||
{
|
||||
return( GetInteger() * (double) 2.3283064365386963e-10 ); // i.e. GetInteger() / 2^32
|
||||
}
|
||||
|
||||
double GetInRange( double dLower = 0.0, double dUpper = 1.0 )
|
||||
{
|
||||
return( dLower + Get() * ( dUpper - dLower ) );
|
||||
}
|
||||
|
||||
double GetGauss( double dMean = 0.0, double dStdDeviation = 1.0 )
|
||||
{
|
||||
double dX1;
|
||||
double dX2;
|
||||
double dW;
|
||||
|
||||
// perform box muller test
|
||||
do
|
||||
{
|
||||
dX1 = 2.0 * Get() - 1.0;
|
||||
dX2 = 2.0 * Get() - 1.0;
|
||||
dW = dX1 * dX1 + dX2 * dX2;
|
||||
} while( dW >= 1.0 );
|
||||
|
||||
dW = sqrt_tpl( -2.0f * log_tpl( dW ) / dW );
|
||||
dX1 *= dW;
|
||||
|
||||
return( dMean + dX1 * dStdDeviation );
|
||||
}
|
||||
|
||||
private:
|
||||
enum EMersenneTwisterConstants
|
||||
{
|
||||
GENERATOR = 69069U,
|
||||
|
||||
N = 624U,
|
||||
M = 397U,
|
||||
|
||||
MATRIX_A = 0x9908B0DFU,
|
||||
UPPER_MASK = 0x80000000U,
|
||||
LOWER_MASK = 0x7FFFFFFFU,
|
||||
|
||||
TEMPERING_MASK_B = 0x9D2C5680U,
|
||||
TEMPERING_MASK_C = 0xEFC60000U
|
||||
};
|
||||
|
||||
void Reload()
|
||||
{
|
||||
const unsigned long c_ulMag01[ 2 ] = { 0x0, MATRIX_A };
|
||||
|
||||
unsigned long ulY;
|
||||
for( m_ulIndex = 0; m_ulIndex < N - M; ++m_ulIndex )
|
||||
{
|
||||
ulY = ( m_ulState[ m_ulIndex ] & UPPER_MASK ) |
|
||||
( m_ulState[ m_ulIndex + 1 ] & LOWER_MASK );
|
||||
|
||||
m_ulState[ m_ulIndex ] = m_ulState[ m_ulIndex + M ] ^ ( ulY >> 1 ) ^ c_ulMag01[ ulY & 0x1 ];
|
||||
}
|
||||
|
||||
for( ; m_ulIndex < N - 1; ++m_ulIndex)
|
||||
{
|
||||
ulY = ( m_ulState[ m_ulIndex ] & UPPER_MASK ) |
|
||||
( m_ulState[ m_ulIndex + 1 ] & LOWER_MASK );
|
||||
|
||||
m_ulState[ m_ulIndex ] = m_ulState[ m_ulIndex + ( M - N ) ] ^ ( ulY >> 1 ) ^ c_ulMag01[ ulY & 0x1 ];
|
||||
}
|
||||
|
||||
ulY = ( m_ulState[ N - 1 ] & UPPER_MASK ) | ( m_ulState[ 0 ] & LOWER_MASK );
|
||||
m_ulState[ N - 1 ] = m_ulState[ M - 1 ] ^ ( ulY >> 1 ) ^ c_ulMag01[ ulY & 0x1 ];
|
||||
|
||||
m_ulIndex = 0;
|
||||
}
|
||||
|
||||
unsigned long TemperingShiftU( unsigned long ulX )
|
||||
{
|
||||
return( ulX >> 11 );
|
||||
}
|
||||
|
||||
unsigned long TemperingShiftS( unsigned long ulX )
|
||||
{
|
||||
return( ulX << 7 );
|
||||
}
|
||||
|
||||
unsigned long TemperingShiftT( unsigned long ulX )
|
||||
{
|
||||
return( ulX << 15 );
|
||||
}
|
||||
|
||||
unsigned long TemperingShiftL( unsigned long ulX )
|
||||
{
|
||||
return( ulX >> 18 );
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned long m_ulIndex;
|
||||
|
||||
unsigned long m_ulState[ N ];
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
|
||||
class CREOcean : public CRendElement
|
||||
{
|
||||
friend class CRender3D;
|
||||
friend class CGLRenderer;
|
||||
friend class CD3D9Renderer;
|
||||
|
||||
public:
|
||||
|
||||
static CREOcean *m_pStaticOcean;
|
||||
CREOcean()
|
||||
{
|
||||
m_nFrameLoad = 0;
|
||||
m_pBuffer = NULL;
|
||||
mfSetType(eDATA_Ocean);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
GenerateGeometry();
|
||||
m_pStaticOcean = this;
|
||||
}
|
||||
|
||||
virtual ~CREOcean();
|
||||
|
||||
public:
|
||||
|
||||
void GenerateGeometry();
|
||||
void GenerateIndices(int nLodCode);
|
||||
void DrawOceanSector(SOceanIndicies *oi);
|
||||
void SmoothLods_r(SOceanSector *os, float fSize, int minLod);
|
||||
void LinkVisSectors(float fSize);
|
||||
float GetWaterZElevation(float fX, float fY);
|
||||
|
||||
void PostLoad( unsigned long ulSeed, float fWindDirection, float fWindSpeed, float fWaveHeight, float fDirectionalDependence, float fChoppyWavesFactor, float fSuppressSmallWavesFactor );
|
||||
void Update( float fTime );
|
||||
void UpdateTexture(void);
|
||||
void PrepareHMap();
|
||||
|
||||
private:
|
||||
int m_nFrameLoad;
|
||||
float m_fGravity;
|
||||
float m_fDepth;
|
||||
|
||||
TArray <unsigned short> m_pIndices[NUM_LODS];
|
||||
|
||||
private:
|
||||
float *mfFillAdditionalBuffer(SOceanSector *os, int nSplashes, SSplash *pSplashes[], int& nCurSize, int nLod, float fSize);
|
||||
|
||||
void FFT(int iDir, float* real, float* imag);
|
||||
void FFT2DReal(float cmpX[OCEANGRID][OCEANGRID]);
|
||||
void FFT2D(int iDir, float cmpX[OCEANGRID][OCEANGRID], float cmpY[OCEANGRID][OCEANGRID] );
|
||||
_inline float sqrf( float x )
|
||||
{
|
||||
return (x * x);
|
||||
}
|
||||
|
||||
_inline float PhillipsSpectrum( float fKx, float fKy )
|
||||
{
|
||||
float fKLength = cry_sqrtf(sqrf(fKx) + sqrf(fKy));
|
||||
|
||||
if( fKLength < 1e-8f )
|
||||
fKLength = 1e-8f;
|
||||
|
||||
float fScale = 1.0f / fKLength;
|
||||
fKx *= fScale;
|
||||
fKy *= fScale;
|
||||
|
||||
return (m_fWaveHeight * cry_expf(-1.0f / sqrf(fKLength * m_fLargestPossibleWave) - sqrf(fKLength * m_fSuppressSmallWaves)) * cry_powf(fKx*m_fWindX + fKy*m_fWindY, m_fDirectionalDependence) / cry_powf(fKLength, 4.0f));
|
||||
}
|
||||
|
||||
_inline int GetHash(float x, float y)
|
||||
{
|
||||
return (int)(x*0.133f+y*0.356f) & 255;
|
||||
}
|
||||
|
||||
_inline SOceanSector *GetSectorByPos(float x, float y, bool bCreate=true)
|
||||
{
|
||||
int i;
|
||||
|
||||
int hash = GetHash(x, y);
|
||||
for (i=0; i<m_OceanSectorsHash[hash].Num(); i++)
|
||||
{
|
||||
SOceanSector *os = &m_OceanSectorsHash[hash][i];
|
||||
if (os->x == x && os->y == y)
|
||||
return os;
|
||||
}
|
||||
m_RS.m_StatsAllocatedSectors++;
|
||||
SOceanSector os;
|
||||
os.x = x;
|
||||
os.y = y;
|
||||
os.m_Flags |= OSF_FIRSTTIME;
|
||||
os.nLod = NUM_LODS-1;
|
||||
int n = m_OceanSectorsHash[hash].Num();
|
||||
m_OceanSectorsHash[hash].AddElem(os);
|
||||
return &m_OceanSectorsHash[hash][n];
|
||||
}
|
||||
int GetLOD(Vec3d camera, Vec3d pos);
|
||||
|
||||
private:
|
||||
|
||||
TArray<SOceanSector> m_OceanSectorsHash[256];
|
||||
SOceanIndicies *m_OceanIndicies[1<<(LOD_BOTTOMSHIFT+1)];
|
||||
TArray<SOceanSector *> m_VisOceanSectors;
|
||||
float m_fSectorSize;
|
||||
|
||||
TArray<unsigned short> m_DWQIndices;
|
||||
TArray<struct_VERTEX_FORMAT_P3F_COL4UB> m_DWQVertices;
|
||||
|
||||
float m_H0X[OCEANGRID+1][OCEANGRID+1];
|
||||
float m_H0Y[OCEANGRID+1][OCEANGRID+1];
|
||||
|
||||
//static _declspec(align(16)) float m_HX[OCEANGRID][OCEANGRID];
|
||||
//static _declspec(align(16)) float m_HY[OCEANGRID][OCEANGRID];
|
||||
|
||||
//static _declspec(align(16)) float m_NX[OCEANGRID][OCEANGRID];
|
||||
//static _declspec(align(16)) float m_NY[OCEANGRID][OCEANGRID];
|
||||
|
||||
//static _declspec(align(16)) float m_DX[OCEANGRID][OCEANGRID];
|
||||
//static _declspec(align(16)) float m_DY[OCEANGRID][OCEANGRID];
|
||||
DEFINE_ALIGNED_DATA_STATIC( float, m_HX[OCEANGRID][OCEANGRID], 16 );
|
||||
DEFINE_ALIGNED_DATA_STATIC( float, m_HY[OCEANGRID][OCEANGRID], 16 );
|
||||
|
||||
DEFINE_ALIGNED_DATA_STATIC( float, m_NX[OCEANGRID][OCEANGRID], 16 );
|
||||
DEFINE_ALIGNED_DATA_STATIC( float, m_NY[OCEANGRID][OCEANGRID], 16 );
|
||||
|
||||
DEFINE_ALIGNED_DATA_STATIC( float, m_DX[OCEANGRID][OCEANGRID], 16 );
|
||||
DEFINE_ALIGNED_DATA_STATIC( float, m_DY[OCEANGRID][OCEANGRID], 16 );
|
||||
|
||||
vec2_t m_Pos[OCEANGRID+1][OCEANGRID+1];
|
||||
Vec3d m_Normals[OCEANGRID+1][OCEANGRID+1];
|
||||
|
||||
float m_aAngularFreq[OCEANGRID][OCEANGRID];
|
||||
float m_aKScale[OCEANGRID][OCEANGRID];
|
||||
|
||||
float m_fWindX;
|
||||
float m_fWindY;
|
||||
float m_fWindSpeed;
|
||||
float m_fSpeed;
|
||||
float m_fLargestPossibleWave;
|
||||
float m_fSuppressSmallWaves;
|
||||
float m_fWaveHeight;
|
||||
float m_fDirectionalDependence;
|
||||
float m_fChoppyWaveFactor;
|
||||
float m_fSuppressSmallWavesFactor;
|
||||
|
||||
CVertexBuffer *m_pBuffer;
|
||||
|
||||
Vec3d m_MinBound;
|
||||
Vec3d m_MaxBound;
|
||||
|
||||
//===========================================================================
|
||||
|
||||
_inline float GetHMap(float x, float y)
|
||||
{
|
||||
float dDownLandZ;
|
||||
|
||||
if( x<-m_fExpandHM || y<-m_fExpandHM || x>=m_fTerrainSize+m_fExpandHM || y>=m_fTerrainSize+m_fExpandHM)
|
||||
dDownLandZ = 0;
|
||||
else
|
||||
{
|
||||
// convert into hmap space
|
||||
x *= m_fInvHMUnitSize;
|
||||
y *= m_fInvHMUnitSize;
|
||||
|
||||
x += m_fExpandHMap;
|
||||
y += m_fExpandHMap;
|
||||
|
||||
long nX = QInt(x);
|
||||
long nY = QInt(y);
|
||||
long nX1 = (nX+1 >= m_nHMapSize) ? nX : nX+1;
|
||||
long nY1 = (nY+1 >= m_nHMapSize) ? nY : nY+1;
|
||||
|
||||
float dx = x - nX;
|
||||
float dy = y - nY;
|
||||
|
||||
float dDownLandZ0 = (1.0f-dx) * m_HMap[nX*m_nHMapSize+nY] + dx * m_HMap[nX1*m_nHMapSize+nY];
|
||||
float dDownLandZ1 = (1.0f-dx) * m_HMap[nX*m_nHMapSize+nY1] + dx * m_HMap[nX1*m_nHMapSize+nY1];
|
||||
dDownLandZ = (1-dy) * dDownLandZ0 + dy * dDownLandZ1;
|
||||
}
|
||||
return dDownLandZ;
|
||||
}
|
||||
|
||||
public:
|
||||
#if !defined(PS2) && !defined (GC)
|
||||
CVProgram * m_VPs[NUM_OVP];
|
||||
CVProgram * m_VPQ;
|
||||
#endif
|
||||
void *m_pVertsPool[NUM_OCEANVBS];
|
||||
void *m_VertDecl;
|
||||
void *m_VertDeclHeightSplash;
|
||||
int m_nCurVB;
|
||||
int m_nNumVertsInPool;
|
||||
bool m_bLockedVB;
|
||||
|
||||
float *m_HMap;
|
||||
int m_nHMUnitSize;
|
||||
float m_fExpandHM;
|
||||
float m_fExpandHMap;
|
||||
int m_nHMapSize;
|
||||
float m_fInvHMUnitSize;
|
||||
float m_fTerrainSize;
|
||||
|
||||
void InitVB();
|
||||
struct_VERTEX_FORMAT_TEX2F *GetVBPtr(int nVerts);
|
||||
void UnlockVBPtr();
|
||||
|
||||
void mfDrawOceanSectors();
|
||||
void mfDrawOceanScreenLod();
|
||||
|
||||
public:
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfDraw(SShader *ef, SShaderPass *sfm);
|
||||
virtual bool mfCompile(SShader *ef, char *scr);
|
||||
virtual void *mfGetPointer(ESrcPointer ePT, int *Stride, int Type, ESrcPointer Dst, int Flags);
|
||||
virtual bool mfPreDraw(SShaderPass *sl);
|
||||
virtual void mfReset();
|
||||
virtual int Size()
|
||||
{
|
||||
int i;
|
||||
int nSize = sizeof(*this);
|
||||
nSize += m_DWQVertices.GetMemoryUsage();
|
||||
nSize += m_DWQIndices.GetMemoryUsage();
|
||||
|
||||
nSize += sizeof(m_Pos);
|
||||
nSize += sizeof(m_Normals);
|
||||
nSize += m_VisOceanSectors.GetMemoryUsage() + 12;
|
||||
for (i=0; i<(1<<(LOD_BOTTOMSHIFT+1)); i++)
|
||||
{
|
||||
SOceanIndicies *oi = m_OceanIndicies[i];
|
||||
if (!oi)
|
||||
continue;
|
||||
|
||||
nSize += sizeof(SOceanIndicies);
|
||||
nSize += oi->m_nInds * sizeof(short);
|
||||
nSize += oi->m_Groups.GetMemoryUsage();
|
||||
}
|
||||
for (i=0; i<256; i++)
|
||||
{
|
||||
nSize += m_OceanSectorsHash[i].GetMemoryUsage()+12;
|
||||
}
|
||||
// CREOcean::m_HMap array
|
||||
nSize += m_nHMapSize * m_nHMapSize * sizeof(float);
|
||||
|
||||
return nSize;
|
||||
}
|
||||
|
||||
static SREOceanStats m_RS;
|
||||
|
||||
#ifdef DEBUGALLOC
|
||||
#undef new
|
||||
#endif
|
||||
void* operator new( size_t Size )
|
||||
{
|
||||
void *ptr = malloc(Size);
|
||||
memset(ptr, 0, Size);
|
||||
return ptr;
|
||||
}
|
||||
#ifdef DEBUGALLOC
|
||||
#define new DEBUG_CLIENTBLOCK
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#endif // _CREOCEAN_H_
|
||||
13
RenderDll/Common/RendElements/CREOclusionQuery.cpp
Normal file
13
RenderDll/Common/RendElements/CREOclusionQuery.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
|
||||
void CREOcclusionQuery::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_FirstVertex = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 4;
|
||||
}
|
||||
|
||||
1405
RenderDll/Common/RendElements/CREParticleSpray.cpp
Normal file
1405
RenderDll/Common/RendElements/CREParticleSpray.cpp
Normal file
File diff suppressed because it is too large
Load Diff
210
RenderDll/Common/RendElements/CREParticleSpray.h
Normal file
210
RenderDll/Common/RendElements/CREParticleSpray.h
Normal file
@@ -0,0 +1,210 @@
|
||||
|
||||
#ifndef __CREPARTICLESPRAY_H__
|
||||
#define __CREPARTICLESPRAY_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
struct SParticle
|
||||
{
|
||||
SParticle *prev,*next; // LINK
|
||||
Vec3d pos; // CURRENT POSITION
|
||||
Vec3d prevPos[8]; // PREVIOUS POSITION
|
||||
Vec3d realPos; // CURRENT RENDER POSITION
|
||||
Vec3d dir; // CURRENT DIRECTION WITH SPEED
|
||||
Vec3d moveDir; // CURRENT CHANGE DIRECTION
|
||||
int life; // HOW LONG IT WILL LAST
|
||||
int startLife;
|
||||
|
||||
CFColor color; // CURRENT COLOR OF PARTICLE
|
||||
CFColor prevColor; // LAST COLOR OF PARTICLE
|
||||
CFColor deltaColor; // CHANGE OF COLOR
|
||||
|
||||
bool bSpark;
|
||||
|
||||
float curSize;
|
||||
float deltaSize;
|
||||
};
|
||||
|
||||
//================================================
|
||||
|
||||
#define MAX_PART_MOVE_STAGES 4
|
||||
|
||||
enum EMoveType
|
||||
{
|
||||
eMTWave,
|
||||
eMTWhirl,
|
||||
eMTSqueeze,
|
||||
};
|
||||
|
||||
struct SPartMoveStage
|
||||
{
|
||||
EMoveType eMoveType;
|
||||
SWaveForm WaveMove;
|
||||
};
|
||||
|
||||
//================================================
|
||||
|
||||
enum EParticleType
|
||||
{
|
||||
ePTPoint,
|
||||
ePTLine,
|
||||
ePTPolySegs,
|
||||
ePTPoly,
|
||||
ePTBeam,
|
||||
};
|
||||
|
||||
enum EParticleCollision
|
||||
{
|
||||
ePCollision_None,
|
||||
ePCollision_True,
|
||||
ePCollision_Plane
|
||||
};
|
||||
|
||||
struct SParticleInfo
|
||||
{
|
||||
// TRANSFORMATION INFO
|
||||
float yaw, yawVar; // YAW AND VARIATION
|
||||
float pitch, pitchVar; // PITCH AND VARIATION
|
||||
float speed,speedVar;
|
||||
|
||||
int life, lifeVar; // LIFE COUNT AND VARIATION
|
||||
CFColor startColor, startColorVar; // CURRENT COLOR OF PARTICLE
|
||||
CFColor endColor, endColorVar; // CURRENT COLOR OF PARTICLE
|
||||
|
||||
// Physics
|
||||
Vec3d force;
|
||||
|
||||
EParticleType ePT;
|
||||
int Flags;
|
||||
|
||||
// Move info
|
||||
SPartMoveStage mMoves[MAX_PART_MOVE_STAGES];
|
||||
int mNumMoves;
|
||||
|
||||
Vec3d moveDir;
|
||||
Vec3d moveDirVar;
|
||||
|
||||
// Geometry info
|
||||
float startSize, startSizeVar;
|
||||
float endSize, endSizeVar;
|
||||
|
||||
float segmOffs;
|
||||
int segmMax;
|
||||
|
||||
int StackSize;
|
||||
float Squeeze;
|
||||
};
|
||||
|
||||
struct SEmitter
|
||||
{
|
||||
SParticleInfo pi;
|
||||
|
||||
Vec3d startPos; // XYZ POSITION
|
||||
Vec3d startPosVar; // XYZ POSITION VARIATION
|
||||
|
||||
// Particle
|
||||
SParticle *particle; // NULL TERMINATED LINKED LIST
|
||||
int totalParticles[2]; // TOTAL EMITTED AT ANY TIME
|
||||
int particleCount[2]; // TOTAL EMITTED RIGHT NOW
|
||||
int emitsPerFrame, emitVar; // EMITS PER FRAME AND VARIATION
|
||||
|
||||
EParticleCollision eCollisionType;
|
||||
Vec3d PlaneAxis;
|
||||
Vec3d PlaneOffs;
|
||||
|
||||
SParticleInfo Spark;
|
||||
int NumSparks;
|
||||
|
||||
float Life;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/// Particle Definitions //////////////////////////////////////////////////////
|
||||
#define MAX_PARTICLES 4096 // MAXIMUM NUMBER OF PARTICLES
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define FP_ANTIALIAS 0x1
|
||||
|
||||
struct SParticleStat
|
||||
{
|
||||
int NumSprays;
|
||||
int NumRendSprays;
|
||||
int NumParticles;
|
||||
int NumVerts;
|
||||
int NumIndices;
|
||||
};
|
||||
|
||||
class CREParticleSpray : public CRendElement
|
||||
{
|
||||
public:
|
||||
SEmitter mEmitter;
|
||||
SParticle *mParticlePool[2];
|
||||
SParticle *mParticlePntr[2];
|
||||
int mFrame;
|
||||
|
||||
private:
|
||||
/// Support Function Definitions //////////////////////////////////////////////
|
||||
bool mfInitParticleSystem();
|
||||
bool mfSetDefaultEmitter(SEmitter *emitter);
|
||||
bool mfInitEmitter(SEmitter *emitter);
|
||||
|
||||
bool mfAddParticle(SEmitter *emitter, SParticleInfo *pi);
|
||||
bool mfUpdateParticle(SParticle *particle,SEmitter *emitter);
|
||||
void mfEmitSparks(SParticle *p, SEmitter *em);
|
||||
|
||||
bool mfUpdateEmitter(SEmitter *emitter); // DRAW THE SYSTEM FOR A FRAME
|
||||
SEmitter *mfGetEmitter(void) { return &mEmitter; }
|
||||
|
||||
// Parsing
|
||||
void mfCompileParticleInfo(SShader *ef, SParticleInfo *pi, char *scr);
|
||||
void mfCompileCollision(SShader *ef, SEmitter *em, char *scr, char *Collision);
|
||||
bool mfCompileMove(SShader *ef, SPartMoveStage *pm, SParticleInfo *pi, char *scr);
|
||||
bool mfCompileMoveTypeSqueeze(SShader *ef, SPartMoveStage *pm, char *scr);
|
||||
bool mfCompileMoveTypeWhirl(SShader *ef, SPartMoveStage *pm, char *scr);
|
||||
bool mfCompileMoveTypeWave(SShader *ef, SPartMoveStage *pm, char *scr);
|
||||
|
||||
public:
|
||||
CREParticleSpray()
|
||||
{
|
||||
mfSetType(eDATA_ParticleSpray);
|
||||
mfUpdateFlags(FCEF_TRANSFORM | FCEF_NEEDFILLBUF);
|
||||
mfInitEmitter(&mEmitter);
|
||||
}
|
||||
virtual ~CREParticleSpray();
|
||||
//CREParticleSpray(CREParticleSpray *Orig);
|
||||
CREParticleSpray& operator = (const CREParticleSpray& src);
|
||||
|
||||
// CRendElement interface
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfCull(CCObject *obj);
|
||||
|
||||
virtual CRendElement *mfCopyConstruct(void)
|
||||
{
|
||||
//CREParticleSpray *ps = new CREParticleSpray;
|
||||
//*ps = this;
|
||||
return this;
|
||||
}
|
||||
|
||||
virtual bool mfIsValidTime(SShader *ef, CCObject *obj, float curtime);
|
||||
virtual bool mfCompile(SShader *ef, char *scr);
|
||||
|
||||
static SParticleStat mRS;
|
||||
static void mfPrintStat();
|
||||
|
||||
#ifdef DEBUGALLOC
|
||||
#undef new
|
||||
#endif
|
||||
void* operator new( size_t Size )
|
||||
{
|
||||
void *ptr = malloc(Size);
|
||||
memset(ptr, 0, Size);
|
||||
return ptr;
|
||||
}
|
||||
#ifdef DEBUGALLOC
|
||||
#define new DEBUG_CLIENTBLOCK
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
#endif // __RENDELEMENT_H__
|
||||
651
RenderDll/Common/RendElements/CREPolyBlend.cpp
Normal file
651
RenderDll/Common/RendElements/CREPolyBlend.cpp
Normal file
@@ -0,0 +1,651 @@
|
||||
/*=============================================================================
|
||||
CPolyBlend.cpp : implementation of blended polygons RE.
|
||||
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
|
||||
|
||||
Revision history:
|
||||
* Created by Honitch Andrey
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
|
||||
#include "RenderPCH.h"
|
||||
|
||||
//===============================================================
|
||||
|
||||
bool CREPolyBlend::mfCull(CCObject *obj)
|
||||
{
|
||||
CREPolyBlend::mRS.NumPolys++;
|
||||
|
||||
if ((obj->m_ObjFlags & FOB_NEAREST))
|
||||
return false;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CREPolyBlend_Base::mfPrepareRB(CCObject *obj, Vec3d& orgo, CFColor& col)
|
||||
{
|
||||
if (obj->m_ObjFlags & FOB_DRSUN)
|
||||
{
|
||||
orgo = gRenDev->m_RP.m_ViewOrg + 2000.0f * gRenDev->m_RP.m_SunDir;
|
||||
}
|
||||
/*else
|
||||
if (obj->m_ObjFlags & FOB_DRPLANET)
|
||||
{
|
||||
orgo = obj->m_Trans + gRenDev->m_RP.m_ViewOrg;
|
||||
orgo[2] += 2000;
|
||||
}*/
|
||||
else
|
||||
{
|
||||
orgo = obj->GetTranslation();
|
||||
}
|
||||
|
||||
col = obj->m_Color;
|
||||
|
||||
if (col[0]+col[1]+col[2] == 0)
|
||||
col = CFColor(1.0f);
|
||||
|
||||
if (obj->m_ObjFlags & FOB_DRSUN)
|
||||
{
|
||||
CREFlareGeom *fl = (CREFlareGeom *)obj->m_RE;
|
||||
fl->mfCheckVis(col, obj);
|
||||
if (!col.a)
|
||||
return false; // Flare not visible
|
||||
col.ScaleCol(col.a);
|
||||
col.a = 1;
|
||||
}
|
||||
else
|
||||
if (eColStyle || eAlphaStyle)
|
||||
{
|
||||
float frac;
|
||||
if (eColStyle)
|
||||
{
|
||||
col = Col_White;
|
||||
if (eColStyle == ePBCS_Decay)
|
||||
{
|
||||
frac = (gRenDev->m_RP.m_RealTime-obj->m_StartTime)/LiveTime;
|
||||
col.ScaleCol(frac);
|
||||
}
|
||||
}
|
||||
if (eAlphaStyle)
|
||||
{
|
||||
if (eAlphaStyle == ePBCS_Decay)
|
||||
{
|
||||
if (obj->m_StartTime+LiveTimeA < gRenDev->m_RP.m_RealTime-0.001)
|
||||
frac = 1;
|
||||
else
|
||||
frac = (gRenDev->m_RP.m_RealTime-obj->m_StartTime)/LiveTimeA;
|
||||
col[3] = ValA0 + frac * (ValA1-ValA0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CLightStyle *ls = CLightStyle::m_LStyles[obj->m_LightStyle];
|
||||
ls->mfUpdate(gRenDev->m_RP.m_RealTime);
|
||||
col = ls->m_Color;
|
||||
col[3] = 1.0f;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CREPolyBlend_Base::mfSetVerts(CCObject *obj, Vec3d& orgo, uint c, SOrient *ori)
|
||||
{
|
||||
Vec3d VecX, VecY, v;
|
||||
Vec3d org;
|
||||
float distX, distY;
|
||||
float *verts[4];
|
||||
Vec3d norm;
|
||||
bvec4 *cols;
|
||||
int i;
|
||||
static int inds[] = {3, 0, 2, 2, 0, 1};
|
||||
static float tverts[4][2] =
|
||||
{
|
||||
{0, 0},
|
||||
{1, 0},
|
||||
{1, 1},
|
||||
{0, 1}
|
||||
};
|
||||
|
||||
int n = gRenDev->m_RP.m_RendNumVerts;
|
||||
byte *p = gRenDev->m_RP.m_Ptr.PtrB + n*gRenDev->m_RP.m_Stride;
|
||||
verts[0] = (float *)p;
|
||||
p += gRenDev->m_RP.m_Stride;
|
||||
verts[1] = (float *)p;
|
||||
p += gRenDev->m_RP.m_Stride;
|
||||
verts[2] = (float *)p;
|
||||
p += gRenDev->m_RP.m_Stride;
|
||||
verts[3] = (float *)p;
|
||||
|
||||
org = orgo;
|
||||
|
||||
if (ori->m_Flags & FOR_ORTHO)
|
||||
{
|
||||
VecX = gRenDev->m_RP.m_CamVecs[1];
|
||||
VecY = gRenDev->m_RP.m_CamVecs[2];
|
||||
|
||||
org += ori->m_Coord.m_Org;
|
||||
|
||||
v = org - gRenDev->m_RP.m_ViewOrg;
|
||||
distX = v.GetLength();
|
||||
norm = -gRenDev->m_RP.m_CamVecs[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
VecX = ori->m_Coord.m_Vecs[1];
|
||||
VecY = ori->m_Coord.m_Vecs[2];
|
||||
|
||||
org += ori->m_Coord.m_Org;
|
||||
|
||||
v = org - gRenDev->m_RP.m_ViewOrg;
|
||||
distX = v.GetLength();
|
||||
norm = -ori->m_Coord.m_Vecs[0];
|
||||
}
|
||||
if (gRenDev->m_RP.m_PersFlags & RBPF_DRAWMIRROR)
|
||||
{
|
||||
VecY = -VecY;
|
||||
}
|
||||
|
||||
distY = distX;
|
||||
if (ScaleX > 0)
|
||||
{
|
||||
distX = ScaleX;
|
||||
distY = ScaleY;
|
||||
}
|
||||
else
|
||||
if (ScaleX < 0)
|
||||
{
|
||||
distX *= -ScaleX * 0.1f;
|
||||
distY *= -ScaleY * 0.1f;
|
||||
}
|
||||
else
|
||||
distX = distY = 10.0f;
|
||||
|
||||
VecX *= distX;
|
||||
VecY *= distY;
|
||||
|
||||
verts[0][0] = org[0]+VecX[0]+VecY[0];
|
||||
verts[0][1] = org[1]+VecX[1]+VecY[1];
|
||||
verts[0][2] = org[2]+VecX[2]+VecY[2];
|
||||
|
||||
verts[1][0] = org[0]-VecX[0]+VecY[0];
|
||||
verts[1][1] = org[1]-VecX[1]+VecY[1];
|
||||
verts[1][2] = org[2]-VecX[2]+VecY[2];
|
||||
|
||||
verts[2][0] = org[0]-VecX[0]-VecY[0];
|
||||
verts[2][1] = org[1]-VecX[1]-VecY[1];
|
||||
verts[2][2] = org[2]-VecX[2]-VecY[2];
|
||||
|
||||
verts[3][0] = org[0]+VecX[0]-VecY[0];
|
||||
verts[3][1] = org[1]+VecX[1]-VecY[1];
|
||||
verts[3][2] = org[2]+VecX[2]-VecY[2];
|
||||
|
||||
UPipeVertex ptr = gRenDev->m_RP.m_NextPtr;
|
||||
byte *OffsT, *OffsD;
|
||||
SMRendTexVert *rtvb;
|
||||
byte *OffsN;
|
||||
switch (gRenDev->m_RP.m_FT)
|
||||
{
|
||||
case FLT_BASE:
|
||||
cols = &gRenDev->m_RP.m_pClientColors[n];
|
||||
OffsT = gRenDev->m_RP.m_OffsT + ptr.PtrB;
|
||||
for (i=0; i<4; i++, cols++, OffsT+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
*(float *)(OffsT) = tverts[i][0];
|
||||
*(float *)(OffsT+4) = tverts[i][1];
|
||||
*(uint *)cols = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_BASE + FLT_COL:
|
||||
OffsD = gRenDev->m_RP.m_OffsD + ptr.PtrB;
|
||||
OffsT = gRenDev->m_RP.m_OffsT + ptr.PtrB;
|
||||
for (i=0; i<4; i++, OffsT+=gRenDev->m_RP.m_Stride, OffsD+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
*(float *)(OffsT) = tverts[i][0];
|
||||
*(float *)(OffsT+4) = tverts[i][1];
|
||||
*(uint *)OffsD = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_COL:
|
||||
OffsD = gRenDev->m_RP.m_OffsD + ptr.PtrB;
|
||||
for (i=0; i<4; i++, OffsD+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
*(uint *)OffsD = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_COL + FLT_SYSBASE:
|
||||
OffsD = gRenDev->m_RP.m_OffsD + ptr.PtrB;
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<4; i++, OffsD+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
Vector2Copy(tverts[i], rtvb[i].vert);
|
||||
*(uint *)OffsD = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0:
|
||||
cols = &gRenDev->m_RP.m_pClientColors[n];
|
||||
for (i=0; i<4; i++, cols++)
|
||||
{
|
||||
*(uint *)cols = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE:
|
||||
cols = &gRenDev->m_RP.m_pClientColors[n];
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<4; i++, cols++)
|
||||
{
|
||||
Vector2Copy(tverts[i], rtvb[i].vert);
|
||||
*(uint *)cols = c;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case FLT_BASE + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
cols = &gRenDev->m_RP.m_pClientColors[n];
|
||||
OffsT = gRenDev->m_RP.m_OffsT + ptr.PtrB;
|
||||
for (i=0; i<4; i++, cols++, OffsT+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
*(float *)(OffsN) = norm.x;
|
||||
*(float *)(OffsN+4) = norm.y;
|
||||
*(float *)(OffsN+8) = norm.z;
|
||||
*(float *)(OffsT) = tverts[i][0];
|
||||
*(float *)(OffsT+4) = tverts[i][1];
|
||||
*(uint *)cols = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_BASE + FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
OffsD = gRenDev->m_RP.m_OffsD + ptr.PtrB;
|
||||
OffsT = gRenDev->m_RP.m_OffsT + ptr.PtrB;
|
||||
for (i=0; i<4; i++, OffsT+=gRenDev->m_RP.m_Stride, OffsD+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
*(float *)(OffsN) = norm.x;
|
||||
*(float *)(OffsN+4) = norm.y;
|
||||
*(float *)(OffsN+8) = norm.z;
|
||||
*(float *)(OffsT) = tverts[i][0];
|
||||
*(float *)(OffsT+4) = tverts[i][1];
|
||||
*(uint *)OffsD = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
OffsD = gRenDev->m_RP.m_OffsD + ptr.PtrB;
|
||||
for (i=0; i<4; i++, OffsD+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
*(float *)(OffsN) = norm.x;
|
||||
*(float *)(OffsN+4) = norm.y;
|
||||
*(float *)(OffsN+8) = norm.z;
|
||||
*(uint *)OffsD = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_COL + FLT_SYSBASE + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
OffsD = gRenDev->m_RP.m_OffsD + ptr.PtrB;
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<4; i++, OffsD+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
*(float *)(OffsN) = norm.x;
|
||||
*(float *)(OffsN+4) = norm.y;
|
||||
*(float *)(OffsN+8) = norm.z;
|
||||
Vector2Copy(tverts[i], rtvb[i].vert);
|
||||
*(uint *)OffsD = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0 + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
cols = &gRenDev->m_RP.m_pClientColors[n];
|
||||
for (i=0; i<4; i++, cols++)
|
||||
{
|
||||
*(float *)(OffsN) = norm.x;
|
||||
*(float *)(OffsN+4) = norm.y;
|
||||
*(float *)(OffsN+8) = norm.z;
|
||||
*(uint *)cols = c;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
cols = &gRenDev->m_RP.m_pClientColors[n];
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<4; i++, cols++)
|
||||
{
|
||||
*(float *)(OffsN) = norm.x;
|
||||
*(float *)(OffsN+4) = norm.y;
|
||||
*(float *)(OffsN+8) = norm.z;
|
||||
Vector2Copy(tverts[i], rtvb[i].vert);
|
||||
*(uint *)cols = c;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if ((gRenDev->m_RP.m_FT & FLT_COL) && gbRgb)
|
||||
{
|
||||
OffsD = gRenDev->m_RP.m_OffsD + gRenDev->m_RP.m_NextPtr.PtrB;
|
||||
for (i=0; i<4; i++, OffsD+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
*(uint *)(OffsD) = COLCONV(*(uint *)(OffsD));
|
||||
}
|
||||
}
|
||||
|
||||
ptr.PtrB += gRenDev->m_RP.m_Stride*4;
|
||||
gRenDev->m_RP.m_NextPtr = ptr;
|
||||
|
||||
ushort *dinds = &gRenDev->m_RP.m_RendIndices[gRenDev->m_RP.m_RendNumIndices];
|
||||
for (i=0; i<6; i++)
|
||||
{
|
||||
*dinds++ = inds[i]+n;
|
||||
}
|
||||
}
|
||||
|
||||
void CREPolyBlend::mfPrepare(void)
|
||||
{
|
||||
CCObject *obj = gRenDev->m_RP.m_pCurObject;
|
||||
if (!obj)
|
||||
return;
|
||||
|
||||
int savev = gRenDev->m_RP.m_RendNumVerts;
|
||||
int savei = gRenDev->m_RP.m_RendNumIndices;
|
||||
|
||||
CREPolyBlend::mRS.NumRendPolys++;
|
||||
|
||||
SShader *ef = gRenDev->m_RP.m_pShader;
|
||||
CFColor col;
|
||||
Vec3d orgo;
|
||||
|
||||
if (!mfPrepareRB(obj, orgo, col))
|
||||
return;
|
||||
|
||||
uint c = col.GetTrue();
|
||||
|
||||
for (int o=0; o<NumOrients; o++)
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(4, 6, this);
|
||||
|
||||
mfSetVerts(obj, orgo, c, Orients[o]);
|
||||
|
||||
gRenDev->m_RP.m_RendNumVerts += 4;
|
||||
gRenDev->m_RP.m_RendNumIndices += 6;
|
||||
}
|
||||
|
||||
CREPolyBlend::mRS.NumVerts += gRenDev->m_RP.m_RendNumVerts - savev;
|
||||
CREPolyBlend::mRS.NumIndices += gRenDev->m_RP.m_RendNumIndices - savei;
|
||||
}
|
||||
|
||||
//=====================================================================
|
||||
|
||||
bool CREAnimPolyBlend::mfCull(CCObject *obj)
|
||||
{
|
||||
CREPolyBlend::mRS.NumAnimPolys++;
|
||||
|
||||
//if(gfCullSphere(obj->m_Trans, 100)==2)
|
||||
// return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CREPolyBlend::mfIsValidTime(SShader *ef, CCObject *obj, float curtime)
|
||||
{
|
||||
if (!LiveTime)
|
||||
return true;
|
||||
|
||||
if (curtime > LiveTime+obj->m_StartTime)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CREAnimPolyBlend::mfIsValidTime(SShader *ef, CCObject *obj, float curtime)
|
||||
{
|
||||
int i, j;
|
||||
SShaderTexUnit *shm;
|
||||
SShaderPass *sfm;
|
||||
|
||||
for (i=0; i<ef->m_Passes.Num(); i++)
|
||||
{
|
||||
sfm = &ef->m_Passes[i];
|
||||
|
||||
for (j=0; j<sfm->m_TUnits.Num(); j++)
|
||||
{
|
||||
shm = &sfm->m_TUnits[j];
|
||||
if (!shm->m_AnimInfo)
|
||||
continue;
|
||||
if (shm->m_AnimInfo->m_Time && shm->m_AnimInfo->m_TexPics.Num())
|
||||
{
|
||||
float t = curtime - obj->m_StartTime;
|
||||
int m = (int)(t / shm->m_AnimInfo->m_Time);
|
||||
if (m >= shm->m_AnimInfo->m_TexPics.Num())
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CREAnimPolyBlend::mfPrepare(void)
|
||||
{
|
||||
CCObject *obj = gRenDev->m_RP.m_pCurObject;
|
||||
if (!obj)
|
||||
return;
|
||||
|
||||
int savev = gRenDev->m_RP.m_RendNumVerts;
|
||||
int savei = gRenDev->m_RP.m_RendNumIndices;
|
||||
|
||||
CREPolyBlend::mRS.NumRendPolys++;
|
||||
|
||||
SShader *ef = gRenDev->m_RP.m_pShader;
|
||||
CFColor col;
|
||||
Vec3d orgo;
|
||||
|
||||
if (!mfPrepareRB(obj, orgo, col))
|
||||
return;
|
||||
|
||||
uint c = col.GetTrue();
|
||||
|
||||
for (int o=0; o<NumOrients; o++)
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(4, 6, this);
|
||||
|
||||
mfSetVerts(obj, orgo, c, Orients[o]);
|
||||
|
||||
gRenDev->m_RP.m_RendNumVerts += 4;
|
||||
gRenDev->m_RP.m_RendNumIndices += 6;
|
||||
}
|
||||
|
||||
CREPolyBlend::mRS.NumVerts += gRenDev->m_RP.m_RendNumVerts - savev;
|
||||
CREPolyBlend::mRS.NumIndices += gRenDev->m_RP.m_RendNumIndices - savei;
|
||||
}
|
||||
|
||||
|
||||
//=======================================================================
|
||||
|
||||
SPolyBlendStat CREPolyBlend::mRS;
|
||||
|
||||
void CREPolyBlend::mfPrintStat()
|
||||
{
|
||||
/* char str[1024];
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Indices: %i\n", mRS.NumIndices);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Verts: %i\n", mRS.NumVerts);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Render AnimPolys: %i\n", mRS.NumAnimRendPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Occluding AnimPolys: %i\n", mRS.NumAnimPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Render Polys: %i\n", mRS.NumRendPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Occluding Polys: %i\n", mRS.NumPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
gRenDev->mfPrintString ("\nBlended Polygons status info:\n", PS_TRANSPARENT | PS_UP);*/
|
||||
}
|
||||
|
||||
//===================================================================================================
|
||||
|
||||
// Parsing
|
||||
|
||||
void CREPolyBlend_Base::mfCompileOrients(SShader *ef, int *nums, SOrient *Orients[], char *scr)
|
||||
{
|
||||
if (!scr || !scr[0])
|
||||
{
|
||||
Warning( 0,0,"Can't declare orient for effector '%s'\n", ef->m_Name.c_str());
|
||||
*nums = 1;
|
||||
Orients[0] = &gRenDev->m_cEF.m_Orients[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
int ors[16];
|
||||
*nums = sscanf(scr, "%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", &ors[0], &ors[1], &ors[2], &ors[3], &ors[4], &ors[5], &ors[6], &ors[7], &ors[8], &ors[9], &ors[10], &ors[11], &ors[12], &ors[13], &ors[14], &ors[15]);
|
||||
if (!(*nums))
|
||||
{
|
||||
Warning( 0,0,"Can't declare orient for effector '%s'\n", ef->m_Name.c_str());
|
||||
*nums = 1;
|
||||
Orients[0] = &gRenDev->m_cEF.m_Orients[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i=0; i<*nums; i++)
|
||||
{
|
||||
if (ors[i] >= gRenDev->m_cEF.m_NumOrients)
|
||||
{
|
||||
Warning( 0,0,"Can't declare %d orient (Use Ortho mode)\n", ors[i]);
|
||||
*nums = 1;
|
||||
Orients[0] = &gRenDev->m_cEF.m_Orients[0];
|
||||
return;
|
||||
}
|
||||
Orients[i] = &gRenDev->m_cEF.m_Orients[ors[i]];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool CREPolyBlend_Base::mfCompile(SShader *ef, char *scr)
|
||||
{
|
||||
char* name;
|
||||
long cmd;
|
||||
char *params;
|
||||
char *data;
|
||||
|
||||
enum {eTrace=1, eType, eScale, eScalX, eScalY, eOrients, eRGBStyle, eAlphaStyle};
|
||||
static tokenDesc commands[] =
|
||||
{
|
||||
{eTrace, "Trace"},
|
||||
{eType, "Type"},
|
||||
{eScale, "Scale"},
|
||||
{eScalX, "ScalX"},
|
||||
{eScalY, "ScalY"},
|
||||
{eOrients, "Orients"},
|
||||
{eRGBStyle, "RGBStyle"},
|
||||
{eAlphaStyle, "AlphaStyle"},
|
||||
|
||||
{0,0}
|
||||
};
|
||||
|
||||
while ((cmd = shGetObject (&scr, commands, &name, ¶ms)) > 0)
|
||||
{
|
||||
data = NULL;
|
||||
if (name)
|
||||
data = name;
|
||||
else
|
||||
if (params)
|
||||
data = params;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case eTrace:
|
||||
mfUpdateFlags(FCEFPB_TRACE);
|
||||
break;
|
||||
|
||||
case eType:
|
||||
if (!stricmp(data, "Beam"))
|
||||
this->eType = ePBT_Beam;
|
||||
else
|
||||
Warning( 0,0,"unknown Type parameter '%s' in Shader '%s' (CREPolyBlend)\n", data, ef->m_Name.c_str());
|
||||
break;
|
||||
|
||||
case eScale:
|
||||
ScaleX = ScaleY = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eScalX:
|
||||
ScaleX = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eScalY:
|
||||
ScaleY = shGetFloat(data);
|
||||
break;
|
||||
|
||||
case eRGBStyle:
|
||||
if (!stricmp(data, "Decay"))
|
||||
{
|
||||
eColStyle = ePBCS_Decay;
|
||||
if (!params || !params[0])
|
||||
{
|
||||
Warning( 0,0,"missing RgbStyle Decay value in Shader '%s' (skipped) (CREPolyBlend)\n", ef->m_Name.c_str());
|
||||
Val0 = 1;
|
||||
Val1 = 0;
|
||||
LiveTime = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sscanf(params, "%f %f %f", &Val0, &Val1, &LiveTime);
|
||||
}
|
||||
}
|
||||
else
|
||||
Warning( 0,0,"unknown RgbStyle parameter '%s' in Shader '%s' (CREPolyBlend)\n", data, ef->m_Name.c_str());
|
||||
|
||||
case eAlphaStyle:
|
||||
if (!stricmp(data, "Decay"))
|
||||
{
|
||||
this->eAlphaStyle = ePBCS_Decay;
|
||||
if (!params || !params[0])
|
||||
{
|
||||
Warning( 0,0,"missing RgbStyle Decay value in Shader '%s' (skipped) (CREPolyBlend)\n", ef->m_Name.c_str());
|
||||
ValA0 = 1;
|
||||
ValA1 = 0;
|
||||
LiveTimeA = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sscanf(params, "%f %f %f", &ValA0, &ValA1, &LiveTimeA);
|
||||
}
|
||||
}
|
||||
else
|
||||
Warning( 0,0,"unknown RgbStyle parameter '%s' in Shader '%s' (CREPolyBlend)\n", data, ef->m_Name.c_str());
|
||||
|
||||
|
||||
case eOrients:
|
||||
mfCompileOrients(ef, &NumOrients, Orients, params);
|
||||
if (Orients[0] == &gRenDev->m_cEF.m_Orients[0])
|
||||
mfUpdateFlags(FCEFPB_ORTHO);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
121
RenderDll/Common/RendElements/CREPolyBlend.h
Normal file
121
RenderDll/Common/RendElements/CREPolyBlend.h
Normal file
@@ -0,0 +1,121 @@
|
||||
|
||||
#ifndef __CREPOLYBLEND_H__
|
||||
#define __CREPOLYBLEND_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
#define FCEFPB_TRACE 0x10000
|
||||
#define FCEFPB_ORTHO 0x20000
|
||||
#define FCEFPB_SCALE 0x40000
|
||||
#define FCEFPB_PLANET 0x80000
|
||||
|
||||
enum ePBColStyle
|
||||
{
|
||||
ePBCS_None,
|
||||
ePBCS_Decay,
|
||||
};
|
||||
|
||||
enum ePBType
|
||||
{
|
||||
ePBT_Sprite,
|
||||
ePBT_Beam,
|
||||
};
|
||||
|
||||
struct SPolyBlendStat
|
||||
{
|
||||
int NumPolys;
|
||||
int NumRendPolys;
|
||||
int NumAnimPolys;
|
||||
int NumAnimRendPolys;
|
||||
int NumVerts;
|
||||
int NumIndices;
|
||||
};
|
||||
|
||||
class CREPolyBlend_Base : public CRendElement
|
||||
{
|
||||
public:
|
||||
float ScaleX, ScaleY;
|
||||
int NumOrients;
|
||||
SOrient *Orients[16];
|
||||
ePBColStyle eColStyle;
|
||||
ePBColStyle eAlphaStyle;
|
||||
ePBType eType;
|
||||
float LiveTime;
|
||||
float LiveTimeA;
|
||||
float Val0;
|
||||
float Val1;
|
||||
float ValA0;
|
||||
float ValA1;
|
||||
|
||||
public:
|
||||
CREPolyBlend_Base()
|
||||
{
|
||||
ScaleX = ScaleY = 0;
|
||||
eColStyle = ePBCS_None;
|
||||
eType = ePBT_Sprite;
|
||||
LiveTime = 0;
|
||||
}
|
||||
|
||||
virtual bool mfCompile(SShader *ef, char *scr);
|
||||
|
||||
protected:
|
||||
bool mfPrepareRB(CCObject *obj, Vec3d& orgo, CFColor& col);
|
||||
void mfSetVerts(CCObject *obj, Vec3d& orgo, uint c, SOrient *ori);
|
||||
|
||||
void mfCompileOrients(SShader *ef, int *nums, SOrient *Orients[], char *scr);
|
||||
};
|
||||
|
||||
class CREPolyBlend : public CREPolyBlend_Base
|
||||
{
|
||||
public:
|
||||
|
||||
static SPolyBlendStat mRS;
|
||||
static void mfPrintStat();
|
||||
|
||||
public:
|
||||
CREPolyBlend()
|
||||
{
|
||||
mfSetType(eDATA_PolyBlend);
|
||||
Val0 = Val1 = 0;
|
||||
mfSetFlags(FCEF_NEEDFILLBUF);
|
||||
}
|
||||
|
||||
virtual ~CREPolyBlend() {};
|
||||
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfCull(CCObject *obj);
|
||||
virtual CRendElement *mfCopyConstruct(void)
|
||||
{
|
||||
CREPolyBlend *pb = new CREPolyBlend;
|
||||
*pb = *this;
|
||||
return pb;
|
||||
}
|
||||
virtual bool mfIsValidTime(SShader *ef, CCObject *obj, float curtime);
|
||||
};
|
||||
|
||||
|
||||
class CREAnimPolyBlend : public CREPolyBlend_Base
|
||||
{
|
||||
public:
|
||||
int curNum;
|
||||
|
||||
public:
|
||||
CREAnimPolyBlend() : CREPolyBlend_Base()
|
||||
{
|
||||
mfSetType(eDATA_AnimPolyBlend);
|
||||
mfSetFlags(FCEF_NEEDFILLBUF);
|
||||
}
|
||||
virtual ~CREAnimPolyBlend() {};
|
||||
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfCull(CCObject *obj);
|
||||
virtual CRendElement *mfCopyConstruct(void)
|
||||
{
|
||||
CREAnimPolyBlend *apb = new CREAnimPolyBlend;
|
||||
*apb = *this;
|
||||
return apb;
|
||||
}
|
||||
virtual bool mfIsValidTime(SShader *ef, CCObject *obj, float curtime);
|
||||
};
|
||||
|
||||
#endif // __CREPOLYBLEND_H__
|
||||
485
RenderDll/Common/RendElements/CREPolyMesh.cpp
Normal file
485
RenderDll/Common/RendElements/CREPolyMesh.cpp
Normal file
@@ -0,0 +1,485 @@
|
||||
/*=============================================================================
|
||||
CREPolyMesh.cpp : implementation of mesh polygons RE.
|
||||
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
|
||||
|
||||
Revision history:
|
||||
* Created by Honitch Andrey
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
|
||||
#include "RenderPCH.h"
|
||||
#include <CREPolyMesh.h>
|
||||
|
||||
|
||||
//===============================================================
|
||||
|
||||
SPolyStat CREPolyMesh::mRS;
|
||||
|
||||
CREPolyMesh::~CREPolyMesh()
|
||||
{
|
||||
if (TriVerts)
|
||||
delete [] TriVerts;
|
||||
if (Indices)
|
||||
delete [] Indices;
|
||||
if (bNoDeform)
|
||||
delete [] bNoDeform;
|
||||
}
|
||||
|
||||
void CREPolyMesh::mfGetPlane(Plane& pl)
|
||||
{
|
||||
pl.n = m_Plane.n;
|
||||
pl.d = m_Plane.d;
|
||||
}
|
||||
|
||||
CRendElement *CREPolyMesh::mfCopyConstruct(void)
|
||||
{
|
||||
CREPolyMesh *pm = new CREPolyMesh;
|
||||
*pm = *this;
|
||||
return pm;
|
||||
}
|
||||
|
||||
bool CREPolyMesh::mfCullFace(ECull cl)
|
||||
{
|
||||
CREPolyMesh::mRS.NumOccPolys++;
|
||||
|
||||
if (cl != eCULL_None)
|
||||
{
|
||||
float d = m_Plane.n * gRenDev->m_RP.m_ViewOrg;
|
||||
if (cl == eCULL_Front)
|
||||
{
|
||||
if (d < m_Plane.d-8.0f)
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (d > m_Plane.d+8.0f)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
CREPolyMesh::mRS.NumRendPolys++;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void CREPolyMesh::mfCenter(Vec3d& centr, CCObject *pObj)
|
||||
{
|
||||
int i;
|
||||
|
||||
centr(0,0,0);
|
||||
for (i=0; i<NumVerts; i++)
|
||||
{
|
||||
centr += TriVerts[i].vert;
|
||||
}
|
||||
float s = 1.0f / NumVerts;
|
||||
centr *= s;
|
||||
if (pObj)
|
||||
centr += pObj->GetTranslation();
|
||||
}
|
||||
|
||||
int CREPolyMesh::mfTransform(Matrix44& ViewMatr, Matrix44& ProjMatr, vec4_t *verts, vec4_t *vertsp, int Num)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i=0; i<NumVerts; i++)
|
||||
{
|
||||
if (i == Num)
|
||||
break;
|
||||
for (j=0; j<4; j++)
|
||||
{
|
||||
verts[i][j] = TriVerts[i].vert[0]*ViewMatr(0,j) + TriVerts[i].vert[1]*ViewMatr(1,j) + TriVerts[i].vert[2]*ViewMatr(2,j) + ViewMatr(3,j);
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<NumVerts; i++)
|
||||
{
|
||||
if (i == Num)
|
||||
break;
|
||||
for (j=0; j<4; j++)
|
||||
{
|
||||
vertsp[i][j] = verts[i][0]*ProjMatr(0,j) + verts[i][1]*ProjMatr(1,j) + verts[i][2]*ProjMatr(2,j) + verts[i][3]*ProjMatr(3,j);
|
||||
}
|
||||
}
|
||||
return NumVerts;
|
||||
}
|
||||
|
||||
void CREPolyMesh::mfPrepare(void)
|
||||
{
|
||||
ushort *inds;
|
||||
int i, n;
|
||||
SShader *ef = gRenDev->m_RP.m_pShader;
|
||||
|
||||
CREPolyMesh::mRS.NumVerts += NumVerts;
|
||||
CREPolyMesh::mRS.NumIndices += NumIndices;
|
||||
|
||||
// Check overflow
|
||||
gRenDev->EF_CheckOverflow(NumVerts, NumIndices, this);
|
||||
|
||||
inds = Indices;
|
||||
n = gRenDev->m_RP.m_RendNumVerts;
|
||||
#ifdef OPENGL
|
||||
ushort *dinds = &gRenDev->m_RP.m_RendIndices[gRenDev->m_RP.m_RendNumIndices];
|
||||
#else
|
||||
ushort *dinds = &gRenDev->m_RP.m_RendIndices[gRenDev->m_RP.m_RendNumIndices];
|
||||
#endif
|
||||
i = NumIndices;
|
||||
gRenDev->m_RP.m_RendNumIndices += i;
|
||||
while(i--)
|
||||
{
|
||||
*dinds++ = *inds++ + n;
|
||||
}
|
||||
|
||||
UPipeVertex ptr = gRenDev->m_RP.m_NextPtr;
|
||||
//SMRendTexVert *rtvb, *rtvl;
|
||||
SMTriVert *tv = TriVerts;
|
||||
//byte *OffsN;
|
||||
int m = NumVerts;
|
||||
|
||||
/*switch (gRenDev->m_RP.mFT)
|
||||
{
|
||||
case FLT_BASE:
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].dTC, ptr.Ptr_D_1T->st);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_BASE + FLT_COL:
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_1T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].dTC, ptr.Ptr_D_1T->st);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE:
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride, rtvb++)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].dTC, rtvb->vert);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_COL:
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride, rtvb++)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_1T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].dTC, rtvb->vert);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_BASE + FLT_LM:
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].dTC, ptr.Ptr_D_2T->st[0]);
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_BASE + FLT_LM + FLT_COL:
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].dTC, ptr.Ptr_D_2T->st[0]);
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_LM:
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride, rtvb++)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
Vector2Copy(tv[i].dTC, rtvb->vert);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_LM + FLT_COL:
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride, rtvb++)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
Vector2Copy(tv[i].dTC, rtvb->vert);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_SYSLM:
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
rtvl = &gRenDev->m_RP.m_pLMTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride, rtvb++, rtvl++)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].lmTC, rtvl->vert);
|
||||
Vector2Copy(tv[i].dTC, rtvb->vert);
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_SYSLM + FLT_COL:
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
rtvl = &gRenDev->m_RP.m_pLMTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride, rtvb++, rtvl++)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].lmTC, rtvl->vert);
|
||||
Vector2Copy(tv[i].dTC, rtvb->vert);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case FLT_BASE + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].dTC, ptr.Ptr_D_1T->st);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_BASE + FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_1T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].dTC, ptr.Ptr_D_1T->st);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].dTC, rtvb[i].vert);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_1T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].dTC, rtvb[i].vert);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_BASE + FLT_LM + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].dTC, ptr.Ptr_D_2T->st[0]);
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_BASE + FLT_LM + FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].dTC, ptr.Ptr_D_2T->st[0]);
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_LM + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
Vector2Copy(tv[i].dTC, rtvb[i].vert);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_LM + FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
Vector2Copy(tv[i].dTC, rtvb[i].vert);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_SYSLM + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
rtvl = &gRenDev->m_RP.m_pLMTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
Vector2Copy(tv[i].lmTC, rtvl[i].vert);
|
||||
Vector2Copy(tv[i].dTC, rtvb[i].vert);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSBASE + FLT_SYSLM + FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
rtvb = &gRenDev->m_RP.m_pBaseTexCoordPointer[n];
|
||||
rtvl = &gRenDev->m_RP.m_pLMTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].lmTC, rtvl[i].vert);
|
||||
Vector2Copy(tv[i].dTC, rtvb[i].vert);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_LM + FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].lmTC, ptr.Ptr_D_2T->st[1]);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_SYSLM + FLT_COL + FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
rtvl = &gRenDev->m_RP.m_pLMTexCoordPointer[n];
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
Vector2Copy(tv[i].lmTC, rtvl[i].vert);
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_COL:
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
ptr.Ptr_D_2T->color.dcolor = -1;
|
||||
}
|
||||
break;
|
||||
|
||||
case FLT_N:
|
||||
OffsN = gRenDev->m_RP.m_OffsN + ptr.PtrB;
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
*(float *)(OffsN) = m_Plane.n.x;
|
||||
*(float *)(OffsN+4) = m_Plane.n.y;
|
||||
*(float *)(OffsN+8) = m_Plane.n.z;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0:
|
||||
for (i=0; i<m; i++, ptr.PtrB+=gRenDev->m_RP.m_Stride)
|
||||
{
|
||||
ptr.Ptr_D_1T->xyz = tv[i].vert;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}*/
|
||||
|
||||
gRenDev->m_RP.m_NextPtr = ptr;
|
||||
gRenDev->m_RP.m_RendNumVerts += NumVerts;
|
||||
}
|
||||
|
||||
void CREPolyMesh::mfPrintStat()
|
||||
{
|
||||
// char str[1024];
|
||||
|
||||
/* *gpCurPrX = 4;
|
||||
sprintf(str, "Num Indices: %i\n", mRS.NumIndices);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Verts: %i\n", mRS.NumVerts);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Rend. Details: %i\n", mRS.NumRendDetails);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Calc. Details: %i\n", mRS.NumDetails);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num Rend Polys: %i\n", mRS.NumRendPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
sprintf(str, "Num BSP Occluded Polys: %i\n", mRS.NumOccPolys);
|
||||
gRenDev->mfPrintString (str, PS_TRANSPARENT | PS_UP);
|
||||
|
||||
*gpCurPrX = 4;
|
||||
gRenDev->mfPrintString ("\nPolys status info:\n", PS_TRANSPARENT | PS_UP);*/
|
||||
}
|
||||
76
RenderDll/Common/RendElements/CREPrefabGeom.cpp
Normal file
76
RenderDll/Common/RendElements/CREPrefabGeom.cpp
Normal file
@@ -0,0 +1,76 @@
|
||||
/*=============================================================================
|
||||
CREPrefabGeom.cpp : implementation of wall geometry RE for the editor.
|
||||
Copyright (c) 2001 Crytek Studios. All Rights Reserved.
|
||||
|
||||
Revision history:
|
||||
* Created by Honitch Andrey
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[] = __FILE__;
|
||||
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
|
||||
//===============================================================
|
||||
|
||||
CRendElement *CREPrefabGeom::mfCopyConstruct(void)
|
||||
{
|
||||
CREPrefabGeom *cp = new CREPrefabGeom;
|
||||
*cp = *this;
|
||||
return cp;
|
||||
}
|
||||
|
||||
bool CREPrefabGeom::mfCompile(SShader *ef, char *scr)
|
||||
{
|
||||
char* name;
|
||||
long cmd;
|
||||
char *params;
|
||||
char *data;
|
||||
|
||||
enum {eModel=1};
|
||||
static tokenDesc commands[] =
|
||||
{
|
||||
{eModel, "Model"},
|
||||
|
||||
{0,0}
|
||||
};
|
||||
|
||||
while ((cmd = shGetObject (&scr, commands, &name, ¶ms)) > 0)
|
||||
{
|
||||
data = NULL;
|
||||
if (name)
|
||||
data = name;
|
||||
else
|
||||
if (params)
|
||||
data = params;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case eModel:
|
||||
mModel = NULL;//(CModelCgf *)CComModel::mfForName(data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mModel)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void CREPrefabGeom::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
bool CREPrefabGeom::mfDraw(SShader *ef, SShaderPass *sl)
|
||||
{
|
||||
//if (mModel)
|
||||
// mModel->mfDraw(ef, bCamera);
|
||||
return true;
|
||||
}
|
||||
41
RenderDll/Common/RendElements/CREPrefabGeom.h
Normal file
41
RenderDll/Common/RendElements/CREPrefabGeom.h
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
#ifndef __CREPREFABGEOM_H__
|
||||
#define __CREPREFABGEOM_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
struct SREPrefabStat
|
||||
{
|
||||
int NumRendPolys;
|
||||
int NumVerts;
|
||||
int NumIndices;
|
||||
};
|
||||
|
||||
class CModelCgf;
|
||||
|
||||
class CREPrefabGeom : public CRendElement
|
||||
{
|
||||
public:
|
||||
void *mModel;
|
||||
|
||||
static SREPrefabStat mRS;
|
||||
static void mfPrintStat();
|
||||
|
||||
public:
|
||||
CREPrefabGeom()
|
||||
{
|
||||
mfSetType(eDATA_Prefab);
|
||||
mModel = 0;
|
||||
mfSetFlags(FCEF_TRANSFORM);
|
||||
}
|
||||
|
||||
virtual ~CREPrefabGeom() {};
|
||||
|
||||
bool mfCullBox(Vec3d vmin, Vec3d vmax);
|
||||
virtual CRendElement *mfCopyConstruct(void);
|
||||
virtual bool mfCompile(SShader *ef, char *scr);
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfDraw(SShader *ef, SShaderPass *sl);
|
||||
};
|
||||
|
||||
#endif // __CREPREFABGEOM_H__
|
||||
381
RenderDll/Common/RendElements/CREScreenCommon.h
Normal file
381
RenderDll/Common/RendElements/CREScreenCommon.h
Normal file
@@ -0,0 +1,381 @@
|
||||
/*
|
||||
=========================================================================
|
||||
FILE : CRECommon.h
|
||||
DESC : render elements common stuff
|
||||
PROJ : Crytek Engine
|
||||
CODER: Tiago Sousa
|
||||
|
||||
NOTE/TODO/FIX:
|
||||
|
||||
. All shaders, specialized textures used, should be initialized/destroyed
|
||||
in CScreenVars class
|
||||
|
||||
. All data should be fx/name independent, accessible trought data index
|
||||
|
||||
. Give better data organization..
|
||||
|
||||
Last Update: 13/10/2003
|
||||
=========================================================================
|
||||
*/
|
||||
|
||||
#ifndef _CRECOMMON_H_
|
||||
#define _CRECOMMON_H_
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// screen processing types parameter
|
||||
|
||||
|
||||
enum EProcessType
|
||||
{
|
||||
SCREENPROCESS_FADE,
|
||||
SCREENPROCESS_BLUR,
|
||||
SCREENPROCESS_COLORTRANSFER,
|
||||
SCREENPROCESS_CONTRAST,
|
||||
SCREENPROCESS_MOTIONBLUR,
|
||||
SCREENPROCESS_GLARE,
|
||||
SCREENPROCESS_NIGHTVISION,
|
||||
SCREENPROCESS_HEATVISION,
|
||||
SCREENPROCESS_FLASHBANG,
|
||||
SCREENPROCESS_CARTOON,
|
||||
SCREENPROCESS_DOF,
|
||||
|
||||
// special case, to get screen texture, after all post-processing
|
||||
SCREENPROCESS_SCREENTEX,
|
||||
};
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// screen processing types parameters
|
||||
|
||||
enum EProcessParameter
|
||||
{
|
||||
SCREENPROCESS_FADECOLOR,
|
||||
|
||||
SCREENPROCESS_BLURAMOUNT,
|
||||
SCREENPROCESS_BLURCOLORRED,
|
||||
SCREENPROCESS_BLURCOLORGREEN,
|
||||
SCREENPROCESS_BLURCOLORBLUE,
|
||||
|
||||
SCREENPROCESS_COLORTRANSFERCOLOR,
|
||||
SCREENPROCESS_COLORTRANSFERAMOUNT,
|
||||
|
||||
SCREENPROCESS_CONTRASTAMOUNT,
|
||||
|
||||
SCREENPROCESS_MOTIONBLURTYPE,
|
||||
SCREENPROCESS_MOTIONBLURAMOUNT,
|
||||
SCREENPROCESS_MOTIONBLURDISPLACE,
|
||||
|
||||
SCREENPROCESS_GLAREAMOUNT,
|
||||
SCREENPROCESS_GLARELUMSIZE,
|
||||
SCREENPROCESS_GLAREMAXAMOUNT,
|
||||
SCREENPROCESS_GLAREBOXSIZE,
|
||||
SCREENPROCESS_GLARETHRESHOLD,
|
||||
|
||||
SCREENPROCESS_NIGHTVISIONCOLORRED,
|
||||
SCREENPROCESS_NIGHTVISIONCOLORGREEN,
|
||||
SCREENPROCESS_NIGHTVISIONCOLORBLUE,
|
||||
|
||||
SCREENPROCESS_FLASHBANGTIMESCALE,
|
||||
SCREENPROCESS_FLASHBANGFLASHPOSX,
|
||||
SCREENPROCESS_FLASHBANGFLASHPOSY,
|
||||
SCREENPROCESS_FLASHBANGFLASHSIZEX,
|
||||
SCREENPROCESS_FLASHBANGFLASHSIZEY,
|
||||
SCREENPROCESS_FLASHBANGTIMEOUT,
|
||||
SCREENPROCESS_FLASHBANGFORCEAFTERIMAGE,
|
||||
|
||||
SCREENPROCESS_DOFFOCALDISTANCE,
|
||||
SCREENPROCESS_DOFBLURAMOUNT,
|
||||
|
||||
SCREENPROCESS_TRANSITIONTIME,
|
||||
SCREENPROCESS_PRETRANSITIONTIME,
|
||||
SCREENPROCESS_ACTIVE
|
||||
};
|
||||
|
||||
#define SHADERSCHECK !defined(PS2) && !defined (GC) && !defined (NULL_RENDERER)
|
||||
|
||||
//-------------------------------------------------------------------------------------------------
|
||||
// screen processing vars class
|
||||
|
||||
class CScreenVars
|
||||
{
|
||||
public:
|
||||
|
||||
CScreenVars()
|
||||
{
|
||||
// initialize members
|
||||
|
||||
// set shaders to null...
|
||||
m_pRCColorTransfer=0;
|
||||
m_pVPColorTransfer=0;
|
||||
m_pRCMotion=0;
|
||||
m_pRCMotionAmount=0;
|
||||
m_pVPMotion=0;
|
||||
m_pRCBluryScreen=0;
|
||||
m_pVPBluryScreen=0;
|
||||
m_pRCGlareMap=0;
|
||||
m_pRCGlareAmountMap=0;
|
||||
m_pRCGlare=0;
|
||||
m_pRCRenderModeCold=0;
|
||||
m_pRCRenderModeAdv=0;
|
||||
m_pVPGlare=0;
|
||||
m_pRCNightVision=0;
|
||||
m_pVPNightVision=0;
|
||||
m_pRCHeatVision=0;
|
||||
m_pRCHeatSourceDecode=0;
|
||||
m_pRCFlashBang=0;
|
||||
m_pVPFlashBang=0;
|
||||
m_pRCFlashBang=0;
|
||||
m_pVPFlashBang=0;
|
||||
m_pRCBlur=0;
|
||||
m_pVPBlur=0;
|
||||
m_pRCReplRgbToAlpha=0;
|
||||
m_pVPCartoon=0;
|
||||
m_pRCCartoon=0;
|
||||
m_pRCCartoonSilhouette=0;
|
||||
m_pRCDof=0;
|
||||
|
||||
// fade process vars
|
||||
m_bFadeActive=0;
|
||||
m_fFadeTime=0;
|
||||
m_fFadePreTime=0;
|
||||
m_fFadeCurrPreTime=0;
|
||||
m_fFadeCurrTime=0;
|
||||
m_pFadeColor.set(0,0,0,0);
|
||||
m_pFadeCurrColor.set(0,0,0,0);
|
||||
|
||||
// color transfer vars
|
||||
m_bColorTransferActive=0;
|
||||
m_pColorTransferColor.set(0,0,0,0);
|
||||
m_fColorTransferAmount=1;
|
||||
|
||||
// motion blur vars
|
||||
m_bMotionBlurActive=0;
|
||||
m_fMotionBlurAmount=0.9f;
|
||||
m_iMotionBlurType=1;
|
||||
m_iMotionBlurDisplace=0;
|
||||
|
||||
// blury screen vars
|
||||
m_bBlurActive=0;
|
||||
m_fBlurAmount=1.0f;
|
||||
m_pBlurColor.set(1,1,1,1);
|
||||
|
||||
// glare vars
|
||||
m_bGlareActive=0;
|
||||
m_fGlareThreshold=75;
|
||||
m_iGlareBox=2;
|
||||
m_iGlareLumSize=2;
|
||||
m_iGlareSize=128;
|
||||
m_fGlareAmount=1.0f;
|
||||
m_fGlareAmountDynamic=1.0f;
|
||||
m_fGlareMaxAmount=4.0f;
|
||||
m_pCurrGlareMapConst.set(0.2f, 0.2f, 0.2f, 1.0f);
|
||||
m_pCurrSaturation.set(0.0f, 0.0f, 0.0f, 0.2f);
|
||||
m_pCurrContrast.set(0.0f, 0.0f, 0.85f, 0.15f);
|
||||
|
||||
// nightvision vars
|
||||
m_iNightVisionActive=0;
|
||||
m_pNightVisionColor.set(-0.1f, 0.2f, 0.11f, 1.0f);
|
||||
|
||||
// heatvision vars
|
||||
m_iHeatVisionActive=0;
|
||||
m_pCVHeatVision=0;
|
||||
|
||||
// flashbang vars
|
||||
m_bFlashBangActive=0;
|
||||
m_iFlashBangForce=0;
|
||||
m_fFlashBangTimeScale=1.0f;
|
||||
m_fFlashBangTimeOut=1.0f;
|
||||
m_fFlashBangFlashPosX=200;
|
||||
m_fFlashBangFlashPosY=100;
|
||||
m_fFlashBangFlashSizeX=400;
|
||||
m_fFlashBangFlashSizeY=400;
|
||||
|
||||
// cartoon vars
|
||||
m_bCartoonActive=0;
|
||||
|
||||
// depth of field vars
|
||||
m_bDofActive=0;
|
||||
m_fDofFocalDistance=0;
|
||||
|
||||
// screentex vars
|
||||
m_bScreenTexActive=0;
|
||||
|
||||
// console vars
|
||||
m_pCVDisableSfx=0; //GET_CVAR("r_DisableSfx");
|
||||
m_pCVResetSfx=0; //GET_CVAR("r_ResetScreenFx");
|
||||
m_pCVNormalGlare=0; //GET_CVAR("r_Glare");
|
||||
m_pCVMotionBlur=0; //GET_CVAR("r_MotionBlur");
|
||||
m_pCVScreenColorTransfer=0; //GET_CVAR("r_ScreenColorTransfer");
|
||||
m_pCVMotionBlurAmount=0; //GET_CVAR("r_MotionBlurAmount");
|
||||
m_pCVMotionBlurDisplace=0; //GET_CVAR("r_MotionBlurDisplace");
|
||||
m_pCVRenderMode=0; //GET_CVAR("r_RenderMode");
|
||||
|
||||
// note: these are used for correct cryvision functioning
|
||||
m_pCVStencilShadows=0; //GET_CVAR("e_stencil_shadows")
|
||||
m_iPrevStencilShadows=0;
|
||||
|
||||
m_pCVShadowMaps=0; //GET_CVAR("e_shadow_maps");
|
||||
m_iPrevShadowMaps=0;
|
||||
|
||||
m_pCVVolFog=0; //GET_CVAR("r_volumetricfog");
|
||||
m_iPrevVolFog=0;
|
||||
|
||||
m_pCVFog=0; //GET_CVAR("e_fog");
|
||||
m_iPrevFog=0;
|
||||
};
|
||||
|
||||
~CScreenVars()
|
||||
{
|
||||
Release();
|
||||
};
|
||||
|
||||
// shaders used:
|
||||
|
||||
// color transfer shaders
|
||||
void *m_pRCColorTransfer;
|
||||
void *m_pVPColorTransfer;
|
||||
|
||||
// motion blur shaders
|
||||
void *m_pRCMotion,
|
||||
*m_pRCMotionAmount;
|
||||
void *m_pVPMotion;
|
||||
|
||||
// blury screen shaders
|
||||
void *m_pRCBluryScreen;
|
||||
void *m_pVPBluryScreen;
|
||||
|
||||
// image enhancement shaders
|
||||
void *m_pRCGlareMap,
|
||||
*m_pRCGlareAmountMap,
|
||||
*m_pRCGlare,
|
||||
*m_pRCRenderModeCold,
|
||||
*m_pRCRenderModeAdv;
|
||||
|
||||
void *m_pVPGlare;
|
||||
|
||||
// nightvision shaders
|
||||
void *m_pRCNightVision;
|
||||
void *m_pVPNightVision;
|
||||
|
||||
// heatvision shaders
|
||||
void *m_pRCHeatVision,
|
||||
*m_pRCHeatSourceDecode;
|
||||
|
||||
// flashbang shaders
|
||||
void *m_pRCFlashBang;
|
||||
void *m_pVPFlashBang;
|
||||
|
||||
// cartoon shaders
|
||||
void *m_pRCCartoon,
|
||||
*m_pRCCartoonSilhouette;
|
||||
void *m_pVPCartoon;
|
||||
|
||||
// depth of field shaders
|
||||
void *m_pRCDof;
|
||||
|
||||
// shared shaders
|
||||
void *m_pRCBlur;
|
||||
void *m_pRCBlurRECT;
|
||||
void *m_pVPBlur;
|
||||
void *m_pRCReplRgbToAlpha;
|
||||
|
||||
// fade process vars
|
||||
bool m_bFadeActive;
|
||||
float m_fFadeTime,
|
||||
m_fFadeCurrTime,
|
||||
m_fFadePreTime,
|
||||
m_fFadeCurrPreTime;
|
||||
|
||||
color4f m_pFadeColor,
|
||||
m_pFadeCurrColor;
|
||||
|
||||
// color transfer vars
|
||||
bool m_bColorTransferActive;
|
||||
color4f m_pColorTransferColor;
|
||||
float m_fColorTransferAmount;
|
||||
|
||||
// motion blur vars
|
||||
bool m_bMotionBlurActive;
|
||||
float m_fMotionBlurAmount;
|
||||
int m_iMotionBlurType,
|
||||
m_iMotionBlurDisplace;
|
||||
|
||||
// blury screen vars
|
||||
bool m_bBlurActive;
|
||||
float m_fBlurAmount;
|
||||
float m_iBlurWidth,
|
||||
m_iBlurHeight;
|
||||
color4f m_pBlurColor;
|
||||
|
||||
// image enhancement vars
|
||||
bool m_bGlareActive;
|
||||
int m_iGlareBox,
|
||||
m_iGlareLumSize,
|
||||
m_iGlareSize;
|
||||
float m_fGlareAmount,
|
||||
m_fGlareThreshold,
|
||||
m_fGlareAmountDynamic,
|
||||
m_fGlareMaxAmount;
|
||||
color4f m_pCurrGlareMapConst,
|
||||
m_pCurrSaturation,
|
||||
m_pCurrContrast;
|
||||
// nightvision vars
|
||||
int m_iNightVisionActive;
|
||||
color4f m_pNightVisionColor;
|
||||
|
||||
|
||||
// heatvision vars
|
||||
int m_iHeatVisionActive;
|
||||
ICVar *m_pCVHeatVision; //GET_CVAR("CV_r_cryvision");
|
||||
|
||||
// flashbang vars
|
||||
bool m_bFlashBangActive;
|
||||
int m_iFlashBangForce;
|
||||
float m_fFlashBangTimeScale,
|
||||
m_fFlashBangTimeOut,
|
||||
m_fFlashBangFlashPosX,
|
||||
m_fFlashBangFlashPosY,
|
||||
m_fFlashBangFlashSizeX,
|
||||
m_fFlashBangFlashSizeY;
|
||||
|
||||
// cartoon rendering vars
|
||||
bool m_bCartoonActive;
|
||||
|
||||
// depth of field vars
|
||||
bool m_bDofActive;
|
||||
float m_fDofFocalDistance;
|
||||
|
||||
// screen texture vars
|
||||
bool m_bScreenTexActive;
|
||||
|
||||
// console vars
|
||||
ICVar *m_pCVDisableSfx; //GET_CVAR("r_DisableSfx");
|
||||
ICVar *m_pCVResetSfx; //GET_CVAR("r_ResetScreenFx");
|
||||
ICVar *m_pCVNormalGlare; //GET_CVAR("r_Glare");
|
||||
ICVar *m_pCVMotionBlur; //GET_CVAR("r_MotionBlur");
|
||||
ICVar *m_pCVScreenColorTransfer; //GET_CVAR("r_ScreenColorTransfer");
|
||||
ICVar *m_pCVMotionBlurAmount; //GET_CVAR("r_MotionBlurAmount");
|
||||
ICVar *m_pCVMotionBlurDisplace; //GET_CVAR("r_MotionBlurDisplace");
|
||||
ICVar *m_pCVRenderMode; //GET_CVAR("r_RenderMode");
|
||||
|
||||
// note: these are used for correct cryvision functioning
|
||||
ICVar *m_pCVStencilShadows; //GET_CVAR("e_stencil_shadows")
|
||||
int m_iPrevStencilShadows;
|
||||
|
||||
ICVar *m_pCVShadowMaps; //GET_CVAR("e_shadow_maps");
|
||||
int m_iPrevShadowMaps;
|
||||
|
||||
ICVar *m_pCVVolFog; //GET_CVAR("r_volumetricfog");
|
||||
int m_iPrevVolFog;
|
||||
|
||||
ICVar *m_pCVFog; //GET_CVAR("e_fog");
|
||||
int m_iPrevFog;
|
||||
|
||||
ICVar *m_pCVMaxTexLodBias; //GET_CVAR("r_MaxTexLodBias");
|
||||
float m_fPrevMaxTexLodBias;
|
||||
|
||||
void Create(void);
|
||||
void Release(void);
|
||||
void Reset(void);
|
||||
};
|
||||
|
||||
#endif
|
||||
670
RenderDll/Common/RendElements/CREScreenProcess.cpp
Normal file
670
RenderDll/Common/RendElements/CREScreenProcess.cpp
Normal file
@@ -0,0 +1,670 @@
|
||||
/*
|
||||
=======================================================================
|
||||
FILE : CREScreenProcess.cpp
|
||||
DESC : screen processing render element
|
||||
PROJ : Crytek Engine
|
||||
CODER: Tiago Sousa
|
||||
|
||||
TODO:
|
||||
.Convert all screen based effects into this interface
|
||||
|
||||
Last Update: 16/06/2003
|
||||
=======================================================================
|
||||
*/
|
||||
|
||||
#include "RenderPCH.h"
|
||||
|
||||
// some helper macros
|
||||
#define SET_PARAMETER(pProcess, pParam, pType, pValue) \
|
||||
case (pProcess): (pParam)=*((pType*) pValue); break; \
|
||||
|
||||
#define RETURN_PARAMETER(pProcess, pParam) \
|
||||
case (pProcess): return (void*)&pParam;\
|
||||
|
||||
// constructor/destructor
|
||||
CREScreenProcess::CREScreenProcess()
|
||||
{
|
||||
// setup screen process renderer type
|
||||
mfSetType(eDATA_ScreenProcess);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
m_pVars=0;
|
||||
|
||||
// create class vars if necessary...
|
||||
if(!m_pVars)
|
||||
{
|
||||
m_pVars=new CScreenVars;
|
||||
m_pVars->Create();
|
||||
}
|
||||
}
|
||||
|
||||
CREScreenProcess::~CREScreenProcess()
|
||||
{
|
||||
SAFE_DELETE(m_pVars)
|
||||
};
|
||||
|
||||
// prepare screen processing
|
||||
void CREScreenProcess:: mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
// make sure this is not processed, when rendering to refractive texture..
|
||||
if (gRenDev->m_RP.m_bDrawToTexture)
|
||||
{
|
||||
gRenDev->m_RP.m_pRE = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
}
|
||||
|
||||
gRenDev->m_RP.m_FlagsPerFlush |= RBSI_DRAWAS2D;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
void CREScreenProcess::mfReset()
|
||||
{
|
||||
if(m_pVars)
|
||||
{
|
||||
m_pVars->Reset();
|
||||
}
|
||||
}
|
||||
|
||||
// activate screen processes
|
||||
void CREScreenProcess:: mfActivate(int pProcess)
|
||||
{
|
||||
switch(pProcess)
|
||||
{
|
||||
case SCREENPROCESS_FADE:
|
||||
if(m_pVars->m_fFadeTime)
|
||||
{
|
||||
m_pVars->m_bFadeActive=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// reset fade
|
||||
m_pVars->m_bFadeActive=0;
|
||||
m_pVars->m_fFadePreTime=0.0f;
|
||||
m_pVars->m_fFadeCurrPreTime=0.0f;
|
||||
}
|
||||
break;
|
||||
|
||||
case SCREENPROCESS_BLUR:
|
||||
m_pVars->m_bBlurActive=1;
|
||||
break;
|
||||
case SCREENPROCESS_COLORTRANSFER:
|
||||
m_pVars->m_bColorTransferActive=1;
|
||||
break;
|
||||
case SCREENPROCESS_MOTIONBLUR:
|
||||
m_pVars->m_bMotionBlurActive=1;
|
||||
break;
|
||||
case SCREENPROCESS_GLARE:
|
||||
m_pVars->m_bGlareActive=1;
|
||||
break;
|
||||
case SCREENPROCESS_NIGHTVISION:
|
||||
// m_pVars->m_bNightVisionActive=1;
|
||||
if(m_pVars->m_pCVHeatVision)
|
||||
{
|
||||
m_pVars->m_pCVHeatVision->Set(1);
|
||||
}
|
||||
|
||||
break;
|
||||
case SCREENPROCESS_HEATVISION:
|
||||
if(m_pVars->m_pCVHeatVision)
|
||||
{
|
||||
m_pVars->m_pCVHeatVision->Set(1);
|
||||
}
|
||||
break;
|
||||
case SCREENPROCESS_CARTOON:
|
||||
m_pVars->m_bCartoonActive=1;
|
||||
// reset fade amount
|
||||
if(iConsole)
|
||||
{
|
||||
if(m_pVars->m_pCVMaxTexLodBias)
|
||||
{
|
||||
if(m_pVars->m_bCartoonActive)
|
||||
{
|
||||
m_pVars->m_fPrevMaxTexLodBias=m_pVars->m_pCVMaxTexLodBias->GetFVal();
|
||||
m_pVars->m_pCVMaxTexLodBias->Set(-1.5f);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_pVars->m_fPrevMaxTexLodBias=m_pVars->m_pCVMaxTexLodBias->GetFVal();
|
||||
m_pVars->m_pCVMaxTexLodBias->Set(0.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SCREENPROCESS_FLASHBANG:
|
||||
m_pVars->m_bFlashBangActive=1;
|
||||
// reset flash time out
|
||||
m_pVars->m_fFlashBangTimeOut=1.0f;
|
||||
break;
|
||||
case SCREENPROCESS_DOF:
|
||||
m_pVars->m_bDofActive=1;
|
||||
// reset dof focal distance plane
|
||||
m_pVars->m_fDofFocalDistance=20.0f;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
// set screen processing parameters
|
||||
int CREScreenProcess:: mfSetParameter(int iProcess, int iParams, void *dwValue)
|
||||
{
|
||||
switch(iProcess)
|
||||
{
|
||||
// set screen fade parameters
|
||||
case SCREENPROCESS_FADE:
|
||||
switch(iParams)
|
||||
{
|
||||
SET_PARAMETER(SCREENPROCESS_FADECOLOR, m_pVars->m_pFadeColor, color4f, dwValue)
|
||||
|
||||
case SCREENPROCESS_ACTIVE:
|
||||
if(*((bool*) dwValue)==1)
|
||||
{
|
||||
m_pVars->m_bFadeActive=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// reset fade
|
||||
m_pVars->m_bFadeActive=0;
|
||||
m_pVars->m_fFadePreTime=0.0f;
|
||||
m_pVars->m_fFadeCurrPreTime=0.0f;
|
||||
}
|
||||
break;
|
||||
|
||||
case SCREENPROCESS_TRANSITIONTIME:
|
||||
m_pVars->m_fFadeTime=*((float*) dwValue);
|
||||
m_pVars->m_fFadeCurrTime=(float) fabs(*((float*) dwValue));
|
||||
break;
|
||||
|
||||
SET_PARAMETER(SCREENPROCESS_PRETRANSITIONTIME, m_pVars->m_fFadePreTime, float, dwValue)
|
||||
}
|
||||
break;
|
||||
|
||||
// set screen blur parameters
|
||||
case SCREENPROCESS_BLUR:
|
||||
switch(iParams)
|
||||
{
|
||||
SET_PARAMETER(SCREENPROCESS_BLURAMOUNT, m_pVars->m_fBlurAmount, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bBlurActive, bool, dwValue)
|
||||
|
||||
case SCREENPROCESS_BLURCOLORRED:
|
||||
m_pVars->m_pBlurColor.r=*(float*)dwValue;
|
||||
break;
|
||||
case SCREENPROCESS_BLURCOLORGREEN:
|
||||
m_pVars->m_pBlurColor.g=*(float*)dwValue;
|
||||
break;
|
||||
case SCREENPROCESS_BLURCOLORBLUE:
|
||||
m_pVars->m_pBlurColor.b=*(float*)dwValue;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
// set color transfer parameters
|
||||
case SCREENPROCESS_COLORTRANSFER:
|
||||
switch(iParams)
|
||||
{
|
||||
SET_PARAMETER(SCREENPROCESS_COLORTRANSFERAMOUNT, m_pVars->m_fColorTransferAmount, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_COLORTRANSFERCOLOR, m_pVars->m_pColorTransferColor, color4f, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bColorTransferActive, bool, dwValue)
|
||||
}
|
||||
break;
|
||||
|
||||
// set motion blur parameters
|
||||
case SCREENPROCESS_MOTIONBLUR:
|
||||
switch(iParams)
|
||||
{
|
||||
SET_PARAMETER(SCREENPROCESS_MOTIONBLURDISPLACE, m_pVars->m_iMotionBlurDisplace, int, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_MOTIONBLURAMOUNT, m_pVars->m_fMotionBlurAmount, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_MOTIONBLURTYPE, m_pVars->m_iMotionBlurType, int, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bMotionBlurActive, bool, dwValue)
|
||||
}
|
||||
break;
|
||||
|
||||
// set glare parameters
|
||||
case SCREENPROCESS_GLARE:
|
||||
switch(iParams)
|
||||
{
|
||||
SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bGlareActive, bool, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_GLAREAMOUNT, m_pVars->m_fGlareAmount, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_GLARELUMSIZE, m_pVars->m_iGlareLumSize, int, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_GLAREMAXAMOUNT, m_pVars->m_fGlareMaxAmount, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_GLAREBOXSIZE, m_pVars->m_iGlareSize, int, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_GLARETHRESHOLD, m_pVars->m_fGlareThreshold, float, dwValue)
|
||||
}
|
||||
break;
|
||||
|
||||
// set nightvision parameters
|
||||
case SCREENPROCESS_NIGHTVISION:
|
||||
switch(iParams)
|
||||
{
|
||||
//SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bNightVisionActive, bool, dwValue)
|
||||
case SCREENPROCESS_ACTIVE:
|
||||
// m_pVars->m_bNightVisionActive=*(bool*)dwValue;
|
||||
|
||||
if(m_pVars->m_pCVHeatVision)
|
||||
{
|
||||
m_pVars->m_pCVHeatVision->Set(*((int*) dwValue));
|
||||
|
||||
/*
|
||||
// must disable some rendering in order to cryvision function properly
|
||||
if(m_pVars->m_pCVHeatVision->GetIVal())
|
||||
{
|
||||
m_pVars->m_iPrevStencilShadows=m_pVars->m_pCVStencilShadows->GetIVal();
|
||||
m_pVars->m_iPrevShadowMaps=m_pVars->m_pCVShadowMaps->GetIVal();
|
||||
m_pVars->m_iPrevVolFog=m_pVars->m_pCVVolFog->GetIVal();
|
||||
//m_pVars->m_iPrevFog=m_pVars->m_pCVFog->GetIVal();
|
||||
|
||||
m_pVars->m_pCVStencilShadows->Set(0);
|
||||
m_pVars->m_pCVShadowMaps->Set(0);
|
||||
m_pVars->m_pCVVolFog->Set(0);
|
||||
//m_pVars->m_pCVFog->Set(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_pVars->m_pCVStencilShadows->Set(m_pVars->m_iPrevStencilShadows);
|
||||
m_pVars->m_pCVShadowMaps->Set(m_pVars->m_iPrevShadowMaps);
|
||||
m_pVars->m_pCVVolFog->Set(m_pVars->m_iPrevVolFog);
|
||||
//m_pVars->m_pCVFog->Set(m_pVars->m_iPrevFog);
|
||||
}*/
|
||||
}
|
||||
break;
|
||||
|
||||
case SCREENPROCESS_NIGHTVISIONCOLORRED:
|
||||
m_pVars->m_pNightVisionColor.r=*(float*)dwValue;
|
||||
break;
|
||||
case SCREENPROCESS_NIGHTVISIONCOLORGREEN:
|
||||
m_pVars->m_pNightVisionColor.g=*(float*)dwValue;
|
||||
break;
|
||||
case SCREENPROCESS_NIGHTVISIONCOLORBLUE:
|
||||
m_pVars->m_pNightVisionColor.b=*(float*)dwValue;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
// set heatvision parameters
|
||||
case SCREENPROCESS_HEATVISION:
|
||||
switch(iParams)
|
||||
{
|
||||
case SCREENPROCESS_ACTIVE:
|
||||
if(m_pVars->m_pCVHeatVision)
|
||||
{
|
||||
m_pVars->m_pCVHeatVision->Set(*((int*) dwValue));
|
||||
}
|
||||
break;
|
||||
|
||||
//SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bHeatVisionActive, bool, dwValue)
|
||||
}
|
||||
break;
|
||||
|
||||
// set flashbang parameters
|
||||
case SCREENPROCESS_FLASHBANG:
|
||||
switch(iParams)
|
||||
{
|
||||
case SCREENPROCESS_ACTIVE:
|
||||
m_pVars->m_bFlashBangActive= *((bool*) dwValue);
|
||||
// reset flash time out
|
||||
m_pVars->m_fFlashBangTimeOut=1.0f;
|
||||
break;
|
||||
|
||||
SET_PARAMETER(SCREENPROCESS_FLASHBANGTIMESCALE, m_pVars->m_fFlashBangTimeScale, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_FLASHBANGFLASHPOSX, m_pVars->m_fFlashBangFlashPosX, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_FLASHBANGFLASHPOSY, m_pVars->m_fFlashBangFlashPosY, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_FLASHBANGFLASHSIZEX, m_pVars->m_fFlashBangFlashSizeX, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_FLASHBANGFLASHSIZEY, m_pVars->m_fFlashBangFlashSizeY, float, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_FLASHBANGFORCEAFTERIMAGE, m_pVars->m_iFlashBangForce, int, dwValue)
|
||||
}
|
||||
break;
|
||||
|
||||
// set cartoon parameters
|
||||
case SCREENPROCESS_CARTOON:
|
||||
switch(iParams)
|
||||
{
|
||||
//SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bCartoonActive, bool, dwValue)
|
||||
case SCREENPROCESS_ACTIVE:
|
||||
m_pVars->m_bCartoonActive= *((bool*) dwValue);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
// set dof parameters
|
||||
case SCREENPROCESS_DOF:
|
||||
switch(iParams)
|
||||
{
|
||||
SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bDofActive, bool, dwValue)
|
||||
SET_PARAMETER(SCREENPROCESS_DOFFOCALDISTANCE, m_pVars->m_fDofFocalDistance, float, dwValue)
|
||||
}
|
||||
break;
|
||||
|
||||
// set screentex parameters
|
||||
case SCREENPROCESS_SCREENTEX:
|
||||
switch(iParams)
|
||||
{
|
||||
SET_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bScreenTexActive, bool, dwValue)
|
||||
}
|
||||
break;
|
||||
|
||||
//default:
|
||||
// break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// get screen processing parameters
|
||||
void *CREScreenProcess:: mfGetParameter(int iProcess, int iParams)
|
||||
{
|
||||
switch(iProcess)
|
||||
{
|
||||
// return screen fade parameters
|
||||
case SCREENPROCESS_FADE:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_TRANSITIONTIME, m_pVars->m_fFadeTime)
|
||||
RETURN_PARAMETER(SCREENPROCESS_PRETRANSITIONTIME, m_pVars->m_fFadePreTime)
|
||||
RETURN_PARAMETER(SCREENPROCESS_FADECOLOR, m_pVars->m_pFadeColor)
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bFadeActive)
|
||||
}
|
||||
break;
|
||||
|
||||
// return screen blur parameters
|
||||
case SCREENPROCESS_BLUR:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_BLURAMOUNT, m_pVars->m_fBlurAmount)
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bBlurActive)
|
||||
RETURN_PARAMETER(SCREENPROCESS_BLURCOLORRED, m_pVars->m_pBlurColor.r)
|
||||
RETURN_PARAMETER(SCREENPROCESS_BLURCOLORGREEN, m_pVars->m_pBlurColor.g)
|
||||
RETURN_PARAMETER(SCREENPROCESS_BLURCOLORBLUE, m_pVars->m_pBlurColor.b)
|
||||
}
|
||||
break;
|
||||
|
||||
// return color transfer parameters
|
||||
case SCREENPROCESS_COLORTRANSFER:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_COLORTRANSFERAMOUNT, m_pVars->m_fColorTransferAmount)
|
||||
RETURN_PARAMETER(SCREENPROCESS_COLORTRANSFERCOLOR, m_pVars->m_pColorTransferColor)
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bColorTransferActive)
|
||||
}
|
||||
break;
|
||||
|
||||
// return motion blur parameters
|
||||
case SCREENPROCESS_MOTIONBLUR:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_MOTIONBLURDISPLACE, m_pVars->m_iMotionBlurDisplace)
|
||||
RETURN_PARAMETER(SCREENPROCESS_MOTIONBLURAMOUNT, m_pVars->m_fMotionBlurAmount)
|
||||
RETURN_PARAMETER(SCREENPROCESS_MOTIONBLURTYPE, m_pVars->m_iMotionBlurType)
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bMotionBlurActive)
|
||||
}
|
||||
break;
|
||||
|
||||
// return glare parameters
|
||||
case SCREENPROCESS_GLARE:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bGlareActive)
|
||||
RETURN_PARAMETER(SCREENPROCESS_GLAREAMOUNT, m_pVars->m_fGlareAmount)
|
||||
RETURN_PARAMETER(SCREENPROCESS_GLARELUMSIZE, m_pVars->m_iGlareLumSize)
|
||||
RETURN_PARAMETER(SCREENPROCESS_GLAREMAXAMOUNT, m_pVars->m_fGlareMaxAmount)
|
||||
RETURN_PARAMETER(SCREENPROCESS_GLAREBOXSIZE, m_pVars->m_iGlareSize)
|
||||
RETURN_PARAMETER(SCREENPROCESS_GLARETHRESHOLD, m_pVars->m_fGlareThreshold)
|
||||
}
|
||||
break;
|
||||
|
||||
// return nightvision parameters
|
||||
case SCREENPROCESS_NIGHTVISION:
|
||||
switch(iParams)
|
||||
{
|
||||
case SCREENPROCESS_ACTIVE:
|
||||
//RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bNightVisionActive)
|
||||
if(m_pVars->m_pCVHeatVision)
|
||||
{
|
||||
m_pVars->m_iNightVisionActive=m_pVars->m_pCVHeatVision->GetIVal();
|
||||
}
|
||||
return (void*)&m_pVars->m_iNightVisionActive;
|
||||
break;
|
||||
|
||||
RETURN_PARAMETER(SCREENPROCESS_NIGHTVISIONCOLORRED, m_pVars->m_pNightVisionColor.r)
|
||||
RETURN_PARAMETER(SCREENPROCESS_NIGHTVISIONCOLORGREEN, m_pVars->m_pNightVisionColor.g)
|
||||
RETURN_PARAMETER(SCREENPROCESS_NIGHTVISIONCOLORBLUE, m_pVars->m_pNightVisionColor.b)
|
||||
}
|
||||
break;
|
||||
|
||||
// return heatvision parameters
|
||||
case SCREENPROCESS_HEATVISION:
|
||||
switch(iParams)
|
||||
{
|
||||
case SCREENPROCESS_ACTIVE:
|
||||
if(m_pVars->m_pCVHeatVision)
|
||||
{
|
||||
m_pVars->m_iHeatVisionActive=m_pVars->m_pCVHeatVision->GetIVal();
|
||||
}
|
||||
return (void*)&m_pVars->m_iHeatVisionActive;
|
||||
break;
|
||||
//RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bHeatVisionActive)
|
||||
}
|
||||
break;
|
||||
|
||||
// return flashbang parameters
|
||||
case SCREENPROCESS_FLASHBANG:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bFlashBangActive)
|
||||
RETURN_PARAMETER(SCREENPROCESS_FLASHBANGTIMESCALE, m_pVars->m_fFlashBangTimeScale)
|
||||
RETURN_PARAMETER(SCREENPROCESS_FLASHBANGTIMEOUT, m_pVars->m_fFlashBangTimeOut)
|
||||
RETURN_PARAMETER(SCREENPROCESS_FLASHBANGFLASHPOSX, m_pVars->m_fFlashBangFlashPosX)
|
||||
RETURN_PARAMETER(SCREENPROCESS_FLASHBANGFLASHPOSY, m_pVars->m_fFlashBangFlashPosY)
|
||||
RETURN_PARAMETER(SCREENPROCESS_FLASHBANGFLASHSIZEX, m_pVars->m_fFlashBangFlashSizeX)
|
||||
RETURN_PARAMETER(SCREENPROCESS_FLASHBANGFLASHSIZEY, m_pVars->m_fFlashBangFlashSizeY)
|
||||
RETURN_PARAMETER(SCREENPROCESS_FLASHBANGFORCEAFTERIMAGE, m_pVars->m_iFlashBangForce)
|
||||
}
|
||||
break;
|
||||
|
||||
// return cartoon parameters
|
||||
case SCREENPROCESS_CARTOON:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bCartoonActive)
|
||||
}
|
||||
break;
|
||||
|
||||
// return dof parameters
|
||||
case SCREENPROCESS_DOF:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bDofActive)
|
||||
RETURN_PARAMETER(SCREENPROCESS_DOFFOCALDISTANCE, m_pVars->m_fDofFocalDistance)
|
||||
}
|
||||
break;
|
||||
|
||||
// return screentex parameters
|
||||
case SCREENPROCESS_SCREENTEX:
|
||||
switch(iParams)
|
||||
{
|
||||
RETURN_PARAMETER(SCREENPROCESS_ACTIVE, m_pVars->m_bScreenTexActive)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// get shaders
|
||||
void CScreenVars:: Create(void)
|
||||
{
|
||||
#if SHADERSCHECK
|
||||
m_pRCBlur = CPShader::mfForName("CGRCBlur");
|
||||
#ifdef OPENGL
|
||||
m_pRCBlurRECT = CPShader::mfForName("CGRCBlurRECT");
|
||||
#else
|
||||
m_pRCBlurRECT = NULL;
|
||||
#endif
|
||||
m_pVPBlur = CVProgram::mfForName("CGVProgBlur");
|
||||
m_pRCMotion = CPShader::mfForName("CGRCMotion");
|
||||
m_pRCMotionAmount = CPShader::mfForName("CGRCMotionAmount");
|
||||
m_pVPMotion = CVProgram::mfForName("CGVProgMotion");
|
||||
m_pRCGlareMap = CPShader::mfForName("CGRCGlareMap");
|
||||
m_pRCGlareAmountMap = CPShader::mfForName("CGRCGlareAmount");
|
||||
m_pRCGlare = CPShader::mfForName("CGRCGlare");
|
||||
m_pRCRenderModeCold = CPShader::mfForName("CGRCRenderModeCold");
|
||||
m_pRCRenderModeAdv= CPShader::mfForName("CGRCRenderModeAdv");
|
||||
m_pVPGlare = CVProgram::mfForName("CGVProgGlare");
|
||||
m_pRCColorTransfer = CPShader::mfForName("CGRCColorTransfer");
|
||||
m_pVPColorTransfer = CVProgram::mfForName("CGVProgColorTransfer");
|
||||
m_pRCBluryScreen = CPShader::mfForName("CGRCBluryScreen");
|
||||
m_pVPBluryScreen = CVProgram::mfForName("CGVProgBluryScreen");
|
||||
m_pRCNightVision = CPShader::mfForName("CGRCNightVisionGlare");
|
||||
m_pVPNightVision = CVProgram::mfForName("CGVProgNightVisionGlare");
|
||||
m_pRCHeatVision = CPShader::mfForName("CGRCHeatSourcePass");
|
||||
m_pRCHeatSourceDecode = CPShader::mfForName("CGRCHeatSourceDecode");
|
||||
m_pVPFlashBang = CVProgram::mfForName("CGVProg_FlashBang");
|
||||
m_pRCFlashBang = CPShader::mfForName("CGRCFlashBang");
|
||||
m_pVPCartoon = CVProgram::mfForName("CGVProgCartoon");
|
||||
m_pRCCartoon = CPShader::mfForName("CGRCCartoon");
|
||||
m_pRCCartoonSilhouette = CPShader::mfForName("CGRCCartoonSilhouete");
|
||||
m_pRCDof = CPShader::mfForName("CGRCDof");
|
||||
m_pRCReplRgbToAlpha = CPShader::mfForName("CGRCReplRgbToAlpha");
|
||||
#endif
|
||||
|
||||
if(iConsole)
|
||||
{
|
||||
m_pCVDisableSfx= iConsole->GetCVar("r_DisableSfx");
|
||||
m_pCVResetSfx=iConsole->GetCVar("r_ResetScreenFx");
|
||||
m_pCVNormalGlare=iConsole->GetCVar("r_Glare");
|
||||
m_pCVMotionBlur=iConsole->GetCVar("r_MotionBlur");
|
||||
m_pCVScreenColorTransfer=iConsole->GetCVar("r_ScreenColorTransfer");
|
||||
m_pCVMotionBlurAmount=iConsole->GetCVar("r_MotionBlurAmount");
|
||||
m_pCVMotionBlurDisplace=iConsole->GetCVar("r_MotionBlurDisplace");
|
||||
m_pCVRenderMode=iConsole->GetCVar("r_RenderMode");
|
||||
|
||||
// note: these are used for correct cryvision functioning
|
||||
m_pCVStencilShadows=iConsole->GetCVar("e_stencil_shadows");
|
||||
m_iPrevStencilShadows=m_pCVStencilShadows->GetIVal();
|
||||
|
||||
m_pCVShadowMaps=iConsole->GetCVar("e_shadow_maps");
|
||||
m_iPrevShadowMaps=m_pCVShadowMaps->GetIVal();
|
||||
|
||||
m_pCVVolFog=iConsole->GetCVar("r_VolumetricFog");
|
||||
m_iPrevVolFog= m_pCVVolFog->GetIVal();
|
||||
|
||||
m_pCVFog=iConsole->GetCVar("e_fog");
|
||||
m_iPrevFog=m_pCVFog->GetIVal();
|
||||
|
||||
m_pCVMaxTexLodBias=iConsole->GetCVar("r_MaxTexLodBias");
|
||||
m_fPrevMaxTexLodBias=m_pCVMaxTexLodBias->GetFVal();
|
||||
|
||||
m_pCVHeatVision=iConsole->GetCVar("r_Cryvision");
|
||||
m_iHeatVisionActive=m_pCVHeatVision->GetIVal();
|
||||
|
||||
// reset fade amount
|
||||
ICVar *pHudFadeAmount=iConsole->GetCVar("hud_fadeamount");
|
||||
if(pHudFadeAmount)
|
||||
{
|
||||
pHudFadeAmount->Set(1);
|
||||
}
|
||||
}
|
||||
|
||||
// fade process vars
|
||||
m_bFadeActive=0;
|
||||
m_fFadeTime=0;
|
||||
m_fFadePreTime=0;
|
||||
m_fFadeCurrPreTime=0;
|
||||
m_fFadeCurrTime=0;
|
||||
m_pFadeColor.set(0,0,0,0);
|
||||
m_pFadeCurrColor.set(0,0,0,0);
|
||||
}
|
||||
|
||||
// release/free data..
|
||||
void CScreenVars:: Release(void)
|
||||
{
|
||||
/* // check if cryvision is active when exiting game, need to restore console vars..
|
||||
if(m_pCVHeatVision)
|
||||
{
|
||||
if(m_pCVHeatVision->GetIVal())
|
||||
{
|
||||
if(m_pCVStencilShadows)
|
||||
{
|
||||
m_pCVStencilShadows->Set(m_iPrevStencilShadows);
|
||||
}
|
||||
|
||||
if(m_pCVShadowMaps->GetIVal())
|
||||
{
|
||||
m_pCVShadowMaps->Set(m_iPrevShadowMaps);
|
||||
}
|
||||
|
||||
if(m_pCVVolFog->GetIVal())
|
||||
{
|
||||
m_pCVVolFog->Set(m_iPrevVolFog);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// reset effects state
|
||||
void CScreenVars:: Reset(void)
|
||||
{
|
||||
// color transfer vars
|
||||
m_bColorTransferActive=0;
|
||||
m_pColorTransferColor.set(0,0,0,0);
|
||||
m_fColorTransferAmount=1;
|
||||
|
||||
// blury screen vars
|
||||
m_bBlurActive=0;
|
||||
m_fBlurAmount=1.0f;
|
||||
m_pBlurColor.set(1,1,1,1);
|
||||
|
||||
// nightvision vars
|
||||
m_iNightVisionActive=0;
|
||||
m_pNightVisionColor.set(-0.1f, 0.2f, 0.11f, 1.0f);
|
||||
|
||||
// heatvision vars
|
||||
if(m_pCVHeatVision)
|
||||
{
|
||||
// m_pHeatVision->Set(0);
|
||||
m_iHeatVisionActive=m_pCVHeatVision->GetIVal();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_iHeatVisionActive=0;
|
||||
}
|
||||
|
||||
// flashbang vars
|
||||
m_bFlashBangActive=0;
|
||||
m_fFlashBangTimeScale=1.0f;
|
||||
m_fFlashBangTimeOut=1.0f;
|
||||
m_fFlashBangFlashPosX=200;
|
||||
m_fFlashBangFlashPosY=100;
|
||||
m_fFlashBangFlashSizeX=400;
|
||||
m_fFlashBangFlashSizeY=400;
|
||||
|
||||
// screentex vars
|
||||
m_bScreenTexActive=0;
|
||||
m_pCurrGlareMapConst.set(0.2f, 0.2f, 0.2f, 1.0f);
|
||||
m_pCurrSaturation.set(0.0f, 0.0f, 0.0f, 0.2f);
|
||||
m_pCurrContrast.set(0.0f, 0.0f, 0.85f, 0.15f);
|
||||
|
||||
|
||||
// reset fade amount
|
||||
ICVar *pHudFadeAmount=iConsole->GetCVar("hud_fadeamount");
|
||||
if(pHudFadeAmount)
|
||||
{
|
||||
pHudFadeAmount->Set(1);
|
||||
}
|
||||
|
||||
m_bFadeActive=0;
|
||||
m_fFadeTime=0;
|
||||
m_fFadePreTime=0;
|
||||
m_fFadeCurrPreTime=0;
|
||||
m_fFadeCurrTime=0;
|
||||
m_pFadeColor.set(0,0,0,0);
|
||||
m_pFadeCurrColor.set(0,0,0,0);
|
||||
}
|
||||
54
RenderDll/Common/RendElements/CREScreenProcess.h
Normal file
54
RenderDll/Common/RendElements/CREScreenProcess.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
=====================================================================
|
||||
FILE : CREScreenProcess.h
|
||||
DESC : Screen processing render element
|
||||
PROJ : Crytek Engine
|
||||
CODER: Tiago Sousa
|
||||
|
||||
Last Update: 13/06/2003
|
||||
=====================================================================
|
||||
*/
|
||||
|
||||
#ifndef __CRESCREENPROCESS_H__
|
||||
#define __CRESCREENPROCESS_H__
|
||||
|
||||
// screen processing vars class
|
||||
class CScreenVars;
|
||||
|
||||
// screen processing render element
|
||||
class CREScreenProcess : public CRendElement
|
||||
{
|
||||
friend class CD3D9Renderer;
|
||||
friend class CGLRenderer;
|
||||
|
||||
public:
|
||||
|
||||
// constructor/destructor
|
||||
CREScreenProcess();
|
||||
|
||||
virtual ~CREScreenProcess();
|
||||
|
||||
// prepare screen processing
|
||||
virtual void mfPrepare();
|
||||
// render screen processing
|
||||
virtual bool mfDraw(SShader *ef, SShaderPass *sfm);
|
||||
|
||||
// begin screen processing
|
||||
virtual void mfActivate(int iProcess);
|
||||
// reset
|
||||
virtual void mfReset(void);
|
||||
|
||||
// set/get methods
|
||||
virtual int mfSetParameter(int iProcess, int iParams, void *dwValue);
|
||||
virtual void *mfGetParameter(int iProcess, int iParams);
|
||||
|
||||
CScreenVars *GetVars() { return m_pVars; }
|
||||
|
||||
private:
|
||||
virtual bool mfDrawLowSpec(SShader *ef, SShaderPass *sfm);
|
||||
|
||||
// screen processing vars class
|
||||
CScreenVars *m_pVars;
|
||||
};
|
||||
|
||||
#endif
|
||||
22
RenderDll/Common/RendElements/CREShadowMap.cpp
Normal file
22
RenderDll/Common/RendElements/CREShadowMap.cpp
Normal file
@@ -0,0 +1,22 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
/*
|
||||
void CREShadowMap::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_DynLMask |= m_DynMask;
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
CREShadowMap::~CREShadowMap()
|
||||
{
|
||||
if(m_CustomData)
|
||||
{
|
||||
delete m_CustomData;
|
||||
m_CustomData=0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
326
RenderDll/Common/RendElements/CRESky.cpp
Normal file
326
RenderDll/Common/RendElements/CRESky.cpp
Normal file
@@ -0,0 +1,326 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
#include "CRESky.h"
|
||||
#include "i3dengine.h"
|
||||
|
||||
void CRESky::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
bool CRESky::mfDraw(SShader *ef, SShaderPass *sfm)
|
||||
{
|
||||
int bPrevClipPl = gRenDev->m_RP.m_ClipPlaneEnabled;
|
||||
if (bPrevClipPl)
|
||||
gRenDev->EF_SetClipPlane(false, NULL, false);
|
||||
|
||||
if(sfm >= &ef->m_Passes[1] && ef->m_Sky)
|
||||
{ // draw sky sphere vertices at pass 1
|
||||
bool bPrevFog = gRenDev->EnableFog(false);
|
||||
DrawSkySphere(ef->m_Sky->m_fSkyLayerHeight);
|
||||
gRenDev->EnableFog(bPrevFog);
|
||||
if (bPrevClipPl)
|
||||
gRenDev->EF_SetClipPlane(true, &gRenDev->m_RP.m_CurClipPlane.m_Normal.x, gRenDev->m_RP.m_bClipPlaneRefract);
|
||||
return true;
|
||||
}
|
||||
|
||||
// pass 0 - skybox
|
||||
|
||||
if (!ef->m_Sky || !ef->m_Sky->m_SkyBox[0])
|
||||
{
|
||||
if (bPrevClipPl)
|
||||
gRenDev->EF_SetClipPlane(true, &gRenDev->m_RP.m_CurClipPlane.m_Normal.x, gRenDev->m_RP.m_bClipPlaneRefract);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool bPrevFog = gRenDev->EnableFog(false);
|
||||
|
||||
gRenDev->SetColorOp(eCO_MODULATE, eCO_MODULATE, eCA_Texture | (eCA_Constant<<3), eCA_Texture | (eCA_Constant<<3));
|
||||
|
||||
if (gRenDev->m_bHeatVision)
|
||||
gRenDev->SetMaterialColor(0.3f,0.3f,0.3f,1.0f);
|
||||
else
|
||||
gRenDev->SetMaterialColor(1,1,1,m_fAlpha);
|
||||
if(m_fAlpha<1.f)
|
||||
gRenDev->EF_SetState(GS_NODEPTHTEST | GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA);
|
||||
else
|
||||
gRenDev->EF_SetState(GS_NODEPTHTEST);
|
||||
gRenDev->SetCullMode(R_CULL_BACK);
|
||||
|
||||
#if !defined(PS2) && !defined (GC) && !defined (NULL_RENDERER)
|
||||
CPShader *fpSky = NULL;
|
||||
if (gRenDev->m_RP.m_PersFlags & RBPF_HDR)
|
||||
{
|
||||
if (!(ef->m_Flags & EF_SKY_HDR))
|
||||
fpSky = PShaderForName(gRenDev->m_RP.m_PS_HDR_SkyFake, "CGRC_HDR_SkyFake_PS20");
|
||||
else
|
||||
fpSky = PShaderForName(gRenDev->m_RP.m_PS_HDR_Sky, "CGRC_HDR_Sky_PS20");
|
||||
if (fpSky)
|
||||
fpSky->mfSet(true, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
const float fSkyBoxSize = SKY_BOX_SIZE;
|
||||
|
||||
{ // top
|
||||
struct_VERTEX_FORMAT_P3F_TEX2F data[] =
|
||||
{
|
||||
{Vec3(fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize), 1, 1.f-1},
|
||||
{Vec3(-fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize), 0, 1.f-1},
|
||||
{Vec3(fSkyBoxSize, fSkyBoxSize, fSkyBoxSize), 1, 1.f-0},
|
||||
{Vec3(-fSkyBoxSize, fSkyBoxSize, fSkyBoxSize), 0, 1.f-0}
|
||||
};
|
||||
|
||||
gRenDev->SetTexture(ef->m_Sky->m_SkyBox[2]->m_Bind);
|
||||
gRenDev->SetTexClampMode(true);
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),4);
|
||||
}
|
||||
|
||||
Vec3d camera = gRenDev->GetCamera().GetPos();
|
||||
camera.z = max(0,camera.z);
|
||||
|
||||
float fWaterCamDiff = max(0,camera.z-m_fTerrainWaterLevel);
|
||||
|
||||
float fMaxDist = iSystem->GetI3DEngine()->GetMaxViewDist()/1024.f;
|
||||
float P = (fWaterCamDiff)/128 + max(0,(fWaterCamDiff)*0.03f/fMaxDist);
|
||||
float D = (fWaterCamDiff)/10.0f*fSkyBoxSize/124.0f - P + 8;
|
||||
|
||||
P*=m_fSkyBoxStretching;
|
||||
|
||||
if(m_fTerrainWaterLevel>camera.z && SRendItem::m_RecurseLevel==1)
|
||||
{
|
||||
P = (fWaterCamDiff);
|
||||
D = (fWaterCamDiff);
|
||||
}
|
||||
|
||||
{ // s
|
||||
struct_VERTEX_FORMAT_P3F_TEX2F data[] =
|
||||
{
|
||||
Vec3(-fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize), 1.0, 1.f-1.0,
|
||||
Vec3(fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize), 0.0, 1.f-1.0,
|
||||
Vec3(-fSkyBoxSize,-fSkyBoxSize,-P), 1.0, 1.f-0.5,
|
||||
Vec3(fSkyBoxSize,-fSkyBoxSize,-P), 0.0, 1.f-0.5,
|
||||
Vec3(-fSkyBoxSize,-fSkyBoxSize,-D), 1.0, 1.f-0.5,
|
||||
Vec3(fSkyBoxSize,-fSkyBoxSize,-D), 0.0, 1.f-0.5
|
||||
};
|
||||
|
||||
gRenDev->SetTexture(ef->m_Sky->m_SkyBox[1]->m_Bind);
|
||||
gRenDev->SetTexClampMode(true);
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),6);
|
||||
}
|
||||
{ // e
|
||||
struct_VERTEX_FORMAT_P3F_TEX2F data[] =
|
||||
{
|
||||
Vec3(-fSkyBoxSize, fSkyBoxSize, fSkyBoxSize), 1.0, 1.f-0.0,
|
||||
Vec3(-fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize), 0.0, 1.f-0.0,
|
||||
Vec3(-fSkyBoxSize, fSkyBoxSize,-P), 1.0, 1.f-0.5,
|
||||
Vec3(-fSkyBoxSize,-fSkyBoxSize,-P), 0.0, 1.f-0.5,
|
||||
Vec3(-fSkyBoxSize, fSkyBoxSize,-D), 1.0, 1.f-0.5,
|
||||
Vec3(-fSkyBoxSize,-fSkyBoxSize,-D), 0.0, 1.f-0.5
|
||||
};
|
||||
|
||||
gRenDev->SetTexture(ef->m_Sky->m_SkyBox[1]->m_Bind);
|
||||
gRenDev->SetTexClampMode(true);
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),6);
|
||||
}
|
||||
{ // n
|
||||
struct_VERTEX_FORMAT_P3F_TEX2F data[] =
|
||||
{
|
||||
Vec3(fSkyBoxSize, fSkyBoxSize, fSkyBoxSize), 1.0, 1.f-1.0,
|
||||
Vec3(-fSkyBoxSize, fSkyBoxSize, fSkyBoxSize), 0.0, 1.f-1.0,
|
||||
Vec3(fSkyBoxSize, fSkyBoxSize,-P), 1.0, 1.f-0.5,
|
||||
Vec3(-fSkyBoxSize, fSkyBoxSize,-P), 0.0, 1.f-0.5,
|
||||
Vec3(fSkyBoxSize, fSkyBoxSize,-D), 1.0, 1.f-0.5,
|
||||
Vec3(-fSkyBoxSize, fSkyBoxSize,-D), 0.0, 1.f-0.5
|
||||
};
|
||||
|
||||
gRenDev->SetTexture(ef->m_Sky->m_SkyBox[0]->m_Bind);
|
||||
gRenDev->SetTexClampMode(true);
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),6);
|
||||
}
|
||||
{ // w
|
||||
struct_VERTEX_FORMAT_P3F_TEX2F data[] =
|
||||
{
|
||||
Vec3(fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize), 1.0, 1.f-0.0,
|
||||
Vec3(fSkyBoxSize, fSkyBoxSize, fSkyBoxSize), 0.0, 1.f-0.0,
|
||||
Vec3(fSkyBoxSize,-fSkyBoxSize,-P), 1.0, 1.f-0.5,
|
||||
Vec3(fSkyBoxSize, fSkyBoxSize,-P), 0.0, 1.f-0.5,
|
||||
Vec3(fSkyBoxSize,-fSkyBoxSize,-D), 1.0, 1.f-0.5,
|
||||
Vec3(fSkyBoxSize, fSkyBoxSize,-D), 0.0, 1.f-0.5
|
||||
};
|
||||
|
||||
gRenDev->SetTexture(ef->m_Sky->m_SkyBox[0]->m_Bind);
|
||||
gRenDev->SetTexClampMode(true);
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (data,VERTEX_FORMAT_P3F_TEX2F)),6);
|
||||
}
|
||||
#if !defined(PS2) && !defined (GC) && !defined (NULL_RENDERER)
|
||||
if (fpSky)
|
||||
fpSky->mfSet(false, 0);
|
||||
#endif
|
||||
|
||||
DrawFogLayer();
|
||||
|
||||
DrawBlackPortal();
|
||||
|
||||
gRenDev->EnableFog(bPrevFog);
|
||||
|
||||
if (bPrevClipPl)
|
||||
gRenDev->EF_SetClipPlane(true, &gRenDev->m_RP.m_CurClipPlane.m_Normal.x, gRenDev->m_RP.m_bClipPlaneRefract);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool CRESky::DrawFogLayer()
|
||||
{
|
||||
if(!m_parrFogLayer)
|
||||
m_parrFogLayer = new list2<struct_VERTEX_FORMAT_P3F_COL4UB>;
|
||||
if(!m_parrFogLayer2)
|
||||
m_parrFogLayer2 = new list2<struct_VERTEX_FORMAT_P3F_COL4UB>;
|
||||
|
||||
m_parrFogLayer->Clear();
|
||||
m_parrFogLayer2->Clear();
|
||||
|
||||
const float fFogLayerRadius = SKY_BOX_SIZE;
|
||||
|
||||
if(gRenDev->m_FS.m_FogEnd>=256)
|
||||
return true;
|
||||
|
||||
Vec3d camera = gRenDev->GetCamera().GetPos();
|
||||
camera.z = max(0,camera.z);
|
||||
|
||||
float fLayerZ = -(max(0,gRenDev->m_FS.m_FogEnd-64)/(256-64))*SKY_BOX_SIZE - camera.z/35;
|
||||
|
||||
bool bRGB = (gRenDev->GetFeatures() & RFT_RGBA) != 0;
|
||||
|
||||
for(int i=0; i<=360; i+=30)
|
||||
{
|
||||
float rad = (i) * (gf_PI/180);
|
||||
struct_VERTEX_FORMAT_P3F_COL4UB tmp;
|
||||
tmp.xyz.x = cry_sinf(-rad)*fFogLayerRadius;
|
||||
tmp.xyz.y = cry_cosf(-rad)*fFogLayerRadius;
|
||||
|
||||
if(bRGB)
|
||||
{
|
||||
tmp.color.bcolor[0] = uchar(gRenDev->m_FS.m_FogColor.r*255);
|
||||
tmp.color.bcolor[1] = uchar(gRenDev->m_FS.m_FogColor.g*255);
|
||||
tmp.color.bcolor[2] = uchar(gRenDev->m_FS.m_FogColor.b*255);
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp.color.bcolor[2] = uchar(gRenDev->m_FS.m_FogColor.r*255);
|
||||
tmp.color.bcolor[1] = uchar(gRenDev->m_FS.m_FogColor.g*255);
|
||||
tmp.color.bcolor[0] = uchar(gRenDev->m_FS.m_FogColor.b*255);
|
||||
}
|
||||
|
||||
tmp.color.bcolor[3] = uchar(255.f);
|
||||
|
||||
tmp.xyz.z = fLayerZ-SKY_BOX_SIZE/2;
|
||||
m_parrFogLayer2->Add(tmp);
|
||||
tmp.xyz.z = fLayerZ+SKY_BOX_SIZE/2;
|
||||
m_parrFogLayer2->Add(tmp);
|
||||
|
||||
m_parrFogLayer->Add(tmp);
|
||||
tmp.xyz.z = fLayerZ+SKY_BOX_SIZE;
|
||||
tmp.color.bcolor[3] = 0;
|
||||
m_parrFogLayer->Add(tmp);
|
||||
}
|
||||
|
||||
#if !defined(PS2) && !defined (GC) && !defined (NULL_RENDERER)
|
||||
CPShader *fpSky = NULL;
|
||||
if (gRenDev->m_RP.m_PersFlags & RBPF_HDR)
|
||||
{
|
||||
fpSky = PShaderForName(gRenDev->m_RP.m_PS_HDR_BaseCol, "CGRC_HDR_BaseCol_PS20");
|
||||
if (fpSky)
|
||||
fpSky->mfSet(true);
|
||||
}
|
||||
#endif
|
||||
|
||||
gRenDev->EF_SetState(GS_NODEPTHTEST | GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA);
|
||||
gRenDev->SelectTMU(0);
|
||||
gRenDev->m_TexMan->m_Text_White->Set();
|
||||
gRenDev->EnableTMU(true);
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (m_parrFogLayer->GetElements(),VERTEX_FORMAT_P3F_COL4UB)),m_parrFogLayer->Count());
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (m_parrFogLayer2->GetElements(),VERTEX_FORMAT_P3F_COL4UB)),m_parrFogLayer2->Count());
|
||||
|
||||
#if !defined(PS2) && !defined (GC) && !defined (NULL_RENDERER)
|
||||
if (fpSky)
|
||||
fpSky->mfSet(false);
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
CRESky::~CRESky()
|
||||
{
|
||||
delete m_parrFogLayer;
|
||||
delete m_parrFogLayer2;
|
||||
}
|
||||
|
||||
// render black occlusion volumes mostly to hide seams in indoors
|
||||
bool CRESky::DrawBlackPortal()
|
||||
{
|
||||
if(!m_arrvPortalVerts[0][0].xyz.x)
|
||||
return true;
|
||||
|
||||
gRenDev->ResetToDefault();
|
||||
|
||||
for(int i=0; i<MAX_SKY_OCCLAREAS_NUM; i++)
|
||||
{
|
||||
if(!m_arrvPortalVerts[i][0].xyz.x)
|
||||
return true;
|
||||
|
||||
gRenDev->EF_SetState(GS_DEPTHWRITE);
|
||||
gRenDev->SetCullMode(R_CULL_NONE);
|
||||
gRenDev->SelectTMU(0);
|
||||
gRenDev->EnableTMU(false);
|
||||
gRenDev->DrawTriStrip(&(CVertexBuffer (m_arrvPortalVerts[i],VERTEX_FORMAT_P3F_COL4UB)),4);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CRESky::DrawSkySphere(float fHeight)
|
||||
{
|
||||
float nWSize = 256/16;
|
||||
|
||||
float a_in = 1, a_out = 1;
|
||||
|
||||
struct_VERTEX_FORMAT_P3F_COL4UB vert;
|
||||
vert.color.bcolor[0]=255;
|
||||
vert.color.bcolor[1]=255;
|
||||
vert.color.bcolor[2]=255;
|
||||
|
||||
list2<struct_VERTEX_FORMAT_P3F_COL4UB> lstVertData;
|
||||
|
||||
for(float r=0; r<3; r++)
|
||||
{
|
||||
a_in = a_out;
|
||||
a_out = 1.f-r/2;
|
||||
a_out*=a_out; a_out*=a_out; a_out*=a_out;
|
||||
|
||||
lstVertData.Clear();
|
||||
|
||||
for(int i=0; i<=360; i+=40)
|
||||
{
|
||||
float rad = (i) * (M_PI/180);
|
||||
|
||||
vert.xyz.x = cry_sinf(rad)*nWSize*r;
|
||||
vert.xyz.y = cry_cosf(rad)*nWSize*r;
|
||||
vert.xyz.z = fHeight + 8 - (r)*8;
|
||||
vert.color.bcolor[3] = uchar(a_in*255.0f);
|
||||
lstVertData.Add(vert);
|
||||
|
||||
vert.xyz.x = cry_sinf(rad)*nWSize*(r+1);
|
||||
vert.xyz.y = cry_cosf(rad)*nWSize*(r+1);
|
||||
vert.xyz.z = fHeight + 8 - (r+1)*8;
|
||||
vert.color.bcolor[3] = uchar(a_out*255.0f);
|
||||
lstVertData.Add(vert);
|
||||
}
|
||||
|
||||
gRenDev->DrawTriStrip(&CVertexBuffer(&lstVertData[0],VERTEX_FORMAT_P3F_COL4UB),lstVertData.Count());
|
||||
}
|
||||
}
|
||||
32
RenderDll/Common/RendElements/CRESkyZone.h
Normal file
32
RenderDll/Common/RendElements/CRESkyZone.h
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
#ifndef __CRESKYZONE_H__
|
||||
#define __CRESKYZONE_H__
|
||||
|
||||
//=============================================================
|
||||
class CRESkyZone : public CRendElement
|
||||
{
|
||||
public:
|
||||
Vec3d mViewPos;
|
||||
Vec3d mMins;
|
||||
Vec3d mMaxs;
|
||||
Vec3d mCenter;
|
||||
float mRadius;
|
||||
byte *mPVS;
|
||||
|
||||
CRESkyZone()
|
||||
{
|
||||
mfSetType(eDATA_SkyZone);
|
||||
mfUpdateFlags(FCEF_TRANSFORM | FCEF_NODEL);
|
||||
mPVS = NULL;
|
||||
}
|
||||
|
||||
virtual ~CRESkyZone()
|
||||
{
|
||||
if (mPVS)
|
||||
delete [] mPVS;
|
||||
}
|
||||
|
||||
virtual bool mfCompile(SShader *ef, char *scr);
|
||||
};
|
||||
|
||||
#endif // __CRESKYZONE_H__
|
||||
36
RenderDll/Common/RendElements/CRETempMesh.cpp
Normal file
36
RenderDll/Common/RendElements/CRETempMesh.cpp
Normal file
@@ -0,0 +1,36 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
|
||||
void CRETempMesh::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 6;
|
||||
gRenDev->m_RP.m_RendNumVerts = 4;
|
||||
gRenDev->m_RP.m_FirstVertex = 0;
|
||||
gRenDev->m_RP.m_FirstIndex = 0;
|
||||
}
|
||||
|
||||
void *CRETempMesh::mfGetPointer(ESrcPointer ePT, int *Stride, int Type, ESrcPointer Dst, int Flags)
|
||||
{
|
||||
*Stride = sizeof(struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F);
|
||||
struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F *pVertices = (struct_VERTEX_FORMAT_P3F_COL4UB_TEX2F *)m_VBuffer->m_VS[VSF_GENERAL].m_VData;
|
||||
gRenDev->m_RP.m_nCurBufferID = m_VBuffer->m_VS[VSF_GENERAL].m_VertBuf.m_nID;
|
||||
SBufInfoTable *pOffs = &gBufInfoTable[m_VBuffer->m_vertexformat];
|
||||
|
||||
switch(ePT)
|
||||
{
|
||||
case eSrcPointer_Vert:
|
||||
gRenDev->m_RP.m_nCurBufferOffset = 0;
|
||||
return &pVertices->xyz.x;
|
||||
case eSrcPointer_Tex:
|
||||
gRenDev->m_RP.m_nCurBufferOffset = pOffs->OffsTC;
|
||||
return &pVertices->st[0];
|
||||
case eSrcPointer_Color:
|
||||
gRenDev->m_RP.m_nCurBufferOffset = pOffs->OffsColor;
|
||||
return &pVertices->color.dcolor;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
48
RenderDll/Common/RendElements/CRETempMesh.h
Normal file
48
RenderDll/Common/RendElements/CRETempMesh.h
Normal file
@@ -0,0 +1,48 @@
|
||||
|
||||
#ifndef __CRETEMPMESH_H__
|
||||
#define __CRETEMPMESH_H__
|
||||
|
||||
//=============================================================
|
||||
|
||||
|
||||
class CRETempMesh : public CRendElement
|
||||
{
|
||||
public:
|
||||
CVertexBuffer *m_VBuffer;
|
||||
SVertexStream m_Inds;
|
||||
|
||||
public:
|
||||
CRETempMesh()
|
||||
{
|
||||
m_VBuffer = NULL;
|
||||
m_Inds.Reset();
|
||||
mfSetType(eDATA_TempMesh);
|
||||
mfUpdateFlags(FCEF_TRANSFORM);
|
||||
}
|
||||
|
||||
virtual ~CRETempMesh()
|
||||
{
|
||||
if (m_VBuffer)
|
||||
{
|
||||
gRenDev->ReleaseBuffer(m_VBuffer);
|
||||
m_VBuffer = NULL;
|
||||
}
|
||||
gRenDev->ReleaseIndexBuffer(&m_Inds);
|
||||
m_Inds.Reset();
|
||||
}
|
||||
|
||||
virtual void mfPrepare();
|
||||
virtual bool mfDraw(SShader *ef, SShaderPass *sfm);
|
||||
virtual void *mfGetPointer(ESrcPointer ePT, int *Stride, int Type, ESrcPointer Dst, int Flags);
|
||||
virtual bool mfPreDraw(SShaderPass *sl);
|
||||
virtual void mfReset();
|
||||
virtual int Size()
|
||||
{
|
||||
int nSize = sizeof(*this);
|
||||
if (m_VBuffer)
|
||||
nSize += m_VBuffer->Size(0, m_VBuffer->m_NumVerts);
|
||||
return nSize;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __CRETEMPMESH_H__
|
||||
32
RenderDll/Common/RendElements/CRETerrainSector.cpp
Normal file
32
RenderDll/Common/RendElements/CRETerrainSector.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
#include "CRETerrainSector.h"
|
||||
#include "I3DEngine.h"
|
||||
|
||||
void CRECommon::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
bool CREFarTreeSprites::mfDraw(SShader *ef, SShaderPass *sfm)
|
||||
{
|
||||
iSystem->GetI3DEngine()->DrawFarTrees();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRETerrainDetailTextureLayers::mfDraw(SShader *ef, SShaderPass *sfm)
|
||||
{
|
||||
iSystem->GetI3DEngine()->DrawTerrainDetailTextureLayers();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CRETerrainParticles::mfDraw(SShader *ef, SShaderPass *sfm)
|
||||
{
|
||||
iSystem->GetI3DEngine()->DrawTerrainParticles(ef);
|
||||
return true;
|
||||
}
|
||||
|
||||
17
RenderDll/Common/RendElements/CRETriMeshAdditionalShadow.cpp
Normal file
17
RenderDll/Common/RendElements/CRETriMeshAdditionalShadow.cpp
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
#include "RenderPCH.h"
|
||||
/*
|
||||
#include "RendElement.h"
|
||||
#include "CRETriMeshAdditionalShadow.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
void CRETriMeshAdditionalShadow::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
|
||||
gRenDev->m_RP.m_DynLMask |= m_DynMask;
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
*/
|
||||
247
RenderDll/Common/RendElements/CRETriMeshShadow.cpp
Normal file
247
RenderDll/Common/RendElements/CRETriMeshShadow.cpp
Normal file
@@ -0,0 +1,247 @@
|
||||
#include "RenderPCH.h"
|
||||
#include "RendElement.h"
|
||||
#include "CRETriMeshShadow.h"
|
||||
#include "I3DEngine.h"
|
||||
|
||||
// shadow volumes rendering modified by vlad
|
||||
|
||||
// shadow volumes statistics
|
||||
int CRETriMeshShadow::m_nCRETriMeshShadowRebuildsPerFrrame = 0;
|
||||
int CRETriMeshShadow::m_nCRETriMeshShadowShadowsPerFrrame = 0;
|
||||
int CRETriMeshShadow::m_nCRETriMeshShadowAloocatedShadows = 0;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
void CRETriMeshShadow::mfPrepare()
|
||||
{
|
||||
gRenDev->EF_CheckOverflow(0, 0, this);
|
||||
gRenDev->m_RP.m_pRE = this;
|
||||
gRenDev->m_RP.m_RendNumIndices = 0;
|
||||
gRenDev->m_RP.m_RendNumVerts = 0;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
void *CRETriMeshShadow::mfGetPointer(ESrcPointer ePT, int *Stride, int Type, ESrcPointer Dst, int Flags)
|
||||
{
|
||||
switch (ePT)
|
||||
{
|
||||
case eSrcPointer_Vert:
|
||||
{
|
||||
if(m_nCurrInst<0)
|
||||
{
|
||||
// Warning( 0,0,"Error: CRETriMeshShadow::mfGetPointer: m_nCurrInst<0");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*Stride = m_VertexSize[m_arrLBuffers[m_nCurrInst].pVB->m_pVertexBuffer->m_vertexformat];
|
||||
if(m_arrLBuffers[m_nCurrInst].pVB->m_pVertexBuffer)
|
||||
return m_arrLBuffers[m_nCurrInst].pVB->m_pVertexBuffer->m_VS[VSF_GENERAL].m_VData;
|
||||
else
|
||||
Warning( 0,0,"Error: CRETriMeshShadow::mfGetPointer: m_pBuffer->m_pVertexBuffer == 0");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int CRETriMeshShadow::GetAndResetRebuildsPerFrrameCounter()
|
||||
{
|
||||
int n = m_nCRETriMeshShadowRebuildsPerFrrame;
|
||||
m_nCRETriMeshShadowRebuildsPerFrrame = 0;
|
||||
return n;
|
||||
}
|
||||
|
||||
int CRETriMeshShadow::GetAndResetShadowVolumesPerFrrameCounter()
|
||||
{
|
||||
int n = m_nCRETriMeshShadowShadowsPerFrrame;
|
||||
m_nCRETriMeshShadowShadowsPerFrrame = 0;
|
||||
return n;
|
||||
}
|
||||
|
||||
int CRETriMeshShadow::GetShadowVolumesAllocatedCounter()
|
||||
{
|
||||
return m_nCRETriMeshShadowAloocatedShadows;
|
||||
}
|
||||
|
||||
bool CRETriMeshShadow::mfCheckUpdate(int nVertFormat, int Flags)
|
||||
{
|
||||
if(m_bAnimatedObject)
|
||||
{ // character animation: everything already calculated, always use slot 0
|
||||
m_nCurrInst = 0; // will be used during drawing
|
||||
ShadVolInstanceInfo * pSVInfo = &m_arrLBuffers[0];
|
||||
if (pSVInfo->pVB->m_pMats && pSVInfo->pVB->m_pMats->Count() && pSVInfo->pVB->m_pMats->Get(0)->pRE)
|
||||
return pSVInfo->pVB->m_pMats->Get(0)->pRE->mfCheckUpdate(nVertFormat, Flags);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
m_nCRETriMeshShadowShadowsPerFrrame++;
|
||||
|
||||
assert(m_nCurrInst == -1);
|
||||
|
||||
// find light of this shadow
|
||||
CDLight * pDLight = NULL;
|
||||
if (gRenDev->m_RP.m_DynLMask)
|
||||
{
|
||||
for (int n=0; n<gRenDev->m_RP.m_DLights[SRendItem::m_RecurseLevel].Num(); n++)
|
||||
{
|
||||
if (gRenDev->m_RP.m_DynLMask & (1<<n))
|
||||
{
|
||||
pDLight = gRenDev->m_RP.m_DLights[SRendItem::m_RecurseLevel][n];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!pDLight)
|
||||
return true;
|
||||
|
||||
CDLight fakeLight;
|
||||
fakeLight = *pDLight; // do not copy
|
||||
|
||||
// get obj space light pos
|
||||
CCObject *pObj = gRenDev->m_RP.m_pCurObject;
|
||||
Matrix44& tInvRot = pObj->GetInvMatrix();
|
||||
|
||||
fakeLight.m_vObjectSpacePos = tInvRot.TransformPointOLD(fakeLight.m_Origin);
|
||||
|
||||
// assert(m_nCurrInst==-1);
|
||||
|
||||
// todo: take radius into account
|
||||
|
||||
//assert(pObj->m_CustomData);
|
||||
|
||||
// find buffer for this case
|
||||
ShadVolInstanceInfo * pSVInfo = 0;
|
||||
for(int i=0; i<MAX_SV_INSTANCES; i++) // find static volume by light objspace position
|
||||
if(m_arrLBuffers[i].pVB && IsEquivalent(m_arrLBuffers[i].vObjSpaceLightPos, fakeLight.m_vObjectSpacePos, 0.001f))
|
||||
{
|
||||
pSVInfo = &m_arrLBuffers[i];
|
||||
pSVInfo->nFrameId = gRenDev->GetFrameID();
|
||||
m_nCurrInst = i;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!pSVInfo) // if not found - select new slot
|
||||
{
|
||||
// now find same combination of light and shadow caster
|
||||
// but only if slot was not used in prev frame -
|
||||
// outomagic double buffering of dynamic shadows
|
||||
for(int i=0; i<MAX_SV_INSTANCES; i++)
|
||||
if( m_arrLBuffers[i].pVB &&
|
||||
m_arrLBuffers[i].pLightOwner == fakeLight.m_pOwner &&
|
||||
m_arrLBuffers[i].pShadowCaster == pObj->m_CustomData &&
|
||||
m_arrLBuffers[i].nFrameId+1 < gRenDev->GetFrameID())
|
||||
{
|
||||
pSVInfo = &m_arrLBuffers[i];
|
||||
m_nCurrInst = i;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!pSVInfo) // if still not found
|
||||
{ // find empty slot or slot with smallest frame id
|
||||
int nSmalestFrameId = gRenDev->GetFrameID()+1;
|
||||
for(int i=0; i<MAX_SV_INSTANCES; i++)
|
||||
{
|
||||
if(!m_arrLBuffers[i].pVB)
|
||||
{ // search for free slot
|
||||
pSVInfo = &m_arrLBuffers[i];
|
||||
m_nCurrInst = i;
|
||||
nSmalestFrameId=0;
|
||||
break;
|
||||
}
|
||||
|
||||
if(m_arrLBuffers[i].nFrameId<nSmalestFrameId)
|
||||
{ // search for oldest slot at the same time
|
||||
nSmalestFrameId = m_arrLBuffers[i].nFrameId;
|
||||
pSVInfo = &m_arrLBuffers[i];
|
||||
m_nCurrInst = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(pSVInfo)
|
||||
{
|
||||
pSVInfo->nFrameId = gRenDev->GetFrameID();
|
||||
pSVInfo->vObjSpaceLightPos = fakeLight.m_vObjectSpacePos;
|
||||
pSVInfo->pLightOwner = fakeLight.m_pOwner;
|
||||
pSVInfo->pShadowCaster = (IEntityRender*)pObj->m_CustomData;
|
||||
}
|
||||
|
||||
if(!pSVInfo->pVB)
|
||||
m_nCRETriMeshShadowAloocatedShadows++; // will be created now
|
||||
|
||||
// pSVInfo will be used in RebuildDynamicShadowVolumeBuffer
|
||||
m_pSvObj->RebuildShadowVolumeBuffer(fakeLight, pObj->m_TempVars[0]);
|
||||
m_nCRETriMeshShadowRebuildsPerFrrame++;
|
||||
|
||||
// if(!pSVInfo->pVB)
|
||||
// iLog->Log("Warning: CRETriMeshShadow::mfCheckUpdate: !pSVInfo->pVB");
|
||||
|
||||
/*
|
||||
ICVar *pVar = iConsole->GetCVar("e_stencil_shadows");
|
||||
if(pVar && pVar->GetIVal()==3 && pSVInfo->pVB)
|
||||
iLog->Log("CRETriMeshShadow: Static shadow volume created: %d faces", pSVInfo->pVB->GetIndices().Count()/3);*/
|
||||
}
|
||||
|
||||
if (pSVInfo->pVB &&
|
||||
pSVInfo->pVB->m_pMats &&
|
||||
pSVInfo->pVB->m_pMats->Count() &&
|
||||
pSVInfo->pVB->m_pMats->Get(0)->pRE)
|
||||
pSVInfo->pVB->m_pMats->Get(0)->pRE->mfCheckUpdate(nVertFormat, Flags);
|
||||
else
|
||||
m_nCurrInst = -1;
|
||||
|
||||
fakeLight.m_vObjectSpacePos = Vec3d(0,0,0);
|
||||
|
||||
#ifdef DIRECT3D8
|
||||
assert(0); // not tested, what this line do?
|
||||
gRenDev->m_RP.m_CurD3DVFormat = pSVInfo->pVB->m_pSecVertBuffer->m_vertexformat + 16;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
CRETriMeshShadow::~CRETriMeshShadow()
|
||||
{
|
||||
for(int i=0; i<MAX_SV_INSTANCES; i++)
|
||||
{
|
||||
gRenDev->DeleteLeafBuffer(m_arrLBuffers[i].pVB);
|
||||
m_arrLBuffers[i].pVB=0;
|
||||
}
|
||||
}
|
||||
|
||||
bool CRETriMeshShadow::mfCheckUnload()
|
||||
{ // remove all not used leafbuffers
|
||||
for(int i=0; i<MAX_SV_INSTANCES; i++)
|
||||
if(m_arrLBuffers[i].pVB)
|
||||
{
|
||||
if(m_arrLBuffers[i].nFrameId < gRenDev->GetFrameID()-100)
|
||||
{
|
||||
gRenDev->DeleteLeafBuffer(m_arrLBuffers[i].pVB);
|
||||
m_arrLBuffers[i].pVB=0;
|
||||
m_arrLBuffers[i].nFrameId=0;
|
||||
m_nCRETriMeshShadowAloocatedShadows--;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if(nLastCRETriMeshShadowLogFrame != gRenDev->GetFrameID())
|
||||
{
|
||||
int nRebNum = GetRETriMeshShadowRebuildsPerFrrame()/32;;
|
||||
int nShadNum = GetRETriMeshShadowShadowsPerFrrame()/32;
|
||||
ICVar *pVar = iConsole->GetCVar("e_stencil_shadows");
|
||||
if(pVar && pVar->GetIVal()==3)
|
||||
iLog->Log("CRETriMeshShadow: Allocated: %d, Used: %d, Updated: %d",
|
||||
nCRETriMeshShadowAloocatedShadows, nShadNum, nRebNum);
|
||||
nLastCRETriMeshShadowLogFrame = gRenDev->GetFrameID();
|
||||
}*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CRETriMeshShadow::PrintStats()
|
||||
{
|
||||
gRenDev->TextToScreenColor(8,20, 0,2,0,1, "Shadow volumes stats: Rebuild: %d, Used: %d, Allocated: %d",
|
||||
CRETriMeshShadow::GetAndResetRebuildsPerFrrameCounter(),
|
||||
CRETriMeshShadow::GetAndResetShadowVolumesPerFrrameCounter(),
|
||||
CRETriMeshShadow::GetShadowVolumesAllocatedCounter());
|
||||
}
|
||||
526
RenderDll/Common/RendElements/FFT_SSE.cpp
Normal file
526
RenderDll/Common/RendElements/FFT_SSE.cpp
Normal file
@@ -0,0 +1,526 @@
|
||||
#include "RenderPCH.h"
|
||||
|
||||
// Not for AMD64
|
||||
#if !defined(WIN64) && !defined(LINUX)
|
||||
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable:4731) // frame pointer register 'ebp' modified by inline assembly code
|
||||
|
||||
struct SConstSSE
|
||||
{
|
||||
float m_fVal0;
|
||||
float m_fVal1;
|
||||
float m_fVal2;
|
||||
float m_fVal3;
|
||||
};
|
||||
|
||||
_declspec(align(16)) SConstSSE _tabCoef64_1[4][6] =
|
||||
{
|
||||
{
|
||||
{1.000000f, 0.995185f, 0.980785f, 0.956940f},
|
||||
{0.000000f, -0.098017f, -0.195090f, -0.290285f},
|
||||
{1.000000f, 0.980785f, 0.923880f, 0.831470f},
|
||||
{0.000000f, -0.195090f, -0.382683f, -0.555570f},
|
||||
{1.000000f, 0.956940f, 0.831470f, 0.634393f},
|
||||
{0.000000f, -0.290285f, -0.555570f, -0.773010f},
|
||||
},
|
||||
{
|
||||
{0.923880f, 0.881921f, 0.831470f, 0.773010f},
|
||||
{-0.382683f, -0.471397f, -0.555570f, -0.634393f},
|
||||
{0.707107f, 0.555570f, 0.382683f, 0.195090f},
|
||||
{-0.707107f, -0.831470f, -0.923880f, -0.980785f},
|
||||
{0.382683f, 0.098017f, -0.195090f, -0.471397f},
|
||||
{-0.923880f, -0.995185f, -0.980785f, -0.881921f},
|
||||
},
|
||||
{
|
||||
{0.707107f, 0.634393f, 0.555570f, 0.471397f},
|
||||
{-0.707107f, -0.773010f, -0.831470f, -0.881921f},
|
||||
{0.000000f, -0.195090f, -0.382683f, -0.555570f},
|
||||
{-1.000000f, -0.980785f, -0.923880f, -0.831470f},
|
||||
{-0.707107f, -0.881921f, -0.980785f, -0.995185f},
|
||||
{-0.707107f, -0.471397f, -0.195090f, 0.098017f},
|
||||
},
|
||||
{
|
||||
{0.382683f, 0.290285f, 0.195090f, 0.098017f},
|
||||
{-0.923880f, -0.956940f, -0.980785f, -0.995185f},
|
||||
{-0.707107f, -0.831470f, -0.923880f, -0.980785f},
|
||||
{-0.707107f, -0.555570f, -0.382683f, -0.195090f},
|
||||
{-0.923880f, -0.773010f, -0.555570f, -0.290285f},
|
||||
{0.382683f, 0.634393f, 0.831470f, 0.956940f},
|
||||
}
|
||||
};
|
||||
|
||||
_declspec(align(16)) SConstSSE _tabCoef64_2[4][6] =
|
||||
{
|
||||
{
|
||||
{1.000000f, 0.923880f, 0.707107f, 0.382683f},
|
||||
{0.000000f, -0.382683f, -0.707107f, -0.923880f},
|
||||
{1.000000f, 0.707107f, 0.000000f, -0.707107f},
|
||||
{0.000000f, -0.707107f, -1.000000f, -0.707107f},
|
||||
{1.000000f, 0.382683f, -0.707107f, -0.923880f},
|
||||
{0.000000f, -0.923880f, -0.707107f, 0.382683f},
|
||||
}
|
||||
};
|
||||
|
||||
void cradix4c_64(float* ar, float* ai, int nm)
|
||||
{
|
||||
int wdt = OCEANGRID;
|
||||
float *arw = &ar[wdt];
|
||||
float *aiw = &ai[wdt];
|
||||
_asm
|
||||
{
|
||||
mov eax, arw
|
||||
mov ebx, aiw
|
||||
mov edx, ai
|
||||
mov ecx, ar
|
||||
sub esp, 20h
|
||||
mov [esp+0ch], ebp
|
||||
mov [esp], ecx
|
||||
mov [esp+4], edx
|
||||
mov ebp, ecx
|
||||
mov [esp+10h], eax
|
||||
mov [esp+14h], ebx
|
||||
mov [esp+18h], ebp
|
||||
mov [esp+1ch], edx
|
||||
lea ebx, [ebp+40h]
|
||||
lea edi, _tabCoef64_1
|
||||
mov [esp+8], ebx
|
||||
_lAlign:
|
||||
movaps xmm0,xmmword ptr [ebp]
|
||||
movaps xmm4,xmm0
|
||||
movaps xmm2,xmmword ptr [ebp+80h]
|
||||
subps xmm0,xmm2
|
||||
movaps xmm1,xmmword ptr [ebp+40h]
|
||||
addps xmm4,xmm2
|
||||
movaps xmm3,xmmword ptr [ebp+0C0h]
|
||||
movaps xmm5,xmm1
|
||||
movaps xmm2,xmmword ptr [edx]
|
||||
addps xmm5,xmm3
|
||||
jmp _lCicleAlign
|
||||
align 4
|
||||
_lStartAlign:
|
||||
movaps xmmword ptr [edx+0B0h],xmm0
|
||||
movaps xmm0,xmmword ptr [ebp]
|
||||
subps xmm7,xmm4
|
||||
movaps xmm4,xmm0
|
||||
movaps xmmword ptr [ebp+0B0h],xmm5
|
||||
addps xmm3,xmm1
|
||||
movaps xmm2,xmmword ptr [ebp+80h]
|
||||
movaps xmmword ptr [ebp+30h],xmm7
|
||||
subps xmm0,xmm2
|
||||
movaps xmm1,xmmword ptr [ebp+40h]
|
||||
addps xmm4,xmm2
|
||||
movaps xmm5,xmm1
|
||||
movaps xmmword ptr [edx+30h],xmm3
|
||||
movaps xmm2,xmmword ptr [edx]
|
||||
movaps xmm3,xmmword ptr [ebp+0C0h]
|
||||
addps xmm5,xmm3
|
||||
_lCicleAlign:
|
||||
align 4
|
||||
movaps xmm7,xmm4
|
||||
subps xmm1,xmm3
|
||||
prefetcht0 [edi]
|
||||
addps xmm4,xmm5
|
||||
movaps xmm3,xmm2
|
||||
movaps xmm6,xmmword ptr [edx+80h]
|
||||
subps xmm7,xmm5
|
||||
prefetcht0 [edi+10h]
|
||||
movaps xmmword ptr [ebp],xmm4
|
||||
addps xmm3,xmm6
|
||||
movaps xmm5,xmmword ptr [edx+40h]
|
||||
subps xmm2,xmm6
|
||||
prefetcht0 [edi+20h]
|
||||
movaps xmm4,xmmword ptr [edx+0C0h]
|
||||
movaps xmm6,xmm5
|
||||
addps xmm5,xmm4
|
||||
prefetcht0 [edi+30h]
|
||||
subps xmm6,xmm4
|
||||
movaps xmm4,xmm5
|
||||
addps xmm5,xmm3
|
||||
movaps xmmword ptr [edx],xmm5
|
||||
movaps xmm5,xmm0
|
||||
addps xmm0,xmm6
|
||||
prefetcht0 [edi+40h]
|
||||
subps xmm3,xmm4
|
||||
movaps xmm4,xmm2
|
||||
subps xmm2,xmm1
|
||||
prefetcht0 [edi+50h]
|
||||
addps xmm1,xmm4
|
||||
subps xmm5,xmm6
|
||||
movaps xmm4,xmm0
|
||||
movaps xmm6,xmm2
|
||||
mulps xmm0,xmmword ptr [edi]
|
||||
mulps xmm2,xmmword ptr [edi+10h]
|
||||
mulps xmm4,xmmword ptr [edi+10h]
|
||||
add ebp,10h
|
||||
add edx,10h
|
||||
subps xmm0,xmm2
|
||||
mulps xmm6,xmmword ptr [edi]
|
||||
movaps xmm2,xmm1
|
||||
movaps xmmword ptr [ebp+70h],xmm0
|
||||
mulps xmm1,xmmword ptr [edi+50h]
|
||||
movaps xmm0,xmm5
|
||||
addps xmm4,xmm6
|
||||
mulps xmm5,xmmword ptr [edi+40h]
|
||||
mulps xmm2,xmmword ptr [edi+40h]
|
||||
mulps xmm0,xmmword ptr [edi+50h]
|
||||
subps xmm5,xmm1
|
||||
movaps xmmword ptr [edx+70h],xmm4
|
||||
movaps xmm1,xmm7
|
||||
mulps xmm7,xmmword ptr [edi+20h]
|
||||
movaps xmm4,xmm3
|
||||
addps xmm0,xmm2
|
||||
mulps xmm3,xmmword ptr [edi+20h]
|
||||
mulps xmm4,xmmword ptr [edi+30h]
|
||||
cmp ebp,ebx
|
||||
mulps xmm1,xmmword ptr [edi+30h]
|
||||
lea edi,[edi+60h]
|
||||
jl _lStartAlign
|
||||
movaps xmmword ptr [ebp+0B0h],xmm5
|
||||
addps xmm3,xmm1
|
||||
subps xmm7,xmm4
|
||||
movaps xmmword ptr [edx+0B0h],xmm0
|
||||
movaps xmmword ptr [edx+30h],xmm3
|
||||
movaps xmmword ptr [ebp+30h],xmm7
|
||||
mov ebp,[esp]
|
||||
mov edx,[esp+4]
|
||||
add ebp,100h
|
||||
add edx,100h
|
||||
mov [esp],ebp
|
||||
mov [esp+4],edx
|
||||
cmp ebp,[esp+10h]
|
||||
lea ebx,[ebp+40h]
|
||||
mov [esp+8],ebx
|
||||
lea edi,_tabCoef64_1
|
||||
jl _lAlign
|
||||
|
||||
mov ebp, [esp+18h];
|
||||
mov edx, [esp+1ch];
|
||||
mov [esp], ebp
|
||||
mov [esp+4], edx
|
||||
lea ebx, [ebp+10h]
|
||||
lea edi, _tabCoef64_2
|
||||
mov [esp+8], ebx
|
||||
_lAlign2:
|
||||
movaps xmm0,xmmword ptr [ebp]
|
||||
movaps xmm4,xmm0
|
||||
movaps xmm2,xmmword ptr [ebp+20h]
|
||||
subps xmm0,xmm2
|
||||
movaps xmm1,xmmword ptr [ebp+10h]
|
||||
addps xmm4,xmm2
|
||||
movaps xmm3,xmmword ptr [ebp+30h]
|
||||
movaps xmm5,xmm1
|
||||
movaps xmm2,xmmword ptr [edx]
|
||||
addps xmm5,xmm3
|
||||
jmp _lCicleAlign2
|
||||
align 4
|
||||
_lStartAlign2:
|
||||
movaps xmmword ptr [edx+20h],xmm0
|
||||
movaps xmm0,xmmword ptr [ebp]
|
||||
subps xmm7,xmm4
|
||||
movaps xmm4,xmm0
|
||||
movaps xmmword ptr [ebp+20h],xmm5
|
||||
addps xmm3,xmm1
|
||||
movaps xmm2,xmmword ptr [ebp+20h]
|
||||
movaps xmmword ptr [ebp],xmm7
|
||||
subps xmm0,xmm2
|
||||
movaps xmm1,xmmword ptr [ebp+10h]
|
||||
addps xmm4,xmm2
|
||||
movaps xmm5,xmm1
|
||||
movaps xmmword ptr [edx],xmm3
|
||||
movaps xmm2,xmmword ptr [edx]
|
||||
movaps xmm3,xmmword ptr [ebp+30h]
|
||||
addps xmm5,xmm3
|
||||
_lCicleAlign2:
|
||||
movaps xmm7,xmm4
|
||||
subps xmm1,xmm3
|
||||
prefetcht0 [edi]
|
||||
addps xmm4,xmm5
|
||||
movaps xmm3,xmm2
|
||||
movaps xmm6,xmmword ptr [edx+20h]
|
||||
subps xmm7,xmm5
|
||||
prefetcht0 [edi+10h]
|
||||
movaps xmmword ptr [ebp],xmm4
|
||||
addps xmm3,xmm6
|
||||
movaps xmm5,xmmword ptr [edx+10h]
|
||||
subps xmm2,xmm6
|
||||
prefetcht0 [edi+20h]
|
||||
movaps xmm4,xmmword ptr [edx+30h]
|
||||
movaps xmm6,xmm5
|
||||
addps xmm5,xmm4
|
||||
prefetcht0 [edi+30h]
|
||||
subps xmm6,xmm4
|
||||
movaps xmm4,xmm5
|
||||
addps xmm5,xmm3
|
||||
movaps xmmword ptr [edx],xmm5
|
||||
movaps xmm5,xmm0
|
||||
addps xmm0,xmm6
|
||||
prefetcht0 [edi+40h]
|
||||
subps xmm3,xmm4
|
||||
movaps xmm4,xmm2
|
||||
subps xmm2,xmm1
|
||||
prefetcht0 [edi+50h]
|
||||
addps xmm1,xmm4
|
||||
subps xmm5,xmm6
|
||||
movaps xmm4,xmm0
|
||||
movaps xmm6,xmm2
|
||||
mulps xmm0,xmmword ptr [edi]
|
||||
mulps xmm2,xmmword ptr [edi+10h]
|
||||
mulps xmm4,xmmword ptr [edi+10h]
|
||||
add ebp,10h
|
||||
add edx,10h
|
||||
subps xmm0,xmm2
|
||||
mulps xmm6,xmmword ptr [edi]
|
||||
movaps xmm2,xmm1
|
||||
movaps xmmword ptr [ebp+10h],xmm0
|
||||
mulps xmm1,xmmword ptr [edi+50h]
|
||||
movaps xmm0,xmm5
|
||||
addps xmm4,xmm6
|
||||
mulps xmm5,xmmword ptr [edi+40h]
|
||||
mulps xmm2,xmmword ptr [edi+40h]
|
||||
mulps xmm0,xmmword ptr [edi+50h]
|
||||
subps xmm5,xmm1
|
||||
movaps xmmword ptr [edx+10h],xmm4
|
||||
movaps xmm1,xmm7
|
||||
mulps xmm7,xmmword ptr [edi+20h]
|
||||
movaps xmm4,xmm3
|
||||
addps xmm0,xmm2
|
||||
mulps xmm3,xmmword ptr [edi+20h]
|
||||
mulps xmm4,xmmword ptr [edi+30h]
|
||||
cmp ebp,ebx
|
||||
mulps xmm1,xmmword ptr [edi+30h]
|
||||
lea edi,[edi+60h]
|
||||
jl _lStartAlign2
|
||||
movaps xmmword ptr [ebp+20h],xmm5
|
||||
addps xmm3,xmm1
|
||||
subps xmm7,xmm4
|
||||
movaps xmmword ptr [edx+20h],xmm0
|
||||
movaps xmmword ptr [edx],xmm3
|
||||
movaps xmmword ptr [ebp],xmm7
|
||||
mov ebp,[esp]
|
||||
mov edx,[esp+4]
|
||||
add ebp,40h
|
||||
add edx,40h
|
||||
mov [esp],ebp
|
||||
mov [esp+4],edx
|
||||
cmp ebp,[esp+10h]
|
||||
lea ebx,[ebp+10h]
|
||||
mov [esp+8],ebx
|
||||
lea edi,_tabCoef64_2
|
||||
jl _lAlign2
|
||||
|
||||
mov ebp, [esp+18h]
|
||||
mov edx, [esp+1ch]
|
||||
mov [esp], ebp
|
||||
mov [esp+4], edx
|
||||
mov ebx, [esp+10h]
|
||||
fld dword ptr [ebp]
|
||||
fld st(0)
|
||||
fld dword ptr [ebp+8]
|
||||
fsub st(1),st
|
||||
faddp st(2),st
|
||||
fld dword ptr [ebp+4]
|
||||
fxch st(2)
|
||||
fld st(2)
|
||||
fld dword ptr [ebp+0Ch]
|
||||
fadd st(1),st
|
||||
fsubp st(4),st
|
||||
jmp _lEnd3
|
||||
align 4
|
||||
_lCicle:
|
||||
fstp dword ptr [ebp-4]
|
||||
fld dword ptr [ebp]
|
||||
fxch st(1)
|
||||
fstp dword ptr [ebp-8]
|
||||
fld st(0)
|
||||
fld dword ptr [ebp+8]
|
||||
fadd st(2),st
|
||||
fxch st(3)
|
||||
fstp dword ptr [edx-10h]
|
||||
fsubrp st(2),st
|
||||
fld dword ptr [ebp+4]
|
||||
fld st(0)
|
||||
fld dword ptr [ebp+0Ch]
|
||||
fadd st(2),st
|
||||
fxch st(5)
|
||||
fstp dword ptr [edx-4]
|
||||
fsubrp st(4),st
|
||||
_lEnd3:
|
||||
fld dword ptr [edx]
|
||||
fld dword ptr [edx]
|
||||
fld st(3)
|
||||
fadd st,st(3)
|
||||
fld dword ptr [edx+8]
|
||||
fadd st(3),st
|
||||
fxch st(5)
|
||||
fsubrp st(4),st
|
||||
fld dword ptr [edx+4]
|
||||
fxch st(2)
|
||||
fsubrp st(5),st
|
||||
fstp dword ptr [ebp]
|
||||
fld st(0)
|
||||
fld dword ptr [edx+0Ch]
|
||||
fadd st(2),st
|
||||
fxch st(4)
|
||||
fstp dword ptr [ebp+4]
|
||||
fsubrp st(3),st
|
||||
fst [esp+10h]
|
||||
fadd st,st(1)
|
||||
fxch st(4)
|
||||
fst [esp+14h]
|
||||
fadd st,st(2)
|
||||
fxch st(3)
|
||||
fst [esp+18h]
|
||||
fsub st,st(5)
|
||||
fld [esp+10h]
|
||||
fsubp st(2),st
|
||||
fld [esp+14h]
|
||||
fsubrp st(3),st
|
||||
fld [esp+18h]
|
||||
faddp st(6),st
|
||||
add ebp,10h
|
||||
add edx,10h
|
||||
fstp dword ptr [edx-8]
|
||||
cmp ebp,ebx
|
||||
fstp dword ptr [edx-0Ch]
|
||||
jl _lCicle
|
||||
fstp dword ptr [ebp-4]
|
||||
fstp dword ptr [ebp-8]
|
||||
fstp dword ptr [edx-10h]
|
||||
fstp dword ptr [edx-4]
|
||||
mov ebp, [esp+0ch]
|
||||
add esp, 20h
|
||||
}
|
||||
}
|
||||
|
||||
void bittabc(int *p, int sn)
|
||||
{
|
||||
int i2 = sn;
|
||||
int j = 1;
|
||||
int i, k;
|
||||
int ind = 0;
|
||||
i2 >>= 1;
|
||||
for (i=1; i<=sn-1; i++)
|
||||
{
|
||||
if (i < j)
|
||||
{
|
||||
ind += 2;
|
||||
p[ind] = i-1;
|
||||
p[ind+1] = j-1;
|
||||
}
|
||||
k = i2;
|
||||
while (j > k)
|
||||
{
|
||||
j -= k;
|
||||
k >>= 1;
|
||||
}
|
||||
j += k;
|
||||
}
|
||||
p[0] = 0;
|
||||
p[1] = ind >> 1;
|
||||
}
|
||||
|
||||
void coef4r22c(int *ptr, int nm)
|
||||
{
|
||||
int sn = 1<<nm;
|
||||
bittabc(ptr, sn);
|
||||
}
|
||||
|
||||
|
||||
void cbitrevc(float* ar, float* ai, int *p)
|
||||
{
|
||||
int nCount = p[1];
|
||||
int *pInd = &p[2];
|
||||
int nC = nCount >> 2;
|
||||
while (nC)
|
||||
{
|
||||
Exchange(ar[pInd[0]], ar[pInd[1]]);
|
||||
Exchange(ar[pInd[2]], ar[pInd[3]]);
|
||||
Exchange(ar[pInd[4]], ar[pInd[5]]);
|
||||
Exchange(ar[pInd[6]], ar[pInd[7]]);
|
||||
pInd += 8;
|
||||
nC--;
|
||||
}
|
||||
pInd = &p[2];
|
||||
nC = nCount >> 2;
|
||||
while (nC)
|
||||
{
|
||||
Exchange(ai[pInd[0]], ai[pInd[1]]);
|
||||
Exchange(ai[pInd[2]], ai[pInd[3]]);
|
||||
Exchange(ai[pInd[4]], ai[pInd[5]]);
|
||||
Exchange(ai[pInd[6]], ai[pInd[7]]);
|
||||
pInd += 8;
|
||||
nC--;
|
||||
}
|
||||
}
|
||||
|
||||
void xcfft1dc(float* ar, float* ai, int *p, int nm)
|
||||
{
|
||||
cradix4c_64(ar, ai, nm);
|
||||
cbitrevc(ar, ai, p);
|
||||
}
|
||||
|
||||
void FFTSSE_64(float* ar, float* ai)
|
||||
{
|
||||
int i, j;
|
||||
const int nm = 6;
|
||||
|
||||
_declspec(align(16)) int p0[OCEANGRID*8];
|
||||
coef4r22c(p0, nm);
|
||||
for (i=0; i<OCEANGRID; i++)
|
||||
{
|
||||
xcfft1dc(&ar[OCEANGRID*i], &ai[OCEANGRID*i], p0, nm);
|
||||
}
|
||||
|
||||
coef4r22c(p0, nm);
|
||||
|
||||
_declspec(align(16)) float p1[4][OCEANGRID];
|
||||
_declspec(align(16)) float p2[4][OCEANGRID];
|
||||
|
||||
float *src, *dst;
|
||||
for (j=0; j<OCEANGRID; j+=4)
|
||||
{
|
||||
src = &ar[j];
|
||||
for (i=0; i<OCEANGRID; i++, src+=OCEANGRID)
|
||||
{
|
||||
p1[0][i] = src[0];
|
||||
p1[1][i] = src[1];
|
||||
p1[2][i] = src[2];
|
||||
p1[3][i] = src[3];
|
||||
}
|
||||
src = &ai[j];
|
||||
for (i=0; i<OCEANGRID; i++, src+=OCEANGRID)
|
||||
{
|
||||
p2[0][i] = src[0];
|
||||
p2[1][i] = src[1];
|
||||
p2[2][i] = src[2];
|
||||
p2[3][i] = src[3];
|
||||
}
|
||||
|
||||
xcfft1dc(&p1[0][0], &p2[0][0], p0, nm);
|
||||
xcfft1dc(&p1[1][0], &p2[1][0], p0, nm);
|
||||
xcfft1dc(&p1[2][0], &p2[2][0], p0, nm);
|
||||
xcfft1dc(&p1[3][0], &p2[3][0], p0, nm);
|
||||
|
||||
dst = &ar[j];
|
||||
for (i=0; i<OCEANGRID; i++, dst+=OCEANGRID)
|
||||
{
|
||||
dst[0] = p1[0][i];
|
||||
dst[1] = p1[1][i];
|
||||
dst[2] = p1[2][i];
|
||||
dst[3] = p1[3][i];
|
||||
}
|
||||
dst = &ai[j];
|
||||
for (i=0; i<OCEANGRID; i++, dst+=OCEANGRID)
|
||||
{
|
||||
dst[0] = p2[0][i];
|
||||
dst[1] = p2[1][i];
|
||||
dst[2] = p2[2][i];
|
||||
dst[3] = p2[3][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma warning(pop)
|
||||
|
||||
#endif // !defined(WIN64)
|
||||
1523
RenderDll/Common/RendElements/RendElement.cpp
Normal file
1523
RenderDll/Common/RendElements/RendElement.cpp
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user