| 28 */ |
28 */ |
| 29 enum class ldraw::Property |
29 enum class ldraw::Property |
| 30 { |
30 { |
| 31 Color, // Color of the object |
31 Color, // Color of the object |
| 32 Text, // Text contained in a comment |
32 Text, // Text contained in a comment |
| 33 Point1, // First vertex in a polygon or edge line |
33 Point0, // First vertex in a polygon or edge line |
| 34 Point2, // Second vertex in a polygon or edge line |
34 Point1, // Second vertex in a polygon or edge line |
| 35 Point3, // Third vertex in a polygon |
35 Point2, // Third vertex in a polygon |
| 36 Point4, // Fourth vertex in a quadrilateral |
36 Point3, // Fourth vertex in a quadrilateral |
| 37 ControlPoint1, // First control point in a conditional edge line |
37 ControlPoint0, // First control point in a conditional edge line |
| 38 ControlPoint2, // Second 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 }; |
| 55 { |
55 { |
| 56 }; |
56 }; |
| 57 |
57 |
| 58 template<ldraw::Property property> |
58 template<ldraw::Property property> |
| 59 using PropertyType_t = typename PropertyType<property>::type; |
59 using PropertyType_t = typename PropertyType<property>::type; |
| |
60 |
| |
61 struct PropertyKeyValue |
| |
62 { |
| |
63 Property key; |
| |
64 QVariant value; |
| |
65 }; |
| |
66 |
| |
67 constexpr Property pointProperty(int n) |
| |
68 { |
| |
69 Q_ASSERT(n >= 0 and n < 4); |
| |
70 return static_cast<Property>(static_cast<int>(Property::Point0) + n); |
| |
71 } |
| 60 } |
72 } |
| 61 |
73 |
| 62 LDFORGE_DEFINE_PROPERTY_TYPE(Color, int) |
74 LDFORGE_DEFINE_PROPERTY_TYPE(Color, int) |
| 63 LDFORGE_DEFINE_PROPERTY_TYPE(Text, QString) |
75 LDFORGE_DEFINE_PROPERTY_TYPE(Text, QString) |
| |
76 LDFORGE_DEFINE_PROPERTY_TYPE(Point0, glm::vec3) |
| 64 LDFORGE_DEFINE_PROPERTY_TYPE(Point1, glm::vec3) |
77 LDFORGE_DEFINE_PROPERTY_TYPE(Point1, glm::vec3) |
| 65 LDFORGE_DEFINE_PROPERTY_TYPE(Point2, glm::vec3) |
78 LDFORGE_DEFINE_PROPERTY_TYPE(Point2, glm::vec3) |
| 66 LDFORGE_DEFINE_PROPERTY_TYPE(Point3, glm::vec3) |
79 LDFORGE_DEFINE_PROPERTY_TYPE(Point3, glm::vec3) |
| 67 LDFORGE_DEFINE_PROPERTY_TYPE(Point4, glm::vec3) |
80 LDFORGE_DEFINE_PROPERTY_TYPE(ControlPoint0, glm::vec3) |
| 68 LDFORGE_DEFINE_PROPERTY_TYPE(ControlPoint1, glm::vec3) |
81 LDFORGE_DEFINE_PROPERTY_TYPE(ControlPoint1, glm::vec3) |
| 69 LDFORGE_DEFINE_PROPERTY_TYPE(ControlPoint2, glm::vec3) |
|
| 70 LDFORGE_DEFINE_PROPERTY_TYPE(Transformation, glm::mat4) |
82 LDFORGE_DEFINE_PROPERTY_TYPE(Transformation, glm::mat4) |
| 71 LDFORGE_DEFINE_PROPERTY_TYPE(ReferenceName, QString) |
83 LDFORGE_DEFINE_PROPERTY_TYPE(ReferenceName, QString) |
| 72 LDFORGE_DEFINE_PROPERTY_TYPE(IsInverted, bool) |
84 LDFORGE_DEFINE_PROPERTY_TYPE(IsInverted, bool) |
| 73 LDFORGE_DEFINE_PROPERTY_TYPE(ErrorMessage, QString) |
85 LDFORGE_DEFINE_PROPERTY_TYPE(ErrorMessage, QString) |
| |
86 |
| |
87 #define LDRAW_OBJECT_HANDLE_SET_PROPERTY(PROPERTY, HANDLER) \ |
| |
88 {this->handle<ldraw::Property::PROPERTY>(result, pair, \ |
| |
89 [&](const ldraw::PropertyType_t<ldraw::Property::PROPERTY>& value) HANDLER);} |
| 74 |
90 |
| 75 class ldraw::Object |
91 class ldraw::Object |
| 76 { |
92 { |
| 77 public: |
93 public: |
| 78 enum class SetPropertyResult |
94 enum class SetPropertyResult |
| 79 { |
95 { |
| 80 Success = 0, |
96 Success = 0, |
| 81 PropertyNotHandled, |
97 PropertyNotHandled |
| 82 InvalidValue |
|
| 83 }; |
98 }; |
| |
99 friend bool handled(SetPropertyResult result) |
| |
100 { |
| |
101 return result == SetPropertyResult::Success; |
| |
102 } |
| 84 class BadPointIndex : public std::exception |
103 class BadPointIndex : public std::exception |
| 85 { |
104 { |
| 86 }; |
105 }; |
| 87 Object(); |
106 Object(); |
| 88 Object(const Object&) = delete; |
107 Object(const Object&) = delete; |
| 89 virtual ~Object(); |
108 virtual ~Object(); |
| 90 const id_t id; |
109 const id_t id; |
| 91 //virtual void toString(QTextStream &out) = 0; |
|
| 92 virtual bool hasColor() const; |
110 virtual bool hasColor() const; |
| 93 virtual QVariant getProperty(Property id) const; |
111 virtual QVariant getProperty(Property id) const; |
| 94 virtual SetPropertyResult setProperty(Property id, const QVariant& value); |
112 template<ldraw::Property property> |
| |
113 SetPropertyResult setProperty(const PropertyType_t<property>& value); |
| |
114 SetPropertyResult setProperty(const PropertyKeyValue& pair); |
| 95 virtual QString textRepresentation() const = 0; |
115 virtual QString textRepresentation() const = 0; |
| 96 virtual QBrush textRepresentationForeground() const; |
116 virtual QBrush textRepresentationForeground() const; |
| 97 virtual QBrush textRepresentationBackground() const; |
117 virtual QBrush textRepresentationBackground() const; |
| 98 virtual QFont textRepresentationFont() const; |
118 virtual QFont textRepresentationFont() const; |
| 99 virtual void getPolygons(std::vector<gl::Polygon>& polygons, GetPolygonsContext* context) const; |
119 virtual void getPolygons(std::vector<gl::Polygon>& polygons, GetPolygonsContext* context) const; |
| 100 virtual void invert() {} |
120 virtual void invert() {} |
| 101 virtual int numPoints() const { return 0; } |
121 virtual int numPoints() const { return 0; } |
| 102 virtual const glm::vec3& getPoint(int index) const; |
122 virtual const glm::vec3& getPoint(int index) const; |
| |
123 protected: |
| |
124 template<Property property, typename Function> |
| |
125 void handle(SetPropertyResult* result, const PropertyKeyValue& pair, Function function); |
| |
126 virtual void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair); |
| 103 }; |
127 }; |
| |
128 |
| |
129 template<ldraw::Property property> |
| |
130 ldraw::Object::SetPropertyResult ldraw::Object::setProperty(const PropertyType_t<property>& value) |
| |
131 { |
| |
132 SetPropertyResult result = SetPropertyResult::PropertyNotHandled; |
| |
133 this->setProperty(&result, PropertyKeyValue{property, QVariant::fromValue(value)}); |
| |
134 return result; |
| |
135 } |
| |
136 |
| |
137 template<ldraw::Property property, typename Function> |
| |
138 void ldraw::Object::handle(SetPropertyResult* result, const PropertyKeyValue& pair, Function function) |
| |
139 { |
| |
140 if (pair.key == property) |
| |
141 { |
| |
142 function(pair.value.value<ldraw::PropertyType_t<property>>()); |
| |
143 *result = SetPropertyResult::Success; |
| |
144 } |
| |
145 } |
| 104 |
146 |
| 105 class ldraw::ColoredObject : public Object |
147 class ldraw::ColoredObject : public Object |
| 106 { |
148 { |
| 107 public: |
149 public: |
| 108 ColoredObject(const Color colorIndex = ldraw::mainColor); |
150 ColoredObject(const Color colorIndex = ldraw::mainColor); |
| 109 bool hasColor() const override final; |
151 bool hasColor() const override final; |
| 110 QVariant getProperty(Property id) const override; |
152 QVariant getProperty(Property id) const override; |
| 111 SetPropertyResult setProperty(Property id, const QVariant& value) override; |
|
| 112 Color colorIndex = ldraw::mainColor; |
153 Color colorIndex = ldraw::mainColor; |
| |
154 protected: |
| |
155 void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) override; |
| 113 }; |
156 }; |
| 114 |
157 |
| 115 /** |
158 /** |
| 116 * @brief Represents an empty line. |
159 * @brief Represents an empty line. |
| 117 */ |
160 */ |