| |
1 #pragma once |
| |
2 #include "object.h" |
| |
3 #include "widgets/vec3editor.h" |
| |
4 #include "model.h" |
| |
5 #include "modeleditcontext.h" |
| |
6 |
| |
7 namespace ldraw |
| |
8 { |
| |
9 template<int N, typename> |
| |
10 class PolygonObject; |
| |
11 } |
| |
12 |
| |
13 template<int N, typename = std::enable_if_t<(N > 0 and N <= 4)>> |
| |
14 class ldraw::PolygonObject : public ColoredObject |
| |
15 { |
| |
16 public: |
| |
17 using BaseClass = ColoredObject; |
| |
18 PolygonObject(const std::array<glm::vec3, N>& points, const Color color) : |
| |
19 ColoredObject{color}, |
| |
20 points{points} {} |
| |
21 int numPoints() const override |
| |
22 { |
| |
23 return N; |
| |
24 } |
| |
25 const glm::vec3& getPoint(int index) const override |
| |
26 { |
| |
27 Q_ASSERT(index >= 0 and index < N); |
| |
28 return this->points[index]; |
| |
29 } |
| |
30 QVariant getProperty(const Property id) const override |
| |
31 { |
| |
32 switch (id) |
| |
33 { |
| |
34 case Property::Point0: |
| |
35 return QVariant::fromValue(points[0]); |
| |
36 case Property::Point1: |
| |
37 return QVariant::fromValue(points[1]); |
| |
38 case Property::Point2: |
| |
39 if (N >= 3) |
| |
40 { |
| |
41 return QVariant::fromValue(points[2]); |
| |
42 } |
| |
43 break; |
| |
44 case Property::Point3: |
| |
45 if (N >= 4) |
| |
46 { |
| |
47 return QVariant::fromValue(points[3]); |
| |
48 } |
| |
49 break; |
| |
50 default: |
| |
51 break; |
| |
52 } |
| |
53 return BaseClass::getProperty(id); |
| |
54 } |
| |
55 void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) |
| |
56 { |
| |
57 LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point0, {points[0] = value;}) |
| |
58 LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point1, {points[1] = value;}) |
| |
59 if constexpr (N >= 3) |
| |
60 { |
| |
61 LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point2, {points[2] = value;}) |
| |
62 } |
| |
63 if constexpr (N >= 4) |
| |
64 { |
| |
65 LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point3, {points[3] = value;}) |
| |
66 } |
| |
67 ColoredObject::setProperty(result, pair); |
| |
68 } |
| |
69 std::array<glm::vec3, N> points; |
| |
70 }; |