Add support for rendering tinted artwork.
This commit is contained in:
@@ -112,6 +112,7 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
public int ShadowZOffset { get; private set; }
|
||||
public int[] Frames { get; private set; }
|
||||
public Rectangle Bounds { get; private set; }
|
||||
public bool IgnoreWorldTint { get; private set; }
|
||||
|
||||
public readonly uint[] EmbeddedPalette;
|
||||
|
||||
@@ -156,6 +157,7 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
Tick = LoadField(d, "Tick", 40);
|
||||
transpose = LoadField(d, "Transpose", false);
|
||||
Frames = LoadField<int[]>(d, "Frames", null);
|
||||
IgnoreWorldTint = LoadField(d, "IgnoreWorldTint", false);
|
||||
|
||||
var flipX = LoadField(d, "FlipX", false);
|
||||
var flipY = LoadField(d, "FlipY", false);
|
||||
|
||||
@@ -17,7 +17,7 @@ using OpenRA.Primitives;
|
||||
|
||||
namespace OpenRA.Mods.Common.Graphics
|
||||
{
|
||||
public struct ModelRenderable : IRenderable
|
||||
public struct ModelRenderable : IRenderable, ITintableRenderable
|
||||
{
|
||||
readonly IEnumerable<ModelAnimation> models;
|
||||
readonly WPos pos;
|
||||
@@ -30,11 +30,22 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
readonly PaletteReference normalsPalette;
|
||||
readonly PaletteReference shadowPalette;
|
||||
readonly float scale;
|
||||
readonly float3 tint;
|
||||
|
||||
public ModelRenderable(
|
||||
IEnumerable<ModelAnimation> models, WPos pos, int zOffset, WRot camera, float scale,
|
||||
WRot lightSource, float[] lightAmbientColor, float[] lightDiffuseColor,
|
||||
PaletteReference color, PaletteReference normals, PaletteReference shadow)
|
||||
: this(models, pos, zOffset, camera, scale,
|
||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||
color, normals, shadow,
|
||||
float3.Ones) { }
|
||||
|
||||
public ModelRenderable(
|
||||
IEnumerable<ModelAnimation> models, WPos pos, int zOffset, WRot camera, float scale,
|
||||
WRot lightSource, float[] lightAmbientColor, float[] lightDiffuseColor,
|
||||
PaletteReference color, PaletteReference normals, PaletteReference shadow,
|
||||
float3 tint)
|
||||
{
|
||||
this.models = models;
|
||||
this.pos = pos;
|
||||
@@ -47,6 +58,7 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
palette = color;
|
||||
normalsPalette = normals;
|
||||
shadowPalette = shadow;
|
||||
this.tint = tint;
|
||||
}
|
||||
|
||||
public WPos Pos { get { return pos; } }
|
||||
@@ -59,7 +71,7 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
return new ModelRenderable(
|
||||
models, pos, zOffset, camera, scale,
|
||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||
newPalette, normalsPalette, shadowPalette);
|
||||
newPalette, normalsPalette, shadowPalette, tint);
|
||||
}
|
||||
|
||||
public IRenderable WithZOffset(int newOffset)
|
||||
@@ -67,7 +79,7 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
return new ModelRenderable(
|
||||
models, pos, newOffset, camera, scale,
|
||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||
palette, normalsPalette, shadowPalette);
|
||||
palette, normalsPalette, shadowPalette, tint);
|
||||
}
|
||||
|
||||
public IRenderable OffsetBy(WVec vec)
|
||||
@@ -75,11 +87,19 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
return new ModelRenderable(
|
||||
models, pos + vec, zOffset, camera, scale,
|
||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||
palette, normalsPalette, shadowPalette);
|
||||
palette, normalsPalette, shadowPalette, tint);
|
||||
}
|
||||
|
||||
public IRenderable AsDecoration() { return this; }
|
||||
|
||||
public IRenderable WithTint(float3 newTint)
|
||||
{
|
||||
return new ModelRenderable(
|
||||
models, pos, zOffset, camera, scale,
|
||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||
palette, normalsPalette, shadowPalette, newTint);
|
||||
}
|
||||
|
||||
// This will need generalizing once we support TS/RA2 terrain
|
||||
static readonly float[] GroundNormal = new float[] { 0, 0, 1, 1 };
|
||||
public IFinalizedRenderable PrepareRender(WorldRenderer wr)
|
||||
@@ -122,8 +142,11 @@ namespace OpenRA.Mods.Common.Graphics
|
||||
var sb = shadowOrigin + psb[2];
|
||||
var sc = shadowOrigin + psb[1];
|
||||
var sd = shadowOrigin + psb[3];
|
||||
Game.Renderer.WorldRgbaSpriteRenderer.DrawSprite(renderProxy.ShadowSprite, sa, sb, sc, sd);
|
||||
Game.Renderer.WorldRgbaSpriteRenderer.DrawSprite(renderProxy.Sprite, pxOrigin - 0.5f * renderProxy.Sprite.Size);
|
||||
|
||||
var wrsr = Game.Renderer.WorldRgbaSpriteRenderer;
|
||||
var ti = model.tint;
|
||||
wrsr.DrawSpriteWithTint(renderProxy.ShadowSprite, sa, sb, sc, sd, ti);
|
||||
wrsr.DrawSpriteWithTint(renderProxy.Sprite, pxOrigin - 0.5f * renderProxy.Sprite.Size, renderProxy.Sprite.Size, ti);
|
||||
}
|
||||
|
||||
public void RenderDebugGeometry(WorldRenderer wr)
|
||||
|
||||
@@ -200,7 +200,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
|
||||
return footprint.Select(c => (IRenderable)(new SpriteRenderable(
|
||||
wr.Theater.TileSprite(new TerrainTile(template, c.Value)),
|
||||
wr.World.Map.CenterOfCell(c.Key), WVec.Zero, -offset, palette, 1f, true))).ToArray();
|
||||
wr.World.Map.CenterOfCell(c.Key), WVec.Zero, -offset, palette, 1f, true, false))).ToArray();
|
||||
}
|
||||
|
||||
bool initialized;
|
||||
|
||||
@@ -93,7 +93,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
var pal = HasFlag(c.Value, PlaceBuildingCellType.LineBuild) ? linePalette : cellPalette;
|
||||
var pos = wr.World.Map.CenterOfCell(c.Key);
|
||||
var offset = new WVec(0, 0, topLeftPos.Z - pos.Z);
|
||||
yield return new SpriteRenderable(tile, pos, offset, -511, pal, 1f, true);
|
||||
yield return new SpriteRenderable(tile, pos, offset, -511, pal, 1f, true, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
if (!a.IsCanceling)
|
||||
foreach (var n in a.TargetLineNodes(self))
|
||||
if (n.Tile != null && n.Target.Type != TargetType.Invalid)
|
||||
yield return new SpriteRenderable(n.Tile, n.Target.CenterPosition, WVec.Zero, -511, pal, 1f, true);
|
||||
yield return new SpriteRenderable(n.Tile, n.Target.CenterPosition, WVec.Zero, -511, pal, 1f, true, true);
|
||||
}
|
||||
|
||||
bool IRenderAboveShroud.SpatiallyPartitionable { get { return false; } }
|
||||
|
||||
@@ -177,7 +177,7 @@ namespace OpenRA.Mods.Common.Traits.Render
|
||||
var dat = self.World.Map.DistanceAboveTerrain(self.CenterPosition);
|
||||
var pos = self.CenterPosition - new WVec(0, 0, dat.Length);
|
||||
var palette = wr.Palette(info.ShadowPalette);
|
||||
return new IRenderable[] { new SpriteRenderable(shadow.Image, pos, info.ShadowOffset, info.ShadowZOffset, palette, 1, true) };
|
||||
return new IRenderable[] { new SpriteRenderable(shadow.Image, pos, info.ShadowOffset, info.ShadowZOffset, palette, 1, true, shadow.CurrentSequence.IgnoreWorldTint) };
|
||||
}
|
||||
|
||||
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||
|
||||
@@ -167,7 +167,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
||||
|
||||
foreach (var t in power.CellsMatching(xy, footprint, dimensions))
|
||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, pal, 1f, true);
|
||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, pal, 1f, true, true);
|
||||
}
|
||||
|
||||
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||
|
||||
@@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
var offset = world.Map.Offset(new CVec(x, y), tileInfo.Height);
|
||||
var palette = wr.Palette(TerrainTemplate.Palette ?? TileSet.TerrainPaletteInternalName);
|
||||
|
||||
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, offset, 0, palette, 1, false));
|
||||
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, offset, 0, palette, 1, false, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,7 +99,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
var sprite = sequence.GetSprite(Resource.MaxDensity - 1);
|
||||
var palette = wr.Palette(Resource.Palette);
|
||||
|
||||
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, WVec.Zero, 0, palette, 1, false));
|
||||
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, WVec.Zero, 0, palette, 1, false, sequence.IgnoreWorldTint));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,12 +89,12 @@ namespace OpenRA.Mods.Common.Traits
|
||||
if (CopyRegion != null)
|
||||
foreach (var c in CopyRegion)
|
||||
yield return new SpriteRenderable(copySprite, wr.World.Map.CenterOfCell(c),
|
||||
WVec.Zero, -511, palette, 1f, true);
|
||||
WVec.Zero, -511, palette, 1f, true, true);
|
||||
|
||||
if (PasteRegion != null)
|
||||
foreach (var c in PasteRegion)
|
||||
yield return new SpriteRenderable(pasteSprite, wr.World.Map.CenterOfCell(c),
|
||||
WVec.Zero, -511, palette, 1f, true);
|
||||
WVec.Zero, -511, palette, 1f, true, true);
|
||||
}
|
||||
|
||||
bool IRenderAboveShroud.SpatiallyPartitionable { get { return false; } }
|
||||
|
||||
Reference in New Issue
Block a user