]> git.lizzy.rs Git - dragonblocks3d.git/blob - src/dragonblocks/player.cpp
Frustum & Backface Culling
[dragonblocks3d.git] / src / dragonblocks / player.cpp
1 #include <stdexcept>
2 #include "camera.hpp"
3 #include "input_handler.hpp"
4 #include "map.hpp"
5 #include "player.hpp"
6
7 using namespace std;
8 using namespace glm;
9 using namespace dragonblocks;
10
11 Player* Player::localplayer = nullptr;
12
13 Player *Player::createLocalplayer(Camera *c, InputHandler *i, Map *m)
14 {
15         if (localplayer)
16                 throw runtime_error("Localplayer already exists");
17         return localplayer = new Player(c, i, m);
18 }
19
20 void Player::staticMouseHandler(double dtime, double x, double y)
21 {
22         localplayer->mouseHandler(dtime, x, y);
23 }
24
25 void Player::staticKeyHandler(double dtime, set<int> keys)
26 {
27         localplayer->keyHandler(dtime, keys);
28 }
29
30 void Player::mouseHandler(double dtime, double x, double y)
31 {
32         yaw += x;
33         pitch -= y;
34         pitch = clamp(pitch, -89.0, 89.0);
35         camera->update(yaw, pitch);
36 }
37
38 void Player::keyHandler(double dtime, set<int> keys)
39 {
40         vec3 vel = vec3(speed * dtime);
41         vec3 front = camera->front(), right = camera->right(), up = camera->up();
42         if (! pitch_move) {
43                 front = normalize(vec3(front.x, 0, front.z));
44                 up = normalize(vec3(0, up.y, 0));
45         }
46         if (keys.find(GLFW_KEY_W) != keys.end()) {
47                 pos += vel * front;
48         } else if (keys.find(GLFW_KEY_S) != keys.end()) {
49                 pos -= vel * front;
50         }
51         if (keys.find(GLFW_KEY_D) != keys.end()) {
52                 pos += vel * right;
53         } else if (keys.find(GLFW_KEY_A) != keys.end()) {
54                 pos -= vel * right;
55         }
56         if (keys.find(GLFW_KEY_SPACE) != keys.end()) {
57                 pos += vel * up;
58         } else if (keys.find(GLFW_KEY_LEFT_SHIFT) != keys.end()) {
59                 pos -= vel * up;
60         }
61         camera->pos = pos;
62         loadChunks();
63 }
64
65 void Player::loadChunks()
66 {
67         ivec3 chunkp = Map::getChunkPos(pos);
68         for (int x = chunkp.x - 1; x <= chunkp.x + 1; x++) {
69                 for (int y = chunkp.y - 1; y < chunkp.y + 1; y++) {
70                         for (int z = chunkp.z - 1; z <= chunkp.z + 1; z++) {
71                                 map->createChunk(ivec3(x, y, z));
72                         }
73                 }
74         }
75 }
76
77 Player::Player(Camera *c, InputHandler *i, Map *m) : camera(c), input_handler(i), map(m)
78 {
79         input_handler->listenFor(GLFW_KEY_W);
80         input_handler->listenFor(GLFW_KEY_A);
81         input_handler->listenFor(GLFW_KEY_S);
82         input_handler->listenFor(GLFW_KEY_D);
83         input_handler->listenFor(GLFW_KEY_SPACE);
84         input_handler->listenFor(GLFW_KEY_LEFT_SHIFT);
85         
86         input_handler->addMouseHandler(Player::staticMouseHandler);
87         input_handler->addKeyHandler(Player::staticKeyHandler);
88 }