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); } } }