#include "model.hpp"
#include "geometry.hpp"
+#include <list>
#include <vector>
#include <GL/glew.h>
#include <glm/glm.hpp>
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(),
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:
private:
std::vector<Block> blocks;
Model model;
+ glm::vec3 position;
+ glm::mat4 transform;
bool dirty;
};
+
+class World {
+
+public:
+ World();
+
+ void Generate();
+
+ bool Intersection(
+ const Ray &,
+ const glm::mat4 &M,
+ Chunk **chunk = nullptr,
+ int *blkid = nullptr,
+ float *dist = nullptr,
+ glm::vec3 *normal = nullptr);
+
+ BlockTypeRegistry &BlockTypes() { return blockType; }
+ std::list<Chunk> &LoadedChunks() { return chunks; }
+
+ Chunk &Next(const Chunk &, const glm::vec3 &dir);
+
+private:
+ Chunk &Generate(const glm::vec3 &);
+
+private:
+ BlockTypeRegistry blockType;
+ std::list<Chunk> chunks;
+
+};
+
}
#endif