diff -r 4bec0525ef1b -r 93ec4d630346 src/linetypes/object.h --- a/src/linetypes/object.h Thu Mar 19 21:06:06 2020 +0200 +++ b/src/linetypes/object.h Wed Mar 25 16:07:20 2020 +0200 @@ -14,6 +14,8 @@ class ColoredObject; class Empty; class UnhandledProperty; + template + class PolygonObject; } class DocumentManager; @@ -34,8 +36,6 @@ Point1, // Second vertex in a polygon or edge line Point2, // Third vertex in a polygon Point3, // Fourth vertex in a quadrilateral - ControlPoint0, // First control point in a conditional edge line - ControlPoint1, // Second control point in a conditional edge line Transformation, // 4x4 transformation matrix of a subfile reference ReferenceName, // Subfile reference name IsInverted, // Whether or not the object has been inverted with BFC INVERTNEXT @@ -77,8 +77,6 @@ LDFORGE_DEFINE_PROPERTY_TYPE(Point1, glm::vec3) LDFORGE_DEFINE_PROPERTY_TYPE(Point2, glm::vec3) LDFORGE_DEFINE_PROPERTY_TYPE(Point3, glm::vec3) -LDFORGE_DEFINE_PROPERTY_TYPE(ControlPoint0, glm::vec3) -LDFORGE_DEFINE_PROPERTY_TYPE(ControlPoint1, glm::vec3) LDFORGE_DEFINE_PROPERTY_TYPE(Transformation, glm::mat4) LDFORGE_DEFINE_PROPERTY_TYPE(ReferenceName, QString) LDFORGE_DEFINE_PROPERTY_TYPE(IsInverted, bool) @@ -155,6 +153,64 @@ void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) override; }; +template +class ldraw::PolygonObject : public ColoredObject +{ +public: + PolygonObject(const std::array& points, const Color color) : + ColoredObject{color}, + points{points} {} + int numPoints() const override + { + return N; + } + const glm::vec3& getPoint(int index) const override + { + Q_ASSERT(index >= 0 and index < N); + return this->points[index]; + } + QVariant getProperty(const Property id) const override + { + switch (id) + { + case Property::Point0: + return QVariant::fromValue(points[0]); + case Property::Point1: + return QVariant::fromValue(points[1]); + case Property::Point2: + if (N >= 3) + { + return QVariant::fromValue(points[2]); + } + break; + case Property::Point3: + if (N >= 4) + { + return QVariant::fromValue(points[3]); + } + break; + default: + break; + } + return ColoredObject::getProperty(id); + } + void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) + { + LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point0, {points[0] = value;}) + LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point1, {points[1] = value;}) + if constexpr (N >= 3) + { + LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point2, {points[2] = value;}) + } + if constexpr (N >= 4) + { + LDRAW_OBJECT_HANDLE_SET_PROPERTY(Point3, {points[2] = value;}) + } + ColoredObject::setProperty(result, pair); + } + std::array 0 and N <= 4), glm::vec3>, N> points; +}; + /** * @brief Represents an empty line. */