Replace ITintableRenderable with IModifyableRenderable.
This commit is contained in:
@@ -54,12 +54,13 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public IRenderable[] Render(WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale)
|
public IRenderable[] Render(WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale)
|
||||||
{
|
{
|
||||||
var imageRenderable = new SpriteRenderable(Image, pos, offset, CurrentSequence.ZOffset + zOffset, palette, scale, IsDecoration, CurrentSequence.IgnoreWorldTint);
|
var tintModifiers = CurrentSequence.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
||||||
|
var imageRenderable = new SpriteRenderable(Image, pos, offset, CurrentSequence.ZOffset + zOffset, palette, scale, IsDecoration, tintModifiers);
|
||||||
|
|
||||||
if (CurrentSequence.ShadowStart >= 0)
|
if (CurrentSequence.ShadowStart >= 0)
|
||||||
{
|
{
|
||||||
var shadow = CurrentSequence.GetShadow(CurrentFrame, facingFunc());
|
var shadow = CurrentSequence.GetShadow(CurrentFrame, facingFunc());
|
||||||
var shadowRenderable = new SpriteRenderable(shadow, pos, offset, CurrentSequence.ShadowZOffset + zOffset, palette, scale, true, CurrentSequence.IgnoreWorldTint);
|
var shadowRenderable = new SpriteRenderable(shadow, pos, offset, CurrentSequence.ShadowZOffset + zOffset, palette, scale, true, tintModifiers);
|
||||||
return new IRenderable[] { shadowRenderable, imageRenderable };
|
return new IRenderable[] { shadowRenderable, imageRenderable };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
using System;
|
||||||
using OpenRA.Primitives;
|
using OpenRA.Primitives;
|
||||||
|
|
||||||
namespace OpenRA.Graphics
|
namespace OpenRA.Graphics
|
||||||
@@ -32,9 +33,22 @@ namespace OpenRA.Graphics
|
|||||||
IPalettedRenderable WithPalette(PaletteReference newPalette);
|
IPalettedRenderable WithPalette(PaletteReference newPalette);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface ITintableRenderable
|
[Flags]
|
||||||
|
public enum TintModifiers
|
||||||
{
|
{
|
||||||
IRenderable WithTint(in float3 newTint);
|
None = 0,
|
||||||
|
IgnoreWorldTint = 1,
|
||||||
|
ReplaceColor = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IModifyableRenderable : IRenderable
|
||||||
|
{
|
||||||
|
float Alpha { get; }
|
||||||
|
float3 Tint { get; }
|
||||||
|
TintModifiers TintModifiers { get; }
|
||||||
|
|
||||||
|
IModifyableRenderable WithAlpha(float newAlpha);
|
||||||
|
IModifyableRenderable WithTint(in float3 newTint, TintModifiers newTintModifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IFinalizedRenderable
|
public interface IFinalizedRenderable
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ using OpenRA.Primitives;
|
|||||||
|
|
||||||
namespace OpenRA.Graphics
|
namespace OpenRA.Graphics
|
||||||
{
|
{
|
||||||
public struct SpriteRenderable : IPalettedRenderable, ITintableRenderable, IFinalizedRenderable
|
public struct SpriteRenderable : IPalettedRenderable, IModifyableRenderable, IFinalizedRenderable
|
||||||
{
|
{
|
||||||
public static readonly IEnumerable<IRenderable> None = new IRenderable[0];
|
public static readonly IEnumerable<IRenderable> None = new IRenderable[0];
|
||||||
|
|
||||||
@@ -25,16 +25,17 @@ namespace OpenRA.Graphics
|
|||||||
readonly PaletteReference palette;
|
readonly PaletteReference palette;
|
||||||
readonly float scale;
|
readonly float scale;
|
||||||
readonly float3 tint;
|
readonly float3 tint;
|
||||||
|
readonly TintModifiers tintModifiers;
|
||||||
|
readonly float alpha;
|
||||||
readonly bool isDecoration;
|
readonly bool isDecoration;
|
||||||
readonly bool ignoreWorldTint;
|
|
||||||
|
|
||||||
public SpriteRenderable(Sprite sprite, WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale, bool isDecoration)
|
public SpriteRenderable(Sprite sprite, WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale, bool isDecoration)
|
||||||
: this(sprite, pos, offset, zOffset, palette, scale, float3.Ones, isDecoration, false) { }
|
: this(sprite, pos, offset, zOffset, palette, scale, 1f, float3.Ones, TintModifiers.None, isDecoration) { }
|
||||||
|
|
||||||
public SpriteRenderable(Sprite sprite, WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale, bool isDecoration, bool ignoreWorldTint)
|
public SpriteRenderable(Sprite sprite, WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale, bool isDecoration, TintModifiers tintModifiers)
|
||||||
: this(sprite, pos, offset, zOffset, palette, scale, float3.Ones, isDecoration, ignoreWorldTint) { }
|
: this(sprite, pos, offset, zOffset, palette, scale, 1f, float3.Ones, tintModifiers, isDecoration) { }
|
||||||
|
|
||||||
public SpriteRenderable(Sprite sprite, WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale, float3 tint, bool isDecoration, bool ignoreWorldTint)
|
public SpriteRenderable(Sprite sprite, WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale, float alpha, float3 tint, TintModifiers tintModifiers, bool isDecoration)
|
||||||
{
|
{
|
||||||
this.sprite = sprite;
|
this.sprite = sprite;
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
@@ -44,7 +45,8 @@ namespace OpenRA.Graphics
|
|||||||
this.scale = scale;
|
this.scale = scale;
|
||||||
this.tint = tint;
|
this.tint = tint;
|
||||||
this.isDecoration = isDecoration;
|
this.isDecoration = isDecoration;
|
||||||
this.ignoreWorldTint = ignoreWorldTint;
|
this.tintModifiers = tintModifiers;
|
||||||
|
this.alpha = alpha;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WPos Pos { get { return pos + offset; } }
|
public WPos Pos { get { return pos + offset; } }
|
||||||
@@ -53,12 +55,24 @@ namespace OpenRA.Graphics
|
|||||||
public int ZOffset { get { return zOffset; } }
|
public int ZOffset { get { return zOffset; } }
|
||||||
public bool IsDecoration { get { return isDecoration; } }
|
public bool IsDecoration { get { return isDecoration; } }
|
||||||
|
|
||||||
public IPalettedRenderable WithPalette(PaletteReference newPalette) { return new SpriteRenderable(sprite, pos, offset, zOffset, newPalette, scale, tint, isDecoration, ignoreWorldTint); }
|
public float Alpha { get { return alpha; } }
|
||||||
public IRenderable WithZOffset(int newOffset) { return new SpriteRenderable(sprite, pos, offset, newOffset, palette, scale, tint, isDecoration, ignoreWorldTint); }
|
public float3 Tint { get { return tint; } }
|
||||||
public IRenderable OffsetBy(WVec vec) { return new SpriteRenderable(sprite, pos + vec, offset, zOffset, palette, scale, tint, isDecoration, ignoreWorldTint); }
|
public TintModifiers TintModifiers { get { return tintModifiers; } }
|
||||||
public IRenderable AsDecoration() { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, scale, tint, true, ignoreWorldTint); }
|
|
||||||
|
|
||||||
public IRenderable WithTint(in float3 newTint) { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, scale, newTint, isDecoration, ignoreWorldTint); }
|
public IPalettedRenderable WithPalette(PaletteReference newPalette) { return new SpriteRenderable(sprite, pos, offset, zOffset, newPalette, scale, alpha, tint, tintModifiers, isDecoration); }
|
||||||
|
public IRenderable WithZOffset(int newOffset) { return new SpriteRenderable(sprite, pos, offset, newOffset, palette, scale, alpha, tint, tintModifiers, isDecoration); }
|
||||||
|
public IRenderable OffsetBy(WVec vec) { return new SpriteRenderable(sprite, pos + vec, offset, zOffset, palette, scale, alpha, tint, tintModifiers, isDecoration); }
|
||||||
|
public IRenderable AsDecoration() { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, scale, alpha, tint, tintModifiers, true); }
|
||||||
|
|
||||||
|
public IModifyableRenderable WithAlpha(float newAlpha)
|
||||||
|
{
|
||||||
|
return new SpriteRenderable(sprite, pos, offset, zOffset, palette, scale, newAlpha, tint, tintModifiers, isDecoration);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IModifyableRenderable WithTint(in float3 newTint, TintModifiers newTintModifiers)
|
||||||
|
{
|
||||||
|
return new SpriteRenderable(sprite, pos, offset, zOffset, palette, scale, alpha, newTint, newTintModifiers, isDecoration);
|
||||||
|
}
|
||||||
|
|
||||||
float3 ScreenPosition(WorldRenderer wr)
|
float3 ScreenPosition(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
@@ -72,16 +86,16 @@ namespace OpenRA.Graphics
|
|||||||
public void Render(WorldRenderer wr)
|
public void Render(WorldRenderer wr)
|
||||||
{
|
{
|
||||||
var wsr = Game.Renderer.WorldSpriteRenderer;
|
var wsr = Game.Renderer.WorldSpriteRenderer;
|
||||||
if (ignoreWorldTint)
|
var t = alpha * tint;
|
||||||
wsr.DrawSprite(sprite, ScreenPosition(wr), palette, scale * sprite.Size);
|
if (wr.TerrainLighting != null && (tintModifiers & TintModifiers.IgnoreWorldTint) == 0)
|
||||||
else
|
t *= wr.TerrainLighting.TintAt(pos);
|
||||||
{
|
|
||||||
var t = tint;
|
|
||||||
if (wr.TerrainLighting != null)
|
|
||||||
t *= wr.TerrainLighting.TintAt(pos);
|
|
||||||
|
|
||||||
wsr.DrawSprite(sprite, ScreenPosition(wr), palette, scale * sprite.Size, t, 1f);
|
// Shader interprets negative alpha as a flag to use the tint colour directly instead of multiplying the sprite colour
|
||||||
}
|
var a = alpha;
|
||||||
|
if ((tintModifiers & TintModifiers.ReplaceColor) != 0)
|
||||||
|
a *= -1;
|
||||||
|
|
||||||
|
wsr.DrawSprite(sprite, ScreenPosition(wr), palette, scale * sprite.Size, t, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr)
|
public void RenderDebugGeometry(WorldRenderer wr)
|
||||||
|
|||||||
@@ -148,7 +148,8 @@ namespace OpenRA.Mods.Cnc.Graphics
|
|||||||
.MinBy(t => Math.Abs(float2.Dot(z + new float2(t[0], t[1]), q) + c));
|
.MinBy(t => Math.Abs(float2.Dot(z + new float2(t[0], t[1]), q) + c));
|
||||||
|
|
||||||
var pos = wr.ProjectedPosition((z + new float2(step[2], step[3])).ToInt2());
|
var pos = wr.ProjectedPosition((z + new float2(step[2], step[3])).ToInt2());
|
||||||
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, pal, 1f, true, s.IgnoreWorldTint).PrepareRender(wr));
|
var tintModifiers = s.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
||||||
|
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, pal, 1f, true, tintModifiers).PrepareRender(wr));
|
||||||
|
|
||||||
z += new float2(step[0], step[1]);
|
z += new float2(step[0], step[1]);
|
||||||
if (rs.Count >= 1000)
|
if (rs.Count >= 1000)
|
||||||
|
|||||||
@@ -287,7 +287,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
|| !movement.CanEnterCell(c, null, BlockedByActor.Immovable) || (mobile != null && !mobile.CanStayInCell(c)))
|
|| !movement.CanEnterCell(c, null, BlockedByActor.Immovable) || (mobile != null && !mobile.CanStayInCell(c)))
|
||||||
tile = tileBlocked;
|
tile = tileBlocked;
|
||||||
|
|
||||||
yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c), WVec.Zero, -511, pal, 1f, true, true);
|
yield return new SpriteRenderable(tile, world.Map.CenterOfCell(c), WVec.Zero, -511, pal, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
var tiles = power.CellsMatching(xy, footprint, dimensions);
|
var tiles = power.CellsMatching(xy, footprint, dimensions);
|
||||||
var palette = wr.Palette(((ChronoshiftPowerInfo)power.Info).TargetOverlayPalette);
|
var palette = wr.Palette(((ChronoshiftPowerInfo)power.Info).TargetOverlayPalette);
|
||||||
foreach (var t in tiles)
|
foreach (var t in tiles)
|
||||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true, true);
|
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
@@ -288,7 +288,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
foreach (var t in power.CellsMatching(sourceLocation, footprint, dimensions))
|
foreach (var t in power.CellsMatching(sourceLocation, footprint, dimensions))
|
||||||
{
|
{
|
||||||
var tile = manager.Self.Owner.Shroud.IsExplored(t + delta) ? validTile : invalidTile;
|
var tile = manager.Self.Owner.Shroud.IsExplored(t + delta) ? validTile : invalidTile;
|
||||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t + delta), WVec.Zero, -511, palette, 1f, true, true);
|
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t + delta), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unit previews
|
// Unit previews
|
||||||
@@ -300,7 +300,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
var canEnter = manager.Self.Owner.Shroud.IsExplored(targetCell) &&
|
var canEnter = manager.Self.Owner.Shroud.IsExplored(targetCell) &&
|
||||||
unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit, targetCell);
|
unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit, targetCell);
|
||||||
var tile = canEnter ? validTile : invalidTile;
|
var tile = canEnter ? validTile : invalidTile;
|
||||||
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, true, true);
|
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(targetCell), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
var offset = world.Map.CenterOfCell(xy) - world.Map.CenterOfCell(sourceLocation);
|
var offset = world.Map.CenterOfCell(xy) - world.Map.CenterOfCell(sourceLocation);
|
||||||
@@ -330,7 +330,7 @@ namespace OpenRA.Mods.Cnc.Traits
|
|||||||
|
|
||||||
// Source tiles
|
// Source tiles
|
||||||
foreach (var t in power.CellsMatching(sourceLocation, footprint, dimensions))
|
foreach (var t in power.CellsMatching(sourceLocation, footprint, dimensions))
|
||||||
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true, true);
|
yield return new SpriteRenderable(sourceTile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsValidTarget(CPos xy)
|
bool IsValidTarget(CPos xy)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ using OpenRA.Primitives;
|
|||||||
|
|
||||||
namespace OpenRA.Mods.Common.Graphics
|
namespace OpenRA.Mods.Common.Graphics
|
||||||
{
|
{
|
||||||
public struct ModelRenderable : IPalettedRenderable, ITintableRenderable
|
public struct ModelRenderable : IPalettedRenderable, IModifyableRenderable
|
||||||
{
|
{
|
||||||
readonly IEnumerable<ModelAnimation> models;
|
readonly IEnumerable<ModelAnimation> models;
|
||||||
readonly WPos pos;
|
readonly WPos pos;
|
||||||
@@ -30,7 +30,9 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
readonly PaletteReference normalsPalette;
|
readonly PaletteReference normalsPalette;
|
||||||
readonly PaletteReference shadowPalette;
|
readonly PaletteReference shadowPalette;
|
||||||
readonly float scale;
|
readonly float scale;
|
||||||
|
readonly float alpha;
|
||||||
readonly float3 tint;
|
readonly float3 tint;
|
||||||
|
readonly TintModifiers tintModifiers;
|
||||||
|
|
||||||
public ModelRenderable(
|
public ModelRenderable(
|
||||||
IEnumerable<ModelAnimation> models, WPos pos, int zOffset, in WRot camera, float scale,
|
IEnumerable<ModelAnimation> models, WPos pos, int zOffset, in WRot camera, float scale,
|
||||||
@@ -38,14 +40,14 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
PaletteReference color, PaletteReference normals, PaletteReference shadow)
|
PaletteReference color, PaletteReference normals, PaletteReference shadow)
|
||||||
: this(models, pos, zOffset, camera, scale,
|
: this(models, pos, zOffset, camera, scale,
|
||||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||||
color, normals, shadow,
|
color, normals, shadow, 1f,
|
||||||
float3.Ones) { }
|
float3.Ones, TintModifiers.None) { }
|
||||||
|
|
||||||
public ModelRenderable(
|
public ModelRenderable(
|
||||||
IEnumerable<ModelAnimation> models, WPos pos, int zOffset, in WRot camera, float scale,
|
IEnumerable<ModelAnimation> models, WPos pos, int zOffset, in WRot camera, float scale,
|
||||||
in WRot lightSource, float[] lightAmbientColor, float[] lightDiffuseColor,
|
in WRot lightSource, float[] lightAmbientColor, float[] lightDiffuseColor,
|
||||||
PaletteReference color, PaletteReference normals, PaletteReference shadow,
|
PaletteReference color, PaletteReference normals, PaletteReference shadow,
|
||||||
in float3 tint)
|
float alpha, in float3 tint, TintModifiers tintModifiers)
|
||||||
{
|
{
|
||||||
this.models = models;
|
this.models = models;
|
||||||
this.pos = pos;
|
this.pos = pos;
|
||||||
@@ -58,7 +60,9 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
palette = color;
|
palette = color;
|
||||||
normalsPalette = normals;
|
normalsPalette = normals;
|
||||||
shadowPalette = shadow;
|
shadowPalette = shadow;
|
||||||
|
this.alpha = alpha;
|
||||||
this.tint = tint;
|
this.tint = tint;
|
||||||
|
this.tintModifiers = tintModifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WPos Pos { get { return pos; } }
|
public WPos Pos { get { return pos; } }
|
||||||
@@ -66,12 +70,16 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
public int ZOffset { get { return zOffset; } }
|
public int ZOffset { get { return zOffset; } }
|
||||||
public bool IsDecoration { get { return false; } }
|
public bool IsDecoration { get { return false; } }
|
||||||
|
|
||||||
|
public float Alpha { get { return alpha; } }
|
||||||
|
public float3 Tint { get { return tint; } }
|
||||||
|
public TintModifiers TintModifiers { get { return tintModifiers; } }
|
||||||
|
|
||||||
public IPalettedRenderable WithPalette(PaletteReference newPalette)
|
public IPalettedRenderable WithPalette(PaletteReference newPalette)
|
||||||
{
|
{
|
||||||
return new ModelRenderable(
|
return new ModelRenderable(
|
||||||
models, pos, zOffset, camera, scale,
|
models, pos, zOffset, camera, scale,
|
||||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||||
newPalette, normalsPalette, shadowPalette, tint);
|
newPalette, normalsPalette, shadowPalette, alpha, tint, tintModifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IRenderable WithZOffset(int newOffset)
|
public IRenderable WithZOffset(int newOffset)
|
||||||
@@ -79,7 +87,7 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
return new ModelRenderable(
|
return new ModelRenderable(
|
||||||
models, pos, newOffset, camera, scale,
|
models, pos, newOffset, camera, scale,
|
||||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||||
palette, normalsPalette, shadowPalette, tint);
|
palette, normalsPalette, shadowPalette, alpha, tint, tintModifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IRenderable OffsetBy(WVec vec)
|
public IRenderable OffsetBy(WVec vec)
|
||||||
@@ -87,17 +95,25 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
return new ModelRenderable(
|
return new ModelRenderable(
|
||||||
models, pos + vec, zOffset, camera, scale,
|
models, pos + vec, zOffset, camera, scale,
|
||||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||||
palette, normalsPalette, shadowPalette, tint);
|
palette, normalsPalette, shadowPalette, alpha, tint, tintModifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IRenderable AsDecoration() { return this; }
|
public IRenderable AsDecoration() { return this; }
|
||||||
|
|
||||||
public IRenderable WithTint(in float3 newTint)
|
public IModifyableRenderable WithAlpha(float newAlpha)
|
||||||
{
|
{
|
||||||
return new ModelRenderable(
|
return new ModelRenderable(
|
||||||
models, pos, zOffset, camera, scale,
|
models, pos, zOffset, camera, scale,
|
||||||
lightSource, lightAmbientColor, lightDiffuseColor,
|
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||||
palette, normalsPalette, shadowPalette, newTint);
|
palette, normalsPalette, shadowPalette, newAlpha, tint, tintModifiers);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IModifyableRenderable WithTint(in float3 newTint, TintModifiers newTintModifiers)
|
||||||
|
{
|
||||||
|
return new ModelRenderable(
|
||||||
|
models, pos, zOffset, camera, scale,
|
||||||
|
lightSource, lightAmbientColor, lightDiffuseColor,
|
||||||
|
palette, normalsPalette, shadowPalette, alpha, newTint, newTintModifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This will need generalizing once we support TS/RA2 terrain
|
// This will need generalizing once we support TS/RA2 terrain
|
||||||
@@ -145,11 +161,16 @@ namespace OpenRA.Mods.Common.Graphics
|
|||||||
|
|
||||||
var wrsr = Game.Renderer.WorldRgbaSpriteRenderer;
|
var wrsr = Game.Renderer.WorldRgbaSpriteRenderer;
|
||||||
var t = model.tint;
|
var t = model.tint;
|
||||||
if (wr.TerrainLighting != null)
|
if (wr.TerrainLighting != null && (model.tintModifiers & TintModifiers.IgnoreWorldTint) == 0)
|
||||||
t *= wr.TerrainLighting.TintAt(model.pos);
|
t *= wr.TerrainLighting.TintAt(model.pos);
|
||||||
|
|
||||||
wrsr.DrawSprite(renderProxy.ShadowSprite, sa, sb, sc, sd, t, 1f);
|
// Shader interprets negative alpha as a flag to use the tint colour directly instead of multiplying the sprite colour
|
||||||
wrsr.DrawSprite(renderProxy.Sprite, pxOrigin - 0.5f * renderProxy.Sprite.Size, renderProxy.Sprite.Size, t, 1f);
|
var a = model.alpha;
|
||||||
|
if ((model.tintModifiers & TintModifiers.ReplaceColor) != 0)
|
||||||
|
a *= -1;
|
||||||
|
|
||||||
|
wrsr.DrawSprite(renderProxy.ShadowSprite, sa, sb, sc, sd, t, a);
|
||||||
|
wrsr.DrawSprite(renderProxy.Sprite, pxOrigin - 0.5f * renderProxy.Sprite.Size, renderProxy.Sprite.Size, t, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RenderDebugGeometry(WorldRenderer wr)
|
public void RenderDebugGeometry(WorldRenderer wr)
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
|
|
||||||
return footprint.Select(c => (IRenderable)(new SpriteRenderable(
|
return footprint.Select(c => (IRenderable)(new SpriteRenderable(
|
||||||
wr.Theater.TileSprite(new TerrainTile(template, c.Value)),
|
wr.Theater.TileSprite(new TerrainTile(template, c.Value)),
|
||||||
wr.World.Map.CenterOfCell(c.Key), WVec.Zero, -offset, palette, 1f, true, false))).ToArray();
|
wr.World.Map.CenterOfCell(c.Key), WVec.Zero, -offset, palette, 1f, true))).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool initialized;
|
bool initialized;
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var pal = HasFlag(c.Value, PlaceBuildingCellType.LineBuild) ? linePalette : cellPalette;
|
var pal = HasFlag(c.Value, PlaceBuildingCellType.LineBuild) ? linePalette : cellPalette;
|
||||||
var pos = wr.World.Map.CenterOfCell(c.Key);
|
var pos = wr.World.Map.CenterOfCell(c.Key);
|
||||||
var offset = new WVec(0, 0, topLeftPos.Z - pos.Z);
|
var offset = new WVec(0, 0, topLeftPos.Z - pos.Z);
|
||||||
yield return new SpriteRenderable(tile, pos, offset, -511, pal, 1f, true, true);
|
yield return new SpriteRenderable(tile, pos, offset, -511, pal, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (!a.IsCanceling)
|
if (!a.IsCanceling)
|
||||||
foreach (var n in a.TargetLineNodes(self))
|
foreach (var n in a.TargetLineNodes(self))
|
||||||
if (n.Tile != null && n.Target.Type != TargetType.Invalid)
|
if (n.Tile != null && n.Target.Type != TargetType.Invalid)
|
||||||
yield return new SpriteRenderable(n.Tile, n.Target.CenterPosition, WVec.Zero, -511, pal, 1f, true, true);
|
yield return new SpriteRenderable(n.Tile, n.Target.CenterPosition, WVec.Zero, -511, pal, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IRenderAboveShroud.SpatiallyPartitionable { get { return false; } }
|
bool IRenderAboveShroud.SpatiallyPartitionable { get { return false; } }
|
||||||
|
|||||||
@@ -176,7 +176,8 @@ namespace OpenRA.Mods.Common.Traits.Render
|
|||||||
var dat = self.World.Map.DistanceAboveTerrain(self.CenterPosition);
|
var dat = self.World.Map.DistanceAboveTerrain(self.CenterPosition);
|
||||||
var pos = self.CenterPosition - new WVec(0, 0, dat.Length);
|
var pos = self.CenterPosition - new WVec(0, 0, dat.Length);
|
||||||
var palette = wr.Palette(info.ShadowPalette);
|
var palette = wr.Palette(info.ShadowPalette);
|
||||||
return new IRenderable[] { new SpriteRenderable(shadow.Image, pos, info.ShadowOffset, info.ShadowZOffset, palette, 1, true, shadow.CurrentSequence.IgnoreWorldTint) };
|
var tintModifiers = shadow.CurrentSequence.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
||||||
|
return new IRenderable[] { new SpriteRenderable(shadow.Image, pos, info.ShadowOffset, info.ShadowZOffset, palette, 1, true, tintModifiers) };
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
IEnumerable<Rectangle> IRender.ScreenBounds(Actor self, WorldRenderer wr)
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
var pal = wr.Palette(TileSet.TerrainPaletteInternalName);
|
||||||
|
|
||||||
foreach (var t in power.CellsMatching(xy, footprint, dimensions))
|
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, true);
|
yield return new SpriteRenderable(tile, wr.World.Map.CenterOfCell(t), WVec.Zero, -511, pal, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
protected override string GetCursor(World world, CPos cell, int2 worldPixel, MouseInput mi)
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var offset = world.Map.Offset(new CVec(x, y), tileInfo.Height);
|
var offset = world.Map.Offset(new CVec(x, y), tileInfo.Height);
|
||||||
var palette = wr.Palette(TerrainTemplate.Palette ?? TileSet.TerrainPaletteInternalName);
|
var palette = wr.Palette(TerrainTemplate.Palette ?? TileSet.TerrainPaletteInternalName);
|
||||||
|
|
||||||
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, offset, 0, palette, 1, false, false));
|
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, offset, 0, palette, 1, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -96,7 +96,8 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
var sprite = sequence.GetSprite(Resource.MaxDensity - 1);
|
var sprite = sequence.GetSprite(Resource.MaxDensity - 1);
|
||||||
var palette = wr.Palette(Resource.Palette);
|
var palette = wr.Palette(Resource.Palette);
|
||||||
|
|
||||||
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, WVec.Zero, 0, palette, 1, false, sequence.IgnoreWorldTint));
|
var tintModifiers = sequence.IgnoreWorldTint ? TintModifiers.IgnoreWorldTint : TintModifiers.None;
|
||||||
|
terrainOrResourcePreview.Add(new SpriteRenderable(sprite, pos, WVec.Zero, 0, palette, 1, false, tintModifiers));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,12 +89,12 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (CopyRegion != null)
|
if (CopyRegion != null)
|
||||||
foreach (var c in CopyRegion)
|
foreach (var c in CopyRegion)
|
||||||
yield return new SpriteRenderable(copySprite, wr.World.Map.CenterOfCell(c),
|
yield return new SpriteRenderable(copySprite, wr.World.Map.CenterOfCell(c),
|
||||||
WVec.Zero, -511, palette, 1f, true, true);
|
WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
|
|
||||||
if (PasteRegion != null)
|
if (PasteRegion != null)
|
||||||
foreach (var c in PasteRegion)
|
foreach (var c in PasteRegion)
|
||||||
yield return new SpriteRenderable(pasteSprite, wr.World.Map.CenterOfCell(c),
|
yield return new SpriteRenderable(pasteSprite, wr.World.Map.CenterOfCell(c),
|
||||||
WVec.Zero, -511, palette, 1f, true, true);
|
WVec.Zero, -511, palette, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IRenderAboveShroud.SpatiallyPartitionable { get { return false; } }
|
bool IRenderAboveShroud.SpatiallyPartitionable { get { return false; } }
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ namespace OpenRA.Mods.D2k.Traits
|
|||||||
var pal = HasFlag(c.Value, PlaceBuildingCellType.LineBuild) ? linePalette : cellPalette;
|
var pal = HasFlag(c.Value, PlaceBuildingCellType.LineBuild) ? linePalette : cellPalette;
|
||||||
var pos = wr.World.Map.CenterOfCell(c.Key);
|
var pos = wr.World.Map.CenterOfCell(c.Key);
|
||||||
var offset = new WVec(0, 0, topLeftPos.Z - pos.Z);
|
var offset = new WVec(0, 0, topLeftPos.Z - pos.Z);
|
||||||
yield return new SpriteRenderable(tile, pos, offset, -511, pal, 1f, true, true);
|
yield return new SpriteRenderable(tile, pos, offset, -511, pal, 1f, true, TintModifiers.IgnoreWorldTint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -228,9 +228,17 @@ void main()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#if __VERSION__ == 120
|
{
|
||||||
gl_FragColor = c * vTint;
|
// A negative tint alpha indicates that the tint should replace the colour instead of multiplying it
|
||||||
|
if (vTint.a < 0.0)
|
||||||
|
c = vec4(vTint.rgb, -vTint.a);
|
||||||
|
else
|
||||||
|
c *= vTint;
|
||||||
|
|
||||||
|
#if __VERSION__ == 120
|
||||||
|
gl_FragColor = c;
|
||||||
#else
|
#else
|
||||||
fragColor = c * vTint;
|
fragColor = c;
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user