From e0feb5bfe17ff9d57ecb050a2f9050f39616c987 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 13 Sep 2020 15:10:56 +0200 Subject: [PATCH] Added player, refactored mesh code --- .gitignore | 1 + src/dragonblocks/CMakeLists.txt | 3 +- src/dragonblocks/chunk.cpp | 36 +++++---- src/dragonblocks/chunk.hpp | 7 +- src/dragonblocks/client.cpp | 21 +++-- src/dragonblocks/client.hpp | 2 + src/dragonblocks/core.cpp | 18 ----- src/dragonblocks/core.hpp | 8 +- src/dragonblocks/gldebug.cpp | 2 +- src/dragonblocks/input_handler.cpp | 91 ++++++++++------------ src/dragonblocks/input_handler.hpp | 21 ++--- src/dragonblocks/log.cpp | 6 -- src/dragonblocks/mainmenu.cpp | 9 --- src/dragonblocks/mainmenu.hpp | 11 --- src/dragonblocks/map.cpp | 2 +- src/dragonblocks/mesh.cpp | 121 +++++++++++++---------------- src/dragonblocks/mesh.hpp | 37 ++++----- src/dragonblocks/player.cpp | 88 +++++++++++++++++++++ src/dragonblocks/player.hpp | 38 +++++++++ src/dragonblocks/render_engine.cpp | 29 ++----- src/dragonblocks/render_engine.hpp | 5 +- src/dragonblocks/server.cpp | 9 --- src/dragonblocks/server.hpp | 11 --- 23 files changed, 305 insertions(+), 271 deletions(-) delete mode 100644 src/dragonblocks/mainmenu.cpp delete mode 100644 src/dragonblocks/mainmenu.hpp create mode 100644 src/dragonblocks/player.cpp create mode 100644 src/dragonblocks/player.hpp delete mode 100644 src/dragonblocks/server.cpp delete mode 100644 src/dragonblocks/server.hpp diff --git a/.gitignore b/.gitignore index f9ec395..d552926 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ CTestTestfile.cmake _deps libdragonblocks.so dragonblockslauncher +oprofile_data/ diff --git a/src/dragonblocks/CMakeLists.txt b/src/dragonblocks/CMakeLists.txt index 5a62d25..bb7c5e4 100644 --- a/src/dragonblocks/CMakeLists.txt +++ b/src/dragonblocks/CMakeLists.txt @@ -15,14 +15,13 @@ add_library(dragonblocks SHARED gldebug.cpp input_handler.cpp log.cpp - mainmenu.cpp map.cpp mapgen.cpp mesh.cpp mesh_gen_mgr.cpp + player.cpp render_engine.cpp scene.cpp - server.cpp shader_program.cpp texture.cpp window.cpp diff --git a/src/dragonblocks/chunk.cpp b/src/dragonblocks/chunk.cpp index 267b6dc..ad8048d 100644 --- a/src/dragonblocks/chunk.cpp +++ b/src/dragonblocks/chunk.cpp @@ -8,6 +8,8 @@ #include "mesh.hpp" #include "texture.hpp" +#include "scene.hpp" + #define SIZE DRAGONBLOCKS_CHUNK_SIZE using namespace std; @@ -68,7 +70,7 @@ void Chunk::updateMesh() { log(string("Update Chunk Mesh at ") + to_string(pos.x) + " " + to_string(pos.y) + " " + to_string(pos.z)); - if (mesh_created && ! effect_finished) + if (mesh_created && ! animation_finished) return; bool mesh_created_before = mesh_created; @@ -125,29 +127,30 @@ void Chunk::updateMesh() if (! any_drawable_block) { if (! mesh_created_before) { - afterEffect(); + afterAnimation(); } else if (mesh) { - mesh->reset(); + delete mesh; + mesh = nullptr; } return; } - if (! mesh) { - mesh = new Mesh(scene); - } else { - mesh->reset(); - } + Mesh *oldmesh = mesh; + + mesh = new Mesh(scene, &vertices[0], vertices.size() * sizeof(GLfloat)); mesh->pos = pos * SIZE + SIZE / 2; - mesh->vertexConfig(&vertices[0], vertices.size() * sizeof(GLfloat)); mesh->textures = textures; mesh->vertices_per_texture = 6; if (! mesh_created_before) { - mesh->effect = Mesh::Effect(Mesh::Effect::Type::FLYIN, Chunk::staticAfterEffect, this); + mesh->animation = Mesh::Animation(Mesh::Animation::Type::FLYIN, Chunk::staticAfterAnimation, this); + } + + if (oldmesh) { + oldmesh->die(); } - mesh->addToScene(); } -Chunk::Chunk(Map *m, const glm::ivec3 &p, const Data &d, MeshGenMgr *mgt, Scene *s) : map(m), data(d), pos(p), mesh_gen_mgr(mgt), scene(s) +Chunk::Chunk(Map *m, const glm::ivec3 &p, const Data &d, MeshGenMgr *mg, Scene *s) : map(m), data(d), pos(p), mesh_gen_mgr(mg), scene(s) { addMeshUpdateTask(); } @@ -155,20 +158,19 @@ Chunk::Chunk(Map *m, const glm::ivec3 &p, const Data &d, MeshGenMgr *mgt, Scene Chunk::~Chunk() { if (mesh) { - mesh->removeFromScene(); delete mesh; } } -void Chunk::staticAfterEffect(void *chunk) +void Chunk::staticAfterAnimation(void *chunk) { if (chunk) { - ((Chunk *)chunk)->afterEffect(); + ((Chunk *)chunk)->afterAnimation(); } } -void Chunk::afterEffect() +void Chunk::afterAnimation() { - effect_finished = true; + animation_finished = true; addMeshUpdateTaskWithEdge(); } diff --git a/src/dragonblocks/chunk.hpp b/src/dragonblocks/chunk.hpp index 43921c1..5561c38 100644 --- a/src/dragonblocks/chunk.hpp +++ b/src/dragonblocks/chunk.hpp @@ -39,17 +39,16 @@ namespace dragonblocks ~Chunk(); private: - static void staticAfterEffect(void *); + static void staticAfterAnimation(void *); Map *map; Mesh *mesh = nullptr; MeshGenMgr *mesh_gen_mgr; Scene *scene; Data data; - bool effect_finished = false; + bool animation_finished = false; bool mesh_created = false; - void afterEffect(); - void deleteMesh(); + void afterAnimation(); }; }; diff --git a/src/dragonblocks/client.cpp b/src/dragonblocks/client.cpp index 4e49d36..c98cec3 100644 --- a/src/dragonblocks/client.cpp +++ b/src/dragonblocks/client.cpp @@ -6,6 +6,7 @@ #include "log.hpp" #include "map.hpp" #include "mapgen.hpp" +#include "player.hpp" #include "render_engine.hpp" #include "texture.hpp" #include "window.hpp" @@ -27,12 +28,8 @@ Client::Client() render_engine->window->setPos(0, 0); render_engine->window->setTitle("Dragonblocks"); render_engine->window->toggleFullscreen(); - render_engine->camera->pos = vec3(8, 8, 8); render_engine->input_handler->mouse_sensitivity = 20; - render_engine->input_handler->pitch_move = false; - render_engine->input_handler->yaw = -90; - render_engine->input_handler->pitch = -80; - render_engine->input_handler->speed = 10; + render_engine->setSky(vec3(0.52941176470588, 0.8078431372549, 0.92156862745098)); render_engine->setRenderDistance(1000); render_engine->setFov(86.1); @@ -41,6 +38,14 @@ Client::Client() map = new Map(mapgen, render_engine->mesh_gen_mgr, render_engine->scene); + player = Player::createLocalplayer(render_engine->camera, render_engine->input_handler, map); + + player->pitch_move = false; + player->yaw = -90; + player->pitch = -80; + player->speed = 10; + player->pos = vec3(8, 8, 8); + game = new Game(mapgen); log("Initialisation complete."); @@ -48,6 +53,8 @@ Client::Client() void Client::start() { - render_engine->mesh_gen_mgr->start(); - render_engine->loop(); + render_engine->startMeshGenMgr(); + while (render_engine->running()) { + render_engine->render(); + } } diff --git a/src/dragonblocks/client.hpp b/src/dragonblocks/client.hpp index a1a02b7..f779b68 100644 --- a/src/dragonblocks/client.hpp +++ b/src/dragonblocks/client.hpp @@ -5,6 +5,7 @@ namespace dragonblocks class Game; class Map; class Mapgen; + class Player; class RenderEngine; class Client @@ -13,6 +14,7 @@ namespace dragonblocks Game *game; Map *map; Mapgen *mapgen; + Player *player; RenderEngine *render_engine; void start(); diff --git a/src/dragonblocks/core.cpp b/src/dragonblocks/core.cpp index 9a7c5a7..a04ee56 100644 --- a/src/dragonblocks/core.cpp +++ b/src/dragonblocks/core.cpp @@ -1,15 +1,11 @@ #include "core.hpp" #include "client.hpp" #include "render_engine.hpp" -#include "server.hpp" -#include "mainmenu.hpp" using namespace dragonblocks; Gametype dragonblocks::gametype; Client *dragonblocks::client = nullptr; -Server *dragonblocks::server = nullptr; -Mainmenu *dragonblocks::mainmenu = nullptr; extern "C" void _dragonblocks_start_client() { @@ -17,17 +13,3 @@ extern "C" void _dragonblocks_start_client() client = new Client(); client->start(); } - -extern "C" void _dragonblocks_start_server() -{ - gametype = Gametype::SERVER; - server = new Server(); - server->start(); -} - -extern "C" void _dragonblocks_start_mainmenu() -{ - gametype = Gametype::MAINMENU; - mainmenu = new Mainmenu(); - mainmenu->start(); -} diff --git a/src/dragonblocks/core.hpp b/src/dragonblocks/core.hpp index 7a1935e..788e899 100644 --- a/src/dragonblocks/core.hpp +++ b/src/dragonblocks/core.hpp @@ -3,18 +3,12 @@ namespace dragonblocks { class Client; - class Server; - class Mainmenu; enum Gametype { - SERVER, - CLIENT, - MAINMENU + CLIENT }; extern Gametype gametype; extern Client *client; - extern Server *server; - extern Mainmenu *mainmenu; } diff --git a/src/dragonblocks/gldebug.cpp b/src/dragonblocks/gldebug.cpp index 44a91fe..f71c4c3 100644 --- a/src/dragonblocks/gldebug.cpp +++ b/src/dragonblocks/gldebug.cpp @@ -21,7 +21,7 @@ GLenum dragonblocks::checkGLError(const char *file, int line) case GL_OUT_OF_MEMORY: error = "OUT_OF_MEMORY"; break; case GL_INVALID_FRAMEBUFFER_OPERATION: error = "INVALID_FRAMEBUFFER_OPERATION"; break; } - log(string("OpenGL Error: ") + error + " | " + file + " (" + ")"); + log(string("OpenGL Error: ") + error + " | " + file + " (" + to_string(line) + ")"); } return errorCode; } diff --git a/src/dragonblocks/input_handler.cpp b/src/dragonblocks/input_handler.cpp index 5e48c82..6ac64c3 100644 --- a/src/dragonblocks/input_handler.cpp +++ b/src/dragonblocks/input_handler.cpp @@ -12,74 +12,65 @@ void InputHandler::processInput(double dtime) processKeyInput(dtime); } -void InputHandler::processMouseInput(double dtime) +void InputHandler::listenFor(int key) { - vec2 cursor_delta = vec2(mouse_sensitivity * dtime) * (vec2)window->getCursorDelta(); - onMouseMove(dtime, cursor_delta.x, cursor_delta.y); + listened_keys.insert(key); } -void InputHandler::processKeyInput(double dtime) +void InputHandler::dontListenFor(int key) { - set keysDown; - for (auto it = listened_keys.begin(); it != listened_keys.end(); it++) { - int key = *it; - if (window->wasKeyDown(key)) { - keysDown.insert(key); - } - } - onKeyPress(dtime, keysDown); + listened_keys.erase(key); } -void InputHandler::onMouseMove(double dtime, double x, double y) +void InputHandler::addMouseHandler(void (*callback)(double, double, double)) { - yaw += x; - pitch -= y; - pitch = clamp(pitch, -89.0, 89.0); - camera->update(yaw, pitch); + mouse_handlers.insert(callback); } -void InputHandler::onKeyPress(double dtime, set keys) +void InputHandler::removeMouseHandler(void (*callback)(double, double, double)) { - 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()) { - camera->pos += vel * front; - } else if (keys.find(GLFW_KEY_S) != keys.end()) { - camera->pos -= vel * front; - } - if (keys.find(GLFW_KEY_D) != keys.end()) { - camera->pos += vel * right; - } else if (keys.find(GLFW_KEY_A) != keys.end()) { - camera->pos -= vel * right; - } - if (keys.find(GLFW_KEY_SPACE) != keys.end()) { - camera->pos += vel * up; - } else if (keys.find(GLFW_KEY_LEFT_SHIFT) != keys.end()) { - camera->pos -= vel * up; - } + mouse_handlers.erase(callback); } -void InputHandler::listenFor(int key) +void InputHandler::addKeyHandler(void (*callback)(double, set)) { - listened_keys.insert(key); + key_handlers.insert(callback); } -void InputHandler::dontListenFor(int key) +void InputHandler::removeKeyHandler(void (*callback)(double, set)) { - listened_keys.erase(key); + key_handlers.erase(callback); } -InputHandler::InputHandler(Camera *c, Window *w) : camera(c), window(w) +InputHandler::InputHandler(Window *w) : window(w) +{ +} + +void InputHandler::processMouseInput(double dtime) { - listenFor(GLFW_KEY_W); - listenFor(GLFW_KEY_A); - listenFor(GLFW_KEY_S); - listenFor(GLFW_KEY_D); - listenFor(GLFW_KEY_SPACE); - listenFor(GLFW_KEY_LEFT_SHIFT); + vec2 cursor_delta = vec2(mouse_sensitivity * dtime) * (vec2)window->getCursorDelta(); + double x, y; + x = cursor_delta.x; + y = cursor_delta.y; + if (x != 0 && y != 0) { + for (auto it = mouse_handlers.begin(); it != mouse_handlers.end(); it++) { + (**it)(dtime, x, y); + } + } } +void InputHandler::processKeyInput(double dtime) +{ + set keysDown; + for (auto it = listened_keys.begin(); it != listened_keys.end(); it++) { + int key = *it; + if (window->wasKeyDown(key)) { + keysDown.insert(key); + } + } + if (keysDown.begin() != keysDown.end()) { + for (auto it = key_handlers.begin(); it != key_handlers.end(); it++) { + (**it)(dtime, keysDown); + } + } +} diff --git a/src/dragonblocks/input_handler.hpp b/src/dragonblocks/input_handler.hpp index a54f1ad..bf4d4e9 100644 --- a/src/dragonblocks/input_handler.hpp +++ b/src/dragonblocks/input_handler.hpp @@ -12,23 +12,24 @@ namespace dragonblocks { public: void processInput(double); - void processMouseInput(double); - void processKeyInput(double); - void onMouseMove(double, double, double); - void onKeyPress(double, std::set); void listenFor(int); void dontListenFor(int); + void addMouseHandler(void (*)(double, double, double)); + void removeMouseHandler(void (*)(double, double, double)); + void addKeyHandler(void (*)(double, std::set)); + void removeKeyHandler(void (*)(double, std::set)); - bool pitch_move; double mouse_sensitivity; - double yaw, pitch; - double speed; + + InputHandler(Window *); - InputHandler(Camera *, Window *); + private: + void processMouseInput(double); + void processKeyInput(double); - private: - Camera *camera; Window *window; std::set listened_keys; + std::set mouse_handlers; + std::set)> key_handlers; }; } diff --git a/src/dragonblocks/log.cpp b/src/dragonblocks/log.cpp index 41aeed5..6a17fee 100644 --- a/src/dragonblocks/log.cpp +++ b/src/dragonblocks/log.cpp @@ -12,12 +12,6 @@ void dragonblocks::log(const string &l) case Gametype::CLIENT: gt = "Client"; break; - case Gametype::SERVER: - gt = "Server"; - break; - case Gametype::MAINMENU: - gt = "Mainmenu"; - break; } cout << "[" << gt << "] " << l << endl; } diff --git a/src/dragonblocks/mainmenu.cpp b/src/dragonblocks/mainmenu.cpp deleted file mode 100644 index 7b05b21..0000000 --- a/src/dragonblocks/mainmenu.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "log.hpp" -#include "mainmenu.hpp" - -using namespace dragonblocks; - -void Mainmenu::start() -{ - log("Main Menu is not available yet."); -} diff --git a/src/dragonblocks/mainmenu.hpp b/src/dragonblocks/mainmenu.hpp deleted file mode 100644 index 54a7d26..0000000 --- a/src/dragonblocks/mainmenu.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -namespace dragonblocks -{ - class Mainmenu - { - public: - void start(); - }; -} - diff --git a/src/dragonblocks/map.cpp b/src/dragonblocks/map.cpp index de246a4..8b338d9 100644 --- a/src/dragonblocks/map.cpp +++ b/src/dragonblocks/map.cpp @@ -65,7 +65,7 @@ void Map::clear() chunks.clear(); } -Map::Map(Mapgen *m, MeshGenMgr *mgt, Scene *s) : mapgen(m), mesh_gen_mgr(mgt), scene(s) +Map::Map(Mapgen *m, MeshGenMgr *mg, Scene *s) : mapgen(m), mesh_gen_mgr(mg), scene(s) { } diff --git a/src/dragonblocks/mesh.cpp b/src/dragonblocks/mesh.cpp index f934e8e..2d077f3 100644 --- a/src/dragonblocks/mesh.cpp +++ b/src/dragonblocks/mesh.cpp @@ -12,22 +12,22 @@ using namespace std; using namespace glm; using namespace dragonblocks; -double Mesh::Effect::grow_time = 0.25; // s -double Mesh::Effect::flyin_time = 0.4; // s -double Mesh::Effect::flyin_offset = 20; // m -double Mesh::Effect::rotate_speed = 1; // turns/s +double Mesh::Animation::grow_time = 0.25; // s +double Mesh::Animation::flyin_time = 0.4; // s +double Mesh::Animation::flyin_offset = 20; // m +double Mesh::Animation::rotate_speed = 1; // turns/s -mat4 Mesh::Effect::getModelMatrix(double dtime, vec3 pos, vec3 size, vec3 rotation_axis, float rotation_angle) +mat4 Mesh::Animation::getModelMatrix(double dtime, vec3 pos, vec3 size, vec3 rotation_axis, float rotation_angle) { mat4 trans = mat4(1.0); - if (type == Mesh::Effect::Type::NONE) + if (type == Mesh::Animation::Type::NONE) goto finish; if (expires) { time_left -= dtime; if (time_left < 0) { - type = Mesh::Effect::Type::NONE; + type = Mesh::Animation::Type::NONE; if (on_finish) { (*on_finish)(extra_data); } @@ -36,16 +36,16 @@ mat4 Mesh::Effect::getModelMatrix(double dtime, vec3 pos, vec3 size, vec3 rotati } switch (type) { - case Mesh::Effect::Type::FLYIN: - pos.y -= Mesh::Effect::flyin_offset * time_left / Mesh::Effect::flyin_time; + case Mesh::Animation::Type::FLYIN: + pos.y -= Mesh::Animation::flyin_offset * time_left / Mesh::Animation::flyin_time; break; - case Mesh::Effect::Type::GROW: - size *= 1 - time_left / Mesh::Effect::grow_time; + case Mesh::Animation::Type::GROW: + size *= 1 - time_left / Mesh::Animation::grow_time; break; - case Mesh::Effect::Type::ROTATE: - rotation_angle += glfwGetTime() * Mesh::Effect::rotate_speed * pi() * 2; + case Mesh::Animation::Type::ROTATE: + rotation_angle += glfwGetTime() * Mesh::Animation::rotate_speed * pi() * 2; } finish: @@ -57,46 +57,43 @@ mat4 Mesh::Effect::getModelMatrix(double dtime, vec3 pos, vec3 size, vec3 rotati return trans; } -Mesh::Effect::Effect(Mesh::Effect::Type t, void (*o)(void *), void *e) : type(t), on_finish(o), extra_data(e) +Mesh::Animation::Animation(Mesh::Animation::Type t, void (*o)(void *), void *e) : type(t), on_finish(o), extra_data(e) { switch(type) { - case Mesh::Effect::Type::FLYIN: + case Mesh::Animation::Type::FLYIN: expires = true; - time_left = Mesh::Effect::flyin_time; + time_left = Mesh::Animation::flyin_time; break; - case Mesh::Effect::Type::GROW: + case Mesh::Animation::Type::GROW: expires = true; - time_left = Mesh::Effect::grow_time; + time_left = Mesh::Animation::grow_time; break; - case Mesh::Effect::Type::ROTATE: + case Mesh::Animation::Type::ROTATE: expires = false; + break; } } -void Mesh::vertexConfig(const GLvoid *v, GLsizei s) -{ - if (vertices_changed || configured) - throw runtime_error("Attempt to configure Mesh that is already configured"); - vertices = malloc(s); - memcpy(vertices, v, s); - vertices_size = s; - vertices_changed = true; -} - void Mesh::render(double dtime, ShaderProgram *shader_program) { - if (vertices_changed) { - runVertexConfig(); - } - - if (! configured) + rendering = true; + + if (do_delete) { + delete this; return; + } else if (prepare_death) { + do_delete = true; + } + + if (! configured) { + configure(); + } shader_program->use(); CHECKERR - mat4 model_matrix = effect.getModelMatrix(dtime, pos, size, rotation_axis, rotation_angle); CHECKERR + mat4 model_matrix = animation.getModelMatrix(dtime, pos, size, rotation_axis, rotation_angle); CHECKERR shader_program->set("model", model_matrix); CHECKERR @@ -107,57 +104,48 @@ void Mesh::render(double dtime, ShaderProgram *shader_program) } glBindVertexArray(0); CHECKERR glBindTexture(GL_TEXTURE_2D, 0); CHECKERR + + rendering = false; } -void Mesh::reset() +bool Mesh::isRendering() { - removeFromScene(); - pos = vec3(0.0); - size = vec3(1.0); - rotation_axis = vec3(0.0, 1.0, 0.0); - vertices_per_texture = 0; - textures = {}; - rotation_angle = 0; - if (VAO) { - glDeleteVertexArrays(1, &VAO); CHECKERR - } - if (VBO) { - glDeleteBuffers(1, &VAO); CHECKERR - } - vertices_changed = false; - if (vertices) { - free(vertices); - } - vertices = NULL; - configured = false; + return rendering; } -void Mesh::addToScene() +void Mesh::die() { - scene->add(this); + prepare_death = true; } -void Mesh::removeFromScene() +Mesh::Mesh(Scene *s, const GLvoid *v, GLsizei vs): pos(0), size(1), rotation_axis(0, 1, 0), scene(s), vertices_size(vs) { - scene->remove(this); + if (! v || ! vs) + throw runtime_error("Invalid Mesh configuration"); + vertices = malloc(vs); + memcpy(vertices, v, vs); + scene->add(this); } -Mesh::Mesh(Scene *s): scene(s) +Mesh::~Mesh() { - reset(); + scene->remove(this); + if (VAO) { + glDeleteVertexArrays(1, &VAO); CHECKERR + } + if (VBO) { + glDeleteBuffers(1, &VAO); CHECKERR + } } -void Mesh::runVertexConfig() +void Mesh::configure() { - if (! vertices || vertices_size == 0) - throw runtime_error("Invalid Mesh configuration"); - glGenVertexArrays(1, &VAO); CHECKERR glGenBuffers(1, &VBO); CHECKERR glBindVertexArray(VAO); CHECKERR glBindBuffer(GL_ARRAY_BUFFER, VBO); CHECKERR - + glBufferData(GL_ARRAY_BUFFER, vertices_size, vertices, GL_STATIC_DRAW); CHECKERR GLsizei stride = 5 * sizeof(GLfloat); CHECKERR @@ -172,6 +160,5 @@ void Mesh::runVertexConfig() free(vertices); vertices = NULL; - vertices_changed = false; configured = true; } diff --git a/src/dragonblocks/mesh.hpp b/src/dragonblocks/mesh.hpp index 0bb06c8..b603bc9 100644 --- a/src/dragonblocks/mesh.hpp +++ b/src/dragonblocks/mesh.hpp @@ -12,13 +12,13 @@ namespace dragonblocks class Mesh { public: - class Effect + class Animation { public: - static double grow_time; // s - static double flyin_time; // s - static double flyin_offset; // m - static double rotate_speed; // turns/s + static double grow_time; + static double flyin_time; + static double flyin_offset; + static double rotate_speed; enum Type { @@ -30,9 +30,9 @@ namespace dragonblocks glm::mat4 getModelMatrix(double, glm::vec3, glm::vec3, glm::vec3, float); - Effect() = default; - Effect(Type, void (*)(void *) = nullptr, void * = nullptr); - Effect(const Effect &) = default; + Animation() = default; + Animation(Type, void (*)(void *) = nullptr, void * = nullptr); + Animation(const Animation &) = default; private: Type type = Type::NONE; @@ -44,26 +44,27 @@ namespace dragonblocks int vertices_per_texture; glm::vec3 pos, size, rotation_axis; - float rotation_angle; + float rotation_angle = 0; std::vector textures; - Effect effect; + Animation animation; - void reset(); - void vertexConfig(const GLvoid *v, GLsizei s); void render(double dtime, ShaderProgram *); - void addToScene(); - void removeFromScene(); - void runVertexConfig(); + bool isRendering(); + void die(); - Mesh(Scene *); + Mesh(Scene *, const GLvoid *, GLsizei); + ~Mesh(); private: GLuint VAO = 0, VBO = 0; Scene *scene; GLvoid *vertices = NULL; GLsizeiptr vertices_size; - bool configured; - bool vertices_changed; + bool configured = false; + bool rendering = false; + bool prepare_death = false; + bool do_delete = false; + void configure(); }; } diff --git a/src/dragonblocks/player.cpp b/src/dragonblocks/player.cpp new file mode 100644 index 0000000..b007d79 --- /dev/null +++ b/src/dragonblocks/player.cpp @@ -0,0 +1,88 @@ +#include +#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 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 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); +} diff --git a/src/dragonblocks/player.hpp b/src/dragonblocks/player.hpp new file mode 100644 index 0000000..81bd5e6 --- /dev/null +++ b/src/dragonblocks/player.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include +#include "gl.hpp" + +namespace dragonblocks +{ + class Camera; + class InputHandler; + class Map; + + class Player + { + public: + static Player *createLocalplayer(Camera *, InputHandler *, Map *); + + glm::vec3 pos; + bool pitch_move; + double yaw, pitch; + double speed; + + private: + static Player *localplayer; + + static void staticMouseHandler(double, double, double); + static void staticKeyHandler(double, std::set); + + Camera *camera; + InputHandler *input_handler; + Map *map; + + void mouseHandler(double, double, double); + void keyHandler(double, std::set); + void loadChunks(); + + Player(Camera *, InputHandler *, Map *); + }; +} diff --git a/src/dragonblocks/render_engine.cpp b/src/dragonblocks/render_engine.cpp index e5d23fb..5476bd1 100644 --- a/src/dragonblocks/render_engine.cpp +++ b/src/dragonblocks/render_engine.cpp @@ -1,11 +1,8 @@ #include #include #include "camera.hpp" -#include "client.hpp" // ugly, only keep until player is implemented -#include "core.hpp" // this one too #include "gldebug.hpp" #include "input_handler.hpp" -#include "map.hpp" // this one three #include "mesh_gen_mgr.hpp" #include "render_engine.hpp" #include "scene.hpp" @@ -34,24 +31,9 @@ void RenderEngine::render() glfwPollEvents(); CHECKERR } -void RenderEngine::loadChunks() +bool RenderEngine::running() { - ivec3 chunkp = Map::getChunkPos(camera->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++) { - client->map->createChunk(ivec3(x, y, z)); - } - } - } -} - -void RenderEngine::loop() -{ - while (! window->shouldClose()) { - render(); - loadChunks(); - } + return ! window->shouldClose(); } void RenderEngine::updateProjectionMatrix() @@ -84,6 +66,11 @@ void RenderEngine::setFov(double f) updateProjectionMatrix(); } +void RenderEngine::startMeshGenMgr() +{ + mesh_gen_mgr->start(); +} + RenderEngine::RenderEngine() { if (! glfwInit()) @@ -94,7 +81,7 @@ RenderEngine::RenderEngine() window = Window::create(this); camera = new Camera; - input_handler = new InputHandler(camera, window); + input_handler = new InputHandler(window); mesh_gen_mgr = new MeshGenMgr; scene = new Scene; diff --git a/src/dragonblocks/render_engine.hpp b/src/dragonblocks/render_engine.hpp index e0fc259..fcf5474 100644 --- a/src/dragonblocks/render_engine.hpp +++ b/src/dragonblocks/render_engine.hpp @@ -22,13 +22,14 @@ namespace dragonblocks Window *window; void render(); - void loadChunks(); - void loop(); + bool running(); void updateViewMatrix(); void updateProjectionMatrix(); void setSky(glm::vec3); void setRenderDistance(double); void setFov(double); + void startMeshGenMgr(); + RenderEngine(); ~RenderEngine(); diff --git a/src/dragonblocks/server.cpp b/src/dragonblocks/server.cpp deleted file mode 100644 index 0c1fa88..0000000 --- a/src/dragonblocks/server.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "log.hpp" -#include "server.hpp" - -using namespace dragonblocks; - -void Server::start() -{ - log("Server is not available yet."); -} diff --git a/src/dragonblocks/server.hpp b/src/dragonblocks/server.hpp deleted file mode 100644 index 782e6d1..0000000 --- a/src/dragonblocks/server.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -namespace dragonblocks -{ - class Server - { - public: - void start(); - }; -} - -- 2.44.0