package de.eightbitboy.ecorealms;

import com.badlogic.gdx.Application;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.g3d.Environment;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight;
import com.badlogic.gdx.math.Vector3;

import de.eightbitboy.ecorealms.config.EcoRealmsConfig;
import de.eightbitboy.ecorealms.control.Control;
import de.eightbitboy.ecorealms.control.ControlActionMapping;
import de.eightbitboy.ecorealms.map.Map;
import de.eightbitboy.ecorealms.world.meta.GridLines;
import de.eightbitboy.ecorealms.world.World;
import de.eightbitboy.ecorealms.world.meta.Gizmo;
import de.eightbitboy.ecorealms.world.tool.Highlighter;

public class EcoRealms extends ApplicationAdapter {
	private EcoRealmsConfig config;
	private Map map;
	private World world;

	private Environment environment;
	private PerspectiveCamera camera;
	private ModelBatch modelBatch;

	private Control control;
	private Gizmo gizmo;
	private GridLines gridLines;
	private Highlighter highlighter;

	public EcoRealms() {
		this.config = new EcoRealmsConfig();
	}

	@Override
	public void create() {
		Gdx.app.setLogLevel(Application.LOG_DEBUG);

		setupWorld();
		setupEnvironment();
		setupCamera();
		setupControl();

		modelBatch = new ModelBatch();
		gridLines = new GridLines(map);
		highlighter = new Highlighter();
		gizmo = new Gizmo();
	}

	@Override
	public void render() {
		Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
		Gdx.gl.glEnable(GL20.GL_BLEND);
		Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);

		control.updateCamera();
		ControlActionMapping.getInstance().update();
		camera.update();

		modelBatch.begin(camera);
		renderModels();
		modelBatch.end();
	}

	@Override
	public void dispose() {
		modelBatch.dispose();
	}

	private void renderModels() {
		modelBatch.render(world.getModelInstances(), environment);
		modelBatch.render(gridLines.getModelInstances(), environment);
		modelBatch.render(highlighter.getModelInstances(), environment);

		//noinspection ConstantConditions
		if(config.showGizmo) {
			modelBatch.render(gizmo.getModelInstances(), environment);
		}
	}

	private void setupWorld() {
		map = new Map(config.WORLD_SIZE_X, config.WORLD_SIZE_Y);
		world = new World(map);
	}

	private void setupEnvironment() {
		environment = new Environment();
		environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1f));
		environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, 1f, 0.5f, -0.8f));
	}

	private void setupCamera() {
		camera = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
		camera.position.set(-10f, -10f, 10f);
		camera.rotate(new Vector3(1, 0, 0), 90);
		camera.lookAt(0, 0, -5);
		camera.near = 1f;
		camera.far = 300f;
		camera.update();
	}

	private void setupControl() {
		control = new Control(camera, ControlActionMapping.getInstance(), map);
		Gdx.input.setInputProcessor(control);
	}
}

@@ -1399,17 +1399,16 @@
 DEBUG);%0A
-%0A
 %09%09setupW
@@ -1476,168 +1476,287 @@
 ();%0A
-%0A%09%09modelBatch = new ModelBatch();%0A%09%09gridLines = new GridLines(map
+%09%09setupRendering();%0A%09%7D%0A%0A%09@Override%0A%09public void render() %7B%0A%09%09executeGlFunctions();%0A%0A%09%09control.updateCamera();%0A%09%09ControlActionMapping.getInstance().update();%0A%09%09camera.update(
 );%0A
+%0A
 %09%09
-highlighter = new Highlighter();%0A%09%09gizmo = new Gizmo();%0A%09%7D%0A%0A%09@Override%0A%09public void render
+modelBatch.begin(camera);%0A%09%09renderModels();%0A%09%09modelBatch.end();%0A%09%7D%0A%0A%09private void executeGlFunctions
 () %7B
@@ -2012,232 +2012,8 @@
 HA);
-%0A%0A%09%09control.updateCamera();%0A%09%09ControlActionMapping.getInstance().update();%0A%09%09camera.update();%0A%0A%09%09modelBatch.begin(camera);%0A%09%09renderModels();%0A%09%09modelBatch.end();%0A%09%7D%0A%0A%09@Override%0A%09public void dispose() %7B%0A%09%09modelBatch.dispose();
 %0A%09%7D%0A
@@ -3173,11 +3173,237 @@
 rol);%0A%09%7D
+%0A%0A%09private void setupRendering() %7B%0A%09%09modelBatch = new ModelBatch();%0A%09%09gridLines = new GridLines(map);%0A%09%09highlighter = new Highlighter();%0A%09%09gizmo = new Gizmo();%0A%09%7D%0A%0A%09@Override%0A%09public void dispose() %7B%0A%09%09modelBatch.dispose();%0A%09%7D
 %0A%7D%0A

Rearrange code