Przeglądaj źródła

fix chunk trie adresses

Kolja Strohm 3 lat temu
rodzic
commit
d72792ecf8
2 zmienionych plików z 18 dodań i 14 usunięć
  1. 2 2
      FactoryCraft/Chunk.cpp
  2. 16 12
      FactoryCraft/Dimension.cpp

+ 2 - 2
FactoryCraft/Chunk.cpp

@@ -105,7 +105,7 @@ void Chunk::putBlockAt( Framework::Vec3<int> location, Block *block )
 
 void Chunk::setNeighbor( Direction dir, Chunk *zChunk )
 {
-    zNeighbours[ getDirectionIndex(dir) ] = zChunk;
+    zNeighbours[ getDirectionIndex( dir ) ] = zChunk;
     for( int i = 0; i < CHUNK_SIZE; i++ )
     {
         for( int z = 0; z < WORLD_HEIGHT; z++ )
@@ -167,7 +167,7 @@ void Chunk::save( Framework::StreamWriter *zWriter )
             for( int z = 0; z < WORLD_HEIGHT; z++ )
             {
                 int index = (x * CHUNK_SIZE + y) * WORLD_HEIGHT + z;
-                int blockType = IS_BLOCK(blocks[ index ]) ? blocks[ index ]->zBlockType()->getId() : -1;
+                int blockType = IS_BLOCK( blocks[ index ] ) ? blocks[ index ]->zBlockType()->getId() : -1;
                 zWriter->schreibe( (char *)&blockType, 4 );
                 if( blockType >= 0 )
                     StaticRegistry<BlockType>::INSTANCE.zElement( blockType )->saveBlock( blocks[ index ], zWriter );

+ 16 - 12
FactoryCraft/Dimension.cpp

@@ -47,6 +47,10 @@ void Dimension::getAddrOf( Punkt cPos, char *addr ) const
 
 void Dimension::getAddrOfWorld( Punkt wPos, char *addr ) const
 {
+    if( wPos.x < 0 )
+        wPos.x -= CHUNK_SIZE;
+    if( wPos.y < 0 ) // needed because otherwise would (-8, -8) have the same adress as (8, 8)
+        wPos.y -= CHUNK_SIZE;
     wPos /= CHUNK_SIZE;
     getAddrOf( wPos, addr );
 }
@@ -55,7 +59,7 @@ Chunk *Dimension::zChunk( Punkt wPos ) const
 {
     char addr[ 9 ];
     getAddrOfWorld( wPos, addr );
-    return chunks->z( addr );
+    return chunks->z( addr, 9 );
 }
 
 Block *Dimension::zBlock( Vec3<int> location )
@@ -74,33 +78,33 @@ void Dimension::addEntity( Entity *entity )
 void Dimension::addChunk( Chunk *chunk )
 {
     char addr[ 9 ];
-    getAddrOf( chunk->getCenter(), addr );
-    if( !chunks->z( addr ) )
+    getAddrOfWorld( chunk->getCenter(), addr );
+    if( !chunks->z( addr, 9 ) )
     {
-        chunks->set( addr, chunk );
-        getAddrOf( chunk->getCenter() + Punkt( CHUNK_SIZE, 0 ), addr );
-        Chunk *zChunk = chunks->z( addr );
+        chunks->set( addr, 9, chunk );
+        getAddrOfWorld( chunk->getCenter() + Punkt( CHUNK_SIZE, 0 ), addr );
+        Chunk *zChunk = chunks->z( addr, 9 );
         if( zChunk )
         {
             zChunk->setNeighbor( WEST, chunk );
             chunk->setNeighbor( EAST, chunk );
         }
-        getAddrOf( chunk->getCenter() + Punkt( -CHUNK_SIZE, 0 ), addr );
-        zChunk = chunks->z( addr );
+        getAddrOfWorld( chunk->getCenter() + Punkt( -CHUNK_SIZE, 0 ), addr );
+        zChunk = chunks->z( addr, 9 );
         if( zChunk )
         {
             zChunk->setNeighbor( EAST, chunk );
             chunk->setNeighbor( WEST, chunk );
         }
-        getAddrOf( chunk->getCenter() + Punkt( 0, CHUNK_SIZE ), addr );
-        zChunk = chunks->z( addr );
+        getAddrOfWorld( chunk->getCenter() + Punkt( 0, CHUNK_SIZE ), addr );
+        zChunk = chunks->z( addr, 9 );
         if( zChunk )
         {
             zChunk->setNeighbor( NORTH, chunk );
             chunk->setNeighbor( SOUTH, chunk );
         }
-        getAddrOf( chunk->getCenter() + Punkt( 0, -CHUNK_SIZE ), addr );
-        zChunk = chunks->z( addr );
+        getAddrOfWorld( chunk->getCenter() + Punkt( 0, -CHUNK_SIZE ), addr );
+        zChunk = chunks->z( addr, 9 );
         if( zChunk )
         {
             zChunk->setNeighbor( SOUTH, chunk );