polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
97 lines (88 loc) • 3 kB
text/typescript
/**
* Creates a perspective camera.
*
*
*/
import {Constructor} from '../../../types/GlobalTypes';
import {PerspectiveCamera} from 'three/src/cameras/PerspectiveCamera';
import {
TypedThreejsCameraObjNode,
BASE_CAMERA_DEFAULT,
ThreejsCameraTransformParamConfig,
CameraMasterCameraParamConfig,
} from './_BaseCamera';
const DEFAULT = {
fov: 50,
};
// const EVENT_CHANGE = { type: 'change' };
import {ParamConfig, NodeParamsConfig} from '../utils/params/ParamsConfig';
import {CameraRenderParamConfig} from './utils/cameras/RenderController';
import {CameraPostProcessParamConfig} from './utils/cameras/PostProcessController';
import {LayerParamConfig} from './utils/LayersController';
import {TransformedParamConfig} from './utils/TransformController';
import {CameraNodeType} from '../../poly/NodeContext';
export function PerspectiveCameraObjParamConfigMixin<TBase extends Constructor>(Base: TBase) {
return class Mixin extends Base {
/** @param field of view */
fov = ParamConfig.FLOAT(DEFAULT.fov, {range: [0, 100]});
// vertical_fov_range = ParamConfig.VECTOR2([0, 100], {visibleIf: {lock_width: 1}});
// horizontal_fov_range = ParamConfig.VECTOR2([0, 100], {visibleIf: {lock_width: 0}});
};
}
class PerspectiveCameraObjParamConfig extends CameraPostProcessParamConfig(
CameraRenderParamConfig(
LayerParamConfig(
CameraMasterCameraParamConfig(
PerspectiveCameraObjParamConfigMixin(
ThreejsCameraTransformParamConfig(
TransformedParamConfig(NodeParamsConfig, {matrixAutoUpdate: true})
)
)
)
)
)
) {}
const ParamsConfig = new PerspectiveCameraObjParamConfig();
export class PerspectiveCameraObjNode extends TypedThreejsCameraObjNode<
PerspectiveCamera,
PerspectiveCameraObjParamConfig
> {
params_config = ParamsConfig;
static type(): Readonly<CameraNodeType.PERSPECTIVE> {
return CameraNodeType.PERSPECTIVE;
}
create_object() {
return new PerspectiveCamera(DEFAULT.fov, 1, BASE_CAMERA_DEFAULT.near, BASE_CAMERA_DEFAULT.far);
}
update_camera() {
if (this._object.fov != this.pv.fov) {
this._object.fov = this.pv.fov;
this._object.updateProjectionMatrix();
}
this._update_for_aspect_ratio();
}
protected _update_for_aspect_ratio() {
if (this._aspect) {
// let lock_width = true;//this.pv.lock_width;
this._object.aspect = this._aspect;
// if (lock_width) {
// const other_fov = this.pv.fov / this._aspect;
// this._object.zoom = this.get_zoom(this._aspect, other_fov, this.pv.vertical_fov_range);
// } else {
// this._object.zoom = 1;
// }
this._object.updateProjectionMatrix();
}
}
// private get_zoom(start_zoom: number, other_fov: number, range: Vector2) {
// let zoom = start_zoom;
// if (range) {
// if (other_fov < range.x || other_fov > range.y) {
// const new_other_fov = lodash_clamp(other_fov, range.x, range.y);
// zoom = start_zoom * (other_fov / new_other_fov);
// // zoom = Math.min(start_zoom, zoom)
// }
// }
// return zoom;
// }
}