Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
    }