git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1191 993157c7-ee19-0410-b2c4-bb4e9862e678
This commit is contained in:
chrisf
2007-07-13 09:36:58 +00:00
parent d37bab15d0
commit cb54dbf81b
7 changed files with 49 additions and 22 deletions

View File

@@ -59,12 +59,27 @@ namespace OpenRa.FileFormats
public readonly Point origin;
public readonly Size size;
public readonly T sheet;
public readonly TextureChannel channel;
internal SheetRectangle(T sheet, Point origin, Size size)
internal SheetRectangle(T sheet, Point origin, Size size, TextureChannel channel)
{
this.origin = origin;
this.size = size;
this.sheet = sheet;
this.channel = channel;
}
internal SheetRectangle(T sheet, Point origin, Size size)
: this(sheet, origin, size, TextureChannel.Red)
{
}
}
public enum TextureChannel
{
Red,
Green,
Blue,
Alpha,
}
}

View File

@@ -11,6 +11,7 @@ namespace OpenRa.Game
abstract class Actor
{
public PointF location;
public int palette;
public abstract SheetRectangle<Sheet>[] CurrentImages { get; }
}
}

View File

@@ -39,7 +39,7 @@ namespace OpenRa.Game
Provider<Sheet> sheetProvider = delegate
{
Sheet t = new Sheet(new Bitmap(pageSize.Width, pageSize.Height), renderer.Device);
Sheet t = new Sheet(pageSize, renderer.Device);
sheets.Add(t);
return t;
};
@@ -90,7 +90,7 @@ namespace OpenRa.Game
if (!indexMap.TryGetValue(tile.sheet, out indexList))
indexMap.Add(tile.sheet, indexList = new List<ushort>());
Util.CreateQuad(vertices, indexList, new PointF(24 * i, 24 * j), tile);
Util.CreateQuad(vertices, indexList, new PointF(24 * i, 24 * j), tile, 0);
}
vertexBuffer = new FvfVertexBuffer<Vertex>(renderer.Device, vertices.Count, Vertex.Format);

View File

@@ -11,6 +11,7 @@ namespace OpenRa.Game
public Mcv( PointF location )
{
this.location = location;
this.palette = 3;
}
int GetFacing()

View File

@@ -15,8 +15,6 @@ namespace OpenRa.Game
readonly GraphicsDevice device;
Texture texture;
public Sheet(Bitmap b, GraphicsDevice d) { bitmap = b; device = d; }
public Sheet(Size size, GraphicsDevice d)
{
bitmap = new Bitmap(size.Width, size.Height);

View File

@@ -24,13 +24,33 @@ namespace OpenRa.Game
return (v > 0) ? v1 : v0;
}
public static Vertex MakeVertex(PointF o, float u, float v, SheetRectangle<Sheet> r)
static PointF EncodeVertexAttributes(TextureChannel channel, int paletteLine)
{
Converter<TextureChannel, float> channelEncoder = delegate(TextureChannel c)
{
switch (c)
{
case TextureChannel.Red: return 0.75f;
case TextureChannel.Green: return 0.25f;
case TextureChannel.Blue: return -0.25f;
case TextureChannel.Alpha: return -0.75f;
default:
throw new ArgumentException();
}
};
return new PointF(paletteLine / 16.0f, channelEncoder(channel));
}
public static Vertex MakeVertex(PointF o, float u, float v, SheetRectangle<Sheet> r, int palette)
{
float x2 = o.X + r.size.Width;
float y2 = o.Y + r.size.Height;
return new Vertex(Lerp(o.X, x2, u), Lerp(o.Y, y2, v), 0, U(r, u), V(r, v),
0, 1);
PointF p = EncodeVertexAttributes(r.channel, palette);
return new Vertex(Lerp(o.X, x2, u), Lerp(o.Y, y2, v), 0, U(r, u), V(r, v),
p.X, p.Y);
}
static float Lerp(float a, float b, float t)
@@ -38,14 +58,14 @@ namespace OpenRa.Game
return (1 - t) * a + t * b;
}
public static void CreateQuad(List<Vertex> vertices, List<ushort> indices, PointF o, SheetRectangle<Sheet> r)
public static void CreateQuad(List<Vertex> vertices, List<ushort> indices, PointF o, SheetRectangle<Sheet> r, int palette)
{
ushort offset = (ushort)vertices.Count;
vertices.Add(Util.MakeVertex(o, 0, 0, r));
vertices.Add(Util.MakeVertex(o, 1, 0, r));
vertices.Add(Util.MakeVertex(o, 0, 1, r));
vertices.Add(Util.MakeVertex(o, 1, 1, r));
vertices.Add(Util.MakeVertex(o, 0, 0, r, palette));
vertices.Add(Util.MakeVertex(o, 1, 0, r, palette));
vertices.Add(Util.MakeVertex(o, 0, 1, r, palette));
vertices.Add(Util.MakeVertex(o, 1, 1, r, palette));
indices.Add(offset);
indices.Add((ushort)(offset + 1));
@@ -82,12 +102,4 @@ namespace OpenRa.Game
}
}
}
enum TextureChannel
{
Red,
Green,
Blue,
Alpha,
}
}

View File

@@ -61,7 +61,7 @@ namespace OpenRa.Game
}
sheet = image.sheet;
Util.CreateQuad(vertices, indices, a.location, image);
Util.CreateQuad(vertices, indices, a.location, image, a.palette);
if (++sprites >= spritesPerBatch)
{