package com.javamarcher.animation;
import org.joml.Vector3f;
import com.javamarcher.configuration.GlobalConfig;
import com.javamarcher.ecs.component.CameraTransform;
import com.javamarcher.gamestate.Notifiable;
import com.javamarcher.tweening.CamTransformTweenAccessor;
import com.javamarcher.tweening.Vector3fTweenAccessor;
import aurelienribon.tweenengine.BaseTween;
import aurelienribon.tweenengine.Tween;
import aurelienribon.tweenengine.TweenCallback;
import aurelienribon.tweenengine.TweenManager;
import aurelienribon.tweenengine.equations.Quad;
public class CameraAnimationController implements Notifiable {
private final CameraTransform camTransform;
private final float movementSpeed;
private float yawOffset;
private final float pitchOffset;
private final TweenManager tweenManager;
private final Vector3f camForward = new Vector3f();
private final float pitchTime = 6;
private final float yawTime = 15f;
private Vector3f currentYawOffset = new Vector3f(0f, 0f, 0f);
public CameraAnimationController(CameraTransform camTransform, float movementSpeed, float yawOffset, float pitchOffset, TweenManager tweenManager) {
this.camTransform = camTransform;
this.movementSpeed = movementSpeed;
this.tweenManager = tweenManager;
this.yawOffset = yawOffset;
this.pitchOffset = pitchOffset;
}
@Override
public void start() {
if(GlobalConfig.IS_ANIMATION_CONTROLLED) {
Tween.to(camTransform, CamTransformTweenAccessor.ROTATION_PITCH, pitchTime)
.target(pitchOffset).ease(Quad.INOUT)
.setCallback(new TweenFinishedHandler(-pitchOffset, CamTransformTweenAccessor.ROTATION_PITCH))
.start(tweenManager);
Tween.to(currentYawOffset, Vector3fTweenAccessor.POSITION_Y, yawTime)
.target(yawOffset)
.ease(Quad.INOUT)
.setCallback(new YawTweenFinishedHandler(-yawOffset))
.start(tweenManager);
}
}
@Override
public void update(double deltaTime) {
if(GlobalConfig.IS_ANIMATION_CONTROLLED) {
translateCamera();
camTransform.setYaw(90f + currentYawOffset.y);
}
}
private void translateCamera() {
camForward.set(camTransform.forward);
camTransform.translate(camForward.mul(movementSpeed));
}
@Override
public void destroy() {
// Nothing to do here
}
private final class YawTweenFinishedHandler implements TweenCallback {
private final float offset;
public YawTweenFinishedHandler(float offset) {
this.offset = offset;
}
@Override
public void onEvent(int type, BaseTween<?> source) {
Tween.to(currentYawOffset, Vector3fTweenAccessor.POSITION_Y, yawTime)
.target(offset)
.ease(Quad.INOUT)
.setCallback(new YawTweenFinishedHandler(-offset))
.start(tweenManager);
}
}
private final class TweenFinishedHandler implements TweenCallback {
private float offset;
private final int tweenType;
public TweenFinishedHandler(float offset, int tweenType) {
this.offset = offset;
this.tweenType = tweenType;
}
@Override
public void onEvent(int type, BaseTween<?> source) {
Tween.to(camTransform, tweenType, pitchTime)
.target(offset).ease(Quad.INOUT)
.setCallback(new TweenFinishedHandler(-offset, tweenType))
.start(tweenManager);
}
}
}