Skip to content

Commit cab5174

Browse files
committed
add onTick hook
1 parent 65037d3 commit cab5174

8 files changed

+210
-71
lines changed

src/common/types/plugin.ts

+5-9
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export interface PluginMetaData extends PluginPackage {
4242
}
4343
}
4444

45+
4546
/**
4647
* A plugin that executes in the main process.
4748
*/
@@ -104,6 +105,10 @@ export interface NativePlugin {
104105
* Called on a game frame
105106
*/
106107
onFrame?( frame: number, commands?: any[] ): void;
108+
/**
109+
* Called before render, every render tick
110+
*/
111+
onTick?( delta: number, elapsed: number ): void;
107112
/**
108113
* When a game has been loaded and the game loop is about to begin
109114
*/
@@ -117,13 +122,4 @@ export interface NativePlugin {
117122
*/
118123
onFrameReset?(): void;
119124

120-
/**
121-
* When a scene is entered and nearly initialized.
122-
*/
123-
onEnterScene?( prevData: any ): Promise<unknown>;
124-
125-
/**
126-
* When a scene has exited. Dispose resources here.
127-
*/
128-
onExitScene?( currentData: any ): any;
129125
}

src/core/world/api-session.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class ApiSession {
6565
// which is not allowed WITHIN plugins since they are 3rd party, but ok in user macros and sandbox
6666
this.#macros.setContainer(
6767
mix( {
68-
game: gameTimeApi,
68+
api: gameTimeApi,
6969
plugins: borrow( this.#plugins.store.vars ),
7070
settings: borrow( settings.vars ),
7171
events: eventsProxy,

src/core/world/view-controller-composer.ts

+24-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import { DamageType, Explosion } from "common/enums";
55
import { PerspectiveCamera, Vector3 } from "three";
66
import { GameViewPort } from "../../camera/game-viewport";
77
import { World } from "./world";
8-
import type { SceneController } from "@plugins/scene-controller";
8+
import type { SceneController, VRSceneController } from "@plugins/scene-controller";
99
import { easeInCubic } from "@utils/function-utils";
1010
import range from "common/utils/range";
1111
import { mixer } from "@audio/main-mixer";
12+
import { renderComposer } from "@render/index";
1213

1314
// frequency, duration, strength multiplier
1415
const explosionFrequencyDuration = {
@@ -134,12 +135,24 @@ export const createViewControllerComposer = (
134135
if ( sceneController?.onExitScene ) {
135136
try {
136137
world.events.emit( "scene-controller-exit", sceneController.name );
137-
prevData = sceneController.onExitScene( prevData );
138+
const _prevData = sceneController.onExitScene( prevData );
139+
//todo: further validate prevData
140+
if (_prevData?.target && _prevData?.position) {
141+
prevData = _prevData;
142+
}
138143
} catch ( e ) {
139144
log.error( e );
140145
}
141146
}
142147

148+
if (sceneController) {
149+
sceneController.parent.removeFromParent();
150+
}
151+
152+
if ( sceneController?.isWebXR ) {
153+
(sceneController as VRSceneController).viewerPosition.removeFromParent();
154+
}
155+
143156
sceneController = null;
144157
gameSurface.togglePointerLock( false );
145158

@@ -150,6 +163,15 @@ export const createViewControllerComposer = (
150163
viewports.length = 0;
151164
viewports.push(...createViewports(newController.viewportsCount));
152165

166+
if (newController.isWebXR) {
167+
const vrController = newController as VRSceneController;
168+
vrController.setupXR( renderComposer.glRenderer.xr );
169+
newController.scene.add( vrController.viewerPosition );
170+
vrController.viewerPosition.add( vrController.viewport.camera );
171+
}
172+
173+
newController.scene.add( newController.parent );
174+
153175
await newController.onEnterScene( prevData );
154176
sceneController = newController;
155177

src/core/world/world-composer.ts

+5
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,11 @@ export const createWorldComposer = async (
327327
);
328328
}
329329

330+
apiSession.native.hook_onTick(
331+
delta,
332+
elapsed
333+
)
334+
330335
postProcessingComposer.render( delta, elapsed );
331336

332337
inputsComposer.reset();

src/plugins/plugin-system-native.ts

+21-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export class PluginSystemNative {
7272
throw new Error("Plugin constructor must extend PluginBase");
7373
}
7474

75-
const plugin = new Plugin.default(pluginPackage, sessionContext);
75+
const plugin = new Plugin.default(pluginPackage, sessionContext) as PluginBase;
7676
mix(plugin, sessionContext.game);
7777

7878
plugin.isSceneController = pluginPackage.isSceneController;
@@ -235,6 +235,26 @@ export class PluginSystemNative {
235235
}
236236
}
237237

238+
#hook_onTick( delta: number, elapsed: number ) {
239+
for (const plugin of this.#plugins) {
240+
if (plugin.onTick && this.isRegularPluginOrActiveSceneController(plugin)) {
241+
plugin.onTick(delta, elapsed);
242+
}
243+
}
244+
}
245+
246+
hook_onTick( delta: number, elapsed: number ) {
247+
if (this.useTryCatchOnHooks) {
248+
try {
249+
this.#hook_onTick(delta, elapsed);
250+
} catch (e) {
251+
log.error(withErrorMessage(e, "@plugin-system-native: onFrame"));
252+
}
253+
} else {
254+
this.#hook_onTick( delta, elapsed );
255+
}
256+
}
257+
238258
activateAdditionalPlugins(
239259
pluginPackages: PluginMetaData[],
240260
createCompartment: (env: any) => any

0 commit comments

Comments
 (0)