diff --git a/IRTweaks/IRTweaks/IRTweaks.csproj b/IRTweaks/IRTweaks/IRTweaks.csproj index 6b27c33..dd4f4dd 100644 --- a/IRTweaks/IRTweaks/IRTweaks.csproj +++ b/IRTweaks/IRTweaks/IRTweaks.csproj @@ -119,6 +119,7 @@ + diff --git a/IRTweaks/IRTweaks/Modules/UI/MapBoundary.cs b/IRTweaks/IRTweaks/Modules/UI/MapBoundary.cs new file mode 100644 index 0000000..449d915 --- /dev/null +++ b/IRTweaks/IRTweaks/Modules/UI/MapBoundary.cs @@ -0,0 +1,84 @@ +using BattleTech; +using BattleTech.Designed; +using Harmony; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace IRTweaks.Modules.UI +{ + [HarmonyPatch(typeof(EncounterLayerData), "GetEncounterBoundaryTexture")] + static class MapBoundary + { + // TODO: Add real conditional gate here. + static bool Prepare() => true; + + static void Prefix(EncounterLayerData __instance, + ref Texture2D ___encounterBoundaryTexture, EncounterBoundaryChunkGameLogic ___encounterBoundaryChunk) + { + // Override the default texture composition if it's not already been created. The vanilla method will then return it. + if (___encounterBoundaryTexture == null) + { + int mapBoundaryWidth = SplatMapInfo.mapBoundaryWidth; + //int num = 2048 - SplatMapInfo.mapBoundaryWidth; + int num = 2048 - (SplatMapInfo.mapBoundaryWidth * 2); + Mod.Log.Info?.Write($"Generating boundary texture with mapBoundaryWidth:{mapBoundaryWidth} num: {num}"); + + // Recalculate the rectHolders for the encounter boundaries + __instance.CalculateEncounterBoundary(); + + if (___encounterBoundaryChunk != null && ___encounterBoundaryChunk.encounterBoundaryRectList.Count > 0) + { + ___encounterBoundaryTexture = new Texture2D(512, 512, TextureFormat.ARGB32, mipChain: false); + + // Initialize the map to a flat black + Color[] pixels = ___encounterBoundaryTexture.GetPixels(); + for (int i = 0; i < pixels.Length; i++) + { + pixels[i] = Color.black; + } + ___encounterBoundaryTexture.SetPixels(pixels); + + // Iterate all the encounter boundaries + for (int rectIdx = 0; rectIdx < ___encounterBoundaryChunk.encounterBoundaryRectList.Count; rectIdx++) + { + Rect rect = ___encounterBoundaryChunk.encounterBoundaryRectList[rectIdx].rect; + int rectXOrigin = (int)rect.x; + int rectYOrigin = (int)rect.y; + Mod.Log.Info?.Write($"Texturing encounterBoundaryRect at idx: {rectIdx} with coordinates: {rectXOrigin}, {rectYOrigin} "); + + for (int heightIdx = 0; (float)heightIdx < rect.height; heightIdx++) + { + for (int widthIdx = 0; (float)widthIdx < rect.width; widthIdx++) + { + int posX = widthIdx + 1024 + rectXOrigin; + int posY = heightIdx + 1024 + rectYOrigin; + if (mapBoundaryWidth < posX && posX < num && mapBoundaryWidth < posY && posY < num) + { + Mod.Log.Info?.Write($"Setting pixel at: {posX / 4}, {posY / 4} to white."); + ___encounterBoundaryTexture.SetPixel(posX / 4, posY / 4, Color.white); + } + } + } + } + ___encounterBoundaryTexture.Apply(); + + // Apply a shader (presumably that illuminates as you get closer?) + Material mat = new Material(Shader.Find("Hidden/BT-ConvertToSDF")); + + // Blit the shader onto map and update mipmaps + RenderTexture temporary = RenderTexture.GetTemporary(___encounterBoundaryTexture.width, ___encounterBoundaryTexture.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); + Graphics.Blit(___encounterBoundaryTexture, temporary, mat, 0); + RenderTexture.active = temporary; + //___encounterBoundaryTexture.ReadPixels(new Rect(0f, 0f, ___encounterBoundaryTexture.width, ___encounterBoundaryTexture.height), 0, 0); + ___encounterBoundaryTexture.Apply(updateMipmaps: true, makeNoLongerReadable: false); + + RenderTexture.active = null; + } + } + } + } +}