]> git.localhorst.tv Git - blank.git/blob - src/world/World.hpp
use collision structures for ray tests
[blank.git] / src / world / World.hpp
1 #ifndef BLANK_WORLD_WORLD_HPP_
2 #define BLANK_WORLD_WORLD_HPP_
3
4 #include "BlockTypeRegistry.hpp"
5 #include "ChunkLoader.hpp"
6 #include "Entity.hpp"
7 #include "Generator.hpp"
8 #include "../graphics/ArrayTexture.hpp"
9
10 #include <list>
11 #include <vector>
12 #include <glm/glm.hpp>
13
14
15 namespace blank {
16
17 class Assets;
18 class EntityCollision;
19 class Viewport;
20 class WorldCollision;
21
22 class World {
23
24 public:
25         struct Config {
26                 // initial player position
27                 glm::vec3 spawn = { 0.0f, 0.0f, 0.0f };
28                 // direction facing towards(!) the light
29                 glm::vec3 light_direction = { -1.0f, -3.0f, -2.0f };
30                 // fade out reaches 1/e (0.3679) at 1/fog_density,
31                 // gets less than 0.01 at e/(2 * fog_density)
32                 // I chose 0.011 because it yields 91 and 124 for those, so
33                 // slightly less than 6 and 8 chunks
34                 float fog_density = 0.011f;
35
36                 Generator::Config gen = Generator::Config();
37                 ChunkLoader::Config load = ChunkLoader::Config();
38         };
39
40         World(const Assets &, const Config &, const WorldSave &);
41
42         /// check if this ray hits a block
43         /// depth in the collision is the distance between the ray's
44         /// origin and the intersection point
45         bool Intersection(
46                 const Ray &,
47                 const glm::mat4 &M,
48                 WorldCollision &);
49
50         /// check if this ray hits an entity
51         bool Intersection(
52                 const Ray &,
53                 const glm::mat4 &M,
54                 EntityCollision &);
55
56         /// check if given entity intersects with the world
57         bool Intersection(const Entity &e, std::vector<WorldCollision> &);
58         void Resolve(Entity &e, std::vector<WorldCollision> &);
59
60         BlockTypeRegistry &BlockTypes() noexcept { return block_type; }
61         ChunkLoader &Loader() noexcept { return chunks; }
62
63         Entity &Player() { return *player; }
64         Entity &AddEntity() { entities.emplace_back(); return entities.back(); }
65
66         Chunk &PlayerChunk();
67         Chunk &Next(const Chunk &to, const glm::ivec3 &dir);
68
69         void Update(int dt);
70
71         void Render(Viewport &);
72
73 private:
74         BlockTypeRegistry block_type;
75
76         ArrayTexture block_tex;
77
78         Generator generate;
79         ChunkLoader chunks;
80
81         Entity *player;
82         std::list<Entity> entities;
83
84         glm::vec3 light_direction;
85         float fog_density;
86
87 };
88
89 }
90
91 #endif