Example #1
0
        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();
        }
Example #3
0
        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;
        }
Example #4
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;
     }
 }
Example #5
0
        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();
            }
        }
Example #11
0
        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);
        }
Example #12
0
        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;
            }
        }
Example #13
0
        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();
                }
            }
        }
Example #14
0
        /// <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();
        }