]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/dragonblocks/map.cpp
8b338d9e3d04cfaae6051dc5ca523f5c151a2410
[dragonblocks3d.git] / src / dragonblocks / map.cpp
1 #include <stdexcept>
2 #include "map.hpp"
3 #include "mapgen.hpp"
4
5 using namespace std;
6 using namespace glm;
7 using namespace dragonblocks;
8
9 ivec3 Map::getChunkPos(const vec3 &p)
10 {
11         return floor(p / (float)DRAGONBLOCKS_CHUNK_SIZE);
12 }
13
14 ivec3 Map::getBlockPos(const ivec3 &p)
15 {
16         return ((p % DRAGONBLOCKS_CHUNK_SIZE) + ivec3(DRAGONBLOCKS_CHUNK_SIZE)) % DRAGONBLOCKS_CHUNK_SIZE;
17 }
18
19 uint16_t Map::getChunkPosHash(const ivec3 &p)
20 {
21         return (uint16_t)p.x + (uint16_t)p.y * DRAGONBLOCKS_MAP_SIZE + (uint16_t)p.z * DRAGONBLOCKS_MAP_SIZE * DRAGONBLOCKS_MAP_SIZE;
22 }
23
24 const Block *Map::getBlock(const glm::ivec3 &p)
25 {
26         
27         Chunk *chunk = getChunk(Map::getChunkPos(p));
28         if (chunk)
29                 return chunk->getBlock(Map::getBlockPos(p));
30         return nullptr;
31 }
32
33 void Map::setBlock(const glm::ivec3 &p, BlockDef *def)
34 {
35         Chunk *chunk = getChunk(Map::getChunkPos(p));
36         if (chunk)
37                 chunk->setBlock(Map::getBlockPos(p), def);
38 }
39
40 void Map::createChunk(const glm::ivec3 &p, const Chunk::Data &data)
41 {
42         uint64_t poshash = Map::getChunkPosHash(p);
43         
44         if (chunks[poshash])
45                 return;
46
47         chunks[poshash] = new Chunk(this, p, data, mesh_gen_mgr, scene);
48 }
49
50 void Map::createChunk(const glm::ivec3 &p)
51 {
52         if (! chunks[Map::getChunkPosHash(p)])
53                 createChunk(p, mapgen->generate(p));
54 }       
55
56 Chunk *Map::getChunk(const glm::ivec3 &p)
57 {
58         return chunks[Map::getChunkPosHash(p)];
59 }
60
61 void Map::clear()
62 {
63         for (auto it = chunks.begin(); it != chunks.end(); it++)
64                 delete it->second;
65         chunks.clear();
66 }
67
68 Map::Map(Mapgen *m, MeshGenMgr *mg, Scene *s) : mapgen(m), mesh_gen_mgr(mg), scene(s)
69 {
70 }
71
72 Map::~Map()
73 {
74         clear();
75 }