/// <summary> /// Load the body asset, copy its mesh, and delete it /// </summary> internal static void ReloadCharacterBody(ChaControl chaControl, BodyData bodyData) { string OOBase = bodyData?.OOBase ?? Defaults.OOBase; string Asset = bodyData?.Asset ?? (chaControl.sex == 0 ? Defaults.AssetMale : Defaults.AssetFemale); #if KK if (chaControl.hiPoly == false) { Asset += "_low"; } #endif GameObject uncensorCopy = CommonLib.LoadAsset <GameObject>(OOBase, Asset, true); SkinnedMeshRenderer o_body_a = chaControl.objBody.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => x.name == "o_body_a"); //Copy any additional parts to the character if (bodyData != null && o_body_a != null && bodyData.AdditionalParts.Count > 0) { foreach (var mesh in uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true)) { if (bodyData.AdditionalParts.Contains(mesh.name)) { SkinnedMeshRenderer part = chaControl.objBody.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => x.name == mesh.name); Transform parent = o_body_a.gameObject.GetComponentsInChildren <Transform>(true).FirstOrDefault(c => c.name == mesh.transform.parent.name); if (part == null && parent != null) { var copy = Instantiate(mesh); copy.name = mesh.name; copy.transform.parent = parent; copy.bones = o_body_a.bones.Where(b => b != null && copy.bones.Any(t => t.name.Equals(b.name))).ToArray(); } } } } foreach (var mesh in chaControl.objBody.GetComponentsInChildren <SkinnedMeshRenderer>(true)) { if (mesh.name == "o_body_a") { UpdateMeshRenderer(chaControl, uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => x.name == mesh.name), mesh); } else if (BodyParts.Contains(mesh.name)) { UpdateMeshRenderer(chaControl, uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => x.name == mesh.name), mesh, true); } else if (bodyData != null) { foreach (var part in bodyData.ColorMatchList) { if (mesh.name == part.Object) { UpdateMeshRenderer(chaControl, uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>().FirstOrDefault(x => x.name == part.Object), mesh, true); } } } //Destroy all additional parts attached to the current body that shouldn't be there if (AllAdditionalParts.Contains(mesh.name)) { if (bodyData == null || !bodyData.AdditionalParts.Contains(mesh.name)) { Destroy(mesh); } else { UpdateMeshRenderer(chaControl, uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => x.name == mesh.name), mesh, true); } } } Destroy(uncensorCopy); }
/// <summary> /// Load the body asset, copy its mesh, and delete it /// </summary> private void ReloadCharacterBody() { string OOBase = BodyData?.OOBase ?? Defaults.OOBase; string Asset = BodyData?.Asset ?? (ChaControl.sex == 0 ? Defaults.AssetMale : Defaults.AssetFemale); #if KK if (ChaControl.hiPoly == false) { Asset += "_low"; } #endif GameObject uncensorCopy = CommonLib.LoadAsset <GameObject>(OOBase, Asset, true); SkinnedMeshRenderer bodyMesh = ChaControl.objBody.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => BodyNames.Contains(x.name)); //Copy any additional parts to the character if (BodyData != null && bodyMesh != null && BodyData.AdditionalParts.Count > 0) { var renderers = uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true); for (var i = 0; i < renderers.Length; i++) { var renderer = renderers[i]; if (BodyData.AdditionalParts.Contains(renderer.name)) { SkinnedMeshRenderer part = null; var renderers2 = ChaControl.objBody.GetComponentsInChildren <SkinnedMeshRenderer>(true); for (var j = 0; j < renderers2.Length; j++) { var renderer2 = renderers2[j]; if (renderer2.name == renderer.name) { part = renderer2; break; } } if (part != null) { continue; } Transform parent = null; foreach (var c in bodyMesh.gameObject.GetComponentsInChildren <Transform>(true)) { if (c.name == renderer.transform.parent.name) { parent = c; break; } } if (parent == null) { continue; } var copy = Instantiate(renderer, parent, true); copy.name = renderer.name; copy.bones = bodyMesh.bones.Where(b => b != null && copy.bones.Any(t => t.name.Equals(b.name))).ToArray(); } } } foreach (var mesh in ChaControl.objBody.GetComponentsInChildren <SkinnedMeshRenderer>(true)) { if (BodyNames.Contains(mesh.name)) { UpdateMeshRenderer(uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => x.name == mesh.name), mesh); } else if (BodyParts.Contains(mesh.name)) { UpdateMeshRenderer(uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => x.name == mesh.name), mesh, true); } else if (BodyData != null) { foreach (var part in BodyData.ColorMatchList) { if (mesh.name == part.Object) { UpdateMeshRenderer(uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>().FirstOrDefault(x => x.name == part.Object), mesh, true); } } } //Destroy all additional parts attached to the current body that shouldn't be there if (AllAdditionalParts.Contains(mesh.name)) { if (BodyData == null || !BodyData.AdditionalParts.Contains(mesh.name)) { Destroy(mesh); } else { UpdateMeshRenderer(uncensorCopy.gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true).FirstOrDefault(x => x.name == mesh.name), mesh, true); } } } Destroy(uncensorCopy); }