Merge pull request #11124 from pchote/tileset-depth
Add tileset depth metadata support.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user