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();