Extendable palette definitions. Contains many regressions, bugs and general hacks
This commit is contained in:
@@ -2,45 +2,42 @@ using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using OpenRa.FileFormats;
|
||||
using OpenRa.Traits;
|
||||
using System;
|
||||
|
||||
namespace OpenRa.Graphics
|
||||
{
|
||||
public enum PaletteType
|
||||
{
|
||||
Gold, Blue, Red, Orange, Teal, Salmon, Green, Gray,
|
||||
Shadow, Invuln, Disabled, Highlight, Shroud, Chrome,
|
||||
Terrain
|
||||
};
|
||||
|
||||
class HardwarePalette : Sheet
|
||||
{
|
||||
const int maxEntries = 16;
|
||||
const int maxEntries = 32;
|
||||
int allocated = 0;
|
||||
|
||||
// We need to store the Palettes themselves for the remap palettes to work
|
||||
// We should probably try to fix this somehow
|
||||
static Dictionary<string, Palette> palettes;
|
||||
|
||||
public HardwarePalette(Renderer renderer, Map map)
|
||||
: base(renderer,new Size(256, maxEntries))
|
||||
{
|
||||
|
||||
Palette pal = new Palette(FileSystem.Open(map.Theater + ".pal"));
|
||||
AddPalette(pal); // Gold
|
||||
|
||||
foreach (string remap in new string[] { "blue", "red", "orange", "teal", "salmon", "green", "gray" })
|
||||
AddPalette(new Palette(pal, new PlayerColorRemap(FileSystem.Open(remap + ".rem"))));
|
||||
|
||||
AddPalette(new Palette(pal, new SingleColorRemap(Color.FromArgb(140, 0, 0, 0)))); // Shadow
|
||||
AddPalette(new Palette(pal, new SingleColorRemap(Color.FromArgb(128, 128, 0, 0)))); // Invulnerable (Iron Curtain)
|
||||
AddPalette(new Palette(pal, new SingleColorRemap(Color.FromArgb(180, 0, 0, 0)))); // Disabled / Low power
|
||||
AddPalette(new Palette(pal, new SingleColorRemap(Color.FromArgb(128, 255, 255, 255)))); // Highlight
|
||||
AddPalette(new Palette(pal, new ShroudPaletteRemap())); // Shroud
|
||||
AddPalette(pal); // Chrome (it's like gold, but we're not going to hax it in palettemods)
|
||||
palettes = new Dictionary<string, Palette>();
|
||||
}
|
||||
|
||||
|
||||
public int AddPalette(Palette p)
|
||||
public Palette GetPalette(string name)
|
||||
{
|
||||
for (int i = 0; i < 256; i++)
|
||||
this[new Point(i, allocated)] = p.GetColor(i);
|
||||
try { return palettes[name]; }
|
||||
catch (KeyNotFoundException)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Palette `{0}` does not exist".F(name));
|
||||
}
|
||||
}
|
||||
|
||||
public int AddPalette(string name, Palette p)
|
||||
{
|
||||
palettes.Add(name, p);
|
||||
for (int i = 0; i < 256; i++)
|
||||
{
|
||||
this[new Point(i, allocated)] = p.GetColor(i);
|
||||
}
|
||||
return allocated++;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,6 @@ namespace OpenRa.Graphics
|
||||
sprite = new Sprite(sheet, rect, TextureChannel.Alpha);
|
||||
mapOnlySprite = new Sprite(mapOnlySheet, rect, TextureChannel.Alpha);
|
||||
|
||||
playerColors = Util.MakeArray<Color>(8, b => Color.FromArgb(alpha, Chat.paletteColors[b]));
|
||||
shroudColor = Color.FromArgb(alpha, Color.Black);
|
||||
}
|
||||
|
||||
@@ -58,7 +57,6 @@ namespace OpenRa.Graphics
|
||||
.Select(a => Color.FromArgb(alpha, pal.GetColor(a))).ToArray();
|
||||
});
|
||||
|
||||
Color[] playerColors;
|
||||
static Color shroudColor;
|
||||
|
||||
public void InvalidateOre() { oreLayer = null; }
|
||||
@@ -107,7 +105,7 @@ namespace OpenRa.Graphics
|
||||
|
||||
foreach (var a in world.Queries.WithTrait<Unit>())
|
||||
*(c + (a.Actor.Location.Y * bitmapData.Stride >> 2) + a.Actor.Location.X) =
|
||||
playerColors[(int)a.Actor.Owner.Palette].ToArgb();
|
||||
Color.FromArgb(alpha, a.Actor.Owner.Color).ToArgb();
|
||||
|
||||
for (var y = world.Map.YOffset; y < world.Map.YOffset + world.Map.Height; y++)
|
||||
for (var x = world.Map.XOffset; x < world.Map.XOffset + world.Map.Width; x++)
|
||||
@@ -120,7 +118,7 @@ namespace OpenRa.Graphics
|
||||
var b = world.WorldActor.traits.Get<BuildingInfluence>().GetBuildingAt(new int2(x, y));
|
||||
if (b != null)
|
||||
*(c + (y * bitmapData.Stride >> 2) + x) =
|
||||
(b.Owner != null ? playerColors[(int)b.Owner.Palette] : colors[4]).ToArgb();
|
||||
(b.Owner != null ? Color.FromArgb(alpha, b.Owner.Color) : colors[4]).ToArgb();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,7 +129,7 @@ namespace OpenRa.Graphics
|
||||
public void Draw(RectangleF rect, bool mapOnly)
|
||||
{
|
||||
rgbaRenderer.DrawSprite(mapOnly ? mapOnlySprite : sprite,
|
||||
new float2(rect.X, rect.Y), PaletteType.Chrome, new float2(rect.Width, rect.Height));
|
||||
new float2(rect.X, rect.Y), "chrome", new float2(rect.Width, rect.Height));
|
||||
rgbaRenderer.Flush();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace OpenRa.Graphics
|
||||
{
|
||||
var location = new int2(x, y);
|
||||
spriteRenderer.DrawSprite(smudgeSprites[tr.smudge - 1],
|
||||
Game.CellSize * (float2)location, 0);
|
||||
Game.CellSize * (float2)location, "terrain");
|
||||
}
|
||||
|
||||
var o = tr.overlay;
|
||||
@@ -62,7 +62,7 @@ namespace OpenRa.Graphics
|
||||
else if (Ore.overlayIsOre[o]) spriteIndex = map.MapTiles[x,y].density - 1;
|
||||
else if (Ore.overlayIsGems[o]) spriteIndex = map.MapTiles[x,y].density - 1;
|
||||
spriteRenderer.DrawSprite(sprites[spriteIndex],
|
||||
Game.CellSize * (float2)location, PaletteType.Terrain);
|
||||
Game.CellSize * (float2)location, "terrain");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,18 +54,18 @@ namespace OpenRa.Graphics
|
||||
}
|
||||
}
|
||||
|
||||
public void DrawSprite(Sprite s, float2 location, PaletteType palette)
|
||||
public void DrawSprite(Sprite s, float2 location, string palette)
|
||||
{
|
||||
DrawSprite(s, location, palette, s.size);
|
||||
}
|
||||
|
||||
public void DrawSprite(Sprite s, float2 location, PaletteType palette, float2 size)
|
||||
public void DrawSprite(Sprite s, float2 location, string palette, float2 size)
|
||||
{
|
||||
if (s.sheet != currentSheet)
|
||||
Flush();
|
||||
|
||||
currentSheet = s.sheet;
|
||||
Util.FastCreateQuad(vertices, indices, location.ToInt2(), s, (int)palette, nv, ni, size);
|
||||
Util.FastCreateQuad(vertices, indices, location.ToInt2(), s, Game.world.WorldRenderer.GetPaletteIndex(palette), nv, ni, size);
|
||||
nv += 4; ni += 6;
|
||||
if (++sprites >= spritesPerBatch)
|
||||
Flush();
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace OpenRa.Graphics
|
||||
Map map;
|
||||
OverlayRenderer overlayRenderer;
|
||||
|
||||
public TerrainRenderer(World world, Renderer renderer)
|
||||
public TerrainRenderer(World world, Renderer renderer, WorldRenderer wr)
|
||||
{
|
||||
this.renderer = renderer;
|
||||
this.map = world.Map;
|
||||
@@ -34,7 +34,9 @@ namespace OpenRa.Graphics
|
||||
for( int i = map.XOffset ; i < map.XOffset + map.Width; i++ )
|
||||
{
|
||||
Sprite tile = tileMapping[map.MapTiles[i, j]];
|
||||
Util.FastCreateQuad(vertices, indices, Game.CellSize * new float2(i, j), tile, (int)PaletteType.Terrain, nv, ni, tile.size);
|
||||
//var bar = Game.world.WorldRenderer;
|
||||
var foo = wr.GetPaletteIndex("terrain");
|
||||
Util.FastCreateQuad(vertices, indices, Game.CellSize * new float2(i, j), tile, foo, nv, ni, tile.size);
|
||||
nv += 4;
|
||||
ni += 6;
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace OpenRa.Graphics
|
||||
}
|
||||
|
||||
var c = Game.chrome.HitTest(mousePos) ? Cursor.Default : Game.controller.ChooseCursor( world );
|
||||
cursorRenderer.DrawSprite(c.GetSprite((int)cursorFrame), mousePos + Location - c.GetHotspot(), 0);
|
||||
cursorRenderer.DrawSprite(c.GetSprite((int)cursorFrame), mousePos + Location - c.GetHotspot(), "cursor");
|
||||
cursorRenderer.Flush();
|
||||
|
||||
renderer.EndFrame();
|
||||
|
||||
@@ -24,16 +24,29 @@ namespace OpenRa.Graphics
|
||||
this.world = world;
|
||||
this.renderer = renderer;
|
||||
|
||||
terrainRenderer = new TerrainRenderer(world, renderer);
|
||||
terrainRenderer = new TerrainRenderer(world, renderer, this);
|
||||
spriteRenderer = new SpriteRenderer(renderer, true);
|
||||
lineRenderer = new LineRenderer(renderer);
|
||||
uiOverlay = new UiOverlay(spriteRenderer);
|
||||
palette = new HardwarePalette(renderer, world.Map);
|
||||
Log.Write("Created worldrenderer");
|
||||
}
|
||||
|
||||
// TODO: Implement
|
||||
public int GetPaletteIndex(string name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Palette GetPalette(string name)
|
||||
{
|
||||
return palette.GetPalette(name);
|
||||
}
|
||||
|
||||
|
||||
public void AddPalette(string name, Palette pal)
|
||||
{
|
||||
palette.AddPalette(pal);
|
||||
palette.AddPalette(name, pal);
|
||||
}
|
||||
|
||||
void DrawSpriteList(RectangleF rect,
|
||||
@@ -229,7 +242,7 @@ namespace OpenRa.Graphics
|
||||
var pipImages = new Animation("pips");
|
||||
pipImages.PlayFetchIndex("groups", () => (int)group);
|
||||
pipImages.Tick();
|
||||
spriteRenderer.DrawSprite(pipImages.Image, basePosition + new float2(-8, 1), PaletteType.Chrome);
|
||||
spriteRenderer.DrawSprite(pipImages.Image, basePosition + new float2(-8, 1), "chrome");
|
||||
}
|
||||
|
||||
void DrawPips(Actor selectedUnit, float2 basePosition)
|
||||
@@ -244,7 +257,7 @@ namespace OpenRa.Graphics
|
||||
{
|
||||
var pipImages = new Animation("pips");
|
||||
pipImages.PlayRepeating(pipStrings[(int)pip]);
|
||||
spriteRenderer.DrawSprite(pipImages.Image, pipxyBase + pipxyOffset, PaletteType.Chrome);
|
||||
spriteRenderer.DrawSprite(pipImages.Image, pipxyBase + pipxyOffset, "chrome");
|
||||
pipxyOffset += new float2(4, 0);
|
||||
|
||||
if (pipxyOffset.X+5 > selectedUnit.GetBounds(false).Width)
|
||||
@@ -274,7 +287,7 @@ namespace OpenRa.Graphics
|
||||
|
||||
var tagImages = new Animation("pips");
|
||||
tagImages.PlayRepeating(tagStrings[(int)tag]);
|
||||
spriteRenderer.DrawSprite(tagImages.Image, tagxyBase + tagxyOffset, PaletteType.Chrome);
|
||||
spriteRenderer.DrawSprite(tagImages.Image, tagxyBase + tagxyOffset, "chrome");
|
||||
|
||||
// Increment row
|
||||
tagxyOffset.Y += 8;
|
||||
|
||||
Reference in New Issue
Block a user