Merge pull request #11098 from pchote/vertex-secondary-texcoords
Replace SheetType.DualIndexed with secondary texture coordinates on Vertex.
This commit is contained in:
@@ -69,12 +69,12 @@ namespace OpenRA.Graphics
|
|||||||
var eb = endColor.B / 255.0f;
|
var eb = endColor.B / 255.0f;
|
||||||
var ea = endColor.A / 255.0f;
|
var ea = endColor.A / 255.0f;
|
||||||
|
|
||||||
vertices[nv++] = new Vertex(start - corner + Offset, sr, sg, sb, sa);
|
vertices[nv++] = new Vertex(start - corner + Offset, sr, sg, sb, sa, 0, 0);
|
||||||
vertices[nv++] = new Vertex(start + corner + Offset, sr, sg, sb, sa);
|
vertices[nv++] = new Vertex(start + corner + Offset, sr, sg, sb, sa, 0, 0);
|
||||||
vertices[nv++] = new Vertex(end + corner + Offset, er, eg, eb, ea);
|
vertices[nv++] = new Vertex(end + corner + Offset, er, eg, eb, ea, 0, 0);
|
||||||
vertices[nv++] = new Vertex(end + corner + Offset, er, eg, eb, ea);
|
vertices[nv++] = new Vertex(end + corner + Offset, er, eg, eb, ea, 0, 0);
|
||||||
vertices[nv++] = new Vertex(end - corner + Offset, er, eg, eb, ea);
|
vertices[nv++] = new Vertex(end - corner + Offset, er, eg, eb, ea, 0, 0);
|
||||||
vertices[nv++] = new Vertex(start - corner + Offset, sr, sg, sb, sa);
|
vertices[nv++] = new Vertex(start - corner + Offset, sr, sg, sb, sa, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DrawLine(float2 start, float2 end, float width, Color color)
|
public void DrawLine(float2 start, float2 end, float width, Color color)
|
||||||
@@ -93,12 +93,12 @@ namespace OpenRA.Graphics
|
|||||||
var b = color.B / 255.0f;
|
var b = color.B / 255.0f;
|
||||||
var a = color.A / 255.0f;
|
var a = color.A / 255.0f;
|
||||||
|
|
||||||
vertices[nv++] = new Vertex(start - corner + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(start - corner + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(start + corner + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(start + corner + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(end + corner + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(end + corner + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(end + corner + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(end + corner + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(end - corner + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(end - corner + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(start - corner + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(start - corner + Offset, r, g, b, a, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -186,12 +186,12 @@ namespace OpenRA.Graphics
|
|||||||
if (nv + 6 > renderer.TempBufferSize)
|
if (nv + 6 > renderer.TempBufferSize)
|
||||||
Flush();
|
Flush();
|
||||||
|
|
||||||
vertices[nv++] = new Vertex(ca + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(ca + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(cb + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(cb + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(cc + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(cc + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(cc + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(cc + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(cd + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(cd + Offset, r, g, b, a, 0, 0);
|
||||||
vertices[nv++] = new Vertex(ca + Offset, r, g, b, a);
|
vertices[nv++] = new Vertex(ca + Offset, r, g, b, a, 0, 0);
|
||||||
|
|
||||||
// Advance line segment
|
// Advance line segment
|
||||||
end = next;
|
end = next;
|
||||||
@@ -243,12 +243,12 @@ namespace OpenRA.Graphics
|
|||||||
var cb = color.B / 255.0f;
|
var cb = color.B / 255.0f;
|
||||||
var ca = color.A / 255.0f;
|
var ca = color.A / 255.0f;
|
||||||
|
|
||||||
vertices[nv++] = new Vertex(a + Offset, cr, cg, cb, ca);
|
vertices[nv++] = new Vertex(a + Offset, cr, cg, cb, ca, 0, 0);
|
||||||
vertices[nv++] = new Vertex(b + Offset, cr, cg, cb, ca);
|
vertices[nv++] = new Vertex(b + Offset, cr, cg, cb, ca, 0, 0);
|
||||||
vertices[nv++] = new Vertex(c + Offset, cr, cg, cb, ca);
|
vertices[nv++] = new Vertex(c + Offset, cr, cg, cb, ca, 0, 0);
|
||||||
vertices[nv++] = new Vertex(c + Offset, cr, cg, cb, ca);
|
vertices[nv++] = new Vertex(c + Offset, cr, cg, cb, ca, 0, 0);
|
||||||
vertices[nv++] = new Vertex(d + Offset, cr, cg, cb, ca);
|
vertices[nv++] = new Vertex(d + Offset, cr, cg, cb, ca, 0, 0);
|
||||||
vertices[nv++] = new Vertex(a + Offset, cr, cg, cb, ca);
|
vertices[nv++] = new Vertex(a + Offset, cr, cg, cb, ca, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void FillEllipse(RectangleF r, Color color, int vertices = 32)
|
public void FillEllipse(RectangleF r, Color color, int vertices = 32)
|
||||||
|
|||||||
@@ -25,8 +25,7 @@ namespace OpenRA.Graphics
|
|||||||
public enum SheetType
|
public enum SheetType
|
||||||
{
|
{
|
||||||
Indexed = 1,
|
Indexed = 1,
|
||||||
DualIndexed = 2,
|
BGRA = 2,
|
||||||
BGRA = 4,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class SheetBuilder : IDisposable
|
public sealed class SheetBuilder : IDisposable
|
||||||
|
|||||||
@@ -48,6 +48,24 @@ namespace OpenRA.Graphics
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class SpriteWithSecondaryData : Sprite
|
||||||
|
{
|
||||||
|
public readonly Rectangle SecondaryBounds;
|
||||||
|
public readonly TextureChannel SecondaryChannel;
|
||||||
|
public readonly float SecondaryTop, SecondaryLeft, SecondaryBottom, SecondaryRight;
|
||||||
|
|
||||||
|
public SpriteWithSecondaryData(Sprite s, Rectangle secondaryBounds, TextureChannel secondaryChannel)
|
||||||
|
: base(s.Sheet, s.Bounds, s.ZRamp, s.Offset, s.Channel, s.BlendMode)
|
||||||
|
{
|
||||||
|
SecondaryBounds = secondaryBounds;
|
||||||
|
SecondaryChannel = secondaryChannel;
|
||||||
|
SecondaryLeft = (float)Math.Min(secondaryBounds.Left, secondaryBounds.Right) / s.Sheet.Size.Width;
|
||||||
|
SecondaryTop = (float)Math.Min(secondaryBounds.Top, secondaryBounds.Bottom) / s.Sheet.Size.Height;
|
||||||
|
SecondaryRight = (float)Math.Max(secondaryBounds.Left, secondaryBounds.Right) / s.Sheet.Size.Width;
|
||||||
|
SecondaryBottom = (float)Math.Max(secondaryBounds.Top, secondaryBounds.Bottom) / s.Sheet.Size.Height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public enum TextureChannel : byte
|
public enum TextureChannel : byte
|
||||||
{
|
{
|
||||||
Red = 0,
|
Red = 0,
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ namespace OpenRA.Graphics
|
|||||||
for (var i = 0; i < vertices.Length; i++)
|
for (var i = 0; i < vertices.Length; i++)
|
||||||
{
|
{
|
||||||
var v = vertices[i];
|
var v = vertices[i];
|
||||||
vertices[i] = new Vertex(v.X, v.Y, v.Z, v.U, v.V, palette.TextureIndex, v.C);
|
vertices[i] = new Vertex(v.X, v.Y, v.Z, v.S, v.T, v.U, v.V, palette.TextureIndex, v.C);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (var row = 0; row < map.MapSize.Y; row++)
|
for (var row = 0; row < map.MapSize.Y; row++)
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
this.tileset = tileset;
|
this.tileset = tileset;
|
||||||
var allocated = false;
|
var allocated = false;
|
||||||
var type = tileset.EnableDepth ? SheetType.DualIndexed : SheetType.Indexed;
|
|
||||||
|
|
||||||
Func<Sheet> allocate = () =>
|
Func<Sheet> allocate = () =>
|
||||||
{
|
{
|
||||||
@@ -51,10 +50,10 @@ namespace OpenRA.Graphics
|
|||||||
throw new SheetOverflowException("Terrain sheet overflow. Try increasing the tileset SheetSize parameter.");
|
throw new SheetOverflowException("Terrain sheet overflow. Try increasing the tileset SheetSize parameter.");
|
||||||
allocated = true;
|
allocated = true;
|
||||||
|
|
||||||
return new Sheet(type, new Size(tileset.SheetSize, tileset.SheetSize));
|
return new Sheet(SheetType.Indexed, new Size(tileset.SheetSize, tileset.SheetSize));
|
||||||
};
|
};
|
||||||
|
|
||||||
sheetBuilder = new SheetBuilder(type, allocate);
|
sheetBuilder = new SheetBuilder(SheetType.Indexed, allocate);
|
||||||
random = new MersenneTwister();
|
random = new MersenneTwister();
|
||||||
|
|
||||||
var frameCache = new FrameCache(Game.ModData.DefaultFileSystem, Game.ModData.SpriteLoaders);
|
var frameCache = new FrameCache(Game.ModData.DefaultFileSystem, Game.ModData.SpriteLoaders);
|
||||||
@@ -71,10 +70,17 @@ namespace OpenRA.Graphics
|
|||||||
{
|
{
|
||||||
var f = allFrames[j];
|
var f = allFrames[j];
|
||||||
var s = sheetBuilder.Allocate(f.Size, f.Offset);
|
var s = sheetBuilder.Allocate(f.Size, f.Offset);
|
||||||
Util.FastCopyIntoChannel(s, 0, f.Data);
|
Util.FastCopyIntoChannel(s, f.Data);
|
||||||
|
|
||||||
if (tileset.EnableDepth)
|
if (tileset.EnableDepth)
|
||||||
Util.FastCopyIntoChannel(s, 1, allFrames[j + frameCount].Data);
|
{
|
||||||
|
var ss = sheetBuilder.Allocate(f.Size, f.Offset);
|
||||||
|
Util.FastCopyIntoChannel(ss, allFrames[j + frameCount].Data);
|
||||||
|
|
||||||
|
// s and ss are guaranteed to use the same sheet
|
||||||
|
// because of the custom terrain sheet allocation
|
||||||
|
s = new SpriteWithSecondaryData(s, ss.Bounds, ss.Channel);
|
||||||
|
}
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}).ToArray());
|
}).ToArray());
|
||||||
|
|||||||
@@ -31,25 +31,36 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
public static void FastCreateQuad(Vertex[] vertices, float3 a, float3 b, float3 c, float3 d, Sprite r, float paletteTextureIndex, int nv)
|
public static void FastCreateQuad(Vertex[] vertices, float3 a, float3 b, float3 c, float3 d, Sprite r, float paletteTextureIndex, int nv)
|
||||||
{
|
{
|
||||||
|
float sl = 0;
|
||||||
|
float st = 0;
|
||||||
|
float sr = 0;
|
||||||
|
float sb = 0;
|
||||||
var attribC = ChannelSelect[(int)r.Channel];
|
var attribC = ChannelSelect[(int)r.Channel];
|
||||||
if (r.Sheet.Type == SheetType.DualIndexed)
|
|
||||||
attribC *= -1;
|
|
||||||
|
|
||||||
vertices[nv] = new Vertex(a, r.Left, r.Top, paletteTextureIndex, attribC);
|
var ss = r as SpriteWithSecondaryData;
|
||||||
vertices[nv + 1] = new Vertex(b, r.Right, r.Top, paletteTextureIndex, attribC);
|
if (ss != null)
|
||||||
vertices[nv + 2] = new Vertex(c, r.Right, r.Bottom, paletteTextureIndex, attribC);
|
{
|
||||||
vertices[nv + 3] = new Vertex(c, r.Right, r.Bottom, paletteTextureIndex, attribC);
|
sl = ss.SecondaryLeft;
|
||||||
vertices[nv + 4] = new Vertex(d, r.Left, r.Bottom, paletteTextureIndex, attribC);
|
st = ss.SecondaryTop;
|
||||||
vertices[nv + 5] = new Vertex(a, r.Left, r.Top, paletteTextureIndex, attribC);
|
sr = ss.SecondaryRight;
|
||||||
|
sb = ss.SecondaryBottom;
|
||||||
|
attribC = -(attribC + ChannelSelect[(int)ss.Channel] / 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
vertices[nv] = new Vertex(a, r.Left, r.Top, sl, st, paletteTextureIndex, attribC);
|
||||||
|
vertices[nv + 1] = new Vertex(b, r.Right, r.Top, sr, st, paletteTextureIndex, attribC);
|
||||||
|
vertices[nv + 2] = new Vertex(c, r.Right, r.Bottom, sr, sb, paletteTextureIndex, attribC);
|
||||||
|
vertices[nv + 3] = new Vertex(c, r.Right, r.Bottom, sr, sb, paletteTextureIndex, attribC);
|
||||||
|
vertices[nv + 4] = new Vertex(d, r.Left, r.Bottom, sl, sb, paletteTextureIndex, attribC);
|
||||||
|
vertices[nv + 5] = new Vertex(a, r.Left, r.Top, sl, st, paletteTextureIndex, attribC);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void FastCopyIntoChannel(Sprite dest, byte[] src) { FastCopyIntoChannel(dest, 0, src); }
|
public static void FastCopyIntoChannel(Sprite dest, byte[] src)
|
||||||
public static void FastCopyIntoChannel(Sprite dest, int channelOffset, byte[] src)
|
|
||||||
{
|
{
|
||||||
var data = dest.Sheet.GetData();
|
var data = dest.Sheet.GetData();
|
||||||
var srcStride = dest.Bounds.Width;
|
var srcStride = dest.Bounds.Width;
|
||||||
var destStride = dest.Sheet.Size.Width * 4;
|
var destStride = dest.Sheet.Size.Width * 4;
|
||||||
var destOffset = destStride * dest.Bounds.Top + dest.Bounds.Left * 4 + ChannelMasks[(int)dest.Channel + channelOffset];
|
var destOffset = destStride * dest.Bounds.Top + dest.Bounds.Left * 4 + ChannelMasks[(int)dest.Channel];
|
||||||
var destSkip = destStride - 4 * srcStride;
|
var destSkip = destStride - 4 * srcStride;
|
||||||
var height = dest.Bounds.Height;
|
var height = dest.Bounds.Height;
|
||||||
|
|
||||||
|
|||||||
@@ -16,14 +16,15 @@ namespace OpenRA.Graphics
|
|||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
public struct Vertex
|
public struct Vertex
|
||||||
{
|
{
|
||||||
public readonly float X, Y, Z, U, V, P, C;
|
public readonly float X, Y, Z, S, T, U, V, P, C;
|
||||||
|
|
||||||
public Vertex(float3 xyz, float u, float v, float p, float c)
|
public Vertex(float3 xyz, float s, float t, float u, float v, float p, float c)
|
||||||
: this(xyz.X, xyz.Y, xyz.Z, u, v, p, c) { }
|
: this(xyz.X, xyz.Y, xyz.Z, s, t, u, v, p, c) { }
|
||||||
|
|
||||||
public Vertex(float x, float y, float z, float u, float v, float p, float c)
|
public Vertex(float x, float y, float z, float s, float t, float u, float v, float p, float c)
|
||||||
{
|
{
|
||||||
X = x; Y = y; Z = z;
|
X = x; Y = y; Z = z;
|
||||||
|
S = s; T = t;
|
||||||
U = u; V = v;
|
U = u; V = v;
|
||||||
P = p; C = c;
|
P = p; C = c;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,10 +54,10 @@ namespace OpenRA.Graphics
|
|||||||
if (allocated)
|
if (allocated)
|
||||||
throw new SheetOverflowException("");
|
throw new SheetOverflowException("");
|
||||||
allocated = true;
|
allocated = true;
|
||||||
return SheetBuilder.AllocateSheet(SheetType.DualIndexed, Game.Settings.Graphics.SheetSize);
|
return SheetBuilder.AllocateSheet(SheetType.Indexed, Game.Settings.Graphics.SheetSize);
|
||||||
};
|
};
|
||||||
|
|
||||||
return new SheetBuilder(SheetType.DualIndexed, allocate);
|
return new SheetBuilder(SheetType.Indexed, allocate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public VoxelLoader(IReadOnlyFileSystem fileSystem)
|
public VoxelLoader(IReadOnlyFileSystem fileSystem)
|
||||||
@@ -78,6 +78,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
var c = 0;
|
var c = 0;
|
||||||
for (var v = 0; v < sv; v++)
|
for (var v = 0; v < sv; v++)
|
||||||
|
{
|
||||||
for (var u = 0; u < su; u++)
|
for (var u = 0; u < su; u++)
|
||||||
{
|
{
|
||||||
var voxel = first(u, v) ?? second(u, v);
|
var voxel = first(u, v) ?? second(u, v);
|
||||||
@@ -85,22 +86,28 @@ namespace OpenRA.Graphics
|
|||||||
normals[c] = voxel == null ? (byte)0 : voxel.Normal;
|
normals[c] = voxel == null ? (byte)0 : voxel.Normal;
|
||||||
c++;
|
c++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var s = sheetBuilder.Allocate(new Size(su, sv));
|
var size = new Size(su, sv);
|
||||||
Util.FastCopyIntoChannel(s, 0, colors);
|
var s = sheetBuilder.Allocate(size);
|
||||||
Util.FastCopyIntoChannel(s, 1, normals);
|
var t = sheetBuilder.Allocate(size);
|
||||||
|
Util.FastCopyIntoChannel(s, colors);
|
||||||
|
Util.FastCopyIntoChannel(t, normals);
|
||||||
|
|
||||||
|
// s and t are guaranteed to use the same sheet because
|
||||||
|
// of the custom voxel sheet allocation implementation
|
||||||
s.Sheet.CommitBufferedData();
|
s.Sheet.CommitBufferedData();
|
||||||
|
|
||||||
var channelP = ChannelSelect[(int)s.Channel];
|
var channelP = ChannelSelect[(int)s.Channel];
|
||||||
var channelC = ChannelSelect[(int)s.Channel + 1];
|
var channelC = ChannelSelect[(int)t.Channel];
|
||||||
return new Vertex[6]
|
return new Vertex[6]
|
||||||
{
|
{
|
||||||
new Vertex(coord(0, 0), s.Left, s.Top, channelP, channelC),
|
new Vertex(coord(0, 0), s.Left, s.Top, t.Left, t.Top, channelP, channelC),
|
||||||
new Vertex(coord(su, 0), s.Right, s.Top, channelP, channelC),
|
new Vertex(coord(su, 0), s.Right, s.Top, t.Right, t.Top, channelP, channelC),
|
||||||
new Vertex(coord(su, sv), s.Right, s.Bottom, channelP, channelC),
|
new Vertex(coord(su, sv), s.Right, s.Bottom, t.Right, t.Bottom, channelP, channelC),
|
||||||
new Vertex(coord(su, sv), s.Right, s.Bottom, channelP, channelC),
|
new Vertex(coord(su, sv), s.Right, s.Bottom, t.Right, t.Bottom, channelP, channelC),
|
||||||
new Vertex(coord(0, sv), s.Left, s.Bottom, channelP, channelC),
|
new Vertex(coord(0, sv), s.Left, s.Bottom, t.Left, t.Bottom, channelP, channelC),
|
||||||
new Vertex(coord(0, 0), s.Left, s.Top, channelP, channelC)
|
new Vertex(coord(0, 0), s.Left, s.Top, t.Left, t.Top, channelP, channelC)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -332,7 +332,7 @@ namespace OpenRA.Graphics
|
|||||||
|
|
||||||
var size = new Size(renderer.SheetSize, renderer.SheetSize);
|
var size = new Size(renderer.SheetSize, renderer.SheetSize);
|
||||||
var framebuffer = renderer.Device.CreateFrameBuffer(size);
|
var framebuffer = renderer.Device.CreateFrameBuffer(size);
|
||||||
var sheet = new Sheet(SheetType.DualIndexed, framebuffer.Texture);
|
var sheet = new Sheet(SheetType.BGRA, framebuffer.Texture);
|
||||||
mappedBuffers.Add(sheet, framebuffer);
|
mappedBuffers.Add(sheet, framebuffer);
|
||||||
|
|
||||||
return sheet;
|
return sheet;
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ namespace OpenRA.Platforms.Default
|
|||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
OpenGL.glEnableVertexAttribArray(Shader.TexCoordAttributeIndex);
|
OpenGL.glEnableVertexAttribArray(Shader.TexCoordAttributeIndex);
|
||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
|
OpenGL.glEnableVertexAttribArray(Shader.TexMetadataAttributeIndex);
|
||||||
|
OpenGL.CheckGLError();
|
||||||
|
|
||||||
SDL.SDL_SetModState(SDL.SDL_Keymod.KMOD_NONE);
|
SDL.SDL_SetModState(SDL.SDL_Keymod.KMOD_NONE);
|
||||||
input = new Sdl2Input();
|
input = new Sdl2Input();
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ namespace OpenRA.Platforms.Default
|
|||||||
{
|
{
|
||||||
public const int VertexPosAttributeIndex = 0;
|
public const int VertexPosAttributeIndex = 0;
|
||||||
public const int TexCoordAttributeIndex = 1;
|
public const int TexCoordAttributeIndex = 1;
|
||||||
|
public const int TexMetadataAttributeIndex = 2;
|
||||||
|
|
||||||
readonly Dictionary<string, int> samplers = new Dictionary<string, int>();
|
readonly Dictionary<string, int> samplers = new Dictionary<string, int>();
|
||||||
readonly Dictionary<int, ITexture> textures = new Dictionary<int, ITexture>();
|
readonly Dictionary<int, ITexture> textures = new Dictionary<int, ITexture>();
|
||||||
@@ -73,7 +74,8 @@ namespace OpenRA.Platforms.Default
|
|||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
OpenGL.glBindAttribLocation(program, TexCoordAttributeIndex, "aVertexTexCoord");
|
OpenGL.glBindAttribLocation(program, TexCoordAttributeIndex, "aVertexTexCoord");
|
||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
|
OpenGL.glBindAttribLocation(program, TexMetadataAttributeIndex, "aVertexTexMetadata");
|
||||||
|
OpenGL.CheckGLError();
|
||||||
OpenGL.glAttachShader(program, vertexShader);
|
OpenGL.glAttachShader(program, vertexShader);
|
||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
OpenGL.glAttachShader(program, fragmentShader);
|
OpenGL.glAttachShader(program, fragmentShader);
|
||||||
|
|||||||
@@ -87,6 +87,8 @@ namespace OpenRA.Platforms.Default
|
|||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
OpenGL.glVertexAttribPointer(Shader.TexCoordAttributeIndex, 4, OpenGL.GL_FLOAT, false, VertexSize, new IntPtr(12));
|
OpenGL.glVertexAttribPointer(Shader.TexCoordAttributeIndex, 4, OpenGL.GL_FLOAT, false, VertexSize, new IntPtr(12));
|
||||||
OpenGL.CheckGLError();
|
OpenGL.CheckGLError();
|
||||||
|
OpenGL.glVertexAttribPointer(Shader.TexMetadataAttributeIndex, 2, OpenGL.GL_FLOAT, false, VertexSize, new IntPtr(28));
|
||||||
|
OpenGL.CheckGLError();
|
||||||
}
|
}
|
||||||
|
|
||||||
~VertexBuffer()
|
~VertexBuffer()
|
||||||
|
|||||||
@@ -4,13 +4,14 @@ uniform bool EnableDepthPreview;
|
|||||||
uniform float DepthTextureScale;
|
uniform float DepthTextureScale;
|
||||||
|
|
||||||
varying vec4 vTexCoord;
|
varying vec4 vTexCoord;
|
||||||
|
varying vec2 vTexMetadata;
|
||||||
varying vec4 vChannelMask;
|
varying vec4 vChannelMask;
|
||||||
varying vec4 vDepthMask;
|
varying vec4 vDepthMask;
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
vec4 x = texture2D(DiffuseTexture, vTexCoord.st);
|
vec4 x = texture2D(DiffuseTexture, vTexCoord.st);
|
||||||
vec2 p = vec2(dot(x, vChannelMask), vTexCoord.p);
|
vec2 p = vec2(dot(x, vChannelMask), vTexMetadata.s);
|
||||||
vec4 c = texture2D(Palette, p);
|
vec4 c = texture2D(Palette, p);
|
||||||
|
|
||||||
// Discard any transparent fragments (both color and depth)
|
// Discard any transparent fragments (both color and depth)
|
||||||
@@ -20,8 +21,8 @@ void main()
|
|||||||
float depth = gl_FragCoord.z;
|
float depth = gl_FragCoord.z;
|
||||||
if (length(vDepthMask) > 0.0)
|
if (length(vDepthMask) > 0.0)
|
||||||
{
|
{
|
||||||
// Preview vertex aware depth
|
vec4 y = texture2D(DiffuseTexture, vTexCoord.pq);
|
||||||
depth = depth + DepthTextureScale * dot(x, vDepthMask);
|
depth = depth + DepthTextureScale * dot(y, vDepthMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert to window coords
|
// Convert to window coords
|
||||||
|
|||||||
@@ -3,41 +3,35 @@ uniform vec3 r1, r2;
|
|||||||
|
|
||||||
attribute vec4 aVertexPosition;
|
attribute vec4 aVertexPosition;
|
||||||
attribute vec4 aVertexTexCoord;
|
attribute vec4 aVertexTexCoord;
|
||||||
|
attribute vec2 aVertexTexMetadata;
|
||||||
varying vec4 vTexCoord;
|
varying vec4 vTexCoord;
|
||||||
|
varying vec2 vTexMetadata;
|
||||||
varying vec4 vChannelMask;
|
varying vec4 vChannelMask;
|
||||||
varying vec4 vDepthMask;
|
varying vec4 vDepthMask;
|
||||||
|
|
||||||
vec4 DecodeChannelMask(float x)
|
vec4 DecodeChannelMask(float x)
|
||||||
{
|
{
|
||||||
float y = abs(x);
|
if (x > 0.7)
|
||||||
if (y > 0.7)
|
|
||||||
return vec4(0,0,0,1);
|
return vec4(0,0,0,1);
|
||||||
if (y > 0.5)
|
if (x > 0.5)
|
||||||
return vec4(0,0,1,0);
|
return vec4(0,0,1,0);
|
||||||
if (y > 0.3)
|
if (x > 0.3)
|
||||||
return vec4(0,1,0,0);
|
return vec4(0,1,0,0);
|
||||||
else
|
else
|
||||||
return vec4(1,0,0,0);
|
return vec4(1,0,0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 DecodeDepthChannelMask(float x)
|
|
||||||
{
|
|
||||||
if (x > 0.0)
|
|
||||||
return vec4(0,0,0,0);
|
|
||||||
if (x < -0.7)
|
|
||||||
return vec4(1,0,0,0);
|
|
||||||
if (x < -0.5)
|
|
||||||
return vec4(0,0,0,1);
|
|
||||||
if (x < -0.3)
|
|
||||||
return vec4(0,0,1,0);
|
|
||||||
else
|
|
||||||
return vec4(0,1,0,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
gl_Position = vec4((aVertexPosition.xyz - Scroll.xyz) * r1 + r2, 1);
|
gl_Position = vec4((aVertexPosition.xyz - Scroll.xyz) * r1 + r2, 1);
|
||||||
vTexCoord = aVertexTexCoord;
|
vTexCoord = aVertexTexCoord;
|
||||||
vChannelMask = DecodeChannelMask(aVertexTexCoord.w);
|
vTexMetadata = aVertexTexMetadata;
|
||||||
vDepthMask = DecodeDepthChannelMask(aVertexTexCoord.w);
|
vChannelMask = DecodeChannelMask(abs(aVertexTexMetadata.t));
|
||||||
|
if (aVertexTexMetadata.t < 0.0)
|
||||||
|
{
|
||||||
|
float x = -aVertexTexMetadata.t * 10.0;
|
||||||
|
vDepthMask = DecodeChannelMask(x - floor(x));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
vDepthMask = vec4(0,0,0,0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ void main()
|
|||||||
if (color.a < 0.01)
|
if (color.a < 0.01)
|
||||||
discard;
|
discard;
|
||||||
|
|
||||||
vec4 normal = (2.0 * texture2D(Palette, vec2(dot(x, vNormalsMask), PaletteRows.y)) - 1.0);
|
vec4 y = texture2D(DiffuseTexture, vTexCoord.pq);
|
||||||
|
vec4 normal = (2.0 * texture2D(Palette, vec2(dot(y, vNormalsMask), PaletteRows.y)) - 1.0);
|
||||||
vec3 intensity = AmbientLight + DiffuseLight * max(dot(normal, LightDirection), 0.0);
|
vec3 intensity = AmbientLight + DiffuseLight * max(dot(normal, LightDirection), 0.0);
|
||||||
gl_FragColor = vec4(intensity * color.rgb, color.a);
|
gl_FragColor = vec4(intensity * color.rgb, color.a);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ uniform mat4 TransformMatrix;
|
|||||||
|
|
||||||
attribute vec4 aVertexPosition;
|
attribute vec4 aVertexPosition;
|
||||||
attribute vec4 aVertexTexCoord;
|
attribute vec4 aVertexTexCoord;
|
||||||
|
attribute vec2 aVertexTexMetadata;
|
||||||
varying vec4 vTexCoord;
|
varying vec4 vTexCoord;
|
||||||
varying vec4 vChannelMask;
|
varying vec4 vChannelMask;
|
||||||
varying vec4 vNormalsMask;
|
varying vec4 vNormalsMask;
|
||||||
@@ -19,6 +20,6 @@ void main()
|
|||||||
{
|
{
|
||||||
gl_Position = View*TransformMatrix*aVertexPosition;
|
gl_Position = View*TransformMatrix*aVertexPosition;
|
||||||
vTexCoord = aVertexTexCoord;
|
vTexCoord = aVertexTexCoord;
|
||||||
vChannelMask = DecodeMask(aVertexTexCoord.z);
|
vChannelMask = DecodeMask(aVertexTexMetadata.s);
|
||||||
vNormalsMask = DecodeMask(aVertexTexCoord.w);
|
vNormalsMask = DecodeMask(aVertexTexMetadata.t);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user