mirror of
https://github.com/lucaspalomodevelop/meshlab.git
synced 2026-03-13 08:09:39 +00:00
217 lines
7.3 KiB
C++
217 lines
7.3 KiB
C++
/****************************************************************************
|
|
* MeshLab o o *
|
|
* An extendible mesh processor o o *
|
|
* _ O _ *
|
|
* Copyright(C) 2005, 2009 \/)\/ *
|
|
* Visual Computing Lab /\/| *
|
|
* ISTI - Italian National Research Council | *
|
|
* \ *
|
|
* All rights reserved. *
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
* This program is distributed in the hope that it will be useful, *
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
|
|
* for more details. *
|
|
* *
|
|
****************************************************************************/
|
|
|
|
#ifndef RENDERAREA_H
|
|
#define RENDERAREA_H
|
|
|
|
#include <QBrush>
|
|
#include <QPen>
|
|
#include <QPixmap>
|
|
#include <common/meshmodel.h>
|
|
#include <wrap/gui/trackball.h>
|
|
#include <stdio.h>
|
|
#include <QGLWidget>
|
|
#include <QShortcut>
|
|
|
|
#define TEXTX 175
|
|
#define TEXTY 200
|
|
#define FMETRICX 30
|
|
#define FMETRICY 10
|
|
#define TRANSLATE 5
|
|
#define RADIUS 10
|
|
#define VRADIUS 4
|
|
#define RECTDIM 30
|
|
#define VIEWMODE 0
|
|
#define EDITFACEMODE 1
|
|
#define SELECTMODE 2
|
|
#define SPECIALMODE 3
|
|
#define EDITVERTEXMODE 4
|
|
#define UNIFYMODE 5
|
|
#define SELECTAREA 0
|
|
#define SELECTCONNECTED 1
|
|
#define SELECTVERTEX 2
|
|
|
|
using namespace std;
|
|
using namespace vcg;
|
|
|
|
class RenderArea : public QGLWidget
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
enum Mode { View, Edit, EditVert, Select, UnifyVert, NoMode };
|
|
enum EditMode { Scale, Rotate, NoEdit };
|
|
enum SelectMode { Area, Connected, Vertex };
|
|
|
|
RenderArea(QWidget *parent = 0, QString path = QString(), MeshModel *m = 0, unsigned textNum = 0);
|
|
~RenderArea();
|
|
|
|
void setPen(const QPen &pen);
|
|
void setBrush(const QBrush &brush);
|
|
void setAntialiased(bool antialiased);
|
|
void setTexture(QString path);
|
|
void ChangeMode(int index);
|
|
void ChangeSelectMode(int index);
|
|
void RemapClamp();
|
|
void RemapMod();
|
|
void ClearSelection();
|
|
void InvertSelection();
|
|
void Flip(bool mode);
|
|
void ImportSelection();
|
|
void UnifyCouple();
|
|
void UnifySet();
|
|
void ResetPosition();
|
|
QString GetTextureName();
|
|
void RecalculateSelectionArea();
|
|
void SetDegenerate(bool deg);
|
|
|
|
protected:
|
|
void paintEvent(QPaintEvent *event);
|
|
void mousePressEvent(QMouseEvent *event);
|
|
void mouseReleaseEvent(QMouseEvent *event);
|
|
void mouseMoveEvent(QMouseEvent *event);
|
|
void mouseDoubleClickEvent(QMouseEvent *event);
|
|
void wheelEvent(QWheelEvent *event);
|
|
void keyPressEvent(QKeyEvent *event);
|
|
|
|
private:
|
|
bool antialiased; // Antialiasing
|
|
QImage image; // Background texture
|
|
unsigned textNum; // Number of tab (--> index in 'textures' vector)
|
|
QString fileName; // Name of the texture
|
|
MeshModel *model; // Ref to the model (for update)
|
|
|
|
Mode mode, oldMode; // Action type
|
|
EditMode editMode;
|
|
SelectMode selectMode;
|
|
|
|
// Trackball data
|
|
vcg::Trackball *tb;
|
|
vcg::Point2f viewport;
|
|
float oldX, oldY;
|
|
int tmpX, tmpY;
|
|
|
|
QPen pen; // For 2D painting
|
|
QBrush brush;
|
|
|
|
int panX, panY, tpanX, tpanY, oldPX, oldPY, posVX, posVY; // Temp for axis
|
|
int maxX, maxY, minX, minY; // For texCoord out of border
|
|
|
|
int selBit, selVertBit; // User bit: indicates if a face/vertex is selected for editing
|
|
bool selected, selectedV; // 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; // Dragged rectangle
|
|
QRectF areaUV; // Area of selected vertices
|
|
|
|
// Info for interactive editing
|
|
vector<QRect> selRect; // Vector of buttons area
|
|
QRect vertRect; // Rectangle for vertices
|
|
QRect selection; // Selection area
|
|
QPoint selStart, selEnd;
|
|
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; // Images for buttons
|
|
|
|
float zoom; // Actual value of zoom
|
|
|
|
int VCount; // Vertex counter
|
|
CVertexO *collapse1, // Pointer to vertex for collapse
|
|
*collapse2;
|
|
vector<CFaceO*> banList;
|
|
TexCoord2<float> vc1, vc2;
|
|
CVertexO *unifyA, *unifyA1, *unifyB, *unifyB1; // Pointer to unify segment
|
|
QRect unifyRA, unifyRA1, unifyRB, unifyRB1;
|
|
QPoint uvertA, uvertB, uvertA1, uvertB1;
|
|
float tua, tva, tub, tvb, tua1, tva1, tub1, tvb1;
|
|
CFaceO *firstface, *firstface1;
|
|
bool locked, degenerate;
|
|
GLuint id;
|
|
|
|
vector<CVertexO*> path, path1; // Set of vertex of the path
|
|
vector<Point2f> drawnPath, drawnPath1; // Set of UV coords found in the path
|
|
bool drawP, drawP1;
|
|
|
|
void UpdateUV();
|
|
void UpdateVertex();
|
|
void ResetTrack(bool reset);
|
|
void SelectFaces();
|
|
void SelectConnectedComponent(QPoint e);
|
|
void SelectVertexes();
|
|
void HandleScale(QPoint e);
|
|
void HandleRotate(QPoint e);
|
|
void RotateComponent(float theta);
|
|
void ScaleComponent(float percentX, float percentY);
|
|
void UpdateSelectionArea(int x, int y);
|
|
void UpdateSelectionAreaV(int x, int y);
|
|
void UpdateVertexSelection();
|
|
QPointF ToUVSpace(int x, int y);
|
|
QPoint ToScreenSpace(float u, float v);
|
|
void DrawCircle(QPoint origin);
|
|
void UpdateBoundingArea(QPoint topLeft, QPoint topRight);
|
|
void CountVertexes();
|
|
bool isInside(vector<TexCoord2<float> >, TexCoord2<float>);
|
|
bool isInside(CFaceO* face);
|
|
void ShowFaces();
|
|
void UpdateUnify();
|
|
vector<CVertexO*> FindPath(CVertexO* begin, CVertexO* end, CFaceO* first, int pathN);
|
|
void UpdateUnifyTopology();
|
|
void SetUpRegion(QPoint a, QPoint b, QPoint c);
|
|
void CheckVertex();
|
|
|
|
void drawSelectedVertexes(int faceindex);
|
|
void drawSelectedFaces(int faceindex);
|
|
void drawEdge(int faceindex);
|
|
void drawUnifyVertexes();
|
|
void drawBackground();
|
|
void drawAxis(QPainter *painter);
|
|
void drawSelectionRectangle(QPainter *painter);
|
|
void drawEditRectangle(QPainter *painter);
|
|
void drawUnifyRectangles(QPainter *painter);
|
|
void resetUnifyData();
|
|
void handleUnifySelection(CMeshO::FaceIterator fi, int j);
|
|
|
|
void handlePressView(QMouseEvent *e);
|
|
void handlePressEdit(QMouseEvent *e);
|
|
void handlePressSelect(QMouseEvent *e);
|
|
void handleReleaseView(QMouseEvent *e);
|
|
void handleReleaseEdit(QMouseEvent *e);
|
|
void handleReleaseSelect(QMouseEvent *e);
|
|
void handleMoveEdit(QMouseEvent *e);
|
|
void handleMoveSelect(QMouseEvent *e);
|
|
|
|
signals:
|
|
void UpdateModel();
|
|
|
|
};
|
|
|
|
#endif |