Write z data to the depth buffer.
This commit is contained in:
@@ -156,7 +156,7 @@ namespace OpenRA
|
|||||||
using (new PerfTimer("NewWorld"))
|
using (new PerfTimer("NewWorld"))
|
||||||
OrderManager.World = new World(map, OrderManager, type);
|
OrderManager.World = new World(map, OrderManager, type);
|
||||||
|
|
||||||
worldRenderer = new WorldRenderer(OrderManager.World);
|
worldRenderer = new WorldRenderer(ModData, OrderManager.World);
|
||||||
|
|
||||||
using (new PerfTimer("LoadComplete"))
|
using (new PerfTimer("LoadComplete"))
|
||||||
OrderManager.World.LoadComplete(worldRenderer);
|
OrderManager.World.LoadComplete(worldRenderer);
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ namespace OpenRA
|
|||||||
|
|
||||||
void EnableDepthBuffer();
|
void EnableDepthBuffer();
|
||||||
void DisableDepthBuffer();
|
void DisableDepthBuffer();
|
||||||
|
void ClearDepthBuffer();
|
||||||
|
|
||||||
void SetBlendMode(BlendMode mode);
|
void SetBlendMode(BlendMode mode);
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,9 @@ namespace OpenRA.Graphics
|
|||||||
readonly TerrainRenderer terrainRenderer;
|
readonly TerrainRenderer terrainRenderer;
|
||||||
readonly Lazy<DeveloperMode> devTrait;
|
readonly Lazy<DeveloperMode> devTrait;
|
||||||
readonly Func<string, PaletteReference> createPaletteReference;
|
readonly Func<string, PaletteReference> createPaletteReference;
|
||||||
|
readonly bool enableDepthBuffer;
|
||||||
|
|
||||||
internal WorldRenderer(World world)
|
internal WorldRenderer(ModData modData, World world)
|
||||||
{
|
{
|
||||||
World = world;
|
World = world;
|
||||||
TileSize = World.Map.Grid.TileSize;
|
TileSize = World.Map.Grid.TileSize;
|
||||||
@@ -43,6 +44,9 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
createPaletteReference = CreatePaletteReference;
|
createPaletteReference = CreatePaletteReference;
|
||||||
|
|
||||||
|
var mapGrid = modData.Manifest.Get<MapGrid>();
|
||||||
|
enableDepthBuffer = mapGrid.EnableDepthBuffer;
|
||||||
|
|
||||||
foreach (var pal in world.TraitDict.ActorsWithTrait<ILoadsPalettes>())
|
foreach (var pal in world.TraitDict.ActorsWithTrait<ILoadsPalettes>())
|
||||||
pal.Trait.LoadPalettes(this);
|
pal.Trait.LoadPalettes(this);
|
||||||
|
|
||||||
@@ -133,18 +137,27 @@ namespace OpenRA.Graphics
|
|||||||
var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor);
|
var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor);
|
||||||
Game.Renderer.EnableScissor(bounds);
|
Game.Renderer.EnableScissor(bounds);
|
||||||
|
|
||||||
|
if (enableDepthBuffer)
|
||||||
|
Game.Renderer.Device.EnableDepthBuffer();
|
||||||
|
|
||||||
terrainRenderer.Draw(this, Viewport);
|
terrainRenderer.Draw(this, Viewport);
|
||||||
Game.Renderer.Flush();
|
Game.Renderer.Flush();
|
||||||
|
|
||||||
for (var i = 0; i < renderables.Count; i++)
|
for (var i = 0; i < renderables.Count; i++)
|
||||||
renderables[i].Render(this);
|
renderables[i].Render(this);
|
||||||
|
|
||||||
|
if (enableDepthBuffer)
|
||||||
|
Game.Renderer.ClearDepthBuffer();
|
||||||
|
|
||||||
foreach (var a in World.ActorsWithTrait<IPostRender>())
|
foreach (var a in World.ActorsWithTrait<IPostRender>())
|
||||||
if (a.Actor.IsInWorld && !a.Actor.Disposed)
|
if (a.Actor.IsInWorld && !a.Actor.Disposed)
|
||||||
a.Trait.RenderAfterWorld(this, a.Actor);
|
a.Trait.RenderAfterWorld(this, a.Actor);
|
||||||
|
|
||||||
var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null;
|
var renderShroud = World.RenderPlayer != null ? World.RenderPlayer.Shroud : null;
|
||||||
|
|
||||||
|
if (enableDepthBuffer)
|
||||||
|
Game.Renderer.ClearDepthBuffer();
|
||||||
|
|
||||||
foreach (var a in World.ActorsWithTrait<IRenderShroud>())
|
foreach (var a in World.ActorsWithTrait<IRenderShroud>())
|
||||||
a.Trait.RenderShroud(this, renderShroud);
|
a.Trait.RenderShroud(this, renderShroud);
|
||||||
|
|
||||||
@@ -152,6 +165,9 @@ namespace OpenRA.Graphics
|
|||||||
for (var i = 0; i < renderables.Count; i++)
|
for (var i = 0; i < renderables.Count; i++)
|
||||||
renderables[i].RenderDebugGeometry(this);
|
renderables[i].RenderDebugGeometry(this);
|
||||||
|
|
||||||
|
if (enableDepthBuffer)
|
||||||
|
Game.Renderer.Device.DisableDepthBuffer();
|
||||||
|
|
||||||
Game.Renderer.DisableScissor();
|
Game.Renderer.DisableScissor();
|
||||||
|
|
||||||
var overlayRenderables = World.Selection.Actors.Where(a => !a.Disposed)
|
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);
|
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)
|
public int2 ScreenPxPosition(WPos pos)
|
||||||
{
|
{
|
||||||
// Round to nearest pixel
|
// Round to nearest pixel
|
||||||
|
|||||||
@@ -255,6 +255,12 @@ namespace OpenRA
|
|||||||
Device.DisableDepthBuffer();
|
Device.DisableDepthBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ClearDepthBuffer()
|
||||||
|
{
|
||||||
|
Flush();
|
||||||
|
Device.ClearDepthBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
public void GrabWindowMouseFocus()
|
public void GrabWindowMouseFocus()
|
||||||
{
|
{
|
||||||
Device.GrabWindowMouseFocus();
|
Device.GrabWindowMouseFocus();
|
||||||
|
|||||||
@@ -213,7 +213,7 @@ namespace OpenRA.Platforms.Default
|
|||||||
VerifyThreadAffinity();
|
VerifyThreadAffinity();
|
||||||
OpenGL.glClearColor(0, 0, 0, 1);
|
OpenGL.glClearColor(0, 0, 0, 1);
|
||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT);
|
OpenGL.glClear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
|
||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,6 +235,13 @@ namespace OpenRA.Platforms.Default
|
|||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ClearDepthBuffer()
|
||||||
|
{
|
||||||
|
VerifyThreadAffinity();
|
||||||
|
OpenGL.glClear(OpenGL.GL_DEPTH_BUFFER_BIT);
|
||||||
|
OpenGL.CheckGLError();
|
||||||
|
}
|
||||||
|
|
||||||
public void SetBlendMode(BlendMode mode)
|
public void SetBlendMode(BlendMode mode)
|
||||||
{
|
{
|
||||||
VerifyThreadAffinity();
|
VerifyThreadAffinity();
|
||||||
|
|||||||
@@ -17,25 +17,20 @@ void main()
|
|||||||
if (c.a == 0.0)
|
if (c.a == 0.0)
|
||||||
discard;
|
discard;
|
||||||
|
|
||||||
if (EnableDepthPreview && length(vDepthMask) > 0.0)
|
float depth = gl_FragCoord.z;
|
||||||
{
|
if (length(vDepthMask) > 0.0)
|
||||||
if (abs(DepthTextureScale) > 0.0)
|
{
|
||||||
{
|
// Preview vertex aware depth
|
||||||
// Preview vertex aware depth
|
depth = depth + DepthTextureScale * dot(x, vDepthMask);
|
||||||
float depth = gl_FragCoord.z + DepthTextureScale * dot(x, vDepthMask);
|
}
|
||||||
|
|
||||||
// Convert to window coords
|
// Convert to window coords
|
||||||
depth = 0.5 * depth + 0.5;
|
gl_FragDepth = 0.5 * depth + 0.5;
|
||||||
|
|
||||||
// Front of the depth buffer is at 0, but we want to render it as bright
|
if (EnableDepthPreview)
|
||||||
gl_FragColor = vec4(vec3(1.0 - depth), 1.0);
|
{
|
||||||
}
|
// Front of the depth buffer is at 0, but we want to render it as bright
|
||||||
else
|
gl_FragColor = vec4(vec3(1.0 - gl_FragDepth), 1.0);
|
||||||
{
|
|
||||||
// Preview boring sprite-only depth
|
|
||||||
float depth = dot(x, vDepthMask);
|
|
||||||
gl_FragColor = vec4(depth, depth, depth, 1.0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
gl_FragColor = c;
|
gl_FragColor = c;
|
||||||
|
|||||||
Reference in New Issue
Block a user