Commit 96bd1004 authored by Sylvain Thery's avatar Sylvain Thery

Add 2D manipulation on frames

parent 5978bc90
...@@ -174,9 +174,6 @@ void MyQT::cb_mousePress(int button, int x, int y) ...@@ -174,9 +174,6 @@ void MyQT::cb_mousePress(int button, int x, int y)
m_pickedAxis=fr_picked; m_pickedAxis=fr_picked;
} }
// project center & axis on screen for easy manipulation
if (m_pickedAxis != Utils::FrameManipulator::NONE)
m_frame->storeProjection(m_pickedAxis);
// highlighting // highlighting
m_frame->highlight(m_pickedAxis); m_frame->highlight(m_pickedAxis);
...@@ -192,33 +189,60 @@ void MyQT::cb_mousePress(int button, int x, int y) ...@@ -192,33 +189,60 @@ void MyQT::cb_mousePress(int button, int x, int y)
} }
} }
// store origin & selected axis on on screen projection for easy manipulation.
m_frame->storeProjection(m_pickedAxis);
updateGL(); updateGL();
} }
void MyQT::cb_mouseMove(int button, int x, int y) void MyQT::cb_mouseMove(int buttons, int x, int y)
{ {
if (!Shift()) if (!Shift())
return; return;
// rotation selected ?
if (Utils::FrameManipulator::rotationAxis(m_pickedAxis)) if (Utils::FrameManipulator::rotationAxis(m_pickedAxis))
{
if (buttons&1)
{ {
float angle = m_frame->angleFromMouse(x,y,x-m_begX, y-m_begY); float angle = m_frame->angleFromMouse(x,y,x-m_begX, y-m_begY);
m_frame->rotate(m_pickedAxis, angle); m_frame->rotate(m_pickedAxis, angle);
}
else if (buttons&2)
m_frame->rotateInScreen(x-m_begX, y-m_begY);
m_lastPickedObject->transfo() = m_frame->transfo(); m_lastPickedObject->transfo() = m_frame->transfo();
} }
// translation selected
else if (Utils::FrameManipulator::translationAxis(m_pickedAxis)) else if (Utils::FrameManipulator::translationAxis(m_pickedAxis))
{
if (buttons&1)
{ {
float dist = m_frame->distanceFromMouse(x-m_begX, y-m_begY); float dist = m_frame->distanceFromMouse(x-m_begX, y-m_begY);
m_frame->translate(m_pickedAxis, dist); m_frame->translate(m_pickedAxis, dist);
}
else if (buttons&2)
m_frame->translateInScreen(x-m_begX, y-m_begY);
m_lastPickedObject->transfo() = m_frame->transfo(); m_lastPickedObject->transfo() = m_frame->transfo();
} }
// scale selected
else if (Utils::FrameManipulator::scaleAxis(m_pickedAxis) ) else if (Utils::FrameManipulator::scaleAxis(m_pickedAxis) )
{ {
float scale = m_frame->scaleFromMouse(x-m_begX, y-m_begY); float scale = m_frame->scaleFromMouse(x-m_begX, y-m_begY);
m_frame->scale(m_pickedAxis, scale ); m_frame->scale(m_pickedAxis, scale );
m_lastPickedObject->transfo() = m_frame->transfo(); m_lastPickedObject->transfo() = m_frame->transfo();
} }
// // nothing selected: using screen translation/rotation (button left/right)
// else if (m_lastPickedObject)
// {
// if (buttons&1)
// m_frame->translateInScreen(x-m_begX, y-m_begY);
// else if (buttons&2)
// m_frame->rotateInScreen(x-m_begX, y-m_begY);
// m_lastPickedObject->transfo() = m_frame->transfo();
// }
m_begX = x; m_begX = x;
m_begY = y; m_begY = y;
...@@ -274,42 +298,61 @@ void MyQT::cb_keyPress(int code) ...@@ -274,42 +298,61 @@ void MyQT::cb_keyPress(int code)
m_frame->setTransformation(m_lastPickedObject->transfo()); m_frame->setTransformation(m_lastPickedObject->transfo());
break; break;
case 'x': case 'x':
if (m_frame->locked(Utils::FrameManipulator::Xt))
m_frame->unlock(Utils::FrameManipulator::Xt);
else
m_frame->lock(Utils::FrameManipulator::Xt); m_frame->lock(Utils::FrameManipulator::Xt);
break; break;
case 'y': case 'y':
if (m_frame->locked(Utils::FrameManipulator::Yt))
m_frame->unlock(Utils::FrameManipulator::Yt);
else
m_frame->lock(Utils::FrameManipulator::Yt); m_frame->lock(Utils::FrameManipulator::Yt);
break; break;
case 'z': case 'z':
m_frame->lock(Utils::FrameManipulator::Zt); if (m_frame->locked(Utils::FrameManipulator::Zt))
break;
case 'X':
m_frame->unlock(Utils::FrameManipulator::Xt);
break;
case 'Y':
m_frame->unlock(Utils::FrameManipulator::Yt);
break;
case 'Z':
m_frame->unlock(Utils::FrameManipulator::Zt); m_frame->unlock(Utils::FrameManipulator::Zt);
else
m_frame->lock(Utils::FrameManipulator::Zt);
break; break;
case 'a': case 'a':
if (m_frame->locked(Utils::FrameManipulator::Xr))
m_frame->unlock(Utils::FrameManipulator::Xr);
else
m_frame->lock(Utils::FrameManipulator::Xr); m_frame->lock(Utils::FrameManipulator::Xr);
break; break;
case 'b': case 'b':
if (m_frame->locked(Utils::FrameManipulator::Yr))
m_frame->unlock(Utils::FrameManipulator::Yr);
else
m_frame->lock(Utils::FrameManipulator::Yr); m_frame->lock(Utils::FrameManipulator::Yr);
break; break;
case 'c': case 'c':
if (m_frame->locked(Utils::FrameManipulator::Zr))
m_frame->unlock(Utils::FrameManipulator::Zr);
else
m_frame->lock(Utils::FrameManipulator::Zr); m_frame->lock(Utils::FrameManipulator::Zr);
break; break;
case 'A':
m_frame->unlock(Utils::FrameManipulator::Xr); case 's':
if (m_frame->locked(Utils::FrameManipulator::Xs))
m_frame->unlock(Utils::FrameManipulator::Xs);
else
m_frame->lock(Utils::FrameManipulator::Xs);
break; break;
case 'B': case 't':
m_frame->unlock(Utils::FrameManipulator::Yr); if (m_frame->locked(Utils::FrameManipulator::Ys))
m_frame->unlock(Utils::FrameManipulator::Ys);
else
m_frame->lock(Utils::FrameManipulator::Ys);
break; break;
case 'C': case 'u':
m_frame->unlock(Utils::FrameManipulator::Zr); if (m_frame->locked(Utils::FrameManipulator::Zs))
m_frame->unlock(Utils::FrameManipulator::Zs);
else
m_frame->lock(Utils::FrameManipulator::Zs);
break; break;
} }
updateGL(); updateGL();
} }
...@@ -326,6 +369,11 @@ int main(int argc, char **argv) ...@@ -326,6 +369,11 @@ int main(int argc, char **argv)
if (argc>1) if (argc>1)
sqt.NBP = atoi(argv[1]); sqt.NBP = atoi(argv[1]);
sqt.setHelpMsg("Param :size of grid (number of objects)\nMpuse:\n"
" -click on object: selection\n -left click on frame: constraint 3d Rotation/Translation/Scale\n"
" -right click on frame :free 2D Rotation/Translation\nKeys:\n x/y/z lock/unlock translation\n a/b/c lock/unlock rotation\n s/t/u lock/unlock scaling");
// bounding box // bounding box
Geom::Vec3f lPosObj = Geom::Vec3f(0.0f,0.0f,0.0f); Geom::Vec3f lPosObj = Geom::Vec3f(0.0f,0.0f,0.0f);
float lWidthObj = sqt.NBP*4.0f; float lWidthObj = sqt.NBP*4.0f;
......
...@@ -428,6 +428,11 @@ public: ...@@ -428,6 +428,11 @@ public:
*/ */
void unlock(unsigned int axis); void unlock(unsigned int axis);
/**
* is an axis locked
*/
bool locked(unsigned int axis);
/** /**
* higlight an axis (change width rendering). * higlight an axis (change width rendering).
* To unhighlight, just highlight NONE or highlight a already highlighted axis * To unhighlight, just highlight NONE or highlight a already highlighted axis
...@@ -508,6 +513,12 @@ public: ...@@ -508,6 +513,12 @@ public:
static bool translationAxis(unsigned int axis) { return (axis>=Xt) && (axis<=Zt);} static bool translationAxis(unsigned int axis) { return (axis>=Xt) && (axis<=Zt);}
static bool scaleAxis(unsigned int axis) { return ((axis>=Xs) && (axis<=Zs))|| (axis==CENTER);} static bool scaleAxis(unsigned int axis) { return ((axis>=Xs) && (axis<=Zs))|| (axis==CENTER);}
/**
* translate from screen mouse move
*/
void translateInScreen(int dx, int dy);
void rotateInScreen(int dx, int dy);
}; };
......
...@@ -629,6 +629,10 @@ void FrameManipulator::unlock(unsigned int axis) ...@@ -629,6 +629,10 @@ void FrameManipulator::unlock(unsigned int axis)
m_locked_axis[axis] = false; m_locked_axis[axis] = false;
} }
bool FrameManipulator::locked(unsigned int axis)
{
return m_locked_axis[axis];
}
Geom::Vec3f FrameManipulator::getAxis(unsigned int ax) Geom::Vec3f FrameManipulator::getAxis(unsigned int ax)
{ {
...@@ -641,19 +645,20 @@ Geom::Vec3f FrameManipulator::getAxis(unsigned int ax) ...@@ -641,19 +645,20 @@ Geom::Vec3f FrameManipulator::getAxis(unsigned int ax)
void FrameManipulator::storeProjection(unsigned int ax) void FrameManipulator::storeProjection(unsigned int ax)
{ {
Geom::Vec3f O = getPosition(); Geom::Vec3f O = getPosition();
Geom::Vec3f A = getAxis(ax);
A += O;
glm::i32vec4 viewport; glm::i32vec4 viewport;
glGetIntegerv(GL_VIEWPORT, &(viewport[0])); glGetIntegerv(GL_VIEWPORT, &(viewport[0]));
glm::vec3 winO = glm::project(glm::vec3(O[0],O[1],O[2]), GLSLShader::currentModelView(), GLSLShader::currentProjection(), viewport); glm::vec3 winO = glm::project(glm::vec3(O[0],O[1],O[2]), GLSLShader::currentModelView(), GLSLShader::currentProjection(), viewport);
m_projectedOrigin = Geom::Vec3f(winO[0], winO[1], winO[2]);
if (ax>CENTER)
{
Geom::Vec3f A = getAxis(ax);
A += O;
glm::vec3 winA = glm::project(glm::vec3(A[0],A[1],A[2]), GLSLShader::currentModelView(), GLSLShader::currentProjection(), viewport); glm::vec3 winA = glm::project(glm::vec3(A[0],A[1],A[2]), GLSLShader::currentModelView(), GLSLShader::currentProjection(), viewport);
m_projectedSelectedAxis = Geom::Vec3f(winA[0]-winO[0], winA[1]-winO[1],winA[2]-winO[2]);
}
m_projectedOrigin = Geom::Vec3f(winO[0],winO[1],0.0f);
if (winA[2]-winO[2] < 0.0f)
m_projectedSelectedAxis = Geom::Vec3f(winA[0]-winO[0], winA[1]-winO[1],-1.0f);
else
m_projectedSelectedAxis = Geom::Vec3f(winA[0]-winO[0], winA[1]-winO[1],1.0f);
} }
...@@ -693,5 +698,40 @@ float FrameManipulator::scaleFromMouse(int dx, int dy) ...@@ -693,5 +698,40 @@ float FrameManipulator::scaleFromMouse(int dx, int dy)
return 1.0f + sc; return 1.0f + sc;
} }
void FrameManipulator::translateInScreen(int dx, int dy)
{
glm::i32vec4 viewport;
glGetIntegerv(GL_VIEWPORT, &(viewport[0]));
Geom::Vec3f NO = m_projectedOrigin+Geom::Vec3f(float(dx), float(dy), 0.0f);
glm::vec3 P = glm::unProject(glm::vec3(NO[0],NO[1],NO[2]), GLSLShader::currentModelView(), GLSLShader::currentProjection(), viewport);
m_trans[0] = P[0];
m_trans[1] = P[1];
m_trans[2] = P[2];
storeProjection(NONE);
}
void FrameManipulator::rotateInScreen(int dx, int dy)
{
glm::i32vec4 viewport;
glGetIntegerv(GL_VIEWPORT, &(viewport[0]));
Geom::Vec3f NO = m_projectedOrigin+Geom::Vec3f(float(-dy), float(dx), 0.0f);
glm::vec3 P = glm::unProject(glm::vec3(NO[0],NO[1],NO[2]), GLSLShader::currentModelView(), GLSLShader::currentProjection(), viewport);
Geom::Vec3f axisRotation(P[0]-m_trans[0], P[1]-m_trans[1], P[2]-m_trans[2]);
axisRotation.normalize();
glm::mat4 tr = glm::rotate(glm::mat4(1.0f),float(sqrtf(dx*dx+dy*dy))/2.0f,glm::vec3(axisRotation[0],axisRotation[1],axisRotation[2]));
m_rotations = tr*m_rotations;
}
} }
} }
...@@ -333,14 +333,9 @@ void Sphere::changeTopo(unsigned int parp, unsigned int mer) ...@@ -333,14 +333,9 @@ void Sphere::changeTopo(unsigned int parp, unsigned int mer)
unsigned int merAll = merfactor * mer; unsigned int merAll = merfactor * mer;
unsigned int parAll = parfactor* (par+1); unsigned int parAll = parfactor* (par+1);
// parAll += 1;
std::vector<Geom::Vec3f> points; std::vector<Geom::Vec3f> points;
points.reserve(parAll*merAll+2); points.reserve(parAll*merAll+2);
std::cout << "PAR="<<par << " / PARFACTOR="<<parfactor<< " / PARALL="<<parAll<< std::endl;
for (unsigned int i=0; i<parAll; ++i) for (unsigned int i=0; i<parAll; ++i)
{ {
float beta = float(i+1)*M_PI/float(parAll+1); float beta = float(i+1)*M_PI/float(parAll+1);
......
...@@ -294,7 +294,7 @@ void GLWidget::mouseMoveEvent(QMouseEvent* event) ...@@ -294,7 +294,7 @@ void GLWidget::mouseMoveEvent(QMouseEvent* event)
} }
if (m_cbs) if (m_cbs)
m_cbs->cb_mouseMove(event->button(), event->x(), getHeight() - event->y()); m_cbs->cb_mouseMove(event->buttons(), event->x(), getHeight() - event->y());
} }
void GLWidget::wheelEvent(QWheelEvent* event) void GLWidget::wheelEvent(QWheelEvent* event)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment