]> git.localhorst.tv Git - blank.git/blob - src/app/WorldState.cpp
give unique IDs to entities
[blank.git] / src / app / WorldState.cpp
1 #include "WorldState.hpp"
2
3 #include "Environment.hpp"
4 #include "init.hpp"
5 #include "TextureIndex.hpp"
6
7 #include <SDL.h>
8
9
10 namespace blank {
11
12 WorldState::WorldState(
13         Environment &env,
14         const Interface::Config &ic,
15         const World::Config &wc,
16         const WorldSave &save
17 )
18 : env(env)
19 , block_types()
20 , world(block_types, wc, save)
21 , chunk_renderer(world, wc.load.load_dist)
22 , spawner(world, wc.gen.seed)
23 , interface(ic, env, world, *world.AddPlayer(ic.player_name))
24 , preload(env, world.Loader(), chunk_renderer)
25 , unload(env, world.Loader()) {
26         TextureIndex tex_index;
27         env.loader.LoadBlockTypes("default", block_types, tex_index);
28         chunk_renderer.LoadTextures(env.loader, tex_index);
29         chunk_renderer.FogDensity(wc.fog_density);
30         // TODO: better solution for initializing HUD
31         interface.SelectNext();
32 }
33
34
35 void WorldState::OnEnter() {
36         env.state.Push(&preload);
37         env.window.GrabMouse();
38 }
39
40
41 void WorldState::Handle(const SDL_Event &event) {
42         switch (event.type) {
43                 case SDL_KEYDOWN:
44                         interface.HandlePress(event.key);
45                         break;
46                 case SDL_KEYUP:
47                         interface.HandleRelease(event.key);
48                         break;
49                 case SDL_MOUSEBUTTONDOWN:
50                         interface.HandlePress(event.button);
51                         break;
52                 case SDL_MOUSEBUTTONUP:
53                         interface.HandleRelease(event.button);
54                         break;
55                 case SDL_MOUSEMOTION:
56                         interface.Handle(event.motion);
57                         break;
58                 case SDL_MOUSEWHEEL:
59                         interface.Handle(event.wheel);
60                         break;
61                 case SDL_QUIT:
62                         env.state.Switch(&unload);
63                         break;
64                 default:
65                         break;
66         }
67 }
68
69 void WorldState::Update(int dt) {
70         interface.Update(dt);
71         spawner.Update(dt);
72         world.Update(dt);
73         chunk_renderer.Rebase(interface.Player().ChunkCoords());
74         chunk_renderer.Update(dt);
75
76         glm::mat4 trans = interface.Player().Transform(interface.Player().ChunkCoords());
77         glm::vec3 dir(trans * glm::vec4(0.0f, 0.0f, -1.0f, 0.0f));
78         glm::vec3 up(trans * glm::vec4(0.0f, 1.0f, 0.0f, 0.0f));
79         env.audio.Position(interface.Player().Position());
80         env.audio.Velocity(interface.Player().Velocity());
81         env.audio.Orientation(dir, up);
82 }
83
84 void WorldState::Render(Viewport &viewport) {
85         viewport.WorldPosition(interface.Player().Transform(interface.Player().ChunkCoords()));
86         chunk_renderer.Render(viewport);
87         world.Render(viewport);
88         interface.Render(viewport);
89 }
90
91 }