X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld.hpp;h=3dd04fb31add2b0a8738328c824f54884875b21a;hb=d2d3cb877984b97fafb97254f5005cbf4bcf47a6;hp=304c63a7eded25d33bf7ed26e6e3d182fff2f3a3;hpb=482114e156e91729f2529ea6bb1fe98dacdee97f;p=blank.git diff --git a/src/world.hpp b/src/world.hpp index 304c63a..3dd04fb 100644 --- a/src/world.hpp +++ b/src/world.hpp @@ -1,88 +1,73 @@ #ifndef BLANK_WORLD_HPP_ #define BLANK_WORLD_HPP_ -#include "model.hpp" - -#include -#include +#include "block.hpp" +#include "chunk.hpp" +#include "entity.hpp" +#include "generator.hpp" +#include "shader.hpp" +#include "shape.hpp" + +#include #include namespace blank { -/// attributes of a type of block -struct BlockType { - - bool visible; - - constexpr explicit BlockType(bool v = false) - : visible(v) { } - - static const BlockType DEFAULT; - - - void FillVBO( - const glm::vec3 &pos, - std::vector &vertices, - std::vector &colors, - std::vector &normals - ) const; - - void FillModel(const glm::vec3 &pos, Model &m) const { - FillVBO(pos, m.vertices, m.colors, m.normals); - } - -}; +class World { +public: + struct Config { + // initial player position + glm::vec3 spawn = { 4.0f, 4.0f, 4.0f }; + // direction facing towards(!) the light + glm::vec3 light_direction = { -1.0f, -3.0f, -2.0f }; + // fade out reaches 1/e (0.3679) at 1/fog_density, + // gets less than 0.01 at e/(2 * fog_density) + // I chose 0.011 because it yields 91 and 124 for those, so + // slightly less than 6 and 8 chunks + float fog_density = 0.011f; -/// single 1x1x1 cube -struct Block { - - const BlockType *type; - - constexpr explicit Block(const BlockType *t = &BlockType::DEFAULT) - : type(t) { } + Generator::Config gen = Generator::Config(); + ChunkLoader::Config load = ChunkLoader::Config(); + }; -}; + explicit World(const Config &); + bool Intersection( + const Ray &, + const glm::mat4 &M, + Chunk **chunk = nullptr, + int *blkid = nullptr, + float *dist = nullptr, + glm::vec3 *normal = nullptr); -/// cube of size 16 (256 tiles, 4096 blocks) -class Chunk { + BlockTypeRegistry &BlockTypes() { return blockType; } -public: - Chunk(); + Entity &Player() { return *player; } + Entity &AddEntity() { entities.emplace_back(); return entities.back(); } - static constexpr int Width() { return 16; } - static constexpr int Height() { return 16; } - static constexpr int Depth() { return 16; } - static constexpr int Size() { return Width() * Height() * Depth(); } + Chunk &PlayerChunk(); + Chunk &Next(const Chunk &to, const glm::tvec3 &dir); - static constexpr int ToIndex(const glm::vec3 &pos) { - return pos.x + pos.y * Width() + pos.z * Width() * Height(); - } - static glm::vec3 ToCoords(int idx) { - return glm::vec3( - idx % Width(), - (idx / Width()) % Height(), - idx / (Width() * Height()) - ); - } + void Update(int dt); - void Invalidate() { dirty = true; } + void Render(DirectionalLighting &); - Block &BlockAt(const glm::vec3 &pos) { return blocks[ToIndex(pos)]; } - const Block &BlockAt(const glm::vec3 &pos) const { return blocks[ToIndex(pos)]; } +private: + BlockTypeRegistry blockType; + CuboidShape blockShape; + StairShape stairShape; + CuboidShape slabShape; - void Draw(); + Generator generate; + ChunkLoader chunks; -private: - int VertexCount() const; - void Update(); + Entity *player; + std::list entities; -private: - std::vector blocks; - Model model; - bool dirty; + glm::vec3 light_direction; + float fog_density; };