|
@@ -10,7 +10,8 @@ Chunk::Chunk( Framework::Punkt location, int dimensionId )
|
|
location( location )
|
|
location( location )
|
|
{
|
|
{
|
|
blocks = new Block * [ CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT ];
|
|
blocks = new Block * [ CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT ];
|
|
- memset( blocks, AIR_BLOCK, sizeof( Block * ) * CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT );
|
|
|
|
|
|
+ Block *val = (Block *)AIR_BLOCK;
|
|
|
|
+ std::uninitialized_fill_n( blocks, CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT, val );
|
|
zNeighbours[ 0 ] = 0;
|
|
zNeighbours[ 0 ] = 0;
|
|
zNeighbours[ 1 ] = 0;
|
|
zNeighbours[ 1 ] = 0;
|
|
zNeighbours[ 2 ] = 0;
|
|
zNeighbours[ 2 ] = 0;
|
|
@@ -46,24 +47,20 @@ bool Chunk::updateVisibility()
|
|
|
|
|
|
Block *Chunk::getBlockAt( Framework::Vec3<int> location ) const
|
|
Block *Chunk::getBlockAt( Framework::Vec3<int> location ) const
|
|
{
|
|
{
|
|
- location.x += CHUNK_SIZE / 2;
|
|
|
|
- location.y += CHUNK_SIZE / 2;
|
|
|
|
- Block *result = dynamic_cast<Block *>( blocks[ ( location.x * CHUNK_SIZE + location.y ) * CHUNK_SIZE + location.z ]->getThis() );
|
|
|
|
- return result;
|
|
|
|
|
|
+ Block *result = zBlockAt( location );
|
|
|
|
+ if( result )
|
|
|
|
+ return dynamic_cast<Block *>(result->getThis());
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
Block *Chunk::zBlockAt( Framework::Vec3<int> location ) const
|
|
Block *Chunk::zBlockAt( Framework::Vec3<int> location ) const
|
|
{
|
|
{
|
|
- location.x += CHUNK_SIZE / 2;
|
|
|
|
- location.y += CHUNK_SIZE / 2;
|
|
|
|
- return blocks[ ( location.x * CHUNK_SIZE + location.y ) * CHUNK_SIZE + location.z ];
|
|
|
|
|
|
+ return blocks[ (location.x * CHUNK_SIZE + location.y) * CHUNK_SIZE + location.z ];
|
|
}
|
|
}
|
|
|
|
|
|
void Chunk::putBlockAt( Framework::Vec3<int> location, Block *block )
|
|
void Chunk::putBlockAt( Framework::Vec3<int> location, Block *block )
|
|
{
|
|
{
|
|
- location.x -= this->location.x - CHUNK_SIZE / 2;
|
|
|
|
- location.y -= this->location.x - CHUNK_SIZE / 2;
|
|
|
|
- int index = ( location.x * CHUNK_SIZE + location.y ) * CHUNK_SIZE + location.z;
|
|
|
|
|
|
+ int index = (location.x * CHUNK_SIZE + location.y) * CHUNK_SIZE + location.z;
|
|
Block *old = blocks[ index ];
|
|
Block *old = blocks[ index ];
|
|
blocks[ index ] = block;
|
|
blocks[ index ] = block;
|
|
Block *neighbor = currentGame->zBlockAt( location + getDirection( NORTH ), dimensionId );
|
|
Block *neighbor = currentGame->zBlockAt( location + getDirection( NORTH ), dimensionId );
|
|
@@ -75,8 +72,8 @@ void Chunk::putBlockAt( Framework::Vec3<int> location, Block *block )
|
|
neighbor->setNeighbour( WEST, block );
|
|
neighbor->setNeighbour( WEST, block );
|
|
block->setNeighbour( EAST, neighbor );
|
|
block->setNeighbour( EAST, neighbor );
|
|
neighbor = currentGame->zBlockAt( location + getDirection( SOUTH ), dimensionId );
|
|
neighbor = currentGame->zBlockAt( location + getDirection( SOUTH ), dimensionId );
|
|
- if( IS_BLOCK( neighbor ) ) {}
|
|
|
|
- neighbor->setNeighbour( NORTH, block );
|
|
|
|
|
|
+ if( IS_BLOCK( neighbor ) )
|
|
|
|
+ neighbor->setNeighbour( NORTH, block );
|
|
block->setNeighbour( SOUTH, neighbor );
|
|
block->setNeighbour( SOUTH, neighbor );
|
|
neighbor = currentGame->zBlockAt( location + getDirection( WEST ), dimensionId );
|
|
neighbor = currentGame->zBlockAt( location + getDirection( WEST ), dimensionId );
|
|
if( IS_BLOCK( neighbor ) )
|
|
if( IS_BLOCK( neighbor ) )
|
|
@@ -103,27 +100,27 @@ void Chunk::setNeighbor( Direction dir, Chunk *zChunk )
|
|
{
|
|
{
|
|
if( dir == NORTH )
|
|
if( dir == NORTH )
|
|
{
|
|
{
|
|
- int index = i * CHUNK_SIZE * CHUNK_SIZE + z;
|
|
|
|
- if( blocks[ index ] )
|
|
|
|
- blocks[ index ]->setNeighbour( NORTH, zChunk->blocks[ ( i * CHUNK_SIZE + CHUNK_SIZE - 1 ) * CHUNK_SIZE + z ] );
|
|
|
|
|
|
+ int index = i * CHUNK_SIZE * WORLD_HEIGHT + z;
|
|
|
|
+ if( IS_BLOCK( blocks[ index ] ) )
|
|
|
|
+ blocks[ index ]->setNeighbour( NORTH, zChunk->blocks[ (i * CHUNK_SIZE + CHUNK_SIZE - 1) * WORLD_HEIGHT + z ] );
|
|
}
|
|
}
|
|
else if( dir == EAST )
|
|
else if( dir == EAST )
|
|
{
|
|
{
|
|
- int index = ( ( CHUNK_SIZE - 1 ) * CHUNK_SIZE + i ) * CHUNK_SIZE + z;
|
|
|
|
- if( blocks[ index ] )
|
|
|
|
- blocks[ index ]->setNeighbour( EAST, zChunk->blocks[ i * CHUNK_SIZE + z ] );
|
|
|
|
|
|
+ int index = ((CHUNK_SIZE - 1) * CHUNK_SIZE + i) * WORLD_HEIGHT + z;
|
|
|
|
+ if( IS_BLOCK( blocks[ index ] ) )
|
|
|
|
+ blocks[ index ]->setNeighbour( EAST, zChunk->blocks[ i * WORLD_HEIGHT + z ] );
|
|
}
|
|
}
|
|
else if( dir == SOUTH )
|
|
else if( dir == SOUTH )
|
|
{
|
|
{
|
|
- int index = ( i * CHUNK_SIZE + CHUNK_SIZE - 1 ) * CHUNK_SIZE + z;
|
|
|
|
- if( blocks[ index ] )
|
|
|
|
- blocks[ index ]->setNeighbour( SOUTH, zChunk->blocks[ i * CHUNK_SIZE * CHUNK_SIZE + z ] );
|
|
|
|
|
|
+ int index = (i * CHUNK_SIZE + CHUNK_SIZE - 1) * WORLD_HEIGHT + z;
|
|
|
|
+ if( IS_BLOCK( blocks[ index ] ) )
|
|
|
|
+ blocks[ index ]->setNeighbour( SOUTH, zChunk->blocks[ i * CHUNK_SIZE * WORLD_HEIGHT + z ] );
|
|
}
|
|
}
|
|
else if( dir == WEST )
|
|
else if( dir == WEST )
|
|
{
|
|
{
|
|
- int index = i * CHUNK_SIZE + z;
|
|
|
|
- if( blocks[ index ] )
|
|
|
|
- blocks[ index ]->setNeighbour( WEST, zChunk->blocks[ ( ( CHUNK_SIZE - 1 ) * CHUNK_SIZE + i ) * CHUNK_SIZE + z ] );
|
|
|
|
|
|
+ int index = i * WORLD_HEIGHT + z;
|
|
|
|
+ if( IS_BLOCK( blocks[ index ] ) )
|
|
|
|
+ blocks[ index ]->setNeighbour( WEST, zChunk->blocks[ ((CHUNK_SIZE - 1) * CHUNK_SIZE + i) * WORLD_HEIGHT + z ] );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|