//============================================================================================ /** * @brief Copy constructor * *********************************************************************************************/ public EventMarker(EventMarker _copy) { EventId = _copy.EventId; EventTime = _copy.EventTime; Windup = _copy.Windup; Actions = new List <float>(_copy.Actions); FollowThrough = _copy.FollowThrough; Recovery = _copy.Recovery; Contacts = new List <EventContact>(_copy.Contacts); }
public void OnDeleteEventMarker(object a_eventObj) { if (a_eventObj == null) return; EventMarker eventMarker = a_eventObj as EventMarker; for (int i = 0; i < Events.Count; ++i) { if (eventMarker == Events[i]) { Undo.RecordObject(this, "Delete Event"); Events.Remove(eventMarker); MxMTaggingWindow.Inst().Repaint(); MxMTaggingWindow.Inst().QueueDeselectEventAction(); break; } } }
public void GenerateModifiedAnimation(MxMPreProcessData a_preProcessData, string a_directory) { EditorUtility.DisplayProgressBar("Generate Modified Animation", "Scraping Old Anims", 0f); if (a_preProcessData != null) m_targetPreProcessData = a_preProcessData; ScrapGeneratedClips(); if (UseSpeedMods) { if (PrimaryClip != null && m_targetPreProcessData != null) { EditorUtility.DisplayProgressBar("Generate Modified Animation", "Copying Clip " + PrimaryClip.name, 0f); GeneratedClip = new AnimationClip(); EditorUtility.CopySerialized(PrimaryClip, GeneratedClip); GeneratedClip.name = PrimaryClip.name + "_MxM_MOD"; var curveBindings = AnimationUtility.GetCurveBindings(GeneratedClip); List<AnimationCurve> workingCurves = new List<AnimationCurve>(curveBindings.Length + 1); List<AnimationEvent> newEvents = new List<AnimationEvent>(); List<MotionSection> motionList = MotionModifier.MotionSections; MotionTimingPresets presets = m_targetPreProcessData.MotionTimingPresets; GeneratedTagTracks = new List<TagTrack>(TagTracks); GeneratedFavourTagTracks = new List<TagTrack>(TagTracks); GeneratedUserBoolTracks = new List<TagTrackBase>(UserBoolTracks); GeneratedLeftFootStepTrack = new FootStepTagTrack(LeftFootStepTrack); GeneratedRightFootStepTrack = new FootStepTagTrack(RightFootStepTrack); GeneratedWarpPositionTrack = new TagTrackBase(WarpPositionTrack); GeneratedWarpRotationTrack = new TagTrackBase(WarpRotationTrack); GeneratedEnableRootMotionTrack = new TagTrackBase(EnableRootMotionTrack); GeneratedPoseFavourTrack = new FloatTagTrack(PoseFavourTrack); GeneratedWarpTrajLatTrack = new TagTrackBase(WarpTrajLatTrack); GeneratedWarpTrajLongTrack = new TagTrackBase(WarpTrajLongTrack); //Create curves but don't add keys for (int i = 0; i < curveBindings.Length; ++i) { workingCurves.Add(new AnimationCurve()); } float cumTimeShift = 0f; //This is the cumulative amount of time shift at the point of modification; float curStartTime = 0f; //The start time for the current motion section int[] startKeyIndex = new int[workingCurves.Count]; //The start key for the current motion section for (int i = 0; i < motionList.Count; ++i) { EditorUtility.DisplayProgressBar("Generate Modified Animation", "Modifying Section " + i + " of " + PrimaryClip.name, ((float)i) / ((float)motionList.Count)); MotionSection motionSection = motionList[i]; float startWarpTime = curStartTime; float endWarpTime = motionSection.EndTime; float warpScale = motionSection.GetSpeedMod(curStartTime, presets, this); float localTimeShift = (endWarpTime - startWarpTime) - (endWarpTime - startWarpTime) * warpScale; //Shift Curve Keys for (int k = 0; k < curveBindings.Length; ++k) { EditorCurveBinding binding = curveBindings[k]; AnimationCurve originalCurve = AnimationUtility.GetEditorCurve(PrimaryClip, binding); AnimationCurve workingCurve = workingCurves[k]; //Make a cut at the end only int endKeyIndex = originalCurve.AddKey(endWarpTime, originalCurve.Evaluate(endWarpTime)); if (endKeyIndex == -1) endKeyIndex = originalCurve.keys.Length - 1; //Add in the intermediate keys scaled relative to the start and shifted by the cumulative time shift for (int keyIndex = startKeyIndex[k]; i < motionList.Count - 1 ? keyIndex < endKeyIndex : keyIndex <= endKeyIndex; ++keyIndex) { Keyframe key = originalCurve.keys[keyIndex]; key.time = startWarpTime + ((key.time - startWarpTime) * warpScale) - cumTimeShift; key.inTangent /= warpScale; key.outTangent /= warpScale; workingCurve.AddKey(key); } startKeyIndex[k] = endKeyIndex; } //Shift Events foreach (AnimationEvent evt in GeneratedClip.events) { if (evt.time > startWarpTime && evt.time < endWarpTime) { //Scale & Shift evt.time = startWarpTime + ((evt.time - startWarpTime) * warpScale) - cumTimeShift; } newEvents.Add(evt); } //Shift MxM Events foreach (EventMarker evt in Events) { EventMarker newMarker = new EventMarker(evt); if (newMarker.EventTime > startWarpTime && evt.EventTime < endWarpTime) { evt.EventTime = startWarpTime + ((evt.EventTime - startWarpTime) * warpScale) - cumTimeShift; } GeneratedEvents.Add(newMarker); } //Shift MXM Tag Points foreach (TagTrack track in GeneratedTagTracks) { List<Vector2> tagList = track.Tags; for (int k = 0; k < tagList.Count; ++k) { Vector2 newTag = tagList[k]; if (newTag.x > startWarpTime && newTag.x < endWarpTime) { newTag.x = startWarpTime + ((newTag.x - startWarpTime) * warpScale) - cumTimeShift; } if (newTag.y > startWarpTime && newTag.y < endWarpTime) { newTag.y = startWarpTime + ((newTag.y - startWarpTime) * warpScale) - cumTimeShift; } tagList[k] = newTag; } } //Shift MXM FavourTag Points foreach (TagTrack track in GeneratedFavourTagTracks) { List<Vector2> tagList = track.Tags; for (int k = 0; k < tagList.Count; ++k) { Vector2 newTag = tagList[k]; if (newTag.x > startWarpTime && newTag.x < endWarpTime) { newTag.x = startWarpTime + ((newTag.x - startWarpTime) * warpScale) - cumTimeShift; } if (newTag.y > startWarpTime && newTag.y < endWarpTime) { newTag.y = startWarpTime + ((newTag.y - startWarpTime) * warpScale) - cumTimeShift; } tagList[k] = newTag; } } //Shift MxM User Tags foreach (TagTrackBase track in GeneratedUserBoolTracks) { ShiftTrackTags(track, startWarpTime, endWarpTime, warpScale, cumTimeShift); } //Shift MxM Utility Tags ShiftTrackTags(GeneratedLeftFootStepTrack, startWarpTime, endWarpTime, warpScale, cumTimeShift); ShiftTrackTags(GeneratedRightFootStepTrack, startWarpTime, endWarpTime, warpScale, cumTimeShift); ShiftTrackTags(GeneratedWarpPositionTrack, startWarpTime, endWarpTime, warpScale, cumTimeShift); ShiftTrackTags(GeneratedWarpRotationTrack, startWarpTime, endWarpTime, warpScale, cumTimeShift); ShiftTrackTags(GeneratedEnableRootMotionTrack, startWarpTime, endWarpTime, warpScale, cumTimeShift); ShiftTrackTags(GeneratedPoseFavourTrack, startWarpTime, endWarpTime, warpScale, cumTimeShift); ShiftTrackTags(GeneratedWarpTrajLatTrack, startWarpTime, endWarpTime, warpScale, cumTimeShift); ShiftTrackTags(GeneratedWarpTrajLongTrack, startWarpTime, endWarpTime, warpScale, cumTimeShift); cumTimeShift += localTimeShift; curStartTime = endWarpTime; } for (int i = 0; i < workingCurves.Count; ++i) { EditorUtility.DisplayProgressBar("Generate Modified Animation", "Generating Curves for clip: " + PrimaryClip.name, ((float)i) / ((float)workingCurves.Count)); AnimationUtility.SetEditorCurve(GeneratedClip, curveBindings[i], workingCurves[i]); } AnimationUtility.SetAnimationEvents(GeneratedClip, newEvents.ToArray()); EditorUtility.SetDirty(GeneratedClip); AssetDatabase.CreateAsset(GeneratedClip, a_directory + "/" + GeneratedClip.name + ".anim"); //AssetDatabase.AddObjectToAsset(GeneratedClip, m_targetPreProcessData); AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(GeneratedClip)); EditorUtility.SetDirty(this); EditorUtility.ClearProgressBar(); } else { Debug.LogWarning("Warning: Cannot generate modified animation with no PrimaryClip in MxMAnimationClipComposite"); } } }