void Profiler()
 {
     EditorGUILayout.HelpBox("Advanced Triangulation: " + Slicer2DProfiler.GetAdvancedTriangulation(), MessageType.None);
     EditorGUILayout.HelpBox("Legacy Triangulation: " + Slicer2DProfiler.GetLegacyTriangulation(), MessageType.None);
     EditorGUILayout.HelpBox("Batched Objects: " + Slicer2DProfiler.GetBatchingApplied(), MessageType.None);
     EditorGUILayout.HelpBox("Objects Created: " + Slicer2DProfiler.GetObjectsCreated(), MessageType.None);
     EditorGUILayout.HelpBox("Objects Slices Created With Performance: " + Slicer2DProfiler.GetSlicesCreatedWithPeroformance(), MessageType.None);
     EditorGUILayout.HelpBox("Objects Slices Created With Quality: " + Slicer2DProfiler.GetSlicesCreatedWithQuality(), MessageType.None);
 }
    public static Mesh Triangulate(Polygon2D polygon, Vector2 UVScale, Vector2 UVOffset, Triangulation triangulation)
    {
        polygon.Normalize();

        Mesh result = null;

        switch (triangulation)
        {
        case Triangulation.Advanced:
            Slicer2DProfiler.IncAdvancedTriangulation();

            float GC = Slicer2DSettings.GetGarbageCollector();
            if (GC > 0 & polygon.GetArea() < GC)
            {
                Debug.LogWarning("SmartUtilities2D: Garbage Collector Removed Object Because it was too small");

                return(null);
            }

            Polygon2D newPolygon = new Polygon2D(PreparePolygon.Get(polygon));

            if (newPolygon.pointsList.Count < 3)
            {
                Debug.LogWarning("SmartUtilities2D: Mesh is too small for advanced triangulation, using simplified triangulations instead (size: " + polygon.GetArea() + ")");

                result = PerformTriangulation(polygon, UVScale, UVOffset);

                return(result);
            }

            foreach (Polygon2D hole in polygon.holesList)
            {
                newPolygon.AddHole(new Polygon2D(PreparePolygon.Get(hole, -1)));
            }

            result = PerformTriangulation(newPolygon, UVScale, UVOffset);

            break;

        case Triangulation.Legacy:
            Slicer2DProfiler.IncLegacyTriangulation();

            List <Vector2> list = new List <Vector2>();
            foreach (Vector2D p in polygon.pointsList)
            {
                list.Add(p.ToVector2());
            }
            result = Triangulator.Create(list.ToArray(), UVScale, UVOffset);


            return(result);
        }

        return(result);
    }
    public void CreateMesh(GameObject gameObject, Polygon2D polygon)
    {
        polygon.CreateMesh(gameObject, scale, offset, GetTriangulation());

        if (material)
        {
            MeshRenderer meshRenderer = gameObject.GetComponent <MeshRenderer> ();
            if (Slicer2DSettings.GetBatching(batchMaterial))
            {
                Slicer2DProfiler.IncBatchingApplied();
                meshRenderer.sharedMaterial = material;
            }
            else
            {
                meshRenderer.sharedMaterial = new Material(material);
            }
        }
    }
        public List <GameObject> PerformResult(List <Polygon2D> result, Slice2D slice)
        {
            List <GameObject> resultGameObjects = new List <GameObject> ();

            if (result.Count < 1)
            {
                return(resultGameObjects);
            }

            slice.SetPolygons(result);

            slice.originGameObject = gameObject;

            if (eventHandler.SliceEvent(slice) == false)
            {
                return(resultGameObjects);
            }

            if (Slicer2DEventHandling.GlobalSliceEvent(slice) == false)
            {
                return(resultGameObjects);
            }

            double originArea = 1f;

            if (recalculateMass)
            {
                originArea = shape.GetLocal().GetArea();
            }

            Rigidbody2D originalRigidBody = gameObject.GetComponent <Rigidbody2D>();

            Collider2D        collider2D = gameObject.GetComponent <Collider2D>();
            PhysicsMaterial2D material   = collider2D.sharedMaterial;
            bool isTrigger = collider2D.isTrigger;

            switch (Slicer2DSettings.GetComponentsCopy(instantiateMethod))
            {
            case InstantiationMethod.Performance:

                switch (textureType)
                {
                case TextureType.Sprite:
                case TextureType.Sprite3D:
                    if (spriteRendererComponent)
                    {
                        DestroyImmediate(spriteRendererComponent);
                        spriteRendererComponent = null;
                    }
                    break;
                }

                BoxCollider2D c1 = gameObject.GetComponent <BoxCollider2D>();
                if (c1 != null)
                {
                    DestroyImmediate(c1);
                }

                CircleCollider2D c2 = gameObject.GetComponent <CircleCollider2D>();
                if (c2 != null)
                {
                    DestroyImmediate(c2);
                }

                CapsuleCollider2D c3 = gameObject.GetComponent <CapsuleCollider2D>();
                if (c3 != null)
                {
                    DestroyImmediate(c3);
                }
                break;
            }

            int name_id = 1;

            foreach (Polygon2D id in result)
            {
                GameObject gObject = null;

                switch (Slicer2DSettings.GetComponentsCopy(instantiateMethod))
                {
                case InstantiationMethod.Performance:
                    Slicer2DProfiler.IncSlicesCreatedWithPerformance();

                    gObject = Instantiate(gameObject, transform.position, transform.rotation, transform.parent);

                    break;

                case InstantiationMethod.Quality:
                    Slicer2DProfiler.IncSlicesCreatedWithQuality();

                    gObject = new GameObject();
                    gObject.transform.parent   = transform.parent;
                    gObject.transform.position = transform.position;
                    gObject.transform.rotation = transform.rotation;

                    break;
                }

                gObject.name = name + " (" + name_id + ")";
                gObject.transform.localScale = transform.localScale;

                gObject.layer = gameObject.layer;
                gObject.tag   = gameObject.tag;

                resultGameObjects.Add(gObject);

                switch (Slicer2DSettings.GetComponentsCopy(instantiateMethod))
                {
                case InstantiationMethod.Quality:
                    Slicer2DComponents.Copy(this, gObject);
                    break;
                }

                Slicer2D slicer = gObject.GetComponent <Slicer2D> ();

                //ここがPlay時に情報を書き込んでいるところ
                slicer.limit           = new Slicer2DLimit();
                slicer.limit.counter   = limit.counter + 1;
                slicer.limit.maxSlices = limit.maxSlices;
                slicer.limit.enabled   = limit.enabled;


                slicer.eventHandler = new Slicer2DEventHandling();

                slicer.shape = new Slicer2DShape();
                slicer.shape.SetSlicer2D(slicer);
                slicer.shape.ForceUpdate();

                slicer.materialSettings = materialSettings.Copy();

                slicer.anchor = anchor.Copy();

                Slicer2DComponents.CopyRigidbody2D(originalRigidBody, slicer, id, originArea);

                if (Slicer2DSettings.GetCenterOfSliceTransform(centerOfSlice) == CenterOfSliceTransform.ColliderCenter)
                {
                    Polygon2D localPoly = id.ToLocalSpace(gObject.transform);
                    Rect      bounds    = localPoly.GetBounds();
                    Vector2   center    = bounds.center;

                    Vector2 centerWorld = new Vector2(center.x * transform.lossyScale.x, center.y * transform.lossyScale.y);
                    gObject.transform.Translate(centerWorld);

                    slicer.materialSettings.offset += center;
                }

                Collider2D collider = null;
                switch (colliderType)
                {
                case ColliderType.PolygonCollider2D:
                    collider = (Collider2D)id.ToLocalSpace(gObject.transform).CreatePolygonCollider(gObject);
                    break;

                case ColliderType.EdgeCollider2D:
                    collider = (Collider2D)id.ToLocalSpace(gObject.transform).CreateEdgeCollider(gObject);
                    break;
                }

                collider.sharedMaterial = material;
                collider.isTrigger      = isTrigger;

                Vector2D uvOffset;

                switch (textureType)
                {
                case TextureType.Sprite:
                    slicer.spriteRenderer = spriteRenderer;
                    uvOffset = new Vector2D(slicer.materialSettings.offset);
                    Polygon2D.SpriteToMesh(gObject, spriteRenderer, materialSettings.GetTriangulation(), uvOffset);
                    break;

                case TextureType.Sprite3D:
                    slicer.spriteRenderer = spriteRenderer;
                    uvOffset = new Vector2D(slicer.materialSettings.offset);
                    Polygon2D.SpriteToMesh3D(gObject, spriteRenderer, materialSettings.depth, materialSettings.GetTriangulation(), uvOffset);

                    MeshRenderer meshRenderer = slicer.GetComponent <MeshRenderer>();

                    Material[] sharedMaterials = new Material[2];
                    sharedMaterials[1] = spriteRenderer.material;
                    sharedMaterials[0] = materialSettings.sideMaterial;

                    meshRenderer.sharedMaterials = sharedMaterials;

                    break;

                case TextureType.SpriteAnimation:
                    slicer.textureType = TextureType.Sprite;
                    Polygon2D.SpriteToMesh(gObject, spriteRenderer, materialSettings.GetTriangulation());
                    break;

                default:
                    break;
                }

                name_id += 1;
            }

            if (afterSliceRemoveOrigin)
            {
                Destroy(gameObject);
            }

            if (resultGameObjects.Count > 0)
            {
                slice.originGameObject = gameObject;

                slice.SetGameObjects(resultGameObjects);

                if (supportJoints == true)
                {
                    SliceJointEvent(slice);
                }

                eventHandler.Result(slice);
            }

            return(resultGameObjects);
        }
        // ANCHOR!!!!!!! ////////////////////

        ////////////////////////

        void Awake()
        {
            Slicer2DProfiler.IncObjectsCreated();

            shape.SetSlicer2D(this);
        }
    public static Mesh Triangulate3D(Polygon2D polygon, float z, Vector2 UVScale, Vector2 UVOffset, Triangulation triangulation)
    {
        Mesh result = null;

        switch (triangulation)
        {
        case Triangulation.Advanced:
            Slicer2DProfiler.IncAdvancedTriangulation();

            Polygon2D newPolygon = polygon;

            List <Vector3> sideVertices  = new List <Vector3>();
            List <int>     sideTriangles = new List <int>();
            int            vCount        = 0;

            foreach (Pair2D pair in Pair2D.GetList(polygon.pointsList))
            {
                Vector3 pointA = new Vector3((float)pair.A.x, (float)pair.A.y, 0);
                Vector3 pointB = new Vector3((float)pair.B.x, (float)pair.B.y, 0);
                Vector3 pointC = new Vector3((float)pair.B.x, (float)pair.B.y, 1);
                Vector3 pointD = new Vector3((float)pair.A.x, (float)pair.A.y, 1);

                sideVertices.Add(pointA);
                sideVertices.Add(pointB);
                sideVertices.Add(pointC);
                sideVertices.Add(pointD);

                sideTriangles.Add(vCount + 2);
                sideTriangles.Add(vCount + 1);
                sideTriangles.Add(vCount + 0);

                sideTriangles.Add(vCount + 0);
                sideTriangles.Add(vCount + 3);
                sideTriangles.Add(vCount + 2);

                vCount += 4;
            }

            Mesh meshA = PerformTriangulation(newPolygon, UVScale, UVOffset);

            Mesh           meshB     = new Mesh();
            List <Vector3> verticesB = new List <Vector3>();
            foreach (Vector3 v in meshA.vertices)
            {
                verticesB.Add(new Vector3(v.x, v.y, v.z + z));
            }
            meshB.vertices  = verticesB.ToArray();
            meshB.triangles = meshA.triangles.Reverse().ToArray();

            Mesh mesh = new Mesh();
            mesh.SetVertices(sideVertices);
            mesh.SetTriangles(sideTriangles, 0);

            List <Vector3> vertices = new List <Vector3>();
            foreach (Vector3 v in meshA.vertices)
            {
                vertices.Add(v);
            }
            foreach (Vector3 v in meshB.vertices)
            {
                vertices.Add(v);
            }
            foreach (Vector3 v in sideVertices)
            {
                vertices.Add(v);
            }
            mesh.vertices = vertices.ToArray();

            List <int> triangles = new List <int>();
            foreach (int p in meshA.triangles)
            {
                triangles.Add(p);
            }
            int count = meshA.vertices.Count();
            foreach (int p in meshB.triangles)
            {
                triangles.Add(p + count);
            }
            count = meshA.vertices.Count() + meshB.vertices.Count();
            foreach (int p in sideTriangles)
            {
                triangles.Add(p + count);
            }
            mesh.triangles = triangles.ToArray();

            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            result = mesh;

            break;
        }

        return(result);
    }