git-svn-id: svn://db.shs.com.ru/libs@629 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "glmesh.h"
|
||||
#include "gltexture_manager.h"
|
||||
#include <chunkstream.h>
|
||||
#include <qad_types.h>
|
||||
#include <QApplication>
|
||||
#include <QOpenGLTexture>
|
||||
#include <QKeyEvent>
|
||||
@@ -31,6 +32,8 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this) {
|
||||
setIcon(QIcon(":/icons/qglview.png"));
|
||||
deleting_ = false;
|
||||
timer = 0;
|
||||
app_scale = 1;
|
||||
cur_handle = RendererService::htNoHandle;
|
||||
need_init_ = is_first_draw = true;
|
||||
backColor_ = Qt::darkGray;
|
||||
hoverHaloColor_ = QColor(195, 140, 255);
|
||||
@@ -91,7 +94,7 @@ QGLView::QGLView(): OpenGLWindow(), renderer_(this) {
|
||||
//camera().aim_ = camera().pos_;
|
||||
ktm_.restart();
|
||||
|
||||
Mesh * m = Primitive::ellipsoidFrame(5,5);
|
||||
Mesh * m = Primitive::torus(30, 12, 1., 0.1);
|
||||
ObjectBase * o = new ObjectBase(m);
|
||||
o->setColor(Qt::cyan);
|
||||
scene()->addObject(o);
|
||||
@@ -151,6 +154,7 @@ ObjectBase * QGLView::selectedObject() const {
|
||||
|
||||
void QGLView::resizeEvent(QResizeEvent * e) {
|
||||
renderLater();
|
||||
app_scale = appScale();
|
||||
}
|
||||
|
||||
|
||||
@@ -227,6 +231,10 @@ void QGLView::resizeGL(int width, int height) {
|
||||
|
||||
|
||||
void QGLView::mouseReleaseEvent(QMouseEvent * e) {
|
||||
if (cur_handle != RendererService::htNoHandle) {
|
||||
mouseMoveEvent(e);
|
||||
return;
|
||||
}
|
||||
bool add_ts = e->modifiers().testFlag(sel_mod);
|
||||
if (selecting_) {
|
||||
selecting_ = false;
|
||||
@@ -246,6 +254,9 @@ void QGLView::mouseReleaseEvent(QMouseEvent * e) {
|
||||
|
||||
|
||||
void QGLView::mousePressEvent(QMouseEvent * e) {
|
||||
if (cur_handle != RendererService::htNoHandle && e->buttons() == Qt::LeftButton) {
|
||||
return;
|
||||
}
|
||||
if (selecting_) {
|
||||
downPos = e->pos();
|
||||
selecting_ = false;
|
||||
@@ -261,6 +272,45 @@ void QGLView::mousePressEvent(QMouseEvent * e) {
|
||||
|
||||
void QGLView::mouseMoveEvent(QMouseEvent * e) {
|
||||
QPoint cpos = e->pos();
|
||||
if (cur_handle != RendererService::htNoHandle && (e->buttons() == Qt::LeftButton)) {
|
||||
RendererService & rs(renderer_.rend_service);
|
||||
QList<ObjectBase*> objects = scene()->selectedObjects(true);
|
||||
int axis = cur_handle;
|
||||
if (cur_handle >= RendererService::htMoveX && cur_handle <= RendererService::htMoveZ ) axis -= RendererService::htMoveX;
|
||||
if (cur_handle >= RendererService::htRotateX && cur_handle <= RendererService::htRotateZ) axis -= RendererService::htRotateX;
|
||||
if (cur_handle >= RendererService::htScaleX && cur_handle <= RendererService::htScaleZ ) axis -= RendererService::htScaleX;
|
||||
QVector3D axe_vector; axe_vector[axis] = 1.;
|
||||
QVector3D center_screen = camera()->fullViewMatrix() * rs.selection_center;
|
||||
QVector3D axe_screen = ((camera()->fullViewMatrix() * (rs.selection_center + axe_vector)) - center_screen).normalized();
|
||||
QVector3D mouse_vector(cpos - lastPos);
|
||||
mouse_vector[1] *= -1.;
|
||||
if (cur_handle >= RendererService::htMoveX && cur_handle <= RendererService::htMoveZ) {
|
||||
double len_scl = 1. / QVector3D(axe_screen.x(), axe_screen.y(), 1.E-6).length();
|
||||
mouse_vector /= QVector3D(width(), height(), 1);
|
||||
mouse_vector *= -center_screen.z() * len_scl;
|
||||
axe_vector *= QVector3D::dotProduct(axe_screen, mouse_vector);
|
||||
foreach (ObjectBase * o, objects)
|
||||
o->move(axe_vector);
|
||||
}
|
||||
if (cur_handle >= RendererService::htRotateX && cur_handle <= RendererService::htRotateZ) {
|
||||
axe_screen.setZ(0.);
|
||||
axe_screen.normalize();
|
||||
QVector3D norm = QVector3D(axe_screen.y(), -axe_screen.x(), 0.);
|
||||
axe_vector *= QVector3D::dotProduct(mouse_vector, norm) / 2. / app_scale;
|
||||
foreach (ObjectBase * o, objects)
|
||||
o->setRotation(o->rotation() + axe_vector);
|
||||
}
|
||||
if (cur_handle >= RendererService::htScaleX && cur_handle <= RendererService::htScaleZ) {
|
||||
mouse_vector /= QVector3D(width(), height(), 1);
|
||||
mouse_vector *= 3. / app_scale;
|
||||
axe_vector *= QVector3D::dotProduct(axe_screen, mouse_vector);
|
||||
foreach (ObjectBase * o, objects)
|
||||
o->scale(QVector3D(1,1,1) + axe_vector);
|
||||
}
|
||||
//if (cur_handle >= RendererService::htScaleX && cur_handle <= RendererService::htScaleZ ) cs = Qt::SplitHCursor;
|
||||
lastPos = e->pos();
|
||||
return;
|
||||
}
|
||||
if (selecting_) {
|
||||
renderer_.mouse_rect = QRect(downPos, cpos).normalized();
|
||||
return;
|
||||
@@ -294,6 +344,20 @@ void QGLView::mouseMoveEvent(QMouseEvent * e) {
|
||||
}
|
||||
lastPos = e->pos();
|
||||
if (customMouseMove_) emit customMouseMoveEvent(e->pos(), lastPos, e->buttons());
|
||||
if (e->buttons() == 0) {
|
||||
cur_handle = RendererService::htNoHandle;
|
||||
Qt::CursorShape cs = Qt::CrossCursor;
|
||||
if (renderer_.edit_mode) {
|
||||
uint hid = renderer_.rend_selection.id_hover;
|
||||
if (hid >= RendererService::htMoveX && hid <= RendererService::htScaleZ) {
|
||||
cur_handle = (RendererService::HandleType)hid;
|
||||
if (hid >= RendererService::htMoveX && hid <= RendererService::htMoveZ ) cs = Qt::SizeAllCursor;
|
||||
if (hid >= RendererService::htRotateX && hid <= RendererService::htRotateZ) cs = Qt::PointingHandCursor;
|
||||
if (hid >= RendererService::htScaleX && hid <= RendererService::htScaleZ ) cs = Qt::SplitHCursor;
|
||||
}
|
||||
}
|
||||
setCursor(cs);
|
||||
}
|
||||
if (grabMouse_) {
|
||||
QCursor::setPos(mapToGlobal(QRect(QPoint(), size()).center()));
|
||||
static bool mouse_sec = false;
|
||||
@@ -444,3 +508,8 @@ QImage QGLView::materialThumbnail(Material * m) {
|
||||
return renderer_.materialThumbnail(m);
|
||||
}
|
||||
|
||||
|
||||
void QGLView::setCurrentHadle(RendererService::HandleType ht) {
|
||||
renderer_.rend_service.setCurrentHadle(ht);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user