|
@@ -97,6 +97,7 @@ Chunk::~Chunk()
|
|
|
{
|
|
{
|
|
|
World::INSTANCE->zClient()->chunkAPIRequest(location, &msg, 1);
|
|
World::INSTANCE->zClient()->chunkAPIRequest(location, &msg, 1);
|
|
|
}
|
|
}
|
|
|
|
|
+ bLock.lockWrite();
|
|
|
for (int i = 0; i < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT; i++)
|
|
for (int i = 0; i < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT; i++)
|
|
|
{
|
|
{
|
|
|
if (blocks[i])
|
|
if (blocks[i])
|
|
@@ -106,33 +107,36 @@ Chunk::~Chunk()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
delete[] blocks;
|
|
delete[] blocks;
|
|
|
|
|
+ bLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Chunk::appendAnimation(
|
|
void Chunk::appendAnimation(
|
|
|
Block* zB, int boneId, double time, Vec3<float> pos, Vec3<float> rot)
|
|
Block* zB, int boneId, double time, Vec3<float> pos, Vec3<float> rot)
|
|
|
{
|
|
{
|
|
|
if (!zB->zSkeleton() || !zB->zSkeleton()->zBone(boneId)) return;
|
|
if (!zB->zSkeleton() || !zB->zSkeleton()->zBone(boneId)) return;
|
|
|
- acs.lock();
|
|
|
|
|
|
|
+ aLock.lockRead();
|
|
|
for (BlockAnimation* animation : animations)
|
|
for (BlockAnimation* animation : animations)
|
|
|
{
|
|
{
|
|
|
if (animation->zBlock() == zB)
|
|
if (animation->zBlock() == zB)
|
|
|
{
|
|
{
|
|
|
animation->appendAnimation(boneId, time, pos, rot);
|
|
animation->appendAnimation(boneId, time, pos, rot);
|
|
|
- acs.unlock();
|
|
|
|
|
|
|
+ aLock.unlockRead();
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ aLock.unlockRead();
|
|
|
SkeletonAnimation* sa = new SkeletonAnimation();
|
|
SkeletonAnimation* sa = new SkeletonAnimation();
|
|
|
Bone* bone = zB->zSkeleton()->zBone(boneId);
|
|
Bone* bone = zB->zSkeleton()->zBone(boneId);
|
|
|
sa->addAnimation(boneId, bone->getPosition(), bone->getRotation());
|
|
sa->addAnimation(boneId, bone->getPosition(), bone->getRotation());
|
|
|
sa->addKeyFrame(boneId, time, pos, rot);
|
|
sa->addKeyFrame(boneId, time, pos, rot);
|
|
|
|
|
+ aLock.lockWrite();
|
|
|
animations.add(new BlockAnimation(dynamic_cast<Block*>(zB->getThis()), sa));
|
|
animations.add(new BlockAnimation(dynamic_cast<Block*>(zB->getThis()), sa));
|
|
|
- acs.unlock();
|
|
|
|
|
|
|
+ aLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Chunk::load(Framework::StreamReader* zReader)
|
|
void Chunk::load(Framework::StreamReader* zReader)
|
|
|
{
|
|
{
|
|
|
- cs.lock();
|
|
|
|
|
|
|
+ bLock.lockWrite();
|
|
|
for (int i = 0; i < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT; i++)
|
|
for (int i = 0; i < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT; i++)
|
|
|
{
|
|
{
|
|
|
if (blocks[i])
|
|
if (blocks[i])
|
|
@@ -141,7 +145,7 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
blocks[i] = 0;
|
|
blocks[i] = 0;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- cs.unlock();
|
|
|
|
|
|
|
+ bLock.unlockWrite();
|
|
|
isLoading = 1;
|
|
isLoading = 1;
|
|
|
Framework::Vec3<int> pos = {0, 0, 0};
|
|
Framework::Vec3<int> pos = {0, 0, 0};
|
|
|
unsigned short id;
|
|
unsigned short id;
|
|
@@ -177,7 +181,6 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
}
|
|
}
|
|
|
if (blockTypes[id]->doesNeedInstance())
|
|
if (blockTypes[id]->doesNeedInstance())
|
|
|
{
|
|
{
|
|
|
- cs.lock();
|
|
|
|
|
Block* b = blockTypes[id]->createBlock(
|
|
Block* b = blockTypes[id]->createBlock(
|
|
|
{pos.x + location.x - CHUNK_SIZE / 2,
|
|
{pos.x + location.x - CHUNK_SIZE / 2,
|
|
|
pos.y + location.y - CHUNK_SIZE / 2,
|
|
pos.y + location.y - CHUNK_SIZE / 2,
|
|
@@ -186,9 +189,9 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
speedModifier,
|
|
speedModifier,
|
|
|
dir);
|
|
dir);
|
|
|
b->setFlow(flowOptions, distanceToSource);
|
|
b->setFlow(flowOptions, distanceToSource);
|
|
|
|
|
+ bLock.lockWrite();
|
|
|
blocks[index] = b;
|
|
blocks[index] = b;
|
|
|
- cs.unlock();
|
|
|
|
|
- vcs.lock();
|
|
|
|
|
|
|
+ bLock.unlockWrite();
|
|
|
if (b->isVisible())
|
|
if (b->isVisible())
|
|
|
{
|
|
{
|
|
|
if (!blockTypes[id]->getModelInfo().getModelName().isEqual(
|
|
if (!blockTypes[id]->getModelInfo().getModelName().isEqual(
|
|
@@ -197,11 +200,12 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
"grass"))
|
|
"grass"))
|
|
|
{
|
|
{
|
|
|
b->tick(0);
|
|
b->tick(0);
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
visibleBlocks.add(b);
|
|
visibleBlocks.add(b);
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
count++;
|
|
count++;
|
|
|
- vcs.unlock();
|
|
|
|
|
}
|
|
}
|
|
|
zReader->read((char*)&id, 2);
|
|
zReader->read((char*)&id, 2);
|
|
|
}
|
|
}
|
|
@@ -224,40 +228,48 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
if (x == -1)
|
|
if (x == -1)
|
|
|
{
|
|
{
|
|
|
int cacheIndex = y * WORLD_HEIGHT + z;
|
|
int cacheIndex = y * WORLD_HEIGHT + z;
|
|
|
|
|
+ bLock.lockRead();
|
|
|
Block* zB = blocks[cacheIndex];
|
|
Block* zB = blocks[cacheIndex];
|
|
|
if (zB)
|
|
if (zB)
|
|
|
{
|
|
{
|
|
|
zB->setLightData(WEST, (unsigned char*)lightData, 0);
|
|
zB->setLightData(WEST, (unsigned char*)lightData, 0);
|
|
|
}
|
|
}
|
|
|
|
|
+ bLock.unlockRead();
|
|
|
}
|
|
}
|
|
|
else if (y == -1)
|
|
else if (y == -1)
|
|
|
{
|
|
{
|
|
|
int cacheIndex = (x * CHUNK_SIZE) * WORLD_HEIGHT + z;
|
|
int cacheIndex = (x * CHUNK_SIZE) * WORLD_HEIGHT + z;
|
|
|
|
|
+ bLock.lockRead();
|
|
|
Block* zB = blocks[cacheIndex];
|
|
Block* zB = blocks[cacheIndex];
|
|
|
if (zB)
|
|
if (zB)
|
|
|
{
|
|
{
|
|
|
zB->setLightData(NORTH, (unsigned char*)lightData, 0);
|
|
zB->setLightData(NORTH, (unsigned char*)lightData, 0);
|
|
|
}
|
|
}
|
|
|
|
|
+ bLock.unlockRead();
|
|
|
}
|
|
}
|
|
|
else if (x == CHUNK_SIZE)
|
|
else if (x == CHUNK_SIZE)
|
|
|
{
|
|
{
|
|
|
int cacheIndex
|
|
int cacheIndex
|
|
|
= ((CHUNK_SIZE - 1) * CHUNK_SIZE + y) * WORLD_HEIGHT + z;
|
|
= ((CHUNK_SIZE - 1) * CHUNK_SIZE + y) * WORLD_HEIGHT + z;
|
|
|
|
|
+ bLock.lockRead();
|
|
|
Block* zB = blocks[cacheIndex];
|
|
Block* zB = blocks[cacheIndex];
|
|
|
if (zB)
|
|
if (zB)
|
|
|
{
|
|
{
|
|
|
zB->setLightData(EAST, (unsigned char*)lightData, 0);
|
|
zB->setLightData(EAST, (unsigned char*)lightData, 0);
|
|
|
}
|
|
}
|
|
|
|
|
+ bLock.unlockRead();
|
|
|
}
|
|
}
|
|
|
else if (y == CHUNK_SIZE)
|
|
else if (y == CHUNK_SIZE)
|
|
|
{
|
|
{
|
|
|
int cacheIndex
|
|
int cacheIndex
|
|
|
= (x * CHUNK_SIZE + (CHUNK_SIZE - 1)) * WORLD_HEIGHT + z;
|
|
= (x * CHUNK_SIZE + (CHUNK_SIZE - 1)) * WORLD_HEIGHT + z;
|
|
|
|
|
+ bLock.lockRead();
|
|
|
Block* zB = blocks[cacheIndex];
|
|
Block* zB = blocks[cacheIndex];
|
|
|
if (zB)
|
|
if (zB)
|
|
|
{
|
|
{
|
|
|
zB->setLightData(SOUTH, (unsigned char*)lightData, 0);
|
|
zB->setLightData(SOUTH, (unsigned char*)lightData, 0);
|
|
|
}
|
|
}
|
|
|
|
|
+ bLock.unlockRead();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
@@ -278,6 +290,7 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
int cacheIndex
|
|
int cacheIndex
|
|
|
= (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT
|
|
= (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT
|
|
|
+ pos.z;
|
|
+ pos.z;
|
|
|
|
|
+ bLock.lockRead();
|
|
|
Block* zB = blocks[cacheIndex];
|
|
Block* zB = blocks[cacheIndex];
|
|
|
if (zB)
|
|
if (zB)
|
|
|
{
|
|
{
|
|
@@ -288,19 +301,22 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
0);
|
|
0);
|
|
|
if (zB->isVisible() && !visible)
|
|
if (zB->isVisible() && !visible)
|
|
|
{
|
|
{
|
|
|
- vcs.lock();
|
|
|
|
|
zB->tick(0);
|
|
zB->tick(0);
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
visibleBlocks.add(zB);
|
|
visibleBlocks.add(zB);
|
|
|
- vcs.unlock();
|
|
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ bLock.unlockRead();
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
pos.x += this->location.x - CHUNK_SIZE / 2;
|
|
pos.x += this->location.x - CHUNK_SIZE / 2;
|
|
|
pos.y += this->location.y - CHUNK_SIZE / 2;
|
|
pos.y += this->location.y - CHUNK_SIZE / 2;
|
|
|
|
|
+ World::INSTANCE->getChunkReadLock().lock();
|
|
|
Chunk* c = World::INSTANCE->zChunk(
|
|
Chunk* c = World::INSTANCE->zChunk(
|
|
|
World::INSTANCE->getChunkCenter(pos.x, pos.y));
|
|
World::INSTANCE->getChunkCenter(pos.x, pos.y));
|
|
|
|
|
+ c->getBlockReadLock().lock();
|
|
|
Block* zB = c ? c->zBlockAt(pos) : 0;
|
|
Block* zB = c ? c->zBlockAt(pos) : 0;
|
|
|
if (zB)
|
|
if (zB)
|
|
|
{
|
|
{
|
|
@@ -311,12 +327,14 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
c);
|
|
c);
|
|
|
if (zB->isVisible() && !visible)
|
|
if (zB->isVisible() && !visible)
|
|
|
{
|
|
{
|
|
|
- c->vcs.lock();
|
|
|
|
|
zB->tick(0);
|
|
zB->tick(0);
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
c->visibleBlocks.add(zB);
|
|
c->visibleBlocks.add(zB);
|
|
|
- c->vcs.unlock();
|
|
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ c->getBlockReadLock().unlock();
|
|
|
|
|
+ World::INSTANCE->getChunkReadLock().unlock();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -328,24 +346,19 @@ void Chunk::load(Framework::StreamReader* zReader)
|
|
|
|
|
|
|
|
void Chunk::buildModel(ChunkModelBuilder* builder)
|
|
void Chunk::buildModel(ChunkModelBuilder* builder)
|
|
|
{
|
|
{
|
|
|
- vcs.lock();
|
|
|
|
|
modelChanged &= ~builder->getType();
|
|
modelChanged &= ~builder->getType();
|
|
|
lightChanged &= ~builder->getType();
|
|
lightChanged &= ~builder->getType();
|
|
|
builder->buildModel();
|
|
builder->buildModel();
|
|
|
- vcs.unlock();
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Chunk::updateLight(ChunkModelBuilder* builder)
|
|
void Chunk::updateLight(ChunkModelBuilder* builder)
|
|
|
{
|
|
{
|
|
|
- vcs.lock();
|
|
|
|
|
lightChanged &= ~builder->getType();
|
|
lightChanged &= ~builder->getType();
|
|
|
builder->updateLightning();
|
|
builder->updateLightning();
|
|
|
- vcs.unlock();
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Chunk::renderSolid(std::function<void(Model3D*)> f)
|
|
void Chunk::renderSolid(std::function<void(Model3D*)> f)
|
|
|
{
|
|
{
|
|
|
- vcs.lock();
|
|
|
|
|
CustomDX11API* api
|
|
CustomDX11API* api
|
|
|
= (CustomDX11API*)uiFactory.initParam.bildschirm->zGraphicsApi();
|
|
= (CustomDX11API*)uiFactory.initParam.bildschirm->zGraphicsApi();
|
|
|
api->setCullBack(false);
|
|
api->setCullBack(false);
|
|
@@ -358,11 +371,12 @@ void Chunk::renderSolid(std::function<void(Model3D*)> f)
|
|
|
}
|
|
}
|
|
|
api->setCullBack(true);
|
|
api->setCullBack(true);
|
|
|
float dist = 0.f;
|
|
float dist = 0.f;
|
|
|
|
|
+ vLock.lockRead();
|
|
|
for (Block* b : visibleBlocks)
|
|
for (Block* b : visibleBlocks)
|
|
|
{
|
|
{
|
|
|
f(b);
|
|
f(b);
|
|
|
}
|
|
}
|
|
|
- vcs.unlock();
|
|
|
|
|
|
|
+ vLock.unlockRead();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Chunk::renderTransparent(std::function<void(Model3D*)> f)
|
|
void Chunk::renderTransparent(std::function<void(Model3D*)> f)
|
|
@@ -382,8 +396,6 @@ void Chunk::renderTransparent(std::function<void(Model3D*)> f)
|
|
|
|
|
|
|
|
bool Chunk::tick(std::function<void(Model3D*)> f, double time)
|
|
bool Chunk::tick(std::function<void(Model3D*)> f, double time)
|
|
|
{
|
|
{
|
|
|
- acs.lock();
|
|
|
|
|
- vcs.lock(); // TODO: enshure no dead lock occures
|
|
|
|
|
for (ChunkModelBuilder* builder : modelBuilders)
|
|
for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
{
|
|
{
|
|
|
if ((modelChanged | builder->getType()) == modelChanged)
|
|
if ((modelChanged | builder->getType()) == modelChanged)
|
|
@@ -399,6 +411,7 @@ bool Chunk::tick(std::function<void(Model3D*)> f, double time)
|
|
|
{
|
|
{
|
|
|
res |= builder->zModel()->tick(time);
|
|
res |= builder->zModel()->tick(time);
|
|
|
}
|
|
}
|
|
|
|
|
+ aLock.lockRead();
|
|
|
auto iterator = animations.begin();
|
|
auto iterator = animations.begin();
|
|
|
while (iterator)
|
|
while (iterator)
|
|
|
{
|
|
{
|
|
@@ -407,19 +420,22 @@ bool Chunk::tick(std::function<void(Model3D*)> f, double time)
|
|
|
res |= iterator->zBlock()->tick(time);
|
|
res |= iterator->zBlock()->tick(time);
|
|
|
if (iterator->isFinished())
|
|
if (iterator->isFinished())
|
|
|
{
|
|
{
|
|
|
|
|
+ aLock.lockWrite();
|
|
|
iterator.remove();
|
|
iterator.remove();
|
|
|
|
|
+ aLock.unlockWrite();
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
|
|
+ aLock.lockWrite();
|
|
|
iterator.remove();
|
|
iterator.remove();
|
|
|
|
|
+ aLock.unlockWrite();
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
++iterator;
|
|
++iterator;
|
|
|
}
|
|
}
|
|
|
- vcs.unlock();
|
|
|
|
|
- acs.unlock();
|
|
|
|
|
|
|
+ aLock.unlockRead();
|
|
|
return 1;
|
|
return 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -481,8 +497,10 @@ void Chunk::api(char* message)
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
|
|
+ bLock.lockRead();
|
|
|
Block* zB = zBlockAt(location);
|
|
Block* zB = zBlockAt(location);
|
|
|
if (zB) removeBlock(zB);
|
|
if (zB) removeBlock(zB);
|
|
|
|
|
+ bLock.unlockRead();
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -504,8 +522,10 @@ void Chunk::api(char* message)
|
|
|
index % WORLD_HEIGHT);
|
|
index % WORLD_HEIGHT);
|
|
|
location.x += this->location.x - CHUNK_SIZE / 2;
|
|
location.x += this->location.x - CHUNK_SIZE / 2;
|
|
|
location.y += this->location.y - CHUNK_SIZE / 2;
|
|
location.y += this->location.y - CHUNK_SIZE / 2;
|
|
|
|
|
+ bLock.lockRead();
|
|
|
Block* zB = zBlockAt(location);
|
|
Block* zB = zBlockAt(location);
|
|
|
if (zB) appendAnimation(zB, boneId, time, pos, rot);
|
|
if (zB) appendAnimation(zB, boneId, time, pos, rot);
|
|
|
|
|
+ bLock.unlockRead();
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -525,7 +545,6 @@ Block* Chunk::zBlockAt(Framework::Vec3<int> location)
|
|
|
|
|
|
|
|
void Chunk::setBlock(Block* block)
|
|
void Chunk::setBlock(Block* block)
|
|
|
{
|
|
{
|
|
|
- cs.lock();
|
|
|
|
|
Framework::Vec3<int> pos = block->getLocation();
|
|
Framework::Vec3<int> pos = block->getLocation();
|
|
|
pos.x = pos.x % CHUNK_SIZE;
|
|
pos.x = pos.x % CHUNK_SIZE;
|
|
|
pos.y = pos.y % CHUNK_SIZE;
|
|
pos.y = pos.y % CHUNK_SIZE;
|
|
@@ -534,6 +553,7 @@ void Chunk::setBlock(Block* block)
|
|
|
int index = (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT + pos.z;
|
|
int index = (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT + pos.z;
|
|
|
int affectsGround = 0;
|
|
int affectsGround = 0;
|
|
|
int newAffectsGround = 0;
|
|
int newAffectsGround = 0;
|
|
|
|
|
+ bLock.lockWrite();
|
|
|
for (ChunkModelBuilder* builder : modelBuilders)
|
|
for (ChunkModelBuilder* builder : modelBuilders)
|
|
|
{
|
|
{
|
|
|
if (block && builder->isPartOfModel(block))
|
|
if (block && builder->isPartOfModel(block))
|
|
@@ -547,7 +567,7 @@ void Chunk::setBlock(Block* block)
|
|
|
}
|
|
}
|
|
|
if (blocks[index])
|
|
if (blocks[index])
|
|
|
{
|
|
{
|
|
|
- vcs.lock();
|
|
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
for (Framework::ArrayIterator<Block*> vi = visibleBlocks.begin(); vi;
|
|
for (Framework::ArrayIterator<Block*> vi = visibleBlocks.begin(); vi;
|
|
|
vi++)
|
|
vi++)
|
|
|
{
|
|
{
|
|
@@ -557,37 +577,36 @@ void Chunk::setBlock(Block* block)
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- vcs.unlock();
|
|
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
blocks[index]->copyLightTo(block);
|
|
blocks[index]->copyLightTo(block);
|
|
|
blocks[index]->release();
|
|
blocks[index]->release();
|
|
|
blocks[index] = block;
|
|
blocks[index] = block;
|
|
|
- cs.unlock();
|
|
|
|
|
- vcs.lock();
|
|
|
|
|
|
|
+ bLock.unlockWrite();
|
|
|
modelChanged |= affectsGround | newAffectsGround;
|
|
modelChanged |= affectsGround | newAffectsGround;
|
|
|
if (block && block->isVisible() && !newAffectsGround)
|
|
if (block && block->isVisible() && !newAffectsGround)
|
|
|
{
|
|
{
|
|
|
block->tick(0);
|
|
block->tick(0);
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
visibleBlocks.add(block);
|
|
visibleBlocks.add(block);
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
- vcs.unlock();
|
|
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
blocks[index] = block;
|
|
blocks[index] = block;
|
|
|
- cs.unlock();
|
|
|
|
|
- vcs.lock();
|
|
|
|
|
|
|
+ bLock.unlockWrite();
|
|
|
modelChanged |= affectsGround | newAffectsGround;
|
|
modelChanged |= affectsGround | newAffectsGround;
|
|
|
if (block && block->isVisible() && !newAffectsGround)
|
|
if (block && block->isVisible() && !newAffectsGround)
|
|
|
{
|
|
{
|
|
|
block->tick(0);
|
|
block->tick(0);
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
visibleBlocks.add(block);
|
|
visibleBlocks.add(block);
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
- vcs.unlock();
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Chunk::removeBlock(Block* zBlock)
|
|
void Chunk::removeBlock(Block* zBlock)
|
|
|
{
|
|
{
|
|
|
- cs.lock();
|
|
|
|
|
- vcs.lock();
|
|
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
for (Framework::ArrayIterator<Block*> iterator = visibleBlocks.begin();
|
|
for (Framework::ArrayIterator<Block*> iterator = visibleBlocks.begin();
|
|
|
iterator;
|
|
iterator;
|
|
|
iterator++)
|
|
iterator++)
|
|
@@ -598,32 +617,35 @@ void Chunk::removeBlock(Block* zBlock)
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- vcs.unlock();
|
|
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
Vec3<int> pos = zBlock->getLocation();
|
|
Vec3<int> pos = zBlock->getLocation();
|
|
|
pos.x = pos.x % CHUNK_SIZE;
|
|
pos.x = pos.x % CHUNK_SIZE;
|
|
|
pos.y = pos.y % CHUNK_SIZE;
|
|
pos.y = pos.y % CHUNK_SIZE;
|
|
|
if (pos.x < 0) pos.x += CHUNK_SIZE;
|
|
if (pos.x < 0) pos.x += CHUNK_SIZE;
|
|
|
if (pos.y < 0) pos.y += CHUNK_SIZE;
|
|
if (pos.y < 0) pos.y += CHUNK_SIZE;
|
|
|
int index = (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT + pos.z;
|
|
int index = (pos.x * CHUNK_SIZE + pos.y) * WORLD_HEIGHT + pos.z;
|
|
|
|
|
+ bLock.lockWrite();
|
|
|
if (blocks[index])
|
|
if (blocks[index])
|
|
|
{
|
|
{
|
|
|
modelChanged |= blocks[index]->getPartOfModels();
|
|
modelChanged |= blocks[index]->getPartOfModels();
|
|
|
blocks[index]->release();
|
|
blocks[index]->release();
|
|
|
blocks[index] = 0;
|
|
blocks[index] = 0;
|
|
|
}
|
|
}
|
|
|
- cs.unlock();
|
|
|
|
|
|
|
+ bLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void Chunk::blockVisibilityChanged(Block* zB)
|
|
void Chunk::blockVisibilityChanged(Block* zB)
|
|
|
{
|
|
{
|
|
|
- vcs.lock();
|
|
|
|
|
if (zB->isVisible())
|
|
if (zB->isVisible())
|
|
|
{
|
|
{
|
|
|
zB->tick(0);
|
|
zB->tick(0);
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
visibleBlocks.add(zB);
|
|
visibleBlocks.add(zB);
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
|
|
+ vLock.lockWrite();
|
|
|
for (Framework::ArrayIterator<Block*> iterator = visibleBlocks.begin();
|
|
for (Framework::ArrayIterator<Block*> iterator = visibleBlocks.begin();
|
|
|
iterator;
|
|
iterator;
|
|
|
iterator++)
|
|
iterator++)
|
|
@@ -634,8 +656,8 @@ void Chunk::blockVisibilityChanged(Block* zB)
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ vLock.unlockWrite();
|
|
|
}
|
|
}
|
|
|
- vcs.unlock();
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Framework::Point Chunk::getCenter() const
|
|
Framework::Point Chunk::getCenter() const
|
|
@@ -662,4 +684,9 @@ void Chunk::setModelChanged(int type)
|
|
|
void Chunk::setLightChanged(int type)
|
|
void Chunk::setLightChanged(int type)
|
|
|
{
|
|
{
|
|
|
lightChanged |= type;
|
|
lightChanged |= type;
|
|
|
-}
|
|
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+Lock& Chunk::getBlockReadLock() const
|
|
|
|
|
+{
|
|
|
|
|
+ return bLock.getReadLock();
|
|
|
|
|
+}
|