www.pudn.com > Mir2Game.rar > LightFog.cpp
#include "StdAfx.h"
CLightFog::CLightFog()
{
Init(RGB(220, 220, 220));
}
CLightFog::~CLightFog()
{
}
VOID CLightFog::Init(DWORD dwLightColor)
{
m_dwLightColor = dwLightColor;
for ( INT nCntY = 0; nCntY < (NUM_CNTY_LIGHTTILE+1); nCntY++ )
{
for ( INT nCntX = 0; nCntX < (NUM_CNTX_LIGHTTILE+1); nCntX++ )
{
m_avLight[nCntY][nCntX] = D3DLVERTEX(D3DVECTOR((FLOAT)(TILE_START_XPOS+(nCntX*TILE_WIDTH)), (FLOAT)(-TILE_START_YPOS-(nCntY*TILE_HEIGHT)), 0),
m_dwLightColor, RGB(0, 0, 0), 0, 0);
}
}
memcpy(m_avSaveLight, m_avLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
// ŸÀÏÆú¸®°ïÀÇ À妽º »ý¼º.
WORD* pwIndex = m_pwLightIndices;
for ( nCntY = 0; nCntY < NUM_CNTY_LIGHTTILE; nCntY++ )
{
for ( INT nCntX = 0; nCntX < NUM_CNTX_LIGHTTILE; nCntX++ )
{
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
}
}
}
VOID CLightFog::ChangeLightColor(DWORD dwColor)
{
if ( m_dwLightColor != dwColor )
{
for ( INT nCntY = 0; nCntY < NUM_CNTY_LIGHTTILE+1; nCntY++ )
{
for ( INT nCntX = 0; nCntX < NUM_CNTX_LIGHTTILE+1; nCntX++ )
{
m_avLight[nCntY][nCntX].color = dwColor;
}
}
m_dwLightColor = dwColor;
memcpy(m_avSaveLight, m_avLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
}
}
VOID CLightFog::ClearSavedLightColor()
{
memcpy(m_avLight, m_avSaveLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
}
BOOL CLightFog::GetScreenPosToLightTile(INT nX, INT nY, INT* nTileX, INT* nTileY)
{
*nTileX = (nX - TILE_START_XPOS) / TILE_WIDTH;
*nTileY = (nY - TILE_START_YPOS) / TILE_HEIGHT;
return TRUE;
}
BOOL CLightFog::SetLightRadiusWithRing(INT XLightPos, INT YLightPos,
INT nSmallRadius,
INT nSmallRed, INT nSmallGreen, INT nSmallBlue,
INT nLargeRadius,
INT nLargeRed, INT nLargeGreen, INT nLargeBlue)
{
INT nX, nY;
GetScreenPosToLightTile(XLightPos, YLightPos, &nX, &nY);
INT nStartTileX = nX - nLargeRadius;
INT nStartTileY = nY - nLargeRadius;
INT nEndTileX = nX + nLargeRadius + 1;
INT nEndTileY = nY + nLargeRadius + 1;
// y¸¦ ÃàÀ¸·Î ÇØ¼ Á© ¾îµÎ¿î ºÎºÐÀ» ±¸ÇÑ´Ù.(xº¸´Ù y°¡ ´õ ÀûÀ¸¹Ç·Î)
nLargeRadius = (nLargeRadius*TILE_HEIGHT);
nSmallRadius = (nSmallRadius*TILE_HEIGHT);
DOUBLE rLengthCnt = 0;
INT nSelectedRedValue = 0;
INT nSelectedGreenValue = 0;
INT nSelectedBlueValue = 0;
if ( nStartTileX < 0 ) nStartTileX = 0;
if ( nStartTileY < 0 ) nStartTileY = 0;
if ( nEndTileX > NUM_CNTX_LIGHTTILE+1 ) nEndTileX = NUM_CNTX_LIGHTTILE+1;
if ( nEndTileY > NUM_CNTY_LIGHTTILE+1 ) nEndTileY = NUM_CNTY_LIGHTTILE+1;
for ( INT nCntY = nStartTileY; nCntY < nEndTileY; nCntY++ )
{
for ( INT nCntX = nStartTileX; nCntX < nEndTileX; nCntX++ )
{
rLengthCnt = sqrt((XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS))*(XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS)) +
(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS))*(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS)));
if ( nCntX < NUM_CNTX_LIGHTTILE && nCntY < NUM_CNTY_LIGHTTILE )
{
// Æ÷ÀÎÆ®Á¡À» Æ÷ÇÔÇÏÁö ¾Ê´Â ÁÂÇÏ. Æ÷ÀÎÆ®Á¡À» Æ÷ÇÔÇÏÁö ¾Ê´Â ¿ì»ó.
if ( (nCntX > nX && nCntY < nY) || (nCntX < nX && nCntY > nY) )
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
}
else
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
}
}
if ( rLengthCnt < nSmallRadius )
{
nSelectedRedValue = nSmallRed - INT((nSmallRed*rLengthCnt)/(nLargeRadius));
nSelectedGreenValue = nSmallGreen - INT((nSmallGreen*rLengthCnt)/(nLargeRadius));
nSelectedBlueValue = nSmallBlue - INT((nSmallBlue*rLengthCnt)/(nLargeRadius));
}
else if ( rLengthCnt >= nSmallRadius && rLengthCnt <= nLargeRadius )
{
nSelectedRedValue = nLargeRed - INT((nLargeRed*rLengthCnt)/(nLargeRadius));
nSelectedGreenValue = nLargeGreen - INT((nLargeGreen*rLengthCnt)/(nLargeRadius));
nSelectedBlueValue = nLargeBlue - INT((nLargeBlue*rLengthCnt)/(nLargeRadius));
}
else
{
nSelectedRedValue = nSelectedGreenValue = nSelectedBlueValue = 0;
}
if ( nSelectedRedValue < 0 ) nSelectedRedValue = 0;
if ( nSelectedGreenValue < 0 ) nSelectedGreenValue = 0;
if ( nSelectedBlueValue < 0 ) nSelectedBlueValue = 0;
if ( m_avLight[nCntY][nCntX].color == 0 )
m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
else
{
nSelectedRedValue += (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color);
nSelectedGreenValue += (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color);
nSelectedBlueValue += (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color);
if ( nSelectedRedValue > 255 ) nSelectedRedValue = 255;
if ( nSelectedGreenValue > 255 ) nSelectedGreenValue = 255;
if ( nSelectedBlueValue > 255 ) nSelectedBlueValue = 255;
m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
}
}
}
return TRUE;
}
BOOL CLightFog::SetLightRadiusWithCircle(INT XLightPos, INT YLightPos, INT nRadius,
INT nRedValue, INT nGreenValue, INT nBlueValue,
FLOAT rDrakRate)
{
INT nX, nY;
GetScreenPosToLightTile(XLightPos, YLightPos, &nX, &nY);
INT nStartTileX = nX - nRadius;
INT nStartTileY = nY - nRadius;
INT nEndTileX = nX + nRadius + 1;
INT nEndTileY = nY + nRadius + 1;
// y¸¦ ÃàÀ¸·Î ÇØ¼ Á© ¾îµÎ¿î ºÎºÐÀ» ±¸ÇÑ´Ù.(xº¸´Ù y°¡ ´õ ÀûÀ¸¹Ç·Î)
nRadius = (nRadius*TILE_HEIGHT);
DOUBLE rLengthCnt = 0;
INT nSelectedRedValue = 0;
INT nSelectedGreenValue = 0;
INT nSelectedBlueValue = 0;
if ( nStartTileX < 0 ) nStartTileX = 0;
if ( nStartTileY < 0 ) nStartTileY = 0;
if ( nEndTileX > NUM_CNTX_LIGHTTILE+1 ) nEndTileX = NUM_CNTX_LIGHTTILE+1;
if ( nEndTileY > NUM_CNTY_LIGHTTILE+1 ) nEndTileY = NUM_CNTY_LIGHTTILE+1;
for ( INT nCntY = nStartTileY; nCntY < nEndTileY; nCntY++ )
{
for ( INT nCntX = nStartTileX; nCntX < nEndTileX; nCntX++ )
{
rLengthCnt = sqrt((XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS))*(XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS)) +
(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS))*(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS)));
if ( nCntX < NUM_CNTX_LIGHTTILE && nCntY < NUM_CNTY_LIGHTTILE )
{
// Æ÷ÀÎÆ®Á¡À» Æ÷ÇÔÇÏÁö ¾Ê´Â ÁÂÇÏ. Æ÷ÀÎÆ®Á¡À» Æ÷ÇÔÇÏÁö ¾Ê´Â ¿ì»ó.
if ( (nCntX > nX && nCntY < nY) || (nCntX < nX && nCntY > nY) )
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
}
else
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
}
}
/* RECT rc;
SetRect(&rc,
(nCntX*TILE_WIDTH+TILE_START_XPOS),
(nCntY*TILE_HEIGHT+TILE_START_YPOS),
(nCntX*TILE_WIDTH+TILE_START_XPOS+TILE_WIDTH),
(nCntY*TILE_HEIGHT+TILE_START_YPOS+TILE_HEIGHT));
g_xMainWnd.DrawWithGDI(rc, NULL, RGB(0, 255, 255), 1);
*/
if ( rLengthCnt <= nRadius )
{
nSelectedRedValue = nRedValue - INT((nRedValue*rLengthCnt*rDrakRate)/(nRadius));
nSelectedGreenValue = nGreenValue - INT((nGreenValue*rLengthCnt*rDrakRate)/(nRadius));
nSelectedBlueValue = nBlueValue - INT((nBlueValue*rLengthCnt*rDrakRate)/(nRadius));
/* SetRect(&rc,
(nCntX*TILE_WIDTH+TILE_START_XPOS),
(nCntY*TILE_HEIGHT+TILE_START_YPOS),
(nCntX*TILE_WIDTH+TILE_START_XPOS+2),
(nCntY*TILE_HEIGHT+TILE_START_YPOS+2));
g_xMainWnd.DrawWithGDI(rc, NULL, RGB(255, 0, 0), 1);
*/ }
else
{
nSelectedRedValue = nSelectedGreenValue = nSelectedBlueValue = 0;
}
if ( nSelectedRedValue < 0 ) nSelectedRedValue = 0;
if ( nSelectedGreenValue < 0 ) nSelectedGreenValue = 0;
if ( nSelectedBlueValue < 0 ) nSelectedBlueValue = 0;
if ( m_avLight[nCntY][nCntX].color == 0 )
m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
else
{
nSelectedRedValue += (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color);
nSelectedGreenValue += (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color);
nSelectedBlueValue += (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color);
if ( nSelectedRedValue > 255 ) nSelectedRedValue = 255;
if ( nSelectedGreenValue > 255 ) nSelectedGreenValue = 255;
if ( nSelectedBlueValue > 255 ) nSelectedBlueValue = 255;
m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
}
}
}
return TRUE;
}
BOOL CLightFog::SetLightRadiusWithElipse(INT XLightPos, INT YLightPos, INT nXRadius, INT nYRadius,
INT nRedValue, INT nGreenValue, INT nBlueValue,
FLOAT rDrakRate)
{
INT nX, nY;
GetScreenPosToLightTile(XLightPos, YLightPos, &nX, &nY);
INT nStartTileX = nX - nXRadius;
INT nStartTileY = nY - nYRadius;
INT nEndTileX = nX + nXRadius + 1;
INT nEndTileY = nY + nYRadius + 1;
FLOAT rXRadius = (FLOAT)(nXRadius*TILE_WIDTH);
FLOAT rYRadius = (FLOAT)(nYRadius*TILE_HEIGHT);
INT nRadius = 0;
if ( rXRadius > rYRadius )
{
nRadius = (INT)rXRadius;
}
else
{
nRadius = (INT)rYRadius;
}
DOUBLE rLengthCnt = 0;
INT nSelectedRedValue = 0;
INT nSelectedGreenValue = 0;
INT nSelectedBlueValue = 0;
if ( nStartTileX < 0 ) nStartTileX = 0;
if ( nStartTileY < 0 ) nStartTileY = 0;
if ( nEndTileX > NUM_CNTX_LIGHTTILE+1 ) nEndTileX = NUM_CNTX_LIGHTTILE+1;
if ( nEndTileY > NUM_CNTY_LIGHTTILE+1 ) nEndTileY = NUM_CNTY_LIGHTTILE+1;
for ( INT nCntY = nStartTileY; nCntY < nEndTileY; nCntY++ )
{
for ( INT nCntX = nStartTileX; nCntX < nEndTileX; nCntX++ )
{
if ( nCntX < NUM_CNTX_LIGHTTILE && nCntY < NUM_CNTY_LIGHTTILE )
{
// Æ÷ÀÎÆ®Á¡À» Æ÷ÇÔÇÏÁö ¾Ê´Â ÁÂÇÏ. Æ÷ÀÎÆ®Á¡À» Æ÷ÇÔÇÏÁö ¾Ê´Â ¿ì»ó.
if ( (nCntX > nX && nCntY < nY) || (nCntX < nX && nCntY > nY) )
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
}
else
{
WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
}
}
/* RECT rc;
SetRect(&rc,
(nCntX*TILE_WIDTH+TILE_START_XPOS),
(nCntY*TILE_HEIGHT+TILE_START_YPOS),
(nCntX*TILE_WIDTH+TILE_START_XPOS+TILE_WIDTH),
(nCntY*TILE_HEIGHT+TILE_START_YPOS+TILE_HEIGHT));
g_xMainWnd.DrawWithGDI(rc, NULL, RGB(0, 255, 255), 1);
*/
INT nCurrCntXRate, nCurrCntYRate;
if ( rXRadius > rYRadius )
{
nCurrCntXRate = nCntX;
nCurrCntYRate = nCntY + (INT)((nCntY-nY)*(FLOAT)(rXRadius/rYRadius-1.0f));
}
else if ( rXRadius < rYRadius )
{
nCurrCntXRate = nCntX + (INT)((nCntX-nX)*(FLOAT)(rYRadius/rXRadius-1.0f));
nCurrCntYRate = nCntY;
}
else
{
nCurrCntXRate = nCntX;
nCurrCntYRate = nCntY;
}
rLengthCnt = sqrt((XLightPos-(nCurrCntXRate*TILE_WIDTH+TILE_START_XPOS))*(XLightPos-(nCurrCntXRate*TILE_WIDTH+TILE_START_XPOS)) +
(YLightPos-(nCurrCntYRate*TILE_HEIGHT+TILE_START_YPOS))*(YLightPos-(nCurrCntYRate*TILE_HEIGHT+TILE_START_YPOS)));
/* SetRect(&rc,
(XLightPos),
(YLightPos),
(XLightPos+5),
(YLightPos+5));
g_xMainWnd.DrawWithGDI(rc, NULL, RGB(255, 0, 0), 1);
*/
if ( rLengthCnt <= nRadius )
{
nSelectedRedValue = nRedValue - INT((nRedValue*rLengthCnt*rDrakRate)/(nRadius));
nSelectedGreenValue = nGreenValue - INT((nGreenValue*rLengthCnt*rDrakRate)/(nRadius));
nSelectedBlueValue = nBlueValue - INT((nBlueValue*rLengthCnt*rDrakRate)/(nRadius));
/* SetRect(&rc,
(nCntX*TILE_WIDTH+TILE_START_XPOS),
(nCntY*TILE_HEIGHT+TILE_START_YPOS),
(nCntX*TILE_WIDTH+TILE_START_XPOS+2),
(nCntY*TILE_HEIGHT+TILE_START_YPOS+2));
g_xMainWnd.DrawWithGDI(rc, NULL, RGB(255, 0, 0), 1);
*/ }
else
{
nSelectedRedValue = nSelectedGreenValue = nSelectedBlueValue = 0;
}
if ( nSelectedRedValue < 0 ) nSelectedRedValue = 0;
if ( nSelectedGreenValue < 0 ) nSelectedGreenValue = 0;
if ( nSelectedBlueValue < 0 ) nSelectedBlueValue = 0;
if ( m_avLight[nCntY][nCntX].color == 0 )
m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
else
{
if ( nSelectedRedValue < (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color) )
nSelectedRedValue = (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color);
if ( nSelectedGreenValue < (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color) )
nSelectedGreenValue = (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color);
if ( nSelectedBlueValue < (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color) )
nSelectedBlueValue = (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color);
m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
}
}
}
return TRUE;
}
VOID CLightFog::ShowLightFog(WORD wHalfScrnWidth, WORD wHalfScrnHeight)
{
if ( g_xMainWnd.Get3DDevice() )
{
if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
{
D3DVECTOR vTrans;
D3DMATRIX matTrans;
D3DMATRIX matWorldOriginal;
g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ZERO);
g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_SRCCOLOR);
vTrans.x = -wHalfScrnWidth; vTrans.y = wHalfScrnHeight; vTrans.z = 0;
D3DUtil_SetTranslateMatrix(matTrans, vTrans);
g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matTrans);
g_xMainWnd.Get3DDevice()->SetTexture(0, NULL);
g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_LIGHTING, FALSE);
g_xMainWnd.Get3DDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
D3DFVF_LVERTEX,
m_avLight, NUM_LIGHTTILE_VERTICES,
m_pwLightIndices, NUM_LIGHTTILE_INDICES, NULL );
g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_LIGHTING, TRUE);
g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
g_xMainWnd.Get3DDevice()->EndScene();
}
}
}