15 this->varRow()->setRange(1, 500);
16 this->varColumns()->setRange(3, 500);
17 this->varRadius()->setRange(0.001f, 20.0f);
18 this->varHeight()->setRange(0.001f, 20.0f);
19 this->varEndSegment()->setRange(0, 500);
26 this->varLocation()->attach(callback);
27 this->varScale()->attach(callback);
28 this->varRotation()->attach(callback);
30 this->varColumns()->attach(callback);
31 this->varEndSegment()->attach(callback);
32 this->varRow()->attach(callback);
33 this->varRadius()->attach(callback);
34 this->varHeight()->attach(callback);
36 auto tsRender = std::make_shared<GLSurfaceVisualModule>();
37 this->stateTriangleSet()->connect(tsRender->inTriangleSet());
40 auto exES = std::make_shared<ExtractEdgeSetFromPolygonSet<TDataType>>();
41 this->statePolygonSet()->connect(exES->inPolygonSet());
44 auto esRender = std::make_shared<GLWireframeVisualModule>();
45 esRender->varBaseColor()->setValue(
Color(0, 0, 0));
46 exES->outEdgeSet()->connect(esRender->inEdgeSet());
49 this->statePolygonSet()->promoteOuput();
50 this->stateTriangleSet()->promoteOuput();
63 auto center = this->varLocation()->getValue();
64 auto rot = this->varRotation()->getValue();
65 auto scale = this->varScale()->getValue();
67 auto radius = this->varRadius()->getValue();
68 auto row = this->varRow()->getValue();
69 auto columns = this->varColumns()->getValue();
70 auto height = this->varHeight()->getValue();
71 auto end_segment = this->varEndSegment()->getValue();
73 auto triangleSet = this->stateTriangleSet()->getDataPtr();
74 auto polySet = this->statePolygonSet()->getDataPtr();
76 std::vector<Coord> vertices;
77 std::vector<TopologyModule::Triangle> triangle;
79 this->varScale()->setValue(
Coord(scale.x, scale.y, scale.x),
false);
81 scale = this->varScale()->getValue();
85 Real angle =
M_PI / 180 * 360 / columns;
86 Real temp_angle = angle;
89 for (
int k = 0; k <= row; k++)
91 Real tempy = height / row * k;
93 for (
int j = 0; j < columns; j++) {
95 temp_angle = j * angle;
97 Location = {
sin(temp_angle) * radius , tempy ,
cos(temp_angle) * radius };
99 vertices.push_back(Location);
105 int pt_side_len = vertices.size();
107 for (
int i = 1; i < end_segment; i++)
109 float offset = i / (float(end_segment) - i);
111 for (
int p = 0; p < columns; p++)
113 int top_start = pt_side_len - columns + p;
115 Coord toppt = { (vertices[top_start][0] + offset * 0) / (1 + offset), (vertices[top_start][1] + offset * height) / (1 + offset), (vertices[top_start][2] + offset * 0) / (1 + offset) };
117 vertices.push_back(toppt);
122 for (
int i = 1; i < end_segment; i++)
124 float offset = i / (float(end_segment) - i);
126 for (
int p = 0; p < columns; p++)
128 Coord buttompt = { (vertices[p][0] + offset * 0) / (1 + offset), (vertices[p][1] + offset * 0) / (1 + offset), (vertices[p][2] + offset * 0) / (1 + offset) };
130 vertices.push_back(buttompt);
135 vertices.push_back(
Coord(0, 0, 0));
136 uint buttomCenter = vertices.size() - 1;
137 vertices.push_back(
Coord(0, height, 0));
138 uint topCenter = vertices.size() - 1;
141 uint numOfPolygon = columns * row + 2 * columns * end_segment;
145 uint endQuadNum = ((int(end_segment) - 1) * int(columns) < 0 ? 0 : (int(end_segment) - 1) *
int(columns));
147 uint QuadNum = columns * row + 2 * endQuadNum;
148 for (
uint j = 0; j < QuadNum; j++)
154 uint TriangleNum = (int(end_segment) - 1) < 0 ? 0 : columns * 2;
155 for (
uint j = 0; j < TriangleNum; j++)
162 polygonIndices.resize(counter);
167 for (
uint i = 0; i < columns ; i++)
169 for (
uint j = 0; j < row ; j++)
171 auto& index = polygonIndices[incre];
173 uint p1 = i + j * columns;
174 uint p2 = (i + 1) % columns + j * columns;
175 uint p3 = (i + 1) % columns + j * columns + columns;
176 uint p4 = i + j * columns + columns;
191 uint sidePtNum = columns * row;
192 for (
uint i = 0; i < columns; i++)
194 for (
uint j = 0; j < end_segment - 1; j++)
196 auto& index = polygonIndices[incre];
198 uint p1 = i + j * columns + (sidePtNum);
199 uint p2 = (i + 1) % columns + j * columns + (sidePtNum);
200 uint p3 = (i + 1) % columns + j * columns + columns + (sidePtNum);
201 uint p4 = i + j * columns + columns + (sidePtNum);
214 uint sideTopPtNum = incre;
215 for (
uint i = 0; i < columns; i++)
217 for (
uint j = 0; j < end_segment - 1; j++)
219 auto& index = polygonIndices[incre];
221 uint temp = sideTopPtNum;
227 uint p1 = i + j * columns + (temp);
228 uint p2 = (i + 1) % columns + j * columns + (temp);
229 uint p3 = (i + 1) % columns + j * columns + columns + (sideTopPtNum);
230 uint p4 = i + j * columns + columns + (sideTopPtNum);
241 uint buttomPtNum = incre;
244 for (
uint i = 0; i < columns; i++)
246 auto& index = polygonIndices[incre];
247 uint p1 = sideTopPtNum + i;
248 uint p2 = sideTopPtNum + (i + 1) % columns;
259 if (end_segment == 1)
263 for (
uint i = 0; i < columns; i++)
265 auto& index = polygonIndices[incre];
266 uint p1 = buttomPtNum + i;
267 uint p2 = buttomPtNum + (i + 1) % columns;
268 uint p3 = buttomCenter;
287 return center + q.
rotate(v - center);
290 int numpt = vertices.size();
292 for (
int i = 0; i < numpt; i++)
294 vertices[i][1] -= height / 2;
295 vertices[i] = RV(vertices[i] * scale + RV(center));
302 cylinder.
scale = scale;
304 this->outCylinder()->setValue(cylinder);
307 polySet->setPoints(vertices);
308 polySet->setPolygons(polygonIndices);
311 polygonIndices.clear();
313 auto& ts = this->stateTriangleSet()->getData();
314 polySet->turnIntoTriangleSet(ts);