add alpha channel to every possible blend mode

This commit is contained in:
Matthias Mailänder
2015-04-19 08:18:31 +02:00
parent 1b31001661
commit 63e4d40770
8 changed files with 25 additions and 34 deletions

View File

@@ -42,9 +42,7 @@ namespace OpenRA
Subtractive, Subtractive,
Multiply, Multiply,
SoftAdditive, SoftAdditive,
Translucency25, Translucency,
Translucency50,
Translucency75,
Multiplicative, Multiplicative,
DoubleMultiplicative DoubleMultiplicative
} }
@@ -72,7 +70,7 @@ namespace OpenRA
void EnableDepthBuffer(); void EnableDepthBuffer();
void DisableDepthBuffer(); void DisableDepthBuffer();
void SetBlendMode(BlendMode mode); void SetBlendMode(BlendMode mode, float alpha = 1f);
void GrabWindowMouseFocus(); void GrabWindowMouseFocus();
void ReleaseWindowMouseFocus(); void ReleaseWindowMouseFocus();

View File

@@ -17,6 +17,7 @@ namespace OpenRA.Graphics
public readonly Rectangle Bounds; public readonly Rectangle Bounds;
public readonly Sheet Sheet; public readonly Sheet Sheet;
public readonly BlendMode BlendMode; public readonly BlendMode BlendMode;
public readonly float Alpha;
public readonly TextureChannel Channel; public readonly TextureChannel Channel;
public readonly float2 Size; public readonly float2 Size;
public readonly float2 Offset; public readonly float2 Offset;
@@ -24,12 +25,9 @@ namespace OpenRA.Graphics
public readonly float Top, Left, Bottom, Right; public readonly float Top, Left, Bottom, Right;
public Sprite(Sheet sheet, Rectangle bounds, TextureChannel channel) public Sprite(Sheet sheet, Rectangle bounds, TextureChannel channel)
: this(sheet, bounds, float2.Zero, channel, BlendMode.Alpha) { } : this(sheet, bounds, float2.Zero, channel) { }
public Sprite(Sheet sheet, Rectangle bounds, TextureChannel channel, BlendMode blendMode) public Sprite(Sheet sheet, Rectangle bounds, float2 offset, TextureChannel channel, BlendMode blendMode = BlendMode.Alpha, float alpha = 1f)
: this(sheet, bounds, float2.Zero, channel, blendMode) { }
public Sprite(Sheet sheet, Rectangle bounds, float2 offset, TextureChannel channel, BlendMode blendMode)
{ {
Sheet = sheet; Sheet = sheet;
Bounds = bounds; Bounds = bounds;
@@ -37,6 +35,7 @@ namespace OpenRA.Graphics
Channel = channel; Channel = channel;
Size = new float2(bounds.Size); Size = new float2(bounds.Size);
BlendMode = blendMode; BlendMode = blendMode;
Alpha = alpha;
FractionalOffset = offset / Size; FractionalOffset = offset / Size;

View File

@@ -21,6 +21,7 @@ namespace OpenRA.Graphics
readonly Vertex[] vertices; readonly Vertex[] vertices;
Sheet currentSheet; Sheet currentSheet;
BlendMode currentBlend = BlendMode.Alpha; BlendMode currentBlend = BlendMode.Alpha;
float currentAlpha = 1f;
int nv = 0; int nv = 0;
public SpriteRenderer(Renderer renderer, IShader shader) public SpriteRenderer(Renderer renderer, IShader shader)
@@ -36,14 +37,14 @@ namespace OpenRA.Graphics
{ {
shader.SetTexture("DiffuseTexture", currentSheet.GetTexture()); shader.SetTexture("DiffuseTexture", currentSheet.GetTexture());
renderer.Device.SetBlendMode(currentBlend); renderer.Device.SetBlendMode(currentBlend, currentAlpha);
shader.Render(() => shader.Render(() =>
{ {
var vb = renderer.GetTempVertexBuffer(); var vb = renderer.GetTempVertexBuffer();
vb.SetData(vertices, nv); vb.SetData(vertices, nv);
renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList); renderer.DrawBatch(vb, 0, nv, PrimitiveType.QuadList);
}); });
renderer.Device.SetBlendMode(BlendMode.None); renderer.Device.SetBlendMode(BlendMode.None, currentAlpha);
nv = 0; nv = 0;
currentSheet = null; currentSheet = null;
@@ -54,9 +55,10 @@ namespace OpenRA.Graphics
{ {
renderer.CurrentBatchRenderer = this; renderer.CurrentBatchRenderer = this;
if (s.Sheet != currentSheet || s.BlendMode != currentBlend || nv + 4 > renderer.TempBufferSize) if (s.Alpha != currentAlpha || s.BlendMode != currentBlend || s.Sheet != currentSheet || nv + 4 > renderer.TempBufferSize)
Flush(); Flush();
currentAlpha = s.Alpha;
currentBlend = s.BlendMode; currentBlend = s.BlendMode;
currentSheet = s.Sheet; currentSheet = s.Sheet;
} }

View File

@@ -119,12 +119,13 @@ namespace OpenRA.Mods.Common.Graphics
var offset = LoadField<float2>(d, "Offset", float2.Zero); var offset = LoadField<float2>(d, "Offset", float2.Zero);
var blendMode = LoadField<BlendMode>(d, "BlendMode", BlendMode.Alpha); var blendMode = LoadField<BlendMode>(d, "BlendMode", BlendMode.Alpha);
var alpha = LoadField<float>(d, "Alpha", 1f);
// Apply offset to each sprite in the sequence // Apply offset to each sprite in the sequence
// Different sequences may apply different offsets to the same frame // Different sequences may apply different offsets to the same frame
var src = GetSpriteSrc(modData, tileSet, sequence, animation, info.Value, d); var src = GetSpriteSrc(modData, tileSet, sequence, animation, info.Value, d);
sprites = cache[src].Select( sprites = cache[src].Select(
s => new Sprite(s.Sheet, s.Bounds, s.Offset + offset, s.Channel, blendMode)).ToArray(); s => new Sprite(s.Sheet, s.Bounds, s.Offset + offset, s.Channel, blendMode, alpha)).ToArray();
MiniYaml length; MiniYaml length;
if (d.TryGetValue("Length", out length) && length.Value == "*") if (d.TryGetValue("Length", out length) && length.Value == "*")

View File

@@ -43,7 +43,7 @@ namespace OpenRA.Renderer.Null
public void EnableDepthBuffer() { } public void EnableDepthBuffer() { }
public void DisableDepthBuffer() { } public void DisableDepthBuffer() { }
public void SetBlendMode(BlendMode mode) { } public void SetBlendMode(BlendMode mode, float alpha = 1f) { }
public void GrabWindowMouseFocus() { } public void GrabWindowMouseFocus() { }
public void ReleaseWindowMouseFocus() { } public void ReleaseWindowMouseFocus() { }

View File

@@ -208,7 +208,7 @@ namespace OpenRA.Renderer.Sdl2
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
} }
public void SetBlendMode(BlendMode mode) public void SetBlendMode(BlendMode mode, float alpha = 1f)
{ {
GL.BlendEquation(BlendEquationMode.FuncAdd); GL.BlendEquation(BlendEquationMode.FuncAdd);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
@@ -246,26 +246,11 @@ namespace OpenRA.Renderer.Sdl2
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
GL.BlendFunc(BlendingFactorSrc.OneMinusDstColor, BlendingFactorDest.One); GL.BlendFunc(BlendingFactorSrc.OneMinusDstColor, BlendingFactorDest.One);
break; break;
case BlendMode.Translucency25: case BlendMode.Translucency:
GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.Blend);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
GL.BlendFunc(BlendingFactorSrc.OneMinusConstantAlpha, BlendingFactorDest.One); GL.BlendFunc(BlendingFactorSrc.OneMinusConstantAlpha, BlendingFactorDest.One);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
GL.BlendColor(1f, 1f, 1f, 0.25f);
break;
case BlendMode.Translucency50:
GL.Enable(EnableCap.Blend);
ErrorHandler.CheckGlError();
GL.BlendFunc(BlendingFactorSrc.OneMinusConstantAlpha, BlendingFactorDest.One);
ErrorHandler.CheckGlError();
GL.BlendColor(1f, 1f, 1f, 0.5f);
break;
case BlendMode.Translucency75:
GL.Enable(EnableCap.Blend);
ErrorHandler.CheckGlError();
GL.BlendFunc(BlendingFactorSrc.OneMinusConstantAlpha, BlendingFactorDest.One);
ErrorHandler.CheckGlError();
GL.BlendColor(1f, 1f, 1f, 0.75f);
break; break;
case BlendMode.Multiplicative: case BlendMode.Multiplicative:
GL.Enable(EnableCap.Blend); GL.Enable(EnableCap.Blend);
@@ -279,6 +264,9 @@ namespace OpenRA.Renderer.Sdl2
break; break;
} }
if (alpha != 1f)
GL.BlendColor(1f, 1f, 1f, alpha);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
} }

View File

@@ -85,14 +85,16 @@ bazooka_trail:
Start: 3381 Start: 3381
Length: 4 Length: 4
Tick: 80 Tick: 80
BlendMode: Translucency75 BlendMode: Translucency
Alpha: 0.75
bazooka_trail2: bazooka_trail2:
idle: DATA.R8 idle: DATA.R8
Start: 3544 Start: 3544
Length: 4 Length: 4
Tick: 80 Tick: 80
BlendMode: Translucency75 BlendMode: Translucency
Alpha: 0.75
deviator_trail: deviator_trail:
idle: DATA.R8 idle: DATA.R8

View File

@@ -1,7 +1,8 @@
overlay: overlay:
Defaults: place Defaults: place
Offset: 0, -12 Offset: 0, -12
BlendMode: Translucency75 BlendMode: Translucency
Alpha: 0.75
build-valid-snow: build-valid-snow:
build-valid-temperat: build-valid-temperat:
build-invalid: build-invalid: