| 43 this->worldPosition = glm::round(*this->worldPosition); |
43 this->worldPosition = glm::round(*this->worldPosition); |
| 44 // And finally transform it back to grid coordinates by transforming it with the |
44 // And finally transform it back to grid coordinates by transforming it with the |
| 45 // grid matrix. |
45 // grid matrix. |
| 46 this->worldPosition = this->gridMatrix * glm::vec4{*this->worldPosition, 1}; |
46 this->worldPosition = this->gridMatrix * glm::vec4{*this->worldPosition, 1}; |
| 47 } |
47 } |
| |
48 /* |
| 48 if (this->worldPosition.has_value()) |
49 if (this->worldPosition.has_value()) |
| 49 { |
50 { |
| 50 this->newStatusText("Position: (%1, %2, %3)"_q |
51 this->newStatusText("Position: (%1, %2, %3)"_q |
| 51 .arg(toDouble(this->worldPosition->x)) |
52 .arg(toDouble(this->worldPosition->x)) |
| 52 .arg(toDouble(this->worldPosition->y)) |
53 .arg(toDouble(this->worldPosition->y)) |
| 54 } |
55 } |
| 55 else |
56 else |
| 56 { |
57 { |
| 57 this->newStatusText("Position: <none>"_q); |
58 this->newStatusText("Position: <none>"_q); |
| 58 } |
59 } |
| |
60 */ |
| |
61 // use a relatively high threshold so that we know when the grid is somewhat perpendicular so we can |
| |
62 // automatically change it properly |
| |
63 this->newStatusText("Change: %1"_q.arg(isGridPerpendicularToScreen(0.03f) ? "yes" : "no")); |
| 59 PartRenderer::mouseMoveEvent(event); |
64 PartRenderer::mouseMoveEvent(event); |
| 60 } |
65 } |
| 61 |
66 |
| 62 void Canvas::mousePressEvent(QMouseEvent* event) |
67 void Canvas::mousePressEvent(QMouseEvent* event) |
| 63 { |
68 { |
| 165 this->gridMatrix * glm::vec4{0, 1, 0, 1}, |
170 this->gridMatrix * glm::vec4{0, 1, 0, 1}, |
| 166 }; |
171 }; |
| 167 this->gridPlane = geom::planeFromTriangle(triangle); |
172 this->gridPlane = geom::planeFromTriangle(triangle); |
| 168 this->gridProgram->setGridMatrix(this->gridMatrix); |
173 this->gridProgram->setGridMatrix(this->gridMatrix); |
| 169 } |
174 } |
| |
175 |
| |
176 /** |
| |
177 * @brief Calculates if the screen is perpendicular to the current grid |
| |
178 * @return yes no |
| |
179 */ |
| |
180 bool Canvas::isGridPerpendicularToScreen(float threshold) const |
| |
181 { |
| |
182 // Find out where the grid is projected on the screen |
| |
183 const QPoint gridOrigin2d = pointFToPoint(this->modelToScreenCoordinates(this->gridPlane.anchor)); |
| |
184 // Find out which direction the camera is looking at the grid origin in 3d |
| |
185 const glm::vec3 cameraDirection = glm::normalize(this->cameraLine(gridOrigin2d).direction); |
| |
186 // Compute the dot product. The parameters given are: |
| |
187 // - the normal of the grid plane, which is the vector from the grid origin perpendicular to the grid |
| |
188 // - the direction of the camera looking at the grid, which is the inverse of the vector from the grid |
| |
189 // origin towards the camera |
| |
190 // If the dot product between these two vectors is 0, the grid normal is perpendicular to the camera vector |
| |
191 // and the grid is perpendicular to the screen. |
| |
192 const float dot = glm::dot(glm::normalize(this->gridPlane.normal), glm::normalize(cameraDirection)); |
| |
193 return std::abs(dot) < threshold; |
| |
194 } |