| 58 this->newStatusText("Position: <none>"_q); |
58 this->newStatusText("Position: <none>"_q); |
| 59 } |
59 } |
| 60 */ |
60 */ |
| 61 // use a relatively high threshold so that we know when the grid is somewhat perpendicular so we can |
61 // use a relatively high threshold so that we know when the grid is somewhat perpendicular so we can |
| 62 // automatically change it properly |
62 // automatically change it properly |
| 63 this->newStatusText("Change: %1"_q.arg(isGridPerpendicularToScreen(0.03f) ? "yes" : "no")); |
63 if (isGridPerpendicularToScreen(0.03f)) |
| |
64 { |
| |
65 const glm::vec3 cameraDirection = this->cameraVector(); |
| |
66 const glm::vec3 vector_x = glm::normalize(this->gridMatrix * glm::vec4{1, 0, 0, 1}); |
| |
67 const glm::vec3 vector_y = glm::normalize(this->gridMatrix * glm::vec4{0, 1, 0, 1}); |
| |
68 const float angle_x = std::abs(glm::dot(vector_x, cameraDirection)); |
| |
69 const float angle_y = std::abs(glm::dot(vector_y, cameraDirection)); |
| |
70 if (angle_x < angle_y) |
| |
71 { |
| |
72 this->newStatusText("rotate by X axis"); |
| |
73 this->gridMatrix = glm::rotate(this->gridMatrix, float{M_PI} / 2, glm::vec3{1, 0, 0}); |
| |
74 } |
| |
75 else |
| |
76 { |
| |
77 this->newStatusText("rotate by Y axis"); |
| |
78 this->gridMatrix = glm::rotate(this->gridMatrix, float{M_PI} / 2, glm::vec3{0, 1, 0}); |
| |
79 } |
| |
80 this->updateGridMatrix(); |
| |
81 this->update(); |
| |
82 } |
| |
83 else |
| |
84 { |
| |
85 this->newStatusText("don't rotate"); |
| |
86 } |
| 64 PartRenderer::mouseMoveEvent(event); |
87 PartRenderer::mouseMoveEvent(event); |
| 65 } |
88 } |
| 66 |
89 |
| 67 void Canvas::mousePressEvent(QMouseEvent* event) |
90 void Canvas::mousePressEvent(QMouseEvent* event) |
| 68 { |
91 { |
| 115 const bool isDark = luma(this->renderPreferences.backgroundColor) < 0.25; |
138 const bool isDark = luma(this->renderPreferences.backgroundColor) < 0.25; |
| 116 this->gridProgram->setGridColor(isDark ? Qt::white : Qt::black); |
139 this->gridProgram->setGridColor(isDark ? Qt::white : Qt::black); |
| 117 } |
140 } |
| 118 }); |
141 }); |
| 119 PartRenderer::initializeGL(); |
142 PartRenderer::initializeGL(); |
| |
143 /* |
| 120 this->gridMatrix = glm::mat4{ |
144 this->gridMatrix = glm::mat4{ |
| 121 {-4, 0, 0, 0}, |
145 {-4, 0, 0, 0}, |
| 122 {0, 6.9266, -3.6955, 0}, |
146 {0, 6.9266, -3.6955, 0}, |
| 123 {0, -16.7222, -1.5307, 0}, |
147 {0, -16.7222, -1.5307, 0}, |
| 124 {0, -13.273, -9.255, 1}, |
148 {0, -13.273, -9.255, 1}, |
| 125 }; |
149 }; |
| |
150 */ |
| |
151 this->gridMatrix = glm::mat4{1}; |
| 126 this->updateGridMatrix(); |
152 this->updateGridMatrix(); |
| 127 } |
153 } |
| 128 |
154 |
| 129 void Canvas::paintGL() |
155 void Canvas::paintGL() |
| 130 { |
156 { |
| 171 }; |
197 }; |
| 172 this->gridPlane = geom::planeFromTriangle(triangle); |
198 this->gridPlane = geom::planeFromTriangle(triangle); |
| 173 this->gridProgram->setGridMatrix(this->gridMatrix); |
199 this->gridProgram->setGridMatrix(this->gridMatrix); |
| 174 } |
200 } |
| 175 |
201 |
| |
202 glm::vec3 Canvas::cameraVector() const |
| |
203 { |
| |
204 // Find out where the grid is projected on the screen |
| |
205 const QPoint gridOrigin2d = pointFToPoint(this->modelToScreenCoordinates(this->gridPlane.anchor)); |
| |
206 // Find out which direction the camera is looking at the grid origin in 3d |
| |
207 return glm::normalize(this->cameraLine(gridOrigin2d).direction); |
| |
208 } |
| |
209 |
| 176 /** |
210 /** |
| 177 * @brief Calculates if the screen is perpendicular to the current grid |
211 * @brief Calculates if the screen is perpendicular to the current grid |
| 178 * @return yes no |
212 * @return yes no |
| 179 */ |
213 */ |
| 180 bool Canvas::isGridPerpendicularToScreen(float threshold) const |
214 bool Canvas::isGridPerpendicularToScreen(float threshold) const |
| 181 { |
215 { |
| 182 // Find out where the grid is projected on the screen |
216 const glm::vec3 cameraDirection = this->cameraVector(); |
| 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: |
217 // 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 |
218 // - 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 |
219 // - the direction of the camera looking at the grid, which is the inverse of the vector from the grid |
| 189 // origin towards the camera |
220 // origin towards the camera |
| 190 // If the dot product between these two vectors is 0, the grid normal is perpendicular to the camera vector |
221 // If the dot product between these two vectors is 0, the grid normal is perpendicular to the camera vector |