adds custom-palette/shadow support for rendering everything

This commit is contained in:
Chris Forbes
2009-11-10 21:03:47 +13:00
parent a40ce7d088
commit 14910762c8
13 changed files with 32 additions and 50 deletions

View File

@@ -59,9 +59,9 @@ namespace OpenRa.Game
} }
public float2 CenterLocation; public float2 CenterLocation;
public float2 SelectedSize { get { return Render().First().First.size; } } public float2 SelectedSize { get { return Render().First().a.size; } }
public IEnumerable<Pair<Sprite, float2>> Render() public IEnumerable<Tuple<Sprite, float2, int>> Render()
{ {
return traits.WithInterface<Traits.IRender>().SelectMany( x => x.Render( this ) ); return traits.WithInterface<Traits.IRender>().SelectMany( x => x.Render( this ) );
} }

View File

@@ -36,25 +36,6 @@ namespace OpenRa.Game.Graphics
uiOverlay = new UiOverlay(spriteRenderer); uiOverlay = new UiOverlay(spriteRenderer);
} }
void DrawSpriteList(Player owner, RectangleF rect,
IEnumerable<Pair<Sprite, float2>> images)
{
foreach (var image in images)
{
var loc = image.Second;
if (loc.X > rect.Right || loc.X < rect.Left
- image.First.bounds.Width)
continue;
if (loc.Y > rect.Bottom || loc.Y < rect.Top
- image.First.bounds.Height)
continue;
spriteRenderer.DrawSprite(image.First, loc,
(owner != null) ? owner.Palette : 0);
}
}
void DrawSpriteList(RectangleF rect, void DrawSpriteList(RectangleF rect,
IEnumerable<Tuple<Sprite, float2, int>> images) IEnumerable<Tuple<Sprite, float2, int>> images)
{ {
@@ -81,12 +62,12 @@ namespace OpenRa.Game.Graphics
region.Size.ToSizeF()); region.Size.ToSizeF());
foreach (Actor a in Game.world.Actors.OrderBy( u => u.CenterLocation.Y )) foreach (Actor a in Game.world.Actors.OrderBy( u => u.CenterLocation.Y ))
DrawSpriteList(a.Owner, rect, a.Render()); DrawSpriteList(rect, a.Render());
foreach (var a in Game.world.Actors foreach (var a in Game.world.Actors
.Where(u => u.traits.Contains<Traits.RenderWarFactory>()) .Where(u => u.traits.Contains<Traits.RenderWarFactory>())
.Select(u => u.traits.Get<Traits.RenderWarFactory>())) .Select(u => u.traits.Get<Traits.RenderWarFactory>()))
DrawSpriteList(a.self.Owner, rect, a.RenderRoof(a.self)); /* RUDE HACK */ DrawSpriteList(rect, a.RenderRoof(a.self)); /* RUDE HACK */
foreach (IEffect e in Game.world.Effects) foreach (IEffect e in Game.world.Effects)
DrawSpriteList(rect, e.Render()); DrawSpriteList(rect, e.Render());

View File

@@ -35,11 +35,11 @@ namespace OpenRa.Game.Traits
self.CenterLocation.ToInt2() + elementOffsets[elements.Count][i], self); self.CenterLocation.ToInt2() + elementOffsets[elements.Count][i], self);
} }
public IEnumerable<Pair<Sprite, float2>> Render(Actor self) public IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
{ {
return elements.Select( return elements.Select(
e => Util.Centered(e.anim.Image, e.location)) e => Util.Centered(self, e.anim.Image, e.location))
.OrderBy( a => a.Second.Y ); /* important to y-order elements of a squad! */ .OrderBy( a => a.b.Y ); /* important to y-order elements of a squad! */
} }
} }

View File

@@ -21,11 +21,11 @@ namespace OpenRa.Game.Traits
anim.PlayRepeating("idle"); anim.PlayRepeating("idle");
} }
public IEnumerable<Pair<Sprite, float2>> Render(Actor self) public IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
{ {
var uog = Game.controller.orderGenerator as UnitOrderGenerator; var uog = Game.controller.orderGenerator as UnitOrderGenerator;
if (uog != null && self.Owner == Game.LocalPlayer && uog.selection.Contains(self)) if (uog != null && self.Owner == Game.LocalPlayer && uog.selection.Contains(self))
yield return Util.Centered( yield return Util.Centered( self,
anim.Image, Game.CellSize * (new float2(.5f, .5f) + rallyPoint.ToFloat2())); anim.Image, Game.CellSize * (new float2(.5f, .5f) + rallyPoint.ToFloat2()));
} }

View File

@@ -64,9 +64,9 @@ namespace OpenRa.Game.Traits
} }
} }
public override IEnumerable<Pair<Sprite, float2>> Render(Actor self) public override IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
{ {
yield return Pair.New(anim.Image, 24f * (float2)self.Location); yield return Tuple.New(anim.Image, 24f * (float2)self.Location, self.Owner.Palette);
} }
public virtual void Damaged(Actor self, DamageState state) public virtual void Damaged(Actor self, DamageState state)

View File

@@ -29,10 +29,11 @@ namespace OpenRa.Game.Traits
}, self); }, self);
} }
public IEnumerable<Pair<Sprite, float2>> RenderRoof(Actor self) public IEnumerable<Tuple<Sprite, float2, int>> RenderRoof(Actor self)
{ {
if (doneBuilding) if (doneBuilding)
yield return Pair.New(roof.Image, 24f * (float2)self.Location); yield return Tuple.New(roof.Image,
24f * (float2)self.Location, self.Owner.Palette);
} }
public override void Tick(Actor self) public override void Tick(Actor self)

View File

@@ -16,7 +16,7 @@ namespace OpenRa.Game.Traits
anim = new Animation(self.unitInfo.Image ?? self.unitInfo.Name); anim = new Animation(self.unitInfo.Image ?? self.unitInfo.Name);
} }
public abstract IEnumerable<Pair<Sprite, float2>> Render(Actor self); public abstract IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self);
public virtual void Tick(Actor self) public virtual void Tick(Actor self)
{ {

View File

@@ -29,11 +29,11 @@ namespace OpenRa.Game.Traits
anim.PlayThen(newAnim, () => { PlayFacingAnim(self); if (after != null) after(); }); anim.PlayThen(newAnim, () => { PlayFacingAnim(self); if (after != null) after(); });
} }
public override IEnumerable<Pair<Sprite, float2>> Render(Actor self) public override IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
{ {
yield return Util.Centered(anim.Image, self.CenterLocation); yield return Util.Centered(self, anim.Image, self.CenterLocation);
if (isSmoking) if (isSmoking)
yield return Util.Centered(smoke.Image, self.CenterLocation); yield return Util.Centered(self, smoke.Image, self.CenterLocation);
} }
bool isSmoking; bool isSmoking;

View File

@@ -23,15 +23,15 @@ namespace OpenRa.Game.Traits
} }
} }
public override IEnumerable<Pair<Sprite, float2>> Render(Actor self) public override IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
{ {
var mobile = self.traits.Get<Mobile>(); var mobile = self.traits.Get<Mobile>();
yield return Util.Centered(anim.Image, self.CenterLocation); yield return Util.Centered(self, anim.Image, self.CenterLocation);
yield return Util.Centered(rotorAnim.Image, self.CenterLocation yield return Util.Centered(self, rotorAnim.Image, self.CenterLocation
+ Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, 0)); + Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, 0));
if (self.unitInfo.SecondaryOffset != null) if (self.unitInfo.SecondaryOffset != null)
yield return Util.Centered((secondRotorAnim ?? rotorAnim).Image, self.CenterLocation yield return Util.Centered(self, (secondRotorAnim ?? rotorAnim).Image, self.CenterLocation
+ Util.GetTurretPosition(self, self.unitInfo.SecondaryOffset, 0)); + Util.GetTurretPosition(self, self.unitInfo.SecondaryOffset, 0));
} }

View File

@@ -33,19 +33,19 @@ namespace OpenRa.Game.Traits
turretAnim.PlayRepeating("turret"); /* not really a turret; it's a spinner */ turretAnim.PlayRepeating("turret"); /* not really a turret; it's a spinner */
} }
public override IEnumerable<Pair<Sprite, float2>> Render(Actor self) public override IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
{ {
var mobile = self.traits.Get<Mobile>(); var mobile = self.traits.Get<Mobile>();
yield return Util.Centered(anim.Image, self.CenterLocation); yield return Util.Centered(self, anim.Image, self.CenterLocation);
yield return Util.Centered(turretAnim.Image, self.CenterLocation yield return Util.Centered(self, turretAnim.Image, self.CenterLocation
+ Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, primaryRecoil)); + Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, primaryRecoil));
if (self.unitInfo.SecondaryOffset != null) if (self.unitInfo.SecondaryOffset != null)
yield return Util.Centered(turretAnim.Image, self.CenterLocation yield return Util.Centered(self, turretAnim.Image, self.CenterLocation
+ Util.GetTurretPosition(self, self.unitInfo.SecondaryOffset, secondaryRecoil)); + Util.GetTurretPosition(self, self.unitInfo.SecondaryOffset, secondaryRecoil));
if (muzzleFlash != null && primaryRecoil > 0) if (muzzleFlash != null && primaryRecoil > 0)
yield return Util.Centered(muzzleFlash.Image, self.CenterLocation yield return Util.Centered(self, muzzleFlash.Image, self.CenterLocation
+ Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, primaryRecoil)); + Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, primaryRecoil));
} }

View File

@@ -10,7 +10,7 @@ namespace OpenRa.Game.Traits
enum DamageState { Normal, Half, Dead }; enum DamageState { Normal, Half, Dead };
interface ITick { void Tick(Actor self); } interface ITick { void Tick(Actor self); }
interface IRender { IEnumerable<Pair<Sprite, float2>> Render(Actor self); } interface IRender { IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self); }
interface IOrder { Order Order(Actor self, int2 xy, bool lmb, Actor underCursor); } interface IOrder { Order Order(Actor self, int2 xy, bool lmb, Actor underCursor); }
interface INotifyDamage { void Damaged(Actor self, DamageState ds); } interface INotifyDamage { void Damaged(Actor self, DamageState ds); }
interface INotifyDamageEx : INotifyDamage { void Damaged(Actor self, int damage); } interface INotifyDamageEx : INotifyDamage { void Damaged(Actor self, int damage); }

View File

@@ -16,9 +16,9 @@ namespace OpenRa.Game.Traits
Image = treeImage; Image = treeImage;
} }
public IEnumerable<Pair<Sprite, float2>> Render(Actor self) public IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
{ {
yield return Pair.New(Image, Game.CellSize * (float2)self.Location); yield return Tuple.New(Image, Game.CellSize * (float2)self.Location, 0);
} }
} }
} }

View File

@@ -98,10 +98,10 @@ namespace OpenRa.Game.Traits
+ new float2(offset.ElementAtOrDefault(2), offset.ElementAtOrDefault(3)); + new float2(offset.ElementAtOrDefault(2), offset.ElementAtOrDefault(3));
} }
public static Pair<Sprite, float2> Centered(Sprite s, float2 location) public static Tuple<Sprite, float2, int> Centered(Actor self, Sprite s, float2 location)
{ {
var loc = location - 0.5f * s.size; var loc = location - 0.5f * s.size;
return Pair.New(s, loc.Round()); return Tuple.New(s, loc.Round(), self.Owner.Palette);
} }
} }