Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions S1API.Tests/Rendering/RuntimePreviewLayerTests.cs
Original file line number Diff line number Diff line change
@@ -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));
}
}
17 changes: 17 additions & 0 deletions S1API/Internal/Rendering/RuntimePreviewLayer.cs
Original file line number Diff line number Diff line change
@@ -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<string, int> findLayer)
{
int layer = findLayer("RuntimePreviewGeneration");
return layer >= 0 ? layer : findLayer("IconGeneration");
}
}
}
21 changes: 12 additions & 9 deletions S1API/Rendering/IconFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

using S1API.Logging;
using S1API.Internal.Utils;
using S1API.Internal.Rendering;
using System;
using System.Collections;
using System.Collections.Generic;
Expand Down Expand Up @@ -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;
Expand All @@ -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}, " +
Expand Down Expand Up @@ -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))
{
Expand Down
Loading