diff --git a/OpenRA.Mods.Common/Terrain/DefaultTerrain.cs b/OpenRA.Mods.Common/Terrain/DefaultTerrain.cs index 4d700c15cb..e6155b6ce1 100644 --- a/OpenRA.Mods.Common/Terrain/DefaultTerrain.cs +++ b/OpenRA.Mods.Common/Terrain/DefaultTerrain.cs @@ -37,6 +37,7 @@ namespace OpenRA.Mods.Common.Terrain public class DefaultTerrainTemplateInfo : TerrainTemplateInfo { public readonly string[] Images; + public readonly string[] DepthImages; public readonly int[] Frames; public readonly string Palette; diff --git a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs index 5d110ff498..cd7bca7672 100644 --- a/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs +++ b/OpenRA.Mods.Common/Terrain/DefaultTileCache.cs @@ -52,9 +52,13 @@ namespace OpenRA.Mods.Common.Terrain var variants = new List(); var templateInfo = (DefaultTerrainTemplateInfo)t.Value; - foreach (var i in templateInfo.Images) + for (var ii = 0; ii < templateInfo.Images.Length; ii++) { + var i = templateInfo.Images[ii]; + ISpriteFrame[] allFrames; + ISpriteFrame[] depthFrames = null; + if (onMissingImage != null) { try @@ -70,7 +74,26 @@ namespace OpenRA.Mods.Common.Terrain else allFrames = frameCache[i]; - var frameCount = terrainInfo.EnableDepth ? allFrames.Length / 2 : allFrames.Length; + if (terrainInfo.EnableDepth && templateInfo.DepthImages != null && templateInfo.DepthImages.Length == templateInfo.Images.Length) + { + var di = templateInfo.DepthImages[ii]; + if (onMissingImage != null) + { + try + { + depthFrames = frameCache[di]; + } + catch (FileNotFoundException) + { + onMissingImage(t.Key, di); + continue; + } + } + else + depthFrames = frameCache[di]; + } + + var frameCount = terrainInfo.EnableDepth && depthFrames == null ? allFrames.Length / 2 : allFrames.Length; var indices = templateInfo.Frames != null ? templateInfo.Frames : Exts.MakeArray(t.Value.TilesCount, j => j); var start = indices.Min(); @@ -95,7 +118,7 @@ namespace OpenRA.Mods.Common.Terrain if (terrainInfo.EnableDepth) { - var depthFrame = allFrames[j + frameCount]; + var depthFrame = depthFrames != null ? depthFrames[j] : allFrames[j + frameCount]; var depthType = SheetBuilder.FrameTypeToSheetType(depthFrame.Type); var ss = sheetBuilders[depthType].Allocate(depthFrame.Size, zRamp, offset); OpenRA.Graphics.Util.FastCopyIntoChannel(ss, depthFrame.Data, depthFrame.Type);