mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2026-05-16 10:22:59 +08:00
Cutscene viewer progress, Hash updates
This commit is contained in:
+22
-55
@@ -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...
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user