src/ui/canvas.cpp

changeset 129
f35843351601
parent 128
7c834fe36b25
child 157
869fe95c4e5e
--- a/src/ui/canvas.cpp	Sun Sep 12 12:14:32 2021 +0300
+++ b/src/ui/canvas.cpp	Sun Sep 12 13:50:28 2021 +0300
@@ -12,6 +12,11 @@
 	this->setMouseTracking(true);
 }
 
+/**
+ * @brief Handles a change of selection
+ * @param selectedIds IDs of objects to select
+ * @param deselectedIds IDs of objects to deselect.
+ */
 void Canvas::handleSelectionChange(const QSet<ldraw::id_t>& selectedIds, const QSet<ldraw::id_t>& deselectedIds)
 {
 	Q_ASSERT(not selectedIds.contains(ldraw::NULL_ID));
@@ -21,6 +26,10 @@
 	this->update();
 }
 
+/**
+ * @brief Updates vertex rendering
+ * @param document Document to get vertices from
+ */
 void Canvas::rebuildVertices(Document* document)
 {
 	if (this->vertexProgram.has_value())
@@ -53,19 +62,6 @@
 		// grid matrix.
 		this->worldPosition = this->gridMatrix * glm::vec4{*this->worldPosition, 1};
 	}
-	/*
-	if (this->worldPosition.has_value())
-	{
-		this->newStatusText("Position: (%1, %2, %3)"_q
-			.arg(toDouble(this->worldPosition->x))
-			.arg(toDouble(this->worldPosition->y))
-			.arg(toDouble(this->worldPosition->z)));
-	}
-	else
-	{
-		this->newStatusText("Position: <none>"_q);
-	}
-	*/
 	Q_EMIT this->mouseMove(this, event);
 	PartRenderer::mouseMoveEvent(event);
 	this->update();
@@ -121,13 +117,7 @@
 	});
 	PartRenderer::initializeGL();
 	// Set up XZ grid matrix
-	this->gridMatrix = glm::mat4{
-		{1, 0, 0, 0},
-		{0, 0, 1, 0},
-		{0, 1, 0, 0},
-		{0, 0, 0, 1}
-	};
-	this->updateGridMatrix();
+	this->setGridMatrix({{1, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 0, 0}, {0, 0, 0, 1}});
 }
 
 void Canvas::paintGL()
@@ -233,6 +223,11 @@
 	}
 }
 
+/**
+ * @brief Draws a polygon to where the specified vector of 3D points would appear on the screen.
+ * @param painter Painter to use to draw with
+ * @param points 3D points to render
+ */
 void Canvas::drawWorldPolygon(QPainter* painter, const std::vector<glm::vec3> &points)
 {
 	QVector<QPointF> points2d;
@@ -244,6 +239,10 @@
 	painter->drawPolygon(QPolygonF{points2d});
 }
 
+/**
+ * @brief Gets the current position of the cursor in the model
+ * @return 3D vector
+ */
 const std::optional<glm::vec3>& Canvas::getWorldPosition() const
 {
 	return this->worldPosition;
@@ -261,24 +260,33 @@
 	const float angle_y = std::abs(glm::dot(vector_y, cameraDirection));
 	if (angle_x < angle_y)
 	{
-		this->gridMatrix = glm::rotate(this->gridMatrix, PI<float> / 2, glm::vec3{1, 0, 0});
+		this->setGridMatrix(glm::rotate(this->gridMatrix, PI<float> / 2, glm::vec3{1, 0, 0}));
 	}
 	else
 	{
-		this->gridMatrix = glm::rotate(this->gridMatrix, PI<float> / 2, glm::vec3{0, 1, 0});
+		this->setGridMatrix(glm::rotate(this->gridMatrix, PI<float> / 2, glm::vec3{0, 1, 0}));
 	}
-	this->updateGridMatrix();
 	this->update();
 }
 
+/**
+ * @brief Paints a circle at where @c worldPoint is located on the screen.
+ * @param painter Painter to use to render
+ * @param worldPoint Point to render
+ */
 void Canvas::drawWorldPoint(QPainter* painter, const glm::vec3& worldPoint) const
 {
 	const QPointF center = this->modelToScreenCoordinates(worldPoint);
 	painter->drawEllipse(geom::inscribe(geom::CircleF{center, 5}));
 }
 
-void Canvas::updateGridMatrix()
+/**
+ * @brief Changes the grid matrix to the one specified. Updates relevant member variables.
+ * @param newMatrix New matrix to use
+ */
+void Canvas::setGridMatrix(const glm::mat4& newMatrix)
 {
+	this->gridMatrix = newMatrix;
 	const geom::Triangle triangle {
 		this->gridMatrix * glm::vec4{0, 0, 0, 1},
 		this->gridMatrix * glm::vec4{1, 0, 0, 1},
@@ -288,6 +296,10 @@
 	this->gridProgram->setGridMatrix(this->gridMatrix);
 }
 
+/**
+ * @brief Gets the current camera vector, i.e. the vector from the camera to the grid origin.
+ * @return vector
+ */
 glm::vec3 Canvas::cameraVector() const
 {
 	// Find out where the grid is projected on the screen
@@ -297,8 +309,8 @@
 }
 
 /**
- * @brief Calculates if the screen is perpendicular to the current grid
- * @return yes no
+ * @brief Calculates whether the screen is perpendicular to the current grid
+ * @return bool
  */
 bool Canvas::isGridPerpendicularToScreen(float threshold) const
 {
@@ -313,6 +325,9 @@
 	return std::abs(dot) < threshold;
 }
 
+/**
+ * @brief Clears the selection.
+ */
 void Canvas::clearSelection()
 {
 	this->selection.clear();
@@ -321,6 +336,10 @@
 	this->update();
 }
 
+/**
+ * @brief Adds an object to selection.
+ * @param id ID of object to add
+ */
 void Canvas::addToSelection(ldraw::id_t id)
 {
 	this->selection.insert(id);

mercurial