2 #include "face_dir.hpp"
8 using namespace dragonblocks;
10 ivec3 Map::getChunkPos(const vec3 &p)
12 return floor(p / 16.0F);
15 ivec3 Map::getBlockPos(const ivec3 &p)
17 return ((p % 16) + ivec3(16)) % 16;
20 uint16_t Map::getChunkPosHash(const ivec3 &p)
22 return (uint16_t)p.x + (uint16_t)p.y * 1000 + (uint16_t)p.z * 1000000;
25 const Block *Map::getBlock(const glm::ivec3 &p)
28 Chunk *chunk = getChunk(Map::getChunkPos(p));
30 return chunk->getBlock(Map::getBlockPos(p));
34 const Block *Map::getBlockRelativePos(Chunk *chunk, const glm::ivec3 &p)
36 const Block *b = nullptr;
38 b = chunk->getBlock(p);
39 } catch (std::out_of_range &) {
40 b = getBlock(chunk->pos * 16 + p);
45 void Map::setBlock(const glm::ivec3 &p, BlockDef *def)
47 Chunk *chunk = getChunk(Map::getChunkPos(p));
49 chunk->setBlock(Map::getBlockPos(p), def);
52 void Map::createChunk(const glm::ivec3 &p, const Chunk::Data &data)
54 uint64_t poshash = Map::getChunkPosHash(p);
59 chunks[poshash] = new Chunk(this, p, data, mesh_gen_thread, scene);
61 for (int i = 0; i < 6; i++) {
62 if (Chunk *neighbor = getChunk(p + face_dir[i]))
63 neighbor->addMeshUpdateTask();
67 void Map::createChunk(const glm::ivec3 &p)
69 if (! chunks[Map::getChunkPosHash(p)])
70 createChunk(p, mapgen->generate(p));
73 Chunk *Map::getChunk(const glm::ivec3 &p)
75 return chunks[Map::getChunkPosHash(p)];
80 for (auto it = chunks.begin(); it != chunks.end(); it++)
85 Map::Map(Mapgen *m, MeshGenThread *mgt, Scene *s) : mapgen(m), mesh_gen_thread(mgt), scene(s)