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