Skip to content

Commit 930cba2

Browse files
committed
re-introduce camera shake
1 parent f05cafc commit 930cba2

10 files changed

+95
-74
lines changed

src/common/default-settings.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const defaultSettingsV6: SettingsV6 = {
3030
sceneController: "@titan-reactor-plugins/auto-observer",
3131
vrController: "@titan-reactor-plugins/vr-controller",
3232
dampingFactor: 0.1,
33-
cameraShakeStrength: 1,
33+
cameraShakeStrength: 5,
3434
movementSpeed: 1.15,
3535
rotateSpeed: 0.15,
3636
zoomLevels: [ 0.5, 1, 2 ],

src/common/get-app-settings-leva-config.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,8 @@ const getInputConfig = (
306306
label: "Camera Shake Strength",
307307
value: input.cameraShakeStrength,
308308
min: 0,
309-
max: 1,
309+
max: 20,
310+
step: 0.5
310311
},
311312
"input.unitSelection": {
312313
label: "Enable Unit Selection",

src/core/model-effects.ts

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ export const overlayEffectsMainImage: { image: Image3D | null } = { image: null
2020
export const applyRenderModeToSprite = (
2121
spriteTypeId: number,
2222
sprite: SpriteType,
23-
terrainY: number
2423
) => {
2524
sprite.rotation.x = 0;
2625
if ( modelSetModifiers.sprites[spriteTypeId] ) {

src/core/world/openbw-composer.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import {
77
speedHandler,
88
} from "@openbw/speed-handler";
99
import { buildSound } from "@utils/sound-utils";
10-
import { floor32 } from "common/utils/conversions";
11-
import { SceneComposer } from "./scene-composer";
10+
import { PxToWorld, floor32 } from "common/utils/conversions";
1211
import { MathUtils } from "three";
1312
import { createCompletedUpgradesHelper } from "@openbw/completed-upgrades";
1413
import { ViewControllerComposer } from "@core/world/view-controller-composer";
1514
import { World } from "./world";
1615
import { Timer } from "@utils/timer";
1716
import { borrow, Borrowed } from "@utils/object-utils";
1817
import { SimpleBufferView } from "@openbw/structs/simple-buffer-view";
18+
import { Creep } from "..";
1919

2020
export type OpenBwComposer = ReturnType<typeof createOpenBWComposer>;
2121
export type OpenBwComposerApi = OpenBwComposer["api"];
@@ -31,7 +31,8 @@ export type OpenBwComposerApi = OpenBwComposer["api"];
3131
*/
3232
export const createOpenBWComposer = (
3333
world: World,
34-
scene: Pick<SceneComposer, "pxToWorld" | "terrainExtra">,
34+
pxToWorld: PxToWorld,
35+
creep: Creep,
3536
viewInput: ViewControllerComposer
3637
) => {
3738
let _currentFrame = 0;
@@ -55,7 +56,7 @@ export const createOpenBWComposer = (
5556
y,
5657
typeId,
5758
unitTypeId,
58-
scene.pxToWorld,
59+
pxToWorld,
5960
viewInput.primaryViewport!.audioType,
6061
viewInput.primaryViewport!.projectedView,
6162
soundChannels
@@ -91,7 +92,7 @@ export const createOpenBWComposer = (
9192
const buildCreep = ( frame: number ) => {
9293
_tiles.address = world.openBW.getTilesPtr();
9394
_tiles.viewSize = world.openBW.getTilesSize();
94-
scene.terrainExtra.creep.generate( _tiles, frame );
95+
creep.generate( _tiles, frame );
9596
};
9697

9798
let lastElapsed = 0;
@@ -113,7 +114,7 @@ export const createOpenBWComposer = (
113114
y,
114115
typeId,
115116
unitTypeId,
116-
scene.pxToWorld,
117+
pxToWorld,
117118
viewInput.primaryViewport!.audioType,
118119
viewInput.primaryViewport!.projectedView,
119120
soundChannels
@@ -141,7 +142,7 @@ export const createOpenBWComposer = (
141142
world.openBW.generateFrame();
142143
_tiles.address = world.openBW.getTilesPtr();
143144
_tiles.viewSize = world.openBW.getTilesSize();
144-
scene.terrainExtra.creep.generateImmediate( _tiles );
145+
creep.generateImmediate( _tiles );
145146
},
146147
update( elapsed: number, frame: number ) {
147148
lastElapsed = elapsed;

src/core/world/overlay-composer.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
Mesh,
1111
PlaneGeometry,
1212
Raycaster,
13+
Texture,
1314
Vector2,
1415
} from "three";
1516
import { SceneComposer } from "./scene-composer";
@@ -24,6 +25,7 @@ import { SurfaceComposer } from "./surface-composer";
2425
import { PostProcessingComposer } from "./postprocessing-composer";
2526
import { InputsComposer } from "./input-composer";
2627
import { ViewControllerComposer } from "./view-controller-composer";
28+
import { Creep } from "..";
2729

2830
export type OverlayComposer = {
2931
api: {
@@ -47,13 +49,14 @@ const white = new Color( 0xffffff );
4749
export const createOverlayComposer = (
4850
world: World,
4951
{
50-
terrainExtra,
5152
units,
5253
}: SceneComposer,
5354
surfaces: SurfaceComposer,
5455
inputs: InputsComposer,
5556
post: PostProcessingComposer,
5657
viewports: ViewControllerComposer,
58+
creep: Creep,
59+
minimapTex: Texture,
5760
assets: Assets
5861
): OverlayComposer => {
5962
const janitor = new Janitor( "OverlayComposer" );
@@ -82,7 +85,7 @@ export const createOverlayComposer = (
8285

8386
const minimapMaterial = new MinimapMaterial(
8487
...world.map.size,
85-
terrainExtra.minimapTex
88+
minimapTex
8689
);
8790

8891
const minimap = new Mesh( new PlaneGeometry( 1, 1 ), minimapMaterial );
@@ -313,7 +316,7 @@ export const createOverlayComposer = (
313316
onFrame() {
314317
minimapMaterial.update(
315318
world.fogOfWar.buffer,
316-
terrainExtra.creep.minimapImageData,
319+
creep.minimapImageData,
317320
world.fogOfWar.effect.opacity
318321
);
319322

src/core/world/postprocessing-composer.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { ViewControllerComposer } from "@core/world/view-controller-composer";
1414
import { World } from "./world";
1515
import { isImageHd, isMesh } from "@utils/image-utils";
1616
import { createTransition } from "./transition";
17+
import { Terrain } from "@core/terrain";
1718

1819
//tank base, minerals
1920
const ignoreRecieveShadow = [250, 253, 347, 349, 351];
@@ -27,8 +28,9 @@ export type PostProcessingComposerApi = PostProcessingComposer["api"];
2728
// Renders each viewport.
2829
export const createPostProcessingComposer = (
2930
world: World,
30-
{ scene, images, sprites, terrain, ...sceneComposer }: SceneComposer,
31+
{ scene, images, sprites, ...sceneComposer }: SceneComposer,
3132
viewportsComposer: ViewControllerComposer,
33+
terrain: Terrain,
3234
assets: Assets
3335
) => {
3436
const janitor = new Janitor("PostProcessingComposer");
@@ -147,7 +149,7 @@ export const createPostProcessingComposer = (
147149
return {
148150
precompile(camera: PerspectiveCamera | OrthographicCamera) {
149151
_changeRenderMode(false);
150-
sceneComposer.onFrame(0, 0, false);
152+
sceneComposer.onFrame(0, false);
151153

152154
renderComposer.glRenderer.compile(scene, camera);
153155
},

src/core/world/scene-composer.ts

+23-51
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
} from "@core/model-effects";
1212
import { SpriteEntities } from "@core/sprite-entities";
1313
import { UnitEntities } from "@core/unit-entities";
14-
import { terrainComposer } from "@image/generate-map/terrain-composer";
1514
import BaseScene from "@render/base-scene";
1615
import {
1716
imageIsDoodad,
@@ -24,72 +23,51 @@ import {
2423
import { Janitor, JanitorLogLevel } from "three-janitor";
2524
import { spriteIsHidden, spriteSortOrder } from "@utils/sprite-utils";
2625
import { calculateFollowedUnitsTarget, unitIsCompleted, unitIsFlying } from "@utils/unit-utils";
27-
import { drawFunctions, imageTypes, unitTypes } from "common/enums";
28-
import { ImageStruct, UnitStruct, UnitTileScale } from "common/types";
26+
import { drawFunctions, imageTypes } from "common/enums";
27+
import { ImageStruct, UnitStruct } from "common/types";
2928
import { Assets } from "@image/assets";
30-
import { floor32, makePxToWorld } from "common/utils/conversions";
29+
import { PxToWorld, floor32 } from "common/utils/conversions";
3130
import { Color, MathUtils, Vector2, Vector3 } from "three";
3231
import { World } from "./world";
3332
import { Unit } from "@core/unit";
3433
import { IterableSet } from "@utils/data-structures/iterable-set";
3534
import { borrow, Borrowed } from "@utils/object-utils";
3635
import { getJanitorLogLevel } from "@ipc/global";
37-
import { getMapTiles } from "@utils/chk-utils";
3836
import { ImageBase } from "..";
3937
import { ImageHDMaterial } from "@core/image-hd-material";
4038
import { calculateImagesFromTechTreeUnit } from "@utils/preload-map-units-and-sprites";
4139
import { IterableMap } from "@utils/data-structures/iteratible-map";
4240
import { SimpleQuadtree } from "@utils/data-structures/simple-quadtree";
4341
import { settingsStore } from "@stores/settings-store";
42+
import { HeightMaps } from "@image/generate-map";
43+
import { Terrain } from "@core/terrain";
44+
import { ViewControllerComposer } from "./view-controller-composer";
45+
import gameStore from "@stores/game-store";
4446

4547
export type SceneComposer = Awaited<ReturnType<typeof createSceneComposer>>;
4648
export type SceneComposerApi = SceneComposer["api"];
4749

4850
const white = new Color( 0xffffff );
4951

52+
type AdditionalSceneParams = {
53+
terrain: Terrain;
54+
heightMaps: HeightMaps,
55+
pxToWorld: PxToWorld
56+
}
57+
5058
// Primarily concerned about converting OpenBW state to three objects and animations
51-
export const createSceneComposer = async ( world: World, assets: Assets ) => {
59+
export const createSceneComposer = async ( world: World, assets: Assets, viewController: ViewControllerComposer, { terrain, pxToWorld, heightMaps } : AdditionalSceneParams ) => {
5260
const janitor = new Janitor( "SceneComposer" );
53-
54-
const { terrain, ...terrainExtra } = janitor.mop(
55-
await terrainComposer(
56-
...world.map.size,
57-
world.map.tileset,
58-
getMapTiles( world.map ),
59-
UnitTileScale.HD
60-
),
61-
"terrain"
62-
);
63-
64-
const pxToWorld = makePxToWorld( ...world.map.size, terrain.getTerrainY );
65-
const pxToWorldFlat = makePxToWorld( ...world.map.size, () => 0);
66-
67-
const startLocations = world.map.units
68-
.filter( ( u ) => u.unitId === unitTypes.startLocation )
69-
.map( ( u ) => {
70-
const location = pxToWorld.xyz( u.x, u.y, new Vector3() );
71-
72-
const player = world.players.find( ( p ) => p.id === u.player );
73-
if ( player ) {
74-
player.startLocation = (new Vector3).copy( location );
75-
}
76-
77-
return location
78-
})
79-
80-
const playerWithStartLocation = world.players.find(p => p.startLocation);
81-
const initialStartLocation = playerWithStartLocation ? playerWithStartLocation.startLocation ?? new Vector3() : startLocations[0] ?? new Vector3();
82-
8361
const _world = borrow( world );
8462

8563
const units = new UnitEntities();
8664
units.externalOnClearUnits = () => _world.events!.emit( "units-cleared" );
8765
units.externalOnCreateUnit = ( unit ) => _world.events!.emit( "unit-created", unit );
8866

8967
world.openBW.uploadHeightMap(
90-
terrainExtra.heightMaps.singleChannel,
91-
( terrainExtra.heightMaps.texture.image as ImageData ).width,
92-
( terrainExtra.heightMaps.texture.image as ImageData ).height
68+
heightMaps.singleChannel,
69+
( heightMaps.texture.image as ImageData ).width,
70+
( heightMaps.texture.image as ImageData ).height
9371
);
9472

9573
const scene = janitor.mop(
@@ -312,6 +290,12 @@ export const createSceneComposer = async ( world: World, assets: Assets ) => {
312290

313291
if ( unit ) {
314292
images.setUnit( image, unit );
293+
if (unit.isAttacking) {
294+
const weapon = gameStore().assets?.bwDat.weapons[unit.extras.dat.groundWeapon] || gameStore().assets?.bwDat.weapons[unit.extras.dat.airWeapon];
295+
if (weapon) {
296+
viewController.doShakeCalculation(weapon.explosionType, weapon.damageType, sprite.position);
297+
}
298+
}
315299
}
316300

317301
if ( isImage3d( image ) ) {
@@ -331,7 +315,6 @@ export const createSceneComposer = async ( world: World, assets: Assets ) => {
331315
applyRenderModeToSprite(
332316
spriteStruct.typeId,
333317
sprite,
334-
terrain.getTerrainY( sprite.position.x, sprite.position.z )
335318
);
336319

337320
sprite.updateMatrix();
@@ -370,7 +353,6 @@ export const createSceneComposer = async ( world: World, assets: Assets ) => {
370353
Janitor.logLevel = getJanitorLogLevel();
371354
} );
372355

373-
const pxToWorldInverse = makePxToWorld( ...world.map.size, terrain.getTerrainY, true );
374356

375357
return {
376358
images,
@@ -381,15 +363,8 @@ export const createSceneComposer = async ( world: World, assets: Assets ) => {
381363
selectedUnits,
382364
followedUnits,
383365
scene,
384-
terrain,
385-
terrainExtra,
386-
pxToWorld,
387-
pxToWorldInverse,
388-
pxToWorldFlat,
389-
startLocations,
390366
onFrame(
391367
delta: number,
392-
elapsed: number,
393368
renderMode3D: boolean,
394369
) {
395370

@@ -452,16 +427,13 @@ export const createSceneComposer = async ( world: World, assets: Assets ) => {
452427
_world.fogOfWar!.forceInstantUpdate = true;
453428
},
454429
pxToWorld,
455-
pxToWorldFlat,
456430
get units() : IterableMap<number, Unit> {
457431
return units.units
458432
},
459433
imageQuadtree,
460434
unitQuadtree,
461435
scene,
462436
followedUnits,
463-
startLocations,
464-
initialStartLocation,
465437
//TODO: extend followedunits instead
466438
getFollowedUnitsCenterPosition: () => calculateFollowedUnitsTarget( followedUnits, pxToWorld ),
467439
selectedUnits,

0 commit comments

Comments
 (0)