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)
m_pickedAxis=fr_picked;
}
// project center & axis on screen for easy manipulation
if (m_pickedAxis != Utils::FrameManipulator::NONE)
m_frame->storeProjection(m_pickedAxis);
// highlighting
m_frame->highlight(m_pickedAxis);
......@@ -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();
}
void MyQT::cb_mouseMove(int button, int x, int y)
void MyQT::cb_mouseMove(int buttons, int x, int y)
{
if (!Shift())
return;
// rotation selected ?
if (Utils::FrameManipulator::rotationAxis(m_pickedAxis))
{
float angle = m_frame->angleFromMouse(x,y,x-m_begX, y-m_begY);
m_frame->rotate(m_pickedAxis, angle);
if (buttons&1)
{
float angle = m_frame->angleFromMouse(x,y,x-m_begX, y-m_begY);
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();
}
// translation selected
else if (Utils::FrameManipulator::translationAxis(m_pickedAxis))
{
float dist = m_frame->distanceFromMouse(x-m_begX, y-m_begY);
m_frame->translate(m_pickedAxis, dist);
if (buttons&1)
{
float dist = m_frame->distanceFromMouse(x-m_begX, y-m_begY);
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();
}
// scale selected
else if (Utils::FrameManipulator::scaleAxis(m_pickedAxis) )
{
float scale = m_frame->scaleFromMouse(x-m_begX, y-m_begY);
m_frame->scale(m_pickedAxis, scale );
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_begY = y;
......@@ -274,42 +298,61 @@ void MyQT::cb_keyPress(int code)
m_frame->setTransformation(m_lastPickedObject->transfo());
break;
case 'x':
m_frame->lock(Utils::FrameManipulator::Xt);
if (m_frame->locked(Utils::FrameManipulator::Xt))
m_frame->unlock(Utils::FrameManipulator::Xt);
else
m_frame->lock(Utils::FrameManipulator::Xt);
break;
case 'y':
m_frame->lock(Utils::FrameManipulator::Yt);
if (m_frame->locked(Utils::FrameManipulator::Yt))
m_frame->unlock(Utils::FrameManipulator::Yt);
else
m_frame->lock(Utils::FrameManipulator::Yt);
break;
case 'z':
m_frame->lock(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);
if (m_frame->locked(Utils::FrameManipulator::Zt))
m_frame->unlock(Utils::FrameManipulator::Zt);
else
m_frame->lock(Utils::FrameManipulator::Zt);
break;
case 'a':
m_frame->lock(Utils::FrameManipulator::Xr);
if (m_frame->locked(Utils::FrameManipulator::Xr))
m_frame->unlock(Utils::FrameManipulator::Xr);
else
m_frame->lock(Utils::FrameManipulator::Xr);
break;
case 'b':
m_frame->lock(Utils::FrameManipulator::Yr);
if (m_frame->locked(Utils::FrameManipulator::Yr))
m_frame->unlock(Utils::FrameManipulator::Yr);
else
m_frame->lock(Utils::FrameManipulator::Yr);
break;
case 'c':
m_frame->lock(Utils::FrameManipulator::Zr);
if (m_frame->locked(Utils::FrameManipulator::Zr))
m_frame->unlock(Utils::FrameManipulator::Zr);
else
m_frame->lock(Utils::FrameManipulator::Zr);
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;
case 'B':
m_frame->unlock(Utils::FrameManipulator::Yr);
case 't':
if (m_frame->locked(Utils::FrameManipulator::Ys))
m_frame->unlock(Utils::FrameManipulator::Ys);
else
m_frame->lock(Utils::FrameManipulator::Ys);
break;
case 'C':
m_frame->unlock(Utils::FrameManipulator::Zr);
case 'u':
if (m_frame->locked(Utils::FrameManipulator::Zs))
m_frame->unlock(Utils::FrameManipulator::Zs);
else
m_frame->lock(Utils::FrameManipulator::Zs);
break;
}
updateGL();
}
......@@ -326,6 +369,11 @@ int main(int argc, char **argv)
if (argc>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
Geom::Vec3f lPosObj = Geom::Vec3f(0.0f,0.0f,0.0f);
float lWidthObj = sqt.NBP*4.0f;
......
......@@ -428,6 +428,11 @@ public:
*/
void unlock(unsigned int axis);
/**
* is an axis locked
*/
bool locked(unsigned int axis);
/**
* higlight an axis (change width rendering).
* To unhighlight, just highlight NONE or highlight a already highlighted axis
......@@ -508,6 +513,12 @@ public:
static bool translationAxis(unsigned int axis) { return (axis>=Xt) && (axis<=Zt);}
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);
};
......
......@@ -618,17 +618,21 @@ void FrameManipulator::setTransformation( const glm::mat4& transfo)
m_rotations[2][2] = Rz[2];
}
void FrameManipulator::lock(unsigned int axis)
void FrameManipulator::lock(unsigned int axis)
{
m_locked_axis[axis] = true;
}
void FrameManipulator::unlock(unsigned int axis)
void FrameManipulator::unlock(unsigned int axis)
{
m_locked_axis[axis] = false;
}
bool FrameManipulator::locked(unsigned int axis)
{
return m_locked_axis[axis];
}
Geom::Vec3f FrameManipulator::getAxis(unsigned int ax)
{
......@@ -641,19 +645,20 @@ Geom::Vec3f FrameManipulator::getAxis(unsigned int ax)
void FrameManipulator::storeProjection(unsigned int ax)
{
Geom::Vec3f O = getPosition();
Geom::Vec3f A = getAxis(ax);
A += O;
glm::i32vec4 viewport;
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 winA = glm::project(glm::vec3(A[0],A[1],A[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);
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)
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)
unsigned int merAll = merfactor * mer;
unsigned int parAll = parfactor* (par+1);
// parAll += 1;
std::vector<Geom::Vec3f> points;
points.reserve(parAll*merAll+2);
std::cout << "PAR="<<par << " / PARFACTOR="<<parfactor<< " / PARALL="<<parAll<< std::endl;
for (unsigned int i=0; i<parAll; ++i)
{
float beta = float(i+1)*M_PI/float(parAll+1);
......
......@@ -294,7 +294,7 @@ void GLWidget::mouseMoveEvent(QMouseEvent* event)
}
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)
......
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