hgedistort.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:5k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.7
  3. ** Copyright (C) 2003-2007, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hgeDistortionMesh helper class implementation
  7. */
  8. #include "....includehgedistort.h"
  9. HGE *hgeDistortionMesh::hge=0;
  10. hgeDistortionMesh::hgeDistortionMesh(int cols, int rows)
  11. {
  12. int i;
  13. hge=hgeCreate(HGE_VERSION);
  14. nRows=rows;
  15. nCols=cols;
  16. cellw=cellh=0;
  17. quad.tex=0;
  18. quad.blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_ZWRITE;
  19. disp_array=new hgeVertex[rows*cols];
  20. for(i=0;i<rows*cols;i++)
  21. {
  22. disp_array[i].x=0.0f;
  23. disp_array[i].y=0.0f;
  24. disp_array[i].tx=0.0f;
  25. disp_array[i].ty=0.0f;
  26. disp_array[i].z=0.5f;
  27. disp_array[i].col=0xFFFFFFFF;
  28. }
  29. }
  30. hgeDistortionMesh::hgeDistortionMesh(const hgeDistortionMesh &dm)
  31. {
  32. hge=hgeCreate(HGE_VERSION);
  33. nRows=dm.nRows;
  34. nCols=dm.nCols;
  35. cellw=dm.cellw;
  36. cellh=dm.cellh;
  37. tx=dm.tx;
  38. ty=dm.ty;
  39. width=dm.width;
  40. height=dm.height;
  41. quad=dm.quad;
  42. disp_array=new hgeVertex[nRows*nCols];
  43. memcpy(disp_array, dm.disp_array, sizeof(hgeVertex)*nRows*nCols);
  44. }
  45. hgeDistortionMesh::~hgeDistortionMesh()
  46. {
  47. delete[] disp_array;
  48. hge->Release();
  49. }
  50. hgeDistortionMesh& hgeDistortionMesh::operator= (const hgeDistortionMesh &dm)
  51. {
  52. if(this!=&dm)
  53. {
  54. nRows=dm.nRows;
  55. nCols=dm.nCols;
  56. cellw=dm.cellw;
  57. cellh=dm.cellh;
  58. tx=dm.tx;
  59. ty=dm.ty;
  60. width=dm.width;
  61. height=dm.height;
  62. quad=dm.quad;
  63. delete[] disp_array;
  64. disp_array=new hgeVertex[nRows*nCols];
  65. memcpy(disp_array, dm.disp_array, sizeof(hgeVertex)*nRows*nCols);
  66. }
  67. return *this;
  68. }
  69. void hgeDistortionMesh::SetTexture(HTEXTURE tex)
  70. {
  71. quad.tex=tex;
  72. }
  73. void hgeDistortionMesh::SetTextureRect(float x, float y, float w, float h)
  74. {
  75. int i,j;
  76. float tw,th;
  77. tx=x; ty=y; width=w; height=h;
  78. if (quad.tex)
  79. {
  80. tw=(float)hge->Texture_GetWidth(quad.tex);
  81. th=(float)hge->Texture_GetHeight(quad.tex);
  82. }
  83. else
  84. {
  85. tw = w;
  86. th = h;
  87. }
  88. cellw=w/(nCols-1);
  89. cellh=h/(nRows-1);
  90. for(j=0; j<nRows; j++)
  91. for(i=0; i<nCols; i++)
  92. {
  93. disp_array[j*nCols+i].tx=(x+i*cellw)/tw;
  94. disp_array[j*nCols+i].ty=(y+j*cellh)/th;
  95. disp_array[j*nCols+i].x=i*cellw;
  96. disp_array[j*nCols+i].y=j*cellh;
  97. }
  98. }
  99. void hgeDistortionMesh::SetBlendMode(int blend)
  100. {
  101. quad.blend=blend;
  102. }
  103. void hgeDistortionMesh::Clear(DWORD col, float z)
  104. {
  105. int i,j;
  106. for(j=0; j<nRows; j++)
  107. for(i=0; i<nCols; i++)
  108. {
  109. disp_array[j*nCols+i].x=i*cellw;
  110. disp_array[j*nCols+i].y=j*cellh;
  111. disp_array[j*nCols+i].col=col;
  112. disp_array[j*nCols+i].z=z;
  113. }
  114. }
  115. void hgeDistortionMesh::Render(float x, float y)
  116. {
  117. int i,j,idx;
  118. for(j=0; j<nRows-1; j++)
  119. for(i=0; i<nCols-1; i++)
  120. {
  121. idx=j*nCols+i;
  122. quad.v[0].tx=disp_array[idx].tx;
  123. quad.v[0].ty=disp_array[idx].ty;
  124. quad.v[0].x=x+disp_array[idx].x;
  125. quad.v[0].y=y+disp_array[idx].y;
  126. quad.v[0].z=disp_array[idx].z;
  127. quad.v[0].col=disp_array[idx].col;
  128. quad.v[1].tx=disp_array[idx+1].tx;
  129. quad.v[1].ty=disp_array[idx+1].ty;
  130. quad.v[1].x=x+disp_array[idx+1].x;
  131. quad.v[1].y=y+disp_array[idx+1].y;
  132. quad.v[1].z=disp_array[idx+1].z;
  133. quad.v[1].col=disp_array[idx+1].col;
  134. quad.v[2].tx=disp_array[idx+nCols+1].tx;
  135. quad.v[2].ty=disp_array[idx+nCols+1].ty;
  136. quad.v[2].x=x+disp_array[idx+nCols+1].x;
  137. quad.v[2].y=y+disp_array[idx+nCols+1].y;
  138. quad.v[2].z=disp_array[idx+nCols+1].z;
  139. quad.v[2].col=disp_array[idx+nCols+1].col;
  140. quad.v[3].tx=disp_array[idx+nCols].tx;
  141. quad.v[3].ty=disp_array[idx+nCols].ty;
  142. quad.v[3].x=x+disp_array[idx+nCols].x;
  143. quad.v[3].y=y+disp_array[idx+nCols].y;
  144. quad.v[3].z=disp_array[idx+nCols].z;
  145. quad.v[3].col=disp_array[idx+nCols].col;
  146. hge->Gfx_RenderQuad(&quad);
  147. }
  148. }
  149. void hgeDistortionMesh::SetZ(int col, int row, float z)
  150. {
  151. if(row<nRows && col<nCols) disp_array[row*nCols+col].z=z;
  152. }
  153. void hgeDistortionMesh::SetColor(int col, int row, DWORD color)
  154. {
  155. if(row<nRows && col<nCols) disp_array[row*nCols+col].col=color;
  156. }
  157. void hgeDistortionMesh::SetDisplacement(int col, int row, float dx, float dy, int ref)
  158. {
  159. if(row<nRows && col<nCols)
  160. {
  161. switch(ref)
  162. {
  163. case HGEDISP_NODE: dx+=col*cellw; dy+=row*cellh; break;
  164. case HGEDISP_CENTER: dx+=cellw*(nCols-1)/2;dy+=cellh*(nRows-1)/2; break;
  165. case HGEDISP_TOPLEFT: break;
  166. }
  167. disp_array[row*nCols+col].x=dx;
  168. disp_array[row*nCols+col].y=dy;
  169. }
  170. }
  171. float hgeDistortionMesh::GetZ(int col, int row) const
  172. {
  173. if(row<nRows && col<nCols) return disp_array[row*nCols+col].z;
  174. else return 0.0f;
  175. }
  176. DWORD hgeDistortionMesh::GetColor(int col, int row) const
  177. {
  178. if(row<nRows && col<nCols) return disp_array[row*nCols+col].col;
  179. else return 0;
  180. }
  181. void hgeDistortionMesh::GetDisplacement(int col, int row, float *dx, float *dy, int ref) const
  182. {
  183. if(row<nRows && col<nCols)
  184. {
  185. switch(ref)
  186. {
  187. case HGEDISP_NODE: *dx=disp_array[row*nCols+col].x-col*cellw;
  188. *dy=disp_array[row*nCols+col].y-row*cellh;
  189. break;
  190. case HGEDISP_CENTER: *dx=disp_array[row*nCols+col].x-cellw*(nCols-1)/2;
  191. *dy=disp_array[row*nCols+col].x-cellh*(nRows-1)/2;
  192. break;
  193. case HGEDISP_TOPLEFT: *dx=disp_array[row*nCols+col].x;
  194. *dy=disp_array[row*nCols+col].y;
  195. break;
  196. }
  197. }
  198. }