diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 054a142a7b..e6b3c196a6 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -156,7 +156,7 @@ namespace OpenRA using (new PerfTimer("NewWorld")) OrderManager.World = new World(map, OrderManager, type); - worldRenderer = new WorldRenderer(OrderManager.World); + worldRenderer = new WorldRenderer(ModData, OrderManager.World); using (new PerfTimer("LoadComplete")) OrderManager.World.LoadComplete(worldRenderer); diff --git a/OpenRA.Game/Graphics/IGraphicsDevice.cs b/OpenRA.Game/Graphics/IGraphicsDevice.cs index 27c41814b8..bd788c2338 100644 --- a/OpenRA.Game/Graphics/IGraphicsDevice.cs +++ b/OpenRA.Game/Graphics/IGraphicsDevice.cs @@ -70,6 +70,7 @@ namespace OpenRA void EnableDepthBuffer(); void DisableDepthBuffer(); + void ClearDepthBuffer(); void SetBlendMode(BlendMode mode); diff --git a/OpenRA.Game/Graphics/SheetBuilder.cs b/OpenRA.Game/Graphics/SheetBuilder.cs index a7c611fe5c..f64868ff4b 100644 --- a/OpenRA.Game/Graphics/SheetBuilder.cs +++ b/OpenRA.Game/Graphics/SheetBuilder.cs @@ -66,7 +66,7 @@ namespace OpenRA.Graphics { // Don't bother allocating empty sprites if (size.Width == 0 || size.Height == 0) - return new Sprite(current, Rectangle.Empty, spriteOffset, channel, BlendMode.Alpha); + return new Sprite(current, Rectangle.Empty, 0, spriteOffset, channel, BlendMode.Alpha); var rect = Allocate(size, spriteOffset); Util.FastCopyIntoChannel(rect, src); @@ -129,7 +129,7 @@ namespace OpenRA.Graphics p = new Point(0, 0); } - var rect = new Sprite(current, new Rectangle(p, imageSize), spriteOffset, channel, BlendMode.Alpha); + var rect = new Sprite(current, new Rectangle(p, imageSize), 0, spriteOffset, channel, BlendMode.Alpha); p.X += imageSize.Width; return rect; diff --git a/OpenRA.Game/Graphics/SoftwareCursor.cs b/OpenRA.Game/Graphics/SoftwareCursor.cs index e10be9195b..24d2909672 100644 --- a/OpenRA.Game/Graphics/SoftwareCursor.cs +++ b/OpenRA.Game/Graphics/SoftwareCursor.cs @@ -81,8 +81,8 @@ namespace OpenRA.Graphics var cursorSize = CursorProvider.CursorViewportZoomed ? 2.0f * cursorSprite.Size : cursorSprite.Size; var cursorOffset = CursorProvider.CursorViewportZoomed ? - (2 * cursorSequence.Hotspot) + cursorSprite.Size.ToInt2() : - cursorSequence.Hotspot + (0.5f * cursorSprite.Size).ToInt2(); + (2 * cursorSequence.Hotspot) + cursorSprite.Size.XY.ToInt2() : + cursorSequence.Hotspot + (0.5f * cursorSprite.Size.XY).ToInt2(); renderer.SetPalette(palette); renderer.SpriteRenderer.DrawSprite(cursorSprite, diff --git a/OpenRA.Game/Graphics/Sprite.cs b/OpenRA.Game/Graphics/Sprite.cs index 75c408c367..4608e5cb75 100644 --- a/OpenRA.Game/Graphics/Sprite.cs +++ b/OpenRA.Game/Graphics/Sprite.cs @@ -20,24 +20,26 @@ namespace OpenRA.Graphics public readonly Sheet Sheet; public readonly BlendMode BlendMode; public readonly TextureChannel Channel; - public readonly float2 Size; - public readonly float2 Offset; - public readonly float2 FractionalOffset; + public readonly float ZRamp; + public readonly float3 Size; + public readonly float3 Offset; + public readonly float3 FractionalOffset; public readonly float Top, Left, Bottom, Right; public Sprite(Sheet sheet, Rectangle bounds, TextureChannel channel) - : this(sheet, bounds, float2.Zero, channel) { } + : this(sheet, bounds, 0, float2.Zero, channel) { } - public Sprite(Sheet sheet, Rectangle bounds, float2 offset, TextureChannel channel, BlendMode blendMode = BlendMode.Alpha) + public Sprite(Sheet sheet, Rectangle bounds, float zRamp, float3 offset, TextureChannel channel, BlendMode blendMode = BlendMode.Alpha) { Sheet = sheet; Bounds = bounds; Offset = offset; + ZRamp = zRamp; Channel = channel; - Size = new float2(bounds.Size); + Size = new float3(bounds.Size.Width, bounds.Size.Height, bounds.Size.Height * zRamp); BlendMode = blendMode; - - FractionalOffset = offset / Size; + FractionalOffset = Size.Z != 0 ? offset / Size : + new float3(offset.X / Size.X, offset.Y / Size.Y, 0); Left = (float)Math.Min(bounds.Left, bounds.Right) / sheet.Size.Width; Top = (float)Math.Min(bounds.Top, bounds.Bottom) / sheet.Size.Height; diff --git a/OpenRA.Game/Graphics/SpriteRenderable.cs b/OpenRA.Game/Graphics/SpriteRenderable.cs index eb9a84af0c..12a235fba5 100644 --- a/OpenRA.Game/Graphics/SpriteRenderable.cs +++ b/OpenRA.Game/Graphics/SpriteRenderable.cs @@ -49,21 +49,22 @@ namespace OpenRA.Graphics public IRenderable OffsetBy(WVec vec) { return new SpriteRenderable(sprite, pos + vec, offset, zOffset, palette, scale, isDecoration); } public IRenderable AsDecoration() { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, scale, true); } - float2 ScreenPosition(WorldRenderer wr) + float3 ScreenPosition(WorldRenderer wr) { - return wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size).ToInt2(); + var xy = wr.ScreenPxPosition(pos) + wr.ScreenPxOffset(offset) - (0.5f * scale * sprite.Size.XY).ToInt2(); + return new float3(xy, wr.ScreenZPosition(pos, 0) - 0.5f * scale * sprite.Size.Z); } public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } public void Render(WorldRenderer wr) { - Game.Renderer.WorldSpriteRenderer.DrawSprite(sprite, ScreenPosition(wr), palette, sprite.Size * scale); + Game.Renderer.WorldSpriteRenderer.DrawSprite(sprite, ScreenPosition(wr), palette, scale * sprite.Size); } public void RenderDebugGeometry(WorldRenderer wr) { - var offset = ScreenPosition(wr) + sprite.Offset; - Game.Renderer.WorldRgbaColorRenderer.DrawRect(offset, offset + sprite.Size, 1 / wr.Viewport.Zoom, Color.Red); + var offset = ScreenPosition(wr) + sprite.Offset.XY; + Game.Renderer.WorldRgbaColorRenderer.DrawRect(offset.XY, (offset + sprite.Size).XY, 1 / wr.Viewport.Zoom, Color.Red); } public Rectangle ScreenBounds(WorldRenderer wr) diff --git a/OpenRA.Game/Graphics/SpriteRenderer.cs b/OpenRA.Game/Graphics/SpriteRenderer.cs index 70580db08b..df976a81c4 100644 --- a/OpenRA.Game/Graphics/SpriteRenderer.cs +++ b/OpenRA.Game/Graphics/SpriteRenderer.cs @@ -59,17 +59,17 @@ namespace OpenRA.Graphics currentSheet = s.Sheet; } - public void DrawSprite(Sprite s, float2 location, PaletteReference pal) + public void DrawSprite(Sprite s, float3 location, PaletteReference pal) { DrawSprite(s, location, pal.TextureIndex, s.Size); } - public void DrawSprite(Sprite s, float2 location, PaletteReference pal, float2 size) + public void DrawSprite(Sprite s, float3 location, PaletteReference pal, float3 size) { DrawSprite(s, location, pal.TextureIndex, size); } - void DrawSprite(Sprite s, float2 location, float paletteTextureIndex, float2 size) + void DrawSprite(Sprite s, float3 location, float paletteTextureIndex, float3 size) { SetRenderStateForSprite(s); Util.FastCreateQuad(vertices, location + s.FractionalOffset * size, s, paletteTextureIndex, nv, size); @@ -77,17 +77,17 @@ namespace OpenRA.Graphics } // For RGBASpriteRenderer, which doesn't use palettes - public void DrawSprite(Sprite s, float2 location) + public void DrawSprite(Sprite s, float3 location) { DrawSprite(s, location, 0, s.Size); } - public void DrawSprite(Sprite s, float2 location, float2 size) + public void DrawSprite(Sprite s, float3 location, float3 size) { DrawSprite(s, location, 0, size); } - public void DrawSprite(Sprite s, float2 a, float2 b, float2 c, float2 d) + public void DrawSprite(Sprite s, float3 a, float3 b, float3 c, float3 d) { SetRenderStateForSprite(s); Util.FastCreateQuad(vertices, a, b, c, d, s, 0, nv); diff --git a/OpenRA.Game/Graphics/Theater.cs b/OpenRA.Game/Graphics/Theater.cs index c93530c7d8..f98ba533a6 100644 --- a/OpenRA.Game/Graphics/Theater.cs +++ b/OpenRA.Game/Graphics/Theater.cs @@ -84,7 +84,7 @@ namespace OpenRA.Graphics // Ignore the offsets baked into R8 sprites if (tileset.IgnoreTileSpriteOffsets) - allSprites = allSprites.Select(s => new Sprite(s.Sheet, s.Bounds, float2.Zero, s.Channel, s.BlendMode)); + allSprites = allSprites.Select(s => new Sprite(s.Sheet, s.Bounds, s.ZRamp, float2.Zero, s.Channel, s.BlendMode)); templates.Add(t.Value.Id, new TheaterTemplate(allSprites.ToArray(), variants.First().Count(), t.Value.Images.Length)); } diff --git a/OpenRA.Game/Graphics/UISpriteRenderable.cs b/OpenRA.Game/Graphics/UISpriteRenderable.cs index a6538261e4..1dad60ece8 100644 --- a/OpenRA.Game/Graphics/UISpriteRenderable.cs +++ b/OpenRA.Game/Graphics/UISpriteRenderable.cs @@ -48,13 +48,13 @@ namespace OpenRA.Graphics public IFinalizedRenderable PrepareRender(WorldRenderer wr) { return this; } public void Render(WorldRenderer wr) { - Game.Renderer.SpriteRenderer.DrawSprite(sprite, screenPos, palette, sprite.Size * scale); + Game.Renderer.SpriteRenderer.DrawSprite(sprite, screenPos, palette, scale * sprite.Size); } public void RenderDebugGeometry(WorldRenderer wr) { - var offset = screenPos + sprite.Offset; - Game.Renderer.RgbaColorRenderer.DrawRect(offset, offset + sprite.Size, 1, Color.Red); + var offset = screenPos + sprite.Offset.XY; + Game.Renderer.RgbaColorRenderer.DrawRect(offset, offset + sprite.Size.XY, 1, Color.Red); } public Rectangle ScreenBounds(WorldRenderer wr) diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 45cee3134c..129c2ce34c 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -34,8 +34,9 @@ namespace OpenRA.Graphics readonly TerrainRenderer terrainRenderer; readonly Lazy devTrait; readonly Func createPaletteReference; + readonly bool enableDepthBuffer; - internal WorldRenderer(World world) + internal WorldRenderer(ModData modData, World world) { World = world; TileSize = World.Map.Grid.TileSize; @@ -43,6 +44,9 @@ namespace OpenRA.Graphics createPaletteReference = CreatePaletteReference; + var mapGrid = modData.Manifest.Get(); + enableDepthBuffer = mapGrid.EnableDepthBuffer; + foreach (var pal in world.TraitDict.ActorsWithTrait()) pal.Trait.LoadPalettes(this); @@ -133,18 +137,27 @@ namespace OpenRA.Graphics var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor); Game.Renderer.EnableScissor(bounds); + if (enableDepthBuffer) + Game.Renderer.Device.EnableDepthBuffer(); + terrainRenderer.Draw(this, Viewport); Game.Renderer.Flush(); for (var i = 0; i < renderables.Count; i++) renderables[i].Render(this); + if (enableDepthBuffer) + Game.Renderer.ClearDepthBuffer(); + foreach (var a in World.ActorsWithTrait()) if (a.Actor.IsInWorld && !a.Actor.Disposed) a.Trait.RenderAfterWorld(this, a.Actor); var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null; + if (enableDepthBuffer) + Game.Renderer.ClearDepthBuffer(); + foreach (var a in World.ActorsWithTrait()) a.Trait.RenderShroud(this, renderShroud); @@ -152,6 +165,9 @@ namespace OpenRA.Graphics for (var i = 0; i < renderables.Count; i++) renderables[i].RenderDebugGeometry(this); + if (enableDepthBuffer) + Game.Renderer.Device.DisableDepthBuffer(); + Game.Renderer.DisableScissor(); var overlayRenderables = World.Selection.Actors.Where(a => !a.Disposed) @@ -209,6 +225,12 @@ namespace OpenRA.Graphics return new float2(TileSize.Width * pos.X / 1024f, TileSize.Height * (pos.Y - pos.Z) / 1024f); } + public float3 Screen3DPosition(WPos pos) + { + var z = ZPosition(pos, 0) * TileSize.Height / 1024f; + return new float3(TileSize.Width * pos.X / 1024f, TileSize.Height * (pos.Y - pos.Z) / 1024f, z); + } + public int2 ScreenPxPosition(WPos pos) { // Round to nearest pixel diff --git a/OpenRA.Game/Renderer.cs b/OpenRA.Game/Renderer.cs index 266fa714d7..5aab34bdc0 100644 --- a/OpenRA.Game/Renderer.cs +++ b/OpenRA.Game/Renderer.cs @@ -255,6 +255,12 @@ namespace OpenRA Device.DisableDepthBuffer(); } + public void ClearDepthBuffer() + { + Flush(); + Device.ClearDepthBuffer(); + } + public void GrabWindowMouseFocus() { Device.GrabWindowMouseFocus(); diff --git a/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs b/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs index b2fe123f16..fe02a3970c 100644 --- a/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs +++ b/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs @@ -79,6 +79,7 @@ namespace OpenRA.Mods.Common.Graphics public int Facings { get; private set; } public int Tick { get; private set; } public int ZOffset { get; private set; } + public float ZRamp { get; private set; } public int ShadowStart { get; private set; } public int ShadowZOffset { get; private set; } public int[] Frames { get; private set; } @@ -119,6 +120,7 @@ namespace OpenRA.Mods.Common.Graphics ShadowStart = LoadField(d, "ShadowStart", -1); ShadowZOffset = LoadField(d, "ShadowZOffset", DefaultShadowSpriteZOffset).Length; ZOffset = LoadField(d, "ZOffset", WDist.Zero).Length; + ZRamp = LoadField(d, "ZRamp", 0); Tick = LoadField(d, "Tick", 40); transpose = LoadField(d, "Transpose", false); Frames = LoadField(d, "Frames", null); @@ -139,7 +141,7 @@ namespace OpenRA.Mods.Common.Graphics "{0}: Sequence {1}.{2}: UseClassicFacingFudge is only valid for 32 facings" .F(info.Nodes[0].Location, sequence, animation)); - var offset = LoadField(d, "Offset", float2.Zero); + var offset = LoadField(d, "Offset", float3.Zero); var blendMode = LoadField(d, "BlendMode", BlendMode.Alpha); MiniYaml combine; @@ -159,7 +161,7 @@ namespace OpenRA.Mods.Common.Graphics var subSrc = GetSpriteSrc(modData, tileSet, sequence, animation, sub.Key, sd); var subSprites = cache[subSrc].Select( s => new Sprite(s.Sheet, - FlipRectangle(s.Bounds, subFlipX, subFlipY), + FlipRectangle(s.Bounds, subFlipX, subFlipY), ZRamp, new float2(subFlipX ? -s.Offset.X : s.Offset.X, subFlipY ? -s.Offset.Y : s.Offset.Y) + subOffset + offset, s.Channel, blendMode)); @@ -182,7 +184,7 @@ namespace OpenRA.Mods.Common.Graphics var src = GetSpriteSrc(modData, tileSet, sequence, animation, info.Value, d); sprites = cache[src].Select( s => new Sprite(s.Sheet, - FlipRectangle(s.Bounds, flipX, flipY), + FlipRectangle(s.Bounds, flipX, flipY), ZRamp, new float2(flipX ? -s.Offset.X : s.Offset.X, flipY ? -s.Offset.Y : s.Offset.Y) + offset, s.Channel, blendMode)).ToArray(); } diff --git a/OpenRA.Mods.Common/Graphics/VoxelRenderable.cs b/OpenRA.Mods.Common/Graphics/VoxelRenderable.cs index f68467b157..75bed0ed0d 100644 --- a/OpenRA.Mods.Common/Graphics/VoxelRenderable.cs +++ b/OpenRA.Mods.Common/Graphics/VoxelRenderable.cs @@ -129,7 +129,7 @@ namespace OpenRA.Mods.Common.Graphics // Draw sprite rect var offset = pxOrigin + renderProxy.Sprite.Offset - 0.5f * renderProxy.Sprite.Size; - Game.Renderer.WorldRgbaColorRenderer.DrawRect(offset, offset + renderProxy.Sprite.Size, iz, Color.Red); + Game.Renderer.WorldRgbaColorRenderer.DrawRect(offset.XY, (offset + renderProxy.Sprite.Size).XY, iz, Color.Red); // Draw transformed shadow sprite rect var c = Color.Purple; diff --git a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs index 578cf1cf02..3f2c5348d0 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs @@ -228,7 +228,7 @@ namespace OpenRA.Mods.Common.Traits { return anims.Where(b => b.IsVisible && b.Animation.Animation.CurrentSequence != null) - .Select(a => (a.Animation.Animation.Image.Size * info.Scale).ToInt2()) + .Select(a => (a.Animation.Animation.Image.Size.XY * info.Scale).ToInt2()) .FirstOrDefault(); } } diff --git a/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs b/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs index 48e8ecaaae..5a971f02b8 100644 --- a/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs +++ b/OpenRA.Mods.Common/Traits/Render/SelectionDecorations.cs @@ -109,7 +109,7 @@ namespace OpenRA.Mods.Common.Traits pipImages.PlayFetchIndex("groups", () => (int)group); pipImages.Tick(); - var pos = basePosition - (0.5f * pipImages.Image.Size).ToInt2() + new int2(9, 5); + var pos = basePosition - (0.5f * pipImages.Image.Size.XY).ToInt2() + new int2(9, 5); yield return new UISpriteRenderable(pipImages.Image, self.CenterPosition, pos, 0, pal, 1f); } @@ -122,7 +122,7 @@ namespace OpenRA.Mods.Common.Traits var pipImages = new Animation(self.World, "pips"); pipImages.PlayRepeating(PipStrings[0]); - var pipSize = pipImages.Image.Size.ToInt2(); + var pipSize = pipImages.Image.Size.XY.ToInt2(); var pipxyBase = basePosition + new int2(1 - pipSize.X / 2, -(3 + pipSize.Y / 2)); var pipxyOffset = new int2(0, 0); var pal = wr.Palette(Info.Palette); diff --git a/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs b/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs index 9e2a908531..be8760b3cb 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithDecoration.cs @@ -99,7 +99,7 @@ namespace OpenRA.Mods.Common.Traits return Enumerable.Empty(); var bounds = self.VisualBounds; - var halfSize = (0.5f * Anim.Image.Size).ToInt2(); + var halfSize = (0.5f * Anim.Image.Size.XY).ToInt2(); var boundsOffset = new int2(bounds.Left + bounds.Right, bounds.Top + bounds.Bottom) / 2; var sizeOffset = -halfSize; diff --git a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs index 3c77892dc3..72256b5d0e 100644 --- a/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs +++ b/OpenRA.Mods.Common/Traits/World/ShroudRenderer.cs @@ -71,10 +71,10 @@ namespace OpenRA.Mods.Common.Traits struct TileInfo { - public readonly float2 ScreenPosition; + public readonly float3 ScreenPosition; public readonly byte Variant; - public TileInfo(float2 screenPosition, byte variant) + public TileInfo(float3 screenPosition, byte variant) { ScreenPosition = screenPosition; Variant = variant; @@ -158,7 +158,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var uv in w.Map.AllCells.MapCoords) { var pos = w.Map.CenterOfCell(uv.ToCPos(map)); - var screen = wr.ScreenPosition(pos - new WVec(0, 0, pos.Z)); + var screen = wr.Screen3DPosition(pos - new WVec(0, 0, pos.Z)); var variant = (byte)Game.CosmeticRandom.Next(info.ShroudVariants.Length); tileInfos[uv] = new TileInfo(screen, variant); } diff --git a/OpenRA.Mods.Common/Widgets/SpriteWidget.cs b/OpenRA.Mods.Common/Widgets/SpriteWidget.cs index 0709662273..18847bc540 100644 --- a/OpenRA.Mods.Common/Widgets/SpriteWidget.cs +++ b/OpenRA.Mods.Common/Widgets/SpriteWidget.cs @@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Widgets if (sprite != cachedSprite) { - offset = 0.5f * (new float2(RenderBounds.Size) - sprite.Size); + offset = 0.5f * (new float2(RenderBounds.Size) - sprite.Size.XY); cachedSprite = sprite; } diff --git a/OpenRA.Mods.D2k/Traits/World/BuildableTerrainLayer.cs b/OpenRA.Mods.D2k/Traits/World/BuildableTerrainLayer.cs index 98f15fd80c..76244b6b28 100644 --- a/OpenRA.Mods.D2k/Traits/World/BuildableTerrainLayer.cs +++ b/OpenRA.Mods.D2k/Traits/World/BuildableTerrainLayer.cs @@ -51,7 +51,7 @@ namespace OpenRA.Mods.D2k.Traits // Terrain tiles define their origin at the topleft var s = theater.TileSprite(tile); - dirty[cell] = new Sprite(s.Sheet, s.Bounds, float2.Zero, s.Channel, s.BlendMode); + dirty[cell] = new Sprite(s.Sheet, s.Bounds, s.ZRamp, float2.Zero, s.Channel, s.BlendMode); } public void TickRender(WorldRenderer wr, Actor self) diff --git a/OpenRA.Platforms.Default/OpenGL.cs b/OpenRA.Platforms.Default/OpenGL.cs index b3cf3dc251..9caddfc6e0 100644 --- a/OpenRA.Platforms.Default/OpenGL.cs +++ b/OpenRA.Platforms.Default/OpenGL.cs @@ -72,6 +72,7 @@ namespace OpenRA.Platforms.Default // Depth buffer public const int GL_DEPTH_COMPONENT = 0x1902; + public const int GL_LEQUAL = 0x0203; // BlendingFactorDest public const int GL_ZERO = 0; @@ -276,6 +277,9 @@ namespace OpenRA.Platforms.Default public delegate void BlendFunc(int sfactor, int dfactor); public static BlendFunc glBlendFunc { get; private set; } + public delegate void DepthFunc(int func); + public static DepthFunc glDepthFunc { get; private set; } + public delegate void Scissor(int x, int y, int width, int height); public static Scissor glScissor { get; private set; } @@ -418,6 +422,7 @@ namespace OpenRA.Platforms.Default glDisable = Bind("glDisable"); glBlendEquation = Bind("glBlendEquation"); glBlendFunc = Bind("glBlendFunc"); + glDepthFunc = Bind("glDepthFunc"); glScissor = Bind("glScissor"); glPushClientAttrib = Bind("glPushClientAttrib"); glPopClientAttrib = Bind("glPopClientAttrib"); diff --git a/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs b/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs index 98687ae96b..fec2a467d5 100644 --- a/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs +++ b/OpenRA.Platforms.Default/Sdl2GraphicsDevice.cs @@ -213,7 +213,7 @@ namespace OpenRA.Platforms.Default VerifyThreadAffinity(); OpenGL.glClearColor(0, 0, 0, 1); OpenGL.CheckGLError(); - OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT); + OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); OpenGL.CheckGLError(); } @@ -224,6 +224,8 @@ namespace OpenRA.Platforms.Default OpenGL.CheckGLError(); OpenGL.glEnable(OpenGL.GL_DEPTH_TEST); OpenGL.CheckGLError(); + OpenGL.glDepthFunc(OpenGL.GL_LEQUAL); + OpenGL.CheckGLError(); } public void DisableDepthBuffer() @@ -233,6 +235,13 @@ namespace OpenRA.Platforms.Default OpenGL.CheckGLError(); } + public void ClearDepthBuffer() + { + VerifyThreadAffinity(); + OpenGL.glClear(OpenGL.GL_DEPTH_BUFFER_BIT); + OpenGL.CheckGLError(); + } + public void SetBlendMode(BlendMode mode) { VerifyThreadAffinity(); diff --git a/glsl/shp.frag b/glsl/shp.frag index df27bb2284..8f0b102384 100644 --- a/glsl/shp.frag +++ b/glsl/shp.frag @@ -17,25 +17,20 @@ void main() if (c.a == 0.0) discard; - if (EnableDepthPreview && length(vDepthMask) > 0.0) - { - if (abs(DepthTextureScale) > 0.0) - { - // Preview vertex aware depth - float depth = gl_FragCoord.z + DepthTextureScale * dot(x, vDepthMask); + float depth = gl_FragCoord.z; + if (length(vDepthMask) > 0.0) + { + // Preview vertex aware depth + depth = depth + DepthTextureScale * dot(x, vDepthMask); + } - // Convert to window coords - depth = 0.5 * depth + 0.5; + // Convert to window coords + gl_FragDepth = 0.5 * depth + 0.5; - // Front of the depth buffer is at 0, but we want to render it as bright - gl_FragColor = vec4(vec3(1.0 - depth), 1.0); - } - else - { - // Preview boring sprite-only depth - float depth = dot(x, vDepthMask); - gl_FragColor = vec4(depth, depth, depth, 1.0); - } + if (EnableDepthPreview) + { + // Front of the depth buffer is at 0, but we want to render it as bright + gl_FragColor = vec4(vec3(1.0 - gl_FragDepth), 1.0); } else gl_FragColor = c; diff --git a/mods/ts/sequences/misc.yaml b/mods/ts/sequences/misc.yaml index 8879f3befc..263d8b4150 100644 --- a/mods/ts/sequences/misc.yaml +++ b/mods/ts/sequences/misc.yaml @@ -274,6 +274,7 @@ resources: Length: 12 ShadowStart: 12 Offset: 0, -12 + ZRamp: 1 tib01: tib01 tib02: tib02 tib03: tib03 @@ -302,6 +303,7 @@ resources: shroud: Defaults: Offset: 0, -1 + ZRamp: 1 shroud: Length: * fog: fog