diff --git a/include/controls.hpp b/include/controls.hpp new file mode 100644 index 0000000..490dbbd --- /dev/null +++ b/include/controls.hpp @@ -0,0 +1,14 @@ +#ifndef CONTROLS_H +#define CONTROLS_H + +#include +#include + +#define BLOCKPICK_TIMEOUT 0.15f + +namespace controls{ + void init(); + void update(GLFWwindow* window); +}; + +#endif diff --git a/include/main.hpp b/include/main.hpp index 38ff189..35e69e7 100644 --- a/include/main.hpp +++ b/include/main.hpp @@ -3,6 +3,5 @@ void framebuffer_size_callback(GLFWwindow *, int, int); void mouse_callback(GLFWwindow *window, double xpos, double ypos); -void processInput(GLFWwindow *); #endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6775018..d92b576 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.2) project(OpenGLTest) -set(SOURCE_FILES main.cpp chunk.cpp chunkmanager.cpp chunkmesher.cpp chunkgenerator.cpp +set(SOURCE_FILES main.cpp controls.cpp chunk.cpp chunkmanager.cpp chunkmesher.cpp chunkgenerator.cpp debugwindow.cpp renderer.cpp spacefilling.cpp stb_image.cpp utils.cpp OpenSimplexNoise.cpp) add_executable(OpenGLTest ${SOURCE_FILES}) diff --git a/src/controls.cpp b/src/controls.cpp new file mode 100644 index 0000000..235ed96 --- /dev/null +++ b/src/controls.cpp @@ -0,0 +1,39 @@ +#include "controls.hpp" +#include "renderer.hpp" + +namespace controls{ + float lastBlockPick=0.0; + bool blockpick = false; + bool cursor = false; + + void init(){ + } + + void update(GLFWwindow* window){ + float current_time = glfwGetTime(); + + // Reset blockpicking timeout has passed + if(current_time - lastBlockPick > BLOCKPICK_TIMEOUT) blockpick = false; + // Reset blockpicking if both mouse buttons are released + if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_1) == GLFW_RELEASE && glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_2) == GLFW_RELEASE) blockpick = false; + + if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_2) == GLFW_PRESS && !blockpick){ + //chunkmanager::blockpick(false); + blockpick=true; + lastBlockPick=glfwGetTime(); + } + + if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS && !blockpick){ + //chunkmanager::blockpick(true); + blockpick=true; + lastBlockPick=glfwGetTime(); + } + + if(glfwGetKey(window, GLFW_KEY_F2) == GLFW_PRESS) renderer::saveScreenshot(); + if(glfwGetKey(window, GLFW_KEY_F3) == GLFW_PRESS) renderer::saveScreenshot(true); + if(glfwGetKey(window, GLFW_KEY_M) == GLFW_PRESS) { + cursor = !cursor; + glfwSetInputMode(window, GLFW_CURSOR, cursor ? GLFW_CURSOR_NORMAL : GLFW_CURSOR_DISABLED); + } + } +}; diff --git a/src/main.cpp b/src/main.cpp index 70d0a44..6aafb51 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,26 +4,23 @@ #include #include +#include "main.hpp" + #define GLOBALS_DEFINER #include "globals.hpp" #undef GLOBALS_DEFINER - #include "chunkmanager.hpp" -#include "main.hpp" +#include "controls.hpp" #include "debugwindow.hpp" #include "renderer.hpp" -#include "spacefilling.hpp" #include "shader.hpp" +#include "spacefilling.hpp" float deltaTime = 0.0f; // Time between current frame and last frame float lastFrame = 0.0f; // Time of last frame float lastFPSFrame = 0.0f; int frames = 0; -float lastBlockPick=0.0; -bool blockpick = false; -bool cursor = false; - int main() { @@ -70,6 +67,7 @@ int main() } SpaceFilling::initLUT(); + controls::init(); chunkmanager::init(); debug::window::init(window); renderer::init(window); @@ -94,8 +92,12 @@ int main() glClearColor(0.431f, 0.694f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - // Input processing - processInput(window); + // Input handling + // Only close event is handles by main + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) + glfwSetWindowShouldClose(window, true); + // the rest of input processing is handled by controls.cpp + controls::update(window); // Camera theCamera.update(window, deltaTime); @@ -108,9 +110,6 @@ int main() debug::window::set_parameter("lx", theCamera.getFront().x); debug::window::set_parameter("ly", theCamera.getFront().y); debug::window::set_parameter("lz", theCamera.getFront().z); - - // Reset blockping timeout if 200ms have passed - if(glfwGetTime() - lastBlockPick > 0.1) blockpick = false; // Render pass renderer::render(); @@ -143,33 +142,3 @@ void mouse_callback(GLFWwindow *window, double xpos, double ypos) { theCamera.mouseCallback(window, xpos, ypos); } - -void processInput(GLFWwindow *window) -{ - if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) - glfwSetWindowShouldClose(window, true); - - if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_2) == GLFW_PRESS && !blockpick){ - chunkmanager::blockpick(false); - blockpick=true; - lastBlockPick=glfwGetTime(); - } - - if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_1) == GLFW_PRESS && !blockpick){ - chunkmanager::blockpick(true); - blockpick=true; - lastBlockPick=glfwGetTime(); - } - - // Reset blockpicking if enough time has passed - if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_1) == GLFW_RELEASE && glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_2) == GLFW_RELEASE) blockpick = false; - - if(glfwGetKey(window, GLFW_KEY_F2) == GLFW_PRESS) renderer::saveScreenshot(); - if(glfwGetKey(window, GLFW_KEY_F3) == GLFW_PRESS) renderer::saveScreenshot(true); - if(glfwGetKey(window, GLFW_KEY_M) == GLFW_PRESS) { - cursor = !cursor; - glfwSetInputMode(window, GLFW_CURSOR, cursor ? GLFW_CURSOR_NORMAL : GLFW_CURSOR_DISABLED); - } - - -}