public static KeyframeCollection DecodeKeyframes(VoidPtr entry, NW4RAnimationNode node, int arrayCount, params float[] defaults) { //If the node is null, assume the programmer has created a new entry and accessed //the keyframe collection for the first time before assigning the parent and will //set the frame count later manually. int numFrames = node == null ? 1 : node.FrameCount + (node.Loop ? 1 : 0); KeyframeCollection kf; if (node is CHR0Node && entry) { kf = DecodeCHR0Keyframes((CHR0Entry *)entry, numFrames); } else if (node is SRT0Node && entry) { kf = DecodeSRT0Keyframes((SRT0TextureEntry *)entry, numFrames); } else { kf = new KeyframeCollection(arrayCount, numFrames, defaults); } kf.Loop = node.Loop; return(kf); }
private void resizeToolStripMenuItem_Click(object sender, EventArgs e) { if (TargetModel == null) { return; } NW4RAnimationNode node = TargetAnimation; if (node is CHR0Node) { (node as CHR0Node).Resize(); } else if (node is SRT0Node) { (node as SRT0Node).Resize(); } else if (node is SHP0Node) { (node as SHP0Node).Resize(); } else if (node is PAT0Node) { (node as PAT0Node).Resize(); } else if (node is VIS0Node) { (node as VIS0Node).Resize(); } AnimChanged(); }
public override void OnAnimationChanged() { NW4RAnimationNode node = TargetAnimation; selectedAnimationToolStripMenuItem.Enabled = node != null; portToolStripMenuItem.Enabled = node is CHR0Node; mergeToolStripMenuItem.Enabled = node != null && Array.IndexOf(Mergeable, node.GetType()) >= 0; resizeToolStripMenuItem.Enabled = node != null && Array.IndexOf(Resizable, node.GetType()) >= 0; appendToolStripMenuItem.Enabled = node != null && Array.IndexOf(Appendable, node.GetType()) >= 0; int i = -1; bool hasKeys = node != null && !(node is SCN0Node) && (i = Array.IndexOf(Interpolated, node.GetType())) >= 0; string s = i == 0 ? (SelectedBone != null ? SelectedBone.Name : "entry") : i == 1 ? (TargetTexRef != null ? TargetTexRef.Name : "entry") : i == 2 ? (shp0Editor.VertexSetDest != null ? shp0Editor.VertexSetDest.Name : "entry") : "entry"; averageboneStartendTangentsToolStripMenuItem.Enabled = hasKeys && s != "entry"; averageboneStartendTangentsToolStripMenuItem.Text = String.Format("Average {0} start/end keyframes", s); averageAllStartEndTangentsToolStripMenuItem.Enabled = node != null && Array.IndexOf(Interpolated, node.GetType()) >= 0; //syncStartendTangentsToolStripMenuItem.Enabled = node != null && Array.IndexOf(Interpolated, node.GetType()) >= 0; }
public void SetAnimation(NW4RAnimationNode value) { if (value is CHR0Node) { SelectedCHR0 = value as CHR0Node; } else if (value is SRT0Node) { SelectedSRT0 = value as SRT0Node; } else if (value is SHP0Node) { SelectedSHP0 = value as SHP0Node; } else if (value is PAT0Node) { SelectedPAT0 = value as PAT0Node; } else if (value is VIS0Node) { SelectedVIS0 = value as VIS0Node; } else if (value is SCN0Node) { SelectedSCN0 = value as SCN0Node; } else if (value is CLR0Node) { SelectedCLR0 = value as CLR0Node; } }
public virtual void SetCorrespondingAnimation(NW4RAnimType focusType, NW4RAnimType targetType) { _updating = true; NW4RAnimationNode focusFile = GetAnimation(focusType); SetAnimation(targetType, focusFile == null ? null : FindCorrespondingAnimation(focusFile, targetType)); _updating = false; }
protected override NW4RAnimationNode FindCorrespondingAnimation(NW4RAnimationNode focusFile, NW4RAnimType targetType) { string name = focusFile.Name; if (listPanel._animations.ContainsKey(name) && listPanel._animations[name].ContainsKey(targetType)) { return(listPanel._animations[name][targetType]); } return(null); }
private void mergeToolStripMenuItem_Click(object sender, EventArgs e) { if (TargetModel == null) { return; } NW4RAnimationNode node = TargetAnimation; if (node is CHR0Node) { (node as CHR0Node).MergeWith(); } AnimChanged(); }
private void portToolStripMenuItem_Click(object sender, EventArgs e) { if (TargetModel == null || !(TargetModel is MDL0Node)) { return; } NW4RAnimationNode node = TargetAnimation; if (node is CHR0Node) { (node as CHR0Node).Port((MDL0Node)TargetModel); } AnimChanged(); }
private void averageboneStartendTangentsToolStripMenuItem_Click(object sender, EventArgs e) { NW4RAnimationNode n = TargetAnimation; if (n is CHR0Node && SelectedBone != null) { ((CHR0Node)n).AverageKeys(SelectedBone.Name); } if (n is SRT0Node && TargetTexRef != null) { ((SRT0Node)n).AverageKeys(TargetTexRef.Parent.Name, TargetTexRef.Index); } if (n is SHP0Node && SHP0Editor.SelectedDestination != null && SHP0Editor.VertexSetDest != null) { ((SHP0Node)n).AverageKeys(SHP0Editor.SelectedDestination, SHP0Editor.VertexSetDest.Name); } }
private void averageAllStartEndTangentsToolStripMenuItem_Click(object sender, EventArgs e) { NW4RAnimationNode n = TargetAnimation; if (n is CHR0Node) { ((CHR0Node)n).AverageKeys(); } if (n is SRT0Node) { ((SRT0Node)n).AverageKeys(); } if (n is SHP0Node) { ((SHP0Node)n).AverageKeys(); } }
protected virtual NW4RAnimationNode FindCorrespondingAnimation(NW4RAnimationNode focusFile, NW4RAnimType targetType) { NW4RAnimationNode node; if (TargetModel != null && (node = FindAnimation((ResourceNode)TargetModel, focusFile.Name, targetType)) != null) { return(node); } foreach (ResourceNode r in _openedFiles) { if (r != null && (node = FindAnimation(r, focusFile.Name, targetType)) != null) { return(node); } } return(null); }
public void SetAnimation(NW4RAnimType type, NW4RAnimationNode value) { switch (type) { case NW4RAnimType.CHR: SelectedCHR0 = value as CHR0Node; break; case NW4RAnimType.SRT: SelectedSRT0 = value as SRT0Node; break; case NW4RAnimType.SHP: SelectedSHP0 = value as SHP0Node; break; case NW4RAnimType.PAT: SelectedPAT0 = value as PAT0Node; break; case NW4RAnimType.VIS: SelectedVIS0 = value as VIS0Node; break; case NW4RAnimType.SCN: SelectedSCN0 = value as SCN0Node; break; case NW4RAnimType.CLR: SelectedCLR0 = value as CLR0Node; break; } }
public virtual void SetFrame(int index) { if (index < 0) { return; } NW4RAnimationNode node = TargetAnimation; int loopMax = _maxFrame + (node != null && node.Loop && Interpolated.Contains(node.GetType()) ? 1 : 0); if (index > loopMax) { return; } CurrentFrame = index; if (PlaybackPanel != null) { if (PlaybackPanel.InvokeRequired) { Action <int, int> d = new Action <int, int>(PlaybackPanel.UpdateInterface); this.Invoke(d, new object[] { _animFrame, loopMax }); } else { PlaybackPanel.UpdateInterface(_animFrame, loopMax); } } if (!_playing) { if (InterpolationEditor != null && InterpolationEditor.Visible) { InterpolationEditor.Frame = CurrentFrame; } if (KeyframePanel != null) { KeyframePanel.numFrame_ValueChanged(); } } }
/// <summary> /// Updates controls when the target animation has changed. /// Does nothing if the type does not match the current target type. /// </summary> public void AnimChanged(NW4RAnimType type) { if (type != TargetAnimType && type != NW4RAnimType.None) { return; } UpdateEditor(); UpdateKeyframePanel(); NW4RAnimationNode node = GetAnimation(type); if (node == null) { _maxFrame = 0; EnableTransformEdit = true; _updating = true; PlaybackPanel.numFrameIndex.Maximum = _maxFrame; PlaybackPanel.numTotalFrames.Minimum = 0; PlaybackPanel.numTotalFrames.Value = 0; PlaybackPanel.btnPlay.Enabled = PlaybackPanel.numTotalFrames.Enabled = PlaybackPanel.numFrameIndex.Enabled = PlaybackPanel.btnLast.Enabled = PlaybackPanel.btnFirst.Enabled = PlaybackPanel.Enabled = false; _updating = false; GetFiles(NW4RAnimType.None); SetFrame(0); } else { int loopBias = node.Loop && Interpolated.Contains(node.GetType()) ? 1 : 0; _maxFrame = node.FrameCount; EnableTransformEdit = !_playing; _updating = true; PlaybackPanel.btnPlay.Enabled = PlaybackPanel.numFrameIndex.Enabled = PlaybackPanel.numTotalFrames.Enabled = PlaybackPanel.Enabled = true; PlaybackPanel.numTotalFrames.Minimum = loopBias + 1; PlaybackPanel.numTotalFrames.Value = (decimal)(_maxFrame + loopBias); PlaybackPanel.numFrameIndex.Maximum = (decimal)(_maxFrame + loopBias); _updating = false; GetFiles(TargetAnimType); SetFrame(1); } //UpdateModel(); //UpdatePropDisplay(); OnAnimationChanged(); }