4 #include <glm/gtx/transform.hpp>
11 , blockShape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f }})
12 , stairShape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f }}, { 0.0f, 0.0f })
13 , slabShape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.0f, 0.5f }})
15 , chunks(blockType, generate)
17 BlockType::Faces block_fill = { true, true, true, true, true, true };
18 BlockType::Faces slab_fill = { false, false, false, true, false, false };
19 BlockType::Faces stair_fill = { true, false, false, true, false, false };
22 BlockType type(true, { 1.0f, 1.0f, 1.0f }, &blockShape);
23 type.fill = block_fill;
27 BlockType type(true, { 1.0f, 1.0f, 1.0f }, &slabShape);
28 type.fill = slab_fill;
32 BlockType type(true, { 1.0f, 1.0f, 1.0f }, &stairShape);
33 type.fill = stair_fill;
38 BlockType type(true, { 1.0f, 0.0f, 0.0f }, &blockShape);
39 type.fill = block_fill;
43 BlockType type(true, { 1.0f, 0.0f, 0.0f }, &slabShape);
44 type.fill = slab_fill;
48 BlockType type(true, { 1.0f, 0.0f, 0.0f }, &stairShape);
49 type.fill = stair_fill;
54 BlockType type(true, { 0.0f, 1.0f, 0.0f }, &blockShape);
55 type.fill = block_fill;
59 BlockType type(true, { 0.0f, 1.0f, 0.0f }, &slabShape);
60 type.fill = slab_fill;
64 BlockType type(true, { 0.0f, 1.0f, 0.0f }, &stairShape);
65 type.fill = stair_fill;
70 BlockType type(true, { 0.0f, 0.0f, 1.0f }, &blockShape);
71 type.fill = block_fill;
75 BlockType type(true, { 0.0f, 0.0f, 1.0f }, &slabShape);
76 type.fill = slab_fill;
80 BlockType type(true, { 0.0f, 0.0f, 1.0f }, &stairShape);
81 type.fill = stair_fill;
86 generate.Solids({ 1, 4, 7, 10 });
88 player.Position({ 4.0f, 4.0f, 4.0f });
90 chunks.Generate({ -4, -4, -4 }, { 5, 5, 5});
94 bool World::Intersection(
101 Chunk *closest_chunk = nullptr;
102 int closest_blkid = -1;
103 float closest_dist = std::numeric_limits<float>::infinity();
104 glm::vec3 closest_normal;
106 for (Chunk &cur_chunk : chunks.Loaded()) {
109 glm::vec3 cur_normal;
110 if (cur_chunk.Intersection(ray, M * cur_chunk.Transform(player.ChunkCoords()), &cur_blkid, &cur_dist, &cur_normal)) {
111 if (cur_dist < closest_dist) {
112 closest_chunk = &cur_chunk;
113 closest_blkid = cur_blkid;
114 closest_dist = cur_dist;
115 closest_normal = cur_normal;
121 *chunk = closest_chunk;
124 *blkid = closest_blkid;
127 *dist = closest_dist;
130 *normal = closest_normal;
132 return closest_chunk;
136 Chunk &World::Next(const Chunk &to, const glm::tvec3<int> &dir) {
137 const Chunk::Pos tgt_pos = to.Position() + dir;
138 return chunks.ForceLoad(tgt_pos);
142 void World::Update(int dt) {
144 chunks.Rebase(player.ChunkCoords());
149 void World::Render(DirectionalLighting &program) {
150 program.SetLightDirection({ -1.0f, -3.0f, -2.0f });
151 program.SetView(glm::inverse(player.Transform(player.ChunkCoords())));
153 for (Chunk &chunk : chunks.Loaded()) {
154 glm::mat4 m(chunk.Transform(player.ChunkCoords()));
156 glm::mat4 mvp(program.GetVP() * m);
157 if (!CullTest(Chunk::Bounds(), mvp)) {