Peds and weapons rendering support for multiple skeleton instances

This commit is contained in:
dexy 2019-11-27 15:01:43 +11:00
parent 0823702527
commit 783248aeab
5 changed files with 109 additions and 28 deletions

View File

@ -831,10 +831,10 @@ namespace CodeWalker.GameFiles
} }
} }
skel.TransformationsInverted = (Matrix[])TransformationsInverted.Clone(); skel.TransformationsInverted = (Matrix[])TransformationsInverted?.Clone();
skel.Transformations = (Matrix[])Transformations.Clone(); skel.Transformations = (Matrix[])Transformations?.Clone();
skel.ParentIndices = (short[])ParentIndices.Clone(); skel.ParentIndices = (short[])ParentIndices?.Clone();
skel.ChildIndices = (short[])ChildIndices.Clone(); skel.ChildIndices = (short[])ChildIndices?.Clone();
skel.AssignBoneParents(); skel.AssignBoneParents();
skel.BuildBonesMap(); skel.BuildBonesMap();
@ -2657,6 +2657,70 @@ namespace CodeWalker.GameFiles
if (DrawableModelsX != null) list.Add(DrawableModelsX); if (DrawableModelsX != null) list.Add(DrawableModelsX);
return list.ToArray(); return list.ToArray();
} }
public DrawableBase ShallowCopy()
{
DrawableBase r = null;
if (this is FragDrawable fd)
{
var f = new FragDrawable();
f.Unknown_0A8h = fd.Unknown_0A8h;
f.Unknown_0ACh = fd.Unknown_0ACh;
f.FragMatrix = fd.FragMatrix;
f.FragMatricesIndsCount = fd.FragMatricesIndsCount;
f.FragMatricesCount = fd.FragMatricesCount;
f.Count3 = fd.Count3;
f.Count4 = fd.Count4;
f.Bound = fd.Bound;
f.FragMatricesInds = fd.FragMatricesInds;
f.FragMatrices = fd.FragMatrices;
f.Name = fd.Name;
f.OwnerFragment = fd.OwnerFragment;
f.OwnerFragmentCloth = fd.OwnerFragmentCloth;
f.OwnerFragmentPhys = fd.OwnerFragmentPhys;
r = f;
}
if (this is Drawable dd)
{
var d = new Drawable();
d.LightAttributes = dd.LightAttributes;
d.Name = dd.Name;
d.Bound = dd.Bound;
r = d;
}
if (r != null)
{
r.BoundingCenter = BoundingCenter;
r.BoundingSphereRadius = BoundingSphereRadius;
r.BoundingBoxMin = BoundingBoxMin;
r.BoundingBoxMax = BoundingBoxMax;
r.LodDistHigh = LodDistHigh;
r.LodDistMed = LodDistMed;
r.LodDistLow = LodDistLow;
r.LodDistVlow = LodDistVlow;
r.Unknown_80h = Unknown_80h;
r.Unknown_84h = Unknown_84h;
r.Unknown_88h = Unknown_88h;
r.Unknown_8Ch = Unknown_8Ch;
r.Unknown_98h = Unknown_98h;
r.Unknown_9Ah = Unknown_9Ah;
r.ShaderGroup = ShaderGroup;
r.Skeleton = Skeleton?.Clone();
r.DrawableModelsHigh = DrawableModelsHigh;
r.DrawableModelsMedium = DrawableModelsMedium;
r.DrawableModelsLow = DrawableModelsLow;
r.DrawableModelsVeryLow = DrawableModelsVeryLow;
r.DrawableModelsX = DrawableModelsX;
r.Joints = Joints;
r.AllModels = AllModels;
r.VertexDecls = VertexDecls;
r.Owner = Owner;
}
return r;
}
} }
[TypeConverter(typeof(ExpandableObjectConverter))] public class Drawable : DrawableBase [TypeConverter(typeof(ExpandableObjectConverter))] public class Drawable : DrawableBase

View File

@ -34,6 +34,7 @@ namespace CodeWalker.World
public Vector3 Position { get; set; } = Vector3.Zero; public Vector3 Position { get; set; } = Vector3.Zero;
public Quaternion Rotation { get; set; } = Quaternion.Identity; public Quaternion Rotation { get; set; } = Quaternion.Identity;
public YmapEntityDef RenderEntity = new YmapEntityDef(); //placeholder entity object for rendering
public void Init(string name, GameFileCache gfc) public void Init(string name, GameFileCache gfc)
@ -117,6 +118,8 @@ namespace CodeWalker.World
Ycd?.ClipMap?.TryGetValue(cliphash, out cme); Ycd?.ClipMap?.TryGetValue(cliphash, out cme);
AnimClip = cme; AnimClip = cme;
UpdateEntity();
} }
@ -182,7 +185,7 @@ namespace CodeWalker.World
} }
if (d != null) Drawables[index] = d; if (d != null) Drawables[index] = d.ShallowCopy() as Drawable;
if (t != null) Textures[index] = t; if (t != null) Textures[index] = t;
DrawableNames[index] = name; DrawableNames[index] = name;
@ -216,5 +219,13 @@ namespace CodeWalker.World
} }
public void UpdateEntity()
{
RenderEntity.SetPosition(Position);
RenderEntity.SetOrientation(Rotation);
}
} }
} }

View File

@ -16,6 +16,9 @@ namespace CodeWalker.World
public MetaHash NameHash { get; set; } = 0;//base weapon name hash public MetaHash NameHash { get; set; } = 0;//base weapon name hash
public MetaHash ModelHash { get; set; } = 0;//weapon model name hash, can be _hi public MetaHash ModelHash { get; set; } = 0;//weapon model name hash, can be _hi
public YdrFile Ydr { get; set; } = null;
public Drawable Drawable { get; set; } = null;
public YmapEntityDef RenderEntity = new YmapEntityDef(); //placeholder entity object for rendering public YmapEntityDef RenderEntity = new YmapEntityDef(); //placeholder entity object for rendering
public Vector3 Position { get; set; } = Vector3.Zero; public Vector3 Position { get; set; } = Vector3.Zero;
@ -33,6 +36,25 @@ namespace CodeWalker.World
NameHash = modelhash; NameHash = modelhash;
ModelHash = ydrhash; ModelHash = ydrhash;
var useHash = ModelHash;
Ydr = gfc.GetYdr(ModelHash);
if (Ydr == null)
{
useHash = NameHash;
Ydr = gfc.GetYdr(NameHash);
}
while ((Ydr != null) && (!Ydr.Loaded))
{
Thread.Sleep(20);//kinda hacky
Ydr = gfc.GetYdr(useHash);
}
if (Ydr != null)
{
Drawable = Ydr.Drawable?.ShallowCopy() as Drawable;
}
UpdateEntity(); UpdateEntity();
} }

View File

@ -2504,7 +2504,7 @@ namespace CodeWalker.Rendering
return res; return res;
} }
public bool RenderDrawable(DrawableBase drawable, Archetype arche, YmapEntityDef entity, uint txdHash = 0, TextureDictionary txdExtra = null, Texture diffOverride = null, ClipMapEntry animClip = null, Ped ped = null) public bool RenderDrawable(DrawableBase drawable, Archetype arche, YmapEntityDef entity, uint txdHash = 0, TextureDictionary txdExtra = null, Texture diffOverride = null, ClipMapEntry animClip = null)
{ {
//enqueue a single drawable for rendering. //enqueue a single drawable for rendering.
@ -2529,10 +2529,10 @@ namespace CodeWalker.Rendering
rndbl.ResetBoneTransforms(); rndbl.ResetBoneTransforms();
} }
return RenderRenderable(rndbl, arche, entity, ped); return RenderRenderable(rndbl, arche, entity);
} }
private bool RenderRenderable(Renderable rndbl, Archetype arche, YmapEntityDef entity, Ped ped = null) private bool RenderRenderable(Renderable rndbl, Archetype arche, YmapEntityDef entity)
{ {
//enqueue a single renderable for rendering. //enqueue a single renderable for rendering.
@ -2572,15 +2572,6 @@ namespace CodeWalker.Rendering
camrel += position; camrel += position;
distance = entity.Distance; distance = entity.Distance;
} }
else if (ped != null)
{
position = ped.Position;
orientation = ped.Rotation;
bbmin += position;
bbmax += position;
camrel += position;
distance = (camrel + bscen).Length();
}
else else
{ {
distance = (camrel + bscen).Length(); distance = (camrel + bscen).Length();
@ -2751,18 +2742,10 @@ namespace CodeWalker.Rendering
public void RenderWeapon(Weapon weapon, ClipMapEntry animClip = null) public void RenderWeapon(Weapon weapon, ClipMapEntry animClip = null)
{ {
if (weapon?.Drawable != null)
YdrFile ydr = gameFileCache.GetYdr(weapon.ModelHash);
if (ydr == null)
{ {
ydr = gameFileCache.GetYdr(weapon.NameHash);//fallback to low def version? var d = weapon.Drawable;
}
if ((ydr != null) && (ydr.Loaded) && (ydr.Drawable != null))
{
var d = ydr.Drawable;
var txdhash = weapon.NameHash; var txdhash = weapon.NameHash;
RenderDrawable(d, null, weapon.RenderEntity, txdhash, null, null, animClip); RenderDrawable(d, null, weapon.RenderEntity, txdhash, null, null, animClip);
} }
} }
@ -2849,7 +2832,7 @@ namespace CodeWalker.Rendering
if (drawFlag) if (drawFlag)
{ {
RenderDrawable(drawable, null, null, 0, td, texture, ac, ped); RenderDrawable(drawable, null, ped.RenderEntity, 0, td, texture, ac);
} }

View File

@ -489,6 +489,7 @@ namespace CodeWalker.World
{ {
obj.Ped.Position = pos; obj.Ped.Position = pos;
obj.Ped.Rotation = rot; obj.Ped.Rotation = rot;
obj.Ped.UpdateEntity();
obj.Ped.AnimClip = cme; obj.Ped.AnimClip = cme;
} }
if (obj.Prop != null) if (obj.Prop != null)