package net.onedaybeard.dominatrix.demo.system.debug;
import static net.onedaybeard.dominatrix.util.Disposer.free;
import java.util.Properties;
import net.onedaybeard.dominatrix.demo.Director;
import net.onedaybeard.dominatrix.demo.component.Renderable;
import net.onedaybeard.dominatrix.demo.component.Tint;
import net.onedaybeard.dominatrix.demo.event.CommandEvent;
import net.onedaybeard.dominatrix.demo.event.CommandEvent.Type;
import net.onedaybeard.dominatrix.demo.event.CommandEventListener;
import net.onedaybeard.dominatrix.inject.InjectProperty;
import net.onedaybeard.dominatrix.inject.InjectableProperties;
import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.EntitySystem;
import com.artemis.utils.Bag;
import com.artemis.utils.ImmutableBag;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.utils.Disposable;
public final class SpriteBoundsRenderSystem extends EntitySystem implements Disposable, InjectableProperties
{
public static final String TAG = SpriteBoundsRenderSystem.class.getSimpleName();
private final OrthographicCamera camera;
private ShapeRenderer renderer;
@InjectProperty("boundary_color_from_tint") private boolean colorFromTint = false;
private ComponentMapper<Renderable> renderableMapper;
private ComponentMapper<Tint> tintMapper;
private Entity selected;
@SuppressWarnings("unchecked")
public SpriteBoundsRenderSystem(OrthographicCamera camera)
{
super(Aspect.getAspectForAll(Renderable.class));
this.camera = camera;
}
@Override
protected void initialize()
{
this.renderer = new ShapeRenderer();
renderableMapper = world.getMapper(Renderable.class);
tintMapper = world.getMapper(Tint.class);
Director.instance.getEventSystem().addReceiver(new CommandEventListener()
{
@Override
protected boolean accepts(CommandEvent event, Type type)
{
return type == Type.ENTITY_SELECTED;
}
@Override
protected boolean onReceive(CommandEvent event, Type type)
{
int id = event.getValue();
if (id == -1)
selected = null;
else
selected = world.getEntity(id);
return false;
}
});
}
@Override
protected void begin()
{
renderer.setProjectionMatrix(camera.combined);
}
@Override
protected void processEntities(ImmutableBag<Entity> entities)
{
Object[] array = ((Bag<Entity>)entities).getData();
renderer.begin(ShapeType.Line);
for (int i = 0, s = entities.size(); s > i; i++)
{
Entity e = (Entity)array[i];
renderer.setColor(getBoundsColor(e));
processOutline(e);
}
renderer.end();
renderer.begin(ShapeType.Line);
renderer.setColor(Color.WHITE);
for (int i = 0, s = entities.size(); s > i; i++)
{
processOrigin((Entity)array[i]);
}
renderer.end();
}
private Color getBoundsColor(Entity e)
{
if (colorFromTint && tintMapper.has(e))
return tintMapper.get(e).color();
else
return Color.YELLOW;
}
private void processOutline(Entity e)
{
Sprite sprite = renderableMapper.get(e).getSprite();
Rectangle bounds = sprite.getBoundingRectangle();
renderer.box(bounds.x, bounds.y, 0, bounds.width, bounds.height, 0);
}
private void processOrigin(Entity e)
{
Sprite sprite = renderableMapper.get(e).getSprite();
float x = sprite.getX() + sprite.getOriginX();
float y = sprite.getY() + sprite.getOriginY();
renderer.circle(x, y, 25, 4);
}
@Override
protected void end()
{
if (selected != null)
{
renderer.begin(ShapeType.Line);
renderer.setColor(Color.GREEN);
processOutline(selected);
renderer.end();
}
}
@Override
public void dispose()
{
free(renderer);
}
@Override
protected boolean checkProcessing()
{
return true;
}
@Override
public void newValues(Properties properties)
{
// nothing to see here, but if any additional steps need to be taken.
}
}