src/gl/partrenderer.cpp

changeset 57
5c0005f63319
parent 56
fad4a5dd8dee
child 58
b7841cd31fb7
--- 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 <QPainter>
 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<glm::vec3> 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;

mercurial