Split IGraphicsContext from IPlatformWindow.
This commit is contained in:
@@ -523,7 +523,7 @@ namespace OpenRA
|
||||
|
||||
Bitmap bitmap;
|
||||
using (new PerfTimer("Renderer.TakeScreenshot"))
|
||||
bitmap = Renderer.Window.TakeScreenshot();
|
||||
bitmap = Renderer.Context.TakeScreenshot();
|
||||
|
||||
ThreadPool.QueueUserWorkItem(_ =>
|
||||
{
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace OpenRA.Graphics
|
||||
|
||||
public HardwarePalette()
|
||||
{
|
||||
Texture = Game.Renderer.Window.CreateTexture();
|
||||
Texture = Game.Renderer.Context.CreateTexture();
|
||||
readOnlyModifiablePalettes = modifiablePalettes.AsReadOnly();
|
||||
}
|
||||
|
||||
|
||||
@@ -300,14 +300,14 @@ namespace OpenRA.Graphics
|
||||
Game.Renderer.Flush();
|
||||
fbo.Bind();
|
||||
|
||||
Game.Renderer.Window.EnableDepthBuffer();
|
||||
Game.Renderer.Context.EnableDepthBuffer();
|
||||
return fbo;
|
||||
}
|
||||
|
||||
void DisableFrameBuffer(IFrameBuffer fbo)
|
||||
{
|
||||
Game.Renderer.Flush();
|
||||
Game.Renderer.Window.DisableDepthBuffer();
|
||||
Game.Renderer.Context.DisableDepthBuffer();
|
||||
fbo.Unbind();
|
||||
}
|
||||
|
||||
@@ -356,7 +356,7 @@ namespace OpenRA.Graphics
|
||||
}
|
||||
|
||||
var size = new Size(renderer.SheetSize, renderer.SheetSize);
|
||||
var framebuffer = renderer.Window.CreateFrameBuffer(size);
|
||||
var framebuffer = renderer.Context.CreateFrameBuffer(size);
|
||||
var sheet = new Sheet(SheetType.BGRA, framebuffer.Texture);
|
||||
mappedBuffers.Add(sheet, framebuffer);
|
||||
|
||||
|
||||
@@ -36,39 +36,40 @@ namespace OpenRA
|
||||
|
||||
public interface IPlatformWindow : IDisposable
|
||||
{
|
||||
IVertexBuffer<Vertex> CreateVertexBuffer(int length);
|
||||
ITexture CreateTexture(Bitmap bitmap);
|
||||
ITexture CreateTexture();
|
||||
IFrameBuffer CreateFrameBuffer(Size s);
|
||||
IShader CreateShader(string name);
|
||||
IGraphicsContext Context { get; }
|
||||
|
||||
Size WindowSize { get; }
|
||||
float WindowScale { get; }
|
||||
event Action<float, float> OnWindowScaleChanged;
|
||||
|
||||
void Clear();
|
||||
void Present();
|
||||
Bitmap TakeScreenshot();
|
||||
void PumpInput(IInputHandler inputHandler);
|
||||
string GetClipboardText();
|
||||
bool SetClipboardText(string text);
|
||||
void DrawPrimitives(PrimitiveType type, int firstVertex, int numVertices);
|
||||
|
||||
void EnableScissor(int left, int top, int width, int height);
|
||||
void DisableScissor();
|
||||
|
||||
void EnableDepthBuffer();
|
||||
void DisableDepthBuffer();
|
||||
void ClearDepthBuffer();
|
||||
|
||||
void SetBlendMode(BlendMode mode);
|
||||
|
||||
void GrabWindowMouseFocus();
|
||||
void ReleaseWindowMouseFocus();
|
||||
|
||||
IHardwareCursor CreateHardwareCursor(string name, Size size, byte[] data, int2 hotspot);
|
||||
void SetHardwareCursor(IHardwareCursor cursor);
|
||||
}
|
||||
|
||||
public interface IGraphicsContext : IDisposable
|
||||
{
|
||||
IVertexBuffer<Vertex> CreateVertexBuffer(int size);
|
||||
ITexture CreateTexture();
|
||||
ITexture CreateTexture(Bitmap bitmap);
|
||||
IFrameBuffer CreateFrameBuffer(Size s);
|
||||
IShader CreateShader(string name);
|
||||
void EnableScissor(int left, int top, int width, int height);
|
||||
void DisableScissor();
|
||||
Bitmap TakeScreenshot();
|
||||
void Present();
|
||||
void DrawPrimitives(PrimitiveType pt, int firstVertex, int numVertices);
|
||||
void Clear();
|
||||
void EnableDepthBuffer();
|
||||
void DisableDepthBuffer();
|
||||
void ClearDepthBuffer();
|
||||
void SetBlendMode(BlendMode mode);
|
||||
string GLVersion { get; }
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ namespace OpenRA.Graphics
|
||||
{
|
||||
if (texture == null)
|
||||
{
|
||||
texture = Game.Renderer.Window.CreateTexture();
|
||||
texture = Game.Renderer.Context.CreateTexture();
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,10 +43,10 @@ namespace OpenRA.Graphics
|
||||
sheets[i] = null;
|
||||
}
|
||||
|
||||
renderer.Window.SetBlendMode(currentBlend);
|
||||
renderer.Context.SetBlendMode(currentBlend);
|
||||
shader.PrepareRender();
|
||||
renderer.DrawBatch(vertices, nv, PrimitiveType.TriangleList);
|
||||
renderer.Window.SetBlendMode(BlendMode.None);
|
||||
renderer.Context.SetBlendMode(BlendMode.None);
|
||||
|
||||
nv = 0;
|
||||
ns = 0;
|
||||
@@ -131,10 +131,10 @@ namespace OpenRA.Graphics
|
||||
public void DrawVertexBuffer(IVertexBuffer<Vertex> buffer, int start, int length, PrimitiveType type, Sheet sheet, BlendMode blendMode)
|
||||
{
|
||||
shader.SetTexture("Texture0", sheet.GetTexture());
|
||||
renderer.Window.SetBlendMode(blendMode);
|
||||
renderer.Context.SetBlendMode(blendMode);
|
||||
shader.PrepareRender();
|
||||
renderer.DrawBatch(buffer, start, length, type);
|
||||
renderer.Window.SetBlendMode(BlendMode.None);
|
||||
renderer.Context.SetBlendMode(BlendMode.None);
|
||||
}
|
||||
|
||||
// For RGBAColorRenderer
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace OpenRA.Graphics
|
||||
rowStride = 6 * map.MapSize.X;
|
||||
|
||||
vertices = new Vertex[rowStride * map.MapSize.Y];
|
||||
vertexBuffer = Game.Renderer.Window.CreateVertexBuffer(vertices.Length);
|
||||
vertexBuffer = Game.Renderer.Context.CreateVertexBuffer(vertices.Length);
|
||||
emptySprite = new Sprite(sheet, Rectangle.Empty, TextureChannel.Alpha);
|
||||
|
||||
wr.PaletteInvalidated += UpdatePaletteIndices;
|
||||
|
||||
@@ -179,7 +179,7 @@ namespace OpenRA.Graphics
|
||||
Game.Renderer.EnableScissor(bounds);
|
||||
|
||||
if (enableDepthBuffer)
|
||||
Game.Renderer.Window.EnableDepthBuffer();
|
||||
Game.Renderer.Context.EnableDepthBuffer();
|
||||
|
||||
terrainRenderer.Draw(this, Viewport);
|
||||
Game.Renderer.Flush();
|
||||
@@ -203,7 +203,7 @@ namespace OpenRA.Graphics
|
||||
a.Trait.RenderShroud(renderShroud, this);
|
||||
|
||||
if (enableDepthBuffer)
|
||||
Game.Renderer.Window.DisableDepthBuffer();
|
||||
Game.Renderer.Context.DisableDepthBuffer();
|
||||
|
||||
Game.Renderer.DisableScissor();
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ namespace OpenRA
|
||||
public IReadOnlyDictionary<string, SpriteFont> Fonts;
|
||||
|
||||
internal IPlatformWindow Window { get; private set; }
|
||||
internal IGraphicsContext Context { get; private set; }
|
||||
|
||||
internal int SheetSize { get; private set; }
|
||||
internal int TempBufferSize { get; private set; }
|
||||
|
||||
@@ -52,19 +54,20 @@ namespace OpenRA
|
||||
var resolution = GetResolution(graphicSettings);
|
||||
|
||||
Window = platform.CreateWindow(new Size(resolution.Width, resolution.Height), graphicSettings.Mode);
|
||||
Context = Window.Context;
|
||||
|
||||
TempBufferSize = graphicSettings.BatchSize;
|
||||
SheetSize = graphicSettings.SheetSize;
|
||||
|
||||
WorldSpriteRenderer = new SpriteRenderer(this, Window.CreateShader("combined"));
|
||||
WorldSpriteRenderer = new SpriteRenderer(this, Context.CreateShader("combined"));
|
||||
WorldRgbaSpriteRenderer = new RgbaSpriteRenderer(WorldSpriteRenderer);
|
||||
WorldRgbaColorRenderer = new RgbaColorRenderer(WorldSpriteRenderer);
|
||||
WorldModelRenderer = new ModelRenderer(this, Window.CreateShader("model"));
|
||||
SpriteRenderer = new SpriteRenderer(this, Window.CreateShader("combined"));
|
||||
WorldModelRenderer = new ModelRenderer(this, Context.CreateShader("model"));
|
||||
SpriteRenderer = new SpriteRenderer(this, Context.CreateShader("combined"));
|
||||
RgbaSpriteRenderer = new RgbaSpriteRenderer(SpriteRenderer);
|
||||
RgbaColorRenderer = new RgbaColorRenderer(SpriteRenderer);
|
||||
|
||||
tempBuffer = Window.CreateVertexBuffer(TempBufferSize);
|
||||
tempBuffer = Context.CreateVertexBuffer(TempBufferSize);
|
||||
}
|
||||
|
||||
static Size GetResolution(GraphicSettings graphicsSettings)
|
||||
@@ -113,7 +116,7 @@ namespace OpenRA
|
||||
|
||||
public void BeginFrame(int2 scroll, float zoom)
|
||||
{
|
||||
Window.Clear();
|
||||
Context.Clear();
|
||||
SetViewportParams(scroll, zoom);
|
||||
}
|
||||
|
||||
@@ -154,7 +157,7 @@ namespace OpenRA
|
||||
{
|
||||
Flush();
|
||||
Window.PumpInput(inputHandler);
|
||||
Window.Present();
|
||||
Context.Present();
|
||||
}
|
||||
|
||||
public void DrawBatch(Vertex[] vertices, int numVertices, PrimitiveType type)
|
||||
@@ -168,7 +171,7 @@ namespace OpenRA
|
||||
where T : struct
|
||||
{
|
||||
vertices.Bind();
|
||||
Window.DrawPrimitives(type, firstVertex, numVertices);
|
||||
Context.DrawPrimitives(type, firstVertex, numVertices);
|
||||
PerfHistory.Increment("batches", 1);
|
||||
}
|
||||
|
||||
@@ -201,7 +204,7 @@ namespace OpenRA
|
||||
|
||||
public IVertexBuffer<Vertex> CreateVertexBuffer(int length)
|
||||
{
|
||||
return Window.CreateVertexBuffer(length);
|
||||
return Context.CreateVertexBuffer(length);
|
||||
}
|
||||
|
||||
public void EnableScissor(Rectangle rect)
|
||||
@@ -211,7 +214,7 @@ namespace OpenRA
|
||||
rect.Intersect(scissorState.Peek());
|
||||
|
||||
Flush();
|
||||
Window.EnableScissor(rect.Left, rect.Top, rect.Width, rect.Height);
|
||||
Context.EnableScissor(rect.Left, rect.Top, rect.Width, rect.Height);
|
||||
scissorState.Push(rect);
|
||||
}
|
||||
|
||||
@@ -224,28 +227,28 @@ namespace OpenRA
|
||||
if (scissorState.Any())
|
||||
{
|
||||
var rect = scissorState.Peek();
|
||||
Window.EnableScissor(rect.Left, rect.Top, rect.Width, rect.Height);
|
||||
Context.EnableScissor(rect.Left, rect.Top, rect.Width, rect.Height);
|
||||
}
|
||||
else
|
||||
Window.DisableScissor();
|
||||
Context.DisableScissor();
|
||||
}
|
||||
|
||||
public void EnableDepthBuffer()
|
||||
{
|
||||
Flush();
|
||||
Window.EnableDepthBuffer();
|
||||
Context.EnableDepthBuffer();
|
||||
}
|
||||
|
||||
public void DisableDepthBuffer()
|
||||
{
|
||||
Flush();
|
||||
Window.DisableDepthBuffer();
|
||||
Context.DisableDepthBuffer();
|
||||
}
|
||||
|
||||
public void ClearDepthBuffer()
|
||||
{
|
||||
Flush();
|
||||
Window.ClearDepthBuffer();
|
||||
Context.ClearDepthBuffer();
|
||||
}
|
||||
|
||||
public void GrabWindowMouseFocus()
|
||||
@@ -282,7 +285,7 @@ namespace OpenRA
|
||||
|
||||
public string GLVersion
|
||||
{
|
||||
get { return Window.GLVersion; }
|
||||
get { return Context.GLVersion; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user