From 68a028dc0b61c8d2440f6151ae158fb705163f52 Mon Sep 17 00:00:00 2001 From: dexy Date: Sat, 2 Nov 2019 20:40:14 +1100 Subject: [PATCH] Minor improvement to UV anims --- Rendering/Renderable.cs | 52 ++++++++++++++++++++++++++--------------- Rendering/Renderer.cs | 20 ++++++++++++---- 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index e225e1a..81c4f4d 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -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 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() { diff --git a/Rendering/Renderer.cs b/Rendering/Renderer.cs index 02263c1..761eb51 100644 --- a/Rendering/Renderer.cs +++ b/Rendering/Renderer.cs @@ -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++; + } + } + } } }