📄 lightfog.cpp
字号:
/* 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((double)(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();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -