@directivegames/genesys.js 3.1.24 → 3.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/games/animation-demo.d.ts +1 -1
- package/dist/games/animation-demo.js +2 -2
- package/dist/games/animation-retarget-demo.d.ts +1 -1
- package/dist/games/animation-retarget-demo.js +3 -3
- package/dist/games/behavior-tree-demo.d.ts +1 -1
- package/dist/games/behavior-tree-demo.js +2 -2
- package/dist/games/character_animation.d.ts +1 -1
- package/dist/games/character_animation.js +2 -2
- package/dist/games/collision-demo.d.ts +1 -1
- package/dist/games/collision-demo.js +2 -2
- package/dist/games/deprecated/advanced-grid-demo.d.ts +1 -1
- package/dist/games/deprecated/advanced-grid-demo.js +2 -2
- package/dist/games/deprecated/airplane-demo.d.ts +1 -1
- package/dist/games/deprecated/airplane-demo.js +2 -2
- package/dist/games/deprecated/character-controller.d.ts +1 -1
- package/dist/games/deprecated/character-controller.js +2 -2
- package/dist/games/deprecated/chase-game.d.ts +1 -1
- package/dist/games/deprecated/chase-game.js +2 -2
- package/dist/games/deprecated/collision-config.d.ts +1 -1
- package/dist/games/deprecated/collision-config.js +2 -2
- package/dist/games/deprecated/door-demo.d.ts +1 -1
- package/dist/games/deprecated/door-demo.js +2 -2
- package/dist/games/deprecated/fps-demo.d.ts +1 -1
- package/dist/games/deprecated/fps-demo.js +2 -2
- package/dist/games/deprecated/fps-shotgun-demo.d.ts +1 -1
- package/dist/games/deprecated/fps-shotgun-demo.js +2 -2
- package/dist/games/deprecated/lightmapping-demo.d.ts +1 -1
- package/dist/games/deprecated/lightmapping-demo.js +2 -2
- package/dist/games/deprecated/lights-demo.d.ts +1 -1
- package/dist/games/deprecated/lights-demo.js +2 -2
- package/dist/games/deprecated/matcap-demo.d.ts +1 -1
- package/dist/games/deprecated/matcap-demo.js +2 -2
- package/dist/games/deprecated/material-demo-2.d.ts +1 -1
- package/dist/games/deprecated/material-demo-2.js +2 -2
- package/dist/games/deprecated/material-demo.d.ts +1 -1
- package/dist/games/deprecated/material-demo.js +2 -2
- package/dist/games/deprecated/memory-leak-test.d.ts +1 -1
- package/dist/games/deprecated/memory-leak-test.js +2 -2
- package/dist/games/deprecated/model-stress-test.d.ts +1 -1
- package/dist/games/deprecated/model-stress-test.js +2 -2
- package/dist/games/deprecated/multiplayer-demo.d.ts +1 -1
- package/dist/games/deprecated/multiplayer-demo.js +2 -2
- package/dist/games/deprecated/physics-demo.d.ts +1 -1
- package/dist/games/deprecated/physics-demo.js +2 -2
- package/dist/games/deprecated/shadow-demo.d.ts +1 -1
- package/dist/games/deprecated/shadow-demo.js +2 -2
- package/dist/games/deprecated/shooting-demo.d.ts +1 -1
- package/dist/games/deprecated/shooting-demo.js +2 -2
- package/dist/games/deprecated/skybox-demo.d.ts +1 -1
- package/dist/games/deprecated/skybox-demo.js +2 -2
- package/dist/games/deprecated/sound-demo.d.ts +1 -1
- package/dist/games/deprecated/sound-demo.js +2 -2
- package/dist/games/deprecated/timer-demo.d.ts +1 -1
- package/dist/games/deprecated/timer-demo.js +2 -2
- package/dist/games/deprecated/voxel-demo.d.ts +1 -1
- package/dist/games/deprecated/voxel-demo.js +2 -2
- package/dist/games/deprecated/world-commands.d.ts +1 -1
- package/dist/games/deprecated/world-commands.js +2 -2
- package/dist/games/deprecated/world-loading.d.ts +1 -1
- package/dist/games/deprecated/world-loading.js +2 -2
- package/dist/games/examples/fps-advanced/enemies.d.ts +1 -1
- package/dist/games/examples/fps-advanced/enemies.js +2 -2
- package/dist/games/examples/fps-advanced/game-mode.d.ts +1 -1
- package/dist/games/examples/fps-advanced/game-mode.js +2 -2
- package/dist/games/examples/fps-advanced/game.d.ts +1 -1
- package/dist/games/examples/fps-advanced/game.js +2 -2
- package/dist/games/examples/fps-advanced/pickups.d.ts +1 -1
- package/dist/games/examples/fps-advanced/pickups.js +2 -2
- package/dist/games/examples/fps-advanced/player.d.ts +1 -1
- package/dist/games/examples/fps-advanced/player.js +2 -2
- package/dist/games/examples/fps-advanced/ui/endgame-ui.d.ts +1 -1
- package/dist/games/examples/fps-advanced/ui/endgame-ui.js +2 -2
- package/dist/games/examples/fps-advanced/ui/menu-ui.d.ts +1 -1
- package/dist/games/examples/fps-advanced/ui/menu-ui.js +2 -2
- package/dist/games/examples/fps-advanced/ui/weapon-hud.d.ts +1 -1
- package/dist/games/examples/fps-advanced/weapons.d.ts +1 -1
- package/dist/games/examples/fps-advanced/weapons.js +2 -2
- package/dist/games/examples/plugin-demo/game.d.ts +1 -1
- package/dist/games/examples/plugin-demo/game.js +3 -3
- package/dist/games/examples/plugin-demo/plugins/dynamic-lighting.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/dynamic-lighting.js +2 -2
- package/dist/games/examples/plugin-demo/plugins/instanced-forest.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/instanced-forest.js +2 -2
- package/dist/games/examples/plugin-demo/plugins/particle-fountain.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/particle-fountain.js +2 -2
- package/dist/games/examples/plugin-demo/plugins/physics-playground.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/physics-playground.js +2 -2
- package/dist/games/examples/plugin-demo/plugins/robot-follower.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/robot-follower.js +2 -2
- package/dist/games/examples/plugin-demo/plugins/scatter-models.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/scatter-models.js +2 -2
- package/dist/games/examples/plugin-demo/plugins/simple-cube.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/simple-cube.js +2 -2
- package/dist/games/examples/plugin-demo/plugins/tic-tac-toe.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/tic-tac-toe.js +2 -2
- package/dist/games/examples/plugin-demo/plugins/wobbling-sphere.d.ts +1 -1
- package/dist/games/examples/plugin-demo/plugins/wobbling-sphere.js +2 -2
- package/dist/games/examples/side-scroller-advanced/game-mode.d.ts +1 -1
- package/dist/games/examples/side-scroller-advanced/game-mode.js +2 -2
- package/dist/games/examples/side-scroller-advanced/game.d.ts +1 -1
- package/dist/games/examples/side-scroller-advanced/game.js +2 -2
- package/dist/games/examples/side-scroller-advanced/level-generator.d.ts +1 -1
- package/dist/games/examples/side-scroller-advanced/level-generator.js +2 -2
- package/dist/games/examples/side-scroller-advanced/pickups.d.ts +1 -1
- package/dist/games/examples/side-scroller-advanced/pickups.js +2 -2
- package/dist/games/examples/side-scroller-advanced/player.d.ts +1 -1
- package/dist/games/examples/side-scroller-advanced/player.js +2 -2
- package/dist/games/examples/side-scroller-advanced/ui/endgame-ui.d.ts +1 -1
- package/dist/games/examples/side-scroller-advanced/ui/endgame-ui.js +2 -2
- package/dist/games/examples/side-scroller-advanced/ui/menu-ui.d.ts +1 -1
- package/dist/games/examples/side-scroller-advanced/ui/menu-ui.js +2 -2
- package/dist/games/examples/vehicle/base-vehicle.d.ts +1 -1
- package/dist/games/examples/vehicle/base-vehicle.js +2 -2
- package/dist/games/examples/vehicle/game.d.ts +1 -1
- package/dist/games/examples/vehicle/game.js +2 -2
- package/dist/games/examples/vehicle/mesh-vehicle.d.ts +1 -1
- package/dist/games/examples/vehicle/mesh-vehicle.js +2 -2
- package/dist/games/examples/vehicle/player.d.ts +1 -1
- package/dist/games/examples/vehicle/player.js +2 -2
- package/dist/games/examples/vehicle/primitive-vehicle.d.ts +1 -1
- package/dist/games/examples/vehicle/primitive-vehicle.js +2 -2
- package/dist/games/examples/vr-game/VRAttachableCube.d.ts +1 -1
- package/dist/games/examples/vr-game/VRAttachableCube.js +2 -2
- package/dist/games/examples/vr-game/VRInteractableCylinder.d.ts +1 -1
- package/dist/games/examples/vr-game/VRInteractableCylinder.js +2 -2
- package/dist/games/examples/vr-game/VRPressableButton.d.ts +1 -1
- package/dist/games/examples/vr-game/VRPressableButton.js +2 -2
- package/dist/games/examples/vr-game/VRProjectileActor.d.ts +1 -1
- package/dist/games/examples/vr-game/VRProjectileActor.js +2 -2
- package/dist/games/examples/vr-game/VRRifleActor.d.ts +1 -1
- package/dist/games/examples/vr-game/VRRifleActor.js +2 -2
- package/dist/games/examples/vr-game/game.d.ts +1 -1
- package/dist/games/examples/vr-game/game.js +2 -2
- package/dist/games/examples/vr-game/scene.d.ts +1 -1
- package/dist/games/examples/vr-game/scene.js +2 -2
- package/dist/games/instanced-mesh-demo.d.ts +1 -1
- package/dist/games/instanced-mesh-demo.js +2 -2
- package/dist/games/manifold-demo.d.ts +1 -1
- package/dist/games/manifold-demo.js +2 -2
- package/dist/games/navigation-demo.d.ts +1 -1
- package/dist/games/navigation-demo.js +2 -2
- package/dist/games/navmesh-primitives-demo.d.ts +1 -1
- package/dist/games/navmesh-primitives-demo.js +2 -2
- package/dist/games/postprocess-demo.d.ts +1 -1
- package/dist/games/postprocess-demo.js +3 -3
- package/dist/games/ragdoll-demo-simple.d.ts +1 -1
- package/dist/games/ragdoll-demo-simple.js +2 -2
- package/dist/games/ragdoll-demo.d.ts +1 -1
- package/dist/games/ragdoll-demo.js +2 -2
- package/dist/games/swipe-tap-demo.d.ts +1 -1
- package/dist/games/swipe-tap-demo.js +2 -2
- package/dist/games/tween-demo.d.ts +1 -1
- package/dist/games/tween-demo.js +2 -2
- package/dist/games/ui-demo.d.ts +1 -1
- package/dist/games/ui-demo.js +2 -2
- package/dist/games/vfx-demo.d.ts +1 -1
- package/dist/games/vfx-demo.js +2 -2
- package/dist/games/vfx-wawa-demo.d.ts +1 -1
- package/dist/games/vfx-wawa-demo.js +2 -2
- package/dist/games/vr-ui-demo-minimal.d.ts +1 -1
- package/dist/games/vr-ui-demo-minimal.js +2 -2
- package/dist/games/vr-ui-demo.d.ts +1 -1
- package/dist/games/vr-ui-demo.js +2 -2
- package/dist/launcher.js +2 -2
- package/dist/scripts/dump-templates.js +2 -2
- package/dist/test/absolute-transform.test.js +2 -2
- package/dist/test/asset-path.test.js +2 -2
- package/dist/test/component.test.js +2 -2
- package/dist/test/construction.test.js +2 -2
- package/dist/test/default-options-validation.test.js +2 -2
- package/dist/test/metadata.test.js +2 -2
- package/dist/test/nodeStorage.d.ts +2 -2
- package/dist/test/nodeStorage.js +3 -3
- package/dist/test/prefab.test.js +2 -2
- package/dist/test/scene-component.test.js +2 -2
- package/dist/test/scene-graph.test.js +2 -2
- package/dist/test/serialization-v1.test.d.ts +1 -1
- package/dist/test/serialization-v1.test.js +3 -3
- package/dist/test/serialization.test.js +2 -2
- package/dist/test/spawn.test.js +2 -2
- package/dist/test/utils.d.ts +1 -1
- package/dist/test/utils.js +2 -2
- package/docs/guides/15-global-audio-manager.md +1 -1
- package/docs/guides/16-ragdoll-physics.md +1 -1
- package/docs/guides/18-lightmapping-system.md +3 -3
- package/docs/guides/19-webxr-virtual-reality.md +1 -1
- package/docs/guides/4-visuals-and-rendering.md +5 -5
- package/docs/guides/6-ai-and-behavior-trees.md +4 -4
- package/games/animation-demo.ts +1 -1
- package/games/animation-retarget-demo.ts +2 -2
- package/games/behavior-tree-demo.ts +1 -1
- package/games/character_animation.ts +1 -1
- package/games/collision-demo.ts +1 -1
- package/games/deprecated/advanced-grid-demo.ts +1 -1
- package/games/deprecated/airplane-demo.ts +1 -1
- package/games/deprecated/character-controller.ts +1 -1
- package/games/deprecated/chase-game.ts +1 -1
- package/games/deprecated/collision-config.ts +1 -1
- package/games/deprecated/door-demo.ts +1 -1
- package/games/deprecated/fps-demo.ts +1 -1
- package/games/deprecated/fps-shotgun-demo.ts +1 -1
- package/games/deprecated/index.ts +25 -25
- package/games/deprecated/lightmapping-demo.ts +1 -1
- package/games/deprecated/lights-demo.ts +1 -1
- package/games/deprecated/matcap-demo.ts +1 -1
- package/games/deprecated/material-demo-2.ts +1 -1
- package/games/deprecated/material-demo.ts +1 -1
- package/games/deprecated/memory-leak-test.ts +1 -1
- package/games/deprecated/model-stress-test.ts +1 -1
- package/games/deprecated/multiplayer-demo.ts +1 -1
- package/games/deprecated/physics-demo.ts +1 -1
- package/games/deprecated/shadow-demo.ts +1 -1
- package/games/deprecated/shooting-demo.ts +1 -1
- package/games/deprecated/skybox-demo.ts +1 -1
- package/games/deprecated/sound-demo.ts +1 -1
- package/games/deprecated/timer-demo.ts +1 -1
- package/games/deprecated/voxel-demo.ts +1 -1
- package/games/deprecated/world-commands.ts +1 -1
- package/games/deprecated/world-loading.ts +1 -1
- package/games/examples/fps-advanced/enemies.ts +1 -1
- package/games/examples/fps-advanced/game-mode.ts +1 -1
- package/games/examples/fps-advanced/game.ts +1 -1
- package/games/examples/fps-advanced/pickups.ts +1 -1
- package/games/examples/fps-advanced/player.ts +1 -1
- package/games/examples/fps-advanced/ui/endgame-ui.ts +1 -1
- package/games/examples/fps-advanced/ui/menu-ui.ts +1 -1
- package/games/examples/fps-advanced/ui/weapon-hud.ts +253 -253
- package/games/examples/fps-advanced/weapons.ts +1 -1
- package/games/examples/index.ts +5 -5
- package/games/examples/plugin-demo/game.ts +2 -2
- package/games/examples/plugin-demo/plugins/dynamic-lighting.ts +1 -1
- package/games/examples/plugin-demo/plugins/instanced-forest.ts +1 -1
- package/games/examples/plugin-demo/plugins/particle-fountain.ts +1 -1
- package/games/examples/plugin-demo/plugins/physics-playground.ts +1 -1
- package/games/examples/plugin-demo/plugins/robot-follower.ts +1 -1
- package/games/examples/plugin-demo/plugins/scatter-models.ts +1 -1
- package/games/examples/plugin-demo/plugins/simple-cube.ts +1 -1
- package/games/examples/plugin-demo/plugins/tic-tac-toe.ts +1 -1
- package/games/examples/plugin-demo/plugins/wobbling-sphere.ts +1 -1
- package/games/examples/side-scroller-advanced/game-mode.ts +1 -1
- package/games/examples/side-scroller-advanced/game.ts +1 -1
- package/games/examples/side-scroller-advanced/level-generator.ts +1 -1
- package/games/examples/side-scroller-advanced/pickups.ts +1 -1
- package/games/examples/side-scroller-advanced/player.ts +1 -1
- package/games/examples/side-scroller-advanced/ui/endgame-ui.ts +1 -1
- package/games/examples/side-scroller-advanced/ui/menu-ui.ts +1 -1
- package/games/examples/vehicle/base-vehicle.ts +1 -1
- package/games/examples/vehicle/game.ts +1 -1
- package/games/examples/vehicle/mesh-vehicle.ts +1 -1
- package/games/examples/vehicle/player.ts +1 -1
- package/games/examples/vehicle/primitive-vehicle.ts +1 -1
- package/games/examples/vr-game/VRAttachableCube.ts +1 -1
- package/games/examples/vr-game/VRInteractableCylinder.ts +1 -1
- package/games/examples/vr-game/VRPressableButton.ts +1 -1
- package/games/examples/vr-game/VRProjectileActor.ts +1 -1
- package/games/examples/vr-game/VRRifleActor.ts +1 -1
- package/games/examples/vr-game/game.ts +1 -1
- package/games/examples/vr-game/scene.ts +1 -1
- package/games/instanced-mesh-demo.ts +1 -1
- package/games/manifold-demo.ts +1 -1
- package/games/navigation-demo.ts +1 -1
- package/games/navmesh-primitives-demo.ts +1 -1
- package/games/postprocess-demo.ts +2 -2
- package/games/ragdoll-demo-simple.ts +1 -1
- package/games/ragdoll-demo.ts +1 -1
- package/games/swipe-tap-demo.ts +1 -1
- package/games/tween-demo.ts +1 -1
- package/games/ui-demo.ts +1 -1
- package/games/vfx-demo.ts +1 -1
- package/games/vfx-wawa-demo.ts +1 -1
- package/games/vr-ui-demo-minimal.ts +1 -1
- package/games/vr-ui-demo.ts +1 -1
- package/package.json +1 -1
- package/scripts/dump-templates.ts +1 -1
- package/src/global.d.ts +11 -11
- package/src/multiplayer/MovementPrediction.ts +202 -202
- package/src/templates/MyActor.ts +1 -1
- package/src/templates/MySceneComponent.ts +1 -1
- package/src/ui/UIResource.ts +20 -20
- package/src/utils/browser-polyfills/module.ts +35 -35
- package/src/utils/browser-polyfills/path.ts +231 -231
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A comparison test between regular mesh components and instanced mesh components
|
|
5
5
|
* with a toggle button to switch between them
|
|
6
6
|
*/
|
|
7
|
-
import * as ENGINE from 'genesys.js';
|
|
7
|
+
import * as ENGINE from '@directivegames/genesys.js';
|
|
8
8
|
import * as THREE from 'three';
|
|
9
9
|
|
|
10
10
|
const MIN_SCALE = 0.03;
|
package/games/manifold-demo.ts
CHANGED
package/games/navigation-demo.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as ENGINE from 'genesys.js';
|
|
1
|
+
import * as ENGINE from '@directivegames/genesys.js';
|
|
2
2
|
import * as THREE from 'three';
|
|
3
3
|
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
|
|
4
4
|
import * as SkeletonUtils from 'three/examples/jsm/utils/SkeletonUtils.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import * as ENGINE from '@directivegames/genesys.js';
|
|
2
|
+
import { ObjectOutlineEffect } from '@directivegames/genesys.js';
|
|
1
3
|
import * as dat from 'dat.gui';
|
|
2
|
-
import * as ENGINE from 'genesys.js';
|
|
3
|
-
import { ObjectOutlineEffect } from 'genesys.js';
|
|
4
4
|
import * as THREE from 'three';
|
|
5
5
|
|
|
6
6
|
/**
|
package/games/ragdoll-demo.ts
CHANGED
package/games/swipe-tap-demo.ts
CHANGED
package/games/tween-demo.ts
CHANGED
package/games/ui-demo.ts
CHANGED
package/games/vfx-demo.ts
CHANGED
package/games/vfx-wawa-demo.ts
CHANGED
package/games/vr-ui-demo.ts
CHANGED
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@ import { generateClassTemplate } from '../src/world-commands/generate-code.js';
|
|
|
6
6
|
|
|
7
7
|
function fixUpTemplate(template: string): string {
|
|
8
8
|
return template
|
|
9
|
-
.replace('genesys.js', '../index.js') // fix import path
|
|
9
|
+
.replace('@directivegames/genesys.js', '../index.js') // fix import path
|
|
10
10
|
.replace('@ENGINE.GameClass()', '// @ENGINE.GameClass()'); // skip registering as that's not really needed
|
|
11
11
|
}
|
|
12
12
|
|
package/src/global.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// src/env.d.ts
|
|
2
|
-
|
|
3
|
-
/// <reference types="vite/client" />
|
|
4
|
-
|
|
5
|
-
interface ImportMetaEnv {
|
|
6
|
-
readonly [key: string]: any;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
interface ImportMeta {
|
|
10
|
-
readonly env: ImportMetaEnv;
|
|
11
|
-
}
|
|
1
|
+
// src/env.d.ts
|
|
2
|
+
|
|
3
|
+
/// <reference types="vite/client" />
|
|
4
|
+
|
|
5
|
+
interface ImportMetaEnv {
|
|
6
|
+
readonly [key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface ImportMeta {
|
|
10
|
+
readonly env: ImportMetaEnv;
|
|
11
|
+
}
|
|
@@ -1,202 +1,202 @@
|
|
|
1
|
-
import type * as THREE from 'three';
|
|
2
|
-
|
|
3
|
-
type NetTransform = {
|
|
4
|
-
position: THREE.Vector3;
|
|
5
|
-
rotation: THREE.Quaternion;
|
|
6
|
-
scale: THREE.Vector3;
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
type TimedTransform = NetTransform & {
|
|
10
|
-
timestamp: number;
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export class NetMovementPredictor {
|
|
14
|
-
public static PredictionEnabled: boolean = true;
|
|
15
|
-
public static LerpAlpha: number = 0.1;
|
|
16
|
-
private remoteBuffer: TimedTransform[] = [];
|
|
17
|
-
private localBuffer: TimedTransform[] = [];
|
|
18
|
-
constructor(private maxCachedFrames: number = 100) {}
|
|
19
|
-
|
|
20
|
-
public static currentTime(): number {
|
|
21
|
-
return Date.now();
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/*
|
|
25
|
-
* Returns current * (1 - alpha) + desired * alpha
|
|
26
|
-
*/
|
|
27
|
-
public static lerpTransform(current: NetTransform, desired: NetTransform, alpha: number = NetMovementPredictor.LerpAlpha): NetTransform {
|
|
28
|
-
return {
|
|
29
|
-
position: current.position.clone().lerp(desired.position, alpha),
|
|
30
|
-
rotation: current.rotation.clone().slerp(desired.rotation, alpha),
|
|
31
|
-
scale: current.scale.clone().lerp(desired.scale, alpha),
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public addRemoteTransform(transform: TimedTransform): void {
|
|
36
|
-
this.remoteBuffer.push(transform);
|
|
37
|
-
if (this.remoteBuffer.length > this.maxCachedFrames) {
|
|
38
|
-
this.remoteBuffer.shift();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public addLocalTransform(transform: TimedTransform): void {
|
|
43
|
-
this.localBuffer.push(transform);
|
|
44
|
-
if (this.localBuffer.length > this.maxCachedFrames) {
|
|
45
|
-
this.localBuffer.shift();
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Interpolates/extrapolates the local buffer to find the transform at a given timestamp
|
|
50
|
-
private getLocalAtTimestamp(targetTimestamp: number): TimedTransform | null {
|
|
51
|
-
const buf = this.localBuffer;
|
|
52
|
-
if (buf.length === 0) return null;
|
|
53
|
-
if (targetTimestamp <= buf[0].timestamp) return buf[0];
|
|
54
|
-
if (targetTimestamp >= buf[buf.length - 1].timestamp) return buf[buf.length - 1];
|
|
55
|
-
for (let i = 0; i < buf.length - 1; ++i) {
|
|
56
|
-
const a = buf[i], b = buf[i + 1];
|
|
57
|
-
if (targetTimestamp >= a.timestamp && targetTimestamp <= b.timestamp) {
|
|
58
|
-
const t = (targetTimestamp - a.timestamp) / (b.timestamp - a.timestamp);
|
|
59
|
-
return {
|
|
60
|
-
timestamp: targetTimestamp,
|
|
61
|
-
position: a.position.clone().lerp(b.position, t),
|
|
62
|
-
rotation: a.rotation.clone().slerp(b.rotation, t),
|
|
63
|
-
scale: a.scale.clone().lerp(b.scale, t),
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return buf[buf.length - 1];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
public predictCurrentTransform(): {
|
|
71
|
-
position: THREE.Vector3,
|
|
72
|
-
rotation: THREE.Quaternion,
|
|
73
|
-
scale: THREE.Vector3
|
|
74
|
-
} | null {
|
|
75
|
-
if (this.remoteBuffer.length === 0 || this.localBuffer.length === 0) {
|
|
76
|
-
return null;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (!NetMovementPredictor.PredictionEnabled) {
|
|
80
|
-
return this.remoteBuffer[this.remoteBuffer.length - 1];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const latestRemote = this.remoteBuffer[this.remoteBuffer.length - 1];
|
|
84
|
-
const latestLocal = this.localBuffer[this.localBuffer.length - 1];
|
|
85
|
-
const clockDiff = latestLocal.timestamp - latestRemote.timestamp;
|
|
86
|
-
|
|
87
|
-
// 1. Target local timestamp that matches latest remote, shifted by clock diff
|
|
88
|
-
const localAnchorTime = latestRemote.timestamp + clockDiff;
|
|
89
|
-
|
|
90
|
-
// 2. Interpolate/extrapolate local buffer to get transform at that anchor time
|
|
91
|
-
const localAtAnchor = this.getLocalAtTimestamp(localAnchorTime);
|
|
92
|
-
if (!localAtAnchor) {
|
|
93
|
-
// Should not happen, fallback to latest local
|
|
94
|
-
return {
|
|
95
|
-
position: latestLocal.position.clone(),
|
|
96
|
-
rotation: latestLocal.rotation.clone(),
|
|
97
|
-
scale: latestLocal.scale.clone(),
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// 3. Calculate local movement since anchor
|
|
102
|
-
const deltaPos = latestLocal.position.clone().sub(localAtAnchor.position);
|
|
103
|
-
const deltaRot = latestLocal.rotation.clone().multiply(localAtAnchor.rotation.clone().invert());
|
|
104
|
-
const deltaScale = latestLocal.scale.clone().divide(localAtAnchor.scale);
|
|
105
|
-
|
|
106
|
-
// 4. Apply delta to latest remote
|
|
107
|
-
return {
|
|
108
|
-
position: latestRemote.position.clone().add(deltaPos),
|
|
109
|
-
rotation: latestRemote.rotation.clone().multiply(deltaRot),
|
|
110
|
-
scale: latestRemote.scale.clone().multiply(deltaScale),
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/*
|
|
116
|
-
export class NetMovementPredictor {
|
|
117
|
-
private remoteBuffer: TimedTransform[] = [];
|
|
118
|
-
private localBuffer: TimedTransform[] = [];
|
|
119
|
-
constructor(private maxCachedFrames: number = 100) {}
|
|
120
|
-
|
|
121
|
-
public static currentTime(): number {
|
|
122
|
-
return Date.now();
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
public addRemoteTransform(transform: TimedTransform): void {
|
|
126
|
-
this.remoteBuffer.push(transform);
|
|
127
|
-
if (this.remoteBuffer.length > this.maxCachedFrames) {
|
|
128
|
-
this.remoteBuffer.shift();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
public addLocalTransform(transform: TimedTransform): void {
|
|
133
|
-
this.localBuffer.push(transform);
|
|
134
|
-
if (this.localBuffer.length > this.maxCachedFrames) {
|
|
135
|
-
this.localBuffer.shift();
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
public predictCurrentTransform(): {
|
|
140
|
-
position: THREE.Vector3,
|
|
141
|
-
rotation: THREE.Quaternion,
|
|
142
|
-
scale: THREE.Vector3
|
|
143
|
-
} | null {
|
|
144
|
-
if (this.remoteBuffer.length === 0 || this.localBuffer.length === 0) {
|
|
145
|
-
return null;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const latestRemote = this.remoteBuffer[this.remoteBuffer.length - 1];
|
|
149
|
-
const latestLocal = this.localBuffer[this.localBuffer.length - 1];
|
|
150
|
-
const clockDiff = latestLocal.timestamp - latestRemote.timestamp;
|
|
151
|
-
|
|
152
|
-
// Walk both buffers, find best pair with (local.timestamp - remote.timestamp) closest to clockDiff
|
|
153
|
-
let localIdx = 0;
|
|
154
|
-
let bestPair: { remote: TimedTransform; local: TimedTransform } | null = null;
|
|
155
|
-
let minAbsDiff = Number.POSITIVE_INFINITY;
|
|
156
|
-
|
|
157
|
-
for (let remoteIdx = 0; remoteIdx < this.remoteBuffer.length; remoteIdx++) {
|
|
158
|
-
const remote = this.remoteBuffer[remoteIdx];
|
|
159
|
-
const idealLocalTimestamp = remote.timestamp + clockDiff;
|
|
160
|
-
|
|
161
|
-
// Advance localIdx until local.timestamp >= remote.timestamp + clockDiff, or end of buffer
|
|
162
|
-
while (
|
|
163
|
-
localIdx + 1 < this.localBuffer.length &&
|
|
164
|
-
this.localBuffer[localIdx + 1].timestamp <= idealLocalTimestamp
|
|
165
|
-
) {
|
|
166
|
-
localIdx++;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Check current local
|
|
170
|
-
const local = this.localBuffer[localIdx];
|
|
171
|
-
const absDiff = Math.abs(local.timestamp - idealLocalTimestamp);
|
|
172
|
-
if (absDiff < minAbsDiff) {
|
|
173
|
-
minAbsDiff = absDiff;
|
|
174
|
-
bestPair = { remote, local };
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
if (localIdx + 1 < this.localBuffer.length) {
|
|
178
|
-
const nextLocal = this.localBuffer[localIdx + 1];
|
|
179
|
-
const nextAbsDiff = Math.abs(nextLocal.timestamp - idealLocalTimestamp);
|
|
180
|
-
if (nextAbsDiff < minAbsDiff) {
|
|
181
|
-
minAbsDiff = nextAbsDiff;
|
|
182
|
-
bestPair = { remote, local: nextLocal };
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (!bestPair) {
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const deltaPos = bestPair.local.position.clone().sub(bestPair.remote.position);
|
|
192
|
-
const deltaRot = bestPair.local.rotation.clone().multiply(bestPair.remote.rotation.clone().invert());
|
|
193
|
-
const deltaScale = bestPair.local.scale.clone().divide(bestPair.remote.scale);
|
|
194
|
-
|
|
195
|
-
return {
|
|
196
|
-
position: latestRemote.position.clone().add(deltaPos),
|
|
197
|
-
rotation: latestRemote.rotation.clone().multiply(deltaRot),
|
|
198
|
-
scale: latestRemote.scale.clone().multiply(deltaScale),
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
*/
|
|
1
|
+
import type * as THREE from 'three';
|
|
2
|
+
|
|
3
|
+
type NetTransform = {
|
|
4
|
+
position: THREE.Vector3;
|
|
5
|
+
rotation: THREE.Quaternion;
|
|
6
|
+
scale: THREE.Vector3;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
type TimedTransform = NetTransform & {
|
|
10
|
+
timestamp: number;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export class NetMovementPredictor {
|
|
14
|
+
public static PredictionEnabled: boolean = true;
|
|
15
|
+
public static LerpAlpha: number = 0.1;
|
|
16
|
+
private remoteBuffer: TimedTransform[] = [];
|
|
17
|
+
private localBuffer: TimedTransform[] = [];
|
|
18
|
+
constructor(private maxCachedFrames: number = 100) {}
|
|
19
|
+
|
|
20
|
+
public static currentTime(): number {
|
|
21
|
+
return Date.now();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* Returns current * (1 - alpha) + desired * alpha
|
|
26
|
+
*/
|
|
27
|
+
public static lerpTransform(current: NetTransform, desired: NetTransform, alpha: number = NetMovementPredictor.LerpAlpha): NetTransform {
|
|
28
|
+
return {
|
|
29
|
+
position: current.position.clone().lerp(desired.position, alpha),
|
|
30
|
+
rotation: current.rotation.clone().slerp(desired.rotation, alpha),
|
|
31
|
+
scale: current.scale.clone().lerp(desired.scale, alpha),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public addRemoteTransform(transform: TimedTransform): void {
|
|
36
|
+
this.remoteBuffer.push(transform);
|
|
37
|
+
if (this.remoteBuffer.length > this.maxCachedFrames) {
|
|
38
|
+
this.remoteBuffer.shift();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
public addLocalTransform(transform: TimedTransform): void {
|
|
43
|
+
this.localBuffer.push(transform);
|
|
44
|
+
if (this.localBuffer.length > this.maxCachedFrames) {
|
|
45
|
+
this.localBuffer.shift();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Interpolates/extrapolates the local buffer to find the transform at a given timestamp
|
|
50
|
+
private getLocalAtTimestamp(targetTimestamp: number): TimedTransform | null {
|
|
51
|
+
const buf = this.localBuffer;
|
|
52
|
+
if (buf.length === 0) return null;
|
|
53
|
+
if (targetTimestamp <= buf[0].timestamp) return buf[0];
|
|
54
|
+
if (targetTimestamp >= buf[buf.length - 1].timestamp) return buf[buf.length - 1];
|
|
55
|
+
for (let i = 0; i < buf.length - 1; ++i) {
|
|
56
|
+
const a = buf[i], b = buf[i + 1];
|
|
57
|
+
if (targetTimestamp >= a.timestamp && targetTimestamp <= b.timestamp) {
|
|
58
|
+
const t = (targetTimestamp - a.timestamp) / (b.timestamp - a.timestamp);
|
|
59
|
+
return {
|
|
60
|
+
timestamp: targetTimestamp,
|
|
61
|
+
position: a.position.clone().lerp(b.position, t),
|
|
62
|
+
rotation: a.rotation.clone().slerp(b.rotation, t),
|
|
63
|
+
scale: a.scale.clone().lerp(b.scale, t),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return buf[buf.length - 1];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public predictCurrentTransform(): {
|
|
71
|
+
position: THREE.Vector3,
|
|
72
|
+
rotation: THREE.Quaternion,
|
|
73
|
+
scale: THREE.Vector3
|
|
74
|
+
} | null {
|
|
75
|
+
if (this.remoteBuffer.length === 0 || this.localBuffer.length === 0) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!NetMovementPredictor.PredictionEnabled) {
|
|
80
|
+
return this.remoteBuffer[this.remoteBuffer.length - 1];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const latestRemote = this.remoteBuffer[this.remoteBuffer.length - 1];
|
|
84
|
+
const latestLocal = this.localBuffer[this.localBuffer.length - 1];
|
|
85
|
+
const clockDiff = latestLocal.timestamp - latestRemote.timestamp;
|
|
86
|
+
|
|
87
|
+
// 1. Target local timestamp that matches latest remote, shifted by clock diff
|
|
88
|
+
const localAnchorTime = latestRemote.timestamp + clockDiff;
|
|
89
|
+
|
|
90
|
+
// 2. Interpolate/extrapolate local buffer to get transform at that anchor time
|
|
91
|
+
const localAtAnchor = this.getLocalAtTimestamp(localAnchorTime);
|
|
92
|
+
if (!localAtAnchor) {
|
|
93
|
+
// Should not happen, fallback to latest local
|
|
94
|
+
return {
|
|
95
|
+
position: latestLocal.position.clone(),
|
|
96
|
+
rotation: latestLocal.rotation.clone(),
|
|
97
|
+
scale: latestLocal.scale.clone(),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// 3. Calculate local movement since anchor
|
|
102
|
+
const deltaPos = latestLocal.position.clone().sub(localAtAnchor.position);
|
|
103
|
+
const deltaRot = latestLocal.rotation.clone().multiply(localAtAnchor.rotation.clone().invert());
|
|
104
|
+
const deltaScale = latestLocal.scale.clone().divide(localAtAnchor.scale);
|
|
105
|
+
|
|
106
|
+
// 4. Apply delta to latest remote
|
|
107
|
+
return {
|
|
108
|
+
position: latestRemote.position.clone().add(deltaPos),
|
|
109
|
+
rotation: latestRemote.rotation.clone().multiply(deltaRot),
|
|
110
|
+
scale: latestRemote.scale.clone().multiply(deltaScale),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/*
|
|
116
|
+
export class NetMovementPredictor {
|
|
117
|
+
private remoteBuffer: TimedTransform[] = [];
|
|
118
|
+
private localBuffer: TimedTransform[] = [];
|
|
119
|
+
constructor(private maxCachedFrames: number = 100) {}
|
|
120
|
+
|
|
121
|
+
public static currentTime(): number {
|
|
122
|
+
return Date.now();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public addRemoteTransform(transform: TimedTransform): void {
|
|
126
|
+
this.remoteBuffer.push(transform);
|
|
127
|
+
if (this.remoteBuffer.length > this.maxCachedFrames) {
|
|
128
|
+
this.remoteBuffer.shift();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public addLocalTransform(transform: TimedTransform): void {
|
|
133
|
+
this.localBuffer.push(transform);
|
|
134
|
+
if (this.localBuffer.length > this.maxCachedFrames) {
|
|
135
|
+
this.localBuffer.shift();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
public predictCurrentTransform(): {
|
|
140
|
+
position: THREE.Vector3,
|
|
141
|
+
rotation: THREE.Quaternion,
|
|
142
|
+
scale: THREE.Vector3
|
|
143
|
+
} | null {
|
|
144
|
+
if (this.remoteBuffer.length === 0 || this.localBuffer.length === 0) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const latestRemote = this.remoteBuffer[this.remoteBuffer.length - 1];
|
|
149
|
+
const latestLocal = this.localBuffer[this.localBuffer.length - 1];
|
|
150
|
+
const clockDiff = latestLocal.timestamp - latestRemote.timestamp;
|
|
151
|
+
|
|
152
|
+
// Walk both buffers, find best pair with (local.timestamp - remote.timestamp) closest to clockDiff
|
|
153
|
+
let localIdx = 0;
|
|
154
|
+
let bestPair: { remote: TimedTransform; local: TimedTransform } | null = null;
|
|
155
|
+
let minAbsDiff = Number.POSITIVE_INFINITY;
|
|
156
|
+
|
|
157
|
+
for (let remoteIdx = 0; remoteIdx < this.remoteBuffer.length; remoteIdx++) {
|
|
158
|
+
const remote = this.remoteBuffer[remoteIdx];
|
|
159
|
+
const idealLocalTimestamp = remote.timestamp + clockDiff;
|
|
160
|
+
|
|
161
|
+
// Advance localIdx until local.timestamp >= remote.timestamp + clockDiff, or end of buffer
|
|
162
|
+
while (
|
|
163
|
+
localIdx + 1 < this.localBuffer.length &&
|
|
164
|
+
this.localBuffer[localIdx + 1].timestamp <= idealLocalTimestamp
|
|
165
|
+
) {
|
|
166
|
+
localIdx++;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Check current local
|
|
170
|
+
const local = this.localBuffer[localIdx];
|
|
171
|
+
const absDiff = Math.abs(local.timestamp - idealLocalTimestamp);
|
|
172
|
+
if (absDiff < minAbsDiff) {
|
|
173
|
+
minAbsDiff = absDiff;
|
|
174
|
+
bestPair = { remote, local };
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (localIdx + 1 < this.localBuffer.length) {
|
|
178
|
+
const nextLocal = this.localBuffer[localIdx + 1];
|
|
179
|
+
const nextAbsDiff = Math.abs(nextLocal.timestamp - idealLocalTimestamp);
|
|
180
|
+
if (nextAbsDiff < minAbsDiff) {
|
|
181
|
+
minAbsDiff = nextAbsDiff;
|
|
182
|
+
bestPair = { remote, local: nextLocal };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (!bestPair) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const deltaPos = bestPair.local.position.clone().sub(bestPair.remote.position);
|
|
192
|
+
const deltaRot = bestPair.local.rotation.clone().multiply(bestPair.remote.rotation.clone().invert());
|
|
193
|
+
const deltaScale = bestPair.local.scale.clone().divide(bestPair.remote.scale);
|
|
194
|
+
|
|
195
|
+
return {
|
|
196
|
+
position: latestRemote.position.clone().add(deltaPos),
|
|
197
|
+
rotation: latestRemote.rotation.clone().multiply(deltaRot),
|
|
198
|
+
scale: latestRemote.scale.clone().multiply(deltaScale),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
*/
|