worked on 3D viz

scaling, moving by finger
some fixes / improvement
This commit is contained in:
k-a-z-u
2018-02-06 17:35:10 +01:00
parent 076c0e9157
commit bce771d6d6
28 changed files with 547 additions and 155 deletions

View File

@@ -11,6 +11,9 @@
#include "../3D/navMesh/NavMeshModel.h"
#include "../3D/navMesh/NavMeshRenderer.h"
#include "../3D/floorplan/FloorplanRenderer.h"
#include "../3D/floorplan/FloorplanRendererModel.h"
#include <QPushButton>
MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) {
@@ -29,6 +32,9 @@ MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) {
gridRenderer = new GridRenderer();
floorplanRenderer = new FloorplanRenderer();
floorplanRendererModel = new FloorplanRendererModel();
QString style = "QPushButton:checked{\
background-color: rgb(200, 200, 230);\
border: none; \
@@ -68,6 +74,18 @@ MapView3D::MapView3D(QWidget *parent) : QOpenGLWidget(parent) {
emit onShow3DNavMesh(btnNavMesh->isChecked());
});
// android
setAttribute(Qt::WA_AcceptTouchEvents, true);
grabGesture(Qt::PanGesture);
grabGesture(Qt::PinchGesture);
auto format = QSurfaceFormat();
//format.setVersion(4,3);
format.setSamples(4);
//format.setProfile(QSurfaceFormat::CoreProfile);
setFormat(format);
}
@@ -84,22 +102,17 @@ void MapView3D::initializeGL() {
// additional settings
glEnable(GL_DEPTH_TEST);
glClearColor(1,1,1,1);
glClearColor(0.9, 0.9, 1.0, 1.0);
}
void MapView3D::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw();
}
void MapView3D::resizeGL(int width, int height) {
glViewport(0, 0, width, height);
}
@@ -117,18 +130,22 @@ void MapView3D::mouseMoveEvent(QMouseEvent* e) {
rot.z -= dx/2.0f;
rot.x -= dy/2.0f;
} else if (mouse.btn == 4) {
//Point3 vec(-dx / width() * 2 * viewport.size.x, 0, +dy / height() * 2 * viewport.size.y);
Point3 vec(-dx / width() * 2 * viewport.size.x, +dy / height() * 2 * viewport.size.y, 0);
//Point3 vec(-dx * 2 / width() , 0, +dy * 2 / height());
vec = vec.rot(-rot.x/180*M_PI, -rot.y/180*M_PI, -rot.z/180*M_PI);
vec /= scale;
center += vec;
moveXY(dx, dy);
}
mouse.x = e->x();
mouse.y = e->y();
update();
}
void MapView3D::moveXY(float dx, float dy) {
//Point3 vec(-dx / width() * 2 * viewport.size.x, 0, +dy / height() * 2 * viewport.size.y);
Point3 vec(-dx / width() * 2 * viewport.size.x, +dy / height() * 2 * viewport.size.y, 0);
//Point3 vec(-dx * 2 / width() , 0, +dy * 2 / height());
vec = vec.rot(-rot.x/180*M_PI, -rot.y/180*M_PI, -rot.z/180*M_PI);
vec /= scale;
center += vec;
}
void MapView3D::mouseReleaseEvent(QMouseEvent* e) {
(void) e;
update();
@@ -140,14 +157,52 @@ void MapView3D::wheelEvent(QWheelEvent* e) {
update();
}
// android
bool MapView3D::event(QEvent* event) {
if (event->type() == QEvent::Gesture) {
return gestureEvent(static_cast<QGestureEvent*>(event));
//} else if (event->type() == QEvent::TouchBegin) {
// return true;
//} else if (event->type() == QEvent::TouchUpdate) {
// return true;
} else {
return QWidget::event(event);
}
}
bool MapView3D::gestureEvent(QGestureEvent* event) {
if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) {
//swipeTriggered(static_cast<QSwipeGesture *>(swipe));
} else if (QGesture *pan = event->gesture(Qt::PanGesture))
panTriggered(static_cast<QPanGesture *>(pan));
return true;
if (QGesture *pinch = event->gesture(Qt::PinchGesture)) {
pinchTriggered(static_cast<QPinchGesture *>(pinch));
return true;
}
return false;
}
void MapView3D::pinchTriggered(QPinchGesture* gesture) {
update();
}
void MapView3D::panTriggered(QPanGesture* gesture) {
moveXY(gesture->delta().x(), gesture->delta().y());
update();
}
void MapView3D::setShowFloorplan(bool show) {
this->showFloorplan = show;
if (!show) {update(); return;}
//if (gridModel) {delete gridModel; gridModel = nullptr;}
//if (navMeshModel) {delete navMeshModel; navMeshModel = nullptr;}
update();
// refresh
layerChange();
}
@@ -193,26 +248,32 @@ void MapView3D::setShowNavMesh(bool show) {
}
void MapView3D::layerChange() {
// todo: layers??
Floorplan::IndoorMap* im = getModel()->getMap();
this->floorplanRendererModel->rebuild(im);
update();
}
#include "misc/Shader.h"
void MapView3D::draw() {
static RenderSettings rs = RenderSettings(new Shader());
// view
QMatrix4x4 V;
V.translate(0,0,-30);
V.translate(0,0,-50); // above the building
V.scale(scale.x, scale.y, scale.z);
V.rotate(rot.x, 1.0, 0.0, 0.0);
V.rotate(rot.y, 0.0, 1.0, 0.0);
V.rotate(rot.z, 0.0, 0.0, 1.0);
V.translate(center.x, center.y, center.z);
// V.lookAt(QVector3D(30,-25,25), QVector3D(30,10,0), QVector3D(0,1,0));
float far = 200; // TODO
// projection
QMatrix4x4 P;
@@ -223,30 +284,34 @@ void MapView3D::draw() {
float h = height() / 30;
viewport.size.x = w;
viewport.size.y = h;
P.perspective(45.0f, aspect, 0.01, 100);
P.perspective(45.0f, aspect, 0.01, far);
} else {
// default size: 50 * 50/aspect meters
float w = 50.0f;
float h = 50.0f * height() / width();
viewport.size.x = w;
viewport.size.y = h;
P.ortho(-w, +w, -h, +h, 0.1f, +100);
P.ortho(-w, +w, -h, +h, 0.1f, +far);
}
rs.shader->bind();
rs.shader->setViewMatrix(V);
rs.shader->setProjectionMatrix(P);
// solid floorplan parts
if (showFloorplan) {
std::vector<MapModelElement*> elements = getModel()->getVisibleElements();
for (MapModelElement* el : elements) {
if (el->getMV3D() && !el->getMV3D()->isTransparent()) {el->getMV3D()->render(rs);}
}
if (floorplanRenderer && floorplanRendererModel) {
floorplanRenderer->renderSolid(rs, floorplanRendererModel->getTriaSolid() );
}
// // solid floorplan parts
// if (showFloorplan) {
// std::vector<MapModelElement*> elements = getModel()->getVisibleElements();
// for (MapModelElement* el : elements) {
// if (el->getMV3D() && !el->getMV3D()->isTransparent()) {el->getMV3D()->render(rs);}
// }
// }
// if (showGrid && gridModel) {
// gridRenderer->paintGL(gridModel->getGrid());
// }
@@ -255,14 +320,18 @@ void MapView3D::draw() {
navMeshRenderer->render(rs, navMeshModel->getNavMesh(), this);
}
// transparant floorplan parts
if (showFloorplan) {
// // transparant floorplan parts
// if (showFloorplan) {
std::vector<MapModelElement*> elements = getModel()->getVisibleElements();
for (MapModelElement* el : elements) {
if (el->getMV3D() && el->getMV3D()->isTransparent()) {el->getMV3D()->render(rs);}
}
// std::vector<MapModelElement*> elements = getModel()->getVisibleElements();
// for (MapModelElement* el : elements) {
// if (el->getMV3D() && el->getMV3D()->isTransparent()) {el->getMV3D()->render(rs);}
// }
// }
if (floorplanRenderer && floorplanRendererModel) {
floorplanRenderer->renderTransp(rs, floorplanRendererModel->getTriaTransp() );
}