]> git.lizzy.rs Git - dragonblocks3d.git/blobdiff - src/dragonblocks/player.cpp
Added player, refactored mesh code
[dragonblocks3d.git] / src / dragonblocks / player.cpp
diff --git a/src/dragonblocks/player.cpp b/src/dragonblocks/player.cpp
new file mode 100644 (file)
index 0000000..b007d79
--- /dev/null
@@ -0,0 +1,88 @@
+#include <stdexcept>
+#include "camera.hpp"
+#include "input_handler.hpp"
+#include "map.hpp"
+#include "player.hpp"
+
+using namespace std;
+using namespace glm;
+using namespace dragonblocks;
+
+Player* Player::localplayer = nullptr;
+
+Player *Player::createLocalplayer(Camera *c, InputHandler *i, Map *m)
+{
+       if (localplayer)
+               throw runtime_error("Localplayer already exists");
+       return localplayer = new Player(c, i, m);
+}
+
+void Player::staticMouseHandler(double dtime, double x, double y)
+{
+       localplayer->mouseHandler(dtime, x, y);
+}
+
+void Player::staticKeyHandler(double dtime, set<int> keys)
+{
+       localplayer->keyHandler(dtime, keys);
+}
+
+void Player::mouseHandler(double dtime, double x, double y)
+{
+       yaw += x;
+       pitch -= y;
+       pitch = clamp(pitch, -89.0, 89.0);
+       camera->update(yaw, pitch);
+}
+
+void Player::keyHandler(double dtime, set<int> keys)
+{
+       vec3 vel = vec3(speed * dtime);
+       vec3 front = camera->front(), right = camera->right(), up = camera->up();
+       if (! pitch_move) {
+               front = normalize(vec3(front.x, 0, front.z));
+               up = normalize(vec3(0, up.y, 0));
+       }
+       if (keys.find(GLFW_KEY_W) != keys.end()) {
+               pos += vel * front;
+       } else if (keys.find(GLFW_KEY_S) != keys.end()) {
+               pos -= vel * front;
+       }
+       if (keys.find(GLFW_KEY_D) != keys.end()) {
+               pos += vel * right;
+       } else if (keys.find(GLFW_KEY_A) != keys.end()) {
+               pos -= vel * right;
+       }
+       if (keys.find(GLFW_KEY_SPACE) != keys.end()) {
+               pos += vel * up;
+       } else if (keys.find(GLFW_KEY_LEFT_SHIFT) != keys.end()) {
+               pos -= vel * up;
+       }
+       camera->pos = pos;
+       loadChunks();
+}
+
+void Player::loadChunks()
+{
+       ivec3 chunkp = Map::getChunkPos(pos);
+       for (int x = chunkp.x - 1; x <= chunkp.x + 1; x++) {
+               for (int y = chunkp.y - 1; y < chunkp.y + 1; y++) {
+                       for (int z = chunkp.z - 1; z <= chunkp.z + 1; z++) {
+                               map->createChunk(ivec3(x, y, z));
+                       }
+               }
+       }
+}
+
+Player::Player(Camera *c, InputHandler *i, Map *m) : camera(c), input_handler(i), map(m)
+{
+       input_handler->listenFor(GLFW_KEY_W);
+       input_handler->listenFor(GLFW_KEY_A);
+       input_handler->listenFor(GLFW_KEY_S);
+       input_handler->listenFor(GLFW_KEY_D);
+       input_handler->listenFor(GLFW_KEY_SPACE);
+       input_handler->listenFor(GLFW_KEY_LEFT_SHIFT);
+       
+       input_handler->addMouseHandler(Player::staticMouseHandler);
+       input_handler->addKeyHandler(Player::staticKeyHandler);
+}