diff --git a/camera.h b/camera.h index a244be1..80f8815 100644 --- a/camera.h +++ b/camera.h @@ -91,6 +91,8 @@ private: float moveSpeed_; float mouseSensitivity_; float zoom_; + + bool firstMouse_ = true; }; #endif //INC_3DVIEWER_CAMERA_H \ No newline at end of file diff --git a/lopenglprogram.cpp b/lopenglprogram.cpp index 63ef92f..0ac3d7d 100644 --- a/lopenglprogram.cpp +++ b/lopenglprogram.cpp @@ -180,6 +180,10 @@ bool LOpenGLProgram::addShader(std::unique_ptr shader) { return true; } +void LOpenGLProgram::setUniformValue(const std::string &name, glm::vec2 value) const { + glUniform2fv(glGetUniformLocation(programId_, name.c_str()), 1, &value[0]); +} + void LOpenGLProgram::removeShader(GLuint id) { for (auto ite = shaderList_.begin(); ite != shaderList_.end(); ++ite) { if ((*ite)->shaderId_ == id) { diff --git a/lopenglprogram.h b/lopenglprogram.h index 5d78e48..0232727 100644 --- a/lopenglprogram.h +++ b/lopenglprogram.h @@ -1,5 +1,4 @@ #pragma once - #include #include #include @@ -52,6 +51,7 @@ public: void setUniformValue(const std::string& name, glm::vec3 value) const; void setUniformValue(const std::string& name, float x, float y, float z) const; void setUniformValue(const std::string& name, glm::mat4 value) const; + void setUniformValue(const std::string& name, glm::vec2 value) const; private: std::list> shaderList_; diff --git a/main.cpp b/main.cpp index 8647788..8b90385 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,12 @@ #include "lopenglprogram.h" #include "camera.h" +#include +#include +#include +#include #include +#include +#include void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } @@ -11,19 +17,110 @@ void process_input(GLFWwindow* window) { } } -std::unique_ptr initBackgroundGeometry() { - auto vshader = std::make_unique(LOpenGLShader::ShaderType::Vertex); - auto fshader = std::make_unique(LOpenGLShader::ShaderType::Fragment); - vshader->compileShaderFromFile("shader/bg.vert"); - fshader->compileShaderFromFile("shader/bg.frag"); - auto program = std::make_unique(); - program->addShader(std::move(vshader)); - program->addShader(std::move(fshader)); - auto ret = program->Link(); - if (!ret) - return nullptr; - return program; -} +class GLWidget { + +public: + struct ViewPort { + int width; + int height; + }; + GLWidget(ViewPort port) : viewport_(port) { + lastX_ = port.width / 2; + lastY_ = port.height / 2; + } + ~GLWidget() {} + + + void setViewPort(int width, int height) { + viewport_ = {width, height}; + } + + bool initGeometry() { + window = std::make_unique(glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL)); + if (window == NULL) { + std::cout << "Failed to create GLFW window" << std::endl; + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(window); + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { + std::cout << "Failed to initialize GLAD" << std::endl; + return -1; + } + + glViewport(0, 0, 800, 600); + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + } +public: + bool initBgProgram(const std::string& vpath, const std::string fpath) { + auto vshader = std::make_unique(LOpenGLShader::ShaderType::Vertex); + auto fshader = std::make_unique(LOpenGLShader::ShaderType::Fragment); + vshader->compileShaderFromFile(vpath); + fshader->compileShaderFromFile(fpath); + bgProg_ = std::make_unique(); + bgProg_->addShader(std::move(vshader)); + bgProg_->addShader(std::move(fshader)); + bool ret = bgProg_->Link(); + if (!ret) { + return false; + } + const float verts[] = { + -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, + -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, + }; + if (bgVao_) { + glDeleteVertexArrays(1, &bgVao_); + } + if (bgVbo_) { + glDeleteBuffers(1, &bgVbo_); + } + + glGenVertexArrays(1, &bgVao_); + glBindVertexArray(bgVao_); + + glGenBuffers(1, &bgVbo_); + glBindBuffer(GL_ARRAY_BUFFER, bgVbo_); + glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0); + glBindVertexArray(0); + + } + + void drawBg() { + bgProg_->Use(); + bgProg_->setUniformValue("uViewport", glm::vec2(viewport_.width, viewport_.height)); + bgProg_->setUniformValue("uMajorStep", 120.0f); + bgProg_->setUniformValue("uMinjorStep", 24.0f); + glBindVertexArray(bgVao_); + glDrawArrays(GL_TRIANGLES, 0, 6); + glBindVertexArray(0); + + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + } + + void mouseCallback(GLFWwindow* window, double x, double y) { + float xpos = static_cast(x); + float ypos = static_cast(y); + + if (camera_.fir) { + + } + } +private: + std::unique_ptr bgProg_; + std::unique_ptr window_; + unsigned int bgVao_; + unsigned int bgVbo_; + ViewPort viewport_{800, 600}; + Camera camera_; + + bool firstMouse_ = true; + float lastX_; + float lastY_; +}; int main() { glfwInit(); @@ -34,26 +131,14 @@ int main() { glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif - GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL); - if (window == NULL) { - std::cout << "Failed to create GLFW window" << std::endl; - glfwTerminate(); - return -1; - } - glfwMakeContextCurrent(window); - if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { - std::cout << "Failed to initialize GLAD" << std::endl; - return -1; - } - - glViewport(0, 0, 800, 600); - glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - - initBackgroundGeometry(); + + GLWidget glw; + glw.initBgProgram("bg.vert", "bg.frag"); while (!glfwWindowShouldClose(window)) { + glw.drawBg(); } glfwTerminate();