void MovingEntity::GatherBlockPositions(Vector3 pos) { //clear block positions _blockPositions.clear(); //add new ones for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) { for (int y = -2; y < 2; y++) { int blockPosX = (int) (pos.x + (pos.x >= 0 ? 0.5f : -0.5f)) + x; int blockPosY = (int) (pos.y + (pos.y >= 0 ? 0.5f : -0.5f)) + y; int blockPosZ = (int) (pos.z + (pos.z >= 0 ? 0.5f : -0.5f)) + z; float fromOrigin = Vector3(blockPosX - pos.x, blockPosY - pos.y, blockPosZ - pos.z).magnitudeSq(); _blockPositions.push_back(BlockPosition(blockPosX, blockPosY, blockPosZ,fromOrigin)); } } } //sort them qsort(&_blockPositions[0],_blockPositions.size(),sizeof(BlockPosition),BlockPositionsSort); }
BlockPosition Me::pointedBlock() { BlockPosition blockPosition; Vector direction = this->direction(); Vector position = this->eyePosition(); for(float d = 1; d < F_MAX_BLOCK_SEAK; d += F_BLOCK_SEAK_STEP) { blockPosition.x = ifloor(position.x + direction.x * d); blockPosition.y = ifloor(position.y + direction.y * d); blockPosition.z = ifloor(position.z + direction.z * d); if(!world()->block(blockPosition)->isVoid()) { return blockPosition; } } return BlockPosition(); // return 0,0,0 }
BlockPosition Me::pointedFreeBlock() { BlockPosition blockPosition, lastBlockPosition; Vector direction = this->direction(); Vector position = this->eyePosition(); for(float d = 1; d < F_MAX_BLOCK_SEAK; d += F_BLOCK_SEAK_STEP) { lastBlockPosition = blockPosition; blockPosition.x = ifloor(position.x + direction.x * d); blockPosition.y = ifloor(position.y + direction.y * d); blockPosition.z = ifloor(position.z + direction.z * d); // If we met a non void block... if(!world()->block(blockPosition)->isVoid()) { return lastBlockPosition; // We return the last void block } } return BlockPosition(); // return 0,0,0 }
peano::applications::latticeboltzmann::blocklatticeboltzmann::forcerecords::BlockPosition peano::applications::latticeboltzmann::blocklatticeboltzmann::forcerecords::BlockPositionPacked::convert() const{ return BlockPosition( getBlockPosition() ); }
void ChunkDrawer::generateVBO() { m_oglBuffer->clear(); QReadLocker(&m_chunkToDraw->rwLock()); World& workingWorld = m_chunkToDraw->world(); int zi, zj, zk; // These are the coordinates of the zero (0;0;0) block of the chunk (in chunk relative coordinates of course) m_chunkToDraw->mapToWorld(0, 0, 0, zi, zj, zk); BlockSet blockSet; // ********************************************************************************************* // STEP ONE : draw blocks at chunk boudaries (that is to say x=0, y=0, z=0, x=CHUNK_X_SIZE, ...) // ********************************************************************************************* // x=0 for(int k = 0; k < CHUNK_Z_SIZE; ++k) // z { for(int j = 1; j < CHUNK_HEIGHT; ++j) // y, altitude { const int i = 0; blockSet.block = m_chunkToDraw->block(i, j, k); blockSet.frontBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k - 1)); blockSet.leftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j, zk + k)); blockSet.rightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j, zk + k)); blockSet.backBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k + 1)); blockSet.topBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k)); blockSet.topFrontBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k - 1)); blockSet.topLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k)); blockSet.topRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k)); blockSet.topBackBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k + 1)); blockSet.topFrontLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k - 1)); blockSet.topFrontRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k - 1)); blockSet.topBackLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k + 1)); blockSet.topBackRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k + 1)); blockSet.bottomBlock = workingWorld.block(BlockPosition(zi + i, zj + j - 1, zk + k)); blockSet.block->descriptor().render(*m_oglBuffer, blockSet, BlockPosition(zi + i, zj + j, zk + k), workingWorld); } } // y=0 for(int i = 0; i < CHUNK_X_SIZE; ++i) // x { for(int k = 0; k < CHUNK_Z_SIZE; ++k) // z { const int j = 0; blockSet.block = m_chunkToDraw->block(i, j, k); blockSet.frontBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k - 1)); blockSet.leftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j, zk + k)); blockSet.rightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j, zk + k)); blockSet.backBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k + 1)); blockSet.topBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k)); blockSet.topFrontBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k - 1)); blockSet.topLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k)); blockSet.topRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k)); blockSet.topBackBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k + 1)); blockSet.topFrontLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k - 1)); blockSet.topFrontRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k - 1)); blockSet.topBackLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k + 1)); blockSet.topBackRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k + 1)); blockSet.bottomBlock = workingWorld.block(BlockPosition(zi + i, zj + j - 1, zk + k)); blockSet.block->descriptor().render(*m_oglBuffer, blockSet, BlockPosition(zi + i, zj + j, zk + k), workingWorld); } } // z=0 for(int i = 0; i < CHUNK_X_SIZE; ++i) // x { for(int j = 0; j < CHUNK_HEIGHT; ++j) // y, altitude { const int k = 0; blockSet.block = m_chunkToDraw->block(i, j, k); blockSet.frontBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k - 1)); blockSet.leftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j, zk + k)); blockSet.rightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j, zk + k)); blockSet.backBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k + 1)); blockSet.topBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k)); blockSet.topFrontBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k - 1)); blockSet.topLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k)); blockSet.topRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k)); blockSet.topBackBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k + 1)); blockSet.topFrontLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k - 1)); blockSet.topFrontRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k - 1)); blockSet.topBackLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k + 1)); blockSet.topBackRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k + 1)); blockSet.bottomBlock = workingWorld.block(BlockPosition(zi + i, zj + j - 1, zk + k)); blockSet.block->descriptor().render(*m_oglBuffer, blockSet, BlockPosition(zi + i, zj + j, zk + k), workingWorld); } } // x=CHUNK_X_SIZE for(int k = 0; k < CHUNK_Z_SIZE; ++k) // z { for(int j = 1; j < CHUNK_HEIGHT; ++j) // y, altitude { const int i = CHUNK_X_SIZE - 1; blockSet.block = m_chunkToDraw->block(i, j, k); blockSet.frontBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k - 1)); blockSet.leftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j, zk + k)); blockSet.rightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j, zk + k)); blockSet.backBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k + 1)); blockSet.topBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k)); blockSet.topFrontBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k - 1)); blockSet.topLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k)); blockSet.topRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k)); blockSet.topBackBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k + 1)); blockSet.topFrontLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k - 1)); blockSet.topFrontRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k - 1)); blockSet.topBackLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k + 1)); blockSet.topBackRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k + 1)); blockSet.bottomBlock = workingWorld.block(BlockPosition(zi + i, zj + j - 1, zk + k)); blockSet.block->descriptor().render(*m_oglBuffer, blockSet, BlockPosition(zi + i, zj + j, zk + k), workingWorld); } } // y=CHUNK_Y_SIZE for(int i = 0; i < CHUNK_X_SIZE; ++i) // x { for(int k = 0; k < CHUNK_Z_SIZE; ++k) // z { const int j = CHUNK_Y_SIZE - 1; blockSet.block = m_chunkToDraw->block(i, j, k); blockSet.frontBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k - 1)); blockSet.leftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j, zk + k)); blockSet.rightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j, zk + k)); blockSet.backBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k + 1)); blockSet.topBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k)); blockSet.topFrontBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k - 1)); blockSet.topLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k)); blockSet.topRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k)); blockSet.topBackBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k + 1)); blockSet.topFrontLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k - 1)); blockSet.topFrontRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k - 1)); blockSet.topBackLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k + 1)); blockSet.topBackRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k + 1)); blockSet.bottomBlock = workingWorld.block(BlockPosition(zi + i, zj + j - 1, zk + k)); blockSet.block->descriptor().render(*m_oglBuffer, blockSet, BlockPosition(zi + i, zj + j, zk + k), workingWorld); } } // z=CHUNK_Z_SIZE for(int i = 0; i < CHUNK_X_SIZE; ++i) // x { const int k = CHUNK_Z_SIZE - 1; for(int j = 0; j < CHUNK_HEIGHT; ++j) // y, altitude { blockSet.block = m_chunkToDraw->block(i, j, k); blockSet.frontBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k - 1)); blockSet.leftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j, zk + k)); blockSet.rightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j, zk + k)); blockSet.backBlock = workingWorld.block(BlockPosition(zi + i, zj + j, zk + k + 1)); blockSet.topBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k)); blockSet.topFrontBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k - 1)); blockSet.topLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k)); blockSet.topRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k)); blockSet.topBackBlock = workingWorld.block(BlockPosition(zi + i, zj + j + 1, zk + k + 1)); blockSet.topFrontLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k - 1)); blockSet.topFrontRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k - 1)); blockSet.topBackLeftBlock = workingWorld.block(BlockPosition(zi + i - 1, zj + j + 1, zk + k + 1)); blockSet.topBackRightBlock = workingWorld.block(BlockPosition(zi + i + 1, zj + j + 1, zk + k + 1)); blockSet.bottomBlock = workingWorld.block(BlockPosition(zi + i, zj + j - 1, zk + k)); blockSet.block->descriptor().render(*m_oglBuffer, blockSet, BlockPosition(zi + i, zj + j, zk + k), workingWorld); } } // ************************************************************************************************ // STEP TWO : draw blocks at the middle of the chunk (avoid many World::block() slow function call) // ************************************************************************************************ for(int k = 1; k < CHUNK_Z_SIZE - 1; ++k) // z { for(int i = 1; i < CHUNK_X_SIZE - 1; ++i) // x { blockSet.block = m_chunkToDraw->block(i, 0, k); blockSet.frontBlock = m_chunkToDraw->block(i, 0, k - 1); blockSet.leftBlock = m_chunkToDraw->block(i - 1, 0, k); blockSet.rightBlock = m_chunkToDraw->block(i + 1, 0, k); blockSet.backBlock = m_chunkToDraw->block(i, 0, k + 1); blockSet.topBlock = m_chunkToDraw->block(i, 0 + 1, k); blockSet.topFrontBlock = m_chunkToDraw->block(i, 0 + 1, k - 1); blockSet.topLeftBlock = m_chunkToDraw->block(i - 1, 0 + 1, k); blockSet.topRightBlock = m_chunkToDraw->block(i + 1, 0 + 1, k); blockSet.topBackBlock = m_chunkToDraw->block(i, 0 + 1, k + 1); blockSet.topFrontLeftBlock = m_chunkToDraw->block(i - 1, 0 + 1, k - 1); blockSet.topFrontRightBlock = m_chunkToDraw->block(i + 1, 0 + 1, k - 1); blockSet.topBackLeftBlock = m_chunkToDraw->block(i - 1, 0 + 1, k + 1); blockSet.topBackRightBlock = m_chunkToDraw->block(i + 1, 0 + 1, k + 1); blockSet.bottomBlock = m_chunkToDraw->block(i, 0 - 1, k); for(int j = 1; j < CHUNK_HEIGHT - 1; ++j) // y, altitude { pushBlockSetUpwards(blockSet); blockSet.topBlock = m_chunkToDraw->block(i, j + 1, k); blockSet.topFrontBlock = m_chunkToDraw->block(i, j + 1, k - 1); blockSet.topLeftBlock = m_chunkToDraw->block(i - 1, j + 1, k); blockSet.topRightBlock = m_chunkToDraw->block(i + 1, j + 1, k); blockSet.topBackBlock = m_chunkToDraw->block(i, j + 1, k + 1); blockSet.topFrontLeftBlock = m_chunkToDraw->block(i - 1, j + 1, k - 1); blockSet.topFrontRightBlock = m_chunkToDraw->block(i + 1, j + 1, k - 1); blockSet.topBackLeftBlock = m_chunkToDraw->block(i - 1, j + 1, k + 1); blockSet.topBackRightBlock = m_chunkToDraw->block(i + 1, j + 1, k + 1); blockSet.block->descriptor().render(*m_oglBuffer, blockSet, BlockPosition(zi + i, zj + j, zk + k), workingWorld); } // j } // i } // k }