From 6c76726131b1c8f9d85341f385ea6e3db6bff9b9 Mon Sep 17 00:00:00 2001 From: dexy Date: Sun, 8 Dec 2019 05:42:06 +1100 Subject: [PATCH] Added LOD manager, improved shadows performance --- .../GameFiles/FileTypes/YmapFile.cs | 16 +- CodeWalker.Shaders/Shadowmap.hlsli | 4 +- CodeWalker.csproj | 3 + Rendering/Renderer.cs | 553 +++++++++++++----- Rendering/ShaderManager.cs | 2 +- Rendering/Utils/Shadowmap.cs | 15 +- Shaders/BasicPS.cso | Bin 11076 -> 11092 bytes Shaders/BasicVS_Box.cso | Bin 4548 -> 4560 bytes Shaders/BasicVS_Capsule.cso | Bin 5208 -> 5220 bytes Shaders/BasicVS_Cylinder.cso | Bin 5256 -> 5268 bytes Shaders/BasicVS_PBBNCCT.cso | Bin 11832 -> 11844 bytes Shaders/BasicVS_PBBNCCTTX.cso | Bin 12556 -> 12568 bytes Shaders/BasicVS_PBBNCCTX.cso | Bin 12532 -> 12544 bytes Shaders/BasicVS_PBBNCT.cso | Bin 11800 -> 11812 bytes Shaders/BasicVS_PBBNCTT.cso | Bin 11824 -> 11836 bytes Shaders/BasicVS_PBBNCTTT.cso | Bin 11848 -> 11860 bytes Shaders/BasicVS_PBBNCTTX.cso | Bin 12524 -> 12536 bytes Shaders/BasicVS_PBBNCTX.cso | Bin 12500 -> 12512 bytes Shaders/BasicVS_PNCCT.cso | Bin 10120 -> 10132 bytes Shaders/BasicVS_PNCCTT.cso | Bin 10144 -> 10156 bytes Shaders/BasicVS_PNCCTTT.cso | Bin 10168 -> 10180 bytes Shaders/BasicVS_PNCCTTTX.cso | Bin 10716 -> 10728 bytes Shaders/BasicVS_PNCCTTX.cso | Bin 10692 -> 10704 bytes Shaders/BasicVS_PNCCTX.cso | Bin 10668 -> 10680 bytes Shaders/BasicVS_PNCT.cso | Bin 10088 -> 10100 bytes Shaders/BasicVS_PNCTT.cso | Bin 10112 -> 10124 bytes Shaders/BasicVS_PNCTTT.cso | Bin 10136 -> 10148 bytes Shaders/BasicVS_PNCTTTX.cso | Bin 10684 -> 10696 bytes Shaders/BasicVS_PNCTTX.cso | Bin 10660 -> 10672 bytes Shaders/BasicVS_PNCTX.cso | Bin 10636 -> 10648 bytes Shaders/BasicVS_Sphere.cso | Bin 4456 -> 4468 bytes Shaders/CablePS.cso | Bin 7112 -> 7128 bytes Shaders/CableVS.cso | Bin 9864 -> 9876 bytes Shaders/DirLightPS.cso | Bin 7476 -> 7492 bytes Shaders/DirLightPS_MS.cso | Bin 40856 -> 40900 bytes Shaders/TerrainPS.cso | Bin 13324 -> 13340 bytes Shaders/TerrainVS_PNCCT.cso | Bin 4908 -> 4920 bytes Shaders/TerrainVS_PNCCTT.cso | Bin 4932 -> 4944 bytes Shaders/TerrainVS_PNCCTTTX.cso | Bin 5504 -> 5516 bytes Shaders/TerrainVS_PNCCTTX.cso | Bin 5480 -> 5492 bytes Shaders/TerrainVS_PNCCTX.cso | Bin 5456 -> 5468 bytes Shaders/TerrainVS_PNCTTTX.cso | Bin 5480 -> 5492 bytes Shaders/TerrainVS_PNCTTX.cso | Bin 5456 -> 5468 bytes Shaders/WaterPS.cso | Bin 9888 -> 9904 bytes Shaders/WaterVS_PCT.cso | Bin 4596 -> 4608 bytes Shaders/WaterVS_PNCT.cso | Bin 4600 -> 4612 bytes Shaders/WaterVS_PNCTX.cso | Bin 5016 -> 5028 bytes Shaders/WaterVS_PT.cso | Bin 4092 -> 4104 bytes WorldForm.Designer.cs | 30 +- 49 files changed, 452 insertions(+), 171 deletions(-) diff --git a/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs b/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs index 08d59f8..f826cb9 100644 --- a/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs +++ b/CodeWalker.Core/GameFiles/FileTypes/YmapFile.cs @@ -42,6 +42,8 @@ namespace CodeWalker.GameFiles public YmapFile[] ChildYmaps = null; public bool MergedWithParent = false; + public bool IsScripted { get { return (_CMapData.flags & 1) > 0; } } + public YmapGrassInstanceBatch[] GrassInstanceBatches { get; set; } public YmapPropInstanceBatch[] PropInstanceBatches { get; set; } @@ -1283,6 +1285,8 @@ namespace CodeWalker.GameFiles public Vector3 BBExtent; //oriented archetype AABB extent public Vector3 BSCenter; //oriented archetype BS center public float BSRadius;//cached from archetype + public float LodDist; + public float ChildLodDist; public CEntityDef _CEntityDef; public CEntityDef CEntityDef { get { return _CEntityDef; } set { _CEntityDef = value; } } @@ -1402,7 +1406,7 @@ namespace CodeWalker.GameFiles if (BSRadius == 0.0f) { - BSRadius = _CEntityDef.lodDist;//need something so it doesn't get culled... + BSRadius = LodDist;//need something so it doesn't get culled... } if (BBMin == BBMax) { @@ -1487,6 +1491,16 @@ namespace CodeWalker.GameFiles BBMin = ncenter - nextent; BBMax = ncenter + nextent; } + LodDist = _CEntityDef.lodDist; + if (LodDist <= 0) + { + LodDist = Archetype.LodDist; + } + ChildLodDist = _CEntityDef.childLodDist; + if (ChildLodDist < 0) + { + ChildLodDist = LodDist * 0.5f; + } } } diff --git a/CodeWalker.Shaders/Shadowmap.hlsli b/CodeWalker.Shaders/Shadowmap.hlsli index 6b6f46b..1dba4ed 100644 --- a/CodeWalker.Shaders/Shadowmap.hlsli +++ b/CodeWalker.Shaders/Shadowmap.hlsli @@ -25,7 +25,7 @@ cbuffer ShadowmapVars : register(b1) float CascadeCountInv; float TexelSize; float TexelSizeX; - float Pad20; + float ShadowMaxDistance; //2000 or so }; @@ -233,7 +233,7 @@ float3 FullLighting(float3 diff, float3 spec, float3 norm, float4 vc0, uniform S if (enableShadows == 1) { //float shadowdepth = input.Shadows.x;// *0.000001; - if (abs(shadowdepth) < 2000)//2km + if (abs(shadowdepth) < ShadowMaxDistance)//2km { //float4 shadowcoord = input.LightShadow; //float4 shadowcolour = (float4)1; diff --git a/CodeWalker.csproj b/CodeWalker.csproj index e936ae0..5c335f2 100644 --- a/CodeWalker.csproj +++ b/CodeWalker.csproj @@ -46,6 +46,7 @@ TRACE prompt 4 + false true @@ -66,6 +67,7 @@ prompt MinimumRecommendedRules.ruleset true + false true @@ -86,6 +88,7 @@ prompt MinimumRecommendedRules.ruleset true + false Resources\CW.ico diff --git a/Rendering/Renderer.cs b/Rendering/Renderer.cs index d72748b..f94b178 100644 --- a/Rendering/Renderer.cs +++ b/Rendering/Renderer.cs @@ -1517,71 +1517,124 @@ namespace CodeWalker.Rendering public void RenderWorld(Dictionary renderworldVisibleYmapDict, IEnumerable spaceEnts) { - renderworldentities.Clear(); renderworldrenderables.Clear(); - - - //LodManager.Update(renderworldVisibleYmapDict, ref camera.Position, currentElapsedTime); - - - VisibleYmaps.Clear(); - foreach (var ymap in renderworldVisibleYmapDict.Values) + + + LodManager.MaxLOD = renderworldMaxLOD; + LodManager.LodDistMult = renderworldDetailDistMult; + LodManager.MapViewEnabled = MapViewEnabled; + LodManager.MapViewDist = camera.OrthographicSize / MapViewDetail; + LodManager.ShowScriptedYmaps = ShowScriptedYmaps; + LodManager.Update(renderworldVisibleYmapDict, ref camera.Position, currentElapsedTime); + + if (MapViewEnabled) { - if (!RenderWorldYmapIsVisible(ymap)) continue; - VisibleYmaps.Add(ymap); + + foreach (var ymap in renderworldVisibleYmapDict.Values) + { + if (!RenderWorldYmapIsVisible(ymap)) continue; + VisibleYmaps.Add(ymap); + } + RenderWorldAdjustMapViewCamera(); } + else + { + foreach (var ymap in LodManager.CurrentYmaps.Values) + { + if (!RenderWorldYmapIsVisible(ymap)) continue; + VisibleYmaps.Add(ymap); + } + } + + + var ents = LodManager.VisibleLeaves;// LodManager.GetVisibleEntities(camera); + + foreach (var ent in ents) + { + if (!RenderIsEntityFinalRender(ent)) + { continue; } + + if (MapViewEnabled) + { + if (!camera.ViewFrustum.ContainsAABBNoFrontClipNoOpt(ref ent.BBMin, ref ent.BBMax)) + { continue; } + } + else + { + if (!camera.ViewFrustum.ContainsAABBNoClip(ref ent.BBCenter, ref ent.BBExtent)) + { continue; } + } + + renderworldentities.Add(ent); + + if (renderinteriors && ent.IsMlo && (ent.MloInstance != null)) //render Mlo child entities... + { + RenderWorldAddInteriorEntities(ent); + } + } + + + + if (spaceEnts != null) { foreach (var ae in spaceEnts) //used by active space entities (eg "bullets") { if (ae.EntityDef == null) continue; //nothing to render... - RenderWorldCalcEntityVisibility(ae.EntityDef); + ae.EntityDef.Distance = (ae.EntityDef.Position - camera.Position).Length(); renderworldentities.Add(ae.EntityDef); } } - if (MapViewEnabled) - { - //find the max Z value for positioning camera in map view, to help shadows - //float minZ = float.MaxValue; - float maxZ = float.MinValue; - float cvwidth = camera.OrthographicSize * camera.AspectRatio * 0.5f; - float cvheight = camera.OrthographicSize * 0.5f; - float cvwmin = camera.Position.X - cvwidth; //TODO:make all these vars global... - float cvwmax = camera.Position.X + cvwidth; - float cvhmin = camera.Position.Y - cvheight; - float cvhmax = camera.Position.Y + cvheight; - for (int y = 0; y < VisibleYmaps.Count; y++) + + if (renderentities) + { + for (int i = 0; i < renderworldentities.Count; i++) { - var ymap = VisibleYmaps[y]; - if (ymap.AllEntities != null) + var ent = renderworldentities[i]; + var arch = ent.Archetype; + var pent = ent.Parent; + var drawable = gameFileCache.TryGetDrawable(arch); + Renderable rndbl = TryGetRenderable(arch, drawable); + if ((rndbl != null) && rndbl.IsLoaded && (rndbl.AllTexturesLoaded || !waitforchildrentoload)) { - for (int i = 0; i < ymap.AllEntities.Length; i++) - { - var ent = ymap.AllEntities[i]; - if ((ent.Position.Z < 1000.0f) && (ent.BSRadius < 500.0f)) - { - float r = ent.BSRadius; - if (((ent.Position.X + r) > cvwmin) && ((ent.Position.X - r) < cvwmax) && ((ent.Position.Y + r) > cvhmin) && ((ent.Position.Y - r) < cvhmax)) - { - //minZ = Math.Min(minZ, ent.BBMin.Z); - maxZ = Math.Max(maxZ, ent.BBMax.Z + 50.0f);//add some bias to avoid clipping things... - } - } - } + RenderableEntity rent = new RenderableEntity(); + rent.Entity = ent; + rent.Renderable = rndbl; + + if (HideEntities.ContainsKey(ent.EntityHash)) continue; //don't render hidden entities! + + RenderArchetype(arch, ent, rent.Renderable, false); } } - - //move the camera closer to the geometry, to help shadows in map view. - if (maxZ == float.MinValue) maxZ = 1000.0f; - camera.Position.Z = Math.Min(maxZ, 1000.0f); } + + RenderWorldYmapExtras(); + } + + public void RenderWorld_Orig(Dictionary renderworldVisibleYmapDict, IEnumerable spaceEnts) + { + renderworldentities.Clear(); + renderworldrenderables.Clear(); + VisibleYmaps.Clear(); + + + foreach (var ymap in renderworldVisibleYmapDict.Values) + { + if (!RenderWorldYmapIsVisible(ymap)) continue; + VisibleYmaps.Add(ymap); + } + + RenderWorldAdjustMapViewCamera(); + + + for (int y = 0; y < VisibleYmaps.Count; y++) { var ymap = VisibleYmaps[y]; @@ -1631,6 +1684,19 @@ namespace CodeWalker.Rendering } + + + if (spaceEnts != null) + { + foreach (var ae in spaceEnts) //used by active space entities (eg "bullets") + { + if (ae.EntityDef == null) continue; //nothing to render... + RenderWorldCalcEntityVisibility(ae.EntityDef); + renderworldentities.Add(ae.EntityDef); + } + } + + if (renderentities) { for (int i = 0; i < renderworldentities.Count; i++) @@ -1664,95 +1730,7 @@ namespace CodeWalker.Rendering } } - - - if (renderinteriors && (rendercollisionmeshes || (SelectionMode == MapSelectionMode.Collision))) - { - for (int i = 0; i < renderworldentities.Count; i++) - { - var ent = renderworldentities[i]; - if (ent.IsMlo) - { - RenderInteriorCollisionMesh(ent); - } - } - } - - - - if (rendercars) - { - for (int y = 0; y < VisibleYmaps.Count; y++) - { - var ymap = VisibleYmaps[y]; - if (ymap.CarGenerators != null) - { - RenderYmapCarGenerators(ymap); - } - } - } - if (rendergrass) - { - for (int y = 0; y < VisibleYmaps.Count; y++) - { - var ymap = VisibleYmaps[y]; - if (ymap.GrassInstanceBatches != null) - { - RenderYmapGrass(ymap); - } - } - } - if (renderdistlodlights && timecycle.IsNightTime) - { - for (int y = 0; y < VisibleYmaps.Count; y++) - { - var ymap = VisibleYmaps[y]; - if (ymap.DistantLODLights != null) - { - RenderYmapDistantLODLights(ymap); - } - } - } - if (renderlodlights && shaders.deferred) - { - for (int y = 0; y < VisibleYmaps.Count; y++) - { - var ymap = VisibleYmaps[y]; - if (ymap.LODLights != null) - { - RenderYmapLODLights(ymap); - } - } - } - } - private bool RenderWorldYmapIsVisible(YmapFile ymap) - { - if (!ShowScriptedYmaps) - { - if ((ymap._CMapData.flags & 1) > 0) - return false; - } - - if (!ymap.HasChanged)//don't cull edited project ymaps, because extents may not have been updated! - { - var eemin = ymap._CMapData.entitiesExtentsMin; - var eemax = ymap._CMapData.entitiesExtentsMax; - bool visible = false; - if (MapViewEnabled)//don't do front clipping in 2D mode - { - visible = camera.ViewFrustum.ContainsAABBNoFrontClipNoOpt(ref eemin, ref eemax); - } - else - { - visible = camera.ViewFrustum.ContainsAABBNoClipNoOpt(ref eemin, ref eemax); - } - if (!visible) - { - return false; - } - } - - return true; + RenderWorldYmapExtras(); } private void RenderWorldCalcEntityVisibility(YmapEntityDef ent) { @@ -1874,6 +1852,36 @@ namespace CodeWalker.Rendering } } } + + private bool RenderWorldYmapIsVisible(YmapFile ymap) + { + if (!ShowScriptedYmaps) + { + if ((ymap._CMapData.flags & 1) > 0) + return false; + } + + if (!ymap.HasChanged)//don't cull edited project ymaps, because extents may not have been updated! + { + var eemin = ymap._CMapData.entitiesExtentsMin; + var eemax = ymap._CMapData.entitiesExtentsMax; + bool visible = false; + if (MapViewEnabled)//don't do front clipping in 2D mode + { + visible = camera.ViewFrustum.ContainsAABBNoFrontClipNoOpt(ref eemin, ref eemax); + } + else + { + visible = camera.ViewFrustum.ContainsAABBNoClipNoOpt(ref eemin, ref eemax); + } + if (!visible) + { + return false; + } + } + + return true; + } private void RenderWorldAddInteriorEntities(YmapEntityDef ent) { if (ent.MloInstance.Entities != null) @@ -1886,9 +1894,7 @@ namespace CodeWalker.Rendering intent.IsVisible = true; - var iebscent = intent.Position + intent.BSCenter - camera.Position; - float iebsrad = intent.BSRadius; - if (!camera.ViewFrustum.ContainsSphereNoClipNoOpt(ref iebscent, iebsrad)) + if (!camera.ViewFrustum.ContainsAABBNoClip(ref intent.BBCenter, ref intent.BBExtent)) { continue; //frustum cull interior ents } @@ -1912,9 +1918,7 @@ namespace CodeWalker.Rendering intent.IsVisible = true; - var iebscent = intent.Position + intent.BSCenter - camera.Position; - float iebsrad = intent.BSRadius; - if (!camera.ViewFrustum.ContainsSphereNoClipNoOpt(ref iebscent, iebsrad)) + if (!camera.ViewFrustum.ContainsAABBNoClip(ref intent.BBCenter, ref intent.BBExtent)) { continue; //frustum cull interior ents } @@ -1925,7 +1929,104 @@ namespace CodeWalker.Rendering } } } + private void RenderWorldAdjustMapViewCamera() + { + if (MapViewEnabled) + { + //find the max Z value for positioning camera in map view, to help shadows + //float minZ = float.MaxValue; + float maxZ = float.MinValue; + float cvwidth = camera.OrthographicSize * camera.AspectRatio * 0.5f; + float cvheight = camera.OrthographicSize * 0.5f; + float cvwmin = camera.Position.X - cvwidth; //TODO:make all these vars global... + float cvwmax = camera.Position.X + cvwidth; + float cvhmin = camera.Position.Y - cvheight; + float cvhmax = camera.Position.Y + cvheight; + for (int y = 0; y < VisibleYmaps.Count; y++) + { + var ymap = VisibleYmaps[y]; + if (ymap.AllEntities != null) + { + for (int i = 0; i < ymap.AllEntities.Length; i++)//this is bad + { + var ent = ymap.AllEntities[i]; + if ((ent.Position.Z < 1000.0f) && (ent.BSRadius < 500.0f)) + { + if ((ent.BBMax.X > cvwmin) && (ent.BBMin.X < cvwmax) && (ent.BBMax.Y > cvhmin) && (ent.BBMin.Y < cvhmax)) + { + //minZ = Math.Min(minZ, ent.BBMin.Z); + maxZ = Math.Max(maxZ, ent.BBMax.Z + 50.0f);//add some bias to avoid clipping things... + } + } + } + } + } + + //move the camera closer to the geometry, to help shadows in map view. + if (maxZ == float.MinValue) maxZ = 1000.0f; + camera.Position.Z = Math.Min(maxZ, 1000.0f); + camera.ViewFrustum.Position = camera.Position; + } + } + private void RenderWorldYmapExtras() + { + if (renderinteriors && (rendercollisionmeshes || (SelectionMode == MapSelectionMode.Collision))) + { + for (int i = 0; i < renderworldentities.Count; i++) + { + var ent = renderworldentities[i]; + if (ent.IsMlo) + { + RenderInteriorCollisionMesh(ent); + } + } + } + if (rendercars) + { + for (int y = 0; y < VisibleYmaps.Count; y++) + { + var ymap = VisibleYmaps[y]; + if (ymap.CarGenerators != null) + { + RenderYmapCarGenerators(ymap); + } + } + } + if (rendergrass && (renderworldMaxLOD == rage__eLodType.LODTYPES_DEPTH_ORPHANHD)) //hide grass with orphans + { + for (int y = 0; y < VisibleYmaps.Count; y++) + { + var ymap = VisibleYmaps[y]; + if (ymap.GrassInstanceBatches != null) + { + RenderYmapGrass(ymap); + } + } + } + if (renderdistlodlights && timecycle.IsNightTime) + { + for (int y = 0; y < VisibleYmaps.Count; y++) + { + var ymap = VisibleYmaps[y]; + if (ymap.DistantLODLights != null) + { + RenderYmapDistantLODLights(ymap); + } + } + } + if (renderlodlights && shaders.deferred) + { + for (int y = 0; y < VisibleYmaps.Count; y++) + { + var ymap = VisibleYmaps[y]; + if (ymap.LODLights != null) + { + RenderYmapLODLights(ymap); + } + } + } + } @@ -3376,18 +3477,26 @@ namespace CodeWalker.Rendering public class RenderLodManager { + public rage__eLodType MaxLOD = rage__eLodType.LODTYPES_DEPTH_ORPHANHD; + public float LodDistMult = 1.0f; + public bool MapViewEnabled = false; + public float MapViewDist = 1.0f; + public bool ShowScriptedYmaps = true; - - private Dictionary EntityDict = new Dictionary(); //visible entities and their current child counts - + public Dictionary CurrentYmaps = new Dictionary(); + private List RemoveYmaps = new List(); + public Dictionary> EntityTree = new Dictionary>(); + private Dictionary> RootEntities = new Dictionary>(); + public Dictionary> VisibleRoots = new Dictionary>(); + public List VisibleLeaves = new List(); public void Update(Dictionary ymaps, ref Vector3 position, float elapsed) { - EntityDict.Clear(); - foreach (var ymap in ymaps.Values) + foreach (var kvp in ymaps) { - YmapFile pymap = ymap.Parent; + var ymap = kvp.Value; + var pymap = ymap.Parent; if (ymap._CMapData.parent != 0) //ensure parent references on ymaps { ymaps.TryGetValue(ymap._CMapData.parent, out pymap); @@ -3419,16 +3528,95 @@ namespace CodeWalker.Rendering } } } - if (ymap.AllEntities != null) //add visible entities to the dict, increment entity parent child counts + } + + + RemoveYmaps.Clear(); + foreach (var kvp in CurrentYmaps) + { + YmapFile ymap = null; + if (!ymaps.TryGetValue(kvp.Key, out ymap) || (ymap != kvp.Value) || (ymap.IsScripted && !ShowScriptedYmaps)) + { + RemoveYmaps.Add(kvp.Key); + } + } + foreach (var remYmap in RemoveYmaps) + { + var ymap = CurrentYmaps[remYmap]; + CurrentYmaps.Remove(remYmap); + if (ymap.AllEntities != null) // remove this ymap's entities from the tree..... { for (int i = 0; i < ymap.AllEntities.Length; i++) { var ent = ymap.AllEntities[i]; - //ent.BBMin - - + EntityTree.Remove(ent); + RootEntities.Remove(ent); + if ((ent.Parent != null) && (ent.Parent.Ymap != ymap)) + { + LinkedList clist = null; + if (EntityTree.TryGetValue(ent.Parent, out clist)) + { + clist.Remove(ent); + } + } } + } + } + foreach (var kvp in ymaps) + { + var ymap = kvp.Value; + if (ymap.IsScripted && !ShowScriptedYmaps) + { continue; } + if (!CurrentYmaps.ContainsKey(kvp.Key)) + { + CurrentYmaps.Add(kvp.Key, kvp.Value); + if (ymap.AllEntities != null) // add this ymap's entities to the tree... + { + for (int i = 0; i < ymap.AllEntities.Length; i++) + { + var ent = ymap.AllEntities[i]; + if (ent.Parent != null) + { + LinkedList clist = null; + if (!EntityTree.TryGetValue(ent.Parent, out clist)) + { + clist = new LinkedList(); + EntityTree[ent.Parent] = clist; + } + clist.AddLast(ent); + } + else + { + LinkedList clist = null; + if ((ent._CEntityDef.lodLevel != rage__eLodType.LODTYPES_DEPTH_ORPHANHD) && (ent._CEntityDef.lodLevel != rage__eLodType.LODTYPES_DEPTH_HD)) + { + if (!EntityTree.TryGetValue(ent, out clist)) + { + clist = new LinkedList(); + EntityTree[ent] = clist; + } + } + RootEntities[ent] = clist; + } + } + } + } + } + + VisibleRoots.Clear(); + VisibleLeaves.Clear(); + foreach (var kvp in RootEntities) + { + var ent = kvp.Key; + if (EntityVisibleAtMaxLodLevel(ent)) + { + ent.Distance = MapViewEnabled ? MapViewDist : (ent.Position - position).Length(); + if(ent.Distance <= (ent.LodDist * LodDistMult)) + { + VisibleRoots[ent] = kvp.Value; + RecurseAddVisibleLeaves(ent, ref position); + } } } @@ -3437,6 +3625,77 @@ namespace CodeWalker.Rendering } + private void RecurseAddVisibleLeaves(YmapEntityDef ent, ref Vector3 position) + { + var clist = GetEntityChildren(ent, ref position); + if (clist != null) + { + foreach (var child in clist) + { + RecurseAddVisibleLeaves(child, ref position); + } + } + else + { + VisibleLeaves.Add(ent); + } + } + + + private LinkedList GetEntityChildren(YmapEntityDef ent, ref Vector3 position) + { + //get the children list for this entity, if all the hcildren are available, and they are within range + if (!EntityChildrenVisibleAtMaxLodLevel(ent)) return null; + LinkedList clist = null; + EntityTree.TryGetValue(ent, out clist); + if ((clist != null) && (clist.Count >= ent._CEntityDef.numChildren)) + { + ent.Distance = MapViewEnabled ? MapViewDist : (ent.Position - position).Length(); + if (ent.Distance <= (ent.ChildLodDist * LodDistMult)) + { + return clist; + } + else + { + foreach (var child in clist) + { + child.Distance = MapViewEnabled ? MapViewDist : (child.Position - position).Length(); + if (child.Distance <= (child.LodDist * LodDistMult)) + { + return clist; + } + } + } + } + return null; + } + + + private bool EntityVisibleAtMaxLodLevel(YmapEntityDef ent) + { + if (MaxLOD != rage__eLodType.LODTYPES_DEPTH_ORPHANHD) + { + if ((ent._CEntityDef.lodLevel == rage__eLodType.LODTYPES_DEPTH_ORPHANHD) || + (ent._CEntityDef.lodLevel < MaxLOD)) + { + return false; + } + } + return true; + } + private bool EntityChildrenVisibleAtMaxLodLevel(YmapEntityDef ent) + { + if (MaxLOD != rage__eLodType.LODTYPES_DEPTH_ORPHANHD) + { + if ((ent._CEntityDef.lodLevel == rage__eLodType.LODTYPES_DEPTH_ORPHANHD) || + (ent._CEntityDef.lodLevel <= MaxLOD)) + { + return false; + } + } + return true; + } + } diff --git a/Rendering/ShaderManager.cs b/Rendering/ShaderManager.cs index 2383a5f..3af5b5d 100644 --- a/Rendering/ShaderManager.cs +++ b/Rendering/ShaderManager.cs @@ -720,7 +720,7 @@ namespace CodeWalker.Rendering Shadowmap.BeginDepthRender(context, i); float worldtocascade = cascade.WorldUnitsToCascadeUnits * 2.0f; - float minrad = cascade.WorldUnitsPerTexel * 3.0f; + float minrad = cascade.WorldUnitsPerTexel * 5.0f; shadowbatch.Clear(); for (int c = 0; c < shadowcasters.Count; c++) diff --git a/Rendering/Utils/Shadowmap.cs b/Rendering/Utils/Shadowmap.cs index 75a497c..4c2471c 100644 --- a/Rendering/Utils/Shadowmap.cs +++ b/Rendering/Utils/Shadowmap.cs @@ -45,6 +45,10 @@ namespace CodeWalker.Rendering Vector3 SceneCenter; Vector3 SceneExtent; + float[] fCascadeIntervals = { 7.0f, 20.0f, 65.0f, 160.0f, 600.0f, 3000.0f, 5000.0f, 10000.0f }; + float maxShadowDistance = 3000.0f; + + long graphicsMemoryUsage = 0; public long VramUsage { @@ -215,8 +219,8 @@ namespace CodeWalker.Rendering float fFrustumIntervalBegin, fFrustumIntervalEnd; Vector4 vLightCameraOrthographicMin; // light space frustrum aabb Vector4 vLightCameraOrthographicMax; - float fCameraNearFarRange = 1000.0f; //(far - near) //1000m in planet space - float[] fCascadeIntervals = { 0.0075f, 0.02f, 0.06f, 0.15f, 0.5f, 1.0f, 1.5f, 2.5f }; + //float[] fCascadeIntervals = { 7.5f, 20.0f, 60.0f, 150.0f, 500.0f, 1000.0f, 1500.0f, 2500.0f }; + //float[] fCascadeIntervals = { 7.0f, 20.0f, 65.0f, 160.0f, 650.0f, 2000.0f, 5000.0f, 10000.0f }; Vector4 vWorldUnitsPerTexel = Vector4.Zero; float fInvTexelCount = 1.0f / (float)TextureSize; @@ -229,8 +233,8 @@ namespace CodeWalker.Rendering fFrustumIntervalBegin = 0.0f; // Scale the intervals between 0 and 1. They are now percentages that we can scale with. fFrustumIntervalEnd = fCascadeIntervals[iCascadeIndex]; - fFrustumIntervalBegin = fFrustumIntervalBegin * fCameraNearFarRange; - fFrustumIntervalEnd = fFrustumIntervalEnd * fCameraNearFarRange; + //fFrustumIntervalBegin = fFrustumIntervalBegin * fCameraNearFarRange; + //fFrustumIntervalEnd = fFrustumIntervalEnd * fCameraNearFarRange; Vector4[] vFrustumPoints = new Vector4[8]; @@ -380,6 +384,7 @@ namespace CodeWalker.Rendering ShadowVars.Vars.CascadeCountInv = 1.0f / (float)CascadeCount; ShadowVars.Vars.TexelSize = 1.0f / txs; ShadowVars.Vars.TexelSizeX = ShadowVars.Vars.TexelSize / (float)CascadeCount; + ShadowVars.Vars.ShadowMaxDistance = maxShadowDistance; ShadowVars.Update(context); @@ -831,7 +836,7 @@ namespace CodeWalker.Rendering public float CascadeCountInv; public float TexelSize; public float TexelSizeX; - public float Pad2; + public float ShadowMaxDistance; } public struct ShadowmapVarsCascadeData diff --git a/Shaders/BasicPS.cso b/Shaders/BasicPS.cso index 05695f26be462b52f69429b6a722103059643a4a..d5678af63875ad02f40a42a6d976c963f22e1576 100644 GIT binary patch delta 784 zcmX>Sb|uWxCBn)1`NYakvD-u~Kb_hZ`Zt|>2_pjoLx?s511pd=0b&_$28IqE28KOA zd_#+YA;`tm?ZHG#Y0hj&T?1t+ z0NH&|wgHg60Lpd%vbR9l0YLUiC_4ej1_dA^gA9=5V0bXOmOZ$>ffL990(8&x0mVUL z=;AYh;v87SR|3UBE=5KL10^J|Xt)Iw2RR(wpeK_ja)?X5 z1Inr($(n$C3IsnV9|X#B0F#9dkO$HW0x(&L$sd8T>OffspeV@sAYcLHgMi0mMNVmYw;bYR7Y(VJ!@$B zTa^x?DkQsB#&N?KS!2$5mX0NotwGA?^Hr{5VG0426ml1H6Hz#)^aIi-5f@ANIrxXH*#<6v9N^%2uLvj$jD>(u_lpF(}NsfcX567qupDGpL zJ7*K)GZXz&iR9e!0_G<2@jZ8YdQn3OmVL|(c;W1R2VO1VbMWH%?e%$hF^k=wz~f(u z{yR9wK~0H!oc7FR1X7lfDDjXZ#Ks=+A&K7XC$WN zm-{AGxMUWWB<3ZjGOS*`dI3-m!{mjG!i*~??`6?uDq)?R$0){FJ(-bJyuO{4fk6Q% z4^jgHQ-FLBSOTO~fHb=JCZMvSCBn%$nB(b%+rPJb%{BV6Xy1Ihxr_`93`YbR7}$Wc1rWQiGcfD{Vhv6p zA1Lkt#6d2uZY&dRr5P_wjJ(X4GFg{VTyg~q1A_xlJq*kNGC*cM*c{7f$IKOwm||qW zuzL0CDU&y{h%?Tee3C_*DT8%#9-|m*J}U!*z~n+k;rePIO97|}XcicB0Qn#=14yd? zX>{>rKyeK$;@g4ZI#|T_0L2Y};yggi1jI*xd=R(-q-_`&xDXahUdvi9_ya2K08|1} zeqgdKTYfzwFlabH!2<*mKw1HaK?WK?#RY(DkOM4$d>J6y11hcnWcvZxAaRi6f}!Fd r2Sq}~fsSARS<1)&GKGU70VwX9nOu}#oS#;rpb@00;IUboeJK|JnH)a( diff --git a/Shaders/BasicVS_Capsule.cso b/Shaders/BasicVS_Capsule.cso index aff28b39705738952d721c8b99a4bb5e163b1948..f0ee0012e9ef831c38aaf5a7bd36095fe83d48ee 100644 GIT binary patch delta 429 zcmcbi@kGPcCBn%$Zqe(Ac=@8O{#;#WJPbv+85tNDQbZUS*nqSJ5c{w*Ff0LL0Zs;n z8^R0>FMv46#np{xqOCOJjfs($84D)sGKx!XVPRl!0IG+9IY0);tT&ru8SR**f-@3R z^2>b_D_k;*OA_;vQyEsTUcCUQhhg$UMq$R4llQV{GnKGT&SMl~te(usDqi2t%D|ui zln1E+fhj;f2rL28DnJ@td=pSy1B>`!ptuee@e@FC1E4q$5HkVs1t1>;9sp?@1_myK z1(O%D)(f(L0t5&^T0qKAOg3aIPvixPia=#lfV2(}gAA+&83JSr0NFlJaRned7|4zR gVvq-NpyD7$gB=Ot1KA*VFoI2CXDHds$?ne!0DGT1t^fc4 delta 403 zcmaE&aYMt_CBn&h!PhK>hl0yAxW6_U2P%D2WMp7qh!A05U<1+?K&AgutzAOk_(FaWXzfNTe-xB`&v4rB)aF~|c6P;ro>L5@_I P%*Zaxn6X)u-Jcf#EjTw% diff --git a/Shaders/BasicVS_Cylinder.cso b/Shaders/BasicVS_Cylinder.cso index fafd522a4ef2ec0e7ea1c3b3de98ee78e02aa9e9..9d330e628024ba5ee869d25ceee4c5a9e3bb7f16 100644 GIT binary patch delta 446 zcmeCsoT6##65-@*SgKe1yrm>gA+Le2bxHmyMg|6kDIyFEY(Uxqhy&Oe7)}7O2`2*s z2T)uBh=W{Q-2^7uN;BS>7mMd4L$?nkzs)2s{DO zHVh102n!}JWvv(F0EG|`fV6;=pP6jRR-Pyb6qSI=XaH#gAO;x-@`eMDEdXQ(K*be+ m>~J7E0f<2!D1eHC91U_LNH55tAa^i=O<`xK*v!jb%?kjL@jPGv delta 448 zcmbQD*`aCc65-@5e0s;>DMyZ}&#`h_)7isrz{tSB&>_OWzy_o(fY^ndfng62Yj83! z{1Ikg-~q}7xwyKqOth6|yf88HI%CFULq>7QH7pDa4nXxVFbBv0ne}9IBBLF%Qb1yg zkpaW%)vIR!)q#Km5HkU>3Nw%Zf`yaMvS>@@utInOKnf(w0+lVEEXXQ8S%8(LUI8Qu z#30ZERXqnts{r}v;;Vq-8d$`41I2Z)h#vro8vw<5fEZ-^2_PQ?ZUAW;APqDh6f8iC zCvRk}7yJX225A8)KQP&mtvrzxsDuZij6nuStAO}G*#2%2gj5&UUUAqS&XSHXkOY7dsyL(qbSVCxU)L1@*h zhv+CMC?sePk}8IH$VG~fLl7Y;-i!x(>qYUvB zP}PXisET-mPlR0UVQn;YEVTW?)%=yI+voCkyvdul^4Bg;P^D6N!R3f+%we)Y)}q_E z9qBcur7be|akO{l0g@#0Fg~%O6k#R!6ufYBTjTG*GXaNN;|t*X{=*yK{ovSvzs?ur zV&CD95?SjF_+@lPCzE%YyYnC9++f|^7r=!nzH0a~YJ$rz!o}1s+JMqo=@svA*>sIx zs3zrDv_HIPPB|%Df|y){?D;Sc$I@q4EFW&zLAYmqZBeLM;^25B8}z&QQ_M9osQNtz zjv$hgk-4Rthg@s~US6DVF~u)&pXC}iP#yATzR$y!n|OkJ8mjK|E%805-=I1x>Vc1l ziqLg;Yk@xlS0|@-@r{=(ckgdhOTp@Jq;5|~yLsg5uVSsQ=aA-PWeS+QRewu7VefGY z0sXQ0AHB=Z?X>ecpmJ2A&G4c29HGhmSt=1;vt>j<3 C%RgdD6!t{ce|Fwm7;X>u4_v=+ z@!{LtzhCpKoyx?OFGt^hIHD0z@ipQ7K5luOSOW#4E^Bl&CJ6zQuH+1Bi?4gxqAeO|*C- z$Ps0cmEu7@A9A(2HxxP>vdXoQlYP`^G{$*0>>5wdO^I7(oR`Ag+6ey%yZWsNzcUkK z_o17?_C5ZIk5nH-lkh!0hXMus1$b_kdJnv?3vYw>fun1ZbLO!YTZBJDWGP`Kz;7aB z`Wm_lC%9zVwbwE)m~{4k2OhYvfUg@;gh($ diff --git a/Shaders/BasicVS_PBBNCCTTX.cso b/Shaders/BasicVS_PBBNCCTTX.cso index f7dcf45ef86523843c78cf1b518cebd2e76bdc8b..0b4d8e5ddc52bc4e1ccf61931f1faa85e8b8421d 100644 GIT binary patch delta 978 zcmZvaKWGzi6vy9Pa>?a-(ViBsLD0k&5=GFULI$H%Poaa@Y6pv`q*`bp*rI|CLaXAI zA^IFDR7g<=NtKp3I4D(c=pdM`#=$P?VsYrup`hP)-mit|gCFm`&wKZKe|}dQm>9@= zXOABH-ad2T9{+xq+I8_;_tKkF8WFW;i6YQBoas2x>IR~rR-)2gqDh?7-tiN~`}wU} zZnpoho+u)>2dPRLxWj}q!?U`Z_z@-QQX%MNM1jcWMMUiw(YVwMB(4)}g6**rauZ3L zsJ=(Vh|-8kavvWFxmu~#A37A;a%QM-dE~~)!cA}Z+V#SfOM_IcRwsEX;u_D;Sr=>3 z&0LSP8KY7bp8Fu$Hg*?I5`Gv*q%1*51-cVjII6Ajm*AOzL#^>S@ZJC6AHcCH!UX<3 zAK{C9fj&rNtry_O(J`G&-e&G7ypp{^nyb%&3sZc>@Y84>Ts{#lqNb<=N@bO=c!Q@* z*H}U{DQnSIdBGfUI`If1@(?ofe(sH>yO%8={xdBt zZ()^@*Iexr_yoAxoSNb@FIw)-Ux-$M+o4Fko{nEA=H#Rci2SSmNIYnF zIK_Z|-T0T@;zxGcc^XhzmE>l4!9JIN0s1k|1+>9P2OMg+X&N2Z8-j< F;}5LAe(nGO delta 941 zcmZvaPiPZS5XNVB-OXmZsa;dDMiVGhNCOe8BIIB-YLyU8(vx-}~{6_GMyj+-Pb<8zeCqqd0B(7xgf8;fV$*8SvKgs2dv;J1(kBH|5XDT-r7Gq9LWbO3RlJ;P7-yF{zU z!W>ZsSt%albB3?gIwj+b;S?*=Cx)rjYSnqk^34b6roe4G&TCe`HqE~+U%wXNS9W6d zHgpHDeP3|mUDXHCJp7S>LxDp61bk?Z`VM$*5B?e);~{iSa?V?<#a7`@6FEv)3GmCv ztiFY=tOOTqxAH>f1(VKpchCVB7V>RVs)&}sWs7jJu;UMaq8`?Ve1(^6-~5j3fQ&}l zEJ!TRiFb={c;csO(mq2fw3KA0evAj&vJQ9kt!6 z@4*|Y_7kFq5@mlNY6j=R?L65Z@I|b52HZK?b5iqiq7RdwQeB8|xPx9fpx^fYqg8(H qX1qo~Wmr<1;&pdCy8yZvWR`d>%XWu>-08<7u<%3h%m-y5mO9h2eE81<;jWFdIYadl2k(a8Iq@#}J|>Jb zqJGWHAy|Af+&5Qq;j;`v^B>2YMe$+TYYF2zqItjPJF;Mj#AEmq$m*BYAs4s3RCbcWPyly16hg@)kQO~xK6Yeagp7Km+Eqe zRu6?aqAapfJisR-o>upVBgZ3lr8aiBK#fLYnioyacz|w7+_VzBW_D>~{LA$8t5JSw zC8usdw+GvI1t;ECeGtvS9|$-UDCAGT`*x`J!Sg%tC2)*~&^5_9udo(dg+E4QD`6$T zFQQX=3tgE>E?G|Pxy%bDo&DQ^4=ya^n}$>oErZJz;bLLOZvaI-tPlALFIt}Q8QC5g zjrNn*t!wT+3|~whKves9B$nO(%~tTgTWs3=IF`(49Ymd|Xuo6vJk9g5gpo$1WRB(# z$v~u45h!9UHUKX_mvFI=UjSEcXIw^9QLWzO5!=h$#d;i-?W!~2lS=gwqPpzJG!ads zwq5l#_^hgZhv=b1xi5(3f^*@vpX@jI0@m9D_78R((cHY~!{nz_7vk$quUif1r#*k^ tI6rf;?rcD1SW=tjb>~uU9&{ndEC;cOtOT(%y&*Bz;tB1$enK{3Mo`jQne)>yhso{1QATZlks3~UMdPb^x(m7)_pCc4m@V&H{ZUQ_uiIkEFZ2pLAYaeZ&9dO;^6p6*66qK`&(#T389-Ii-yL$%MJ`7ZZcZsHO038>odx6F5-eu3(gsC(Wa zDni%Z?K5}@T-}^H#aC`w?#^GRmV@2lNWGqpcC*OUSH)^~$9~Pp$`mm9SN$XLh`qxp z1oV67KYE)V+i7PepmJ5B&G3SKG4~SmZBVHPu{3E0v5dbM#3GaT*ZeWUv|JsFzfS%I DthIez delta 941 zcmZvaL1+_E5Qb+r?q;*ysB22L(F6h((m<-EBIIB-YLp(MCyOm4PLr@Nx>~+;x%znEm{w>F zozqiQ)K*X$+E?6RVY9$3-Ak=TiArG#eiK#IDpv`}?TbY)+H>ZIu6*o_-_BZ>;3x zUFc?U{6KKyebooiG<emk^HC-{Yv pa~lDbVM%S8*PQG5Inc!*vmC@CvJ%A7^t!}cizl?-{_XhN>_61ef#3iD diff --git a/Shaders/BasicVS_PBBNCTT.cso b/Shaders/BasicVS_PBBNCTT.cso index 645f078239956e45b8e5c6eb9bd0aa966ff8fe6f..b83c39fe52143cdd96eb6b153a33a9dfcac78db1 100644 GIT binary patch delta 978 zcmZvaO=uHg5Qb+r*<`cXsH?>#2%2gk5&UUUA%{k*u7U@l)gCO?L(qbSV2c&(q0p*_ zf_R9I2L*)`svxP75)Y!5DirKNF!g9WSWjLQ4?X1I!FSgET1XvOX6Bi9znSl+(*L$U z=bbxt{QG45_VnavyzzAG_1v4!BN`EP?jwr8XYtJ>h!!>wwQnM->?L}K?~HfiWZ`aZ zo0gsJJEA8G&~`(rtd2EIBo&_3-QJ??dHk+s%4a1kwBDnk_Tukkv1}L4CUhz6l znXd5*)s!5I_J^0uA*T(OASM?fdp^iLvGl1G%ZKZB5RR{{EebVD0vwNIoqh+ukGVz$ zRljG)Aw+UAGPiW|kc;)g%Zn2(ruYSJwOr#Ws@?v~H@U}hllPGiL)Cn~CB6amGgK!; z-7$x#2wiixPv8&0)yb({eBouw-TfQYQm{H4soT@hZU(vft5|J~AJCkvOaYU(>Tih$ z>|IVFpx-wBqhtKgPCL^9m7@}EhL`N~x#ys-g34kLOOtvK%lJQoSY&elnm!gNh(D2M>am z%Jfh{rIiXw8ZoR$!5jny@nU-LW(!t4c<`W7q(}dG?iOh~u*|$~=DmM*-s_CK7#SEm zcjDxy)`xC1`TO;S^sB<|8lo9kTqoLvxXfB z(FuJOU70DaSWf+^%nK%+{ojEPE-d70hEx%Cz-5bYv9RNJfTAAOhrG)z%QLh6q-h^ng9>pW_E**jQ|qjKYDr@(J1)rW{0vLo9@G>O`c zs&B!kRqaPa4{%751A$4Gxncsi*&AgA=z~_N% z?%a{1CyK*!{c3K1+nxE_@5Zi;8${H*lPCh8!8a8rT3ADLavf1^2hlvfGr42O3-_{{ zjLdZ3Au~}xZ8u7_HL!+_MpTrZfyGUt^@wxqg;XNx z64iHUjVJ}xACM1+lySG(7djZ)c=l5M;>gw0`SIM)1peL(plGQ-rz}F zSwEpBKBxd_?wUhavdPAxe;T(yI6%gWkPp=XJMTslQ&qTW^GT6vyApHnX$iY&EUyxU~xl{aF{*k|NlH)>bAG1Y0L1g^&BTMu@>=6#fg^o5_Rk+T4*DBkLPOF#qP@E z&O=(E(RWr)RZv?-X&9ezhK0>DZs=ZWIZ9LtQ&=~U1tQ{AWGO~e6VD*xI?(~>BD)bU z)$G9hM3^JWA*&kXa}iIg`F)Wy5xZO+JlRh5dVQ4VOwX7=HzjUZ30^jvwL$)6disqh zzp|3U_u!kwX?ubbM^qm~V_1&_91axn8SvI!>V5FSE_@!m9UNVgobwuci6yKZM7AgVNoI4&+8J5(hdBwSwp9Y-`G7Etglf^(w)2pJn8c%3z{+;-j>|ZAEgOLCL diff --git a/Shaders/BasicVS_PBBNCTTX.cso b/Shaders/BasicVS_PBBNCTTX.cso index 9c06cb42b74585351748d95044a741325c647199..1a130ceb7b2490df2f8aa7b384f6c5cbf56ed7f6 100644 GIT binary patch delta 978 zcmZvaO=uHQ5XWbeY<9EV*sd0rAZTg}i6CfEA&AkctKdOMY!4RkuxPy!Gns29s+vsKkL30q63ea`OWN`kGJ3arl0rD zpEx=F;qb3_{mfIvxyMHPtB)EHHTM(6p>sI1Nun=XhzcDxcr8&1;C-38D$98A>ujv=z3;PSj1MZKC=< z6(h5=@bw%1)k{NEtyUlMOx)Fi?N7a4$-KTf!a;upEga`kJ77J{DdaM5y8_u!8rtF>B%ZzKB|q7#zc`vz7S zd9Br!!S92s&8aCq@tWoC`H5&Hyd8?v>qSs*7QXtbT#sO6CBhulE_~zn7-}Vxf2Z?In4Sbi%=P%Trj2~7CoyiF` zRYPqRrJ;St83q=wxT89$)hJOZOu=s<3q-{0$Wn}`C7OZ7Rigcfi)=@n)R0BAaxBad zWs#NQ3ZIEMO3Ry!oQ{}Pw|;z#+U@o)jhti@K~PZ62EurI)GqfK=S zUFk_K8J7D-<^_|^c6Q)_3k!KqlPaPmaM>bUEbRC*ps0uSAz$W2!_hX79hT83zj@8L zVIRcs#pD4*HOEu2?4e(#5C6MG&*T@eWJVbv8bn3^B@^Ijo{uH8G$LQ-WFC(_ok^h~1sPegOUxp3Q0_6K|c>+J!1M+Z(Qc0u%E@>BX3;+xipT?^=seg9~KUt3vw oHlQ*rsZH~mbtOL!x)5ZRf>=bBgIJngmzdpnLg{+9;txjt0_e_xz5oCK diff --git a/Shaders/BasicVS_PBBNCTX.cso b/Shaders/BasicVS_PBBNCTX.cso index 0fd0e0fead974daa4b5dd59f84066559a2840719..949eea0414e54da277b76f857edd1a4248055d63 100644 GIT binary patch delta 978 zcmZvaO=uHQ5XWaX*<`cbXjh9%5H+=hL=d#7kb}{vs~{@0HV2D%SWLlUutfzu2(9(% zAvzuu6;e<{QpFMvUNi_EdMKEJC*vW#c~L|P_Ta()tovGs4m@V&H?wa(-hT4ie%?EC z_{g*L$>A-(em+c=rm1k^T|*-F7ly>tKF`TL=HqY4PWp}r>|Ydl3~1=ivlxf$y* zCZsGp_insr@)n#l{3wn{MS_qjbU(CkR9odQ!LuQUTICJ!o&Vt3h?9jq)sMpHMje(Wp9wq>J4yVimwtnw9a@r>yj-w{pA zTD0H1XpTGmcmxr72$^{=4<$0km#qN)GeNX#?QY3Xy(GcA;df5Fjo&9+Ba3KIb6_7V z*^Klp)jaqjMQHisgo`MCj(aWFxQysv(DO78S#Ihc{0U@rR;%(&WIsoAO0oyu!m1#z zv)V`S``~JGYKqUiWVt(jAX*J?ha&ZQI?Bz$S6@}?ymL}p zc0Ko~b@9y8g|GUj!S}r@lOHr9TJIw=;Y;}D5=5<|M8!^`3iuGdTLU+4)}HjA(u&RD zD|)(y+A2yz`-U?tEM9X{chehDqH>sm-$fRPh_{iY7*Sm`154;c#}SvieEVpqMf%hCz?}HZ);UB><9zxe7=d`dETZ6wuWGi7MzzfkS zeHUGsDK1-a@2$)WCY>GZzy}u=@;yVUh?c=+i*T{9OE&Mx*`a zP3w+x0>c-R2N2aB9*N~o{X|73r_7qQ+Su;1HpUUQ0~50jr#U5F>+-A*l_TgU#<34RmL pJF@|mVM%R1~PGOC+^l{@uiQ_g@|Mf`Ac0WFE|Mq`bm@{^`#m4;W_|U*%kz7G&%fXMeBbkQDIHHuUrFwC zd2VDsmX0S{`d4!AzU37Wm3oMr@WVJ;UZQ8`h<>yXncy$rOs1}m7gpo#DzSO~w#a|9FN62; zm^%<&0rDZq{yGNVAsLP}AZudm4UlX?M#+pC?qYlJ^8aWF4gNFugr)TaC?hC#3UnK} zGE;0`ufX&G<8If{3jVRBBMelO9-#rC7s$2iNOIgAbX-StO)C0kfnMvLa8&7d BZ!G`- delta 880 zcmZvaK}b|#5Xa|x?tA-uyM~LgugwUh)s^tDil9U*shd|<4`I}0!Gnllgn=jP)*>F1 zQ4ncCJsG<>x=+T1|6&;c&4_e0#5+3@`-#^H z`p6l}Ph3I99V8grL?tPf<3~`Z!{^m^TAk)1)Ur#oWfI|^Xthw;wR&s3Tz;%GO{G#P z#LbRx*GVV-ZZ&YuxomxL_?s2C_W|n#KKq5J2}MG>;4#i(E}oEt7jEG*JPzKbIov5v zfwy14+riV|SWHl-3umz`{B5GhnFf44JgdgJ7`~Ceh7rZ8yQjc~89r$T*C-7xDZ<6f zYkL5tv$=2h05`k7eGh7rY(b6jusao-mlCk&Sg6eWlK0$H;-MG7|0bB^SgoIU3bh^= zs^@#beYL*505#~)QA8wrkQP$AtgF6-mw%3Kead%u9r<6O=7JX<@gBOJ;QSc3tGl_Z zJl~E*@OHV~(Sm3}S3TRU8+--a?8)q}pYxu7a}?^Dt`0}$x0(Pi<7~2yoyvySsbXv3 sVluyUN%BGDLGLTjH(J@&v1ESMu}pfXW0^yKLKV~w(Vs|VHX3jI2Om;#5dZ)H diff --git a/Shaders/BasicVS_PNCCTT.cso b/Shaders/BasicVS_PNCCTT.cso index 54e769b685e7d4426a88611db362e132a598eef2..5664a11fbcaa35b0d4a40580470672e0d736b78c 100644 GIT binary patch delta 898 zcmZuv&r6eW7=OO6ZhP4lZA~0Y2crZfHC8eZakAX(RvUJixI-(2bBGj>q7)lVHExPr2UcQ_9>H}Y%&-e5E`h1`F-AGr{@lDi36qfIc@|) zU8qQ)pkbTnB+YU>gJ{WhHu_0NOZ*nm9h0cmD1=|o(e?VSG17ANK_Nf&^!dH~QtHWK zF+clwnktowPZYAhC7?pw@9Z@WoxEqXt0SIw23P+g7(u)hN30d&#oFMz;DtBDYyKL1 zkLKZ;`~djA3;03sQSexf)hD6*WZ;L1Jf{Zm71xR?@|x>Fb;4bzRUj82~p~-&-pRlz40?G)A{Q-K2T$w30 zr&nNlfN{6$Xam1&=?DXrq(|r$&`adnbtF0N4m$25T9%3%Q$QQKCmc1t+%xc1+)uV& xf91Zd{8jK`qD|fx&Q2arSd>yQE{xXsCVEft2eT|^#$+Ej{hG-Z}$v=}NrgVHLdL_|sq78M$4HFh=aP*QYgKtcS#Qgl_fcIXf} zi-UpGNl6AvI<~mju|ufP;?Pn`p&zS*gG2x4aj$6Xfy+7fcfRg9?^PyClj%%uY<%HY z>iGT6(~+CA)3w~E!#j$IN(mwddKhQ7iKx&_basuX6+DjfC^PY3ZZqAX2H!mSq0|wl zEkD+djC)8hvWrSmEXzyqu7odp543lMi||%lqJ5JH{akxrRzF&!4PG`slS)##Tn=%! z3AzknkcM%s)h(imva13t)@6{aYoF~Bh z|HJ#ili*lPP-hT#kqq=*qR52?d?UQ3=C~N{$#-Hzk^1flaAAfo+Cdm4!6ikwh)Vgv?UF618Gh(4M_)+^$OaZFGjDUvO~j_X0A873k)w@%Y!%)X1k}&> zg6}u_b^+d?!$1+1>_J*c?TW7Y4qE;k-TIt=;Md4MhBq6$@DJC}?F{#4h_3JEvhsX8 z8o}Eodf*nUg06b8+YtB`xY?80-x%jTzb^-GNmqv=^R4E=E4Z7iQ>VJ)rBt*8E+X?w pmpK27OpWe=zSW*XZA<27ZOf#;wJmeVCsaZ05S>J-YfZO1{sD3-a8v*Q diff --git a/Shaders/BasicVS_PNCCTTT.cso b/Shaders/BasicVS_PNCCTTT.cso index 2270448b8f2987c3e622c9edb41013979013ea2f..465d7fc76feaf9a0aaf957ef681b2182bb6b4f05 100644 GIT binary patch delta 898 zcmZuvJxE(o6u$SFKVBkDj2NN@f)y2QAyonnMpBL9QX}o6RK)lLI<)>YsFc#i!Bvza zrJ#bNk_<{LWYa;xMW~|)qP4gOVRO5_zy*nB^3kqjblfwNh#o~;{_C)#JgyXdX%4a@?$ zQDnXyfiLF@>k5#uF}wl9FTtyLM-FGU14RCRl!SZ!2z=DgdI{9UD0~Cdk6PZzHm;t) z;RMFntfLtGH$z7ND8)1UZ-5q1Yu3?95#49)M0SNcYKMT<)Jz1C|8i5{GdMrIe)gwc uFFhIXY^;s%7oub5$L8N)cU9((!rXbGFsry$nAKb1(wL1ZS9a3XUUmnhJ#ah# delta 880 zcmZvaO-NKx6vxkf&3p6ajiQ4x&tW1Ijft4WC_*k~L}wph1gT zxKPftKZJKS{I~bL_Rew@-iAxGWfGyEXz%OhzBPKmD^;e3GE}eE zL)_>1cDr=qL#vBRPPg^h;jdQQ{s!17aQ+vpUK9!Gf~UBPxOl<wK?xJmTAn@CF?QtFUAb(n4xCbk%pz^5^K*XMB&>k^cqWQt-kfK0vqMxIad8Yd4pb z=i9L;-Y(IDmtigHs^`01178L=dougWbH($omf>B~)uG6Is|Vl>+)dW0)7Y*H#0%eIw+23{-2OF`&30&UpHQi@1s9u}*pIGJo?l#zwpr`JeVF@P5AS z4aH`G0!XsIj=^7%3}+F@nwWSGB%6>?GGh&Qv2}R)f3$>SejB`LY5fV*D=6^?=n-;d zrr4NXfyW1oyIn^Z{A)``3@9%>qAfsk$hGU};-oj?e1K?CDy|IyE$NO^1e9l_y#&Zf&HQ*TN+E{fyScZx5lF0iKDFE$nuvb{7+;50L+eY A2LJ#7 delta 880 zcmZvaO-NKx6vxkf&3p5Fqv%lh9QsmJrozQj26EwuA7ks6LKwMlz=epRgl#QwQ41H! z*#tGHttMs`%Cr)pO-Y*|AxK1u2*GO6#)XR({?FrHv8e->bMEha-E-bM9N8bq=0*nw z12r2gJpWkyeRW}TWp8^%5z+p2A_uw~r&vq$zK$qUPZWZW;|%A9ZcQ#{FRIMO-S0|$ z;;iMTnvl_l1S3UMl42p>hj%XixA%?q&T#?WvP-mX5}_Yx@6*Z$tM{B2<|n!WDwRqx zZgG6OPCD^7>pX|f1#8#gFIJ=d6|h0zqhGL^Q6#1d9^)?J;t6fg!Yv%b8^Nz>4t2`Y z;2rq>Iux02H3eSA-DDj*m6u+ZO0I&7 s$o$f!jSmv{dS8LQ)}FW8mdwxEmPvnTTjr2YsG{02I!aXLYo{)s09%@IaR2}S diff --git a/Shaders/BasicVS_PNCCTTX.cso b/Shaders/BasicVS_PNCCTTX.cso index 7c96dbf9d47af275a8c87dd4170bd98f58b668f6..4c23b9f4993d963d4a0543a1f61152d0d028047d 100644 GIT binary patch delta 898 zcmZuvO>0w85S{zde2_#f)7ZpmOkWyT@5lh95OR2i_%;TokR|hV0?wPN1=e?DDJD)MfF6O3x zY^u1iHk&_q{p0WPt4oTA+NX$I@M)ZPexjuVM2SO0CiqdD5p!^;I+Ho3vTv_#EA@pl zMkLyUiYy8`HjhrytiX2=t-Jq?zSq$@zeIG=L-eLo2w&0B=dE>Pz;QG`RV>|mc&S)3 zZ$GFO?@r#LMxzlBg&cH*RFu!UP8(lc{Mk67zVm%ofSw`Ot|P}8Z^U^S(K)H;EdjmKJ>jVH<)*eOO`vVLO BaA^Pl delta 880 zcmZvaKS*0q6vpp;=Dj>$lo}MDp(=`&Xc3GeG=m9kOvN#cAc`&l2NA_m?BEjJ+M$Ex zEFBt%oh-@Fl8mBDIu;rb{4=x^aZqt{aB%QDk9)<&9=M!yf9Ia_-E-gjHCdUAC8rZ( zyVdBLdD&Us8r-WpDqm!!5TepAgaseP+HMfyTcZ%|kFW=yz)B}yjxT(SJ(eTiXHKNt zr5@9Hd@U;fK3e7FA#O1iBC1W#-7c_6?);B8(5mRg7+y7cgMrv z1OMRz;1O^kd5sIZFDD|DY|@A0wOcZg@^rsNG=y8mDX3Y?6*^ z1_QV|pB{RGXj65)ul5Z56S#gS{eB6`IPTMFWb>*!oY3ED5xj`KuDZ5LUz}kX%!9M> p{H)STr-9k{SJ1M`R8-8B2P)=C&s5BF@F$dBZ=bjdl(G%!j$6z(aNPg^ diff --git a/Shaders/BasicVS_PNCCTX.cso b/Shaders/BasicVS_PNCCTX.cso index 6bc6110bf19562339e655b4b2026fef29270032c..1e1a684288eb80f70f486eb5f2f5a78348d12086 100644 GIT binary patch delta 898 zcmZuvJxo(k6h8Msf6~^_QbJR(N`Qp&W2llQjcG}h>ZUey!N@?NBru=|jdn1#u1=C; z3G{Zr#o=CE8VTaX$Jj@c)v`=sIHMD8;KxYSzJ~%+wJADoKyvRiIbMwdxq*gezdXi|C3}^yPrw>Yi{^|8h^jS8zYw ze)Wy(n(|e^i-|UQUxdHA9}Is0`&mc6X)Kld8jFe}jYYi;N145m<*6=su7{2Rz-MlG delta 880 zcmZvaJxCl;5Xa}Ow|ncJ5)Z}o$Ok7;E|Duv5po1iqn-)rE(*aAiyT-;P!!Qt?X<8k z3nfIHoH?#YGBpAu%M+XK^ z`r2P_KKfJhBK>%Ge`z?Yh$y&Axm-Qh?3wLoZ#BS2*^yF* zoU{By3o;%c!N@i$NwES?!8;ed>iwv_b6kQqaEW$JBJ`~Gu2eo-y)|B;INp_^a=9Gg zR>!yNr4#?O8oA&!SzjIgZZ+FK02>4@p2A9^NJJMr$6dt56WXAKTR4U{gWu5{>Vl`h z)BoXV@C-N>6V~a*T_g|PLlnEzfNwiYImc$2aPHO^1m>G-OYfGlC5GV=x>xT(aL7s7ugnB;h^pO}ZY0Rh$X zEpvaZZ?C}{cIYg@l08TZsU7I5AE4#W(XB7|KEFZ!H+T!-3xDwey8Xs|2GP~sTvncM z$76WAM0d8sTGLf8ce@9^4sP~j_BX&q&+iz8cS~1?BJ-_Yf(N*ptaGRG*6UL7EpQQ; qU%IsMaqM~T4(L1W`J`>h{Gx4{^hDb-hkQa6){f9wtg=vd|K?xQ3~sLg diff --git a/Shaders/BasicVS_PNCT.cso b/Shaders/BasicVS_PNCT.cso index 3cd0c204add1da5daa3707e53187858a1859dfee..95772dc62d50d1f56a0e24f01987f1a76fd5716e 100644 GIT binary patch delta 898 zcmZuvT}YE*6h80g{@7-0P8w4OQsQ3;%Q4u+CNr0JF0mWKT{M5dpwevQh^TerwQ{6( zF~Lh^UKC64M(QT$MyNZ3h{6z|+tMz5&c{2gPY=AD=Y7uK^PcZJ$o$SE)1%i1O3Ncp z7Itm>U%SS$uQEs5iiq+ZL=N~k&RZ|hy?UbE3q%L)M1OHc(l-Y4OUY)HdUJbEsqdUL zf}u84q)HJ zUxM${JlqK%1%LG%J`O$t9?LQNq;#KQ_ym#Xp8?$9e5UfeOU#lRTrn0N%^} z?m+kjkPk`L*D?4O$*`A!%!#peAlZbBk{MgLi+zNb|3^zW;Xi{RB66)d1~};s+B1ljrJ{QhXjS)wquQ5y41NRm z)9qJZx_gy>1H71MllMjVi)XBF6YP5(`J}N_?rAJ4{%9=f?KsNpjVy0<&U@H&3=h(C AZ2$lO delta 880 zcmZvaO-NKx6vxkf&U^EGqv4?V8Vym>Cc?!if-V|Komvi4NEo$nz{LcHik`#WFvocE5>`{`tAWN>IW z`Sf?8spb94<;C>WXyKD0qFkKFf$qautsxq%CHioI=<5}tUpRMCH*e(@lFh2;&AlH= zedeU)$1Wn{1`>>{qLLKL@FRF9!hd@=w0DB@@RnSnHIoSaOnYa`AFci>FOwbXPEfH} z3~`&|+qKe(zgzX3aT=^`hj*<;`x{`Lz?nl>ttb-G1y67naq)z9XyF!);f>%|HHSLm zaq!On@J{dqI2IGs>A_tj1$~_;a;^clgr`-G^Wn?cOBhk4vU?m{nBn7g5Jm}bNf9n$ zUfTyKolU&qL)_;2_FZ^eWeaMIZ@Z79b5a8G91E41mwC&L#~yeA{AYr3j#m4zNqFlJ zP&wZV9;o*1d3b{kU3plt2WcU-OS2FUe*hala)|%{ diff --git a/Shaders/BasicVS_PNCTT.cso b/Shaders/BasicVS_PNCTT.cso index 70cdc22e60a952e9a7d148a795f27c55ba5762a9..7491b9c5f7a43d693efc5c74d7bf4a1f23a513b4 100644 GIT binary patch delta 898 zcmZuvJxE(o6u$RqeoUeyjTll5iVBLh5S4&~kyK+T1&!#UsL)ge9kekG)j{+Ljt-Sm zq=SN^8i$s&;84&-bP;saK@_Eni;L~*cOEzXJUwtZ-}%npckg?8Y#|no_O!IVd!IK@ zx;I?EebV)ZHp+ui2(eHlgcZIK=a)-}`FtU+3lM;J<8(#a-li7A#WM1<_d?1u3Tr-p zB|0Lg$=Vtw@vwdxLsqvv&Tgx$PAkZ6*@gI#ZG=y%?6=H;)|~UQdn7*eX|g>&6&?MY zijNNti*!2eW`*R*@k&3vw$^HwRyx&+-gB30}oJwh*)J!}I^6B;4^w;3J0Czd)UgLjQn1pq6*C zCDaqxoxq6AItsy08#)3&I?wRe0ewZSSw|~{9X?A3vdi32GX%7%X2OZ=m-_;K6Y>4) xXOghL&_JxainHP!xrh(spROIyiLje~<4I8$Ed3eZT*Aci&yII9eD@W^$?Y z+MCpV|9pD>YTs)xzUbuzN@Fwss&Ed{@ z9K8Dq-VL4r$6|syeK?C{;O`PeE;QiQ@PeA)V)$nM21XRC?j8phX85EXT%!cIqzD%? zuN?rC&gQ=1X>NCY`w`SO*@7D92kumKQA)rHSg6eWmUrEFY|IPbr3ofETI0uNp*G+` z^?a}RUX5=rK@B?e6cNcDq=nQj>#CpO<)5QlpYt7lhx{X`+2DnLco*IN;rtx8tGl_Z zJl~E+@OHV~(}`$FSH0Nn4)_YV*^}8{iu0a-I|p@LSBE3>TRjCY<7~1{oyvQ!S4G#s s#bkcz(!swXPX;$ZKWSxK$C7!VW0~}~j%5z{2~|)#L?@BTLT!D^8Df5Jxc~qF diff --git a/Shaders/BasicVS_PNCTTT.cso b/Shaders/BasicVS_PNCTTT.cso index 6f91fa13ad7d5426f455f7955c49ab2f99cf6afb..3e0506d637d7c7152005e799b43d9cfdaebb18f6 100644 GIT binary patch delta 898 zcmZuv&r6eW7=OO6ZhP4lZp~cF24X`;8q8$iVUv|BNXUs@j666q&_iiD%7f_q50pnj zWJ19X#ynI@&{JIkFM@&)T|_aubS|%co|o^`UVGrn^Z96CYkQP+ts}s zzY=@!DKQh-{Jy^TuBeEp*i7Vv@4)%&B`RDZGHZygf{)_#rSIL(EhOtz>f_@hr4Bf0 z1Va&2q)3Zfe((T7SQ{Dh7!mbZ=0s%wu%vcqGqA7-c0 zqm#Mpi>J@1R4VyIA^WQWD#W*(EyhnL?;CaMH@|cSXO9tVK)f19tQzCRYT+aB!W-f> z-v}SoJlrYY4!-q2d9;S)rja|8IYYewaG!F3}P#WTh1)7yF56^thk zl?1!yG)S3augZY;@u3lL3;{J*XdEaehzHDm{}OIud8|`jyUO3p=J1HyA}?s40`KKJ z?m&1B$cH5R>lplX$#4{atcmgWK(YxLB{Mc~7u$lD|3^zW<#)lSEUmwQdIiP*0u3Tp zW{QpL6__4i-0eDQ!B1N{!a#ZH5o!aPN3LB*7bo38M-QR}skk`|^j7zTqso_i1%3_p zv+bAPxNj@}8hA0$Chv>!56_d%b+BJ`WJhDEJknTH{Lxs{J8+cM8(H4+gtw{w1d;M1& delta 880 zcmZvaKS&#K6vyB1%w5h)EC$7EP>NF96mf__sDlx!v8&e(#nLVT2Puk06v08oMF)qJ zw`6F*mJXI=Xd5>RUF;+dLc!u-k>X&xc5ra$_Z`2VX!OC4_kN%E@Aux_htc9_Ha9jj ze6TzCC9@r@EcDMGPZzz4BBEl7$bs&|*^Cnv8i>ws5yipVaGvHy9#6cOyp4=OBpBI5B`Fs06uh(1tKM(gJIf__D=yI|lL$Sdy=&DyYoN{x^5dB_mCNM_ zcR0S?Af5QwYU03YwthN%WVP7802>7^{e{(zA`xBi40jP1Pw0deZs8c-0{%dAs0*F~ z@4kU|gQvl4%fGz!P_odP~-f>oldMv3CJ=QDl@<3eK(bS>4osx1e2Vo_mgw*HX@*Q zzEyry@7o1Q`v_b9Czq{+-_;{}A3FeBmG7N4Im_Un9D!i q`K3!IpTu4ad<5Ono*ivV=7F|l(o=2A9P$ZOSUW=hV%5d?{nr1#({L65 diff --git a/Shaders/BasicVS_PNCTTTX.cso b/Shaders/BasicVS_PNCTTTX.cso index 106ebf49bfaa1116c13343d19002e6a12b5ac124..4f76e84a061b5862c6d88ee2aae6314f1729caba 100644 GIT binary patch delta 898 zcmZuvPe_wt7=PYR_lIrK=ESjTASO92WhNtuO;#=sQ6}y((S!33tb=AYYEaZVdr6;= z4hkNPc`%mXL8wcx4q6?%NTPW0Y+n66AMZ@ReBkBzy}#$*?|r^+BUMhtlj*zN+5F4f zKN{w)&7_OpZ*8^BDIzL26WQTAaXx#9HZBl_FA~MTKfviv-s{QD#xJYHr-5Ci{&3s~ z1RGJ2KtaWp(Mg&O@dTm;$Jyu?9WC%8qU%ng)k-1!w2r zXSvMe=r|RNMXxAiUzJ}4xz&E%*t7GtQKt_0sXg%K2*G;9t8v7tFA4Cd0&Koy9c}0z<$+{pBhW$uEwI`P-9VV!%=2$WO+){p8KI=IVf-0 delta 880 zcmZvaO-NKx6vxkf&3p6ajgmv*YsmZ{Wi(ujB52@<=_Ju=N(d!411?02B#btp?rPye zISX4fpstjeMKLW0+7#5ng&-I$6bXesmJ%*B{GZ3YVxtEx=iJ}9=lt)v?|m684W`mV zef@urU)*k5{5Slk?&a5e`;h}hM5PuY2fhnywSwqfB~i^~q9k}P*2DDOfw6_ub=C2H z_=i%PoU;7*HB|JXz}PA}NwW+;L3S$qfA*u!PH_&|f(sE-2>(oHUl-S{o=aXPJKCP4 zd_EuI2FJH6MTvKkY5~s`6 zTvncM$D+8qoNjAEG_Sj!RqF(Q18&~Qyk8$@J^$7avP-%<9GP!54qm|CR2@3S6|Y^z umcYeieo<-Uz3AhfHP8<_^GU~2xus*7^rwzx4*7&C=pCYiXmPsY{*4oP8F5ko diff --git a/Shaders/BasicVS_PNCTTX.cso b/Shaders/BasicVS_PNCTTX.cso index 963e6e466580bada7cac642b542832a7a4ff9cad..1b5b2a9540bf6e0ed60e1fa23ec967f979deb7e5 100644 GIT binary patch delta 898 zcmZuvOG_J36ux&f$&f@%8ZpE+AT^-X3h@zeVIB>vD(Ff#LR|>9J2yp9+_-J)w%-|Utd2c!Ip6)x>$_)WHNF*(8lBIYjkRAL zi!Xn?|J<$b=9eD6mO_ZFCqmfa>v6uig;>oK!c!nb2z(t*yYc)*az6S{#=dl&OL!Be;Q;xgQJrzySGNL;=hGq-l$5r%W=16PIDUJ^&`bVZ(64S=p ziDY89Z$PBeX%8zTZ;np}sLEccUD)ZTRwS=z%d`yB3%IeRuugvMIvwa`!9k}<-qSt}-c3zT zU+^7}2T9h~5%@=(VOs(+Cq_1acoRH|XYAn4_6?r@A0^?2{|-K8YP|$%V-)!V^ai;+ zlWkP3Kz9M-Zq-o;e#X=h1WIv_KsC?@aHQEAS?$6cZGmp&$5FV#Of_p$?7sk#>#>Vrd-$4pJ0F(p6og9UPPc z#XmiW?-HWqbL$qE?6sjX?0`I^X$vk;FwU)l4dOkioQ|c?H zEkE9bjD92-*+wNPmgO0E^Wnd}2ilwG0=y-cXxAh{&uj0S@)xVG%FE^^Q%Ncoiy>}t ze7jaU@u^kMS*OAJ?(nhIXrBN^1ukB|YDSTeE_jK%h>It*LkqWX3~vPQ&>ZT9C&0V@ z!@Izf;8;vhrw4bD4D@57$gKu^KfIu(xDam3-NlF^mE9BI!VI6bgD^^hONww2^V(iO z>1^T+AL16*x5waZmMy4B9(HGAD^dcogoVn?@A=40#9w#;{AYq`j#c~dSMWv=P&wag z9;o*1Rd|CA-33^(2WcU-OSl^-=KOp}HyxHJ|=X`{2SGdn1y0V+g%Jc15 z1aFtCEQKcrBmMYQYy9qE+X?w pmv;UcdEU1Jy01Nl+Lp|3+LlRwX&_rK zhID|05px+d1;eHb340a3`ox{!+S4fi$Umz%#Em(?GB>JGpDhhQ7x^*Cbn7%$cc-wrRlAzt%W z;5#)Bcg**IzkUwi3qA%O%dz{Ub)P}_B$5Br0B-QSQYD`AT#a<%nPSfAJ-p=!Cz6Ot zf>U!Aq|9+v-3K4wpGL?v2GnMwX`q-O&U=S~72L$iSf{*pnK!&0(J7xz{-=EgyvhB( zQ1lH@07=f*G58kAa4i7Y6BF-&WD_zTb*J9RXIe`)K80+pplu%Ycrno??~C!Sf23~>>=zx`)>ta{G!_+qH5Txd5PaRHCw3}=QOPQFVws_suu_m$e_ zwB^TdBBKv6M%GYCie-5Q-r4X)?`Q3u%*%Xg)yR4RqI z+41c<>BM{1bs?E|P(MKomLGfbWFo)FcAoEzL%)G=~ZZbaZ1@O`Y(;Tbu<1gWjBA|M{ zH{4(2+Y9gp9XgA!WDn9pYL|7@O=$UZbn7$zjXxm&7rfcvg@1Vq-A-_Sj_B%cE-TNs zV-dVvqC4AQE$FJ}yWIz01UGv!`y1e#=ieKJcSTo+BJ-`Lz{|LstYfFL>UF8u3b=^O qFI`&sATrkb5p+X)zG_=Ce`s4K{iAJ}Lq4GjYKQ25q%v1~>-H&Aad6K7 diff --git a/Shaders/BasicVS_Sphere.cso b/Shaders/BasicVS_Sphere.cso index 9a0faf7cb51b98bf875714af0863559b1678279e..4f80c88fa2c4d96ac0a94d229e8aa04f8a261d64 100644 GIT binary patch delta 393 zcmaE%^hL?mCBn&hx{-GF=gPV^Wl_by51v%~Wn^GrC=p~}U<1+?K+MC=z>osO7dRLg zUI;KS`~c!07gx746K$m#XH1N|%vdm4mr-1D3kw5-15iB-%mFe$X1&=Q%V@_e6`YZn zl3(tdSmBacT#}fVoXW6z_38ycJq(i>eW*wZ)6c?oICj>i#AgR>*PE}G1h!m1_pu2g^a@W)j*a4P!rHBFz5jCL0|@u zRsquJ;>&>I8d$`)1I2Z)i0=W48vw<5fS3u0j{x}~a0N))Ffec-ESS8OwO;TCR9XS3 y1f;xXvMpP*CL=ItI6%Pz1QI}60f<2c8bHN?0mNVmWZO(W$R^C_v-v99d@caIY&f$3 diff --git a/Shaders/CablePS.cso b/Shaders/CablePS.cso index a3ff7056e0a51d84b2a0a8d067a5fd98fcbf259e..0b38cf36c71f997b0c492f5e02ac9ba15bba3a46 100644 GIT binary patch delta 520 zcmX?Me#6|-CBn&B;LFK)!FTiIOr)M!`t06Y&&a^Qa6_7bffY!b0PzWS1_mBZ1_lQp zjsc1XxwyLZOth5d3_u!ye)idSF}-whP60gD4&4K`?UCF|+T1emozx(0}OfJ%CR^c)}-0J7IW*$P1R zJ}BD&$i4t&I{?{FpzHu3`zMs00AvH142%piK$3$&VDehF;79|Y-5`MO89SgjNDN)v z6DZCB6$j~qc|HIr4st0-JqS$L9Lav4kyAtn7)wBI>t;vJNvw*TLO?HoVv|ciprH{+ UgOpn}D1gOmfb7j5_-^n30PbE%WdHyG delta 514 zcmca%e!|?+CBn)1{9Da`|HX}u-#tAu-C#}07DfgJh7-~Z46H!f1c>*r0|`zb8;E^? z;z2I1ZVeMHr8&KU5`Tbl%##mF3vVp2V3a(=!obh~6oCOdpjkj6h9jE~GM;8+WZ2xx zT*O!(keFg*z_5DtY8Q|dKu`e0OhBB%2I4U=lmKav7)UEfyag&g1xS}*5uXnfufQU{ z9w=UeAwIc_^;mrf)an!!*9KxGX;dIAs&0ND$mYy}{D6O?TLWFLXD9f0f`P<8;2 z{T9kj0J4Eh21W)MAj!eN0(63FUSd*CYH&tkN`84U(BBLU!jsRl*+!~>0u~6+y=ep# z2Z^DJ+XBTopyD8XuwZckii6w_QV#+xn^W2EGja+DF)%oQxxSo}SQ$AcKj0JLU<8RU L{BqgEe}e}AgjY(S diff --git a/Shaders/CableVS.cso b/Shaders/CableVS.cso index 0d135529333db9fe995a0fca39eb23b12a4b29ba..4218d78c3abdfa805c66b92f128091913be26108 100644 GIT binary patch delta 880 zcmZuvO-NKx6h8Oqn|aKPG1JJrW^zzeQYv9ggjvkUq%U`4QX55y#tdvxnGNM4blgbp zk~4%0g_g#+D5k(&fe3Ac+7&@0Mw{0CEc?#m&ZN%{T+VmD@1FCWd*6GUFXyw)*x*o0 z?9b=r#NbZKO0=%5e7vTJsCl_@2*R{0*@UdLx!ZBkU!bkvoxvHzaGm z9l2ZcNOiss{Q3XzY49oVcpSG+PWKr_&JYC;8SqK}f-3T=za!p_Yf5oRrH3KGqt%In+={*mjP1S&~Yycg(+b~x-j#MyvtjzC?PinG%|&vZ{Ds(q&i;J2{< z_tw>?feR|K1ztj4K>DWmQ*dJ7HQ2XWd9Sfl9%wB0{Hd`_Z(=F8H%^7BbD>z`FRmDD AX#fBK delta 894 zcmZvaK}b|l6o$`z&3p5FGm3*TugQp!)QNC0ijs?FN}bvXlZ!BPGvHznr6F{y;>KCD zFpi5B4VV}hGmtVagEqBnAp}K>BBDhGt%O{-@IQ}xMMn=@&bi-z&pG#=_tr+sqnX_J z@JQ(YO8e`7%iRY9Z?n0(rJ^FDayO9!KZvyzg>NR>Y#}=8B8oyA%iVuae4c4n{X36; zDfO8%mY=wSjC)8hwuMSkEYGu0=fY>z_gbCf3e=iQv~3dMpK7&S|72w^dHKRrUz)1b zYKS`=-)@#p{L^aVymQ(5>hO0fZvOym6}b2pQ4&Q$y5J%9VlJ-G2`}8jGCU4`Q**cz zo&xW=fcJo>!7-SiPCxcyIruw7ky8!$dU!z<~)o`TQ!QV$sx9$1>i$;iOK;3CVwzzU>IfY^hBfnfmX5Y_!%tXn}FgM7#N(u79eZb1C+ReMZ+PW z_zf)L=O$aS-Oe5gw}s1)w@$3<2@x I9R3r$0Ncz-<^TWy delta 518 zcmX?NwZ+QPCBn&h#qFn#|01URQQJ2^C0{D)Fe3v4gNZBy11pFIVjB(yhABY&0*H6W zFfatUxVkY+w3OyN%MO$Ts%D<-$SA(Cq=%7_XEP(yX+}nd&1ad57?lDNQ;ZB4RB@lWssPeQ zu!uJU#ZN%RffQW*WT5yNEaJ<6;ujbgoWK?!YuEskxPnE)HlX+oEaHbIyRzM`SAlxc z1V}poF%M8>0FX`qVvyGgplk&oy9vrR0J5h**$zPV3Me}O$leQOCji-?s9eDb7F34QDVU6`RtL5oF{~VmIIZ2+RVrq#U{(q1PxUy27!h~ Tpg0IHI)KPuE}LukPw)Z&HwQ~R diff --git a/Shaders/DirLightPS_MS.cso b/Shaders/DirLightPS_MS.cso index 240b300af12889a1f4c7d7431e206abdc5f02132..aa0ae431184092c51a12b9ed880ba34c6336b658 100644 GIT binary patch delta 710 zcmbQSpXtbcCQFwHCujXQ-L;|*RqQ%^q?dj#tb5MLz`$^1J_7?QkTwBg4-N)~1wi}- zh&_PfK`yRtJQFRYId8HvFxUW9Gf#G86yI3V!^kMHnUU!10n$gH;y?;6-VYQ%fkk{iQ2Y!Q@l8PS3k(cSU<;59+5?ohf1H>S&)j-(_Kz1LLZ2)91fU+Hc>@84s z0FZqW%1!{XLD9mh7#?h{WzT2i^qI!M;0P3$y!k7~HC9H>$qtbsJXQ?~Ky|P4?T5EEyj%GB7aAn9sn#3ZzYd*oK3FVG0nx z0Ad-Sc#w;$8^c6PY0k6kKuMr#=E;tX;u}kP7#VpsGcuiKWMtTUmbr*gDIhV$$bez> z>eV7_Kx2TQ0En4@*aWB%1Y9QPvWnLS0C^jLJOQv61H%et2qOw8egMd10b-D@45+RO zAbkWX4y54X%|P)JSi~m-#m`_7Uj`Jvz`)=HwgB0n4M2%2STt+{ir;{WBRlBOWLLJ^ z^(s(LngD4BAm#z83;@yzKn(I)0hFx(WH&+C20-={DBA(ZUIAqX0NHz?>;xbi6cvmN zGC-1p;R;YZEHkw{peR4fGp~%nIWaf2C^2C3eD+92PMv8C430o$-J2OXud&KR?Jh QUW9oX#D;rXXW|S#048{Jod5s; diff --git a/Shaders/TerrainPS.cso b/Shaders/TerrainPS.cso index 7f2557460856fb35bb3fda73a017c525c9f7a89f..b3b78e057477f8431afc735cdb5969c0909bcdcb 100644 GIT binary patch delta 698 zcmZvaKS%;$7{;GdGtUeTGLm$-LaIU0vZX(em9lv^50|4lVtGT7sU>j)uz@zI&eU_ujqte(&9pcBYLa=M$6h+R$4h_b`2Z z_3rB&D^(=`fnlJ9O2LsE_-X?}9^fJd%qCM)>EjW<>}Mii1MK>1tmAg`&L%DBVSAS} zXQb>EN!J`6Bha!c6*5|Od1HGfyOYdq<+JNcD=3%Ck4~0mY;v&%K3c^NaJYV%gI;hi z_acJSJk`o0`*vv8x3{_U*fYUXP{gfhc3L7}Q#3Vqb{Dt*HAQTjR4$LTfG zr|I`hzeq0zCLzG93#a;^D^tkJ+%T+7ACL=Xixw delta 684 zcmZvaJxD@P6vzM9k9^OpjD#c&q@)ihl9a$9ka~(lgVfT{P}K0+>;q~Dw51#hibqRC zQ$gV*Z*5J2<{+9Hg&G^AA^Kl=NIX4o-ud6(xgY1A`>ypUicXAOQFhfSZv4MKAEx2}FFrc^p{M(i!a{8B%+g2s;3$ArgI+{G&tUj7ev|$eL;A zix4n--8-U?Ti=|HpFVmTeLU^Q)j_%qq(T zUFCpgFMOX|GCMyemv^@FOY%mg%>8f7ExD}PKHnq{0EL#s6BEHU3tq`(;r5L_$Rlm| zCwbK349%DNB_C_f5AkVbQ)mkRkO@Y4fHcK?P){7HJ_@8bd^eN6n}I=PsBs;@>-QIr R$k|;8IRQVKSs#gZ{Q;|FK?DE* diff --git a/Shaders/TerrainVS_PNCCT.cso b/Shaders/TerrainVS_PNCCT.cso index e20d72820b0857c6a1e9b0540d94ab18cafe0341..3a3fce403b139d426b88d44b9e2ae89433d7444c 100644 GIT binary patch delta 420 zcmZ3ZwnNR*CBn(sJM=`ylkVoX9FZc>*g- zy#P=b2r~ik9A+Q^1k7v<3<^M+1;haY0U#d)6o9k}kOql^)WgK}fZ`fZaUca3w+D*r zU=eo#iW>mMc^DYvzy|pM1wbGMNZSBuxW$tt*{WG{=VdIf}0ac6ch|iNR evWaW{0m=fy5@7;VH6t)Afz~0!Hw&^$^8f&-hc@*9 delta 387 zcmdm?wnoj;CBn(Md8h3i!P-X$%9JwCFOw8I!pOkDpd-w{zzU>IfH;GlfkA+SfuV+z zfnkFX14EFDtDDY5OKHwuYzz#4fC`u=D+&v5EU;l@WSG2`QCw05sM7%`4g;1z6G4VX zOuow~&RDbgE2AAVUqE7tkpaW%)vF~y_Doh}5}usE%ES0%axSYl>uaExz~n+!@p=WI zBnuFO01MDQ5D)>N;z~eT11b)r;Nr$WaUCq;7C>brH9r7lfkB1g07#VpcuVoaMGyv*!0E)waCD25Wp(&H^ zGKw>HZ2rn<$1E0{k(iQS?weTQl384mn3tT&uzK}smC3fO%8VZ-C$fr9p1{gdF96g9 z!c0IshZ#r!0W%u|g94Cd0dasp0LTXc1t6^gq(R~!^)PWgptuH997w^%?SbMtSj1g` z;s!u*9tH+Eut7dR0T74*(l$UEZt-MEwrbWIknChdCgI6z*mxvgK-Ho<;`8K-Y~q@K ZfU>}VM3?|o%?J!gpmhlG&4TR4JOJtwHR1pO delta 387 zcmcbhc0|q6CBn%$OumVyf9mSjr;kPHNKU(L#>l|H;3CYxzzU>IfH;GlfkA_Vfnf?K z1H%a+28JLPS2vxBmeQQR*ccf802MG#W)v3QSYX4*$S`>=qqw9BP^SY>90n|bCV~u& zn0%K}oUvx}S4KN#zJSCOBLjxjt5-{a?3t{{Bs@8Rm51@knK!NrY%;yPHwEr8+%Kye-*2ASgkH75W_ z+d$MqL|7)PvQ;w{OkT*QEO`g22;K7Mlkc*LYkmOA0)q;}$zOruAZy@W*(}R$%mV;D CJ21%r diff --git a/Shaders/TerrainVS_PNCCTTTX.cso b/Shaders/TerrainVS_PNCCTTTX.cso index 3601f02466cb8ac6c6e233e3a643def9a5c20c91..171fe905487ebf7e16c8f0aa9725ff1ce9f6f8a7 100644 GIT binary patch delta 417 zcmZqB?$Ne%iEwiM-(vc8*7Gi=ZMN3S%LUYDGcqtR^oTMrumWilATD8NV94QMV7S4_ zz#sq=4{~vJvzTZp&B+Fo_ybhHJlRlGcw>PLBO}k`wT$AD20)z-Kyetb1eypkG-dK# zMsdcD&0iVqn8kuK5>xWaeG@BOGK)(R^O92;RU+6G9&EuJjNR?S)ilAWx`Bs_Ty8;|4*s9JPKe4c!fOH8G!)_v<@M@S&%)S4*>1VHCzAy delta 390 zcmeCtZqT-LiEwg0@!R^p#QYMz@)-w0<&<0685tND8blcwSb?+&5NEJ6FeGp=Fr49J zU|<1?2f4Vq=}feg=KRIR!0-pCfO)c`sQAPSEE_9K7#SHRuVoaMQ~_#s07}7tCD2fi zxe=4^GKw?SZ2rn<$IKUym||qWuzK}s36NEj6`6!5C$RD`KAD`$D$e>EC?+tukX5{1 z0Vv4=#2~-|v=RhFfV2vb28lC)XsEankk){T11Y$;F;H9wi?{_)+yE%f1H>S69H8a| z0BIYDdWZasS$ui>BLm#;~5eIsMH3>x>Kx3?-rr46H!f1jJ@%UnK!Nu)?;yPHwU4Y^S zKye-h205@nK0pBwhyl_zKpJlGWJ$Ja)*6uPWJM<7$!pknBws+)qC4XAHbyu} delta 387 zcmeyO^+LrX)vjLsmXU#hAw!gbffY!bfY|H|3?3W|3|lxE z7~Y65Fa)`{y6H@`l;-@!#=!6gsDOF0qNwo30vkp~hRJIg#U)jMIvs%GFklHZ5oBn@ z|Eh8R%>238<#0>mZk3=B3L3=Atc z85kajFfatUxVl+Pw3Oy#14{e>Dqx<>C@Q?Mz=n~LXYyJ`aY+N9P6wbk3|In91R0t# z`7Wb4W5?#NjCRao!5N7u`Q^Te6)u^@C5d^-sSK-EuU46C%c{)yVR9m?_~Z$!EcF6F zT_DT^#B-Q|1Q0N@F)%0qX%-L%2n2w95KsWpDnJ?}4pI*j*8_@cK*fO+T-+Wgu7gF~ z1t@L+6z5@JkOLd!0~7#(7$9u}q~R7%mSn4DtpUkSR%8;MyoQZO@&!~ax+6YMzQ`u7 b`3EQq3`m3tP}PjUfCO5H5Z^4wZqEk*&*3+! delta 390 zcmcbkbwSJ0CBn&h;g+{G)2!U%5^C&9w=?~=WMp7q2oPmpU14EFDtDDY5OKHwuYzz#4fC`u=3yO+Qyuh-t!i15LVe(o=aY+@RW(S}Y41f#; znHw?rE~7YO&E~I+cFcSMi77?~469eKmH=5bS&>P2asn$4werz`e3rmffBY E0Nfrjxc~qF diff --git a/Shaders/TerrainVS_PNCTTTX.cso b/Shaders/TerrainVS_PNCTTTX.cso index fe03555348b103c37bad6f42198ec79179204d5d..9bf14b25220b97af7b00ba6b73f11bf910c6eaff 100644 GIT binary patch delta 413 zcmaE%^+n6lCBn)1+iRbnKVy#0F_4q7wei#a&d9*PP$J5}zzU>IKx}pfh7b-0h69`o z3_nB|7=m0}-7F?rO0%*7CH_oy6cyiCV8h7BGkGnexTFD4mjh4}3|In90~wey`7Wb4 zW5?#NjCRao!5N7u`Q^Te6)u^@C5d^-sSK-EuU46C%c{)yVR9m?_~Z$!EcF6FT_DT^ z#B-Q|1Q0N@F)%0qX%-L%2n2w95KsWpDnJ?}4pI*j*8_@cK*fO+T-+Wgu7gF~1t@L+ z6z5@JkOLd!0~7#(7$9u}q~R7%mSn4DtpUkSR%8;MyoQZO@&!~ax+6YMzQ`u7`3EQq X3`B$pP}PjUKm=Nc5Z^4w9?k~$>Db4wdje+40PyzE~MN#361vZR~43pO~ic6{hbvgjWVZah-BFNB) z$#)sW8EZCwWwc}F3rI{cGGJJ}dbI?|p2><#!jltNc^IEe&Se#6eGL>7m|VyzUatU@ zWC3CjU;)|(0wO?K1xSO$nLspDTnR{PK*fO+T-+Eau7gF~0w`_(6z2hAkU0)ea{_?0 z4MaUegk`cSTQy_BC#0R+r!3=9fDngzrG0s$Z&1QdX@3XleggVe*s^?>3UP;npy7qtGRg z0g4*{#d#PQW1;VAHqOXnjERqRyideUW@KPs2oPmpU14EFDtDDY5OKHwuYzz#4fC`u=3yO+Qyuh-t!i15LVe(o=aY+@RW(S}Y3|ImU z1(_Q$`7Wb4W6kETjCRa?0f{L_1`MlLua*E=HCd5KcyauYqC$lM7kJ z>lJ{KEILbdJKPsNbLzhHo!@uPd-vYA=TG??^nteazK_$9vr6i?TuIC~ zZ@jiDM3gEg%0#Zk8plK<_Gf-k4x zaqu;8z6m~5}g!^D$3{yS$J9k)#$WFHn!R!i-JZj-tix>xEJ z=y9pLpl78Xg63bTP%)lP+7va;gIERr9f$R7b>PgbTnER7|M37g@6_5q2+q4Uc?)j= z5d!xTiGDR#i$NEFaSw;tvnb}&d~Fr357g>zi$l2ka4XWdhIoW~0hjN_`t=);>&n;e x;nt^dpN&>m$fia#Yz6k9apL~WDN#$m4?^Vfc;a(%tTFDxg%UMk8MlSk*OquP%Pc+5CnZ)gNQB#U4stQA^OiaLZkz;@ArQ5W|(<<63&Ku{A2wC&m;HI_q)(w z@7{(dPk|kYh_Wq2Cd5w6VJlI}MwG{N!$}OhvRK~%zg*&1h=N#1mn;yC!mkU@E>t`y0iP*TKLfv2#xKI}z_YirbNuWj7-{&d z_G(t8P3_D4IQ<|R@P_z-i4KzykFUmLd)M#{af@;Fxd%0x?P&Lp739iRf{$qNOAHx>vmGM<>+$S5v30jSdeC=LUXKofy_8B8{B zWVB<}3(iPP$uIX!tZ>OJE=kNwPGwlVdUXWIHXv{SVkRK2Ut>O zA)7E`#bieyzX8aPm@LRH%-Auxkky~@!{mdk;*&qHve*g$^?)$Qj0mV1%xnw{3P3&& zRGbIM2LTx%tplW4z&r*9mC2H9-t{~{Ux5I~6cB)!A^{W!iGfsuOjm)Lq6`!l!6L2) z6qkUC11Y$AGoZK(7I8bExB>&imKM5D)_hawhw- zinEpgWg{jBvI;ZSOs-}1XM8gGEKu|{P*h;@MOJZD1)xeEAO`7VU;`0A86d3#q@e~e zNK95`^JZk2T*xL~&ja*}08|d7M*^xx94Ib=MO+CeE`e+oRJ|5ZTn3A{5l~zK$sCw( c?117b3=EUm*#%kMfNTx0pZqo(vY+Py04(`4bpQYW diff --git a/Shaders/WaterVS_PNCT.cso b/Shaders/WaterVS_PNCT.cso index de99c26106ea92c12a02462bf0a4ddbc923e6b58..36301fe0ddcf16d5c1497e20bf76d447cbb99193 100644 GIT binary patch delta 438 zcmeyN+@fOX65-_h>h*@$OL;~=Zayd%T(*1BcSZ&V1{NU(238<#0>l^C85j~c7#LbO z85lYQ85n|GT-~Njw3KE|0!rMOJXcVBV}Sr8JN5+@6?inHbdWdkNZ zWD{nrnCuATHvst&lLgs@89OEyvidWAn0$~`eDViY7Fz+J9uNkZ5dk%WnT>%#0m$cp zit_;ZARq&zb$~Prn8(1NGFg(%yPgN=BM<! z;u27CAO%-%1{9aUB5ns1S72b6{FqIU)eFd00sAj#GB3M0YZQ>L1LAMCVc)|A07S+< AZ2$lO delta 418 zcmZos`Jrs-65-^0w_*F)(o060(oPFIXE#e9Vq{=o_#w!^zzU>IfcOYI149T0149KT z149i^Jjlh>tz)94G-nu4;to&&^W=?!!W#<&7#a6WZe$dfYys*t0E)waB+x{lUIvZL z8yW4Gl>!n|j0_l7uU_o~vH=JjfS3u0E0}=<5QI*aWfhl91j+^gc`QH-k_`bdfFNhG zFRM6f2~aj-av-ZPW6k7RR)5APlg|Q0Ujs!2CSPO~S5*M2rvmyIsE&%7tH8TJJ diff --git a/Shaders/WaterVS_PNCTX.cso b/Shaders/WaterVS_PNCTX.cso index 8bb643c1cf6b13ff4b7596b46e916156d0673745..7b0e193b19949b9cd73f660504b38a53d22f5207 100644 GIT binary patch delta 438 zcmbQCzC_*9CBn%$S#oX7`K6mL&KD@;I~A|g&&a^Qutb=FffY!b0PzKO28IR>pcp3u zg9cDM$i>xd%0x?P)+C_BoyoSs;u{MD7#UAYZe$dfoB-5i0MrBnl0egd`WQ?$Z)CJ% z)(g%^Ovx|zO{{RqEG|jROHO52y?S*7$R;3g0AeN}u3!cdK#(|DkX4*D7bqJr`5~Jy zW5r}gAin{~kC-gTF3i|5xscVL@x$bUtm2bDu(H?+0QG<{$czZ68O&@93<^L#4^*57 z$Oi!#Agu$WS-?C729?Q@Y~J-eKp%ks$P^HOnIZuc2Z@1HgG^U}nxYI87r`Q~2Naip xiUTRQdNZK73>I-aptu49!{os&fvkiL;4*+v=I~f1~ delta 418 zcmZ3YK11EoCBn&>C(CV}Ua{MbCD%-NZ!J7#&B(yOFhiJuffY!b0Pzua28I$2pcp3u zgA7nS$i>yIW1^)rXBbf84p0H}JNLMO|zic2N}Wdndb79a-6hJYAAkTcnr zRh+d1C>t?3kX4wmW^yg7KjV|hXMv)xfuaJFFS3fODgagT05M1>0~?3{$^dB{APqH$ zL1MBhn>QoFIfcOGC1A__&1A_-A z149o#14EFDtJ{=`meQk~Brz{Jm0|Vj)e#_@fWQHWnSi*08At#@;$%Tqan@X*Y{2A) zY{HBclO2Kl1|UCTvLL%KW5?t|R)5A1lMk|rPyWElVheOL0|l|H@Q0s)ffY!b0Pzua1_lWZ1_m2W z28ITpc#w;$TgOC8Y1S~H#GT1&`NcOD2rx44ncT=IF4+RqWdPI!1Cl_~fch9THg9CK zV^#`COffQGSiO3+56E;NZ~$T^Ag*8r5_OKfa(zkii=f aimNa%OlD^nWOW0wHNbxI+ib{wodW=FNHq}v diff --git a/WorldForm.Designer.cs b/WorldForm.Designer.cs index 055fa64..9c00650 100644 --- a/WorldForm.Designer.cs +++ b/WorldForm.Designer.cs @@ -176,6 +176,7 @@ namespace CodeWalker this.BoundsStyleComboBox = new System.Windows.Forms.ComboBox(); this.label8 = new System.Windows.Forms.Label(); this.tabPage10 = new System.Windows.Forms.TabPage(); + this.DeferredShadingCheckBox = new System.Windows.Forms.CheckBox(); this.WeatherRegionComboBox = new System.Windows.Forms.ComboBox(); this.label29 = new System.Windows.Forms.Label(); this.CloudParamTrackBar = new System.Windows.Forms.TrackBar(); @@ -295,7 +296,6 @@ namespace CodeWalker this.ToolbarPanel = new System.Windows.Forms.Panel(); this.SubtitleLabel = new System.Windows.Forms.Label(); this.SubtitleTimer = new System.Windows.Forms.Timer(this.components); - this.DeferredShadingCheckBox = new System.Windows.Forms.CheckBox(); this.StatusStrip.SuspendLayout(); this.ToolsPanel.SuspendLayout(); this.ToolsTabControl.SuspendLayout(); @@ -665,7 +665,7 @@ namespace CodeWalker this.WorldDetailDistTrackBar.BackColor = System.Drawing.SystemColors.ControlLightLight; this.WorldDetailDistTrackBar.LargeChange = 10; this.WorldDetailDistTrackBar.Location = new System.Drawing.Point(6, 110); - this.WorldDetailDistTrackBar.Maximum = 30; + this.WorldDetailDistTrackBar.Maximum = 50; this.WorldDetailDistTrackBar.Name = "WorldDetailDistTrackBar"; this.WorldDetailDistTrackBar.Size = new System.Drawing.Size(182, 45); this.WorldDetailDistTrackBar.TabIndex = 62; @@ -2233,6 +2233,19 @@ namespace CodeWalker this.tabPage10.Text = "Lighting"; this.tabPage10.UseVisualStyleBackColor = true; // + // DeferredShadingCheckBox + // + this.DeferredShadingCheckBox.AutoSize = true; + this.DeferredShadingCheckBox.Checked = true; + this.DeferredShadingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.DeferredShadingCheckBox.Location = new System.Drawing.Point(10, 5); + this.DeferredShadingCheckBox.Name = "DeferredShadingCheckBox"; + this.DeferredShadingCheckBox.Size = new System.Drawing.Size(107, 17); + this.DeferredShadingCheckBox.TabIndex = 30; + this.DeferredShadingCheckBox.Text = "Deferred shading"; + this.DeferredShadingCheckBox.UseVisualStyleBackColor = true; + this.DeferredShadingCheckBox.CheckedChanged += new System.EventHandler(this.DeferredShadingCheckBox_CheckedChanged); + // // WeatherRegionComboBox // this.WeatherRegionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; @@ -3415,19 +3428,6 @@ namespace CodeWalker // this.SubtitleTimer.Tick += new System.EventHandler(this.SubtitleTimer_Tick); // - // DeferredShadingCheckBox - // - this.DeferredShadingCheckBox.AutoSize = true; - this.DeferredShadingCheckBox.Checked = true; - this.DeferredShadingCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; - this.DeferredShadingCheckBox.Location = new System.Drawing.Point(10, 5); - this.DeferredShadingCheckBox.Name = "DeferredShadingCheckBox"; - this.DeferredShadingCheckBox.Size = new System.Drawing.Size(107, 17); - this.DeferredShadingCheckBox.TabIndex = 30; - this.DeferredShadingCheckBox.Text = "Deferred shading"; - this.DeferredShadingCheckBox.UseVisualStyleBackColor = true; - this.DeferredShadingCheckBox.CheckedChanged += new System.EventHandler(this.DeferredShadingCheckBox_CheckedChanged); - // // WorldForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);