Skip to content

Commit

Permalink
timeline is world relative - part1
Browse files Browse the repository at this point in the history
  • Loading branch information
4sval committed Feb 16, 2023
1 parent 8438591 commit 5b5dd8b
Show file tree
Hide file tree
Showing 14 changed files with 618 additions and 550 deletions.
4 changes: 2 additions & 2 deletions FModel/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,10 @@ private async void OnLoaded(object sender, RoutedEventArgs e)
#if DEBUG
await _threadWorkerView.Begin(cancellationToken =>
_applicationView.CUE4Parse.Extract(cancellationToken,
"fortnitegame/Content/Characters/Player/Female/Medium/Heads/F_MED_HIS_Ramirez_Head_01/Mesh/F_MED_HIS_Ramirez_Head_01.uasset"));
"fortnitegame/Content/Characters/Player/Male/Medium/Bodies/M_Med_Soldier_04/Meshes/SK_M_Med_Soldier_04.uasset"));
await _threadWorkerView.Begin(cancellationToken =>
_applicationView.CUE4Parse.Extract(cancellationToken,
"fortnitegame/Content/Animation/Game/MainPlayer/Emotes/Calculated/Emote_Calculated_CMF_Montage.uasset"));
"fortnitegame/Content/Animation/Game/MainPlayer/Emotes/Basketball_Tricks/Basketball_Tricks_Loop_CMM_M.uasset"));
#endif
}

Expand Down
75 changes: 75 additions & 0 deletions FModel/Views/Snooper/Animations/Animation.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using CUE4Parse_Conversion.Animations;
using CUE4Parse.UE4.Objects.Core.Misc;
using CUE4Parse.Utils;

namespace FModel.Views.Snooper.Animations;

public class Animation : IDisposable
{
public readonly Sequence[] Sequences;
public readonly float EndTime; // Animation End Time
public readonly float TotalElapsedTime; // Animation Max Time

public int CurrentSequence;
public int FrameInSequence; // Current Sequence's Frame to Display

public readonly List<FGuid> AttachedModels;

public Animation()
{
Sequences = Array.Empty<Sequence>();
AttachedModels = new List<FGuid>();
}

public Animation(CAnimSet animSet) : this()
{
Sequences = new Sequence[animSet.Sequences.Count];
for (int i = 0; i < Sequences.Length; i++)
{
Sequences[i] = new Sequence(animSet.Sequences[i]);

TotalElapsedTime += animSet.Sequences[i].NumFrames * Sequences[i].TimePerFrame;
EndTime = Sequences[i].EndTime;
}

// if (Sequences.Length > 0)
// Tracker.ElapsedTime = Sequences[0].StartTime;
}

public Animation(CAnimSet animSet, params FGuid[] animatedModels) : this(animSet)
{
AttachedModels.AddRange(animatedModels);
}

public void TimeCalculation(float elapsedTime)
{
for (int i = 0; i < Sequences.Length; i++)
{
if (elapsedTime < Sequences[i].EndTime && elapsedTime >= Sequences[i].StartTime)
{
CurrentSequence = i;
break;
}
}
if (elapsedTime >= TotalElapsedTime) Reset();

var lastEndTime = 0.0f;
for (int s = 0; s < CurrentSequence; s++)
lastEndTime = Sequences[s].EndTime;

FrameInSequence = Math.Min(((elapsedTime - lastEndTime) / Sequences[CurrentSequence].TimePerFrame).FloorToInt(), Sequences[CurrentSequence].EndFrame);
}

private void Reset()
{
FrameInSequence = 0;
CurrentSequence = 0;
}

public void Dispose()
{
AttachedModels.Clear();
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace FModel.Views.Snooper.Models.Animations;
namespace FModel.Views.Snooper.Animations;

public class BoneIndice
{
Expand Down
40 changes: 40 additions & 0 deletions FModel/Views/Snooper/Animations/Sequence.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System.Numerics;
using CUE4Parse_Conversion.Animations;
using CUE4Parse.Utils;
using ImGuiNET;

namespace FModel.Views.Snooper.Animations;

public class Sequence
{
public readonly string Name;
public readonly float TimePerFrame;
public readonly float StartTime;
public readonly float Duration;
public readonly float EndTime;
public readonly int EndFrame;
public readonly int LoopingCount;

public Sequence(CAnimSequence sequence)
{
Name = sequence.Name;
TimePerFrame = 1.0f / sequence.Rate;
StartTime = sequence.StartPos;
Duration = sequence.AnimEndTime;
EndTime = StartTime + Duration;
EndFrame = (Duration / TimePerFrame).FloorToInt() - 1;
LoopingCount = sequence.LoopingCount;
}

private readonly float _height = 20.0f;
public void DrawSequence(ImDrawListPtr drawList, float x, float y, Vector2 ratio, int index, uint col)
{
var height = _height * (index % 2);
var p1 = new Vector2(x + StartTime * ratio.X, y + height);
var p2 = new Vector2(x + EndTime * ratio.X, y + height + _height);
drawList.PushClipRect(p1, p2, true);
drawList.AddRectFilled(p1, p2, col);
drawList.AddText(p1 with { X = p1.X + 2.5f }, 0xFF000000, Name);
drawList.PopClipRect();
}
}

0 comments on commit 5b5dd8b

Please sign in to comment.