15 this->varRow()->setRange(1, 50);
16 this->varColumns()->setRange(3, 50);
17 this->varRadius()->setRange(0.001f, 10.0f);
18 this->varHeight()->setRange(0.001f, 10.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->varRow()->attach(callback);
32 this->varRadius()->attach(callback);
33 this->varHeight()->attach(callback);
35 auto tsRender = std::make_shared<GLSurfaceVisualModule>();
36 tsRender->setVisible(
true);
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();
62 auto center = this->varLocation()->getValue();
63 auto rot = this->varRotation()->getValue();
64 auto scale = this->varScale()->getValue();
66 auto radius = this->varRadius()->getValue();
67 auto row = this->varRow()->getValue();
68 auto columns = this->varColumns()->getValue();
69 auto height = this->varHeight()->getValue();
70 auto end_segment = this->varEndSegment()->getValue();
73 std::vector<Coord> vertices;
74 std::vector<TopologyModule::Triangle> triangle;
77 Real angle =
M_PI / 180 * 360 / columns;
78 Real temp_angle = angle;
83 for (
int k = row - 1; k >= 0; k--)
85 Real ratio = float(k) / float(row);
86 Real tempy = height * ratio;
87 Real tempRadius = radius * (1 - ratio);
89 for (
int j = 0; j < columns; j++) {
91 temp_angle = j * angle;
93 Location = {
sin(temp_angle) * tempRadius , tempy ,
cos(temp_angle) * tempRadius };
95 vertices.push_back(Location);
99 for (
int i = 1; i < end_segment; i++)
101 Real ratio = float(i) / float(end_segment);
103 Real tempRadius = radius * (1 - ratio);
105 for (
int p = 0; p < columns; p++)
107 temp_angle = p * angle;
109 Coord buttompt = {
sin(temp_angle) * tempRadius , tempy ,
cos(temp_angle) * tempRadius };
111 vertices.push_back(buttompt);
116 vertices.push_back(
Coord(0, height, 0));
117 uint topCenter = vertices.size() - 1;
118 uint buttomCenter = vertices.size();
121 vertices.push_back(
Coord(0, 0, 0));
123 uint realRow = (int(row) - 1 > 0) ?
int(row) - 1 : 0;
124 uint realEndsegment = (int(end_segment) - 1 > 0) ?
int(end_segment) - 1 : 0;
126 uint numOfPolygon = columns * (row + end_segment);
130 uint QuadNum = columns * realRow + columns * realEndsegment;
133 TriangleNum=
uint(columns * 2);
135 TriangleNum =
uint(columns);
140 for (
uint j = 0; j < QuadNum; j++)
146 for (
uint j = 0; j < TriangleNum; j++)
152 polygonIndices.resize(counter);
161 for (
uint i = 0; i < columns; i++)
163 for (
uint j = 0; j < realRow + realEndsegment; j++)
165 auto& index = polygonIndices[incre];
167 uint p1 = i + j * columns;
168 uint p2 = (i + 1) % columns + j * columns;
169 uint p3 = (i + 1) % columns + j * columns + columns;
170 uint p4 = i + j * columns + columns;
182 uint sidePtNum = incre;
187 for (
uint i = 0; i < columns; i++)
189 auto& index = polygonIndices[incre];
190 uint p1 = sidePtNum + i;
191 uint p2 = sidePtNum + (i + 1) % columns;
192 uint p3 = buttomCenter;
203 for (
uint i = 0; i < columns; i++)
205 auto& index = polygonIndices[incre];
207 uint p2 = (i + 1) % columns;
222 return center + q.
rotate(v - center);
225 int numpt = vertices.size();
227 for (
int i = 0; i < numpt; i++)
229 vertices[i][1] -= 1 * height / 2;
230 vertices[i] = RV(vertices[i] * scale + RV(center));
233 auto polySet = this->statePolygonSet()->getDataPtr();
235 polySet->setPoints(vertices);
236 polySet->setPolygons(polygonIndices);
239 auto& ts = this->stateTriangleSet()->getData();
240 polySet->turnIntoTriangleSet(ts);
242 auto triangleSet = this->stateTriangleSet()->getDataPtr();
245 polygonIndices.clear();
255 this->outCone()->setValue(cone);