6 #include <unordered_map>
7 #include <unordered_set>
17 using std::unordered_map;
18 using std::unordered_set;
85 inline static bool getTerrainVertex(
const vector<float>& terrainHeightVector,
int verticesPerX,
int verticesPerZ,
int x,
int z,
Vector3& vertex) {
91 if (x < 0 || x >= verticesPerX)
return false;
92 if (z < 0 || z >= verticesPerZ)
return false;
95 terrainHeightVector[z * verticesPerX + x],
122 inline static bool hasWaterPosition(
const unordered_map<
int, unordered_set<int>>& waterPositionSet,
int x,
int z) {
123 auto waterPositionSetIt = waterPositionSet.find(z);
124 if (waterPositionSetIt == waterPositionSet.end())
return false;
125 auto waterXPositionSetIt = waterPositionSetIt->second.find(x);
126 if (waterXPositionSetIt == waterPositionSetIt->second.end())
return false;
151 inline static bool determineWater(
const vector<float>& terrainHeightVector,
int verticesPerX,
int verticesPerZ,
int x,
int z,
float waterHeight) {
152 if (x < 0 || x >= verticesPerX ||
153 z < 0 || z >= verticesPerZ)
return false;
154 auto vertexIdx = z * verticesPerX + x;
155 auto terrainVertexHeight = terrainHeightVector[vertexIdx];
156 if (terrainVertexHeight >= waterHeight)
return false;
171 inline static void determineWaterXPositionSet(
const vector<float>& terrainHeightVector,
int verticesPerX,
int verticesPerZ,
int x,
int z,
float waterHeight, unordered_set<int>& waterXPositionSet) {
174 while(
true ==
true) {
175 auto terrainHeightVectorX = x + xMin;
176 if (terrainHeightVectorX < 0 || terrainHeightVectorX >= verticesPerX ||
177 z < 0 || z >= verticesPerZ)
break;
178 auto vertexIdx = z * verticesPerX + terrainHeightVectorX;
179 auto terrainVertexHeight = terrainHeightVector[vertexIdx];
180 if (terrainVertexHeight >= waterHeight)
break;
181 waterXPositionSet.insert(terrainHeightVectorX);
184 while(
true ==
true) {
185 auto terrainHeightVectorX = x + xMax;
186 if (terrainHeightVectorX < 0 || terrainHeightVectorX >= verticesPerX ||
187 z < 0 || z >= verticesPerZ)
break;
188 auto vertexIdx = z * verticesPerX + terrainHeightVectorX;
189 auto terrainVertexHeight = terrainHeightVector[vertexIdx];
190 if (terrainVertexHeight >= waterHeight)
break;
191 waterXPositionSet.insert(terrainHeightVectorX);
194 if (waterXPositionSet.size() > 2) {
195 waterXPositionSet.insert(x + xMin - 0);
196 waterXPositionSet.insert(x + xMin - 1);
197 waterXPositionSet.insert(x + xMin - 2);
198 waterXPositionSet.insert(x + xMax + 0);
199 waterXPositionSet.insert(x + xMax + 1);
200 waterXPositionSet.insert(x + xMax + 2);
237 static void createTerrainModels(
float width,
float depth,
float y, vector<float>& terrainHeightVector,
BoundingBox& terrainBoundingBox, vector<Model*>& terrainModels,
bool createLODLevels =
false);
254 vector<Model*>& terrainModels,
255 vector<float>& terrainHeightVector,
256 const Vector3& brushCenterPosition,
261 float flattenHeight = 0.0f
279 vector<Model*>& terrainModels,
280 vector<float>& terrainHeightVector,
281 const Vector3& brushCenterPosition,
285 float flattenHeightMin,
286 float flattenHeightMax
300 vector<float>& terrainHeightVector,
301 const Vector3& brushCenterPosition,
302 const FoliageBrush& foliageBrush,
303 vector<unordered_map<
int, vector<Transform>>>& foliageMaps,
304 unordered_set<int>& updateFoliagePartitions
320 vector<float>& terrainHeightVector,
321 const Vector3& brushCenterPosition,
325 vector<unordered_map<
int, vector<Transform>>>& foliageMaps,
326 unordered_set<int>& updateFoliagePartitions
339 const vector<float>& terrainHeightVector,
340 const Vector3& brushCenterPosition,
342 unordered_map<
int, unordered_set<int>>& waterPositionMap
353 const unordered_map<
int, unordered_set<int>>& waterPositionMap,
368 const unordered_map<
int, unordered_set<int>>& waterPositionMap,
371 vector<Model*>& waterModels
384 vector<Model*>& terrainModels,
385 vector<float>& terrainHeightVector,
386 const Vector3& brushCenterPosition,
397 vector<unordered_map<
int, vector<Transform>>>& foliageMaps
409 vector<unordered_map<
int, vector<Transform>>>& foliageMaps
417 vector<unordered_map<
int, vector<Transform>>>& foliageMaps
434 vector<float>& terrainHeightVector,
435 const Vector3& brushCenterPosition,
436 const FoliageBrush& foliageBrush,
437 const vector<FoliageBrushPrototype>& foliageBrushPrototypes,
439 vector<unordered_map<
int, vector<Transform>>>& foliageMaps,
440 vector<unordered_map<
int, vector<Transform>>>& newFoliageMaps
455 const Vector3& brushCenterPosition,
456 const FoliageBrush& foliageBrush,
457 const vector<FoliageBrushPrototype>& foliageBrushPrototypes,
459 vector<unordered_map<
int, vector<Transform>>>& foliageMaps,
460 unordered_set<int>& recreateFoliagePartitions
477 vector<float>& terrainHeightVector,
478 unordered_map<int, float>& waterPositionMapsHeight,
479 unordered_map<
int, unordered_map<
int, unordered_set<int>>>& waterPositionMaps,
480 vector<unordered_map<
int, vector<Transform>>>& foliageMaps
497 vector<float>& terrainHeightVector,
498 unordered_map<int, float>& waterPositionMapsHeight,
499 unordered_map<
int, unordered_map<
int, unordered_set<int>>>& waterPositionMaps,
500 vector<unordered_map<
int, vector<Transform>>>& foliageMaps
Representation of a 3D model.
Axis aligned bounding box used for frustum, this is not directly connectable with physics engine.
Vector2 class representing vector2 mathematical structure and operations with x, y components.
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Vector3 & set(float x, float y, float z)
Sets this vector3 by its components.
static void applyFoliageBrush(BoundingBox &terrainBoundingBox, vector< float > &terrainHeightVector, const Vector3 &brushCenterPosition, const FoliageBrush &foliageBrush, const vector< FoliageBrushPrototype > &foliageBrushPrototypes, BrushOperation brushOperation, vector< unordered_map< int, vector< Transform >>> &foliageMaps, vector< unordered_map< int, vector< Transform >>> &newFoliageMaps)
Apply foliage brush.
static void getWaterVertex(int x, int z, float waterHeight, Vector3 &vertex)
Get the terrain vertex for given x and z position.
static void applyRampBrushToTerrainModels(BoundingBox &terrainBoundingBox, vector< Model * > &terrainModels, vector< float > &terrainHeightVector, const Vector3 &brushCenterPosition, Texture *brushTexture, float brushRotation, const Vector2 &brushScale, float flattenHeightMin, float flattenHeightMax)
Apply ramp brush to given terrain models.
static void createFoliageMaps(BoundingBox &terrainBoundingBox, vector< unordered_map< int, vector< Transform >>> &foliageMaps)
Create foliage maps.
static void determineWaterXPositionSet(const vector< float > &terrainHeightVector, int verticesPerX, int verticesPerZ, int x, int z, float waterHeight, unordered_set< int > &waterXPositionSet)
Determine if water can be generated from left to right starting with x and z.
static Texture * createTerrainNavigationMap(float width, float depth, vector< float > &terrainHeightVector, float maxNavigationSlope=30.0f)
Create terrain navigation map.
static bool computeWaterPositionMap(BoundingBox &terrainBoundingBox, const vector< float > &terrainHeightVector, const Vector3 &brushCenterPosition, float waterHeight, unordered_map< int, unordered_set< int >> &waterPositionMap)
Compute water positions map using a auto fill like algorithm at given brush center position.
static constexpr float PARTITION_SIZE
static void mirrorXAxis(bool flipZ, float width, float depth, vector< float > &terrainHeightVector, unordered_map< int, float > &waterPositionMapsHeight, unordered_map< int, unordered_map< int, unordered_set< int >>> &waterPositionMaps, vector< unordered_map< int, vector< Transform >>> &foliageMaps)
Mirror terrain around X axis.
static void updateFoliageTerrainBrush(BoundingBox &terrainBoundingBox, vector< float > &terrainHeightVector, const Vector3 &brushCenterPosition, const FoliageBrush &foliageBrush, vector< unordered_map< int, vector< Transform >>> &foliageMaps, unordered_set< int > &updateFoliagePartitions)
Update foliage after using terrain brush.
static void updateFoliageTerrainRampBrush(BoundingBox &terrainBoundingBox, vector< float > &terrainHeightVector, const Vector3 &brushCenterPosition, Texture *brushTexture, float brushRotation, const Vector2 &brushScale, vector< unordered_map< int, vector< Transform >>> &foliageMaps, unordered_set< int > &updateFoliagePartitions)
Update foliage after using terrain ramp brush.
static bool determineWater(const vector< float > &terrainHeightVector, int verticesPerX, int verticesPerZ, int x, int z, float waterHeight)
Determine if water can be generated.
static bool getTerrainVertex(const vector< float > &terrainHeightVector, int verticesPerX, int verticesPerZ, int x, int z, Vector3 &vertex)
Get the terrain vertex for given x and z position.
static void createTerrainModels(float width, float depth, float y, vector< float > &terrainHeightVector, BoundingBox &terrainBoundingBox, vector< Model * > &terrainModels, bool createLODLevels=false)
Create terrain models.
static const Vector3 computeTerrainVertexNormal(const vector< float > &terrainHeightVector, int verticesPerX, int verticesPerZ, int x, int z)
Compute terrain vertex normal for given x and z position.
static bool getTerrainModelsHeight(BoundingBox &terrainBoundingBox, vector< Model * > &terrainModels, vector< float > &terrainHeightVector, const Vector3 &brushCenterPosition, float &brushHeight)
Get terrain models height for e.g.
static void applyFoliageDeleteBrush(BoundingBox &terrainBoundingBox, const Vector3 &brushCenterPosition, const FoliageBrush &foliageBrush, const vector< FoliageBrushPrototype > &foliageBrushPrototypes, BrushOperation brushOperation, vector< unordered_map< int, vector< Transform >>> &foliageMaps, unordered_set< int > &recreateFoliagePartitions)
Apply foliage delete brush.
static constexpr float STEP_SIZE
static void emptyFoliageMaps(vector< unordered_map< int, vector< Transform >>> &foliageMaps)
Empty foliage maps.
static Vector3 computeWaterReflectionEnvironmentMappingPosition(const unordered_map< int, unordered_set< int >> &waterPositionMap, float waterHeight)
Compute water reflection environment mapping position.
@ BRUSHOPERATION_WATER_ADD
@ BRUSHOPERATION_WATER_DELETE
@ BRUSHOPERATION_SUBTRACT
static bool hasWaterPosition(const unordered_map< int, unordered_set< int >> &waterPositionSet, int x, int z)
static void mirrorZAxis(bool flipX, float width, float depth, vector< float > &terrainHeightVector, unordered_map< int, float > &waterPositionMapsHeight, unordered_map< int, unordered_map< int, unordered_set< int >>> &waterPositionMaps, vector< unordered_map< int, vector< Transform >>> &foliageMaps)
Mirror terrain around Z axis.
static void applyBrushToTerrainModels(BoundingBox &terrainBoundingBox, vector< Model * > &terrainModels, vector< float > &terrainHeightVector, const Vector3 &brushCenterPosition, Texture *brushTexture, float brushScale, float brushStrength, BrushOperation brushOperation, float flattenHeight=0.0f)
Apply brush to given terrain models.
static void getTerrainVertex(int x, int z, Vector3 &vertex)
Get the terrain vertex for given x and z position without providing y component.
static void createWaterModels(BoundingBox &terrainBoundingBox, const unordered_map< int, unordered_set< int >> &waterPositionMap, float waterHeight, int waterModelIdx, vector< Model * > &waterModels)
Create partitioned water models using given water position map.