create-aura3d 1.4.2 → 1.4.4
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/README.md +2 -2
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/showcase-spec-artifacts.d.ts +5 -0
- package/dist/showcase-spec-artifacts.d.ts.map +1 -1
- package/dist/showcase-spec-artifacts.js +11 -2
- package/dist/showcase-spec-artifacts.js.map +1 -1
- package/dist/showcase-spec-asset-pair-composition.d.ts +116 -0
- package/dist/showcase-spec-asset-pair-composition.d.ts.map +1 -0
- package/dist/showcase-spec-asset-pair-composition.js +336 -0
- package/dist/showcase-spec-asset-pair-composition.js.map +1 -0
- package/dist/showcase-spec-compiler.d.ts.map +1 -1
- package/dist/showcase-spec-compiler.js +149 -10
- package/dist/showcase-spec-compiler.js.map +1 -1
- package/dist/showcase-spec-composition-evidence.d.ts +14 -0
- package/dist/showcase-spec-composition-evidence.d.ts.map +1 -0
- package/dist/showcase-spec-composition-evidence.js +123 -0
- package/dist/showcase-spec-composition-evidence.js.map +1 -0
- package/dist/showcase-spec-evidence.js +50 -1
- package/dist/showcase-spec-evidence.js.map +1 -1
- package/dist/showcase-spec-game-geometry-extractor.d.ts +4 -2
- package/dist/showcase-spec-game-geometry-extractor.d.ts.map +1 -1
- package/dist/showcase-spec-game-geometry-extractor.js +248 -26
- package/dist/showcase-spec-game-geometry-extractor.js.map +1 -1
- package/dist/showcase-spec-game-geometry-probe.d.ts +20 -0
- package/dist/showcase-spec-game-geometry-probe.d.ts.map +1 -0
- package/dist/showcase-spec-game-geometry-probe.js +16 -0
- package/dist/showcase-spec-game-geometry-probe.js.map +1 -0
- package/dist/showcase-spec-game-replacement-evidence.js +7 -3
- package/dist/showcase-spec-game-replacement-evidence.js.map +1 -1
- package/dist/showcase-spec-game-scene-scale.d.ts +10 -0
- package/dist/showcase-spec-game-scene-scale.d.ts.map +1 -0
- package/dist/showcase-spec-game-scene-scale.js +71 -0
- package/dist/showcase-spec-game-scene-scale.js.map +1 -0
- package/dist/showcase-spec-game-template-evidence.d.ts +10 -0
- package/dist/showcase-spec-game-template-evidence.d.ts.map +1 -1
- package/dist/showcase-spec-game-template-evidence.js +48 -5
- package/dist/showcase-spec-game-template-evidence.js.map +1 -1
- package/dist/showcase-spec-gameplay-evidence.js +4 -3
- package/dist/showcase-spec-gameplay-evidence.js.map +1 -1
- package/dist/showcase-spec-parser.d.ts.map +1 -1
- package/dist/showcase-spec-parser.js +3 -0
- package/dist/showcase-spec-parser.js.map +1 -1
- package/dist/showcase-spec-platformer-artifacts.d.ts +1 -0
- package/dist/showcase-spec-platformer-artifacts.d.ts.map +1 -1
- package/dist/showcase-spec-platformer-artifacts.js +164 -43
- package/dist/showcase-spec-platformer-artifacts.js.map +1 -1
- package/dist/showcase-spec-racing-artifacts.d.ts +1 -0
- package/dist/showcase-spec-racing-artifacts.d.ts.map +1 -1
- package/dist/showcase-spec-racing-artifacts.js +203 -31
- package/dist/showcase-spec-racing-artifacts.js.map +1 -1
- package/dist/showcase-spec-replacement-candidates.js +2 -1
- package/dist/showcase-spec-replacement-candidates.js.map +1 -1
- package/dist/showcase-spec-types.d.ts +22 -0
- package/dist/showcase-spec-types.d.ts.map +1 -1
- package/package.json +3 -3
- package/templates/animation-channel/package.json +1 -1
- package/templates/animation-studio/package.json +5 -5
- package/templates/character-controller/package.json +3 -3
- package/templates/cinematic-scene/package.json +1 -1
- package/templates/episode-builder/package.json +1 -1
- package/templates/falling-blocks-starter/package.json +1 -1
- package/templates/fighting-game/package.json +1 -1
- package/templates/mini-game/package.json +1 -1
- package/templates/product-viewer/package.json +1 -1
- package/templates/prompt-animation-channel/package.json +1 -1
- package/templates/racing-starter/package.json +1 -1
- package/templates/racing-starter/src/main.ts +1 -1
- package/templates/three-compat-architecture-interior/package.json +1 -1
- package/templates/three-compat-asset-inspector/package.json +1 -1
- package/templates/three-compat-character-viewer/package.json +1 -1
- package/templates/three-compat-custom-threejs-migration/package.json +1 -1
- package/templates/three-compat-large-scene/package.json +1 -1
- package/templates/three-compat-material-authoring/package.json +1 -1
- package/templates/three-compat-postprocess-scene/package.json +1 -1
- package/templates/three-compat-premium-product-viewer/package.json +1 -1
|
@@ -1,29 +1,60 @@
|
|
|
1
1
|
import { createPlatformerTemplatePlan } from "./showcase-spec-game-template-evidence.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { platformerSceneScale } from "./showcase-spec-game-scene-scale.js";
|
|
3
|
+
export function createPlatformerGeometryContractSource(spec, platformer) {
|
|
4
4
|
const templatePlan = createPlatformerTemplatePlan(spec, platformer);
|
|
5
5
|
const { playableSurfaceMap: _playableSurfaceMap, ...levelPlan } = templatePlan;
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const surfaceMap = templatePlan.playableSurfaceMap;
|
|
7
|
+
const minX = Math.min(...surfaceMap.surfaces.map((surface) => surface.x - surface.width / 2));
|
|
8
|
+
const maxX = Math.max(...surfaceMap.surfaces.map((surface) => surface.x + surface.width / 2));
|
|
9
|
+
const minY = Math.min(...surfaceMap.surfaces.map((surface) => surface.y));
|
|
10
|
+
const maxY = Math.max(...surfaceMap.surfaces.map((surface) => surface.y + surface.height));
|
|
11
|
+
const contract = {
|
|
12
|
+
schema: "aura3d-game-geometry-contract/1.0",
|
|
13
|
+
routeId: spec.routeId,
|
|
14
|
+
category: "platformer",
|
|
15
|
+
geometrySource: surfaceMap.source,
|
|
16
|
+
sourceReport: platformer.levelDesign.playableSurfaceEvidence,
|
|
17
|
+
surfaceMap: templatePlan.playableSurfaceMap,
|
|
18
|
+
worldAssetBindings: platformer.worldAssets.map((assetId) => ({
|
|
19
|
+
worldAsset: assetId,
|
|
20
|
+
...(assetId === templatePlan.playableSurfaceMap.assetId
|
|
21
|
+
? {
|
|
22
|
+
worldAssetHash: templatePlan.playableSurfaceMap.assetHash,
|
|
23
|
+
surfaceSource: templatePlan.playableSurfaceMap.source,
|
|
24
|
+
confidence: templatePlan.playableSurfaceMap.confidence
|
|
25
|
+
}
|
|
26
|
+
: {}),
|
|
27
|
+
surfaceIds: templatePlan.platforms
|
|
28
|
+
.filter((surface) => surface.worldAsset === assetId)
|
|
29
|
+
.map((surface) => surface.id)
|
|
30
|
+
})),
|
|
31
|
+
level: {
|
|
32
|
+
...levelPlan,
|
|
33
|
+
platforms: templatePlan.platforms.map(({ id, x, y, width, height }) => ({ id, x, y, width, height }))
|
|
34
|
+
},
|
|
35
|
+
authoredSeconds: platformer.levelDesign.minPlayableSeconds,
|
|
36
|
+
cameraBounds: { minX: minX - 0.8, maxX: maxX + 0.8, minY: minY - 0.8, maxY: maxY + 0.8 },
|
|
37
|
+
evidence: {
|
|
38
|
+
geometryReport: platformer.levelDesign.playableSurfaceEvidence,
|
|
39
|
+
routePrimaryScreenshot: platformer.levelDesign.assetPairEvidence?.screenshotEvidence,
|
|
40
|
+
routePrimaryScreenshotSha256: platformer.levelDesign.assetPairEvidence?.screenshotSha256
|
|
41
|
+
},
|
|
42
|
+
design: platformer.levelDesign
|
|
9
43
|
};
|
|
44
|
+
return `// Generated by the Aura3D showcase spec compiler. Do not edit.
|
|
45
|
+
export const gameGeometryContract = ${JSON.stringify(contract, null, 2)} as const;
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
export function createPlatformerRouteSource(spec, platformer) {
|
|
49
|
+
const characterAsset = requireAsset(spec, platformer.characterAsset);
|
|
50
|
+
const templatePlan = createPlatformerTemplatePlan(spec, platformer);
|
|
10
51
|
const playableSurfaceMap = templatePlan.playableSurfaceMap;
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
...(assetId === playableSurfaceMap.assetId
|
|
15
|
-
? {
|
|
16
|
-
worldAssetHash: playableSurfaceMap.assetHash,
|
|
17
|
-
surfaceSource: playableSurfaceMap.source,
|
|
18
|
-
confidence: playableSurfaceMap.confidence
|
|
19
|
-
}
|
|
20
|
-
: {}),
|
|
21
|
-
surfaceIds: templatePlan.platforms
|
|
22
|
-
.filter((platform) => platform.worldAsset === assetId)
|
|
23
|
-
.map((platform) => platform.id)
|
|
24
|
-
}));
|
|
52
|
+
const sceneScale = platformerSceneScale(playableSurfaceMap);
|
|
53
|
+
const worldAsset = requireAsset(spec, playableSurfaceMap.assetId);
|
|
54
|
+
const panelMarkup = createPlatformerPanelMarkup(spec);
|
|
25
55
|
return `import { createAuraApp, game, lights, model, scene } from "@aura3d/engine";
|
|
26
56
|
import { assets } from "../../../src/aura-assets";
|
|
57
|
+
import { gameGeometryContract } from "./generated/game-geometry";
|
|
27
58
|
|
|
28
59
|
const input = game.input({
|
|
29
60
|
actions: {
|
|
@@ -35,27 +66,28 @@ const input = game.input({
|
|
|
35
66
|
axes: { moveX: { negative: "left", positive: "right" } },
|
|
36
67
|
bufferMs: 120
|
|
37
68
|
});
|
|
38
|
-
const authoredPlayableSeconds =
|
|
39
|
-
const playableSurfaceMap =
|
|
69
|
+
const authoredPlayableSeconds = gameGeometryContract.authoredSeconds;
|
|
70
|
+
const playableSurfaceMap = gameGeometryContract.surfaceMap;
|
|
40
71
|
const level = game.assetBoundPlatformerLevel({
|
|
41
72
|
characterAsset: "${platformer.characterAsset}",
|
|
42
|
-
worldAssetBindings:
|
|
73
|
+
worldAssetBindings: gameGeometryContract.worldAssetBindings,
|
|
43
74
|
playableSurfaceMap,
|
|
75
|
+
authoredPlayableSeconds,
|
|
44
76
|
minPlayableSeconds: ${platformer.levelDesign.minPlayableSeconds},
|
|
45
77
|
minCheckpoints: ${platformer.levelDesign.minCheckpoints},
|
|
46
|
-
level:
|
|
78
|
+
level: gameGeometryContract.level
|
|
47
79
|
});
|
|
48
80
|
const platformerScene = game.platformerSceneBinding({
|
|
49
81
|
surfaceMap: playableSurfaceMap,
|
|
50
82
|
level,
|
|
51
83
|
worldAsset: "${playableSurfaceMap.assetId}",
|
|
52
|
-
targetSceneWidth:
|
|
53
|
-
worldModelTargetMaxDimension:
|
|
84
|
+
targetSceneWidth: ${sceneScale.targetSceneWidth},
|
|
85
|
+
worldModelTargetMaxDimension: ${sceneScale.worldModelTargetMaxDimension},
|
|
54
86
|
worldY: -0.72,
|
|
55
87
|
worldZ: -0.46,
|
|
56
88
|
playerZ: 0.42,
|
|
57
|
-
playerTargetHeight: 0.
|
|
58
|
-
playerYOffset: 0
|
|
89
|
+
playerTargetHeight: 0.32,
|
|
90
|
+
playerYOffset: 0
|
|
59
91
|
});
|
|
60
92
|
const platformerState = game.platformer(level);
|
|
61
93
|
let state = platformerState.snapshot();
|
|
@@ -88,13 +120,34 @@ const animationStateHistory = [{ state: "idle" }];
|
|
|
88
120
|
function round(value: number): number {
|
|
89
121
|
return Math.round(value * 1000) / 1000;
|
|
90
122
|
}
|
|
123
|
+
const platformerCamera = game.platformerCameraRig({
|
|
124
|
+
sceneBinding: platformerScene,
|
|
125
|
+
player: state.player,
|
|
126
|
+
mode: "follow",
|
|
127
|
+
targetNode: "platformer-player",
|
|
128
|
+
distance: 3.7,
|
|
129
|
+
height: 0.52,
|
|
130
|
+
lookAhead: 0.7,
|
|
131
|
+
fov: 40
|
|
132
|
+
});
|
|
133
|
+
setupPlatformerPanel();
|
|
91
134
|
|
|
92
135
|
const app = createAuraApp("#app", {
|
|
93
136
|
diagnostics: { overlay: false, performancePanel: false },
|
|
94
137
|
scene: scene()
|
|
95
|
-
.
|
|
138
|
+
.add(model(${worldAsset.typedRef}, {
|
|
139
|
+
name: "platformer-bound-world-asset",
|
|
140
|
+
role: "primaryWorld",
|
|
141
|
+
scaleMode: "fit",
|
|
142
|
+
targetMaxDimension: platformerScene.worldModel.targetMaxDimension
|
|
143
|
+
}).position(...platformerScene.worldModel.position).rotate(...platformerScene.worldModel.rotation).runtime(game.runtimeNode("platformer-bound-world-asset", {
|
|
144
|
+
tags: ["world", "typed-secondary-primary-asset", "certified-visible-geometry"]
|
|
145
|
+
})))
|
|
146
|
+
.addMany(game.platformerPresentationSurfaces({
|
|
96
147
|
sceneBinding: platformerScene,
|
|
97
148
|
level,
|
|
149
|
+
mode: "asset-overlay",
|
|
150
|
+
guideVisibility: "public",
|
|
98
151
|
platformColor: "#526972",
|
|
99
152
|
platformTrimColor: "#b7f3ff",
|
|
100
153
|
hazardColor: "#ff6978",
|
|
@@ -105,24 +158,40 @@ const app = createAuraApp("#app", {
|
|
|
105
158
|
name: "platformer-readable-character",
|
|
106
159
|
role: "primaryCharacter",
|
|
107
160
|
scaleMode: "fit",
|
|
108
|
-
targetHeight: 0.
|
|
161
|
+
targetHeight: 0.32
|
|
109
162
|
}).position(...initialPlayerPose.position).runtime(game.runtimeNode("platformer-player", {
|
|
110
163
|
tags: ["player", "character", "typed-primary-asset"]
|
|
111
164
|
})))
|
|
112
|
-
.add(lights.studio())
|
|
113
|
-
.camera(
|
|
114
|
-
sceneBinding: platformerScene,
|
|
115
|
-
player: state.player,
|
|
116
|
-
mode: "follow",
|
|
117
|
-
targetNode: "platformer-player",
|
|
118
|
-
distance: 4.15,
|
|
119
|
-
height: 0.44,
|
|
120
|
-
lookAhead: 0.72,
|
|
121
|
-
fov: 41
|
|
122
|
-
}))
|
|
165
|
+
.add(lights.studio({ intensity: 1.5 }))
|
|
166
|
+
.camera(platformerCamera)
|
|
123
167
|
});
|
|
124
168
|
|
|
125
169
|
const player = app.nodes.require("platformer-player");
|
|
170
|
+
Object.defineProperty(window, "__AURA3D_COMPOSITION_PROBE__", {
|
|
171
|
+
value: {
|
|
172
|
+
category: "platformer",
|
|
173
|
+
camera: platformerCamera,
|
|
174
|
+
subject: { position: initialPlayerPose.position, rotation: [0, 0, 0], targetSize: 0.32 },
|
|
175
|
+
playSpacePoints: level.platforms.flatMap((surface) => [
|
|
176
|
+
platformerScene.toScenePoint({ x: surface.x, y: surface.y + surface.height }),
|
|
177
|
+
platformerScene.toScenePoint({ x: surface.x + surface.width, y: surface.y + surface.height })
|
|
178
|
+
]),
|
|
179
|
+
contactPoint: platformerScene.contactPointForPlayer(state.player),
|
|
180
|
+
setSubjectSuppressed: (suppressed: boolean) => {
|
|
181
|
+
app.pause();
|
|
182
|
+
player.setScale(suppressed ? 0.0001 : 1);
|
|
183
|
+
app.step(0);
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
configurable: true
|
|
187
|
+
});
|
|
188
|
+
const hud = {
|
|
189
|
+
x: requireElement("x-value"),
|
|
190
|
+
score: requireElement("score-value"),
|
|
191
|
+
deaths: requireElement("death-value"),
|
|
192
|
+
checkpoint: requireElement("checkpoint-value"),
|
|
193
|
+
surface: requireElement("surface-value")
|
|
194
|
+
};
|
|
126
195
|
function readAnimationState(): string {
|
|
127
196
|
if (state.events.some((event) => event.type === "hit")) return "hit";
|
|
128
197
|
if (state.player.vy > 0.05) return "jump";
|
|
@@ -172,6 +241,10 @@ const mountedEvidence = {
|
|
|
172
241
|
schema: "aura3d-showcase-compiled-platformer-route/1.1",
|
|
173
242
|
appId: "${spec.routeId}",
|
|
174
243
|
status: "ready",
|
|
244
|
+
controls: { keyboard: ["ArrowLeft", "ArrowRight", "KeyA", "KeyD", "Space", "ArrowUp", "KeyW", "KeyR"] },
|
|
245
|
+
systems: { input: "game.input", simulation: "game.platformer", geometry: "certified-platformer-surfaces", camera: "game.platformerCameraRig" },
|
|
246
|
+
claimBoundary: "Bounded certified-surface platformer presentation; no physics-engine, automatic GLB-to-game, or unsupported skinned-animation claim.",
|
|
247
|
+
platformerStateStatus: state.status,
|
|
175
248
|
frameCount,
|
|
176
249
|
score: state.score,
|
|
177
250
|
coins: state.collected.length,
|
|
@@ -192,7 +265,8 @@ const mountedEvidence = {
|
|
|
192
265
|
surfaceContactProven: initialSurfaceAlignment.feetOnSurface,
|
|
193
266
|
visibleGameGeometrySource: "surface-map-bound-game-level",
|
|
194
267
|
worldAssetUsedForSurfaceEvidence: "${playableSurfaceMap.assetId}",
|
|
195
|
-
|
|
268
|
+
noDebugSurfaceGuides: true,
|
|
269
|
+
visualReviewPass: ${spec.evidence.visualReviewPassed === true}
|
|
196
270
|
},
|
|
197
271
|
primaryAssets: [${spec.primaryAssets.map((asset) => `"${asset.id}"`).join(", ")}],
|
|
198
272
|
platformer: {
|
|
@@ -200,7 +274,7 @@ const mountedEvidence = {
|
|
|
200
274
|
characterAsset: "${platformer.characterAsset}",
|
|
201
275
|
worldAssets: [${platformer.worldAssets.map((assetId) => `"${assetId}"`).join(", ")}],
|
|
202
276
|
gameplayRequirements: [${platformer.gameplayRequirements.map((requirement) => `"${requirement}"`).join(", ")}],
|
|
203
|
-
levelDesign:
|
|
277
|
+
levelDesign: gameGeometryContract.design,
|
|
204
278
|
playableSurfaceMap,
|
|
205
279
|
assetBinding: level.assetBinding,
|
|
206
280
|
sceneBinding: platformerScene.evidence
|
|
@@ -217,12 +291,14 @@ const mountedEvidence = {
|
|
|
217
291
|
}
|
|
218
292
|
};
|
|
219
293
|
Object.defineProperty(window, "${spec.globalName}", { value: mountedEvidence, configurable: true, writable: true });
|
|
294
|
+
updatePlatformerHud();
|
|
220
295
|
|
|
221
296
|
function publishPlatformerEvidence(): void {
|
|
222
297
|
rememberAnimationState();
|
|
223
298
|
const scenePlayer = platformerScene.toScenePlayer(state.player);
|
|
224
299
|
player.setPosition(...scenePlayer.position);
|
|
225
|
-
mountedEvidence.status =
|
|
300
|
+
mountedEvidence.status = "running";
|
|
301
|
+
mountedEvidence.platformerStateStatus = state.status;
|
|
226
302
|
mountedEvidence.frameCount = frameCount;
|
|
227
303
|
mountedEvidence.score = state.score;
|
|
228
304
|
mountedEvidence.coins = state.collected.length;
|
|
@@ -233,6 +309,7 @@ function publishPlatformerEvidence(): void {
|
|
|
233
309
|
sampleFrame: frameCount
|
|
234
310
|
};
|
|
235
311
|
mountedEvidence.diagnostics = routeDiagnostics();
|
|
312
|
+
updatePlatformerHud();
|
|
236
313
|
}
|
|
237
314
|
|
|
238
315
|
app.onFrame(({ dt }) => {
|
|
@@ -263,8 +340,52 @@ app.onFrame(({ dt }) => {
|
|
|
263
340
|
kitContractProof.jumpChangesVerticalState ||= mountedEvidence.gameplay.jumpChangesY || Math.abs(state.player.vy) > 0.05;
|
|
264
341
|
publishPlatformerEvidence();
|
|
265
342
|
});
|
|
343
|
+
|
|
344
|
+
function setupPlatformerPanel(): void {
|
|
345
|
+
const panel = document.getElementById("panel");
|
|
346
|
+
if (!panel) return;
|
|
347
|
+
panel.innerHTML = ${JSON.stringify(panelMarkup)};
|
|
348
|
+
bindHoldControl("left-control", "KeyA");
|
|
349
|
+
bindHoldControl("right-control", "KeyD");
|
|
350
|
+
document.getElementById("jump-control")?.addEventListener("click", () => pulseKey("Space"));
|
|
351
|
+
document.getElementById("reset-control")?.addEventListener("click", () => pulseKey("KeyR"));
|
|
352
|
+
}
|
|
353
|
+
function bindHoldControl(id: string, code: string): void {
|
|
354
|
+
const button = document.getElementById(id);
|
|
355
|
+
if (!button) return;
|
|
356
|
+
const release = () => window.dispatchEvent(new KeyboardEvent("keyup", { code, bubbles: true }));
|
|
357
|
+
button.addEventListener("pointerdown", () => window.dispatchEvent(new KeyboardEvent("keydown", { code, bubbles: true })));
|
|
358
|
+
button.addEventListener("pointerup", release);
|
|
359
|
+
button.addEventListener("pointercancel", release);
|
|
360
|
+
button.addEventListener("pointerleave", release);
|
|
361
|
+
}
|
|
362
|
+
function pulseKey(code: string): void {
|
|
363
|
+
window.dispatchEvent(new KeyboardEvent("keydown", { code, bubbles: true }));
|
|
364
|
+
window.setTimeout(() => window.dispatchEvent(new KeyboardEvent("keyup", { code, bubbles: true })), 40);
|
|
365
|
+
}
|
|
366
|
+
function updatePlatformerHud(): void {
|
|
367
|
+
hud.x.textContent = round(state.player.x).toFixed(2);
|
|
368
|
+
hud.score.textContent = String(state.score);
|
|
369
|
+
hud.deaths.textContent = String(state.deaths);
|
|
370
|
+
hud.checkpoint.textContent = state.checkpointId;
|
|
371
|
+
const alignment = playerSurfaceAlignment();
|
|
372
|
+
hud.surface.textContent = alignment.feetOnSurface ? "Grounded on " + alignment.surfaceId : "Airborne";
|
|
373
|
+
}
|
|
374
|
+
function requireElement(id: string): HTMLElement {
|
|
375
|
+
const element = document.getElementById(id);
|
|
376
|
+
if (!element) throw new Error("Missing element #" + id);
|
|
377
|
+
return element;
|
|
378
|
+
}
|
|
266
379
|
`;
|
|
267
380
|
}
|
|
381
|
+
function createPlatformerPanelMarkup(spec) {
|
|
382
|
+
return `<span class="label">Certified surface route</span>
|
|
383
|
+
<h1>${spec.label}</h1>
|
|
384
|
+
<p class="claim">Run across a mesh-derived verdant course with checkpoints, collectibles, a hazard retry, and a finish state.</p>
|
|
385
|
+
<section class="panel-metrics" aria-label="Live runner metrics"><div class="metrics-row"><article><span>X</span><strong id="x-value">0.00</strong></article><article><span>Score</span><strong id="score-value">0</strong></article><article><span>Deaths</span><strong id="death-value">0</strong></article><article><span>Checkpoint</span><strong id="checkpoint-value">start</strong></article></div><div class="objective" id="surface-value">Finding surface…</div></section>
|
|
386
|
+
<section aria-label="Runner controls"><h2>Run the route</h2><div class="button-grid"><button id="left-control" type="button">Move left</button><button id="right-control" type="button">Move right</button><button id="jump-control" type="button">Jump</button><button id="reset-control" type="button">Reset</button></div><ul class="controls-list"><li>Use A / D or arrow keys to move.</li><li>Press W, Up, or Space to jump.</li><li>Press R to restart from the beginning.</li></ul></section>
|
|
387
|
+
<section aria-label="Geometry contract"><h2>Surface contract</h2><p class="claim">The visible world and player contacts share the same hash-bound mesh extraction transform.</p></section>`;
|
|
388
|
+
}
|
|
268
389
|
function requireAsset(spec, assetId) {
|
|
269
390
|
const asset = spec.primaryAssets.find((candidate) => candidate.id === assetId);
|
|
270
391
|
if (!asset)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"showcase-spec-platformer-artifacts.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-platformer-artifacts.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"showcase-spec-platformer-artifacts.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-platformer-artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import type { ShowcaseRacingSpec, ShowcaseSpec } from "./showcase-spec-types.js";
|
|
2
|
+
export declare function createRacingGeometryContractSource(spec: ShowcaseSpec, racing: ShowcaseRacingSpec): string;
|
|
2
3
|
export declare function createRacingRouteSource(spec: ShowcaseSpec, racing: ShowcaseRacingSpec): string;
|
|
3
4
|
//# sourceMappingURL=showcase-spec-racing-artifacts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"showcase-spec-racing-artifacts.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-racing-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EAEb,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"showcase-spec-racing-artifacts.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-racing-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EAEb,MAAM,0BAA0B,CAAC;AAIlC,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAuDzG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA8W9F"}
|