As seen in the video, This code also works for
Triangular Faces.
private void RunScript(Mesh m, int n, double d, double f, ref object A)
{
m.RebuildNormals();
for(var l = 0; l < n; l++)
{
var meshes = new List<Mesh>();
var mesh = new Mesh();
for(var i = 0; i < m.Faces.Count; i++)
meshes.Add((SubdivideFace(m, i, d, f)));
mesh.Append(meshes);
mesh.RebuildNormals();
m = mesh;
}
m.Weld(Math.PI);
A = m;
}
// <Custom additional code>
readonly MeshFace[] quad =
{
new MeshFace(0, 2, 3, 1),
new MeshFace(2, 4, 5, 3),
new MeshFace(4, 6, 7, 5),
new MeshFace(6, 0, 1, 7),
new MeshFace(1, 3, 5, 7)
};
readonly MeshFace[] tri =
{
new MeshFace(0, 2, 3, 1),
new MeshFace(2, 4, 5, 3),
new MeshFace(4, 0, 1, 5),
new MeshFace(1, 3, 5)
};
Mesh SubdivideFace(Mesh m, int i, double d, double f)
{
var mf = m.Faces[i];
var normal = new Vector3d(m.FaceNormals[i]) * d;
var center = m.Faces.GetFaceCenter(i) + normal;
var pts = new List<Point3d>();
var count = mf.IsQuad ? 4 : 3;
for(var j = 0; j < count; j++)
{
Point3d pt = m.Vertices[mf[j]];
pts.Add(pt);
pts.Add(pt + ((center - pt) * f));
}
var o = new Mesh();
o.Vertices.AddVertices(pts);
o.Faces.AddFaces(mf.IsQuad ? quad : tri);
return o;
}
// </Custom additional code>
MeshFractal.gh (19.1 KB)
Parallelization doesn’t seem to make a significant difference here, because the amount of work must be done on each face is so small.
MeshFractal Parallel.gh (18.6 KB)
P.S The video is recorded in realtime.