PeriDyno 1.0.0
Loading...
Searching...
No Matches
Transform.cu
Go to the documentation of this file.
1#include "Transform.h"
2
3#include "GLSurfaceVisualModule.h"
4#include "GLWireframeVisualModule.h"
5
6
7
8namespace dyno
9{
10 template<typename TDataType>
11 TransformModel<TDataType>::TransformModel()
12 : ParametricModel<TDataType>()
13 {
14 this->stateTriangleSet()->setDataPtr(std::make_shared<TriangleSet<TDataType>>());
15 this->statePointSet()->setDataPtr(std::make_shared<PointSet<TDataType>>());
16 this->stateEdgeSet()->setDataPtr(std::make_shared<EdgeSet<TDataType>>());
17
18 glModule = std::make_shared<GLSurfaceVisualModule>();
19 glModule->setColor(Color(0.8f, 0.52f, 0.25f));
20 glModule->setVisible(true);
21
22 glWireModule = std::make_shared<GLWireframeVisualModule>();
23 glWireModule->varLineWidth()->setValue(1);
24
25 glPointModule = std::make_shared<GLPointVisualModule>();
26 glPointModule->varPointSize()->setValue(0.007);
27
28 this->stateTriangleSet()->connect(glModule->inTriangleSet());
29 this->stateEdgeSet()->connect(glWireModule->inEdgeSet());
30 this->statePointSet()->connect(glPointModule->inPointSet());
31
32 this->graphicsPipeline()->pushModule(glModule);
33 this->graphicsPipeline()->pushModule(glWireModule);
34 this->graphicsPipeline()->pushModule(glPointModule);
35
36 }
37
38 template<typename TDataType>
39 void TransformModel<TDataType>::resetStates()
40 {
41 Transform();
42 }
43
44 template<typename TDataType>
45 void TransformModel<TDataType>::disableRender() {
46 glModule->setVisible(false);
47 };
48
49 template<typename TDataType>
50 void TransformModel<TDataType>::Transform() {
51 auto TriangleSetIn = TypeInfo::cast<TriangleSet<TDataType>>(this->inTopology()->getDataPtr());
52 auto EdgeSetIn = TypeInfo::cast<EdgeSet<TDataType>>(this->inTopology()->getDataPtr());
53 auto PointSetIn = TypeInfo::cast<PointSet<TDataType>>(this->inTopology()->getDataPtr());
54 printf("Cast\n");
55 if (TriangleSetIn != nullptr) { inType = Triangle_; }
56 else if (EdgeSetIn != nullptr) { inType = Edge_; }
57 else if (PointSetIn != nullptr) { inType = Point_; }
58 else { inType = Null_; }
59
60
61 auto center = this->varLocation()->getData();
62 auto rot = this->varRotation()->getData();
63 auto scale = this->varScale()->getData();
64
65 auto triangleSet = this->stateTriangleSet()->getDataPtr();
66 auto pointSet = this->statePointSet()->getDataPtr();
67 auto edgeSet = this->stateEdgeSet()->getDataPtr();
68
69
70 std::vector<TopologyModule::Edge> edge;
71 CArray<TopologyModule::Triangle> c_triangle;
72 CArray<Coord> c_point;
73 CArray<TopologyModule::Edge> c_edge;
74 std::vector<Coord> vertices;
75 std::vector<TopologyModule::Triangle> triangle;
76
77 int numT;
78 int numV;
79 int numE;
80 switch (inType)
81 {
82 case Point_:
83 printf("********* Point ********\n");
84 c_point.assign(PointSetIn->getPoints());
85
86 break;
87
88 case Edge_:
89 printf("********* Edge ********\n");
90 c_point.assign(EdgeSetIn->getPoints());
91 c_edge.assign(EdgeSetIn->getEdges());
92
93 break;
94
95 case Triangle_:
96 printf("********* Triangle ********\n");
97 c_point.assign(TriangleSetIn->getPoints());
98 c_edge.assign(TriangleSetIn->getEdges());
99 c_triangle.assign(TriangleSetIn->getTriangles());
100
101 break;
102
103 case Null_:
104 printf("********* Null ********\n");
105 break;
106
107 }
108
109 if (!c_point.isEmpty())
110 {
111 numV = c_point.size();
112 for (int i = 0; i < numV; i++)
113 {
114 vertices.push_back(c_point[i]);
115 }
116
117 }
118
119 if (!c_edge.isEmpty())
120 {
121 numE = c_edge.size();
122 for (int i = 0; i < numE; i++)
123 {
124 edge.push_back(TopologyModule::Edge(c_edge[i]));
125 }
126 }
127
128 if (!c_triangle.isEmpty())
129 {
130 numT = c_triangle.size();
131 for (int i = 0; i < numT; i++)
132 {
133 triangle.push_back(TopologyModule::Triangle(c_triangle[i]));
134 }
135 }
136
137
138
139
140 //񄯯
141
142 Quat<Real> q = Quat<Real>(M_PI * rot[0] / 180, Coord(1, 0, 0))
143 * Quat<Real>(M_PI * rot[1] / 180, Coord(0, 1, 0))
144 * Quat<Real>(M_PI * rot[2] / 180, Coord(0, 0, 1));
145
146 q.normalize();
147
148 auto RV = [&](const Coord& v)->Coord {
149 return center + q.rotate(v - center);
150 };
151
152 int numpt = vertices.size();
153
154 for (int i = 0; i < numpt; i++)
155 {
156 vertices[i] = RV(vertices[i] * scale + RV(center));
157 }
158
159 if (inType == Triangle_)
160 {
161 triangleSet->setPoints(vertices);
162 triangleSet->setTriangles(triangle);
163 triangleSet->update();
164
165 edgeSet->setPoints(vertices);
166 edgeSet->setEdges(edge);
167 pointSet->setPoints(vertices);
168
169 //glModule->setVisible(true);
170 //glWireModule->setVisible(true);
171 //glPointModule->setVisible(true);
172 }
173 if (inType == Edge_)
174 {
175 edgeSet->setPoints(vertices);
176
177 edgeSet->setEdges(edge);
178 pointSet->setPoints(vertices);
179
180 //glModule->setVisible(false);
181 //glWireModule->setVisible(true);
182 //glPointModule->setVisible(true);
183 triangleSet->setTriangles(triangle);
184
185 }
186 if (inType == Point_)
187 {
188 pointSet->setPoints(vertices);
189
190 //glModule->setVisible(false);
191 //glWireModule->setVisible(false);
192 //glPointModule->setVisible(true);
193 triangleSet->setTriangles(triangle);
194 edgeSet->setEdges(edge);
195 }
196
197 vertices.clear();
198 triangle.clear();
199 c_point.clear();
200 c_edge.clear();
201 c_triangle.clear();
202
203
204 }
205
206
207 DEFINE_CLASS(TransformModel);
208}