diff -r fad4a5dd8dee -r 5c0005f63319 src/gl/partrenderer.cpp --- a/src/gl/partrenderer.cpp Wed Feb 26 22:26:05 2020 +0200 +++ b/src/gl/partrenderer.cpp Thu Feb 27 11:56:41 2020 +0200 @@ -71,6 +71,7 @@ void PartRenderer::resizeGL(int width, int height) { + this->viewportVector = {0, 0, width, height}; glViewport(0, 0, width, height); this->projectionMatrix = glm::perspective( glm::radians(45.0f), @@ -96,25 +97,11 @@ throw std::runtime_error{"Bad vbo class passed to getGlTypeForVboClass"}; } -#include void PartRenderer::paintGL() { glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); this->renderScene(); - QPainter painter{this}; - painter.setPen(Qt::white); - painter.setBrush(Qt::red); - for (float x : {1, -1}) - { - for (float y : {1, -1}) - { - for (float z : {1, -1}) - { - painter.drawEllipse(this->modelToScreenCoordinates({x, y, z}), 10, 10); - } - } - } } void PartRenderer::renderScene() @@ -301,12 +288,8 @@ std::optional PartRenderer::screenToModelCoordinates(const QPoint& point) { - glm::vec3 pp = {point.x(), this->height() - point.y(), 1}; - glm::mat4 matrix; - matrix = this->projectionMatrix * this->viewMatrix * glm::mat4_cast(this->modelQuaternion); - matrix = glm::transpose(glm::inverse(matrix)); - auto p1 = matrix * glm::vec4{pp.x, pp.y, 0, 1}; - auto p2 = matrix * glm::vec4{pp.x, pp.y, 1, 1}; + auto p1 = this->unproject({point.x(), point.y(), 0}); + auto p2 = this->unproject({point.x(), point.y(), 1}); geom::Line line = geom::lineFromPoints(p1, p2); return geom::linePlaneIntersection(line, geom::XY); } @@ -321,6 +304,15 @@ return toQPointF(pp); } +glm::vec3 PartRenderer::unproject(const glm::vec3& win) +{ + return glm::unProject( + glm::vec3{win.x, this->height() - win.y, win.z}, + this->viewMatrix * glm::mat4_cast(this->modelQuaternion), + this->projectionMatrix, + viewportVector); +} + ldraw::Id PartRenderer::pick(const QPoint& where) { const gl::RenderStyle oldRenderStyle = this->renderPreferences.style;