public override ActionResult DoAction() { if (MeshSelection.selectedObjectCount < 2) { return(new ActionResult(ActionResult.Status.Canceled, "Must Select 2+ Objects")); } var selected = MeshSelection.top.ToArray(); List <ProBuilderMesh> res = CombineMeshes.Combine(MeshSelection.topInternal); if (res != null) { foreach (var mesh in res) { mesh.Optimize(); mesh.gameObject.name = Selection.activeGameObject.name + "-Merged"; UndoUtility.RegisterCreatedObjectUndo(mesh.gameObject, "Merge Objects"); Selection.objects = res.Select(x => x.gameObject).ToArray(); } // Delete donor objects for (int i = 0; i < selected.Length; i++) { if (selected[i] != null) { UndoUtility.DestroyImmediate(selected[i].gameObject); } } } ProBuilderEditor.Refresh(); return(new ActionResult(ActionResult.Status.Success, "Merged Objects")); }
public void CombineMeshes_RetainObjectProperties() { var meshes = new List <ProBuilderMesh>(); meshes.Add(m_mesh1); meshes.Add(m_mesh2); meshes.Add(m_mesh3); var newMeshes = CombineMeshes.Combine(meshes, m_mesh1); Assert.That(newMeshes.Count, Is.EqualTo(1)); Assert.That(newMeshes[0], Is.EqualTo(m_mesh1)); Assert.That(newMeshes[0].gameObject.GetComponent <BoxCollider>, !Is.EqualTo(null)); Assert.That(newMeshes[0].transform.localScale, Is.EqualTo(m_meshScale)); }
private static void MergeSelectedMeshes() { Material[] materials; Mesh mesh; var renderers = new MeshRenderer[2]; var meshFilters = new MeshFilter[2]; var index = 0; foreach (var item in Selection.transforms) { var f = item.GetComponent <MeshFilter>(); var r = item.GetComponent <MeshRenderer>(); if (f != null && r != null) { renderers[index] = r; meshFilters[index] = f; index++; } if (index == 2) { break; } } if (index == 2) { var newObject = new GameObject("Result"); var filter = newObject.AddComponent <MeshFilter>(); var renderer = newObject.AddComponent <MeshRenderer>(); CombineMeshes.Combine(renderers, meshFilters, out mesh, out materials); filter.sharedMesh = mesh; renderer.sharedMaterials = materials; } else { EditorUtility.DisplayDialog( "Information", "Must select 2 game objects that have a MeshRenderer & MeshFilter components on them!", "Accept"); } }
public void Generate(Material material, BuildingParams buildingParams, Transform parent) { combineMeshes = new CombineMeshes(); float rowLength = GetRowLength(buildingCountSide); List <Vector2> sizes = GetFoundionSizes(buildingCountSide, rowLength); int gridSize = 3; float quarterLength = rowLength + sizes[sizes.Count - 1].y; float roadWidth = 2; for (int y = 0; y < gridSize; y++) { for (int x = 0; x < gridSize; x++) { GameObject quarter = GenerateQuarter(material, sizes, buildingParams); quarter.transform.parent = parent; quarter.transform.position = new Vector3(x * quarterLength + roadWidth * x, 0, y * quarterLength + roadWidth * y); } } }
protected override ActionResult PerformActionImplementation() { if (MeshSelection.selectedObjectCount < 2) { return(new ActionResult(ActionResult.Status.Canceled, "Must Select 2+ Objects")); } var selected = MeshSelection.top.ToArray(); ProBuilderMesh currentMesh = MeshSelection.activeMesh; UndoUtility.RecordObject(currentMesh, "Merge Objects"); List <ProBuilderMesh> res = CombineMeshes.Combine(MeshSelection.topInternal, currentMesh); if (res != null) { foreach (var mesh in res) { mesh.Optimize(); if (mesh != currentMesh) { mesh.gameObject.name = Selection.activeGameObject.name + "-Merged"; UndoUtility.RegisterCreatedObjectUndo(mesh.gameObject, "Merge Objects"); Selection.objects = res.Select(x => x.gameObject).ToArray(); } } // Delete donor objects if they are not part of the result for (int i = 0; i < selected.Length; i++) { if (selected[i] != null && res.Contains(selected[i]) == false) { UndoUtility.DestroyImmediate(selected[i].gameObject); } } } ProBuilderEditor.Refresh(); return(new ActionResult(ActionResult.Status.Success, "Merged Objects")); }
public static Mesh LinearMesh(List <Vector3> points, int iterations, float thickness, int test) { List <GameObject> objects = new List <GameObject>(); int[] previous = new int[2]; for (int i = 0; i < iterations - 1; i++) { List <Vector3> temp = new List <Vector3>(); if (i == 0) { temp.Add(points[0]); temp.Add(points[1]); temp.Add(points[2]); temp.Add(points[3]); if (test == 2) { previous = new int[] { 2, 3 }; } else { temp.Add(points[0]); temp.Add(points[4]); temp.Add(points[5]); previous = new int[] { 3, 4, 5 }; } } else if (i < points.Count - 2) { if (test == 2) { temp.Add(points[previous[0]]); temp.Add(points[previous[1]]); temp.Add(points[previous[1] + 1]); temp.Add(points[previous[1] + 2]); previous = new int[] { previous[1] + 1, previous[1] + 2 }; } else { temp.Add(points[previous[0]]); temp.Add(points[previous[1]]); temp.Add(points[previous[2]]); temp.Add(points[previous[2] + 1]); temp.Add(points[previous[2] + 2]); temp.Add(points[previous[2] + 3]); previous = new int[] { previous[2] + 1, previous[2] + 2, previous[2] + 3 }; } } else { temp.Add(points[points.Count - 1]); temp.Add(points[points.Count]); temp.Add(points[0]); temp.Add(points[1]); if (test == 2) { temp.Add(points[points.Count - 2]); temp.Add(points[2]); } } List <Vector3> lower = new List <Vector3>(temp); for (int z = 0; z < lower.Count; z++) { lower[z] -= new Vector3(0, thickness, 0); } temp.AddRange(lower); Mesh mesh = new Mesh(); mesh = MeshMaker.MeshFromPoints(temp); GameObject obj = new GameObject(); MeshFilter filter = obj.AddComponent <MeshFilter>(); obj.AddComponent <MeshRenderer>(); filter.sharedMesh = LowPolyConverter.Convert(mesh); objects.Add(obj); } Mesh combinedMesh = CombineMeshes.Combine(objects); foreach (GameObject obj in objects) { DestroyImmediate(obj); } return(combinedMesh); }
public void Merge() { CombineMeshes combineMeshes = new CombineMeshes(); combineMeshes.MergeChildren(parentObj); }