Engine – EntityRenderer.cs
#region Using Statements
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using ParadigmEngine.TileEngine;
using ParadigmEngine.ParticleSystem;
#endregion
namespace ParadigmEngine
{
/// <summary>
/// Handles the drawing of world entities as well as particles
/// </summary>
public class EntityRenderer
{
#region Fields
/// <summary>
/// List containing all of the entities that will be rendered
/// </summary>
private static List<DrawableWorldEntity> entityList;
#endregion
#region Public Methods
/// <summary>
/// Initialize the entity renderer
/// </summary>
public static void Initialize()
{
entityList = new List<DrawableWorldEntity>();
}
/// <summary>
/// Adds a list of entities to be rendered
/// </summary>
public static void AddEntities(List<DrawableWorldEntity> entities)
{
entityList.AddRange(entities);
if (entityList.Count > 1)
{
// sort the entity list by Y coord to ensure proper occlusion
entityList.Sort(delegate(DrawableWorldEntity entity1, DrawableWorldEntity entity2)
{
return entity1.SpawnedFrom.Y.CompareTo(entity2.SpawnedFrom.Y);
});
}
}
/// <summary>
/// Clears the entity list
/// </summary>
public static void ClearEntities()
{
entityList.Clear();
}
/// <summary>
/// Draws all entities in the list
/// </summary>
public static void Draw(GameTime gameTime, SpriteBatch spriteBatch, Texture2D particleTexture, Matrix transformMatrix, bool usingEditor)
{
// blend mode
BlendMode currentBlendMode = BlendMode.AlphaBlend;
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None, transformMatrix);
for (int i = 0; i < entityList.Count; i++)
{
// if the entity is a world object
if (entityList[i].EntityType == DrawableEntityType.Object)
{
// make sure we are in alpha blending mode
if (currentBlendMode == BlendMode.Additive)
{
currentBlendMode = BlendMode.AlphaBlend;
spriteBatch.End();
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None, transformMatrix);
}
// if we are in the editor, pass an extra parameter to include the option for transparency
if (usingEditor)
{
entityList[i].Draw(gameTime, spriteBatch, false);
}
else // otherwise draw as normal
{
entityList[i].Draw(gameTime, spriteBatch);
}
}
else // if the entity is a particle
{
Particle particle = entityList[i] as Particle;
if (!particle.Additive && !particle.refract)
{
particle.Draw(spriteBatch, particleTexture);
}
if (particle.Additive && !particle.refract)
{
// if we need to switch the blend mode, end the current spritebatch call and change to the new blend
if (currentBlendMode == BlendMode.AlphaBlend)
{
currentBlendMode = BlendMode.Additive;
spriteBatch.End();
spriteBatch.Begin(SpriteBlendMode.Additive, SpriteSortMode.Immediate, SaveStateMode.None, transformMatrix);
}
particle.Draw(spriteBatch, particleTexture);
// check the next entity in the list. if it is a particle with the same blend mode, we do not need to switch blending mode
// if it has a different blend mode, or is not a particle, we will switch the blend mode now
if (i != entityList.Count - 1)
{
Particle nextParticle = entityList[i + 1] as Particle;
if (nextParticle != null)
{
if (!nextParticle.Additive)
{
currentBlendMode = BlendMode.AlphaBlend;
spriteBatch.End();
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None, transformMatrix);
}
}
}
}
}
}
spriteBatch.End();
}
#endregion
}
}