示例#1
0
    void OnSceneGUI()
    {
        Island island = (Island)target;

        for (int i = 0; i < island.m_triangles.Count; i++)
        {
            MeshSlice.Triangle tri = island.m_triangles[i];

            Vector3 v0 = new Vector3(tri.p0.x, 1.0f, tri.p0.y);
            Vector3 v1 = new Vector3(tri.p1.x, 1.0f, tri.p1.y);
            Vector3 v2 = new Vector3(tri.p2.x, 1.0f, tri.p2.y);

            Vector3 v3 = new Vector3(island.sliceStart.x, 1.0f, island.sliceStart.y);
            Vector3 v4 = new Vector3(island.sliceEnd.x, 1.0f, island.sliceEnd.y);


            float handleSize = HandleUtility.GetHandleSize((Vector3)v0) / 8.0f;

            v0 = Handles.Slider2D(v0, Vector3.up, Vector3.right, Vector3.forward, handleSize, Handles.SphereCap, new Vector2(0.1f, 0.1f));
            v1 = Handles.Slider2D(v1, Vector3.up, Vector3.right, Vector3.forward, handleSize, Handles.SphereCap, new Vector2(0.1f, 0.1f));
            v2 = Handles.Slider2D(v2, Vector3.up, Vector3.right, Vector3.forward, handleSize, Handles.SphereCap, new Vector2(0.1f, 0.1f));

            v3 = Handles.Slider2D(v3, Vector3.up, Vector3.right, Vector3.forward, handleSize, Handles.SphereCap, new Vector2(0.1f, 0.1f));
            v4 = Handles.Slider2D(v4, Vector3.up, Vector3.right, Vector3.forward, handleSize, Handles.SphereCap, new Vector2(0.1f, 0.1f));


            Handles.DrawLine(v0, v1);
            Handles.DrawLine(v1, v2);
            Handles.DrawLine(v2, v0);


            Handles.DrawLine(v3, v4);

            tri.p0 = new Vector2(v0.x, v0.z);
            tri.p1 = new Vector2(v1.x, v1.z);
            tri.p2 = new Vector2(v2.x, v2.z);

            island.m_triangles[i] = tri;

            island.sliceStart = new Vector2(v3.x, v3.z);
            island.sliceEnd   = new Vector2(v4.x, v4.z);
        }
    }
示例#2
0
    public override void OnInspectorGUI()
    {
        Island island = (Island)target;

        island.IslandSourceMesh = EditorGUILayout.ObjectField(island.IslandSourceMesh, typeof(Mesh), true) as Mesh;

        island.SectionsX = EditorGUILayout.IntField("Slices X", island.SectionsX);
        island.SectionsY = EditorGUILayout.IntField("Slices Y", island.SectionsY);

        if (GUILayout.Button("Slice Mesh"))
        {
            if (island.IslandSourceMesh != null)
            {
                Mesh[,] meshes = MeshSlice.Slice(island.IslandSourceMesh, island.SectionsX, island.SectionsY, true, true);

                GameObject meshesObject = GameObjectHelper.FindChild(island.gameObject, "meshes", true);

                int i = 0;
                foreach (var mesh in meshes)
                {
                    mesh.Optimize();
                    GameObject newObject = new GameObject("island_slice_" + i);
                    newObject.transform.parent        = meshesObject.transform;
                    newObject.transform.localPosition = Vector3.zero;
                    newObject.AddComponent <MeshRenderer>();

                    MeshFilter filter = newObject.AddComponent <MeshFilter>();
                    filter.mesh = mesh;
                    i++;
                }
            }
        }

        if (GUILayout.Button("Reset"))
        {
            island.m_triangles.Clear();


            MeshSlice.Triangle tri = new MeshSlice.Triangle();
            tri.p0 = new Vector2(-1.0f, -1.0f);
            tri.p1 = new Vector2(1.0f, -1.0f);
            tri.p2 = new Vector2(0.0f, 1.0f);
            island.m_triangles.Add(tri);
        }

        if (GUILayout.Button("Slice"))
        {
            List <MeshSlice.Triangle> tris = island.m_triangles;

            List <MeshSlice.Triangle> outTris = new List <MeshSlice.Triangle>();

            Vector2 v0, v1;

            foreach (var tri in tris)
            {
                if (MathsHelper.LineTriIntersect(island.sliceStart, island.sliceEnd, tri.p0, tri.p1, tri.p2, out v0, out v1))
                {
                    outTris.AddRange(MeshSlice.SliceTri(tri, island.sliceStart, island.sliceEnd));
                }
                else
                {
                    outTris.Add(tri);
                }
            }

            island.m_triangles = outTris;
        }
    }