|
|
@@ -15,7 +15,10 @@ Chunk::Chunk(Framework::Point location)
|
|
|
location(location),
|
|
|
isLoading(0),
|
|
|
lightChanged(0),
|
|
|
- modelChanged(0)
|
|
|
+ modelChanged(0),
|
|
|
+ bLock(),
|
|
|
+ vLock(),
|
|
|
+ aLock()
|
|
|
{
|
|
|
blocks = new Block*[CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT];
|
|
|
memset(blocks, 0, CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT * sizeof(Block*));
|
|
|
@@ -316,24 +319,27 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
World::INSTANCE->getChunkReadLock().lock();
|
|
|
Chunk* c = World::INSTANCE->zChunk(
|
|
|
World::INSTANCE->getChunkCenter(pos.x, pos.y));
|
|
|
- c->getBlockReadLock().lock();
|
|
|
- Block* zB = c ? c->zBlockAt(pos) : 0;
|
|
|
- if (zB)
|
|
|
+ if (c)
|
|
|
{
|
|
|
- bool visible = zB->isVisible();
|
|
|
- zB->setLightData(
|
|
|
- getOppositeDirection(getDirectionFromIndex(i)),
|
|
|
- (unsigned char*)lightData,
|
|
|
- c);
|
|
|
- if (zB->isVisible() && !visible)
|
|
|
+ c->getBlockReadLock().lock();
|
|
|
+ Block* zB = c->zBlockAt(pos);
|
|
|
+ if (zB)
|
|
|
{
|
|
|
- zB->tick(0);
|
|
|
- vLock.lockWrite();
|
|
|
- c->visibleBlocks.add(zB);
|
|
|
- vLock.unlockWrite();
|
|
|
+ bool visible = zB->isVisible();
|
|
|
+ zB->setLightData(getOppositeDirection(
|
|
|
+ getDirectionFromIndex(i)),
|
|
|
+ (unsigned char*)lightData,
|
|
|
+ c);
|
|
|
+ if (zB->isVisible() && !visible)
|
|
|
+ {
|
|
|
+ zB->tick(0);
|
|
|
+ vLock.lockWrite();
|
|
|
+ c->visibleBlocks.add(zB);
|
|
|
+ vLock.unlockWrite();
|
|
|
+ }
|
|
|
}
|
|
|
+ c->getBlockReadLock().unlock();
|
|
|
}
|
|
|
- c->getBlockReadLock().unlock();
|
|
|
World::INSTANCE->getChunkReadLock().unlock();
|
|
|
}
|
|
|
}
|