|
@@ -8,7 +8,8 @@
|
|
Chunk::Chunk( Framework::Punkt location, int dimensionId )
|
|
Chunk::Chunk( Framework::Punkt location, int dimensionId )
|
|
: ReferenceCounter(),
|
|
: ReferenceCounter(),
|
|
dimensionId( dimensionId ),
|
|
dimensionId( dimensionId ),
|
|
- location( location )
|
|
|
|
|
|
+ location( location ),
|
|
|
|
+ isLoading( 0 )
|
|
{}
|
|
{}
|
|
|
|
|
|
Chunk::Chunk( Framework::Punkt location, int dimensionId, Framework::StreamReader* zReader )
|
|
Chunk::Chunk( Framework::Punkt location, int dimensionId, Framework::StreamReader* zReader )
|
|
@@ -20,18 +21,24 @@ Chunk::Chunk( Framework::Punkt location, int dimensionId, Framework::StreamReade
|
|
Chunk::~Chunk()
|
|
Chunk::~Chunk()
|
|
{}
|
|
{}
|
|
|
|
|
|
-Block* Chunk::zBlockAt( Framework::Vec3<int> location ) const
|
|
|
|
|
|
+Block* Chunk::zBlockAt( Framework::Vec3<int> location )
|
|
{
|
|
{
|
|
|
|
+ cs.lock();
|
|
for( Block* b : blocks )
|
|
for( Block* b : blocks )
|
|
{
|
|
{
|
|
if( (Framework::Vec3<int>)b->getPos() == location )
|
|
if( (Framework::Vec3<int>)b->getPos() == location )
|
|
|
|
+ {
|
|
|
|
+ cs.unlock();
|
|
return b;
|
|
return b;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ cs.unlock();
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
void Chunk::setBlock( Block* block )
|
|
void Chunk::setBlock( Block* block )
|
|
{
|
|
{
|
|
|
|
+ cs.lock();
|
|
Framework::Vec3<int> pos = (Framework::Vec3<int>)block->getPos();
|
|
Framework::Vec3<int> pos = (Framework::Vec3<int>)block->getPos();
|
|
for( Framework::Iterator<Block*> iterator = blocks.begin(); iterator; iterator++ )
|
|
for( Framework::Iterator<Block*> iterator = blocks.begin(); iterator; iterator++ )
|
|
{
|
|
{
|
|
@@ -39,14 +46,37 @@ void Chunk::setBlock( Block* block )
|
|
{
|
|
{
|
|
iterator->release();
|
|
iterator->release();
|
|
iterator.set( block );
|
|
iterator.set( block );
|
|
|
|
+ cs.unlock();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
blocks.add( block );
|
|
blocks.add( block );
|
|
|
|
+ cs.unlock();
|
|
|
|
+ if( !isLoading )
|
|
|
|
+ updateVisibility();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Chunk::removeBlock( Block* zBlock )
|
|
|
|
+{
|
|
|
|
+ cs.lock();
|
|
|
|
+ int index = 0;
|
|
|
|
+ for( Framework::Iterator<Block*> iterator = blocks.begin(); iterator; iterator++, index++ )
|
|
|
|
+ {
|
|
|
|
+ if( zBlock == (Block*)iterator )
|
|
|
|
+ {
|
|
|
|
+ blocks.remove( index );
|
|
|
|
+ cs.unlock();
|
|
|
|
+ if( !isLoading )
|
|
|
|
+ updateVisibility();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ cs.unlock();
|
|
}
|
|
}
|
|
|
|
|
|
void Chunk::load( Framework::StreamReader* zReader )
|
|
void Chunk::load( Framework::StreamReader* zReader )
|
|
{
|
|
{
|
|
|
|
+ isLoading = 1;
|
|
Framework::Vec3<int> pos = { 0, 0, 0 };
|
|
Framework::Vec3<int> pos = { 0, 0, 0 };
|
|
unsigned short id;
|
|
unsigned short id;
|
|
zReader->lese( (char*)&id, 2 );
|
|
zReader->lese( (char*)&id, 2 );
|
|
@@ -67,6 +97,8 @@ void Chunk::load( Framework::StreamReader* zReader )
|
|
setBlock( STATIC_REGISTRY( BlockType ).zElement( id )->createBlock( { pos.x + location.x - CHUNK_SIZE / 2, pos.y + location.y - CHUNK_SIZE / 2, pos.z } ) );
|
|
setBlock( STATIC_REGISTRY( BlockType ).zElement( id )->createBlock( { pos.x + location.x - CHUNK_SIZE / 2, pos.y + location.y - CHUNK_SIZE / 2, pos.z } ) );
|
|
zReader->lese( (char*)&id, 2 );
|
|
zReader->lese( (char*)&id, 2 );
|
|
}
|
|
}
|
|
|
|
+ isLoading = 0;
|
|
|
|
+ updateVisibility();
|
|
}
|
|
}
|
|
|
|
|
|
int Chunk::getDimensionId() const
|
|
int Chunk::getDimensionId() const
|
|
@@ -91,6 +123,23 @@ Framework::Vec3<int> Chunk::getMax() const
|
|
|
|
|
|
void Chunk::forAll( std::function<void( Model3D* )> f )
|
|
void Chunk::forAll( std::function<void( Model3D* )> f )
|
|
{
|
|
{
|
|
|
|
+ cs.lock();
|
|
for( Block* b : blocks )
|
|
for( Block* b : blocks )
|
|
f( b );
|
|
f( b );
|
|
|
|
+ cs.unlock();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Chunk::updateVisibility()
|
|
|
|
+{
|
|
|
|
+ cs.lock();
|
|
|
|
+ for( Block* b : blocks )
|
|
|
|
+ {
|
|
|
|
+ Framework::Vec3<int> pos = (Framework::Vec3<int>)b->getPos();
|
|
|
|
+ for( int i = 0; i < 6; i++ )
|
|
|
|
+ {
|
|
|
|
+ Block* c = zBlockAt( pos + getDirection( getDirectionFromIndex( i ) ) );
|
|
|
|
+ b->setSideVisible( getDirectionFromIndex( i ), !c || c->isTransparent() || c->isPassable() );
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ cs.unlock();
|
|
}
|
|
}
|