示例#1
0
    public void BuildMesh()
    {
        var storableMesh = MeshBuilder.BuildMeshFromLayers(layers);
        var verts        = storableMesh.vertices;

        meshFilter.mesh.SetVertices(storableMesh.vertices);
        meshFilter.mesh.SetTriangles(storableMesh.triangles, 0);
        meshFilter.mesh.RecalculateNormals();
        MeshHelper.TurnOutNormals(meshFilter.mesh);


        meshFilter.GetComponent <MeshCollider>().sharedMesh = meshFilter.mesh;

        for (int i = 0; i < verts.Count; i++)
        {
            var go = Instantiate(spherePrefab, dragSpheresParent);
            go.OnPositionChange       += OnSpherePositionChange;
            go.transform.localPosition = verts[i];
            sphereToVertex.Add(go, new Dictionary <MeshFilter, int>()
            {
                { meshFilter, i }
            });
            if (i < layers[0].Count)
            {
                sphereToVertex[go].Add(downBound, i);
            }
            if (i >= verts.Count - layers[layers.Count - 1].Count)
            {
                sphereToVertex[go].Add(upperBound, i - verts.Count + layers[layers.Count - 1].Count);
            }
        }

        ToggleMainMeshComponents(true);

        state = LayerBankState.drawMainMesh;
    }
示例#2
0
    public void OnSliceButtonClick()
    {
        if (state == LayerBankState.empty)
        {
            return;
        }
        if (state == LayerBankState.drawSlices)
        {
            ToggleSliceMeshComponent(false);
            ToggleMainMeshComponents(true);
            state = LayerBankState.drawMainMesh;
            return;
        }
        if (state == LayerBankState.drawMainMesh)
        {
            hats  = new List <Mesh>();
            state = LayerBankState.drawSlices;
            ToggleMainMeshComponents(false);
            ToggleSliceMeshComponent(true);
            var zmin = layers[0][0].z;
            var zmax = layers[layers.Count - 1][0].z;
            int slicesNum;
            if (!int.TryParse(slicesCount.text, out slicesNum))
            {
                slicesNum = 5;
            }
            List <Vector3> points;
            if (Drag_n_drop.lastHitPlane != null)
            {
                points = Drag_n_drop.lastHitPlane;
            }
            else
            {
                points = new List <Vector3>()
                {
                    new Vector3(0, 0, zmin), new Vector3(1, 0, zmin), new Vector3(0, 1, zmin)
                };
            }
            var centr = LayerHelper.CalcCenterPoint(meshFilter.mesh);
            var plane = new Plane(points[0], points[1], points[2]);
            if (Vector3.Magnitude(plane.normal + (centr - points[0])) < Vector3.Magnitude(centr - points[0]))
            {
                var temp = points[0];
                points[0] = points[1];
                points[1] = temp;
            }
            plane = new Plane(points[0], points[1], points[2]);
            float size = 0;
            foreach (var i in meshFilter.mesh.vertices)
            {
                size = Mathf.Max(size, plane.GetDistanceToPoint(i));
            }

            slices          = MeshSlicer.SliceInPeaces(slicesNum, meshFilter.mesh, size, points, out hats);
            lastSliceVector = plane.normal.normalized;
            hats.Add(upperBound.mesh);
            hats.Insert(0, downBound.mesh);
            SetSlice(0);
            //StartCoroutine(DrawSlices(slices, hats));
        }
    }
示例#3
0
    public void ShowAllSlices()
    {
        if (state == LayerBankState.allSlices)
        {
            foreach (var i in slicesAll)
            {
                Destroy(i);
            }
            slicesAll = new List <GameObject>();
            state     = LayerBankState.drawSlices;
            SetSlice(0);
            ToggleSliceMeshComponent(true);
            return;
        }
        List <Mesh> meshes = new List <Mesh>();

        slicesAll = new List <GameObject>();
        if (state == LayerBankState.drawSlices)
        {
            state = LayerBankState.allSlices;
            for (int i = 0; i < slices.Length; i++)
            {
                var verts     = new List <Vector3>(slices[i].vertices);
                var triangles = new List <int>(slices[i].triangles).ToArray();
                for (int j = 0; j < verts.Count; j++)
                {
                    verts[j] += lastSliceVector * 15.0f * i;
                }
                var mesh = new Mesh();
                mesh.SetVertices(verts);
                mesh.SetTriangles(triangles, 0);
                var newCenter = Instantiate(sliceMeshFilter.gameObject, sliceMeshFilter.transform.parent).GetComponent <MeshFilter>();
                newCenter.gameObject.SetActive(true);
                newCenter.mesh = mesh;
                slicesAll.Add(newCenter.gameObject);
                if (i > 0)
                {
                    var newDown = Instantiate(sliceDownBound, sliceDownBound.transform.parent).GetComponent <MeshFilter>();
                    newDown.gameObject.SetActive(true);
                    Mesh downmesh  = new Mesh();
                    var  downVerts = new List <Vector3>(hats[i].vertices);
                    for (int j = 0; j < downVerts.Count; j++)
                    {
                        downVerts[j] += lastSliceVector * 15.0f * i;
                    }
                    newDown.mesh.SetVertices(downVerts);
                    newDown.mesh.SetTriangles(hats[i].triangles, 0);
                    slicesAll.Add(newDown.gameObject);
                }

                if (i < slices.Length - 1)
                {
                    var newDown = Instantiate(sliceUpperBound, sliceUpperBound.transform.parent).GetComponent <MeshFilter>();
                    newDown.gameObject.SetActive(true);
                    Mesh downmesh  = new Mesh();
                    var  downVerts = new List <Vector3>(hats[i + 1].vertices);
                    for (int j = 0; j < downVerts.Count; j++)
                    {
                        downVerts[j] += lastSliceVector * 15.0f * i;
                    }
                    newDown.mesh.SetVertices(downVerts);
                    newDown.mesh.SetTriangles(hats[i + 1].triangles, 0);
                    slicesAll.Add(newDown.gameObject);
                }
            }

            ToggleSliceMeshComponent(false);
        }
    }