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