src/linetypes/subfilereference.cpp

changeset 200
ca23936b455b
parent 199
6988973515d2
child 201
5d201ee4a9c3
equal deleted inserted replaced
199:6988973515d2 200:ca23936b455b
1 #include "subfilereference.h"
2 #include "documentmanager.h"
3 #include "invert.h"
4 #include "polygoncache.h"
5
6 ldraw::SubfileReference::SubfileReference
7 (
8 const glm::mat4& transformation,
9 const QString& referenceName,
10 const Color color
11 ) :
12 CompoundObject{transformation, color},
13 referenceName{referenceName}
14 {
15 }
16
17 QVariant ldraw::SubfileReference::getProperty(Property property) const
18 {
19 switch (property)
20 {
21 case Property::ReferenceName:
22 return this->referenceName;
23 default:
24 return CompoundObject::getProperty(property);
25 }
26 }
27
28 void ldraw::SubfileReference::setProperty(SetPropertyResult* result, const PropertyKeyValue& pair)
29 {
30 LDRAW_OBJECT_HANDLE_SET_PROPERTY(ReferenceName, {this->referenceName = value;});
31 ldraw::CompoundObject::setProperty(result, pair);
32 }
33
34 QString ldraw::SubfileReference::textRepresentation() const
35 {
36 return this->referenceName + " " + utility::vertexToStringParens(this->position());
37 }
38
39 void ldraw::SubfileReference::getPolygons
40 (
41 std::vector<gl::Polygon>& polygons,
42 GetPolygonsContext* context
43 ) const
44 {
45 Model* dependency = this->resolve(context->modelId, context->documents);
46 PolygonCache* cache = nullptr;
47 if (dependency != nullptr)
48 {
49 const auto dependencyModelId = context->documents->findIdForModel(dependency);
50 if (dependencyModelId.has_value())
51 {
52 cache = context->documents->getPolygonCacheForModel(dependencyModelId.value());
53 }
54 }
55 if (cache != nullptr)
56 {
57 const bool needInverting = glm::determinant(this->transformation) < 0;
58 const std::vector<gl::Polygon> modelPolygons = getCachedPolygons(
59 cache,
60 dependency,
61 context->documents);
62 polygons.reserve(polygons.size() + modelPolygons.size());
63 for (gl::Polygon polygon : modelPolygons)
64 {
65 for (unsigned int i = 0; i < polygon.numPolygonVertices(); i += 1)
66 {
67 glm::vec4 vertex {polygon.vertices[i], 1};
68 vertex = this->transformation * vertex;
69 polygon.vertices[i] = vertex;
70 }
71 if (needInverting != this->isInverted)
72 {
73 gl::invert(polygon);
74 }
75 if (polygon.color == ldraw::MAIN_COLOR)
76 {
77 polygon.color = this->colorIndex;
78 }
79 polygon.id = this->id;
80 polygons.push_back(polygon);
81 }
82 }
83 }
84
85 Model* ldraw::SubfileReference::resolve(const ModelId callingModelId, DocumentManager* documents) const
86 {
87 return documents->findDependencyByName(callingModelId, this->referenceName);
88 }
89
90 ldraw::Object::Type ldraw::SubfileReference::typeIdentifier() const
91 {
92 return Type::SubfileReference;
93 }
94
95 QDataStream& ldraw::SubfileReference::serialize(QDataStream &stream) const
96 {
97 return CompoundObject::serialize(stream) << this->referenceName;
98 }
99
100 QDataStream& ldraw::SubfileReference::deserialize(QDataStream &stream)
101 {
102 return CompoundObject::deserialize(stream) >> this->referenceName;
103 }
104
105 QString ldraw::SubfileReference::toLDrawCode() const
106 {
107 QString result;
108 if (this->isInverted)
109 {
110 result += "0 BFC INVERTNEXT\r\n";
111 }
112 result += utility::format(
113 "1 %1 %2 %3",
114 this->colorIndex.index,
115 this->transformToBareString(),
116 this->referenceName);
117 return result;
118 }
119
120 QString ldraw::SubfileReference::iconName() const
121 {
122 return ":/icons/linetype-subfile.png";
123 }
124
125 QString ldraw::SubfileReference::typeName() const
126 {
127 return QObject::tr("subfile reference");
128 }

mercurial