Пример #1
0
    public static void BuildDecalForObject(CausticDecal decal, GameObject affectedObject)
    {
        Mesh affectedMesh = affectedObject.GetComponent <MeshFilter>().sharedMesh;

        if (affectedMesh == null)
        {
            return;
        }

        float maxAngle = decal.maxAngle;

        Plane right = new Plane(Vector3.right, Vector3.right / 2f);
        Plane left  = new Plane(-Vector3.right, -Vector3.right / 2f);

        Plane top    = new Plane(Vector3.up, Vector3.up / 2f);
        Plane bottom = new Plane(-Vector3.up, -Vector3.up / 2f);

        Plane front = new Plane(Vector3.forward, Vector3.forward / 2f);
        Plane back  = new Plane(-Vector3.forward, -Vector3.forward / 2f);

        Vector3[] vertices         = affectedMesh.vertices;
        int[]     triangles        = affectedMesh.triangles;
        int       startVertexCount = bufVertices.Count;

        Matrix4x4 matrix = decal.transform.worldToLocalMatrix * affectedObject.transform.localToWorldMatrix;

        for (int i = 0; i < triangles.Length; i += 3)
        {
            int i1 = triangles[i];
            int i2 = triangles[i + 1];
            int i3 = triangles[i + 2];

            Vector3 v1 = matrix.MultiplyPoint(vertices[i1]);
            Vector3 v2 = matrix.MultiplyPoint(vertices[i2]);
            Vector3 v3 = matrix.MultiplyPoint(vertices[i3]);

            Vector3 side1  = v2 - v1;
            Vector3 side2  = v3 - v1;
            Vector3 normal = Vector3.Cross(side1, side2).normalized;

            if (Vector3.Angle(-Vector3.forward, normal) >= maxAngle)
            {
                continue;
            }


            CausticDecalPolygon poly = new CausticDecalPolygon(v1, v2, v3);

            poly = CausticDecalPolygon.ClipPolygon(poly, right);
            if (poly == null)
            {
                continue;
            }
            poly = CausticDecalPolygon.ClipPolygon(poly, left);
            if (poly == null)
            {
                continue;
            }

            poly = CausticDecalPolygon.ClipPolygon(poly, top);
            if (poly == null)
            {
                continue;
            }
            poly = CausticDecalPolygon.ClipPolygon(poly, bottom);
            if (poly == null)
            {
                continue;
            }

            poly = CausticDecalPolygon.ClipPolygon(poly, front);
            if (poly == null)
            {
                continue;
            }
            poly = CausticDecalPolygon.ClipPolygon(poly, back);
            if (poly == null)
            {
                continue;
            }

            AddPolygon(poly, normal);
        }

        GenerateTexCoords(startVertexCount);
    }