Looks like 3ds Max constructs a parallelogram to get interior points.
patch[5] = patch[0] + (patch[1] - patch[0]) + (patch[4] - patch[0]);
patch[5] = patch[1] + patch[4] - patch[0];
And the whole function:
void CreatePatchVertices(Vector3[] s, int tessellation, bool isMirrored)
{
Debug.Assert(s.Length == 16);
for (int i = 0; i <= tessellation; i++)
{
float ti = (float)i / tessellation;
for (int j = 0; j <= tessellation; j++)
{
float tj = (float)j / tessellation;
// Compute automatic interior edges.
s[5] = s[1] + s[4] - s[0];
s[6] = s[2] + s[7] - s[3];
s[9] = s[8] + s[13] - s[12];
s[10] = s[11] + s[14] - s[15];
// Perform four horizontal bezier interpolations
// between the control points of this patch.
Vector3 p1 = Bezier(s[0], s[1], s[2], s[3], ti);
Vector3 p2 = Bezier(s[4], s[5], s[6], s[7], ti);
Vector3 p3 = Bezier(s[8], s[9], s[10], s[11], ti);
Vector3 p4 = Bezier(s[12], s[13], s[14], s[15], ti);
// Perform a vertical interpolation between the results of the
// previous horizontal interpolations, to compute the position.
Vector3 position = Bezier(p1, p2, p3, p4, tj);
// Perform another four bezier interpolations between the control
// points, but this time vertically rather than horizontally.
Vector3 q1 = Bezier(s[0], s[4], s[8], s[12], tj);
Vector3 q2 = Bezier(s[1], s[5], s[9], s[13], tj);
Vector3 q3 = Bezier(s[2], s[6], s[10], s[14], tj);
Vector3 q4 = Bezier(s[3], s[7], s[11], s[15], tj);
// Compute vertical and horizontal tangent vectors.
Vector3 tangentA = BezierTangent(p1, p2, p3, p4, tj);
Vector3 tangentB = BezierTangent(q1, q2, q3, q4, ti);
// Cross the two tangent vectors to compute the normal.
Vector3 normal = Vector3.Cross(tangentA, tangentB);
normal.Normalize();
// Create the vertex.
AddVertex(position, normal);
}
}
}
This is what a teapot primitive with automatic interior points looks like both in 3ds Max and Primitives3D sample: