afTerrainPatch.h
上传用户:kaiguan
上传日期:2007-10-28
资源大小:1074k
文件大小:7k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #ifndef AF_TERRAINPATCH
  2. #define AF_TERRAINPATCH
  3. #include <D3DX9.h>
  4. #include "afVec2.h"
  5. #include "afVec3.h"
  6. #include "af3DObject.h"
  7. #define D3DFVF_PATCHVERTEX ( D3DFVF_XYZ | D3DFVF_TEX1 )
  8. class afTerrain;
  9. class afTerrainPatch:public af3DObject
  10. {
  11. public:
  12. enum VISFLAGS  {  VIS_BASE = 1,
  13.   VIS_LAYER0 = 2,
  14.   VIS_LAYER1 = 4,
  15.   VIS_LAYER2 = 8,
  16.   VIS_LAYER3 = 16,
  17.   VIS_LAYER4 = 32,
  18.   VIS_LAYERALL = 63 };
  19. enum { MAX_SUBDIV = 4,
  20. SOURCE_WIDTH = 17,
  21. SOURCE_HEIGHT = 17,
  22. MAX_VERTICES = SOURCE_WIDTH * SOURCE_HEIGHT,
  23. MAX_INDICES = MAX_VERTICES*3 };
  24. enum {  LEFT = 1,
  25. RIGHT = 2,
  26. TOP = 4,
  27. BOTTOM = 8  };
  28. struct PATCHVERTEX
  29. {
  30. afVec3 pos;
  31. afVec2 tex;
  32. };
  33. afTerrainPatch(afTerrain* nMaster, int nX, int nY);
  34. void init();
  35. void deinit();
  36. int render();
  37. bool updateTessellation();
  38. bool updateTessellation2();
  39. bool updateTessellation3();
  40. void deleteDeviceObjects();
  41. bool restoreDeviceObjects();
  42. int fillBaseVertices(afTerrainPatch::PATCHVERTEX* nDest);
  43. void setRendered(bool nSet)  {  rendered = nSet;  }
  44. bool getRendered() const  {  return rendered;  }
  45. void setVisFlags(int nFlags)  {  visFlags = nFlags;  }
  46. int getVisFlags() const  {  return visFlags;  }
  47. void setMaster(afTerrain* nMaster)  {  master = nMaster;  }
  48. void setScale(const afVec3& nScale);
  49. void addToActiveList();
  50. void removeFromActiveList();
  51. void setHeightMapPosition(int nX0, int nY0);
  52. float getExactTessellation() const;
  53. float getCurrentError() const  {  return currentError;  }
  54. // returns the current tessellation:
  55. //   0...maximum details (~2*SOURCE_WIDTH*SOURCE_WIDTH triangles)
  56. //   4...minimum details (2 triangles)
  57. int getCurrentTessellation() const  {  return selfTes;  }
  58. int getNewTessellation() const  {  return newSelfTes;  }
  59. int getNewTessellationSafe() const;
  60. int getRealTessellation() const  {  return realSelfTes;  }
  61. int getNumIndices() const  {  return numNewIndices;  }
  62. int getNumVertices() const  {  return numNewVertices;  }
  63. const PATCHVERTEX* getVertices() const  {  return vertices;  }
  64. const WORD* getIndices() const  {  return indices;  }
  65. bool checkVisibility(const D3DXMATRIX* nWorldMatrix, const afPlane nPlanes[6]);
  66. void calcErrors();
  67. bool isVisible() const  {  return visible;  }
  68. bool isActive() const  {  return active;  }
  69. void setVisible(bool nVis);
  70. void updateProjectedErrors(const D3DXMATRIX* nWorldMatrix);
  71. float getProjectedError(int nWhich)  {  return errors[nWhich].diff;  }
  72. void setRealTessellation(int nTes);
  73. void setTessellation(int nTes)  {  newSelfTes = nTes;  }
  74. class afTerrainPatch* getNextActive()  {  return next;  }
  75. int getGridPosX() const  {  return gridX;  }
  76. int getGridPosY() const  {  return gridY;  }
  77. void setFlagActive(bool nSet)  {  flagActive = nSet;  }
  78. bool getFlagActive() const  {  return flagActive;  }
  79. void setPosition(const afVec3& nPos)  {  pos = nPos;  }
  80. void setNeighbors(const afTerrainPatch* nLeft, const afTerrainPatch* nRight, const afTerrainPatch *nUp, const afTerrainPatch* nDown);
  81. static int getAddLayerFlag(int nLayer)  {  return 1 << nLayer;  }
  82. void createTessellation(int nCenter, int nLeft, int nRight, int nUp, int nDown);
  83. const afTerrainPatch* getLeft() const  {  return left;  }
  84. const afTerrainPatch* getRight() const  {  return right;  }
  85. const afTerrainPatch* getBottom() const  {  return bottom;  }
  86. const afTerrainPatch* getTop() const  {  return top;  }
  87. void calcMinMaxY();  
  88. protected:
  89. static int getPowerTwo(int nVal);
  90. unsigned short getIndex(int nX, int nY);
  91. float getHeight(int nX, int nY) const;
  92. void getVertex(int nX, int nY, afVec3& nPoint) const;
  93. void getTexCoord(int nX, int nY, afVec2& nTCoord) const;
  94. void getNormal(int nX, int nY, afVec3& nNormal) const;
  95. void calcError(int nTes);
  96. void addIndex(unsigned short nIdx);
  97. void addLastIndexAgain();
  98. void reduceShapeTo(int nTes, PATCHVERTEX *nData);
  99. void makeBordersSimpler(PATCHVERTEX *nData);
  100. void makeSimpler(int nTes, PATCHVERTEX *nData);
  101. void calculateInbetweenVertex(int x, int y, int xc, int yc, int pow, PATCHVERTEX *nData);
  102. int calculateDiagonalVertices(int x, int y, int xc, int yc, int pow, PATCHVERTEX *nData,
  103.   float& nHeightLeftTop, int& idxLT, float& nHeightRightBottom, int& idxRB);
  104. void addLevel4PatchTriangles(bool nLeft, bool nRight, bool nBottom, bool nTop);
  105. void addTriangleRow(int nY, int nPow, bool nLeft, bool nRight, bool nBottom, bool nTop);
  106. void addTriangleBottomRow(int nPow, bool nLeft, bool nRight);
  107. void addTriangleTopRow(int nPow, bool nLeft, bool nRight);
  108. struct Error
  109. {
  110. Error()  {  diff = 0.0f;  }
  111. afVec3 correct, real;
  112. float diff;
  113. };
  114. //RENDERMODE renderMode;
  115. int visFlags;
  116. afTerrain* master;
  117. int gridX,gridY;
  118. bool active;
  119. bool visible;
  120. bool forceBufferCreate;
  121. Error errors[MAX_SUBDIV+2];
  122. float currentError;
  123. int newSelfTes, selfTes, oldRealSelfTes, newRealSelfTes, realSelfTes, leftTes,rightTes,topTes,bottomTes;
  124. afVec3 pos, scale;
  125. float minY,maxY;
  126. int hmX0, hmY0;
  127. int numVertices, numIndices,
  128. numNewVertices, numNewIndices;
  129. int frameIdx;
  130. // for linking in a list of active patches
  131. //
  132. afTerrainPatch *next, *prev;
  133. bool flagActive;
  134. // neighbors
  135. //
  136. const afTerrainPatch *left, *right, *top, *bottom;
  137. // dynamic data
  138. //
  139. unsigned short *indexMap;
  140. PATCHVERTEX *vertices; //, *verticesLow;
  141. unsigned short *indices;
  142. bool rendered;
  143. bool lowVertMethod2;
  144. unsigned char useNeightbors;
  145. PDIRECT3DINDEXBUFFER9 iBuffer;
  146. PDIRECT3DVERTEXBUFFER9 vBuffer;
  147. PATCHVERTEX *verticesLow;
  148. float *yMoveSelf, *yMoveLeft,*yMoveLeft2, *yMoveRight,*yMoveRight2, *yMoveBottom,*yMoveBottom2, *yMoveTop,*yMoveTop2;
  149. float factorSelf, factorLeft,factorLeft2, factorRight,factorRight2, factorBottom,factorBottom2, factorTop,factorTop2;
  150. bool newFollowsLeft,followsLeft, newFollowsRight,followsRight, newFollowsBottom,followsBottom, newFollowsTop,followsTop;
  151. bool recalcBorderLeft, recalcBorderRight, recalcBorderBottom, recalcBorderTop;
  152. bool forceRetessellation;
  153. bool fillBuffers();
  154. bool checkBuffers();
  155. void fillMorphVertices();
  156. void checkBorderLeft();
  157. void checkBorderRight();
  158. void checkBorderBottom();
  159. void checkBorderTop();
  160. };
  161. inline void afTerrainPatch::addIndex(unsigned short nIdx)
  162. {
  163. indices[numNewIndices++] = nIdx;
  164. }
  165. inline void afTerrainPatch::addLastIndexAgain()
  166. {
  167. if(numNewIndices>0)
  168. indices[numNewIndices++] = indices[numNewIndices-1];
  169. }
  170. typedef afTerrainPatch *afTerrainPatchPtr;
  171. typedef afTerrainPatchPtr *afTerrainPatchPPtr;
  172. #endif