Clean up style of files affected by the last commit.

This commit is contained in:
RoosterDragon
2014-10-20 22:15:32 +01:00
committed by RoosterDragon
parent f0f02dff5c
commit 9cbac2d5e1
18 changed files with 205 additions and 220 deletions

View File

@@ -17,8 +17,8 @@ namespace OpenRA.Graphics
{ {
struct Collection struct Collection
{ {
public string src; public string Src;
public Dictionary<string, MappedImage> regions; public Dictionary<string, MappedImage> Regions;
} }
static Dictionary<string, Collection> collections; static Dictionary<string, Collection> collections;
@@ -62,10 +62,10 @@ namespace OpenRA.Graphics
static MiniYaml SaveCollection(Collection collection) static MiniYaml SaveCollection(Collection collection)
{ {
var root = new List<MiniYamlNode>(); var root = new List<MiniYamlNode>();
foreach (var kv in collection.regions) foreach (var kv in collection.Regions)
root.Add(new MiniYamlNode(kv.Key, kv.Value.Save(collection.src))); 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) static void LoadCollection(string name, MiniYaml yaml)
@@ -73,8 +73,8 @@ namespace OpenRA.Graphics
Game.modData.LoadScreen.Display(); Game.modData.LoadScreen.Display();
var collection = new Collection() var collection = new Collection()
{ {
src = yaml.Value, Src = yaml.Value,
regions = yaml.Nodes.ToDictionary(n => n.Key, n => new MappedImage(yaml.Value, n.Value)) Regions = yaml.Nodes.ToDictionary(n => n.Key, n => new MappedImage(yaml.Value, n.Value))
}; };
collections.Add(name, collection); collections.Add(name, collection);
@@ -96,7 +96,7 @@ namespace OpenRA.Graphics
} }
MappedImage mi; MappedImage mi;
if (!collection.regions.TryGetValue(imageName, out mi)) if (!collection.Regions.TryGetValue(imageName, out mi))
return null; return null;
// Cached sheet // Cached sheet
@@ -115,6 +115,7 @@ namespace OpenRA.Graphics
cachedCollection = new Dictionary<string, Sprite>(); cachedCollection = new Dictionary<string, Sprite>();
cachedSprites.Add(collectionName, cachedCollection); cachedSprites.Add(collectionName, cachedCollection);
} }
var image = mi.GetImage(sheet); var image = mi.GetImage(sheet);
cachedCollection.Add(imageName, image); cachedCollection.Add(imageName, image);

View File

@@ -18,9 +18,9 @@ namespace OpenRA.Graphics
{ {
public sealed class CursorProvider : IDisposable public sealed class CursorProvider : IDisposable
{ {
HardwarePalette palette; readonly HardwarePalette palette = new HardwarePalette();
Dictionary<string, CursorSequence> cursors; readonly Dictionary<string, CursorSequence> cursors = new Dictionary<string, CursorSequence>();
Cache<string, PaletteReference> palettes; readonly Cache<string, PaletteReference> palettes;
readonly SheetBuilder sheetBuilder; readonly SheetBuilder sheetBuilder;
public static bool CursorViewportZoomed { get { return Game.Settings.Graphics.CursorDouble && Game.Settings.Graphics.PixelDouble; } } 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; var sequenceFiles = modData.Manifest.Cursors;
cursors = new Dictionary<string, CursorSequence>();
palettes = new Cache<string, PaletteReference>(CreatePaletteReference); palettes = new Cache<string, PaletteReference>(CreatePaletteReference);
var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal));
var shadowIndex = new int[] { }; var shadowIndex = new int[] { };
@@ -42,7 +41,6 @@ namespace OpenRA.Graphics
out shadowIndex[shadowIndex.Length - 1]); out shadowIndex[shadowIndex.Length - 1]);
} }
palette = new HardwarePalette();
foreach (var p in nodesDict["Palettes"].Nodes) foreach (var p in nodesDict["Palettes"].Nodes)
palette.AddPalette(p.Key, new ImmutablePalette(GlobalFileSystem.Open(p.Value.Value), shadowIndex), false); palette.AddPalette(p.Key, new ImmutablePalette(GlobalFileSystem.Open(p.Value.Value), shadowIndex), false);

View File

@@ -15,14 +15,16 @@ namespace OpenRA.Graphics
{ {
public class LineRenderer : Renderer.IBatchRenderer public class LineRenderer : Renderer.IBatchRenderer
{ {
static float2 offset = new float2(0.5f, 0.5f); static readonly float2 Offset = new float2(0.5f, 0.5f);
float lineWidth = 1f;
Renderer renderer; readonly Renderer renderer;
IShader shader; readonly IShader shader;
readonly Vertex[] vertices; readonly Vertex[] vertices;
int nv = 0; int nv = 0;
float lineWidth = 1f;
public LineRenderer(Renderer renderer, IShader shader) public LineRenderer(Renderer renderer, IShader shader)
{ {
this.renderer = renderer; this.renderer = renderer;
@@ -30,10 +32,12 @@ namespace OpenRA.Graphics
vertices = new Vertex[renderer.TempBufferSize]; vertices = new Vertex[renderer.TempBufferSize];
} }
public float LineWidth public float LineWidth
{ {
get { return lineWidth; } get
{
return lineWidth;
}
set set
{ {
if (LineWidth != value) if (LineWidth != value)
@@ -77,11 +81,11 @@ namespace OpenRA.Graphics
if (nv + 2 > renderer.TempBufferSize) if (nv + 2 > renderer.TempBufferSize)
Flush(); Flush();
vertices[nv++] = new Vertex(start + offset, vertices[nv++] = new Vertex(start + Offset,
startColor.R / 255.0f, startColor.G / 255.0f, startColor.R / 255.0f, startColor.G / 255.0f,
startColor.B / 255.0f, startColor.A / 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.R / 255.0f, endColor.G / 255.0f,
endColor.B / 255.0f, endColor.A / 255.0f); endColor.B / 255.0f, endColor.A / 255.0f);
} }
@@ -100,7 +104,7 @@ namespace OpenRA.Graphics
var yc = (r.Bottom + r.Top) / 2; var yc = (r.Bottom + r.Top) / 2;
for (var y = r.Top; y <= r.Bottom; y++) 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); 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) public void SetViewportParams(Size screen, float zoom, int2 scroll)
{ {
shader.SetVec("Scroll", scroll.X, scroll.Y); 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); shader.SetVec("r2", -1, 1);
} }
} }

View File

@@ -14,8 +14,8 @@ namespace OpenRA.Graphics
{ {
public class QuadRenderer : Renderer.IBatchRenderer public class QuadRenderer : Renderer.IBatchRenderer
{ {
Renderer renderer; readonly Renderer renderer;
IShader shader; readonly IShader shader;
readonly Vertex[] vertices; readonly Vertex[] vertices;
int nv = 0; int nv = 0;
@@ -66,7 +66,7 @@ namespace OpenRA.Graphics
public void SetViewportParams(Size screen, float zoom, int2 scroll) public void SetViewportParams(Size screen, float zoom, int2 scroll)
{ {
shader.SetVec("Scroll", scroll.X, scroll.Y); 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); shader.SetVec("r2", -1, 1);
} }
} }

View File

@@ -11,7 +11,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using OpenRA.Support; using OpenRA.Support;
@@ -20,10 +19,6 @@ namespace OpenRA.Graphics
{ {
public sealed class Renderer : IDisposable 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 WorldSpriteRenderer { get; private set; }
public SpriteRenderer WorldRgbaSpriteRenderer { get; private set; } public SpriteRenderer WorldRgbaSpriteRenderer { get; private set; }
public QuadRenderer WorldQuadRenderer { get; private set; } public QuadRenderer WorldQuadRenderer { get; private set; }
@@ -32,49 +27,77 @@ namespace OpenRA.Graphics
public LineRenderer LineRenderer { get; private set; } public LineRenderer LineRenderer { get; private set; }
public SpriteRenderer RgbaSpriteRenderer { get; private set; } public SpriteRenderer RgbaSpriteRenderer { get; private set; }
public SpriteRenderer SpriteRenderer { get; private set; } public SpriteRenderer SpriteRenderer { get; private set; }
public IReadOnlyDictionary<string, SpriteFont> Fonts;
Queue<IVertexBuffer<Vertex>> tempBuffers = new Queue<IVertexBuffer<Vertex>>(); 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<string, SpriteFont> Fonts; readonly Queue<IVertexBuffer<Vertex>> tempBuffers = new Queue<IVertexBuffer<Vertex>>();
Stack<Rectangle> scissorState; readonly Stack<Rectangle> scissorState = new Stack<Rectangle>();
Size? lastResolution;
int2? lastScroll;
float? lastZoom;
ITexture currentPaletteTexture;
IBatchRenderer currentBatchRenderer;
public Renderer(GraphicSettings graphicSettings, ServerSettings serverSettings) 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; TempBufferSize = graphicSettings.BatchSize;
TempBufferCount = graphicSettings.NumTempBuffers; TempBufferCount = graphicSettings.NumTempBuffers;
SheetSize = graphicSettings.SheetSize; SheetSize = graphicSettings.SheetSize;
scissorState = new Stack<Rectangle>();
WorldSpriteRenderer = new SpriteRenderer(this, device.CreateShader("shp")); WorldSpriteRenderer = new SpriteRenderer(this, Device.CreateShader("shp"));
WorldRgbaSpriteRenderer = new SpriteRenderer(this, device.CreateShader("rgba")); WorldRgbaSpriteRenderer = new SpriteRenderer(this, Device.CreateShader("rgba"));
WorldLineRenderer = new LineRenderer(this, device.CreateShader("line")); WorldLineRenderer = new LineRenderer(this, Device.CreateShader("line"));
WorldVoxelRenderer = new VoxelRenderer(this, device.CreateShader("vxl")); WorldVoxelRenderer = new VoxelRenderer(this, Device.CreateShader("vxl"));
LineRenderer = new LineRenderer(this, device.CreateShader("line")); LineRenderer = new LineRenderer(this, Device.CreateShader("line"));
WorldQuadRenderer = new QuadRenderer(this, device.CreateShader("line")); WorldQuadRenderer = new QuadRenderer(this, Device.CreateShader("line"));
RgbaSpriteRenderer = new SpriteRenderer(this, device.CreateShader("rgba")); RgbaSpriteRenderer = new SpriteRenderer(this, Device.CreateShader("rgba"));
SpriteRenderer = new SpriteRenderer(this, device.CreateShader("shp")); SpriteRenderer = new SpriteRenderer(this, Device.CreateShader("shp"));
for (var i = 0; i < TempBufferCount; i++) 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) public void InitializeFonts(Manifest m)
{ {
using (new Support.PerfTimer("SpriteFonts")) 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) public void BeginFrame(int2 scroll, float zoom)
{ {
device.Clear(); Device.Clear();
var resolutionChanged = lastResolution != Resolution; var resolutionChanged = lastResolution != Resolution;
if (resolutionChanged) if (resolutionChanged)
@@ -98,7 +121,6 @@ namespace OpenRA.Graphics
} }
} }
ITexture currentPaletteTexture;
public void SetPalette(HardwarePalette palette) public void SetPalette(HardwarePalette palette)
{ {
if (palette.Texture == currentPaletteTexture) if (palette.Texture == currentPaletteTexture)
@@ -117,8 +139,8 @@ namespace OpenRA.Graphics
public void EndFrame(IInputHandler inputHandler) public void EndFrame(IInputHandler inputHandler)
{ {
Flush(); Flush();
device.PumpInput(inputHandler); Device.PumpInput(inputHandler);
device.Present(); Device.Present();
} }
public void DrawBatch<T>(IVertexBuffer<T> vertices, public void DrawBatch<T>(IVertexBuffer<T> vertices,
@@ -126,7 +148,7 @@ namespace OpenRA.Graphics
where T : struct where T : struct
{ {
vertices.Bind(); vertices.Bind();
device.DrawPrimitives(type, firstVertex, numVertices); Device.DrawPrimitives(type, firstVertex, numVertices);
PerfHistory.Increment("batches", 1); PerfHistory.Increment("batches", 1);
} }
@@ -137,58 +159,28 @@ namespace OpenRA.Graphics
public void SetLineWidth(float width) public void SetLineWidth(float width)
{ {
device.SetLineWidth(width); Device.SetLineWidth(width);
} }
static IGraphicsDevice device; public Size Resolution { get { return Device.WindowSize; } }
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!");
}
internal IVertexBuffer<Vertex> GetTempVertexBuffer() internal IVertexBuffer<Vertex> GetTempVertexBuffer()
{ {
var ret = tempBuffers.Dequeue(); return tempBuffers.Peek();
tempBuffers.Enqueue(ret);
return ret;
} }
public interface IBatchRenderer { void Flush(); } public interface IBatchRenderer { void Flush(); }
IBatchRenderer currentBatchRenderer;
public IBatchRenderer CurrentBatchRenderer public IBatchRenderer CurrentBatchRenderer
{ {
get { return currentBatchRenderer; } get
{
return currentBatchRenderer;
}
set set
{ {
if (currentBatchRenderer == value) return; if (currentBatchRenderer == value)
return;
if (currentBatchRenderer != null) if (currentBatchRenderer != null)
currentBatchRenderer.Flush(); currentBatchRenderer.Flush();
currentBatchRenderer = value; currentBatchRenderer = value;
@@ -235,12 +227,12 @@ namespace OpenRA.Graphics
public void GrabWindowMouseFocus() public void GrabWindowMouseFocus()
{ {
device.GrabWindowMouseFocus(); Device.GrabWindowMouseFocus();
} }
public void ReleaseWindowMouseFocus() public void ReleaseWindowMouseFocus()
{ {
device.ReleaseWindowMouseFocus(); Device.ReleaseWindowMouseFocus();
} }
public void Dispose() public void Dispose()

View File

@@ -32,12 +32,13 @@ namespace OpenRA.Graphics
public sealed class SheetBuilder : IDisposable public sealed class SheetBuilder : IDisposable
{ {
readonly List<Sheet> sheets = new List<Sheet>(); readonly List<Sheet> sheets = new List<Sheet>();
readonly SheetType type;
readonly Func<Sheet> allocateSheet;
Sheet current; Sheet current;
TextureChannel channel; TextureChannel channel;
SheetType type;
int rowHeight = 0; int rowHeight = 0;
Point p; Point p;
Func<Sheet> allocateSheet;
public static Sheet AllocateSheet(int sheetSize) public static Sheet AllocateSheet(int sheetSize)
{ {

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Graphics
static Library library = new Library(); static Library library = new Library();
static SheetBuilder builder; static SheetBuilder builder;
int size; readonly int size;
string name; string name;
public SpriteFont(string name, int size) 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. // A new bitmap is generated each time this property is accessed, so we do need to dispose it.
using (var bitmap = face.Glyph.Bitmap) using (var bitmap = face.Glyph.Bitmap)
{
unsafe unsafe
{ {
var p = (byte*)bitmap.Buffer; var p = (byte*)bitmap.Buffer;
@@ -136,7 +135,7 @@ namespace OpenRA.Graphics
p += bitmap.Pitch; p += bitmap.Pitch;
} }
} }
}
s.sheet.CommitData(); s.sheet.CommitData();

View File

@@ -14,8 +14,8 @@ namespace OpenRA.Graphics
{ {
public class SpriteRenderer : Renderer.IBatchRenderer public class SpriteRenderer : Renderer.IBatchRenderer
{ {
Renderer renderer; readonly Renderer renderer;
IShader shader; readonly IShader shader;
readonly Vertex[] vertices; readonly Vertex[] vertices;
Sheet currentSheet; Sheet currentSheet;
@@ -124,7 +124,7 @@ namespace OpenRA.Graphics
public void SetViewportParams(Size screen, float zoom, int2 scroll) public void SetViewportParams(Size screen, float zoom, int2 scroll)
{ {
shader.SetVec("Scroll", scroll.X, scroll.Y); 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); shader.SetVec("r2", -1, 1);
} }
} }

View File

@@ -15,10 +15,9 @@ namespace OpenRA.Graphics
{ {
sealed class TerrainRenderer : IDisposable sealed class TerrainRenderer : IDisposable
{ {
IVertexBuffer<Vertex> vertexBuffer; readonly IVertexBuffer<Vertex> vertexBuffer;
readonly World world;
World world; readonly Map map;
Map map;
public TerrainRenderer(World world, WorldRenderer wr) public TerrainRenderer(World world, WorldRenderer wr)
{ {
@@ -43,7 +42,7 @@ namespace OpenRA.Graphics
public void Draw(WorldRenderer wr, Viewport viewport) public void Draw(WorldRenderer wr, Viewport viewport)
{ {
var verticesPerRow = 4*map.Bounds.Width; var verticesPerRow = 4 * map.Bounds.Width;
var cells = viewport.VisibleCells; var cells = viewport.VisibleCells;
var shape = wr.world.Map.TileShape; var shape = wr.world.Map.TileShape;

View File

@@ -18,9 +18,9 @@ namespace OpenRA.Graphics
{ {
public sealed class Theater : IDisposable public sealed class Theater : IDisposable
{ {
SheetBuilder sheetBuilder; readonly Dictionary<ushort, Sprite[]> templates = new Dictionary<ushort, Sprite[]>();
Dictionary<ushort, Sprite[]> templates; readonly SheetBuilder sheetBuilder;
Sprite missingTile; readonly Sprite missingTile;
TileSet tileset; TileSet tileset;
public Theater(TileSet tileset) public Theater(TileSet tileset)

View File

@@ -34,14 +34,16 @@ namespace OpenRA.Graphics
public sealed class VoxelLoader : IDisposable public sealed class VoxelLoader : IDisposable
{ {
SheetBuilder sheetBuilder; static readonly float[] ChannelSelect = { 0.75f, 0.25f, -0.25f, -0.75f };
Cache<Pair<string,string>, Voxel> voxels; readonly List<Vertex[]> vertices = new List<Vertex[]>();
readonly Cache<Pair<string, string>, Voxel> voxels;
IVertexBuffer<Vertex> vertexBuffer; IVertexBuffer<Vertex> vertexBuffer;
List<Vertex[]> vertices;
int totalVertexCount; int totalVertexCount;
int cachedVertexCount; int cachedVertexCount;
SheetBuilder sheetBuilder;
static SheetBuilder CreateSheetBuilder() static SheetBuilder CreateSheetBuilder()
{ {
var allocated = false; var allocated = false;
@@ -58,7 +60,7 @@ namespace OpenRA.Graphics
public VoxelLoader() public VoxelLoader()
{ {
voxels = new Cache<Pair<string,string>, Voxel>(LoadFile); voxels = new Cache<Pair<string, string>, Voxel>(LoadFile);
vertices = new List<Vertex[]>(); vertices = new List<Vertex[]>();
totalVertexCount = 0; totalVertexCount = 0;
cachedVertexCount = 0; cachedVertexCount = 0;
@@ -66,29 +68,28 @@ namespace OpenRA.Graphics
sheetBuilder = CreateSheetBuilder(); sheetBuilder = CreateSheetBuilder();
} }
static float[] channelSelect = { 0.75f, 0.25f, -0.25f, -0.75f }; Vertex[] GenerateSlicePlane(int su, int sv, Func<int, int, VxlElement> first, Func<int, int, VxlElement> second, Func<int, int, float[]> coord)
Vertex[] GenerateSlicePlane(int su, int sv, Func<int,int,VxlElement> first, Func<int,int,VxlElement> second, Func<int, int, float[]> coord)
{ {
var colors = new byte[su*sv]; var colors = new byte[su * sv];
var normals = new byte[su*sv]; var normals = new byte[su * sv];
var c = 0; var c = 0;
for (var v = 0; v < sv; v++) for (var v = 0; v < sv; v++)
for (var u = 0; u < su; u++) for (var u = 0; u < su; u++)
{ {
var voxel = first(u,v) ?? second(u,v); var voxel = first(u, v) ?? second(u, v);
colors[c] = voxel == null ? (byte)0 : voxel.Color; colors[c] = voxel == null ? (byte)0 : voxel.Color;
normals[c] = voxel == null ? (byte)0 : voxel.Normal; normals[c] = voxel == null ? (byte)0 : voxel.Normal;
c++; c++;
} }
var s = sheetBuilder.Allocate(new Size(su, sv)); var s = sheetBuilder.Allocate(new Size(su, sv));
Util.FastCopyIntoChannel(s, 0, colors); Util.FastCopyIntoChannel(s, 0, colors);
Util.FastCopyIntoChannel(s, 1, normals); Util.FastCopyIntoChannel(s, 1, normals);
s.sheet.CommitData(); s.sheet.CommitData();
var channelP =channelSelect[(int)s.channel]; var channelP = ChannelSelect[(int)s.channel];
var channelC = channelSelect[(int)s.channel + 1]; var channelC = ChannelSelect[(int)s.channel + 1];
return new Vertex[4] return new Vertex[4]
{ {
new Vertex(coord(0, 0), s.left, s.top, channelP, channelC), new Vertex(coord(0, 0), s.left, s.top, channelP, channelC),
@@ -100,7 +101,7 @@ namespace OpenRA.Graphics
IEnumerable<Vertex[]> GenerateSlicePlanes(VxlLimb l) IEnumerable<Vertex[]> GenerateSlicePlanes(VxlLimb l)
{ {
Func<int,int,int,VxlElement> get = (x,y,z) => Func<int, int, int, VxlElement> get = (x, y, z) =>
{ {
if (x < 0 || y < 0 || z < 0) if (x < 0 || y < 0 || z < 0)
return null; return null;
@@ -108,41 +109,41 @@ namespace OpenRA.Graphics
if (x >= l.Size[0] || y >= l.Size[1] || z >= l.Size[2]) if (x >= l.Size[0] || y >= l.Size[1] || z >= l.Size[2])
return null; 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)) if (v == null || !v.ContainsKey((byte)z))
return null; 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 // Cull slices without any visible faces
var xPlanes = new bool[l.Size[0]+1]; var xPlanes = new bool[l.Size[0] + 1];
var yPlanes = new bool[l.Size[1]+1]; var yPlanes = new bool[l.Size[1] + 1];
var zPlanes = new bool[l.Size[2]+1]; var zPlanes = new bool[l.Size[2] + 1];
for (var x = 0; x < l.Size[0]; x++) for (var x = 0; x < l.Size[0]; x++)
{ {
for (var y = 0; y < l.Size[1]; y++) for (var y = 0; y < l.Size[1]; y++)
{ {
for (var z = 0; z < l.Size[2]; z++) for (var z = 0; z < l.Size[2]; z++)
{ {
if (get(x,y,z) == null) if (get(x, y, z) == null)
continue; continue;
// Only generate a plane if it is actually visible // 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; xPlanes[x] = true;
if (!xPlanes[x+1] && get(x+1,y,z) == null) if (!xPlanes[x + 1] && get(x + 1, y, z) == null)
xPlanes[x+1] = true; 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; yPlanes[y] = true;
if (!yPlanes[y+1] && get(x,y+1,z) == null) if (!yPlanes[y + 1] && get(x, y + 1, z) == null)
yPlanes[y+1] = true; 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; zPlanes[z] = true;
if (!zPlanes[z+1] && get(x,y,z+1) == null) if (!zPlanes[z + 1] && get(x, y, z + 1) == null)
zPlanes[z+1] = true; zPlanes[z + 1] = true;
} }
} }
} }
@@ -150,23 +151,23 @@ namespace OpenRA.Graphics
for (var x = 0; x <= l.Size[0]; x++) for (var x = 0; x <= l.Size[0]; x++)
if (xPlanes[x]) if (xPlanes[x])
yield return GenerateSlicePlane(l.Size[1], l.Size[2], yield return GenerateSlicePlane(l.Size[1], l.Size[2],
(u,v) => get(x, u, v), (u, v) => get(x, u, v),
(u,v) => get(x - 1, u, v), (u, v) => get(x - 1, u, v),
(u,v) => new float[] {x, u, v}); (u, v) => new float[] { x, u, v });
for (var y = 0; y <= l.Size[1]; y++) for (var y = 0; y <= l.Size[1]; y++)
if (yPlanes[y]) if (yPlanes[y])
yield return GenerateSlicePlane(l.Size[0], l.Size[2], yield return GenerateSlicePlane(l.Size[0], l.Size[2],
(u,v) => get(u, y, v), (u, v) => get(u, y, v),
(u,v) => get(u, y - 1, v), (u, v) => get(u, y - 1, v),
(u,v) => new float[] {u, y, v}); (u, v) => new float[] { u, y, v });
for (var z = 0; z <= l.Size[2]; z++) for (var z = 0; z <= l.Size[2]; z++)
if (zPlanes[z]) if (zPlanes[z])
yield return GenerateSlicePlane(l.Size[0], l.Size[1], yield return GenerateSlicePlane(l.Size[0], l.Size[1],
(u,v) => get(u, v, z), (u, v) => get(u, v, z),
(u,v) => get(u, v, z - 1), (u, v) => get(u, v, z - 1),
(u,v) => new float[] {u, v, z}); (u, v) => new float[] { u, v, z });
} }
public VoxelRenderData GenerateRenderData(VxlLimb l) public VoxelRenderData GenerateRenderData(VxlLimb l)
@@ -212,7 +213,7 @@ namespace OpenRA.Graphics
} }
} }
Voxel LoadFile(Pair<string,string> files) Voxel LoadFile(Pair<string, string> files)
{ {
VxlReader vxl; VxlReader vxl;
HvaReader hva; HvaReader hva;

View File

@@ -34,31 +34,28 @@ namespace OpenRA.Graphics
public sealed class VoxelRenderer : IDisposable public sealed class VoxelRenderer : IDisposable
{ {
Renderer renderer; // Static constants
IShader shader; 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<Sheet, IFrameBuffer> mappedBuffers = new Dictionary<Sheet, IFrameBuffer>();
readonly Stack<KeyValuePair<Sheet, IFrameBuffer>> unmappedBuffers = new Stack<KeyValuePair<Sheet, IFrameBuffer>>();
readonly List<Pair<Sheet, Action>> doRender = new List<Pair<Sheet, Action>>();
SheetBuilder sheetBuilder; SheetBuilder sheetBuilder;
Dictionary<Sheet, IFrameBuffer> mappedBuffers;
Stack<KeyValuePair<Sheet, IFrameBuffer>> unmappedBuffers;
List<Pair<Sheet, Action>> 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) public VoxelRenderer(Renderer renderer, IShader shader)
{ {
this.renderer = renderer; this.renderer = renderer;
this.shader = shader; this.shader = shader;
mappedBuffers = new Dictionary<Sheet, IFrameBuffer>();
unmappedBuffers = new Stack<KeyValuePair<Sheet, IFrameBuffer>>();
doRender = new List<Pair<Sheet, Action>>();
} }
public void SetPalette(ITexture palette) public void SetPalette(ITexture palette)
@@ -73,7 +70,7 @@ namespace OpenRA.Graphics
{ {
a, 0, 0, 0, a, 0, 0, 0,
0, -a, 0, 0, 0, -a, 0, 0,
0, 0, -2*a, 0, 0, 0, -2 * a, 0,
-1, 1, 0, 1 -1, 1, 0, 1
}; };
@@ -111,7 +108,7 @@ namespace OpenRA.Graphics
var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]); var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]);
var worldTransform = v.RotationFunc().Aggregate(Util.IdentityMatrix(), 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(scaleTransform, worldTransform);
worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform); worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform);
@@ -128,18 +125,18 @@ namespace OpenRA.Graphics
} }
// Inflate rects to ensure rendering is within bounds // Inflate rects to ensure rendering is within bounds
tl -= spritePadding; tl -= SpritePadding;
br += spritePadding; br += SpritePadding;
stl -= spritePadding; stl -= SpritePadding;
sbr += spritePadding; sbr += SpritePadding;
// Corners of the shadow quad, in shadow-space // Corners of the shadow quad, in shadow-space
var corners = new float[][] var corners = new float[][]
{ {
new float[] {stl.X, stl.Y, 0, 1}, new[] { stl.X, stl.Y, 0, 1 },
new float[] {sbr.X, sbr.Y, 0, 1}, new[] { sbr.X, sbr.Y, 0, 1 },
new float[] {sbr.X, stl.Y, 0, 1}, new[] { sbr.X, stl.Y, 0, 1 },
new float[] {stl.X, sbr.Y, 0, 1} new[] { stl.X, sbr.Y, 0, 1 }
}; };
var shadowScreenTransform = Util.MatrixMultiply(cameraTransform, invShadowTransform); var shadowScreenTransform = Util.MatrixMultiply(cameraTransform, invShadowTransform);
@@ -148,8 +145,8 @@ namespace OpenRA.Graphics
for (var j = 0; j < 4; j++) for (var j = 0; j < 4; j++)
{ {
// Project to ground plane // Project to ground plane
corners[j][2] = -(corners[j][1]*shadowGroundNormal[1]/shadowGroundNormal[2] + corners[j][2] = -(corners[j][1] * shadowGroundNormal[1] / shadowGroundNormal[2] +
corners[j][0]*shadowGroundNormal[0]/shadowGroundNormal[2]); corners[j][0] * shadowGroundNormal[0] / shadowGroundNormal[2]);
// Rotate to camera-space // Rotate to camera-space
corners[j] = Util.MatrixVectorMultiply(shadowScreenTransform, corners[j]); 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 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 shadowTranslateMtx = Util.TranslationMatrix(shadowCenter.X - shadowSpriteOffset.X, renderer.SheetSize - (shadowCenter.Y - shadowSpriteOffset.Y), 0);
var correctionTransform = Util.MatrixMultiply(translateMtx, flipMtx); var correctionTransform = Util.MatrixMultiply(translateMtx, FlipMtx);
var shadowCorrectionTransform = Util.MatrixMultiply(shadowTranslateMtx, shadowScaleFlipMtx); var shadowCorrectionTransform = Util.MatrixMultiply(shadowTranslateMtx, ShadowScaleFlipMtx);
doRender.Add(Pair.New<Sheet, Action>(sprite.sheet, () => doRender.Add(Pair.New<Sheet, Action>(sprite.sheet, () =>
{ {
@@ -183,7 +180,7 @@ namespace OpenRA.Graphics
var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]); var offsetTransform = Util.TranslationMatrix(offsetVec[0], offsetVec[1], offsetVec[2]);
var rotations = v.RotationFunc().Aggregate(Util.IdentityMatrix(), 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); var worldTransform = Util.MatrixMultiply(scaleTransform, rotations);
worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform); worldTransform = Util.MatrixMultiply(offsetTransform, worldTransform);
@@ -209,21 +206,21 @@ namespace OpenRA.Graphics
// Disable shadow normals by forcing zero diffuse and identity ambient light // Disable shadow normals by forcing zero diffuse and identity ambient light
Render(rd, Util.MatrixMultiply(shadow, t), lightDirection, 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); 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) static void CalculateSpriteGeometry(float2 tl, float2 br, float scale, out Size size, out int2 offset)
{ {
var width = (int)(scale*(br.X - tl.X)); var width = (int)(scale * (br.X - tl.X));
var height = (int)(scale*(br.Y - tl.Y)); var height = (int)(scale * (br.Y - tl.Y));
offset = (0.5f*scale*(br + tl)).ToInt2(); offset = (0.5f * scale * (br + tl)).ToInt2();
// Width and height must be even to avoid rendering glitches // Width and height must be even to avoid rendering glitches
if ((width & 1) == 1) if ((width & 1) == 1)
@@ -236,14 +233,14 @@ namespace OpenRA.Graphics
static float[] ExtractRotationVector(float[] mtx) static float[] ExtractRotationVector(float[] mtx)
{ {
var tVec = Util.MatrixVectorMultiply(mtx, zVector); var tVec = Util.MatrixVectorMultiply(mtx, ZVector);
var tOrigin = Util.MatrixVectorMultiply(mtx, zeroVector); var tOrigin = Util.MatrixVectorMultiply(mtx, ZeroVector);
tVec[0] -= tOrigin[0]*tVec[3]/tOrigin[3]; tVec[0] -= tOrigin[0] * tVec[3] / tOrigin[3];
tVec[1] -= tOrigin[1]*tVec[3]/tOrigin[3]; tVec[1] -= tOrigin[1] * tVec[3] / tOrigin[3];
tVec[2] -= tOrigin[2]*tVec[3]/tOrigin[3]; tVec[2] -= tOrigin[2] * tVec[3] / tOrigin[3];
// Renormalize // 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[0] /= w;
tVec[1] /= w; tVec[1] /= w;
tVec[2] /= w; tVec[2] /= w;

View File

@@ -35,18 +35,16 @@ namespace OpenRA.Graphics
public readonly Theater Theater; public readonly Theater Theater;
public Viewport Viewport { get; private set; } public Viewport Viewport { get; private set; }
readonly HardwarePalette palette = new HardwarePalette();
readonly Dictionary<string, PaletteReference> palettes = new Dictionary<string, PaletteReference>();
readonly TerrainRenderer terrainRenderer; readonly TerrainRenderer terrainRenderer;
readonly HardwarePalette palette;
readonly Dictionary<string, PaletteReference> palettes;
readonly Lazy<DeveloperMode> devTrait; readonly Lazy<DeveloperMode> devTrait;
internal WorldRenderer(World world) internal WorldRenderer(World world)
{ {
this.world = world; this.world = world;
Viewport = new Viewport(this, world.Map); Viewport = new Viewport(this, world.Map);
palette = new HardwarePalette();
palettes = new Dictionary<string, PaletteReference>();
foreach (var pal in world.traitDict.ActorsWithTrait<ILoadsPalettes>()) foreach (var pal in world.traitDict.ActorsWithTrait<ILoadsPalettes>())
pal.Trait.LoadPalettes(this); pal.Trait.LoadPalettes(this);

View File

@@ -25,9 +25,9 @@ namespace OpenRA
public readonly WidgetLoader WidgetLoader; public readonly WidgetLoader WidgetLoader;
public readonly MapCache MapCache; public readonly MapCache MapCache;
public readonly ISpriteLoader[] SpriteLoaders; public readonly ISpriteLoader[] SpriteLoaders;
public ILoadScreen LoadScreen = null;
public VoxelLoader VoxelLoader;
public readonly RulesetCache RulesetCache; public readonly RulesetCache RulesetCache;
public ILoadScreen LoadScreen { get; private set; }
public VoxelLoader VoxelLoader { get; private set; }
public CursorProvider CursorProvider { get; private set; } public CursorProvider CursorProvider { get; private set; }
Lazy<Ruleset> defaultRules; Lazy<Ruleset> defaultRules;

View File

@@ -11,8 +11,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Linq;
using OpenRA.FileSystem;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Widgets; using OpenRA.Widgets;
@@ -29,7 +27,7 @@ namespace OpenRA.Mods.Cnc
Sprite nodLogo, gdiLogo, evaLogo, brightBlock, dimBlock; Sprite nodLogo, gdiLogo, evaLogo, brightBlock, dimBlock;
Rectangle bounds; Rectangle bounds;
Renderer r; Renderer r;
NullInputHandler nih = new NullInputHandler(); readonly NullInputHandler nih = new NullInputHandler();
public void Init(Manifest m, Dictionary<string, string> info) public void Init(Manifest m, Dictionary<string, string> info)
{ {

View File

@@ -11,8 +11,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.Linq;
using OpenRA.FileSystem;
using OpenRA.Graphics; using OpenRA.Graphics;
using OpenRA.Widgets; using OpenRA.Widgets;

View File

@@ -20,16 +20,16 @@ namespace OpenRA.Mods.Common.Widgets.Logic
{ {
public class ModBrowserLogic public class ModBrowserLogic
{ {
Widget modList; readonly Widget modList;
ButtonWidget modTemplate; readonly ButtonWidget modTemplate;
ModMetadata[] allMods; readonly ModMetadata[] allMods;
readonly Dictionary<string, Sprite> previews = new Dictionary<string, Sprite>();
readonly Dictionary<string, Sprite> logos = new Dictionary<string, Sprite>();
readonly SheetBuilder sheetBuilder; readonly SheetBuilder sheetBuilder;
ModMetadata selectedMod; ModMetadata selectedMod;
string selectedAuthor; string selectedAuthor;
string selectedDescription; string selectedDescription;
int modOffset = 0; int modOffset = 0;
Dictionary<string, Sprite> previews;
Dictionary<string, Sprite> logos;
[ObjectCreator.UseCtor] [ObjectCreator.UseCtor]
public ModBrowserLogic(Widget widget) public ModBrowserLogic(Widget widget)
@@ -65,8 +65,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
}; };
sheetBuilder = new SheetBuilder(SheetType.BGRA); sheetBuilder = new SheetBuilder(SheetType.BGRA);
previews = new Dictionary<string, Sprite>();
logos = new Dictionary<string, Sprite>();
allMods = ModMetadata.AllMods.Values.Where(m => m.Id != "modchooser") allMods = ModMetadata.AllMods.Values.Where(m => m.Id != "modchooser")
.OrderBy(m => m.Title) .OrderBy(m => m.Title)
.ToArray(); .ToArray();

View File

@@ -130,6 +130,7 @@ namespace OpenRA.Renderer.Sdl2
bitmap = new Bitmap(bitmap, bitmap.Size.NextPowerOf2()); bitmap = new Bitmap(bitmap, bitmap.Size.NextPowerOf2());
allocatedBitmap = true; allocatedBitmap = true;
} }
try try
{ {
size = new Size(bitmap.Width, bitmap.Height); size = new Size(bitmap.Width, bitmap.Height);