Merge pull request #11124 from pchote/tileset-depth

Add tileset depth metadata support.
This commit is contained in:
reaperrr
2016-04-21 22:59:42 +02:00
8 changed files with 11313 additions and 17 deletions

View File

@@ -59,15 +59,15 @@ namespace OpenRA.Graphics
this.allocateSheet = allocateSheet; this.allocateSheet = allocateSheet;
} }
public Sprite Add(ISpriteFrame frame) { return Add(frame.Data, frame.Size, frame.Offset); } public Sprite Add(ISpriteFrame frame) { return Add(frame.Data, frame.Size, 0, frame.Offset); }
public Sprite Add(byte[] src, Size size) { return Add(src, size, float2.Zero); } public Sprite Add(byte[] src, Size size) { return Add(src, size, 0, float3.Zero); }
public Sprite Add(byte[] src, Size size, float2 spriteOffset) public Sprite Add(byte[] src, Size size, float zRamp, float3 spriteOffset)
{ {
// Don't bother allocating empty sprites // Don't bother allocating empty sprites
if (size.Width == 0 || size.Height == 0) if (size.Width == 0 || size.Height == 0)
return new Sprite(current, Rectangle.Empty, 0, spriteOffset, channel, BlendMode.Alpha); return new Sprite(current, Rectangle.Empty, 0, spriteOffset, channel, BlendMode.Alpha);
var rect = Allocate(size, spriteOffset); var rect = Allocate(size, zRamp, spriteOffset);
Util.FastCopyIntoChannel(rect, src); Util.FastCopyIntoChannel(rect, src);
current.CommitBufferedData(); current.CommitBufferedData();
return rect; return rect;
@@ -99,8 +99,8 @@ namespace OpenRA.Graphics
return (TextureChannel)nextChannel; return (TextureChannel)nextChannel;
} }
public Sprite Allocate(Size imageSize) { return Allocate(imageSize, float2.Zero); } public Sprite Allocate(Size imageSize) { return Allocate(imageSize, 0, float3.Zero); }
public Sprite Allocate(Size imageSize, float2 spriteOffset) public Sprite Allocate(Size imageSize, float zRamp, float3 spriteOffset)
{ {
if (imageSize.Width + p.X > current.Size.Width) if (imageSize.Width + p.X > current.Size.Width)
{ {
@@ -128,7 +128,7 @@ namespace OpenRA.Graphics
p = new Point(0, 0); p = new Point(0, 0);
} }
var rect = new Sprite(current, new Rectangle(p, imageSize), 0, spriteOffset, channel, BlendMode.Alpha); var rect = new Sprite(current, new Rectangle(p, imageSize), zRamp, spriteOffset, channel, BlendMode.Alpha);
p.X += imageSize.Width; p.X += imageSize.Width;
return rect; return rect;

View File

@@ -68,12 +68,10 @@ namespace OpenRA.Graphics
public void Update(CPos cell, Sprite sprite) public void Update(CPos cell, Sprite sprite)
{ {
var xy = sprite == null ? float2.Zero : var xyz = sprite == null ? float3.Zero :
worldRenderer.ScreenPosition(map.CenterOfCell(cell)) + sprite.Offset - 0.5f * sprite.Size; worldRenderer.Screen3DPosition(map.CenterOfCell(cell)) + sprite.Offset - 0.5f * sprite.Size;
// TODO: Deal with sprite z offsets Update(cell.ToMPos(map.Grid.Type), sprite, xyz);
var z = worldRenderer.ScreenZPosition(map.CenterOfCell(cell), 0);
Update(cell.ToMPos(map.Grid.Type), sprite, new float3(xy.X, xy.Y, z));
} }
public void Update(MPos uv, Sprite sprite, float3 pos) public void Update(MPos uv, Sprite sprite, float3 pos)

View File

@@ -69,12 +69,18 @@ namespace OpenRA.Graphics
variants.Add(indices.Select(j => variants.Add(indices.Select(j =>
{ {
var f = allFrames[j]; var f = allFrames[j];
var s = sheetBuilder.Allocate(f.Size, f.Offset); var tile = t.Value.Contains(j) ? t.Value[j] : null;
// The internal z axis is inverted from expectation (negative is closer)
var zOffset = tile != null ? -tile.ZOffset : 0;
var zRamp = tile != null ? tile.ZRamp : 1f;
var offset = new float3(f.Offset, zOffset);
var s = sheetBuilder.Allocate(f.Size, zRamp, offset);
Util.FastCopyIntoChannel(s, f.Data); Util.FastCopyIntoChannel(s, f.Data);
if (tileset.EnableDepth) if (tileset.EnableDepth)
{ {
var ss = sheetBuilder.Allocate(f.Size, f.Offset); var ss = sheetBuilder.Allocate(f.Size, zRamp, offset);
Util.FastCopyIntoChannel(ss, allFrames[j + frameCount].Data); Util.FastCopyIntoChannel(ss, allFrames[j + frameCount].Data);
// s and ss are guaranteed to use the same sheet // s and ss are guaranteed to use the same sheet
@@ -90,7 +96,7 @@ namespace OpenRA.Graphics
// Ignore the offsets baked into R8 sprites // Ignore the offsets baked into R8 sprites
if (tileset.IgnoreTileSpriteOffsets) if (tileset.IgnoreTileSpriteOffsets)
allSprites = allSprites.Select(s => new Sprite(s.Sheet, s.Bounds, s.ZRamp, float2.Zero, s.Channel, s.BlendMode)); allSprites = allSprites.Select(s => new Sprite(s.Sheet, s.Bounds, s.ZRamp, new float3(float2.Zero, s.Offset.Z), s.Channel, s.BlendMode));
templates.Add(t.Value.Id, new TheaterTemplate(allSprites.ToArray(), variants.First().Count(), t.Value.Images.Length)); templates.Add(t.Value.Id, new TheaterTemplate(allSprites.ToArray(), variants.First().Count(), t.Value.Images.Length));
} }

View File

@@ -161,8 +161,8 @@ namespace OpenRA.Graphics
CalculateSpriteGeometry(tl, br, 1, out spriteSize, out spriteOffset); CalculateSpriteGeometry(tl, br, 1, out spriteSize, out spriteOffset);
CalculateSpriteGeometry(stl, sbr, 2, out shadowSpriteSize, out shadowSpriteOffset); CalculateSpriteGeometry(stl, sbr, 2, out shadowSpriteSize, out shadowSpriteOffset);
var sprite = sheetBuilder.Allocate(spriteSize, spriteOffset); var sprite = sheetBuilder.Allocate(spriteSize, 0, spriteOffset);
var shadowSprite = sheetBuilder.Allocate(shadowSpriteSize, shadowSpriteOffset); var shadowSprite = sheetBuilder.Allocate(shadowSpriteSize, 0, shadowSpriteOffset);
var sb = sprite.Bounds; var sb = sprite.Bounds;
var ssb = shadowSprite.Bounds; var ssb = shadowSprite.Bounds;
var spriteCenter = new float2(sb.Left + sb.Width / 2, sb.Top + sb.Height / 2); var spriteCenter = new float2(sb.Left + sb.Width / 2, sb.Top + sb.Height / 2);

View File

@@ -27,6 +27,9 @@ namespace OpenRA
public readonly Color LeftColor; public readonly Color LeftColor;
public readonly Color RightColor; public readonly Color RightColor;
public readonly float ZOffset = 0.0f;
public readonly float ZRamp = 1.0f;
public MiniYaml Save(TileSet tileSet) public MiniYaml Save(TileSet tileSet)
{ {
var root = new List<MiniYamlNode>(); var root = new List<MiniYamlNode>();
@@ -42,6 +45,12 @@ namespace OpenRA
if (RightColor != tileSet.TerrainInfo[TerrainType].Color) if (RightColor != tileSet.TerrainInfo[TerrainType].Color)
root.Add(FieldSaver.SaveField(this, "RightColor")); root.Add(FieldSaver.SaveField(this, "RightColor"));
if (ZOffset != 0.0f)
root.Add(FieldSaver.SaveField(this, "ZOffset"));
if (ZRamp != 1.0f)
root.Add(FieldSaver.SaveField(this, "ZRamp"));
return new MiniYaml(tileSet.TerrainInfo[TerrainType].Type, root); return new MiniYaml(tileSet.TerrainInfo[TerrainType].Type, root);
} }
} }

View File

@@ -33,6 +33,7 @@ namespace OpenRA.Mods.TS.UtilityCommands
var file = new IniFile(File.Open(args[1], FileMode.Open)); var file = new IniFile(File.Open(args[1], FileMode.Open));
var extension = args[2]; var extension = args[2];
var tileSize = modData.Manifest.Get<MapGrid>().TileSize;
var templateIndex = 0; var templateIndex = 0;
@@ -125,6 +126,8 @@ namespace OpenRA.Mods.TS.UtilityCommands
Console.WriteLine("\t\t\t\tLeftColor: {0:X2}{1:X2}{2:X2}", s.ReadUInt8(), s.ReadUInt8(), s.ReadUInt8()); Console.WriteLine("\t\t\t\tLeftColor: {0:X2}{1:X2}{2:X2}", s.ReadUInt8(), s.ReadUInt8(), s.ReadUInt8());
Console.WriteLine("\t\t\t\tRightColor: {0:X2}{1:X2}{2:X2}", s.ReadUInt8(), s.ReadUInt8(), s.ReadUInt8()); Console.WriteLine("\t\t\t\tRightColor: {0:X2}{1:X2}{2:X2}", s.ReadUInt8(), s.ReadUInt8(), s.ReadUInt8());
Console.WriteLine("\t\t\t\tZOffset: {0}", -tileSize.Height / 2.0f);
Console.WriteLine("\t\t\t\tZRamp: 0");
} }
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff