Minor improvement to UV anims

This commit is contained in:
dexy 2019-11-02 20:40:14 +11:00
parent d0eabc095a
commit 68a028dc0b
2 changed files with 49 additions and 23 deletions

View File

@ -75,9 +75,6 @@ namespace CodeWalker.Rendering
public double CurrentAnimTime = 0;
public YcdFile ClipDict;
public ClipMapEntry ClipMapEntry;
public ClipMapEntry ClipMapEntryUV0;
public ClipMapEntry ClipMapEntryUV1;
public Dictionary<ushort, RenderableModel> ModelBoneLinks;
@ -359,16 +356,23 @@ namespace CodeWalker.Rendering
if (ClipMapEntry != null)
{
UpdateAnim(ClipMapEntry); //animate skeleton/models here
UpdateAnim(ClipMapEntry); //animate skeleton/models
}
if (ClipMapEntryUV0 != null)
foreach (var model in HDModels)
{
UpdateAnimUV(ClipMapEntryUV0); //animate UVs
}
if (ClipMapEntryUV1 != null)
{
UpdateAnimUV(ClipMapEntryUV1); //animate UVs
if (model == null) continue;
foreach (var geom in model.Geometries)
{
if (geom == null) continue;
if (geom.ClipMapEntryUV != null)
{
UpdateAnimUV(geom.ClipMapEntryUV, geom); //animate UVs
}
}
}
}
private void UpdateAnim(ClipMapEntry cme)
{
@ -401,6 +405,8 @@ namespace CodeWalker.Rendering
if (bones == null)
{ return; }
//TODO: fragments! see eg. p_oil_pjack_03_s
for (int i = 0; i < anim.BoneIds.data_items.Length; i++)
{
var boneiditem = anim.BoneIds.data_items[i];
@ -465,7 +471,7 @@ namespace CodeWalker.Rendering
}
private void UpdateAnimUV(ClipMapEntry cme)
private void UpdateAnimUV(ClipMapEntry cme, RenderableGeometry rgeom = null)
{
if (cme.Next != null) //is this a "chain" of clips to play..?
{
@ -520,16 +526,24 @@ namespace CodeWalker.Rendering
}
}
foreach (var model in HDModels) //TODO: figure out which models/geometries this should be applying to!
if (rgeom != null)
{
if (model == null) continue;
foreach (var geom in model.Geometries)
rgeom.globalAnimUV0 = globalAnimUV0;
rgeom.globalAnimUV1 = globalAnimUV1;
}
else
{
foreach (var model in HDModels) //TODO: figure out which models/geometries this should be applying to!
{
if (geom == null) continue;
if (geom.globalAnimUVEnable)
if (model == null) continue;
foreach (var geom in model.Geometries)
{
geom.globalAnimUV0 = globalAnimUV0;
geom.globalAnimUV1 = globalAnimUV1;
if (geom == null) continue;
if (geom.globalAnimUVEnable)
{
geom.globalAnimUV0 = globalAnimUV0;
geom.globalAnimUV1 = globalAnimUV1;
}
}
}
}
@ -640,7 +654,7 @@ namespace CodeWalker.Rendering
public float HeightOpacity { get; set; } = 0; //for terrainfoam
public bool HDTextureEnable = true;
public bool globalAnimUVEnable = false;
public ClipMapEntry ClipMapEntryUV = null;
public static ShaderParamNames[] GetTextureSamplerList()
{

View File

@ -2793,11 +2793,23 @@ namespace CodeWalker.Rendering
{
rndbl.ClipDict = ycd;
MetaHash ahash = arche.Hash;
MetaHash ahashuv0 = ahash + 1; //this goes to at least uv5! (from uv0) - see hw1_09.ycd
MetaHash ahashuv1 = ahash + 2;
if (ycd.ClipMap.TryGetValue(ahash, out rndbl.ClipMapEntry)) rndbl.HasAnims = true;
if (ycd.ClipMap.TryGetValue(ahashuv0, out rndbl.ClipMapEntryUV0)) rndbl.HasAnims = true;
if (ycd.ClipMap.TryGetValue(ahashuv1, out rndbl.ClipMapEntryUV1)) rndbl.HasAnims = true;
uint cmeindex = 1;
foreach (var model in rndbl.HDModels)
{
if (model == null) continue;
foreach (var geom in model.Geometries)
{
if (geom == null) continue;
if (geom.globalAnimUVEnable)
{
MetaHash cmehash = ahash + cmeindex; //this goes to at least uv5! (from uv0) - see hw1_09.ycd
if (ycd.ClipMap.TryGetValue(cmehash, out geom.ClipMapEntryUV)) rndbl.HasAnims = true;
cmeindex++;
}
}
}
}
}