private void Subdivide4()
{
// Each triangle is divided into four subtriangles, adding new vertices in the middle of each edge.
int ip = 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);
int i01 = ip++;
int i12 = ip++;
int i20 = ip++;
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);
}
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);
this.TextureCoordinates.Add(u01);
this.TextureCoordinates.Add(u12);
this.TextureCoordinates.Add(u20);
}
// TriangleIndices[i ] = i0;
this.TriangleIndices[i + 1] = i01;
this.TriangleIndices[i + 2] = i20;
this.TriangleIndices.Add(i01);
this.TriangleIndices.Add(i1);
this.TriangleIndices.Add(i12);
this.TriangleIndices.Add(i12);
this.TriangleIndices.Add(i2);
this.TriangleIndices.Add(i20);
this.TriangleIndices.Add(i01);
this.TriangleIndices.Add(i12);
this.TriangleIndices.Add(i20);
}
}