|
@@ -25,6 +25,10 @@ void DimensionGenerator::initialize(int seed)
|
|
{
|
|
{
|
|
this->seed = seed + dimensionId;
|
|
this->seed = seed + dimensionId;
|
|
caveGenerator->initialize(this->seed);
|
|
caveGenerator->initialize(this->seed);
|
|
|
|
+ for (auto biomGen : biomGenerators)
|
|
|
|
+ {
|
|
|
|
+ biomGen->setSeed(this->seed);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
BiomGenerator* DimensionGenerator::zBiomGenerator(int x, int y)
|
|
BiomGenerator* DimensionGenerator::zBiomGenerator(int x, int y)
|
|
@@ -62,6 +66,7 @@ void DimensionGenerator::registerBiom(
|
|
maxTemplateAffectedPosition.z
|
|
maxTemplateAffectedPosition.z
|
|
= MAX(maxTemplateAffectedPosition.z, t->getMaxAffectedOffset().z);
|
|
= MAX(maxTemplateAffectedPosition.z, t->getMaxAffectedOffset().z);
|
|
}
|
|
}
|
|
|
|
+ generator->setSeed(seed);
|
|
}
|
|
}
|
|
|
|
|
|
Framework::RCArray<GeneratedStructure>*
|
|
Framework::RCArray<GeneratedStructure>*
|
|
@@ -86,7 +91,7 @@ DimensionGenerator::getGeneratedStructoresForArea(
|
|
{
|
|
{
|
|
BiomGenerator* biom = zBiomGenerator(x, y);
|
|
BiomGenerator* biom = zBiomGenerator(x, y);
|
|
int height = MIN_AIR_LEVEL
|
|
int height = MIN_AIR_LEVEL
|
|
- + (int)(biom->zHeightMapNoise(seed)->getNoise(
|
|
|
|
|
|
+ + (int)(biom->zHeightMapNoise()->getNoise(
|
|
(double)(x), (double)(y), 0.0)
|
|
(double)(x), (double)(y), 0.0)
|
|
* (MAX_AIR_LEVEL - MIN_AIR_LEVEL));
|
|
* (MAX_AIR_LEVEL - MIN_AIR_LEVEL));
|
|
for (int z = minSearchZ; z <= maxSearchZ; z++)
|
|
for (int z = minSearchZ; z <= maxSearchZ; z++)
|
|
@@ -122,6 +127,16 @@ DimensionGenerator::getGeneratedStructoresForArea(
|
|
|
|
|
|
Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
|
|
Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
|
|
{
|
|
{
|
|
|
|
+ std::cout << "generating chunk " << centerX << ", " << centerY << "\n";
|
|
|
|
+ double structureTime = 0;
|
|
|
|
+ double caveTime = 0;
|
|
|
|
+ double blockGenTime = 0;
|
|
|
|
+ double biomTime = 0;
|
|
|
|
+ double heightTime = 0;
|
|
|
|
+ ZeitMesser zm;
|
|
|
|
+ ZeitMesser zmGlobal;
|
|
|
|
+ zm.messungStart();
|
|
|
|
+ zmGlobal.messungStart();
|
|
Framework::RCArray<GeneratedStructure>* structures
|
|
Framework::RCArray<GeneratedStructure>* structures
|
|
= getGeneratedStructoresForArea(
|
|
= getGeneratedStructoresForArea(
|
|
Framework::Vec3<int>(
|
|
Framework::Vec3<int>(
|
|
@@ -129,20 +144,28 @@ Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
|
|
Framework::Vec3<int>(centerX + CHUNK_SIZE / 2,
|
|
Framework::Vec3<int>(centerX + CHUNK_SIZE / 2,
|
|
centerY + CHUNK_SIZE / 2,
|
|
centerY + CHUNK_SIZE / 2,
|
|
WORLD_HEIGHT - 1));
|
|
WORLD_HEIGHT - 1));
|
|
- std::cout << "generating chunk " << centerX << ", " << centerY << "\n";
|
|
|
|
|
|
+ zm.messungEnde();
|
|
|
|
+ structureTime += zm.getSekunden();
|
|
|
|
+ zm.messungStart();
|
|
CaveChunkGenerator* caveGen
|
|
CaveChunkGenerator* caveGen
|
|
= caveGenerator->getGeneratorForChunk(centerX, centerY);
|
|
= caveGenerator->getGeneratorForChunk(centerX, centerY);
|
|
|
|
+ zm.messungEnde();
|
|
|
|
+ caveTime += zm.getSekunden();
|
|
Chunk* chunk = new Chunk(Framework::Punkt(centerX, centerY), dimensionId);
|
|
Chunk* chunk = new Chunk(Framework::Punkt(centerX, centerY), dimensionId);
|
|
for (int x = -CHUNK_SIZE / 2; x < CHUNK_SIZE / 2; x++)
|
|
for (int x = -CHUNK_SIZE / 2; x < CHUNK_SIZE / 2; x++)
|
|
{
|
|
{
|
|
for (int y = -CHUNK_SIZE / 2; y < CHUNK_SIZE / 2; y++)
|
|
for (int y = -CHUNK_SIZE / 2; y < CHUNK_SIZE / 2; y++)
|
|
{
|
|
{
|
|
|
|
+ zm.messungStart();
|
|
BiomGenerator* biom = zBiomGenerator(x + centerX, y + centerY);
|
|
BiomGenerator* biom = zBiomGenerator(x + centerX, y + centerY);
|
|
|
|
+ zm.messungEnde();
|
|
|
|
+ biomTime += zm.getSekunden();
|
|
// TODO: use Noise interpolator for height map between different
|
|
// TODO: use Noise interpolator for height map between different
|
|
// bioms
|
|
// bioms
|
|
|
|
+ zm.messungStart();
|
|
int height
|
|
int height
|
|
= MIN_AIR_LEVEL
|
|
= MIN_AIR_LEVEL
|
|
- + (int)(biom->zHeightMapNoise(seed)->getNoise(
|
|
|
|
|
|
+ + (int)(biom->zHeightMapNoise()->getNoise(
|
|
(double)(x + centerX), (double)(y + centerY), 0.0)
|
|
(double)(x + centerX), (double)(y + centerY), 0.0)
|
|
* (MAX_AIR_LEVEL - MIN_AIR_LEVEL));
|
|
* (MAX_AIR_LEVEL - MIN_AIR_LEVEL));
|
|
int maxSurfaceHeight
|
|
int maxSurfaceHeight
|
|
@@ -153,28 +176,41 @@ Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
|
|
int actualSurfaceHeight
|
|
int actualSurfaceHeight
|
|
= (int)((float)maxSurfaceHeight * (1.f - VARIABLE_SURFACE_PART)
|
|
= (int)((float)maxSurfaceHeight * (1.f - VARIABLE_SURFACE_PART)
|
|
+ ((float)maxSurfaceHeight * VARIABLE_SURFACE_PART
|
|
+ ((float)maxSurfaceHeight * VARIABLE_SURFACE_PART
|
|
- * (float)biom->zHeightMapNoise(seed)->getNoise(
|
|
|
|
|
|
+ * (float)biom->zHeightMapNoise()->getNoise(
|
|
(double)(x + centerX),
|
|
(double)(x + centerX),
|
|
(double)(y + centerY),
|
|
(double)(y + centerY),
|
|
10.0)));
|
|
10.0)));
|
|
|
|
+ zm.messungEnde();
|
|
|
|
+ heightTime += zm.getSekunden();
|
|
for (int z = 0; z < WORLD_HEIGHT; z++)
|
|
for (int z = 0; z < WORLD_HEIGHT; z++)
|
|
{
|
|
{
|
|
Framework::Either<Block*, int> generated = BlockTypeEnum::AIR;
|
|
Framework::Either<Block*, int> generated = BlockTypeEnum::AIR;
|
|
bool structureAffected = 0;
|
|
bool structureAffected = 0;
|
|
for (auto structure : *structures)
|
|
for (auto structure : *structures)
|
|
{
|
|
{
|
|
|
|
+ zm.messungStart();
|
|
if (structure->isBlockAffected(
|
|
if (structure->isBlockAffected(
|
|
Framework::Vec3<int>(x + centerX, y + centerY, z)))
|
|
Framework::Vec3<int>(x + centerX, y + centerY, z)))
|
|
{
|
|
{
|
|
generated = structure->generateBlockAt(
|
|
generated = structure->generateBlockAt(
|
|
Framework::Vec3<int>(x + centerX, y + centerY, z));
|
|
Framework::Vec3<int>(x + centerX, y + centerY, z));
|
|
structureAffected = 1;
|
|
structureAffected = 1;
|
|
|
|
+ zm.messungEnde();
|
|
|
|
+ structureTime += zm.getSekunden();
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ zm.messungEnde();
|
|
|
|
+ structureTime += zm.getSekunden();
|
|
}
|
|
}
|
|
if (!structureAffected)
|
|
if (!structureAffected)
|
|
{
|
|
{
|
|
- if (caveGen->isInCave(x + centerX, y + centerY, z))
|
|
|
|
|
|
+ zm.messungStart();
|
|
|
|
+ bool inCave
|
|
|
|
+ = caveGen->isInCave(x + centerX, y + centerY, z);
|
|
|
|
+ zm.messungEnde();
|
|
|
|
+ caveTime += zm.getSekunden();
|
|
|
|
+ zm.messungStart();
|
|
|
|
+ if (inCave)
|
|
generated = biom->generateCaveBlock(
|
|
generated = biom->generateCaveBlock(
|
|
x + centerX, y + centerY, z);
|
|
x + centerX, y + centerY, z);
|
|
else if (z < height && z >= height - actualSurfaceHeight)
|
|
else if (z < height && z >= height - actualSurfaceHeight)
|
|
@@ -183,6 +219,8 @@ Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
|
|
else if (z < height)
|
|
else if (z < height)
|
|
generated = biom->generateBelowSurfaceBlock(
|
|
generated = biom->generateBelowSurfaceBlock(
|
|
x + centerX, y + centerY, z);
|
|
x + centerX, y + centerY, z);
|
|
|
|
+ zm.messungEnde();
|
|
|
|
+ blockGenTime += zm.getSekunden();
|
|
}
|
|
}
|
|
if (generated.isA())
|
|
if (generated.isA())
|
|
chunk->putBlockAt(
|
|
chunk->putBlockAt(
|
|
@@ -199,6 +237,13 @@ Chunk* DimensionGenerator::generateChunk(int centerX, int centerY)
|
|
}
|
|
}
|
|
caveGen->release();
|
|
caveGen->release();
|
|
structures->release();
|
|
structures->release();
|
|
|
|
+ zmGlobal.messungEnde();
|
|
|
|
+ std::cout << "structureTime: " << structureTime << "\n";
|
|
|
|
+ std::cout << "caveTime: " << caveTime << "\n";
|
|
|
|
+ std::cout << "blockGenTime: " << blockGenTime << "\n";
|
|
|
|
+ std::cout << "biomTime: " << biomTime << "\n";
|
|
|
|
+ std::cout << "heightTime: " << heightTime << "\n";
|
|
|
|
+ std::cout << "totalTime: " << zmGlobal.getSekunden() << "\n";
|
|
return chunk;
|
|
return chunk;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -210,7 +255,7 @@ Framework::Either<Block*, int> DimensionGenerator::generateBlock(
|
|
BiomGenerator* biom = zBiomGenerator(location.x, location.y);
|
|
BiomGenerator* biom = zBiomGenerator(location.x, location.y);
|
|
// TODO: use Noise interpolator for height map between different bioms
|
|
// TODO: use Noise interpolator for height map between different bioms
|
|
int height = MIN_AIR_LEVEL
|
|
int height = MIN_AIR_LEVEL
|
|
- + (int)(biom->zHeightMapNoise(seed)->getNoise(
|
|
|
|
|
|
+ + (int)(biom->zHeightMapNoise()->getNoise(
|
|
(double)(location.x), (double)(location.y), 0.0)
|
|
(double)(location.x), (double)(location.y), 0.0)
|
|
* (MAX_AIR_LEVEL - MIN_AIR_LEVEL));
|
|
* (MAX_AIR_LEVEL - MIN_AIR_LEVEL));
|
|
int maxSurfaceHeight
|
|
int maxSurfaceHeight
|
|
@@ -221,7 +266,7 @@ Framework::Either<Block*, int> DimensionGenerator::generateBlock(
|
|
int actualSurfaceHeight
|
|
int actualSurfaceHeight
|
|
= (int)((float)maxSurfaceHeight * (1.f - VARIABLE_SURFACE_PART)
|
|
= (int)((float)maxSurfaceHeight * (1.f - VARIABLE_SURFACE_PART)
|
|
+ ((float)maxSurfaceHeight * VARIABLE_SURFACE_PART
|
|
+ ((float)maxSurfaceHeight * VARIABLE_SURFACE_PART
|
|
- * (float)biom->zHeightMapNoise(seed)->getNoise(
|
|
|
|
|
|
+ * (float)biom->zHeightMapNoise()->getNoise(
|
|
(double)(location.x), (double)(location.y), 10.0)));
|
|
(double)(location.x), (double)(location.y), 10.0)));
|
|
for (auto structure : *structures)
|
|
for (auto structure : *structures)
|
|
{
|
|
{
|