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