Mon, 06 Jun 2022 22:01:22 +0300
Giant refactor
55 | 1 | #pragma once |
168
24590af32ad6
Draw tool now renders the winding of the new polygon
Teemu Piippo <teemu@hecknology.net>
parents:
123
diff
changeset
|
2 | #include <QPolygonF> |
55 | 3 | #include "basics.h" |
4 | ||
5 | namespace geom | |
6 | { | |
7 | struct Plane | |
8 | { | |
9 | glm::vec3 normal; | |
10 | glm::vec3 anchor; | |
11 | }; | |
12 | ||
71
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
13 | template<int N, typename T = float, glm::qualifier Q = glm::defaultp> |
55 | 14 | struct Line |
15 | { | |
71
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
16 | glm::vec<N, T, Q> direction; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
17 | glm::vec<N, T, Q> anchor; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
18 | }; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
19 | |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
20 | template<int N, typename T = float, glm::qualifier Q = glm::defaultp> |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
21 | struct Ray |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
22 | { |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
23 | glm::vec<N, T, Q> direction; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
24 | glm::vec<N, T, Q> anchor; |
55 | 25 | }; |
26 | ||
27 | inline const glm::vec3 origin = {0, 0, 0}; | |
28 | inline const Plane XY = {{0, 0, 1}, origin}; | |
29 | inline const Plane XZ = {{0, 1, 0}, origin}; | |
30 | inline const Plane YZ = {{1, 0, 0}, origin}; | |
200 | 31 | |
32 | struct LineSegment | |
33 | { | |
34 | glm::vec3 p1, p2; | |
35 | }; | |
36 | struct Triangle | |
37 | { | |
38 | glm::vec3 p1, p2, p3; | |
39 | }; | |
40 | struct Quadrilateral | |
41 | { | |
42 | glm::vec3 p1, p2, p3, p4; | |
43 | }; | |
44 | struct ConditionalEdge | |
45 | { | |
46 | glm::vec3 p1, p2; | |
47 | glm::vec3 c1, c2; | |
48 | }; | |
49 | struct LineSegment2D | |
50 | { | |
51 | glm::vec2 p1, p2; | |
52 | }; | |
53 | ||
54 | // get polygon type from amount of points | |
55 | template<int N> | |
56 | struct PolygonType {}; | |
57 | template<> | |
58 | struct PolygonType<2> { using type = LineSegment; }; | |
59 | template<> | |
60 | struct PolygonType<3> { using type = Triangle; }; | |
61 | template<> | |
62 | struct PolygonType<4> { using type = Quadrilateral; }; | |
63 | template<int N> | |
64 | using Polygon = typename PolygonType<N>::type; | |
55 | 65 | |
71
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
66 | /** |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
67 | * @brief Computes a line from two points |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
68 | * @param point_1 |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
69 | * @param point_2 |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
70 | * @return line |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
71 | */ |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
72 | template<int N, typename T, glm::qualifier Q> |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
73 | Line<N, T, Q> lineFromPoints(const glm::vec<N, T, Q>& point_1, const glm::vec<N, T, Q>& point_2) |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
74 | { |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
75 | return {point_2 - point_1, point_1}; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
76 | } |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
77 | |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
78 | template<int N, typename T, glm::qualifier Q> |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
79 | Ray<N, T, Q> rayFromPoints(const glm::vec<N, T, Q>& point_1, const glm::vec<N, T, Q>& point_2) |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
80 | { |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
81 | return {point_2 - point_1, point_1}; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
82 | } |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
83 | |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
84 | template<int N, typename T, glm::qualifier Q> |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
85 | Line<N, T, Q> rayToLine(const Ray<N, T, Q>& ray) |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
86 | { |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
87 | return {ray.direction, ray.anchor}; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
88 | } |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
89 | |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
90 | enum class RectangleSide |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
91 | { |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
92 | Top, |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
93 | Left, |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
94 | Bottom, |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
95 | Right |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
96 | }; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
97 | |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
98 | struct PointOnRectagle |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
99 | { |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
100 | glm::vec2 position; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
101 | RectangleSide side; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
102 | }; |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
103 | |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
104 | std::optional<glm::vec2> lineLineIntersection(const Line<2>& line_1, const Line<2>& line_2); |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
105 | std::optional<glm::vec2> rayLineSegmentIntersection(const Ray<2>& ray, const LineSegment2D& line); |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
106 | std::optional<PointOnRectagle> rayRectangleIntersection(const Ray<2>& ray, const QRectF& rectangle); |
55 | 107 | Plane planeFromTriangle(const Triangle& triangle); |
108 | glm::vec3 normalVector(const Triangle& triangle); | |
115 | 109 | std::optional<glm::vec3> linePlaneIntersection( |
110 | const Line<3>& line, | |
111 | const Plane& plane, const float epsilon = 1e-6f); | |
64
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
58
diff
changeset
|
112 | glm::vec3 scalingVector(const glm::mat4 matrix); |
71
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
113 | LineSegment2D top(const QRectF& rectangle); |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
114 | LineSegment2D bottom(const QRectF& rectangle); |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
115 | LineSegment2D left(const QRectF& rectangle); |
198d25fe4e21
show axis directions on the screen
Teemu Piippo <teemu@hecknology.net>
parents:
64
diff
changeset
|
116 | LineSegment2D right(const QRectF& rectangle); |
123 | 117 | bool isConvex(const std::vector<glm::vec3>& polygon); |
168
24590af32ad6
Draw tool now renders the winding of the new polygon
Teemu Piippo <teemu@hecknology.net>
parents:
123
diff
changeset
|
118 | Winding winding(const QPolygonF& polygon); |
64
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
58
diff
changeset
|
119 | struct ScalingExtract |
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
58
diff
changeset
|
120 | { |
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
58
diff
changeset
|
121 | glm::vec3 scaling; |
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
58
diff
changeset
|
122 | glm::mat4 unscaled; |
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
58
diff
changeset
|
123 | }; |
f99d52b1646b
grid snapping now also works with transformed grids
Teemu Piippo <teemu@hecknology.net>
parents:
58
diff
changeset
|
124 | ScalingExtract extractScaling(const glm::mat4& matrix); |
105
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
125 | |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
126 | struct NPolygon |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
127 | { |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
128 | std::vector<glm::vec3> points; |
6ca6e8c647d4
added preview layer code and fixed build warnings
Teemu Piippo <teemu@hecknology.net>
parents:
87
diff
changeset
|
129 | }; |
106 | 130 | |
108 | 131 | inline constexpr bool isclose(const glm::vec3& a, const glm::vec3& b) |
106 | 132 | { |
133 | return qFuzzyCompare(a.x, b.x) | |
134 | and qFuzzyCompare(a.y, b.y) | |
135 | and qFuzzyCompare(a.z, b.z); | |
136 | } | |
108 | 137 | |
138 | struct CircleF | |
139 | { | |
140 | QPointF center; | |
141 | qreal radius; | |
142 | }; | |
143 | ||
144 | /** | |
109
40a1cf2f38f5
replaced preview layers in favor of overpainting callback
Teemu Piippo <teemu@hecknology.net>
parents:
108
diff
changeset
|
145 | * @brief Inscribes a circle |
40a1cf2f38f5
replaced preview layers in favor of overpainting callback
Teemu Piippo <teemu@hecknology.net>
parents:
108
diff
changeset
|
146 | * @param circle |
40a1cf2f38f5
replaced preview layers in favor of overpainting callback
Teemu Piippo <teemu@hecknology.net>
parents:
108
diff
changeset
|
147 | * @return a QRectF that inscribes the specified circle |
108 | 148 | */ |
149 | inline constexpr QRectF inscribe(const CircleF& circle) | |
150 | { | |
151 | return { | |
152 | circle.center.x() - circle.radius, | |
153 | circle.center.y() - circle.radius, | |
154 | circle.radius * 2, | |
155 | circle.radius * 2 | |
156 | }; | |
157 | } | |
187 | 158 | |
159 | struct BezierCurve | |
160 | { | |
161 | glm::vec3 points[4]; | |
162 | const glm::vec3& operator[](int x) const | |
163 | { | |
164 | Q_ASSERT(x >= 0 and x < 4); | |
165 | return this->points[x]; | |
166 | } | |
167 | glm::vec3& operator[](int x) | |
168 | { | |
169 | Q_ASSERT(x >= 0 and x < 4); | |
170 | return this->points[x]; | |
171 | } | |
172 | }; | |
173 | ||
174 | glm::vec3 pointOnCurve(const BezierCurve& curve, float t); | |
175 | glm::vec3 derivativeOnCurve(const BezierCurve& curve, float t); | |
55 | 176 | } |
200 | 177 | using namespace geom; |