void OnUpdate() { if (haveValidContext) { if (activeBoneIndex != editBoneIndex) { activeBoneIndex = BAD_INDEX; mirrorBoneIndex = BAD_INDEX; if (editBoneIndex != BAD_INDEX) { int boneHash = targetPose.poses[editBoneIndex].hash; context.activeTransform = context.activeUMA.skeleton.GetBoneTransform(boneHash); if (context.activeTransform != null) { activeBoneIndex = editBoneIndex; } if (context.mirrorTransform != null) { int mirrorHash = UMASkeleton.StringToHash(context.mirrorTransform.name); for (int i = 0; i < targetPose.poses.Length; i++) { if (targetPose.poses[i].hash == mirrorHash) { mirrorBoneIndex = i; break; } } } } else { context.activeTransform = null; } } if (!dynamicDNAConverterMode) { context.activeUMA.skeleton.ResetAll(); if (context.startingPose != null) { context.startingPose.ApplyPose(context.activeUMA.skeleton, context.startingPoseWeight); } if (haveEditTarget) { targetPose.ApplyPose(context.activeUMA.skeleton, 1f); } else { targetPose.ApplyPose(context.activeUMA.skeleton, previewWeight); } } } }
void Update() { if (expressionSet == null) { return; } if (skeletonRoot == null) { return; } if (expressionPlayer == null) { expressionPlayer = gameObject.GetComponent <ExpressionPlayer>(); if (expressionPlayer == null) { if (Debug.isDebugBuild) { Debug.LogWarning("Couldn't find expression player to preview!"); } return; } } if (skeleton == null) { skeleton = new UMASkeleton(skeletonRoot); } expressionSet.RestoreBones(skeleton); float[] values = expressionPlayer.Values; for (int i = 0; i < values.Length; i++) { float weight = values[i]; UMABonePose pose = null; if (weight > 0) { pose = expressionSet.posePairs[i].primary; } else { weight = -weight; pose = expressionSet.posePairs[i].inverse; } if (pose == null) { continue; } pose.ApplyPose(skeleton, weight); } }
void OnUpdate() { if (haveValidContext) { if (activeBoneIndex != editBoneIndex) { activeBoneIndex = BAD_INDEX; mirrorBoneIndex = BAD_INDEX; if (editBoneIndex != BAD_INDEX) { int boneHash = targetPose.poses[editBoneIndex].hash; context.activeTransform = context.activeUMA.skeleton.GetBoneTransform(boneHash); if (context.activeTransform != null) { activeBoneIndex = editBoneIndex; } if (context.mirrorTransform != null) { int mirrorHash = UMASkeleton.StringToHash(context.mirrorTransform.name); for (int i = 0; i < targetPose.poses.Length; i++) { if (targetPose.poses[i].hash == mirrorHash) { mirrorBoneIndex = i; break; } } } } else { context.activeTransform = null; } } if (!dynamicDNAConverterMode) { context.activeUMA.skeleton.ResetAll(); if (context.startingPose != null) { context.startingPose.ApplyPose(context.activeUMA.skeleton, context.startingPoseWeight); } if (haveEditTarget) { targetPose.ApplyPose(context.activeUMA.skeleton, 1f); } else { targetPose.ApplyPose(context.activeUMA.skeleton, previewWeight); } } else { //TODO //how do we deal with poses that are not applied? The user will see the character in its current pose and bone positions for that //which makes no sense //also because this will be hooked up to dna, the dna itself might be causing other changes to happen ('overallScale' for example) //So I think the editor for bonePoseConverters, needs to jump in here and ask the user if they want to apply the dna that makes the pose active? //OR //maybe we create a skeleton how it would be IF the pose was applied to it and the user edits those transforms? //If the pose is applied they will see their character change, if its not it might be clearer that is the case } } if (!Application.isPlaying) { _livePopupEditor = null; } }
void LateUpdate() { if (!initialized) { return; } if (umaData == null || umaData.skeleton == null) { return; } if (enableSaccades) { UpdateSaccades(); } if (enableBlinking) { UpdateBlinking(); } float[] values = Values; MecanimJoint mecanimMask = MecanimJoint.None; if (!overrideMecanimNeck) { mecanimMask |= MecanimJoint.Neck; } if (!overrideMecanimHead) { mecanimMask |= MecanimJoint.Head; } if (!overrideMecanimJaw) { mecanimMask |= MecanimJoint.Jaw; } if (!overrideMecanimEyes) { mecanimMask |= MecanimJoint.Eye; } if (overrideMecanimJaw) { umaData.skeleton.Restore(jawHash); } for (int i = 0; i < values.Length; i++) { if ((MecanimAlternate[i] & mecanimMask) != MecanimJoint.None) { continue; } float weight = values[i]; if (weight == 0f) { continue; } UMABonePose pose = null; if (weight > 0) { pose = expressionSet.posePairs[i].primary; } else { weight = -weight; pose = expressionSet.posePairs[i].inverse; } if ((weight > minWeight) && (pose != null)) { pose.ApplyPose(umaData.skeleton, weight); } } }
void LateUpdate() { if (!processing) { return; } if (!initialized) { return; } if (umaData == null || umaData.skeleton == null) { return; } if (_mainCameraTransform != null && useDisableDistance && (_mainCameraTransform.position - transform.position).sqrMagnitude > (disableDistance * disableDistance)) { return; } if (enableSaccades) { UpdateSaccades(); } if (enableBlinking) { UpdateBlinking(); } float[] values = Values; MecanimJoint mecanimMask = MecanimJoint.None; if (!overrideMecanimNeck) { mecanimMask |= MecanimJoint.Neck; } if (!overrideMecanimHead) { mecanimMask |= MecanimJoint.Head; } if (!overrideMecanimJaw) { mecanimMask |= MecanimJoint.Jaw; } if (!overrideMecanimEyes) { mecanimMask |= MecanimJoint.Eye; } if (!overrideMecanimHands) { mecanimMask |= MecanimJoint.Hands; } if (overrideMecanimJaw) { umaData.skeleton.Restore(jawHash); } if (LastValues == null || LastValues.Length < values.Length) { LastValues = new float[44]; saveValues(values); } for (int i = 0; i < values.Length; i++) { if (LastValues[i] != values[i]) { if (ExpressionChanged != null) { ExpressionChanged.Invoke(umaData, PoseNames[i], values[i]); } } if ((MecanimAlternate[i] & mecanimMask) != MecanimJoint.None) { continue; } float weight = values[i]; if (weight == 0f) { continue; } UMABonePose pose = null; if (weight > 0) { pose = expressionSet.posePairs[i].primary; } else { weight = -weight; pose = expressionSet.posePairs[i].inverse; } if ((weight > minWeight) && (pose != null)) { pose.ApplyPose(umaData.skeleton, weight); } } saveValues(values); }