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 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 ) );
}

View File

@@ -36,25 +36,6 @@ namespace OpenRa.Game.Graphics
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,
IEnumerable<Tuple<Sprite, float2, int>> images)
{
@@ -81,12 +62,12 @@ namespace OpenRa.Game.Graphics
region.Size.ToSizeF());
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
.Where(u => u.traits.Contains<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)
DrawSpriteList(rect, e.Render());

View File

@@ -35,11 +35,11 @@ namespace OpenRa.Game.Traits
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(
e => Util.Centered(e.anim.Image, e.location))
.OrderBy( a => a.Second.Y ); /* important to y-order elements of a squad! */
e => Util.Centered(self, e.anim.Image, e.location))
.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");
}
public IEnumerable<Pair<Sprite, float2>> Render(Actor self)
public IEnumerable<Tuple<Sprite, float2, int>> Render(Actor self)
{
var uog = Game.controller.orderGenerator as UnitOrderGenerator;
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()));
}

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)

View File

@@ -29,10 +29,11 @@ namespace OpenRa.Game.Traits
}, self);
}
public IEnumerable<Pair<Sprite, float2>> RenderRoof(Actor self)
public IEnumerable<Tuple<Sprite, float2, int>> RenderRoof(Actor self)
{
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)

View File

@@ -16,7 +16,7 @@ namespace OpenRa.Game.Traits
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)
{

View File

@@ -29,11 +29,11 @@ namespace OpenRa.Game.Traits
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)
yield return Util.Centered(smoke.Image, self.CenterLocation);
yield return Util.Centered(self, smoke.Image, self.CenterLocation);
}
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>();
yield return Util.Centered(anim.Image, self.CenterLocation);
yield return Util.Centered(rotorAnim.Image, self.CenterLocation
yield return Util.Centered(self, anim.Image, self.CenterLocation);
yield return Util.Centered(self, rotorAnim.Image, self.CenterLocation
+ Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, 0));
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));
}

View File

@@ -33,19 +33,19 @@ namespace OpenRa.Game.Traits
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>();
yield return Util.Centered(anim.Image, self.CenterLocation);
yield return Util.Centered(turretAnim.Image, self.CenterLocation
yield return Util.Centered(self, anim.Image, self.CenterLocation);
yield return Util.Centered(self, turretAnim.Image, self.CenterLocation
+ Util.GetTurretPosition(self, self.unitInfo.PrimaryOffset, primaryRecoil));
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));
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));
}

View File

@@ -10,7 +10,7 @@ namespace OpenRa.Game.Traits
enum DamageState { Normal, Half, Dead };
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 INotifyDamage { void Damaged(Actor self, DamageState ds); }
interface INotifyDamageEx : INotifyDamage { void Damaged(Actor self, int damage); }

View File

@@ -16,9 +16,9 @@ namespace OpenRa.Game.Traits
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));
}
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;
return Pair.New(s, loc.Round());
return Tuple.New(s, loc.Round(), self.Owner.Palette);
}
}