diff --git a/src/fgt/edit_texture/edittexture.cpp b/src/fgt/edit_texture/edittexture.cpp index 02e3cd66c..d48ae0f32 100644 --- a/src/fgt/edit_texture/edittexture.cpp +++ b/src/fgt/edit_texture/edittexture.cpp @@ -51,7 +51,7 @@ const PluginInfo &EditTexturePlugin::Info() { static PluginInfo ai; ai.Date=tr(__DATE__); - ai.Version = tr("0.7.3"); + ai.Version = tr("0.8"); ai.Author = ("Riccardo Dini"); return ai; } @@ -116,7 +116,6 @@ void EditTexturePlugin::mouseMoveEvent (QAction *,QMouseEvent * event, MeshModel glFlush(); } } - } void EditTexturePlugin::mouseReleaseEvent(QAction *,QMouseEvent * event, MeshModel &m, GLArea * gla) @@ -176,9 +175,7 @@ void EditTexturePlugin::StartEdit(QAction * /*mode*/, MeshModel &m, GLArea *gla CMeshO::FaceIterator ff; for(ff = m.cm.face.begin(); ff != m.cm.face.end(); ++ff) if(!(*ff).IsD() && (*ff).IsS()) FaceSel.push_back(&*ff); - // Reset the flag - //m.cm.face.EnableFFAdjacency(); - //tri::UpdateTopology::FaceFace(m.cm); + CMeshO::FaceIterator fi; for(fi = m.cm.face.begin(); fi != m.cm.face.end(); ++fi) (*fi).ClearS(); @@ -227,7 +224,7 @@ void EditTexturePlugin::EndEdit(QAction * , MeshModel &m , GLArea * ) void EditTexturePlugin::DrawXORRect(GLArea *gla) { -/* Draw the rectangle of the selection area */ + // Draw the rectangle of the selection area glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); @@ -252,7 +249,7 @@ void EditTexturePlugin::DrawXORRect(GLArea *gla) glDisable(GL_LOGIC_OP); glPopAttrib(); - glPopMatrix(); // restore modelview + glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); @@ -260,12 +257,10 @@ void EditTexturePlugin::DrawXORRect(GLArea *gla) void EditTexturePlugin::InitTexture(MeshModel &m) { - // Get the textures folder + // Get the textures name and add the tab QString s = QString(m.fileName.c_str()); - // Add the tab for(unsigned i = 0; i < m.cm.textures.size(); i++) widget->AddRenderArea(m.cm.textures[i].c_str(), &m, i); - vcg::Trackball tb; } Q_EXPORT_PLUGIN(EditTexturePlugin) diff --git a/src/fgt/edit_texture/images/sel_move.png b/src/fgt/edit_texture/images/sel_move.png index be27a3859..bf47051a9 100644 Binary files a/src/fgt/edit_texture/images/sel_move.png and b/src/fgt/edit_texture/images/sel_move.png differ diff --git a/src/fgt/edit_texture/images/selarea.png b/src/fgt/edit_texture/images/selarea.png index abfd6511c..430e15659 100644 Binary files a/src/fgt/edit_texture/images/selarea.png and b/src/fgt/edit_texture/images/selarea.png differ diff --git a/src/fgt/edit_texture/images/selcon.png b/src/fgt/edit_texture/images/selcon.png index 7ab91410e..8b7033de3 100644 Binary files a/src/fgt/edit_texture/images/selcon.png and b/src/fgt/edit_texture/images/selcon.png differ diff --git a/src/fgt/edit_texture/images/selpan.png b/src/fgt/edit_texture/images/selpan.png index 72dff67ca..663d5bf37 100644 Binary files a/src/fgt/edit_texture/images/selpan.png and b/src/fgt/edit_texture/images/selpan.png differ diff --git a/src/fgt/edit_texture/meshlab.qrc b/src/fgt/edit_texture/meshlab.qrc index d61dce07e..0eab1cef3 100644 --- a/src/fgt/edit_texture/meshlab.qrc +++ b/src/fgt/edit_texture/meshlab.qrc @@ -10,5 +10,6 @@ images/selarea.png images/selcon.png images/selpan.png + images/selver.png diff --git a/src/fgt/edit_texture/renderarea.cpp b/src/fgt/edit_texture/renderarea.cpp index 8387544c6..59dd3ab9f 100644 --- a/src/fgt/edit_texture/renderarea.cpp +++ b/src/fgt/edit_texture/renderarea.cpp @@ -9,6 +9,7 @@ #define ORIGINRECT 200 #define MAX 100000 #define NOSEL -1 +#define AREADIM 400 RenderArea::RenderArea(QWidget *parent, QString textureName, MeshModel *m, unsigned tnum) : QGLWidget(parent) { @@ -23,8 +24,7 @@ RenderArea::RenderArea(QWidget *parent, QString textureName, MeshModel *m, unsig } textNum = tnum; model = m; - AREADIM = 400; - + // Init oldX = 0; oldY = 0; viewport = Point2f(0,0); @@ -131,9 +131,12 @@ void RenderArea::paintEvent(QPaintEvent *) { if (selected && !model->cm.face[i].IsUserBit(selBit)) glVertex3f(model->cm.face[i].WT(j).u() * AREADIM , AREADIM - (model->cm.face[i].WT(j).v() * AREADIM), 1); - else glVertex3f((oScale.x() + (model->cm.face[i].WT(j).u() - oScale.x()) * scaleX) * AREADIM - panX/zoom, - AREADIM - ((oScale.y() + (model->cm.face[i].WT(j).v() - oScale.y()) * scaleY) * AREADIM) - panY/zoom, 1); - } + else if (editMode == Scale) + glVertex3f((oScale.x() + (model->cm.face[i].WT(j).u() - oScale.x()) * scaleX) * AREADIM - panX/zoom, + AREADIM - ((oScale.y() + (model->cm.face[i].WT(j).v() - oScale.y()) * scaleY) * AREADIM) - panY/zoom, 1); + else glVertex3f((origin.x() + (cos(degree) * (model->cm.face[i].WT(j).u() - origin.x()) - sin(degree) * (model->cm.face[i].WT(j).v() - origin.y()))) * AREADIM - panX/zoom, + AREADIM - ((origin.y() + (sin(degree) * (model->cm.face[i].WT(j).u() - origin.x()) + cos(degree) * (model->cm.face[i].WT(j).v() - origin.y()))) * AREADIM) - panY/zoom, 1); + } glEnd(); // Draw the selected faces @@ -170,7 +173,7 @@ void RenderArea::paintEvent(QPaintEvent *) glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); - glOrtho(0,AREADIM,AREADIM,0,-1,1); + glOrtho(0,this->width(),this->height(),0,-1,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); @@ -179,11 +182,15 @@ void RenderArea::paintEvent(QPaintEvent *) glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); // Line and text (native Qt) - painter.drawLine(0,AREADIM,AREADIM,AREADIM); - painter.drawLine(0,AREADIM,0,0); - painter.drawText(TRANSLATE, AREADIM - TRANSLATE, QString("(%1,%2)").arg((float)-viewport.X()/AREADIM).arg((float)viewport.Y()/AREADIM)); + int w = this->visibleRegion().boundingRect().width(); + int h = this->visibleRegion().boundingRect().height(); + painter.drawLine(0,h,w,h); + painter.drawLine(0,h,0,0); + // Calculate the coords and draw it + float c0 = (float)(w-viewport.X())/AREADIM, c1 = (float)(AREADIM - h + viewport.Y())/AREADIM; + painter.drawText(TRANSLATE, h - TRANSLATE, QString("(%1,%2)").arg((float)-viewport.X()/AREADIM).arg((float)(AREADIM - h + viewport.Y())/AREADIM)); painter.drawText(TRANSLATE, TRANSLATE*3, QString("(%1,%2)").arg((float)-viewport.X()/AREADIM).arg((float)viewport.Y()/AREADIM + 1)); - painter.drawText(AREADIM - TRANSLATE*18, AREADIM - TRANSLATE, QString("(%1,%2)").arg((float)-(viewport.X()/AREADIM) + 1).arg((float)viewport.Y()/AREADIM)); + painter.drawText(w - TRANSLATE*18, h - TRANSLATE, QString("(%1,%2)").arg(c0).arg(c1)); painter.drawText(TRANSLATE, TRANSLATE*6, QString("V")); painter.drawText(AREADIM - TRANSLATE*23, AREADIM - TRANSLATE, QString("U")); @@ -281,7 +288,7 @@ void RenderArea::mousePressEvent(QMouseEvent *e) } } -void RenderArea::mouseReleaseEvent(QMouseEvent *e) +void RenderArea::mouseReleaseEvent(QMouseEvent *) { switch(mode) { @@ -344,7 +351,7 @@ void RenderArea::mouseReleaseEvent(QMouseEvent *e) this->update(selection); } } - else // Connected + else if (selectMode == Connected) { // <--------- } @@ -385,13 +392,15 @@ void RenderArea::mouseMoveEvent(QMouseEvent *e) { // Move the origin rect inside the selection area orX = tpanX - e->x(); - int tx = originR.center().x() - orX; + /*int tx = originR.center().x() - orX; if (tx < selection.x()) orX = - selection.x() + originR.center().x(); else if (tx > selection.x() + selection.width()) orX = originR.center().x() - (selection.x() + selection.width()); + */ orY = tpanY - e->y(); - int ty = originR.y() - posY - orY; + /*int ty = originR.y() - posY - orY; if (ty < selection.y()) orY = - selection.y() + originR.center().y(); else if (ty > selection.y() + selection.height()) orY = originR.center().y() - (selection.y() + selection.height()); + */ this->update(originR); } else if (pressed > NOSEL && pressed < selRect.size()) @@ -408,10 +417,10 @@ void RenderArea::mouseMoveEvent(QMouseEvent *e) if (start.x() < end.x()) {x1 = start.x(); x2 = end.x();} else {x1 = end.x(); x2 = start.x();} if (start.y() < end.y()) {y1 = start.y(); y2 = end.y();} else {y1 = end.y(); y2 = start.y();} area = QRect(x1,y1,x2-x1,y2-y1); - if (selectMode == Area) SelectFaces(); + SelectFaces(); this->update(area); } - else + else if (selectMode == Connected) { // <------- } @@ -509,7 +518,7 @@ void RenderArea::RemapClamp() panX = 0; panY = 0; tpanX = 0; tpanY = 0; oldPX = 0; oldPY = 0; ResetTrack(true); this->update(); - emit UpdateStat(0,0,0,0,0); // <-------- + emit UpdateModel(); } void RenderArea::RemapMod() @@ -536,7 +545,7 @@ void RenderArea::RemapMod() panX = 0; panY = 0; tpanX = 0; tpanY = 0; oldPX = 0; oldPY = 0; ResetTrack(true); this->update(); - emit UpdateStat(0,0,0,0,0); // <-------- + emit UpdateModel(); } void RenderArea::ChangeMode(int index) @@ -574,8 +583,10 @@ void RenderArea::ChangeMode(int index) } } break; - case 3: + case 3: // For internal use... reset the selction mode = Select; + for (unsigned i = 0; i < model->cm.face.size(); i++) model->cm.face[i].ClearUserBit(selBit); + selection = QRect(); this->setCursor(Qt::CrossCursor); break; } @@ -585,8 +596,21 @@ void RenderArea::ChangeMode(int index) void RenderArea::ChangeSelectMode(int index) { // Change the function of the mouse selection - if (index == 0) selectMode = Area; - else selectMode = Connected; + switch(index) + { + case 0: + selectMode = Area; + break; + case 1: + selectMode = Connected; + break; + case 2: + selectMode = Vertex; + break; + default: + selectMode = Area; + break; + } } void RenderArea::RotateComponent(float alfa) @@ -610,7 +634,7 @@ void RenderArea::RotateComponent(float alfa) } } this->update(); - emit UpdateStat(0,0,0,0,0); // <-------- + emit UpdateModel(); } } @@ -629,7 +653,7 @@ void RenderArea::ScaleComponent(float percX, float percY) } } this->update(); - emit UpdateStat(0,0,0,0,0); + emit UpdateModel(); } void RenderArea::UpdateUV() @@ -648,7 +672,7 @@ void RenderArea::UpdateUV() } panX = 0; panY = 0; tpanX = 0; tpanY = 0; oldPX = 0; oldPY = 0; this->update(); - emit UpdateStat(0,0,0,0,0); // <-------- + emit UpdateModel(); } void RenderArea::ResetTrack(bool resetViewPort) @@ -661,14 +685,6 @@ void RenderArea::ResetTrack(bool resetViewPort) tb->track.SetTranslate(Point3f(viewport.X(), viewport.Y(), 1)); } -void RenderArea::SetDimension(int dim) -{ - // Change the dimension of the control - AREADIM = dim; - // <-------- resize e cambio areadim - this->update(); -} - void RenderArea::SelectFaces() { // Check if a face is inside the rectangle of selection and mark it diff --git a/src/fgt/edit_texture/renderarea.h b/src/fgt/edit_texture/renderarea.h index f259a3acb..deffdea1d 100644 --- a/src/fgt/edit_texture/renderarea.h +++ b/src/fgt/edit_texture/renderarea.h @@ -15,12 +15,6 @@ #define RADIUS 10 #define RECTDIM 30 -#define NO_CHANGE -1 -#define RESET -2 -#define IGNORECMD -3 -#define ENABLECMD -4 -#define DISABLECMD -5 - using namespace std; class RenderArea : public QGLWidget @@ -30,7 +24,7 @@ class RenderArea : public QGLWidget public: enum Mode { View, Edit, Select }; enum EditMode { Scale, Rotate, NoEdit }; - enum SelectMode { Area, Connected }; + enum SelectMode { Area, Connected, Vertex }; RenderArea(QWidget *parent = 0, QString path = QString(), MeshModel *m = 0, unsigned textNum = 0); ~RenderArea(); @@ -44,7 +38,6 @@ public: void ChangeSelectMode(int index); void RemapClamp(); void RemapMod(); - void SetDimension(int dim); protected: void paintEvent(QPaintEvent *event); @@ -52,7 +45,7 @@ protected: void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); - void wheelEvent(QWheelEvent*e); + void wheelEvent(QWheelEvent *event); private: bool antialiased; // Antialiasing @@ -77,32 +70,30 @@ private: int panX, panY, tpanX, tpanY, oldPX, oldPY; // Temp for axis int maxX, maxY, minX, minY; // For texCoord out of border - int selBit; - bool selected; + int selBit; // User bit: idicates if a face is selected for editing + bool selected; // Indicates if the are some selected faces QPointF origin; // Origin for rotate editing QRect originR; int orX, orY; QPoint start, end; // Selection area - QRect area; + QRect area; // Dragged rectangle // Info for interactive editing - vector selRect; - QRect selection; + vector selRect; // Vector of buttons area + QRect selection; // Selection area QPoint selStart, selEnd; - int posX, posY, rectX, rectY, oldSRX, oldSRY; - float degree, scaleX, scaleY; - int highlighted, pressed, oldDelta; - QPointF oScale; - int initVX, initVY; - float B2, Rm, Rq; + int posX, posY, rectX, rectY, oldSRX, oldSRY; // Stored value + float degree, scaleX, scaleY; // Value for edit + int highlighted, pressed, oldDelta; // Info about mouse + QPointF oScale; // Point of origin for scaling + int initVX, initVY; // Old values of viewport + float B2, Rm, Rq; // Params for line intersection - QImage rot, scal; + QImage rot, scal; // Images for buttons - int AREADIM; - - float zoom; + float zoom; // Actual value of zoom void UpdateUV(); void ResetTrack(bool reset); @@ -115,7 +106,7 @@ private: void UpdateSelectionArea(int x, int y); signals: - void UpdateStat(float u, float v, int faceN, int vertN, int countFace); + void UpdateModel(); }; diff --git a/src/fgt/edit_texture/textureeditor.cpp b/src/fgt/edit_texture/textureeditor.cpp index 75b487566..19f9c2736 100644 --- a/src/fgt/edit_texture/textureeditor.cpp +++ b/src/fgt/edit_texture/textureeditor.cpp @@ -29,7 +29,7 @@ void TextureEditor::AddRenderArea(QString texture, MeshModel *m, unsigned index) QTabBar *t = new QTabBar(ui.tabWidget); RenderArea *ra= new RenderArea(t, texture, m, index); - ra->setGeometry(MARGIN,MARGIN,400,400); + ra->setGeometry(MARGIN,MARGIN,MAXW,MAXH); ui.tabWidget->addTab(t, name); if (countPage == 1) { @@ -38,7 +38,7 @@ void TextureEditor::AddRenderArea(QString texture, MeshModel *m, unsigned index) ra->show(); } countPage++; - QObject::connect(ra, SIGNAL(UpdateStat(float,float,int,int, int)),this, SLOT(UpStat(float,float,int,int, int))); + QObject::connect(ra, SIGNAL(UpdateModel()),this, SLOT(UpdateModel())); } @@ -51,10 +51,9 @@ void TextureEditor::AddEmptyRenderArea() ra->show(); } -void TextureEditor::UpStat(float u, float v, int faceN, int vertN, int countFace) +void TextureEditor::UpdateModel() { - // Manage the update of the controls from RenderArea to the editor, also enable/disable controls - // <----- TODO + // Update the mesh after an edit area->update(); } @@ -91,7 +90,7 @@ void TextureEditor::on_connectedButton_clicked() ResetLayout(); ((RenderArea*)ui.tabWidget->currentWidget()->childAt(MARGIN,MARGIN))->ChangeMode(2); ((RenderArea*)ui.tabWidget->currentWidget()->childAt(MARGIN,MARGIN))->ChangeSelectMode(1); - ui.moveButton->setChecked(true); + ui.connectedButton->setChecked(true); } void TextureEditor::on_selectButton_clicked() @@ -102,16 +101,12 @@ void TextureEditor::on_selectButton_clicked() ui.selectButton->setChecked(true); } -void TextureEditor::on_optimizeButton_clicked() +void TextureEditor::on_vertexButton_clicked() { ResetLayout(); - ui.optimizeButton->setChecked(true); -} - -void TextureEditor::on_optionButton_clicked() -{ - ResetLayout(); - ui.optionButton->setChecked(true); + ((RenderArea*)ui.tabWidget->currentWidget()->childAt(MARGIN,MARGIN))->ChangeMode(2); + ((RenderArea*)ui.tabWidget->currentWidget()->childAt(MARGIN,MARGIN))->ChangeSelectMode(2); + ui.vertexButton->setChecked(true); } void TextureEditor::on_clampButton_clicked() @@ -129,7 +124,7 @@ void TextureEditor::ResetLayout() // uncheck all the buttons ui.connectedButton->setChecked(false); ui.moveButton->setChecked(false); - ui.optionButton->setChecked(false); ui.selectButton->setChecked(false); - ui.optimizeButton->setChecked(false); + ui.vertexButton->setChecked(false); } + diff --git a/src/fgt/edit_texture/textureeditor.h b/src/fgt/edit_texture/textureeditor.h index 2a1d7984a..57e5e04b3 100644 --- a/src/fgt/edit_texture/textureeditor.h +++ b/src/fgt/edit_texture/textureeditor.h @@ -8,6 +8,8 @@ #include "renderarea.h" #define MARGIN 5 +#define MAXW 1400 +#define MAXH 1000 using namespace std; @@ -36,18 +38,15 @@ private: private slots: void on_connectedButton_clicked(); - void on_optimizeButton_clicked(); void on_moveButton_clicked(); void on_selectButton_clicked(); - void on_optionButton_clicked(); + void on_vertexButton_clicked(); void on_clampButton_clicked(); void on_modulusButton_clicked(); public slots: - void UpStat(float u, float v, int faceN, int vertN, int countFace); + void UpdateModel(); -signals: - void updateUV(float u, float v); }; #endif // TEXTUREEDITOR_H diff --git a/src/fgt/edit_texture/textureeditor.ui b/src/fgt/edit_texture/textureeditor.ui index b214f0762..35b6fbb0f 100644 --- a/src/fgt/edit_texture/textureeditor.ui +++ b/src/fgt/edit_texture/textureeditor.ui @@ -5,8 +5,8 @@ 0 0 - 443 - 748 + 439 + 686 @@ -43,6 +43,19 @@ 6 + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -100,7 +113,7 @@ - Allow the selection of face inside a dragged area + Allow the selection of faces inside a dragged area @@ -176,7 +189,7 @@ - + 0 @@ -185,8 +198,20 @@ 0 + + Allow the selection of vertexes inside a dragged area + - Optimize + + + + :/images/selver.png + + + + 32 + 32 + true @@ -206,24 +231,6 @@ - - - - - 0 - 0 - 0 - 0 - - - - Option - - - true - - - @@ -353,50 +360,6 @@ - - - - Options - - - - 9 - - - 6 - - - - - - - - Color: - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - -