Animations playback improvement?

This commit is contained in:
dexy 2019-11-08 17:54:46 +11:00
parent 9fc219e332
commit 8bea5281f0
2 changed files with 19 additions and 41 deletions

View File

@ -279,10 +279,7 @@ namespace CodeWalker.GameFiles
public ushort Frames { get; set; } public ushort Frames { get; set; }
public ushort SequenceFrameLimit { get; set; } public ushort SequenceFrameLimit { get; set; }
public float Duration { get; set; } public float Duration { get; set; }
public byte Unknown_1Ch { get; set; } public MetaHash Unknown_1Ch { get; set; }
public byte Unknown_1Dh { get; set; }
public byte Unknown_1Eh { get; set; }
public byte Unknown_1Fh { get; set; }
public uint Unknown_20h { get; set; } // 0x00000000 public uint Unknown_20h { get; set; } // 0x00000000
public uint Unknown_24h { get; set; } // 0x00000000 public uint Unknown_24h { get; set; } // 0x00000000
public uint Unknown_28h { get; set; } // 0x00000000 public uint Unknown_28h { get; set; } // 0x00000000
@ -311,10 +308,7 @@ namespace CodeWalker.GameFiles
this.Frames = reader.ReadUInt16(); //221 17 151 201 frames this.Frames = reader.ReadUInt16(); //221 17 151 201 frames
this.SequenceFrameLimit = reader.ReadUInt16(); //223 31 159 207 sequence limit? this.SequenceFrameLimit = reader.ReadUInt16(); //223 31 159 207 sequence limit?
this.Duration = reader.ReadSingle(); //7.34 0.53 5.0 6.66 duration this.Duration = reader.ReadSingle(); //7.34 0.53 5.0 6.66 duration
this.Unknown_1Ch = reader.ReadByte(); //118 0 216 116 this.Unknown_1Ch = reader.ReadUInt32();
this.Unknown_1Dh = reader.ReadByte(); //152 36 130 182
this.Unknown_1Eh = reader.ReadByte(); //99 0 66 180
this.Unknown_1Fh = reader.ReadByte(); //205 107 44 26
this.Unknown_20h = reader.ReadUInt32(); //0 0 0 0 this.Unknown_20h = reader.ReadUInt32(); //0 0 0 0
this.Unknown_24h = reader.ReadUInt32(); //0 0 0 0 this.Unknown_24h = reader.ReadUInt32(); //0 0 0 0
this.Unknown_28h = reader.ReadUInt32(); //0 0 0 0 this.Unknown_28h = reader.ReadUInt32(); //0 0 0 0
@ -343,7 +337,6 @@ namespace CodeWalker.GameFiles
writer.Write(this.SequenceFrameLimit); writer.Write(this.SequenceFrameLimit);
writer.Write(this.Duration); writer.Write(this.Duration);
writer.Write(this.Unknown_1Ch); writer.Write(this.Unknown_1Ch);
writer.Write(this.Unknown_1Eh);
writer.Write(this.Unknown_20h); writer.Write(this.Unknown_20h);
writer.Write(this.Unknown_24h); writer.Write(this.Unknown_24h);
writer.Write(this.Unknown_28h); writer.Write(this.Unknown_28h);
@ -749,7 +742,7 @@ namespace CodeWalker.GameFiles
public Vector4 EvaluateVector(int frame) public Vector4 EvaluateVector(int frame)
{ {
if (Channels == null) return Vector4.Zero; if (Channels == null) return Vector4.Zero;
if (IsType7Quat) return EvaluateQuaternion(frame).ToVector4(); if (IsType7Quat) return Quaternion.Normalize(EvaluateQuaternion(frame)).ToVector4();//normalization shouldn't be necessary, but saves explosions in case of incorrectness
var v = Vector4.Zero; var v = Vector4.Zero;
int c = 0; int c = 0;
for (int i = 0; i < Channels.Length; i++) for (int i = 0; i < Channels.Length; i++)
@ -1140,32 +1133,6 @@ namespace CodeWalker.GameFiles
}; };
} }
[TypeConverter(typeof(ExpandableObjectConverter))] public class SequencePart1
{
public byte[] Data { get; set; }
public void Init(byte[] data, int offset, int length)
{
Data = new byte[length];
Buffer.BlockCopy(data, offset, Data, 0, length);
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
if (Data != null)
{
foreach (var b in Data)
{
if (sb.Length > 0) sb.Append(" ");
sb.Append(b.ToString().PadLeft(3, '0'));
}
}
return sb.ToString();
}
}
[TypeConverter(typeof(ExpandableObjectConverter))] public class ClipMapEntry : ResourceSystemBlock [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipMapEntry : ResourceSystemBlock
{ {
@ -1232,6 +1199,7 @@ namespace CodeWalker.GameFiles
{ {
return Clip?.Name ?? Hash.ToString(); return Clip?.Name ?? Hash.ToString();
} }
} }
[TypeConverter(typeof(ExpandableObjectConverter))] public class ClipBase : ResourceSystemBlock, IResourceXXSystemBlock [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipBase : ResourceSystemBlock, IResourceXXSystemBlock
{ {
@ -1488,6 +1456,15 @@ namespace CodeWalker.GameFiles
if (Animations != null) list.Add(Animations); if (Animations != null) list.Add(Animations);
return list.ToArray(); return list.ToArray();
} }
public float GetPlaybackTime(double currentTime)
{
double scaledTime = currentTime;// * Rate;
double duration = Duration;// EndTime - StartTime;
double curpos = scaledTime % duration;
return /*StartTime +*/ (float)curpos;
}
} }
[TypeConverter(typeof(ExpandableObjectConverter))] public class ClipAnimationsEntry : ResourceSystemBlock [TypeConverter(typeof(ExpandableObjectConverter))] public class ClipAnimationsEntry : ResourceSystemBlock
{ {

View File

@ -412,19 +412,19 @@ namespace CodeWalker.Rendering
} }
var clipanim = cme.Clip as ClipAnimation; var clipanim = cme.Clip as ClipAnimation;
var anim = clipanim?.Animation; if (clipanim?.Animation != null)
if (anim != null)
{ {
UpdateAnim(anim, clipanim.GetPlaybackTime(CurrentAnimTime)); UpdateAnim(clipanim.Animation, clipanim.GetPlaybackTime(CurrentAnimTime));
} }
var clipanimlist = cme.Clip as ClipAnimationList; var clipanimlist = cme.Clip as ClipAnimationList;
if (clipanimlist?.Animations != null) if (clipanimlist?.Animations != null)
{ {
float t = clipanimlist.GetPlaybackTime(CurrentAnimTime);
foreach (var canim in clipanimlist.Animations) foreach (var canim in clipanimlist.Animations)
{ {
if (canim?.Animation == null) continue; if (canim?.Animation == null) continue;
UpdateAnim(canim.Animation, canim.GetPlaybackTime(CurrentAnimTime)); UpdateAnim(canim.Animation, t*canim.Rate + canim.StartTime);
} }
} }
@ -553,10 +553,11 @@ namespace CodeWalker.Rendering
var clipanimlist = cme.Clip as ClipAnimationList; var clipanimlist = cme.Clip as ClipAnimationList;
if (clipanimlist?.Animations != null) if (clipanimlist?.Animations != null)
{ {
float t = clipanimlist.GetPlaybackTime(CurrentAnimTime);
foreach (var canim in clipanimlist.Animations) foreach (var canim in clipanimlist.Animations)
{ {
if (canim?.Animation == null) continue; if (canim?.Animation == null) continue;
UpdateAnimUV(canim.Animation, canim.GetPlaybackTime(CurrentAnimTime), rgeom); UpdateAnimUV(canim.Animation, t*canim.Rate + canim.StartTime, rgeom);
} }
} }