control_SimpleNavigation.ts

import {Camera} from "../camera/Camera";
import {Control, IControlParams} from "./Control";
import {input} from "../input/input";

interface ISimpleNavigationParams extends IControlParams {
    speed?: number;
}

/**
 * Simple keyboard camera navigation with W,S,A,D and shift keys to fly around the scene.
 */
export class SimpleNavigation extends Control {
    public speed: number;

    constructor(options: ISimpleNavigationParams = {}) {
        super({
            name: "SimpleNavigation",
            autoActivate: true, ...options
        });
        this.speed = options.speed || 1.0;
    }

    override oninit() {

    }

    public override onactivate() {
        super.onactivate();
        let r = this.renderer!;
        r.events.on("keypress", input.KEY_W, this.onCameraMoveForward, this);
        r.events.on("keypress", input.KEY_S, this.onCameraMoveBackward, this);
        r.events.on("keypress", input.KEY_A, this.onCameraStrifeLeft, this);
        r.events.on("keypress", input.KEY_D, this.onCameraStrifeRight, this);
        r.events.on("keypress", input.KEY_UP, this.onCameraLookUp, this);
        r.events.on("keypress", input.KEY_DOWN, this.onCameraLookDown, this);
        r.events.on("keypress", input.KEY_LEFT, this.onCameraTurnLeft, this);
        r.events.on("keypress", input.KEY_RIGHT, this.onCameraTurnRight, this);
        r.events.on("keypress", input.KEY_Q, this.onCameraRollLeft, this);
        r.events.on("keypress", input.KEY_E, this.onCameraRollRight, this);
    }

    public override ondeactivate() {
        super.ondeactivate();
        let r = this.renderer!;
        r.events.off("keypress", input.KEY_W, this.onCameraMoveForward);
        r.events.off("keypress", input.KEY_S, this.onCameraMoveBackward);
        r.events.off("keypress", input.KEY_A, this.onCameraStrifeLeft);
        r.events.off("keypress", input.KEY_D, this.onCameraStrifeRight);
        r.events.off("keypress", input.KEY_UP, this.onCameraLookUp);
        r.events.off("keypress", input.KEY_DOWN, this.onCameraLookDown);
        r.events.off("keypress", input.KEY_LEFT, this.onCameraTurnLeft);
        r.events.off("keypress", input.KEY_RIGHT, this.onCameraTurnRight);
        r.events.off("keypress", input.KEY_Q, this.onCameraRollLeft);
        r.events.off("keypress", input.KEY_E, this.onCameraRollRight);
    }

    protected onCameraMoveForward() {
        if (this._active) {
            let cam = this.renderer!.activeCamera!;
            cam.slide(0, 0, -this.speed);
            cam.update();
        }
    }

    protected onCameraMoveBackward() {
        let cam = this.renderer!.activeCamera!;
        cam.slide(0, 0, this.speed);
        cam.update();
    }

    protected onCameraStrifeLeft() {
        let cam = this.renderer!.activeCamera!;
        cam.slide(-this.speed, 0, 0);
        cam.update();
    }

    protected onCameraStrifeRight() {
        let cam = this.renderer!.activeCamera!;
        cam.slide(this.speed, 0, 0);
        cam.update();
    }

    protected onCameraLookUp() {
        let cam = this.renderer!.activeCamera!;
        cam.pitch(0.5);
        cam.update();
    }

    protected onCameraLookDown() {
        let cam = this.renderer!.activeCamera!;
        cam.pitch(-0.5);
        cam.update();
    }

    protected onCameraTurnLeft() {
        let cam = this.renderer!.activeCamera!;
        cam.yaw(0.5);
        cam.update();
    }

    protected onCameraTurnRight() {
        let cam = this.renderer!.activeCamera!;
        cam.yaw(-0.5);
        cam.update();
    }

    protected onCameraRollLeft() {
        let cam = this.renderer!.activeCamera!;
        cam.roll(-0.5);
        cam.update();
    }

    protected onCameraRollRight() {
        let cam = this.renderer!.activeCamera!;
        cam.roll(0.5);
        cam.update();
    }
}