Use PaletteReferences everywhere.
This commit is contained in:
@@ -20,12 +20,23 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
public static class CursorProvider
|
public static class CursorProvider
|
||||||
{
|
{
|
||||||
static HardwarePalette Palette;
|
static HardwarePalette palette;
|
||||||
static Dictionary<string, CursorSequence> cursors;
|
static Dictionary<string, CursorSequence> cursors;
|
||||||
|
static Cache<string, PaletteReference> palettes;
|
||||||
|
|
||||||
|
static PaletteReference CreatePaletteReference(string name)
|
||||||
|
{
|
||||||
|
var pal = palette.GetPalette(name);
|
||||||
|
if (pal == null)
|
||||||
|
throw new InvalidOperationException("Palette `{0}` does not exist".F(name));
|
||||||
|
|
||||||
|
return new PaletteReference(name, palette.GetPaletteIndex(name), pal);
|
||||||
|
}
|
||||||
|
|
||||||
public static void Initialize(string[] sequenceFiles)
|
public static void Initialize(string[] sequenceFiles)
|
||||||
{
|
{
|
||||||
cursors = new Dictionary<string, CursorSequence>();
|
cursors = new Dictionary<string, CursorSequence>();
|
||||||
|
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));
|
||||||
int[] ShadowIndex = { };
|
int[] ShadowIndex = { };
|
||||||
|
|
||||||
@@ -35,14 +46,14 @@ namespace OpenRA.Graphics
|
|||||||
int.TryParse(sequences.NodesDict["ShadowIndex"].Value, out ShadowIndex[ShadowIndex.Length - 1]);
|
int.TryParse(sequences.NodesDict["ShadowIndex"].Value, out ShadowIndex[ShadowIndex.Length - 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Palette = new HardwarePalette();
|
palette = new HardwarePalette();
|
||||||
foreach (var p in sequences.NodesDict["Palettes"].Nodes)
|
foreach (var p in sequences.NodesDict["Palettes"].Nodes)
|
||||||
Palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false);
|
palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false);
|
||||||
|
|
||||||
foreach (var s in sequences.NodesDict["Cursors"].Nodes)
|
foreach (var s in sequences.NodesDict["Cursors"].Nodes)
|
||||||
LoadSequencesForCursor(s.Key, s.Value);
|
LoadSequencesForCursor(s.Key, s.Value);
|
||||||
|
|
||||||
Palette.Initialize();
|
palette.Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void LoadSequencesForCursor(string cursorSrc, MiniYaml cursor)
|
static void LoadSequencesForCursor(string cursorSrc, MiniYaml cursor)
|
||||||
@@ -63,10 +74,10 @@ namespace OpenRA.Graphics
|
|||||||
var cursorSequence = GetCursorSequence(cursorName);
|
var cursorSequence = GetCursorSequence(cursorName);
|
||||||
var cursorSprite = cursorSequence.GetSprite(cursorFrame);
|
var cursorSprite = cursorSequence.GetSprite(cursorFrame);
|
||||||
|
|
||||||
renderer.SetPalette(Palette);
|
renderer.SetPalette(palette);
|
||||||
renderer.SpriteRenderer.DrawSprite(cursorSprite,
|
renderer.SpriteRenderer.DrawSprite(cursorSprite,
|
||||||
lastMousePos - cursorSequence.Hotspot,
|
lastMousePos - cursorSequence.Hotspot,
|
||||||
Palette.GetPaletteIndex(cursorSequence.Palette),
|
palettes[cursorSequence.Palette],
|
||||||
cursorSprite.size);
|
cursorSprite.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public void Render(WorldRenderer wr)
|
public void Render(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
sprite.DrawAt(wr.ScreenPxPosition(pos) - pxCenter, palette.Index, scale);
|
sprite.DrawAt(wr.ScreenPxPosition(pos) - pxCenter, palette, scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr)
|
public void RenderDebugGeometry(WorldRenderer wr)
|
||||||
|
|||||||
@@ -185,14 +185,14 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
s[starti, j].DrawAt(
|
s[starti, j].DrawAt(
|
||||||
Game.CellSize * new float2(starti, j),
|
Game.CellSize * new float2(starti, j),
|
||||||
pal.Index,
|
pal,
|
||||||
new float2(Game.CellSize * (i - starti), Game.CellSize));
|
new float2(Game.CellSize * (i - starti), Game.CellSize));
|
||||||
starti = i + 1;
|
starti = i + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
s[i, j].DrawAt(
|
s[i, j].DrawAt(
|
||||||
Game.CellSize * new float2(i, j),
|
Game.CellSize * new float2(i, j),
|
||||||
pal.Index);
|
pal);
|
||||||
starti = i + 1;
|
starti = i + 1;
|
||||||
last = s[i, j];
|
last = s[i, j];
|
||||||
}
|
}
|
||||||
@@ -200,7 +200,7 @@ namespace OpenRA.Graphics
|
|||||||
if (starti < clip.Right)
|
if (starti < clip.Right)
|
||||||
s[starti, j].DrawAt(
|
s[starti, j].DrawAt(
|
||||||
Game.CellSize * new float2(starti, j),
|
Game.CellSize * new float2(starti, j),
|
||||||
pal.Index,
|
pal,
|
||||||
new float2(Game.CellSize * (clip.Right - starti), Game.CellSize));
|
new float2(Game.CellSize * (clip.Right - starti), Game.CellSize));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,24 +50,19 @@ namespace OpenRA.Graphics
|
|||||||
return textureCoords[k];
|
return textureCoords[k];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawAt(WorldRenderer wr, float2 location, string palette)
|
public void DrawAt(float2 location, PaletteReference pal)
|
||||||
{
|
{
|
||||||
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, wr, palette, size);
|
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawAt(float2 location, int paletteIndex)
|
public void DrawAt(float2 location, PaletteReference pal, float scale)
|
||||||
{
|
{
|
||||||
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size);
|
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size*scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawAt(float2 location, int paletteIndex, float scale)
|
public void DrawAt(float2 location, PaletteReference pal, float2 size)
|
||||||
{
|
{
|
||||||
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size*scale);
|
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, pal, size);
|
||||||
}
|
|
||||||
|
|
||||||
public void DrawAt(float2 location, int paletteIndex, float2 size)
|
|
||||||
{
|
|
||||||
Game.Renderer.WorldSpriteRenderer.DrawSprite(this, location, paletteIndex, size);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,17 +45,17 @@ namespace OpenRA.Graphics
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette)
|
public void DrawSprite(Sprite s, float2 location, PaletteReference pal)
|
||||||
{
|
{
|
||||||
DrawSprite(s, location, wr.Palette(palette).Index, s.size);
|
DrawSprite(s, location, pal.Index, s.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawSprite(Sprite s, float2 location, WorldRenderer wr, string palette, float2 size)
|
public void DrawSprite(Sprite s, float2 location, PaletteReference pal, float2 size)
|
||||||
{
|
{
|
||||||
DrawSprite(s, location, wr.Palette(palette).Index, size);
|
DrawSprite(s, location, pal.Index, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawSprite(Sprite s, float2 location, int paletteIndex, float2 size)
|
void DrawSprite(Sprite s, float2 location, int paletteIndex, float2 size)
|
||||||
{
|
{
|
||||||
Renderer.CurrentBatchRenderer = this;
|
Renderer.CurrentBatchRenderer = this;
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ namespace OpenRA.Traits
|
|||||||
var pipImages = new Animation("pips");
|
var pipImages = new Animation("pips");
|
||||||
pipImages.PlayFetchIndex("groups", () => (int)group);
|
pipImages.PlayFetchIndex("groups", () => (int)group);
|
||||||
pipImages.Tick();
|
pipImages.Tick();
|
||||||
pipImages.Image.DrawAt(wr, basePosition + new float2(-8, 1), "chrome");
|
pipImages.Image.DrawAt(basePosition + new float2(-8, 1), wr.Palette("chrome"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawPips(WorldRenderer wr, Actor self, float2 basePosition)
|
void DrawPips(WorldRenderer wr, Actor self, float2 basePosition)
|
||||||
@@ -69,6 +69,7 @@ namespace OpenRA.Traits
|
|||||||
var pipSize = pipImages.Image.size;
|
var pipSize = pipImages.Image.size;
|
||||||
var pipxyBase = basePosition + new float2(1, -pipSize.Y);
|
var pipxyBase = basePosition + new float2(1, -pipSize.Y);
|
||||||
var pipxyOffset = new float2(0, 0); // Correct for offset due to multiple columns/rows
|
var pipxyOffset = new float2(0, 0); // Correct for offset due to multiple columns/rows
|
||||||
|
var pal = wr.Palette("chrome");
|
||||||
|
|
||||||
foreach (var pips in pipSources)
|
foreach (var pips in pipSources)
|
||||||
{
|
{
|
||||||
@@ -86,7 +87,7 @@ namespace OpenRA.Traits
|
|||||||
pipxyOffset.Y -= pipSize.Y;
|
pipxyOffset.Y -= pipSize.Y;
|
||||||
}
|
}
|
||||||
pipImages.PlayRepeating(pipStrings[(int)pip]);
|
pipImages.PlayRepeating(pipStrings[(int)pip]);
|
||||||
pipImages.Image.DrawAt(wr, pipxyBase + pipxyOffset, "chrome");
|
pipImages.Image.DrawAt(pipxyBase + pipxyOffset, pal);
|
||||||
pipxyOffset += new float2(pipSize.X, 0);
|
pipxyOffset += new float2(pipSize.X, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +105,7 @@ namespace OpenRA.Traits
|
|||||||
// If a mod wants to implement a unit with multiple tags, then they are placed on multiple rows
|
// If a mod wants to implement a unit with multiple tags, then they are placed on multiple rows
|
||||||
var tagxyBase = basePosition + new float2(-16, 2); // Correct for the offset in the shp file
|
var tagxyBase = basePosition + new float2(-16, 2); // Correct for the offset in the shp file
|
||||||
var tagxyOffset = new float2(0, 0); // Correct for offset due to multiple rows
|
var tagxyOffset = new float2(0, 0); // Correct for offset due to multiple rows
|
||||||
|
var pal = wr.Palette("chrome");
|
||||||
foreach (var tags in self.TraitsImplementing<ITags>())
|
foreach (var tags in self.TraitsImplementing<ITags>())
|
||||||
{
|
{
|
||||||
foreach (var tag in tags.GetTags())
|
foreach (var tag in tags.GetTags())
|
||||||
@@ -114,7 +115,7 @@ namespace OpenRA.Traits
|
|||||||
|
|
||||||
var tagImages = new Animation("pips");
|
var tagImages = new Animation("pips");
|
||||||
tagImages.PlayRepeating(tagStrings[(int)tag]);
|
tagImages.PlayRepeating(tagStrings[(int)tag]);
|
||||||
tagImages.Image.DrawAt(wr, tagxyBase + tagxyOffset, "chrome");
|
tagImages.Image.DrawAt(tagxyBase + tagxyOffset, pal);
|
||||||
|
|
||||||
// Increment row
|
// Increment row
|
||||||
tagxyOffset.Y += 8;
|
tagxyOffset.Y += 8;
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace OpenRA.Traits
|
|||||||
if (c.image != null)
|
if (c.image != null)
|
||||||
c.image[c.density].DrawAt(
|
c.image[c.density].DrawAt(
|
||||||
new CPos(x, y).ToPPos().ToFloat2(),
|
new CPos(x, y).ToPPos().ToFloat2(),
|
||||||
c.type.info.PaletteRef.Index);
|
c.type.info.PaletteRef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ namespace OpenRA.Widgets
|
|||||||
cachedFrame = frame;
|
cachedFrame = frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
Game.Renderer.SpriteRenderer.DrawSprite(sprite, RenderOrigin, worldRenderer, palette);
|
Game.Renderer.SpriteRenderer.DrawSprite(sprite, RenderOrigin, worldRenderer.Palette(palette));
|
||||||
}
|
}
|
||||||
|
|
||||||
public int FrameCount
|
public int FrameCount
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ namespace OpenRA.Widgets
|
|||||||
|
|
||||||
public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr)
|
public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr)
|
||||||
{
|
{
|
||||||
Game.Renderer.SpriteRenderer.DrawSprite(s,pos, wr, "chrome");
|
Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr.Palette("chrome"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr, float2 size)
|
public static void DrawSHP(Sprite s, float2 pos, WorldRenderer wr, float2 size)
|
||||||
{
|
{
|
||||||
Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr, "chrome", size);
|
Game.Renderer.SpriteRenderer.DrawSprite(s, pos, wr.Palette("chrome"), size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DrawPanel(string collection, Rectangle Bounds)
|
public static void DrawPanel(string collection, Rectangle Bounds)
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ namespace OpenRA.Mods.RA.Buildings
|
|||||||
|
|
||||||
public void Render( WorldRenderer wr )
|
public void Render( WorldRenderer wr )
|
||||||
{
|
{
|
||||||
|
var pal = wr.Palette("terrain");
|
||||||
var cliprect = Game.viewport.WorldBounds(world);
|
var cliprect = Game.viewport.WorldBounds(world);
|
||||||
foreach (var kv in tiles)
|
foreach (var kv in tiles)
|
||||||
{
|
{
|
||||||
@@ -81,7 +82,7 @@ namespace OpenRA.Mods.RA.Buildings
|
|||||||
if (world.ShroudObscures(kv.Key))
|
if (world.ShroudObscures(kv.Key))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bibSprites[kv.Value.type - 1][kv.Value.index].DrawAt(wr, kv.Key.ToPPos().ToFloat2(), "terrain");
|
bibSprites[kv.Value.type - 1][kv.Value.index].DrawAt(kv.Key.ToPPos().ToFloat2(), pal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,8 +108,9 @@ namespace OpenRA.Mods.RA.Orders
|
|||||||
cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null);
|
cells.Add(t, isCloseEnough && world.IsCellBuildable(t, BuildingInfo) && res.GetResource(t) == null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var pal = wr.Palette("terrain");
|
||||||
foreach (var c in cells)
|
foreach (var c in cells)
|
||||||
(c.Value ? buildOk : buildBlocked).DrawAt(wr, c.Key.ToPPos().ToFloat2(), "terrain");
|
(c.Value ? buildOk : buildBlocked).DrawAt(c.Key.ToPPos().ToFloat2(), pal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetCursor(World world, CPos xy, MouseInput mi) { return "default"; }
|
public string GetCursor(World world, CPos xy, MouseInput mi) { return "default"; }
|
||||||
|
|||||||
@@ -151,8 +151,9 @@ namespace OpenRA.Mods.RA
|
|||||||
{
|
{
|
||||||
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
|
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
|
||||||
var tiles = world.FindTilesInCircle(xy, range);
|
var tiles = world.FindTilesInCircle(xy, range);
|
||||||
|
var pal = wr.Palette("terrain");
|
||||||
foreach (var t in tiles)
|
foreach (var t in tiles)
|
||||||
tile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" );
|
tile.DrawAt(t.ToPPos().ToFloat2(), pal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetCursor(World world, CPos xy, MouseInput mi)
|
public string GetCursor(World world, CPos xy, MouseInput mi)
|
||||||
@@ -230,14 +231,15 @@ namespace OpenRA.Mods.RA
|
|||||||
public void RenderBeforeWorld(WorldRenderer wr, World world)
|
public void RenderBeforeWorld(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
|
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
|
||||||
|
var pal = wr.Palette("terrain");
|
||||||
|
|
||||||
// Source tiles
|
// Source tiles
|
||||||
foreach (var t in world.FindTilesInCircle(sourceLocation, range))
|
foreach (var t in world.FindTilesInCircle(sourceLocation, range))
|
||||||
sourceTile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" );
|
sourceTile.DrawAt(t.ToPPos().ToFloat2(), pal);
|
||||||
|
|
||||||
// Destination tiles
|
// Destination tiles
|
||||||
foreach (var t in world.FindTilesInCircle(xy, range))
|
foreach (var t in world.FindTilesInCircle(xy, range))
|
||||||
sourceTile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" );
|
sourceTile.DrawAt(t.ToPPos().ToFloat2(), pal);
|
||||||
|
|
||||||
// Unit previews
|
// Unit previews
|
||||||
foreach (var unit in power.UnitsInRange(sourceLocation))
|
foreach (var unit in power.UnitsInRange(sourceLocation))
|
||||||
@@ -257,7 +259,7 @@ namespace OpenRA.Mods.RA
|
|||||||
var canEnter = ((manager.self.Owner.Shroud.IsExplored(targetCell) || manager.self.Owner.HasFogVisibility()) &&
|
var canEnter = ((manager.self.Owner.Shroud.IsExplored(targetCell) || manager.self.Owner.HasFogVisibility()) &&
|
||||||
unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit,targetCell));
|
unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit,targetCell));
|
||||||
var tile = canEnter ? validTile : invalidTile;
|
var tile = canEnter ? validTile : invalidTile;
|
||||||
tile.DrawAt(wr, targetCell.ToPPos().ToFloat2(), "terrain");
|
tile.DrawAt(targetCell.ToPPos().ToFloat2(), pal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,8 +98,9 @@ namespace OpenRA.Mods.RA
|
|||||||
public void RenderBeforeWorld(WorldRenderer wr, World world)
|
public void RenderBeforeWorld(WorldRenderer wr, World world)
|
||||||
{
|
{
|
||||||
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
|
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
|
||||||
|
var pal = wr.Palette("terrain");
|
||||||
foreach (var t in world.FindTilesInCircle(xy, range))
|
foreach (var t in world.FindTilesInCircle(xy, range))
|
||||||
tile.DrawAt( wr, t.ToPPos().ToFloat2(), "terrain" );
|
tile.DrawAt(t.ToPPos().ToFloat2(), pal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetCursor(World world, CPos xy, MouseInput mi)
|
public string GetCursor(World world, CPos xy, MouseInput mi)
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ namespace OpenRA.Mods.RA
|
|||||||
public void Render( WorldRenderer wr )
|
public void Render( WorldRenderer wr )
|
||||||
{
|
{
|
||||||
var cliprect = Game.viewport.WorldBounds(world);
|
var cliprect = Game.viewport.WorldBounds(world);
|
||||||
|
var pal = wr.Palette("terrain");
|
||||||
|
|
||||||
foreach (var kv in tiles)
|
foreach (var kv in tiles)
|
||||||
{
|
{
|
||||||
if (!cliprect.Contains(kv.Key.X,kv.Key.Y))
|
if (!cliprect.Contains(kv.Key.X,kv.Key.Y))
|
||||||
@@ -86,7 +88,7 @@ namespace OpenRA.Mods.RA
|
|||||||
if (world.ShroudObscures(kv.Key))
|
if (world.ShroudObscures(kv.Key))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
smudgeSprites[kv.Value.type- 1][kv.Value.index].DrawAt(wr, kv.Key.ToPPos().ToFloat2(), "terrain");
|
smudgeSprites[kv.Value.type- 1][kv.Value.index].DrawAt(kv.Key.ToPPos().ToFloat2(), pal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user