LightFog.cpp
上传用户:cydong117
上传日期:2009-11-10
资源大小:638k
文件大小:17k
源码类别:

模拟服务器

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. CLightFog::CLightFog()
  3. {
  4. Init(RGB(220, 220, 220));
  5. }
  6. CLightFog::~CLightFog()
  7. {
  8. }
  9. VOID CLightFog::Init(DWORD dwLightColor)
  10. {
  11. m_dwLightColor = dwLightColor;
  12. for ( INT nCntY = 0; nCntY < (NUM_CNTY_LIGHTTILE+1); nCntY++ )
  13. {
  14. for ( INT nCntX = 0; nCntX < (NUM_CNTX_LIGHTTILE+1); nCntX++ )
  15. {
  16. m_avLight[nCntY][nCntX] = D3DLVERTEX(D3DVECTOR((FLOAT)(TILE_START_XPOS+(nCntX*TILE_WIDTH)), (FLOAT)(-TILE_START_YPOS-(nCntY*TILE_HEIGHT)), 0),
  17.         m_dwLightColor, RGB(0, 0, 0),  0, 0); 
  18. }
  19. }
  20. memcpy(m_avSaveLight, m_avLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
  21. // 鸥老弃府帮狼 牢郸胶 积己.
  22.     WORD* pwIndex = m_pwLightIndices;
  23. for ( nCntY = 0; nCntY < NUM_CNTY_LIGHTTILE; nCntY++ )
  24. {
  25. for ( INT nCntX = 0; nCntX < NUM_CNTX_LIGHTTILE; nCntX++ )
  26. {
  27. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  28. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  29. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  30. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  31. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  32. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  33. }
  34. }
  35. }
  36. VOID CLightFog::ChangeLightColor(DWORD dwColor)
  37. {
  38. if ( m_dwLightColor != dwColor )
  39. {
  40. for ( INT nCntY = 0; nCntY < NUM_CNTY_LIGHTTILE+1; nCntY++ )
  41. {
  42. for ( INT nCntX = 0; nCntX < NUM_CNTX_LIGHTTILE+1; nCntX++ )
  43. {
  44. m_avLight[nCntY][nCntX].color = dwColor;
  45. }
  46. }
  47. m_dwLightColor = dwColor;
  48. memcpy(m_avSaveLight, m_avLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
  49. }
  50. }
  51. VOID CLightFog::ClearSavedLightColor()
  52. {
  53. memcpy(m_avLight, m_avSaveLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));
  54. }
  55. BOOL CLightFog::GetScreenPosToLightTile(INT nX, INT nY, INT* nTileX, INT* nTileY)
  56. {
  57. *nTileX = (nX - TILE_START_XPOS) / TILE_WIDTH;
  58. *nTileY = (nY - TILE_START_YPOS) / TILE_HEIGHT;
  59. return TRUE;
  60. }
  61. BOOL CLightFog::SetLightRadiusWithRing(INT XLightPos, INT YLightPos, 
  62.    INT nSmallRadius, 
  63.    INT nSmallRed, INT nSmallGreen, INT nSmallBlue, 
  64.    INT nLargeRadius,
  65.    INT nLargeRed, INT nLargeGreen, INT nLargeBlue)
  66. {
  67. INT nX, nY;
  68. GetScreenPosToLightTile(XLightPos, YLightPos, &nX, &nY);
  69. INT nStartTileX = nX - nLargeRadius;
  70. INT nStartTileY = nY - nLargeRadius;
  71. INT nEndTileX = nX + nLargeRadius + 1;
  72. INT nEndTileY = nY + nLargeRadius + 1;
  73. // y甫 绵栏肺 秦辑 俩 绢滴款 何盒阑 备茄促.(x焊促 y啊 歹 利栏骨肺)
  74. nLargeRadius = (nLargeRadius*TILE_HEIGHT);
  75. nSmallRadius = (nSmallRadius*TILE_HEIGHT);
  76. DOUBLE rLengthCnt = 0;
  77. INT nSelectedRedValue = 0; 
  78. INT nSelectedGreenValue = 0;
  79. INT nSelectedBlueValue = 0;
  80. if ( nStartTileX < 0 ) nStartTileX = 0;
  81. if ( nStartTileY < 0 ) nStartTileY = 0;
  82. if ( nEndTileX > NUM_CNTX_LIGHTTILE+1 ) nEndTileX = NUM_CNTX_LIGHTTILE+1;
  83. if ( nEndTileY > NUM_CNTY_LIGHTTILE+1 ) nEndTileY = NUM_CNTY_LIGHTTILE+1;
  84. for ( INT nCntY = nStartTileY; nCntY < nEndTileY; nCntY++ )
  85. {
  86. for ( INT nCntX = nStartTileX; nCntX < nEndTileX; nCntX++ )
  87. {
  88. rLengthCnt = sqrt((XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS))*(XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS)) + 
  89.    (YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS))*(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS)));
  90. if ( nCntX < NUM_CNTX_LIGHTTILE && nCntY < NUM_CNTY_LIGHTTILE )
  91. {
  92. // 器牢飘痢阑 器窃窍瘤 臼绰 谅窍. 器牢飘痢阑 器窃窍瘤 臼绰 快惑.
  93. if ( (nCntX > nX && nCntY < nY) || (nCntX < nX && nCntY > nY) )
  94. {
  95. WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
  96. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  97. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  98. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  99. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  100. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  101. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  102. }
  103. else
  104. {
  105. WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
  106. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  107. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  108. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  109. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  110. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  111. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  112. }
  113. }
  114. if ( rLengthCnt < nSmallRadius )
  115. {
  116. nSelectedRedValue = nSmallRed - INT((nSmallRed*rLengthCnt)/(nLargeRadius));
  117. nSelectedGreenValue = nSmallGreen - INT((nSmallGreen*rLengthCnt)/(nLargeRadius));
  118. nSelectedBlueValue = nSmallBlue - INT((nSmallBlue*rLengthCnt)/(nLargeRadius));
  119. }
  120. else if ( rLengthCnt >= nSmallRadius && rLengthCnt <= nLargeRadius )
  121. {
  122. nSelectedRedValue = nLargeRed - INT((nLargeRed*rLengthCnt)/(nLargeRadius));
  123. nSelectedGreenValue = nLargeGreen - INT((nLargeGreen*rLengthCnt)/(nLargeRadius));
  124. nSelectedBlueValue = nLargeBlue - INT((nLargeBlue*rLengthCnt)/(nLargeRadius));
  125. }
  126. else
  127. {
  128. nSelectedRedValue = nSelectedGreenValue = nSelectedBlueValue = 0;
  129. }
  130. if ( nSelectedRedValue  < 0 ) nSelectedRedValue = 0;
  131. if ( nSelectedGreenValue < 0 ) nSelectedGreenValue = 0;
  132. if ( nSelectedBlueValue  < 0 ) nSelectedBlueValue = 0;
  133. if ( m_avLight[nCntY][nCntX].color == 0 )
  134. m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue); 
  135. else
  136. {
  137. nSelectedRedValue += (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color);
  138. nSelectedGreenValue += (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color);
  139. nSelectedBlueValue += (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color);
  140. if ( nSelectedRedValue  > 255 ) nSelectedRedValue = 255;
  141. if ( nSelectedGreenValue > 255 ) nSelectedGreenValue = 255;
  142. if ( nSelectedBlueValue  > 255 ) nSelectedBlueValue = 255;
  143. m_avLight[nCntY][nCntX].color =  RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
  144. }
  145. }
  146. }
  147. return TRUE;
  148. }
  149. BOOL CLightFog::SetLightRadiusWithCircle(INT XLightPos, INT YLightPos, INT nRadius, 
  150.  INT nRedValue, INT nGreenValue, INT nBlueValue, 
  151.  FLOAT rDrakRate)
  152. {
  153. INT nX, nY;
  154. GetScreenPosToLightTile(XLightPos, YLightPos, &nX, &nY);
  155. INT nStartTileX = nX - nRadius;
  156. INT nStartTileY = nY - nRadius;
  157. INT nEndTileX = nX + nRadius + 1;
  158. INT nEndTileY = nY + nRadius + 1;
  159. // y甫 绵栏肺 秦辑 俩 绢滴款 何盒阑 备茄促.(x焊促 y啊 歹 利栏骨肺)
  160. nRadius = (nRadius*TILE_HEIGHT);
  161. DOUBLE rLengthCnt = 0;
  162. INT nSelectedRedValue = 0; 
  163. INT nSelectedGreenValue = 0;
  164. INT nSelectedBlueValue = 0;
  165. if ( nStartTileX < 0 ) nStartTileX = 0;
  166. if ( nStartTileY < 0 ) nStartTileY = 0;
  167. if ( nEndTileX > NUM_CNTX_LIGHTTILE+1 ) nEndTileX = NUM_CNTX_LIGHTTILE+1;
  168. if ( nEndTileY > NUM_CNTY_LIGHTTILE+1 ) nEndTileY = NUM_CNTY_LIGHTTILE+1;
  169. for ( INT nCntY = nStartTileY; nCntY < nEndTileY; nCntY++ )
  170. {
  171. for ( INT nCntX = nStartTileX; nCntX < nEndTileX; nCntX++ )
  172. {
  173. rLengthCnt = sqrt((XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS))*(XLightPos-(nCntX*TILE_WIDTH+TILE_START_XPOS)) + 
  174.    (YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS))*(YLightPos-(nCntY*TILE_HEIGHT+TILE_START_YPOS)));
  175. if ( nCntX < NUM_CNTX_LIGHTTILE && nCntY < NUM_CNTY_LIGHTTILE )
  176. {
  177. // 器牢飘痢阑 器窃窍瘤 臼绰 谅窍. 器牢飘痢阑 器窃窍瘤 臼绰 快惑.
  178. if ( (nCntX > nX && nCntY < nY) || (nCntX < nX && nCntY > nY) )
  179. {
  180. WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
  181. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  182. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  183. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  184. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  185. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  186. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  187. }
  188. else
  189. {
  190. WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
  191. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  192. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  193. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  194. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  195. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  196. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  197. }
  198. }
  199. /* RECT rc;
  200. SetRect(&rc,
  201.    (nCntX*TILE_WIDTH+TILE_START_XPOS),
  202.    (nCntY*TILE_HEIGHT+TILE_START_YPOS),
  203.    (nCntX*TILE_WIDTH+TILE_START_XPOS+TILE_WIDTH),
  204.    (nCntY*TILE_HEIGHT+TILE_START_YPOS+TILE_HEIGHT));
  205. g_xMainWnd.DrawWithGDI(rc, NULL, RGB(0, 255, 255), 1);
  206. */
  207. if ( rLengthCnt <= nRadius )
  208. {
  209. nSelectedRedValue = nRedValue - INT((nRedValue*rLengthCnt*rDrakRate)/(nRadius));
  210. nSelectedGreenValue = nGreenValue - INT((nGreenValue*rLengthCnt*rDrakRate)/(nRadius));
  211. nSelectedBlueValue = nBlueValue - INT((nBlueValue*rLengthCnt*rDrakRate)/(nRadius));
  212. /* SetRect(&rc,
  213.    (nCntX*TILE_WIDTH+TILE_START_XPOS),
  214.    (nCntY*TILE_HEIGHT+TILE_START_YPOS),
  215.    (nCntX*TILE_WIDTH+TILE_START_XPOS+2),
  216.    (nCntY*TILE_HEIGHT+TILE_START_YPOS+2));
  217. g_xMainWnd.DrawWithGDI(rc, NULL, RGB(255, 0, 0), 1);
  218. */ }
  219. else
  220. {
  221. nSelectedRedValue = nSelectedGreenValue = nSelectedBlueValue = 0;
  222. }
  223. if ( nSelectedRedValue  < 0 ) nSelectedRedValue = 0;
  224. if ( nSelectedGreenValue < 0 ) nSelectedGreenValue = 0;
  225. if ( nSelectedBlueValue  < 0 ) nSelectedBlueValue = 0;
  226. if ( m_avLight[nCntY][nCntX].color == 0 )
  227. m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue); 
  228. else
  229. {
  230. nSelectedRedValue += (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color);
  231. nSelectedGreenValue += (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color);
  232. nSelectedBlueValue += (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color);
  233. if ( nSelectedRedValue  > 255 ) nSelectedRedValue = 255;
  234. if ( nSelectedGreenValue > 255 ) nSelectedGreenValue = 255;
  235. if ( nSelectedBlueValue  > 255 ) nSelectedBlueValue = 255;
  236. m_avLight[nCntY][nCntX].color =  RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
  237. }
  238. }
  239. }
  240. return TRUE;
  241. }
  242. BOOL CLightFog::SetLightRadiusWithElipse(INT XLightPos, INT YLightPos, INT nXRadius, INT nYRadius, 
  243.  INT nRedValue, INT nGreenValue, INT nBlueValue, 
  244.  FLOAT rDrakRate)
  245. {
  246. INT nX, nY;
  247. GetScreenPosToLightTile(XLightPos, YLightPos, &nX, &nY);
  248. INT nStartTileX = nX - nXRadius;
  249. INT nStartTileY = nY - nYRadius;
  250. INT nEndTileX = nX + nXRadius + 1;
  251. INT nEndTileY = nY + nYRadius + 1;
  252. FLOAT rXRadius = (FLOAT)(nXRadius*TILE_WIDTH);
  253. FLOAT rYRadius = (FLOAT)(nYRadius*TILE_HEIGHT);
  254. INT   nRadius  = 0;
  255. if ( rXRadius > rYRadius )
  256. {
  257. nRadius = (INT)rXRadius;
  258. }
  259. else
  260. {
  261. nRadius = (INT)rYRadius;
  262. }
  263. DOUBLE rLengthCnt = 0;
  264. INT nSelectedRedValue = 0; 
  265. INT nSelectedGreenValue = 0; 
  266. INT nSelectedBlueValue = 0; 
  267. if ( nStartTileX < 0 ) nStartTileX = 0;
  268. if ( nStartTileY < 0 ) nStartTileY = 0;
  269. if ( nEndTileX > NUM_CNTX_LIGHTTILE+1 ) nEndTileX = NUM_CNTX_LIGHTTILE+1;
  270. if ( nEndTileY > NUM_CNTY_LIGHTTILE+1 ) nEndTileY = NUM_CNTY_LIGHTTILE+1;
  271. for ( INT nCntY = nStartTileY; nCntY < nEndTileY; nCntY++ )
  272. {
  273. for ( INT nCntX = nStartTileX; nCntX < nEndTileX; nCntX++ )
  274. {
  275. if ( nCntX < NUM_CNTX_LIGHTTILE && nCntY < NUM_CNTY_LIGHTTILE )
  276. {
  277. // 器牢飘痢阑 器窃窍瘤 臼绰 谅窍. 器牢飘痢阑 器窃窍瘤 臼绰 快惑.
  278. if ( (nCntX > nX && nCntY < nY) || (nCntX < nX && nCntY > nY) )
  279. {
  280. WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
  281. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  282. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  283. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  284. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  285. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  286. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  287. }
  288. else
  289. {
  290. WORD* pwIndex = ((WORD*)m_pwLightIndices+(nCntX+nCntY*(NUM_CNTX_LIGHTTILE))*6);
  291. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  292. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  293. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
  294. *pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
  295. *pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
  296. *pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
  297. }
  298. }
  299. /* RECT rc;
  300. SetRect(&rc,
  301.    (nCntX*TILE_WIDTH+TILE_START_XPOS),
  302.    (nCntY*TILE_HEIGHT+TILE_START_YPOS),
  303.    (nCntX*TILE_WIDTH+TILE_START_XPOS+TILE_WIDTH),
  304.    (nCntY*TILE_HEIGHT+TILE_START_YPOS+TILE_HEIGHT));
  305. g_xMainWnd.DrawWithGDI(rc, NULL, RGB(0, 255, 255), 1);
  306. */
  307. INT nCurrCntXRate, nCurrCntYRate;
  308. if ( rXRadius > rYRadius )
  309. {
  310. nCurrCntXRate = nCntX;
  311. nCurrCntYRate = nCntY + (INT)((nCntY-nY)*(FLOAT)(rXRadius/rYRadius-1.0f));
  312. }
  313. else if ( rXRadius < rYRadius )
  314. {
  315. nCurrCntXRate = nCntX + (INT)((nCntX-nX)*(FLOAT)(rYRadius/rXRadius-1.0f));
  316. nCurrCntYRate = nCntY;
  317. }
  318. else
  319. {
  320. nCurrCntXRate = nCntX;
  321. nCurrCntYRate = nCntY;
  322. }
  323. rLengthCnt = sqrt((XLightPos-(nCurrCntXRate*TILE_WIDTH+TILE_START_XPOS))*(XLightPos-(nCurrCntXRate*TILE_WIDTH+TILE_START_XPOS)) + 
  324.    (YLightPos-(nCurrCntYRate*TILE_HEIGHT+TILE_START_YPOS))*(YLightPos-(nCurrCntYRate*TILE_HEIGHT+TILE_START_YPOS)));
  325. /* SetRect(&rc,
  326.    (XLightPos),
  327.    (YLightPos),
  328.    (XLightPos+5),
  329.    (YLightPos+5));
  330. g_xMainWnd.DrawWithGDI(rc, NULL, RGB(255, 0, 0), 1);
  331. */
  332. if ( rLengthCnt <= nRadius )
  333. {
  334. nSelectedRedValue = nRedValue - INT((nRedValue*rLengthCnt*rDrakRate)/(nRadius));
  335. nSelectedGreenValue = nGreenValue - INT((nGreenValue*rLengthCnt*rDrakRate)/(nRadius));
  336. nSelectedBlueValue = nBlueValue - INT((nBlueValue*rLengthCnt*rDrakRate)/(nRadius));
  337. /* SetRect(&rc,
  338.    (nCntX*TILE_WIDTH+TILE_START_XPOS),
  339.    (nCntY*TILE_HEIGHT+TILE_START_YPOS),
  340.    (nCntX*TILE_WIDTH+TILE_START_XPOS+2),
  341.    (nCntY*TILE_HEIGHT+TILE_START_YPOS+2));
  342. g_xMainWnd.DrawWithGDI(rc, NULL, RGB(255, 0, 0), 1);
  343. */ }
  344. else
  345. {
  346. nSelectedRedValue = nSelectedGreenValue = nSelectedBlueValue = 0;
  347. }
  348. if ( nSelectedRedValue  < 0 ) nSelectedRedValue = 0;
  349. if ( nSelectedGreenValue < 0 ) nSelectedGreenValue = 0;
  350. if ( nSelectedBlueValue  < 0 ) nSelectedBlueValue = 0;
  351. if ( m_avLight[nCntY][nCntX].color == 0 )
  352. m_avLight[nCntY][nCntX].color = RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue); 
  353. else
  354. {
  355. if ( nSelectedRedValue < (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color) )
  356. nSelectedRedValue = (INT)RGB_GETBLUE(m_avLight[nCntY][nCntX].color);
  357. if ( nSelectedGreenValue < (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color) )
  358. nSelectedGreenValue = (INT)RGB_GETGREEN(m_avLight[nCntY][nCntX].color);
  359. if ( nSelectedBlueValue < (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color) )
  360. nSelectedBlueValue = (INT)RGB_GETRED(m_avLight[nCntY][nCntX].color);
  361. m_avLight[nCntY][nCntX].color =  RGB(nSelectedRedValue, nSelectedGreenValue, nSelectedBlueValue);
  362. }
  363. }
  364. }
  365. return TRUE;
  366. }
  367. VOID CLightFog::ShowLightFog(WORD wHalfScrnWidth, WORD wHalfScrnHeight)
  368. {
  369. if ( g_xMainWnd.Get3DDevice() )
  370. {
  371. if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
  372. {
  373. D3DVECTOR vTrans;
  374. D3DMATRIX matTrans;
  375. D3DMATRIX matWorldOriginal;
  376. g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  377. g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
  378. g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_SRCBLEND,  D3DBLEND_ZERO);
  379. g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_SRCCOLOR);
  380. vTrans.x = -wHalfScrnWidth; vTrans.y = wHalfScrnHeight; vTrans.z = 0;
  381. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  382. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matTrans);
  383. g_xMainWnd.Get3DDevice()->SetTexture(0, NULL);
  384. g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_LIGHTING, FALSE);
  385. g_xMainWnd.Get3DDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
  386.   D3DFVF_LVERTEX,
  387.   m_avLight, NUM_LIGHTTILE_VERTICES, 
  388.   m_pwLightIndices, NUM_LIGHTTILE_INDICES, NULL );
  389. g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_LIGHTING, TRUE);
  390. g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_SRCBLEND,  D3DBLEND_ONE);
  391. g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
  392. g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
  393. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  394. g_xMainWnd.Get3DDevice()->EndScene();
  395. }
  396. }
  397. }