diff --git a/src/deferredpipeline.cpp b/src/deferredpipeline.cpp index 6da7973..aac035d 100644 --- a/src/deferredpipeline.cpp +++ b/src/deferredpipeline.cpp @@ -267,9 +267,24 @@ void DeferredPipeline::refreshScene(Scene *scene) glm::vec4 DeferredPipeline::pick(int x, int y) { + m_gBuffer->setTarget(GL_READ_FRAMEBUFFER); m_gBuffer->bindFBO(); - glm::vec4 pos; - glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, glm::value_ptr(pos)); + //m_gBuffer->getTexture(0)-> + float values[4] = {1}; + glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, values); + GLenum err = glGetError(); + while(err != GL_NO_ERROR) + { + switch(err) + { + case GL_INVALID_ENUM : printf("OpenGL error : GL_INVALID_ENUM\n"); break; + case GL_INVALID_VALUE : printf("OpenGL error : GL_INVALID_VALUE\n"); break; + case GL_INVALID_OPERATION : printf("OpenGL error : GL_INVALID_OPERATION\n"); break; + default : printf("OpenGL error : other\n"); break; + } + err = glGetError(); + } + m_gBuffer->setTarget(); FrameBuffer::screen->bindFBO(); - return pos; + return glm::vec4(values[0], values[1], values[2], values[3]); } diff --git a/src/trackballcamera.cpp b/src/trackballcamera.cpp index f0eefb1..01b3a54 100644 --- a/src/trackballcamera.cpp +++ b/src/trackballcamera.cpp @@ -13,12 +13,10 @@ TrackBallCamera::TrackBallCamera(float myFov, float myNear, float myFar) : void TrackBallCamera::rotateCamera(float dx, float dy) { - m_rotation.x += dx*DEFAULT_ROTATION_SPEED; - m_rotation.y += dy*DEFAULT_ROTATION_SPEED; - if(m_rotation.y > 1.57f) - m_rotation.y = 1.57f; - if(m_rotation.y < -1.57f) - m_rotation.y = -1.57f; + glm::vec3 vert(0, 1, 0); + m_direction = glm::rotate(m_direction, -dx*DEFAULT_ROTATION_SPEED, vert); + m_direction = glm::rotate(m_direction, -dy*DEFAULT_ROTATION_SPEED, glm::cross(m_direction, vert)); + m_direction = glm::normalize(m_direction); computeView(); } @@ -44,7 +42,9 @@ void TrackBallCamera::moveCamera(const glm::vec3 &diff) void TrackBallCamera::lookAt(const glm::vec3 &pos) { - //m_dist = glm::length(target); + m_direction = pos + m_direction*m_dist - m_center; + m_dist = glm::length(m_direction); + m_direction = glm::normalize(m_direction); m_center = pos; computeView(); } @@ -52,17 +52,14 @@ void TrackBallCamera::lookAt(const glm::vec3 &pos) void TrackBallCamera::reset() { m_center = glm::vec3(0, 4, 0); - m_rotation = glm::vec2(0, 1); + m_direction = glm::normalize(glm::vec3(0, -1, -1)); m_dist = 20; computeView(); } void TrackBallCamera::computeView() { - m_view = glm::translate(glm::mat4(), glm::vec3(0, 0, -m_dist)); - m_view = glm::rotate(m_view, m_rotation.y, glm::vec3(1, 0, 0)); - m_view = glm::rotate(m_view, m_rotation.x, glm::vec3(0, 1, 0)); - m_view = glm::translate(m_view, -m_center); + m_view = glm::lookAt(m_center - m_direction*m_dist, m_center, glm::vec3(0, 1, 0)); } void TrackBallCamera::zoom(int nbUnits) diff --git a/src/trackballcamera.h b/src/trackballcamera.h index 455cdc5..10412f4 100644 --- a/src/trackballcamera.h +++ b/src/trackballcamera.h @@ -10,7 +10,7 @@ class TrackBallCamera : public BasicCamera private: // camera position glm::vec3 m_center; - glm::vec2 m_rotation; + glm::vec3 m_direction; float m_dist; void computeView();