package mountainrangepvp.client.renderer;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;
import mountainrangepvp.core.Session;
import mountainrangepvp.core.Snapshot;
import mountainrangepvp.engine.ui.Bloom;
import mountainrangepvp.engine.ui.TextRenderer;
import mountainrangepvp.engine.util.EventBus;
import java.time.Duration;
/**
* @author lachlan
*/
public class WorldRenderer {
private static final Color SKY_COLOUR = new Color(0.07f, 0.09f, 0.19f, 1);
private final Vector2 screen;
private final SpriteBatch batch;
private final OrthographicCamera camera;
private final EventBus eventBus;
private final Session session;
private final TextRenderer textRenderer;
private final BackgroundRenderer backgroundRenderer;
private final TerrainRenderer terrainRenderer;
private final EntityRenderer entityRenderer;
private final ChatRenderer chatRenderer;
private final MiniMapRenderer miniMapRenderer;
private final LeaderBoardRenderer leaderBoardRenderer;
private final Bloom bloom;
private final Texture crossHairTexture;
public WorldRenderer(EventBus eventBus, Session session) {
this.eventBus = eventBus;
this.session = session;
screen = new Vector2(Gdx.graphics.getWidth() + 1,
Gdx.graphics.getHeight());
batch = new SpriteBatch();
camera = new OrthographicCamera(screen.x, screen.y);
camera.position.set(screen.x / 2, screen.y / 2, 0);
camera.update();
crossHairTexture = new Texture(Gdx.files.internal("crosshair.png"));
textRenderer = new TextRenderer();
backgroundRenderer = new BackgroundRenderer(batch);
terrainRenderer = new TerrainRenderer(batch);
entityRenderer = new EntityRenderer(batch, textRenderer);
chatRenderer = new ChatRenderer(batch, textRenderer);
miniMapRenderer = new MiniMapRenderer(batch);
leaderBoardRenderer = new LeaderBoardRenderer(batch, textRenderer);
bloom = new Bloom(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),
false, false, true);
bloom.setTreshold(0.6f);
bloom.blurPasses = 2;
}
public void render(Vector2 scroll, Duration pingTime) {
Snapshot snapshot = session.getSnapshot();
bloom.startCapture();
Gdx.gl.glClearColor(SKY_COLOUR.r, SKY_COLOUR.g, SKY_COLOUR.b, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
backgroundRenderer.render(scroll);
entityRenderer.render(scroll, snapshot, session.localPlayerEntity().isDefined());
terrainRenderer.render(scroll, session.getTerrain());
drawCrosshair();
bloom.stopCaptureAndRender();
miniMapRenderer.render(scroll, snapshot, session.getTerrain());
leaderBoardRenderer.render(snapshot);
chatRenderer.render(snapshot, session.chatManager());
drawDebug(pingTime, snapshot);
}
private void drawCrosshair() {
int x = Gdx.input.getX();
int y = Gdx.graphics.getHeight() - Gdx.input.getY();
Vector2 mouse = new Vector2(x, y);
mouse.x -= crossHairTexture.getWidth() / 2;
mouse.y -= crossHairTexture.getHeight() / 2;
batch.begin();
batch.draw(crossHairTexture, mouse.x, mouse.y);
batch.end();
}
private void drawDebug(Duration pingTime, Snapshot snapshot) {
String pingMillis = String.valueOf(pingTime.toMillis());
int entityCount = snapshot.entities().size();
textRenderer.setSize(15);
textRenderer.setColour(Color.RED);
textRenderer.drawString(batch, Gdx.graphics.getFramesPerSecond() + " fps", 10, screen.y - 10);
textRenderer.drawString(batch, eventBus.getMessagesPerFrame() + " mpf", 10, screen.y - 30);
textRenderer.drawString(batch, pingMillis + " ms ping", 10, screen.y - 50);
textRenderer.drawString(batch, entityCount + " entities", 10, screen.y - 70);
textRenderer.setColour(Color.BLACK);
}
}