16 this->varRadius()->setRange(0.001f, 10.0f);
18 this->varRadius()->setValue(1);
24 auto glModule = std::make_shared<GLSurfaceVisualModule>();
25 glModule->setColor(
Color(0.8f, 0.52f, 0.25f));
26 glModule->setVisible(
true);
27 this->stateTriangleSet()->connect(glModule->inTriangleSet());
31 auto wireframe = std::make_shared<GLWireframeVisualModule>();
32 this->stateTriangleSet()->connect(wireframe->inEdgeSet());
35 this->stateTriangleSet()->promoteOuput();
37 auto pointGlModule = std::make_shared<GLPointVisualModule>();
38 this->stateTriangleSet()->connect(pointGlModule->inPointSet());
40 pointGlModule->varPointSize()->setValue(0.005);
42 this->stateTriangleSet()->promoteOuput();
46 this->varLocation()->attach(callback);
47 this->varScale()->attach(callback);
48 this->varRotation()->attach(callback);
50 this->varRadius()->attach(callback);
51 this->varCurveRamp()->attach(callback);
52 this->varReverseNormal()->attach(callback);
56 this->varDisplayPoints()->attach(displayCallback);
57 this->varDisplaySurface()->attach(displayCallback);
58 this->varDisplayWireframe()->attach(displayCallback);
73 auto center = this->varLocation()->getData();
74 auto rot = this->varRotation()->getData();
75 auto scale = this->varScale()->getData();
77 auto radius = this->varRadius()->getData();
79 if (this->inSpline()->isEmpty())
81 printf(
"inSpline empty \n");
84 if (this->inCurve()->isEmpty())
86 printf(
"inCurve empty \n");
90 auto SplineIn = this->inSpline()->getData().getPoints();
92 auto triangleSet = this->stateTriangleSet()->getDataPtr();
94 auto VertexIn2 = this->inCurve()->getData().getPoints();
96 if (SplineIn.size() == 0) {
return; }
97 if (VertexIn2.size() == 0) {
return; }
99 std::vector<Coord> vertices;
100 std::vector<TopologyModule::Triangle> triangle;
105 c_point1.assign(SplineIn);
107 int lengthV = SplineIn.size();
112 c_point2.assign(VertexIn2);
114 int lengthV2 = VertexIn2.size();
116 unsigned CopyNumber = lengthV;
118 Real PI = 3.1415926535;
122 Coord LocationCurrent;
123 Coord LocationNext = {0,1,0};
124 Coord LocationTemp2 = {0,1,0};
130 for (
size_t i = 0; i < lengthV; i++)
137 if (i == lengthV -
int(1))
143 LocationCurrent = { c_point1[current][0], c_point1[current][1], c_point1[current][2] };
144 LocationNext = { c_point1[next][0], c_point1[next][1], c_point1[next][2] };
147 Vec3f va =LocationNext - LocationCurrent;
151 Vec3f Axis = va.cross(vb);
152 if (Axis ==
Vec3f(0, 0, 0))
171 Coord LocationCurvePoint;
173 for (
size_t k = 0; k < lengthV2; k++ )
175 LocationCurvePoint = { c_point2[k][0], c_point2[k][1], c_point2[k][2] };
176 Offest = c_point1[i];
177 LocationCurvePoint = RV(LocationCurvePoint *
RealScale()) + Offest;
178 vertices.push_back(LocationCurvePoint);
183 unsigned ptnum = vertices.size();
185 for (
int rowl = 0; rowl < lengthV - 1; rowl++)
187 for (
int faceid = 0; faceid < lengthV2; faceid++)
189 if (faceid != lengthV2 - 1)
192 triangle.push_back(
TopologyModule::Triangle(lengthV2 + faceid + rowl * lengthV2, 0 + faceid + rowl * lengthV2, 1 + faceid + rowl * lengthV2));
193 triangle.push_back(
TopologyModule::Triangle(lengthV2 + 1 + faceid + rowl * lengthV2, lengthV2 + faceid + rowl * lengthV2, 1 + faceid + rowl * lengthV2));
197 triangle.push_back(
TopologyModule::Triangle(1 + 2 * faceid + rowl * lengthV2, 0 + faceid + rowl * lengthV2, 0 + rowl * lengthV2));
198 triangle.push_back(
TopologyModule::Triangle(1 + faceid + rowl * lengthV2, 1 + 2 * faceid + rowl * lengthV2, 0 + rowl * lengthV2));
207 std::vector<TopologyModule::Triangle> triangleCap;
209 sab.
polyClip(VertexIn2, triangleCap);
210 int addnum2 = vertices.size() - VertexIn2.size();
214 for (
int i = 0; i < triangleCap.size(); i++)
217 triangle.push_back(
TopologyModule::Triangle(triangleCap[i][0] + addnum2, triangleCap[i][1] + addnum2, triangleCap[i][2] + addnum2));
221 if (this->varReverseNormal()->getData() ==
true)
223 int trinum = triangle.size();
224 for (
int i = 0; i < trinum; i++)
227 temp = triangle[i][0];
228 triangle[i][0] = triangle[i][2];
229 triangle[i][2] = temp;
240 return center + q2.
rotate(v - center);
243 int numpt = vertices.size();
245 for (
int i = 0; i < numpt; i++)
248 vertices[i] =RVt( vertices[i] * scale + RVt( center ));
251 int s = vertices.size();
253 triangleSet->setPoints(vertices);
254 triangleSet->setTriangles(triangle);
256 triangleSet->update();