diff --git a/Z64Utils/Forms/ObjectAnalyzerForm.cs b/Z64Utils/Forms/ObjectAnalyzerForm.cs index 50ed5eb..529fff7 100644 --- a/Z64Utils/Forms/ObjectAnalyzerForm.cs +++ b/Z64Utils/Forms/ObjectAnalyzerForm.cs @@ -18,7 +18,7 @@ namespace Z64.Forms public partial class ObjectAnalyzerForm : MicrosoftFontForm { byte[] _data; - Z64Object _obj; + public Z64Object _obj; int _segment; Z64Game _game; @@ -350,7 +350,7 @@ namespace Z64.Forms anims.Add((Z64Object.AnimationHolder)e); }); - SkeletonViewerForm form = new SkeletonViewerForm(_game); + SkeletonViewerForm form = new SkeletonViewerForm(_game, _segment); form.SetSegment(_segment, F3DZEX.Memory.Segment.FromBytes("[Current Object]", _data)); form.SetSkeleton(skel, anims); form.Show(); @@ -366,7 +366,7 @@ namespace Z64.Forms anims.Add((Z64Object.AnimationHolder)e); }); - SkeletonViewerForm form = new SkeletonViewerForm(_game); + SkeletonViewerForm form = new SkeletonViewerForm(_game, _segment); form.SetSegment(_segment, F3DZEX.Memory.Segment.FromBytes("[Current Object]", _data)); form.SetSkeleton(skel, anims); form.Show(); diff --git a/Z64Utils/Forms/SkeletonViewerForm.Designer.cs b/Z64Utils/Forms/SkeletonViewerForm.Designer.cs index 9c5b098..dee5359 100644 --- a/Z64Utils/Forms/SkeletonViewerForm.Designer.cs +++ b/Z64Utils/Forms/SkeletonViewerForm.Designer.cs @@ -168,6 +168,7 @@ namespace Z64.Forms this.listBox_anims.Size = new System.Drawing.Size(172, 212); this.listBox_anims.TabIndex = 11; this.listBox_anims.SelectedIndexChanged += new System.EventHandler(this.listBox_anims_SelectedIndexChanged); + this.listBox_anims.DoubleClick += new System.EventHandler(this.listBox_anims_DoubleClick); // // trackBar_anim // diff --git a/Z64Utils/Forms/SkeletonViewerForm.cs b/Z64Utils/Forms/SkeletonViewerForm.cs index a8c92ed..02ebe32 100644 --- a/Z64Utils/Forms/SkeletonViewerForm.cs +++ b/Z64Utils/Forms/SkeletonViewerForm.cs @@ -48,11 +48,17 @@ namespace Z64.Forms short[] _frameData; AnimationJointIndicesHolder.JointIndex[] _curJoints; - public SkeletonViewerForm(Z64Game game) + byte[] _animFile; + int _curSegment = 6; + + public SkeletonViewerForm(Z64Game game, int curSegment) { _game = game; + _curSegment = curSegment; _rendererCfg = new F3DZEX.Render.Renderer.Config(); + + InitializeComponent(); Toolkit.Init(); @@ -68,7 +74,7 @@ namespace Z64.Forms { for (int i = 8; i < 16; i++) { - if (i != 13) + if (i != 13 || _skel is SkeletonHolder) _renderer.Memory.Segments[i] = F3DZEX.Memory.Segment.FromFill("Empty Dlist", new byte[] { 0xDF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }); } } @@ -279,6 +285,11 @@ namespace Z64.Forms trackBar_anim.Maximum = _curAnim.FrameCount - 1; trackBar_anim.Value = 0; + var Saved = _renderer.Memory.Segments[_curSegment]; + + if (_curAnim.extAnim) + _renderer.Memory.Segments[_curSegment] = F3DZEX.Memory.Segment.FromBytes("", _animFile); + byte[] buff = _renderer.Memory.ReadBytes(_curAnim.JointIndices, (_limbs.Count + 1) * AnimationJointIndicesHolder.ENTRY_SIZE); _curJoints = new AnimationJointIndicesHolder("joints", buff).JointIndices; @@ -293,6 +304,8 @@ namespace Z64.Forms buff = _renderer.Memory.ReadBytes(_curAnim.FrameData, (max < _curAnim.StaticIndexMax ? max + 1 : _curAnim.FrameCount + max) * 2); _frameData = new AnimationFrameDataHolder("framedata", buff).FrameData; + _renderer.Memory.Segments[_curSegment] = Saved; + UpdateMatrixBuf(); } @@ -525,5 +538,40 @@ namespace Z64.Forms button_playAnim.BackgroundImage = Properties.Resources.play_icon; button_playbackAnim.BackgroundImage = Properties.Resources.playback_icon; } + + private void listBox_anims_DoubleClick(object sender, EventArgs e) + { + _timer.Stop(); + _playState = PlayState.Pause; + button_playAnim.BackgroundImage = Properties.Resources.play_icon; + button_playbackAnim.BackgroundImage = Properties.Resources.playback_icon; + + OpenFileDialog of = new OpenFileDialog(); + DialogResult DR = of.ShowDialog(); + + if (DR == DialogResult.OK) + { + _animFile = File.ReadAllBytes(of.FileName); + + using (var form = new ObjectAnalyzerForm(_game, _animFile, _curSegment)) + { + _anims.Clear(); + + form._obj.Entries.ForEach(e => + { + if (e is Z64Object.AnimationHolder) + { + (e as Z64Object.AnimationHolder).extAnim = true; + (e as Z64Object.AnimationHolder).Name = "ext_" + (e as Z64Object.AnimationHolder).Name; + _anims.Add((Z64Object.AnimationHolder)e); + } + }); + } + + listBox_anims.Items.Clear(); + _anims.ForEach(a => listBox_anims.Items.Add(a.Name)); + } + + } } } diff --git a/Z64Utils/Program.cs b/Z64Utils/Program.cs index f20b0d4..9af96db 100644 --- a/Z64Utils/Program.cs +++ b/Z64Utils/Program.cs @@ -13,6 +13,13 @@ namespace Z64 { static class Program { + + [System.Runtime.InteropServices.DllImport("nvapi64.dll", EntryPoint = "fake")] + static extern int LoadNvApi64(); + + [System.Runtime.InteropServices.DllImport("nvapi.dll", EntryPoint = "fake")] + static extern int LoadNvApi32(); + /// /// Point d'entrée principal de l'application. /// @@ -21,9 +28,20 @@ namespace Z64 { Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); + try + { + if (Environment.Is64BitProcess) + LoadNvApi64(); + else + LoadNvApi32(); + } + catch { } + Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); + + } } } \ No newline at end of file diff --git a/Z64Utils/Z64/Z64Object.cs b/Z64Utils/Z64/Z64Object.cs index 19ba162..481ad25 100644 --- a/Z64Utils/Z64/Z64Object.cs +++ b/Z64Utils/Z64/Z64Object.cs @@ -380,6 +380,8 @@ namespace Z64 public SegmentedAddress JointIndices { get; set; } public ushort StaticIndexMax { get; set; } + public bool extAnim { get; set; } + public AnimationHolder(string name, byte[] data) : base(name) { SetData(data);