From 80b6f3742b17e444639099280db7324bef8865de Mon Sep 17 00:00:00 2001 From: dexy Date: Sat, 2 Nov 2019 06:46:45 +1100 Subject: [PATCH] Experimental UV animations playing from YCD. (some air cons broken!) --- CodeWalker.Core/GameFiles/Resources/Clip.cs | 52 ++++++++- Rendering/Renderable.cs | 117 +++++++++++++++++++- Rendering/Renderer.cs | 34 +++--- Rendering/Shaders/BasicShader.cs | 6 + Rendering/Shaders/CableShader.cs | 9 +- Shaders/BasicVS.hlsli | 11 +- Shaders/BasicVS_PNCCT.cso | Bin 9960 -> 10120 bytes Shaders/BasicVS_PNCCT.hlsl | 2 +- Shaders/BasicVS_PNCCTT.cso | Bin 9984 -> 10144 bytes Shaders/BasicVS_PNCCTT.hlsl | 2 +- Shaders/BasicVS_PNCCTTT.cso | Bin 10008 -> 10168 bytes Shaders/BasicVS_PNCCTTT.hlsl | 2 +- Shaders/BasicVS_PNCCTTTX.cso | Bin 10556 -> 10716 bytes Shaders/BasicVS_PNCCTTTX.hlsl | 2 +- Shaders/BasicVS_PNCCTTX.cso | Bin 10532 -> 10692 bytes Shaders/BasicVS_PNCCTTX.hlsl | 2 +- Shaders/BasicVS_PNCCTX.cso | Bin 10508 -> 10668 bytes Shaders/BasicVS_PNCCTX.hlsl | 2 +- Shaders/BasicVS_PNCT.cso | Bin 9928 -> 10088 bytes Shaders/BasicVS_PNCT.hlsl | 2 +- Shaders/BasicVS_PNCTT.cso | Bin 9952 -> 10112 bytes Shaders/BasicVS_PNCTT.hlsl | 2 +- Shaders/BasicVS_PNCTTTX.cso | Bin 10524 -> 10684 bytes Shaders/BasicVS_PNCTTTX.hlsl | 2 +- Shaders/BasicVS_PNCTTX.cso | Bin 10500 -> 10660 bytes Shaders/BasicVS_PNCTTX.hlsl | 2 +- Shaders/BasicVS_PNCTX.cso | Bin 10476 -> 10636 bytes Shaders/BasicVS_PNCTX.hlsl | 2 +- Shaders/CableVS.cso | Bin 9788 -> 9864 bytes 29 files changed, 212 insertions(+), 39 deletions(-) diff --git a/CodeWalker.Core/GameFiles/Resources/Clip.cs b/CodeWalker.Core/GameFiles/Resources/Clip.cs index 11ee52c..dbb4e9f 100644 --- a/CodeWalker.Core/GameFiles/Resources/Clip.cs +++ b/CodeWalker.Core/GameFiles/Resources/Clip.cs @@ -503,7 +503,9 @@ namespace CodeWalker.GameFiles public override float EvaluateFloat(int frame) { - return Values[Frames[frame]]; + if(frame 0) return Values[0]; + return Offset; } } [TypeConverter(typeof(ExpandableObjectConverter))] public class AnimChannelQuantizeFloat : AnimChannel @@ -531,7 +533,9 @@ namespace CodeWalker.GameFiles public override float EvaluateFloat(int frame) { - return Values[frame]; + if (frame < Values?.Length) return Values[frame]; + if (Values?.Length > 0) return Values[0]; + return Offset; } } [TypeConverter(typeof(ExpandableObjectConverter))] public class AnimChannelLinearFloat : AnimChannel @@ -640,7 +644,9 @@ namespace CodeWalker.GameFiles public override float EvaluateFloat(int frame) { - return Values[frame]; + if (frame < Values?.Length) return Values[frame]; + if (Values?.Length > 0) return Values[0]; + return Offset; } } [TypeConverter(typeof(ExpandableObjectConverter))] public class AnimChannelType7 : AnimChannel @@ -737,6 +743,46 @@ namespace CodeWalker.GameFiles return Quaternion.Identity; } } + + public Vector4 EvaluateVector(int frame) + { + if (Channels == null) return Vector4.Zero; + var v = Vector4.Zero; + int c = 0; + for (int i = 0; i < Channels.Length; i++) + { + if (c >= 4) break; + var channel = Channels[i]; + var sv3c = channel as AnimChannelStaticVector3; + var ssqc = channel as AnimChannelStaticSmallestThreeQuaternion; + if (sv3c != null) + { + for (int n = 0; n < 3; n++) + { + if ((c + n) >= 4) break; + v[c + n] = sv3c.Value[n]; + } + c += 3; + } + else if (ssqc != null) + { + for (int n = 0; n < 4; n++) + { + if ((c + n) >= 4) break; + v[c + n] = sv3c.Value[n]; + } + c += 4; + } + else + { + v[c] = channel.EvaluateFloat(frame); + c++; + } + } + return v; + } + + } [TypeConverter(typeof(ExpandableObjectConverter))] public class Sequence : ResourceSystemBlock { diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index 43df904..69329f1 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -71,6 +71,14 @@ namespace CodeWalker.Rendering public bool HasSkeleton; public bool HasTransforms; + public bool HasAnims = false; + public double CurrentAnimTime = 0; + public YcdFile ClipDict; + public ClipMapEntry ClipMapEntry; + public ClipMapEntry ClipMapEntryUV0; + public ClipMapEntry ClipMapEntryUV1; + + public override void Init(DrawableBase drawable) { @@ -119,7 +127,7 @@ namespace CodeWalker.Rendering VlowModels = new RenderableModel[vlow.Length]; for (int i = 0; i < vlow.Length; i++) { - VlowModels[i] = InitModel(vlow[i]); + VlowModels[i] = InitModel(vlow[i]); AllModels[curmodel + i] = VlowModels[i]; } curmodel += vlow.Length; @@ -330,6 +338,106 @@ namespace CodeWalker.Rendering return Key.ToString(); } + + + public void UpdateAnims(double realTime) + { + if (CurrentAnimTime == realTime) return;//already updated this! + CurrentAnimTime = realTime; + + if (ClipMapEntry != null) + { + UpdateAnim(ClipMapEntry); //animate skeleton/models here + } + if (ClipMapEntryUV0 != null) + { + UpdateAnimUV(ClipMapEntryUV0); //animate UVs + } + if (ClipMapEntryUV1 != null) + { + UpdateAnimUV(ClipMapEntryUV1); //animate UVs + } + } + private void UpdateAnim(ClipMapEntry cme) + { + var clipanim = cme.Clip as ClipAnimation;//maybe ClipAnimationList? + var anim = clipanim?.Animation; + if (anim == null) + { return; } + + //TODO........ + } + private void UpdateAnimUV(ClipMapEntry cme) + { + if (cme.Next != null) //is this a "chain" of clips to play..? + { + //cme = cme.Next; + } + + var clipanim = cme.Clip as ClipAnimation;//maybe ClipAnimationList? + var anim = clipanim?.Animation; + if (anim == null) + { return; } + if (anim.BoneIds?.data_items == null) + { return; } + if (anim.Sequences?.data_items == null) + { return; } + + bool interpolate = true; //how to know? eg. cs4_14_hickbar_anim shouldn't + bool lastFrameSameAsFirst = 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 = (lastFrameSameAsFirst) ? (frames - 1) : frames; + + var curPos = ((CurrentAnimTime % duration) / 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 globalAnimUV0 = new Vector4(1.0f, 0.0f, 0.0f, 0.0f); + var globalAnimUV1 = new Vector4(0.0f, 1.0f, 0.0f, 0.0f); + + + for (int i = 0; i < anim.BoneIds.data_items.Length; i++) + { + var boneiditem = anim.BoneIds.data_items[i]; + var track = boneiditem.Track; + if ((track != 17) && (track != 18)) + { continue; }//17 and 18 would be UV0 and UV1 + + for (int s = 0; s < anim.Sequences.data_items.Length; s++) + { + var seq = anim.Sequences.data_items[s]; + var aseq = seq.Sequences[i]; + var v0 = aseq.EvaluateVector(frame0); + var v1 = aseq.EvaluateVector(frame1); + var v = interpolate ? (v0 * ialpha) + (v1 * falpha) : v0; + switch (track) + { + case 17: globalAnimUV0 = v; break; //could be overwriting values here... + case 18: globalAnimUV1 = v; break; + } + } + } + + foreach (var model in HDModels) //TODO: figure out which models/geometries this should be applying to! + { + if (model == null) continue; + foreach (var geom in model.Geometries) + { + if (geom == null) continue; + if (geom.globalAnimUVEnable) + { + geom.globalAnimUV0 = globalAnimUV0; + geom.globalAnimUV1 = globalAnimUV1; + } + } + } + + } + } public class RenderableModel @@ -424,8 +532,8 @@ namespace CodeWalker.Rendering public float RippleBumpiness { get; set; } = 1.0f; public Vector4 WindGlobalParams { get; set; } = Vector4.Zero; public Vector4 WindOverrideParams { get; set; } = Vector4.One; - public Vector4 globalAnimUV0 { get; set; } = Vector4.Zero; - public Vector4 globalAnimUV1 { get; set; } = Vector4.Zero; + public Vector4 globalAnimUV0 { get; set; } = new Vector4(1.0f, 0.0f, 0.0f, 0.0f); + public Vector4 globalAnimUV1 { get; set; } = new Vector4(0.0f, 1.0f, 0.0f, 0.0f); public Vector4 DirtDecalMask { get; set; } = Vector4.Zero; public bool SpecOnly { get; set; } = false; public float WaveOffset { get; set; } = 0; //for terrainfoam @@ -433,6 +541,7 @@ namespace CodeWalker.Rendering public float WaveMovement { get; set; } = 0; //for terrainfoam public float HeightOpacity { get; set; } = 0; //for terrainfoam public bool HDTextureEnable = true; + public bool globalAnimUVEnable = false; public static ShaderParamNames[] GetTextureSamplerList() @@ -612,9 +721,11 @@ namespace CodeWalker.Rendering break; case ShaderParamNames.globalAnimUV0: globalAnimUV0 = (Vector4)param.Data; + globalAnimUVEnable = true; break; case ShaderParamNames.globalAnimUV1: globalAnimUV1 = (Vector4)param.Data; + globalAnimUVEnable = true; break; case ShaderParamNames.WaveOffset: WaveOffset = ((Vector4)param.Data).X; diff --git a/Rendering/Renderer.cs b/Rendering/Renderer.cs index b0b2bee..47a565c 100644 --- a/Rendering/Renderer.cs +++ b/Rendering/Renderer.cs @@ -2534,6 +2534,13 @@ namespace CodeWalker.Rendering + if (rndbl.HasAnims) + { + rndbl.UpdateAnims(currentRealTime); + } + + + if ((rendercollisionmeshes || (SelectionMode == MapSelectionMode.Collision)) && rendercollisionmeshlayerdrawable) { Drawable sdrawable = rndbl.Key as Drawable; @@ -2779,31 +2786,18 @@ namespace CodeWalker.Rendering Renderable rndbl = renderableCache.GetRenderable(drawable); if (rndbl == null) return null; - if (clipDict != 0) + if ((clipDict != 0) && (rndbl.ClipDict == null)) { YcdFile ycd = gameFileCache.GetYcd(clipDict); if ((ycd != null) && (ycd.Loaded)) { + rndbl.ClipDict = ycd; MetaHash ahash = arche.Hash; - MetaHash ahashuv1 = ahash + 1; - MetaHash ahashuv2 = ahash + 2; - ClipMapEntry cme, cmeuv1, cmeuv2; //this goes to at least uv5! (from uv0) - see hw1_09.ycd - bool found = false; - if (ycd.ClipMap.TryGetValue(ahash, out cme)) - { - found = true; - } - if (ycd.ClipMap.TryGetValue(ahashuv1, out cmeuv1)) - { - found = true; - } - if (ycd.ClipMap.TryGetValue(ahashuv2, out cmeuv2)) - { - found = true; - } - if (!found) - { - } + 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; } } diff --git a/Rendering/Shaders/BasicShader.cs b/Rendering/Shaders/BasicShader.cs index 4a17413..e35f96f 100644 --- a/Rendering/Shaders/BasicShader.cs +++ b/Rendering/Shaders/BasicShader.cs @@ -43,6 +43,8 @@ namespace CodeWalker.Rendering public uint IsDecal; public uint EnableWind; public Vector4 WindOverrideParams; + public Vector4 globalAnimUV0; + public Vector4 globalAnimUV1; } public struct BasicShaderPSSceneVars { @@ -695,6 +697,8 @@ namespace CodeWalker.Rendering VSGeomVars.Vars.IsDecal = DecalMode ? 1u : 0u; VSGeomVars.Vars.EnableWind = windflag; VSGeomVars.Vars.WindOverrideParams = geom.WindOverrideParams; + VSGeomVars.Vars.globalAnimUV0 = geom.globalAnimUV0; + VSGeomVars.Vars.globalAnimUV1 = geom.globalAnimUV1; VSGeomVars.Update(context); VSGeomVars.SetVSCBuffer(context, 4); @@ -811,6 +815,8 @@ namespace CodeWalker.Rendering VSGeomVars.Vars.IsDecal = 0; VSGeomVars.Vars.EnableWind = 0; VSGeomVars.Vars.WindOverrideParams = Vector4.Zero; + VSGeomVars.Vars.globalAnimUV0 = new Vector4(1.0f, 0.0f, 0.0f, 0.0f); + VSGeomVars.Vars.globalAnimUV1 = new Vector4(0.0f, 1.0f, 0.0f, 0.0f); VSGeomVars.Update(context); VSGeomVars.SetVSCBuffer(context, 4); diff --git a/Rendering/Shaders/CableShader.cs b/Rendering/Shaders/CableShader.cs index ba1e6f6..915e8ce 100644 --- a/Rendering/Shaders/CableShader.cs +++ b/Rendering/Shaders/CableShader.cs @@ -40,7 +40,10 @@ namespace CodeWalker.Rendering public uint EnableTint; public float TintYVal; public uint IsDecal; - public uint Pad5; + public uint EnableWind; + public Vector4 WindOverrideParams; + public Vector4 globalAnimUV0; + public Vector4 globalAnimUV1; } public struct CableShaderPSSceneVars { @@ -273,6 +276,10 @@ namespace CodeWalker.Rendering VSGeomVars.Vars.EnableTint = 0u; VSGeomVars.Vars.TintYVal = 0u; VSGeomVars.Vars.IsDecal = 0u; + VSGeomVars.Vars.EnableWind = 0u; + VSGeomVars.Vars.WindOverrideParams = Vector4.Zero; + VSGeomVars.Vars.globalAnimUV0 = Vector4.Zero; + VSGeomVars.Vars.globalAnimUV1 = Vector4.Zero; VSGeomVars.Update(context); VSGeomVars.SetVSCBuffer(context, 4); diff --git a/Shaders/BasicVS.hlsli b/Shaders/BasicVS.hlsli index b18dd9c..0b38ac5 100644 --- a/Shaders/BasicVS.hlsli +++ b/Shaders/BasicVS.hlsli @@ -28,6 +28,8 @@ cbuffer VSGeomVars : register(b4) uint IsDecal; uint EnableWind; float4 WindOverrideParams; + float4 globalAnimUV0; + float4 globalAnimUV1; } cbuffer VSInstGlobals : register(b5) { @@ -312,7 +314,14 @@ float4 ColourTint(float tx, float tx2, uint iid) - +float2 GlobalUVAnim(float2 uv) +{ + float2 r; + float3 uvw = float3(uv, 1); + r.x = dot(globalAnimUV0.xyz, uvw); + r.y = dot(globalAnimUV1.xyz, uvw); + return r; +} diff --git a/Shaders/BasicVS_PNCCT.cso b/Shaders/BasicVS_PNCCT.cso index c047c7e092ad963c46b73d867b4e95c57860d1d4..c7302dec4a243411a927b55b9ebc03828d6976ad 100644 GIT binary patch delta 788 zcmZuvUr3Wt6hHU&ecQL~Yiv&Zntx!0+X{kaWSSw(O$8q!5(<$XQi}et{t$)<1tSng zL@0+qLP1}m(1&8a1VI?}SP()&Z$Z%?dhDS>q2JNFh~a^I&pE%}xxaJn<$gU{I@Z}e zkjw9G>-cg1!Dnt>d4IhA<)1r>h)QW9AACF3BbVsLcA`&VqO}x}3$DMrr}z9+XM;ZA zJ{?TyCO_&%uw~&Z_5wnpHNvyni!VAvPbw7rHN%$5Z}b<-ZUjxNoS05K{MKI=&j1k2 zGG~6tIIwnJ_j`68RD@f6wHAT|f7CJi45Exgyw~a2cdl?{c&N~I`NE|WCo}Ya)qyj7cT^HMPQZ21zReKuJb#v6JQ&WRkM?<0$%GZ*bG>a7u`kV zV$b2_DNWmd_-o)fTY{MN#QXBAP@+ zb^kWt(_5U(0iW3dAK;xqPhBh@3g%VK9E!wbD7jR#%lATqdmaN`GSn**%Veu2mKnZD z%uzR{ewLH&s18PU;KKM7mX9BX`;}Gx9S+rOJjBKsy@?6GtBT(yn!>Y64)bVoJ^BoY{8zCU)-4`S9agoxoJ#)%!v}K6 delta 610 zcmZ8eJxCl;5T5tA=PkP%U0t}vzj%#z3KkL&;?Idcr&SV-q!3ZObSYF$31~;xObLaw<$==D zspB diff --git a/Shaders/BasicVS_PNCCT.hlsl b/Shaders/BasicVS_PNCCT.hlsl index e340406..f44a50e 100644 --- a/Shaders/BasicVS_PNCCT.hlsl +++ b/Shaders/BasicVS_PNCCT.hlsl @@ -28,7 +28,7 @@ VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) output.Position = cpos; output.CamRelPos = opos; output.Normal = bnorm; - output.Texcoord0 = input.Texcoord0; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); output.Texcoord1 = 0.5;// input.Texcoord; output.Texcoord2 = 0.5;// input.Texcoord; output.Colour0 = input.Colour0; diff --git a/Shaders/BasicVS_PNCCTT.cso b/Shaders/BasicVS_PNCCTT.cso index 2956bf79cbfe0269baaa67f7724526d2be234457..54e769b685e7d4426a88611db362e132a598eef2 100644 GIT binary patch delta 814 zcmZuvO=uHQ5T5tkO*Y%LZko_F*kY6>K@d!f)mABuNiFoEP^g5`Lo14Z@rP0mf@1KZ z2ho(dct{|6Qrd$OFM>apdQ>PL#NIslbMoN9Lj}J{Uy6hd%+9>;oA=GUx37GnesW~2 zm@i!VKCt%Y$?Wj%voov3Pb-6pi0T=l5aJO0sYg`VPPE=h6bIf1pBy_retvOemp~7FzOcY$sxAv9fU+{fonQQEIUNcTNL8FVed6Q=x>(Y1DaSlF`aSvW4Jq!1t6GZ z_WY4?U_<;j9M}a=KKF;>7Lp`?)iL`FvaDph-#K#NTi8mXUY^fx=&Z}VWg6+YoHCBtQu!;nOHLzK*A}_kj zSc|U_A^HPdFD7b8Kh(?N6-XnXG{@Uo~(q>xom z(cb?s@JCzh%mc4(ffsp?8>owoVYi^V>L?PEq2y3~9zW=q-uDdfOGB-gTqgT$a+%?W zUSgMJ=Cth69>ktutNN{b5dE2=#HTK_8}sB0Q#an?r%iF@&;2m5L6z;1Ws4d z)ZIxoFQU0eZ(zdjZR59zrs44m+jsdL1msR^#8ennrQR$j7L9Da*y>7y#n HU(%U>g1mB> delta 608 zcmZ8eJxCl;5T5tAms@tvxMt-R<0;p88#{>zL36?AshxjVh$vnqHjz^-6fLeWm0%L4 zRY{iw3ylX>f|Z4WmSRGhR0=9$<4+;@&9Ykf@rLTee!CI=_c9y2hYxI!=^^ zf5Z-iMC%Q&Xum3NLE$k4KNV%)mk#tv%$%c{SXrLFiSuDRSw*PFp;**&E9(Fj-^YF9 zA?5Oa?eVbH?5(Y}N-0o;s)q07T`N#7Us%3L+e8WeXnUp}%;hV~Gc91LFqQ*Li&9e` zSOa=RN;LBL78Ky+9-g$WAL`WuKB!pYlU^Wo%Ou%dLm z{sZ7hoBnA(hch32~bH8)$<4$)koy)fO z9bWa<#WMf|v&@-4 zvJR|`|M@+;04mI_zL)gwc9K=VJ30$C16JfkcLBB7 zGNSxSGj<#Q06ZrXeG{&s2H?5~^^z delta 607 zcmZ8eJxCl;5T5tAms@r(y1IB96HN|}vD zrqF+}i#Rv34$R`) zxNkg^Tt3kr4_S@g#zu>@!lp4*BlhsV6)2Z4E#IVUq6D|vo_P)A@_)-SO+Xc4E(?^B zNp-zIwcyGqnUTY{SRPUCA(D8=Pa@wUOfv`6BdGE_P!7E=Tr3~0zlD50RNe*p94hYv zO$+P!Z=iW}KUTi5`K_HaS12zFMJ0I5_SMV6jNPtE`<+lC)RKLV96ojiGs8%aMx}`e z%NAcEEFvor#>C2LBaOL5|%HUJ{E@)C7F9g9I$q-=| diff --git a/Shaders/BasicVS_PNCCTTT.hlsl b/Shaders/BasicVS_PNCCTTT.hlsl index 75ccc15..27b8cad 100644 --- a/Shaders/BasicVS_PNCCTTT.hlsl +++ b/Shaders/BasicVS_PNCCTTT.hlsl @@ -30,7 +30,7 @@ VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) output.Position = cpos; output.CamRelPos = opos; output.Normal = bnorm; - output.Texcoord0 = input.Texcoord0; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); output.Texcoord1 = input.Texcoord1; output.Texcoord2 = input.Texcoord2; output.Colour0 = input.Colour0; diff --git a/Shaders/BasicVS_PNCCTTTX.cso b/Shaders/BasicVS_PNCCTTTX.cso index 7e635403e5d4974caad2e8d17aa268ab922bce2d..d27fa5b5379fc42ef222b17aaed4e5167ffc2e33 100644 GIT binary patch delta 796 zcmZuvPe>GD6o22>j61VVIqRC!wn}Sc+d|M7R#r&ct}S>Ir4R|y3d-1W2|ENGmL%#R z;qop)N_8{zP;93Vx@bjE)G3m^bc!PAQqZBG-&j38>i+xrA3LU=KUjS^p@^uGB5FYFfzLZcuQwBQHxUg0AB7M0oyc7*^~QC#^K@jl zZV#bu5}!0;&0b)T%$npm?Zp-?q9-*9@oK={DZkZU46_Y1v9h8%Y4N*IYs?2Am=W~+ z7CEpU{u}blEGU<|8d?k_3I433=6PhkWW3ipvhPBE;_O)d_?7X?Cr|nG|EY@>7N%t~ ztOyYrah9)JNp+eZSzat3Cc=%^7w1i>B)Y~Qz}^PihEq*ejh$g-dk5yg`e0?e%w5D; zYza|*Ww3S~Ujd#L&1#j$Y%lf==TX$TaIr$L<`0)_uia`Sx&gF)cLaD*ru26rn?XhW z{zJg;ZP1wkKDz-v%pGA*T`C_AXI1k<6p4u_xzsL)?>3I49s_bbbH; delta 620 zcmZ8eJxCl;5T5tAm)qMrb#>*=^E6zgci4y^ht#sEUSgX8|K@Y`R1E_@7KUde=h%}yXR^7cuK9f zdSd%~L;2{~vm&DQEYSzV7WiPiIwH*hcN#L$CHG990~=T|FRCu;>U2p zxF|V%tz90rTHS+#PHBZLVX8*#<1?#XIsC^;n6yn4<1X7ZSs;i1TCQmWs_}DqptMYC z{tVOzu8fiy1$>Knh;k2s#9Mv=`A%V)b)Y^$wR=DX^g3`cFIfK&dCylq0b2Bx&w!SM zRecGxf$sOpzisZY@i1 c%Fn@;rxT0AS9u}Z7O4b^zzu)PrZ&CM3kOPK?EnA( diff --git a/Shaders/BasicVS_PNCCTTTX.hlsl b/Shaders/BasicVS_PNCCTTTX.hlsl index 6db1419..69147cd 100644 --- a/Shaders/BasicVS_PNCCTTTX.hlsl +++ b/Shaders/BasicVS_PNCCTTTX.hlsl @@ -31,7 +31,7 @@ VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) output.Position = cpos; output.CamRelPos = opos; output.Normal = bnorm; - output.Texcoord0 = input.Texcoord0; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); output.Texcoord1 = input.Texcoord1; output.Texcoord2 = input.Texcoord2; output.Colour0 = input.Colour0; diff --git a/Shaders/BasicVS_PNCCTTX.cso b/Shaders/BasicVS_PNCCTTX.cso index 1d0be061c774c23f1aa9d4590e88566b186beede..7c96dbf9d47af275a8c87dd4170bd98f58b668f6 100644 GIT binary patch delta 785 zcmZuvPe@c@5TEaJpZj)wwQpVRwYJ6<*;5GIjmj+%w_RKEsuUs~(tkl=6Dw<3!J^JeDvo9{RCJ-$~1<-wl5 zp-lGOMrzXdd$hFBxnB3R^yjf6qH+gOJz@&JXc4U)Ac}=h1HTL(=)07=HQRGUpRryK zpVX~>^iANCMy%R8ghXqC=d}}EF`-hW5FdE#^WrD{(`Up$6Du>KU6Vii4@DCI1oL@k zHf0@HinsiZkp*RQvcAcOB+fr{#JGVhAsL@CFLd6_-y0jvU%Weh=gQRt?X8luygVh! zumYCQh;uw?x@v?MOedNT65+TBq;;bQl_G5>is;Ix_zM2~>h&JF`Fh)RDOvKe&L z&hG;LVxN;4;B))nLwqdgsN2Q!!K`Y0i6${wN-lN6;^~IrjwQe)k1Bh)Z1%;=Wrtsq zbJ&Wgf5kRyRR@|{aACZPr~Likpz;-yq0r&$=ZK8ckgvmuoNZTz2$u0Ml?FkDUMyfX y#&`JKlX&Gn$U-^2b5{7{HGD-=+uZGr^BZ?F{1N@~SjC#*Q~bWYTQ&1mySoh*QgbB$ delta 609 zcmZ8eJxCl;5T5tA^)`EJZj;s9oPS&)-fb5GfuLSE?@lX=Q&WUP;Sw!u0+)~?fh5?Z zi6F`}7M@iIf<;cQ4QQcQ8B(g9m4aFb5^Y4kSyl^&H_W#)^UXK=-safP(QNT`zVLRx zd_Lc`JXy$p>mP3VRZ>LM?GrU2zJQP0L{rT~{~i)8W{6hcqs76Yj)iQyK8mfCdvvFP zzK>C&6ymL|W01_sa7}y3ib+(zEg^mgtNo1~eHbxLKqgkEt1qJbH=0Ni`f(@{axP^Z zn8{aB&u~$4_&~cnZuYvXt2t?f&0wlVEb*3^Rt}$;{{i|E zC~pDH2&-)mXdd17m5(icX(f#RC@%>`+5FD(R9EA>RZx###R7>yOZMH3@qVnFoj`gz zEPV>GY%v>R5vhe3FH7=tD!Aqdtu)@-zx9KSB>oJ^D*N#{zRoTCNEm9AHhaiX^ zf;0?h53T6U(i|%5QSf3ef`TW(nAzKrkch`6Y5- zIsOxM%_68ck94IBBx(Mpljc=qzGOUXoj!7{a{KaZHpIRt*zB$GOP*_ z8gZHLSy^?7Us|qLi4oz(+lwovR1)3g&tM;c?Z>GttIaO5vfbk=V12MMUgkD%7JG{* zzcO6AjW>bkMYHT6Ws^exjO;8DpMvh$QDu2x&I{a zr5!p8z?XNxr}#k3RX2iDv7+jIfg&*xC6_wn@RRQ8p;f?dLh5~(i?T0aE*dr@=Y*3~ zKZA_(OxvmbxG-MDLvHS#R7T+SMD|@dL1Z4q_y{^m@px;AV1*D3dqz;=P$dxLxOE$%4WSfFqQRH_2X2Dzde$_8077s>|4 zECVR&7{S5J!mwgWE@xz{|)(85mbb`gY5w%NnX%#>m;(QWW3qlz2$WI!ikaczVm0!9XXn%|5x2K zH+M^vVHFIa5vzQ~&ZuKNYx{|^ON0|IH7;9HNpzXtg1rH@1FPm(O?HZv<8PkhQ}{($Bbs$i8NlP&J%y{I#559a#Zv&isdPb#o!Zs MD!oUw^K3fv5B{QbZ~y=R delta 610 zcmZ8eJxCl;5T5tAmtFQ&v$~1P`4g_u(?SqI2)Vm(>L~;?n8PB7!7D6mgi}Nkv^Ypo zDM6VwrarL9$%>UA7J`kb)lO1GF&1ewO(5SaYl;kSm~X$CZ)Wzr%a_OF`Qq!L;n@$h zu@{!Td{sJl-}bflP!Z8_7tsU6r|@Z)=urbvwUHDA3!I!KjmqWXObaWT&3!V~=?VSYkPtZZN3S^UjvNfGLCC=qLZ%Q`Td z|5$+PlBZMAH7BSRF1Rz=*$wb#Aa4wxH3kM;Id zO68}IN?*Fi%42uGKdGo_a6}PNSRjfZ_h7yBh;D8o`jsGB$`d)@2Kx^8UzqIOqIY|5 zhVr^2ioQ{NipceN4zQ$XlCYt zC?i6c(8yDK%M{c}es26sHBN*ZuMe)e(n)lkKZCsowjH~=tvWlwD&}`jgAKrnyy(ti zFYyjpex)6|j(-4N6wm4#56Aq>Z|qN@FNq~FV#loTWX$g{%|y3>HqK4~4@Ko@4%GxY z8t3l?{&<6vCE!yV;1%8)_tmA^zIa)+JVTR&n379%di=0?X!|R`Z!I-%YjO6~*5YAN zYEF4+wN%S_H+0-=#)a`JbcA0d29;A=PBgWh+e75;g1)HtC)cuIC5x#d2nr9vfoaLw vzB}2~AF+ByuVKP(Yv7wiQ+QtPJi{ZomDC&%d9M;_tZ^RCA5g74moNMS@f~qS delta 609 zcmZ8eJxCl;5T5tE=PtXaZnAKTKPP9AJB1V>K@j!C=xG-;Vv&dkS6GN3TtXmGQ(R*u zh%$|Zilu0CVZ}Bfl0su4Vu8eDFpQ(M6W17O@LHnIw8yN3>Q?G!A|WK2{hSZduJY>nr!iL{_H_>b_V+ z8N^3BL?h|d&Ko*tEZIcW#}wk{INKW@>&t}s1u?O*eSK%~iIr+3)Z@_^0-H((d+mcl)IjRzX*dILb$MPI-J|2PWeXCHbx6n+_n4f7`z40cwf30#HUe zb-o9B1+BD_9wmH>l@aA0;t~J(Iq?0WG|NDvg3_BnCDeLwv2whA6?{3Gd;s)4ntTLQ z5mnO}&RXIu zi=`OLkc}AQWl5e+Mc165?eJ6bt9JGR{29m_!++|>ln#d)YEoQ%QF32ryy$L*JukGf XMm^hyTAohKhc9qC*Q0#?n9KbGKp0^& diff --git a/Shaders/BasicVS_PNCTT.hlsl b/Shaders/BasicVS_PNCTT.hlsl index a96a23b..44a0d38 100644 --- a/Shaders/BasicVS_PNCTT.hlsl +++ b/Shaders/BasicVS_PNCTT.hlsl @@ -28,7 +28,7 @@ VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) output.Position = cpos; output.CamRelPos = opos; output.Normal = bnorm; - output.Texcoord0 = input.Texcoord0; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); output.Texcoord1 = input.Texcoord1; output.Texcoord2 = 0.5;// input.Texcoord; output.Colour0 = input.Colour0; diff --git a/Shaders/BasicVS_PNCTTTX.cso b/Shaders/BasicVS_PNCTTTX.cso index d0d01cfae1e3e83ce41b25744c7fb8f693aec48e..106ebf49bfaa1116c13343d19002e6a12b5ac124 100644 GIT binary patch delta 824 zcmZuvO=uHQ5T3X0HoNI+H;uZ+rWnOE1_U?aPpcGTQiDB+&{CC*uP2JP5e2}rSOa~>3Kz@09mYQQ z#YmUY8A9I#ezM4ocnu-Zn&273kImUoX;8@Hn!Q*3VEizxIA~&JM~#%tA48jC0RX{F zeP&7QAi8-uk4+e~cyxF(sGU>GJ*7k@PdbFE#Z>*W&E6uEoQG z)Esf6YO$JhpBs+56&J>zX| delta 620 zcmZ8eJxCl;5T1S9bJx8yu5RLa@eEh#Z5ISV)C)#W!Oou)Dhh{K*eIt2VnF2@8-;Mk zfYn`yl>rNtZ7dF~#3CeEs-2ZWv`7=vg!s*}rf_(}d^_q>-w-vv- z+c+h>B^VFYvMK;83!ZX;C-P!>Kmas?qn} zBuXJZ+A#*ntTb0tJdv}A4jxO0%VD+G|E{hh`W9qj!*bQV$v@1d1fd^?A|dCGtOK+7 zuNl`aN)BHsm#3|6cWeVznC%-&t{;vWa5+)^@cApMi4db>L$8aQy@1^MP^|Xf;qi z0V)XVf*m(r`5X3t(fBSJNCaB4?|GCjqf?m~r02uZ zN{D5Ptq_YyCB%4HlBY9*YmU%Ye<`-FYL625Gb9(;s~BL^ZH+jeyUPTlNxZ_qLiXwRnSWOAaNlG20!Q` zNXrGS(1L|7ly;$xOTmrZ2nwzWf(ut-*DeIBcy2l=5_;jzz3-g+Id6FPhUSL*2S*A; z_wVbK%Hx64UH9|u^6jTa5z$-^Q43-p{JBFkwUNk55^V*Zg%1rLD_xxI->&yLuSR$2 z&KT+{_~a2A_6~z&R)uG@=PwwdmkkQ>dc-~qKkDz6-2s|dnY0cJe~NAKa{vUhqMlzO z2iC`bVxC2|`Tqs{XJ60aJGJg5Q$sGNE>ZSSlnoNdO zAwnZg^Gy?|Q#@-tznmb#jn@{JZK))>!JolC0Na66Lso;GU={cF&w$N=mGLrn0cWwd zi1I6=wQKky@VsbNUwAC;`O7$;L7fX1yB4ik;mNqyX>BLctga z2~*gpAXo@C$~G2)m1tp7n{-wN5(^s>kU+j!RtrDgFyGGKH~ZfH$l7o=Ki1o47Cw|+ zz1!o-tL?@@OKx5fQ7l9B3jQr@B2F||L3Hw(XfaK+0UOTu57d9jzR^FOHM^7nuk&$dy@KxW&jNfP`R+gv#nEcJGO%UpFCzO#HIX%oe{$M%d2n9KK;XLN$qhp{|Z zQYN*(2Wv&IjFK5ed<#nOau1Qjb9@Q$oOBwWz=ni1?1B|h>%s)3X#FF^OQG^9*m9_R z4z?;?b>G20qxz-tFPppVTH^ufZD~<)p0Rz^7_8fUs(RE3B|GD6o22>j61VVHtSZyrotBKDg>>eWreiu+J?uJLPRi2&|)hI69l294izln z_AVVXs#BpsF&%{t_~4uO-tYJR{J!B^J6GuK?CMKr zem@!oNs@GhpxgpY%7wtOrf3tf)>{{5iBYmINS}5%jE! z99Rec4S8k;l*_GEyA1?!{;H$qFruVHe8@U+cqDh@(opX7^()uTUr5sbSu4%W6=X6j z4-p!Eh9|9r8sKM^7t4i-aO17TIa4Z$Zt)V>dtmF4m1ULLX;!w^J_|MpR>sTRdE{aX z@bW8zwOjZi@RVp)D?DU-u^-4UqRzz;8w=KKaMAV}tZJeupq0BL!1FStyAjbeDk}FM z1O9lM&NT3uZSX$cANJH$|9Ci~YM-J=Ohn104m$j>y1(Tm;I{$wA&5oUmmn4m-zDaV z6IFlwM(4J+oqf14Ud3I0Rnw~sU+wzkT|P==9>Mq>=*YTmX^CLz08=Rtls^RlR&9Kf z&)$ib{(}h0>dju^4^;4_ncC%_O{4xuBBCN6(IBr?EQ(X$2hAt#J%~iG$xF?3#WCX_ DfQocd delta 622 zcmZ8eJxCl;5T5tE=dHV!bI%o*^N*|at`mtM>ILIntPE(h5K%a=(Za9>3j=`&Vu~1o zGOY#+i-3)?O^QG&Nfm3gOQqmR&_YcS$T!Ps;qZp}_M4w?_PtNz)v;oEa;Q}E;ktt| zPKHKG)_ncKsv@Flo~RbF7e1XLdisQDCrwlVAHZLgUktZy7F+bWb1>DR+YIWKl0-Sg zd;5VwGAqy9+Rs)jqW$|6;+r@-5dP9<2~$Ngv9dgUo8+TpQa4ddz?pqdr2J$ukO^+)bzO4V_^KR#C+H~jK=x&Bx#8BmZ dmHCN&c|0)>{*eoX{<=mWQ8K((XxR)B{{hk;Ubz4O diff --git a/Shaders/BasicVS_PNCTX.hlsl b/Shaders/BasicVS_PNCTX.hlsl index dccd76f..92632f0 100644 --- a/Shaders/BasicVS_PNCTX.hlsl +++ b/Shaders/BasicVS_PNCTX.hlsl @@ -28,7 +28,7 @@ VS_OUTPUT main(VS_INPUT input, uint iid : SV_InstanceID) output.Position = cpos; output.CamRelPos = opos; output.Normal = bnorm; - output.Texcoord0 = input.Texcoord0; + output.Texcoord0 = GlobalUVAnim(input.Texcoord0); output.Texcoord1 = 0.5;// input.Texcoord; output.Texcoord2 = 0.5;// input.Texcoord; output.Colour0 = input.Colour0; diff --git a/Shaders/CableVS.cso b/Shaders/CableVS.cso index 6077bacf00078d85ee93a5883e7975a1ed229695..0d135529333db9fe995a0fca39eb23b12a4b29ba 100644 GIT binary patch delta 646 zcmdnv)8T9D65-^`^1WSp>ANPiFQ)75T32dXOp5)MEb2KECD0-04Zc`lQ<v9Zrg*9XSref4Alq*a6rX`brxQ?o4i@o<$%7+@D+t delta 524 zcmYk3F-XHu5QZCU3qP(?r zDT30$O4oue9d%YWCk5*u1$9vHzmSSYj{9W!F+8lmP}74I!oev@3M4p)>tVt zn?qd+5k(_JZHQy=tVz^>r`w4teMC3##pKLv=p@#yz8F`Th}t92x8)@YBev`sgLu|} zEUI=Or$OB+A#S?WX!TZo_J{_=Bo)n4KfUtK>kkn6@sP*WeDQH$n*8zF!a~U>pHxd` zwQ;Llj&mz4kEtqRO4hZ0#V6l1TZDBYQ%>oY7zFv`yJm?AP{_$8L1CUWx&Ru6mPhf7 z9NyX15&0h66@U31apgi{lA3(?M%>TPybvdc~ z#Rtj-mMErN(`}`fVr#Mkcn5^r~ChcA2m3&}BY&(PjKc;-95B N7we((>V|0te*rv8Rk8p8