Pārlūkot izejas kodu

fix chunk trie adresses

Kolja Strohm 3 gadi atpakaļ
vecāks
revīzija
945fba4532
1 mainītis faili ar 16 papildinājumiem un 12 dzēšanām
  1. 16 12
      FactoryCraft/Dimension.cpp

+ 16 - 12
FactoryCraft/Dimension.cpp

@@ -38,6 +38,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 );
 }
@@ -46,7 +50,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 )
@@ -65,33 +69,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 );