示例#1
0
        public static GameObject CreatePiece(int id, Mesh mesh, MeshParentInfo parentInfo, Vector3 goPosition, Tuple2 <int, int> submeshRange,
                                             Material interiorMaterial, GameObject parentGO, GameObject chopGO, out int interiorSubmeshIdx)
        {
            string     name    = parentGO.name + "_" + id;
            GameObject pieceGO = new GameObject(name);

            mesh.name = name;

            pieceGO.transform.parent   = chopGO.transform;
            pieceGO.transform.position = goPosition;

            pieceGO.AddMesh(mesh);

            AssignPieceMaterials(pieceGO, parentGO, parentInfo, interiorMaterial, submeshRange, out interiorSubmeshIdx);

            return(pieceGO);
        }
        private void CreateNewObjects(Vector3 position, List <GameObject> listParentGO, List <GameObject> listChoppedParentGO, CaronteSharp.MeshParentInfo[] arrMeshParentInfo,
                                      UnityEngine.Mesh[] arrMeshPieceUnity, Tuple2 <int, int>[] arrSubmeshRange, int[] arrMeshComplexIdx, Vector3[] arrMeshPosition, uint[] arrOutsideInsideIdx)
        {
            List <GameObject> listChoppedGO = new List <GameObject>();

            List <Tuple2 <GameObject, GameObject> > listOutsideInsideGOParent = new List <Tuple2 <GameObject, GameObject> >();
            bool hasBeenSplitted = arrOutsideInsideIdx != null;

            // Create InsideOutSidePieces
            for (int i = 0; i < listParentGO.Count; i++)
            {
                GameObject parentGO     = listParentGO[i];
                GameObject chopParentGO = listChoppedParentGO[i];

                if (hasBeenSplitted)
                {
                    GameObject outsideGO = parentGO.CreateDummy(parentGO.name + "_outside");
                    GameObject insideGO  = parentGO.CreateDummy(parentGO.name + "_inside");

                    outsideGO.transform.parent = chopParentGO.transform;
                    insideGO.transform.parent  = chopParentGO.transform;

                    listOutsideInsideGOParent.Add(Tuple2.New(outsideGO, insideGO));
                }

                if (Data.HideParentObjectAuto)
                {
                    Undo.RecordObject(parentGO, "Change activate state - " + parentGO.name);
                    parentGO.SetActive(false);
                    EditorUtility.SetDirty(parentGO);
                }
            }

            //Create Chopped Pieces
            Dictionary <GameObject, int> dictChoppedGOInteriorSubmeshIdx = new Dictionary <GameObject, int>();

            int nMeshPieces = arrMeshPieceUnity.Length;

            for (int i = 0; i < nMeshPieces; i++)
            {
                UnityEngine.Mesh  meshPiece    = arrMeshPieceUnity[i];
                Tuple2 <int, int> submeshRange = arrSubmeshRange[i];
                int     meshComplexIdx         = arrMeshComplexIdx[i];
                Vector3 goPosition             = arrMeshPosition[i];

                MeshParentInfo parentInfo = arrMeshParentInfo[meshComplexIdx];
                int            parentIdx  = (int)parentInfo.parentMeshIdx_;

                GameObject parentGO     = listParentGO[parentIdx];
                GameObject chopParentGO = listChoppedParentGO[parentIdx];

                int        interiorPieceSubmeshIdx;
                GameObject goPiece = CRGeometryUtils.CreatePiece(i, meshPiece, parentInfo, goPosition, submeshRange,
                                                                 Data.InteriorMaterial, parentGO, chopParentGO, out interiorPieceSubmeshIdx);

                if (hasBeenSplitted)
                {
                    Tuple2 <GameObject, GameObject> tupleOutsideInside = listOutsideInsideGOParent[parentIdx];

                    GameObject outsideGO = tupleOutsideInside.First;
                    GameObject insideGO  = tupleOutsideInside.Second;

                    uint outsideInsideIdx = arrOutsideInsideIdx[meshComplexIdx];
                    if (outsideInsideIdx == 0)
                    {
                        goPiece.transform.parent = outsideGO.transform;
                        goPiece.name             = parentGO.name + "_out_" + i;
                    }
                    else if (outsideInsideIdx == 1)
                    {
                        goPiece.transform.parent = insideGO.transform;
                        goPiece.name             = parentGO.name + "_in_" + i;
                    }
                }

                listChoppedGO.Add(goPiece);
                dictChoppedGOInteriorSubmeshIdx.Add(goPiece, interiorPieceSubmeshIdx);
            }



            GameObject chopRoot = new GameObject(Data.Name + "_output");

            chopRoot.transform.position = position;
            Undo.RegisterCreatedObjectUndo(chopRoot, "Created " + Data.Name + "_output");

            Data.GameObjectChoppedRoot = chopRoot;

            for (int i = 0; i < listChoppedParentGO.Count; i++)
            {
                GameObject chopParentGO = listChoppedParentGO[i];

                chopParentGO.transform.parent = Data.GameObjectChoppedRoot.transform;
                chopParentGO.transform.SetAsFirstSibling();
            }

            Selection.activeGameObject = Data.GameObjectChoppedRoot;

            SaveNewChopInfo(dictChoppedGOInteriorSubmeshIdx);
        }
示例#3
0
        private static void AssignPieceMaterials(GameObject pieceGO, GameObject parentGO, MeshParentInfo parentInfo, Material interiorMaterial, Tuple2 <int, int> submeshRange, out int interiorSubmeshIdx)
        {
            interiorSubmeshIdx = -1;

            MeshRenderer pieceRenderer  = pieceGO.GetComponent <MeshRenderer>();
            MeshRenderer parentRenderer = parentGO.GetComponent <MeshRenderer>();

            if (parentRenderer != null)
            {
                Material[]      arrMaterials   = parentRenderer.sharedMaterials;
                List <Material> pieceMaterials = new List <Material>();

                uint[] arrParentSubmeshIdx = parentInfo.arrParentSubMeshIdx_;

                for (int i = submeshRange.First; i <= submeshRange.Second; i++)
                {
                    uint submeshIndex = arrParentSubmeshIdx[i];
                    if (submeshIndex == uint.MaxValue)
                    {
                        pieceMaterials.Add(interiorMaterial);
                        interiorSubmeshIdx = i;
                    }
                    else
                    {
                        pieceMaterials.Add(arrMaterials[submeshIndex]);
                    }
                }
                pieceRenderer.sharedMaterials = pieceMaterials.ToArray();
            }
        }