package com.galvarez.ttw.rendering;
import java.util.Arrays;
import com.artemis.Aspect;
import com.artemis.Component;
import com.artemis.EntitySystem;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;
import com.galvarez.ttw.model.map.MapPosition;
import com.galvarez.ttw.model.map.MapTools;
public abstract class AbstractRendererSystem extends EntitySystem {
protected final OrthographicCamera camera;
protected final SpriteBatch batch;
public AbstractRendererSystem(Aspect aspect, OrthographicCamera camera, SpriteBatch batch) {
super(aspect);
this.camera = camera;
this.batch = batch;
}
@SafeVarargs
protected static Aspect with(Class<? extends Component> ... components) {
return Aspect.getEmpty().all(Arrays.asList(components));
}
@Override
protected void begin() {
batch.setProjectionMatrix(camera.combined);
batch.begin();
}
@Override
protected void end() {
batch.end();
batch.setColor(1f, 1f, 1f, 1f);
}
protected final boolean isOnScreen(MapPosition position) {
// Get bottom left and top right coordinates of camera viewport and
// convert into grid coordinates for the map
int x0 = MathUtils.floor(camera.frustum.planePoints[0].x / MapTools.col_multiple) - 1;
int y0 = MathUtils.floor(camera.frustum.planePoints[0].y / MapTools.row_multiple) - 1;
int x1 = MathUtils.floor(camera.frustum.planePoints[2].x / MapTools.col_multiple) + 2;
int y1 = MathUtils.floor(camera.frustum.planePoints[2].y / MapTools.row_multiple) + 1;
// If sprite is off-screen, don't bother drawing it!
return position.x >= x0 && position.x <= x1 && position.y >= y0 && position.y <= y1;
}
}