package com.galvarez.ttw.rendering;
import java.util.ArrayList;
import java.util.List;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.annotations.Wire;
import com.artemis.utils.ImmutableBag;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.galvarez.ttw.model.map.MapPosition;
import com.galvarez.ttw.model.map.MapTools;
import com.galvarez.ttw.rendering.components.Sprite;
import com.galvarez.ttw.rendering.components.SpriteAnimation;
import com.galvarez.ttw.utils.FloatPair;
import com.galvarez.ttw.utils.Font;
@Wire
public final class SpriteRenderSystem extends AbstractRendererSystem {
private ComponentMapper<MapPosition> positions;
private ComponentMapper<Sprite> sprites;
private ComponentMapper<SpriteAnimation> animations;
private final TextureAtlas atlas;
private final List<Entity> sortedEntities = new ArrayList<Entity>();
private final BitmapFont font;
public SpriteRenderSystem(OrthographicCamera camera, SpriteBatch batch) {
super(with(MapPosition.class, Sprite.class), camera, batch);
atlas = new TextureAtlas(Gdx.files.internal("textures/characters.atlas"), Gdx.files.internal("textures"));
font = Font.IRIS_UPC.get();
font.setUseIntegerPositions(false);
}
@Override
protected boolean checkProcessing() {
return true;
}
@Override
protected void processEntities(ImmutableBag<Entity> entities) {
for (Entity e : sortedEntities)
process(e);
}
private void process(Entity e) {
if (positions.has(e)) {
MapPosition position = positions.getSafe(e);
// If sprite is off-screen, don't bother drawing it!
if (!isOnScreen(position))
return;
Sprite sprite = sprites.get(e);
TextureRegion spriteRegion = sprite.region;
batch.setColor(sprite.color);
int width = spriteRegion.getRegionWidth();
int height = spriteRegion.getRegionHeight();
sprite.region.setRegion(sprite.x, sprite.y, width, height);
FloatPair drawPosition = MapTools.world2window(position);
float posX = drawPosition.x - (spriteRegion.getRegionWidth() / 2 * sprite.scaleX);
float posY = drawPosition.y - (spriteRegion.getRegionHeight() / 2 * sprite.scaleY);
batch.draw(spriteRegion, posX, posY, 0, 0, spriteRegion.getRegionWidth(), spriteRegion.getRegionHeight(),
sprite.scaleX, sprite.scaleY, sprite.rotation);
}
}
@Override
protected void inserted(Entity e) {
sortedEntities.add(e);
Sprite sprite = sprites.get(e);
TextureRegion reg = atlas.findRegion(sprite.name);
sprite.region = reg;
sprite.x = reg.getRegionX();
sprite.y = reg.getRegionY();
sprite.width = reg.getRegionWidth();
sprite.height = reg.getRegionHeight();
if (animations.has(e)) {
SpriteAnimation anim = animations.getSafe(e);
anim.animation = new Animation(anim.frameDuration, atlas.findRegions(sprite.name), anim.playMode);
}
sortedEntities.sort((e1, e2) -> sprites.get(e1).layer.compareTo(sprites.get(e2).layer));
}
@Override
protected void removed(Entity e) {
sortedEntities.remove(e);
}
}