Example #1
0
 /*
  * 设置贴花类型
  */
 void SetDecalType(CLIPSHAPE_TYPE type)
 {
     getDecal().shapeType = type;
     getDecal().UpdateSelf();
 }
Example #2
0
    public static void BuildDecalForObject(Decal decal, CLIPSHAPE_TYPE eShapeType, float fAngle, GameObject affectedObject)
    {
        Mesh         affectedMesh = null;
        MeshCollider mc           = affectedObject.GetComponent <MeshCollider>();

        if (mc != null)
        {
            affectedMesh = mc.sharedMesh;
        }
        else
        {
            MeshFilter mf = affectedObject.GetComponent <MeshFilter>();
            if (mf != null)
            {
                affectedMesh = mf.sharedMesh;
            }
        }


        if (affectedMesh == null || affectedMesh.isReadable == false)
        {
            return;
        }

        float maxSlopeAngle = decal.maxSlopeAngle;

        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.up, normal) >= maxSlopeAngle)
            {
                continue;
            }

            if (eShapeType == CLIPSHAPE_TYPE.CST_SQUARE)
            {
                DecalPolygon poly = ClipPolygonBySquare(v1, v2, v3);
                if (poly != null)
                {
                    AddPolygon(poly, normal);
                }
            }
            else if (eShapeType == CLIPSHAPE_TYPE.CST_SECTOR)
            {
                if (fAngle <= 0f && fAngle >= 360f)
                {
                    LogMgr.UnityError("Sector angle beyond Range! Must limit it greater than 0 degree and less than 360 degree.");
                    continue;
                }

                if (fAngle <= 180f)
                {
                    DecalPolygon poly = ClipPolygonByConvexSector(fAngle, v1, v2, v3);
                    if (poly != null)
                    {
                        AddPolygon(poly, normal);
                    }
                }
                else
                {
                    DecalPolygon poly = ClipPolygonByNonConvexSector(fAngle, v1, v2, v3, false);
                    if (poly != null)
                    {
                        AddPolygon(poly, normal);
                    }

                    DecalPolygon polySec = ClipPolygonByNonConvexSector(fAngle, v1, v2, v3, true);
                    if (polySec != null)
                    {
                        AddPolygon(polySec, normal);
                    }
                }
            }
        }

        //GenerateTexCoords(startVertexCount, decal.sprite);
        GenerateTexCoords(startVertexCount, decal);
    }