From 12dd0136cba6c7f8db9e81bb03545cdc9cdb2213 Mon Sep 17 00:00:00 2001 From: ifBars Date: Sat, 3 Oct 2026 17:15:02 -0700 Subject: [PATCH] fix(rendering): restore beta item icon captures and requested size --- .../Rendering/RuntimePreviewLayerTests.cs | 40 +++++++++++++++++++ .../Internal/Rendering/RuntimePreviewLayer.cs | 17 ++++++++ S1API/Rendering/IconFactory.cs | 21 +++++----- 3 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 S1API.Tests/Rendering/RuntimePreviewLayerTests.cs create mode 100644 S1API/Internal/Rendering/RuntimePreviewLayer.cs diff --git a/S1API.Tests/Rendering/RuntimePreviewLayerTests.cs b/S1API.Tests/Rendering/RuntimePreviewLayerTests.cs new file mode 100644 index 00000000..6fea3098 --- /dev/null +++ b/S1API.Tests/Rendering/RuntimePreviewLayerTests.cs @@ -0,0 +1,40 @@ +using S1API.Internal.Rendering; + +namespace S1API.Tests.Rendering; + +public sealed class RuntimePreviewLayerTests +{ + [Fact] + public void BetaLayerIsSelectedWhenLegacyLayerIsAbsent() + { + Assert.Equal(20, RuntimePreviewLayer.Resolve(name => + name == "RuntimePreviewGeneration" ? 20 : -1)); + } + + [Fact] + public void CurrentLayerTakesPriorityWhenBothNamesExist() + { + Assert.Equal(20, RuntimePreviewLayer.Resolve(name => + name == "RuntimePreviewGeneration" ? 20 : 30)); + } + + [Fact] + public void OlderGamesRetainTheirLegacyLayer() + { + Assert.Equal(30, RuntimePreviewLayer.Resolve(name => + name == "IconGeneration" ? 30 : -1)); + } + + [Fact] + public void LayerZeroIsValidAndDoesNotTriggerFallback() + { + Assert.Equal(0, RuntimePreviewLayer.Resolve(name => + name == "RuntimePreviewGeneration" ? 0 : 30)); + } + + [Fact] + public void MissingLayersRemainUnavailableInsteadOfUsingAnUnrelatedLayer() + { + Assert.Equal(-1, RuntimePreviewLayer.Resolve(_ => -1)); + } +} diff --git a/S1API/Internal/Rendering/RuntimePreviewLayer.cs b/S1API/Internal/Rendering/RuntimePreviewLayer.cs new file mode 100644 index 00000000..7b20866f --- /dev/null +++ b/S1API/Internal/Rendering/RuntimePreviewLayer.cs @@ -0,0 +1,17 @@ +using System; +using UnityEngine; + +namespace S1API.Internal.Rendering +{ + internal static class RuntimePreviewLayer + { + internal static int Resolve() => + Resolve(LayerMask.NameToLayer); + + internal static int Resolve(Func findLayer) + { + int layer = findLayer("RuntimePreviewGeneration"); + return layer >= 0 ? layer : findLayer("IconGeneration"); + } + } +} diff --git a/S1API/Rendering/IconFactory.cs b/S1API/Rendering/IconFactory.cs index fd723ef6..f5e31b99 100644 --- a/S1API/Rendering/IconFactory.cs +++ b/S1API/Rendering/IconFactory.cs @@ -12,6 +12,7 @@ using S1API.Logging; using S1API.Internal.Utils; +using S1API.Internal.Rendering; using System; using System.Collections; using System.Collections.Generic; @@ -147,6 +148,13 @@ internal static bool IsItemIconGeneratorReady return null; } + int iconLayer = RuntimePreviewLayer.Resolve(); + if (iconLayer < 0) + { + Logger.Error("Neither RuntimePreviewGeneration nor IconGeneration exists. Cannot generate icon."); + return null; + } + Transform? originalParent = model.parent; Vector3 originalPos = model.localPosition; Quaternion originalRot = model.localRotation; @@ -167,14 +175,9 @@ internal static bool IsItemIconGeneratorReady // Now activate and set layers (after parenting) model.gameObject.SetActive(true); - int iconLayer = LayerMask.NameToLayer("IconGeneration"); - if (iconLayer != -1) - { - // Set layers recursively on ItemContainer to match game's approach - S1DevUtils.LayerUtility.SetLayerRecursively( - generator.ItemContainer.gameObject, - iconLayer); - } + S1DevUtils.LayerUtility.SetLayerRecursively( + generator.ItemContainer.gameObject, + iconLayer); Logger.Debug( $"Icon generation for '{model.name}': world pos={model.position}, " + @@ -204,7 +207,7 @@ internal static bool IsItemIconGeneratorReady // Temporarily override IconGenerator state generator.ModifyLighting = true; - texture = generator.GetTexture(model); + texture = generator.GetTexture(model, size); Logger.Debug($"Generated texture: {(texture != null ? $"{texture.width}x{texture.height}" : "null")}"); if (texture != null && !HasVisibleContent(texture)) {