inverting the Engine <-> GL project dependency.

This commit is contained in:
Bob
2010-02-17 19:52:54 +13:00
parent 680f2a1bc7
commit e6120238c7
12 changed files with 214 additions and 111 deletions

View File

@@ -19,15 +19,15 @@
#endregion
using System.Drawing;
using OpenRa.GlRenderer;
using OpenRa.FileFormats.Graphics;
namespace OpenRa.Graphics
{
class LineRenderer
{
Renderer renderer;
VertexBuffer<Vertex> vertexBuffer;
IndexBuffer indexBuffer; /* kindof a waste of space, but the GPU likes indexing, oh well */
IVertexBuffer<Vertex> vertexBuffer;
IIndexBuffer indexBuffer; /* kindof a waste of space, but the GPU likes indexing, oh well */
const int linesPerBatch = 1024;
@@ -39,8 +39,8 @@ namespace OpenRa.Graphics
public LineRenderer( Renderer renderer )
{
this.renderer = renderer;
vertexBuffer = new VertexBuffer<Vertex>( renderer.Device, vertices.Length, Vertex.Format );
indexBuffer = new IndexBuffer( renderer.Device, indices.Length );
vertexBuffer = renderer.Device.CreateVertexBuffer<Vertex>(vertices.Length );
indexBuffer = renderer.Device.CreateIndexBuffer( indices.Length );
}
public void Flush()

View File

@@ -18,12 +18,15 @@
*/
#endregion
using System;
using System.Drawing;
using System.Drawing.Text;
using System.Reflection;
using System.Windows.Forms;
using OpenRa.FileFormats;
using OpenRa.GlRenderer;
using OpenRa.FileFormats.Graphics;
using OpenRa.Support;
using System.IO;
namespace OpenRa.Graphics
{
@@ -31,14 +34,14 @@ namespace OpenRa.Graphics
{
internal static int SheetSize;
readonly GraphicsDevice device;
readonly IGraphicsDevice device;
public Shader SpriteShader { get; private set; } /* note: shared shader params */
public Shader LineShader { get; private set; }
public Shader RgbaSpriteShader { get; private set; }
public Shader WorldSpriteShader { get; private set; }
public IShader SpriteShader { get; private set; } /* note: shared shader params */
public IShader LineShader { get; private set; }
public IShader RgbaSpriteShader { get; private set; }
public IShader WorldSpriteShader { get; private set; }
public Texture PaletteTexture;
public ITexture PaletteTexture;
readonly Font fDebug, fTitle;
@@ -49,16 +52,12 @@ namespace OpenRa.Graphics
public Renderer(Control control, Size resolution, bool windowed)
{
control.ClientSize = resolution;
device = new GraphicsDevice(control, resolution.Width, resolution.Height, windowed, false);
device = CreateDevice( Assembly.LoadFile( Path.GetFullPath( "OpenRa.Gl.dll" ) ), control, resolution.Width, resolution.Height, windowed, false );
SpriteShader = new Shader(device, FileSystem.Open("world-shp.fx"));
SpriteShader.Quality = ShaderQuality.Low;
LineShader = new Shader(device, FileSystem.Open("line.fx"));
LineShader.Quality = ShaderQuality.High;
RgbaSpriteShader = new Shader(device, FileSystem.Open("chrome-rgba.fx"));
RgbaSpriteShader.Quality = ShaderQuality.High;
WorldSpriteShader = new Shader(device, FileSystem.Open("chrome-shp.fx"));
WorldSpriteShader.Quality = ShaderQuality.High;
SpriteShader = device.CreateShader(FileSystem.Open("world-shp.fx"));
LineShader = device.CreateShader(FileSystem.Open("line.fx"));
RgbaSpriteShader = device.CreateShader(FileSystem.Open("chrome-rgba.fx"));
WorldSpriteShader = device.CreateShader(FileSystem.Open("chrome-shp.fx"));
fDebug = new Font("Tahoma", 10, FontStyle.Regular);
fTitle = new Font("Tahoma", 10, FontStyle.Bold);
@@ -67,6 +66,16 @@ namespace OpenRa.Graphics
textSprite = new Sprite(textSheet, new Rectangle(0, 0, 256, 256), TextureChannel.Alpha);
}
IGraphicsDevice CreateDevice( Assembly rendererDll, Control control, int width, int height, bool fullscreen, bool vsync )
{
foreach( RendererAttribute r in rendererDll.GetCustomAttributes( typeof( RendererAttribute ), false ) )
{
return (IGraphicsDevice)r.Type.GetConstructor( new Type[] { typeof( Control ), typeof( int ), typeof( int ), typeof( bool ), typeof( bool ) } )
.Invoke( new object[] { control, width, height, fullscreen, vsync } );
}
throw new NotImplementedException();
}
Bitmap RenderTextToBitmap(string s, Font f, Color c)
{
Bitmap b = new Bitmap(256, 256);
@@ -86,7 +95,7 @@ namespace OpenRa.Graphics
return new int2(g.MeasureString(s, f).ToSize());
}
public GraphicsDevice Device { get { return device; } }
public IGraphicsDevice Device { get { return device; } }
public void BeginFrame(float2 r1, float2 r2, float2 scroll)
{
@@ -99,7 +108,7 @@ namespace OpenRa.Graphics
SetShaderParams( WorldSpriteShader, r1, r2, scroll );
}
private void SetShaderParams( Shader s, float2 r1, float2 r2, float2 scroll )
private void SetShaderParams( IShader s, float2 r1, float2 r2, float2 scroll )
{
s.SetValue( "Palette", PaletteTexture );
s.SetValue( "Scroll", scroll.X, scroll.Y );
@@ -114,8 +123,8 @@ namespace OpenRa.Graphics
device.Present();
}
public void DrawBatch<T>(VertexBuffer<T> vertices, IndexBuffer indices,
Range<int> vertexRange, Range<int> indexRange, Texture texture, PrimitiveType type, Shader shader)
public void DrawBatch<T>(IVertexBuffer<T> vertices, IIndexBuffer indices,
Range<int> vertexRange, Range<int> indexRange, ITexture texture, PrimitiveType type, IShader shader)
where T : struct
{
shader.SetValue("DiffuseTexture", texture);
@@ -129,8 +138,8 @@ namespace OpenRa.Graphics
PerfHistory.Increment("batches", 1);
}
public void DrawBatch<T>(VertexBuffer<T> vertices, IndexBuffer indices,
int vertexPool, int numPrimitives, Texture texture, PrimitiveType type)
public void DrawBatch<T>(IVertexBuffer<T> vertices, IIndexBuffer indices,
int vertexPool, int numPrimitives, ITexture texture, PrimitiveType type)
where T : struct
{
SpriteShader.SetValue("DiffuseTexture", texture);

View File

@@ -20,7 +20,7 @@
using System.Drawing;
using OpenRa.FileFormats;
using OpenRa.GlRenderer;
using OpenRa.FileFormats.Graphics;
namespace OpenRa.Graphics
{
@@ -29,7 +29,7 @@ namespace OpenRa.Graphics
readonly Renderer renderer;
protected readonly Bitmap bitmap;
Texture texture;
ITexture texture;
internal Sheet(Renderer renderer, Size size)
{
@@ -45,10 +45,10 @@ namespace OpenRa.Graphics
void Resolve()
{
texture = new Texture(renderer.Device, bitmap);
texture = renderer.Device.CreateTexture(bitmap);
}
public Texture Texture
public ITexture Texture
{
get
{

View File

@@ -18,16 +18,16 @@
*/
#endregion
using OpenRa.GlRenderer;
using OpenRa.FileFormats.Graphics;
namespace OpenRa.Graphics
{
class SpriteRenderer
{
VertexBuffer<Vertex> vertexBuffer;
IndexBuffer indexBuffer;
IVertexBuffer<Vertex> vertexBuffer;
IIndexBuffer indexBuffer;
Renderer renderer;
Shader shader;
IShader shader;
const int spritesPerBatch = 1024;
@@ -35,18 +35,15 @@ namespace OpenRa.Graphics
ushort[] indices = new ushort[6 * spritesPerBatch];
Sheet currentSheet = null;
int sprites = 0;
ShaderQuality quality;
int nv = 0, ni = 0;
public SpriteRenderer(Renderer renderer, bool allowAlpha, Shader shader)
public SpriteRenderer(Renderer renderer, bool allowAlpha, IShader shader)
{
this.renderer = renderer;
this.shader = shader;
vertexBuffer = new VertexBuffer<Vertex>(renderer.Device, vertices.Length, Vertex.Format);
indexBuffer = new IndexBuffer(renderer.Device, indices.Length);
quality = allowAlpha ? ShaderQuality.High : ShaderQuality.Low;
vertexBuffer = renderer.Device.CreateVertexBuffer<Vertex>( vertices.Length );
indexBuffer = renderer.Device.CreateIndexBuffer( indices.Length );
}
public SpriteRenderer(Renderer renderer, bool allowAlpha)
@@ -56,7 +53,6 @@ namespace OpenRa.Graphics
{
if (sprites > 0)
{
shader.Quality = quality;
shader.SetValue( "DiffuseTexture", currentSheet.Texture );
shader.Render(() =>
{

View File

@@ -20,14 +20,14 @@
using System.Drawing;
using OpenRa.FileFormats;
using OpenRa.GlRenderer;
using OpenRa.FileFormats.Graphics;
namespace OpenRa.Graphics
{
class TerrainRenderer
{
VertexBuffer<Vertex> vertexBuffer;
IndexBuffer indexBuffer;
IVertexBuffer<Vertex> vertexBuffer;
IIndexBuffer indexBuffer;
Sheet terrainSheet;
Renderer renderer;
@@ -62,10 +62,10 @@ namespace OpenRa.Graphics
terrainSheet = tileMapping[map.MapTiles[map.XOffset, map.YOffset]].sheet;
vertexBuffer = new VertexBuffer<Vertex>( renderer.Device, vertices.Length, Vertex.Format );
vertexBuffer = renderer.Device.CreateVertexBuffer<Vertex>( vertices.Length );
vertexBuffer.SetData( vertices );
indexBuffer = new IndexBuffer( renderer.Device, indices.Length );
indexBuffer = renderer.Device.CreateIndexBuffer( indices.Length );
indexBuffer.SetData( indices );
overlayRenderer = new OverlayRenderer( renderer, map );
@@ -97,7 +97,6 @@ namespace OpenRa.Graphics
firstRow = r.Bottom - map.YOffset;
}
renderer.SpriteShader.Quality = ShaderQuality.Low;
renderer.SpriteShader.SetValue( "DiffuseTexture", terrainSheet.Texture );
renderer.SpriteShader.Render(() =>
renderer.DrawBatch(vertexBuffer, indexBuffer,

View File

@@ -19,7 +19,6 @@
#endregion
using System.Runtime.InteropServices;
using OpenRa.GlRenderer;
namespace OpenRa.Graphics
{
@@ -35,7 +34,5 @@ namespace OpenRa.Graphics
this.u = uv.X; this.v = uv.Y;
this.p = pc.X; this.c = pc.Y;
}
public const VertexFormat Format = VertexFormat.Position | VertexFormat.Texture2;
}
}