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

模拟服务器

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. CMist::CMist()
  3. {
  4.   D3DVECTOR vNorm(0, 0, -1);
  5.     m_avBillboard[0] = D3DVERTEX(D3DVECTOR(-400.0f, 300.0f, 0), vNorm, 0, 0);
  6.     m_avBillboard[1] = D3DVERTEX(D3DVECTOR(-400.0f,-300.0f, 0), vNorm, 0, 1);
  7.     m_avBillboard[2] = D3DVERTEX(D3DVECTOR( 400.0f, 300.0f, 0), vNorm, 1, 0);
  8.     m_avBillboard[3] = D3DVERTEX(D3DVECTOR( 400.0f,-300.0f, 0), vNorm, 1, 1);
  9. m_vTrans.x = 0;
  10. m_vTrans.y = 0;
  11. m_vTrans.z = 0;
  12. }
  13. CMist::~CMist()
  14. {
  15. }
  16. BOOL CMist::Create()
  17. {
  18. D3DTextr_CreateTextureFromFile("mist.bmp");
  19. D3DTextr_Restore("mist.bmp", g_xMainWnd.Get3DDevice());
  20. return FALSE;
  21. }
  22. VOID CMist::Init()
  23. {
  24. }
  25. VOID CMist::Destory()
  26. {
  27. }
  28. HRESULT CMist::DrawMist()
  29. {
  30. if ( g_xMainWnd.Get3DDevice() )
  31. {
  32. D3DMATRIX matWorldOriginal;
  33. D3DMATRIX matTrans;
  34. D3DMATRIX matScale;
  35. D3DMATRIX matWorld;
  36. if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
  37. {
  38. g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  39. static int nCnt = 0;
  40. nCnt++;
  41. if ( nCnt < 800 )
  42. {
  43.   m_vTrans.x -= 1.9f; 
  44. m_vTrans.y -= 0.2f; 
  45. m_vTrans.z = (FLOAT)0;
  46. }
  47. else if ( nCnt >= 800 &&  nCnt < 1600 )
  48. {
  49.   m_vTrans.x += 1.9f; 
  50. m_vTrans.y += 0.2f; 
  51. m_vTrans.z = (FLOAT)0;
  52. }
  53. else
  54. {
  55. nCnt = 0;
  56. }
  57. D3DUtil_SetTranslateMatrix(matTrans, m_vTrans);
  58. D3DUtil_SetScaleMatrix(matScale, 5.0f, 2.0f, 0.0f);
  59. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  60. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  61. D3DMATERIAL7 mtrl;
  62. D3DUtil_InitMaterial(mtrl, 
  63.  (FLOAT)100/255.0f,
  64.  (FLOAT)200/255.0f, 
  65.  (FLOAT)200/255.0f);
  66. mtrl.diffuse.a = 1/255.0f;
  67. g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
  68. SetBlendRenderState(g_xMainWnd.Get3DDevice(), 2, mtrl);
  69. g_xMainWnd.Get3DDevice()->SetTexture(0, D3DTextr_GetSurface("mist.bmp"));
  70. g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avBillboard, 4, NULL);
  71. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  72. ResetBlendenderState(g_xMainWnd.Get3DDevice());
  73. g_xMainWnd.Get3DDevice()->EndScene();
  74. return S_OK;
  75. }
  76. }
  77. return E_FAIL;
  78. }
  79. VOID CMist::ProgressMist()
  80. {
  81. DrawMist();
  82. }
  83. /*
  84. CRain::CRain()
  85. {
  86.   D3DVECTOR vNorm(0, 0, -1);
  87. m_avBillboard[0] = D3DVERTEX( D3DVECTOR(-0.5f,-5.0f, 0.0f ), vNorm, 0.0f, 1.0f );
  88.     m_avBillboard[1] = D3DVERTEX( D3DVECTOR( 0.5f,-5.0f, 0.0f ), vNorm, 0.0f, 0.0f );
  89.     m_avBillboard[2] = D3DVERTEX( D3DVECTOR(-0.5f, 5.0f, 0.0f ), vNorm, 1.0f, 1.0f );
  90.     m_avBillboard[3] = D3DVERTEX( D3DVECTOR( 0.5f, 5.0f, 0.0f ), vNorm, 1.0f, 0.0f );
  91. }
  92. CRain::~CRain()
  93. {
  94. }
  95. BOOL CRain::Create()
  96. {
  97. // D3DTextr_CreateTextureFromFile("snow.bmp");
  98. // D3DTextr_Restore("snow.bmp", g_xMainWnd.Get3DDevice());
  99. m_xParticles.m_rParticleWind = 0.03f;
  100. m_xParticles.m_rParticleGravity = 0.25f;
  101. return FALSE;
  102. }
  103. VOID CRain::Init()
  104. {
  105. }
  106. VOID CRain::Destory()
  107. {
  108. }
  109. HRESULT CRain::DrawRain()
  110. {
  111. if ( g_xMainWnd.Get3DDevice() )
  112. {
  113. D3DMATRIX matWorldOriginal;
  114. D3DMATRIX matTrans;
  115. D3DMATRIX matScale;
  116. D3DMATRIX matWorld;
  117. D3DVECTOR vTrans;
  118. m_xParticles.SetRain();
  119. if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
  120. {
  121. g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  122. m_xParticles.ProcessParticles();
  123. D3DMATERIAL7 mtrl;
  124. D3DUtil_InitMaterial(mtrl, 
  125.  (FLOAT)150/255.0f,
  126.  (FLOAT)150/255.0f, 
  127.  (FLOAT)150/255.0f);
  128. mtrl.diffuse.a = 10/255.0f;
  129. g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
  130. SetBlendRenderState(g_xMainWnd.Get3DDevice(), 0, mtrl);
  131. for ( INT nCnt = 0; nCnt < MAX_PARTICLES; nCnt++ )
  132. {
  133. if ( m_xParticles.m_stParticles[nCnt].nState == PARTICLE_STATE_ALIVE )
  134. {
  135.    vTrans.x = (FLOAT)m_xParticles.m_stParticles[nCnt].rX-400; 
  136. vTrans.y = (FLOAT)-m_xParticles.m_stParticles[nCnt].rY+300; 
  137. vTrans.z = 0;
  138. FLOAT rSize = (FLOAT)(10+(nCnt%20));
  139. D3DUtil_SetScaleMatrix(matScale, 1, 1, 0.0f);
  140. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  141. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  142. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  143. // g_xMainWnd.Get3DDevice()->SetTexture(0, D3DTextr_GetSurface("snow.bmp"));
  144. g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avBillboard, 4, NULL);
  145. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  146. }
  147. }
  148. ResetBlendenderState(g_xMainWnd.Get3DDevice());
  149. g_xMainWnd.Get3DDevice()->EndScene();
  150. return S_OK;
  151. }
  152. }
  153. return E_FAIL;
  154. }
  155. VOID CRain::ProgressRain()
  156. {
  157. DrawRain();
  158. }
  159. CSnow::CSnow()
  160. {
  161.   D3DVECTOR vNorm(0, 0, -1);
  162. m_avBillboard[0] = D3DVERTEX( D3DVECTOR(-2.0f,-2.0f, 0.0f ), vNorm, 0.0f, 1.0f );
  163.     m_avBillboard[1] = D3DVERTEX( D3DVECTOR(-2.0f, 2.0f, 0.0f ), vNorm, 0.0f, 0.0f );
  164.     m_avBillboard[2] = D3DVERTEX( D3DVECTOR( 2.0f,-2.0f, 0.0f ), vNorm, 1.0f, 1.0f );
  165.     m_avBillboard[3] = D3DVERTEX( D3DVECTOR( 2.0f, 2.0f, 0.0f ), vNorm, 1.0f, 0.0f );
  166. }
  167. CSnow::~CSnow()
  168. {
  169. }
  170. BOOL CSnow::Create()
  171. {
  172. D3DTextr_CreateTextureFromFile("snow.bmp");
  173. D3DTextr_Restore("snow.bmp", g_xMainWnd.Get3DDevice());
  174. return FALSE;
  175. }
  176. VOID CSnow::Init()
  177. {
  178. }
  179. VOID CSnow::Destory()
  180. {
  181. }
  182. HRESULT CSnow::DrawSnow()
  183. {
  184. if ( g_xMainWnd.Get3DDevice() )
  185. {
  186. D3DMATRIX matWorldOriginal;
  187. D3DMATRIX matTrans;
  188. D3DMATRIX matScale;
  189. D3DMATRIX matWorld;
  190. D3DVECTOR vTrans;
  191. m_xParticles.SetSnow();
  192. if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()) )
  193. {
  194. g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  195. m_xParticles.ProcessParticles();
  196. D3DMATERIAL7 mtrl;
  197. D3DUtil_InitMaterial(mtrl, 
  198.  (FLOAT)255/255.0f,
  199.  (FLOAT)255/255.0f, 
  200.  (FLOAT)255/255.0f);
  201. mtrl.diffuse.a = 1/255.0f;
  202. g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);
  203. SetBlendRenderState(g_xMainWnd.Get3DDevice(), _BLEND_NORMAL, mtrl);
  204. for ( INT nCnt = 0; nCnt < MAX_PARTICLES; nCnt++ )
  205. {
  206. if ( m_xParticles.m_stParticles[nCnt].nState == PARTICLE_STATE_ALIVE )
  207. {
  208.    vTrans.x = (FLOAT)m_xParticles.m_stParticles[nCnt].rX-400; 
  209. vTrans.y = (FLOAT)-m_xParticles.m_stParticles[nCnt].rY+300; 
  210. vTrans.z = 0;
  211. FLOAT rSize = (FLOAT)(10+(nCnt%20));
  212. D3DUtil_SetScaleMatrix(matScale, rSize/22.0f, rSize/22.0f, 0.0f);
  213. D3DUtil_SetTranslateMatrix(matTrans, vTrans);
  214. D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
  215. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);
  216. g_xMainWnd.Get3DDevice()->SetTexture(0, D3DTextr_GetSurface("snow.bmp"));
  217. g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avBillboard, 4, NULL);
  218. g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);
  219. }
  220. }
  221. ResetBlendenderState(g_xMainWnd.Get3DDevice());
  222. g_xMainWnd.Get3DDevice()->EndScene();
  223. return S_OK;
  224. }
  225. }
  226. return E_FAIL;
  227. }
  228. VOID CSnow::ProgressSnow()
  229. {
  230. DrawSnow();
  231. }
  232. */
  233. SHORT m_shWaveMap[2][_MAX_X*_MAX_Y];
  234. CAirWave::CAirWave()
  235. {
  236. }
  237. CAirWave::~CAirWave()
  238. {
  239. }
  240. VOID CAirWave::InitAirWave()
  241. {
  242. SHORT shTmp;
  243. for ( SHORT shCnt = -256; shCnt <= 255; shCnt++ )
  244. {
  245. shTmp = shCnt / 4;
  246. m_bDispLut[shCnt+256] = (BYTE)(tan(asin((sin(atan(shCnt))/4.0f)))*shTmp);
  247. }
  248. ZeroMemory(m_shWaveMap, sizeof(WORD)*_MAX_X*_MAX_Y*2);
  249. m_bCurr = _CURR;
  250. m_bNew  = _NEW;
  251. }
  252. VOID CAirWave::UpdateAirWave()
  253. {
  254. SHORT shWaveHeight;
  255. for ( INT y = 2; y <= _MAX_Y-2; y++ )
  256. for ( INT x = 2; x <= _MAX_X-2; x++ )
  257. {
  258. shWaveHeight = (
  259. m_shWaveMap[m_bCurr][x-1 + _MAX_X *  y] +
  260. m_shWaveMap[m_bCurr][x-2 + _MAX_X *  y] +
  261. m_shWaveMap[m_bCurr][x+1 + _MAX_X *  y] +
  262. m_shWaveMap[m_bCurr][x+2 + _MAX_X *  y] +
  263. m_shWaveMap[m_bCurr][x   + _MAX_X * (y-1)] +
  264. m_shWaveMap[m_bCurr][x   + _MAX_X * (y-2)] +
  265. m_shWaveMap[m_bCurr][x   + _MAX_X * (y+1)] +
  266. m_shWaveMap[m_bCurr][x   + _MAX_X * (y+2)] +
  267. m_shWaveMap[m_bCurr][x-1 + _MAX_X * (y-1)] +
  268. m_shWaveMap[m_bCurr][x+1 + _MAX_X * (y-1)] +
  269. m_shWaveMap[m_bCurr][x-1 + _MAX_X * (y+1)] +
  270. m_shWaveMap[m_bCurr][x+1 + _MAX_X * (y+1)]
  271. ) / 6 - m_shWaveMap[m_bNew][x + _MAX_X * y];
  272. // shWaveHeight = shWaveHeight - (shWaveHeight/_DAMP);
  273. _asm
  274. {
  275. push bx
  276. mov bx, shWaveHeight
  277. sar bx, _DAMP
  278. sub shWaveHeight, bx
  279. pop bx
  280. }
  281. m_shWaveMap[m_bNew][x + _MAX_X * y] = shWaveHeight;
  282. }
  283. }
  284. VOID CAirWave::DropAirWaveMap(INT nX, INT nY, INT nW, INT nMulFactor)
  285. {
  286. INT nSqrX, nSqrY, nSqrW;
  287. nSqrW = nW*nW;
  288. if ( (nX > nW) && (nX < _MAX_X-nW) && (nY > nW) && (nY < _MAX_Y-nW) )
  289. {
  290. for ( INT nV = nY-nW; nV <= nY+nW; nV++ )
  291. {
  292. nSqrY = (nV-nY)*(nV-nY);
  293. for ( INT nU = nX-nW; nU <= nX+nW; nU++ )
  294. {
  295. nSqrX = (nU-nX)*(nU-nX);
  296. if ( (nSqrX+nSqrY) <= nSqrW )
  297. {
  298. INT nTmpValue = nW-(INT)(sqrt(nSqrX+nSqrY));
  299. m_shWaveMap[m_bCurr][nU + _MAX_X * nV] = (nMulFactor*nTmpValue);
  300. }
  301. }
  302. }
  303. }
  304. }
  305. VOID CAirWave::RenderAirWave()
  306. {
  307. DDSURFACEDESC2 ddsd;
  308. WORD  wColor;
  309. SHORT shXDiff, shYDiff, shXDisp, shYDisp;
  310. if ( g_xMainWnd.GetBackBuffer() != NULL )
  311. {
  312. ddsd.dwSize = sizeof(DDSURFACEDESC2);
  313. ddsd.lpSurface = NULL;
  314. g_xMainWnd.GetBackBuffer()->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
  315. if ( !ddsd.lpSurface ) return;
  316. WORD* pwdDst;
  317. pwdDst = (WORD*)ddsd.lpSurface;
  318. for ( INT y=0 ; y < _MAX_Y; y++ )
  319. {
  320. for ( INT x=0 ; x < _MAX_X; x++ )
  321. {
  322. shXDiff = m_shWaveMap[m_bNew][(x+1) + _MAX_X * y] - m_shWaveMap[m_bNew][x + _MAX_X * y];
  323. shYDiff = m_shWaveMap[m_bNew][x + _MAX_X * (y+1)] - m_shWaveMap[m_bNew][x + _MAX_X * y];
  324. shXDisp = m_bDispLut[shXDiff+256];
  325. shYDisp = m_bDispLut[shYDiff+256];
  326. if ( shXDiff < 0 )
  327. {
  328. if ( shYDiff < 0 )
  329.   wColor = pwdDst[((y-shYDisp) * (ddsd.lPitch >> 1)) + (x-shXDisp)];
  330. else
  331.   wColor = pwdDst[((y+shYDisp) * (ddsd.lPitch >> 1)) + (x-shXDisp)];
  332. }
  333. else
  334. {
  335. if ( shYDiff < 0 )
  336.   wColor = pwdDst[((y-shYDisp) * (ddsd.lPitch >> 1)) + (x+shXDisp)];
  337. else
  338.   wColor = pwdDst[((y+shYDisp) * (ddsd.lPitch >> 1)) + (x+shXDisp)];
  339. }
  340. pwdDst[(y * (ddsd.lPitch >> 1)) + x] = wColor;
  341. }
  342. }
  343. BYTE bTmp = m_bCurr;
  344. m_bCurr = m_bNew;
  345. m_bNew = bTmp;
  346. g_xMainWnd.GetBackBuffer()->Unlock(NULL);
  347. return;
  348. }
  349. }
  350. /*
  351. procedure TfrmDxEffect.InitWaveMap;
  352. var x,y: SmallInt;
  353. begin
  354.   for y:=0 to MAXY do begin
  355.     for x:=0 to MAXX do begin
  356.       WaveMap[CT,x,y] := 0;
  357.       WaveMap[NW,x,y] := 0;
  358.     end;
  359.   end;
  360. end;
  361. procedure TfrmDxEffect.UpdateWaveMap;
  362. var
  363.   x,y,n: Smallint;
  364. begin
  365.   (* ------------------------------------------------------------------------ *)
  366.   (* Calculate the next frame of our waterwaves at time t                     *)
  367.   (*                                                                          *)
  368.   (* The height of the wave at (x, y) is determined by adding the heights of  *)
  369.   (* the waves located above, below, to the left and to the right of (x, y).  *)
  370.   (* The sum is then divided by two, giving us a waveheight roughly twice     *)
  371.   (* as high as the rest.                                                     *)
  372.   (*                                                                          *)
  373.   (* Here comes the key to wave animation: from our total, we subtract the    *)
  374.   (* height of the wave at (x, y) at time t-1.                                *)
  375.   (*                                                                          *)
  376.   (* If the previous wave was higher than average, the wave will drop.        *)
  377.   (* And if the previous wave was lower than average, the wave will rise.     *)
  378.   (*                                                                          *)
  379.   (* Check out these sketches:                                                *)
  380.   (*                                                                          *)
  381.   (*   ****                        ****                                       *)
  382.   (*   ----*** -----------------***----------- average height;                *)
  383.   (*          ****          ****               the wave will rise             *)
  384.   (*              **********                                                  *)
  385.   (*                                                                          *)
  386.   (*                                                                          *)
  387.   (*              **********                                                  *)
  388.   (*   -------****----------****-------------- average height;                *)
  389.   (*       ***                  ***            the wave will drop             *)
  390.   (*   ****                         ****                                      *)
  391.   (*                                                                          *)
  392.   (* While moving up and down, the wave loses energy. This is simulated by    *)
  393.   (* using a damping factor. This factor depends on the height of the wave,   *)
  394.   (* so that high waves lose energy fast, and low waves lose energy slowly:   *)
  395.   (*                                                                          *)
  396.   (*   wave_height = wave_height - (wave_height / damp_factor)                *)
  397.   (* ------------------------------------------------------------------------ *)
  398.   for y:=2 to MAXY-2 do begin
  399.     for x:=2 to MAXX-2 do begin
  400.       n:=( WaveMap[CT,x-1,y] +
  401.            WaveMap[CT,x-2,y] +
  402.            WaveMap[CT,x+1,y] +
  403.            WaveMap[CT,x+2,y] +
  404.            WaveMap[CT,x,y-1] +
  405.            WaveMap[CT,x,y-2] +
  406.            WaveMap[CT,x,y+1] +
  407.            WaveMap[CT,x,y+2] +
  408.            WaveMap[CT,x-1,y-1] +
  409.            WaveMap[CT,x+1,y-1] +
  410.            WaveMap[CT,x-1,y+1] +
  411.            WaveMap[CT,x+1,y+1]
  412.            ) div 6 - WaveMap[NW,x,y];
  413.       asm
  414.         push bx
  415.         mov bx, n
  416.         sar bx, DAMP
  417.         sub n, bx
  418.         pop bx
  419.       end;
  420.       WaveMap[NW,x,y] := n;  // Store result
  421.     end;
  422.   end;
  423. end;
  424. procedure TfrmDxEffect.RenderWaveToDIB(DIB: TDIB);
  425. var
  426.   x,y,newcolor,xDiff,yDiff,xDisp,yDisp: Smallint;
  427. begin
  428.   for y:=0 to MAXY do begin
  429.     for x:=0 to MAXX do begin
  430.       xDiff := WaveMap[NW,x+1,y] - WaveMap[NW,x,y];
  431.       yDiff := WaveMap[NW,x,y+1] - WaveMap[NW,x,y];
  432.       xDisp := dispLut[xDiff+256];
  433.       yDisp := dispLut[yDiff+256];
  434.       if xDiff<0 then begin
  435.         // Current position is higher - Clockwise rotation
  436.         if (yDiff<0) then
  437.           newcolor := Background.DIB.Pixels[x-xDisp,y-yDisp]
  438.         else
  439.           newcolor := Background.DIB.Pixels[x-xDisp,y+yDisp]
  440.       end else begin
  441.         if (yDiff<0) then
  442.           newcolor := Background.DIB.Pixels[x+xDisp,y-yDisp]
  443.         else
  444.           newcolor := Background.DIB.Pixels[x+xDisp,y+yDisp]
  445.       end;
  446.       DIB.Pixels[x,y] := newcolor;
  447.     end;
  448.   end;
  449. end;*/