src/linetypes/object.h

Wed, 09 Mar 2022 13:01:50 +0200

author
Teemu Piippo <teemu@hecknology.net>
date
Wed, 09 Mar 2022 13:01:50 +0200
changeset 173
8a3047468994
parent 158
5bd755eaa5a8
child 177
f69d53c053df
permissions
-rw-r--r--

Fix performance issues in Model::find

3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
1 #pragma once
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
2 #include <QPointF>
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
3 #include <QString>
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
4 #include <QStringView>
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
5 #include "main.h"
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
6 #include "colors.h"
21
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
7 #include "gl/common.h"
89
7abaf1d64719 object editing
Teemu Piippo <teemu@hecknology.net>
parents: 87
diff changeset
8 #include "linetypes/propertygenerics.h"
7abaf1d64719 object editing
Teemu Piippo <teemu@hecknology.net>
parents: 87
diff changeset
9
7abaf1d64719 object editing
Teemu Piippo <teemu@hecknology.net>
parents: 87
diff changeset
10 class Model;
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
11
35
98906a94732f renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents: 33
diff changeset
12 namespace ldraw
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
13 {
21
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
14 struct GetPolygonsContext;
13
6e838748867b renamings
Teemu Piippo <teemu@hecknology.net>
parents: 8
diff changeset
15 class Object;
6e838748867b renamings
Teemu Piippo <teemu@hecknology.net>
parents: 8
diff changeset
16 class ColoredObject;
8
44679e468ba9 major update with many things
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
17 class Empty;
77
028798a72591 added some meta stuff, simplified quadrilateral splitting and tested it
Teemu Piippo <teemu@hecknology.net>
parents: 73
diff changeset
18 class UnhandledProperty;
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
19 }
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
20
21
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
21 class DocumentManager;
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
22
35
98906a94732f renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents: 33
diff changeset
23 struct ldraw::GetPolygonsContext
21
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
24 {
148
e1ced2523cad reworking
Teemu Piippo <teemu@hecknology.net>
parents: 141
diff changeset
25 ::ModelId modelId;
21
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
26 ::DocumentManager* documents;
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
27 };
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
28
35
98906a94732f renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents: 33
diff changeset
29 class ldraw::Object
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
30 {
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
31 public:
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
32 enum class SetPropertyResult
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
33 {
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
34 Success = 0,
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
35 PropertyNotHandled
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
36 };
132
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
37 /**
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
38 * @brief Enumerates different object types
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
39 */
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
40 enum class Type
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
41 {
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
42 Empty,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
43 Comment,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
44 MetaCommand,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
45 ErrorLine,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
46 SubfileReference,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
47 EdgeLine,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
48 ConditionalEdge,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
49 Triangle,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
50 Quadrilateral,
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
51 };
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
52 friend bool handled(SetPropertyResult result)
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
53 {
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
54 return result == SetPropertyResult::Success;
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
55 }
81
62373840e33a object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
56 class BadPointIndex : public std::exception
62373840e33a object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
57 {
62373840e33a object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
58 };
13
6e838748867b renamings
Teemu Piippo <teemu@hecknology.net>
parents: 8
diff changeset
59 Object();
6e838748867b renamings
Teemu Piippo <teemu@hecknology.net>
parents: 8
diff changeset
60 Object(const Object&) = delete;
6e838748867b renamings
Teemu Piippo <teemu@hecknology.net>
parents: 8
diff changeset
61 virtual ~Object();
73
97df974b5ed5 ldraw::Id is now templated for extra type safety
Teemu Piippo <teemu@hecknology.net>
parents: 35
diff changeset
62 const id_t id;
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
63 virtual bool hasColor() const;
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
64 virtual QVariant getProperty(Property id) const;
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
65 template<ldraw::Property property>
141
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
66 PropertyType<property> getProperty() const;
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
67 template<ldraw::Property property>
89
7abaf1d64719 object editing
Teemu Piippo <teemu@hecknology.net>
parents: 87
diff changeset
68 SetPropertyResult setProperty(const PropertyType<property>& value);
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
69 SetPropertyResult setProperty(const PropertyKeyValue& pair);
6
73e448b2943d language support
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
70 virtual QString textRepresentation() const = 0;
73e448b2943d language support
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
71 virtual QBrush textRepresentationForeground() const;
73e448b2943d language support
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
72 virtual QBrush textRepresentationBackground() const;
73e448b2943d language support
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
73 virtual QFont textRepresentationFont() const;
21
Teemu Piippo <teemu@hecknology.net>
parents: 17
diff changeset
74 virtual void getPolygons(std::vector<gl::Polygon>& polygons, GetPolygonsContext* context) const;
26
3a9e761e4faa at least VAOs work now
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
75 virtual void invert() {}
81
62373840e33a object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
76 virtual int numPoints() const { return 0; }
62373840e33a object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents: 77
diff changeset
77 virtual const glm::vec3& getPoint(int index) const;
132
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
78 virtual QDataStream& serialize(QDataStream& stream) const;
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
79 virtual QDataStream& deserialize(QDataStream& stream);
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
80 virtual Type typeIdentifier() const = 0;
141
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
81 virtual QString toLDrawCode() const = 0;
158
5bd755eaa5a8 Add icons from ionicons
Teemu Piippo <teemu@hecknology.net>
parents: 150
diff changeset
82 virtual QString iconName() const;
132
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
83
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
84 protected:
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
85 template<Property property, typename Function>
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
86 void handle(SetPropertyResult* result, const PropertyKeyValue& pair, Function function);
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
87 virtual void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair);
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
88 };
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
89
150
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
90 /**
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
91 * @brief Tests whether the object is exactly of the specified type
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
92 * @tparam R Type of LDraw line type object to test for
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
93 * @param object Object to test
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
94 * @returns whether the type of the object specified by @c id is the same type as R. Returns false if it is a subclass.
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
95 */
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
96 template<typename R>
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
97 bool isA(const ldraw::Object* object)
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
98 {
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
99 const std::type_info& a = typeid(*object);
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
100 const std::type_info& b = typeid(R);
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
101 return a == b;
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
102 }
b6cbba6e29a1 extract polygon cache out of Model
Teemu Piippo <teemu@hecknology.net>
parents: 148
diff changeset
103
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
104 template<ldraw::Property property>
89
7abaf1d64719 object editing
Teemu Piippo <teemu@hecknology.net>
parents: 87
diff changeset
105 ldraw::Object::SetPropertyResult ldraw::Object::setProperty(const ldraw::PropertyType<property>& value)
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
106 {
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
107 SetPropertyResult result = SetPropertyResult::PropertyNotHandled;
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
108 this->setProperty(&result, PropertyKeyValue{property, QVariant::fromValue(value)});
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
109 return result;
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
110 }
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
111
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
112 template<ldraw::Property property, typename Function>
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
113 void ldraw::Object::handle(SetPropertyResult* result, const PropertyKeyValue& pair, Function function)
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
114 {
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
115 if (pair.key == property)
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
116 {
89
7abaf1d64719 object editing
Teemu Piippo <teemu@hecknology.net>
parents: 87
diff changeset
117 function(pair.value.value<ldraw::PropertyType<property>>());
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
118 *result = SetPropertyResult::Success;
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
119 }
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
120 }
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
121
141
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
122 template<ldraw::Property property>
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
123 ldraw::PropertyType<property> ldraw::Object::getProperty() const
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
124 {
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
125 return this->getProperty(property).value<ldraw::PropertyType<property>>();
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
126 }
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
127
35
98906a94732f renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents: 33
diff changeset
128 class ldraw::ColoredObject : public Object
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
129 {
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
130 public:
139
72098474d362 Document and refactor colors.cpp and colors.h
Teemu Piippo <teemu@hecknology.net>
parents: 132
diff changeset
131 ColoredObject(const Color colorIndex = ldraw::MAIN_COLOR);
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
132 bool hasColor() const override final;
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
133 QVariant getProperty(Property id) const override;
132
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
134 QDataStream &serialize(QDataStream& stream) const override;
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
135 QDataStream& deserialize(QDataStream& stream) override;
139
72098474d362 Document and refactor colors.cpp and colors.h
Teemu Piippo <teemu@hecknology.net>
parents: 132
diff changeset
136 Color colorIndex = ldraw::MAIN_COLOR;
86
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
137 protected:
4bec0525ef1b PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents: 81
diff changeset
138 void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) override;
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
139 };
6
73e448b2943d language support
Teemu Piippo <teemu@hecknology.net>
parents: 3
diff changeset
140
13
6e838748867b renamings
Teemu Piippo <teemu@hecknology.net>
parents: 8
diff changeset
141 /**
6e838748867b renamings
Teemu Piippo <teemu@hecknology.net>
parents: 8
diff changeset
142 * @brief Represents an empty line.
6e838748867b renamings
Teemu Piippo <teemu@hecknology.net>
parents: 8
diff changeset
143 */
35
98906a94732f renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents: 33
diff changeset
144 class ldraw::Empty : public Object
8
44679e468ba9 major update with many things
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
145 {
44679e468ba9 major update with many things
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
146 QString textRepresentation() const override;
132
488d0ba6070b Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents: 89
diff changeset
147 Type typeIdentifier() const override;
141
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 139
diff changeset
148 QString toLDrawCode() const override;
8
44679e468ba9 major update with many things
Teemu Piippo <teemu@hecknology.net>
parents: 6
diff changeset
149 };

mercurial