-const BlockType BlockType::DEFAULT;
-
-void BlockType::FillVBO(
- const glm::vec3 &pos,
- std::vector<glm::vec3> &vertices,
- std::vector<glm::vec3> &colors,
- std::vector<glm::vec3> &normals
-) const {
- vertices.emplace_back(pos.x , pos.y , pos.z + 1); // front
- vertices.emplace_back(pos.x + 1, pos.y , pos.z + 1);
- vertices.emplace_back(pos.x , pos.y + 1, pos.z + 1);
- vertices.emplace_back(pos.x + 1, pos.y , pos.z + 1);
- vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z + 1);
- vertices.emplace_back(pos.x , pos.y + 1, pos.z + 1);
- vertices.emplace_back(pos.x , pos.y , pos.z ); // back
- vertices.emplace_back(pos.x , pos.y + 1, pos.z );
- vertices.emplace_back(pos.x + 1, pos.y , pos.z );
- vertices.emplace_back(pos.x + 1, pos.y , pos.z );
- vertices.emplace_back(pos.x , pos.y + 1, pos.z );
- vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z );
- vertices.emplace_back(pos.x , pos.y + 1, pos.z ); // top
- vertices.emplace_back(pos.x , pos.y + 1, pos.z + 1);
- vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z );
- vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z );
- vertices.emplace_back(pos.x , pos.y + 1, pos.z + 1);
- vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z + 1);
- vertices.emplace_back(pos.x , pos.y , pos.z ); // bottom
- vertices.emplace_back(pos.x + 1, pos.y , pos.z );
- vertices.emplace_back(pos.x , pos.y , pos.z + 1);
- vertices.emplace_back(pos.x + 1, pos.y , pos.z );
- vertices.emplace_back(pos.x + 1, pos.y , pos.z + 1);
- vertices.emplace_back(pos.x , pos.y , pos.z + 1);
- vertices.emplace_back(pos.x , pos.y , pos.z ); // left
- vertices.emplace_back(pos.x , pos.y , pos.z + 1);
- vertices.emplace_back(pos.x , pos.y + 1, pos.z );
- vertices.emplace_back(pos.x , pos.y + 1, pos.z );
- vertices.emplace_back(pos.x , pos.y , pos.z + 1);
- vertices.emplace_back(pos.x , pos.y + 1, pos.z + 1);
- vertices.emplace_back(pos.x + 1, pos.y , pos.z ); // right
- vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z );
- vertices.emplace_back(pos.x + 1, pos.y , pos.z + 1);
- vertices.emplace_back(pos.x + 1, pos.y , pos.z + 1);
- vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z );
- vertices.emplace_back(pos.x + 1, pos.y + 1, pos.z + 1);
-
- colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // front
- colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // back
- colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // top
- colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // bottom
- colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // left
- colors.insert(colors.end(), 6, glm::vec3(1.0f, 1.0f, 1.0f)); // right
-
- normals.insert(normals.end(), 6, glm::vec3( 0.0f, 0.0f, 1.0f)); // front
- normals.insert(normals.end(), 6, glm::vec3( 0.0f, 0.0f, -1.0f)); // back
- normals.insert(normals.end(), 6, glm::vec3( 0.0f, 1.0f, 0.0f)); // top
- normals.insert(normals.end(), 6, glm::vec3( 0.0f, -1.0f, 0.0f)); // bottom
- normals.insert(normals.end(), 6, glm::vec3(-1.0f, 0.0f, 0.0f)); // left
- normals.insert(normals.end(), 6, glm::vec3( 1.0f, 0.0f, 0.0f)); // right
+World::World(const Config &config)
+: blockType()
+, blockShape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f }})
+, stairShape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f }}, { 0.0f, 0.0f })
+, slabShape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.0f, 0.5f }})
+, generate(config.gen)
+, chunks(config.load, blockType, generate)
+, player()
+, entities()
+, light_direction(config.light_direction)
+, fog_density(config.fog_density) {
+ BlockType::Faces block_fill = { true, true, true, true, true, true };
+ BlockType::Faces slab_fill = { false, true, false, false, false, false };
+ BlockType::Faces stair_fill = { false, true, false, false, false, true };
+
+ { // white block
+ BlockType type(true, { 1.0f, 1.0f, 1.0f }, &blockShape);
+ type.block_light = true;
+ type.fill = block_fill;
+ blockType.Add(type);
+ }
+ { // white slab
+ BlockType type(true, { 1.0f, 1.0f, 1.0f }, &slabShape);
+ type.block_light = true;
+ type.fill = slab_fill;
+ blockType.Add(type);
+ }
+ { // white stair
+ BlockType type(true, { 1.0f, 1.0f, 1.0f }, &stairShape);
+ type.block_light = true;
+ type.fill = stair_fill;
+ blockType.Add(type);
+ }
+
+ { // red block
+ BlockType type(true, { 1.0f, 0.0f, 0.0f }, &blockShape);
+ type.block_light = true;
+ type.fill = block_fill;
+ blockType.Add(type);
+ }
+ { // red slab
+ BlockType type(true, { 1.0f, 0.0f, 0.0f }, &slabShape);
+ type.block_light = true;
+ type.fill = slab_fill;
+ blockType.Add(type);
+ }
+ { // red stair
+ BlockType type(true, { 1.0f, 0.0f, 0.0f }, &stairShape);
+ type.block_light = true;
+ type.fill = stair_fill;
+ blockType.Add(type);
+ }
+
+ { // green block
+ BlockType type(true, { 0.0f, 1.0f, 0.0f }, &blockShape);
+ type.block_light = true;
+ type.fill = block_fill;
+ blockType.Add(type);
+ }
+ { // green slab
+ BlockType type(true, { 0.0f, 1.0f, 0.0f }, &slabShape);
+ type.block_light = true;
+ type.fill = slab_fill;
+ blockType.Add(type);
+ }
+ { // green stair
+ BlockType type(true, { 0.0f, 1.0f, 0.0f }, &stairShape);
+ type.block_light = true;
+ type.fill = stair_fill;
+ blockType.Add(type);
+ }
+
+ { // blue block
+ BlockType type(true, { 0.0f, 0.0f, 1.0f }, &blockShape);
+ type.block_light = true;
+ type.fill = block_fill;
+ blockType.Add(type);
+ }
+ { // blue slab
+ BlockType type(true, { 0.0f, 0.0f, 1.0f }, &slabShape);
+ type.block_light = true;
+ type.fill = slab_fill;
+ blockType.Add(type);
+ }
+ { // blue stair
+ BlockType type(true, { 0.0f, 0.0f, 1.0f }, &stairShape);
+ type.block_light = true;
+ type.fill = stair_fill;
+ blockType.Add(type);
+ }
+
+ { // glowing yellow block
+ BlockType type(true, { 1.0f, 1.0f, 0.0f }, &blockShape);
+ type.luminosity = 15;
+ type.block_light = true;
+ type.fill = block_fill;
+ blockType.Add(type);
+ }
+
+ generate.Space(0);
+ generate.Light(13);
+ generate.Solids({ 1, 4, 7, 10 });
+
+ player = &AddEntity();
+ player->Position(config.spawn);
+
+ chunks.GenerateSurrounding(player->ChunkCoords());