7 using namespace dragonblocks;
9 ivec3 Map::getChunkPos(const vec3 &p)
11 return floor(p / (float)DRAGONBLOCKS_CHUNK_SIZE);
14 ivec3 Map::getBlockPos(const ivec3 &p)
16 return ((p % DRAGONBLOCKS_CHUNK_SIZE) + ivec3(DRAGONBLOCKS_CHUNK_SIZE)) % DRAGONBLOCKS_CHUNK_SIZE;
19 uint16_t Map::getChunkPosHash(const ivec3 &p)
21 return (uint16_t)p.x + (uint16_t)p.y * DRAGONBLOCKS_MAP_SIZE + (uint16_t)p.z * DRAGONBLOCKS_MAP_SIZE * DRAGONBLOCKS_MAP_SIZE;
24 const Block *Map::getBlock(const glm::ivec3 &p)
27 Chunk *chunk = getChunk(Map::getChunkPos(p));
29 return chunk->getBlock(Map::getBlockPos(p));
33 void Map::setBlock(const glm::ivec3 &p, BlockDef *def)
35 Chunk *chunk = getChunk(Map::getChunkPos(p));
37 chunk->setBlock(Map::getBlockPos(p), def);
40 void Map::createChunk(const glm::ivec3 &p, const Chunk::Data &data)
42 uint64_t poshash = Map::getChunkPosHash(p);
47 chunks[poshash] = new Chunk(this, p, data, mesh_gen_mgr, scene);
50 void Map::createChunk(const glm::ivec3 &p)
52 if (! chunks[Map::getChunkPosHash(p)])
53 createChunk(p, mapgen->generate(p));
56 Chunk *Map::getChunk(const glm::ivec3 &p)
58 return chunks[Map::getChunkPosHash(p)];
63 for (auto it = chunks.begin(); it != chunks.end(); it++)
68 Map::Map(Mapgen *m, MeshGenMgr *mgt, Scene *s) : mapgen(m), mesh_gen_mgr(mgt), scene(s)