1111#include " TerrainMeshComponent.h"
1212#include " WaterLavaMeshComponent.h"
1313#include " Texture2D.h"
14+ #include " StaticMeshComponent.h"
15+
16+ // #define DRAW_HEIGHT_FIELD_MESH
1417
1518const int TerrainMeshSizeTiles = 8 ; // 8x8 tiles per terrain mesh
1619
@@ -44,6 +47,9 @@ void TerrainManager::EnterWorld()
4447 InitTerrainMeshList ();
4548 InitWaterLavaMeshList ();
4649 InitHighhlightTilesTexture ();
50+
51+ mHeightField .InitHeightField (gGameWorld .mMapData .mDimensions );
52+ InitHeightFieldDebugMesh ();
4753}
4854
4955void TerrainManager::ClearWorld ()
@@ -54,6 +60,9 @@ void TerrainManager::ClearWorld()
5460
5561 mMeshInvalidatedTiles .clear ();
5662 mHighlightTiles .clear ();
63+
64+ mHeightField .Cleanup ();
65+ FreeHeightFieldDebugMesh ();
5766}
5867
5968void TerrainManager::PreRenderScene ()
@@ -164,6 +173,13 @@ void TerrainManager::UpdateTerrainMesh()
164173 meshComponent->InvalidateMesh ();
165174 }
166175
176+ // update heightfield
177+ for (TerrainTile* currentTile: mMeshInvalidatedTiles )
178+ {
179+ mHeightField .UpdateHeights (currentTile);
180+ }
181+
182+ UpdateHeightFieldDebugMesh ();
167183
168184 // update terrain mesh objects
169185 // for (GameObject* currTerrainMesh: mTerrainMeshArray)
@@ -231,6 +247,16 @@ void TerrainManager::BuildFullTerrainMesh()
231247
232248 ClearInvalidatedTiles ();
233249
250+ // update heightfield
251+ tilesIterator.Reset ();
252+ for (TerrainTile* currMapTile = tilesIterator.NextTile (); currMapTile;
253+ currMapTile = tilesIterator.NextTile ())
254+ {
255+ mHeightField .UpdateHeights (currMapTile);
256+ }
257+
258+ UpdateHeightFieldDebugMesh ();
259+
234260 // update terrain mesh objects
235261 for (GameObject* currTerrainMesh: mTerrainMeshArray )
236262 {
@@ -403,6 +429,57 @@ void TerrainManager::UpdateHighhlightTilesTexture()
403429 mHighlightTilesTexture ->UpdateTexture (0 , pixels);
404430}
405431
432+ void TerrainManager::InitHeightFieldDebugMesh ()
433+ {
434+ #ifndef DRAW_HEIGHT_FIELD_MESH
435+ return ;
436+ #endif
437+ if (mHeightField .IsInitialized ())
438+ {
439+ mHeightFieldDebugMesh = gGameObjectsManager .CreateGameObject ();
440+ StaticMeshComponent* component = mHeightFieldDebugMesh ->AddComponent <StaticMeshComponent>();
441+
442+ MeshMaterial material;
443+ material.mDiffuseTexture = gTexturesManager .mWhiteTexture ;
444+ material.mMaterialColor = Color32_Yellow;
445+ material.mMaterialColor .mA = 200 ;
446+ material.mRenderStates .mIsFaceCullingEnabled = false ;
447+ material.mRenderStates .mPolygonFillMode = ePolygonFillMode_WireFrame;
448+ material.mRenderStates .mIsAlphaBlendEnabled = true ;
449+ component->SetMeshMaterialsCount (1 );
450+ component->SetMeshMaterial (0 , material);
451+ }
452+ }
453+
454+ void TerrainManager::FreeHeightFieldDebugMesh ()
455+ {
456+ #ifndef DRAW_HEIGHT_FIELD_MESH
457+ return ;
458+ #endif
459+ if (mHeightFieldDebugMesh )
460+ {
461+ gGameObjectsManager .DestroyGameObject (mHeightFieldDebugMesh );
462+ mHeightFieldDebugMesh = nullptr ;
463+ }
464+ }
465+
466+ void TerrainManager::UpdateHeightFieldDebugMesh ()
467+ {
468+ #ifndef DRAW_HEIGHT_FIELD_MESH
469+ return ;
470+ #endif
471+ if (mHeightFieldDebugMesh )
472+ {
473+ StaticMeshComponent* component = mHeightFieldDebugMesh ->GetComponent <StaticMeshComponent>();
474+ debug_assert (component);
475+ component->mTriMeshParts .resize (1 );
476+ mHeightField .GenerateMesh (component->mTriMeshParts [0 ]);
477+ component->InvalidateMesh ();
478+ component->UpdateBounds ();
479+ component->PrepareRenderResources ();
480+ }
481+ }
482+
406483GameObject* TerrainManager::CreateObjectTerrain (const Rectangle& mapArea)
407484{
408485 GameObject* gameObject = gGameObjectsManager .CreateGameObject ();
0 commit comments