src/linetypes/object.h

changeset 87
93ec4d630346
parent 86
4bec0525ef1b
child 89
7abaf1d64719
equal deleted inserted replaced
86:4bec0525ef1b 87:93ec4d630346
12 enum class Property; 12 enum class Property;
13 class Object; 13 class Object;
14 class ColoredObject; 14 class ColoredObject;
15 class Empty; 15 class Empty;
16 class UnhandledProperty; 16 class UnhandledProperty;
17 template<int N>
18 class PolygonObject;
17 } 19 }
18 20
19 class DocumentManager; 21 class DocumentManager;
20 22
21 struct ldraw::GetPolygonsContext 23 struct ldraw::GetPolygonsContext
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 {

mercurial