/// <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);
                }
Beispiel #2
0
            /// <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);
            }