11 void loopSubdivide(std::vector<Vec3f>& vertices, std::vector<TopologyModule::Triangle>& triangles) {
13 std::vector<TopologyModule::Triangle> newTriangles;
14 std::vector<Vec3f> newVertices;
17 newVertices = vertices;
33 middlePointIndexCache.
reserve(pairs, c_Edge.size());
35 auto getTriOtherPoint = [&](
uint v0,
uint v1,
uint triId) {
36 if (triangles[triId][0] != v0 && triangles[triId][0] != v1)
37 return int(triangles[triId][0]);
38 else if (triangles[triId][1] != v0 && triangles[triId][1] != v1)
39 return int(triangles[triId][1]);
40 else if (triangles[triId][2] != v0 && triangles[triId][2] != v1)
41 return int(triangles[triId][2]);
48 auto getMiddlePoint = [&](
int eId) {
49 uint v0 = c_Edge[eId][0];
50 uint v1 = c_Edge[eId][1];
52 uint tri0 = c_Edg2Tri[eId][0];
53 uint tri1 = c_Edg2Tri[eId][1];
55 int v3 = tri0 != -1 ? getTriOtherPoint(v0, v1, tri0) : -1;
56 int v4 = tri1 != -1 ? getTriOtherPoint(v0, v1, tri1) : -1;
58 Vec3f p0 = vertices[v0];
59 Vec3f p1 = vertices[v1];
61 Vec3f p3 = vertices[v3];
62 Vec3f p4 = vertices[v4];
65 if (v3 != -1 && v4 != -1)
67 newV = 3.0f / 8.0f * (p0 + p1) + 1.0f / 8.0f * (p3 + p4);
70 newV = 1.0f / 2.0f * (p0 + p1);
73 if (middlePointIndexCache.
find(edgeKey) ==
nullptr)
76 newVertices.push_back(newV);
80 for (
size_t i = 0; i < c_Edge.size(); i++)
88 auto updateOldPoints = [&]() {
91 if (edge[0] != vId && edge[1] != vId)
93 printf(
"Error getEdgeOtherPoint!!!!\ninput vId: %d\nedge vId: %d, %d \n", vId, edge[0], edge[1]);
98 int targetV = edge[0] == vId ? edge[1] : edge[0];
106 for (
size_t i = 0; i < c_ver2edge.size(); i++)
109 auto edgeList = c_ver2edge[v0];
112 int n = edgeList.size();
113 Vec3f p0 = vertices[v0];
119 for (
size_t j = 0; j < n; j++)
121 uint edgeId = edgeList[j];
122 int connectionV = getEdgeOtherPoint(v0, c_Edge[edgeId]);
123 if (connectionV != -1)
124 sum += vertices[connectionV];
128 double beta = n == 3 ? (double)3 / (
double)16 : (double)3 / ((
double)8 * (
double)n);
132 newP = (1 - double(n) * beta) * p0 + beta * sum;
136 Vec3f p1 = vertices[getEdgeOtherPoint(v0, c_Edge[edgeList[0]])];
137 Vec3f p2 = vertices[getEdgeOtherPoint(v0, c_Edge[edgeList[1]])];
138 newP = 3 / 4 * p0 + 1.0f / 8.0f * p1 + 1.0f / 8.0f + p2;
140 newVertices[v0] = newP;
147 vertices = newVertices;
149 newTriangles.resize(4 * triangles.size());
150 for (
size_t i = 0; i < triangles.size(); i++)
152 int v01 = middlePointIndexCache.
find(
EKey(triangles[i][0], triangles[i][1])) != middlePointIndexCache.
end() ? (middlePointIndexCache.
find(
EKey(triangles[i][0], triangles[i][1]))->second) : -1;
153 int v12 = middlePointIndexCache.
find(
EKey(triangles[i][0], triangles[i][1])) != middlePointIndexCache.
end() ? (middlePointIndexCache.
find(
EKey(triangles[i][1], triangles[i][2]))->second) : -1;
154 int v20 = middlePointIndexCache.
find(
EKey(triangles[i][0], triangles[i][1])) != middlePointIndexCache.
end() ? (middlePointIndexCache.
find(
EKey(triangles[i][2], triangles[i][0]))->second) : -1;
156 int v0 = triangles[i][0];
157 int v1 = triangles[i][1];
158 int v2 = triangles[i][2];
165 triangles = newTriangles;
175 this->varStep()->setRange(0, 6);
178 this->varStep()->attach(callback);
180 auto tsRender = std::make_shared<GLSurfaceVisualModule>();
181 this->stateTriangleSet()->connect(tsRender->inTriangleSet());
185 auto esRender = std::make_shared<GLWireframeVisualModule>();
186 esRender->varBaseColor()->setValue(
Color(0, 0, 0));
187 this->stateTriangleSet()->connect(esRender->inEdgeSet());
190 this->stateTriangleSet()->promoteOuput();