예제 #1
0
        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"));
        }
예제 #2
0
        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");
            }
        }
예제 #4
0
    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);
            }
        }
    }
예제 #5
0
        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"));
        }
예제 #6
0
    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);
    }