wow, it works!
git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1190 993157c7-ee19-0410-b2c4-bb4e9862e678
This commit is contained in:
@@ -24,7 +24,7 @@ namespace OpenRa.Game
|
||||
this.device = device;
|
||||
}
|
||||
|
||||
public void Resolve()
|
||||
void Resolve()
|
||||
{
|
||||
const string filename = "../../../palette-cache.png";
|
||||
bitmap.Save(filename);
|
||||
|
||||
@@ -53,27 +53,25 @@ namespace OpenRa.Game
|
||||
|
||||
if (!tileMapping.ContainsKey(tileRef))
|
||||
{
|
||||
Bitmap srcImage = tileSet.tiles[tileRef.tile].GetTile(tileRef.image);
|
||||
SheetRectangle<Sheet> rect = builder.AddImage(srcImage.Size);
|
||||
|
||||
using (Graphics g = Graphics.FromImage(rect.sheet.bitmap))
|
||||
g.DrawImage(srcImage, rect.origin);
|
||||
SheetRectangle<Sheet> rect = builder.AddImage(new Size(24, 24));
|
||||
Util.CopyIntoChannel(rect.sheet.bitmap, TextureChannel.Red,
|
||||
tileSet.tiles[tileRef.tile].TileBitmapBytes[tileRef.image], rect);
|
||||
|
||||
tileMapping.Add(tileRef, rect);
|
||||
}
|
||||
}
|
||||
|
||||
world = new World(renderer.Device);
|
||||
treeCache = new TreeCache(renderer.Device, map, TileMix, pal);
|
||||
treeCache = new TreeCache(renderer.Device, map, TileMix);
|
||||
|
||||
foreach (TreeReference treeReference in map.Trees)
|
||||
world.Add(new Tree(treeReference, treeCache, map));
|
||||
|
||||
UnitSheetBuilder.Initialize(renderer.Device);
|
||||
UnitSheetBuilder.AddUnit("mcv", playerPal);
|
||||
UnitSheetBuilder.AddUnit("1tnk", playerPal);
|
||||
UnitSheetBuilder.AddUnit("2tnk", playerPal);
|
||||
UnitSheetBuilder.AddUnit("3tnk", playerPal);
|
||||
UnitSheetBuilder.AddUnit("mcv");
|
||||
UnitSheetBuilder.AddUnit("1tnk");
|
||||
UnitSheetBuilder.AddUnit("2tnk");
|
||||
UnitSheetBuilder.AddUnit("3tnk");
|
||||
|
||||
world.Add(new Mcv(new PointF(24 * 5, 24 * 5)));
|
||||
}
|
||||
@@ -226,7 +224,7 @@ namespace OpenRa.Game
|
||||
hardwarePalette.AddPalette(new Palette(pal, new PaletteRemap(
|
||||
File.OpenRead("../../../" + remap + ".rem"))));
|
||||
|
||||
hardwarePalette.Resolve();
|
||||
renderer.SetPalette(hardwarePalette);
|
||||
|
||||
return new TileSet(TileMix, TileSuffix, pal);
|
||||
}
|
||||
|
||||
@@ -13,10 +13,15 @@ namespace OpenRa.Game
|
||||
readonly GraphicsDevice device;
|
||||
readonly Effect shader;
|
||||
|
||||
readonly IntPtr r1Handle, r2Handle, baseTextureHandle, scrollHandle;
|
||||
readonly IntPtr r1Handle, r2Handle, baseTextureHandle, scrollHandle, paletteHandle;
|
||||
|
||||
const string shaderName = "diffuse.fx";
|
||||
|
||||
public void SetPalette(HardwarePalette hp)
|
||||
{
|
||||
shader.SetTexture(paletteHandle, hp.PaletteTexture);
|
||||
}
|
||||
|
||||
public Renderer(Control host, Size resolution, bool windowed)
|
||||
{
|
||||
host.ClientSize = resolution;
|
||||
@@ -30,6 +35,7 @@ namespace OpenRa.Game
|
||||
scrollHandle = shader.GetHandle("Scroll");
|
||||
r1Handle = shader.GetHandle("r1");
|
||||
r2Handle = shader.GetHandle("r2");
|
||||
paletteHandle = shader.GetHandle("Palette");
|
||||
}
|
||||
|
||||
public GraphicsDevice Device { get { return device; } }
|
||||
|
||||
@@ -16,6 +16,15 @@ namespace OpenRa.Game
|
||||
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);
|
||||
device = d;
|
||||
|
||||
using (Graphics g = Graphics.FromImage(bitmap))
|
||||
g.FillRectangle(Brushes.Fuchsia, 0, 0, size.Width, size.Height);
|
||||
}
|
||||
|
||||
public Texture Texture
|
||||
{
|
||||
|
||||
@@ -13,14 +13,14 @@ namespace OpenRa.Game
|
||||
|
||||
public readonly Sheet sh;
|
||||
|
||||
public TreeCache(GraphicsDevice device, Map map, Package package, Palette pal)
|
||||
public TreeCache(GraphicsDevice device, Map map, Package package)
|
||||
{
|
||||
Size pageSize = new Size(1024, 512);
|
||||
List<Sheet> sheets = new List<Sheet>();
|
||||
|
||||
Provider<Sheet> sheetProvider = delegate
|
||||
{
|
||||
Sheet sheet = new Sheet(new Bitmap(pageSize.Width, pageSize.Height), device);
|
||||
Sheet sheet = new Sheet(pageSize, device);
|
||||
sheets.Add(sheet);
|
||||
return sheet;
|
||||
};
|
||||
@@ -32,13 +32,11 @@ namespace OpenRa.Game
|
||||
if (trees.ContainsKey(r.Image))
|
||||
continue;
|
||||
|
||||
ShpReader reader = new ShpReader(package.GetContent(r.Image + "." + map.Theater.Substring(0, 3)));
|
||||
Bitmap bitmap = BitmapBuilder.FromBytes(reader[0].Image, reader.Width, reader.Height, pal);
|
||||
|
||||
SheetRectangle<Sheet> rect = builder.AddImage(bitmap.Size);
|
||||
using (Graphics g = Graphics.FromImage(rect.sheet.bitmap))
|
||||
g.DrawImage(bitmap, rect.origin);
|
||||
string filename = r.Image + "." + map.Theater.Substring(0, 3);
|
||||
|
||||
ShpReader reader = new ShpReader(package.GetContent(filename));
|
||||
SheetRectangle<Sheet> rect = builder.AddImage(reader.Size);
|
||||
Util.CopyIntoChannel(rect.sheet.bitmap, TextureChannel.Red, reader[0].Image, rect);
|
||||
trees.Add(r.Image, rect);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace OpenRa.Game
|
||||
{
|
||||
Provider<Sheet> sheetProvider = delegate
|
||||
{
|
||||
Sheet sheet = new Sheet(new Bitmap(pageSize.Width, pageSize.Height), device);
|
||||
Sheet sheet = new Sheet(pageSize, device);
|
||||
sheets.Add(sheet);
|
||||
return sheet;
|
||||
};
|
||||
@@ -28,17 +28,13 @@ namespace OpenRa.Game
|
||||
builder = new TileSheetBuilder<Sheet>(pageSize, sheetProvider);
|
||||
}
|
||||
|
||||
public static void AddUnit( string name, Palette pal )
|
||||
public static void AddUnit( string name )
|
||||
{
|
||||
ShpReader reader = new ShpReader( unitsPackage.GetContent( name + ".shp" ) );
|
||||
foreach( ImageHeader h in reader )
|
||||
{
|
||||
Bitmap bitmap = BitmapBuilder.FromBytes( h.Image, reader.Width, reader.Height, pal );
|
||||
|
||||
SheetRectangle<Sheet> rect = builder.AddImage( bitmap.Size );
|
||||
using( Graphics g = Graphics.FromImage( rect.sheet.bitmap ) )
|
||||
g.DrawImage( bitmap, rect.origin );
|
||||
|
||||
SheetRectangle<Sheet> rect = builder.AddImage(reader.Size);
|
||||
Util.CopyIntoChannel(rect.sheet.bitmap, TextureChannel.Red, h.Image, rect);
|
||||
McvSheet.Add( rect );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace OpenRa.Game
|
||||
float u0 = (float)(s.origin.X + 0.5f) / (float)s.sheet.bitmap.Width;
|
||||
float u1 = (float)(s.origin.X + s.size.Width) / (float)s.sheet.bitmap.Width;
|
||||
|
||||
return (u > 0) ? u1 : u0;// (1 - u) * u0 + u * u1;
|
||||
return (u > 0) ? u1 : u0;
|
||||
}
|
||||
|
||||
public static float V(SheetRectangle<Sheet> s, float v)
|
||||
@@ -21,7 +21,7 @@ namespace OpenRa.Game
|
||||
float v0 = (float)(s.origin.Y + 0.5f) / (float)s.sheet.bitmap.Height;
|
||||
float v1 = (float)(s.origin.Y + s.size.Height) / (float)s.sheet.bitmap.Height;
|
||||
|
||||
return (v > 0) ? v1 : v0;// return (1 - v) * v0 + v * v1;
|
||||
return (v > 0) ? v1 : v0;
|
||||
}
|
||||
|
||||
public static Vertex MakeVertex(PointF o, float u, float v, SheetRectangle<Sheet> r)
|
||||
@@ -29,7 +29,8 @@ namespace OpenRa.Game
|
||||
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));
|
||||
return new Vertex(Lerp(o.X, x2, u), Lerp(o.Y, y2, v), 0, U(r, u), V(r, v),
|
||||
0, 1);
|
||||
}
|
||||
|
||||
static float Lerp(float a, float b, float t)
|
||||
@@ -54,5 +55,39 @@ namespace OpenRa.Game
|
||||
indices.Add((ushort)(offset + 3));
|
||||
indices.Add((ushort)(offset + 2));
|
||||
}
|
||||
|
||||
public static void CopyIntoChannel(Bitmap bitmap, TextureChannel channel, byte[] src, SheetRectangle<Sheet> s)
|
||||
{
|
||||
for( int i = 0; i < s.size.Width; i++ )
|
||||
for (int j = 0; j < s.size.Height; j++)
|
||||
{
|
||||
Point p = new Point(s.origin.X + i, s.origin.Y + j);
|
||||
byte b = src[i + s.size.Width * j];
|
||||
Color original = bitmap.GetPixel(p.X, p.Y);
|
||||
bitmap.SetPixel(p.X, p.Y, ReplaceChannel(original, channel, b));
|
||||
}
|
||||
}
|
||||
|
||||
static Color ReplaceChannel(Color o, TextureChannel channel, byte p)
|
||||
{
|
||||
switch (channel)
|
||||
{
|
||||
case TextureChannel.Red: return Color.FromArgb(o.A, p, o.G, o.B);
|
||||
case TextureChannel.Green: return Color.FromArgb(o.A, o.R, p, o.B);
|
||||
case TextureChannel.Blue: return Color.FromArgb(o.A, o.R, o.G, p);
|
||||
case TextureChannel.Alpha: return Color.FromArgb(p, o.R, o.G, o.B);
|
||||
|
||||
default:
|
||||
throw new ArgumentException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum TextureChannel
|
||||
{
|
||||
Red,
|
||||
Green,
|
||||
Blue,
|
||||
Alpha,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,14 +10,18 @@ namespace OpenRa.Game
|
||||
struct Vertex
|
||||
{
|
||||
public float x, y, z, u, v;
|
||||
public float p, c;
|
||||
|
||||
public Vertex(float x, float y, float z, float u, float v)
|
||||
public Vertex(float x, float y, float z, float u, float v, float p, float c)
|
||||
{
|
||||
this.x = x; this.y = y; this.z = z;
|
||||
this.u = u;
|
||||
this.v = v;
|
||||
|
||||
this.p = p;
|
||||
this.c = c;
|
||||
}
|
||||
|
||||
public const VertexFormat Format = VertexFormat.Position | VertexFormat.Texture;
|
||||
public const VertexFormat Format = VertexFormat.Position | VertexFormat.Texture2;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user