Dimension.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include "Dimension.h"
  2. #include "Constants.h"
  3. #include "Datei.h"
  4. #include "Game.h"
  5. using namespace Framework;
  6. Dimension::Dimension( int id )
  7. : dimensionId( id ),
  8. chunks( new Trie<Chunk>() ),
  9. entities( new RCArray<Entity>() )
  10. {}
  11. Dimension::~Dimension()
  12. {
  13. entities->release();
  14. chunks->release();
  15. }
  16. void Dimension::updateVisibility()
  17. {
  18. bool changed = true;
  19. while( changed )
  20. {
  21. changed = false;
  22. for( auto chunk = chunks->getIterator(); chunk; chunk++ )
  23. changed |= chunk->updateVisibility();
  24. }
  25. }
  26. void Dimension::getAddrOf( Punkt cPos, char *addr ) const
  27. {
  28. *(int *)addr = cPos.x;
  29. *( (int *)addr + 1 ) = cPos.y;
  30. addr[ 8 ] = 0;
  31. }
  32. void Dimension::getAddrOfWorld( Punkt wPos, char *addr ) const
  33. {
  34. wPos /= CHUNK_SIZE;
  35. getAddrOf( wPos, addr );
  36. }
  37. Chunk *Dimension::zChunk( Punkt wPos ) const
  38. {
  39. char addr[ 9 ];
  40. getAddrOfWorld( wPos, addr );
  41. return chunks->z( addr );
  42. }
  43. Block *Dimension::zBlock( Vec3<int> location )
  44. {
  45. Chunk *c = zChunk( Punkt( location.x, location.y ) );
  46. if( c )
  47. return c->zBlockAt( Vec3<int>( location.x % CHUNK_SIZE, location.y % CHUNK_SIZE, location.z ) );
  48. return 0;
  49. }
  50. void Dimension::addEntity( Entity *entity )
  51. {
  52. entities->add( entity );
  53. }
  54. void Dimension::addChunk( Chunk *chunk )
  55. {
  56. char addr[ 9 ];
  57. getAddrOf( chunk->getCenter(), addr );
  58. if( !chunks->z( addr ) )
  59. {
  60. chunks->set( addr, chunk );
  61. getAddrOf( chunk->getCenter() + Punkt( CHUNK_SIZE, 0 ), addr );
  62. Chunk *zChunk = chunks->z( addr );
  63. if( zChunk )
  64. {
  65. zChunk->setNeighbor( WEST, chunk );
  66. chunk->setNeighbor( EAST, chunk );
  67. }
  68. getAddrOf( chunk->getCenter() + Punkt( -CHUNK_SIZE, 0 ), addr );
  69. zChunk = chunks->z( addr );
  70. if( zChunk )
  71. {
  72. zChunk->setNeighbor( EAST, chunk );
  73. chunk->setNeighbor( WEST, chunk );
  74. }
  75. getAddrOf( chunk->getCenter() + Punkt( 0, CHUNK_SIZE ), addr );
  76. zChunk = chunks->z( addr );
  77. if( zChunk )
  78. {
  79. zChunk->setNeighbor( NORTH, chunk );
  80. chunk->setNeighbor( SOUTH, chunk );
  81. }
  82. getAddrOf( chunk->getCenter() + Punkt( 0, -CHUNK_SIZE ), addr );
  83. zChunk = chunks->z( addr );
  84. if( zChunk )
  85. {
  86. zChunk->setNeighbor( SOUTH, chunk ); // TODO: correct this in setBlock
  87. chunk->setNeighbor( NORTH, chunk );
  88. }
  89. }
  90. else
  91. chunk->release();
  92. }
  93. int Dimension::getDimensionId() const
  94. {
  95. return dimensionId;
  96. }
  97. bool Dimension::hasChunck( int x, int y ) const
  98. {
  99. return zChunk( Punkt( x, y ) );
  100. }