@shopware-ag/dive
Version:
Shopware Spatial Framework
64 lines (54 loc) • 1.81 kB
text/typescript
import { PerspectiveCamera } from 'three';
import {
DEFAULT_LAYER_MASK,
HELPER_LAYER_MASK,
PRODUCT_LAYER_MASK,
UI_LAYER_MASK,
} from '../constant/VisibilityLayerMask.ts';
export type DIVEPerspectiveCameraSettings = {
fov: number;
near: number;
far: number;
};
export const DIVEPerspectiveCameraDefaultSettings: DIVEPerspectiveCameraSettings =
{
fov: 70,
near: 0.1,
far: 1000,
};
/**
* A Perspective camera. Can change the layer mask to show different objects.
*
* @module
*/
export default class DIVEPerspectiveCamera extends PerspectiveCamera {
public static readonly EDITOR_VIEW_LAYER_MASK =
DEFAULT_LAYER_MASK |
UI_LAYER_MASK |
HELPER_LAYER_MASK |
PRODUCT_LAYER_MASK;
public static readonly LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;
public onSetCameraLayer: (mask: number) => void = () => {};
constructor(
settings: Partial<DIVEPerspectiveCameraSettings> = DIVEPerspectiveCameraDefaultSettings,
) {
super(
settings.fov || DIVEPerspectiveCameraDefaultSettings.fov,
1,
settings.near || DIVEPerspectiveCameraDefaultSettings.near,
settings.far || DIVEPerspectiveCameraDefaultSettings.far,
);
this.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
}
public OnResize(width: number, height: number): void {
this.aspect = width / height;
this.updateProjectionMatrix();
}
public SetCameraLayer(layer: 'LIVE' | 'EDITOR'): void {
this.layers.mask =
layer === 'LIVE'
? DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK
: DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;
this.onSetCameraLayer(this.layers.mask);
}
}