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; }
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)); } }
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); } }