private static void getIdentity(out BicubicBezierPatchPoint point1, out BicubicBezierPatchPoint point2, out BicubicBezierPatchPoint point3, out BicubicBezierPatchPoint point4) { const float size = 1; var cpX = new Vec3(size * .6666f, 0, 0); var cpY = new Vec3(0, size * .6666f, 0); var pos = new Vec3(-size, -size, 0); var surface = new Vec3(pos.x + cpX.x, pos.y + cpY.y, 0); point1 = new BicubicBezierPatchPoint(pos, pos + cpX, pos + cpY, surface); pos = new Vec3(-size, size, 0); surface = new Vec3(pos.x + cpX.x, pos.y - cpY.y, 0); point2 = new BicubicBezierPatchPoint(pos, pos - cpY, pos + cpX, surface); pos = new Vec3(size, size, 0); surface = new Vec3(pos.x - cpX.x, pos.y - cpY.y, 0); point3 = new BicubicBezierPatchPoint(pos, pos - cpX, pos - cpY, surface); pos = new Vec3(size, -size, 0); surface = new Vec3(pos.x - cpX.x, pos.y + cpY.y, 0); point4 = new BicubicBezierPatchPoint(pos, pos + cpY, pos - cpX, surface); }
public BicubicBezierPatch(BicubicBezierPatchPoint point1, BicubicBezierPatchPoint point2, BicubicBezierPatchPoint point3, BicubicBezierPatchPoint point4, int density, Material material) { this.point1 = point1; this.point2 = point2; this.point3 = point3; this.point4 = point4; this.density = density; this.material = material; // create mesh int vertexCount = density * density; int indexCount = ((density - 1) * (density - 1)) * 6; vertices = new Vec3[vertexCount]; normals = new Vec3[vertexCount]; uvs = new Vec2[vertexCount]; indices = new int[indexCount]; // compute mesh verts float delta = 1.0f / density; for (int y = 0; y != density; ++y) { float v = y / (float)(density - 1); for (int x = 0; x != density; ++x) { float u = x / (float)(density - 1); int i = x + (y * density); vertices[i] = getPoint(u, v, delta, out normals[i]); uvs[i] = new Vec2(u, v); } } // comput indices int indexOffset = 0; for (int y = 0; y != density - 1; ++y) { for (int x = 0; x != density - 1; ++x) { int i = x + (y * density); int ix = i + 1; int iy = i + density; int ixy = iy + 1; indices[indexOffset] = i; indices[indexOffset + 1] = iy; indices[indexOffset + 2] = ixy; indices[indexOffset + 3] = i; indices[indexOffset + 4] = ixy; indices[indexOffset + 5] = ix; indexOffset += 6; } } // set buffers mesh = new Mesh(); mesh.MarkDynamic(); mesh.vertices = vertices.ToVector3(); mesh.uv = uvs.ToVector2(); mesh.normals = normals.ToVector3(); mesh.SetIndices(indices, MeshTopology.Triangles, 0); }