Cutscene viewer progress, Hash updates

This commit is contained in:
dexy
2019-11-25 20:44:16 +11:00
Unverified
parent dfa62a9803
commit 5a869fa836
23 changed files with 2298 additions and 389 deletions
+22 -55
View File
@@ -483,18 +483,8 @@ namespace CodeWalker.Rendering
{ return; }
bool interpolate = true; //how to know? eg. cs4_14_hickbar_anim shouldn't
bool ignoreLastFrame = true;//if last frame is equivalent to the first one, eg rollercoaster small light "globes" don't
var duration = anim.Duration;
var frames = anim.Frames;
var nframes = (ignoreLastFrame) ? (frames - 1) : frames;
var curPos = (t/duration) * nframes;
var frame0 = ((ushort)curPos) % frames;
var frame1 = (frame0 + 1);// % frames;
var falpha = (float)(curPos - Math.Floor(curPos));
var ialpha = 1.0f - falpha;
var frame = anim.GetFramePosition(t);
var dwbl = this.Key;
var skel = dwbl?.Skeleton;
@@ -502,8 +492,8 @@ namespace CodeWalker.Rendering
if (bones == null)
{ return; }
Vector4 v0, v1, v;
Quaternion q0, q1, q;
Vector4 v;
Quaternion q;
for (int i = 0; i < anim.BoneIds.data_items.Length; i++)
{
@@ -513,50 +503,38 @@ namespace CodeWalker.Rendering
Bone bone = null;
skel?.BonesMap?.TryGetValue(boneiditem.BoneId, out bone);
if (bone == null)
{ continue; }
{
continue;
//skel.BoneTagsMap?.TryGetValue(boneiditem.BoneId, out bone);
//if (bone == null)
//{ continue; }
}
var sfl = anim.SequenceFrameLimit;
var s = frame0 / sfl;
int f0 = frame0 % sfl;
int f1 = f0 + 1;
var seq = anim.Sequences.data_items[s];
var aseq = seq.Sequences[i];
switch (track)
{
case 0: //bone position
v0 = aseq.EvaluateVector(f0);
v1 = aseq.EvaluateVector(f1);
v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0;
v = anim.EvaluateVector4(frame, i, interpolate);
bone.AnimTranslation = v.XYZ();
break;
case 1: //bone orientation
q0 = aseq.EvaluateQuaternion(f0);
q1 = aseq.EvaluateQuaternion(f1);
q = interpolate ? Quaternion.Slerp(q0, q1, falpha) : q0;
q = anim.EvaluateQuaternion(frame, i, interpolate);
bone.AnimRotation = q;
break;
case 2: //scale?
v0 = aseq.EvaluateVector(f0);
v1 = aseq.EvaluateVector(f1);
v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0;
v = anim.EvaluateVector4(frame, i, interpolate);
bone.AnimScale = v.XYZ();
break;
case 5://root motion vector
if (EnableRootMotion)
{
v0 = aseq.EvaluateVector(f0);
v1 = aseq.EvaluateVector(f1);
v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0;
v = anim.EvaluateVector4(frame, i, interpolate);
bone.AnimTranslation += v.XYZ();
}
break;
case 6://quaternion... root rotation
if (EnableRootMotion)
{
q0 = aseq.EvaluateQuaternion(f0);
q1 = aseq.EvaluateQuaternion(f1);
q = interpolate ? Quaternion.Slerp(q0, q1, falpha) : q0;
q = anim.EvaluateQuaternion(frame, i, interpolate);
bone.AnimRotation = q * bone.AnimRotation;
}
break;
@@ -564,6 +542,12 @@ namespace CodeWalker.Rendering
break;
case 8://quaternion... (camera rotation?)
break;
case 24://face stuff?
break;
case 25://face stuff?
break;
case 26://face stuff?
break;
case 27:
case 50:
case 134://single float?
@@ -655,17 +639,8 @@ namespace CodeWalker.Rendering
{ return; }
bool interpolate = true; //how to know? eg. cs4_14_hickbar_anim shouldn't
bool ignoreLastFrame = true;//if last frame is equivalent to the first one, eg rollercoaster small light "globes" don't
var duration = anim.Duration;
var frames = anim.Frames;
var nframes = (ignoreLastFrame) ? (frames - 1) : frames;
var curPos = (t / duration) * nframes;
var frame0 = ((ushort)curPos) % frames;
var frame1 = (frame0 + 1);// % frames;
var falpha = (float)(curPos - Math.Floor(curPos));
var ialpha = 1.0f - falpha;
var frame = anim.GetFramePosition(t);
var globalAnimUV0 = new Vector4(1.0f, 0.0f, 0.0f, 0.0f);
var globalAnimUV1 = new Vector4(0.0f, 1.0f, 0.0f, 0.0f);
@@ -678,16 +653,8 @@ namespace CodeWalker.Rendering
if ((track != 17) && (track != 18))
{ continue; }//17 and 18 would be UV0 and UV1
var sfl = anim.SequenceFrameLimit;
var s = frame0 / sfl;
int f0 = frame0 % sfl;
int f1 = f0 + 1;
var v = anim.EvaluateVector4(frame, i, interpolate);
var seq = anim.Sequences.data_items[s];
var aseq = seq.Sequences[i];
var v0 = aseq.EvaluateVector(f0);
var v1 = aseq.EvaluateVector(f1);
var v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0;
switch (track)
{
case 17: globalAnimUV0 = v; break; //could be overwriting values here...
+92
View File
@@ -138,6 +138,7 @@ namespace CodeWalker.Rendering
private YmapEntityDef SelectedCarGenEntity = new YmapEntityDef(); //placeholder entity object for drawing cars
public DrawableBase SelectedDrawable = null;
public Dictionary<DrawableBase, bool> SelectionDrawableDrawFlags = new Dictionary<DrawableBase, bool>();
public Dictionary<DrawableModel, bool> SelectionModelDrawFlags = new Dictionary<DrawableModel, bool>();
public Dictionary<DrawableGeometry, bool> SelectionGeometryDrawFlags = new Dictionary<DrawableGeometry, bool>();
public bool SelectionFlagsTestAll = false; //to test all renderables for draw flags; for model form
@@ -2718,6 +2719,97 @@ namespace CodeWalker.Rendering
public void RenderPed(Ped ped)
{
YftFile yft = ped.Yft;// GameFileCache.GetYft(SelectedModelHash);
if (yft != null)
{
if (yft.Loaded)
{
if (yft.Fragment != null)
{
//var f = yft.Fragment;
//var txdhash = 0u;// SelectedVehicleHash;// yft.RpfFileEntry?.ShortNameHash ?? 0;
//var namelower = yft.RpfFileEntry?.GetShortNameLower();
//Archetype arch = null;// TryGetArchetype(hash);
//Renderer.RenderFragment(arch, null, f, txdhash);
//seldrwbl = f.Drawable;
}
}
var vi = ped.Ymt?.VariationInfo;
if (vi != null)
{
for (int i = 0; i < 12; i++)
{
RenderPedComponent(ped, i);
}
}
}
}
private void RenderPedComponent(Ped ped, int i)
{
//var compData = ped.Ymt?.VariationInfo?.GetComponentData(i);
var drawable = ped.Drawables[i];
var texture = ped.Textures[i];
//if (compData == null) return;
if (drawable == null) return;
var td = ped.Ytd?.TextureDict;
var ac = ped.AnimClip;
if (ac != null)
{
ac.EnableRootMotion = ped.EnableRootMotion;
}
var skel = ped.Yft?.Fragment?.Drawable?.Skeleton;
if (skel != null)
{
if (drawable.Skeleton == null)
{
drawable.Skeleton = skel;//force the drawable to use this skeleton.
}
else if (drawable.Skeleton != skel)
{
var dskel = drawable.Skeleton; //put the bones of the fragment into the drawable. drawable's bones in this case seem messed up!
for (int b = 0; b < skel.Bones.Count; b++)
{
var srcbone = skel.Bones[b];
var dstbone = srcbone;
if (dskel.BonesMap.TryGetValue(srcbone.Tag, out dstbone))
{
if (srcbone == dstbone) break; //bone reassignment already done!
dskel.Bones[dstbone.Index] = srcbone;
dskel.BonesMap[srcbone.Tag] = srcbone;
}
}
}
}
bool drawFlag = true;
if (!SelectionDrawableDrawFlags.TryGetValue(drawable, out drawFlag))
{ drawFlag = true; }
if (drawFlag)
{
RenderDrawable(drawable, null, null, 0, td, texture, ac);
}
}
private void RenderInteriorCollisionMesh(YmapEntityDef mlo)