]> git.localhorst.tv Git - blank.git/blob - src/standalone/MasterState.cpp
sped up chunk generation 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 , hud(env, config, player)
30 , manip(env, player.GetEntity())
31 , input(world, player, manip)
32 , interface(config, env.keymap, input, *this)
33 , generator(gc)
34 , chunk_loader(world.Chunks(), generator, save)
35 , chunk_renderer(player.GetChunks())
36 , skeletons()
37 , spawner(world, skeletons, env.rng)
38 , sky(env.loader.LoadCubeMap("skybox"))
39 , preload(env, chunk_loader, chunk_renderer)
40 , unload(env, world.Chunks(), save) {
41         TextureIndex tex_index;
42         env.loader.LoadBlockTypes("default", block_types, tex_index);
43         interface.SetInventorySlots(block_types.size() - 1);
44         generator.LoadTypes(block_types);
45         chunk_renderer.LoadTextures(env.loader, tex_index);
46         chunk_renderer.FogDensity(wc.fog_density);
47         skeletons.Load();
48         spawner.LimitSkeletons(0, skeletons.size());
49         if (save.Exists(player)) {
50                 save.Read(player);
51         } else {
52                 // TODO: spawn
53         }
54 }
55
56 MasterState::~MasterState() {
57         world.Chunks().UnregisterIndex(spawn_index);
58 }
59
60
61 void MasterState::OnEnter() {
62         env.state.Push(&preload);
63         env.window.GrabMouse();
64 }
65
66
67 void MasterState::Handle(const SDL_Event &event) {
68         switch (event.type) {
69                 case SDL_KEYDOWN:
70                         interface.HandlePress(event.key);
71                         break;
72                 case SDL_KEYUP:
73                         interface.HandleRelease(event.key);
74                         break;
75                 case SDL_MOUSEBUTTONDOWN:
76                         interface.HandlePress(event.button);
77                         break;
78                 case SDL_MOUSEBUTTONUP:
79                         interface.HandleRelease(event.button);
80                         break;
81                 case SDL_MOUSEMOTION:
82                         interface.Handle(event.motion);
83                         break;
84                 case SDL_MOUSEWHEEL:
85                         interface.Handle(event.wheel);
86                         break;
87                 case SDL_QUIT:
88                         Exit();
89                         break;
90                 default:
91                         break;
92         }
93 }
94
95 void MasterState::Update(int dt) {
96         input.Update(dt);
97         if (input.BlockFocus()) {
98                 hud.FocusBlock(input.BlockFocus().GetChunk(), input.BlockFocus().block);
99         } else if (input.EntityFocus()) {
100                 hud.FocusEntity(*input.EntityFocus().entity);
101         } else {
102                 hud.FocusNone();
103         }
104         hud.Display(block_types[player.GetInventorySlot() + 1]);
105         hud.Update(dt);
106         spawner.Update(dt);
107         world.Update(dt);
108         chunk_loader.Update(dt);
109         chunk_renderer.Update(dt);
110
111         glm::mat4 trans = player.GetEntity().Transform(player.GetEntity().ChunkCoords());
112         glm::vec3 dir(trans * glm::vec4(0.0f, 0.0f, -1.0f, 0.0f));
113         glm::vec3 up(trans * glm::vec4(0.0f, 1.0f, 0.0f, 0.0f));
114         env.audio.Position(player.GetEntity().Position());
115         env.audio.Velocity(player.GetEntity().Velocity());
116         env.audio.Orientation(dir, up);
117 }
118
119 void MasterState::Render(Viewport &viewport) {
120         viewport.WorldPosition(player.GetEntity().Transform(player.GetEntity().ChunkCoords()));
121         if (config.video.world) {
122                 chunk_renderer.Render(viewport);
123                 world.Render(viewport);
124                 sky.Render(viewport);
125         }
126         hud.Render(viewport);
127 }
128
129
130 void MasterState::SetAudio(bool b) {
131         config.audio.enabled = b;
132         if (b) {
133                 hud.PostMessage("Audio enabled");
134         } else {
135                 hud.PostMessage("Audio disabled");
136         }
137 }
138
139 void MasterState::SetVideo(bool b) {
140         config.video.world = b;
141         if (b) {
142                 hud.PostMessage("World rendering enabled");
143         } else {
144                 hud.PostMessage("World rendering disabled");
145         }
146 }
147
148 void MasterState::SetHUD(bool b) {
149         config.video.hud = b;
150         if (b) {
151                 hud.PostMessage("HUD rendering enabled");
152         } else {
153                 hud.PostMessage("HUD rendering disabled");
154         }
155 }
156
157 void MasterState::SetDebug(bool b) {
158         config.video.debug = b;
159         if (b) {
160                 hud.PostMessage("Debug rendering enabled");
161         } else {
162                 hud.PostMessage("Debug rendering disabled");
163         }
164 }
165
166 void MasterState::Exit() {
167         save.Write(player);
168         env.state.Switch(&unload);
169 }
170
171 }
172 }