create-aura3d 1.4.3 → 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 +2 -2
- 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
package/README.md
CHANGED
|
@@ -40,8 +40,8 @@ npx create-aura3d@latest --help
|
|
|
40
40
|
code renders `model(assets.product)` instead of guessed URLs or string IDs.
|
|
41
41
|
- **AI output stays maintainable.** Coding agents can generate scenes while
|
|
42
42
|
developers keep normal TypeScript, package scripts, and browser tests.
|
|
43
|
-
- **Proof is part of the starter.** Route-health, screenshot, gameplay, or
|
|
44
|
-
|
|
43
|
+
- **Proof is part of the starter.** Route-health, screenshot, gameplay, composition, generated geometry-contract, or template checks are included where the template needs them.
|
|
44
|
+
- **Game routes fail closed.** Public racing/platformer generation uses certified assets and compiler-emitted geometry contracts rather than guessed route-local rectangles or centerlines.
|
|
45
45
|
- **Static deploys are first-class.** Build output is a browser app you can
|
|
46
46
|
deploy like any Vite project.
|
|
47
47
|
|
package/dist/index.d.ts
CHANGED
|
@@ -13,4 +13,8 @@ export interface CreateA3DProjectResult {
|
|
|
13
13
|
}
|
|
14
14
|
export declare function createA3DProject(options: CreateA3DProjectOptions): CreateA3DProjectResult;
|
|
15
15
|
export declare function writeCreateA3DReport(path: string, result: CreateA3DProjectResult): void;
|
|
16
|
+
export { probeShowcaseGameGeometry, type ShowcaseGameGeometryCategory, type ShowcaseGameGeometryProbeResult } from "./showcase-spec-game-geometry-probe.js";
|
|
17
|
+
export type { ExtractOptions as ShowcaseGameGeometryExtractOptions, GeometryExtractionFailure as ShowcaseGameGeometryExtractionFailure, GeometryExtractionResult as ShowcaseGameGeometryExtractionResult, GeometryExtractionSuccess as ShowcaseGameGeometryExtractionSuccess } from "./showcase-spec-game-geometry-extractor.js";
|
|
18
|
+
export type { ShowcasePlatformerPlayableSurfaceMap, ShowcaseRacingTrackTopology } from "./showcase-spec-types.js";
|
|
19
|
+
export { SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS, validateShowcaseAssetPairComposition, validateShowcaseAssetPairCompositionFromDisk, type ShowcaseAssetPairCompositionCategory, type ShowcaseAssetPairCompositionCheck, type ShowcaseAssetPairCompositionInput, type ShowcaseAssetPairCompositionReport, type ValidateShowcaseAssetPairCompositionFromDiskOptions } from "./showcase-spec-asset-pair-composition.js";
|
|
16
20
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,kgBAoB1B,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA6BzF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAGvF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,kgBAoB1B,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,sBAAsB,CA6BzF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAGvF;AA0BD,OAAO,EACL,yBAAyB,EACzB,KAAK,4BAA4B,EACjC,KAAK,+BAA+B,EACrC,MAAM,wCAAwC,CAAC;AAChD,YAAY,EACV,cAAc,IAAI,kCAAkC,EACpD,yBAAyB,IAAI,qCAAqC,EAClE,wBAAwB,IAAI,oCAAoC,EAChE,yBAAyB,IAAI,qCAAqC,EACnE,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,oCAAoC,EACpC,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,0CAA0C,EAC1C,oCAAoC,EACpC,4CAA4C,EAC5C,KAAK,oCAAoC,EACzC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,kCAAkC,EACvC,KAAK,mDAAmD,EACzD,MAAM,2CAA2C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -41,7 +41,7 @@ export function createA3DProject(options) {
|
|
|
41
41
|
const packageJson = JSON.parse(readFileSync(packagePath, "utf8"));
|
|
42
42
|
packageJson.dependencies = {
|
|
43
43
|
...(packageJson.dependencies ?? {}),
|
|
44
|
-
"@aura3d/engine": options.packageVersion ?? packageJson.dependencies?.["@aura3d/engine"] ?? "1.4.
|
|
44
|
+
"@aura3d/engine": options.packageVersion ?? packageJson.dependencies?.["@aura3d/engine"] ?? "1.4.4"
|
|
45
45
|
};
|
|
46
46
|
writeFileSync(packagePath, `${JSON.stringify(packageJson, null, 2)}\n`);
|
|
47
47
|
return {
|
|
@@ -80,4 +80,6 @@ function findDefaultTemplateRoot() {
|
|
|
80
80
|
}
|
|
81
81
|
return process.cwd();
|
|
82
82
|
}
|
|
83
|
+
export { probeShowcaseGameGeometry } from "./showcase-spec-game-geometry-probe.js";
|
|
84
|
+
export { SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS, validateShowcaseAssetPairComposition, validateShowcaseAssetPairCompositionFromDisk } from "./showcase-spec-asset-pair-composition.js";
|
|
83
85
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,gBAAgB;IAChB,iBAAiB;IACjB,WAAW;IACX,gBAAgB;IAChB,wBAAwB;IACxB,eAAe;IACf,mBAAmB;IACnB,0BAA0B;IAC1B,kBAAkB;IAClB,iBAAiB;IACjB,sBAAsB;IACtB,qCAAqC;IACrC,oCAAoC;IACpC,iCAAiC;IACjC,8BAA8B;IAC9B,+BAA+B;IAC/B,gCAAgC;IAChC,uCAAuC;IACvC,0BAA0B;CAClB,CAAC;AAgBX,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,gBAAgB,CAAC;IACtD,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,0BAA0B,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7H,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,uBAAuB,EAAE,CAAC;IAC7D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;IAC7F,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE;QAC7B,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,cAAc,CAAC;KACxJ,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAG/D,CAAC;IACF,WAAW,CAAC,YAAY,GAAG;QACzB,GAAG,CAAC,WAAW,CAAC,YAAY,IAAI,EAAE,CAAC;QACnC,gBAAgB,EAAE,OAAO,CAAC,cAAc,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC,gBAAgB,CAAC,IAAI,OAAO;KACpG,CAAC;IACF,aAAa,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO;QACL,SAAS;QACT,QAAQ;QACR,KAAK,EAAE,iBAAiB,CAAC,SAAS,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,MAA8B;IAC/E,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,CAAC,SAAiB,EAAE,EAAE;QAClC,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpE,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,WAAW,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC;;gBAChC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,SAAS,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,uBAAuB;IAC9B,IAAI,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC;QACrH,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM;QAC5B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AACvB,CAAC;AAED,OAAO,EACL,yBAAyB,EAG1B,MAAM,wCAAwC,CAAC;AAYhD,OAAO,EACL,0CAA0C,EAC1C,oCAAoC,EACpC,4CAA4C,EAM7C,MAAM,2CAA2C,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ShowcaseCategoryPlan, ShowcaseSpec, ShowcaseSpecFinalStatus } from "./showcase-spec-types.js";
|
|
2
2
|
export declare function createRouteSource(spec: ShowcaseSpec): string;
|
|
3
|
+
export declare function createRouteArtifacts(spec: ShowcaseSpec): Readonly<Record<string, string>>;
|
|
3
4
|
export declare function createReadme(spec: ShowcaseSpec, finalStatus: ShowcaseSpecFinalStatus, blockers: readonly string[]): string;
|
|
4
5
|
export declare function createRouteHealth(spec: ShowcaseSpec, finalStatus: ShowcaseSpecFinalStatus, blockers: readonly string[]): {
|
|
5
6
|
categoryPlan?: ShowcaseCategoryPlan | undefined;
|
|
@@ -12,6 +13,7 @@ export declare function createRouteHealth(spec: ShowcaseSpec, finalStatus: Showc
|
|
|
12
13
|
routePrimaryProbe: string | undefined;
|
|
13
14
|
screenshotSha256: string | undefined;
|
|
14
15
|
geometryEvidence: import("./showcase-spec-types.js").ShowcaseGameGeometryEvidence | undefined;
|
|
16
|
+
compositionReport: string | undefined;
|
|
15
17
|
verdict: import("./showcase-spec-types.js").ShowcaseGameAssetPairEvidenceVerdict;
|
|
16
18
|
notes: string;
|
|
17
19
|
blockers: readonly string[];
|
|
@@ -49,6 +51,7 @@ export declare function createRouteHealth(spec: ShowcaseSpec, finalStatus: Showc
|
|
|
49
51
|
blockers: readonly string[];
|
|
50
52
|
evidence: {
|
|
51
53
|
releaseAssetProbes?: Readonly<Record<string, string>> | undefined;
|
|
54
|
+
visualReviewPassed?: boolean | undefined;
|
|
52
55
|
gameplayPassed?: boolean | undefined;
|
|
53
56
|
gameplayProof?: string | undefined;
|
|
54
57
|
global: string;
|
|
@@ -98,6 +101,8 @@ export declare function createEvidenceChecklist(spec: ShowcaseSpec, finalStatus:
|
|
|
98
101
|
readonly routePrimaryPassed: boolean;
|
|
99
102
|
readonly gameplayProof?: string;
|
|
100
103
|
readonly gameplayPassed?: boolean;
|
|
104
|
+
readonly visualReviewPassed?: boolean;
|
|
105
|
+
readonly assetPairCompositionReport?: string;
|
|
101
106
|
readonly releaseAssetProbes?: Readonly<Record<string, string>>;
|
|
102
107
|
};
|
|
103
108
|
capabilities: readonly import("./showcase-spec-types.js").ShowcaseSpecCapability[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"showcase-spec-artifacts.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-artifacts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"showcase-spec-artifacts.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-artifacts.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EAEZ,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAM5D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAMzF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAE1H;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CtH;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB;;;;;;;;;;;;;;;;;EAiB5F;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;EAa5H"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { cameraForCategoryPlan } from "./showcase-spec-category-plan.js";
|
|
2
|
-
import { createPlatformerRouteSource } from "./showcase-spec-platformer-artifacts.js";
|
|
3
|
-
import { createRacingRouteSource } from "./showcase-spec-racing-artifacts.js";
|
|
2
|
+
import { createPlatformerGeometryContractSource, createPlatformerRouteSource } from "./showcase-spec-platformer-artifacts.js";
|
|
3
|
+
import { createRacingGeometryContractSource, createRacingRouteSource } from "./showcase-spec-racing-artifacts.js";
|
|
4
4
|
export function createRouteSource(spec) {
|
|
5
5
|
if (spec.platformer)
|
|
6
6
|
return createPlatformerRouteSource(spec, spec.platformer);
|
|
@@ -11,6 +11,13 @@ export function createRouteSource(spec) {
|
|
|
11
11
|
const heroAsset = requireAsset(spec, spec.layout.heroAsset);
|
|
12
12
|
return createBasicRouteSource(spec, heroAsset);
|
|
13
13
|
}
|
|
14
|
+
export function createRouteArtifacts(spec) {
|
|
15
|
+
return {
|
|
16
|
+
"src/main.ts": createRouteSource(spec),
|
|
17
|
+
...(spec.platformer ? { "src/generated/game-geometry.ts": createPlatformerGeometryContractSource(spec, spec.platformer) } : {}),
|
|
18
|
+
...(spec.racing ? { "src/generated/game-geometry.ts": createRacingGeometryContractSource(spec, spec.racing) } : {})
|
|
19
|
+
};
|
|
20
|
+
}
|
|
14
21
|
export function createReadme(spec, finalStatus, blockers) {
|
|
15
22
|
return `# ${spec.label}\n\nStatus: ${finalStatus}\n\nClaim label: ${spec.claimLabel}\n\nPrimary asset: ${spec.layout.heroAsset}\n\n${blockers.length === 0 ? "Release evidence is present for this bounded generated route." : `Blocked by:\n${blockers.map((blocker) => `- ${blocker}`).join("\n")}`}\n`;
|
|
16
23
|
}
|
|
@@ -107,6 +114,7 @@ function createRouteHealthEvidence(spec) {
|
|
|
107
114
|
routePrimaryPassed: spec.evidence.routePrimaryPassed,
|
|
108
115
|
...("gameplayProof" in spec.evidence ? { gameplayProof: spec.evidence.gameplayProof } : {}),
|
|
109
116
|
...("gameplayPassed" in spec.evidence ? { gameplayPassed: spec.evidence.gameplayPassed } : {}),
|
|
117
|
+
...("visualReviewPassed" in spec.evidence ? { visualReviewPassed: spec.evidence.visualReviewPassed } : {}),
|
|
110
118
|
...("releaseAssetProbes" in spec.evidence ? { releaseAssetProbes: spec.evidence.releaseAssetProbes } : {})
|
|
111
119
|
};
|
|
112
120
|
}
|
|
@@ -121,6 +129,7 @@ function createGameAssetPairRouteHealth(spec) {
|
|
|
121
129
|
routePrimaryProbe: assetPairEvidence.routePrimaryProbe,
|
|
122
130
|
screenshotSha256: assetPairEvidence.screenshotSha256,
|
|
123
131
|
geometryEvidence: assetPairEvidence.geometryEvidence,
|
|
132
|
+
compositionReport: assetPairEvidence.compositionReport,
|
|
124
133
|
verdict: assetPairEvidence.verdict,
|
|
125
134
|
notes: assetPairEvidence.notes,
|
|
126
135
|
blockers: assetPairEvidence.blockers
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"showcase-spec-artifacts.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"showcase-spec-artifacts.js","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export type ShowcaseAssetPairCompositionCategory = "racing" | "platformer";
|
|
2
|
+
export type ShowcaseAssetPairCompositionCheckId = "binding-overlap" | "contact" | "camera-readability" | "scale-contract" | "debug-guide-absence";
|
|
3
|
+
export interface ShowcaseCompositionRect {
|
|
4
|
+
readonly x: number;
|
|
5
|
+
readonly y: number;
|
|
6
|
+
readonly width: number;
|
|
7
|
+
readonly height: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ShowcaseAssetPairCompositionThresholds {
|
|
10
|
+
readonly minBindingOverlapRatio: number;
|
|
11
|
+
readonly maxContactOffsetRatio: number;
|
|
12
|
+
readonly maxScreenContactDistanceRatio: number;
|
|
13
|
+
readonly minPlaySpaceAreaRatio: number;
|
|
14
|
+
readonly maxPlaySpaceAreaRatio: number;
|
|
15
|
+
readonly minSubjectWorldRatio: number;
|
|
16
|
+
readonly maxSubjectWorldRatio: number;
|
|
17
|
+
readonly maxPlatformerScaleDelta: number;
|
|
18
|
+
}
|
|
19
|
+
export declare const SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS: ShowcaseAssetPairCompositionThresholds;
|
|
20
|
+
export interface ShowcaseAssetPairCompositionInput {
|
|
21
|
+
readonly routeId: string;
|
|
22
|
+
readonly category: ShowcaseAssetPairCompositionCategory;
|
|
23
|
+
readonly screenshot: {
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly sha256: string;
|
|
26
|
+
readonly width: number;
|
|
27
|
+
readonly height: number;
|
|
28
|
+
readonly crop: ShowcaseCompositionRect;
|
|
29
|
+
readonly foregroundBounds: ShowcaseCompositionRect;
|
|
30
|
+
readonly foregroundClipped: boolean;
|
|
31
|
+
readonly subjectBounds: ShowcaseCompositionRect;
|
|
32
|
+
readonly subjectClipped: boolean;
|
|
33
|
+
readonly projectedPlaySpaceBounds: ShowcaseCompositionRect;
|
|
34
|
+
readonly projectedContactPoint: {
|
|
35
|
+
readonly x: number;
|
|
36
|
+
readonly y: number;
|
|
37
|
+
};
|
|
38
|
+
readonly projectedSubjectHeight?: number;
|
|
39
|
+
};
|
|
40
|
+
readonly assets: readonly {
|
|
41
|
+
readonly id: string;
|
|
42
|
+
readonly manifestHash: string;
|
|
43
|
+
readonly evidenceHash: string;
|
|
44
|
+
}[];
|
|
45
|
+
readonly geometry: {
|
|
46
|
+
readonly report: string;
|
|
47
|
+
readonly assetId: string;
|
|
48
|
+
readonly assetHash: string;
|
|
49
|
+
readonly source: string;
|
|
50
|
+
readonly modelAnchorCount: number;
|
|
51
|
+
};
|
|
52
|
+
readonly sceneBinding: {
|
|
53
|
+
readonly assetHash: string;
|
|
54
|
+
readonly geometryBinding: string;
|
|
55
|
+
readonly overlay: string;
|
|
56
|
+
readonly averageBindingError: number;
|
|
57
|
+
readonly modelPresentationOffset: {
|
|
58
|
+
readonly x: number;
|
|
59
|
+
readonly y: number;
|
|
60
|
+
readonly z: number;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
readonly contact: {
|
|
64
|
+
readonly proven: boolean;
|
|
65
|
+
readonly normalizedOffset: number;
|
|
66
|
+
};
|
|
67
|
+
readonly camera: {
|
|
68
|
+
readonly mode: string;
|
|
69
|
+
readonly followsSubject: boolean;
|
|
70
|
+
};
|
|
71
|
+
readonly scale: {
|
|
72
|
+
readonly characterScaleRatio?: number;
|
|
73
|
+
readonly projectedTargetHeight?: number;
|
|
74
|
+
};
|
|
75
|
+
readonly debugGuidesAbsent: boolean;
|
|
76
|
+
readonly freshnessFailures?: readonly string[];
|
|
77
|
+
readonly thresholds?: Partial<ShowcaseAssetPairCompositionThresholds>;
|
|
78
|
+
}
|
|
79
|
+
export interface ShowcaseAssetPairCompositionCheck {
|
|
80
|
+
readonly id: ShowcaseAssetPairCompositionCheckId;
|
|
81
|
+
readonly verdict: "pass" | "fail";
|
|
82
|
+
readonly tolerance: Readonly<Record<string, number | boolean | string>>;
|
|
83
|
+
readonly measured: Readonly<Record<string, number | boolean | string>>;
|
|
84
|
+
readonly blockers: readonly string[];
|
|
85
|
+
}
|
|
86
|
+
export interface ShowcaseAssetPairCompositionReport {
|
|
87
|
+
readonly schema: "aura3d-showcase-asset-pair-composition/1.0";
|
|
88
|
+
readonly routeId: string;
|
|
89
|
+
readonly category: ShowcaseAssetPairCompositionCategory;
|
|
90
|
+
readonly verdict: "pass" | "fail";
|
|
91
|
+
readonly pass: boolean;
|
|
92
|
+
readonly screenshot: {
|
|
93
|
+
readonly path: string;
|
|
94
|
+
readonly sha256: string;
|
|
95
|
+
readonly width: number;
|
|
96
|
+
readonly height: number;
|
|
97
|
+
};
|
|
98
|
+
readonly geometry: ShowcaseAssetPairCompositionInput["geometry"];
|
|
99
|
+
readonly assets: ShowcaseAssetPairCompositionInput["assets"];
|
|
100
|
+
readonly thresholds: ShowcaseAssetPairCompositionThresholds;
|
|
101
|
+
readonly checks: readonly ShowcaseAssetPairCompositionCheck[];
|
|
102
|
+
readonly blockers: readonly string[];
|
|
103
|
+
}
|
|
104
|
+
export interface ValidateShowcaseAssetPairCompositionFromDiskOptions {
|
|
105
|
+
readonly projectDir?: string;
|
|
106
|
+
readonly routeId: string;
|
|
107
|
+
readonly category: ShowcaseAssetPairCompositionCategory;
|
|
108
|
+
readonly routePrimaryProbe: string;
|
|
109
|
+
readonly gameplayProof: string;
|
|
110
|
+
readonly geometryReport: string;
|
|
111
|
+
readonly manifest?: string;
|
|
112
|
+
readonly outputPath?: string;
|
|
113
|
+
}
|
|
114
|
+
export declare function validateShowcaseAssetPairComposition(input: ShowcaseAssetPairCompositionInput): ShowcaseAssetPairCompositionReport;
|
|
115
|
+
export declare function validateShowcaseAssetPairCompositionFromDisk(options: ValidateShowcaseAssetPairCompositionFromDiskOptions): ShowcaseAssetPairCompositionReport;
|
|
116
|
+
//# sourceMappingURL=showcase-spec-asset-pair-composition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"showcase-spec-asset-pair-composition.d.ts","sourceRoot":"","sources":["../../../../packages/create-aura3d/src/showcase-spec-asset-pair-composition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
4
|
+
import { mkdirSync } from "node:fs";
|
|
5
|
+
export const SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS = Object.freeze({
|
|
6
|
+
minBindingOverlapRatio: 0.02,
|
|
7
|
+
maxContactOffsetRatio: 1,
|
|
8
|
+
maxScreenContactDistanceRatio: 0.35,
|
|
9
|
+
minPlaySpaceAreaRatio: 0.04,
|
|
10
|
+
maxPlaySpaceAreaRatio: 0.78,
|
|
11
|
+
minSubjectWorldRatio: 0.08,
|
|
12
|
+
maxSubjectWorldRatio: 0.78,
|
|
13
|
+
maxPlatformerScaleDelta: 0.18
|
|
14
|
+
});
|
|
15
|
+
export function validateShowcaseAssetPairComposition(input) {
|
|
16
|
+
const thresholds = { ...SHOWCASE_ASSET_PAIR_COMPOSITION_THRESHOLDS, ...(input.thresholds ?? {}) };
|
|
17
|
+
const cropArea = area(input.screenshot.crop);
|
|
18
|
+
const playSpaceAreaRatio = ratio(area(input.screenshot.projectedPlaySpaceBounds), cropArea);
|
|
19
|
+
const subjectWorldRatio = ratio(input.screenshot.subjectBounds.height, input.screenshot.crop.height);
|
|
20
|
+
const overlapRatio = input.screenshot.subjectClipped
|
|
21
|
+
? 0
|
|
22
|
+
: input.category === "platformer"
|
|
23
|
+
? horizontalIntersectionRatio(input.screenshot.subjectBounds, input.screenshot.projectedPlaySpaceBounds)
|
|
24
|
+
: intersectionRatio(input.screenshot.subjectBounds, input.screenshot.projectedPlaySpaceBounds);
|
|
25
|
+
const subjectBase = {
|
|
26
|
+
x: input.screenshot.subjectBounds.x + input.screenshot.subjectBounds.width / 2,
|
|
27
|
+
y: input.screenshot.subjectBounds.y + input.screenshot.subjectBounds.height
|
|
28
|
+
};
|
|
29
|
+
const screenContactDistance = Math.hypot(subjectBase.x - input.screenshot.projectedContactPoint.x, subjectBase.y - input.screenshot.projectedContactPoint.y);
|
|
30
|
+
const screenContactDistanceRatio = ratio(screenContactDistance, input.screenshot.subjectBounds.height);
|
|
31
|
+
const bindingBlocker = input.category === "racing"
|
|
32
|
+
? "asset-pair:car-route-not-visibly-bound-to-road-surface"
|
|
33
|
+
: "asset-pair:character-foot-contact-not-visibly-bound-to-platform-surface";
|
|
34
|
+
const cameraBlocker = input.category === "racing"
|
|
35
|
+
? "asset-pair:track-camera-composition-reads-as-proof-harness"
|
|
36
|
+
: "asset-pair:platform-camera-composition-not-public-quality";
|
|
37
|
+
const scaleBlocker = input.category === "racing"
|
|
38
|
+
? "asset-pair:vehicle-track-scale-contract-mismatch"
|
|
39
|
+
: "asset-pair:character-world-scale-and-art-direction-not-public-quality";
|
|
40
|
+
const zeroPresentationOffset = input.sceneBinding.modelPresentationOffset.x === 0
|
|
41
|
+
&& input.sceneBinding.modelPresentationOffset.y === 0
|
|
42
|
+
&& input.sceneBinding.modelPresentationOffset.z === 0;
|
|
43
|
+
const overlayMatches = input.geometry.source === "asset-mesh-extracted"
|
|
44
|
+
? input.sceneBinding.overlay === "" || input.sceneBinding.overlay === input.screenshot.path
|
|
45
|
+
: input.sceneBinding.overlay === input.screenshot.path;
|
|
46
|
+
const bindingPass = (input.freshnessFailures?.length ?? 0) === 0
|
|
47
|
+
&& input.sceneBinding.assetHash === input.geometry.assetHash
|
|
48
|
+
&& overlayMatches
|
|
49
|
+
&& input.geometry.modelAnchorCount > 0
|
|
50
|
+
&& input.sceneBinding.averageBindingError <= 0.06
|
|
51
|
+
&& zeroPresentationOffset
|
|
52
|
+
&& overlapRatio >= thresholds.minBindingOverlapRatio;
|
|
53
|
+
const contactPass = input.contact.proven
|
|
54
|
+
&& input.contact.normalizedOffset <= thresholds.maxContactOffsetRatio
|
|
55
|
+
&& screenContactDistanceRatio <= thresholds.maxScreenContactDistanceRatio;
|
|
56
|
+
const selectedRacingCameraMode = input.category === "racing"
|
|
57
|
+
? input.camera.followsSubject && input.camera.mode === "follow"
|
|
58
|
+
? "chase"
|
|
59
|
+
: input.camera.mode === "overview" || input.camera.mode === "perspective" || input.camera.mode === "top-down"
|
|
60
|
+
? "top-down"
|
|
61
|
+
: undefined
|
|
62
|
+
: undefined;
|
|
63
|
+
const cameraBehaviorPass = input.category === "racing" ? selectedRacingCameraMode !== undefined : input.camera.followsSubject;
|
|
64
|
+
const cameraPass = !input.screenshot.foregroundClipped
|
|
65
|
+
&& !input.screenshot.subjectClipped
|
|
66
|
+
&& playSpaceAreaRatio >= thresholds.minPlaySpaceAreaRatio
|
|
67
|
+
&& playSpaceAreaRatio <= thresholds.maxPlaySpaceAreaRatio
|
|
68
|
+
&& cameraBehaviorPass;
|
|
69
|
+
const characterScaleRatio = input.scale.characterScaleRatio;
|
|
70
|
+
const projectedTargetHeight = input.scale.projectedTargetHeight;
|
|
71
|
+
const scaleDelta = projectedTargetHeight === undefined
|
|
72
|
+
? Number.POSITIVE_INFINITY
|
|
73
|
+
: Math.abs(input.screenshot.subjectBounds.height - projectedTargetHeight) / Math.max(projectedTargetHeight, 0.001);
|
|
74
|
+
const platformerScalePass = input.category !== "platformer" || (characterScaleRatio !== undefined
|
|
75
|
+
&& characterScaleRatio > 0
|
|
76
|
+
&& characterScaleRatio <= 1.25
|
|
77
|
+
&& projectedTargetHeight !== undefined
|
|
78
|
+
&& projectedTargetHeight > 0
|
|
79
|
+
&& scaleDelta <= thresholds.maxPlatformerScaleDelta);
|
|
80
|
+
const scalePass = subjectWorldRatio >= thresholds.minSubjectWorldRatio
|
|
81
|
+
&& subjectWorldRatio <= thresholds.maxSubjectWorldRatio
|
|
82
|
+
&& platformerScalePass;
|
|
83
|
+
const checks = [
|
|
84
|
+
makeCheck("binding-overlap", bindingPass, {
|
|
85
|
+
minOverlapRatio: thresholds.minBindingOverlapRatio,
|
|
86
|
+
maxAverageBindingError: 0.06,
|
|
87
|
+
requiresCurrentHashes: true,
|
|
88
|
+
requiresZeroPresentationOffset: true
|
|
89
|
+
}, {
|
|
90
|
+
overlapRatio,
|
|
91
|
+
averageBindingError: input.sceneBinding.averageBindingError,
|
|
92
|
+
modelAnchorCount: input.geometry.modelAnchorCount,
|
|
93
|
+
sceneAssetHashMatches: input.sceneBinding.assetHash === input.geometry.assetHash,
|
|
94
|
+
overlayMatches,
|
|
95
|
+
zeroPresentationOffset
|
|
96
|
+
}, bindingBlocker),
|
|
97
|
+
makeCheck("contact", contactPass, {
|
|
98
|
+
maxNormalizedOffset: thresholds.maxContactOffsetRatio,
|
|
99
|
+
maxScreenContactDistanceRatio: thresholds.maxScreenContactDistanceRatio
|
|
100
|
+
}, {
|
|
101
|
+
contactProven: input.contact.proven,
|
|
102
|
+
normalizedOffset: input.contact.normalizedOffset,
|
|
103
|
+
screenContactDistance,
|
|
104
|
+
screenContactDistanceRatio
|
|
105
|
+
}, bindingBlocker),
|
|
106
|
+
makeCheck("camera-readability", cameraPass, {
|
|
107
|
+
minPlaySpaceAreaRatio: thresholds.minPlaySpaceAreaRatio,
|
|
108
|
+
maxPlaySpaceAreaRatio: thresholds.maxPlaySpaceAreaRatio,
|
|
109
|
+
clippedAllowed: false,
|
|
110
|
+
requiresSubjectFollow: input.category !== "racing" || selectedRacingCameraMode === "chase",
|
|
111
|
+
acceptedRacingModes: "chase|top-down"
|
|
112
|
+
}, {
|
|
113
|
+
playSpaceAreaRatio,
|
|
114
|
+
foregroundClipped: input.screenshot.foregroundClipped,
|
|
115
|
+
subjectClipped: input.screenshot.subjectClipped,
|
|
116
|
+
cameraMode: input.camera.mode,
|
|
117
|
+
followsSubject: input.camera.followsSubject,
|
|
118
|
+
...(selectedRacingCameraMode ? { selectedMode: selectedRacingCameraMode } : {})
|
|
119
|
+
}, cameraBlocker),
|
|
120
|
+
makeCheck("scale-contract", scalePass, {
|
|
121
|
+
minSubjectWorldRatio: thresholds.minSubjectWorldRatio,
|
|
122
|
+
maxSubjectWorldRatio: thresholds.maxSubjectWorldRatio,
|
|
123
|
+
maxPlatformerScaleDelta: thresholds.maxPlatformerScaleDelta
|
|
124
|
+
}, {
|
|
125
|
+
subjectWorldRatio,
|
|
126
|
+
characterScaleRatio: characterScaleRatio ?? "not-required",
|
|
127
|
+
projectedTargetHeight: projectedTargetHeight ?? "not-required",
|
|
128
|
+
renderedSubjectHeight: input.screenshot.subjectBounds.height,
|
|
129
|
+
scaleDelta: Number.isFinite(scaleDelta) ? scaleDelta : "missing"
|
|
130
|
+
}, scaleBlocker),
|
|
131
|
+
makeCheck("debug-guide-absence", input.debugGuidesAbsent, {
|
|
132
|
+
visibleDebugGuidesAllowed: false
|
|
133
|
+
}, {
|
|
134
|
+
debugGuidesAbsent: input.debugGuidesAbsent
|
|
135
|
+
}, "asset-pair:debug-guides-visible")
|
|
136
|
+
];
|
|
137
|
+
const blockers = unique([
|
|
138
|
+
...(input.freshnessFailures ?? []),
|
|
139
|
+
...checks.flatMap((check) => check.blockers)
|
|
140
|
+
]);
|
|
141
|
+
return {
|
|
142
|
+
schema: "aura3d-showcase-asset-pair-composition/1.0",
|
|
143
|
+
routeId: input.routeId,
|
|
144
|
+
category: input.category,
|
|
145
|
+
verdict: blockers.length === 0 ? "pass" : "fail",
|
|
146
|
+
pass: blockers.length === 0,
|
|
147
|
+
screenshot: {
|
|
148
|
+
path: input.screenshot.path,
|
|
149
|
+
sha256: input.screenshot.sha256,
|
|
150
|
+
width: input.screenshot.width,
|
|
151
|
+
height: input.screenshot.height
|
|
152
|
+
},
|
|
153
|
+
geometry: input.geometry,
|
|
154
|
+
assets: input.assets,
|
|
155
|
+
thresholds,
|
|
156
|
+
checks,
|
|
157
|
+
blockers
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
export function validateShowcaseAssetPairCompositionFromDisk(options) {
|
|
161
|
+
const root = resolve(options.projectDir ?? process.cwd());
|
|
162
|
+
const probe = readJsonObject(root, options.routePrimaryProbe, "route-primary-probe");
|
|
163
|
+
const gameplay = readJsonObject(root, options.gameplayProof, "gameplay-proof");
|
|
164
|
+
const geometryReport = readJsonObject(root, options.geometryReport, "geometry-report");
|
|
165
|
+
const manifest = readJsonObject(root, options.manifest ?? "aura.assets.json", "manifest");
|
|
166
|
+
const screenshotPath = readString(readObject(probe, "renderedProbe"), "screenshotPath");
|
|
167
|
+
const screenshotAbsolute = safePath(root, screenshotPath, "screenshot");
|
|
168
|
+
const screenshotSha256 = sha256(readFileSync(screenshotAbsolute));
|
|
169
|
+
const renderedProbe = readObject(probe, "renderedProbe");
|
|
170
|
+
const crop = readRect(renderedProbe, "analysisCrop");
|
|
171
|
+
const foregroundBounds = readRect(renderedProbe, "foregroundBounds");
|
|
172
|
+
const compositionProbe = readObject(probe, "compositionProbe");
|
|
173
|
+
const subjectBounds = readRect(compositionProbe, "subjectBounds");
|
|
174
|
+
const projectedPlaySpaceBounds = readRect(compositionProbe, "projectedPlaySpaceBounds");
|
|
175
|
+
const projectedContactPoint = readPoint(compositionProbe, "projectedContactPoint");
|
|
176
|
+
const evidence = readObject(readObject(gameplay, "evidence"), "before");
|
|
177
|
+
const sceneContainer = readObject(evidence, options.category === "racing" ? "racing" : "platformer");
|
|
178
|
+
const sceneBinding = readObject(sceneContainer, "sceneBinding");
|
|
179
|
+
const geometry = geometryRecord(options.category, geometryReport);
|
|
180
|
+
const manifestAssets = readArray(manifest, "assets");
|
|
181
|
+
const primaryAssets = readStringArray(evidence, "primaryAssets");
|
|
182
|
+
const routeProbeAssets = readArray(probe, "primaryAssets");
|
|
183
|
+
const freshnessFailures = [];
|
|
184
|
+
if (readString(renderedProbe, "sha256") !== screenshotSha256)
|
|
185
|
+
freshnessFailures.push("asset-pair:stale-screenshot-hash");
|
|
186
|
+
if (readString(probe, "routeId") !== options.routeId || readString(geometryReport, "routeId") !== options.routeId) {
|
|
187
|
+
freshnessFailures.push("asset-pair:route-id-mismatch");
|
|
188
|
+
}
|
|
189
|
+
const assets = primaryAssets.map((id) => {
|
|
190
|
+
const manifestAsset = manifestAssets.find((value) => isRecord(value) && value.id === id);
|
|
191
|
+
const probeAsset = routeProbeAssets.find((value) => isRecord(value) && value.id === id);
|
|
192
|
+
const manifestHash = isRecord(manifestAsset) && typeof manifestAsset.hash === "string" ? manifestAsset.hash : "missing";
|
|
193
|
+
const evidenceHash = isRecord(probeAsset) && typeof probeAsset.manifestHash === "string" ? probeAsset.manifestHash : "missing";
|
|
194
|
+
if (manifestHash !== evidenceHash)
|
|
195
|
+
freshnessFailures.push(`asset-pair:stale-manifest-hash:${id}`);
|
|
196
|
+
return { id, manifestHash, evidenceHash };
|
|
197
|
+
});
|
|
198
|
+
if (!assets.some((asset) => asset.id === geometry.assetId && asset.manifestHash === geometry.assetHash)) {
|
|
199
|
+
freshnessFailures.push(`asset-pair:geometry-asset-hash-mismatch:${geometry.assetId}`);
|
|
200
|
+
}
|
|
201
|
+
const contact = compositionContact(options.category, evidence);
|
|
202
|
+
const cameraEvidence = readObject(readObject(readObject(evidence, "diagnostics"), "evidence"), "camera");
|
|
203
|
+
const mode = optionalString(cameraEvidence, "mode") ?? "missing";
|
|
204
|
+
const levelDesign = options.category === "platformer" ? readOptionalObject(evidence, "levelDesign") : undefined;
|
|
205
|
+
const gameplayEvidence = readObject(evidence, "gameplay");
|
|
206
|
+
const debugGuidesAbsent = options.category === "racing"
|
|
207
|
+
? gameplayEvidence.noDebugLocatorDisk === true
|
|
208
|
+
: levelDesign?.noDebugSurfaceGuides === true;
|
|
209
|
+
const source = readString(geometry.record, "source");
|
|
210
|
+
const modelAlignment = readObject(geometry.record, "modelAlignment");
|
|
211
|
+
const anchorPairs = Array.isArray(modelAlignment.anchorPairs) ? modelAlignment.anchorPairs : [];
|
|
212
|
+
const overlay = optionalString(sceneBinding, options.category === "racing" ? "routeOverlay" : "surfaceOverlay") ?? "";
|
|
213
|
+
const averageBindingError = readNumber(sceneBinding, options.category === "racing" ? "averageRouteTopologyError" : "averageSurfaceBindingError");
|
|
214
|
+
const characterScaleRatio = options.category === "platformer" ? optionalNumber(sceneBinding, "characterScaleRatio") : undefined;
|
|
215
|
+
const projectedTargetHeight = options.category === "platformer" ? optionalNumber(compositionProbe, "projectedSubjectHeight") : undefined;
|
|
216
|
+
const report = validateShowcaseAssetPairComposition({
|
|
217
|
+
routeId: options.routeId,
|
|
218
|
+
category: options.category,
|
|
219
|
+
screenshot: {
|
|
220
|
+
path: screenshotPath,
|
|
221
|
+
sha256: screenshotSha256,
|
|
222
|
+
width: readNumber(renderedProbe, "width"),
|
|
223
|
+
height: readNumber(renderedProbe, "height"),
|
|
224
|
+
crop,
|
|
225
|
+
foregroundBounds,
|
|
226
|
+
foregroundClipped: renderedProbe.clipped === true,
|
|
227
|
+
subjectBounds,
|
|
228
|
+
subjectClipped: compositionProbe.subjectClipped === true,
|
|
229
|
+
projectedPlaySpaceBounds,
|
|
230
|
+
projectedContactPoint,
|
|
231
|
+
...(projectedTargetHeight !== undefined ? { projectedSubjectHeight: projectedTargetHeight } : {})
|
|
232
|
+
},
|
|
233
|
+
assets,
|
|
234
|
+
geometry: {
|
|
235
|
+
report: options.geometryReport,
|
|
236
|
+
assetId: geometry.assetId,
|
|
237
|
+
assetHash: geometry.assetHash,
|
|
238
|
+
source,
|
|
239
|
+
modelAnchorCount: Math.max(anchorPairs.length, 1)
|
|
240
|
+
},
|
|
241
|
+
sceneBinding: {
|
|
242
|
+
assetHash: readString(sceneBinding, "assetHash"),
|
|
243
|
+
geometryBinding: readString(sceneBinding, "geometryBinding"),
|
|
244
|
+
overlay,
|
|
245
|
+
averageBindingError,
|
|
246
|
+
modelPresentationOffset: readOffset(sceneBinding, "modelPresentationOffset")
|
|
247
|
+
},
|
|
248
|
+
contact,
|
|
249
|
+
camera: {
|
|
250
|
+
mode,
|
|
251
|
+
followsSubject: mode === "follow" && typeof cameraEvidence.followTarget === "string"
|
|
252
|
+
},
|
|
253
|
+
scale: { characterScaleRatio, projectedTargetHeight },
|
|
254
|
+
debugGuidesAbsent,
|
|
255
|
+
freshnessFailures
|
|
256
|
+
});
|
|
257
|
+
if (options.outputPath) {
|
|
258
|
+
const output = safePath(root, options.outputPath, "composition-output");
|
|
259
|
+
mkdirSync(dirname(output), { recursive: true });
|
|
260
|
+
writeFileSync(output, `${JSON.stringify(report, null, 2)}\n`);
|
|
261
|
+
}
|
|
262
|
+
return report;
|
|
263
|
+
}
|
|
264
|
+
function geometryRecord(category, report) {
|
|
265
|
+
const key = category === "racing" ? "topology" : "surfaceMap";
|
|
266
|
+
const record = readObject(report, key);
|
|
267
|
+
return { record, assetId: readString(record, "assetId"), assetHash: readString(record, "assetHash") };
|
|
268
|
+
}
|
|
269
|
+
function compositionContact(category, evidence) {
|
|
270
|
+
if (category === "racing") {
|
|
271
|
+
const alignment = readObject(readObject(evidence, "raceState"), "roadAlignment");
|
|
272
|
+
return { proven: alignment.onRoad === true, normalizedOffset: readNumber(alignment, "normalizedOffset") };
|
|
273
|
+
}
|
|
274
|
+
const diagnostics = readObject(evidence, "diagnostics");
|
|
275
|
+
const alignment = readOptionalObject(diagnostics, "surfaceContactAlignment");
|
|
276
|
+
const gameplay = readObject(evidence, "gameplay");
|
|
277
|
+
return {
|
|
278
|
+
proven: alignment?.feetOnSurface === true && gameplay.surfaceContactProven === true,
|
|
279
|
+
normalizedOffset: Math.abs(optionalNumber(alignment ?? {}, "verticalGap") ?? Number.POSITIVE_INFINITY)
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function makeCheck(id, pass, tolerance, measured, blocker) {
|
|
283
|
+
return { id, verdict: pass ? "pass" : "fail", tolerance, measured, blockers: pass ? [] : [blocker] };
|
|
284
|
+
}
|
|
285
|
+
function horizontalIntersectionRatio(left, right) {
|
|
286
|
+
const x1 = Math.max(left.x, right.x);
|
|
287
|
+
const x2 = Math.min(left.x + left.width, right.x + right.width);
|
|
288
|
+
return ratio(Math.max(0, x2 - x1), Math.max(0, left.width));
|
|
289
|
+
}
|
|
290
|
+
function intersectionRatio(left, right) {
|
|
291
|
+
const x1 = Math.max(left.x, right.x);
|
|
292
|
+
const y1 = Math.max(left.y, right.y);
|
|
293
|
+
const x2 = Math.min(left.x + left.width, right.x + right.width);
|
|
294
|
+
const y2 = Math.min(left.y + left.height, right.y + right.height);
|
|
295
|
+
return ratio(Math.max(0, x2 - x1) * Math.max(0, y2 - y1), area(left));
|
|
296
|
+
}
|
|
297
|
+
function area(rect) { return Math.max(0, rect.width) * Math.max(0, rect.height); }
|
|
298
|
+
function ratio(value, total) { return total > 0 ? Number((value / total).toFixed(4)) : 0; }
|
|
299
|
+
function unique(values) { return [...new Set(values)]; }
|
|
300
|
+
function sha256(value) { return `sha256-${createHash("sha256").update(value).digest("hex")}`; }
|
|
301
|
+
function readJsonObject(root, path, label) {
|
|
302
|
+
const absolute = safePath(root, path, label);
|
|
303
|
+
if (!existsSync(absolute))
|
|
304
|
+
throw new Error(`${label} is missing: ${path}`);
|
|
305
|
+
const parsed = JSON.parse(readFileSync(absolute, "utf8"));
|
|
306
|
+
if (!isRecord(parsed))
|
|
307
|
+
throw new Error(`${label} must contain a JSON object: ${path}`);
|
|
308
|
+
return parsed;
|
|
309
|
+
}
|
|
310
|
+
function safePath(root, path, label) {
|
|
311
|
+
if (!path || isAbsolute(path) || path.includes("\0"))
|
|
312
|
+
throw new Error(`${label} path must be repository-relative`);
|
|
313
|
+
const absolute = resolve(root, path);
|
|
314
|
+
const rel = relative(root, absolute);
|
|
315
|
+
if (rel.startsWith("..") || isAbsolute(rel))
|
|
316
|
+
throw new Error(`${label} path escapes the repository`);
|
|
317
|
+
return absolute;
|
|
318
|
+
}
|
|
319
|
+
function isRecord(value) { return typeof value === "object" && value !== null && !Array.isArray(value); }
|
|
320
|
+
function readObject(value, key) { const result = value[key]; if (!isRecord(result))
|
|
321
|
+
throw new Error(`${key} must be an object`); return result; }
|
|
322
|
+
function readOptionalObject(value, key) { const result = value[key]; return isRecord(result) ? result : undefined; }
|
|
323
|
+
function readArray(value, key) { const result = value[key]; if (!Array.isArray(result))
|
|
324
|
+
throw new Error(`${key} must be an array`); return result; }
|
|
325
|
+
function readString(value, key) { const result = value[key]; if (typeof result !== "string" || !result)
|
|
326
|
+
throw new Error(`${key} must be a non-empty string`); return result; }
|
|
327
|
+
function optionalString(value, key) { const result = value[key]; return typeof result === "string" ? result : undefined; }
|
|
328
|
+
function readNumber(value, key) { const result = value[key]; if (typeof result !== "number" || !Number.isFinite(result))
|
|
329
|
+
throw new Error(`${key} must be finite`); return result; }
|
|
330
|
+
function optionalNumber(value, key) { const result = value[key]; return typeof result === "number" && Number.isFinite(result) ? result : undefined; }
|
|
331
|
+
function readStringArray(value, key) { return readArray(value, key).map((item) => { if (typeof item !== "string")
|
|
332
|
+
throw new Error(`${key} must contain strings`); return item; }); }
|
|
333
|
+
function readRect(value, key) { const rect = readObject(value, key); return { x: readNumber(rect, "x"), y: readNumber(rect, "y"), width: readNumber(rect, "width"), height: readNumber(rect, "height") }; }
|
|
334
|
+
function readPoint(value, key) { const point = readObject(value, key); return { x: readNumber(point, "x"), y: readNumber(point, "y") }; }
|
|
335
|
+
function readOffset(value, key) { const offset = readObject(value, key); return { x: readNumber(offset, "x"), y: readNumber(offset, "y"), z: readNumber(offset, "z") }; }
|
|
336
|
+
//# sourceMappingURL=showcase-spec-asset-pair-composition.js.map
|