X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld.hpp;h=8ef2b21b2b05ee7d7106a8af536e0a2bf36e85b4;hb=cb959294a8271969ddfe411471d7f04e82c4788a;hp=6fabe9a0725e69b63a93797bb673788ca60abb6b;hpb=d6435142245c019523b9385048d6d79bdd2565f2;p=blank.git diff --git a/src/world.hpp b/src/world.hpp index 6fabe9a..8ef2b21 100644 --- a/src/world.hpp +++ b/src/world.hpp @@ -1,171 +1,25 @@ #ifndef BLANK_WORLD_HPP_ #define BLANK_WORLD_HPP_ -#include "geometry.hpp" -#include "model.hpp" +#include "block.hpp" +#include "chunk.hpp" +#include "entity.hpp" +#include "noise.hpp" +#include "shader.hpp" #include "shape.hpp" #include -#include -#include #include namespace blank { -/// attributes of a type of block -struct BlockType { - - int id; - - bool visible; - - const Shape *shape; - glm::vec3 color; - glm::vec3 outline_color; - - explicit BlockType( - bool v = false, - const glm::vec3 &color = { 1, 1, 1 }, - const Shape *shape = &DEFAULT_SHAPE, - const glm::vec3 &outline_color = { -1, -1, -1 }) - : id(-1), visible(v), shape(shape), color(color), outline_color(outline_color) { } - - static const BlockType DEFAULT; - static const CuboidShape DEFAULT_SHAPE; - - - 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); - m.Invalidate(); - } - - - void FillOutlineVBO( - std::vector &vertices, - std::vector &colors - ) const; - - void FillOutlineModel(OutlineModel &m) const { - FillOutlineVBO(m.vertices, m.colors); - m.Invalidate(); - } - -}; - - -class BlockTypeRegistry { - -public: - BlockTypeRegistry(); - -public: - int Add(const BlockType &); - - size_t Size() const { return types.size(); } - - 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(); - - Chunk(Chunk &&); - Chunk &operator =(Chunk &&); - - static constexpr int Width() { return 16; } - static constexpr int Height() { return 16; } - static constexpr int Depth() { return 16; } - static glm::vec3 Extent() { return glm::vec3(Width(), Height(), Depth()); } - static constexpr int Size() { return Width() * Height() * Depth(); } - - static constexpr bool InBounds(const glm::vec3 &pos) { - return - pos.x >= 0 && pos.x < Width() && - pos.y >= 0 && pos.y < Height() && - pos.z >= 0 && pos.z < Depth(); - } - static constexpr int ToIndex(const glm::vec3 &pos) { - return pos.x + pos.y * Width() + pos.z * Width() * Height(); - } - static constexpr bool InBounds(int idx) { - return idx >= 0 && idx < Size(); - } - 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)); } - - bool Intersection( - const Ray &, - const glm::mat4 &M, - int *blkid = nullptr, - float *dist = nullptr, - glm::vec3 *normal = nullptr) const; - - void Position(const glm::vec3 &); - const glm::vec3 &Position() const { return position; } - const glm::mat4 &Transform() const { return transform; } - - void Draw(); - -private: - int VertexCount() const; - void Update(); - -private: - std::vector blocks; - Model model; - glm::vec3 position; - glm::mat4 transform; - bool dirty; - -}; - - class World { public: World(); - void Generate(); + void Generate(const glm::tvec3 &from, const glm::tvec3 &to); bool Intersection( const Ray &, @@ -176,12 +30,18 @@ public: glm::vec3 *normal = nullptr); BlockTypeRegistry &BlockTypes() { return blockType; } - std::list &LoadedChunks() { return chunks; } + std::list &LoadedChunks() { return loaded; } + + Entity &Player() { return player; } Chunk &Next(const Chunk &, const glm::vec3 &dir); + void Update(int dt); + + void Render(DirectionalLighting &); + private: - Chunk &Generate(const glm::vec3 &); + void Generate(Chunk &); private: BlockTypeRegistry blockType; @@ -189,7 +49,13 @@ private: StairShape stairShape; CuboidShape slabShape; - std::list chunks; + SimplexNoise blockNoise; + SimplexNoise colorNoise; + + Entity player; + + std::list loaded; + std::list to_generate; };