My Project
TerrainBlock.h
1 #pragma once
2 #include "TerrainCommon.h"
3 #include "util/ParaMemPool.h"
4 #include "TriangleStrip.h"
5 #include "TriangleFan.h"
6 #include "Terrain.h"
7 #include "Triangle.h"
8 #include "ShapeRay.h"
9 #include <queue>
10 
11 #include "TerrainGeoMipmapIndices.h"
12 
13 namespace ParaTerrain
14 {
15  using namespace ParaEngine;
16  class TerrainBlock;
17  typedef TerrainBlock* TerrainBlockPtr;
18  typedef std::deque<TerrainBlockPtr, FixedSizedAllocator<TerrainBlockPtr> > deque_TerrainBlockPtr_Type;
19  typedef std::queue<TerrainBlockPtr, deque_TerrainBlockPtr_Type> queue_TerrainBlockPtr_Type;
20 
23  {
24  public:
25  TerrainBlock(TerrainBlock * pParent,bool useGeoMipmap = false);
26  TerrainBlock(int homeVertex, int stride, Terrain * pTerrain, TerrainBlock * pParent,bool useGeoMipmap = false);
27  ~TerrainBlock();
29  void CalculateGeometry(Terrain * pTerrain);
31  void Tessellate(uint32 *pCountStrips, Terrain * pTerrain);
33  void RepairCracks(Terrain * pTerrain, uint32 *pCountFans);
34 
35  bool IsActive();
36 
37  inline int GetStride()
38  {
39  return m_Stride;
40  }
41  inline int GetHomeIndex()
42  {
43  return m_HomeIndex;
44  }
45  inline bool IsHole()
46  {
47  return m_bIsHole;
48  }
50  inline float GetMaxError(){return m_fMaxError;}
51 
52  inline float GetMaxElevation(){return m_MaxElevation;}
53  inline float GetMinElevation(){return m_MinElevation;}
54 
55  void EnableStrip(Terrain * pTerrain, bool bEnabled);
56 
57  void VertexChanged(Terrain * pTerrain);
58  void VertexChanged(Terrain * pTerrain, int index1);
59  void VertexChanged(Terrain * pTerrain, int index1, int index2);
60  void IntersectRay(const CShapeRay & ray, Vector3 & intersectionPoint, float &lowestDistance, const Terrain * pTerrain);
61 
65  bool UpdateHoles(Terrain * pTerrain);
66 
67 private:
68  TriangleStrip* CreateGetTriangleStrip(int nIndex, Terrain * pTerrain);
69  TriangleFan* CreateGetTriangleFan(int nIndex, Terrain * pTerrain);
70 
71  void CreateTriangleStrip(uint32 *pCount, Terrain * pTerrain);
73  bool Tessellate_NonRecursive(uint32 *pCountStrips, Terrain * pTerrain);
74 
76  void ComputeMaxVertexError(Terrain * pTerrain);
77 
78  TerrainBlock * m_pParent;
79  TerrainBlock **m_pChildren;
80  int m_HomeIndex;
81  float m_MinElevation, m_MaxElevation;
83  float m_fMaxError;
84  int m_nTriangleStripIndex;
85  // in range [0, 8*8]; range [0, 8*8) matches the m_texture_cell_id. last one is reserved for blocks that are completely in the fog.
86  short int m_texture_group_id;
87  // in range [0, 8*8)
88  short int m_texture_cell_id;
89  // this is always 64
90  short int m_texture_fog_id;
91 
92  /* on which fog side this block is on.
93  enum Side
94  {
95  NO_SIDE,
96  POSITIVE_SIDE,
97  NEGATIVE_SIDE,
98  BOTH_SIDE
99  };
100  */
101  short int m_fog_side;
103  inline bool IsInFogRadius() {return m_texture_group_id == m_texture_cell_id; }
104 
105  /* on which fog side this block is on.
106  enum Side
107  {
108  NO_SIDE,
109  POSITIVE_SIDE,
110  NEGATIVE_SIDE,
111  BOTH_SIDE
112  };
113  */
114  inline short int GetFogSide() {return m_fog_side; }
115 
121  short int m_frustum_state;
122  public:
123  inline short int GetFrustumState() {return m_frustum_state; }
124  private:
125  float m_texture_tile_x;
126  float m_texture_tile_y;
127 
128 #if _USE_RAYTRACING_SUPPORT_ > 0
129  Triangle *m_pTriangles;
130 #endif
131  short int m_Stride;
133  bool m_bIsHole:1;
135  bool m_bHasHole:1;
136  bool m_bIsActive:1;
137  bool m_bChildrenActive:1;
138 
139  friend class Terrain;
140 
141  //geoMipmapCode
142  public:
143  IndexInfo* m_indexInfo;
144  bool m_useGeoMipmap;
145  int m_chunkCountX;
146 
147  int m_lodLevel;
148  GeoMipmapChunkType m_chunkType;
149 
150  void SetLod(int level,GeoMipmapChunkType type);
151  int GetLodLevel(){return m_lodLevel;}
152  GeoMipmapChunkType GetChunkType(){return m_chunkType;}
153 
154  private:
155  TerrainBlock(){};
156  void InitMipmapBlock(int homeVertex,int stride,Terrain* pTerrain,TerrainBlock* pParent,int nCol,int nRow);
157  void TessellateGeoMipmap(Terrain* pTerrain);
158  void CalculateGeometryGeoMipmap(Terrain * pTerrain);
159  int GetChildChunkCount()
160  {
161  if(m_useGeoMipmap)
162  return m_chunkCountX*m_chunkCountX;
163  else
164  return 4;
165  };
166  TerrainBlock* GetChildBlock(int index);
167  int GetTextureGroupId(){return m_texture_group_id;}
168  bool IsInFog(){return m_texture_group_id == m_texture_fog_id;}
169  void IntersectRayGeoMipmap(const CShapeRay & ray, Vector3 & intersectionPoint, float &lowestDistance, const Terrain * pTerrain);
170  void IntersectRayTriangle(const CShapeRay & ray, Vector3 & intersectionPoint, float &lowestDistance, const Terrain * pTerrain,int startVertex);
171  bool PointInTriangle(Triangle& tri,Vector3& point);
172  };
173 }
Definition: SceneObject.h:15
different physics engine has different winding order.
Definition: EventBinding.h:32
float GetMaxError()
the amount of vertex error introduced if this block is simplified as just two triangles ...
Definition: TerrainBlock.h:50
Standard 3-dimensional vector.
Definition: ParaVector3.h:16
Definition: mdx.h:14
void RepairCracks(Terrain *pTerrain, uint32 *pCountFans)
repair cracks in this block and child blocks.
Definition: TerrainBlock.cpp:444
Definition: TerrainGeoMipmapIndices.h:22
void CalculateGeometry(Terrain *pTerrain)
pre-compute data in this block.
Definition: TerrainBlock.cpp:730
Definition: TriangleFan.h:8
it represents the quad tree node of LOD terrain data
Definition: TerrainBlock.h:22
This class represents a single, contiguous chunk of terrain and is the primary public interface to De...
Definition: Terrain.h:386
A ray is a half-line P(t) = mOrig + mDir * t, with 0 <= t <= +infinity.
Definition: ShapeRay.h:11
bool UpdateHoles(Terrain *pTerrain)
update holes in the terrain.
Definition: TerrainBlock.cpp:142
Definition: TriangleStrip.h:9
void Tessellate(uint32 *pCountStrips, Terrain *pTerrain)
generate triangles for rendering in higher LOD.
Definition: TerrainBlock.cpp:179