|
@@ -47,93 +47,6 @@ void Chunk::api(char* message)
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
- case 1: // update light
|
|
|
- {
|
|
|
- int index = *(int*)(message + 1);
|
|
|
- Framework::Vec3<int> location((index / WORLD_HEIGHT) / CHUNK_SIZE,
|
|
|
- (index / WORLD_HEIGHT) % CHUNK_SIZE,
|
|
|
- index % WORLD_HEIGHT);
|
|
|
- for (int i = 0; i < 6; i++)
|
|
|
- {
|
|
|
- Framework::Vec3<int> pos
|
|
|
- = location + getDirection(getDirectionFromIndex(i));
|
|
|
- if (pos.z >= 0 && pos.z < WORLD_HEIGHT)
|
|
|
- {
|
|
|
- if (pos.x >= 0 && pos.x < CHUNK_SIZE && pos.y >= 0
|
|
|
- && pos.y < CHUNK_SIZE)
|
|
|
- {
|
|
|
- pos.x += this->location.x - CHUNK_SIZE / 2;
|
|
|
- pos.y += this->location.y - CHUNK_SIZE / 2;
|
|
|
- Block* zB = zBlockAt(pos);
|
|
|
- if (zB)
|
|
|
- {
|
|
|
- bool visible = zB->isVisible();
|
|
|
- zB->setLightData(
|
|
|
- getOppositeDirection(getDirectionFromIndex(i)),
|
|
|
- (unsigned char*)(message + 5));
|
|
|
- if (zB->isVisible() != visible)
|
|
|
- {
|
|
|
- vcs.lock();
|
|
|
- if (zB->isVisible())
|
|
|
- visibleBlocks.add(zB);
|
|
|
- else
|
|
|
- {
|
|
|
- for (Framework::Iterator<Block*> iterator
|
|
|
- = visibleBlocks.begin();
|
|
|
- iterator;
|
|
|
- iterator++)
|
|
|
- {
|
|
|
- if (zB == (Block*)iterator)
|
|
|
- {
|
|
|
- iterator.remove();
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- vcs.unlock();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- pos.x += this->location.x - CHUNK_SIZE / 2;
|
|
|
- pos.y += this->location.y - CHUNK_SIZE / 2;
|
|
|
- Block* zB = World::INSTANCE->zBlockAt(pos);
|
|
|
- if (zB)
|
|
|
- {
|
|
|
- bool visible = zB->isVisible();
|
|
|
- zB->setLightData(
|
|
|
- getOppositeDirection(getDirectionFromIndex(i)),
|
|
|
- (unsigned char*)(message + 5));
|
|
|
- if (zB->isVisible() != visible)
|
|
|
- {
|
|
|
- Chunk* c = World::INSTANCE->zChunk(
|
|
|
- World::INSTANCE->getChunkCenter(
|
|
|
- pos.x, pos.y));
|
|
|
- c->vcs.lock();
|
|
|
- if (zB->isVisible())
|
|
|
- c->visibleBlocks.add(zB);
|
|
|
- else
|
|
|
- {
|
|
|
- for (Framework::Iterator<Block*> iterator
|
|
|
- = c->visibleBlocks.begin();
|
|
|
- iterator;
|
|
|
- iterator++)
|
|
|
- {
|
|
|
- if (zB == (Block*)iterator)
|
|
|
- {
|
|
|
- iterator.remove();
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- c->vcs.unlock();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -179,11 +92,13 @@ void Chunk::setBlock(Block* block)
|
|
|
}
|
|
|
}
|
|
|
blocks.add(block);
|
|
|
+ cs.unlock();
|
|
|
+ vcs.lock();
|
|
|
if (block->isVisible())
|
|
|
{
|
|
|
visibleBlocks.add(block);
|
|
|
}
|
|
|
- cs.unlock();
|
|
|
+ vcs.unlock();
|
|
|
}
|
|
|
|
|
|
void Chunk::removeBlock(Block* zBlock)
|
|
@@ -239,6 +154,12 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
blocks.add(b);
|
|
|
blockCache.set((char*)&index, 4, dynamic_cast<Block*>(b->getThis()));
|
|
|
cs.unlock();
|
|
|
+ vcs.lock();
|
|
|
+ if (b->isVisible())
|
|
|
+ {
|
|
|
+ visibleBlocks.add(b);
|
|
|
+ }
|
|
|
+ vcs.unlock();
|
|
|
}
|
|
|
zReader->lese((char*)&id, 2);
|
|
|
}
|
|
@@ -246,57 +167,109 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
// light
|
|
|
zReader->lese((char*)&index, 4);
|
|
|
char lightData[6];
|
|
|
- while (index >= 0)
|
|
|
+ while (index >= -1)
|
|
|
{
|
|
|
- zReader->lese(lightData, 6);
|
|
|
- Framework::Vec3<int> location((index / WORLD_HEIGHT) / CHUNK_SIZE,
|
|
|
- (index / WORLD_HEIGHT) % CHUNK_SIZE,
|
|
|
- index % WORLD_HEIGHT);
|
|
|
- for (int i = 0; i < 6; i++)
|
|
|
+ if (index == -1)
|
|
|
+ {
|
|
|
+ int x = 0;
|
|
|
+ int y = 0;
|
|
|
+ int z = 0;
|
|
|
+ zReader->lese((char*)&x, 4);
|
|
|
+ zReader->lese((char*)&y, 4);
|
|
|
+ zReader->lese((char*)&z, 4);
|
|
|
+ zReader->lese(lightData, 6);
|
|
|
+ if (x == -1)
|
|
|
+ {
|
|
|
+ int cacheIndex
|
|
|
+ = y * WORLD_HEIGHT + z;
|
|
|
+ Block* zB = blockCache.z((char*)&cacheIndex, 4);
|
|
|
+ if (zB)
|
|
|
+ {
|
|
|
+ zB->setLightData(WEST, (unsigned char*)lightData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (y == -1)
|
|
|
+ {
|
|
|
+ int cacheIndex = (x * CHUNK_SIZE) * WORLD_HEIGHT + z;
|
|
|
+ Block* zB = blockCache.z((char*)&cacheIndex, 4);
|
|
|
+ if (zB)
|
|
|
+ {
|
|
|
+ zB->setLightData(NORTH, (unsigned char*)lightData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (x == CHUNK_SIZE)
|
|
|
+ {
|
|
|
+ int cacheIndex = ((CHUNK_SIZE - 1) * CHUNK_SIZE + y) * WORLD_HEIGHT + z;
|
|
|
+ Block* zB = blockCache.z((char*)&cacheIndex, 4);
|
|
|
+ if (zB)
|
|
|
+ {
|
|
|
+ zB->setLightData(EAST, (unsigned char*)lightData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (y == CHUNK_SIZE)
|
|
|
+ {
|
|
|
+ int cacheIndex
|
|
|
+ = (x * CHUNK_SIZE + (CHUNK_SIZE - 1)) * WORLD_HEIGHT + z;
|
|
|
+ Block* zB = blockCache.z((char*)&cacheIndex, 4);
|
|
|
+ if (zB)
|
|
|
+ {
|
|
|
+ zB->setLightData(SOUTH, (unsigned char*)lightData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- Framework::Vec3<int> pos
|
|
|
- = location + getDirection(getDirectionFromIndex(i));
|
|
|
- if (pos.z >= 0 && pos.z < WORLD_HEIGHT)
|
|
|
+ zReader->lese(lightData, 6);
|
|
|
+ Framework::Vec3<int> location((index / WORLD_HEIGHT) / CHUNK_SIZE,
|
|
|
+ (index / WORLD_HEIGHT) % CHUNK_SIZE,
|
|
|
+ index % WORLD_HEIGHT);
|
|
|
+ for (int i = 0; i < 6; i++)
|
|
|
{
|
|
|
- if (pos.x >= 0 && pos.x < CHUNK_SIZE && pos.y >= 0
|
|
|
- && pos.y < CHUNK_SIZE)
|
|
|
+ Framework::Vec3<int> pos
|
|
|
+ = location + getDirection(getDirectionFromIndex(i));
|
|
|
+ if (pos.z >= 0 && pos.z < WORLD_HEIGHT)
|
|
|
{
|
|
|
- int cacheIndex
|
|
|
- = (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT + pos.z;
|
|
|
- Block* zB
|
|
|
- = blockCache.z((char*)&cacheIndex, 4);
|
|
|
- if (zB)
|
|
|
+ if (pos.x >= 0 && pos.x < CHUNK_SIZE && pos.y >= 0
|
|
|
+ && pos.y < CHUNK_SIZE)
|
|
|
{
|
|
|
- bool visible = zB->isVisible();
|
|
|
- zB->setLightData(
|
|
|
- getOppositeDirection(getDirectionFromIndex(i)),
|
|
|
- (unsigned char*)lightData);
|
|
|
- if (zB->isVisible() && !visible)
|
|
|
+ int cacheIndex
|
|
|
+ = (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT
|
|
|
+ + pos.z;
|
|
|
+ Block* zB = blockCache.z((char*)&cacheIndex, 4);
|
|
|
+ if (zB)
|
|
|
{
|
|
|
- vcs.lock();
|
|
|
- visibleBlocks.add(zB);
|
|
|
- vcs.unlock();
|
|
|
+ bool visible = zB->isVisible();
|
|
|
+ zB->setLightData(
|
|
|
+ getOppositeDirection(getDirectionFromIndex(i)),
|
|
|
+ (unsigned char*)lightData);
|
|
|
+ if (zB->isVisible() && !visible)
|
|
|
+ {
|
|
|
+ vcs.lock();
|
|
|
+ visibleBlocks.add(zB);
|
|
|
+ vcs.unlock();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- pos.x += this->location.x - CHUNK_SIZE / 2;
|
|
|
- pos.y += this->location.y - CHUNK_SIZE / 2;
|
|
|
- Block* zB = World::INSTANCE->zBlockAt(pos);
|
|
|
- if (zB)
|
|
|
+ else
|
|
|
{
|
|
|
- bool visible = zB->isVisible();
|
|
|
- zB->setLightData(
|
|
|
- getOppositeDirection(getDirectionFromIndex(i)),
|
|
|
- (unsigned char*)lightData);
|
|
|
- if (zB->isVisible() && !visible)
|
|
|
+ pos.x += this->location.x - CHUNK_SIZE / 2;
|
|
|
+ pos.y += this->location.y - CHUNK_SIZE / 2;
|
|
|
+ Block* zB = World::INSTANCE->zBlockAt(pos);
|
|
|
+ if (zB)
|
|
|
{
|
|
|
- Chunk* c = World::INSTANCE->zChunk(
|
|
|
- World::INSTANCE->getChunkCenter(pos.x, pos.y));
|
|
|
- c->vcs.lock();
|
|
|
- c->visibleBlocks.add(zB);
|
|
|
- c->vcs.unlock();
|
|
|
+ bool visible = zB->isVisible();
|
|
|
+ zB->setLightData(
|
|
|
+ getOppositeDirection(getDirectionFromIndex(i)),
|
|
|
+ (unsigned char*)lightData);
|
|
|
+ if (zB->isVisible() && !visible)
|
|
|
+ {
|
|
|
+ Chunk* c = World::INSTANCE->zChunk(
|
|
|
+ World::INSTANCE->getChunkCenter(
|
|
|
+ pos.x, pos.y));
|
|
|
+ c->vcs.lock();
|
|
|
+ c->visibleBlocks.add(zB);
|
|
|
+ c->vcs.unlock();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -307,6 +280,27 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
isLoading = 0;
|
|
|
}
|
|
|
|
|
|
+void Chunk::blockVisibilityChanged(Block* zB)
|
|
|
+{
|
|
|
+ vcs.lock();
|
|
|
+ if (zB->isVisible())
|
|
|
+ visibleBlocks.add(zB);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for (Framework::Iterator<Block*> iterator = visibleBlocks.begin();
|
|
|
+ iterator;
|
|
|
+ iterator++)
|
|
|
+ {
|
|
|
+ if (zB == (Block*)iterator)
|
|
|
+ {
|
|
|
+ iterator.remove();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ vcs.unlock();
|
|
|
+}
|
|
|
+
|
|
|
Framework::Punkt Chunk::getCenter() const
|
|
|
{
|
|
|
return location;
|