@threenative/core 0.2.0 → 0.3.0
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/LICENSE +21 -0
- package/README.md +45 -0
- package/capabilities.json +3542 -0
- package/dist/audio-Dp2mXpD3.d.ts +94 -0
- package/dist/canvas-layer-CtrZHgIh.d.ts +608 -0
- package/dist/game-CYIaKhgl.d.ts +980 -0
- package/dist/hot.d.ts +18 -2
- package/dist/hot.js +10 -2
- package/dist/index.d.ts +1439 -56
- package/dist/index.js +12049 -2233
- package/dist/playtest.d.ts +11 -2
- package/dist/playtest.js +82 -528
- package/dist/react.d.ts +175 -0
- package/dist/react.js +635 -0
- package/dist/ui-layer.d.ts +306 -0
- package/dist/ui-layer.js +425 -0
- package/dist/world.d.ts +55 -0
- package/dist/world.js +175 -0
- package/mcp/assets.mjs +5 -0
- package/mcp/engine-server.mjs +253 -0
- package/mcp/engine.mjs +23 -0
- package/mcp/install.mjs +77 -0
- package/mcp/launch.mjs +72 -0
- package/mcp/sculpt.mjs +5 -0
- package/mcp/servers.mjs +59 -0
- package/package.json +48 -6
- package/patches/three@0.185.1.patch +287 -0
- package/scripts/apply-three-patch.mjs +297 -0
- package/scripts/bundle-engine-mcp.mjs +15 -0
- package/scripts/ensure-mcp.mjs +36 -0
- package/scripts/generate-version.mjs +13 -0
- package/scripts/postinstall.mjs +6 -0
- package/dist/audio-CEAw0w5y.d.ts +0 -35
- package/dist/game-DRt1Qhq3.d.ts +0 -429
|
@@ -0,0 +1,3542 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entries": [
|
|
3
|
+
{
|
|
4
|
+
"constraints": [
|
|
5
|
+
"name the body a game moves as strideRoot when the animated rig is a child of it",
|
|
6
|
+
"a one-shot clip always plays at its authored rate; the matched rate re-times loops only"
|
|
7
|
+
],
|
|
8
|
+
"example": "const player = new AnimationPlayer({ clips, root: rig, strideRoot: body });",
|
|
9
|
+
"importPath": "@threenative/core",
|
|
10
|
+
"kind": "class",
|
|
11
|
+
"overrides": [
|
|
12
|
+
"strideSync controls whether the matched rate is applied while stride is still measured"
|
|
13
|
+
],
|
|
14
|
+
"package": "@threenative/core",
|
|
15
|
+
"signature": "export class AnimationPlayer { … }",
|
|
16
|
+
"situations": [
|
|
17
|
+
"play an animation on a character",
|
|
18
|
+
"switch a character between idle and attack clips",
|
|
19
|
+
"stop a walking character's feet from sliding or spinning",
|
|
20
|
+
"match a walk or run cycle to how fast a character is moving"
|
|
21
|
+
],
|
|
22
|
+
"summary": "Play a skinned or sprite animation from game code. A travelling clip's playback rate is matched to the ground the body actually covers, so feet do not skate or spin — on by default, `strideSync: false` to keep the authored rate, and `player.stride` reports the measurement either way. Name the body a game moves as `strideRoot` when the rig is a child of it.",
|
|
23
|
+
"supersedes": [],
|
|
24
|
+
"symbol": "AnimationPlayer"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"constraints": [
|
|
28
|
+
"supply rayleigh, mie, ozone, planetRadius, and atmosphereRadius; there is no Earth fallback",
|
|
29
|
+
"the game creates the sky object, surface, and sun from the returned nodes"
|
|
30
|
+
],
|
|
31
|
+
"example": "const atmosphere = new Atmosphere({ rayleigh, mie, ozone, planetRadius, atmosphereRadius });\nctx.add(atmosphere);",
|
|
32
|
+
"importPath": "@threenative/core",
|
|
33
|
+
"kind": "class",
|
|
34
|
+
"overrides": [],
|
|
35
|
+
"package": "@threenative/core",
|
|
36
|
+
"signature": "export class Atmosphere extends Group implements IComputeDriven { … }",
|
|
37
|
+
"situations": [
|
|
38
|
+
"render a sunrise that changes as time and place change",
|
|
39
|
+
"add distance haze from the depth of a scene pass"
|
|
40
|
+
],
|
|
41
|
+
"summary": "Own the compute lifetime and expose only parameter-driven atmosphere nodes. The class deliberately creates no mesh, material, or scene light. A template chooses all of those, and the same object remains useful when a game supplies a completely different look.",
|
|
42
|
+
"supersedes": [],
|
|
43
|
+
"symbol": "Atmosphere"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"constraints": ["supply all physical parameters; this class creates no scene appearance"],
|
|
47
|
+
"example": "const luts = new AtmosphereLuts({ rayleigh, mie, ozone, planetRadius, atmosphereRadius });",
|
|
48
|
+
"importPath": "@threenative/core",
|
|
49
|
+
"kind": "class",
|
|
50
|
+
"overrides": [],
|
|
51
|
+
"package": "@threenative/core",
|
|
52
|
+
"signature": "export class AtmosphereLuts { … }",
|
|
53
|
+
"situations": ["bake the three atmosphere LUTs once before a game shows its world"],
|
|
54
|
+
"summary": "Own the transmittance, multi-scattering, and sky-view compute lookup textures.",
|
|
55
|
+
"supersedes": [],
|
|
56
|
+
"symbol": "AtmosphereLuts"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"constraints": [
|
|
60
|
+
"when a request is to hold or attach a weapon to a hand, import and call `attachToBone` from `@threenative/core`; do not manually parent, position, or rotate the rifle",
|
|
61
|
+
"if a stock visual has no skeleton, add a portable Three.js Bone named `RightHand` under the character, then call `attachToBone`; do not replace the helper with manual parenting"
|
|
62
|
+
],
|
|
63
|
+
"example": "import { attachToBone } from \"@threenative/core\";\nattachToBone(character, \"RightHand\", rifle);",
|
|
64
|
+
"importPath": "@threenative/core",
|
|
65
|
+
"kind": "function",
|
|
66
|
+
"overrides": [],
|
|
67
|
+
"package": "@threenative/core",
|
|
68
|
+
"signature": "export function attachToBone(root: Object3D, boneName: string, child: Object3D): Object3D { … }",
|
|
69
|
+
"situations": [
|
|
70
|
+
"put a weapon in a character's hand",
|
|
71
|
+
"hold a rifle in a character's right hand",
|
|
72
|
+
"add an enemy that patrols the level, chases the player when it sees them, and holds a rifle in its right hand",
|
|
73
|
+
"attach an accessory to a skinned model",
|
|
74
|
+
"equip crew with swords and pistols",
|
|
75
|
+
"put a sword or pistol in a crew member's hand"
|
|
76
|
+
],
|
|
77
|
+
"summary": "Attach a game-owned object to a named skeleton bone.",
|
|
78
|
+
"supersedes": [],
|
|
79
|
+
"symbol": "attachToBone"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"constraints": [
|
|
83
|
+
"create buses before playing clips and dispose them with the game",
|
|
84
|
+
"refDistance and rolloffFactor tune positional falloff and apply to playAt only"
|
|
85
|
+
],
|
|
86
|
+
"example": "const effects = new AudioBus({ camera });",
|
|
87
|
+
"importPath": "@threenative/core",
|
|
88
|
+
"kind": "class",
|
|
89
|
+
"overrides": [],
|
|
90
|
+
"package": "@threenative/core",
|
|
91
|
+
"signature": "export class AudioBus { … }",
|
|
92
|
+
"situations": [
|
|
93
|
+
"play a sound effect with a volume bus",
|
|
94
|
+
"mute or adjust a category of game audio",
|
|
95
|
+
"keep a gunshot audible at 20 metres by tuning positional falloff",
|
|
96
|
+
"play cannon, wave, and ship sound effects"
|
|
97
|
+
],
|
|
98
|
+
"summary": "Route effects through a named audio bus.",
|
|
99
|
+
"supersedes": ["new Audio("],
|
|
100
|
+
"symbol": "AudioBus"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"constraints": [
|
|
104
|
+
"call update from the owning scene; no global scene scan is installed",
|
|
105
|
+
"orthographic cameras use their forward direction, and lockAxis restricts world rotation"
|
|
106
|
+
],
|
|
107
|
+
"example": "const billboard = new Billboard3D(label, { camera });\nbillboard.update();",
|
|
108
|
+
"importPath": "@threenative/core",
|
|
109
|
+
"kind": "class",
|
|
110
|
+
"overrides": [],
|
|
111
|
+
"package": "@threenative/core",
|
|
112
|
+
"signature": "export class Billboard3D { … }",
|
|
113
|
+
"situations": [
|
|
114
|
+
"keep a world-space marker or nameplate facing the camera",
|
|
115
|
+
"billboard a tree, label, or effect under a rotated parent"
|
|
116
|
+
],
|
|
117
|
+
"summary": "Face a game-owned object toward a perspective or orthographic camera.",
|
|
118
|
+
"supersedes": [],
|
|
119
|
+
"symbol": "Billboard3D"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"constraints": [
|
|
123
|
+
"amplitude, rotationAmplitude, frequency, decay, and curve are required game choices",
|
|
124
|
+
"update returns an offset and never writes to a camera"
|
|
125
|
+
],
|
|
126
|
+
"example": "const shake = new CameraShake({ amplitude, rotationAmplitude, frequency, decay, curve });",
|
|
127
|
+
"importPath": "@threenative/core",
|
|
128
|
+
"kind": "class",
|
|
129
|
+
"overrides": [],
|
|
130
|
+
"package": "@threenative/core",
|
|
131
|
+
"signature": "export class CameraShake { … }",
|
|
132
|
+
"situations": [
|
|
133
|
+
"add a hit, explosion, or landing shake to a camera",
|
|
134
|
+
"compose a transient camera offset after camera damping"
|
|
135
|
+
],
|
|
136
|
+
"summary": "Produce a game-authored camera shake offset for a template-owned camera rig.",
|
|
137
|
+
"supersedes": [],
|
|
138
|
+
"symbol": "CameraShake"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"constraints": [],
|
|
142
|
+
"example": "const hud = new CanvasLayer({ camera });",
|
|
143
|
+
"importPath": "@threenative/core",
|
|
144
|
+
"kind": "class",
|
|
145
|
+
"overrides": [],
|
|
146
|
+
"package": "@threenative/core",
|
|
147
|
+
"signature": "export class CanvasLayer { … }",
|
|
148
|
+
"situations": [
|
|
149
|
+
"place a HUD layer above the Three.js scene",
|
|
150
|
+
"attach a canvas layer to a camera"
|
|
151
|
+
],
|
|
152
|
+
"summary": "Manage a camera or screen-facing canvas layer.",
|
|
153
|
+
"supersedes": [],
|
|
154
|
+
"symbol": "CanvasLayer"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"constraints": [
|
|
158
|
+
"the body's geometry must carry a cluster table from `assets.models.virtual`",
|
|
159
|
+
"every copy is placed before build(); place() after build() throws"
|
|
160
|
+
],
|
|
161
|
+
"example": "const boulders = new ClusteredBatch({ geometry, material, table });\nboulders.place({ position: [x, y, z], rotation: [0, angle, 0] });\nboulders.build({ name: \"boulders\", parent: ctx.scene });\n// in the scene's update, before the render:\nboulders.update(ctx.camera, ctx.renderer.domElement.height);",
|
|
162
|
+
"importPath": "@threenative/core",
|
|
163
|
+
"kind": "class",
|
|
164
|
+
"overrides": [
|
|
165
|
+
"distanceRatio sets how wide one distance group is, default 1.25",
|
|
166
|
+
"errorPixels sets the screen-space error budget, default 1 pixel"
|
|
167
|
+
],
|
|
168
|
+
"package": "@threenative/core",
|
|
169
|
+
"signature": "export class ClusteredBatch { … }",
|
|
170
|
+
"situations": [
|
|
171
|
+
"draw hundreds of copies of a scanned or sculpted body without hundreds of draw calls",
|
|
172
|
+
"stop distant copies of a dense prop from costing their full triangle count"
|
|
173
|
+
],
|
|
174
|
+
"summary": "Draw many copies of one over-detailed body, each at the detail its own distance earns. `InstancedBatch` collapses repeated props into one draw and gives every copy the same triangles. This gives a copy two hundred metres away a coarser cut than one twelve metres away, and still submits one draw per distance group rather than one per copy — which is what makes four hundred scanned boulders affordable. The shape, the surface and every transform stay the game's.",
|
|
175
|
+
"supersedes": [],
|
|
176
|
+
"symbol": "ClusteredBatch"
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"constraints": [
|
|
180
|
+
"the bake happens in the asset pipeline, never at run time — there is no runtime flag",
|
|
181
|
+
"the payload costs about 3-4x a baked primitive's bytes; `assets.models.virtual: \"none\"` opts out and `minSourceTriangles` moves the 65,536 line",
|
|
182
|
+
"needs a perspective camera; a screen-space error has no meaning without one",
|
|
183
|
+
"one shadow cut is chosen at load and does not follow a shadow camera"
|
|
184
|
+
],
|
|
185
|
+
"example": "// Nothing to call: the loader returns one of these and the engine cuts it every frame.\nconst face = await ctx.assets.model(\"quarry-face.glb\");\nctx.scene.add(face.scene);",
|
|
186
|
+
"importPath": "@threenative/core",
|
|
187
|
+
"kind": "class",
|
|
188
|
+
"overrides": [
|
|
189
|
+
"errorPixels sets the screen-space error budget, default 1 pixel",
|
|
190
|
+
"recutDistance sets how far the camera moves before the cut is retaken, default a thousandth of the mesh's radius"
|
|
191
|
+
],
|
|
192
|
+
"package": "@threenative/core",
|
|
193
|
+
"signature": "export class ClusteredMesh extends Mesh { … }",
|
|
194
|
+
"situations": [
|
|
195
|
+
"draw a model too detailed for the screen to resolve",
|
|
196
|
+
"import a scanned or sculpted mesh of millions of triangles and still hold the frame",
|
|
197
|
+
"stop a dense rock face or terrain body from costing its full triangle count up close"
|
|
198
|
+
],
|
|
199
|
+
"summary": "Draw a model too detailed for the screen to resolve, without submitting the part it cannot. **This is on, and a game does not call it.** Any primitive of 65,536 triangles or more bakes to a cluster DAG in the asset pipeline, the loader returns a `ClusteredMesh` for it, and the engine takes the cut every frame before it renders. Each frame the mesh submits one draw holding only the clusters whose error projects to fewer than `errorPixels` screen pixels; a mesh nothing has cut yet draws in full, so the worst case is an ordinary `Mesh`. Geometry, surface and every appearance parameter stay the game's.",
|
|
200
|
+
"supersedes": [],
|
|
201
|
+
"symbol": "ClusteredMesh"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"constraints": [
|
|
205
|
+
"add the object through ctx.add so it attaches, dispatches, and releases with its scene"
|
|
206
|
+
],
|
|
207
|
+
"example": "class Cloth extends Mesh implements IComputeDriven { ... }",
|
|
208
|
+
"importPath": "@threenative/core",
|
|
209
|
+
"kind": "class",
|
|
210
|
+
"overrides": [],
|
|
211
|
+
"package": "@threenative/core",
|
|
212
|
+
"signature": "export class ComputeDrivenRegistry { … }",
|
|
213
|
+
"situations": [
|
|
214
|
+
"use IComputeDriven for a cloth, fluid, boid, or other GPU simulation",
|
|
215
|
+
"run a cloth or fluid simulation with ordered GPU passes",
|
|
216
|
+
"keep IComputeDriven kernels warm before the first visible frame"
|
|
217
|
+
],
|
|
218
|
+
"summary": "Register game-owned IComputeDriven objects with the shared compute lifetime.",
|
|
219
|
+
"supersedes": [],
|
|
220
|
+
"symbol": "ComputeDrivenRegistry"
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"constraints": [
|
|
224
|
+
"reuse the loader handed to scenes as `ctx.assets` instead of building parallel caches"
|
|
225
|
+
],
|
|
226
|
+
"example": "const assets = createAssetLoader({ basePath: \"/assets\" });\nconst rock = await assets.texture(\"rock.png\");",
|
|
227
|
+
"importPath": "@threenative/core",
|
|
228
|
+
"kind": "function",
|
|
229
|
+
"overrides": [],
|
|
230
|
+
"package": "@threenative/core",
|
|
231
|
+
"signature": "export function createAssetLoader(options: IAssetLoaderOptions = { … }",
|
|
232
|
+
"situations": [
|
|
233
|
+
"preload models, textures, or audio before a scene enters",
|
|
234
|
+
"load assets from a nonstandard base path or a compiled asset manifest"
|
|
235
|
+
],
|
|
236
|
+
"summary": "Create the portable asset loader a scene also receives as `ctx.assets`.",
|
|
237
|
+
"supersedes": [],
|
|
238
|
+
"symbol": "createAssetLoader"
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"constraints": ["use the returned source instead of Math.random for replayable behavior"],
|
|
242
|
+
"example": "const random = createRandom(42);",
|
|
243
|
+
"importPath": "@threenative/core",
|
|
244
|
+
"kind": "function",
|
|
245
|
+
"overrides": [],
|
|
246
|
+
"package": "@threenative/core",
|
|
247
|
+
"signature": "export function createRandom(seed?: number): IRandom { … }",
|
|
248
|
+
"situations": [
|
|
249
|
+
"seed enemy patrol choices",
|
|
250
|
+
"reproduce the same procedural level in a playtest"
|
|
251
|
+
],
|
|
252
|
+
"summary": "Create a deterministic random source for portable gameplay.",
|
|
253
|
+
"supersedes": ["Math.random("],
|
|
254
|
+
"symbol": "createRandom"
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"constraints": [
|
|
258
|
+
"use a seeded random source and fixed-step simulation for meaningful replays"
|
|
259
|
+
],
|
|
260
|
+
"example": "const driver = createReplayDriver({ recording });",
|
|
261
|
+
"importPath": "@threenative/core",
|
|
262
|
+
"kind": "function",
|
|
263
|
+
"overrides": [],
|
|
264
|
+
"package": "@threenative/core",
|
|
265
|
+
"signature": "export function createReplayDriver( recording: Recording, target: EventTarget, pointerTarget = target, ) { … }",
|
|
266
|
+
"situations": [
|
|
267
|
+
"reproduce a gameplay bug from recorded input",
|
|
268
|
+
"run a deterministic replay in a playtest"
|
|
269
|
+
],
|
|
270
|
+
"summary": "Record or replay deterministic game input and state.",
|
|
271
|
+
"supersedes": [],
|
|
272
|
+
"symbol": "createReplayDriver"
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"constraints": [
|
|
276
|
+
"keep DOM and React mounting in src/main.ts",
|
|
277
|
+
"bind scroll or pinch and read the intent with ctx.input.axis(name); do not add a window wheel listener",
|
|
278
|
+
"scroll: true uses the DOM wheel sign on browser and native: negative deltaY toward the user is positive intent"
|
|
279
|
+
],
|
|
280
|
+
"example": "const game = defineGame({ input: { zoom: { scroll: true, pinch: true } }, scenes: { Play } });",
|
|
281
|
+
"importPath": "@threenative/core",
|
|
282
|
+
"kind": "function",
|
|
283
|
+
"overrides": [],
|
|
284
|
+
"package": "@threenative/core",
|
|
285
|
+
"signature": "export function defineGame<TState extends Record<string, unknown>, TPhysics = undefined>( config: IGameConfig<TState, TPhysics>, ): IGame<TState, TPhysics> { … }",
|
|
286
|
+
"situations": [
|
|
287
|
+
"start a ThreeNative game from src/game.ts",
|
|
288
|
+
"register physics and gameplay plugins",
|
|
289
|
+
"let the player zoom the camera with a wheel, pinch, or gamepad axis"
|
|
290
|
+
],
|
|
291
|
+
"summary": "Define the portable game entry shared by web and native.",
|
|
292
|
+
"supersedes": [],
|
|
293
|
+
"symbol": "defineGame"
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"constraints": ["pass a non-zero direction; coefficients and radii come from the game"],
|
|
297
|
+
"example": "const transmittance = directionalTransmittance(parameters, sunDirection);",
|
|
298
|
+
"importPath": "@threenative/core",
|
|
299
|
+
"kind": "function",
|
|
300
|
+
"overrides": [],
|
|
301
|
+
"package": "@threenative/core",
|
|
302
|
+
"signature": "export function directionalTransmittance( parameters: IAtmosphereParameters | IResolvedAtmosphereParameters, direction: Vector3, ): Vector3 { … }",
|
|
303
|
+
"situations": ["colour a game-owned sun from atmosphere extinction"],
|
|
304
|
+
"summary": "Approximate direct transmittance for a ray leaving the game surface.",
|
|
305
|
+
"supersedes": [],
|
|
306
|
+
"symbol": "directionalTransmittance"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"constraints": ["elevation and azimuth must be finite degrees"],
|
|
310
|
+
"example": "const direction = directionFromSolarPosition(sun.elevation, sun.azimuth);",
|
|
311
|
+
"importPath": "@threenative/core",
|
|
312
|
+
"kind": "function",
|
|
313
|
+
"overrides": [],
|
|
314
|
+
"package": "@threenative/core",
|
|
315
|
+
"signature": "export function directionFromSolarPosition(elevation: number, azimuth: number): Vector3 { … }",
|
|
316
|
+
"situations": ["aim a template's sun from solarPosition output"],
|
|
317
|
+
"summary": "Convert solar elevation and azimuth degrees into a normalized Three.js direction.",
|
|
318
|
+
"supersedes": [],
|
|
319
|
+
"symbol": "directionFromSolarPosition"
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"constraints": [
|
|
323
|
+
"call `VelocityTracker.update()` before the render and `commit()` after it",
|
|
324
|
+
"a pass is only given a velocity target when a temporal stage consumes it",
|
|
325
|
+
"call only when a temporal stage is active"
|
|
326
|
+
],
|
|
327
|
+
"example": "const scenePass = pass(scene, camera);\nensureVelocityOutput(scenePass);\nrenderer.setOutputNode(scenePass);\nconst tracker = new VelocityTracker();\ntracker.update(scene);\nrenderer.render(scene, camera);\ntracker.commit(scene);",
|
|
328
|
+
"importPath": "@threenative/core",
|
|
329
|
+
"kind": "function",
|
|
330
|
+
"overrides": [],
|
|
331
|
+
"package": "@threenative/core",
|
|
332
|
+
"signature": "export function ensureVelocityOutput(pass: IVelocityRenderPass): MRTNode { … }",
|
|
333
|
+
"situations": [
|
|
334
|
+
"keep a skinned character or instanced crowd stable in a temporal stage",
|
|
335
|
+
"add the velocity output to a Three.js scene pass",
|
|
336
|
+
"add a velocity target before a temporal stage consumes a scene pass"
|
|
337
|
+
],
|
|
338
|
+
"summary": "Provision screen-space motion data for temporal nodes and keep per-instance history at the frame boundary.",
|
|
339
|
+
"supersedes": [],
|
|
340
|
+
"symbol": "ensureVelocityOutput"
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"constraints": [
|
|
344
|
+
"add the field through `ctx.add` so renderer attachment, fixed-step dispatch, and release are automatic",
|
|
345
|
+
"`dye` and `velocity` are numeric samplers; appearance stays in the game's `src/render/` code",
|
|
346
|
+
"the conformance sample measures mean absolute velocity divergence at 0.001732 after four 32² steps with pressureIterations 2, below the 0.0025 threshold"
|
|
347
|
+
],
|
|
348
|
+
"example": "const field = new FluidField2D({ resolution: 256, pressureIterations: 20 });\nctx.add(field);\nfield.splat({ x: 0.5, y: 0.5 }, { x: 0.2, y: 0 }, 1);",
|
|
349
|
+
"importPath": "@threenative/core",
|
|
350
|
+
"kind": "class",
|
|
351
|
+
"overrides": [
|
|
352
|
+
"pressureIterations, viscosity, vorticity, and splatRadius tune the solver without changing its pass order"
|
|
353
|
+
],
|
|
354
|
+
"package": "@threenative/core",
|
|
355
|
+
"signature": "export class FluidField2D extends Group { … }",
|
|
356
|
+
"situations": [
|
|
357
|
+
"simulate smoke, fire, fog, wind, or fluid response on a grid",
|
|
358
|
+
"inject a touch, pointer, or gameplay impulse into a fluid field",
|
|
359
|
+
"sample fluid dye or velocity in a game-owned render node",
|
|
360
|
+
"simulate ocean currents and wind affecting a sailing ship",
|
|
361
|
+
"simulate ocean fluid dynamics and currents that affect a ship"
|
|
362
|
+
],
|
|
363
|
+
"summary": "Simulate a deterministic 2D velocity-and-dye field on the GPU while exposing its data to game-owned rendering.",
|
|
364
|
+
"supersedes": [],
|
|
365
|
+
"symbol": "FluidField2D"
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
"constraints": [
|
|
369
|
+
"on by default and printed as TN_FRAME_BUDGET; defineGame({ frameBudget: false }) silences the marker, not the measurement"
|
|
370
|
+
],
|
|
371
|
+
"example": "defineGame({ frameBudget: { reportEvery: 120 }, scenes: { Play } });",
|
|
372
|
+
"importPath": "@threenative/core",
|
|
373
|
+
"kind": "class",
|
|
374
|
+
"overrides": [],
|
|
375
|
+
"package": "@threenative/core",
|
|
376
|
+
"signature": "export class FrameBudget { … }",
|
|
377
|
+
"situations": [
|
|
378
|
+
"find out why a game runs slowly on a phone",
|
|
379
|
+
"attribute a frame to present wait, simulation, three.js render, or overlay"
|
|
380
|
+
],
|
|
381
|
+
"summary": "Read where the frame's milliseconds went, per presented frame, on any platform.",
|
|
382
|
+
"supersedes": [],
|
|
383
|
+
"symbol": "FrameBudget"
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
"constraints": [
|
|
387
|
+
"only use the returned platform facts; native globals are host-owned",
|
|
388
|
+
"ray tracing is unavailable on native until buffer-to-texture copy-out interop exists; `mystralRT.traceRays` refuses instead of resolving success without a readable result"
|
|
389
|
+
],
|
|
390
|
+
"example": "if (isMobile()) showTouchControls();",
|
|
391
|
+
"importPath": "@threenative/core",
|
|
392
|
+
"kind": "function",
|
|
393
|
+
"overrides": [],
|
|
394
|
+
"package": "@threenative/core",
|
|
395
|
+
"signature": "export function getPlatform(): Readonly<IPlatformInfo> { … }",
|
|
396
|
+
"situations": [
|
|
397
|
+
"branch a portable game on web or native",
|
|
398
|
+
"choose touch controls for a mobile device",
|
|
399
|
+
"can I raytrace on native"
|
|
400
|
+
],
|
|
401
|
+
"summary": "Read the host platform without reaching for browser globals.",
|
|
402
|
+
"supersedes": [],
|
|
403
|
+
"symbol": "getPlatform"
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
"constraints": ["geometry, color, and timing remain supplied by the game"],
|
|
407
|
+
"example": "const particles = new GPUParticles3D(particleOptions);",
|
|
408
|
+
"importPath": "@threenative/core",
|
|
409
|
+
"kind": "class",
|
|
410
|
+
"overrides": [],
|
|
411
|
+
"package": "@threenative/core",
|
|
412
|
+
"signature": "export class GPUParticles3D extends Sprite implements IComputeDriven { … }",
|
|
413
|
+
"situations": [
|
|
414
|
+
"emit sparks, smoke, or other transient effects",
|
|
415
|
+
"update many small visual particles",
|
|
416
|
+
"emit cannon smoke and muzzle flash particles",
|
|
417
|
+
"fire a cannonball projectile with cannon smoke particles"
|
|
418
|
+
],
|
|
419
|
+
"summary": "Dispatch a game-owned particle surface and process function through a pooled system.",
|
|
420
|
+
"supersedes": [],
|
|
421
|
+
"symbol": "GPUParticles3D"
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
"constraints": [
|
|
425
|
+
"the copy is asynchronous, so every sample carries staleFrames and is never this frame",
|
|
426
|
+
"WebGPU only; the seam throws on a WebGL2 renderer rather than returning nothing",
|
|
427
|
+
"one copy is in flight at a time and requests made during one are dropped, not queued"
|
|
428
|
+
],
|
|
429
|
+
"example": "const heights = new GPUReadback({ attribute: field.value, everyFrames: 4 });",
|
|
430
|
+
"importPath": "@threenative/core",
|
|
431
|
+
"kind": "class",
|
|
432
|
+
"overrides": [],
|
|
433
|
+
"package": "@threenative/core",
|
|
434
|
+
"signature": "export class GPUReadback { … }",
|
|
435
|
+
"situations": [
|
|
436
|
+
"read a GPU simulation on the CPU without stalling the frame",
|
|
437
|
+
"float a body on a wave field whose height only exists on the GPU",
|
|
438
|
+
"count GPU-side survivors for a diagnostic without blocking drawing",
|
|
439
|
+
"keep a ship floating on simulated ocean waves"
|
|
440
|
+
],
|
|
441
|
+
"summary": "Copy a GPU buffer back to the CPU on a throttle, and report how old each sample is.",
|
|
442
|
+
"supersedes": [],
|
|
443
|
+
"symbol": "GPUReadback"
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"constraints": [
|
|
447
|
+
"call rebuild() after a scene transform or geometry change; the snapshot is static by default",
|
|
448
|
+
"rebuild() is an explicit CPU SAH build proportional to selected triangles; process() is a no-op, and the game pays upstream traversal per shader ray"
|
|
449
|
+
],
|
|
450
|
+
"example": "const bvh = ctx.add(new GPUSceneBVH(ctx.scene, { include: (object) => object.userData.traceable === true }));",
|
|
451
|
+
"importPath": "@threenative/core",
|
|
452
|
+
"kind": "class",
|
|
453
|
+
"overrides": [],
|
|
454
|
+
"package": "@threenative/core",
|
|
455
|
+
"signature": "export class GPUSceneBVH extends Group implements IComputeDriven { … }",
|
|
456
|
+
"situations": [
|
|
457
|
+
"trace thousands of scene rays inside a TSL kernel",
|
|
458
|
+
"build a contact-occlusion or visibility query over loaded meshes"
|
|
459
|
+
],
|
|
460
|
+
"summary": "Pack a selected static scene into TSL storage nodes for an upstream BVH ray query.",
|
|
461
|
+
"supersedes": [],
|
|
462
|
+
"symbol": "GPUSceneBVH"
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
"constraints": [
|
|
466
|
+
"import from `@threenative/core`; this moves the rendered model, not its physics collider"
|
|
467
|
+
],
|
|
468
|
+
"example": "import { GroundSnap } from \"@threenative/core\";\nconst snap = new GroundSnap(character, { enabled: true });",
|
|
469
|
+
"importPath": "@threenative/core",
|
|
470
|
+
"kind": "class",
|
|
471
|
+
"overrides": [
|
|
472
|
+
"enabled controls whether correction is applied while clearance is still measured"
|
|
473
|
+
],
|
|
474
|
+
"package": "@threenative/core",
|
|
475
|
+
"signature": "export class GroundSnap { … }",
|
|
476
|
+
"situations": [
|
|
477
|
+
"keep a character's feet on the floor",
|
|
478
|
+
"correct visual grounding after an animation update"
|
|
479
|
+
],
|
|
480
|
+
"summary": "Keep a rendered model's feet on a surface while preserving an auditable override.",
|
|
481
|
+
"supersedes": [],
|
|
482
|
+
"symbol": "GroundSnap"
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
"constraints": [
|
|
486
|
+
"geometry and material are required and come from the game; the batch chooses neither",
|
|
487
|
+
"span stretches along +Y, so its geometry must be unit-height and centred on the origin",
|
|
488
|
+
"placing after build() throws, and build() returns undefined when nothing was placed"
|
|
489
|
+
],
|
|
490
|
+
"example": "const curbs = new InstancedBatch({ geometry: new BoxGeometry(1, 1, 1), material });\ncurbs.place({ position: [x, 0.08, z], rotation: [0, angle, 0], scale: [length, 0.18, 0.42] });\ncurbs.build({ castShadow: true, name: \"curbs\", parent: ctx.scene });",
|
|
491
|
+
"importPath": "@threenative/core",
|
|
492
|
+
"kind": "class",
|
|
493
|
+
"overrides": [
|
|
494
|
+
"castShadow and receiveShadow pass through to the built mesh and default to Three.js's own false"
|
|
495
|
+
],
|
|
496
|
+
"package": "@threenative/core",
|
|
497
|
+
"signature": "export class InstancedBatch { … }",
|
|
498
|
+
"situations": [
|
|
499
|
+
"draw hundreds of repeated props without hundreds of draw calls",
|
|
500
|
+
"place repeated props when the count is not known until the layout has been walked",
|
|
501
|
+
"build a chain, railing, cable, or tie rod out of point-to-point segments"
|
|
502
|
+
],
|
|
503
|
+
"summary": "Collapse many copies of one game-authored shape into a single draw, without counting them first. `new InstancedMesh(geometry, material, count)` needs the count before anything is placed, so a procedural builder ends up walking its layout twice or over-allocating. Place as you go and `build()` once; the shape, the surface and every transform stay the game's, and the built mesh is returned so instances can still be animated by the index `place` and `span` hand back.",
|
|
504
|
+
"supersedes": [],
|
|
505
|
+
"symbol": "InstancedBatch"
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
"constraints": [
|
|
509
|
+
"only use the returned platform facts; native globals are host-owned",
|
|
510
|
+
"ray tracing is unavailable on native until buffer-to-texture copy-out interop exists; `mystralRT.traceRays` refuses instead of resolving success without a readable result"
|
|
511
|
+
],
|
|
512
|
+
"example": "if (isMobile()) showTouchControls();",
|
|
513
|
+
"importPath": "@threenative/core",
|
|
514
|
+
"kind": "function",
|
|
515
|
+
"overrides": [],
|
|
516
|
+
"package": "@threenative/core",
|
|
517
|
+
"signature": "export function isMobile(): boolean { … }",
|
|
518
|
+
"situations": [
|
|
519
|
+
"branch a portable game on web or native",
|
|
520
|
+
"choose touch controls for a mobile device",
|
|
521
|
+
"can I raytrace on native"
|
|
522
|
+
],
|
|
523
|
+
"summary": "Read the host platform without reaching for browser globals.",
|
|
524
|
+
"supersedes": [],
|
|
525
|
+
"symbol": "isMobile"
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
"constraints": [
|
|
529
|
+
"only use the returned platform facts; native globals are host-owned",
|
|
530
|
+
"ray tracing is unavailable on native until buffer-to-texture copy-out interop exists; `mystralRT.traceRays` refuses instead of resolving success without a readable result"
|
|
531
|
+
],
|
|
532
|
+
"example": "if (isMobile()) showTouchControls();",
|
|
533
|
+
"importPath": "@threenative/core",
|
|
534
|
+
"kind": "function",
|
|
535
|
+
"overrides": [],
|
|
536
|
+
"package": "@threenative/core",
|
|
537
|
+
"signature": "export function isNative(): boolean { … }",
|
|
538
|
+
"situations": [
|
|
539
|
+
"branch a portable game on web or native",
|
|
540
|
+
"choose touch controls for a mobile device",
|
|
541
|
+
"can I raytrace on native"
|
|
542
|
+
],
|
|
543
|
+
"summary": "Read the host platform without reaching for browser globals.",
|
|
544
|
+
"supersedes": [],
|
|
545
|
+
"symbol": "isNative"
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
"constraints": [
|
|
549
|
+
"only use the returned platform facts; native globals are host-owned",
|
|
550
|
+
"ray tracing is unavailable on native until buffer-to-texture copy-out interop exists; `mystralRT.traceRays` refuses instead of resolving success without a readable result"
|
|
551
|
+
],
|
|
552
|
+
"example": "if (isMobile()) showTouchControls();",
|
|
553
|
+
"importPath": "@threenative/core",
|
|
554
|
+
"kind": "function",
|
|
555
|
+
"overrides": [],
|
|
556
|
+
"package": "@threenative/core",
|
|
557
|
+
"signature": "export function isTouchscreenAvailable(): boolean { … }",
|
|
558
|
+
"situations": [
|
|
559
|
+
"branch a portable game on web or native",
|
|
560
|
+
"choose touch controls for a mobile device",
|
|
561
|
+
"can I raytrace on native"
|
|
562
|
+
],
|
|
563
|
+
"summary": "Read the host platform without reaching for browser globals.",
|
|
564
|
+
"supersedes": [],
|
|
565
|
+
"symbol": "isTouchscreenAvailable"
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"constraints": [
|
|
569
|
+
"only use the returned platform facts; native globals are host-owned",
|
|
570
|
+
"ray tracing is unavailable on native until buffer-to-texture copy-out interop exists; `mystralRT.traceRays` refuses instead of resolving success without a readable result"
|
|
571
|
+
],
|
|
572
|
+
"example": "if (isMobile()) showTouchControls();",
|
|
573
|
+
"importPath": "@threenative/core",
|
|
574
|
+
"kind": "function",
|
|
575
|
+
"overrides": [],
|
|
576
|
+
"package": "@threenative/core",
|
|
577
|
+
"signature": "export function isWeb(): boolean { … }",
|
|
578
|
+
"situations": [
|
|
579
|
+
"branch a portable game on web or native",
|
|
580
|
+
"choose touch controls for a mobile device",
|
|
581
|
+
"can I raytrace on native"
|
|
582
|
+
],
|
|
583
|
+
"summary": "Read the host platform without reaching for browser globals.",
|
|
584
|
+
"supersedes": [],
|
|
585
|
+
"symbol": "isWeb"
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"constraints": ["precise per-vertex measurement is opt-in and not for frame loops"],
|
|
589
|
+
"example": "const measurement = measureThreePose(model);",
|
|
590
|
+
"importPath": "@threenative/core",
|
|
591
|
+
"kind": "function",
|
|
592
|
+
"overrides": [],
|
|
593
|
+
"package": "@threenative/core",
|
|
594
|
+
"signature": "export function measureThreePose( object: Object3D, options: IMeasureThreePoseOptions = { … }",
|
|
595
|
+
"situations": ["inspect a skinned model's posed bounds", "verify a character's visual pose"],
|
|
596
|
+
"summary": "Measure a Three.js pose for grounded or attachment-aware checks.",
|
|
597
|
+
"supersedes": [],
|
|
598
|
+
"symbol": "measureThreePose"
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
"constraints": [
|
|
602
|
+
"skinned height uses a crown bone; game-specific asset expectations stay in render code"
|
|
603
|
+
],
|
|
604
|
+
"example": "normaliseToMetres(character, { metres: 1.8, axis: \"height\" });",
|
|
605
|
+
"importPath": "@threenative/core",
|
|
606
|
+
"kind": "function",
|
|
607
|
+
"overrides": [],
|
|
608
|
+
"package": "@threenative/core",
|
|
609
|
+
"signature": "export function normaliseToMetres(object: Object3D, options: INormaliseToMetresOptions): number { … }",
|
|
610
|
+
"situations": [
|
|
611
|
+
"make a character exactly 1.8 metres tall",
|
|
612
|
+
"normalize a prop or weapon to a known longest axis"
|
|
613
|
+
],
|
|
614
|
+
"summary": "Scale an asset to a real-world measurement and return the applied factor.",
|
|
615
|
+
"supersedes": ["new Box3().setFromObject("],
|
|
616
|
+
"symbol": "normaliseToMetres"
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"constraints": ["recordings are version 1; the parser fails closed with TN_REPLAY_* codes"],
|
|
620
|
+
"example": "const recording = parseReplayRecording(rawRecording);",
|
|
621
|
+
"importPath": "@threenative/core",
|
|
622
|
+
"kind": "function",
|
|
623
|
+
"overrides": [],
|
|
624
|
+
"package": "@threenative/core",
|
|
625
|
+
"signature": "export function parseReplayRecording(value: unknown): IReplayRecording { … }",
|
|
626
|
+
"situations": ["validate a recording before replaying it in another host"],
|
|
627
|
+
"summary": "Validate and parse a replay recording file.",
|
|
628
|
+
"supersedes": [],
|
|
629
|
+
"symbol": "parseReplayRecording"
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
"constraints": [],
|
|
633
|
+
"example": "const follower = new PathFollow3D(curve, { loop: true });",
|
|
634
|
+
"importPath": "@threenative/core",
|
|
635
|
+
"kind": "class",
|
|
636
|
+
"overrides": [],
|
|
637
|
+
"package": "@threenative/core",
|
|
638
|
+
"signature": "export class PathFollow3D { … }",
|
|
639
|
+
"situations": [
|
|
640
|
+
"move an enemy or prop along a patrol path",
|
|
641
|
+
"sample a racing line from a curve"
|
|
642
|
+
],
|
|
643
|
+
"summary": "Move an object along a Three.js curve with Godot-style path following.",
|
|
644
|
+
"supersedes": [],
|
|
645
|
+
"symbol": "PathFollow3D"
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
"constraints": [
|
|
649
|
+
"listeners are side-table registrations; Three.js prototypes are never patched",
|
|
650
|
+
"one raycast serves each active pointer and no raycast runs when nothing is registered"
|
|
651
|
+
],
|
|
652
|
+
"example": "ctx.pointer.on(tile, \"tapped\", (event) => place(event.point));",
|
|
653
|
+
"importPath": "@threenative/core",
|
|
654
|
+
"kind": "class",
|
|
655
|
+
"overrides": [],
|
|
656
|
+
"package": "@threenative/core",
|
|
657
|
+
"signature": "export class PointerEvents3D implements IPointerEvents3D { … }",
|
|
658
|
+
"situations": [
|
|
659
|
+
"let the player click on a thing in the world",
|
|
660
|
+
"show a 3D object while a pointer hovers over it",
|
|
661
|
+
"handle touch and mouse taps on a loaded model without naming its child meshes"
|
|
662
|
+
],
|
|
663
|
+
"summary": "Dispatch portable pointer events from the game surface to registered Three.js objects.",
|
|
664
|
+
"supersedes": [],
|
|
665
|
+
"symbol": "PointerEvents3D"
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
"constraints": ["precise per-vertex measurement is opt-in and not for frame loops"],
|
|
669
|
+
"example": "const measurement = measureThreePose(model);",
|
|
670
|
+
"importPath": "@threenative/core",
|
|
671
|
+
"kind": "function",
|
|
672
|
+
"overrides": [],
|
|
673
|
+
"package": "@threenative/core",
|
|
674
|
+
"signature": "export function posedBounds(root: Object3D, meshes?: readonly Object3D[]): IThreePoseBounds { … }",
|
|
675
|
+
"situations": ["inspect a skinned model's posed bounds", "verify a character's visual pose"],
|
|
676
|
+
"summary": "Measure a Three.js pose for grounded or attachment-aware checks.",
|
|
677
|
+
"supersedes": [],
|
|
678
|
+
"symbol": "posedBounds"
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
"constraints": [
|
|
682
|
+
"keep the surface visible with zero opacity; do not hide it with `visible = false`"
|
|
683
|
+
],
|
|
684
|
+
"example": "prewarm(tracerPool);",
|
|
685
|
+
"importPath": "@threenative/core",
|
|
686
|
+
"kind": "function",
|
|
687
|
+
"overrides": [],
|
|
688
|
+
"package": "@threenative/core",
|
|
689
|
+
"signature": "export function prewarm(object: Object3D | readonly Object3D[]): void { … }",
|
|
690
|
+
"situations": [
|
|
691
|
+
"prewarm a projectile, tracer, particle, or other transient effect",
|
|
692
|
+
"avoid a long first-use frame for a newly visible effect"
|
|
693
|
+
],
|
|
694
|
+
"summary": "Keep transient render surfaces in the renderer's pipeline cache before first use.",
|
|
695
|
+
"supersedes": [".visible = false"],
|
|
696
|
+
"symbol": "prewarm"
|
|
697
|
+
},
|
|
698
|
+
{
|
|
699
|
+
"constraints": [
|
|
700
|
+
"request a bake after static geometry and lights are authored; this is static-lighting-first, not fully dynamic relighting",
|
|
701
|
+
"add the volume with ctx.add() so its incremental work is measured in the render phase",
|
|
702
|
+
"call sample() or sampleNode() from a game-owned material before screen-space GI; the volume owns no light, material, or colour"
|
|
703
|
+
],
|
|
704
|
+
"example": "const probes = new ProbeVolume({ bounds, density: 0.5 }); ctx.add(probes); void probes.requestBake(scene);",
|
|
705
|
+
"importPath": "@threenative/core",
|
|
706
|
+
"kind": "class",
|
|
707
|
+
"overrides": ["density, bounds, bakeBudgetMs, and bounces are game-owned choices"],
|
|
708
|
+
"package": "@threenative/core",
|
|
709
|
+
"signature": "export class ProbeVolume extends Object3D implements IComputeDriven { … }",
|
|
710
|
+
"situations": [
|
|
711
|
+
"light bouncing from a room I cannot see",
|
|
712
|
+
"light a wall with an off-screen emitter"
|
|
713
|
+
],
|
|
714
|
+
"summary": "Bake static diffuse irradiance that reaches surfaces from outside the camera view.",
|
|
715
|
+
"supersedes": [],
|
|
716
|
+
"symbol": "ProbeVolume"
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
"constraints": [
|
|
720
|
+
"request a bake after static geometry and lights are authored; this is static-lighting-first, not fully dynamic relighting",
|
|
721
|
+
"add the volume with ctx.add() so its incremental work is measured in the render phase",
|
|
722
|
+
"call sample() or sampleNode() from a game-owned material before screen-space GI; the volume owns no light, material, or colour"
|
|
723
|
+
],
|
|
724
|
+
"example": "const probes = new ProbeVolume({ bounds, density: 0.5 }); ctx.add(probes); void probes.requestBake(scene);",
|
|
725
|
+
"importPath": "@threenative/core",
|
|
726
|
+
"kind": "function",
|
|
727
|
+
"overrides": ["density, bounds, bakeBudgetMs, and bounces are game-owned choices"],
|
|
728
|
+
"package": "@threenative/core",
|
|
729
|
+
"signature": "export function readProbeVolumeObservation(value: unknown): IProbeVolumeObservation | undefined { … }",
|
|
730
|
+
"situations": [
|
|
731
|
+
"light bouncing from a room I cannot see",
|
|
732
|
+
"light a wall with an off-screen emitter"
|
|
733
|
+
],
|
|
734
|
+
"summary": "Bake static diffuse irradiance that reaches surfaces from outside the camera view.",
|
|
735
|
+
"supersedes": [],
|
|
736
|
+
"symbol": "readProbeVolumeObservation"
|
|
737
|
+
},
|
|
738
|
+
{
|
|
739
|
+
"constraints": ["stage factories own colour, strength, and all other appearance choices"],
|
|
740
|
+
"example": "const chain = new RenderChain(renderer, { input: colour, stages, request: { stages: [\"bloom\"], tier: \"auto\" } });",
|
|
741
|
+
"importPath": "@threenative/core",
|
|
742
|
+
"kind": "function",
|
|
743
|
+
"overrides": [],
|
|
744
|
+
"package": "@threenative/core",
|
|
745
|
+
"signature": "export function readRenderChainObservation( renderer: unknown, ): IRenderChainMarker[\"applied\"] | undefined { … }",
|
|
746
|
+
"situations": [
|
|
747
|
+
"compose screen-space effects in a canonical order",
|
|
748
|
+
"report which render tier and velocity route actually ran"
|
|
749
|
+
],
|
|
750
|
+
"summary": "Compose game-provided render nodes in a measured, fail-closed chain.",
|
|
751
|
+
"supersedes": [],
|
|
752
|
+
"symbol": "readRenderChainObservation"
|
|
753
|
+
},
|
|
754
|
+
{
|
|
755
|
+
"constraints": [
|
|
756
|
+
"stage factories own colour, strength, and all other appearance choices",
|
|
757
|
+
"an absent value means no chain was installed and must fail a chain assertion"
|
|
758
|
+
],
|
|
759
|
+
"example": "const chain = new RenderChain(renderer, { input: colour, stages, request: { stages: [\"bloom\"], tier: \"auto\" } });",
|
|
760
|
+
"importPath": "@threenative/core",
|
|
761
|
+
"kind": "function",
|
|
762
|
+
"overrides": [],
|
|
763
|
+
"package": "@threenative/core",
|
|
764
|
+
"signature": "export function readRenderChainReport(renderer: unknown): IRenderChainMarker | undefined { … }",
|
|
765
|
+
"situations": [
|
|
766
|
+
"compose screen-space effects in a canonical order",
|
|
767
|
+
"report which render tier and velocity route actually ran",
|
|
768
|
+
"expose the render tier and dropped-stage reasons to a playtest",
|
|
769
|
+
"inspect whether a temporal pass received velocity"
|
|
770
|
+
],
|
|
771
|
+
"summary": "Compose game-provided render nodes in a measured, fail-closed chain.",
|
|
772
|
+
"supersedes": [],
|
|
773
|
+
"symbol": "readRenderChainReport"
|
|
774
|
+
},
|
|
775
|
+
{
|
|
776
|
+
"constraints": [
|
|
777
|
+
"call `VelocityTracker.update()` before the render and `commit()` after it",
|
|
778
|
+
"a pass is only given a velocity target when a temporal stage consumes it"
|
|
779
|
+
],
|
|
780
|
+
"example": "const scenePass = pass(scene, camera);\nensureVelocityOutput(scenePass);\nrenderer.setOutputNode(scenePass);\nconst tracker = new VelocityTracker();\ntracker.update(scene);\nrenderer.render(scene, camera);\ntracker.commit(scene);",
|
|
781
|
+
"importPath": "@threenative/core",
|
|
782
|
+
"kind": "function",
|
|
783
|
+
"overrides": [],
|
|
784
|
+
"package": "@threenative/core",
|
|
785
|
+
"signature": "export function readVelocityPreviousBoneMatrices(object: Object3D): Float32Array | undefined { … }",
|
|
786
|
+
"situations": [
|
|
787
|
+
"keep a skinned character or instanced crowd stable in a temporal stage",
|
|
788
|
+
"add the velocity output to a Three.js scene pass",
|
|
789
|
+
"inspect the previous skinned pose at a renderer adapter boundary"
|
|
790
|
+
],
|
|
791
|
+
"summary": "Provision screen-space motion data for temporal nodes and keep per-instance history at the frame boundary.",
|
|
792
|
+
"supersedes": [],
|
|
793
|
+
"symbol": "readVelocityPreviousBoneMatrices"
|
|
794
|
+
},
|
|
795
|
+
{
|
|
796
|
+
"constraints": [
|
|
797
|
+
"call `VelocityTracker.update()` before the render and `commit()` after it",
|
|
798
|
+
"a pass is only given a velocity target when a temporal stage consumes it"
|
|
799
|
+
],
|
|
800
|
+
"example": "const scenePass = pass(scene, camera);\nensureVelocityOutput(scenePass);\nrenderer.setOutputNode(scenePass);\nconst tracker = new VelocityTracker();\ntracker.update(scene);\nrenderer.render(scene, camera);\ntracker.commit(scene);",
|
|
801
|
+
"importPath": "@threenative/core",
|
|
802
|
+
"kind": "function",
|
|
803
|
+
"overrides": [],
|
|
804
|
+
"package": "@threenative/core",
|
|
805
|
+
"signature": "export function readVelocityPreviousMatrices(object: Object3D): Float32Array | undefined { … }",
|
|
806
|
+
"situations": [
|
|
807
|
+
"keep a skinned character or instanced crowd stable in a temporal stage",
|
|
808
|
+
"add the velocity output to a Three.js scene pass",
|
|
809
|
+
"inspect the previous instance frame at a renderer adapter boundary"
|
|
810
|
+
],
|
|
811
|
+
"summary": "Provision screen-space motion data for temporal nodes and keep per-instance history at the frame boundary.",
|
|
812
|
+
"supersedes": [],
|
|
813
|
+
"symbol": "readVelocityPreviousMatrices"
|
|
814
|
+
},
|
|
815
|
+
{
|
|
816
|
+
"constraints": [
|
|
817
|
+
"call `VelocityTracker.update()` before the render and `commit()` after it",
|
|
818
|
+
"a pass is only given a velocity target when a temporal stage consumes it"
|
|
819
|
+
],
|
|
820
|
+
"example": "const scenePass = pass(scene, camera);\nensureVelocityOutput(scenePass);\nrenderer.setOutputNode(scenePass);\nconst tracker = new VelocityTracker();\ntracker.update(scene);\nrenderer.render(scene, camera);\ntracker.commit(scene);",
|
|
821
|
+
"importPath": "@threenative/core",
|
|
822
|
+
"kind": "function",
|
|
823
|
+
"overrides": [],
|
|
824
|
+
"package": "@threenative/core",
|
|
825
|
+
"signature": "export function readVelocityPreviousWorldMatrix(object: Object3D): Matrix4 | undefined { … }",
|
|
826
|
+
"situations": [
|
|
827
|
+
"keep a skinned character or instanced crowd stable in a temporal stage",
|
|
828
|
+
"add the velocity output to a Three.js scene pass",
|
|
829
|
+
"inspect the previous rigid transform at a renderer adapter boundary"
|
|
830
|
+
],
|
|
831
|
+
"summary": "Provision screen-space motion data for temporal nodes and keep per-instance history at the frame boundary.",
|
|
832
|
+
"supersedes": [],
|
|
833
|
+
"symbol": "readVelocityPreviousWorldMatrix"
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
"constraints": ["stage factories own colour, strength, and all other appearance choices"],
|
|
837
|
+
"example": "const chain = new RenderChain(renderer, { input: colour, stages, request: { stages: [\"bloom\"], tier: \"auto\" } });",
|
|
838
|
+
"importPath": "@threenative/core",
|
|
839
|
+
"kind": "class",
|
|
840
|
+
"overrides": [],
|
|
841
|
+
"package": "@threenative/core",
|
|
842
|
+
"signature": "export class RenderChain { … }",
|
|
843
|
+
"situations": [
|
|
844
|
+
"compose screen-space effects in a canonical order",
|
|
845
|
+
"report which render tier and velocity route actually ran"
|
|
846
|
+
],
|
|
847
|
+
"summary": "Compose game-provided render nodes in a measured, fail-closed chain.",
|
|
848
|
+
"supersedes": [],
|
|
849
|
+
"symbol": "RenderChain"
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
"constraints": [
|
|
853
|
+
"use a seeded random source and fixed-step simulation for meaningful replays"
|
|
854
|
+
],
|
|
855
|
+
"example": "const driver = createReplayDriver({ recording });",
|
|
856
|
+
"importPath": "@threenative/core",
|
|
857
|
+
"kind": "function",
|
|
858
|
+
"overrides": [],
|
|
859
|
+
"package": "@threenative/core",
|
|
860
|
+
"signature": "export function replay< TState extends Record<string, unknown> = Record<string, unknown>, TPhysics = undefined, >(options: IReplayOptions = { … }",
|
|
861
|
+
"situations": [
|
|
862
|
+
"reproduce a gameplay bug from recorded input",
|
|
863
|
+
"run a deterministic replay in a playtest"
|
|
864
|
+
],
|
|
865
|
+
"summary": "Record or replay deterministic game input and state.",
|
|
866
|
+
"supersedes": [],
|
|
867
|
+
"symbol": "replay"
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
"constraints": [
|
|
871
|
+
"every width and height must be a positive integer; the dimensions are not a named fidelity tier"
|
|
872
|
+
],
|
|
873
|
+
"example": "const resolutions = resolveAtmosphereLutResolutions({ skyView: { width: 128, height: 72 } });",
|
|
874
|
+
"importPath": "@threenative/core",
|
|
875
|
+
"kind": "function",
|
|
876
|
+
"overrides": [],
|
|
877
|
+
"package": "@threenative/core",
|
|
878
|
+
"signature": "export function resolveAtmosphereLutResolutions( resolutions: Partial<IAtmosphereLutResolutions> | undefined, ): IAtmosphereLutResolutions { … }",
|
|
879
|
+
"situations": ["choose atmosphere LUT dimensions for a measured startup budget"],
|
|
880
|
+
"summary": "Resolve the three LUT dimensions, allowing a game to trade startup cost for resolution.",
|
|
881
|
+
"supersedes": [],
|
|
882
|
+
"symbol": "resolveAtmosphereLutResolutions"
|
|
883
|
+
},
|
|
884
|
+
{
|
|
885
|
+
"constraints": [
|
|
886
|
+
"provide all three coefficient vectors and both radii; omitted fields are errors"
|
|
887
|
+
],
|
|
888
|
+
"example": "const parameters = resolveAtmosphereParameters({ rayleigh, mie, ozone, planetRadius, atmosphereRadius });",
|
|
889
|
+
"importPath": "@threenative/core",
|
|
890
|
+
"kind": "function",
|
|
891
|
+
"overrides": [],
|
|
892
|
+
"package": "@threenative/core",
|
|
893
|
+
"signature": "export function resolveAtmosphereParameters( options: IAtmosphereParameters, ): IResolvedAtmosphereParameters { … }",
|
|
894
|
+
"situations": ["validate atmosphere coefficients before a game creates its sky"],
|
|
895
|
+
"summary": "Validate and clone game-owned atmosphere coefficients.",
|
|
896
|
+
"supersedes": [],
|
|
897
|
+
"symbol": "resolveAtmosphereParameters"
|
|
898
|
+
},
|
|
899
|
+
{
|
|
900
|
+
"constraints": ["scene code must stay portable across web and native"],
|
|
901
|
+
"example": "class Play extends Scene { update(ctx, dt) {} }",
|
|
902
|
+
"importPath": "@threenative/core",
|
|
903
|
+
"kind": "class",
|
|
904
|
+
"overrides": [],
|
|
905
|
+
"package": "@threenative/core",
|
|
906
|
+
"signature": "export abstract class Scene< TState extends Record<string, unknown> = Record<string, unknown>, TPhysics = undefined, > { … }",
|
|
907
|
+
"situations": [
|
|
908
|
+
"add a playable level or menu scene",
|
|
909
|
+
"move scene setup and per-frame gameplay out of the entry point"
|
|
910
|
+
],
|
|
911
|
+
"summary": "Implement a portable Godot-shaped game scene lifecycle.",
|
|
912
|
+
"supersedes": [],
|
|
913
|
+
"symbol": "Scene"
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
"constraints": [],
|
|
917
|
+
"example": "const picker = new ScenePicker({ camera, scene });",
|
|
918
|
+
"importPath": "@threenative/core",
|
|
919
|
+
"kind": "class",
|
|
920
|
+
"overrides": [],
|
|
921
|
+
"package": "@threenative/core",
|
|
922
|
+
"signature": "export class ScenePicker { … }",
|
|
923
|
+
"situations": [
|
|
924
|
+
"select an object under the pointer",
|
|
925
|
+
"interact with the first collider or mesh hit"
|
|
926
|
+
],
|
|
927
|
+
"summary": "Raycast the game scene using the framework's picker.",
|
|
928
|
+
"supersedes": ["new Raycaster("],
|
|
929
|
+
"symbol": "ScenePicker"
|
|
930
|
+
},
|
|
931
|
+
{
|
|
932
|
+
"constraints": [
|
|
933
|
+
"dispose returned handles when the owning scene exits",
|
|
934
|
+
"ease receives progress in the range 0 to 1 and its return value is the interpolation factor"
|
|
935
|
+
],
|
|
936
|
+
"example": "const door = { y: 0 };\nawait ctx.tween(door, { y: 2.4 }, 0.5, { ease: (t) => 1 - (1 - t) ** 3 });",
|
|
937
|
+
"importPath": "@threenative/core",
|
|
938
|
+
"kind": "class",
|
|
939
|
+
"overrides": [],
|
|
940
|
+
"package": "@threenative/core",
|
|
941
|
+
"signature": "export class Scheduler { … }",
|
|
942
|
+
"situations": [
|
|
943
|
+
"delay an enemy patrol transition",
|
|
944
|
+
"run a callback every simulation tick",
|
|
945
|
+
"tween a numeric property with a game-owned curve"
|
|
946
|
+
],
|
|
947
|
+
"summary": "Schedule delayed and repeating callbacks or tween numeric properties with game-owned cleanup.",
|
|
948
|
+
"supersedes": [],
|
|
949
|
+
"symbol": "Scheduler"
|
|
950
|
+
},
|
|
951
|
+
{
|
|
952
|
+
"constraints": [],
|
|
953
|
+
"example": "import { skeletonBones } from \"@threenative/core\";\nconst bones = skeletonBones(character);",
|
|
954
|
+
"importPath": "@threenative/core",
|
|
955
|
+
"kind": "function",
|
|
956
|
+
"overrides": [],
|
|
957
|
+
"package": "@threenative/core",
|
|
958
|
+
"signature": "export function skeletonBones(root: Object3D): readonly string[] { … }",
|
|
959
|
+
"situations": [
|
|
960
|
+
"inspect the available bones before attaching a game-owned object",
|
|
961
|
+
"debug a missing skeleton bone name"
|
|
962
|
+
],
|
|
963
|
+
"summary": "List the names of every bone in a character hierarchy.",
|
|
964
|
+
"supersedes": [],
|
|
965
|
+
"symbol": "skeletonBones"
|
|
966
|
+
},
|
|
967
|
+
{
|
|
968
|
+
"constraints": [
|
|
969
|
+
"the mesh must use one Three.js node material and contain complete triangles",
|
|
970
|
+
"pinned, stiffness, damping, gravity, and wind are required game-owned inputs",
|
|
971
|
+
"Pixel 8 steady upper bound for the shipped 45-vertex pennant with readback every two frames: whole-starter update p95 4.66 ms, render p95 3.56 ms, and GPU timer 0.05 ms across three 300-frame final-rung windows at 552x248 with 4x MSAA; these whole-scene numbers are not isolated solver cost"
|
|
972
|
+
],
|
|
973
|
+
"example": "const flag = new SoftBody3D(flagMesh, { pinned: topEdge, stiffness: 35, damping: 1.8, gravity: [0, -9.81, 0], wind: [1.5, 0, 0.4] });",
|
|
974
|
+
"importPath": "@threenative/core",
|
|
975
|
+
"kind": "class",
|
|
976
|
+
"overrides": [
|
|
977
|
+
"timeStep follows the engine 1/60-second convention unless the game overrides it",
|
|
978
|
+
"readbackEveryFrames enables an explicitly stale CPU position sample; zero disables it"
|
|
979
|
+
],
|
|
980
|
+
"package": "@threenative/core",
|
|
981
|
+
"signature": "export class SoftBody3D extends Mesh<BufferGeometry, NodeMaterial> implements IComputeDriven { … }",
|
|
982
|
+
"situations": [
|
|
983
|
+
"make a flag, cape, or curtain move as cloth",
|
|
984
|
+
"simulate a deforming surface while keeping one edge pinned",
|
|
985
|
+
"simulate cloth sails blowing in the wind",
|
|
986
|
+
"make cloth sails billow in wind on a ship"
|
|
987
|
+
],
|
|
988
|
+
"summary": "Simulate an ordinary game-authored triangle mesh as cloth on the existing fixed-step GPU lane. The mesh supplies every visible choice. This class welds exporter duplicates, owns spring and position buffers, and replaces only the cloned material's position node. It adds no material, colour, texture, wind, stiffness, damping, or pinning default.",
|
|
989
|
+
"supersedes": [],
|
|
990
|
+
"symbol": "SoftBody3D"
|
|
991
|
+
},
|
|
992
|
+
{
|
|
993
|
+
"constraints": [
|
|
994
|
+
"canvas-painted images sample black under WebGPURenderer; write sprites as pixel data there"
|
|
995
|
+
],
|
|
996
|
+
"example": "const puff = softCircleDataTexture(64, 0.25);",
|
|
997
|
+
"importPath": "@threenative/core",
|
|
998
|
+
"kind": "function",
|
|
999
|
+
"overrides": [],
|
|
1000
|
+
"package": "@threenative/core",
|
|
1001
|
+
"signature": "export function softCircleDataTexture(size = 64, hardness = 0.25): DataTexture { … }",
|
|
1002
|
+
"situations": [
|
|
1003
|
+
"give smoke, flash, or glow sprites a radial alpha falloff",
|
|
1004
|
+
"generate sprite images that render identically under every backend"
|
|
1005
|
+
],
|
|
1006
|
+
"summary": "Build a soft round sprite as pixel data instead of painting a canvas.",
|
|
1007
|
+
"supersedes": [],
|
|
1008
|
+
"symbol": "softCircleDataTexture"
|
|
1009
|
+
},
|
|
1010
|
+
{
|
|
1011
|
+
"constraints": [
|
|
1012
|
+
"dates are interpreted as UTC unless utcOffset is supplied; no fixed sun direction is assumed",
|
|
1013
|
+
"pass a mutable { azimuth, elevation } target to reuse the result object in a steady frame loop"
|
|
1014
|
+
],
|
|
1015
|
+
"example": "const sun = solarPosition({ date, latitude: 49.28, longitude: -123.12, utcOffset: -8 });",
|
|
1016
|
+
"importPath": "@threenative/core",
|
|
1017
|
+
"kind": "function",
|
|
1018
|
+
"overrides": [],
|
|
1019
|
+
"package": "@threenative/core",
|
|
1020
|
+
"signature": "export function solarPosition(input: ISolarPositionInput, target?: ISolarPosition): ISolarPosition;",
|
|
1021
|
+
"situations": ["move a sun across a real day at a game's latitude and longitude"],
|
|
1022
|
+
"summary": "Calculate solar elevation and azimuth from time, latitude, and longitude.",
|
|
1023
|
+
"supersedes": [],
|
|
1024
|
+
"symbol": "solarPosition"
|
|
1025
|
+
},
|
|
1026
|
+
{
|
|
1027
|
+
"constraints": [
|
|
1028
|
+
"dates are interpreted as UTC; use solarPosition for an explicit local offset"
|
|
1029
|
+
],
|
|
1030
|
+
"example": "const sun = solarPositionAt(new Date(), 49.28, -123.12);",
|
|
1031
|
+
"importPath": "@threenative/core",
|
|
1032
|
+
"kind": "function",
|
|
1033
|
+
"overrides": [],
|
|
1034
|
+
"package": "@threenative/core",
|
|
1035
|
+
"signature": "export function solarPositionAt( date: Date | string, latitude: number, longitude: number, ): ISolarPosition { … }",
|
|
1036
|
+
"situations": ["calculate a sun direction from a timestamp and a game location"],
|
|
1037
|
+
"summary": "Calculate solar elevation and azimuth for one UTC date.",
|
|
1038
|
+
"supersedes": [],
|
|
1039
|
+
"symbol": "solarPositionAt"
|
|
1040
|
+
},
|
|
1041
|
+
{
|
|
1042
|
+
"constraints": [
|
|
1043
|
+
"it draws nothing; the game supplies the mesh, the material and every colour",
|
|
1044
|
+
"CPU height is a throttled copy carrying staleFrames, never this frame and never exact",
|
|
1045
|
+
"an exact free CPU height needs an analytic wave field instead; that is a different contract",
|
|
1046
|
+
"cascades are ordered largest patchSize first and every tuning number is required"
|
|
1047
|
+
],
|
|
1048
|
+
"example": "const sea = ctx.add(new SpectralOcean(oceanOptions));",
|
|
1049
|
+
"importPath": "@threenative/core",
|
|
1050
|
+
"kind": "class",
|
|
1051
|
+
"overrides": [],
|
|
1052
|
+
"package": "@threenative/core",
|
|
1053
|
+
"signature": "export class SpectralOcean extends Object3D implements IComputeDriven { … }",
|
|
1054
|
+
"situations": [
|
|
1055
|
+
"make an ocean whose surface is the view rather than a background",
|
|
1056
|
+
"float a boat on waves the GPU is drawing",
|
|
1057
|
+
"drive a water material from a wave simulation without writing an FFT",
|
|
1058
|
+
"sail a ship on simulated ocean waves with buoyancy"
|
|
1059
|
+
],
|
|
1060
|
+
"summary": "Simulate a spectral ocean — cascaded wave spectra inverse-transformed on the GPU each frame.",
|
|
1061
|
+
"supersedes": [],
|
|
1062
|
+
"symbol": "SpectralOcean"
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
"constraints": [
|
|
1066
|
+
"the game supplies the atlas texture, surface, filtering, layout, and every frame duration",
|
|
1067
|
+
"update is driven by the scene fixed step; no wall clock or default frame rate is used"
|
|
1068
|
+
],
|
|
1069
|
+
"example": "const animator = new SpriteAnimator3D({ texture: atlas, frames, mode: \"pingPong\" });",
|
|
1070
|
+
"importPath": "@threenative/core",
|
|
1071
|
+
"kind": "class",
|
|
1072
|
+
"overrides": [],
|
|
1073
|
+
"package": "@threenative/core",
|
|
1074
|
+
"signature": "export class SpriteAnimator3D { … }",
|
|
1075
|
+
"situations": [
|
|
1076
|
+
"play an animated pickup or sprite-sheet effect",
|
|
1077
|
+
"sequence atlas frames with different authored durations"
|
|
1078
|
+
],
|
|
1079
|
+
"summary": "Advance a game-owned non-uniform sprite atlas on the fixed step.",
|
|
1080
|
+
"supersedes": [],
|
|
1081
|
+
"symbol": "SpriteAnimator3D"
|
|
1082
|
+
},
|
|
1083
|
+
{
|
|
1084
|
+
"constraints": [
|
|
1085
|
+
"the surface comes from the game; pooling, travel, and fading belong to the engine",
|
|
1086
|
+
"update once per frame and dispose with the owning scene"
|
|
1087
|
+
],
|
|
1088
|
+
"example": "const tracers = new TracerPool3D(ctx.scene, tracerOptions);\ntracers.spawn(muzzle, shotDirection, hit.distance);",
|
|
1089
|
+
"importPath": "@threenative/core",
|
|
1090
|
+
"kind": "class",
|
|
1091
|
+
"overrides": [],
|
|
1092
|
+
"package": "@threenative/core",
|
|
1093
|
+
"signature": "export class TracerPool3D { … }",
|
|
1094
|
+
"situations": [
|
|
1095
|
+
"show where a hitscan round went",
|
|
1096
|
+
"draw incoming fire without spawning projectiles"
|
|
1097
|
+
],
|
|
1098
|
+
"summary": "Pool travelling bullet-streak meshes for hitscan shots.",
|
|
1099
|
+
"supersedes": [],
|
|
1100
|
+
"symbol": "TracerPool3D"
|
|
1101
|
+
},
|
|
1102
|
+
{
|
|
1103
|
+
"constraints": ["patches cannot introduce omitted, negative, or non-finite physical values"],
|
|
1104
|
+
"example": "atmosphere.setAtmosphere({ rayleigh: [0.008, 0.016, 0.04] });",
|
|
1105
|
+
"importPath": "@threenative/core",
|
|
1106
|
+
"kind": "function",
|
|
1107
|
+
"overrides": [],
|
|
1108
|
+
"package": "@threenative/core",
|
|
1109
|
+
"signature": "export function updateAtmosphereParameters( current: IResolvedAtmosphereParameters, patch: IAtmosphereParameterPatch, ): IResolvedAtmosphereParameters { … }",
|
|
1110
|
+
"situations": ["change scattering coefficients and rebake an atmosphere"],
|
|
1111
|
+
"summary": "Apply a partial game-owned atmosphere change while preserving validation.",
|
|
1112
|
+
"supersedes": [],
|
|
1113
|
+
"symbol": "updateAtmosphereParameters"
|
|
1114
|
+
},
|
|
1115
|
+
{
|
|
1116
|
+
"constraints": [],
|
|
1117
|
+
"example": "updateClusteredMeshes(stagedRoot, myCamera, ctx.renderer.domElement.height);",
|
|
1118
|
+
"importPath": "@threenative/core",
|
|
1119
|
+
"kind": "function",
|
|
1120
|
+
"overrides": [],
|
|
1121
|
+
"package": "@threenative/core",
|
|
1122
|
+
"signature": "export function updateClusteredMeshes( root: { … }",
|
|
1123
|
+
"situations": ["cut a virtual-geometry subtree the engine does not render itself"],
|
|
1124
|
+
"summary": "Take every clustered mesh under a root through this frame's cut, before the render. The engine already does this for the scene it renders; reach for it only to cut a subtree the engine does not render, such as one staged for a camera of your own.",
|
|
1125
|
+
"supersedes": [],
|
|
1126
|
+
"symbol": "updateClusteredMeshes"
|
|
1127
|
+
},
|
|
1128
|
+
{
|
|
1129
|
+
"constraints": [
|
|
1130
|
+
"call `VelocityTracker.update()` before the render and `commit()` after it",
|
|
1131
|
+
"a pass is only given a velocity target when a temporal stage consumes it"
|
|
1132
|
+
],
|
|
1133
|
+
"example": "const scenePass = pass(scene, camera);\nensureVelocityOutput(scenePass);\nrenderer.setOutputNode(scenePass);\nconst tracker = new VelocityTracker();\ntracker.update(scene);\nrenderer.render(scene, camera);\ntracker.commit(scene);",
|
|
1134
|
+
"importPath": "@threenative/core",
|
|
1135
|
+
"kind": "function",
|
|
1136
|
+
"overrides": [],
|
|
1137
|
+
"package": "@threenative/core",
|
|
1138
|
+
"signature": "export function velocityTexture(pass: IVelocityRenderPass): Node { … }",
|
|
1139
|
+
"situations": [
|
|
1140
|
+
"keep a skinned character or instanced crowd stable in a temporal stage",
|
|
1141
|
+
"add the velocity output to a Three.js scene pass",
|
|
1142
|
+
"read screen-space motion for a temporal stage"
|
|
1143
|
+
],
|
|
1144
|
+
"summary": "Provision screen-space motion data for temporal nodes and keep per-instance history at the frame boundary.",
|
|
1145
|
+
"supersedes": [],
|
|
1146
|
+
"symbol": "velocityTexture"
|
|
1147
|
+
},
|
|
1148
|
+
{
|
|
1149
|
+
"constraints": [
|
|
1150
|
+
"call `VelocityTracker.update()` before the render and `commit()` after it",
|
|
1151
|
+
"a pass is only given a velocity target when a temporal stage consumes it",
|
|
1152
|
+
"call `update()` after gameplay writes and `commit()` after the render"
|
|
1153
|
+
],
|
|
1154
|
+
"example": "const scenePass = pass(scene, camera);\nensureVelocityOutput(scenePass);\nrenderer.setOutputNode(scenePass);\nconst tracker = new VelocityTracker();\ntracker.update(scene);\nrenderer.render(scene, camera);\ntracker.commit(scene);",
|
|
1155
|
+
"importPath": "@threenative/core",
|
|
1156
|
+
"kind": "class",
|
|
1157
|
+
"overrides": [],
|
|
1158
|
+
"package": "@threenative/core",
|
|
1159
|
+
"signature": "export class VelocityTracker { … }",
|
|
1160
|
+
"situations": [
|
|
1161
|
+
"keep a skinned character or instanced crowd stable in a temporal stage",
|
|
1162
|
+
"add the velocity output to a Three.js scene pass",
|
|
1163
|
+
"retain previous transforms for animated and instanced renderables"
|
|
1164
|
+
],
|
|
1165
|
+
"summary": "Provision screen-space motion data for temporal nodes and keep per-instance history at the frame boundary.",
|
|
1166
|
+
"supersedes": [],
|
|
1167
|
+
"symbol": "VelocityTracker"
|
|
1168
|
+
},
|
|
1169
|
+
{
|
|
1170
|
+
"constraints": [],
|
|
1171
|
+
"example": "await warmUpScene(renderer, scene, camera, { onProgress: (p) => setLoading(p) });",
|
|
1172
|
+
"importPath": "@threenative/core",
|
|
1173
|
+
"kind": "function",
|
|
1174
|
+
"overrides": [],
|
|
1175
|
+
"package": "@threenative/core",
|
|
1176
|
+
"signature": "export async function warmUpScene( renderer: IWarmUpRenderer, scene: Object3D, camera: Camera, options: IWarmUpOptions = { … }",
|
|
1177
|
+
"situations": [
|
|
1178
|
+
"compile a scene's shaders during the loading screen instead of on the first frame",
|
|
1179
|
+
"stop a native launch freezing for seconds inside its first rendered frame"
|
|
1180
|
+
],
|
|
1181
|
+
"summary": "Warms up `scene` for `camera`, in slices, presenting a frame between each. Fail closed on a nonsensical slice size rather than quietly choosing one: a zero or negative slice would loop forever, and a caller that passed it has a bug worth seeing now.",
|
|
1182
|
+
"supersedes": [],
|
|
1183
|
+
"symbol": "warmUpScene"
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
"constraints": [
|
|
1187
|
+
"supply every wave amplitude, wavelength, direction, speed and warp value",
|
|
1188
|
+
"call setTime for the default graph clock when the game advances its own time"
|
|
1189
|
+
],
|
|
1190
|
+
"example": "const field = new WaveField({ waves });\nconst { height, normal } = field.sample(x, z, elapsed);",
|
|
1191
|
+
"importPath": "@threenative/core",
|
|
1192
|
+
"kind": "class",
|
|
1193
|
+
"overrides": [],
|
|
1194
|
+
"package": "@threenative/core",
|
|
1195
|
+
"signature": "export class WaveField { … }",
|
|
1196
|
+
"situations": [
|
|
1197
|
+
"float a boat on waves",
|
|
1198
|
+
"make water move",
|
|
1199
|
+
"find the water surface height at a point"
|
|
1200
|
+
],
|
|
1201
|
+
"summary": "Evaluate analytic waves on CPU and displace game-owned vertices with the matching TSL graph.",
|
|
1202
|
+
"supersedes": [],
|
|
1203
|
+
"symbol": "WaveField"
|
|
1204
|
+
},
|
|
1205
|
+
{
|
|
1206
|
+
"constraints": [
|
|
1207
|
+
"call `VelocityTracker.update()` before the render and `commit()` after it",
|
|
1208
|
+
"a pass is only given a velocity target when a temporal stage consumes it"
|
|
1209
|
+
],
|
|
1210
|
+
"example": "const scenePass = pass(scene, camera);\nensureVelocityOutput(scenePass);\nrenderer.setOutputNode(scenePass);\nconst tracker = new VelocityTracker();\ntracker.update(scene);\nrenderer.render(scene, camera);\ntracker.commit(scene);",
|
|
1211
|
+
"importPath": "@threenative/core",
|
|
1212
|
+
"kind": "function",
|
|
1213
|
+
"overrides": [],
|
|
1214
|
+
"package": "@threenative/core",
|
|
1215
|
+
"signature": "export function withVelocityContext<T>(node: T, source: Node): T { … }",
|
|
1216
|
+
"situations": [
|
|
1217
|
+
"keep a skinned character or instanced crowd stable in a temporal stage",
|
|
1218
|
+
"add the velocity output to a Three.js scene pass",
|
|
1219
|
+
"hand the provisioned velocity source through a composed temporal graph"
|
|
1220
|
+
],
|
|
1221
|
+
"summary": "Provision screen-space motion data for temporal nodes and keep per-instance history at the frame boundary.",
|
|
1222
|
+
"supersedes": [],
|
|
1223
|
+
"symbol": "withVelocityContext"
|
|
1224
|
+
},
|
|
1225
|
+
{
|
|
1226
|
+
"constraints": [
|
|
1227
|
+
"use the returned value as a validation oracle; the rendered path samples the LUT"
|
|
1228
|
+
],
|
|
1229
|
+
"example": "const zenith = zenithTransmittance({ rayleigh, mie, ozone, planetRadius, atmosphereRadius });",
|
|
1230
|
+
"importPath": "@threenative/core",
|
|
1231
|
+
"kind": "function",
|
|
1232
|
+
"overrides": [],
|
|
1233
|
+
"package": "@threenative/core",
|
|
1234
|
+
"signature": "export function zenithTransmittance( parameters: IAtmosphereParameters | IResolvedAtmosphereParameters, ): AtmosphereRgb { … }",
|
|
1235
|
+
"situations": ["check a supplied atmosphere's direct vertical transmittance"],
|
|
1236
|
+
"summary": "Return direct vertical transmittance for the supplied atmosphere.",
|
|
1237
|
+
"supersedes": [],
|
|
1238
|
+
"symbol": "zenithTransmittance"
|
|
1239
|
+
},
|
|
1240
|
+
{
|
|
1241
|
+
"constraints": ["use only in the web development entry"],
|
|
1242
|
+
"example": "acceptHotUpdate(game, import.meta.hot);",
|
|
1243
|
+
"importPath": "@threenative/core/hot",
|
|
1244
|
+
"kind": "function",
|
|
1245
|
+
"overrides": [],
|
|
1246
|
+
"package": "@threenative/core",
|
|
1247
|
+
"signature": "export function acceptHotUpdate<TState extends Record<string, unknown>, TPhysics>( game: IGame<TState, TPhysics>, hot: IImportMeta[\"hot\"], ): void { … }",
|
|
1248
|
+
"situations": [
|
|
1249
|
+
"keep game state while editing source in development",
|
|
1250
|
+
"diagnose state shape changes during hot reload"
|
|
1251
|
+
],
|
|
1252
|
+
"summary": "Register hot-reload state preservation for a game.",
|
|
1253
|
+
"supersedes": [],
|
|
1254
|
+
"symbol": "acceptHotUpdate"
|
|
1255
|
+
},
|
|
1256
|
+
{
|
|
1257
|
+
"constraints": ["state must contain finite numbers and plain objects only"],
|
|
1258
|
+
"example": "assertPortableState(game.state.getState());",
|
|
1259
|
+
"importPath": "@threenative/core/hot",
|
|
1260
|
+
"kind": "function",
|
|
1261
|
+
"overrides": [],
|
|
1262
|
+
"package": "@threenative/core",
|
|
1263
|
+
"signature": "export function assertPortableState(state: unknown): void { … }",
|
|
1264
|
+
"situations": [
|
|
1265
|
+
"preserve JSON-shaped state during hot reload",
|
|
1266
|
+
"reject a non-portable game state before reload"
|
|
1267
|
+
],
|
|
1268
|
+
"summary": "Validate that hot-reload state can cross the Vite boundary.",
|
|
1269
|
+
"supersedes": [],
|
|
1270
|
+
"symbol": "assertPortableState"
|
|
1271
|
+
},
|
|
1272
|
+
{
|
|
1273
|
+
"constraints": ["install once in the game's plugin list"],
|
|
1274
|
+
"example": "const game = defineGame({ plugins: [playtest()] });",
|
|
1275
|
+
"importPath": "@threenative/core/playtest",
|
|
1276
|
+
"kind": "function",
|
|
1277
|
+
"overrides": [],
|
|
1278
|
+
"package": "@threenative/core",
|
|
1279
|
+
"signature": "export function playtest< TState extends Record<string, unknown> = Record<string, unknown>, TPhysics = undefined, >(options: IPlaytestOptions = { … }",
|
|
1280
|
+
"situations": [
|
|
1281
|
+
"expose movement and world observations to a playtest",
|
|
1282
|
+
"connect a game to the ThreeNative scenario runner"
|
|
1283
|
+
],
|
|
1284
|
+
"summary": "Install the playtest bridge into a portable game.",
|
|
1285
|
+
"supersedes": [],
|
|
1286
|
+
"symbol": "playtest"
|
|
1287
|
+
},
|
|
1288
|
+
{
|
|
1289
|
+
"constraints": [
|
|
1290
|
+
"styling is the `style` prop; Tailwind class names are CSS and cannot cross",
|
|
1291
|
+
"import `react`, never `react-dom`, from the portable native entry",
|
|
1292
|
+
"import `react`, never `react-dom`, from a native entry"
|
|
1293
|
+
],
|
|
1294
|
+
"example": "const overlay = createReactOverlay({ canvasLayer: ctx.canvasLayer });",
|
|
1295
|
+
"importPath": "@threenative/core/react",
|
|
1296
|
+
"kind": "function",
|
|
1297
|
+
"overrides": [],
|
|
1298
|
+
"package": "@threenative/core",
|
|
1299
|
+
"signature": "export function createReactOverlay(options: IReactOverlayOptions): IReactOverlay { … }",
|
|
1300
|
+
"situations": [
|
|
1301
|
+
"render a React HUD on Android or iOS without a WebView",
|
|
1302
|
+
"show the same React component on web and on a phone",
|
|
1303
|
+
"show a React HUD on Android, iOS or desktop native",
|
|
1304
|
+
"render the same React component on web and on a phone without a WebView"
|
|
1305
|
+
],
|
|
1306
|
+
"summary": "`@threenative/core/react` — React that renders on a phone, with no DOM and no WebView. A subpath on purpose. `react` and `react-reconciler` are **optional** peers, and nothing in `@threenative/core`'s main entry imports either of them, so a game that never mounts a React overlay pays nothing and core stays consumable from React Three Fiber. Importing this module is the opt-in. The element vocabulary is two components, borrowed from React Native rather than invented: {@link View} is a rectangle, {@link Text} is a run of glyphs. They are components and not lowercase intrinsics because `view` and `text` are already SVG tags in `@types/react`, and a HUD element that silently means `<svg:text>` on one platform is exactly the kind of quiet divergence this path exists to end.",
|
|
1307
|
+
"supersedes": [],
|
|
1308
|
+
"symbol": "createReactOverlay"
|
|
1309
|
+
},
|
|
1310
|
+
{
|
|
1311
|
+
"constraints": [],
|
|
1312
|
+
"example": "const scoreWidth = measureText(\"SCORE 10\", 24)",
|
|
1313
|
+
"importPath": "@threenative/core/react",
|
|
1314
|
+
"kind": "function",
|
|
1315
|
+
"overrides": [],
|
|
1316
|
+
"package": "@threenative/core",
|
|
1317
|
+
"signature": "export function measureText(text: string, fontSize: number, letterSpacing = 0): number { … }",
|
|
1318
|
+
"situations": ["measure native React HUD text before laying it out"],
|
|
1319
|
+
"summary": "Width in pixels of a glyph run at a given cell height.",
|
|
1320
|
+
"supersedes": [],
|
|
1321
|
+
"symbol": "measureText"
|
|
1322
|
+
},
|
|
1323
|
+
{
|
|
1324
|
+
"constraints": [],
|
|
1325
|
+
"example": "supportedGlyphs().includes(\"A\")",
|
|
1326
|
+
"importPath": "@threenative/core/react",
|
|
1327
|
+
"kind": "function",
|
|
1328
|
+
"overrides": [],
|
|
1329
|
+
"package": "@threenative/core",
|
|
1330
|
+
"signature": "export function supportedGlyphs(): string { … }",
|
|
1331
|
+
"situations": ["discover which characters a native React HUD can draw"],
|
|
1332
|
+
"summary": "Every character this glyph set can draw, for error messages and for the templates' AGENTS.md.",
|
|
1333
|
+
"supersedes": [],
|
|
1334
|
+
"symbol": "supportedGlyphs"
|
|
1335
|
+
},
|
|
1336
|
+
{
|
|
1337
|
+
"constraints": [],
|
|
1338
|
+
"example": "supportedStyleKeys().includes(\"centerX\")",
|
|
1339
|
+
"importPath": "@threenative/core/react",
|
|
1340
|
+
"kind": "function",
|
|
1341
|
+
"overrides": [],
|
|
1342
|
+
"package": "@threenative/core",
|
|
1343
|
+
"signature": "export function supportedStyleKeys(): readonly string[] { … }",
|
|
1344
|
+
"situations": ["discover which React HUD style properties work on native"],
|
|
1345
|
+
"summary": "Every style key the overlay implements, for the templates' AGENTS.md and for error messages.",
|
|
1346
|
+
"supersedes": [],
|
|
1347
|
+
"symbol": "supportedStyleKeys"
|
|
1348
|
+
},
|
|
1349
|
+
{
|
|
1350
|
+
"constraints": [],
|
|
1351
|
+
"example": "<Text style={{ color: \"#ffffff\", fontSize: 24 }}>SCORE 10</Text>",
|
|
1352
|
+
"importPath": "@threenative/core/react",
|
|
1353
|
+
"kind": "function",
|
|
1354
|
+
"overrides": [],
|
|
1355
|
+
"package": "@threenative/core",
|
|
1356
|
+
"signature": "export function Text(props: ITextProps): ReactNode { … }",
|
|
1357
|
+
"situations": ["show text in a native React HUD without a DOM"],
|
|
1358
|
+
"summary": "A run of bitmap glyphs, drawn as one instanced quad per lit pixel.",
|
|
1359
|
+
"supersedes": [],
|
|
1360
|
+
"symbol": "Text"
|
|
1361
|
+
},
|
|
1362
|
+
{
|
|
1363
|
+
"constraints": [],
|
|
1364
|
+
"example": "<View style={{ centerX: 0, top: 24 }}><Text>READY</Text></View>",
|
|
1365
|
+
"importPath": "@threenative/core/react",
|
|
1366
|
+
"kind": "function",
|
|
1367
|
+
"overrides": [],
|
|
1368
|
+
"package": "@threenative/core",
|
|
1369
|
+
"signature": "export function View(props: IViewProps): ReactNode { … }",
|
|
1370
|
+
"situations": ["group and position native React HUD elements"],
|
|
1371
|
+
"summary": "A rectangle. Paints when its style has a `background`; otherwise it only positions children.",
|
|
1372
|
+
"supersedes": [],
|
|
1373
|
+
"symbol": "View"
|
|
1374
|
+
},
|
|
1375
|
+
{
|
|
1376
|
+
"constraints": ["the transport is discovered, never configured; no game names the web view"],
|
|
1377
|
+
"example": "const bridge = connectUiBridge({ end: \"ui\" });",
|
|
1378
|
+
"importPath": "@threenative/core/ui-layer",
|
|
1379
|
+
"kind": "function",
|
|
1380
|
+
"overrides": [],
|
|
1381
|
+
"package": "@threenative/core",
|
|
1382
|
+
"signature": "export function connectUiBridge(options: IConnectOptions): IUiBridge { … }",
|
|
1383
|
+
"situations": [
|
|
1384
|
+
"write a UI that talks to the game on web and on a phone alike",
|
|
1385
|
+
"send a message from a HUD rendered over the game surface",
|
|
1386
|
+
"connect game code to a platform-owned UI realm",
|
|
1387
|
+
"share one UI bridge implementation across web, Android, iOS, and desktop"
|
|
1388
|
+
],
|
|
1389
|
+
"summary": "Open the message channel between a game and its UI, whatever host is underneath.",
|
|
1390
|
+
"supersedes": [],
|
|
1391
|
+
"symbol": "connectUiBridge"
|
|
1392
|
+
},
|
|
1393
|
+
{
|
|
1394
|
+
"constraints": ["prefer game.ui.onIntent, which connects the bridge for you"],
|
|
1395
|
+
"example": "onUiIntent(bridge, (intent) => { if (intent === \"restart\") game.goto(\"Play\"); });",
|
|
1396
|
+
"importPath": "@threenative/core/ui-layer",
|
|
1397
|
+
"kind": "function",
|
|
1398
|
+
"overrides": [],
|
|
1399
|
+
"package": "@threenative/core",
|
|
1400
|
+
"signature": "export function onUiIntent( bridge: IUiBridge, listener: (intent: string, payload: unknown) => void, ): () => void { … }",
|
|
1401
|
+
"situations": [
|
|
1402
|
+
"restart or pause a game from a button in its HUD",
|
|
1403
|
+
"handle a HUD button action in game code",
|
|
1404
|
+
"route native and web UI commands through one listener"
|
|
1405
|
+
],
|
|
1406
|
+
"summary": "Handle the actions a UI sends back to the game.",
|
|
1407
|
+
"supersedes": [],
|
|
1408
|
+
"symbol": "onUiIntent"
|
|
1409
|
+
},
|
|
1410
|
+
{
|
|
1411
|
+
"constraints": [
|
|
1412
|
+
"mark controls with data-tn-interactive; pointer-events is not the mechanism"
|
|
1413
|
+
],
|
|
1414
|
+
"example": "publishHitRegions({ bridge });",
|
|
1415
|
+
"importPath": "@threenative/core/ui-layer",
|
|
1416
|
+
"kind": "function",
|
|
1417
|
+
"overrides": [],
|
|
1418
|
+
"package": "@threenative/core",
|
|
1419
|
+
"signature": "export function publishHitRegions(options: IRegistryOptions): IHitRegionRegistry { … }",
|
|
1420
|
+
"situations": [
|
|
1421
|
+
"let a touch on empty HUD space reach the game instead of the UI",
|
|
1422
|
+
"make a HUD button receive taps on a phone",
|
|
1423
|
+
"give native input hosts the rectangles claimed by UI controls",
|
|
1424
|
+
"keep touch hit testing aligned with a moving web or native HUD"
|
|
1425
|
+
],
|
|
1426
|
+
"summary": "Tell the native input host where a UI's touchable controls are.",
|
|
1427
|
+
"supersedes": [],
|
|
1428
|
+
"symbol": "publishHitRegions"
|
|
1429
|
+
},
|
|
1430
|
+
{
|
|
1431
|
+
"constraints": [
|
|
1432
|
+
"publishes at the store's throttled cadence, and not at all with no UI listening"
|
|
1433
|
+
],
|
|
1434
|
+
"example": "publishUiState(bridge, game.state);",
|
|
1435
|
+
"importPath": "@threenative/core/ui-layer",
|
|
1436
|
+
"kind": "function",
|
|
1437
|
+
"overrides": [],
|
|
1438
|
+
"package": "@threenative/core",
|
|
1439
|
+
"signature": "export function publishUiState<T>( bridge: IUiBridge, store: IPublishableStore<T>, options: IPublishOptions = { … }",
|
|
1440
|
+
"situations": [
|
|
1441
|
+
"show score or health in a UI rendered over the game surface",
|
|
1442
|
+
"keep a HUD in step with the game without re-rendering on the loop",
|
|
1443
|
+
"publish game state to a HUD in another realm",
|
|
1444
|
+
"keep a web and native UI mirror on the same throttled state stream"
|
|
1445
|
+
],
|
|
1446
|
+
"summary": "Publish the game's state so a UI in another process can mirror it.",
|
|
1447
|
+
"supersedes": [],
|
|
1448
|
+
"symbol": "publishUiState"
|
|
1449
|
+
},
|
|
1450
|
+
{
|
|
1451
|
+
"constraints": ["one-way; the game decides what each name means and may ignore one"],
|
|
1452
|
+
"example": "sendUiIntent(bridge, \"restart\");",
|
|
1453
|
+
"importPath": "@threenative/core/ui-layer",
|
|
1454
|
+
"kind": "function",
|
|
1455
|
+
"overrides": [],
|
|
1456
|
+
"package": "@threenative/core",
|
|
1457
|
+
"signature": "export function sendUiIntent(bridge: IUiBridge, intent: string, payload?: unknown): void { … }",
|
|
1458
|
+
"situations": [
|
|
1459
|
+
"wire a Restart button in a HUD to the running game",
|
|
1460
|
+
"pause a game from a menu drawn over its surface",
|
|
1461
|
+
"send a button or menu action from a UI HUD to game code",
|
|
1462
|
+
"keep UI input portable across web and native hosts"
|
|
1463
|
+
],
|
|
1464
|
+
"summary": "Send a player action from the UI back to the game.",
|
|
1465
|
+
"supersedes": [],
|
|
1466
|
+
"symbol": "sendUiIntent"
|
|
1467
|
+
},
|
|
1468
|
+
{
|
|
1469
|
+
"constraints": ["returns undefined until the game publishes its first state"],
|
|
1470
|
+
"example": "const mirror = subscribeUiState(bridge);",
|
|
1471
|
+
"importPath": "@threenative/core/ui-layer",
|
|
1472
|
+
"kind": "function",
|
|
1473
|
+
"overrides": [],
|
|
1474
|
+
"package": "@threenative/core",
|
|
1475
|
+
"signature": "export function subscribeUiState<T>(bridge: IUiBridge): IUiStateMirror<T> { … }",
|
|
1476
|
+
"situations": [
|
|
1477
|
+
"read game state from a HUD that runs in the platform's web view",
|
|
1478
|
+
"read published game state from a UI HUD",
|
|
1479
|
+
"subscribe a web or native UI to the game's mirrored state"
|
|
1480
|
+
],
|
|
1481
|
+
"summary": "Mirror the game's published state on the UI side.",
|
|
1482
|
+
"supersedes": [],
|
|
1483
|
+
"symbol": "subscribeUiState"
|
|
1484
|
+
},
|
|
1485
|
+
{
|
|
1486
|
+
"constraints": [
|
|
1487
|
+
"sampleHeight owns the terrain shape and stays in game source; the framework stores and interpolates its output",
|
|
1488
|
+
"rows and columns are vertex counts; geometry is row-major z-then-x and collider export transposes once into Rapier's column-major matrix order"
|
|
1489
|
+
],
|
|
1490
|
+
"example": "const field = Heightfield.fromSampler({ rows: 65, columns: 65, width: 64, depth: 64, origin: { x: 0, z: 0 }, sampleHeight: terrainHeight });",
|
|
1491
|
+
"importPath": "@threenative/core/world",
|
|
1492
|
+
"kind": "class",
|
|
1493
|
+
"overrides": [
|
|
1494
|
+
"rows, columns, width, depth, origin, and sampleHeight are explicit on every field"
|
|
1495
|
+
],
|
|
1496
|
+
"package": "@threenative/core",
|
|
1497
|
+
"signature": "export class Heightfield { … }",
|
|
1498
|
+
"situations": [
|
|
1499
|
+
"build terrain geometry and collision from one game-authored height function",
|
|
1500
|
+
"query the same ground height or normal that a player sees and collides with",
|
|
1501
|
+
"build islands and coastlines from terrain"
|
|
1502
|
+
],
|
|
1503
|
+
"summary": "One height buffer shared by world queries, rendered geometry, and a physics heightfield. The game supplies every value, so changing the terrain's shape never requires a package edit. `fromSampler` evaluates that game function exactly once at each vertex and retains only the resulting numbers. Queries interpolate those same numbers instead of evaluating the function again.",
|
|
1504
|
+
"supersedes": [],
|
|
1505
|
+
"symbol": "Heightfield"
|
|
1506
|
+
},
|
|
1507
|
+
{
|
|
1508
|
+
"constraints": ["add the area to the physics context before stepping the world"],
|
|
1509
|
+
"example": "const area = new Area3D({ context, shape });",
|
|
1510
|
+
"importPath": "@threenative/physics",
|
|
1511
|
+
"kind": "class",
|
|
1512
|
+
"overrides": [],
|
|
1513
|
+
"package": "@threenative/physics",
|
|
1514
|
+
"signature": "export class Area3D { … }",
|
|
1515
|
+
"situations": [
|
|
1516
|
+
"detect when an enemy enters a trigger area",
|
|
1517
|
+
"react to a player entering a zone"
|
|
1518
|
+
],
|
|
1519
|
+
"summary": "Detect overlaps without turning the body into a moving collider.",
|
|
1520
|
+
"supersedes": [],
|
|
1521
|
+
"symbol": "Area3D"
|
|
1522
|
+
},
|
|
1523
|
+
{
|
|
1524
|
+
"constraints": ["supply hull points, density, drag, and the height source"],
|
|
1525
|
+
"example": "new Buoyancy3D({ body, surface: field, hullPoints, density: 1_000, drag: 4 });",
|
|
1526
|
+
"importPath": "@threenative/physics",
|
|
1527
|
+
"kind": "class",
|
|
1528
|
+
"overrides": ["buoyancy disables force application while submergedFraction remains measured"],
|
|
1529
|
+
"package": "@threenative/physics",
|
|
1530
|
+
"signature": "export class Buoyancy3D { … }",
|
|
1531
|
+
"situations": ["float a boat on waves", "keep a hull above a moving water surface"],
|
|
1532
|
+
"summary": "Float a rigid body on a game-owned height source with fixed-step force ordering.",
|
|
1533
|
+
"supersedes": [],
|
|
1534
|
+
"symbol": "Buoyancy3D"
|
|
1535
|
+
},
|
|
1536
|
+
{
|
|
1537
|
+
"constraints": ["use moveAndSlide inside the physics update"],
|
|
1538
|
+
"example": "const body = new CharacterBody3D({ context, object });",
|
|
1539
|
+
"importPath": "@threenative/physics",
|
|
1540
|
+
"kind": "class",
|
|
1541
|
+
"overrides": [],
|
|
1542
|
+
"package": "@threenative/physics",
|
|
1543
|
+
"signature": "export class CharacterBody3D { … }",
|
|
1544
|
+
"situations": [
|
|
1545
|
+
"move an enemy or player through a level",
|
|
1546
|
+
"keep a character from walking through walls"
|
|
1547
|
+
],
|
|
1548
|
+
"summary": "Move a character body with collision-aware sliding.",
|
|
1549
|
+
"supersedes": [],
|
|
1550
|
+
"symbol": "CharacterBody3D"
|
|
1551
|
+
},
|
|
1552
|
+
{
|
|
1553
|
+
"constraints": ["create shapes through the owning physics context"],
|
|
1554
|
+
"example": "const shape = new CollisionShape3D({ context, shape: \"capsule\" });",
|
|
1555
|
+
"importPath": "@threenative/physics",
|
|
1556
|
+
"kind": "class",
|
|
1557
|
+
"overrides": [],
|
|
1558
|
+
"package": "@threenative/physics",
|
|
1559
|
+
"signature": "export class CollisionShape3D { … }",
|
|
1560
|
+
"situations": [
|
|
1561
|
+
"add a capsule or box collider to a character",
|
|
1562
|
+
"configure the shape used by a rigid body"
|
|
1563
|
+
],
|
|
1564
|
+
"summary": "Give a physics body a Three.js collision shape.",
|
|
1565
|
+
"supersedes": [],
|
|
1566
|
+
"symbol": "CollisionShape3D"
|
|
1567
|
+
},
|
|
1568
|
+
{
|
|
1569
|
+
"constraints": [],
|
|
1570
|
+
"example": "const groups = interactionGroups(1, 3);",
|
|
1571
|
+
"importPath": "@threenative/physics",
|
|
1572
|
+
"kind": "function",
|
|
1573
|
+
"overrides": [],
|
|
1574
|
+
"package": "@threenative/physics",
|
|
1575
|
+
"signature": "export function interactionGroups(layer: number, mask: number): number { … }",
|
|
1576
|
+
"situations": [
|
|
1577
|
+
"make an enemy collide with the world but not pickups",
|
|
1578
|
+
"configure which physics layers interact"
|
|
1579
|
+
],
|
|
1580
|
+
"summary": "Encode collision layers and masks for Rapier groups.",
|
|
1581
|
+
"supersedes": [],
|
|
1582
|
+
"symbol": "interactionGroups"
|
|
1583
|
+
},
|
|
1584
|
+
{
|
|
1585
|
+
"constraints": ["both bodies must belong to the same physics context"],
|
|
1586
|
+
"example": "const joint = new Joint3D({ context, kind: \"hinge\" });",
|
|
1587
|
+
"importPath": "@threenative/physics",
|
|
1588
|
+
"kind": "class",
|
|
1589
|
+
"overrides": [],
|
|
1590
|
+
"package": "@threenative/physics",
|
|
1591
|
+
"signature": "export class Joint3D { … }",
|
|
1592
|
+
"situations": ["constrain a rigid body to another body", "build a hinge or pin mechanism"],
|
|
1593
|
+
"summary": "Connect two physics bodies with a Godot-style joint.",
|
|
1594
|
+
"supersedes": [],
|
|
1595
|
+
"symbol": "Joint3D"
|
|
1596
|
+
},
|
|
1597
|
+
{
|
|
1598
|
+
"constraints": ["query results are bounded by the configured result limit"],
|
|
1599
|
+
"example": "const space = new PhysicsDirectSpaceState3D(context);",
|
|
1600
|
+
"importPath": "@threenative/physics",
|
|
1601
|
+
"kind": "class",
|
|
1602
|
+
"overrides": [],
|
|
1603
|
+
"package": "@threenative/physics",
|
|
1604
|
+
"signature": "export class PhysicsDirectSpaceState3D { … }",
|
|
1605
|
+
"situations": [
|
|
1606
|
+
"raycast for visibility or aiming",
|
|
1607
|
+
"find bodies inside a shape or point query"
|
|
1608
|
+
],
|
|
1609
|
+
"summary": "Query the physics world without creating a body.",
|
|
1610
|
+
"supersedes": [],
|
|
1611
|
+
"symbol": "PhysicsDirectSpaceState3D"
|
|
1612
|
+
},
|
|
1613
|
+
{
|
|
1614
|
+
"constraints": ["place rapier() before recast() in the plugin list"],
|
|
1615
|
+
"example": "const game = defineGame({ plugins: [rapier()] });",
|
|
1616
|
+
"importPath": "@threenative/physics",
|
|
1617
|
+
"kind": "function",
|
|
1618
|
+
"overrides": [],
|
|
1619
|
+
"package": "@threenative/physics",
|
|
1620
|
+
"signature": "export function rapier(options: IPhysicsOptions = { … }",
|
|
1621
|
+
"situations": [
|
|
1622
|
+
"add physics to a portable game",
|
|
1623
|
+
"provide the context used by character and rigid bodies"
|
|
1624
|
+
],
|
|
1625
|
+
"summary": "Install the Rapier physics plugin and simulation backend.",
|
|
1626
|
+
"supersedes": [],
|
|
1627
|
+
"symbol": "rapier"
|
|
1628
|
+
},
|
|
1629
|
+
{
|
|
1630
|
+
"constraints": ["register rapier() in the game plugin list before using bodies"],
|
|
1631
|
+
"example": "const crate = new RigidBody3D({ context, object, mode: \"dynamic\" });",
|
|
1632
|
+
"importPath": "@threenative/physics",
|
|
1633
|
+
"kind": "class",
|
|
1634
|
+
"overrides": [],
|
|
1635
|
+
"package": "@threenative/physics",
|
|
1636
|
+
"signature": "export class RigidBody3D { … }",
|
|
1637
|
+
"situations": [
|
|
1638
|
+
"give a crate or prop physical motion",
|
|
1639
|
+
"create a body that collides with a character",
|
|
1640
|
+
"fire physical cannonballs that collide with ships or scenery",
|
|
1641
|
+
"fire a cannonball projectile with cannon smoke particles"
|
|
1642
|
+
],
|
|
1643
|
+
"summary": "Simulate a dynamic or static rigid body.",
|
|
1644
|
+
"supersedes": [],
|
|
1645
|
+
"symbol": "RigidBody3D"
|
|
1646
|
+
},
|
|
1647
|
+
{
|
|
1648
|
+
"constraints": [
|
|
1649
|
+
"every body must use CollisionShape3D.box and retain its Three.js object transform",
|
|
1650
|
+
"rotated boxes become conservative cloth-local axis-aligned bounds"
|
|
1651
|
+
],
|
|
1652
|
+
"example": "const cloth = new SoftBody3D(mesh, { ...options, collision: softBodyCollision(wall) });",
|
|
1653
|
+
"importPath": "@threenative/physics",
|
|
1654
|
+
"kind": "function",
|
|
1655
|
+
"overrides": [],
|
|
1656
|
+
"package": "@threenative/physics",
|
|
1657
|
+
"signature": "export function softBodyCollision(...bodies: readonly RigidBody3D[]): ISoftBodyCollision { … }",
|
|
1658
|
+
"situations": [
|
|
1659
|
+
"stop a cloth flag, cape, or curtain at an existing physics wall",
|
|
1660
|
+
"collide SoftBody3D with fixed box bodies"
|
|
1661
|
+
],
|
|
1662
|
+
"summary": "Feed existing rigid-body boxes into `SoftBody3D` without inventing a second collider API.",
|
|
1663
|
+
"supersedes": [],
|
|
1664
|
+
"symbol": "softBodyCollision"
|
|
1665
|
+
},
|
|
1666
|
+
{
|
|
1667
|
+
"constraints": [
|
|
1668
|
+
"import NavigationAgent3D from exactly `@threenative/physics/navigation`; `@threenative/physics` is not a valid import for this symbol; use this capability instead of hand-written A*; requires recast() after rapier(), plus a baked NavigationRegion3D"
|
|
1669
|
+
],
|
|
1670
|
+
"example": "import { NavigationAgent3D } from \"@threenative/physics/navigation\";\nimport { Vector3 } from \"three\";\nconst agent = new NavigationAgent3D({ navigation, object });\nagent.setTargetPosition(player.position);\nconst reusableTarget = new Vector3();\nconst next = agent.getNextPathPosition(reusableTarget);",
|
|
1671
|
+
"importPath": "@threenative/physics/navigation",
|
|
1672
|
+
"kind": "class",
|
|
1673
|
+
"overrides": [],
|
|
1674
|
+
"package": "@threenative/physics",
|
|
1675
|
+
"signature": "export class NavigationAgent3D { … }",
|
|
1676
|
+
"situations": [
|
|
1677
|
+
"enemy walks around a wall",
|
|
1678
|
+
"enemy patrols a level and chases the player",
|
|
1679
|
+
"enemy walks around a patrol path and chases the player when it sees them",
|
|
1680
|
+
"enemy patrols and chases while avoiding obstacles",
|
|
1681
|
+
"enemy chases the player with line of sight and obstacle avoidance",
|
|
1682
|
+
"NPC walks to a destination",
|
|
1683
|
+
"move crew around a ship deck"
|
|
1684
|
+
],
|
|
1685
|
+
"summary": "Move an agent along a baked navmesh toward a target.",
|
|
1686
|
+
"supersedes": [],
|
|
1687
|
+
"symbol": "NavigationAgent3D"
|
|
1688
|
+
},
|
|
1689
|
+
{
|
|
1690
|
+
"constraints": ["create it after recast() and dispose it with the scene"],
|
|
1691
|
+
"example": "const obstacle = new NavigationObstacle3D({ navigation, object });",
|
|
1692
|
+
"importPath": "@threenative/physics/navigation",
|
|
1693
|
+
"kind": "class",
|
|
1694
|
+
"overrides": [],
|
|
1695
|
+
"package": "@threenative/physics",
|
|
1696
|
+
"signature": "export class NavigationObstacle3D { … }",
|
|
1697
|
+
"situations": [
|
|
1698
|
+
"keep navigation agents away from a blocking prop",
|
|
1699
|
+
"make a stationary character affect crowd avoidance"
|
|
1700
|
+
],
|
|
1701
|
+
"summary": "Add a non-moving crowd obstacle to a navmesh.",
|
|
1702
|
+
"supersedes": [],
|
|
1703
|
+
"symbol": "NavigationObstacle3D"
|
|
1704
|
+
},
|
|
1705
|
+
{
|
|
1706
|
+
"constraints": ["bake before creating agents or obstacles"],
|
|
1707
|
+
"example": "const region = new NavigationRegion3D({ navigation, meshes: [floor] });",
|
|
1708
|
+
"importPath": "@threenative/physics/navigation",
|
|
1709
|
+
"kind": "class",
|
|
1710
|
+
"overrides": [],
|
|
1711
|
+
"package": "@threenative/physics",
|
|
1712
|
+
"signature": "export class NavigationRegion3D { … }",
|
|
1713
|
+
"situations": [
|
|
1714
|
+
"let enemies walk around level geometry",
|
|
1715
|
+
"create the baked navmesh required by NavigationAgent3D"
|
|
1716
|
+
],
|
|
1717
|
+
"summary": "Bake walkable Three.js geometry into a navigation region.",
|
|
1718
|
+
"supersedes": [],
|
|
1719
|
+
"symbol": "NavigationRegion3D"
|
|
1720
|
+
},
|
|
1721
|
+
{
|
|
1722
|
+
"constraints": ["requires rapier() earlier in the plugins array"],
|
|
1723
|
+
"example": "const game = defineGame({ plugins: [rapier(), recast()] });",
|
|
1724
|
+
"importPath": "@threenative/physics/navigation",
|
|
1725
|
+
"kind": "function",
|
|
1726
|
+
"overrides": [],
|
|
1727
|
+
"package": "@threenative/physics",
|
|
1728
|
+
"signature": "export function recast(): NavigationPlugin { … }",
|
|
1729
|
+
"situations": ["enemy walks around a wall", "NPC patrols a level and chases a player"],
|
|
1730
|
+
"summary": "Install navmesh pathfinding and crowd avoidance.",
|
|
1731
|
+
"supersedes": [],
|
|
1732
|
+
"symbol": "recast"
|
|
1733
|
+
},
|
|
1734
|
+
{
|
|
1735
|
+
"constraints": [
|
|
1736
|
+
"bridge values must be JSON-shaped",
|
|
1737
|
+
"throws instead of silently dropping the offending field"
|
|
1738
|
+
],
|
|
1739
|
+
"example": "assertJsonSafe({ score: 10 });",
|
|
1740
|
+
"importPath": "@threenative/playtest",
|
|
1741
|
+
"kind": "function",
|
|
1742
|
+
"overrides": [],
|
|
1743
|
+
"package": "@threenative/playtest",
|
|
1744
|
+
"signature": "export function assertJsonSafe(value: unknown, path = \"$\"): asserts value is JsonValue { … }",
|
|
1745
|
+
"situations": [
|
|
1746
|
+
"send a safe observation over the playtest bridge",
|
|
1747
|
+
"reject an oversized or cyclic playtest payload",
|
|
1748
|
+
"validate entity components and gameplay observations before crossing the bridge"
|
|
1749
|
+
],
|
|
1750
|
+
"summary": "Validate JSON-safe bridge messages and protocol sizes.",
|
|
1751
|
+
"supersedes": [],
|
|
1752
|
+
"symbol": "assertJsonSafe"
|
|
1753
|
+
},
|
|
1754
|
+
{
|
|
1755
|
+
"constraints": [
|
|
1756
|
+
"a reading the device does not expose reports unavailable, never zero",
|
|
1757
|
+
"a run that started hot or whose thermal status rose is flagged as confounded"
|
|
1758
|
+
],
|
|
1759
|
+
"example": "const verdict = summarizeDeviceMetrics(observation.samples);",
|
|
1760
|
+
"importPath": "@threenative/playtest",
|
|
1761
|
+
"kind": "class",
|
|
1762
|
+
"overrides": [],
|
|
1763
|
+
"package": "@threenative/playtest",
|
|
1764
|
+
"signature": "export class DeviceMetricsError extends Error { … }",
|
|
1765
|
+
"situations": [
|
|
1766
|
+
"find out whether an Android run was throttled or started hot",
|
|
1767
|
+
"read battery temperature, current draw or per-rail power for a run"
|
|
1768
|
+
],
|
|
1769
|
+
"summary": "Measure and judge device thermal, power and battery state around a device playtest run.",
|
|
1770
|
+
"supersedes": [],
|
|
1771
|
+
"symbol": "DeviceMetricsError"
|
|
1772
|
+
},
|
|
1773
|
+
{
|
|
1774
|
+
"constraints": [
|
|
1775
|
+
"a reading the device does not expose reports unavailable, never zero",
|
|
1776
|
+
"a run that started hot or whose thermal status rose is flagged as confounded"
|
|
1777
|
+
],
|
|
1778
|
+
"example": "const verdict = summarizeDeviceMetrics(observation.samples);",
|
|
1779
|
+
"importPath": "@threenative/playtest",
|
|
1780
|
+
"kind": "class",
|
|
1781
|
+
"overrides": [],
|
|
1782
|
+
"package": "@threenative/playtest",
|
|
1783
|
+
"signature": "export class DeviceMetricsRecorder { … }",
|
|
1784
|
+
"situations": [
|
|
1785
|
+
"find out whether an Android run was throttled or started hot",
|
|
1786
|
+
"read battery temperature, current draw or per-rail power for a run"
|
|
1787
|
+
],
|
|
1788
|
+
"summary": "Measure and judge device thermal, power and battery state around a device playtest run.",
|
|
1789
|
+
"supersedes": [],
|
|
1790
|
+
"symbol": "DeviceMetricsRecorder"
|
|
1791
|
+
},
|
|
1792
|
+
{
|
|
1793
|
+
"constraints": ["malformed or empty assertions fail closed"],
|
|
1794
|
+
"example": "const result = evaluateRichPlaytestAssertions(input);",
|
|
1795
|
+
"importPath": "@threenative/playtest",
|
|
1796
|
+
"kind": "function",
|
|
1797
|
+
"overrides": [],
|
|
1798
|
+
"package": "@threenative/playtest",
|
|
1799
|
+
"signature": "export function evaluateRichPlaytestAssertions(input: { … }",
|
|
1800
|
+
"situations": [
|
|
1801
|
+
"assert movement, visibility, or diagnostics in a playtest",
|
|
1802
|
+
"turn a scenario observation into a pass or failure"
|
|
1803
|
+
],
|
|
1804
|
+
"summary": "Evaluate rich semantic assertions against captured observations.",
|
|
1805
|
+
"supersedes": [],
|
|
1806
|
+
"symbol": "evaluateRichPlaytestAssertions"
|
|
1807
|
+
},
|
|
1808
|
+
{
|
|
1809
|
+
"constraints": ["unknown scenario keys fail closed"],
|
|
1810
|
+
"example": "const scenario = await loadPlaytestScenario(project, file);",
|
|
1811
|
+
"importPath": "@threenative/playtest",
|
|
1812
|
+
"kind": "function",
|
|
1813
|
+
"overrides": [],
|
|
1814
|
+
"package": "@threenative/playtest",
|
|
1815
|
+
"signature": "export function invalidScenario(scenarioPath: string, message: string): PlaytestScenarioError { … }",
|
|
1816
|
+
"situations": [
|
|
1817
|
+
"create a browser or device playtest scenario",
|
|
1818
|
+
"wait or hold a game for a deterministic number of ticks"
|
|
1819
|
+
],
|
|
1820
|
+
"summary": "Load and validate a scenario, then control its tick steps.",
|
|
1821
|
+
"supersedes": [],
|
|
1822
|
+
"symbol": "invalidScenario"
|
|
1823
|
+
},
|
|
1824
|
+
{
|
|
1825
|
+
"constraints": ["bridge values must be JSON-shaped"],
|
|
1826
|
+
"example": "assertJsonSafe({ score: 10 });",
|
|
1827
|
+
"importPath": "@threenative/playtest",
|
|
1828
|
+
"kind": "function",
|
|
1829
|
+
"overrides": [],
|
|
1830
|
+
"package": "@threenative/playtest",
|
|
1831
|
+
"signature": "export function jsonByteLength(value: JsonValue): number { … }",
|
|
1832
|
+
"situations": [
|
|
1833
|
+
"send a safe observation over the playtest bridge",
|
|
1834
|
+
"reject an oversized or cyclic playtest payload",
|
|
1835
|
+
"check a runtime observation against the protocol payload limit before sampling"
|
|
1836
|
+
],
|
|
1837
|
+
"summary": "Validate JSON-safe bridge messages and protocol sizes.",
|
|
1838
|
+
"supersedes": [],
|
|
1839
|
+
"symbol": "jsonByteLength"
|
|
1840
|
+
},
|
|
1841
|
+
{
|
|
1842
|
+
"constraints": ["unknown scenario keys fail closed"],
|
|
1843
|
+
"example": "const scenario = await loadPlaytestScenario(project, file);",
|
|
1844
|
+
"importPath": "@threenative/playtest",
|
|
1845
|
+
"kind": "function",
|
|
1846
|
+
"overrides": [],
|
|
1847
|
+
"package": "@threenative/playtest",
|
|
1848
|
+
"signature": "export async function loadPlaytestScenario(projectPath: string, scenarioPath: string): Promise<IPlaytestScenario> { … }",
|
|
1849
|
+
"situations": [
|
|
1850
|
+
"create a browser or device playtest scenario",
|
|
1851
|
+
"wait or hold a game for a deterministic number of ticks"
|
|
1852
|
+
],
|
|
1853
|
+
"summary": "Load and validate a scenario, then control its tick steps.",
|
|
1854
|
+
"supersedes": [],
|
|
1855
|
+
"symbol": "loadPlaytestScenario"
|
|
1856
|
+
},
|
|
1857
|
+
{
|
|
1858
|
+
"constraints": [],
|
|
1859
|
+
"example": "const missing = missingPlaytestCapabilities(required, available);",
|
|
1860
|
+
"importPath": "@threenative/playtest",
|
|
1861
|
+
"kind": "function",
|
|
1862
|
+
"overrides": [],
|
|
1863
|
+
"package": "@threenative/playtest",
|
|
1864
|
+
"signature": "export function missingPlaytestCapabilities(required: readonly string[], available: readonly string[]): string[] { … }",
|
|
1865
|
+
"situations": [
|
|
1866
|
+
"check whether a scenario's required capabilities are installed",
|
|
1867
|
+
"report unknown or missing playtest capabilities"
|
|
1868
|
+
],
|
|
1869
|
+
"summary": "Validate and inspect playtest capability declarations.",
|
|
1870
|
+
"supersedes": [],
|
|
1871
|
+
"symbol": "missingPlaytestCapabilities"
|
|
1872
|
+
},
|
|
1873
|
+
{
|
|
1874
|
+
"constraints": [
|
|
1875
|
+
"a reading the device does not expose reports unavailable, never zero",
|
|
1876
|
+
"a run that started hot or whose thermal status rose is flagged as confounded"
|
|
1877
|
+
],
|
|
1878
|
+
"example": "const verdict = summarizeDeviceMetrics(observation.samples);",
|
|
1879
|
+
"importPath": "@threenative/playtest",
|
|
1880
|
+
"kind": "function",
|
|
1881
|
+
"overrides": [],
|
|
1882
|
+
"package": "@threenative/playtest",
|
|
1883
|
+
"signature": "export function parseDeviceBattery(output: string): IPlaytestDeviceBattery { … }",
|
|
1884
|
+
"situations": [
|
|
1885
|
+
"find out whether an Android run was throttled or started hot",
|
|
1886
|
+
"read battery temperature, current draw or per-rail power for a run"
|
|
1887
|
+
],
|
|
1888
|
+
"summary": "Measure and judge device thermal, power and battery state around a device playtest run.",
|
|
1889
|
+
"supersedes": [],
|
|
1890
|
+
"symbol": "parseDeviceBattery"
|
|
1891
|
+
},
|
|
1892
|
+
{
|
|
1893
|
+
"constraints": [
|
|
1894
|
+
"a reading the device does not expose reports unavailable, never zero",
|
|
1895
|
+
"a run that started hot or whose thermal status rose is flagged as confounded"
|
|
1896
|
+
],
|
|
1897
|
+
"example": "const verdict = summarizeDeviceMetrics(observation.samples);",
|
|
1898
|
+
"importPath": "@threenative/playtest",
|
|
1899
|
+
"kind": "function",
|
|
1900
|
+
"overrides": [],
|
|
1901
|
+
"package": "@threenative/playtest",
|
|
1902
|
+
"signature": "export function parseDeviceCurrent(output: string): PlaytestDeviceMeasurement<number> { … }",
|
|
1903
|
+
"situations": [
|
|
1904
|
+
"find out whether an Android run was throttled or started hot",
|
|
1905
|
+
"read battery temperature, current draw or per-rail power for a run"
|
|
1906
|
+
],
|
|
1907
|
+
"summary": "Measure and judge device thermal, power and battery state around a device playtest run.",
|
|
1908
|
+
"supersedes": [],
|
|
1909
|
+
"symbol": "parseDeviceCurrent"
|
|
1910
|
+
},
|
|
1911
|
+
{
|
|
1912
|
+
"constraints": [
|
|
1913
|
+
"a reading the device does not expose reports unavailable, never zero",
|
|
1914
|
+
"a run that started hot or whose thermal status rose is flagged as confounded"
|
|
1915
|
+
],
|
|
1916
|
+
"example": "const verdict = summarizeDeviceMetrics(observation.samples);",
|
|
1917
|
+
"importPath": "@threenative/playtest",
|
|
1918
|
+
"kind": "function",
|
|
1919
|
+
"overrides": [],
|
|
1920
|
+
"package": "@threenative/playtest",
|
|
1921
|
+
"signature": "export function parseDevicePowerRails(output: string): PlaytestDevicePowerRails { … }",
|
|
1922
|
+
"situations": [
|
|
1923
|
+
"find out whether an Android run was throttled or started hot",
|
|
1924
|
+
"read battery temperature, current draw or per-rail power for a run"
|
|
1925
|
+
],
|
|
1926
|
+
"summary": "Measure and judge device thermal, power and battery state around a device playtest run.",
|
|
1927
|
+
"supersedes": [],
|
|
1928
|
+
"symbol": "parseDevicePowerRails"
|
|
1929
|
+
},
|
|
1930
|
+
{
|
|
1931
|
+
"constraints": [
|
|
1932
|
+
"a reading the device does not expose reports unavailable, never zero",
|
|
1933
|
+
"a run that started hot or whose thermal status rose is flagged as confounded"
|
|
1934
|
+
],
|
|
1935
|
+
"example": "const verdict = summarizeDeviceMetrics(observation.samples);",
|
|
1936
|
+
"importPath": "@threenative/playtest",
|
|
1937
|
+
"kind": "function",
|
|
1938
|
+
"overrides": [],
|
|
1939
|
+
"package": "@threenative/playtest",
|
|
1940
|
+
"signature": "export function parseDeviceThermal(output: string): IPlaytestDeviceThermal { … }",
|
|
1941
|
+
"situations": [
|
|
1942
|
+
"find out whether an Android run was throttled or started hot",
|
|
1943
|
+
"read battery temperature, current draw or per-rail power for a run"
|
|
1944
|
+
],
|
|
1945
|
+
"summary": "Measure and judge device thermal, power and battery state around a device playtest run.",
|
|
1946
|
+
"supersedes": [],
|
|
1947
|
+
"symbol": "parseDeviceThermal"
|
|
1948
|
+
},
|
|
1949
|
+
{
|
|
1950
|
+
"constraints": [],
|
|
1951
|
+
"example": "playtestDiagnostic(\"physics\", \"body missing\");",
|
|
1952
|
+
"importPath": "@threenative/playtest",
|
|
1953
|
+
"kind": "function",
|
|
1954
|
+
"overrides": [],
|
|
1955
|
+
"package": "@threenative/playtest",
|
|
1956
|
+
"signature": "export function playtestDiagnostic( code: PlaytestDiagnosticCode, message: string, instruction: string, details: Pick<IPlaytestProtocolDiagnostic, \"capability\" | \"path\"> & { … }",
|
|
1957
|
+
"situations": [
|
|
1958
|
+
"report a named runtime diagnostic to a scenario",
|
|
1959
|
+
"explain why a playtest assertion cannot pass"
|
|
1960
|
+
],
|
|
1961
|
+
"summary": "Create a structured playtest diagnostic.",
|
|
1962
|
+
"supersedes": [],
|
|
1963
|
+
"symbol": "playtestDiagnostic"
|
|
1964
|
+
},
|
|
1965
|
+
{
|
|
1966
|
+
"constraints": ["unknown scenario keys fail closed"],
|
|
1967
|
+
"example": "const scenario = await loadPlaytestScenario(project, file);",
|
|
1968
|
+
"importPath": "@threenative/playtest",
|
|
1969
|
+
"kind": "class",
|
|
1970
|
+
"overrides": [],
|
|
1971
|
+
"package": "@threenative/playtest",
|
|
1972
|
+
"signature": "export class PlaytestScenarioError extends Error { … }",
|
|
1973
|
+
"situations": [
|
|
1974
|
+
"create a browser or device playtest scenario",
|
|
1975
|
+
"wait or hold a game for a deterministic number of ticks"
|
|
1976
|
+
],
|
|
1977
|
+
"summary": "Load and validate a scenario, then control its tick steps.",
|
|
1978
|
+
"supersedes": [],
|
|
1979
|
+
"symbol": "PlaytestScenarioError"
|
|
1980
|
+
},
|
|
1981
|
+
{
|
|
1982
|
+
"constraints": ["unknown scenario keys fail closed"],
|
|
1983
|
+
"example": "const scenario = await loadPlaytestScenario(project, file);",
|
|
1984
|
+
"importPath": "@threenative/playtest",
|
|
1985
|
+
"kind": "function",
|
|
1986
|
+
"overrides": [],
|
|
1987
|
+
"package": "@threenative/playtest",
|
|
1988
|
+
"signature": "export function playtestStepHoldTicks(step: IPlaytestStep, fallback = 1): number { … }",
|
|
1989
|
+
"situations": [
|
|
1990
|
+
"create a browser or device playtest scenario",
|
|
1991
|
+
"wait or hold a game for a deterministic number of ticks"
|
|
1992
|
+
],
|
|
1993
|
+
"summary": "Load and validate a scenario, then control its tick steps.",
|
|
1994
|
+
"supersedes": [],
|
|
1995
|
+
"symbol": "playtestStepHoldTicks"
|
|
1996
|
+
},
|
|
1997
|
+
{
|
|
1998
|
+
"constraints": ["unknown scenario keys fail closed"],
|
|
1999
|
+
"example": "const scenario = await loadPlaytestScenario(project, file);",
|
|
2000
|
+
"importPath": "@threenative/playtest",
|
|
2001
|
+
"kind": "function",
|
|
2002
|
+
"overrides": [],
|
|
2003
|
+
"package": "@threenative/playtest",
|
|
2004
|
+
"signature": "export function playtestStepWaitTicks(step: IPlaytestStep): number { … }",
|
|
2005
|
+
"situations": [
|
|
2006
|
+
"create a browser or device playtest scenario",
|
|
2007
|
+
"wait or hold a game for a deterministic number of ticks"
|
|
2008
|
+
],
|
|
2009
|
+
"summary": "Load and validate a scenario, then control its tick steps.",
|
|
2010
|
+
"supersedes": [],
|
|
2011
|
+
"symbol": "playtestStepWaitTicks"
|
|
2012
|
+
},
|
|
2013
|
+
{
|
|
2014
|
+
"constraints": ["unknown scenario keys fail closed"],
|
|
2015
|
+
"example": "const scenario = await loadPlaytestScenario(project, file);",
|
|
2016
|
+
"importPath": "@threenative/playtest",
|
|
2017
|
+
"kind": "function",
|
|
2018
|
+
"overrides": [],
|
|
2019
|
+
"package": "@threenative/playtest",
|
|
2020
|
+
"signature": "export function rejectUnknownKeys( value: Record<string, unknown>, allowedKeys: readonly string[], scenarioPath: string, objectPath: string, ): void { … }",
|
|
2021
|
+
"situations": [
|
|
2022
|
+
"create a browser or device playtest scenario",
|
|
2023
|
+
"wait or hold a game for a deterministic number of ticks"
|
|
2024
|
+
],
|
|
2025
|
+
"summary": "Load and validate a scenario, then control its tick steps.",
|
|
2026
|
+
"supersedes": [],
|
|
2027
|
+
"symbol": "rejectUnknownKeys"
|
|
2028
|
+
},
|
|
2029
|
+
{
|
|
2030
|
+
"constraints": ["malformed or empty assertions fail closed"],
|
|
2031
|
+
"example": "const result = evaluateRichPlaytestAssertions(input);",
|
|
2032
|
+
"importPath": "@threenative/playtest",
|
|
2033
|
+
"kind": "function",
|
|
2034
|
+
"overrides": [],
|
|
2035
|
+
"package": "@threenative/playtest",
|
|
2036
|
+
"signature": "export function requiredPlaytestCapabilities(scenario: IPlaytestScenario): PlaytestCapability[] { … }",
|
|
2037
|
+
"situations": [
|
|
2038
|
+
"assert movement, visibility, or diagnostics in a playtest",
|
|
2039
|
+
"turn a scenario observation into a pass or failure"
|
|
2040
|
+
],
|
|
2041
|
+
"summary": "Evaluate rich semantic assertions against captured observations.",
|
|
2042
|
+
"supersedes": [],
|
|
2043
|
+
"symbol": "requiredPlaytestCapabilities"
|
|
2044
|
+
},
|
|
2045
|
+
{
|
|
2046
|
+
"constraints": ["absent policy fields default to rejecting errors"],
|
|
2047
|
+
"example": "const policy = resolveDiagnosticsPolicy(scenario.assert?.diagnostics);",
|
|
2048
|
+
"importPath": "@threenative/playtest",
|
|
2049
|
+
"kind": "function",
|
|
2050
|
+
"overrides": [],
|
|
2051
|
+
"package": "@threenative/playtest",
|
|
2052
|
+
"signature": "export function resolveDiagnosticsPolicy( policy: IPlaytestDiagnosticsAssertion | undefined, ): IPlaytestDiagnosticsPolicy { … }",
|
|
2053
|
+
"situations": ["judge captured console, network, or runtime diagnostics for a playtest"],
|
|
2054
|
+
"summary": "Resolve the effective diagnostics policy for a run, with fail-closed defaults applied.",
|
|
2055
|
+
"supersedes": [],
|
|
2056
|
+
"symbol": "resolveDiagnosticsPolicy"
|
|
2057
|
+
},
|
|
2058
|
+
{
|
|
2059
|
+
"constraints": [
|
|
2060
|
+
"a reading the device does not expose reports unavailable, never zero",
|
|
2061
|
+
"a run that started hot or whose thermal status rose is flagged as confounded"
|
|
2062
|
+
],
|
|
2063
|
+
"example": "const verdict = summarizeDeviceMetrics(observation.samples);",
|
|
2064
|
+
"importPath": "@threenative/playtest",
|
|
2065
|
+
"kind": "function",
|
|
2066
|
+
"overrides": [],
|
|
2067
|
+
"package": "@threenative/playtest",
|
|
2068
|
+
"signature": "export function summarizeDeviceMetrics( samples: readonly IPlaytestDeviceMetricsSample[], ): IPlaytestDeviceMetricsVerdict { … }",
|
|
2069
|
+
"situations": [
|
|
2070
|
+
"find out whether an Android run was throttled or started hot",
|
|
2071
|
+
"read battery temperature, current draw or per-rail power for a run"
|
|
2072
|
+
],
|
|
2073
|
+
"summary": "Measure and judge device thermal, power and battery state around a device playtest run.",
|
|
2074
|
+
"supersedes": [],
|
|
2075
|
+
"symbol": "summarizeDeviceMetrics"
|
|
2076
|
+
},
|
|
2077
|
+
{
|
|
2078
|
+
"constraints": [],
|
|
2079
|
+
"example": "const missing = missingPlaytestCapabilities(required, available);",
|
|
2080
|
+
"importPath": "@threenative/playtest",
|
|
2081
|
+
"kind": "function",
|
|
2082
|
+
"overrides": [],
|
|
2083
|
+
"package": "@threenative/playtest",
|
|
2084
|
+
"signature": "export function unknownPlaytestCapabilities(capabilities: readonly string[]): string[] { … }",
|
|
2085
|
+
"situations": [
|
|
2086
|
+
"check whether a scenario's required capabilities are installed",
|
|
2087
|
+
"report unknown or missing playtest capabilities"
|
|
2088
|
+
],
|
|
2089
|
+
"summary": "Validate and inspect playtest capability declarations.",
|
|
2090
|
+
"supersedes": [],
|
|
2091
|
+
"symbol": "unknownPlaytestCapabilities"
|
|
2092
|
+
},
|
|
2093
|
+
{
|
|
2094
|
+
"constraints": ["the assertion throws instead of returning a false pass"],
|
|
2095
|
+
"example": "assertCaptureNotBlank(png, \"first frame\");",
|
|
2096
|
+
"importPath": "@threenative/playtest/capture",
|
|
2097
|
+
"kind": "function",
|
|
2098
|
+
"overrides": [],
|
|
2099
|
+
"package": "@threenative/playtest",
|
|
2100
|
+
"signature": "export function assertCaptureNotBlank(png: Buffer, label: string): ICaptureFrameStats { … }",
|
|
2101
|
+
"situations": [
|
|
2102
|
+
"guard a visual playtest against a blank frame",
|
|
2103
|
+
"prove a screenshot contains more than a loading surface"
|
|
2104
|
+
],
|
|
2105
|
+
"summary": "Fail closed when a screenshot is blank or uniform.",
|
|
2106
|
+
"supersedes": [],
|
|
2107
|
+
"symbol": "assertCaptureNotBlank"
|
|
2108
|
+
},
|
|
2109
|
+
{
|
|
2110
|
+
"constraints": [],
|
|
2111
|
+
"example": "throw new CaptureGuardError(\"menu\", \"no bright pixels\");",
|
|
2112
|
+
"importPath": "@threenative/playtest/capture",
|
|
2113
|
+
"kind": "class",
|
|
2114
|
+
"overrides": [],
|
|
2115
|
+
"package": "@threenative/playtest",
|
|
2116
|
+
"signature": "export class CaptureGuardError extends Error { … }",
|
|
2117
|
+
"situations": [
|
|
2118
|
+
"fail a visual test when the rendered frame is blank",
|
|
2119
|
+
"include capture statistics in a playtest error"
|
|
2120
|
+
],
|
|
2121
|
+
"summary": "Explain why a captured frame failed the non-blank guard.",
|
|
2122
|
+
"supersedes": [],
|
|
2123
|
+
"symbol": "CaptureGuardError"
|
|
2124
|
+
},
|
|
2125
|
+
{
|
|
2126
|
+
"constraints": [],
|
|
2127
|
+
"example": "const stats = inspectFrame(png);",
|
|
2128
|
+
"importPath": "@threenative/playtest/capture",
|
|
2129
|
+
"kind": "function",
|
|
2130
|
+
"overrides": [],
|
|
2131
|
+
"package": "@threenative/playtest",
|
|
2132
|
+
"signature": "export function inspectFrame(png: Buffer): ICaptureFrameStats { … }",
|
|
2133
|
+
"situations": [
|
|
2134
|
+
"measure whether a screenshot contains a rendered game",
|
|
2135
|
+
"diagnose a uniform or blank capture"
|
|
2136
|
+
],
|
|
2137
|
+
"summary": "Inspect a PNG frame for visible pixels and luminance variation.",
|
|
2138
|
+
"supersedes": [],
|
|
2139
|
+
"symbol": "inspectFrame"
|
|
2140
|
+
},
|
|
2141
|
+
{
|
|
2142
|
+
"constraints": ["throws instead of silently dropping the offending field"],
|
|
2143
|
+
"example": "assertJsonSafe(snapshot, \"$.components\");",
|
|
2144
|
+
"importPath": "@threenative/playtest/protocol",
|
|
2145
|
+
"kind": "function",
|
|
2146
|
+
"overrides": [],
|
|
2147
|
+
"package": "@threenative/playtest",
|
|
2148
|
+
"signature": "export function assertJsonSafe(value: unknown, path = \"$\"): asserts value is JsonValue { … }",
|
|
2149
|
+
"situations": [
|
|
2150
|
+
"validate entity components and gameplay observations before crossing the bridge"
|
|
2151
|
+
],
|
|
2152
|
+
"summary": "Reject any value that would not survive JSON serialization.",
|
|
2153
|
+
"supersedes": [],
|
|
2154
|
+
"symbol": "assertJsonSafe"
|
|
2155
|
+
},
|
|
2156
|
+
{
|
|
2157
|
+
"constraints": [],
|
|
2158
|
+
"example": "const bytes = jsonByteLength(observation);",
|
|
2159
|
+
"importPath": "@threenative/playtest/protocol",
|
|
2160
|
+
"kind": "function",
|
|
2161
|
+
"overrides": [],
|
|
2162
|
+
"package": "@threenative/playtest",
|
|
2163
|
+
"signature": "export function jsonByteLength(value: JsonValue): number { … }",
|
|
2164
|
+
"situations": [
|
|
2165
|
+
"check a runtime observation against the protocol payload limit before sampling"
|
|
2166
|
+
],
|
|
2167
|
+
"summary": "Measure a payload's wire size in bytes.",
|
|
2168
|
+
"supersedes": [],
|
|
2169
|
+
"symbol": "jsonByteLength"
|
|
2170
|
+
},
|
|
2171
|
+
{
|
|
2172
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
2173
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
2174
|
+
"importPath": "@threenative/playtest/runner",
|
|
2175
|
+
"kind": "class",
|
|
2176
|
+
"overrides": [],
|
|
2177
|
+
"package": "@threenative/playtest",
|
|
2178
|
+
"signature": "export class AdbAndroidDriver implements IAndroidDriver { … }",
|
|
2179
|
+
"situations": [
|
|
2180
|
+
"run a scenario on an Android emulator or device",
|
|
2181
|
+
"parse Android console diagnostics"
|
|
2182
|
+
],
|
|
2183
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
2184
|
+
"supersedes": [],
|
|
2185
|
+
"symbol": "AdbAndroidDriver"
|
|
2186
|
+
},
|
|
2187
|
+
{
|
|
2188
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2189
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2190
|
+
"importPath": "@threenative/playtest/runner",
|
|
2191
|
+
"kind": "function",
|
|
2192
|
+
"overrides": [],
|
|
2193
|
+
"package": "@threenative/playtest",
|
|
2194
|
+
"signature": "export async function advanceFixedStep( page: Page, bridge: Pick<IPlaytestBridgeClient, \"advance\">, ticks: number, ): Promise<void> { … }",
|
|
2195
|
+
"situations": [
|
|
2196
|
+
"run a complete browser or device playtest",
|
|
2197
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2198
|
+
],
|
|
2199
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2200
|
+
"supersedes": [],
|
|
2201
|
+
"symbol": "advanceFixedStep"
|
|
2202
|
+
},
|
|
2203
|
+
{
|
|
2204
|
+
"constraints": ["the bridge must answer the handshake or the run fails"],
|
|
2205
|
+
"example": "const bridge = await connectPlaytestBridge(page);",
|
|
2206
|
+
"importPath": "@threenative/playtest/runner",
|
|
2207
|
+
"kind": "function",
|
|
2208
|
+
"overrides": [],
|
|
2209
|
+
"package": "@threenative/playtest",
|
|
2210
|
+
"signature": "export function advanceTimeoutMs( ticks: number, perTickMs: number = PLAYTEST_ADVANCE_TICK_BUDGET_MS, ): number { … }",
|
|
2211
|
+
"situations": [
|
|
2212
|
+
"run a browser scenario against a game",
|
|
2213
|
+
"inspect bridge diagnostics from a runner"
|
|
2214
|
+
],
|
|
2215
|
+
"summary": "Connect a Playwright page to a playtest bridge.",
|
|
2216
|
+
"supersedes": [],
|
|
2217
|
+
"symbol": "advanceTimeoutMs"
|
|
2218
|
+
},
|
|
2219
|
+
{
|
|
2220
|
+
"constraints": ["paths stay inside the managed artifact directory"],
|
|
2221
|
+
"example": "const paths = deviceMailboxPaths(projectRoot);",
|
|
2222
|
+
"importPath": "@threenative/playtest/runner",
|
|
2223
|
+
"kind": "function",
|
|
2224
|
+
"overrides": [],
|
|
2225
|
+
"package": "@threenative/playtest",
|
|
2226
|
+
"signature": "export function androidMailboxPaths( packageName: string, root = `/sdcard/Android/data/$ { … }",
|
|
2227
|
+
"situations": [
|
|
2228
|
+
"connect a native host to the playtest runner",
|
|
2229
|
+
"validate an Android or iOS device endpoint"
|
|
2230
|
+
],
|
|
2231
|
+
"summary": "Resolve a native device transport and its mailbox paths.",
|
|
2232
|
+
"supersedes": [],
|
|
2233
|
+
"symbol": "androidMailboxPaths"
|
|
2234
|
+
},
|
|
2235
|
+
{
|
|
2236
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
2237
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
2238
|
+
"importPath": "@threenative/playtest/runner",
|
|
2239
|
+
"kind": "function",
|
|
2240
|
+
"overrides": [],
|
|
2241
|
+
"package": "@threenative/playtest",
|
|
2242
|
+
"signature": "export function androidTouchBatches( identity: readonly string[], positions: readonly string[], ): string[][] { … }",
|
|
2243
|
+
"situations": [
|
|
2244
|
+
"run a scenario on an Android emulator or device",
|
|
2245
|
+
"parse Android console diagnostics"
|
|
2246
|
+
],
|
|
2247
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
2248
|
+
"supersedes": [],
|
|
2249
|
+
"symbol": "androidTouchBatches"
|
|
2250
|
+
},
|
|
2251
|
+
{
|
|
2252
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2253
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2254
|
+
"importPath": "@threenative/playtest/runner",
|
|
2255
|
+
"kind": "function",
|
|
2256
|
+
"overrides": [],
|
|
2257
|
+
"package": "@threenative/playtest",
|
|
2258
|
+
"signature": "export function batchArtifactDirectory(base: string, scenarioPath: string, index: number): string { … }",
|
|
2259
|
+
"situations": [
|
|
2260
|
+
"run a complete browser or device playtest",
|
|
2261
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2262
|
+
],
|
|
2263
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2264
|
+
"supersedes": [],
|
|
2265
|
+
"symbol": "batchArtifactDirectory"
|
|
2266
|
+
},
|
|
2267
|
+
{
|
|
2268
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2269
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2270
|
+
"importPath": "@threenative/playtest/runner",
|
|
2271
|
+
"kind": "function",
|
|
2272
|
+
"overrides": [],
|
|
2273
|
+
"package": "@threenative/playtest",
|
|
2274
|
+
"signature": "export async function boundedTeardownStep( step: Promise<unknown> | undefined, timeoutMs: number, ): Promise<boolean> { … }",
|
|
2275
|
+
"situations": [
|
|
2276
|
+
"run a complete browser or device playtest",
|
|
2277
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2278
|
+
],
|
|
2279
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2280
|
+
"supersedes": [],
|
|
2281
|
+
"symbol": "boundedTeardownStep"
|
|
2282
|
+
},
|
|
2283
|
+
{
|
|
2284
|
+
"constraints": ["the bridge must answer the handshake or the run fails"],
|
|
2285
|
+
"example": "const bridge = await connectPlaytestBridge(page);",
|
|
2286
|
+
"importPath": "@threenative/playtest/runner",
|
|
2287
|
+
"kind": "function",
|
|
2288
|
+
"overrides": [],
|
|
2289
|
+
"package": "@threenative/playtest",
|
|
2290
|
+
"signature": "export function bridgeWaitTimeoutMs( operationMs: number = PLAYTEST_PROTOCOL_LIMITS.operationTimeoutMs, ): number { … }",
|
|
2291
|
+
"situations": [
|
|
2292
|
+
"run a browser scenario against a game",
|
|
2293
|
+
"inspect bridge diagnostics from a runner"
|
|
2294
|
+
],
|
|
2295
|
+
"summary": "Connect a Playwright page to a playtest bridge.",
|
|
2296
|
+
"supersedes": [],
|
|
2297
|
+
"symbol": "bridgeWaitTimeoutMs"
|
|
2298
|
+
},
|
|
2299
|
+
{
|
|
2300
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2301
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2302
|
+
"importPath": "@threenative/playtest/runner",
|
|
2303
|
+
"kind": "function",
|
|
2304
|
+
"overrides": [],
|
|
2305
|
+
"package": "@threenative/playtest",
|
|
2306
|
+
"signature": "export function buildReport( config: IStandalonePlaytestConfig, scenario: IPlaytestScenario, beforeSnapshot: IPlaytestObservationSnapshot | undefined, afterSnapshot: IPlaytestObservationSnapshot | undefined, consoleEntries: IRunnerConsoleEntry[], networkEntries: Array< { … }",
|
|
2307
|
+
"situations": [
|
|
2308
|
+
"run a complete browser or device playtest",
|
|
2309
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2310
|
+
],
|
|
2311
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2312
|
+
"supersedes": [],
|
|
2313
|
+
"symbol": "buildReport"
|
|
2314
|
+
},
|
|
2315
|
+
{
|
|
2316
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2317
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2318
|
+
"importPath": "@threenative/playtest/runner",
|
|
2319
|
+
"kind": "function",
|
|
2320
|
+
"overrides": [],
|
|
2321
|
+
"package": "@threenative/playtest",
|
|
2322
|
+
"signature": "export async function captureVisualSurface( page: Page, artifactPath?: string, ): Promise<Buffer | undefined> { … }",
|
|
2323
|
+
"situations": [
|
|
2324
|
+
"run a complete browser or device playtest",
|
|
2325
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2326
|
+
],
|
|
2327
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2328
|
+
"supersedes": [],
|
|
2329
|
+
"symbol": "captureVisualSurface"
|
|
2330
|
+
},
|
|
2331
|
+
{
|
|
2332
|
+
"constraints": ["the bridge must answer the handshake or the run fails"],
|
|
2333
|
+
"example": "const bridge = await connectPlaytestBridge(page);",
|
|
2334
|
+
"importPath": "@threenative/playtest/runner",
|
|
2335
|
+
"kind": "function",
|
|
2336
|
+
"overrides": [],
|
|
2337
|
+
"package": "@threenative/playtest",
|
|
2338
|
+
"signature": "export async function connectPlaytestBridge( page: Page, scenario: IPlaytestScenario, timeoutMs: number = PLAYTEST_PROTOCOL_LIMITS.operationTimeoutMs, ): Promise<IPlaytestBridgeClient | undefined> { … }",
|
|
2339
|
+
"situations": [
|
|
2340
|
+
"run a browser scenario against a game",
|
|
2341
|
+
"inspect bridge diagnostics from a runner"
|
|
2342
|
+
],
|
|
2343
|
+
"summary": "Connect a Playwright page to a playtest bridge.",
|
|
2344
|
+
"supersedes": [],
|
|
2345
|
+
"symbol": "connectPlaytestBridge"
|
|
2346
|
+
},
|
|
2347
|
+
{
|
|
2348
|
+
"constraints": ["the bridge must answer the handshake or the run fails"],
|
|
2349
|
+
"example": "const bridge = await connectPlaytestBridge(page);",
|
|
2350
|
+
"importPath": "@threenative/playtest/runner",
|
|
2351
|
+
"kind": "function",
|
|
2352
|
+
"overrides": [],
|
|
2353
|
+
"package": "@threenative/playtest",
|
|
2354
|
+
"signature": "export async function connectPlaytestBridgeTransport( transport: IBridgeTransport, scenario: IPlaytestScenario, timeoutMs: number = bridgeWaitTimeoutMs(), ): Promise<IPlaytestBridgeClient | undefined> { … }",
|
|
2355
|
+
"situations": [
|
|
2356
|
+
"run a browser scenario against a game",
|
|
2357
|
+
"inspect bridge diagnostics from a runner"
|
|
2358
|
+
],
|
|
2359
|
+
"summary": "Connect a Playwright page to a playtest bridge.",
|
|
2360
|
+
"supersedes": [],
|
|
2361
|
+
"symbol": "connectPlaytestBridgeTransport"
|
|
2362
|
+
},
|
|
2363
|
+
{
|
|
2364
|
+
"constraints": ["the mailbox lifecycle must be disposed after the run"],
|
|
2365
|
+
"example": "const driver = new DesktopPlaytestDriver(options);",
|
|
2366
|
+
"importPath": "@threenative/playtest/runner",
|
|
2367
|
+
"kind": "class",
|
|
2368
|
+
"overrides": [],
|
|
2369
|
+
"package": "@threenative/playtest",
|
|
2370
|
+
"signature": "export class DesktopPlaytestDriver implements IDevicePlaytestDriver { … }",
|
|
2371
|
+
"situations": [
|
|
2372
|
+
"run a desktop target through the playtest protocol",
|
|
2373
|
+
"exchange observations with a native desktop host"
|
|
2374
|
+
],
|
|
2375
|
+
"summary": "Drive a local desktop playtest mailbox.",
|
|
2376
|
+
"supersedes": [],
|
|
2377
|
+
"symbol": "DesktopPlaytestDriver"
|
|
2378
|
+
},
|
|
2379
|
+
{
|
|
2380
|
+
"constraints": ["paths stay inside the managed artifact directory"],
|
|
2381
|
+
"example": "const paths = deviceMailboxPaths(projectRoot);",
|
|
2382
|
+
"importPath": "@threenative/playtest/runner",
|
|
2383
|
+
"kind": "class",
|
|
2384
|
+
"overrides": [],
|
|
2385
|
+
"package": "@threenative/playtest",
|
|
2386
|
+
"signature": "export class DeviceBridgeTransport implements IDevicePlaytestTransport { … }",
|
|
2387
|
+
"situations": [
|
|
2388
|
+
"connect a native host to the playtest runner",
|
|
2389
|
+
"validate an Android or iOS device endpoint"
|
|
2390
|
+
],
|
|
2391
|
+
"summary": "Resolve a native device transport and its mailbox paths.",
|
|
2392
|
+
"supersedes": [],
|
|
2393
|
+
"symbol": "DeviceBridgeTransport"
|
|
2394
|
+
},
|
|
2395
|
+
{
|
|
2396
|
+
"constraints": ["paths stay inside the managed artifact directory"],
|
|
2397
|
+
"example": "const paths = deviceMailboxPaths(projectRoot);",
|
|
2398
|
+
"importPath": "@threenative/playtest/runner",
|
|
2399
|
+
"kind": "function",
|
|
2400
|
+
"overrides": [],
|
|
2401
|
+
"package": "@threenative/playtest",
|
|
2402
|
+
"signature": "export function deviceMailboxPaths(root: string): IDeviceMailboxPaths { … }",
|
|
2403
|
+
"situations": [
|
|
2404
|
+
"connect a native host to the playtest runner",
|
|
2405
|
+
"validate an Android or iOS device endpoint"
|
|
2406
|
+
],
|
|
2407
|
+
"summary": "Resolve a native device transport and its mailbox paths.",
|
|
2408
|
+
"supersedes": [],
|
|
2409
|
+
"symbol": "deviceMailboxPaths"
|
|
2410
|
+
},
|
|
2411
|
+
{
|
|
2412
|
+
"constraints": ["paths stay inside the managed artifact directory"],
|
|
2413
|
+
"example": "const paths = deviceMailboxPaths(projectRoot);",
|
|
2414
|
+
"importPath": "@threenative/playtest/runner",
|
|
2415
|
+
"kind": "class",
|
|
2416
|
+
"overrides": [],
|
|
2417
|
+
"package": "@threenative/playtest",
|
|
2418
|
+
"signature": "export class DeviceMailboxTransport implements IDevicePlaytestTransport { … }",
|
|
2419
|
+
"situations": [
|
|
2420
|
+
"connect a native host to the playtest runner",
|
|
2421
|
+
"validate an Android or iOS device endpoint"
|
|
2422
|
+
],
|
|
2423
|
+
"summary": "Resolve a native device transport and its mailbox paths.",
|
|
2424
|
+
"supersedes": [],
|
|
2425
|
+
"symbol": "DeviceMailboxTransport"
|
|
2426
|
+
},
|
|
2427
|
+
{
|
|
2428
|
+
"constraints": ["paths stay inside the managed artifact directory"],
|
|
2429
|
+
"example": "const paths = deviceMailboxPaths(projectRoot);",
|
|
2430
|
+
"importPath": "@threenative/playtest/runner",
|
|
2431
|
+
"kind": "function",
|
|
2432
|
+
"overrides": [],
|
|
2433
|
+
"package": "@threenative/playtest",
|
|
2434
|
+
"signature": "export function deviceTimeoutDiagnostic( diagnostic: IPlaytestProtocolDiagnostic, hostAlive: boolean | undefined, lastConsoleLines: readonly string[], ): IPlaytestProtocolDiagnostic { … }",
|
|
2435
|
+
"situations": [
|
|
2436
|
+
"connect a native host to the playtest runner",
|
|
2437
|
+
"validate an Android or iOS device endpoint"
|
|
2438
|
+
],
|
|
2439
|
+
"summary": "Resolve a native device transport and its mailbox paths.",
|
|
2440
|
+
"supersedes": [],
|
|
2441
|
+
"symbol": "deviceTimeoutDiagnostic"
|
|
2442
|
+
},
|
|
2443
|
+
{
|
|
2444
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
2445
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
2446
|
+
"importPath": "@threenative/playtest/runner",
|
|
2447
|
+
"kind": "function",
|
|
2448
|
+
"overrides": [],
|
|
2449
|
+
"package": "@threenative/playtest",
|
|
2450
|
+
"signature": "export function discoverAdb(environment: NodeJS.ProcessEnv = process.env): string { … }",
|
|
2451
|
+
"situations": [
|
|
2452
|
+
"run a scenario on an Android emulator or device",
|
|
2453
|
+
"parse Android console diagnostics"
|
|
2454
|
+
],
|
|
2455
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
2456
|
+
"supersedes": [],
|
|
2457
|
+
"symbol": "discoverAdb"
|
|
2458
|
+
},
|
|
2459
|
+
{
|
|
2460
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2461
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2462
|
+
"importPath": "@threenative/playtest/runner",
|
|
2463
|
+
"kind": "function",
|
|
2464
|
+
"overrides": [],
|
|
2465
|
+
"package": "@threenative/playtest",
|
|
2466
|
+
"signature": "export function failedDiagnosticsAssertion(policy: IPlaytestDiagnosticsPolicy): IPlaytestAssertionResult { … }",
|
|
2467
|
+
"situations": [
|
|
2468
|
+
"run a complete browser or device playtest",
|
|
2469
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2470
|
+
],
|
|
2471
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2472
|
+
"supersedes": [],
|
|
2473
|
+
"symbol": "failedDiagnosticsAssertion"
|
|
2474
|
+
},
|
|
2475
|
+
{
|
|
2476
|
+
"constraints": ["invalid flags throw a named usage error"],
|
|
2477
|
+
"example": "const config = parseStandalonePlaytestArgs(argv);",
|
|
2478
|
+
"importPath": "@threenative/playtest/runner",
|
|
2479
|
+
"kind": "function",
|
|
2480
|
+
"overrides": [],
|
|
2481
|
+
"package": "@threenative/playtest",
|
|
2482
|
+
"signature": "export function formatUsage(): string { … }",
|
|
2483
|
+
"situations": [
|
|
2484
|
+
"invoke the playtest CLI from a scaffold",
|
|
2485
|
+
"validate runner flags before launching a browser"
|
|
2486
|
+
],
|
|
2487
|
+
"summary": "Parse standalone playtest runner configuration.",
|
|
2488
|
+
"supersedes": [],
|
|
2489
|
+
"symbol": "formatUsage"
|
|
2490
|
+
},
|
|
2491
|
+
{
|
|
2492
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2493
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2494
|
+
"importPath": "@threenative/playtest/runner",
|
|
2495
|
+
"kind": "function",
|
|
2496
|
+
"overrides": [],
|
|
2497
|
+
"package": "@threenative/playtest",
|
|
2498
|
+
"signature": "export async function handlePlaytestSignal( teardown: (stopManagedServer: boolean) => Promise<void>, setExitCode: (code: number) => void = (code) => { … }",
|
|
2499
|
+
"situations": [
|
|
2500
|
+
"run a complete browser or device playtest",
|
|
2501
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2502
|
+
],
|
|
2503
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2504
|
+
"supersedes": [],
|
|
2505
|
+
"symbol": "handlePlaytestSignal"
|
|
2506
|
+
},
|
|
2507
|
+
{
|
|
2508
|
+
"constraints": ["generated scenarios must contain real assertions"],
|
|
2509
|
+
"example": "await initStandalonePlaytest(projectPath);",
|
|
2510
|
+
"importPath": "@threenative/playtest/runner",
|
|
2511
|
+
"kind": "function",
|
|
2512
|
+
"overrides": [],
|
|
2513
|
+
"package": "@threenative/playtest",
|
|
2514
|
+
"signature": "export async function initStandalonePlaytest(projectPath = process.cwd()): Promise< { … }",
|
|
2515
|
+
"situations": ["add the runner contract to a new game", "create a starter scenario fixture"],
|
|
2516
|
+
"summary": "Initialize the standalone playtest files for a project.",
|
|
2517
|
+
"supersedes": [],
|
|
2518
|
+
"symbol": "initStandalonePlaytest"
|
|
2519
|
+
},
|
|
2520
|
+
{
|
|
2521
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2522
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2523
|
+
"importPath": "@threenative/playtest/runner",
|
|
2524
|
+
"kind": "function",
|
|
2525
|
+
"overrides": [],
|
|
2526
|
+
"package": "@threenative/playtest",
|
|
2527
|
+
"signature": "export function isRuntimeReadout(entry: unknown): boolean { … }",
|
|
2528
|
+
"situations": [
|
|
2529
|
+
"run a complete browser or device playtest",
|
|
2530
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2531
|
+
],
|
|
2532
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2533
|
+
"supersedes": [],
|
|
2534
|
+
"symbol": "isRuntimeReadout"
|
|
2535
|
+
},
|
|
2536
|
+
{
|
|
2537
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
2538
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
2539
|
+
"importPath": "@threenative/playtest/runner",
|
|
2540
|
+
"kind": "function",
|
|
2541
|
+
"overrides": [],
|
|
2542
|
+
"package": "@threenative/playtest",
|
|
2543
|
+
"signature": "export function keyboardIsShown(dump: string): boolean { … }",
|
|
2544
|
+
"situations": [
|
|
2545
|
+
"run a scenario on an Android emulator or device",
|
|
2546
|
+
"parse Android console diagnostics"
|
|
2547
|
+
],
|
|
2548
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
2549
|
+
"supersedes": [],
|
|
2550
|
+
"symbol": "keyboardIsShown"
|
|
2551
|
+
},
|
|
2552
|
+
{
|
|
2553
|
+
"constraints": ["the mailbox lifecycle must be disposed after the run"],
|
|
2554
|
+
"example": "const driver = new DesktopPlaytestDriver(options);",
|
|
2555
|
+
"importPath": "@threenative/playtest/runner",
|
|
2556
|
+
"kind": "class",
|
|
2557
|
+
"overrides": [],
|
|
2558
|
+
"package": "@threenative/playtest",
|
|
2559
|
+
"signature": "export class LocalDeviceMailbox { … }",
|
|
2560
|
+
"situations": [
|
|
2561
|
+
"run a desktop target through the playtest protocol",
|
|
2562
|
+
"exchange observations with a native desktop host"
|
|
2563
|
+
],
|
|
2564
|
+
"summary": "Drive a local desktop playtest mailbox.",
|
|
2565
|
+
"supersedes": [],
|
|
2566
|
+
"symbol": "LocalDeviceMailbox"
|
|
2567
|
+
},
|
|
2568
|
+
{
|
|
2569
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2570
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2571
|
+
"importPath": "@threenative/playtest/runner",
|
|
2572
|
+
"kind": "class",
|
|
2573
|
+
"overrides": [],
|
|
2574
|
+
"package": "@threenative/playtest",
|
|
2575
|
+
"signature": "export class ManagedServerError extends Error { … }",
|
|
2576
|
+
"situations": [
|
|
2577
|
+
"run a complete browser or device playtest",
|
|
2578
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2579
|
+
],
|
|
2580
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2581
|
+
"supersedes": [],
|
|
2582
|
+
"symbol": "ManagedServerError"
|
|
2583
|
+
},
|
|
2584
|
+
{
|
|
2585
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2586
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2587
|
+
"importPath": "@threenative/playtest/runner",
|
|
2588
|
+
"kind": "function",
|
|
2589
|
+
"overrides": [],
|
|
2590
|
+
"package": "@threenative/playtest",
|
|
2591
|
+
"signature": "export async function openPageAndConnectBridge( page: Page, config: IStandalonePlaytestConfig, scenario: IPlaytestScenario, ): Promise<IPlaytestBridgeClient | undefined> { … }",
|
|
2592
|
+
"situations": [
|
|
2593
|
+
"run a complete browser or device playtest",
|
|
2594
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2595
|
+
],
|
|
2596
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2597
|
+
"supersedes": [],
|
|
2598
|
+
"symbol": "openPageAndConnectBridge"
|
|
2599
|
+
},
|
|
2600
|
+
{
|
|
2601
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2602
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2603
|
+
"importPath": "@threenative/playtest/runner",
|
|
2604
|
+
"kind": "function",
|
|
2605
|
+
"overrides": [],
|
|
2606
|
+
"package": "@threenative/playtest",
|
|
2607
|
+
"signature": "export function pageLifecycleDiagnostic( error: unknown, lifecycle: IPageLifecycle, url: string, ): IPlaytestProtocolDiagnostic | undefined { … }",
|
|
2608
|
+
"situations": [
|
|
2609
|
+
"run a complete browser or device playtest",
|
|
2610
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2611
|
+
],
|
|
2612
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2613
|
+
"supersedes": [],
|
|
2614
|
+
"symbol": "pageLifecycleDiagnostic"
|
|
2615
|
+
},
|
|
2616
|
+
{
|
|
2617
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
2618
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
2619
|
+
"importPath": "@threenative/playtest/runner",
|
|
2620
|
+
"kind": "function",
|
|
2621
|
+
"overrides": [],
|
|
2622
|
+
"package": "@threenative/playtest",
|
|
2623
|
+
"signature": "export function parseAndroidConsole(output: string): Array< { … }",
|
|
2624
|
+
"situations": [
|
|
2625
|
+
"run a scenario on an Android emulator or device",
|
|
2626
|
+
"parse Android console diagnostics"
|
|
2627
|
+
],
|
|
2628
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
2629
|
+
"supersedes": [],
|
|
2630
|
+
"symbol": "parseAndroidConsole"
|
|
2631
|
+
},
|
|
2632
|
+
{
|
|
2633
|
+
"constraints": ["simulator evidence does not claim physical-device proof"],
|
|
2634
|
+
"example": "const driver = new XcrunIosDriver(options);",
|
|
2635
|
+
"importPath": "@threenative/playtest/runner",
|
|
2636
|
+
"kind": "function",
|
|
2637
|
+
"overrides": [],
|
|
2638
|
+
"package": "@threenative/playtest",
|
|
2639
|
+
"signature": "export function parseLaunchedPid(output: string): string { … }",
|
|
2640
|
+
"situations": [
|
|
2641
|
+
"run a scenario on the iOS simulator",
|
|
2642
|
+
"parse the launched native process identifier"
|
|
2643
|
+
],
|
|
2644
|
+
"summary": "Drive and inspect iOS simulator playtest transport.",
|
|
2645
|
+
"supersedes": [],
|
|
2646
|
+
"symbol": "parseLaunchedPid"
|
|
2647
|
+
},
|
|
2648
|
+
{
|
|
2649
|
+
"constraints": ["invalid flags throw a named usage error"],
|
|
2650
|
+
"example": "const config = parseStandalonePlaytestArgs(argv);",
|
|
2651
|
+
"importPath": "@threenative/playtest/runner",
|
|
2652
|
+
"kind": "function",
|
|
2653
|
+
"overrides": [],
|
|
2654
|
+
"package": "@threenative/playtest",
|
|
2655
|
+
"signature": "export function parseStandalonePlaytestArgs(argv: readonly string[], cwd = process.cwd()): IStandalonePlaytestConfig { … }",
|
|
2656
|
+
"situations": [
|
|
2657
|
+
"invoke the playtest CLI from a scaffold",
|
|
2658
|
+
"validate runner flags before launching a browser"
|
|
2659
|
+
],
|
|
2660
|
+
"summary": "Parse standalone playtest runner configuration.",
|
|
2661
|
+
"supersedes": [],
|
|
2662
|
+
"symbol": "parseStandalonePlaytestArgs"
|
|
2663
|
+
},
|
|
2664
|
+
{
|
|
2665
|
+
"constraints": ["the bridge must answer the handshake or the run fails"],
|
|
2666
|
+
"example": "const bridge = await connectPlaytestBridge(page);",
|
|
2667
|
+
"importPath": "@threenative/playtest/runner",
|
|
2668
|
+
"kind": "class",
|
|
2669
|
+
"overrides": [],
|
|
2670
|
+
"package": "@threenative/playtest",
|
|
2671
|
+
"signature": "export class PlaytestBridgeError extends Error { … }",
|
|
2672
|
+
"situations": [
|
|
2673
|
+
"run a browser scenario against a game",
|
|
2674
|
+
"inspect bridge diagnostics from a runner"
|
|
2675
|
+
],
|
|
2676
|
+
"summary": "Connect a Playwright page to a playtest bridge.",
|
|
2677
|
+
"supersedes": [],
|
|
2678
|
+
"symbol": "PlaytestBridgeError"
|
|
2679
|
+
},
|
|
2680
|
+
{
|
|
2681
|
+
"constraints": ["invalid flags throw a named usage error"],
|
|
2682
|
+
"example": "const config = parseStandalonePlaytestArgs(argv);",
|
|
2683
|
+
"importPath": "@threenative/playtest/runner",
|
|
2684
|
+
"kind": "class",
|
|
2685
|
+
"overrides": [],
|
|
2686
|
+
"package": "@threenative/playtest",
|
|
2687
|
+
"signature": "export class PlaytestCliUsageError extends Error { … }",
|
|
2688
|
+
"situations": [
|
|
2689
|
+
"invoke the playtest CLI from a scaffold",
|
|
2690
|
+
"validate runner flags before launching a browser"
|
|
2691
|
+
],
|
|
2692
|
+
"summary": "Parse standalone playtest runner configuration.",
|
|
2693
|
+
"supersedes": [],
|
|
2694
|
+
"symbol": "PlaytestCliUsageError"
|
|
2695
|
+
},
|
|
2696
|
+
{
|
|
2697
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2698
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2699
|
+
"importPath": "@threenative/playtest/runner",
|
|
2700
|
+
"kind": "function",
|
|
2701
|
+
"overrides": [],
|
|
2702
|
+
"package": "@threenative/playtest",
|
|
2703
|
+
"signature": "export function playtestStepDrivesMovement( step: IPlaytestScenario[\"steps\"][number], hasHeldInput: boolean, ): boolean { … }",
|
|
2704
|
+
"situations": [
|
|
2705
|
+
"run a complete browser or device playtest",
|
|
2706
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2707
|
+
],
|
|
2708
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2709
|
+
"supersedes": [],
|
|
2710
|
+
"symbol": "playtestStepDrivesMovement"
|
|
2711
|
+
},
|
|
2712
|
+
{
|
|
2713
|
+
"constraints": ["the bridge must answer the handshake or the run fails"],
|
|
2714
|
+
"example": "const bridge = await connectPlaytestBridge(page);",
|
|
2715
|
+
"importPath": "@threenative/playtest/runner",
|
|
2716
|
+
"kind": "class",
|
|
2717
|
+
"overrides": [],
|
|
2718
|
+
"package": "@threenative/playtest",
|
|
2719
|
+
"signature": "export class PlaywrightTransport implements IBridgeTransport { … }",
|
|
2720
|
+
"situations": [
|
|
2721
|
+
"run a browser scenario against a game",
|
|
2722
|
+
"inspect bridge diagnostics from a runner"
|
|
2723
|
+
],
|
|
2724
|
+
"summary": "Connect a Playwright page to a playtest bridge.",
|
|
2725
|
+
"supersedes": [],
|
|
2726
|
+
"symbol": "PlaywrightTransport"
|
|
2727
|
+
},
|
|
2728
|
+
{
|
|
2729
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2730
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2731
|
+
"importPath": "@threenative/playtest/runner",
|
|
2732
|
+
"kind": "function",
|
|
2733
|
+
"overrides": [],
|
|
2734
|
+
"package": "@threenative/playtest",
|
|
2735
|
+
"signature": "export function preflightDisplay( config: Pick<IStandalonePlaytestConfig, \"headless\">, scenario: Pick<IPlaytestScenario, \"artifacts\" | \"assert\" | \"steps\">, environment: NodeJS.ProcessEnv = process.env, platform = process.platform, ): IPlaytestDiagnostic | undefined { … }",
|
|
2736
|
+
"situations": [
|
|
2737
|
+
"run a complete browser or device playtest",
|
|
2738
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2739
|
+
],
|
|
2740
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2741
|
+
"supersedes": [],
|
|
2742
|
+
"symbol": "preflightDisplay"
|
|
2743
|
+
},
|
|
2744
|
+
{
|
|
2745
|
+
"constraints": ["inspect the adapter name before claiming GPU proof"],
|
|
2746
|
+
"example": "const args = resolveBrowserArguments(undefined);",
|
|
2747
|
+
"importPath": "@threenative/playtest/runner",
|
|
2748
|
+
"kind": "function",
|
|
2749
|
+
"overrides": [],
|
|
2750
|
+
"package": "@threenative/playtest",
|
|
2751
|
+
"signature": "export function reconcileBrowserPointers( previous: ReadonlyMap<number, Required<IPlaytestPointer>>, next: readonly IPlaytestPointer[], ): IBrowserPointerChange[] { … }",
|
|
2752
|
+
"situations": [
|
|
2753
|
+
"run a browser playtest with Vulkan WebGPU",
|
|
2754
|
+
"reject a SwiftShader adapter as evidence"
|
|
2755
|
+
],
|
|
2756
|
+
"summary": "Select safe Chromium arguments for WebGPU playtests.",
|
|
2757
|
+
"supersedes": [],
|
|
2758
|
+
"symbol": "reconcileBrowserPointers"
|
|
2759
|
+
},
|
|
2760
|
+
{
|
|
2761
|
+
"constraints": ["an empty assertion set is a failure"],
|
|
2762
|
+
"example": "const scenario = recordToScenario(recording);",
|
|
2763
|
+
"importPath": "@threenative/playtest/runner",
|
|
2764
|
+
"kind": "function",
|
|
2765
|
+
"overrides": [],
|
|
2766
|
+
"package": "@threenative/playtest",
|
|
2767
|
+
"signature": "export function recordToScenario( value: unknown, scenarioPath = \"recording.json\", oracleValue?: unknown, ): IPlaytestScenario { … }",
|
|
2768
|
+
"situations": [
|
|
2769
|
+
"preserve a failing playtest as a replay fixture",
|
|
2770
|
+
"require assertions before recording a scenario"
|
|
2771
|
+
],
|
|
2772
|
+
"summary": "Convert captured runner observations into a replay scenario.",
|
|
2773
|
+
"supersedes": [],
|
|
2774
|
+
"symbol": "recordToScenario"
|
|
2775
|
+
},
|
|
2776
|
+
{
|
|
2777
|
+
"constraints": ["an empty assertion set is a failure"],
|
|
2778
|
+
"example": "const scenario = recordToScenario(recording);",
|
|
2779
|
+
"importPath": "@threenative/playtest/runner",
|
|
2780
|
+
"kind": "function",
|
|
2781
|
+
"overrides": [],
|
|
2782
|
+
"package": "@threenative/playtest",
|
|
2783
|
+
"signature": "export function requireAssertions( value: IPlaytestScenario[\"assert\"], scenarioPath: string, ): NonNullable<IPlaytestScenario[\"assert\"]> { … }",
|
|
2784
|
+
"situations": [
|
|
2785
|
+
"preserve a failing playtest as a replay fixture",
|
|
2786
|
+
"require assertions before recording a scenario"
|
|
2787
|
+
],
|
|
2788
|
+
"summary": "Convert captured runner observations into a replay scenario.",
|
|
2789
|
+
"supersedes": [],
|
|
2790
|
+
"symbol": "requireAssertions"
|
|
2791
|
+
},
|
|
2792
|
+
{
|
|
2793
|
+
"constraints": ["inspect the adapter name before claiming GPU proof"],
|
|
2794
|
+
"example": "const args = resolveBrowserArguments(undefined);",
|
|
2795
|
+
"importPath": "@threenative/playtest/runner",
|
|
2796
|
+
"kind": "function",
|
|
2797
|
+
"overrides": [],
|
|
2798
|
+
"package": "@threenative/playtest",
|
|
2799
|
+
"signature": "export function resolveBrowserArguments(browserArgs: readonly string[] | undefined): string[] { … }",
|
|
2800
|
+
"situations": [
|
|
2801
|
+
"run a browser playtest with Vulkan WebGPU",
|
|
2802
|
+
"reject a SwiftShader adapter as evidence"
|
|
2803
|
+
],
|
|
2804
|
+
"summary": "Select safe Chromium arguments for WebGPU playtests.",
|
|
2805
|
+
"supersedes": [],
|
|
2806
|
+
"symbol": "resolveBrowserArguments"
|
|
2807
|
+
},
|
|
2808
|
+
{
|
|
2809
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2810
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2811
|
+
"importPath": "@threenative/playtest/runner",
|
|
2812
|
+
"kind": "function",
|
|
2813
|
+
"overrides": [],
|
|
2814
|
+
"package": "@threenative/playtest",
|
|
2815
|
+
"signature": "export function resolveManagedServerCommand( config: IStandalonePlaytestConfig, dynamicPort?: number, ): string { … }",
|
|
2816
|
+
"situations": [
|
|
2817
|
+
"run a complete browser or device playtest",
|
|
2818
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2819
|
+
],
|
|
2820
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2821
|
+
"supersedes": [],
|
|
2822
|
+
"symbol": "resolveManagedServerCommand"
|
|
2823
|
+
},
|
|
2824
|
+
{
|
|
2825
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2826
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2827
|
+
"importPath": "@threenative/playtest/runner",
|
|
2828
|
+
"kind": "function",
|
|
2829
|
+
"overrides": [],
|
|
2830
|
+
"package": "@threenative/playtest",
|
|
2831
|
+
"signature": "export async function resolveManagedServerConfig( config: IStandalonePlaytestConfig, ): Promise<IStandalonePlaytestConfig> { … }",
|
|
2832
|
+
"situations": [
|
|
2833
|
+
"run a complete browser or device playtest",
|
|
2834
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2835
|
+
],
|
|
2836
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2837
|
+
"supersedes": [],
|
|
2838
|
+
"symbol": "resolveManagedServerConfig"
|
|
2839
|
+
},
|
|
2840
|
+
{
|
|
2841
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
2842
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
2843
|
+
"importPath": "@threenative/playtest/runner",
|
|
2844
|
+
"kind": "function",
|
|
2845
|
+
"overrides": [],
|
|
2846
|
+
"package": "@threenative/playtest",
|
|
2847
|
+
"signature": "export function rotatedTouchPosition(x: number, y: number, rotation: number): [number, number] { … }",
|
|
2848
|
+
"situations": [
|
|
2849
|
+
"run a scenario on an Android emulator or device",
|
|
2850
|
+
"parse Android console diagnostics"
|
|
2851
|
+
],
|
|
2852
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
2853
|
+
"supersedes": [],
|
|
2854
|
+
"symbol": "rotatedTouchPosition"
|
|
2855
|
+
},
|
|
2856
|
+
{
|
|
2857
|
+
"constraints": ["the app bundle and device transport must be prepared"],
|
|
2858
|
+
"example": "await runAndroidPlaytest(options);",
|
|
2859
|
+
"importPath": "@threenative/playtest/runner",
|
|
2860
|
+
"kind": "function",
|
|
2861
|
+
"overrides": [],
|
|
2862
|
+
"package": "@threenative/playtest",
|
|
2863
|
+
"signature": "export async function runAndroidPlaytest( config: IStandalonePlaytestConfig, dependencies: IAndroidPlaytestDependencies = { … }",
|
|
2864
|
+
"situations": [
|
|
2865
|
+
"execute a scenario on an Android target",
|
|
2866
|
+
"collect Android playtest artifacts"
|
|
2867
|
+
],
|
|
2868
|
+
"summary": "Run a playtest on Android through the configured device transport.",
|
|
2869
|
+
"supersedes": [],
|
|
2870
|
+
"symbol": "runAndroidPlaytest"
|
|
2871
|
+
},
|
|
2872
|
+
{
|
|
2873
|
+
"constraints": ["the desktop host must be built before launching"],
|
|
2874
|
+
"example": "await runDesktopPlaytest(options);",
|
|
2875
|
+
"importPath": "@threenative/playtest/runner",
|
|
2876
|
+
"kind": "function",
|
|
2877
|
+
"overrides": [],
|
|
2878
|
+
"package": "@threenative/playtest",
|
|
2879
|
+
"signature": "export async function runDesktopPlaytest( config: IStandalonePlaytestConfig, dependencies: IDesktopPlaytestDependencies = { … }",
|
|
2880
|
+
"situations": [
|
|
2881
|
+
"execute a scenario against the desktop host",
|
|
2882
|
+
"verify native desktop behavior from the same scenario"
|
|
2883
|
+
],
|
|
2884
|
+
"summary": "Run a desktop playtest and collect its report.",
|
|
2885
|
+
"supersedes": [],
|
|
2886
|
+
"symbol": "runDesktopPlaytest"
|
|
2887
|
+
},
|
|
2888
|
+
{
|
|
2889
|
+
"constraints": ["the app bundle and device transport must be prepared"],
|
|
2890
|
+
"example": "await runAndroidPlaytest(options);",
|
|
2891
|
+
"importPath": "@threenative/playtest/runner",
|
|
2892
|
+
"kind": "function",
|
|
2893
|
+
"overrides": [],
|
|
2894
|
+
"package": "@threenative/playtest",
|
|
2895
|
+
"signature": "export async function runDevicePlaytest( config: IStandalonePlaytestConfig, target: IDevicePlaytestTarget, ): Promise<IStandalonePlaytestReport> { … }",
|
|
2896
|
+
"situations": [
|
|
2897
|
+
"execute a scenario on an Android target",
|
|
2898
|
+
"collect Android playtest artifacts"
|
|
2899
|
+
],
|
|
2900
|
+
"summary": "Run a playtest on Android through the configured device transport.",
|
|
2901
|
+
"supersedes": [],
|
|
2902
|
+
"symbol": "runDevicePlaytest"
|
|
2903
|
+
},
|
|
2904
|
+
{
|
|
2905
|
+
"constraints": ["identify simulator versus physical transport in evidence"],
|
|
2906
|
+
"example": "await runIosPlaytest(options);",
|
|
2907
|
+
"importPath": "@threenative/playtest/runner",
|
|
2908
|
+
"kind": "function",
|
|
2909
|
+
"overrides": [],
|
|
2910
|
+
"package": "@threenative/playtest",
|
|
2911
|
+
"signature": "export async function runIosPlaytest( config: IStandalonePlaytestConfig, dependencies: IIosPlaytestDependencies = { … }",
|
|
2912
|
+
"situations": ["execute a scenario on an iOS target", "collect iOS playtest artifacts"],
|
|
2913
|
+
"summary": "Run a playtest on the iOS simulator or device transport.",
|
|
2914
|
+
"supersedes": [],
|
|
2915
|
+
"symbol": "runIosPlaytest"
|
|
2916
|
+
},
|
|
2917
|
+
{
|
|
2918
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2919
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2920
|
+
"importPath": "@threenative/playtest/runner",
|
|
2921
|
+
"kind": "function",
|
|
2922
|
+
"overrides": [],
|
|
2923
|
+
"package": "@threenative/playtest",
|
|
2924
|
+
"signature": "export async function runStandalonePlaytest( config: IStandalonePlaytestConfig, options: IStandalonePlaytestRunOptions = { … }",
|
|
2925
|
+
"situations": [
|
|
2926
|
+
"run a complete browser or device playtest",
|
|
2927
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2928
|
+
],
|
|
2929
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2930
|
+
"supersedes": [],
|
|
2931
|
+
"symbol": "runStandalonePlaytest"
|
|
2932
|
+
},
|
|
2933
|
+
{
|
|
2934
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2935
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2936
|
+
"importPath": "@threenative/playtest/runner",
|
|
2937
|
+
"kind": "function",
|
|
2938
|
+
"overrides": [],
|
|
2939
|
+
"package": "@threenative/playtest",
|
|
2940
|
+
"signature": "export async function runStandalonePlaytests( config: IStandalonePlaytestConfig, ): Promise<readonly IStandalonePlaytestReport[]> { … }",
|
|
2941
|
+
"situations": [
|
|
2942
|
+
"run a complete browser or device playtest",
|
|
2943
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2944
|
+
],
|
|
2945
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2946
|
+
"supersedes": [],
|
|
2947
|
+
"symbol": "runStandalonePlaytests"
|
|
2948
|
+
},
|
|
2949
|
+
{
|
|
2950
|
+
"constraints": ["inspect the adapter name before claiming GPU proof"],
|
|
2951
|
+
"example": "const args = resolveBrowserArguments(undefined);",
|
|
2952
|
+
"importPath": "@threenative/playtest/runner",
|
|
2953
|
+
"kind": "function",
|
|
2954
|
+
"overrides": [],
|
|
2955
|
+
"package": "@threenative/playtest",
|
|
2956
|
+
"signature": "export function softwareAdapterName(adapter: Readonly<Record<string, string>> | undefined): string | undefined { … }",
|
|
2957
|
+
"situations": [
|
|
2958
|
+
"run a browser playtest with Vulkan WebGPU",
|
|
2959
|
+
"reject a SwiftShader adapter as evidence"
|
|
2960
|
+
],
|
|
2961
|
+
"summary": "Select safe Chromium arguments for WebGPU playtests.",
|
|
2962
|
+
"supersedes": [],
|
|
2963
|
+
"symbol": "softwareAdapterName"
|
|
2964
|
+
},
|
|
2965
|
+
{
|
|
2966
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
2967
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
2968
|
+
"importPath": "@threenative/playtest/runner",
|
|
2969
|
+
"kind": "function",
|
|
2970
|
+
"overrides": [],
|
|
2971
|
+
"package": "@threenative/playtest",
|
|
2972
|
+
"signature": "export function substituteManagedPort(command: string, port: number): string { … }",
|
|
2973
|
+
"situations": [
|
|
2974
|
+
"run a complete browser or device playtest",
|
|
2975
|
+
"capture diagnostics and screenshots from a managed server"
|
|
2976
|
+
],
|
|
2977
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
2978
|
+
"supersedes": [],
|
|
2979
|
+
"symbol": "substituteManagedPort"
|
|
2980
|
+
},
|
|
2981
|
+
{
|
|
2982
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
2983
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
2984
|
+
"importPath": "@threenative/playtest/runner",
|
|
2985
|
+
"kind": "function",
|
|
2986
|
+
"overrides": [],
|
|
2987
|
+
"package": "@threenative/playtest",
|
|
2988
|
+
"signature": "export function tapCommand(x: number, y: number): string[] { … }",
|
|
2989
|
+
"situations": [
|
|
2990
|
+
"run a scenario on an Android emulator or device",
|
|
2991
|
+
"parse Android console diagnostics"
|
|
2992
|
+
],
|
|
2993
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
2994
|
+
"supersedes": [],
|
|
2995
|
+
"symbol": "tapCommand"
|
|
2996
|
+
},
|
|
2997
|
+
{
|
|
2998
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
2999
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
3000
|
+
"importPath": "@threenative/playtest/runner",
|
|
3001
|
+
"kind": "function",
|
|
3002
|
+
"overrides": [],
|
|
3003
|
+
"package": "@threenative/playtest",
|
|
3004
|
+
"signature": "export function touchRotationFromWindowDump(dump: string): number | undefined { … }",
|
|
3005
|
+
"situations": [
|
|
3006
|
+
"run a scenario on an Android emulator or device",
|
|
3007
|
+
"parse Android console diagnostics"
|
|
3008
|
+
],
|
|
3009
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
3010
|
+
"supersedes": [],
|
|
3011
|
+
"symbol": "touchRotationFromWindowDump"
|
|
3012
|
+
},
|
|
3013
|
+
{
|
|
3014
|
+
"constraints": ["paths stay inside the managed artifact directory"],
|
|
3015
|
+
"example": "const paths = deviceMailboxPaths(projectRoot);",
|
|
3016
|
+
"importPath": "@threenative/playtest/runner",
|
|
3017
|
+
"kind": "function",
|
|
3018
|
+
"overrides": [],
|
|
3019
|
+
"package": "@threenative/playtest",
|
|
3020
|
+
"signature": "export function validateDeviceEndpoint(value: string): URL { … }",
|
|
3021
|
+
"situations": [
|
|
3022
|
+
"connect a native host to the playtest runner",
|
|
3023
|
+
"validate an Android or iOS device endpoint"
|
|
3024
|
+
],
|
|
3025
|
+
"summary": "Resolve a native device transport and its mailbox paths.",
|
|
3026
|
+
"supersedes": [],
|
|
3027
|
+
"symbol": "validateDeviceEndpoint"
|
|
3028
|
+
},
|
|
3029
|
+
{
|
|
3030
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
3031
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
3032
|
+
"importPath": "@threenative/playtest/runner",
|
|
3033
|
+
"kind": "function",
|
|
3034
|
+
"overrides": [],
|
|
3035
|
+
"package": "@threenative/playtest",
|
|
3036
|
+
"signature": "export function viewportPresentationCommands( viewport: { … }",
|
|
3037
|
+
"situations": [
|
|
3038
|
+
"run a scenario on an Android emulator or device",
|
|
3039
|
+
"parse Android console diagnostics"
|
|
3040
|
+
],
|
|
3041
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
3042
|
+
"supersedes": [],
|
|
3043
|
+
"symbol": "viewportPresentationCommands"
|
|
3044
|
+
},
|
|
3045
|
+
{
|
|
3046
|
+
"constraints": ["Android evidence must name its target and transport"],
|
|
3047
|
+
"example": "const adb = discoverAdb(process.env);",
|
|
3048
|
+
"importPath": "@threenative/playtest/runner",
|
|
3049
|
+
"kind": "function",
|
|
3050
|
+
"overrides": [],
|
|
3051
|
+
"package": "@threenative/playtest",
|
|
3052
|
+
"signature": "export function viewportRestoreCommands(): string[][] { … }",
|
|
3053
|
+
"situations": [
|
|
3054
|
+
"run a scenario on an Android emulator or device",
|
|
3055
|
+
"parse Android console diagnostics"
|
|
3056
|
+
],
|
|
3057
|
+
"summary": "Drive and inspect Android playtest transport.",
|
|
3058
|
+
"supersedes": [],
|
|
3059
|
+
"symbol": "viewportRestoreCommands"
|
|
3060
|
+
},
|
|
3061
|
+
{
|
|
3062
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
3063
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
3064
|
+
"importPath": "@threenative/playtest/runner",
|
|
3065
|
+
"kind": "function",
|
|
3066
|
+
"overrides": [],
|
|
3067
|
+
"package": "@threenative/playtest",
|
|
3068
|
+
"signature": "export async function writeCaptureProvenance( artifactDirectory: string, provenance: IPlaytestCaptureProvenance, ): Promise<void> { … }",
|
|
3069
|
+
"situations": [
|
|
3070
|
+
"run a complete browser or device playtest",
|
|
3071
|
+
"capture diagnostics and screenshots from a managed server"
|
|
3072
|
+
],
|
|
3073
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
3074
|
+
"supersedes": [],
|
|
3075
|
+
"symbol": "writeCaptureProvenance"
|
|
3076
|
+
},
|
|
3077
|
+
{
|
|
3078
|
+
"constraints": ["missing observations and malformed assertions fail closed"],
|
|
3079
|
+
"example": "const report = await runStandalonePlaytest(options);",
|
|
3080
|
+
"importPath": "@threenative/playtest/runner",
|
|
3081
|
+
"kind": "function",
|
|
3082
|
+
"overrides": [],
|
|
3083
|
+
"package": "@threenative/playtest",
|
|
3084
|
+
"signature": "export async function writeObservationArtifacts( artifactDirectory: string, requested: IPlaytestArtifactRequest | undefined, observations: { … }",
|
|
3085
|
+
"situations": [
|
|
3086
|
+
"run a complete browser or device playtest",
|
|
3087
|
+
"capture diagnostics and screenshots from a managed server"
|
|
3088
|
+
],
|
|
3089
|
+
"summary": "Execute scenario steps, assertions, and evidence capture.",
|
|
3090
|
+
"supersedes": [],
|
|
3091
|
+
"symbol": "writeObservationArtifacts"
|
|
3092
|
+
},
|
|
3093
|
+
{
|
|
3094
|
+
"constraints": ["simulator evidence does not claim physical-device proof"],
|
|
3095
|
+
"example": "const driver = new XcrunIosDriver(options);",
|
|
3096
|
+
"importPath": "@threenative/playtest/runner",
|
|
3097
|
+
"kind": "class",
|
|
3098
|
+
"overrides": [],
|
|
3099
|
+
"package": "@threenative/playtest",
|
|
3100
|
+
"signature": "export class XcrunIosDriver implements IDevicePlaytestDriver { … }",
|
|
3101
|
+
"situations": [
|
|
3102
|
+
"run a scenario on the iOS simulator",
|
|
3103
|
+
"parse the launched native process identifier"
|
|
3104
|
+
],
|
|
3105
|
+
"summary": "Drive and inspect iOS simulator playtest transport.",
|
|
3106
|
+
"supersedes": [],
|
|
3107
|
+
"symbol": "XcrunIosDriver"
|
|
3108
|
+
},
|
|
3109
|
+
{
|
|
3110
|
+
"constraints": ["use measured input rather than visual guesses"],
|
|
3111
|
+
"example": "const advice = adviseThreeRenderWorkload(input);",
|
|
3112
|
+
"importPath": "@threenative/playtest/three",
|
|
3113
|
+
"kind": "function",
|
|
3114
|
+
"overrides": [],
|
|
3115
|
+
"package": "@threenative/playtest",
|
|
3116
|
+
"signature": "export function adviseThreeRenderWorkload(input: IRenderAdvisorInput): IRenderAdvisorReport { … }",
|
|
3117
|
+
"situations": [
|
|
3118
|
+
"diagnose a slow Three.js scene",
|
|
3119
|
+
"choose a render optimization from observed workload data"
|
|
3120
|
+
],
|
|
3121
|
+
"summary": "Explain which render workloads should be collapsed or retained.",
|
|
3122
|
+
"supersedes": [],
|
|
3123
|
+
"symbol": "adviseThreeRenderWorkload"
|
|
3124
|
+
},
|
|
3125
|
+
{
|
|
3126
|
+
"constraints": ["use the device transport selected by the runner"],
|
|
3127
|
+
"example": "const connection = await connectDevicePlaytestBridge();",
|
|
3128
|
+
"importPath": "@threenative/playtest/three",
|
|
3129
|
+
"kind": "function",
|
|
3130
|
+
"overrides": [],
|
|
3131
|
+
"package": "@threenative/playtest",
|
|
3132
|
+
"signature": "export function connectDevicePlaytestBridge( bridge: IPlaytestBridgeV1, endpoint: string, ): IDeviceBridgeInstallation { … }",
|
|
3133
|
+
"situations": [
|
|
3134
|
+
"run the same playtest on an Android or iOS target",
|
|
3135
|
+
"read the device bridge endpoint"
|
|
3136
|
+
],
|
|
3137
|
+
"summary": "Connect a device-hosted game to the playtest bridge.",
|
|
3138
|
+
"supersedes": [],
|
|
3139
|
+
"symbol": "connectDevicePlaytestBridge"
|
|
3140
|
+
},
|
|
3141
|
+
{
|
|
3142
|
+
"constraints": ["install once before the runner connects"],
|
|
3143
|
+
"example": "const bridge = installThreePlaytestBridge(options);",
|
|
3144
|
+
"importPath": "@threenative/playtest/three",
|
|
3145
|
+
"kind": "function",
|
|
3146
|
+
"overrides": [],
|
|
3147
|
+
"package": "@threenative/playtest",
|
|
3148
|
+
"signature": "export function installThreePlaytestBridge(options: IThreePlaytestBridgeOptions): IThreePlaytestBridgeInstallation { … }",
|
|
3149
|
+
"situations": [
|
|
3150
|
+
"expose a non-ThreeNative game to the scenario runner",
|
|
3151
|
+
"add semantic observations to a browser playtest"
|
|
3152
|
+
],
|
|
3153
|
+
"summary": "Install the playtest observation bridge for a plain Three.js game.",
|
|
3154
|
+
"supersedes": [],
|
|
3155
|
+
"symbol": "installThreePlaytestBridge"
|
|
3156
|
+
},
|
|
3157
|
+
{
|
|
3158
|
+
"constraints": ["use the device transport selected by the runner"],
|
|
3159
|
+
"example": "const connection = await connectDevicePlaytestBridge();",
|
|
3160
|
+
"importPath": "@threenative/playtest/three",
|
|
3161
|
+
"kind": "function",
|
|
3162
|
+
"overrides": [],
|
|
3163
|
+
"package": "@threenative/playtest",
|
|
3164
|
+
"signature": "export function readPlaytestEndpoint(): string | undefined { … }",
|
|
3165
|
+
"situations": [
|
|
3166
|
+
"run the same playtest on an Android or iOS target",
|
|
3167
|
+
"read the device bridge endpoint"
|
|
3168
|
+
],
|
|
3169
|
+
"summary": "Connect a device-hosted game to the playtest bridge.",
|
|
3170
|
+
"supersedes": [],
|
|
3171
|
+
"symbol": "readPlaytestEndpoint"
|
|
3172
|
+
},
|
|
3173
|
+
{
|
|
3174
|
+
"constraints": ["keep recorder limits within the documented caps"],
|
|
3175
|
+
"example": "const physics = new ThreePlaytestPhysicsRecorder();",
|
|
3176
|
+
"importPath": "@threenative/playtest/three",
|
|
3177
|
+
"kind": "class",
|
|
3178
|
+
"overrides": [],
|
|
3179
|
+
"package": "@threenative/playtest",
|
|
3180
|
+
"signature": "export class ThreePlaytestPhysicsRecorder { … }",
|
|
3181
|
+
"situations": [
|
|
3182
|
+
"assert physics contacts in a plain Three.js game",
|
|
3183
|
+
"capture bounded body state for a scenario"
|
|
3184
|
+
],
|
|
3185
|
+
"summary": "Record Three.js physics bodies for playtest observations.",
|
|
3186
|
+
"supersedes": [],
|
|
3187
|
+
"symbol": "ThreePlaytestPhysicsRecorder"
|
|
3188
|
+
},
|
|
3189
|
+
{
|
|
3190
|
+
"constraints": [
|
|
3191
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3192
|
+
],
|
|
3193
|
+
"example": "gradualBackground(...)",
|
|
3194
|
+
"importPath": "@threenative/template/starter/src/render/effects/gradualBackground",
|
|
3195
|
+
"kind": "function",
|
|
3196
|
+
"overrides": [],
|
|
3197
|
+
"package": "template:starter",
|
|
3198
|
+
"signature": "function gradualBackground",
|
|
3199
|
+
"situations": ["grade a background by distance"],
|
|
3200
|
+
"supersedes": [],
|
|
3201
|
+
"summary": "ThreeNative equivalent for realism-effects gradualBackground.",
|
|
3202
|
+
"symbol": "gradualBackground"
|
|
3203
|
+
},
|
|
3204
|
+
{
|
|
3205
|
+
"constraints": [
|
|
3206
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3207
|
+
],
|
|
3208
|
+
"example": "lensDistortion(...)",
|
|
3209
|
+
"importPath": "@threenative/template/starter/src/render/effects/lensDistortion",
|
|
3210
|
+
"kind": "function",
|
|
3211
|
+
"overrides": [],
|
|
3212
|
+
"package": "template:starter",
|
|
3213
|
+
"signature": "function lensDistortion",
|
|
3214
|
+
"situations": ["warp the image with radial lens distortion"],
|
|
3215
|
+
"supersedes": [],
|
|
3216
|
+
"summary": "ThreeNative equivalent for realism-effects lensDistortion.",
|
|
3217
|
+
"symbol": "lensDistortion"
|
|
3218
|
+
},
|
|
3219
|
+
{
|
|
3220
|
+
"constraints": [
|
|
3221
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3222
|
+
],
|
|
3223
|
+
"example": "sparkle(...)",
|
|
3224
|
+
"importPath": "@threenative/template/starter/src/render/effects/sparkle",
|
|
3225
|
+
"kind": "function",
|
|
3226
|
+
"overrides": [],
|
|
3227
|
+
"package": "template:starter",
|
|
3228
|
+
"signature": "function sparkle",
|
|
3229
|
+
"situations": ["add glints to bright highlights"],
|
|
3230
|
+
"supersedes": [],
|
|
3231
|
+
"summary": "ThreeNative equivalent for realism-effects sparkle.",
|
|
3232
|
+
"symbol": "sparkle"
|
|
3233
|
+
},
|
|
3234
|
+
{
|
|
3235
|
+
"constraints": [],
|
|
3236
|
+
"example": "<DebugOverlay game={game} />",
|
|
3237
|
+
"importPath": "@threenative/ui",
|
|
3238
|
+
"kind": "function",
|
|
3239
|
+
"overrides": [],
|
|
3240
|
+
"package": "@threenative/ui",
|
|
3241
|
+
"signature": "export function DebugOverlay() { … }",
|
|
3242
|
+
"situations": [
|
|
3243
|
+
"display runtime and playtest diagnostics in a React HUD",
|
|
3244
|
+
"inspect a game without changing its scene"
|
|
3245
|
+
],
|
|
3246
|
+
"summary": "Show framework diagnostics while developing a game.",
|
|
3247
|
+
"supersedes": [],
|
|
3248
|
+
"symbol": "DebugOverlay"
|
|
3249
|
+
},
|
|
3250
|
+
{
|
|
3251
|
+
"constraints": ["keep the portable game entry free of React DOM code"],
|
|
3252
|
+
"example": "<GameCanvas game={game} />",
|
|
3253
|
+
"importPath": "@threenative/ui",
|
|
3254
|
+
"kind": "function",
|
|
3255
|
+
"overrides": [],
|
|
3256
|
+
"package": "@threenative/ui",
|
|
3257
|
+
"signature": "export function GameCanvas<TState extends Record<string, unknown>, TPhysics>( { … }",
|
|
3258
|
+
"situations": [
|
|
3259
|
+
"add a game viewport to a React application",
|
|
3260
|
+
"connect a game canvas to the web UI shell"
|
|
3261
|
+
],
|
|
3262
|
+
"summary": "Mount a ThreeNative game in a React canvas.",
|
|
3263
|
+
"supersedes": [],
|
|
3264
|
+
"symbol": "GameCanvas"
|
|
3265
|
+
},
|
|
3266
|
+
{
|
|
3267
|
+
"constraints": ["mark every control the player touches with data-tn-interactive"],
|
|
3268
|
+
"example": "<UiLayer><Hud /></UiLayer>",
|
|
3269
|
+
"importPath": "@threenative/ui",
|
|
3270
|
+
"kind": "function",
|
|
3271
|
+
"overrides": [],
|
|
3272
|
+
"package": "@threenative/ui",
|
|
3273
|
+
"signature": "export function UiLayer( { … }",
|
|
3274
|
+
"situations": [
|
|
3275
|
+
"write one HUD that looks the same on the web build and on a phone",
|
|
3276
|
+
"mount a React UI over the game surface on Android or iOS"
|
|
3277
|
+
],
|
|
3278
|
+
"summary": "Render a game's UI so the same source runs on web and on every native target.",
|
|
3279
|
+
"supersedes": [],
|
|
3280
|
+
"symbol": "UiLayer"
|
|
3281
|
+
},
|
|
3282
|
+
{
|
|
3283
|
+
"constraints": ["use this hook only from the web UI entry"],
|
|
3284
|
+
"example": "const score = useGameState(game, (state) => state.score);",
|
|
3285
|
+
"importPath": "@threenative/ui",
|
|
3286
|
+
"kind": "function",
|
|
3287
|
+
"overrides": [],
|
|
3288
|
+
"package": "@threenative/ui",
|
|
3289
|
+
"signature": "export function useGameState<TState extends Record<string, unknown>, TPhysics, TSelected>( game: IGame<TState, TPhysics>, selector: GameSelector<TState, TSelected>, ): TSelected;",
|
|
3290
|
+
"situations": [
|
|
3291
|
+
"bind a HUD component to game state",
|
|
3292
|
+
"select a slice of state for a React panel"
|
|
3293
|
+
],
|
|
3294
|
+
"summary": "Read throttled game state from React.",
|
|
3295
|
+
"supersedes": [],
|
|
3296
|
+
"symbol": "useGameState"
|
|
3297
|
+
},
|
|
3298
|
+
{
|
|
3299
|
+
"constraints": ["the game decides what each intent name means; it may ignore one"],
|
|
3300
|
+
"example": "const send = useUiIntent(); send(\"restart\");",
|
|
3301
|
+
"importPath": "@threenative/ui",
|
|
3302
|
+
"kind": "function",
|
|
3303
|
+
"overrides": [],
|
|
3304
|
+
"package": "@threenative/ui",
|
|
3305
|
+
"signature": "export function useUiIntent(): (intent: string, payload?: unknown) => void { … }",
|
|
3306
|
+
"situations": [
|
|
3307
|
+
"wire a Restart button in a HUD to the running game",
|
|
3308
|
+
"pause a game from a menu rendered over its surface"
|
|
3309
|
+
],
|
|
3310
|
+
"summary": "Send a player action from the UI back to the game.",
|
|
3311
|
+
"supersedes": [],
|
|
3312
|
+
"symbol": "useUiIntent"
|
|
3313
|
+
},
|
|
3314
|
+
{
|
|
3315
|
+
"constraints": ["returns undefined until the game publishes its first state"],
|
|
3316
|
+
"example": "const score = useUiState((state) => state.score);",
|
|
3317
|
+
"importPath": "@threenative/ui",
|
|
3318
|
+
"kind": "function",
|
|
3319
|
+
"overrides": [],
|
|
3320
|
+
"package": "@threenative/ui",
|
|
3321
|
+
"signature": "export function useUiState<TState extends object>(): TState | undefined;",
|
|
3322
|
+
"situations": [
|
|
3323
|
+
"bind a HUD to game state on web and native alike",
|
|
3324
|
+
"show score or health in a UI rendered over the game surface"
|
|
3325
|
+
],
|
|
3326
|
+
"summary": "Read the game's published state from a UI that may be in another process.",
|
|
3327
|
+
"supersedes": [],
|
|
3328
|
+
"symbol": "useUiState"
|
|
3329
|
+
},
|
|
3330
|
+
{
|
|
3331
|
+
"constraints": [
|
|
3332
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3333
|
+
],
|
|
3334
|
+
"example": "DenoiseNode(...)",
|
|
3335
|
+
"importPath": "three/addons/tsl/display/DenoiseNode.js",
|
|
3336
|
+
"kind": "class",
|
|
3337
|
+
"overrides": [],
|
|
3338
|
+
"package": "three",
|
|
3339
|
+
"signature": "class DenoiseNode",
|
|
3340
|
+
"situations": ["denoise a noisy screen-space pass"],
|
|
3341
|
+
"supersedes": [],
|
|
3342
|
+
"summary": "ThreeNative equivalent for realism-effects DenoiseNode.",
|
|
3343
|
+
"symbol": "DenoiseNode"
|
|
3344
|
+
},
|
|
3345
|
+
{
|
|
3346
|
+
"constraints": [
|
|
3347
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3348
|
+
],
|
|
3349
|
+
"example": "motionBlur(...)",
|
|
3350
|
+
"importPath": "three/addons/tsl/display/MotionBlur.js",
|
|
3351
|
+
"kind": "function",
|
|
3352
|
+
"overrides": [],
|
|
3353
|
+
"package": "three",
|
|
3354
|
+
"signature": "function motionBlur",
|
|
3355
|
+
"situations": ["blur motion using a velocity buffer"],
|
|
3356
|
+
"supersedes": [],
|
|
3357
|
+
"summary": "ThreeNative equivalent for realism-effects motionBlur.",
|
|
3358
|
+
"symbol": "motionBlur"
|
|
3359
|
+
},
|
|
3360
|
+
{
|
|
3361
|
+
"constraints": [
|
|
3362
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3363
|
+
],
|
|
3364
|
+
"example": "RecurrentDenoiseNode(...)",
|
|
3365
|
+
"importPath": "three/addons/tsl/display/RecurrentDenoiseNode.js",
|
|
3366
|
+
"kind": "class",
|
|
3367
|
+
"overrides": [],
|
|
3368
|
+
"package": "three",
|
|
3369
|
+
"signature": "class RecurrentDenoiseNode",
|
|
3370
|
+
"situations": ["denoise a noisy screen-space pass"],
|
|
3371
|
+
"supersedes": [],
|
|
3372
|
+
"summary": "ThreeNative equivalent for realism-effects RecurrentDenoiseNode.",
|
|
3373
|
+
"symbol": "RecurrentDenoiseNode"
|
|
3374
|
+
},
|
|
3375
|
+
{
|
|
3376
|
+
"constraints": [
|
|
3377
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3378
|
+
],
|
|
3379
|
+
"example": "SharpenNode(...)",
|
|
3380
|
+
"importPath": "three/addons/tsl/display/SharpenNode.js",
|
|
3381
|
+
"kind": "class",
|
|
3382
|
+
"overrides": [],
|
|
3383
|
+
"package": "three",
|
|
3384
|
+
"signature": "class SharpenNode",
|
|
3385
|
+
"situations": ["make the image sharper"],
|
|
3386
|
+
"supersedes": [],
|
|
3387
|
+
"summary": "ThreeNative equivalent for realism-effects SharpenNode.",
|
|
3388
|
+
"symbol": "SharpenNode"
|
|
3389
|
+
},
|
|
3390
|
+
{
|
|
3391
|
+
"constraints": [
|
|
3392
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3393
|
+
],
|
|
3394
|
+
"example": "SSAAPassNode(...)",
|
|
3395
|
+
"importPath": "three/addons/tsl/display/SSAAPassNode.js",
|
|
3396
|
+
"kind": "class",
|
|
3397
|
+
"overrides": [],
|
|
3398
|
+
"package": "three",
|
|
3399
|
+
"signature": "class SSAAPassNode",
|
|
3400
|
+
"situations": ["anti-alias still and moving scenes"],
|
|
3401
|
+
"supersedes": [],
|
|
3402
|
+
"summary": "ThreeNative equivalent for realism-effects SSAAPassNode.",
|
|
3403
|
+
"symbol": "SSAAPassNode"
|
|
3404
|
+
},
|
|
3405
|
+
{
|
|
3406
|
+
"constraints": [
|
|
3407
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3408
|
+
],
|
|
3409
|
+
"example": "SSGINode(...)",
|
|
3410
|
+
"importPath": "three/addons/tsl/display/SSGINode.js",
|
|
3411
|
+
"kind": "class",
|
|
3412
|
+
"overrides": [],
|
|
3413
|
+
"package": "three",
|
|
3414
|
+
"signature": "class SSGINode",
|
|
3415
|
+
"situations": ["add screen-space global illumination"],
|
|
3416
|
+
"supersedes": [],
|
|
3417
|
+
"summary": "ThreeNative equivalent for realism-effects SSGINode.",
|
|
3418
|
+
"symbol": "SSGINode"
|
|
3419
|
+
},
|
|
3420
|
+
{
|
|
3421
|
+
"constraints": [
|
|
3422
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3423
|
+
],
|
|
3424
|
+
"example": "SSRNode(...)",
|
|
3425
|
+
"importPath": "three/addons/tsl/display/SSRNode.js",
|
|
3426
|
+
"kind": "class",
|
|
3427
|
+
"overrides": [],
|
|
3428
|
+
"package": "three",
|
|
3429
|
+
"signature": "class SSRNode",
|
|
3430
|
+
"situations": ["add screen-space reflections"],
|
|
3431
|
+
"supersedes": [],
|
|
3432
|
+
"summary": "ThreeNative equivalent for realism-effects SSRNode.",
|
|
3433
|
+
"symbol": "SSRNode"
|
|
3434
|
+
},
|
|
3435
|
+
{
|
|
3436
|
+
"constraints": [
|
|
3437
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3438
|
+
],
|
|
3439
|
+
"example": "TemporalReprojectNode(...)",
|
|
3440
|
+
"importPath": "three/addons/tsl/display/TemporalReprojectNode.js",
|
|
3441
|
+
"kind": "class",
|
|
3442
|
+
"overrides": [],
|
|
3443
|
+
"package": "three",
|
|
3444
|
+
"signature": "class TemporalReprojectNode",
|
|
3445
|
+
"situations": ["reproject a temporal history"],
|
|
3446
|
+
"supersedes": [],
|
|
3447
|
+
"summary": "ThreeNative equivalent for realism-effects TemporalReprojectNode.",
|
|
3448
|
+
"symbol": "TemporalReprojectNode"
|
|
3449
|
+
},
|
|
3450
|
+
{
|
|
3451
|
+
"constraints": [
|
|
3452
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3453
|
+
],
|
|
3454
|
+
"example": "TRAANode(...)",
|
|
3455
|
+
"importPath": "three/addons/tsl/display/TRAANode.js",
|
|
3456
|
+
"kind": "class",
|
|
3457
|
+
"overrides": [],
|
|
3458
|
+
"package": "three",
|
|
3459
|
+
"signature": "class TRAANode",
|
|
3460
|
+
"situations": ["temporally resolve a moving image"],
|
|
3461
|
+
"supersedes": [],
|
|
3462
|
+
"summary": "ThreeNative equivalent for realism-effects TRAANode.",
|
|
3463
|
+
"symbol": "TRAANode"
|
|
3464
|
+
},
|
|
3465
|
+
{
|
|
3466
|
+
"constraints": [
|
|
3467
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3468
|
+
],
|
|
3469
|
+
"example": "depth(...)",
|
|
3470
|
+
"importPath": "three/tsl",
|
|
3471
|
+
"kind": "function",
|
|
3472
|
+
"overrides": [],
|
|
3473
|
+
"package": "three",
|
|
3474
|
+
"signature": "function depth",
|
|
3475
|
+
"situations": ["provide depth to screen-space effects"],
|
|
3476
|
+
"supersedes": [],
|
|
3477
|
+
"summary": "ThreeNative equivalent for realism-effects depth.",
|
|
3478
|
+
"symbol": "depth"
|
|
3479
|
+
},
|
|
3480
|
+
{
|
|
3481
|
+
"constraints": [
|
|
3482
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3483
|
+
],
|
|
3484
|
+
"example": "mrt(...)",
|
|
3485
|
+
"importPath": "three/tsl",
|
|
3486
|
+
"kind": "function",
|
|
3487
|
+
"overrides": [],
|
|
3488
|
+
"package": "three",
|
|
3489
|
+
"signature": "function mrt",
|
|
3490
|
+
"situations": ["provision velocity, normal, and depth render targets"],
|
|
3491
|
+
"supersedes": [],
|
|
3492
|
+
"summary": "ThreeNative equivalent for realism-effects mrt.",
|
|
3493
|
+
"symbol": "mrt"
|
|
3494
|
+
},
|
|
3495
|
+
{
|
|
3496
|
+
"constraints": [
|
|
3497
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3498
|
+
],
|
|
3499
|
+
"example": "normal(...)",
|
|
3500
|
+
"importPath": "three/tsl",
|
|
3501
|
+
"kind": "function",
|
|
3502
|
+
"overrides": [],
|
|
3503
|
+
"package": "three",
|
|
3504
|
+
"signature": "function normal",
|
|
3505
|
+
"situations": ["provide normals to screen-space effects"],
|
|
3506
|
+
"supersedes": [],
|
|
3507
|
+
"summary": "ThreeNative equivalent for realism-effects normal.",
|
|
3508
|
+
"symbol": "normal"
|
|
3509
|
+
},
|
|
3510
|
+
{
|
|
3511
|
+
"constraints": [
|
|
3512
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3513
|
+
],
|
|
3514
|
+
"example": "velocity(...)",
|
|
3515
|
+
"importPath": "three/tsl",
|
|
3516
|
+
"kind": "function",
|
|
3517
|
+
"overrides": [],
|
|
3518
|
+
"package": "three",
|
|
3519
|
+
"signature": "function velocity",
|
|
3520
|
+
"situations": ["provide motion vectors to temporal effects"],
|
|
3521
|
+
"supersedes": [],
|
|
3522
|
+
"summary": "ThreeNative equivalent for realism-effects velocity.",
|
|
3523
|
+
"symbol": "velocity"
|
|
3524
|
+
},
|
|
3525
|
+
{
|
|
3526
|
+
"constraints": [
|
|
3527
|
+
"Use the running WebGPU renderer and keep appearance choices in template render source."
|
|
3528
|
+
],
|
|
3529
|
+
"example": "VelocityNode(...)",
|
|
3530
|
+
"importPath": "three/webgpu",
|
|
3531
|
+
"kind": "class",
|
|
3532
|
+
"overrides": [],
|
|
3533
|
+
"package": "three",
|
|
3534
|
+
"signature": "class VelocityNode",
|
|
3535
|
+
"situations": ["provide motion vectors to temporal effects"],
|
|
3536
|
+
"supersedes": [],
|
|
3537
|
+
"summary": "ThreeNative equivalent for realism-effects VelocityNode.",
|
|
3538
|
+
"symbol": "VelocityNode"
|
|
3539
|
+
}
|
|
3540
|
+
],
|
|
3541
|
+
"version": 1
|
|
3542
|
+
}
|