32 Text, // Text contained in a comment |
34 Text, // Text contained in a comment |
33 Point0, // First vertex in a polygon or edge line |
35 Point0, // First vertex in a polygon or edge line |
34 Point1, // Second vertex in a polygon or edge line |
36 Point1, // Second vertex in a polygon or edge line |
35 Point2, // Third vertex in a polygon |
37 Point2, // Third vertex in a polygon |
36 Point3, // Fourth vertex in a quadrilateral |
38 Point3, // Fourth vertex in a quadrilateral |
37 ControlPoint0, // First control point in a conditional edge line |
|
38 ControlPoint1, // Second control point in a conditional edge line |
|
39 Transformation, // 4x4 transformation matrix of a subfile reference |
39 Transformation, // 4x4 transformation matrix of a subfile reference |
40 ReferenceName, // Subfile reference name |
40 ReferenceName, // Subfile reference name |
41 IsInverted, // Whether or not the object has been inverted with BFC INVERTNEXT |
41 IsInverted, // Whether or not the object has been inverted with BFC INVERTNEXT |
42 ErrorMessage // For error lines, why parsing failed |
42 ErrorMessage // For error lines, why parsing failed |
43 }; |
43 }; |
75 LDFORGE_DEFINE_PROPERTY_TYPE(Text, QString) |
75 LDFORGE_DEFINE_PROPERTY_TYPE(Text, QString) |
76 LDFORGE_DEFINE_PROPERTY_TYPE(Point0, glm::vec3) |
76 LDFORGE_DEFINE_PROPERTY_TYPE(Point0, glm::vec3) |
77 LDFORGE_DEFINE_PROPERTY_TYPE(Point1, glm::vec3) |
77 LDFORGE_DEFINE_PROPERTY_TYPE(Point1, glm::vec3) |
78 LDFORGE_DEFINE_PROPERTY_TYPE(Point2, glm::vec3) |
78 LDFORGE_DEFINE_PROPERTY_TYPE(Point2, glm::vec3) |
79 LDFORGE_DEFINE_PROPERTY_TYPE(Point3, glm::vec3) |
79 LDFORGE_DEFINE_PROPERTY_TYPE(Point3, glm::vec3) |
80 LDFORGE_DEFINE_PROPERTY_TYPE(ControlPoint0, glm::vec3) |
|
81 LDFORGE_DEFINE_PROPERTY_TYPE(ControlPoint1, glm::vec3) |
|
82 LDFORGE_DEFINE_PROPERTY_TYPE(Transformation, glm::mat4) |
80 LDFORGE_DEFINE_PROPERTY_TYPE(Transformation, glm::mat4) |
83 LDFORGE_DEFINE_PROPERTY_TYPE(ReferenceName, QString) |
81 LDFORGE_DEFINE_PROPERTY_TYPE(ReferenceName, QString) |
84 LDFORGE_DEFINE_PROPERTY_TYPE(IsInverted, bool) |
82 LDFORGE_DEFINE_PROPERTY_TYPE(IsInverted, bool) |
85 LDFORGE_DEFINE_PROPERTY_TYPE(ErrorMessage, QString) |
83 LDFORGE_DEFINE_PROPERTY_TYPE(ErrorMessage, QString) |
86 |
84 |
153 Color colorIndex = ldraw::mainColor; |
151 Color colorIndex = ldraw::mainColor; |
154 protected: |
152 protected: |
155 void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) override; |
153 void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) override; |
156 }; |
154 }; |
157 |
155 |
|
156 template<int N> |
|
157 class ldraw::PolygonObject : public ColoredObject |
|
158 { |
|
159 public: |
|
160 PolygonObject(const std::array<glm::vec3, N>& points, const Color color) : |
|
161 ColoredObject{color}, |
|
162 points{points} {} |
|
163 int numPoints() const override |
|
164 { |
|
165 return N; |
|
166 } |
|
167 const glm::vec3& getPoint(int index) const override |
|
168 { |
|
169 Q_ASSERT(index >= 0 and index < N); |
|
170 return this->points[index]; |
|
171 } |
|
172 QVariant getProperty(const Property id) const override |
|
173 { |
|
174 switch (id) |
|
175 { |
|
176 case Property::Point0: |
|
177 return QVariant::fromValue(points[0]); |
|
178 case Property::Point1: |
|
179 return QVariant::fromValue(points[1]); |
|
180 case Property::Point2: |
|
181 if (N >= 3) |
|
182 { |
|
183 return QVariant::fromValue(points[2]); |
|
184 } |
|
185 break; |
|
186 case Property::Point3: |
|
187 if (N >= 4) |
|
188 { |
|
189 return QVariant::fromValue(points[3]); |
|
190 } |
|
191 break; |
|
192 default: |
|
193 break; |
|
194 } |
|
195 return ColoredObject::getProperty(id); |
|
196 } |
|
197 void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) |
|
198 { |
|
199 LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point0, {points[0] = value;}) |
|
200 LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point1, {points[1] = value;}) |
|
201 if constexpr (N >= 3) |
|
202 { |
|
203 LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point2, {points[2] = value;}) |
|
204 } |
|
205 if constexpr (N >= 4) |
|
206 { |
|
207 LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point3, {points[2] = value;}) |
|
208 } |
|
209 ColoredObject::setProperty(result, pair); |
|
210 } |
|
211 std::array<std::enable_if_t<(N > 0 and N <= 4), glm::vec3>, N> points; |
|
212 }; |
|
213 |
158 /** |
214 /** |
159 * @brief Represents an empty line. |
215 * @brief Represents an empty line. |
160 */ |
216 */ |
161 class ldraw::Empty : public Object |
217 class ldraw::Empty : public Object |
162 { |
218 { |