X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld.hpp;h=bca1e0c082e190aadfe147abd2efcd7b852b69d5;hb=bd6bd2c875f4b6baef913e5315aa9f7e7cd7da7a;hp=67ee355ccbc386d5d8fb08f75ec5c0b7d7fb27df;hpb=8881c507009521d08648560984c0f50166224542;p=blank.git diff --git a/src/world.hpp b/src/world.hpp index 67ee355..bca1e0c 100644 --- a/src/world.hpp +++ b/src/world.hpp @@ -1,120 +1,55 @@ #ifndef BLANK_WORLD_HPP_ #define BLANK_WORLD_HPP_ -#include "model.hpp" -#include "geometry.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 { - - int id; - - bool visible; - glm::vec3 color; - - constexpr explicit BlockType( - bool v = false, - const glm::vec3 &color = { 1, 1, 1 }) - : id(-1), visible(v), color(color) { } - - 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 BlockTypeRegistry { - -public: - BlockTypeRegistry(); +class World { public: - int Add(const BlockType &); - - BlockType *operator [](int id) { return &types[id]; } - const BlockType *Get(int id) const { return &types[id]; } - -private: - std::vector types; - -}; - - -/// single 1x1x1 cube -struct Block { - - const BlockType *type; - - constexpr explicit Block(const BlockType *t = &BlockType::DEFAULT) - : type(t) { } - -}; - - -/// cube of size 16 (256 tiles, 4096 blocks) -class Chunk { - -public: - Chunk(); - - 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(); } - - 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 Invalidate() { dirty = true; } - - Block &BlockAt(int index) { return blocks[index]; } - const Block &BlockAt(int index) const { return blocks[index]; } - Block &BlockAt(const glm::vec3 &pos) { return BlockAt(ToIndex(pos)); } - const Block &BlockAt(const glm::vec3 &pos) const { return BlockAt(ToIndex(pos)); } + explicit World(unsigned int seed); bool Intersection( const Ray &, const glm::mat4 &M, + Chunk **chunk = nullptr, int *blkid = nullptr, float *dist = nullptr, - glm::vec3 *normal = nullptr) const; + glm::vec3 *normal = nullptr); - void Draw(); + BlockTypeRegistry &BlockTypes() { return blockType; } -private: - int VertexCount() const; - void Update(); + Entity &Player() { return *player; } + Entity &AddEntity() { entities.emplace_back(); return entities.back(); } + + Chunk &PlayerChunk(); + Chunk &Next(const Chunk &to, const glm::tvec3 &dir); + + void Update(int dt); + + void Render(DirectionalLighting &); private: - std::vector blocks; - Model model; - bool dirty; + BlockTypeRegistry blockType; + CuboidShape blockShape; + StairShape stairShape; + CuboidShape slabShape; + + Generator generate; + ChunkLoader chunks; + + Entity *player; + std::list entities; };