diff --git a/OpenRA.Game/Graphics/ChromeProvider.cs b/OpenRA.Game/Graphics/ChromeProvider.cs index f3c665386c..2031d55099 100644 --- a/OpenRA.Game/Graphics/ChromeProvider.cs +++ b/OpenRA.Game/Graphics/ChromeProvider.cs @@ -17,8 +17,8 @@ namespace OpenRA.Graphics { struct Collection { - public string src; - public Dictionary regions; + public string Src; + public Dictionary Regions; } static Dictionary collections; @@ -62,10 +62,10 @@ namespace OpenRA.Graphics static MiniYaml SaveCollection(Collection collection) { var root = new List(); - foreach (var kv in collection.regions) - root.Add(new MiniYamlNode(kv.Key, kv.Value.Save(collection.src))); + foreach (var kv in collection.Regions) + root.Add(new MiniYamlNode(kv.Key, kv.Value.Save(collection.Src))); - return new MiniYaml(collection.src, root); + return new MiniYaml(collection.Src, root); } static void LoadCollection(string name, MiniYaml yaml) @@ -73,8 +73,8 @@ namespace OpenRA.Graphics Game.modData.LoadScreen.Display(); var collection = new Collection() { - src = yaml.Value, - regions = yaml.Nodes.ToDictionary(n => n.Key, n => new MappedImage(yaml.Value, n.Value)) + Src = yaml.Value, + Regions = yaml.Nodes.ToDictionary(n => n.Key, n => new MappedImage(yaml.Value, n.Value)) }; collections.Add(name, collection); @@ -96,7 +96,7 @@ namespace OpenRA.Graphics } MappedImage mi; - if (!collection.regions.TryGetValue(imageName, out mi)) + if (!collection.Regions.TryGetValue(imageName, out mi)) return null; // Cached sheet @@ -115,6 +115,7 @@ namespace OpenRA.Graphics cachedCollection = new Dictionary(); cachedSprites.Add(collectionName, cachedCollection); } + var image = mi.GetImage(sheet); cachedCollection.Add(imageName, image); diff --git a/OpenRA.Game/Graphics/CursorProvider.cs b/OpenRA.Game/Graphics/CursorProvider.cs index 15ca48db5c..1f1d8bdb79 100644 --- a/OpenRA.Game/Graphics/CursorProvider.cs +++ b/OpenRA.Game/Graphics/CursorProvider.cs @@ -18,9 +18,9 @@ namespace OpenRA.Graphics { public sealed class CursorProvider : IDisposable { - HardwarePalette palette; - Dictionary cursors; - Cache palettes; + readonly HardwarePalette palette = new HardwarePalette(); + readonly Dictionary cursors = new Dictionary(); + readonly Cache palettes; readonly SheetBuilder sheetBuilder; public static bool CursorViewportZoomed { get { return Game.Settings.Graphics.CursorDouble && Game.Settings.Graphics.PixelDouble; } } @@ -29,7 +29,6 @@ namespace OpenRA.Graphics { var sequenceFiles = modData.Manifest.Cursors; - cursors = new Dictionary(); palettes = new Cache(CreatePaletteReference); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); var shadowIndex = new int[] { }; @@ -42,7 +41,6 @@ namespace OpenRA.Graphics out shadowIndex[shadowIndex.Length - 1]); } - palette = new HardwarePalette(); foreach (var p in nodesDict["Palettes"].Nodes) palette.AddPalette(p.Key, new ImmutablePalette(GlobalFileSystem.Open(p.Value.Value), shadowIndex), false); diff --git a/OpenRA.Game/Graphics/LineRenderer.cs b/OpenRA.Game/Graphics/LineRenderer.cs index 6bc4b93323..f7c3ff79ec 100644 --- a/OpenRA.Game/Graphics/LineRenderer.cs +++ b/OpenRA.Game/Graphics/LineRenderer.cs @@ -15,14 +15,16 @@ namespace OpenRA.Graphics { public class LineRenderer : Renderer.IBatchRenderer { - static float2 offset = new float2(0.5f, 0.5f); - float lineWidth = 1f; - Renderer renderer; - IShader shader; + static readonly float2 Offset = new float2(0.5f, 0.5f); + + readonly Renderer renderer; + readonly IShader shader; readonly Vertex[] vertices; int nv = 0; + float lineWidth = 1f; + public LineRenderer(Renderer renderer, IShader shader) { this.renderer = renderer; @@ -30,10 +32,12 @@ namespace OpenRA.Graphics vertices = new Vertex[renderer.TempBufferSize]; } - public float LineWidth { - get { return lineWidth; } + get + { + return lineWidth; + } set { if (LineWidth != value) @@ -77,11 +81,11 @@ namespace OpenRA.Graphics if (nv + 2 > renderer.TempBufferSize) Flush(); - vertices[nv++] = new Vertex(start + offset, + vertices[nv++] = new Vertex(start + Offset, startColor.R / 255.0f, startColor.G / 255.0f, startColor.B / 255.0f, startColor.A / 255.0f); - vertices[nv++] = new Vertex(end + offset, + vertices[nv++] = new Vertex(end + Offset, endColor.R / 255.0f, endColor.G / 255.0f, endColor.B / 255.0f, endColor.A / 255.0f); } @@ -100,7 +104,7 @@ namespace OpenRA.Graphics var yc = (r.Bottom + r.Top) / 2; for (var y = r.Top; y <= r.Bottom; y++) { - var dx = a * (float)(Math.Sqrt(1 - (y - yc) * (y - yc) / b / b)); + var dx = a * (float)Math.Sqrt(1 - (y - yc) * (y - yc) / b / b); DrawLine(new float2(xc - dx, y), new float2(xc + dx, y), color, color); } } @@ -108,7 +112,7 @@ namespace OpenRA.Graphics public void SetViewportParams(Size screen, float zoom, int2 scroll) { shader.SetVec("Scroll", scroll.X, scroll.Y); - shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height); + shader.SetVec("r1", zoom * 2f / screen.Width, -zoom * 2f / screen.Height); shader.SetVec("r2", -1, 1); } } diff --git a/OpenRA.Game/Graphics/QuadRenderer.cs b/OpenRA.Game/Graphics/QuadRenderer.cs index 254064c714..c3f562a4f7 100644 --- a/OpenRA.Game/Graphics/QuadRenderer.cs +++ b/OpenRA.Game/Graphics/QuadRenderer.cs @@ -14,8 +14,8 @@ namespace OpenRA.Graphics { public class QuadRenderer : Renderer.IBatchRenderer { - Renderer renderer; - IShader shader; + readonly Renderer renderer; + readonly IShader shader; readonly Vertex[] vertices; int nv = 0; @@ -66,7 +66,7 @@ namespace OpenRA.Graphics public void SetViewportParams(Size screen, float zoom, int2 scroll) { shader.SetVec("Scroll", scroll.X, scroll.Y); - shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height); + shader.SetVec("r1", zoom * 2f / screen.Width, -zoom * 2f / screen.Height); shader.SetVec("r2", -1, 1); } } diff --git a/OpenRA.Game/Graphics/Renderer.cs b/OpenRA.Game/Graphics/Renderer.cs index d6818475d2..c99cd38d94 100644 --- a/OpenRA.Game/Graphics/Renderer.cs +++ b/OpenRA.Game/Graphics/Renderer.cs @@ -11,7 +11,6 @@ using System; using System.Collections.Generic; using System.Drawing; -using System.IO; using System.Linq; using System.Reflection; using OpenRA.Support; @@ -20,10 +19,6 @@ namespace OpenRA.Graphics { public sealed class Renderer : IDisposable { - internal int SheetSize { get; private set; } - internal int TempBufferSize { get; private set; } - internal int TempBufferCount { get; private set; } - public SpriteRenderer WorldSpriteRenderer { get; private set; } public SpriteRenderer WorldRgbaSpriteRenderer { get; private set; } public QuadRenderer WorldQuadRenderer { get; private set; } @@ -32,49 +27,77 @@ namespace OpenRA.Graphics public LineRenderer LineRenderer { get; private set; } public SpriteRenderer RgbaSpriteRenderer { get; private set; } public SpriteRenderer SpriteRenderer { get; private set; } + public IReadOnlyDictionary Fonts; - Queue> tempBuffers = new Queue>(); + internal IGraphicsDevice Device { get; private set; } + internal int SheetSize { get; private set; } + internal int TempBufferSize { get; private set; } + internal int TempBufferCount { get; private set; } - public Dictionary Fonts; - Stack scissorState; + readonly Queue> tempBuffers = new Queue>(); + readonly Stack scissorState = new Stack(); + + Size? lastResolution; + int2? lastScroll; + float? lastZoom; + ITexture currentPaletteTexture; + IBatchRenderer currentBatchRenderer; public Renderer(GraphicSettings graphicSettings, ServerSettings serverSettings) { - Initialize(graphicSettings, serverSettings); + var resolution = GetResolution(graphicSettings); + + var rendererName = serverSettings.Dedicated ? "Null" : graphicSettings.Renderer; + var rendererPath = Platform.ResolvePath(".", "OpenRA.Renderer." + rendererName + ".dll"); + + Device = CreateDevice(Assembly.LoadFile(rendererPath), resolution.Width, resolution.Height, graphicSettings.Mode); TempBufferSize = graphicSettings.BatchSize; TempBufferCount = graphicSettings.NumTempBuffers; SheetSize = graphicSettings.SheetSize; - scissorState = new Stack(); - WorldSpriteRenderer = new SpriteRenderer(this, device.CreateShader("shp")); - WorldRgbaSpriteRenderer = new SpriteRenderer(this, device.CreateShader("rgba")); - WorldLineRenderer = new LineRenderer(this, device.CreateShader("line")); - WorldVoxelRenderer = new VoxelRenderer(this, device.CreateShader("vxl")); - LineRenderer = new LineRenderer(this, device.CreateShader("line")); - WorldQuadRenderer = new QuadRenderer(this, device.CreateShader("line")); - RgbaSpriteRenderer = new SpriteRenderer(this, device.CreateShader("rgba")); - SpriteRenderer = new SpriteRenderer(this, device.CreateShader("shp")); + WorldSpriteRenderer = new SpriteRenderer(this, Device.CreateShader("shp")); + WorldRgbaSpriteRenderer = new SpriteRenderer(this, Device.CreateShader("rgba")); + WorldLineRenderer = new LineRenderer(this, Device.CreateShader("line")); + WorldVoxelRenderer = new VoxelRenderer(this, Device.CreateShader("vxl")); + LineRenderer = new LineRenderer(this, Device.CreateShader("line")); + WorldQuadRenderer = new QuadRenderer(this, Device.CreateShader("line")); + RgbaSpriteRenderer = new SpriteRenderer(this, Device.CreateShader("rgba")); + SpriteRenderer = new SpriteRenderer(this, Device.CreateShader("shp")); for (var i = 0; i < TempBufferCount; i++) - tempBuffers.Enqueue(device.CreateVertexBuffer(TempBufferSize)); + tempBuffers.Enqueue(Device.CreateVertexBuffer(TempBufferSize)); + } + + static Size GetResolution(GraphicSettings graphicsSettings) + { + var size = (graphicsSettings.Mode == WindowMode.Windowed) + ? graphicsSettings.WindowedSize + : graphicsSettings.FullscreenSize; + return new Size(size.X, size.Y); + } + + static IGraphicsDevice CreateDevice(Assembly rendererDll, int width, int height, WindowMode window) + { + foreach (RendererAttribute r in rendererDll.GetCustomAttributes(typeof(RendererAttribute), false)) + { + var factory = (IDeviceFactory)r.Type.GetConstructor(Type.EmptyTypes).Invoke(null); + return factory.Create(new Size(width, height), window); + } + + throw new InvalidOperationException("Renderer DLL is missing RendererAttribute to tell us what type to use!"); } public void InitializeFonts(Manifest m) { using (new Support.PerfTimer("SpriteFonts")) - Fonts = m.Fonts.ToDictionary(x => x.Key, x => new SpriteFont(Platform.ResolvePath(x.Value.First), x.Value.Second)); + Fonts = m.Fonts.ToDictionary(x => x.Key, + x => new SpriteFont(Platform.ResolvePath(x.Value.First), x.Value.Second)).AsReadOnly(); } - internal IGraphicsDevice Device { get { return device; } } - - Size? lastResolution; - int2? lastScroll; - float? lastZoom; - public void BeginFrame(int2 scroll, float zoom) { - device.Clear(); + Device.Clear(); var resolutionChanged = lastResolution != Resolution; if (resolutionChanged) @@ -98,7 +121,6 @@ namespace OpenRA.Graphics } } - ITexture currentPaletteTexture; public void SetPalette(HardwarePalette palette) { if (palette.Texture == currentPaletteTexture) @@ -117,8 +139,8 @@ namespace OpenRA.Graphics public void EndFrame(IInputHandler inputHandler) { Flush(); - device.PumpInput(inputHandler); - device.Present(); + Device.PumpInput(inputHandler); + Device.Present(); } public void DrawBatch(IVertexBuffer vertices, @@ -126,7 +148,7 @@ namespace OpenRA.Graphics where T : struct { vertices.Bind(); - device.DrawPrimitives(type, firstVertex, numVertices); + Device.DrawPrimitives(type, firstVertex, numVertices); PerfHistory.Increment("batches", 1); } @@ -137,58 +159,28 @@ namespace OpenRA.Graphics public void SetLineWidth(float width) { - device.SetLineWidth(width); + Device.SetLineWidth(width); } - static IGraphicsDevice device; - - public Size Resolution { get { return device.WindowSize; } } - - void Initialize(GraphicSettings graphicSettings, ServerSettings serverSettings) - { - var resolution = GetResolution(graphicSettings); - - var rendererName = serverSettings.Dedicated ? "Null" : graphicSettings.Renderer; - var rendererPath = Platform.ResolvePath(".", "OpenRA.Renderer." + rendererName + ".dll"); - - device = CreateDevice(Assembly.LoadFile(rendererPath), resolution.Width, resolution.Height, graphicSettings.Mode); - } - - static Size GetResolution(GraphicSettings graphicsSettings) - { - var size = (graphicsSettings.Mode == WindowMode.Windowed) - ? graphicsSettings.WindowedSize - : graphicsSettings.FullscreenSize; - return new Size(size.X, size.Y); - } - - static IGraphicsDevice CreateDevice(Assembly rendererDll, int width, int height, WindowMode window) - { - foreach (RendererAttribute r in rendererDll.GetCustomAttributes(typeof(RendererAttribute), false)) - { - var factory = (IDeviceFactory)r.Type.GetConstructor(Type.EmptyTypes).Invoke(null); - return factory.Create(new Size(width, height), window); - } - - throw new InvalidOperationException("Renderer DLL is missing RendererAttribute to tell us what type to use!"); - } + public Size Resolution { get { return Device.WindowSize; } } internal IVertexBuffer GetTempVertexBuffer() { - var ret = tempBuffers.Dequeue(); - tempBuffers.Enqueue(ret); - return ret; + return tempBuffers.Peek(); } - public interface IBatchRenderer { void Flush(); } + public interface IBatchRenderer { void Flush(); } - IBatchRenderer currentBatchRenderer; public IBatchRenderer CurrentBatchRenderer { - get { return currentBatchRenderer; } + get + { + return currentBatchRenderer; + } set { - if (currentBatchRenderer == value) return; + if (currentBatchRenderer == value) + return; if (currentBatchRenderer != null) currentBatchRenderer.Flush(); currentBatchRenderer = value; @@ -235,12 +227,12 @@ namespace OpenRA.Graphics public void GrabWindowMouseFocus() { - device.GrabWindowMouseFocus(); + Device.GrabWindowMouseFocus(); } public void ReleaseWindowMouseFocus() { - device.ReleaseWindowMouseFocus(); + Device.ReleaseWindowMouseFocus(); } public void Dispose() diff --git a/OpenRA.Game/Graphics/SheetBuilder.cs b/OpenRA.Game/Graphics/SheetBuilder.cs index 4a1ff5dce6..e136654fcc 100644 --- a/OpenRA.Game/Graphics/SheetBuilder.cs +++ b/OpenRA.Game/Graphics/SheetBuilder.cs @@ -32,12 +32,13 @@ namespace OpenRA.Graphics public sealed class SheetBuilder : IDisposable { readonly List sheets = new List(); + readonly SheetType type; + readonly Func allocateSheet; + Sheet current; TextureChannel channel; - SheetType type; int rowHeight = 0; Point p; - Func allocateSheet; public static Sheet AllocateSheet(int sheetSize) { diff --git a/OpenRA.Game/Graphics/SpriteFont.cs b/OpenRA.Game/Graphics/SpriteFont.cs index 562b302855..cf477d66a3 100644 --- a/OpenRA.Game/Graphics/SpriteFont.cs +++ b/OpenRA.Game/Graphics/SpriteFont.cs @@ -22,7 +22,7 @@ namespace OpenRA.Graphics static Library library = new Library(); static SheetBuilder builder; - int size; + readonly int size; string name; public SpriteFont(string name, int size) @@ -114,7 +114,6 @@ namespace OpenRA.Graphics // A new bitmap is generated each time this property is accessed, so we do need to dispose it. using (var bitmap = face.Glyph.Bitmap) - { unsafe { var p = (byte*)bitmap.Buffer; @@ -136,7 +135,7 @@ namespace OpenRA.Graphics p += bitmap.Pitch; } } - } + s.sheet.CommitData(); diff --git a/OpenRA.Game/Graphics/SpriteRenderer.cs b/OpenRA.Game/Graphics/SpriteRenderer.cs index d953128f20..10a0ce6b9b 100644 --- a/OpenRA.Game/Graphics/SpriteRenderer.cs +++ b/OpenRA.Game/Graphics/SpriteRenderer.cs @@ -14,8 +14,8 @@ namespace OpenRA.Graphics { public class SpriteRenderer : Renderer.IBatchRenderer { - Renderer renderer; - IShader shader; + readonly Renderer renderer; + readonly IShader shader; readonly Vertex[] vertices; Sheet currentSheet; @@ -124,7 +124,7 @@ namespace OpenRA.Graphics public void SetViewportParams(Size screen, float zoom, int2 scroll) { shader.SetVec("Scroll", scroll.X, scroll.Y); - shader.SetVec("r1", zoom*2f/screen.Width, -zoom*2f/screen.Height); + shader.SetVec("r1", zoom * 2f / screen.Width, -zoom * 2f / screen.Height); shader.SetVec("r2", -1, 1); } } diff --git a/OpenRA.Game/Graphics/TerrainRenderer.cs b/OpenRA.Game/Graphics/TerrainRenderer.cs index bf01017cc5..dffe1bf2c3 100644 --- a/OpenRA.Game/Graphics/TerrainRenderer.cs +++ b/OpenRA.Game/Graphics/TerrainRenderer.cs @@ -15,10 +15,9 @@ namespace OpenRA.Graphics { sealed class TerrainRenderer : IDisposable { - IVertexBuffer vertexBuffer; - - World world; - Map map; + readonly IVertexBuffer vertexBuffer; + readonly World world; + readonly Map map; public TerrainRenderer(World world, WorldRenderer wr) { @@ -43,7 +42,7 @@ namespace OpenRA.Graphics public void Draw(WorldRenderer wr, Viewport viewport) { - var verticesPerRow = 4*map.Bounds.Width; + var verticesPerRow = 4 * map.Bounds.Width; var cells = viewport.VisibleCells; var shape = wr.world.Map.TileShape; diff --git a/OpenRA.Game/Graphics/Theater.cs b/OpenRA.Game/Graphics/Theater.cs index 684f2fb976..3972a6f564 100644 --- a/OpenRA.Game/Graphics/Theater.cs +++ b/OpenRA.Game/Graphics/Theater.cs @@ -18,9 +18,9 @@ namespace OpenRA.Graphics { public sealed class Theater : IDisposable { - SheetBuilder sheetBuilder; - Dictionary templates; - Sprite missingTile; + readonly Dictionary templates = new Dictionary(); + readonly SheetBuilder sheetBuilder; + readonly Sprite missingTile; TileSet tileset; public Theater(TileSet tileset) diff --git a/OpenRA.Game/Graphics/VoxelLoader.cs b/OpenRA.Game/Graphics/VoxelLoader.cs index 5f80528131..506a5070da 100644 --- a/OpenRA.Game/Graphics/VoxelLoader.cs +++ b/OpenRA.Game/Graphics/VoxelLoader.cs @@ -34,14 +34,16 @@ namespace OpenRA.Graphics public sealed class VoxelLoader : IDisposable { - SheetBuilder sheetBuilder; + static readonly float[] ChannelSelect = { 0.75f, 0.25f, -0.25f, -0.75f }; - Cache, Voxel> voxels; + readonly List vertices = new List(); + readonly Cache, Voxel> voxels; IVertexBuffer vertexBuffer; - List vertices; int totalVertexCount; int cachedVertexCount; + SheetBuilder sheetBuilder; + static SheetBuilder CreateSheetBuilder() { var allocated = false; @@ -58,7 +60,7 @@ namespace OpenRA.Graphics public VoxelLoader() { - voxels = new Cache, Voxel>(LoadFile); + voxels = new Cache, Voxel>(LoadFile); vertices = new List(); totalVertexCount = 0; cachedVertexCount = 0; @@ -66,29 +68,28 @@ namespace OpenRA.Graphics sheetBuilder = CreateSheetBuilder(); } - static float[] channelSelect = { 0.75f, 0.25f, -0.25f, -0.75f }; - Vertex[] GenerateSlicePlane(int su, int sv, Func first, Func second, Func coord) + Vertex[] GenerateSlicePlane(int su, int sv, Func first, Func second, Func coord) { - var colors = new byte[su*sv]; - var normals = new byte[su*sv]; + var colors = new byte[su * sv]; + var normals = new byte[su * sv]; var c = 0; for (var v = 0; v < sv; v++) for (var u = 0; u < su; u++) - { - var voxel = first(u,v) ?? second(u,v); - colors[c] = voxel == null ? (byte)0 : voxel.Color; - normals[c] = voxel == null ? (byte)0 : voxel.Normal; - c++; - } + { + var voxel = first(u, v) ?? second(u, v); + colors[c] = voxel == null ? (byte)0 : voxel.Color; + normals[c] = voxel == null ? (byte)0 : voxel.Normal; + c++; + } var s = sheetBuilder.Allocate(new Size(su, sv)); Util.FastCopyIntoChannel(s, 0, colors); Util.FastCopyIntoChannel(s, 1, normals); s.sheet.CommitData(); - var channelP =channelSelect[(int)s.channel]; - var channelC = channelSelect[(int)s.channel + 1]; + var channelP = ChannelSelect[(int)s.channel]; + var channelC = ChannelSelect[(int)s.channel + 1]; return new Vertex[4] { new Vertex(coord(0, 0), s.left, s.top, channelP, channelC), @@ -100,7 +101,7 @@ namespace OpenRA.Graphics IEnumerable GenerateSlicePlanes(VxlLimb l) { - Func get = (x,y,z) => + Func get = (x, y, z) => { if (x < 0 || y < 0 || z < 0) return null; @@ -108,41 +109,41 @@ namespace OpenRA.Graphics if (x >= l.Size[0] || y >= l.Size[1] || z >= l.Size[2]) return null; - var v = l.VoxelMap[(byte)x,(byte)y]; + var v = l.VoxelMap[(byte)x, (byte)y]; if (v == null || !v.ContainsKey((byte)z)) return null; - return l.VoxelMap[(byte)x,(byte)y][(byte)z]; + return l.VoxelMap[(byte)x, (byte)y][(byte)z]; }; // Cull slices without any visible faces - var xPlanes = new bool[l.Size[0]+1]; - var yPlanes = new bool[l.Size[1]+1]; - var zPlanes = new bool[l.Size[2]+1]; + var xPlanes = new bool[l.Size[0] + 1]; + var yPlanes = new bool[l.Size[1] + 1]; + var zPlanes = new bool[l.Size[2] + 1]; for (var x = 0; x < l.Size[0]; x++) { for (var y = 0; y < l.Size[1]; y++) { for (var z = 0; z < l.Size[2]; z++) { - if (get(x,y,z) == null) + if (get(x, y, z) == null) continue; // Only generate a plane if it is actually visible - if (!xPlanes[x] && get(x-1,y,z) == null) + if (!xPlanes[x] && get(x - 1, y, z) == null) xPlanes[x] = true; - if (!xPlanes[x+1] && get(x+1,y,z) == null) - xPlanes[x+1] = true; + if (!xPlanes[x + 1] && get(x + 1, y, z) == null) + xPlanes[x + 1] = true; - if (!yPlanes[y] && get(x,y-1,z) == null) + if (!yPlanes[y] && get(x, y - 1, z) == null) yPlanes[y] = true; - if (!yPlanes[y+1] && get(x,y+1,z) == null) - yPlanes[y+1] = true; + if (!yPlanes[y + 1] && get(x, y + 1, z) == null) + yPlanes[y + 1] = true; - if (!zPlanes[z] && get(x,y,z-1) == null) + if (!zPlanes[z] && get(x, y, z - 1) == null) zPlanes[z] = true; - if (!zPlanes[z+1] && get(x,y,z+1) == null) - zPlanes[z+1] = true; + if (!zPlanes[z + 1] && get(x, y, z + 1) == null) + zPlanes[z + 1] = true; } } } @@ -150,23 +151,23 @@ namespace OpenRA.Graphics for (var x = 0; x <= l.Size[0]; x++) if (xPlanes[x]) yield return GenerateSlicePlane(l.Size[1], l.Size[2], - (u,v) => get(x, u, v), - (u,v) => get(x - 1, u, v), - (u,v) => new float[] {x, u, v}); + (u, v) => get(x, u, v), + (u, v) => get(x - 1, u, v), + (u, v) => new float[] { x, u, v }); for (var y = 0; y <= l.Size[1]; y++) if (yPlanes[y]) yield return GenerateSlicePlane(l.Size[0], l.Size[2], - (u,v) => get(u, y, v), - (u,v) => get(u, y - 1, v), - (u,v) => new float[] {u, y, v}); + (u, v) => get(u, y, v), + (u, v) => get(u, y - 1, v), + (u, v) => new float[] { u, y, v }); for (var z = 0; z <= l.Size[2]; z++) if (zPlanes[z]) yield return GenerateSlicePlane(l.Size[0], l.Size[1], - (u,v) => get(u, v, z), - (u,v) => get(u, v, z - 1), - (u,v) => new float[] {u, v, z}); + (u, v) => get(u, v, z), + (u, v) => get(u, v, z - 1), + (u, v) => new float[] { u, v, z }); } public VoxelRenderData GenerateRenderData(VxlLimb l) @@ -212,7 +213,7 @@ namespace OpenRA.Graphics } } - Voxel LoadFile(Pair files) + Voxel LoadFile(Pair files) { VxlReader vxl; HvaReader hva; diff --git a/OpenRA.Game/Graphics/VoxelRenderer.cs b/OpenRA.Game/Graphics/VoxelRenderer.cs index 8180cdb7ce..6b062b1faf 100644 --- a/OpenRA.Game/Graphics/VoxelRenderer.cs +++ b/OpenRA.Game/Graphics/VoxelRenderer.cs @@ -34,31 +34,28 @@ namespace OpenRA.Graphics public sealed class VoxelRenderer : IDisposable { - Renderer renderer; - IShader shader; + // Static constants + static readonly float[] ShadowDiffuse = new float[] { 0, 0, 0 }; + static readonly float[] ShadowAmbient = new float[] { 1, 1, 1 }; + static readonly float2 SpritePadding = new float2(2, 2); + static readonly float[] ZeroVector = new float[] { 0, 0, 0, 1 }; + static readonly float[] ZVector = new float[] { 0, 0, 1, 1 }; + static readonly float[] FlipMtx = Util.ScaleMatrix(1, -1, 1); + static readonly float[] ShadowScaleFlipMtx = Util.ScaleMatrix(2, -2, 2); + + readonly Renderer renderer; + readonly IShader shader; + + readonly Dictionary mappedBuffers = new Dictionary(); + readonly Stack> unmappedBuffers = new Stack>(); + readonly List> doRender = new List>(); SheetBuilder sheetBuilder; - Dictionary mappedBuffers; - Stack> unmappedBuffers; - List> doRender; - - // Static constants - static readonly float[] shadowDiffuse = new float[] {0,0,0}; - static readonly float[] shadowAmbient = new float[] {1,1,1}; - static readonly float2 spritePadding = new float2(2, 2); - static readonly float[] zeroVector = new float[] {0,0,0,1}; - static readonly float[] zVector = new float[] {0,0,1,1}; - static readonly float[] flipMtx = Util.ScaleMatrix(1, -1, 1); - static readonly float[] shadowScaleFlipMtx = Util.ScaleMatrix(2, -2, 2); public VoxelRenderer(Renderer renderer, IShader shader) { this.renderer = renderer; this.shader = shader; - - mappedBuffers = new Dictionary(); - unmappedBuffers = new Stack>(); - doRender = new List>(); } public void SetPalette(ITexture palette) @@ -73,7 +70,7 @@ namespace OpenRA.Graphics { a, 0, 0, 0, 0, -a, 0, 0, - 0, 0, -2*a, 0, + 0, 0, -2 * a, 0, -1, 1, 0, 1 }; @@ -111,7 +108,7 @@ namespace OpenRA.Graphics var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]); var worldTransform = v.RotationFunc().Aggregate(Util.IdentityMatrix(), - (x,y) => Util.MatrixMultiply(Util.MakeFloatMatrix(y.AsMatrix()), x)); + (x, y) => Util.MatrixMultiply(Util.MakeFloatMatrix(y.AsMatrix()), x)); worldTransform = Util.MatrixMultiply(scaleTransform, worldTransform); worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform); @@ -128,18 +125,18 @@ namespace OpenRA.Graphics } // Inflate rects to ensure rendering is within bounds - tl -= spritePadding; - br += spritePadding; - stl -= spritePadding; - sbr += spritePadding; + tl -= SpritePadding; + br += SpritePadding; + stl -= SpritePadding; + sbr += SpritePadding; // Corners of the shadow quad, in shadow-space var corners = new float[][] { - new float[] {stl.X, stl.Y, 0, 1}, - new float[] {sbr.X, sbr.Y, 0, 1}, - new float[] {sbr.X, stl.Y, 0, 1}, - new float[] {stl.X, sbr.Y, 0, 1} + new[] { stl.X, stl.Y, 0, 1 }, + new[] { sbr.X, sbr.Y, 0, 1 }, + new[] { sbr.X, stl.Y, 0, 1 }, + new[] { stl.X, sbr.Y, 0, 1 } }; var shadowScreenTransform = Util.MatrixMultiply(cameraTransform, invShadowTransform); @@ -148,8 +145,8 @@ namespace OpenRA.Graphics for (var j = 0; j < 4; j++) { // Project to ground plane - corners[j][2] = -(corners[j][1]*shadowGroundNormal[1]/shadowGroundNormal[2] + - corners[j][0]*shadowGroundNormal[0]/shadowGroundNormal[2]); + corners[j][2] = -(corners[j][1] * shadowGroundNormal[1] / shadowGroundNormal[2] + + corners[j][0] * shadowGroundNormal[0] / shadowGroundNormal[2]); // Rotate to camera-space corners[j] = Util.MatrixVectorMultiply(shadowScreenTransform, corners[j]); @@ -171,8 +168,8 @@ namespace OpenRA.Graphics var translateMtx = Util.TranslationMatrix(spriteCenter.X - spriteOffset.X, renderer.SheetSize - (spriteCenter.Y - spriteOffset.Y), 0); var shadowTranslateMtx = Util.TranslationMatrix(shadowCenter.X - shadowSpriteOffset.X, renderer.SheetSize - (shadowCenter.Y - shadowSpriteOffset.Y), 0); - var correctionTransform = Util.MatrixMultiply(translateMtx, flipMtx); - var shadowCorrectionTransform = Util.MatrixMultiply(shadowTranslateMtx, shadowScaleFlipMtx); + var correctionTransform = Util.MatrixMultiply(translateMtx, FlipMtx); + var shadowCorrectionTransform = Util.MatrixMultiply(shadowTranslateMtx, ShadowScaleFlipMtx); doRender.Add(Pair.New(sprite.sheet, () => { @@ -183,7 +180,7 @@ namespace OpenRA.Graphics var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]); var rotations = v.RotationFunc().Aggregate(Util.IdentityMatrix(), - (x,y) => Util.MatrixMultiply(Util.MakeFloatMatrix(y.AsMatrix()), x)); + (x, y) => Util.MatrixMultiply(Util.MakeFloatMatrix(y.AsMatrix()), x)); var worldTransform = Util.MatrixMultiply(scaleTransform, rotations); worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform); @@ -209,21 +206,21 @@ namespace OpenRA.Graphics // Disable shadow normals by forcing zero diffuse and identity ambient light Render(rd, Util.MatrixMultiply(shadow, t), lightDirection, - shadowAmbient, shadowDiffuse, shadowPalette.Index, normals.Index); + ShadowAmbient, ShadowDiffuse, shadowPalette.Index, normals.Index); } } })); - var screenLightVector = Util.MatrixVectorMultiply(invShadowTransform, zVector); + var screenLightVector = Util.MatrixVectorMultiply(invShadowTransform, ZVector); screenLightVector = Util.MatrixVectorMultiply(cameraTransform, screenLightVector); - return new VoxelRenderProxy(sprite, shadowSprite, screenCorners, -screenLightVector[2]/screenLightVector[1]); + return new VoxelRenderProxy(sprite, shadowSprite, screenCorners, -screenLightVector[2] / screenLightVector[1]); } static void CalculateSpriteGeometry(float2 tl, float2 br, float scale, out Size size, out int2 offset) { - var width = (int)(scale*(br.X - tl.X)); - var height = (int)(scale*(br.Y - tl.Y)); - offset = (0.5f*scale*(br + tl)).ToInt2(); + var width = (int)(scale * (br.X - tl.X)); + var height = (int)(scale * (br.Y - tl.Y)); + offset = (0.5f * scale * (br + tl)).ToInt2(); // Width and height must be even to avoid rendering glitches if ((width & 1) == 1) @@ -236,14 +233,14 @@ namespace OpenRA.Graphics static float[] ExtractRotationVector(float[] mtx) { - var tVec = Util.MatrixVectorMultiply(mtx, zVector); - var tOrigin = Util.MatrixVectorMultiply(mtx, zeroVector); - tVec[0] -= tOrigin[0]*tVec[3]/tOrigin[3]; - tVec[1] -= tOrigin[1]*tVec[3]/tOrigin[3]; - tVec[2] -= tOrigin[2]*tVec[3]/tOrigin[3]; + var tVec = Util.MatrixVectorMultiply(mtx, ZVector); + var tOrigin = Util.MatrixVectorMultiply(mtx, ZeroVector); + tVec[0] -= tOrigin[0] * tVec[3] / tOrigin[3]; + tVec[1] -= tOrigin[1] * tVec[3] / tOrigin[3]; + tVec[2] -= tOrigin[2] * tVec[3] / tOrigin[3]; // Renormalize - var w = (float)Math.Sqrt(tVec[0]*tVec[0] + tVec[1]*tVec[1] + tVec[2]*tVec[2]); + var w = (float)Math.Sqrt(tVec[0] * tVec[0] + tVec[1] * tVec[1] + tVec[2] * tVec[2]); tVec[0] /= w; tVec[1] /= w; tVec[2] /= w; diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 4a9d410ef6..89140b8406 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -35,18 +35,16 @@ namespace OpenRA.Graphics public readonly Theater Theater; public Viewport Viewport { get; private set; } + readonly HardwarePalette palette = new HardwarePalette(); + readonly Dictionary palettes = new Dictionary(); readonly TerrainRenderer terrainRenderer; - readonly HardwarePalette palette; - readonly Dictionary palettes; readonly Lazy devTrait; internal WorldRenderer(World world) { this.world = world; Viewport = new Viewport(this, world.Map); - palette = new HardwarePalette(); - palettes = new Dictionary(); foreach (var pal in world.traitDict.ActorsWithTrait()) pal.Trait.LoadPalettes(this); diff --git a/OpenRA.Game/ModData.cs b/OpenRA.Game/ModData.cs index 3dcd09796f..3715a3fbe6 100644 --- a/OpenRA.Game/ModData.cs +++ b/OpenRA.Game/ModData.cs @@ -25,9 +25,9 @@ namespace OpenRA public readonly WidgetLoader WidgetLoader; public readonly MapCache MapCache; public readonly ISpriteLoader[] SpriteLoaders; - public ILoadScreen LoadScreen = null; - public VoxelLoader VoxelLoader; public readonly RulesetCache RulesetCache; + public ILoadScreen LoadScreen { get; private set; } + public VoxelLoader VoxelLoader { get; private set; } public CursorProvider CursorProvider { get; private set; } Lazy defaultRules; diff --git a/OpenRA.Mods.Cnc/CncLoadScreen.cs b/OpenRA.Mods.Cnc/CncLoadScreen.cs index 29d1d9cf06..1f3d424737 100644 --- a/OpenRA.Mods.Cnc/CncLoadScreen.cs +++ b/OpenRA.Mods.Cnc/CncLoadScreen.cs @@ -11,8 +11,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Drawing; -using System.Linq; -using OpenRA.FileSystem; using OpenRA.Graphics; using OpenRA.Widgets; @@ -29,7 +27,7 @@ namespace OpenRA.Mods.Cnc Sprite nodLogo, gdiLogo, evaLogo, brightBlock, dimBlock; Rectangle bounds; Renderer r; - NullInputHandler nih = new NullInputHandler(); + readonly NullInputHandler nih = new NullInputHandler(); public void Init(Manifest m, Dictionary info) { diff --git a/OpenRA.Mods.Common/LoadScreens/DefaultLoadScreen.cs b/OpenRA.Mods.Common/LoadScreens/DefaultLoadScreen.cs index b8ad1c579c..c04fa6738d 100644 --- a/OpenRA.Mods.Common/LoadScreens/DefaultLoadScreen.cs +++ b/OpenRA.Mods.Common/LoadScreens/DefaultLoadScreen.cs @@ -11,8 +11,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Drawing; -using System.Linq; -using OpenRA.FileSystem; using OpenRA.Graphics; using OpenRA.Widgets; diff --git a/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs index d624827991..8b7e110d3d 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ModBrowserLogic.cs @@ -20,16 +20,16 @@ namespace OpenRA.Mods.Common.Widgets.Logic { public class ModBrowserLogic { - Widget modList; - ButtonWidget modTemplate; - ModMetadata[] allMods; + readonly Widget modList; + readonly ButtonWidget modTemplate; + readonly ModMetadata[] allMods; + readonly Dictionary previews = new Dictionary(); + readonly Dictionary logos = new Dictionary(); readonly SheetBuilder sheetBuilder; ModMetadata selectedMod; string selectedAuthor; string selectedDescription; int modOffset = 0; - Dictionary previews; - Dictionary logos; [ObjectCreator.UseCtor] public ModBrowserLogic(Widget widget) @@ -65,8 +65,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; sheetBuilder = new SheetBuilder(SheetType.BGRA); - previews = new Dictionary(); - logos = new Dictionary(); allMods = ModMetadata.AllMods.Values.Where(m => m.Id != "modchooser") .OrderBy(m => m.Title) .ToArray(); diff --git a/OpenRA.Renderer.Sdl2/Texture.cs b/OpenRA.Renderer.Sdl2/Texture.cs index 60efb8c433..3e3ae2bd7a 100644 --- a/OpenRA.Renderer.Sdl2/Texture.cs +++ b/OpenRA.Renderer.Sdl2/Texture.cs @@ -130,6 +130,7 @@ namespace OpenRA.Renderer.Sdl2 bitmap = new Bitmap(bitmap, bitmap.Size.NextPowerOf2()); allocatedBitmap = true; } + try { size = new Size(bitmap.Width, bitmap.Height);