diff --git a/src/Camera.cpp b/src/Camera.cpp index b70db5a..d15389a 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -9,7 +9,7 @@ Camera::Camera() { _at = glm::vec3(0.0f, 0.0f, 0.0f); _up = glm::vec3(0.0f, 1.0f, 0.0f); _view = glm::lookAt(_eye, _at, _up); - _projection = glm::perspective(45.0f, 1.0f, 2.0f, -2.0f); + _projection = glm::perspective(45.0f, 1.0f, 1.0f, 7.0f); } void Camera::init() { @@ -88,3 +88,12 @@ void Camera::moveForward(float distance) { void Camera::moveBackward(float distance) { } + +void Camera::mouseMoveAroundCenter(float dx, float dy) { + glm::quat q = glm::angleAxis(-dx, _up); + glm::vec3 axis = glm::normalize(glm::cross(_up, _eye)); + glm::quat q2 = glm::angleAxis(-dy, axis); + _eye = q*q2*_eye; + _up = glm::normalize(glm::cross(_eye, axis)); + updateView(); +} diff --git a/src/Camera.h b/src/Camera.h index c60f6f9..6287dde 100644 --- a/src/Camera.h +++ b/src/Camera.h @@ -28,6 +28,7 @@ public: void rotateCCW(float angle); void moveToCenter(float distance); void moveFromCenter(float distance); + void mouseMoveAroundCenter(float dx, float dy); void moveForward(float distance); void moveBackward(float distance); diff --git a/src/GLObjects/SpectralMesh.cpp b/src/GLObjects/SpectralMesh.cpp index 22ac6d3..3b52b36 100644 --- a/src/GLObjects/SpectralMesh.cpp +++ b/src/GLObjects/SpectralMesh.cpp @@ -1,6 +1,6 @@ #include "SpectralMesh.h" #include -#include +#include SpectralMesh::SpectralMesh(ShaderProgram *shader, std::size_t size): Mesh(shader, size) { _data = new float[size*size]; diff --git a/src/OGL.cpp b/src/OGL.cpp index ecb7aed..92aa970 100644 --- a/src/OGL.cpp +++ b/src/OGL.cpp @@ -5,6 +5,8 @@ #include bool wiredFlag = false; +double lastX = 0.0, lastY = 0.0; + void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) { const float turnStep = 0.1f; // in radians @@ -45,6 +47,30 @@ void keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods } } +void cursorPositionCallback(GLFWwindow* window, double xpos, double ypos) { + if(lastX != 0 || lastY != 0) { + float dx = (float)(xpos - lastX); + float dy = (float)(ypos - lastY); + static const float coeff = 0.01f; + if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS) { + Camera::instance()->mouseMoveAroundCenter(coeff*dx, coeff*dy); + } + } + + lastX = xpos; + lastY = ypos; +} + +void scrollCallback(GLFWwindow* window, double xoffset, double yoffset) { + if(yoffset > 0) { + Camera::instance()->moveToCenter(0.1f); + } else { + Camera::instance()->moveFromCenter(0.1f); + } +} + + + OGL::OGL() { } @@ -86,6 +112,8 @@ void OGL::init() { _window = glfwCreateWindow(1024, 1024, "OpenGL", nullptr, nullptr); // Windowed glfwMakeContextCurrent(_window); glfwSetKeyCallback(_window, keyCallback); + glfwSetCursorPosCallback(_window, cursorPositionCallback); + glfwSetScrollCallback(_window, scrollCallback); glewExperimental = GL_TRUE; GLenum err = glewInit(); diff --git a/src/main.cpp b/src/main.cpp index 80cac52..372e08b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,7 +19,7 @@ int main() { Camera::instance()->init(); - AudioPlayer player("/Users/selim/Dropbox/euphoria.wav" /*"/home/selim/dl/euphoria.wav"*/); + AudioPlayer player(/*"/Users/selim/Dropbox/euphoria.wav"*/ "/home/selim/dl/euphoria.wav"); player.setStreamListener([&mesh](float *data, std::size_t framesCount) { mesh.addLine(data); });