in src/component/pointer/EarthControlHandler.ts [51:201]
protected _enable(): void {
const earth$ = this._navigator.stateService.state$.pipe(
map(
(state: State): boolean => {
return state === State.Earth;
}),
publishReplay(1),
refCount());
const subs = this._subscriptions;
subs.push(earth$.pipe(
switchMap(
(earth: boolean): Observable<MouseEvent> => {
return earth ?
this._container.mouseService.mouseWheel$ :
observableEmpty();
}))
.subscribe(
(event: WheelEvent): void => {
event.preventDefault();
}));
subs.push(earth$.pipe(
switchMap(
(earth: boolean): Observable<[MouseEvent, MouseEvent]> => {
if (!earth) {
return observableEmpty();
}
return MouseOperator.filteredPairwiseMouseDrag$(this._component.name, this._container.mouseService).pipe(
filter(
([e1, e2]: [MouseEvent, MouseEvent]): boolean => {
return !(e1.ctrlKey && e2.ctrlKey);
}));
}),
withLatestFrom(
this._container.renderService.renderCamera$,
this._navigator.stateService.currentTransform$),
map(
([[previous, current], render, transform]: [[MouseEvent, MouseEvent], RenderCamera, Transform]): number[] => {
const planeNormal = [0, 0, 1];
const planePoint = [0, 0, -2];
const currentIntersection = this._planeIntersection(
current,
planeNormal,
planePoint,
render.perspective,
this._container.container);
const previousIntersection = this._planeIntersection(
previous,
planeNormal,
planePoint,
render.perspective,
this._container.container);
if (!currentIntersection || !previousIntersection) {
return null;
}
const direction = new THREE.Vector3()
.subVectors(currentIntersection, previousIntersection)
.multiplyScalar(-1)
.toArray();
return direction;
}),
filter(
(direction: number[]): boolean => {
return !!direction;
}))
.subscribe(
(direction: number[]): void => {
this._navigator.stateService.truck(direction);
}));
subs.push(earth$.pipe(
switchMap(
(earth: boolean): Observable<[MouseEvent, MouseEvent]> => {
if (!earth) {
return observableEmpty();
}
return MouseOperator.filteredPairwiseMouseDrag$(this._component.name, this._container.mouseService).pipe(
filter(
([e1, e2]: [MouseEvent, MouseEvent]): boolean => {
return e1.ctrlKey && e2.ctrlKey;
}));
}),
map(
([previous, current]: [MouseEvent, MouseEvent]): EulerRotation => {
return this._mousePairToRotation(previous, current);
}))
.subscribe(
(rotation: EulerRotation): void => {
this._navigator.stateService.orbit(rotation);
}));
subs.push(earth$.pipe(
switchMap(
(earth: boolean): Observable<[MouseEvent, MouseEvent]> => {
if (!earth) {
return observableEmpty();
}
return MouseOperator.filteredPairwiseMouseRightDrag$(this._component.name, this._container.mouseService).pipe(
filter(
([e1, e2]: [MouseEvent, MouseEvent]): boolean => {
return !e1.ctrlKey && !e2.ctrlKey;
}));
}),
map(
([previous, current]: [MouseEvent, MouseEvent]): EulerRotation => {
return this._mousePairToRotation(previous, current);
}))
.subscribe(
(rotation: EulerRotation): void => {
this._navigator.stateService.orbit(rotation);
}));
subs.push(earth$.pipe(
switchMap(
(earth: boolean): Observable<WheelEvent> => {
if (!earth) {
return observableEmpty();
}
return this._container.mouseService
.filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$);
}),
map(
(event: WheelEvent): number => {
let delta = event.deltaY;
if (event.deltaMode === 1) {
delta = 40 * delta;
} else if (event.deltaMode === 2) {
delta = 800 * delta;
}
const canvasSize = this._viewportCoords.containerToCanvas(this._container.container);
return -delta / canvasSize[1];
}))
.subscribe(
(delta: number): void => {
this._navigator.stateService.dolly(delta);
}));
}