private bool CheckAndLinkDynamicBone(GameObject go, List <Transform> parentTransforms) { if (!go) { return(false); } DynamicBone[] bones = go.GetComponents <DynamicBone>(); if (bones != null && bones.Length > 0) { foreach (DynamicBone bone in bones) { if (DynamicBoneInyMyHierarchy(bone, parentTransforms)) { DynamicBone = bone; dynamicBonesInstantiated = true; AdditionalAccessoryControlDynamicBoneUpdateManager.RegisterDynamicBone(bone, OnDynamicBoneUpdate); #if DEBUG Log.LogInfo($"Dynamic Bone Link Established: {bone.gameObject.name} {bone.gameObject.GetInstanceID()}"); #endif return(true); } else if (!DynamicBoneSetup(bone)) { dynamicBonesInstantiated = false; } } } DynamicBone_Ver02[] bones2 = go.GetComponents <DynamicBone_Ver02>(); if (bones2 != null && bones2.Length > 0) { foreach (DynamicBone_Ver02 bone in bones2) { if (DynamicBoneInyMyHierarchy(bone, parentTransforms)) { DynamicBone = bone; dynamicBonesInstantiated = true; AdditionalAccessoryControlDynamicBoneUpdateManager.RegisterDynamicBone(bone, OnDynamicBoneV2Update); #if DEBUG Log.LogInfo($"Dynamic Bone Link Established: {bone.gameObject.name} {bone.gameObject.GetInstanceID()}"); #endif return(true); } else if (!DynamicBoneSetup(bone)) { dynamicBonesInstantiated = false; } } } return(false); }
private void OnDestroy() { Helpers.Remove(this); if (DynamicBone != null && DynamicBone.GetType() == typeof(DynamicBone)) { AdditionalAccessoryControlDynamicBoneUpdateManager.UnRegisterDynamicBone((DynamicBone)DynamicBone, OnDynamicBoneUpdate); } else if (DynamicBone != null && DynamicBone.GetType() == typeof(DynamicBone_Ver02)) { AdditionalAccessoryControlDynamicBoneUpdateManager.UnRegisterDynamicBone((DynamicBone_Ver02)DynamicBone, OnDynamicBoneV2Update); } if (meshHelper != null) { meshHelper.UnRegisterVertexListener(vertices[0], OnSkinnedMeshUpdate); } if (altMeshHelper != null) { altMeshHelper.UnRegisterVertexListener(vertices[0], OnSkinnedMeshUpdate); } }
private void LateUpdate() { AdditionalAccessoryControlDynamicBoneUpdateManager.ReapInactiveDynamicBones(); }
private void UpdateParent() { parentTransform = null; gameObject.transform.position = Vector3.zero; gameObject.transform.eulerAngles = Vector3.zero; gameObject.transform.localPosition = Vector3.zero; gameObject.transform.localEulerAngles = Vector3.zero; if (meshHelper != null) { meshHelper.UnRegisterVertexListener(vertices[0], OnSkinnedMeshUpdate); vertices = null; meshHelper = null; } if (altMeshHelper != null) { altMeshHelper.UnRegisterVertexListener(vertices[0], OnSkinnedMeshUpdate); altMeshHelper = null; } if (LinkParent != null && LinkParent.Length > 0) { if (LinkParent.IndexOf("|") > 0) { try { #if DEBUG Log.LogInfo($"Linking to Mesh Vertice at Transform location {LinkParent} | index {LinkParent.IndexOf("|")} Search: {LinkParent.Substring(0, LinkParent.IndexOf("|"))}"); #endif parentTransform = ChaControl.gameObject.transform.Find(LinkParent.Substring(0, LinkParent.IndexOf("|")))?.transform; if (parentTransform != null) { string verticesString = LinkParent.Substring(LinkParent.IndexOf("|") + 1, LinkParent.Length - LinkParent.IndexOf("|") - 1); string[] verticeStrings = verticesString.Split('|'); vertices = new int[verticeStrings.Length]; for (int i = 0; i < verticeStrings.Length; i++) { vertices[i] = int.Parse(verticeStrings[i]); } meshHelper = parentTransform.gameObject.GetOrAddComponent <AdditionalAccessoryAdvancedParentSkinnedMeshHelper>(); meshHelper.ChaControl = ChaControl; if (AnimatedBoneNames.Contains(parentTransform.gameObject.name) || ContainsCustomBones()) { meshHelper.RenderAlways = true; } meshHelper.RegisterVertexListener(vertices[0], OnSkinnedMeshUpdate); if (parentTransform.name == "o_tang") { altMeshHelper = ChaControl.transform.Find("BodyTop/p_cf_body_00/n_o_root/n_body_base/N_mnpbset/N_tang/o_tang").gameObject.GetOrAddComponent <AdditionalAccessoryAdvancedParentSkinnedMeshHelper>(); altMeshHelper.ChaControl = ChaControl; altMeshHelper.RenderAlways = true; altMeshHelper.RegisterVertexListener(vertices[0], OnSkinnedMeshUpdate); } #if DEBUG Log.LogInfo($"Attaching to SM at {parentTransform} Vertices {vertices}"); #endif } } catch { vertices = null; LinkParent = null; parentTransform = null; meshHelper = null; altMeshHelper = null; } } else { parentTransform = ChaControl.gameObject.transform.Find(LinkParent)?.transform; } } #if DEBUG if (parentTransform) { Log.LogInfo($"Linked to {parentTransform} {LinkParent}"); } else { Log.LogInfo($"Parent Link Not Found {LinkParent}"); } #endif // Re-Check for dynamic bones in the parent hierarchy if (DynamicBone != null && DynamicBone.GetType() == typeof(DynamicBone)) { AdditionalAccessoryControlDynamicBoneUpdateManager.UnRegisterDynamicBone((DynamicBone)DynamicBone, OnDynamicBoneUpdate); } else if (DynamicBone != null && DynamicBone.GetType() == typeof(DynamicBone_Ver02)) { AdditionalAccessoryControlDynamicBoneUpdateManager.UnRegisterDynamicBone((DynamicBone_Ver02)DynamicBone, OnDynamicBoneV2Update); } DynamicBone = null; dynamicBonesInstantiated = true; if (parentTransform != null) { ScanForDynamicBone(); } }
static void DynamicBoneV2Update(DynamicBone_Ver02 __instance) { AdditionalAccessoryControlDynamicBoneUpdateManager.InvokeUpdateListeners(__instance); }