private static GameObject[] Build(DecalMeshBuilder builder, Decal decal, GameObject[] targets)
        {
            MeshFilter   filter   = decal.meshFilter;
            MeshRenderer renderer = decal.meshRenderer;

            if (decal.Material == null || decal.sprite == null)
            {
                filter.mesh.Clear();
                renderer.material = null;
                return(null);
            }

            var objects = DecalUtils.GetAffectedMeshFilter(decal, targets);

            foreach (var obj in objects)
            {
                Build(builder, decal, obj);
            }
            builder.Push(PlanetMaker.instance.PushDistance);

            if (filter.mesh == null)
            {
                filter.mesh      = new Mesh();
                filter.mesh.name = "Decal";
            }

            builder.ToMesh(filter.sharedMesh);
            renderer.material = decal.Material;

            return(objects.Select(i => i.gameObject).ToArray());
        }
        private static void AddTriangle(DecalMeshBuilder builder, Decal decal, Vector3 v1, Vector3 v2, Vector3 v3)
        {
            Rect    uvRect = To01(decal.sprite.textureRect, decal.sprite.texture);
            Vector3 normal = Vector3.Cross(v2 - v1, v3 - v1).normalized;

            if (Vector3.Angle(Vector3.forward, -normal) <= decal.MaxAngle)
            {
                var poly = PolygonClippingUtils.Clip(v1, v2, v3);
                if (poly.Length > 0)
                {
                    builder.AddPolygon(poly, normal, uvRect);
                }
            }
        }
        private static void Build(DecalMeshBuilder builder, Decal decal, MeshFilter pobject)
        {
            Matrix4x4 objToDecalMatrix = decal.transform.worldToLocalMatrix * pobject.transform.localToWorldMatrix;

            Mesh mesh = pobject.sharedMesh;

            Vector3[] vertices  = mesh.vertices;
            int[]     triangles = mesh.triangles;

            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 = objToDecalMatrix.MultiplyPoint(vertices[i1]);
                Vector3 v2 = objToDecalMatrix.MultiplyPoint(vertices[i2]);
                Vector3 v3 = objToDecalMatrix.MultiplyPoint(vertices[i3]);

                AddTriangle(builder, decal, v1, v2, v3);
            }
        }