16 this->varLength()->setRange(0.01, 100.0f);
17 this->varSegments()->setRange(1, 100);
27 this->varLocation()->attach(callback);
28 this->varScale()->attach(callback);
29 this->varRotation()->attach(callback);
31 this->varSegments()->attach(callback);
32 this->varLength()->attach(callback);
34 auto tsRender = std::make_shared<GLSurfaceVisualModule>();
35 tsRender->setVisible(
true);
36 this->stateTriangleSet()->connect(tsRender->inTriangleSet());
39 auto exES = std::make_shared<ExtractEdgeSetFromPolygonSet<TDataType>>();
40 this->statePolygonSet()->connect(exES->inPolygonSet());
43 auto esRender = std::make_shared<GLWireframeVisualModule>();
44 esRender->varBaseColor()->setValue(
Color(0, 0, 0));
45 exES->outEdgeSet()->connect(esRender->inEdgeSet());
49 this->stateTriangleSet()->promoteOuput();
50 this->stateQuadSet()->promoteOuput();
51 this->statePolygonSet()->promoteOuput();
92 auto center = this->varLocation()->getValue();
93 auto rot = this->varRotation()->getValue();
94 auto scale = this->varScale()->getValue();
96 auto length = this->varLength()->getValue();
99 length[0] *= scale[0];
100 length[1] *= scale[1];
101 length[2] *= scale[2];
112 box.
extent = 0.5 * length;
114 this->outCube()->setValue(box);
116 auto segments = this->varSegments()->getValue();
118 uint nyz = 2 * (segments[1] + segments[2]);
120 std::vector<Coord> vertices;
123 Real dx = length[0] / segments[0];
124 Real dy = length[1] / segments[1];
125 Real dz = length[2] / segments[2];
127 std::map<Index2D, uint> indexTop;
128 std::map<Index2D, uint> indexBottom;
132 return center + q.
rotate(v - center);
135 uint numOfPolygon = 2 * (segments[0] * segments[1] + segments[0] * segments[2] + segments[1] * segments[2]);
141 for (
uint j = 0; j < numOfPolygon; j++)
148 polygonIndices.resize(counter2);
157 for (
int nx = 0; nx < segments[0] + 1; nx++)
159 x = center[0] - length[0] / 2 + nx * dx;
161 z = center[2] - length[2] / 2;
162 for (
int ny = 0; ny < segments[1]; ny++)
165 indexBottom[
Index2D(ny, 0)] = vertices.size();
167 if (nx == segments[0])
168 indexTop[
Index2D(ny, 0)] = vertices.size();
170 Real y = center[1] - length[1] / 2 + dy * ny;
171 vertices.push_back(RV(
Coord(x, y, z)));
174 y = center[1] + length[1] / 2;
175 for (
int nz = 0; nz < segments[2]; nz++)
178 indexBottom[
Index2D(segments[1], nz)] = vertices.size();
180 if (nx == segments[0])
181 indexTop[
Index2D(segments[1], nz)] = vertices.size();
183 Real z = center[2] - length[2] / 2 + dz * nz;
184 vertices.push_back(RV(
Coord(x, y, z)));
187 z = center[2] + length[2] / 2;
188 for (
int ny = segments[1]; ny > 0; ny--)
191 indexBottom[
Index2D(ny, segments[2])] = vertices.size();
193 if (nx == segments[0])
194 indexTop[
Index2D(ny, segments[2])] = vertices.size();
196 Real y = center[1] - length[1] / 2 + dy * ny;
197 vertices.push_back(RV(
Coord(x, y, z)));
200 y = center[1] - length[1] / 2;
201 for (
int nz = segments[2]; nz > 0; nz--)
204 indexBottom[
Index2D(0, nz)] = vertices.size();
206 if (nx == segments[0])
207 indexTop[
Index2D(0, nz)] = vertices.size();
209 Real z = center[2] - length[2] / 2 + dz * nz;
210 vertices.push_back(RV(
Coord(x, y, z)));
213 if (nx < segments[0])
215 for (
int t = 0; t < nyz - 1; t++)
218 v1 = counter + t + 1;
219 v2 = counter + t + nyz + 1;
220 v3 = counter + t + nyz;
222 auto& quads = polygonIndices[incre];
232 v0 = counter + nyz - 1;
235 v3 = counter + 2 * nyz - 1;
237 auto& quads = polygonIndices[incre];
252 x = center[0] + length[0] / 2;
253 for (
int ny = 1; ny < segments[1]; ny++)
255 for (
int nz = 1; nz < segments[2]; nz++)
257 indexTop[
Index2D(ny, nz)] = vertices.size();
259 y = center[1] - length[1] / 2 + ny * dy;
260 z = center[2] - length[2] / 2 + nz * dz;
261 vertices.push_back(RV(
Coord(x, y, z)));
265 for (
int ny = 0; ny < segments[1]; ny++)
267 for (
int nz = 0; nz < segments[2]; nz++)
269 v0 = indexTop[
Index2D(ny, nz)];
270 v1 = indexTop[
Index2D(ny + 1, nz)];
271 v2 = indexTop[
Index2D(ny + 1, nz + 1)];
272 v3 = indexTop[
Index2D(ny, nz + 1)];
274 auto& quads = polygonIndices[incre];
288 x = center[0] - length[0] / 2;
289 for (
int ny = 1; ny < segments[1]; ny++)
291 for (
int nz = 1; nz < segments[2]; nz++)
293 indexBottom[
Index2D(ny, nz)] = vertices.size();
295 y = center[1] - length[1] / 2 + ny * dy;
296 z = center[2] - length[2] / 2 + nz * dz;
297 vertices.push_back(RV(
Coord(x, y, z)));
301 for (
int ny = 0; ny < segments[1]; ny++)
303 for (
int nz = 0; nz < segments[2]; nz++)
305 v0 = indexBottom[
Index2D(ny, nz)];
306 v1 = indexBottom[
Index2D(ny + 1, nz)];
307 v2 = indexBottom[
Index2D(ny + 1, nz + 1)];
308 v3 = indexBottom[
Index2D(ny, nz + 1)];
310 auto& quads = polygonIndices[incre];
323 auto polySet = this->statePolygonSet()->getDataPtr();
325 polySet->setPoints(vertices);
326 polySet->setPolygons(polygonIndices);
329 polygonIndices.clear();
331 auto& ts = this->stateTriangleSet()->getData();
332 polySet->turnIntoTriangleSet(ts);
334 auto& qs = this->stateQuadSet()->getData();
335 polySet->extractQuadSet(qs);