public static UnityEngine.GameObject NewIterM(UnityEngine.GameObject origin) { UnityEngine.GameObject backobj = UnityEngine.GameObject.Instantiate(origin, origin.transform.position, origin.transform.rotation) as UnityEngine.GameObject; backobj.transform.parent = XOGloble.IterM.transform; backobj.transform.localScale = origin.transform.lossyScale; backobj.name = XOUtil.Path(origin); XOCp_MarkIntermediate mi = backobj.AddComponent <XOCp_MarkIntermediate>(); mi.OriginInstID = origin.GetInstanceID(); mi.goOrigin = origin; backobj.SetActive(true); XOCp_OptimizerHandler xoh = XOGloble.Root.GetComponent <XOCp_OptimizerHandler>(); if (xoh != null) { xoh.AddObjLstByShaderMaterial(backobj); } XOUtil.Display(backobj, false); return(backobj); }
public static void ExtractMaterialMeshes(UnityEngine.GameObject rObject) { if (rObject == null) { return; } if (!rObject.activeInHierarchy) { return; } // If this object has a mesh, extract it MeshFilter lMeshFilter = rObject.GetComponent <MeshFilter>(); if (lMeshFilter == null) { return; } // Ensure we're only extracting rendered meshes MeshRenderer lMeshRenderer = rObject.GetComponent <MeshRenderer>(); if (lMeshRenderer == null) { return; } // We need to break the mesh into it's sub mesh parts so we can assign materials Mesh lMesh = null; Material lMaterial = null; int lSubMeshCount = lMeshFilter.sharedMesh.subMeshCount; for (int i = 0; i < lSubMeshCount; i++) { // This is easy, use the shared instance if (i == 0) { lMesh = lMeshFilter.sharedMesh; lMaterial = lMeshRenderer.sharedMaterial; } // Process each sub-mesh individually else { // Create a mesh from the sub-mesh lMesh = CreateMesh(lMeshFilter.sharedMesh, i); // Find the material it's using if (lMeshRenderer.sharedMaterials.Length > i) { lMaterial = lMeshRenderer.sharedMaterials[i]; } else { lMaterial = lMeshRenderer.sharedMaterials[lMeshRenderer.sharedMaterials.Length - 1]; } } string newname = "split-" + rObject.name + i; UnityEngine.GameObject newobj = new UnityEngine.GameObject(newname); newobj.transform.parent = XOGloble.IterM.transform; newobj.transform.position = lMeshFilter.transform.position; newobj.transform.rotation = lMeshFilter.transform.rotation; newobj.transform.localScale = lMeshFilter.transform.lossyScale; newobj.isStatic = true; MeshFilter lMergedMeshFilter = newobj.AddComponent(typeof(MeshFilter)) as MeshFilter; lMergedMeshFilter.mesh = lMesh; // CombineInstance[] lMeshes = new CombineInstance[1]; // lMeshes[0].transform = lMeshFilter.transform.localToWorldMatrix; // lMeshes[0].mesh = lMesh; lMergedMeshFilter.sharedMesh.name = "Merged Mesh of " + lSubMeshCount + " items"; // lMergedMeshFilter.sharedMesh.CombineMeshes(lMeshes, true); // Unwrapping.GenerateSecondaryUVSet(lMergedMeshFilter.sharedMesh); MeshRenderer lMergedMeshRenderer = newobj.AddComponent(typeof(MeshRenderer)) as MeshRenderer; lMergedMeshRenderer.sharedMaterial = lMaterial; XOCp_OptimizerHandler xoh = XOGloble.Root.GetComponent <XOCp_OptimizerHandler>(); if (xoh != null) { xoh.nlst.Add(newobj); xoh.AddObjLstByShaderMaterial(newobj); } } }