Skip to content

Commit cb035a2

Browse files
committed
Implement Bike mode
Implements a "bike" or "vehicle" mode. Default speed resembles more a bike, when holding 'shift' the speed is more a car. Sticks the camera at height 2 from the ground.
1 parent e887c12 commit cb035a2

File tree

5 files changed

+45
-3
lines changed

5 files changed

+45
-3
lines changed

src/app/Config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ const Config = {
1010
MaxCameraDistance: 4000,
1111
SlippyMapTransitionDuration: 400,
1212
MinFreeCameraHeight: 10,
13+
FreeCameraBikeHeight: 2,
1314
CameraZoomSmoothing: 0.4,
1415
CameraZoomSpeed: 0.0005,
1516
CameraZoomTrackpadFactor: 4,
@@ -21,6 +22,10 @@ const Config = {
2122
GroundCameraSpeedFast: 1200,
2223
FreeCameraSpeed: 400,
2324
FreeCameraSpeedFast: 1200,
25+
BikeCameraSpeed: 10,
26+
BikeCameraSpeedFast: 50,
27+
BikeCameraNear: 1,
28+
CameraNear: 10,
2429
FreeCameraRotationSensitivity: 0.00002,
2530
FreeCameraYawSpeed: 0.8,
2631
FreeCameraPitchSpeed: 0.8,

src/app/controls/FreeControlsNavigator.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export default class FreeControlsNavigator extends ControlsNavigator {
2121
private yawMinusKeyPressed: boolean = false;
2222
private yawPlusKeyPressed: boolean = false;
2323
private pointerLocked: boolean = false;
24+
private bikeMode: boolean = false;
2425

2526
public constructor(
2627
element: HTMLElement,
@@ -216,11 +217,18 @@ export default class FreeControlsNavigator extends ControlsNavigator {
216217
};
217218
}
218219

220+
public setBikeMode(bikeMode: boolean): void {
221+
this.bikeMode = bikeMode;
222+
}
223+
219224
public update(deltaTime: number): void {
220225
const mat = this.camera.matrixWorld.values;
221226
const forwardDir = Vec3.normalize(new Vec3(mat[8], mat[9], mat[10]));
222227
const rightDir = Vec3.normalize(new Vec3(mat[0], mat[1], mat[2]));
223-
const speed = this.fastMovementKeyPressed ? Config.FreeCameraSpeedFast : Config.FreeCameraSpeed;
228+
const fastSpeed = this.bikeMode ? Config.BikeCameraSpeedFast : Config.FreeCameraSpeedFast;
229+
const slowSpeed = this.bikeMode ? Config.BikeCameraSpeed : Config.FreeCameraSpeed;
230+
231+
const speed = this.fastMovementKeyPressed ? fastSpeed : slowSpeed;
224232

225233
let movementDelta = new Vec3();
226234
if (this.forwardKeyPressed) {
@@ -242,7 +250,12 @@ export default class FreeControlsNavigator extends ControlsNavigator {
242250
this.camera.position.z += movementDelta.z;
243251

244252
const heightmapValue = this.getHeightmapValueAtPosition(this.camera.position.x, this.camera.position.z);
245-
this.camera.position.y = Math.max(this.camera.position.y, heightmapValue + Config.MinFreeCameraHeight);
253+
if (this.bikeMode) {
254+
this.camera.position.y = heightmapValue + Config.FreeCameraBikeHeight;
255+
} else {
256+
this.camera.position.y = Math.max(this.camera.position.y, heightmapValue + Config.MinFreeCameraHeight);
257+
}
258+
246259

247260
this.camera.updateMatrix();
248261

src/app/controls/GroundControlsNavigator.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export default class GroundControlsNavigator extends ControlsNavigator {
4848
public switchToSlippy: boolean = false;
4949
private transitionYawFrom: number = 0;
5050
private transitionPitchFrom: number = 0;
51+
private bikeMode: boolean = false;
5152

5253
public constructor(
5354
element: HTMLElement,
@@ -335,8 +336,13 @@ export default class GroundControlsNavigator extends ControlsNavigator {
335336
}
336337
}
337338

339+
public setBikeMode(bikeMode: boolean): void {
340+
this.bikeMode = bikeMode;
341+
this.updateCameraProjectionMatrix();
342+
}
343+
338344
private updateCameraProjectionMatrix(): void {
339-
this.camera.near = 10;
345+
this.camera.near = this.bikeMode ? Config.BikeCameraNear : Config.CameraNear;
340346
this.camera.far = 100000;
341347
this.camera.updateProjectionMatrix();
342348
}

src/app/systems/ControlsSystem.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export enum NavigationMode {
3232
export default class ControlsSystem extends System {
3333
private readonly element: HTMLElement;
3434
public mode: NavigationMode = NavigationMode.Ground;
35+
public bikeMode: boolean = false;
3536
private camera: PerspectiveCamera;
3637
private tick: number = 0;
3738
public target: Vec3 = new Vec3();
@@ -179,7 +180,21 @@ export default class ControlsSystem extends System {
179180
this.freeNavigator.enable();
180181
this.freeNavigator.syncWithCamera(this.groundNavigator);
181182
}
183+
} else if (e.code === 'KeyB') {
184+
e.preventDefault();
185+
186+
this.bikeMode = !this.bikeMode;
187+
188+
this.freeNavigator.setBikeMode(this.bikeMode);
189+
this.groundNavigator.setBikeMode(this.bikeMode);
190+
191+
this.mode = NavigationMode.Free;
192+
this.activeNavigator = this.freeNavigator;
193+
this.groundNavigator.disable();
194+
this.freeNavigator.enable();
195+
this.freeNavigator.syncWithCamera(this.groundNavigator);
182196
}
197+
183198
}
184199

185200
private mouseDownEvent(e: MouseEvent): void {

src/app/ui/components/InfoModalPanel/InfoModalPanel.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ const KeysConfig: {keys: JSX.Element; desc: string}[] = [
2929
}, {
3030
keys: <Key text='Tab'/>,
3131
desc: 'Toggle between ground camera mode (default) and free camera mode'
32+
}, {
33+
keys: <Key text='B'/>,
34+
desc: 'Toggle between bike and free camera mode'
3235
}, {
3336
keys: <><Key text='Ctrl'/> + <Key text='P'/></>,
3437
desc: 'Purge all loaded tiles'

0 commit comments

Comments
 (0)