]> git.localhorst.tv Git - blank.git/blob - src/standalone/MasterState.cpp
rearrange init of standalone state a little
[blank.git] / src / standalone / MasterState.cpp
1 #include "MasterState.hpp"
2
3 #include "../app/Config.hpp"
4 #include "../app/Environment.hpp"
5 #include "../app/init.hpp"
6 #include "../app/TextureIndex.hpp"
7 #include "../io/WorldSave.hpp"
8
9 #include <SDL.h>
10
11
12 namespace blank {
13 namespace standalone {
14
15 MasterState::MasterState(
16         Environment &env,
17         Config &config,
18         const Generator::Config &gc,
19         const World::Config &wc,
20         const WorldSave &save
21 )
22 : config(config)
23 , env(env)
24 , block_types()
25 , save(save)
26 , world(block_types, wc)
27 , spawn_index(world.Chunks().MakeIndex(wc.spawn, 3))
28 , player(*world.AddPlayer(config.player.name))
29 , spawn_player(false)
30 , hud(env, config, player)
31 , manip(env, player.GetEntity())
32 , input(world, player, manip)
33 , interface(config, env.keymap, input, *this)
34 , generator(gc)
35 , chunk_loader(world.Chunks(), generator, save)
36 , chunk_renderer(player.GetChunks())
37 , skeletons()
38 , spawner(world, skeletons, env.rng)
39 , sky(env.loader.LoadCubeMap("skybox"))
40 , preload(env, chunk_loader, chunk_renderer)
41 , unload(env, world.Chunks(), save) {
42         TextureIndex tex_index;
43         env.loader.LoadBlockTypes("default", block_types, tex_index);
44         interface.SetInventorySlots(block_types.size() - 1);
45         generator.LoadTypes(block_types);
46         chunk_renderer.LoadTextures(env.loader, tex_index);
47         chunk_renderer.FogDensity(wc.fog_density);
48         skeletons.Load();
49         spawner.LimitSkeletons(0, skeletons.size());
50         if (save.Exists(player)) {
51                 save.Read(player);
52         } else {
53                 spawn_player = true;
54         }
55 }
56
57 MasterState::~MasterState() {
58         world.Chunks().UnregisterIndex(spawn_index);
59 }
60
61
62 void MasterState::OnResume() {
63         if (spawn_index.MissingChunks() > 0) {
64                 env.state.Push(&preload);
65         }
66         if (config.input.mouse) {
67                 env.window.GrabMouse();
68         }
69         if (spawn_player) {
70                 // TODO: spawn
71                 spawn_player = false;
72         }
73 }
74
75 void MasterState::OnPause() {
76         env.window.ReleaseMouse();
77 }
78
79
80 void MasterState::Handle(const SDL_Event &event) {
81         switch (event.type) {
82                 case SDL_KEYDOWN:
83                         interface.HandlePress(event.key);
84                         break;
85                 case SDL_KEYUP:
86                         interface.HandleRelease(event.key);
87                         break;
88                 case SDL_MOUSEBUTTONDOWN:
89                         interface.HandlePress(event.button);
90                         break;
91                 case SDL_MOUSEBUTTONUP:
92                         interface.HandleRelease(event.button);
93                         break;
94                 case SDL_MOUSEMOTION:
95                         interface.Handle(event.motion);
96                         break;
97                 case SDL_MOUSEWHEEL:
98                         interface.Handle(event.wheel);
99                         break;
100                 case SDL_QUIT:
101                         Exit();
102                         break;
103                 default:
104                         break;
105         }
106 }
107
108 void MasterState::Update(int dt) {
109         input.Update(dt);
110         if (input.BlockFocus()) {
111                 hud.FocusBlock(input.BlockFocus().GetChunk(), input.BlockFocus().block);
112         } else if (input.EntityFocus()) {
113                 hud.FocusEntity(*input.EntityFocus().entity);
114         } else {
115                 hud.FocusNone();
116         }
117         hud.Display(block_types[player.GetInventorySlot() + 1]);
118         hud.Update(dt);
119         spawner.Update(dt);
120         world.Update(dt);
121         chunk_loader.Update(dt);
122         chunk_renderer.Update(dt);
123
124         glm::mat4 trans = player.GetEntity().Transform(player.GetEntity().ChunkCoords());
125         glm::vec3 dir(trans * glm::vec4(0.0f, 0.0f, -1.0f, 0.0f));
126         glm::vec3 up(trans * glm::vec4(0.0f, 1.0f, 0.0f, 0.0f));
127         env.audio.Position(player.GetEntity().Position());
128         env.audio.Velocity(player.GetEntity().Velocity());
129         env.audio.Orientation(dir, up);
130 }
131
132 void MasterState::Render(Viewport &viewport) {
133         viewport.WorldPosition(player.GetEntity().Transform(player.GetEntity().ChunkCoords()));
134         if (config.video.world) {
135                 chunk_renderer.Render(viewport);
136                 world.Render(viewport);
137                 sky.Render(viewport);
138         }
139         hud.Render(viewport);
140 }
141
142
143 void MasterState::SetAudio(bool b) {
144         config.audio.enabled = b;
145         if (b) {
146                 hud.PostMessage("Audio enabled");
147         } else {
148                 hud.PostMessage("Audio disabled");
149         }
150 }
151
152 void MasterState::SetVideo(bool b) {
153         config.video.world = b;
154         if (b) {
155                 hud.PostMessage("World rendering enabled");
156         } else {
157                 hud.PostMessage("World rendering disabled");
158         }
159 }
160
161 void MasterState::SetHUD(bool b) {
162         config.video.hud = b;
163         if (b) {
164                 hud.PostMessage("HUD rendering enabled");
165         } else {
166                 hud.PostMessage("HUD rendering disabled");
167         }
168 }
169
170 void MasterState::SetDebug(bool b) {
171         config.video.debug = b;
172         if (b) {
173                 hud.PostMessage("Debug rendering enabled");
174         } else {
175                 hud.PostMessage("Debug rendering disabled");
176         }
177 }
178
179 void MasterState::Exit() {
180         save.Write(player);
181         env.state.Switch(&unload);
182 }
183
184 }
185 }