git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1195 993157c7-ee19-0410-b2c4-bb4e9862e678

This commit is contained in:
chrisf
2007-07-13 11:12:16 +00:00
parent 9ffe1d2845
commit d4a7e5fb9e
10 changed files with 102 additions and 100 deletions

View File

@@ -24,28 +24,26 @@ namespace OpenRa.FileFormats
if( countStr == null || startStr == null || pattern == null ) if( countStr == null || startStr == null || pattern == null )
break; break;
//try int count = int.Parse( countStr );
int start = int.Parse( startStr, NumberStyles.HexNumber );
for( int i = 0 ; i < count ; i++ )
{ {
int count = int.Parse( countStr ); Stream s;
int start = int.Parse( startStr, NumberStyles.HexNumber ); try
for( int i = 0 ; i < count ; i++ )
{ {
Stream s; s = mixFile.GetContent( string.Format( pattern, i + 1 ) );
try
{
s = mixFile.GetContent( string.Format( pattern, i + 1 ) );
}
catch { continue; }
Terrain t = new Terrain( s, pal );
if( tiles.ContainsKey( (ushort)( start + i ) ) )
continue;
tiles.Add( (ushort)( start + i ), t );
} }
catch { continue; }
Terrain t = new Terrain( s, pal );
if( tiles.ContainsKey( (ushort)( start + i ) ) )
continue;
tiles.Add( (ushort)( start + i ), t );
} }
//catch { }
} }
tileIdFile.Close(); tileIdFile.Close();
} }
public byte[] GetBytes(TileReference r) { return tiles[r.tile].TileBitmapBytes[r.image]; }
} }
} }

View File

@@ -21,6 +21,24 @@ namespace OpenRa.FileFormats
T current = null; T current = null;
int x = 0, y = 0, rowHeight = 0; int x = 0, y = 0, rowHeight = 0;
TextureChannel? channel;
TextureChannel? NextChannel(TextureChannel? t)
{
if (t == null)
return TextureChannel.Red;
if (t == TextureChannel.Red)
return TextureChannel.Green;
if (t == TextureChannel.Green)
return TextureChannel.Blue;
if (t == TextureChannel.Blue)
return TextureChannel.Alpha;
return null;
}
public SheetRectangle<T> AddImage(Size imageSize) public SheetRectangle<T> AddImage(Size imageSize)
{ {
@@ -28,7 +46,10 @@ namespace OpenRa.FileFormats
return null; return null;
if (current == null) if (current == null)
{
current = pageProvider(); current = pageProvider();
channel = NextChannel(null);
}
if (rowHeight == 0 || imageSize.Width + x > pageSize.Width) if (rowHeight == 0 || imageSize.Width + x > pageSize.Width)
{ {
@@ -42,11 +63,17 @@ namespace OpenRa.FileFormats
if (y + imageSize.Height > pageSize.Height) if (y + imageSize.Height > pageSize.Height)
{ {
current = pageProvider();
if (null == (channel = NextChannel(channel)))
{
current = pageProvider();
channel = NextChannel(channel);
}
x = y = rowHeight = 0; x = y = rowHeight = 0;
} }
SheetRectangle<T> rect = new SheetRectangle<T>(current, new Point(x, y), imageSize); SheetRectangle<T> rect = new SheetRectangle<T>(current, new Point(x, y), imageSize, channel.Value);
x += imageSize.Width; x += imageSize.Width;
return rect; return rect;
@@ -68,11 +95,6 @@ namespace OpenRa.FileFormats
this.sheet = sheet; this.sheet = sheet;
this.channel = channel; this.channel = channel;
} }
internal SheetRectangle(T sheet, Point origin, Size size)
: this(sheet, origin, size, TextureChannel.Red)
{
}
} }
public enum TextureChannel public enum TextureChannel

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using BluntDirectX.Direct3D;
using OpenRa.FileFormats;
namespace OpenRa.Game
{
static class CoreSheetBuilder
{
static TileSheetBuilder<Sheet> builder;
static Size pageSize = new Size(512,512);
public static void Initialize(GraphicsDevice device)
{
Provider<Sheet> sheetProvider = delegate { return new Sheet(pageSize, device); };
builder = new TileSheetBuilder<Sheet>(pageSize, sheetProvider);
}
public static SheetRectangle<Sheet> Add(byte[] src, Size size)
{
SheetRectangle<Sheet> rect = builder.AddImage(size);
Util.CopyIntoChannel(rect, src);
return rect;
}
}
}

View File

@@ -33,18 +33,7 @@ namespace OpenRa.Game
void LoadTextures() void LoadTextures()
{ {
List<Sheet> sheets = new List<Sheet>(); Size tileSize = new Size(24, 24);
Size pageSize = new Size(1024, 512);
Provider<Sheet> sheetProvider = delegate
{
Sheet t = new Sheet(pageSize, renderer.Device);
sheets.Add(t);
return t;
};
TileSheetBuilder<Sheet> builder = new TileSheetBuilder<Sheet>(pageSize, sheetProvider);
for (int i = 0; i < map.Width; i++) for (int i = 0; i < map.Width; i++)
for (int j = 0; j < map.Height; j++) for (int j = 0; j < map.Height; j++)
@@ -52,13 +41,7 @@ namespace OpenRa.Game
TileReference tileRef = map.MapTiles[i + map.XOffset, j + map.YOffset]; TileReference tileRef = map.MapTiles[i + map.XOffset, j + map.YOffset];
if (!tileMapping.ContainsKey(tileRef)) if (!tileMapping.ContainsKey(tileRef))
{ tileMapping.Add(tileRef, CoreSheetBuilder.Add(tileSet.GetBytes(tileRef), tileSize));
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); world = new World(renderer.Device);
@@ -67,7 +50,6 @@ namespace OpenRa.Game
foreach (TreeReference treeReference in map.Trees) foreach (TreeReference treeReference in map.Trees)
world.Add(new Tree(treeReference, treeCache, map)); world.Add(new Tree(treeReference, treeCache, map));
UnitSheetBuilder.Initialize(renderer.Device);
UnitSheetBuilder.AddUnit("mcv"); UnitSheetBuilder.AddUnit("mcv");
UnitSheetBuilder.AddUnit("1tnk"); UnitSheetBuilder.AddUnit("1tnk");
UnitSheetBuilder.AddUnit("2tnk"); UnitSheetBuilder.AddUnit("2tnk");
@@ -120,6 +102,8 @@ namespace OpenRa.Game
renderer = new Renderer(this, GetResolution(settings), false); renderer = new Renderer(this, GetResolution(settings), false);
Visible = true; Visible = true;
CoreSheetBuilder.Initialize(renderer.Device);
string mapName = settings.GetValue("map", "scm12ea.ini"); string mapName = settings.GetValue("map", "scm12ea.ini");
IniFile mapFile = new IniFile(File.OpenRead("../../../" + mapName)); IniFile mapFile = new IniFile(File.OpenRead("../../../" + mapName));
@@ -177,7 +161,9 @@ namespace OpenRa.Game
foreach (KeyValuePair<Sheet, IndexBuffer> batch in drawBatches) foreach (KeyValuePair<Sheet, IndexBuffer> batch in drawBatches)
DrawTerrainBatch(batch); DrawTerrainBatch(batch);
world.Draw(renderer); world.Draw(renderer,
new Range<float>(scrollPos.X, scrollPos.X + ClientSize.Width),
new Range<float>(scrollPos.Y, scrollPos.Y + ClientSize.Height));
renderer.EndFrame(); renderer.EndFrame();
} }

View File

@@ -42,6 +42,7 @@
<ItemGroup> <ItemGroup>
<Compile Include="Actor.cs" /> <Compile Include="Actor.cs" />
<Compile Include="Clock.cs" /> <Compile Include="Clock.cs" />
<Compile Include="CoreSheetBuilder.cs" />
<Compile Include="HardwarePalette.cs" /> <Compile Include="HardwarePalette.cs" />
<Compile Include="MainWindow.cs"> <Compile Include="MainWindow.cs">
<SubType>Form</SubType> <SubType>Form</SubType>

View File

@@ -20,8 +20,8 @@ namespace OpenRa.Game
bitmap = new Bitmap(size.Width, size.Height); bitmap = new Bitmap(size.Width, size.Height);
device = d; device = d;
using (Graphics g = Graphics.FromImage(bitmap)) //using (Graphics g = Graphics.FromImage(bitmap))
g.FillRectangle(Brushes.Fuchsia, 0, 0, size.Width, size.Height); // g.FillRectangle(Brushes.Fuchsia, 0, 0, size.Width, size.Height);
} }
public Texture Texture public Texture Texture

View File

@@ -11,22 +11,8 @@ namespace OpenRa.Game
{ {
Dictionary<string, SheetRectangle<Sheet>> trees = new Dictionary<string, SheetRectangle<Sheet>>(); Dictionary<string, SheetRectangle<Sheet>> trees = new Dictionary<string, SheetRectangle<Sheet>>();
public readonly Sheet sh;
public TreeCache(GraphicsDevice device, Map map, Package package) 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(pageSize, device);
sheets.Add(sheet);
return sheet;
};
TileSheetBuilder<Sheet> builder = new TileSheetBuilder<Sheet>(pageSize, sheetProvider);
foreach (TreeReference r in map.Trees) foreach (TreeReference r in map.Trees)
{ {
if (trees.ContainsKey(r.Image)) if (trees.ContainsKey(r.Image))
@@ -35,17 +21,10 @@ namespace OpenRa.Game
string filename = r.Image + "." + map.Theater.Substring(0, 3); string filename = r.Image + "." + map.Theater.Substring(0, 3);
ShpReader reader = new ShpReader(package.GetContent(filename)); ShpReader reader = new ShpReader(package.GetContent(filename));
SheetRectangle<Sheet> rect = builder.AddImage(reader.Size); trees.Add(r.Image, CoreSheetBuilder.Add(reader[0].Image, reader.Size));
Util.CopyIntoChannel(rect.sheet.bitmap, TextureChannel.Red, reader[0].Image, rect);
trees.Add(r.Image, rect);
} }
sh = sheets[0];
} }
public SheetRectangle<Sheet> GetImage(string tree) public SheetRectangle<Sheet> GetImage(string tree) { return trees[tree]; }
{
return trees[tree];
}
} }
} }

View File

@@ -12,31 +12,11 @@ namespace OpenRa.Game
static readonly Package unitsPackage = new Package( "../../../conquer.mix" ); static readonly Package unitsPackage = new Package( "../../../conquer.mix" );
public static readonly List<SheetRectangle<Sheet>> McvSheet = new List<SheetRectangle<Sheet>>(); public static readonly List<SheetRectangle<Sheet>> McvSheet = new List<SheetRectangle<Sheet>>();
static TileSheetBuilder<Sheet> builder;
static List<Sheet> sheets = new List<Sheet>();
static Size pageSize = new Size(1024, 512);
public static void Initialize( GraphicsDevice device )
{
Provider<Sheet> sheetProvider = delegate
{
Sheet sheet = new Sheet(pageSize, device);
sheets.Add(sheet);
return sheet;
};
builder = new TileSheetBuilder<Sheet>(pageSize, sheetProvider);
}
public static void AddUnit( string name ) public static void AddUnit( string name )
{ {
ShpReader reader = new ShpReader( unitsPackage.GetContent( name + ".shp" ) ); ShpReader reader = new ShpReader( unitsPackage.GetContent( name + ".shp" ) );
foreach( ImageHeader h in reader ) foreach (ImageHeader h in reader)
{ McvSheet.Add(CoreSheetBuilder.Add(h.Image, reader.Size));
SheetRectangle<Sheet> rect = builder.AddImage(reader.Size);
Util.CopyIntoChannel(rect.sheet.bitmap, TextureChannel.Red, h.Image, rect);
McvSheet.Add( rect );
}
} }
} }
} }

View File

@@ -76,15 +76,15 @@ namespace OpenRa.Game
indices.Add((ushort)(offset + 2)); indices.Add((ushort)(offset + 2));
} }
public static void CopyIntoChannel(Bitmap bitmap, TextureChannel channel, byte[] src, SheetRectangle<Sheet> s) public static void CopyIntoChannel(SheetRectangle<Sheet> dest, byte[] src)
{ {
for( int i = 0; i < s.size.Width; i++ ) for (int i = 0; i < dest.size.Width; i++)
for (int j = 0; j < s.size.Height; j++) for (int j = 0; j < dest.size.Height; j++)
{ {
Point p = new Point(s.origin.X + i, s.origin.Y + j); Point p = new Point(dest.origin.X + i, dest.origin.Y + j);
byte b = src[i + s.size.Width * j]; byte b = src[i + dest.size.Width * j];
Color original = bitmap.GetPixel(p.X, p.Y); Color original = dest.sheet.bitmap.GetPixel(p.X, p.Y);
bitmap.SetPixel(p.X, p.Y, ReplaceChannel(original, channel, b)); dest.sheet.bitmap.SetPixel(p.X, p.Y, ReplaceChannel(original, dest.channel, b));
} }
} }

View File

@@ -37,7 +37,7 @@ namespace OpenRa.Game
// assumption: when people fix these items, they might update the warning comment? // assumption: when people fix these items, they might update the warning comment?
public void Draw(Renderer renderer) public void Draw(Renderer renderer, Range<float> xr, Range<float> yr)
{ {
int sprites = 0; int sprites = 0;
List<Vertex> vertices = new List<Vertex>(); List<Vertex> vertices = new List<Vertex>();
@@ -46,10 +46,18 @@ namespace OpenRa.Game
foreach (Actor a in actors) foreach (Actor a in actors)
{ {
if (a.CurrentImages == null) SheetRectangle<Sheet>[] images = a.CurrentImages;
if (images == null)
continue; continue;
foreach (SheetRectangle<Sheet> image in a.CurrentImages) if (a.location.X > xr.End || a.location.X < xr.Start - images[0].size.Width)
continue;
if (a.location.Y > yr.End || a.location.Y < yr.Start - images[0].size.Height)
continue;
foreach (SheetRectangle<Sheet> image in images)
{ {
if( image.sheet != sheet && sprites > 0 && sheet != null ) if( image.sheet != sheet && sprites > 0 && sheet != null )
{ {