Dimension.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. if( wPos.x < 0 )
  35. wPos.x -= CHUNK_SIZE;
  36. if( wPos.y < 0 ) // needed because otherwise would (-8, -8) have the same adress as (8, 8)
  37. wPos.y -= CHUNK_SIZE;
  38. wPos /= CHUNK_SIZE;
  39. getAddrOf( wPos, addr );
  40. }
  41. Chunk *Dimension::zChunk( Punkt wPos ) const
  42. {
  43. char addr[ 9 ];
  44. getAddrOfWorld( wPos, addr );
  45. return chunks->z( addr, 9 );
  46. }
  47. Block *Dimension::zBlock( Vec3<int> location )
  48. {
  49. Chunk *c = zChunk( Punkt( location.x, location.y ) );
  50. if( c )
  51. return c->zBlockAt( Vec3<int>( location.x % CHUNK_SIZE, location.y % CHUNK_SIZE, location.z ) );
  52. return 0;
  53. }
  54. void Dimension::addEntity( Entity *entity )
  55. {
  56. entities->add( entity );
  57. }
  58. void Dimension::addChunk( Chunk *chunk )
  59. {
  60. char addr[ 9 ];
  61. getAddrOfWorld( chunk->getCenter(), addr );
  62. if( !chunks->z( addr, 9 ) )
  63. {
  64. chunks->set( addr, 9, chunk );
  65. getAddrOfWorld( chunk->getCenter() + Punkt( CHUNK_SIZE, 0 ), addr );
  66. Chunk *zChunk = chunks->z( addr, 9 );
  67. if( zChunk )
  68. {
  69. zChunk->setNeighbor( WEST, chunk );
  70. chunk->setNeighbor( EAST, chunk );
  71. }
  72. getAddrOfWorld( chunk->getCenter() + Punkt( -CHUNK_SIZE, 0 ), addr );
  73. zChunk = chunks->z( addr, 9 );
  74. if( zChunk )
  75. {
  76. zChunk->setNeighbor( EAST, chunk );
  77. chunk->setNeighbor( WEST, chunk );
  78. }
  79. getAddrOfWorld( chunk->getCenter() + Punkt( 0, CHUNK_SIZE ), addr );
  80. zChunk = chunks->z( addr, 9 );
  81. if( zChunk )
  82. {
  83. zChunk->setNeighbor( NORTH, chunk );
  84. chunk->setNeighbor( SOUTH, chunk );
  85. }
  86. getAddrOfWorld( chunk->getCenter() + Punkt( 0, -CHUNK_SIZE ), addr );
  87. zChunk = chunks->z( addr, 9 );
  88. if( zChunk )
  89. {
  90. zChunk->setNeighbor( SOUTH, chunk );
  91. chunk->setNeighbor( NORTH, chunk );
  92. }
  93. }
  94. else
  95. chunk->release();
  96. }
  97. int Dimension::getDimensionId() const
  98. {
  99. return dimensionId;
  100. }
  101. bool Dimension::hasChunck( int x, int y ) const
  102. {
  103. return zChunk( Punkt( x, y ) );
  104. }