1531 lines
43 KiB
C++
1531 lines
43 KiB
C++
/*=============================================================================
|
|
D3DRenderRE.cpp : implementation of the Rendering RenderElements pipeline.
|
|
Copyright 2001 Crytek Studios. All Rights Reserved.
|
|
|
|
Revision history:
|
|
* Created by Honitch Andrey
|
|
|
|
=============================================================================*/
|
|
|
|
#include "stdafx.h"
|
|
#include "DriverD3D8.h"
|
|
//#include "../cry3dengine/CryAnimation.h"
|
|
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
|
|
//=======================================================================
|
|
|
|
void CRE2DQuad::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;
|
|
|
|
int w=800;
|
|
int h=600;
|
|
|
|
m_arrVerts[0].x = (float)w;
|
|
m_arrVerts[0].y = 0;
|
|
m_arrVerts[0].z = 0;
|
|
m_arrVerts[0].s = 1;
|
|
m_arrVerts[0].t = 0;
|
|
|
|
m_arrVerts[1].x = 0;
|
|
m_arrVerts[1].y = 0;
|
|
m_arrVerts[1].z = 0;
|
|
m_arrVerts[1].s = 0;
|
|
m_arrVerts[1].t = 0;
|
|
|
|
m_arrVerts[2].x = (float)w;
|
|
m_arrVerts[2].y = (float)h;
|
|
m_arrVerts[2].z = 0;
|
|
m_arrVerts[2].s = 1;
|
|
m_arrVerts[2].t = 1;
|
|
|
|
m_arrVerts[3].x = 0;
|
|
m_arrVerts[3].y = (float)h;
|
|
m_arrVerts[3].z = 0;
|
|
m_arrVerts[3].s = 0;
|
|
m_arrVerts[3].t = 1;
|
|
}
|
|
|
|
void CREFlareGeom::mfCheckVis(CFColor &col, CCObject *obj)
|
|
{
|
|
float Depth[3][3];
|
|
float ft;
|
|
float f;
|
|
|
|
CD3D8Renderer *rd = gcpRendD3D;
|
|
int re = 0;//rd->mfGetRecurseLevel();
|
|
SFlareFrame *ff = &mFlareFr[re];
|
|
|
|
LPDIRECT3DDEVICE8 pd3dDevice = rd->mfGetD3DDevice();
|
|
IDirect3DSurface8 *ZSurf = rd->mfGetZSurface();
|
|
D3DSURFACE_DESC *ddsd = rd->mfGetZSurfaceDesc();
|
|
|
|
// Lock Z surface.
|
|
int minx, miny, maxx, maxy;
|
|
int hgt = rd->GetHeight();
|
|
int wdt = rd->GetWidth();
|
|
int y = hgt - ff->mY;
|
|
if (ff->mX-5 < 0)
|
|
minx = 0;
|
|
else
|
|
minx = ff->mX-5;
|
|
if (y-5 < 0)
|
|
miny = 0;
|
|
else
|
|
miny = y-5;
|
|
if (ff->mX+5 > wdt)
|
|
maxx = wdt;
|
|
else
|
|
maxx = ff->mX+5;
|
|
if (y+5 > hgt)
|
|
maxy = hgt;
|
|
else
|
|
maxy = y+5;
|
|
|
|
|
|
D3DLOCKED_RECT rc;
|
|
HRESULT ddrval = ZSurf->LockRect( &rc, NULL, D3DLOCK_READONLY );
|
|
if( ddrval!=D3D_OK )
|
|
{
|
|
iLog->Log("D3D Driver: Lock on Zbuffer failed (%s)\n", rd->D3DError(ddrval));
|
|
return;
|
|
}
|
|
|
|
int i, j;
|
|
switch( ddsd->Format )
|
|
{
|
|
case D3DFMT_D16:
|
|
{
|
|
ushort* src = (ushort*)rc.pBits;
|
|
int pitch = rc.Pitch>>1;
|
|
src = &src[minx+miny*pitch];
|
|
for (i=0; i<3; i++)
|
|
{
|
|
for (j=0; j<3; j++)
|
|
{
|
|
Depth[i][j] = src[j*5] / 65536.0f;
|
|
}
|
|
src += pitch*5;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case D3DFMT_D24S8:
|
|
{
|
|
DWORD* src = (DWORD*)rc.pBits;
|
|
int pitch = rc.Pitch>>2;
|
|
src = &src[minx+miny*pitch];
|
|
for (i=0; i<3; i++)
|
|
{
|
|
for (j=0; j<3; j++)
|
|
{
|
|
Depth[i][j] = (src[j*5]>>8) / 16777216.0f;
|
|
}
|
|
src += pitch*5;
|
|
}
|
|
}
|
|
break;
|
|
|
|
#ifndef _XBOX
|
|
case D3DFMT_D32:
|
|
{
|
|
DWORD* src = (DWORD*)rc.pBits;
|
|
int pitch = rc.Pitch>>2;
|
|
src = &src[minx+miny*pitch];
|
|
for (i=0; i<3; i++)
|
|
{
|
|
for (j=0; j<3; j++)
|
|
{
|
|
Depth[i][j] = src[j*5] / 4294967296.0f;
|
|
}
|
|
src += pitch*5;
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
}
|
|
ZSurf->UnlockRect();
|
|
|
|
float Scale = 0;
|
|
for (i=0; i<3; i++)
|
|
{
|
|
for (j=0; j<3; j++)
|
|
{
|
|
float Dept = (Depth[i][j]-rd->mMinDepth) / (rd->mMaxDepth-rd->mMinDepth);
|
|
f = gRenDev->m_ProjMatrix(3,2)/(Dept*gRenDev->m_ProjMatrix(2,3)-gRenDev->m_ProjMatrix(2,2)) - ff->mDepth;
|
|
if (f < 24.0f)
|
|
{
|
|
if (i==1 && j==1)
|
|
Scale += 3.0f;
|
|
else
|
|
if (i==1 || j==1)
|
|
Scale += 2.0f;
|
|
else
|
|
Scale += 1.0f;
|
|
}
|
|
}
|
|
}
|
|
ff->mScale = Scale / 9.0f;
|
|
if (ff->mScale > 1.0f)
|
|
ff->mScale = 1.0f;
|
|
if (ff->mScale)
|
|
{
|
|
if (!ff->mbVis)
|
|
{
|
|
ff->mbVis = true;
|
|
ff->mDecayTime = gRenDev->m_RP.m_RealTime-0.001f;
|
|
}
|
|
ft = (gRenDev->m_RP.m_RealTime - ff->mDecayTime) * CRenderer::CV_r_coronafade;
|
|
if (ft > 1.0f)
|
|
ft = 1.0f;
|
|
ft *= ff->mScale;
|
|
}
|
|
else
|
|
{
|
|
if (ff->mbVis)
|
|
{
|
|
ff->mbVis = false;
|
|
ff->mDecayTime = gRenDev->m_RP.m_RealTime-0.001f;
|
|
}
|
|
ft = 1.0f - (gRenDev->m_RP.m_RealTime - ff->mDecayTime) * CRenderer::CV_r_coronafade;
|
|
if (ft > 1.0f)
|
|
ft = 1.0f;
|
|
ft *= ff->mScale;
|
|
}
|
|
col = ff->mColor;
|
|
col.a = ft;
|
|
col.ClampAlpha();
|
|
}
|
|
|
|
//=========================================================================================
|
|
|
|
bool CREOcLeaf::mfPreDraw(SShaderPass *sl)
|
|
{
|
|
CLeafBuffer *lb = m_pBuffer->GetVertexContainer();
|
|
for (int i=0; i<VSF_NUM; i++)
|
|
{
|
|
if (lb->m_pVertexBuffer->m_VS[i].m_bLocked)
|
|
{
|
|
gcpRendD3D->UnlockBuffer(lb->m_pVertexBuffer, i);
|
|
lb->m_pVertexBuffer->m_VS[i].m_bLocked = false;
|
|
}
|
|
}
|
|
LPDIRECT3DDEVICE8 dv = gcpRendD3D->mfGetD3DDevice();
|
|
HRESULT h;
|
|
|
|
h = dv->SetStreamSource( 0, (IDirect3DVertexBuffer8 *)lb->m_pVertexBuffer->m_VS[VSF_GENERAL].m_VertBuf.m_pPtr, m_VertexSize[lb->m_pVertexBuffer->m_vertexformat]);
|
|
|
|
if (gRenDev->m_RP.m_FlagsModificators & RBMF_TANGENTSUSED)
|
|
{
|
|
gRenDev->m_RP.m_PersFlags |= RBPF_USESTREAM1;
|
|
h = dv->SetStreamSource( 1, (IDirect3DVertexBuffer8 *)lb->m_pVertexBuffer->m_VS[VSF_TANGENTS].m_VertBuf.m_pPtr, sizeof(SPipTangents));
|
|
}
|
|
else
|
|
if (gRenDev->m_RP.m_PersFlags & RBPF_USESTREAM1)
|
|
{
|
|
gRenDev->m_RP.m_PersFlags &= ~RBPF_USESTREAM1;
|
|
h = dv->SetStreamSource( 1, NULL, 0);
|
|
}
|
|
|
|
if (gRenDev->m_RP.m_FlagsModificators & RBMF_LMTCUSED)
|
|
{
|
|
gRenDev->m_RP.m_PersFlags |= RBPF_USESTREAM2;
|
|
if (gRenDev->m_RP.m_pCurObject->m_pLMTCBufferO && gRenDev->m_RP.m_pCurObject->m_pLMTCBufferO->m_pVertexBuffer)
|
|
h = dv->SetStreamSource( 2, (IDirect3DVertexBuffer8 *)gRenDev->m_RP.m_pCurObject->m_pLMTCBufferO->m_pVertexBuffer->m_VS[VSF_GENERAL].m_VertBuf.m_pPtr, sizeof(Vec3d));
|
|
else
|
|
h = dv->SetStreamSource( 2, (IDirect3DVertexBuffer8 *)lb->m_pVertexBuffer->m_VS[VSF_LMTC].m_VertBuf.m_pPtr, sizeof(SMRendTexVert));
|
|
}
|
|
else
|
|
if (gRenDev->m_RP.m_PersFlags & RBPF_USESTREAM2)
|
|
{
|
|
gRenDev->m_RP.m_PersFlags &= ~RBPF_USESTREAM2;
|
|
h = dv->SetStreamSource( 2, NULL, 0);
|
|
}
|
|
|
|
IDirect3DIndexBuffer8 *pIndBuf = (IDirect3DIndexBuffer8 *)lb->m_Indices.m_VertBuf.m_pPtr;
|
|
assert(pIndBuf);
|
|
h = dv->SetIndices(pIndBuf, 0);
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CRETempMesh::mfPreDraw(SShaderPass *sl)
|
|
{
|
|
CVertexBuffer *vb = m_VBuffer;
|
|
|
|
for (int i=0; i<VSF_NUM; i++)
|
|
{
|
|
if (vb->m_VS[i].m_bLocked)
|
|
{
|
|
gcpRendD3D->UnlockBuffer(vb, i);
|
|
vb->m_VS[i].m_bLocked = false;
|
|
}
|
|
}
|
|
|
|
if (!m_Inds.m_nItems)
|
|
return false;
|
|
|
|
LPDIRECT3DDEVICE8 dv = gcpRendD3D->mfGetD3DDevice();
|
|
HRESULT h;
|
|
|
|
h = dv->SetStreamSource( 0, (IDirect3DVertexBuffer8 *)vb->m_VS[VSF_GENERAL].m_VertBuf.m_pPtr, m_VertexSize[vb->m_vertexformat]);
|
|
|
|
if (gRenDev->m_RP.m_FlagsModificators & RBMF_TANGENTSUSED)
|
|
{
|
|
gRenDev->m_RP.m_PersFlags |= RBPF_USESTREAM1;
|
|
h = dv->SetStreamSource( 1, (IDirect3DVertexBuffer8 *)vb->m_VS[VSF_TANGENTS].m_VertBuf.m_pPtr, sizeof(SPipTangents));
|
|
}
|
|
else
|
|
if (gRenDev->m_RP.m_PersFlags & RBPF_USESTREAM1)
|
|
{
|
|
gRenDev->m_RP.m_PersFlags &= ~RBPF_USESTREAM1;
|
|
h = dv->SetStreamSource( 1, NULL, 0);
|
|
}
|
|
|
|
if (gRenDev->m_RP.m_FlagsModificators & RBMF_LMTCUSED)
|
|
{
|
|
gRenDev->m_RP.m_PersFlags |= RBPF_USESTREAM2;
|
|
h = dv->SetStreamSource( 2, (IDirect3DVertexBuffer8 *)vb->m_VS[VSF_LMTC].m_VertBuf.m_pPtr, sizeof(SMRendTexVert));
|
|
}
|
|
else
|
|
if (gRenDev->m_RP.m_PersFlags & RBPF_USESTREAM2)
|
|
{
|
|
gRenDev->m_RP.m_PersFlags &= ~RBPF_USESTREAM2;
|
|
h = dv->SetStreamSource( 2, NULL, 0);
|
|
}
|
|
|
|
h = dv->SetIndices((IDirect3DIndexBuffer8 *)m_Inds.m_VertBuf.m_pPtr, 0);
|
|
|
|
return true;
|
|
}
|
|
|
|
CREOcclusionQuery::~CREOcclusionQuery()
|
|
{
|
|
int i;
|
|
|
|
for (i=0; i<8; i++)
|
|
{
|
|
}
|
|
}
|
|
|
|
bool CREOcclusionQuery::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool CREFlashBang::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
// Drawing of Flashbang texture over the screen
|
|
// FlashBang texture is already set.
|
|
return true;
|
|
}
|
|
|
|
bool CRETempMesh::mfDraw(SShader *ef, SShaderPass *sl)
|
|
{
|
|
CD3D8Renderer *r = gcpRendD3D;
|
|
CVertexBuffer *vb = m_VBuffer;
|
|
if (!vb)
|
|
return false;
|
|
|
|
// Hardware effector
|
|
int nInds = m_Inds.m_nItems;
|
|
int nPrimType = R_PRIMV_TRIANGLES;
|
|
if (nInds)
|
|
{
|
|
r->m_RP.m_RendNumIndices = nInds;
|
|
r->m_RP.m_RendNumVerts = vb->m_NumVerts;
|
|
r->EF_DrawIndexedMesh(nPrimType);
|
|
}
|
|
vb->m_bFenceSet = true;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CREOcLeaf::mfDraw(SShader *ef, SShaderPass *sl)
|
|
{
|
|
CD3D8Renderer *r = gcpRendD3D;
|
|
|
|
CLeafBuffer *lb = m_pBuffer;
|
|
|
|
// Hardware effector
|
|
if (ef->m_HWTechniques.Num())
|
|
{
|
|
r->EF_DrawIndexedMesh(lb->m_nPrimetiveType);
|
|
return true;
|
|
}
|
|
|
|
r->DrawBuffer(lb->m_pVertexBuffer, &lb->m_Indices, m_pChunk->nNumIndices, m_pChunk->nFirstIndexId, lb->m_nPrimetiveType, m_pChunk->nFirstVertId,m_pChunk->nNumVerts);
|
|
|
|
return (true);
|
|
}
|
|
|
|
void CREClientPoly2D::mfLock()
|
|
{
|
|
CRenderer *r = gRenDev;
|
|
uint Start;
|
|
r->m_RP.m_Ptr.Ptr_D_1T = r->m_RP.m_VB.VBPtr_D_1T->Lock(r->m_RP.m_MaxVerts, Start);
|
|
r->m_RP.m_RendIndices = r->m_RP.m_IndexBuf->Lock(r->m_RP.m_MaxTris*3, Start);
|
|
r->m_RP.m_bLocked = true;
|
|
r->m_RP.m_NextPtr = r->m_RP.m_Ptr;
|
|
}
|
|
|
|
void CREClientPoly::mfLock()
|
|
{
|
|
CRenderer *r = gRenDev;
|
|
uint Start;
|
|
r->m_RP.m_Ptr.Ptr_D_1T = r->m_RP.m_VB.VBPtr_D_1T->Lock(r->m_RP.m_MaxVerts, Start);
|
|
r->m_RP.m_RendIndices = r->m_RP.m_IndexBuf->Lock(r->m_RP.m_MaxTris*3, Start);
|
|
r->m_RP.m_bLocked = true;
|
|
r->m_RP.m_NextPtr = r->m_RP.m_Ptr;
|
|
}
|
|
|
|
void CREPolyMesh::mfLock()
|
|
{
|
|
CRenderer *r = gRenDev;
|
|
uint Start;
|
|
r->m_RP.m_Ptr.Ptr_D_1T = r->m_RP.m_VB.VBPtr_D_1T->Lock(r->m_RP.m_MaxVerts, Start);
|
|
r->m_RP.m_RendIndices = r->m_RP.m_IndexBuf->Lock(r->m_RP.m_MaxTris*3, Start);
|
|
r->m_RP.m_bLocked = true;
|
|
r->m_RP.m_NextPtr = r->m_RP.m_Ptr;
|
|
}
|
|
|
|
|
|
#define GLARE_OFS 1.0/32
|
|
|
|
void GlareQuad(const CFColor & color, CD3D8Renderer * gcpRendD3D)
|
|
{
|
|
/*
|
|
glBegin (GL_QUADS);
|
|
glTexCoord2f(-1, 1);
|
|
glVertex3f (0.1f, 1, 1);
|
|
glTexCoord2f(0, 1);
|
|
glVertex3f (0.1f, -1, 1);
|
|
glTexCoord2f(0, 0);
|
|
glVertex3f (0.1f, -1, -1);
|
|
glTexCoord2f(-1, 0);
|
|
glVertex3f (0.1f, 1, -1);
|
|
glEnd ();
|
|
*/
|
|
gcpRendD3D->DrawQuad3D(Vec3d(0.1f, 1, 1), Vec3d(0.1f, -1, 1), Vec3d(0.1f, -1, -1), Vec3d(0.1f, 1, -1),
|
|
color, -1,1, 0,0);
|
|
}
|
|
|
|
|
|
bool CREGlare::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
LPDIRECT3DDEVICE8 dv = gcpRendD3D->mfGetD3DDevice();
|
|
|
|
CTexMan::m_Text_Glare->Set();
|
|
//gcpOGL->m_Text_Glare->SaveJPG("Glare.jpg", false);
|
|
|
|
//glDisableClientState(GL_COLOR_ARRAY);
|
|
//gcpOGL->EF_SetColorOp(eCO_MODULATE);
|
|
gRenDev->SetEnviMode(R_MODE_MODULATE);
|
|
gRenDev->SetState(GS_NODEPTHTEST | GS_BLSRC_ONE | GS_BLDST_ONE);
|
|
//glDisable(GL_CULL_FACE);
|
|
gRenDev->SetCullMode(R_CULL_NONE);
|
|
|
|
//glPushMatrix();
|
|
gcpRendD3D->PushMatrix();
|
|
//glLoadIdentity ();
|
|
gcpRendD3D->m_matView->LoadIdentity();
|
|
//glRotatef (-90, 1, 0, 0); // put Z going up
|
|
gcpRendD3D->m_matView->RotateAxis(&D3DXVECTOR3(1,0,0), 3.141593f * (-90) / 180);
|
|
//glRotatef (90, 0, 0, 1); // put Z going up
|
|
gcpRendD3D->m_matView->RotateAxis(&D3DXVECTOR3(0,0,1), 3.141593f * (90) / 180);
|
|
dv->SetTransform(D3DTS_VIEW, gcpRendD3D->m_matView->GetTop());
|
|
|
|
//glMatrixMode(GL_PROJECTION);
|
|
//glPushMatrix();
|
|
gcpRendD3D->m_matProj->Push();
|
|
//dv->SetTransform(D3DTS_VIEW, m_matProj->GetTop());
|
|
//glLoadIdentity ();
|
|
gcpRendD3D->m_matProj->LoadIdentity();
|
|
dv->SetTransform(D3DTS_PROJECTION, gcpRendD3D->m_matProj->GetTop());
|
|
|
|
//glMatrixMode(GL_MODELVIEW);
|
|
|
|
CFColor col;
|
|
|
|
if (CRenderer::CV_r_glare != 2)
|
|
{
|
|
//glColor4f (0.2f*CRenderer::CV_r_glareamount, 0.2f*CRenderer::CV_r_glareamount, 0.2f*CRenderer::CV_r_glareamount, 0.2f*CRenderer::CV_r_glareamount);
|
|
col = CFColor(0.2f*CRenderer::CV_r_glareamount, 0.2f*CRenderer::CV_r_glareamount, 0.2f*CRenderer::CV_r_glareamount, 0.2f*CRenderer::CV_r_glareamount);
|
|
|
|
//glPushMatrix();
|
|
gRenDev->PushMatrix();
|
|
//glTranslatef(0,0,GLARE_OFS);
|
|
gRenDev->TranslateMatrix(0,0,GLARE_OFS);
|
|
GlareQuad(col, gcpRendD3D);
|
|
//glPopMatrix();
|
|
gRenDev->PopMatrix();
|
|
|
|
gRenDev->PushMatrix();
|
|
//glTranslatef(0,0,-GLARE_OFS);
|
|
gRenDev->TranslateMatrix(0,0,-GLARE_OFS);
|
|
GlareQuad(col, gcpRendD3D);
|
|
gRenDev->PopMatrix();
|
|
|
|
gRenDev->PushMatrix();
|
|
//glTranslatef(0,-GLARE_OFS,0);
|
|
gRenDev->TranslateMatrix(0,-GLARE_OFS,0);
|
|
GlareQuad(col, gcpRendD3D);
|
|
gRenDev->PopMatrix();
|
|
|
|
gRenDev->PushMatrix();
|
|
//glTranslatef(0,GLARE_OFS,0);
|
|
gRenDev->TranslateMatrix(0,GLARE_OFS,0);
|
|
GlareQuad(col, gcpRendD3D);
|
|
gRenDev->PopMatrix();
|
|
}
|
|
else
|
|
//glColor4f (1.0f*CRenderer::CV_r_glareamount, 1.0f*CRenderer::CV_r_glareamount, 1.0f*CRenderer::CV_r_glareamount, 1.0f*CRenderer::CV_r_glareamount);
|
|
col = CFColor(1.0f*CRenderer::CV_r_glareamount, 1.0f*CRenderer::CV_r_glareamount, 1.0f*CRenderer::CV_r_glareamount, 1.0f*CRenderer::CV_r_glareamount);
|
|
|
|
GlareQuad(col, gcpRendD3D);
|
|
|
|
//glMatrixMode(GL_PROJECTION);
|
|
//glPopMatrix();
|
|
gcpRendD3D->m_matProj->Pop();
|
|
dv->SetTransform(D3DTS_PROJECTION, gcpRendD3D->m_matProj->GetTop());
|
|
|
|
//glMatrixMode(GL_MODELVIEW);
|
|
//glPopMatrix();
|
|
gRenDev->PopMatrix();
|
|
|
|
gRenDev->ResetToDefault();
|
|
|
|
return true;
|
|
}
|
|
|
|
void CREOcLeaf::mfEndFlush(void)
|
|
{
|
|
}
|
|
|
|
void CREOcean::UpdateTexture()
|
|
{
|
|
}
|
|
|
|
bool CREOcean::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool CRETriMeshShadow::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
CD3D8Renderer *rd = gcpRendD3D;
|
|
LPDIRECT3DDEVICE8 dv = rd->mfGetD3DDevice();
|
|
|
|
rd->SetState(0);
|
|
dv->SetRenderState(D3DRS_STENCILENABLE, TRUE);
|
|
dv->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
|
|
dv->SetRenderState(D3DRS_STENCILREF, 0);
|
|
dv->SetRenderState(D3DRS_STENCILWRITEMASK, 0xffffffff);
|
|
dv->SetRenderState(D3DRS_STENCILMASK, 0xffffffff);
|
|
|
|
rd->EF_SetColorOp(eCO_DISABLE);
|
|
|
|
if (gRenDev->CV_ind_VisualizeShadowVolumes)
|
|
{
|
|
rd->EF_SetGlobalColor(1,1,1,1);
|
|
rd->SetState(GS_NODEPTHTEST);
|
|
}
|
|
else
|
|
rd->SetState(GS_NOCOLMASK);
|
|
|
|
/* if(m_pBuffer)
|
|
{
|
|
dv->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP);
|
|
dv->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_INCRSAT);
|
|
dv->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
|
|
|
|
rd->D3DSetCull(eCULL_Front);
|
|
|
|
//rd->DrawBuffer(m_pVertexBuffer, m_upIndicies, m_nNumIndices, R_PRIMV_TRIANGLES);
|
|
rd->DrawBuffer(m_pBuffer->m_pVertexBuffer, m_upIndicies, m_nNumIndices, R_PRIMV_TRIANGLES);
|
|
|
|
dv->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_DECRSAT);
|
|
rd->D3DSetCull(eCULL_Back);
|
|
|
|
//gRenDev->DrawBuffer(m_pVertexBuffer, m_upIndicies, m_nNumIndices, R_PRIMV_TRIANGLES);
|
|
rd->DrawBuffer(m_pBuffer->m_pVertexBuffer, m_upIndicies, m_nNumIndices, R_PRIMV_TRIANGLES);
|
|
rd->m_nShadowVolumePolys+=m_pBuffer->GetIndices().Count()/3;
|
|
}*/
|
|
|
|
dv->SetRenderState(D3DRS_STENCILENABLE, FALSE);
|
|
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
bool CRETriMeshAdditionalShadow::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
return true;
|
|
}
|
|
*/
|
|
|
|
///////////////////////////////////////////////////////////////////
|
|
// Render shadows on the object as first pass
|
|
///////////////////////////////////////////////////////////////////
|
|
/*bool CREShadowMap::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
return true;
|
|
} */
|
|
|
|
//===================================================================================
|
|
|
|
|
|
bool CREFlare::mfCheckVis(CCObject *obj)
|
|
{
|
|
// added by wat
|
|
if (gRenDev->m_RP.m_PersFlags & RBPF_DONTDRAWSUN)
|
|
return false;
|
|
|
|
|
|
LPDIRECT3DDEVICE8 dv = gcpRendD3D->mfGetD3DDevice();
|
|
|
|
if (!obj)
|
|
return false;
|
|
|
|
Vec3d or = obj->m_Trans;
|
|
bool bVis = false;
|
|
bool bSun = false;
|
|
|
|
float len = or.Length();
|
|
if (len > 4096.0f)
|
|
{
|
|
bSun = true;
|
|
or.Normalize();
|
|
or *= 500.0f;
|
|
or += gRenDev->m_RP.m_ViewOrg;
|
|
}
|
|
if (bSun && (gRenDev->m_RP.m_PersFlags & RBPF_DONTDRAWSUN))
|
|
return false;
|
|
|
|
if (CRenderer::CV_r_SunStyleCoronas)
|
|
bSun = true;
|
|
|
|
/*
|
|
if (CRenderer::CV_r_checkSunVis == 1 || !bSun || !gRenDev->GetAlphaBpp())
|
|
{
|
|
if (bSun)
|
|
CRenderer::CV_r_checkSunVis = 1;
|
|
|
|
float sx, sy, sz;
|
|
float fDepth;
|
|
gRenDev->ProjectToScreen(or.x, or.y, or.z, &sx, &sy, &sz);
|
|
if (sx>=0 && sy>=0 && sx<vp[2] && sy<vp[3])
|
|
{
|
|
//wat
|
|
//glReadPixels((GLint)sx, (GLint)sy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &fDepth);
|
|
|
|
if (fDepth>sz)
|
|
bVis = true;
|
|
}
|
|
}
|
|
else
|
|
*/
|
|
|
|
//*
|
|
|
|
if (CRenderer::CV_r_checkSunVis == 2)
|
|
{
|
|
gRenDev->ResetToDefault();
|
|
|
|
int sizeMask = 64;
|
|
|
|
int sizeMask2 = sizeMask/2;
|
|
|
|
int sizeTex = 128;//m_Map->GetWidth();
|
|
if (!obj->m_TexId0)
|
|
{
|
|
byte *data = new byte[sizeMask*sizeMask*4];
|
|
char name[128];
|
|
sprintf(name, "$AutoCoronas_%d", gcpRendD3D->m_TexGenID++);
|
|
STexPic *tp = gcpRendD3D->m_TexMan->CreateTexture(name, sizeMask, sizeMask, 1, FT_NOMIPS | FT_ALLOCATED, FT2_NODXT, data, eTT_Base, -1.0f, -1.0f, 0, NULL);
|
|
delete [] data;
|
|
obj->m_TexId0 = tp->m_Id;
|
|
|
|
IDirect3DSurface8 * pTar = gcpRendD3D->mfGetBackSurface();
|
|
D3DSURFACE_DESC dc;
|
|
pTar->GetDesc(&dc);
|
|
if(tp->m_RefTex->m_VidTex)
|
|
((LPDIRECT3DTEXTURE8)tp->m_RefTex->m_VidTex)->Release();
|
|
#ifndef _XBOX
|
|
HRESULT h = D3DXCreateTexture(dv, sizeMask, sizeMask, 1, D3DUSAGE_DYNAMIC, dc.Format, D3DPOOL_DEFAULT, ((LPDIRECT3DTEXTURE8* )& tp->m_RefTex->m_VidTex ));
|
|
#else //_XBOX
|
|
HRESULT h = D3DXCreateTexture(dv, sizeMask, sizeMask, 1, 0, dc.Format, D3DPOOL_DEFAULT, ((LPDIRECT3DTEXTURE8* )& tp->m_RefTex->m_VidTex ));
|
|
#endif //_XBOX
|
|
}
|
|
if (!obj->m_TexId1)
|
|
{
|
|
byte *data = new byte[sizeTex*sizeTex*4];
|
|
char name[128];
|
|
sprintf(name, "$AutoCoronas_%d", gcpRendD3D->m_TexGenID++);
|
|
STexPic *tp = gcpRendD3D->m_TexMan->CreateTexture(name, sizeTex, sizeTex, 1, FT_NOMIPS | FT_ALLOCATED, FT2_NODXT, data, eTT_Base, -1.0f, -1.0f, 0, NULL);
|
|
delete [] data;
|
|
obj->m_TexId1 = tp->m_Id;
|
|
|
|
IDirect3DSurface8 * pTar = gcpRendD3D->mfGetBackSurface();
|
|
D3DSURFACE_DESC dc;
|
|
pTar->GetDesc(&dc);
|
|
if(tp->m_RefTex->m_VidTex)
|
|
((LPDIRECT3DTEXTURE8)tp->m_RefTex->m_VidTex)->Release();
|
|
#ifndef _XBOX
|
|
HRESULT h = D3DXCreateTexture(dv, sizeTex, sizeTex, 1, D3DUSAGE_DYNAMIC, dc.Format, D3DPOOL_DEFAULT, ((LPDIRECT3DTEXTURE8* )& tp->m_RefTex->m_VidTex ));
|
|
//HRESULT h = D3DXCreateTexture(dv, sizeTex, sizeTex, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8, D3DPOOL_DEFAULT, ((LPDIRECT3DTEXTURE8* )& tp->m_RefTex->m_VidTex ));
|
|
#else //_XBOX
|
|
HRESULT h = D3DXCreateTexture(dv, sizeTex, sizeTex, 1, 0, dc.Format, D3DPOOL_DEFAULT, ((LPDIRECT3DTEXTURE8* )& tp->m_RefTex->m_VidTex ));
|
|
//HRESULT h = D3DXCreateTexture(dv, sizeTex, sizeTex, 1, 0, D3DFMT_A8, D3DPOOL_DEFAULT, ((LPDIRECT3DTEXTURE8* )& tp->m_RefTex->m_VidTex ));
|
|
#endif //_XBOX
|
|
}
|
|
|
|
float sx, sy, sz;
|
|
int vp[4];
|
|
gRenDev->GetViewport(&vp[0], &vp[1], &vp[2], &vp[3]);
|
|
gRenDev->ProjectToScreen(or.x, or.y, or.z, &sx, &sy, &sz);
|
|
|
|
if (sx<vp[0]-sizeMask2 || sy<vp[1]-sizeMask2 || sx>vp[2]+sizeMask2 || sy>vp[3]+sizeMask2 || sz > 1.0f)
|
|
{
|
|
bVis = false;
|
|
}
|
|
else
|
|
{
|
|
//sx = floorf(sx);
|
|
//sy = floorf(sy);
|
|
|
|
int bFog=0; // remember fog value
|
|
///glGetIntegerv(GL_FOG,&bFog);
|
|
bFog = gRenDev->m_FS.m_bEnable;
|
|
///glDisable(GL_FOG);
|
|
dv->SetRenderState( D3DRS_FOGENABLE, FALSE);
|
|
|
|
///glMatrixMode(GL_PROJECTION);
|
|
///glPushMatrix();
|
|
gcpRendD3D->m_matProj->Push();
|
|
//glLoadIdentity();
|
|
//glOrtho(0.0, gRenDev->GetWidth(), 0.0, gRenDev->GetHeight(), -20.0, 0.0);
|
|
D3DXMatrixOrthoRH( gcpRendD3D->m_matProj->GetTop(), (float)gRenDev->GetWidth(), (float)gRenDev->GetHeight(), -20.0, 0.0);
|
|
dv->SetTransform(D3DTS_PROJECTION, gcpRendD3D->m_matProj->GetTop());
|
|
|
|
//glMatrixMode(GL_MODELVIEW);
|
|
//glPushMatrix();
|
|
gRenDev->PushMatrix();
|
|
//glLoadIdentity();
|
|
gcpRendD3D->m_matView->LoadIdentity();
|
|
dv->SetTransform(D3DTS_VIEW, gcpRendD3D->m_matView->GetTop());
|
|
|
|
gRenDev->SetCullMode(R_CULL_NONE);
|
|
gRenDev->SetEnviMode(R_MODE_MODULATE);
|
|
|
|
//gRenDev->m_Text_White->Set();
|
|
CTexMan::m_Text_White->Set();
|
|
|
|
float fsizeMask2 = (float)sizeMask2;
|
|
|
|
// set alpha to 0
|
|
{
|
|
gRenDev->SetState(GS_NODEPTHTEST);
|
|
gcpRendD3D->DrawQuad(sx-fsizeMask2, sy-fsizeMask2, sx+fsizeMask2, sy+fsizeMask2, CFColor(1.0f));
|
|
}
|
|
|
|
// Set alpha mask of visible areas (1 is visible)
|
|
{
|
|
gRenDev->SetState(0);
|
|
gcpRendD3D->DrawQuad(sx-fsizeMask2, sy-fsizeMask2, sx+fsizeMask2, sy+fsizeMask2, CFColor(0.0f));
|
|
}
|
|
|
|
// Generate alpha-mask texture with mip-maps
|
|
//gRenDev->SetTexture(obj->m_TexId0, eTT_Base);
|
|
//glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, (int)sx-sizeMask2, (int)sy-sizeMask2, sizeMask, sizeMask);
|
|
|
|
//byte *data = new byte [sizeMask * sizeMask * 3];
|
|
//int n = 0;
|
|
//glGetTexImage(GL_TEXTURE_2D, n, GL_RGB, GL_UNSIGNED_BYTE, data);
|
|
//int s = sizeMask*sizeMask;
|
|
//for (int i=0; i<s; i++)
|
|
//{
|
|
// n += data[i*3];
|
|
//}
|
|
//n /= s;
|
|
//delete [] data;
|
|
|
|
DWORD dwPix = 0;
|
|
RECT rc = {Max((int)sx-sizeMask2+1, vp[0]), Max((int)sy-sizeMask2+1,vp[1]), Min((int)sx+sizeMask2,vp[2]-1), Min((int)sy+sizeMask2,vp[3]-1)};
|
|
if((rc.right - rc.left) > 0 && rc.bottom - rc.top >0)
|
|
{
|
|
int dev = (rc.right - rc.left) * (rc.bottom - rc.top);
|
|
//IDirect3DTexture8 * pID3DTexture = (IDirect3DTexture8 * )obj->m_TexId0;
|
|
STexPic *t = (STexPic *)gcpRendD3D->m_TexMan->m_Textures[obj->m_TexId0];
|
|
IDirect3DTexture8 * pID3DTexture = (IDirect3DTexture8 * )t->m_RefTex->m_VidTex;
|
|
if(pID3DTexture)
|
|
{
|
|
IDirect3DSurface8 * pTexSurf;
|
|
pID3DTexture->GetSurfaceLevel(0, &pTexSurf);
|
|
IDirect3DSurface8 * pTar = gcpRendD3D->mfGetBackSurface();
|
|
|
|
DWORD dwPixSize = 4;
|
|
D3DSURFACE_DESC dc;
|
|
pTar->GetDesc(&dc);
|
|
switch(dc.Format)
|
|
{
|
|
#ifndef _XBOX
|
|
case D3DFMT_R8G8B8:
|
|
dwPixSize = 3; break;
|
|
#endif // _XBOX
|
|
case D3DFMT_R5G6B5:
|
|
case D3DFMT_X1R5G5B5:
|
|
case D3DFMT_A1R5G5B5:
|
|
dwPixSize = 2; break;
|
|
};
|
|
|
|
POINT p = {0,0};
|
|
if(dv->CopyRects(pTar, &rc, 1, pTexSurf, &p)==S_OK)
|
|
{
|
|
D3DLOCKED_RECT lr;
|
|
if(pTexSurf->LockRect(&lr, 0, D3DLOCK_READONLY)==S_OK)
|
|
{
|
|
byte * pBuf = (byte*)lr.pBits;
|
|
for(int i = 0; i< rc.right-rc.left; i++)
|
|
for(int j = 0; j< rc.bottom-rc.top; j++)
|
|
if(dwPixSize == 2)
|
|
dwPix += ((pBuf[i*dwPixSize + sizeMask * j * dwPixSize]) & 0x1f)? 255 : 0;
|
|
else
|
|
dwPix += pBuf[i*dwPixSize + sizeMask * j * dwPixSize];
|
|
dwPix /= dev;
|
|
pTexSurf->UnlockRect();
|
|
}
|
|
}
|
|
pTexSurf->Release();
|
|
}
|
|
}
|
|
DWORD n = dwPix;
|
|
|
|
|
|
obj->m_TempVars[0] = (float)n / 255.0f;
|
|
if (n < 20)
|
|
{
|
|
bVis = false;
|
|
}
|
|
else
|
|
{
|
|
// Scale factor
|
|
obj->m_TempVars[1] = 8.0f;
|
|
int nPasses = 32;
|
|
float fSizeTex = (float)sizeTex;
|
|
// Result blured texture size
|
|
obj->m_TempVars[2] = fSizeTex;
|
|
float fScale = m_fScale * obj->m_TempVars[1];
|
|
float fDif = fSizeTex / (float)sizeMask;
|
|
float fSizeTex2 = fSizeTex / 2.0f;
|
|
float fLast = fSizeTex2 / (fScale * fDif);
|
|
float fCur = fSizeTex2 * 2;
|
|
float fDelt = (fLast - fCur) / (float)nPasses;
|
|
float fCurAlpha = 0.0f;
|
|
float fDeltAlpha = 1.0f / (float)nPasses;
|
|
float fPosx = (float)(gRenDev->GetWidth()/2);
|
|
float fPosy = (float)(gRenDev->GetHeight()/2);
|
|
|
|
|
|
gRenDev->SetState(GS_NODEPTHTEST);
|
|
CTexMan::m_Text_White->Set();
|
|
|
|
gcpRendD3D->DrawQuad(fPosx-fSizeTex2, fPosy-fSizeTex2, fPosx+fSizeTex2, fPosy+fSizeTex2, CFColor(1.0f));
|
|
|
|
//gRenDev->SetTexture(obj->m_TexId0, eTT_Base);
|
|
STexPic *t = (STexPic *)gcpRendD3D->m_TexMan->m_Textures[obj->m_TexId0];
|
|
gRenDev->SetTexture(t->m_Bind, eTT_Base);
|
|
dv->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
|
|
dv->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
|
|
|
|
// Radially blur the alpha texture
|
|
for (int pass=0; pass<nPasses; pass++)
|
|
{
|
|
gRenDev->SetState(GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA | GS_NODEPTHTEST);
|
|
//gRenDev->SetState(GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCCOL | GS_NODEPTHTEST);
|
|
|
|
//dv->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
|
|
//dv->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);
|
|
//dv->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
|
|
|
|
#ifndef _XBOX
|
|
gcpRendD3D->DrawQuad(fPosx-fCur, fPosy-fCur, fPosx+fCur, fPosy+fCur, CFColor(fDeltAlpha));
|
|
#else //_XBOX
|
|
gcpRendD3D->DrawQuad(fPosx-fCur, fPosy-fCur, fPosx+fCur, fPosy+fCur, CFColor(fDeltAlpha), 0, 0, (float)sizeMask, (float)sizeMask);
|
|
#endif //_XBOX
|
|
|
|
fCur += fDelt;
|
|
fCurAlpha += fDeltAlpha;
|
|
}
|
|
|
|
// Generate blured alpha texture without mip-maps
|
|
//gRenDev->SetTexture(obj->m_TexId1, eTT_Base);
|
|
//glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, (int)(fPosx-fSizeTex2), (int)(fPosy-fSizeTex2), sizeTex, sizeTex);
|
|
RECT rc = {Max((int)(fPosx-fSizeTex2)+1, vp[0]), Max((int)(fPosy-fSizeTex2)+1,vp[1]), Min((int)(fPosx+fSizeTex2),vp[2]-1), Min((int)(fPosy+fSizeTex2),vp[3]-1)};
|
|
if((rc.right - rc.left) > 0 && rc.bottom - rc.top >0)
|
|
{
|
|
//IDirect3DTexture8 * pID3DTexture = (IDirect3DTexture8 * )obj->m_TexId1;
|
|
STexPic *t = (STexPic *)gcpRendD3D->m_TexMan->m_Textures[obj->m_TexId1];
|
|
IDirect3DTexture8 * pID3DTexture = (IDirect3DTexture8 * )t->m_RefTex->m_VidTex;
|
|
if(pID3DTexture)
|
|
{
|
|
IDirect3DSurface8 * pTexSurf;
|
|
pID3DTexture->GetSurfaceLevel(0, &pTexSurf);
|
|
IDirect3DSurface8 * pTar = gcpRendD3D->mfGetBackSurface();
|
|
POINT p = {0,0};
|
|
dv->CopyRects(pTar, &rc, 1, pTexSurf, &p);
|
|
RECT rec = {0, 0, rc.right - rc.left, rc.bottom - rc.top};
|
|
pTexSurf->Release();
|
|
}
|
|
bVis = true;
|
|
}
|
|
else
|
|
bVis = false;
|
|
}
|
|
|
|
gRenDev->ResetToDefault();
|
|
//gRenDev->SetState(GS_NODEPTHTEST);
|
|
|
|
gRenDev->PopMatrix();
|
|
gcpRendD3D->m_matProj->Pop();
|
|
dv->SetTransform(D3DTS_PROJECTION, gcpRendD3D->m_matProj->GetTop());
|
|
|
|
if(bFog)
|
|
dv->SetRenderState( D3DRS_FOGENABLE, TRUE);
|
|
|
|
gRenDev->SetTexture(0, eTT_Base);
|
|
// !!! WARNING !!!
|
|
//gcpRendD3D->EF_ClearBuffers(true);
|
|
}
|
|
}
|
|
else
|
|
if (CRenderer::CV_r_checkSunVis == 3)
|
|
{
|
|
gRenDev->ResetToDefault();
|
|
int sizeMask = 64;
|
|
int sizeMask2 = sizeMask/2;
|
|
|
|
int sizeTex = 128;//m_Map->GetWidth();
|
|
float sx, sy, sz;
|
|
int vp[4];
|
|
gRenDev->GetViewport(&vp[0], &vp[1], &vp[2], &vp[3]);
|
|
gRenDev->ProjectToScreen(or.x, or.y, or.z, &sx, &sy, &sz);
|
|
|
|
if (sx<vp[0]-sizeMask2 || sy<vp[1]-sizeMask2 || sx>vp[2]+sizeMask2 || sy>vp[3]+sizeMask2)
|
|
{
|
|
bVis = false;
|
|
}
|
|
else
|
|
{
|
|
int bFog=0; // remember fog value
|
|
bFog = gRenDev->m_FS.m_bEnable;
|
|
dv->SetRenderState( D3DRS_FOGENABLE, FALSE);
|
|
|
|
gcpRendD3D->m_matProj->Push();
|
|
D3DXMatrixOrthoRH( gcpRendD3D->m_matProj->GetTop(), (float)gRenDev->GetWidth(), (float)gRenDev->GetHeight(), -20.0, 0.0);
|
|
dv->SetTransform(D3DTS_PROJECTION, gcpRendD3D->m_matProj->GetTop());
|
|
|
|
gRenDev->PushMatrix();
|
|
gcpRendD3D->m_matView->LoadIdentity();
|
|
dv->SetTransform(D3DTS_VIEW, gcpRendD3D->m_matView->GetTop());
|
|
|
|
gRenDev->SetCullMode(R_CULL_NONE);
|
|
gRenDev->SetEnviMode(R_MODE_MODULATE);
|
|
|
|
float fsizeMask2 = (float)sizeMask2;
|
|
|
|
CTexMan::m_Text_White->Set();
|
|
// set alpha to 0
|
|
gRenDev->SetState(GS_NODEPTHTEST);
|
|
gcpRendD3D->DrawQuad(sx-fsizeMask2, sy-fsizeMask2, sx+fsizeMask2, sy+fsizeMask2, CFColor(0.0f));
|
|
// Set alpha mask of visible areas
|
|
gRenDev->SetState(0);
|
|
gcpRendD3D->DrawQuad(sx-fsizeMask2, sy-fsizeMask2, sx+fsizeMask2, sy+fsizeMask2, CFColor(1.0f));
|
|
|
|
// Generate alpha-mask texture with mip-maps
|
|
DWORD dwPix = 0;
|
|
RECT rc = {Max((int)sx-sizeMask2+1, vp[0]), Max((int)sy-sizeMask2+1,vp[1]), Min((int)sx+sizeMask2,vp[2]-1), Min((int)sy+sizeMask2,vp[3]-1)};
|
|
if((rc.right - rc.left) > 0 && rc.bottom - rc.top >0)
|
|
{
|
|
int dev = (rc.right - rc.left) * (rc.bottom - rc.top);
|
|
IDirect3DSurface8 * pTar = gcpRendD3D->mfGetBackSurface();
|
|
|
|
DWORD dwPixSize = 4;
|
|
D3DSURFACE_DESC dc;
|
|
pTar->GetDesc(&dc);
|
|
switch(dc.Format)
|
|
{
|
|
#ifndef _XBOX
|
|
case D3DFMT_R8G8B8:
|
|
dwPixSize = 3; break;
|
|
#endif // _XBOX
|
|
case D3DFMT_R5G6B5:
|
|
case D3DFMT_X1R5G5B5:
|
|
case D3DFMT_A1R5G5B5:
|
|
dwPixSize = 2; break;
|
|
};
|
|
|
|
POINT p = {0,0};
|
|
D3DLOCKED_RECT lr;
|
|
if(pTar->LockRect(&lr, &rc, D3DLOCK_READONLY)==S_OK)
|
|
{
|
|
byte * pBuf = (byte*)lr.pBits;
|
|
for(int i = 0; i< rc.right-rc.left; i++)
|
|
for(int j = 0; j< rc.bottom-rc.top; j++)
|
|
if(dwPixSize == 2)
|
|
dwPix += ((pBuf[i*dwPixSize + j * lr.Pitch]) & 0x1f)? 255 : 0;
|
|
else
|
|
dwPix += pBuf[i*dwPixSize + j * lr.Pitch];
|
|
dwPix /= dev;
|
|
pTar->UnlockRect();
|
|
}
|
|
}
|
|
gRenDev->SetState(GS_COLMASKONLYALPHA | GS_NODEPTHTEST);
|
|
|
|
obj->m_TempVars[0] = ((float)dwPix / 255.0f) * 1.5f;
|
|
obj->m_TempVars[0] = Clamp(obj->m_TempVars[0], 0.0f, 1.0f);
|
|
if (dwPix < 50)
|
|
bVis = false;
|
|
else
|
|
bVis = true;
|
|
|
|
gRenDev->ResetToDefault();
|
|
//gRenDev->SetState(GS_NODEPTHTEST);
|
|
|
|
gRenDev->PopMatrix();
|
|
gcpRendD3D->m_matProj->Pop();
|
|
dv->SetTransform(D3DTS_PROJECTION, gcpRendD3D->m_matProj->GetTop());
|
|
|
|
if(bFog)
|
|
dv->SetRenderState( D3DRS_FOGENABLE, TRUE);
|
|
|
|
gRenDev->SetTexture(0, eTT_Base);
|
|
}
|
|
}
|
|
|
|
if (bVis)
|
|
{
|
|
if (!obj->m_bVisible)
|
|
{
|
|
obj->m_bVisible = true;
|
|
obj->m_fLightFadeTime = gRenDev->m_RP.m_RealTime;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (obj->m_bVisible)
|
|
{
|
|
obj->m_bVisible = false;
|
|
obj->m_fLightFadeTime = gRenDev->m_RP.m_RealTime;
|
|
}
|
|
}
|
|
|
|
return bVis;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////// STOP ///////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
void CREFlare::mfDrawFlares(SShader *ef, CFColor &col)
|
|
{
|
|
CSunFlares *lfl = ef->m_Flares;
|
|
|
|
int i;
|
|
SSunFlare *fl;
|
|
Vec3d lv;
|
|
|
|
if (!CRenderer::CV_r_flares || !lfl)
|
|
return;
|
|
|
|
CCObject *obj = gRenDev->m_RP.m_CurObject;
|
|
|
|
Vec3d or = obj->m_Trans;
|
|
|
|
float len = or.Length();
|
|
if (len > 4096.0f)
|
|
{
|
|
or.Normalize();
|
|
or *= 500.0f;
|
|
or += gRenDev->m_RP.m_ViewOrg;
|
|
if (gRenDev->m_bHeatVision)
|
|
return;
|
|
}
|
|
|
|
Vec3d vFromPt = gRenDev->m_RP.m_ViewOrg;
|
|
Vec3d vViewVec = gRenDev->m_RP.m_CamVecs[0];
|
|
Vec3d vLightVec = or - vFromPt;
|
|
vLightVec.Normalize();
|
|
|
|
// Compute the vector and center point for the lens flare axis
|
|
float fDot = vLightVec | vViewVec;
|
|
if (fDot <= 0.2f)
|
|
return;
|
|
|
|
|
|
Vec3d vNewLightPt = vFromPt + 1.0f/fDot * vLightVec;
|
|
Vec3d vCenterPt = vFromPt + vViewVec;
|
|
Vec3d vAxisVec = vNewLightPt - vCenterPt;
|
|
|
|
// Store the lens flares positions for each flare
|
|
for (i=0; i<lfl->m_NumFlares; i++)
|
|
{
|
|
fl = &lfl->m_Flares[i];
|
|
|
|
// Store the position of the flare along the axis
|
|
fl->m_Position = vCenterPt + vAxisVec * fl->m_Loc;
|
|
|
|
// Store the render size of the flare. This is the lens flare size
|
|
// corrected for the orientation of the flaring axis.
|
|
fl->m_RenderSize = fl->m_Scale;//fViewScale * fl->scale;
|
|
}
|
|
|
|
gRenDev->SetState(GS_BLSRC_ONE | GS_BLDST_ONE | GS_NODEPTHTEST);
|
|
gRenDev->SetCullMode(R_CULL_NONE);
|
|
|
|
Vec3d VecX = gRenDev->m_RP.m_CamVecs[1];
|
|
Vec3d VecY = gRenDev->m_RP.m_CamVecs[2];
|
|
Vec3d v;
|
|
|
|
fDot *= col.a;
|
|
if (CRenderer::CV_r_checkSunVis > 1)
|
|
fDot *= obj->m_TempVars[0];
|
|
|
|
// Do the flares
|
|
for (i=0; i<lfl->m_NumFlares; i++)
|
|
{
|
|
fl = &lfl->m_Flares[i];
|
|
|
|
Vec3d vx = VecX * fl->m_RenderSize;
|
|
Vec3d vy = VecY * fl->m_RenderSize;
|
|
|
|
CFColor col = fl->m_Color * fDot;
|
|
fl->m_Tex->Set();
|
|
glColor3fv(&col[0]);
|
|
|
|
glBegin(GL_QUADS);
|
|
|
|
v = fl->m_Position + vx + vy;
|
|
glTexCoord2f(0, 0);
|
|
glVertex3fv(&v[0]);
|
|
|
|
v = fl->m_Position - vx + vy;
|
|
glTexCoord2f(1, 0);
|
|
glVertex3fv(&v[0]);
|
|
|
|
v = fl->m_Position - vx - vy;
|
|
glTexCoord2f(1, 1);
|
|
glVertex3fv(&v[0]);
|
|
|
|
v = fl->m_Position + vx - vy;
|
|
glTexCoord2f(0, 1);
|
|
glVertex3fv(&v[0]);
|
|
|
|
glEnd();
|
|
|
|
gRenDev->m_nPolygons += 2;
|
|
}
|
|
}
|
|
*/
|
|
|
|
|
|
void CREFlare::mfDrawCorona(SShader *ef, CFColor &col)
|
|
{
|
|
LPDIRECT3DDEVICE8 dv = gcpRendD3D->mfGetD3DDevice();
|
|
|
|
Vec3d vx, vy, or, v, norm;
|
|
|
|
if (!CRenderer::CV_r_coronas)
|
|
return;
|
|
|
|
CCObject *obj = gRenDev->m_RP.m_pCurObject;
|
|
or = obj->m_Trans;
|
|
|
|
bool bSun = true;
|
|
float len = or.Length();
|
|
if (len > 4096.0f)
|
|
{
|
|
bSun = true;
|
|
or.Normalize();
|
|
or *= 500.0f;
|
|
or += gRenDev->m_RP.m_ViewOrg;
|
|
}
|
|
if (bSun && gRenDev->m_bHeatVision)
|
|
return;
|
|
|
|
gcpRendD3D->EF_PushFog();
|
|
gcpRendD3D->EnableFog(false);
|
|
|
|
vx = gRenDev->m_RP.m_CamVecs[1];
|
|
vy = gRenDev->m_RP.m_CamVecs[2];
|
|
|
|
v = or - gRenDev->m_RP.m_ViewOrg;
|
|
float distX = v.Length();
|
|
if (m_fDistSizeFactor != 1.0f)
|
|
distX = powf(distX, m_fDistSizeFactor);
|
|
float distY = distX;
|
|
|
|
distX *= m_fScale * CRenderer::CV_r_coronasizescale;
|
|
distY *= m_fScale * CRenderer::CV_r_coronasizescale;
|
|
|
|
float fDecay = col[3];
|
|
if (CRenderer::CV_r_checkSunVis == 3 && bSun)
|
|
fDecay *= Max(m_fMinLight, obj->m_TempVars[0]);
|
|
fDecay *= CRenderer::CV_r_coronacolorscale;
|
|
|
|
/*
|
|
norm = gRenDev->m_RP.m_CamVecs[0];
|
|
if (m_bBlind && gRenDev->m_RP.m_DynLMask)
|
|
{
|
|
gRenDev->EF_BuildLightsList();
|
|
if (gRenDev->m_RP.m_NumActiveDLights)
|
|
{
|
|
CDLight *dl = gRenDev->m_RP.m_pActiveDLights[0];
|
|
if (dl->m_Flags & DLF_PROJECT)
|
|
{
|
|
v.Normalize();
|
|
float fDot = -(v * dl->m_Orientation.m_vForward);
|
|
if (fDot < 0.0f)
|
|
return;
|
|
float fBlindSize = fDot * m_fSizeBlindScale + m_fSizeBlindBias;
|
|
float fBlindIntens = fDot * m_fIntensBlindScale + m_fIntensBlindBias;
|
|
fDecay *= fBlindIntens;
|
|
distX *= fBlindSize;
|
|
distY *= fBlindSize;
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
vx *= distX;
|
|
vy *= distY;
|
|
norm = gRenDev->m_RP.m_CamVecs[0];
|
|
|
|
if (bSun)
|
|
gRenDev->SetState(GS_BLSRC_ONE | GS_BLDST_ONE | GS_NODEPTHTEST);
|
|
else
|
|
gRenDev->SetState(GS_BLSRC_ONE | GS_BLDST_ONE | GS_NODEPTHTEST);
|
|
gcpRendD3D->SetCullMode(R_CULL_NONE);
|
|
|
|
CFColor c = col;
|
|
|
|
c[0] = c[0] * fDecay;
|
|
c[1] = c[1] * fDecay;
|
|
c[2] = c[2] * fDecay;
|
|
if (bSun)
|
|
c[3] = fDecay;
|
|
|
|
if (CRenderer::CV_r_SunStyleCoronas)
|
|
bSun = true;
|
|
|
|
if (CRenderer::CV_r_checkSunVis == 1 || CRenderer::CV_r_checkSunVis == 3 || !bSun || obj->m_TexId1<=0)
|
|
{
|
|
m_Map->Set();
|
|
gRenDev->m_RP.m_FlagsPerFlush |= RBSI_RGBGEN;
|
|
gcpRendD3D->DrawQuad3D(or + vx + vy, or - vx + vy, or - vx - vy, or + vx - vy, c);
|
|
}
|
|
else
|
|
if (CRenderer::CV_r_checkSunVis == 2)
|
|
{
|
|
gRenDev->SelectTMU(0);
|
|
gRenDev->EnableTMU(true);
|
|
m_Map->Set();
|
|
|
|
gRenDev->SelectTMU(1);
|
|
gRenDev->EnableTMU(true);
|
|
|
|
STexPic *t = (STexPic *)gcpRendD3D->m_TexMan->m_Textures[obj->m_TexId1];
|
|
gRenDev->m_TexMan->SetTexture(t->m_Bind, eTT_Base);
|
|
|
|
CPShader *pRC = NULL;
|
|
if (gRenDev->GetFeatures() & RFT_HW_RC && !gRenDev->m_RP.m_RCSun)
|
|
{
|
|
pRC = CPShader::mfForName("RCSun", false);
|
|
gRenDev->m_RP.m_RCSun = pRC;
|
|
}
|
|
else
|
|
pRC = gRenDev->m_RP.m_RCSun;
|
|
|
|
//if (pRC)
|
|
// pRC->mfSet(true);
|
|
|
|
gRenDev->m_RP.m_FlagsPerFlush |= RBSI_RGBGEN;
|
|
|
|
/*
|
|
dv->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE );
|
|
dv->SetTextureStageState(0, D3DTSS_COLORARG0, D3DTA_CURRENT);
|
|
dv->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
|
|
dv->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE );
|
|
dv->SetTextureStageState(1, D3DTSS_COLORARG0, D3DTA_CURRENT);
|
|
dv->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE | D3DTA_ALPHAREPLICATE );
|
|
|
|
|
|
//dv->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
|
|
//dv->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
|
|
/**/
|
|
|
|
dv->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP );
|
|
dv->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP );
|
|
|
|
|
|
#ifndef _XBOX
|
|
gcpRendD3D->DrawQuad3D(or + vx - vy, or + vx + vy, or - vx + vy, or - vx - vy, c);
|
|
#else //_XBOX
|
|
gcpRendD3D->DrawQuad3D(or + vx - vy, or + vx + vy, or - vx + vy, or - vx - vy, c, 0,0, 1, 1, 0,0, 128, 128);
|
|
#endif //_XBOX
|
|
|
|
if (pRC)
|
|
pRC->mfSet(false);
|
|
gRenDev->EnableTMU(false);
|
|
gRenDev->SelectTMU(0);
|
|
}
|
|
|
|
// I do it in DrawQuad3D()
|
|
//gRenDev->m_nPolygons += 2;
|
|
gcpRendD3D->EF_PopFog();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CREFlare::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
LPDIRECT3DDEVICE8 dv = gcpRendD3D->mfGetD3DDevice();
|
|
if (!CRenderer::CV_r_flares && !CRenderer::CV_r_coronas)
|
|
return false;
|
|
|
|
Matrix m = gRenDev->GetCamera().GetMatrix();
|
|
//glLoadMatrixf(&m.m_values[0][0]);
|
|
dv->SetTransform(D3DTS_VIEW, (D3DMATRIX *)&m(0,0));
|
|
|
|
CCObject *obj = gRenDev->m_RP.m_pCurObject;
|
|
float len = obj->m_Trans.Length();
|
|
if (len > 4096.0f && (gRenDev->m_RP.m_PersFlags & RBPF_DONTDRAWSUN))
|
|
return false;
|
|
|
|
float ft;
|
|
if (obj->m_bVisible)
|
|
ft = obj->m_Color.a + (gRenDev->m_RP.m_RealTime - obj->m_fLightFadeTime) / gRenDev->CV_r_coronafade;
|
|
else
|
|
ft = obj->m_Color.a - (gRenDev->m_RP.m_RealTime - obj->m_fLightFadeTime) / gRenDev->CV_r_coronafade;
|
|
ft = Clamp(ft, 0.0f, 1.0f);
|
|
|
|
if (!ft)
|
|
return false;
|
|
|
|
obj->m_Color.r = m_Color.r;
|
|
obj->m_Color.g = m_Color.g;
|
|
obj->m_Color.b = m_Color.b;
|
|
obj->m_Color.a = ft;
|
|
mfDrawCorona(ef, obj->m_Color);
|
|
//mfDrawFlares(ef, obj->m_Color);
|
|
|
|
return true;
|
|
}
|
|
|
|
//================================================================================
|
|
|
|
bool CRESky::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
int bPrevClipPl = gcpRendD3D->m_RP.m_ClipPlaneEnabled;
|
|
if (bPrevClipPl)
|
|
gcpRendD3D->EF_SetClipPlane(false, NULL, false);
|
|
|
|
if(sfm == &ef->m_Passes[1])
|
|
{ // draw sky sphere vertices at pass 1
|
|
bool bPrevFog = gRenDev->EnableFog(false);
|
|
DrawSkySphere();
|
|
gRenDev->EnableFog(bPrevFog);
|
|
if (bPrevClipPl)
|
|
gcpRendD3D->EF_SetClipPlane(true, &gcpRendD3D->m_RP.m_CurClipPlane.m_Normal.x, gcpRendD3D->m_RP.m_bClipPlaneRefract);
|
|
return true;
|
|
}
|
|
|
|
// pass 0 - skybox
|
|
|
|
if (!ef->m_Sky || !ef->m_Sky->m_SkyBox[0])
|
|
{
|
|
if (bPrevClipPl)
|
|
gcpRendD3D->EF_SetClipPlane(true, &gcpRendD3D->m_RP.m_CurClipPlane.m_Normal.x, gcpRendD3D->m_RP.m_bClipPlaneRefract);
|
|
return false;
|
|
}
|
|
|
|
bool bPrevFog = gRenDev->EnableFog(false);
|
|
|
|
gRenDev->ResetToDefault();
|
|
gRenDev->SetEnviMode(R_MODE_MODULATE);
|
|
gRenDev->EnableDepthTest(false);
|
|
gRenDev->EnableDepthWrites(false);
|
|
|
|
gRenDev->SetMaterialColor(1,1,1,m_fAlpha);
|
|
if(m_fAlpha<1.f)
|
|
{
|
|
gRenDev->EnableBlend(true);
|
|
gRenDev->SetBlendMode(R_BLEND_MODE__SRC_ALPHA__ONE_MINUS_SRC_ALPHA);
|
|
}
|
|
|
|
const float fSkyBoxSize = 32;
|
|
|
|
{ // top
|
|
struct_VERTEX_FORMAT_P3F_TEX2F data[] =
|
|
{
|
|
{ fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize, 1, 1.f-1},
|
|
{-fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize, 0, 1.f-1},
|
|
{ fSkyBoxSize, fSkyBoxSize, fSkyBoxSize, 1, 1.f-0},
|
|
{-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();
|
|
|
|
float P = (camera.z-m_fTerrainWaterLevel)/fSkyBoxSize/2.0f;
|
|
float D = (camera.z-m_fTerrainWaterLevel)/10.0f*fSkyBoxSize/124.0f - P;
|
|
|
|
{ // s
|
|
struct_VERTEX_FORMAT_P3F_TEX2F data[] =
|
|
{
|
|
-fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize, 1.0, 1.f-1.0,
|
|
fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize, 0.0, 1.f-1.0,
|
|
-fSkyBoxSize,-fSkyBoxSize,-P, 1.0, 1.f-0.5,
|
|
fSkyBoxSize,-fSkyBoxSize,-P, 0.0, 1.f-0.5,
|
|
-fSkyBoxSize,-fSkyBoxSize,-D, 1.0, 1.f-0.5,
|
|
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[] =
|
|
{
|
|
-fSkyBoxSize, fSkyBoxSize, fSkyBoxSize, 1.0, 1.f-0.0,
|
|
-fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize, 0.0, 1.f-0.0,
|
|
-fSkyBoxSize, fSkyBoxSize,-P, 1.0, 1.f-0.5,
|
|
-fSkyBoxSize,-fSkyBoxSize,-P, 0.0, 1.f-0.5,
|
|
-fSkyBoxSize, fSkyBoxSize,-D, 1.0, 1.f-0.5,
|
|
-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[] =
|
|
{
|
|
fSkyBoxSize, fSkyBoxSize, fSkyBoxSize, 1.0, 1.f-1.0,
|
|
-fSkyBoxSize, fSkyBoxSize, fSkyBoxSize, 0.0, 1.f-1.0,
|
|
fSkyBoxSize, fSkyBoxSize,-P, 1.0, 1.f-0.5,
|
|
-fSkyBoxSize, fSkyBoxSize,-P, 0.0, 1.f-0.5,
|
|
fSkyBoxSize, fSkyBoxSize,-D, 1.0, 1.f-0.5,
|
|
-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[] =
|
|
{
|
|
fSkyBoxSize,-fSkyBoxSize, fSkyBoxSize, 1.0, 1.f-0.0,
|
|
fSkyBoxSize, fSkyBoxSize, fSkyBoxSize, 0.0, 1.f-0.0,
|
|
fSkyBoxSize,-fSkyBoxSize,-P, 1.0, 1.f-0.5,
|
|
fSkyBoxSize, fSkyBoxSize,-P, 0.0, 1.f-0.5,
|
|
fSkyBoxSize,-fSkyBoxSize,-D, 1.0, 1.f-0.5,
|
|
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);
|
|
}
|
|
|
|
gRenDev->ResetToDefault();
|
|
|
|
gRenDev->mCurState = GS_DEPTHWRITE;
|
|
|
|
gRenDev->EnableFog(bPrevFog);
|
|
|
|
if (bPrevClipPl)
|
|
gcpRendD3D->EF_SetClipPlane(true, &gcpRendD3D->m_RP.m_CurClipPlane.m_Normal.x, gcpRendD3D->m_RP.m_bClipPlaneRefract);
|
|
|
|
return true;
|
|
}
|
|
|
|
void CRESky::DrawSkySphere()
|
|
{
|
|
float nWSize = 256/8;
|
|
|
|
float a_in = 1, a_out = 1;
|
|
|
|
float clouds_r = 1.f;//m_vColor[0]*m_fBrightness;
|
|
float clouds_g = 1.f;//m_vColor[1]*m_fBrightness;
|
|
float clouds_b = 1.f;//m_vColor[2]*m_fBrightness;
|
|
|
|
struct_VERTEX_FORMAT_P3F_COL4UB vert;
|
|
vert.r=uchar(clouds_r*255);
|
|
vert.g=uchar(clouds_g*255);
|
|
vert.b=uchar(clouds_b*255);
|
|
|
|
list2<struct_VERTEX_FORMAT_P3F_COL4UB> lstVertData;
|
|
|
|
for(float r=0; r<3; r++)
|
|
{
|
|
a_in = a_out;
|
|
a_out = 1.f-(r+1)/8;
|
|
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.x = Fsin(rad)*nWSize*r;
|
|
vert.y = Fcos(rad)*nWSize*r;
|
|
vert.z = 5.f - 10.f*(r)/8.f;
|
|
vert.a = uchar(a_in*255.0f);
|
|
lstVertData.Add(vert);
|
|
|
|
vert.x = Fsin(rad)*nWSize*(r+1);
|
|
vert.y = Fcos(rad)*nWSize*(r+1);
|
|
vert.z = 5.f - 10.f*(r+1)/8.f;
|
|
vert.a = uchar(a_out*255.0f);
|
|
lstVertData.Add(vert);
|
|
}
|
|
|
|
gRenDev->DrawTriStrip(&CVertexBuffer(&lstVertData[0],VERTEX_FORMAT_P3F_COL4UB),lstVertData.Count());
|
|
}
|
|
}
|
|
|
|
void CLeafBuffer::DrawImmediately()
|
|
{
|
|
}
|
|
|
|
bool CREClearStencil::mfDraw(SShader *ef, SShaderPass *sfm)
|
|
{
|
|
return true;
|
|
} |