diff --git a/Robust.Client/ResourceManagement/ResourceTypes/RSIResource.cs b/Robust.Client/ResourceManagement/ResourceTypes/RSIResource.cs index a9c3f5ad24f..c808b7907ff 100644 --- a/Robust.Client/ResourceManagement/ResourceTypes/RSIResource.cs +++ b/Robust.Client/ResourceManagement/ResourceTypes/RSIResource.cs @@ -142,8 +142,17 @@ internal static void CreatePlaceholderBump(Image original, Vector2i bloc } } - internal static void CreatePlaceholderNormal(Image original, Vector2i blocksize, out Image normalmap) + internal static void CreatePlaceholderNormal(Image original, Vector2i blocksize, out Image normalmap, bool? flat = false) { + if (flat ?? false) + { + normalmap = new Image(original.Width, original.Height); + int x, y; + for (x = 0; x < original.Width; x++) + for (y = 0; y < original.Height; y++) + normalmap[x, y] = new Rgba32(0.5f, 0.5f, 1f); + return; + } CreatePlaceholderBump(original, blocksize, out var bumpmap); ConvertBumpToNormal(bumpmap, blocksize, out normalmap); bumpmap.Dispose(); @@ -213,7 +222,7 @@ internal static void LoadPreTexture(IResourceManager manager, LoadStepData data, } else { - CreatePlaceholderNormal(texture, stateObject.Size, out normalImage); + CreatePlaceholderNormal(texture, stateObject.Size, out normalImage, metadata.FlatNormal ?? stateObject.FlatNormal ?? false); } } if (normalLoading) diff --git a/Robust.Shared/Resources/RsiLoading.cs b/Robust.Shared/Resources/RsiLoading.cs index 34d4c82573f..c2e326827be 100644 --- a/Robust.Shared/Resources/RsiLoading.cs +++ b/Robust.Shared/Resources/RsiLoading.cs @@ -43,6 +43,7 @@ internal static RsiMetadata LoadRsiMetadata(Stream manifestFile) var stateName = stateObject.Name; var normalName = stateObject.Normal; var bumpName = stateObject.Bump; + var flatNormal = stateObject.FlatNormal; int dirValue; if (stateObject.Directions is { } dirVal) @@ -93,7 +94,7 @@ internal static RsiMetadata LoadRsiMetadata(Stream manifestFile) } } - states[stateI] = new StateMetadata(stateName, normalName, bumpName, size, dirValue, delays); + states[stateI] = new StateMetadata(stateName, normalName, bumpName, flatNormal, size, dirValue, delays); } var textureParams = TextureLoadParameters.Default; @@ -106,7 +107,7 @@ internal static RsiMetadata LoadRsiMetadata(Stream manifestFile) }; } - return new RsiMetadata(size, states, textureParams, manifestJson.MetaAtlas); + return new RsiMetadata(size, states, manifestJson.FlatNormal, textureParams, manifestJson.MetaAtlas); } public static void Warmup() @@ -116,10 +117,11 @@ public static void Warmup() JsonSerializer.Deserialize(warmupJson, SerializerOptions); } - internal sealed class RsiMetadata(Vector2i size, StateMetadata[] states, TextureLoadParameters loadParameters, bool metaAtlas) + internal sealed class RsiMetadata(Vector2i size, StateMetadata[] states, bool? flatNormal, TextureLoadParameters loadParameters, bool metaAtlas) { public readonly Vector2i Size = size; public readonly StateMetadata[] States = states; + public readonly bool? FlatNormal = flatNormal; public readonly TextureLoadParameters LoadParameters = loadParameters; public readonly bool MetaAtlas = metaAtlas; } @@ -129,15 +131,17 @@ internal sealed class StateMetadata public readonly string StateId; public readonly string? NormalId; public readonly string? BumpId; + public readonly bool? FlatNormal; public readonly Vector2i Size; public readonly int DirCount; public readonly float[][] Delays; - public StateMetadata(string stateId, string? normalId, string? bumpId, Vector2i size, int dirCount, float[][] delays) + public StateMetadata(string stateId, string? normalId, string? bumpId, bool? flatNormal, Vector2i size, int dirCount, float[][] delays) { StateId = stateId; NormalId = normalId; BumpId = bumpId; + FlatNormal = flatNormal; Size = size; DirCount = dirCount; @@ -152,11 +156,12 @@ public StateMetadata(string stateId, string? normalId, string? bumpId, Vector2i private sealed record RsiJsonMetadata( Vector2i Size, StateJsonMetadata[] States, + bool? FlatNormal, RsiJsonLoad? Load, bool MetaAtlas = true); [UsedImplicitly] - private sealed record StateJsonMetadata(string Name, string? Normal, string? Bump, int? Directions, float[][]? Delays); + private sealed record StateJsonMetadata(string Name, string? Normal, string? Bump, bool? FlatNormal, int? Directions, float[][]? Delays); [UsedImplicitly] private sealed record RsiJsonLoad(bool Srgb = true);