added position picking

This commit is contained in:
Anselme 2016-07-22 17:31:30 +02:00
parent 66a5399fba
commit 8035f2b73f
3 changed files with 28 additions and 16 deletions

View File

@ -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]);
}

View File

@ -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)

View File

@ -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();