private void BuildDecal(CausticDecal decal)
    {
        MeshFilter filter = decal.GetComponent <MeshFilter>();

        if (filter == null)
        {
            filter = decal.gameObject.AddComponent <MeshFilter>();
        }
        if (decal.GetComponent <Renderer>() == null)
        {
            decal.gameObject.AddComponent <MeshRenderer>();
        }
        affectedObjects = GetAffectedObjects(decal.GetBounds(), decal.affectedLayers);
        foreach (GameObject go in affectedObjects)
        {
            CausticDecalBuilder.BuildDecalForObject(decal, go);
        }
        CausticDecalBuilder.Push(decal.pushDistance);

        Mesh mesh = CausticDecalBuilder.CreateMesh();

        if (mesh != null)
        {
            mesh.name   = "CausticMesh";
            filter.mesh = mesh;
        }
    }
Ejemplo n.º 2
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);
    }
Ejemplo n.º 3
0
    private void BuildDecal(CausticDecal decal)
    {
        MeshFilter filter = decal.GetComponent<MeshFilter>();
        if(filter == null) filter = decal.gameObject.AddComponent<MeshFilter>();
        if(decal.GetComponent<Renderer>() == null) decal.gameObject.AddComponent<MeshRenderer>();
        affectedObjects = GetAffectedObjects(decal.GetBounds(), decal.affectedLayers);
        foreach(GameObject go in affectedObjects) {
            CausticDecalBuilder.BuildDecalForObject( decal, go );
        }
        CausticDecalBuilder.Push( decal.pushDistance );

        Mesh mesh = CausticDecalBuilder.CreateMesh();
        if(mesh != null) {
            mesh.name = "CausticMesh";
            filter.mesh = mesh;
        }
    }
Ejemplo n.º 4
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);
    }