private void SubdivideBarycentric()
{
// The BCS of a triangle S divides it into six triangles; each part has one vertex v2 at the
// barycenter of S, another one v1 at the midpoint of some side, and the last one v0 at one
// of the original vertices.
int im = this.Positions.Count;
int ntri = this.TriangleIndices.Count;
for (int i = 0; i < ntri; i += 3)
{
int i0 = this.TriangleIndices[i];
int i1 = this.TriangleIndices[i + 1];
int i2 = this.TriangleIndices[i + 2];
var p0 = this.Positions[i0];
var p1 = this.Positions[i1];
var p2 = this.Positions[i2];
var v01 = p1 - p0;
var v12 = p2 - p1;
var v20 = p0 - p2;
var p01 = p0 + (v01 * 0.5);
var p12 = p1 + (v12 * 0.5);
var p20 = p2 + (v20 * 0.5);
var m = new Point3D((p0.X + p1.X + p2.X) / 3, (p0.Y + p1.Y + p2.Y) / 3, (p0.Z + p1.Z + p2.Z) / 3);
int i01 = im + 1;
int i12 = im + 2;
int i20 = im + 3;
this.Positions.Add(m);
this.Positions.Add(p01);
this.Positions.Add(p12);
this.Positions.Add(p20);
if (this.normals != null)
{
var n = this.Normals[i0];
this.Normals.Add(n);
this.Normals.Add(n);
this.Normals.Add(n);
this.Normals.Add(n);
}
if (this.textureCoordinates != null)
{
var uv0 = this.TextureCoordinates[i0];
var uv1 = this.TextureCoordinates[i0 + 1];
var uv2 = this.TextureCoordinates[i0 + 2];
var t01 = uv1 - uv0;
var t12 = uv2 - uv1;
var t20 = uv0 - uv2;
var u01 = uv0 + (t01 * 0.5);
var u12 = uv1 + (t12 * 0.5);
var u20 = uv2 + (t20 * 0.5);
var uvm = new Point((uv0.X + uv1.X) * 0.5, (uv0.Y + uv1.Y) * 0.5);
this.TextureCoordinates.Add(uvm);
this.TextureCoordinates.Add(u01);
this.TextureCoordinates.Add(u12);
this.TextureCoordinates.Add(u20);
}
// TriangleIndices[i ] = i0;
this.TriangleIndices[i + 1] = i01;
this.TriangleIndices[i + 2] = im;
this.TriangleIndices.Add(i01);
this.TriangleIndices.Add(i1);
this.TriangleIndices.Add(im);
this.TriangleIndices.Add(i1);
this.TriangleIndices.Add(i12);
this.TriangleIndices.Add(im);
this.TriangleIndices.Add(i12);
this.TriangleIndices.Add(i2);
this.TriangleIndices.Add(im);
this.TriangleIndices.Add(i2);
this.TriangleIndices.Add(i20);
this.TriangleIndices.Add(im);
this.TriangleIndices.Add(i20);
this.TriangleIndices.Add(i0);
this.TriangleIndices.Add(im);
im += 4;
}
}