|
@@ -37,11 +37,11 @@ Chunk::Chunk(Framework::Punkt location)
|
|
|
ground->setPosition(
|
|
|
(float)location.x, (float)location.y, (float)WORLD_HEIGHT / 2.f);
|
|
|
ground->tick(0);
|
|
|
- groundModel = new ChunkGroundModel(ground, this);
|
|
|
+ ChunkModelBuilder* groundModel = new ChunkGroundModel(ground, this);
|
|
|
+ modelBuilders.add(groundModel);
|
|
|
FactoryCraftModel* transparentGround = new FactoryCraftModel();
|
|
|
- chunkModel
|
|
|
- = uiFactory.initParam.bildschirm->zGraphicsApi()->getModel(
|
|
|
- Text("transparent_chunk_ground_") + location.x + location.y);
|
|
|
+ chunkModel = uiFactory.initParam.bildschirm->zGraphicsApi()->getModel(
|
|
|
+ Text("transparent_chunk_ground_") + location.x + location.y);
|
|
|
if (!chunkModel)
|
|
|
{
|
|
|
chunkModel
|
|
@@ -56,8 +56,9 @@ Chunk::Chunk(Framework::Punkt location)
|
|
|
transparentGround->setPosition(
|
|
|
(float)location.x, (float)location.y, (float)WORLD_HEIGHT / 2.f);
|
|
|
transparentGround->tick(0);
|
|
|
- transparentGroundModel
|
|
|
+ ChunkModelBuilder* transparentGroundModel
|
|
|
= new TransparentChunkGroundModel(transparentGround, this);
|
|
|
+ modelBuilders.add(transparentGroundModel);
|
|
|
FactoryCraftModel* fluids = new FactoryCraftModel();
|
|
|
chunkModel = uiFactory.initParam.bildschirm->zGraphicsApi()->getModel(
|
|
|
Text("chunk_fluids_") + location.x + location.y);
|
|
@@ -75,16 +76,18 @@ Chunk::Chunk(Framework::Punkt location)
|
|
|
fluids->setPosition(
|
|
|
(float)location.x, (float)location.y, (float)WORLD_HEIGHT / 2.f);
|
|
|
fluids->tick(0);
|
|
|
- fluidModel = new ChunkFluidModel(fluids, this);
|
|
|
+ ChunkModelBuilder* fluidModel = new ChunkFluidModel(fluids, this);
|
|
|
+ modelBuilders.add(fluidModel);
|
|
|
}
|
|
|
|
|
|
Chunk::Chunk(Framework::Punkt location, Framework::StreamReader* zReader)
|
|
|
: Chunk(location)
|
|
|
{
|
|
|
load(zReader);
|
|
|
- buildModel(groundModel);
|
|
|
- buildModel(transparentGroundModel);
|
|
|
- buildModel(fluidModel);
|
|
|
+ for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
+ {
|
|
|
+ buildModel(builder);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
Chunk::~Chunk()
|
|
@@ -103,9 +106,6 @@ Chunk::~Chunk()
|
|
|
}
|
|
|
}
|
|
|
delete[] blocks;
|
|
|
- groundModel->release();
|
|
|
- transparentGroundModel->release();
|
|
|
- fluidModel->release();
|
|
|
}
|
|
|
|
|
|
void Chunk::appendAnimation(
|
|
@@ -331,17 +331,18 @@ void Chunk::renderSolid(std::function<void(Model3D*)> f)
|
|
|
CustomDX11API* api
|
|
|
= (CustomDX11API*)uiFactory.initParam.bildschirm->zGraphicsApi();
|
|
|
api->setCullBack(false);
|
|
|
- f(groundModel->zModel());
|
|
|
+ for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
+ {
|
|
|
+ if (!builder->isTransparent())
|
|
|
+ {
|
|
|
+ f(builder->zModel());
|
|
|
+ }
|
|
|
+ }
|
|
|
api->setCullBack(true);
|
|
|
float dist = 0.f;
|
|
|
- if (api->isInFrustrum(groundModel->zModel()->getPos(),
|
|
|
- (CHUNK_SIZE / 2.f, CHUNK_SIZE / 2.f, WORLD_HEIGHT / 2.f),
|
|
|
- &dist))
|
|
|
+ for (Block* b : visibleBlocks)
|
|
|
{
|
|
|
- for (Block* b : visibleBlocks)
|
|
|
- {
|
|
|
- f(b);
|
|
|
- }
|
|
|
+ f(b);
|
|
|
}
|
|
|
vcs.unlock();
|
|
|
}
|
|
@@ -351,8 +352,13 @@ void Chunk::renderTransparent(std::function<void(Model3D*)> f)
|
|
|
CustomDX11API* api
|
|
|
= (CustomDX11API*)uiFactory.initParam.bildschirm->zGraphicsApi();
|
|
|
api->setCullBack(false);
|
|
|
- f(transparentGroundModel->zModel());
|
|
|
- f(fluidModel->zModel());
|
|
|
+ for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
+ {
|
|
|
+ if (builder->isTransparent())
|
|
|
+ {
|
|
|
+ f(builder->zModel());
|
|
|
+ }
|
|
|
+ }
|
|
|
api->setCullBack(true);
|
|
|
}
|
|
|
|
|
@@ -360,21 +366,21 @@ bool Chunk::tick(std::function<void(Model3D*)> f, double time)
|
|
|
{
|
|
|
acs.lock();
|
|
|
vcs.lock(); // TODO: enshure no dead lock occures
|
|
|
- if ((modelChanged | CombinedModels::GROUND) == modelChanged)
|
|
|
- buildModel(groundModel);
|
|
|
- if ((modelChanged | CombinedModels::TRANSPARENT_GROUND) == modelChanged)
|
|
|
- buildModel(transparentGroundModel);
|
|
|
- if ((modelChanged | CombinedModels::FLUID) == modelChanged)
|
|
|
- buildModel(fluidModel);
|
|
|
- if ((lightChanged | CombinedModels::GROUND) == lightChanged)
|
|
|
- updateLight(groundModel);
|
|
|
- if ((lightChanged | CombinedModels::TRANSPARENT_GROUND) == lightChanged)
|
|
|
- updateLight(transparentGroundModel);
|
|
|
- if ((lightChanged | CombinedModels::FLUID) == lightChanged)
|
|
|
- updateLight(fluidModel);
|
|
|
- bool res = groundModel->zModel()->tick(time);
|
|
|
- res |= transparentGroundModel->zModel()->tick(time);
|
|
|
- res |= fluidModel->zModel()->tick(time);
|
|
|
+ for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
+ {
|
|
|
+ if ((modelChanged | builder->getType()) == modelChanged)
|
|
|
+ buildModel(builder);
|
|
|
+ }
|
|
|
+ for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
+ {
|
|
|
+ if ((lightChanged | builder->getType()) == modelChanged)
|
|
|
+ updateLight(builder);
|
|
|
+ }
|
|
|
+ bool res = 0;
|
|
|
+ for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
+ {
|
|
|
+ res |= builder->zModel()->tick(time);
|
|
|
+ }
|
|
|
auto iterator = animations.begin();
|
|
|
while (iterator)
|
|
|
{
|
|
@@ -401,27 +407,16 @@ bool Chunk::tick(std::function<void(Model3D*)> f, double time)
|
|
|
|
|
|
void Chunk::destroy()
|
|
|
{
|
|
|
- Model3DData* chunkModel = groundModel->zModel()->zModelData();
|
|
|
- // remove old model
|
|
|
- while (chunkModel->getPolygonAnzahl() > 0)
|
|
|
+ for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
{
|
|
|
- chunkModel->removePolygon(0);
|
|
|
- }
|
|
|
- chunkModel->setVertecies(0, 0);
|
|
|
- chunkModel = transparentGroundModel->zModel()->zModelData();
|
|
|
- // remove old model
|
|
|
- while (chunkModel->getPolygonAnzahl() > 0)
|
|
|
- {
|
|
|
- chunkModel->removePolygon(0);
|
|
|
- }
|
|
|
- chunkModel->setVertecies(0, 0);
|
|
|
- chunkModel = fluidModel->zModel()->zModelData();
|
|
|
- // remove old model
|
|
|
- while (chunkModel->getPolygonAnzahl() > 0)
|
|
|
- {
|
|
|
- chunkModel->removePolygon(0);
|
|
|
+ Model3DData* chunkModel = builder->zModel()->zModelData();
|
|
|
+ // remove old model
|
|
|
+ while (chunkModel->getPolygonAnzahl() > 0)
|
|
|
+ {
|
|
|
+ chunkModel->removePolygon(0);
|
|
|
+ }
|
|
|
+ chunkModel->setVertecies(0, 0);
|
|
|
}
|
|
|
- chunkModel->setVertecies(0, 0);
|
|
|
}
|
|
|
|
|
|
void Chunk::api(char* message)
|
|
@@ -494,20 +489,19 @@ void Chunk::setBlock(Block* block)
|
|
|
if (pos.x < 0) pos.x += CHUNK_SIZE;
|
|
|
if (pos.y < 0) pos.y += CHUNK_SIZE;
|
|
|
int index = (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT + pos.z;
|
|
|
- bool newAffectsGround
|
|
|
- = block
|
|
|
- && (block->zBlockType()->getModelInfo().getModelName().istGleich("cube")
|
|
|
- || block->zBlockType()->getModelInfo().getModelName().istGleich(
|
|
|
- "grass"));
|
|
|
- bool affectsGround
|
|
|
- = blocks[index]
|
|
|
- && (blocks[index]->zBlockType()->getModelInfo().getModelName().istGleich(
|
|
|
- "cube")
|
|
|
- || blocks[index]
|
|
|
- ->zBlockType()
|
|
|
- ->getModelInfo()
|
|
|
- .getModelName()
|
|
|
- .istGleich("grass"));
|
|
|
+ int affectsGround = 0;
|
|
|
+ int newAffectsGround = 0;
|
|
|
+ for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
+ {
|
|
|
+ if (block && builder->isPartOfModel(block))
|
|
|
+ {
|
|
|
+ newAffectsGround |= builder->getType();
|
|
|
+ }
|
|
|
+ if (blocks[index] && builder->isPartOfModel(blocks[index]))
|
|
|
+ {
|
|
|
+ affectsGround |= builder->getType();
|
|
|
+ }
|
|
|
+ }
|
|
|
if (blocks[index])
|
|
|
{
|
|
|
vcs.lock();
|
|
@@ -525,10 +519,7 @@ void Chunk::setBlock(Block* block)
|
|
|
blocks[index] = block;
|
|
|
cs.unlock();
|
|
|
vcs.lock();
|
|
|
- if (affectsGround || newAffectsGround)
|
|
|
- {
|
|
|
- modelChanged = 1;
|
|
|
- }
|
|
|
+ modelChanged |= affectsGround | newAffectsGround;
|
|
|
if (block && block->isVisible() && !newAffectsGround)
|
|
|
{
|
|
|
block->tick(0);
|
|
@@ -540,10 +531,7 @@ void Chunk::setBlock(Block* block)
|
|
|
blocks[index] = block;
|
|
|
cs.unlock();
|
|
|
vcs.lock();
|
|
|
- if (affectsGround || newAffectsGround)
|
|
|
- {
|
|
|
- modelChanged = 1;
|
|
|
- }
|
|
|
+ modelChanged |= affectsGround | newAffectsGround;
|
|
|
if (block && block->isVisible() && !newAffectsGround)
|
|
|
{
|
|
|
block->tick(0);
|