From a65909686b1dac2558900473380e1beb5a9f53c3 Mon Sep 17 00:00:00 2001 From: AdaInTheLab Date: Thu, 28 May 2026 17:47:56 -0400 Subject: [PATCH 1/8] fix(opaque): clamp builtinOpaques to 0 on dedicated server Dedicated server installs have no GPU atlas, so the diffuse-texture check leaves builtinOpaques at -1. That falls through to incorrect ID assignment in the paint registration loop below. Clamping to 0 makes the headless install run cleanly ~ tiling.index is a render concern, so the value doesn't matter on server beyond not being -1. --- Harmony/OpaqueTextures.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Harmony/OpaqueTextures.cs b/Harmony/OpaqueTextures.cs index b2175d3..9f61e27 100644 --- a/Harmony/OpaqueTextures.cs +++ b/Harmony/OpaqueTextures.cs @@ -100,6 +100,16 @@ static void InitOpaqueConfig() var opaqueAtlas = opaque.textureAtlas as TextureAtlasBlocks; if (builtinOpaques == -1 && opaqueAtlas.diffuseTexture != null) builtinOpaques = (opaqueAtlas.diffuseTexture as Texture2DArray).depth; + // Dedicated server has no GPU atlas, so the diffuse texture + // check above never resolves a depth. Treating that as -1 falls + // through to incorrect ID assignment downstream; clamp to 0 so + // the headless install runs cleanly. tiling.index is a render + // concern, so leaving it 0 on server is fine. + if (builtinOpaques == -1) + { + builtinOpaques = 0; + Log.Out("[OcbCustomTextures] Dedicated server: no diffuse texture, builtinOpaques clamped to 0"); + } var textures = OpaqueConfigs.Values.ToList(); if (opaque == null) throw new Exception("MESH MISSING"); var atlas = opaque.textureAtlas as TextureAtlasBlocks; From 01f48575e233bb318f62fd964a98b108380ca5b7 Mon Sep 17 00:00:00 2001 From: AdaInTheLab Date: Thu, 28 May 2026 17:48:15 -0400 Subject: [PATCH 2/8] fix(opaque): GetFreePaintID grows array instead of throwing Previously threw 'No more free Paint IDs' when BlockTextureData.list filled up at 255 entries. Now resizes by 256 and returns the next slot. Only fires when the array is genuinely full, so vanilla-sized configs never hit it ~ this is a transparent fallback for paint packs that exceed the default capacity, not a behavior change for default installs. --- Harmony/OpaqueTextures.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Harmony/OpaqueTextures.cs b/Harmony/OpaqueTextures.cs index 9f61e27..e98e73c 100644 --- a/Harmony/OpaqueTextures.cs +++ b/Harmony/OpaqueTextures.cs @@ -66,7 +66,16 @@ static int GetFreePaintID() { for (var i = 0; i < BlockTextureData.list.Length; i++) if (BlockTextureData.list[i] == null) return i; - throw new Exception("No more free Paint IDs"); + // Was: throw new Exception("No more free Paint IDs"). Grow the + // backing array instead so a paint pack with more entries than + // the current capacity registers cleanly. This only fires when + // the array is genuinely full, so vanilla-sized configs never + // hit it. + var oldLen = BlockTextureData.list.Length; + Array.Resize(ref BlockTextureData.list, oldLen + 256); + Log.Out("[OcbCustomTextures] BlockTextureData.list grown {0} -> {1} to make room for new paint", + oldLen, BlockTextureData.list.Length); + return oldLen; } private static ushort PatchAtlasBlocks(MeshDescription mesh, TextureConfig tex) From 0a04c0113279ad8e097af6e4511a1013d3ede759 Mon Sep 17 00:00:00 2001 From: AdaInTheLab Date: Thu, 28 May 2026 17:48:31 -0400 Subject: [PATCH 3/8] fix(opaque): ApplyTextures sizes atlas via Max(depth, builtinOpaques) The old sizing 'texture.depth + OpaquesAdded' assumes texture.depth reflects the current builtinOpaques count, which fails when the initial texture was allocated against an older atlas size and the current builtinOpaques is larger. The Max() takes the same value as the original in the common case where texture.depth >= builtinOpaques, and only changes behavior when the texture would otherwise be undersized. --- Harmony/OpaqueTextures.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Harmony/OpaqueTextures.cs b/Harmony/OpaqueTextures.cs index e98e73c..2dd282e 100644 --- a/Harmony/OpaqueTextures.cs +++ b/Harmony/OpaqueTextures.cs @@ -328,8 +328,13 @@ static Texture2DArray ApplyTextures(Texture2DArray texture, CommandBuffer cmds, if (OpaquesAdded == 0) return texture; if (GameManager.IsDedicatedServer) return texture; if (!texture.name.StartsWith("ta_opaque")) return texture; + // Was: texture.depth + OpaquesAdded. That undersizes the + // atlas whenever builtinOpaques > texture.depth (e.g. when the + // initial texture was allocated against an older atlas size). + // Max() keeps the original behavior in the common case where + // texture.depth >= builtinOpaques. var copy = ResizeTextureArray(cmds, texture, - texture.depth + OpaquesAdded, true, true); + System.Math.Max(texture.depth, builtinOpaques) + OpaquesAdded, true, true); foreach (TextureConfig cfg in OpaqueConfigs.Values) for (int i = 0; i < cfg.Length; i += 1) PatchTextures(cmds, copy, lookup(cfg), cfg.tiling, i, fallback); From a479e21af5bb1787d303956b68870a0b67230231 Mon Sep 17 00:00:00 2001 From: AdaInTheLab Date: Thu, 28 May 2026 17:48:52 -0400 Subject: [PATCH 4/8] feat(opaque): pre-size BlockTextureData.list at config-load Hooks into BlockTexturesFromXML.CreateBlockTextures Prefix to grow BlockTextureData.list to a 1024-entry floor before any chunk deserialization can access high paint IDs. Without this, reloading a save built against a larger texture set than the current process can fit throws IndexOutOfRange from the chunk-paint accessor. The minSize floor of 1024 covers the existing vanilla range plus a margin large enough that paint packs with several hundred entries don't trigger an additional resize during config-load. --- Harmony/OpaqueTextures.cs | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/Harmony/OpaqueTextures.cs b/Harmony/OpaqueTextures.cs index 2dd282e..a27a4ea 100644 --- a/Harmony/OpaqueTextures.cs +++ b/Harmony/OpaqueTextures.cs @@ -56,11 +56,40 @@ static void ParseOpaqueConfig(XElement root) public class BlockTexturesFromXMLCreateBlockTexturesPrefix { public static void Prefix(XmlFile _xmlFile) - => ParseOpaqueConfig(_xmlFile.XmlDoc.Root); + { + ParseOpaqueConfig(_xmlFile.XmlDoc.Root); + // Pre-size BlockTextureData.list BEFORE any chunk + // deserialization can access high paint IDs from saved + // data. Without this, reloading a save built against a + // larger texture set than the current process can fit + // throws IndexOutOfRange from the chunk-paint accessor. + EarlyResizeBlockTextureList(); + } } - // #################################################################### - // #################################################################### + static void EarlyResizeBlockTextureList() + { + // Generous floor: covers the existing vanilla range plus a + // sensible margin so a paint pack with several hundred + // entries doesn't trigger a resize during config-load. The + // GetFreePaintID safety net below grows the array further + // on demand if a config truly exceeds this. + const int minSize = 1024; + if (BlockTextureData.list == null) + { + BlockTextureData.list = new BlockTextureData[minSize]; + Log.Out("[OcbCustomTextures] Created BlockTextureData.list (was null) size={0}", minSize); + return; + } + var required = System.Math.Max(minSize, 512 + OpaqueConfigs.Count + 256); + if (BlockTextureData.list.Length < required) + { + var oldLen = BlockTextureData.list.Length; + Array.Resize(ref BlockTextureData.list, required); + Log.Out("[OcbCustomTextures] Pre-resized BlockTextureData.list {0} -> {1} (save reload protection)", + oldLen, required); + } + } static int GetFreePaintID() { From cdaa5c2745b038d7b43be48ca45ac4c33cfbf378 Mon Sep 17 00:00:00 2001 From: AdaInTheLab Date: Thu, 28 May 2026 17:49:09 -0400 Subject: [PATCH 5/8] feat(opaque): pre-size BlockTextureData.list in InitOpaqueConfig Right before the paint registration loop, grow the array to fit the upcoming ID assignments in 256-slot blocks. A small config gets a small bump and a large pack doesn't trigger an array resize per registered paint. Complements the config-load-time pre-size (which handles save reload ordering): this one handles the case where the config is freshly parsed but the array is still vanilla-sized. --- Harmony/OpaqueTextures.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Harmony/OpaqueTextures.cs b/Harmony/OpaqueTextures.cs index a27a4ea..e66d7e9 100644 --- a/Harmony/OpaqueTextures.cs +++ b/Harmony/OpaqueTextures.cs @@ -149,6 +149,19 @@ static void InitOpaqueConfig() Log.Out("[OcbCustomTextures] Dedicated server: no diffuse texture, builtinOpaques clamped to 0"); } var textures = OpaqueConfigs.Values.ToList(); + // Pre-resize BlockTextureData.list to fit the about-to-be- + // assigned paint IDs. Grows in 256-slot blocks so a small + // config gets a small bump and a large pack doesn't trigger + // a resize per registered paint. + var idFloor = System.Math.Max(builtinOpaques, 512); + var required = idFloor + textures.Count + 1; + if (BlockTextureData.list != null && required > BlockTextureData.list.Length) + { + var oldLen2 = BlockTextureData.list.Length; + var newLen2 = ((required / 256) + 1) * 256; + Array.Resize(ref BlockTextureData.list, newLen2); + Log.Out("[OcbCustomTextures] Pre-resized BlockTextureData.list {0} -> {1}", oldLen2, newLen2); + } if (opaque == null) throw new Exception("MESH MISSING"); var atlas = opaque.textureAtlas as TextureAtlasBlocks; if (atlas == null) throw new Exception("INVALID ATLAS TYPE"); From 504fae22f46e5dc83862b76d32b95412266e1b7b Mon Sep 17 00:00:00 2001 From: AdaInTheLab Date: Thu, 28 May 2026 17:49:31 -0400 Subject: [PATCH 6/8] feat(opaque): BlockTextureData.Init prefix safety net for on-demand grow Final safety net: if any code path (e.g. chunk deserialization running before InitOpaqueConfig fires) tries to register a BlockTextureData with ID >= list.Length, auto-grow the array in 256-slot blocks. This is a no-op for the common case where the array is already sized correctly by the two pre-size hooks above; it exists to catch ordering bugs where a high-ID paint gets touched before either pre-size pass has run. --- Harmony/OpaqueTextures.cs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Harmony/OpaqueTextures.cs b/Harmony/OpaqueTextures.cs index e66d7e9..5d0bb0e 100644 --- a/Harmony/OpaqueTextures.cs +++ b/Harmony/OpaqueTextures.cs @@ -91,6 +91,36 @@ static void EarlyResizeBlockTextureList() } } + // Safety net: if any code path tries to access + // BlockTextureData.list with an index >= Length, auto-grow. + // Catches chunk deserialization that runs before InitOpaqueConfig + // has a chance to size the array. No-op for the common case + // where the array is already large enough. + + [HarmonyPatch(typeof(BlockTextureData), nameof(BlockTextureData.Init))] + static class BlockTextureDataInitPatch + { + static bool Prefix(BlockTextureData __instance) + { + if (BlockTextureData.list == null) + { + BlockTextureData.list = new BlockTextureData[System.Math.Max(1024, __instance.ID + 256)]; + Log.Out("[OcbCustomTextures] Created BlockTextureData.list on-demand for ID {0}, size={1}", + __instance.ID, BlockTextureData.list.Length); + return true; + } + if (__instance.ID >= BlockTextureData.list.Length) + { + var oldLen = BlockTextureData.list.Length; + var newLen = System.Math.Max(1024, (((__instance.ID + 1) / 256) + 1) * 256); + Array.Resize(ref BlockTextureData.list, newLen); + Log.Out("[OcbCustomTextures] Safety resize for ID {0}: {1} -> {2}", + __instance.ID, oldLen, newLen); + } + return true; // continue with original Init + } + } + static int GetFreePaintID() { for (var i = 0; i < BlockTextureData.list.Length; i++) From f102967974fb5baa544e3b13d990517f4c3ef297 Mon Sep 17 00:00:00 2001 From: AdaInTheLab Date: Thu, 28 May 2026 17:50:39 -0400 Subject: [PATCH 7/8] fix(textureutils): cap PatchTexture mip loop at source's mipmapCount MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PatchTexture walked dst.mipmapCount unconditionally, which is correct when src is the same size or larger (the '2k into 1k' case the quality offset is designed for) but overruns the source when src is SMALLER than dst. The loop would ask src for mip levels it doesn't have, and Unity logs ERR Graphics.CopyTexture called with invalid source mip level (got 8, have 8 mips) for every iteration past src's last. That floods the console at chunk paint time, especially with third-party paint mods that ship small paint textures (128×128, 8 mips) being patched into bigger atlas slots (1024+, 11+ mips). Cap at Math.Min(dst.mipmapCount, src.mipmapCount - offset) and bail when src has nothing usable at the current quality offset. Destination's smallest mip levels are left unwritten; those only matter at extreme view distance and existing destination contents are preserved. Independent of paint capacity ~ benefits any OCB install with mixed- size paint packs. --- Utils/OcbTextureUtils.cs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Utils/OcbTextureUtils.cs b/Utils/OcbTextureUtils.cs index f1c2807..8a9daeb 100644 --- a/Utils/OcbTextureUtils.cs +++ b/Utils/OcbTextureUtils.cs @@ -224,17 +224,37 @@ public static void PatchTexture( Texture src, int srcidx = 0) { var offset = GetMipMapOffset(); + // Cap iteration at whichever is smaller: dst's full mip count, or + // src's available mips above the quality offset. The original + // implementation walked dst.mipmapCount unconditionally, which is + // fine when src is the same size or larger (the "2k into 1k" case + // the offset is designed for) but EXPLODES when src is smaller + // than dst ~ e.g. a 128×128 paint texture (8 mips, levels 0-7) + // being copied into a 1024+ atlas slot (11+ mips). The loop would + // ask src for mips 8, 9, 10, none of which exist, and Unity logs + // ERR Graphics.CopyTexture called with invalid source mip level + // (got 8, have 8 mips) + // for every iteration past the source's last mip. That floods the + // console at chunk paint time, especially when third-party paint + // mods (e.g. PyroPaints, "CK Textures N Paints") ship small paint + // textures that get patched into bigger atlas slots through here. + // Capping leaves the destination's smallest mip levels unwritten; + // those mips only matter at extreme view distance and the + // existing destination contents (vanilla or prior swap) are kept. + int maxMips = Math.Min(dst.mipmapCount, src.mipmapCount - offset); + if (maxMips <= 0) return; // Source has nothing usable at this quality + // Copy all mips individually, could optimize ideal case // Given that we don't do this often, not much to gain if (dst.isReadable && src.isReadable) { - for (int m = 0; m < dst.mipmapCount; m++) + for (int m = 0; m < maxMips; m++) SetPixelData(GetPixelData(src, srcidx, offset + m), dst, dstidx, m); ApplyPixelData(dst, false, false); } else { - for (int m = 0; m < dst.mipmapCount; m++) cmds. + for (int m = 0; m < maxMips; m++) cmds. CopyTexture(src, srcidx, m + offset, dst, dstidx, m); } } From fbdf35ac710fccc8df30a71253a5cb648d877e1a Mon Sep 17 00:00:00 2001 From: AdaInTheLab Date: Tue, 16 Jun 2026 05:04:25 -0400 Subject: [PATCH 8/8] Rebuild for 7D2D v3.0 (Dead Hot Summer) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The paint-limit-1023 logic needed no source changes — 3.0's texture-atlas API (BlockTextureData.list, MeshDescription, TextureAtlasBlocks, Texture2DArray) is unchanged, so the fork recompiles clean against the 3.0 assemblies. - Added a netstandard reference (game-relative, $(PATH_7D2D_MANAGED)\netstandard.dll) so the legacy project builds without a globally-installed .NET Framework 4.8 Developer Pack — 3.0's Unity surfaces netstandard 2.1 types (NativeArray). - Rebuilt CustomTextures.dll against 3.0. - ModInfo 0.8.0 -> 0.8.1; gitignore the local .managed-3.0 build-staging dir. Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 1 + CustomTextures.csproj | 3 +++ CustomTextures.dll | Bin 37888 -> 39936 bytes ModInfo.xml | 2 +- README.md | 4 ++++ 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3a21cd3..56bad57 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /build /.vs *.pdb +/.managed-3.0 diff --git a/CustomTextures.csproj b/CustomTextures.csproj index 294b9b3..3d0e7d9 100644 --- a/CustomTextures.csproj +++ b/CustomTextures.csproj @@ -45,6 +45,9 @@ $(PATH_7D2D_MANAGED)\Assembly-CSharp.dll + + $(PATH_7D2D_MANAGED)\netstandard.dll + $(PATH_7D2D_MANAGED)\LogLibrary.dll diff --git a/CustomTextures.dll b/CustomTextures.dll index e2cc9a323340596b722250d6cf4672c6c1692b5d..50cb59823bca519d8d7fdce208c277ed85ba1af2 100644 GIT binary patch literal 39936 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 - + \ No newline at end of file diff --git a/README.md b/README.md index 177cb82..b3c9c5e 100644 --- a/README.md +++ b/README.md @@ -238,6 +238,10 @@ These seem implemented fully, but unused for now! ## Changelog +### Version 0.8.1 + +- Rebuild for 7D2D V3.0 "Dead Hot Summer" (paint-limit-1023 fork). No source changes to the paint-limit logic — the texture-atlas API is unchanged. Added a `netstandard` reference so the project builds without a globally-installed .NET Framework 4.8 Developer Pack. + ### Version 0.8.0 - Update for 7D2D V2.0 exp (b285)