package com.javamarcher.gamestate;
import org.joml.Vector3f;
import com.javamarcher.animation.CameraAnimationController;
import com.javamarcher.configuration.GlobalConfig;
import com.javamarcher.ecs.component.CameraTransform;
import com.javamarcher.renderer.Renderer;
import com.javamarcher.systems.Camera;
import com.javamarcher.systems.CameraMovementSystem;
import com.javamarcher.systems.CameraSystem;
import com.javamarcher.tweening.CamTransformTweenAccessor;
import com.javamarcher.tweening.FloatTweenAccessor;
import com.javamarcher.tweening.Vector3fTweenAccessor;
import at.fhooe.mtd.ecs.Engine;
import aurelienribon.tweenengine.Tween;
import aurelienribon.tweenengine.TweenManager;
import aurelienribon.tweenengine.equations.Quad;
/**
* Basic main state for the whole execution of the JavaMarcher.
* <ul>
* <li>Rendering into a full screen quad</li>
* <li>Camera</li>
* <li>Shader handling</li>
* </ul>
*/
public class MainState implements GameState {
// The quad is a non entity system entity
private final Renderer quad = new Renderer();
// ECS ****************************************************************
private final Engine engine = new Engine();
private final CameraSystem cameraSystem = new CameraSystem(true);
private final CameraMovementSystem cameraMovementSystem = new CameraMovementSystem();
// ********************************************************************
// Hack to stop animations :/
public static final TweenManager tweenManager = new TweenManager();
private CameraAnimationController camAnimController;
@Override
public void start() {
// Register tween accessor
Tween.registerAccessor(CameraTransform.class, new CamTransformTweenAccessor());
Tween.registerAccessor(Vector3f.class, new Vector3fTweenAccessor());
Tween.registerAccessor(Float.class, new FloatTweenAccessor());
engine.addSystem(cameraSystem);
Camera defaultCamera = cameraSystem.getDefaultCamera();
defaultCamera.getTransform().translate(new Vector3f(0, 1f, -2f));
quad.setCameraSystem(cameraSystem);
engine.addSystem(cameraMovementSystem);
camAnimController = new CameraAnimationController(defaultCamera.getTransform(), 0.15f, -25f, 1.5f, tweenManager);
camAnimController.start();
quad.start();
// Sun tweening
if(GlobalConfig.IS_ANIMATION_CONTROLLED) {
Tween.to(GlobalConfig.SUN_DIRECTION, Vector3fTweenAccessor.POSITION_Y, 42f)
.target(GlobalConfig.SUN_DIRECTION.y + 0.8f)
.repeatYoyo(Tween.INFINITY, 0f).ease(Quad.INOUT).start(tweenManager);
}
}
@Override
public void update(double deltaTime) {
tweenManager.update((float) deltaTime);
camAnimController.update(deltaTime);
engine.update(deltaTime);
quad.update(deltaTime);
}
@Override
public void destroy() {
engine.dispose();
quad.destroy();
camAnimController.destroy();
}
}