@forgeax/engine-scene 0.1.28 → 0.1.30
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 +50 -0
- package/dist/__tests__/keyed-scene.integration.test.d.ts +2 -0
- package/dist/__tests__/keyed-scene.integration.test.d.ts.map +1 -0
- package/dist/assets/scene-decoder.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +848 -229
- package/dist/index.mjs.map +1 -1
- package/dist/instances/binding.d.ts +7 -5
- package/dist/instances/binding.d.ts.map +1 -1
- package/dist/instances/externalization.d.ts +1 -1
- package/dist/instances/externalization.d.ts.map +1 -1
- package/dist/instances/keyed.d.ts +38 -0
- package/dist/instances/keyed.d.ts.map +1 -0
- package/dist/instances/legacy.d.ts +20 -0
- package/dist/instances/legacy.d.ts.map +1 -0
- package/dist/instances/runtime-types.d.ts +20 -0
- package/dist/instances/runtime-types.d.ts.map +1 -0
- package/dist/instances/scene-instances.d.ts +27 -37
- package/dist/instances/scene-instances.d.ts.map +1 -1
- package/dist/instances/state.d.ts +6 -1
- package/dist/instances/state.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/__tests__/asset-owner.integration.test.ts +4 -7
- package/src/__tests__/flat-propagation.perf.test.ts +18 -17
- package/src/__tests__/keyed-scene.integration.test.ts +269 -0
- package/src/__tests__/scene-binding.integration.test.ts +141 -32
- package/src/__tests__/structural.test.ts +4 -1
- package/src/assets/scene-decoder.ts +123 -33
- package/src/collect-subtree.ts +2 -2
- package/src/index.ts +10 -1
- package/src/instances/binding.ts +26 -19
- package/src/instances/externalization.ts +115 -97
- package/src/instances/keyed.ts +505 -0
- package/src/instances/legacy.ts +108 -0
- package/src/instances/runtime-types.ts +21 -0
- package/src/instances/scene-instances.ts +220 -83
- package/src/instances/state.ts +6 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { EntityHandle } from '@forgeax/engine-ecs';
|
|
2
|
-
import type { SceneEntityRef } from '@forgeax/engine-types';
|
|
2
|
+
import type { SceneEntityAddress, SceneEntityRef } from '@forgeax/engine-types';
|
|
3
3
|
import { type Result } from '@forgeax/engine-types';
|
|
4
4
|
export type { SceneEntityRef } from '@forgeax/engine-types';
|
|
5
5
|
export type SceneBindingError = {
|
|
@@ -8,7 +8,7 @@ export type SceneBindingError = {
|
|
|
8
8
|
readonly hint: string;
|
|
9
9
|
readonly detail: {
|
|
10
10
|
readonly sceneSourceKey: string;
|
|
11
|
-
readonly
|
|
11
|
+
readonly address: SceneEntityAddress;
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
14
|
export type SceneBindingDeclarationError = {
|
|
@@ -17,11 +17,13 @@ export type SceneBindingDeclarationError = {
|
|
|
17
17
|
readonly hint: string;
|
|
18
18
|
readonly detail: {
|
|
19
19
|
readonly sceneSourceKey?: string;
|
|
20
|
-
readonly
|
|
20
|
+
readonly address?: SceneEntityAddress;
|
|
21
21
|
};
|
|
22
22
|
};
|
|
23
|
-
export declare function
|
|
24
|
-
export declare function sceneEntity(sceneSourceKey: string,
|
|
23
|
+
export declare function validateSceneEntityKeys(sceneSourceKey: string, entityKeys: readonly string[]): Result<readonly string[], SceneBindingDeclarationError>;
|
|
24
|
+
export declare function sceneEntity(sceneSourceKey: string, address: SceneEntityAddress): SceneEntityRef;
|
|
25
|
+
/** Stable map key shared by direct and nested SceneEntityRef addresses. */
|
|
26
|
+
export declare function sceneEntityAddressKey(address: SceneEntityAddress): string;
|
|
25
27
|
export declare function resolveSceneEntity(ref: SceneEntityRef, instance: {
|
|
26
28
|
readonly sceneSourceKey: string;
|
|
27
29
|
readonly bindings: ReadonlyMap<string, EntityHandle | number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/instances/binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/instances/binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE7D,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,8BAA8B,CAAC;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAC5F,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,GAAG,8BAA8B,CAAC;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;KAAE,CAAC;CAC9F,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,MAAM,CAAC,SAAS,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAsBzD;AAED,wBAAgB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,cAAc,CAE/F;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAIzE;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE;IACR,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,CAAC;CAC/D,GACA,MAAM,CAAC,YAAY,GAAG,MAAM,EAAE,iBAAiB,CAAC,CAmBlD"}
|
|
@@ -9,6 +9,6 @@ export interface ExternalizedSceneAsset {
|
|
|
9
9
|
readonly payload: Record<string, unknown>;
|
|
10
10
|
readonly refs: readonly AssetRef[];
|
|
11
11
|
}
|
|
12
|
-
/** Project a SceneAsset's shared asset fields into a payload plus
|
|
12
|
+
/** Project a keyed SceneAsset's shared asset fields into a payload plus refs. */
|
|
13
13
|
export declare function externalizeSceneAsset(scene: SceneAsset, resolveSchema: SceneComponentSchemaResolver): Result<ExternalizedSceneAsset, SceneExternalizationError>;
|
|
14
14
|
//# sourceMappingURL=externalization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"externalization.d.ts","sourceRoot":"","sources":["../../src/instances/externalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"externalization.d.ts","sourceRoot":"","sources":["../../src/instances/externalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAyB,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG7D,MAAM,MAAM,4BAA4B,GAAG,CACzC,aAAa,EAAE,MAAM,KAClB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAC;CACpC;AAkFD,iFAAiF;AACjF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,EACjB,aAAa,EAAE,4BAA4B,GAC1C,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,CA0D3D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { World } from '@forgeax/engine-ecs';
|
|
2
|
+
import type { ComponentValuesMap, LocalEntityId, SceneAsset } from '@forgeax/engine-types';
|
|
3
|
+
import { type Handle, type Result } from '@forgeax/engine-types';
|
|
4
|
+
import type { SceneInstanceMount } from './runtime-types.js';
|
|
5
|
+
/** Numeric representation used only inside the Scene runtime. */
|
|
6
|
+
export interface CompiledSceneEntity {
|
|
7
|
+
readonly localId: LocalEntityId;
|
|
8
|
+
readonly components: Partial<ComponentValuesMap>;
|
|
9
|
+
}
|
|
10
|
+
export interface CompiledSceneAsset {
|
|
11
|
+
readonly kind: 'scene';
|
|
12
|
+
readonly entities: readonly CompiledSceneEntity[];
|
|
13
|
+
readonly mounts?: readonly SceneInstanceMount[];
|
|
14
|
+
readonly skinGuids?: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
export interface CompiledSceneResult {
|
|
17
|
+
readonly asset: CompiledSceneAsset;
|
|
18
|
+
readonly keyByLocalId: ReadonlyMap<number, string>;
|
|
19
|
+
readonly mountKeyByLocalId: ReadonlyMap<number, string>;
|
|
20
|
+
/** Private slots that attach directly to this scene's synthetic root. */
|
|
21
|
+
readonly rootLocalIds: readonly number[];
|
|
22
|
+
/** Effective private ChildOf edges, including nested scene attachment. */
|
|
23
|
+
readonly hierarchyParentByLocalId: ReadonlyMap<number, number>;
|
|
24
|
+
readonly resolveAddress: (address: unknown, field?: string) => number | undefined;
|
|
25
|
+
}
|
|
26
|
+
export interface KeyedSceneCompileContext {
|
|
27
|
+
readonly resolveSource: (source: string, parent: Handle<'SceneAsset', 'shared'>) => Result<Handle<'SceneAsset', 'shared'>, unknown>;
|
|
28
|
+
readonly resolveAsset: (handle: Handle<'SceneAsset', 'shared'>) => Result<SceneAsset, unknown>;
|
|
29
|
+
readonly stack: ReadonlySet<number>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Compile keyed author data to the private numeric Scene representation. The
|
|
33
|
+
* compiler establishes every local and nested address before the caller starts
|
|
34
|
+
* spawning entities, so malformed references and recursive instances cannot
|
|
35
|
+
* leave a partially usable World projection.
|
|
36
|
+
*/
|
|
37
|
+
export declare function compileKeyedSceneAsset(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: SceneAsset, context: KeyedSceneCompileContext): Result<CompiledSceneResult, unknown>;
|
|
38
|
+
//# sourceMappingURL=keyed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyed.d.ts","sourceRoot":"","sources":["../../src/instances/keyed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACb,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,KAAK,MAAM,EAGX,KAAK,MAAM,EAEZ,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAiB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/D,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACnF;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,CACtB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,KACnC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/F,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACrC;AA4GD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EACtC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,wBAAwB,GAChC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAwUtC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize the small set of SceneAsset fields emitted by the 0.1.27
|
|
3
|
+
* ScriptablePack template before the current keyed runtime validates them.
|
|
4
|
+
*
|
|
5
|
+
* This is deliberately a boundary migration. Current authoring and runtime
|
|
6
|
+
* types stay keyed and use `shadowFilter`; only old payloads carry numeric
|
|
7
|
+
* ChildOf addresses or `pcfKernelSize`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function migrateLegacySceneComponentFields(componentName: string, source: Record<string, unknown>, addressByLocalId?: ReadonlyMap<number, string>): Record<string, unknown>;
|
|
10
|
+
/**
|
|
11
|
+
* Lift the pre-keyed SceneAsset array into the current keyed shape.
|
|
12
|
+
*
|
|
13
|
+
* The 0.1.27 template used `localId` for storage and `bindingKey` for the
|
|
14
|
+
* gameplay-facing names. Keeping the binding key is essential: the runtime
|
|
15
|
+
* resolves `player`, `camera`, and joints by that name, not by the old number.
|
|
16
|
+
* This function is intentionally structural and accepts `unknown` only at the
|
|
17
|
+
* compatibility boundary; current authoring types remain keyed.
|
|
18
|
+
*/
|
|
19
|
+
export declare function normalizeLegacySceneAsset(scene: unknown): import('@forgeax/engine-types').SceneAsset;
|
|
20
|
+
//# sourceMappingURL=legacy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/instances/legacy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC/C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB;AASD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,OAAO,uBAAuB,EAAE,UAAU,CAwD5C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ComponentValuesMap, LocalEntityId } from '@forgeax/engine-types';
|
|
2
|
+
/** Runtime-only component update used while expanding a keyed scene. */
|
|
3
|
+
export interface MountOverride {
|
|
4
|
+
readonly localId: LocalEntityId;
|
|
5
|
+
readonly comp: string;
|
|
6
|
+
readonly field?: string;
|
|
7
|
+
readonly value: unknown;
|
|
8
|
+
}
|
|
9
|
+
/** Numeric SceneInstance projection; never part of SceneAsset authoring/wire data. */
|
|
10
|
+
export interface SceneInstanceMount {
|
|
11
|
+
readonly localId: LocalEntityId;
|
|
12
|
+
readonly source: number | string;
|
|
13
|
+
readonly memberFirst: LocalEntityId;
|
|
14
|
+
readonly memberCount: number;
|
|
15
|
+
readonly parent?: LocalEntityId;
|
|
16
|
+
readonly components?: Partial<ComponentValuesMap>;
|
|
17
|
+
readonly overrides?: readonly MountOverride[];
|
|
18
|
+
readonly publicationFence?: import('@forgeax/engine-types').ScenePublicationFence;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=runtime-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-types.d.ts","sourceRoot":"","sources":["../../src/instances/runtime-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE/E,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,sFAAsF;AACtF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,uBAAuB,EAAE,qBAAqB,CAAC;CACnF"}
|
|
@@ -1,41 +1,36 @@
|
|
|
1
1
|
import { type Component, type ComponentData, type ComponentSchema, type EcsError, type EntityHandle, type ShapeOf, type World } from '@forgeax/engine-ecs';
|
|
2
|
-
import type { Handle, LocalEntityId,
|
|
2
|
+
import type { Handle, LocalEntityId, SceneAsset, SceneEntityRef } from '@forgeax/engine-types';
|
|
3
3
|
import { type Result } from '@forgeax/engine-types';
|
|
4
|
+
import { type CompiledSceneAsset, type CompiledSceneEntity } from './keyed.js';
|
|
5
|
+
import type { MountOverride, SceneInstanceMount } from './runtime-types.js';
|
|
4
6
|
import { type SceneInstanceStatePayload } from './state.js';
|
|
5
7
|
export type { SceneInstanceStatePayload } from './state.js';
|
|
6
8
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* (an editor renames a field, an old `.pack.json` lags). `worldInstantiateScene`
|
|
12
|
-
* does NOT blank the whole scene over one such field (#478 lesson: a
|
|
13
|
-
* prod-silent strip re-introduced an invisible-entity class) and does NOT abort
|
|
14
|
-
* fatally. Instead it skips the unknown key (no write, no input mutation) and
|
|
15
|
-
* surfaces this record on the success value's `diagnostics[]` — observable in
|
|
16
|
-
* production (NOT NODE_ENV-gated), consumed by property access (no string parse):
|
|
9
|
+
* Legacy diagnostic shape retained on the scene-instantiation result for
|
|
10
|
+
* non-blocking runtime observations. SceneAsset schema violations are
|
|
11
|
+
* rejected by the keyed compiler before this result is produced; no authored
|
|
12
|
+
* unknown-field record is emitted by the current path.
|
|
17
13
|
*
|
|
18
14
|
* const r = worldInstantiateScene(world, handle);
|
|
19
15
|
* if (r.ok) for (const d of r.value.diagnostics)
|
|
20
|
-
* console.warn(
|
|
16
|
+
* console.warn('scene diagnostic', d);
|
|
21
17
|
*
|
|
22
|
-
* Direct `world.spawn` / `world.addComponent` / `Commands.spawn`
|
|
23
|
-
* with `SpawnDataUnknownFieldError
|
|
24
|
-
* is a programming error, not loader-fed data.
|
|
18
|
+
* Direct `world.spawn` / `world.addComponent` / `Commands.spawn` remain
|
|
19
|
+
* fail-fast with `SpawnDataUnknownFieldError`.
|
|
25
20
|
*/
|
|
26
21
|
export type SceneInstantiateDiagnostic = {
|
|
27
|
-
/** Component name
|
|
22
|
+
/** Component name associated with the observation. */
|
|
28
23
|
readonly component: string;
|
|
29
|
-
/**
|
|
24
|
+
/** Field associated with the observation. */
|
|
30
25
|
readonly field: string;
|
|
31
|
-
/** LocalEntityId
|
|
26
|
+
/** LocalEntityId within the owning SceneAsset, when applicable. */
|
|
32
27
|
readonly localId: number;
|
|
33
28
|
};
|
|
34
29
|
/**
|
|
35
30
|
* Success value of `worldInstantiateScene`. `root` is the synthetic scene-root
|
|
36
|
-
* EntityHandle (carries `SceneInstance`); `diagnostics`
|
|
37
|
-
*
|
|
38
|
-
*
|
|
31
|
+
* EntityHandle (carries `SceneInstance`); `diagnostics` contains only
|
|
32
|
+
* non-blocking runtime observations. Schema-invalid authored fields fail before
|
|
33
|
+
* an entity is created.
|
|
39
34
|
*/
|
|
40
35
|
export type SceneInstantiateOk = {
|
|
41
36
|
readonly root: EntityHandle;
|
|
@@ -90,6 +85,7 @@ export interface SceneMembersSpawn {
|
|
|
90
85
|
readonly mount: SceneInstanceMount;
|
|
91
86
|
readonly root: EntityHandle;
|
|
92
87
|
readonly mapping: Uint32Array;
|
|
88
|
+
readonly key?: string;
|
|
93
89
|
}[];
|
|
94
90
|
/** `entities.length + mounts + Σ memberCount`, captured at instantiate-time. */
|
|
95
91
|
readonly totalSlots: number;
|
|
@@ -115,12 +111,12 @@ export declare function worldGetSceneAssetResolver(world: World): SceneAssetReso
|
|
|
115
111
|
* const r = worldInstantiateScene(world, handle);
|
|
116
112
|
* if (!r.ok) return r;
|
|
117
113
|
* const { root, diagnostics } = r.value;
|
|
118
|
-
* for (const d of diagnostics) //
|
|
119
|
-
* console.warn(
|
|
114
|
+
* for (const d of diagnostics) // non-blocking runtime observations
|
|
115
|
+
* console.warn('scene diagnostic', d);
|
|
120
116
|
* const inst = world.get(root, SceneInstance).value;
|
|
121
117
|
* const member = inst.mapping[0]; // first member entity
|
|
122
118
|
*/
|
|
123
|
-
export declare function worldInstantiateScene(world: World, handle: Handle<'SceneAsset', 'shared'>, parent?: EntityHandle): Result<SceneInstantiateOk, EcsError>;
|
|
119
|
+
export declare function worldInstantiateScene(world: World, handle: Handle<'SceneAsset', 'shared'>, parent?: EntityHandle, sceneSourceKey?: string): Result<SceneInstantiateOk, EcsError>;
|
|
124
120
|
/**
|
|
125
121
|
* Materialise a projected `SceneAsset` payload without exposing the temporary
|
|
126
122
|
* shared-ref handle to the caller. The World remains the owner of both the
|
|
@@ -153,7 +149,7 @@ export declare function worldInstantiateSceneFlat(world: World, handle: Handle<'
|
|
|
153
149
|
* other public callers must not see this mechanic — use `instantiateScene`
|
|
154
150
|
* (D-3 / charter P1).
|
|
155
151
|
*/
|
|
156
|
-
export declare function worldInstantiateSceneRec(world: World, handle: Handle<'SceneAsset', 'shared'>, parent: EntityHandle | undefined, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[]): Result<EntityHandle, EcsError>;
|
|
152
|
+
export declare function worldInstantiateSceneRec(world: World, handle: Handle<'SceneAsset', 'shared'>, parent: EntityHandle | undefined, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[], instanceKey?: string, sceneSourceKey?: string): Result<EntityHandle, EcsError>;
|
|
157
153
|
/**
|
|
158
154
|
* @internal Resolve a SceneAsset handle through the SharedRefStore.
|
|
159
155
|
* The handle u32 is the SharedRefStore slot id (`world.allocSharedRef
|
|
@@ -170,7 +166,7 @@ export declare function worldResolveSceneAsset(world: World, handle: Handle<'Sce
|
|
|
170
166
|
* synthetic root or force any `ChildOf` — that is the caller's (finisher's)
|
|
171
167
|
* job. `_instantiateSceneRec` owns cycle bookkeeping.
|
|
172
168
|
*/
|
|
173
|
-
export declare function worldSpawnSceneMembers(world: World, handle: Handle<'SceneAsset', 'shared'>, asset:
|
|
169
|
+
export declare function worldSpawnSceneMembers(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: CompiledSceneAsset, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[], mountKeys?: ReadonlyMap<number, string>): Result<SceneMembersSpawn, EcsError>;
|
|
174
170
|
/**
|
|
175
171
|
* @internal Spawn one SceneAsset's entities + apply mounts recursively, then
|
|
176
172
|
* wrap them in a synthetic SceneInstance root (the anchor). This is the
|
|
@@ -178,7 +174,7 @@ export declare function worldSpawnSceneMembers(world: World, handle: Handle<'Sce
|
|
|
178
174
|
* entity-with-SceneInstance). Caller (`_instantiateSceneRec`) owns cycle
|
|
179
175
|
* bookkeeping.
|
|
180
176
|
*/
|
|
181
|
-
export declare function worldInstantiateSceneAsset(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: SceneAsset, parent: EntityHandle | undefined, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[]): Result<EntityHandle, EcsError>;
|
|
177
|
+
export declare function worldInstantiateSceneAsset(world: World, handle: Handle<'SceneAsset', 'shared'>, asset: SceneAsset, parent: EntityHandle | undefined, stack: Set<number>, diagnostics: SceneInstantiateDiagnostic[], instanceKey?: string, sceneSourceKey?: string): Result<EntityHandle, EcsError>;
|
|
182
178
|
/**
|
|
183
179
|
* @internal Flat finisher — spawn one SceneAsset's members WITHOUT wrapping
|
|
184
180
|
* them in a synthetic SceneInstance root and WITHOUT forcing `ChildOf` onto
|
|
@@ -195,17 +191,11 @@ export declare function worldInstantiateSceneAssetFlat(world: World, handle: Han
|
|
|
195
191
|
}, EcsError>;
|
|
196
192
|
/** @internal Build ComponentData[] for one SceneEntity, remapping localIds.
|
|
197
193
|
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
* and may carry a stale / deprecated / typo'd field. The remap below builds a
|
|
202
|
-
* fresh `remappedRaw` and simply SKIPS keys absent from the schema (no input
|
|
203
|
-
* mutation — the source `raw` is never deleted-from), recording each skipped
|
|
204
|
-
* key as a non-fatal `SceneInstantiateDiagnostic` into the passed accumulator.
|
|
205
|
-
* All known fields still write through, so one bad field cannot blank the
|
|
206
|
-
* entity or the scene (C-AC-02/03/04).
|
|
194
|
+
* SceneAsset payloads use the same schema contract as explicit ECS writes.
|
|
195
|
+
* Unknown fields fail before the first entity is spawned, with the component
|
|
196
|
+
* schema's structured error. The source object is never mutated.
|
|
207
197
|
*/
|
|
208
|
-
export declare function worldBuildSceneEntityComponentDatas(world: World, node:
|
|
198
|
+
export declare function worldBuildSceneEntityComponentDatas(world: World, node: CompiledSceneEntity, mapping: Uint32Array, _diagnostics: SceneInstantiateDiagnostic[]): Result<ComponentData[], EcsError>;
|
|
209
199
|
/**
|
|
210
200
|
* @internal feat-20260713 M2 / w8: apply one MountOverride to a live member
|
|
211
201
|
* entity column. The `field?` shape is the add-or-patch discriminant:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene-instances.d.ts","sourceRoot":"","sources":["../../src/instances/scene-instances.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,QAAQ,EAEb,KAAK,YAAY,EAEjB,KAAK,OAAO,EACZ,KAAK,KAAK,EACX,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EACV,MAAM,EACN,aAAa,
|
|
1
|
+
{"version":3,"file":"scene-instances.d.ts","sourceRoot":"","sources":["../../src/instances/scene-instances.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,QAAQ,EAEb,KAAK,YAAY,EAEjB,KAAK,OAAO,EACZ,KAAK,KAAK,EACX,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EAGb,UAAU,EAEV,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAIL,KAAK,MAAM,EAGZ,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAIL,KAAK,yBAAyB,EAE/B,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAK5D;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC7D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAC7D,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,iFAAiF;IACjF,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC3D,qFAAqF;IACrF,QAAQ,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;IACtC,4EAA4E;IAC5E,QAAQ,CAAC,8BAA8B,EAAE,YAAY,EAAE,CAAC;IACxD,yFAAyF;IACzF,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,SAAS;QAChC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;QACnC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;QAC5B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;QAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;IACJ,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAwCD,MAAM,MAAM,kBAAkB,GAAG,CAC/B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,KACzC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAErD,gBAAgB;AAChB,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAE3F;AAED,gBAAgB;AAChB,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAElF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EACtC,MAAM,CAAC,EAAE,YAAY,EACrB,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAgBtC;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,YAAY,GACpB,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAUtC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GACrC,MAAM,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAe1C;AACD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EACtC,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,0BAA0B,EAAE,EACzC,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAoChC;AACD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GACrC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAM9B;AACD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EACtC,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,0BAA0B,EAAE,EACzC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,MAAM,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAsRrC;AACD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EACtC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,0BAA0B,EAAE,EACzC,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,GACtB,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAiLhC;AACD;;;;;;;;;GASG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EACtC,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,0BAA0B,EAAE,GACxC,MAAM,CAAC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,EAAE,QAAQ,CAAC,CAwE5E;AACD;;;;;GAKG;AACH,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,0BAA0B,EAAE,GACzC,MAAM,CAAC,aAAa,EAAE,EAAE,QAAQ,CAAC,CAgDnC;AAyCD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,aAAa,GAChB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAkBxB;AACD;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,kBAAkB,GACxB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CA0ExB;AACD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,0BAA0B,EAAE,GACxC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAgChC;AACD,2EAA2E;AAC3E,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAC3C,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAmBlD;AACD;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,GAClD,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,CAiBnF;AACD,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,CAAC,EACxC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,OAAO,EAAE,CAAC,GACT,IAAI,CAEN;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,GACjB,MAAM,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAqB7C;AACD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,GACjB,MAAM,CAAC,yBAAyB,EAAE,QAAQ,CAAC,CAE7C;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,cAAc,GAClB,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAYhC;AACD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,EAClB,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAM1B;AACD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,EAClB,IAAI,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAChC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAqF1B;AACD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,eAAe,EAC7D,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAC/B,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAChC,KAAK,EAAE,OAAO,GACb,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CA0DxB;AACD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,eAAe,EAChE,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAC/B,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAC/B,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAsBxB;AACD,iEAAiE;AACjE,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,YAAY,GACnB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAYxB;AACD,yDAAyD;AACzD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,YAAY,GACnB,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAQxB;AACD;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,YAAY,GACjB,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAIlD"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { EntityHandle, World } from '@forgeax/engine-ecs';
|
|
2
|
-
import type { Handle, LocalEntityId
|
|
2
|
+
import type { Handle, LocalEntityId } from '@forgeax/engine-types';
|
|
3
|
+
import type { MountOverride } from './runtime-types.js';
|
|
3
4
|
/** Internal state retained by a SceneInstance root. */
|
|
4
5
|
export interface SceneInstanceStatePayload {
|
|
5
6
|
readonly source: Handle<'SceneAsset', 'shared'>;
|
|
6
7
|
readonly sceneSourceKey?: string;
|
|
8
|
+
/** Authored key for each private numeric slot, retained for collection. */
|
|
9
|
+
readonly keyByLocalId: Map<number, string>;
|
|
10
|
+
/** Authored key of this instance when it is nested in a parent scene. */
|
|
11
|
+
readonly instanceKey?: string;
|
|
7
12
|
readonly bindings: Map<string, EntityHandle>;
|
|
8
13
|
readonly entityToLocalId: Map<EntityHandle, LocalEntityId>;
|
|
9
14
|
readonly detachedLocalIds: Set<LocalEntityId>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/instances/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/instances/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,uDAAuD;AACvD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAChD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,yEAAyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,GAAG,CACrB,aAAa,EACb,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CACzF,CAAC;IACF,QAAQ,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;IACtC,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,aAAa,EAAE,CAAC;CACvD;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,eAAe,CAM7D;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAE/D;AAED,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAgBrE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIzD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgeax/engine-scene",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.30",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"LICENSE"
|
|
23
23
|
],
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@forgeax/engine-ecs": "0.1.
|
|
26
|
-
"@forgeax/engine-math": "0.1.
|
|
27
|
-
"@forgeax/engine-plugin": "0.1.
|
|
28
|
-
"@forgeax/engine-types": "0.1.
|
|
25
|
+
"@forgeax/engine-ecs": "0.1.30",
|
|
26
|
+
"@forgeax/engine-math": "0.1.30",
|
|
27
|
+
"@forgeax/engine-plugin": "0.1.30",
|
|
28
|
+
"@forgeax/engine-types": "0.1.30"
|
|
29
29
|
},
|
|
30
30
|
"forgeax": {
|
|
31
31
|
"metrics": {
|
|
@@ -19,12 +19,9 @@ function registerSceneWorld(world: World): void {
|
|
|
19
19
|
function scene(): SceneAsset {
|
|
20
20
|
return {
|
|
21
21
|
kind: 'scene',
|
|
22
|
-
entities:
|
|
23
|
-
{
|
|
24
|
-
|
|
25
|
-
components: { ScenePayloadMarker: { value: 7 } },
|
|
26
|
-
},
|
|
27
|
-
],
|
|
22
|
+
entities: {
|
|
23
|
+
marker: { components: { ScenePayloadMarker: { value: 7 } } },
|
|
24
|
+
},
|
|
28
25
|
};
|
|
29
26
|
}
|
|
30
27
|
|
|
@@ -48,7 +45,7 @@ describe('scene payload ownership', () => {
|
|
|
48
45
|
|
|
49
46
|
const result = worldInstantiateScenePayload(world, {
|
|
50
47
|
kind: 'scene',
|
|
51
|
-
entities:
|
|
48
|
+
entities: { missing: { components: { MissingComponent: { value: 1 } } } },
|
|
52
49
|
} as SceneAsset);
|
|
53
50
|
|
|
54
51
|
expect(result.ok).toBe(false);
|
|
@@ -11,8 +11,16 @@ import {
|
|
|
11
11
|
import { GlobalTransform, propagateTransforms, Transform } from '../index';
|
|
12
12
|
|
|
13
13
|
const SEED = 20260901;
|
|
14
|
-
|
|
15
|
-
const
|
|
14
|
+
|
|
15
|
+
const processLike = (
|
|
16
|
+
globalThis as typeof globalThis & {
|
|
17
|
+
process?: { memoryUsage(): { heapUsed: number }; env?: Record<string, string | undefined> };
|
|
18
|
+
}
|
|
19
|
+
).process;
|
|
20
|
+
const CI_MODE = processLike?.env?.CI !== undefined;
|
|
21
|
+
const WARMUP_FRAMES = CI_MODE ? 2 : 5;
|
|
22
|
+
const SAMPLE_FRAMES = CI_MODE ? 5 : 20;
|
|
23
|
+
const LARGE_ROWS = CI_MODE ? 20_000 : 100_000;
|
|
16
24
|
|
|
17
25
|
type Mode = 'full' | 'sparse' | 'mixed';
|
|
18
26
|
|
|
@@ -68,19 +76,13 @@ const WORKLOADS: readonly Workload[] = [
|
|
|
68
76
|
{ mode: 'full', rows: 10_000, movers: 10_000 },
|
|
69
77
|
{ mode: 'sparse', rows: 10_000, movers: 1 },
|
|
70
78
|
{ mode: 'sparse', rows: 10_000, movers: 100 },
|
|
71
|
-
{ mode: 'full', rows:
|
|
72
|
-
{ mode: 'sparse', rows:
|
|
73
|
-
{ mode: 'sparse', rows:
|
|
74
|
-
{ mode: 'mixed', rows:
|
|
75
|
-
{ mode: 'full', rows:
|
|
79
|
+
{ mode: 'full', rows: LARGE_ROWS, movers: LARGE_ROWS },
|
|
80
|
+
{ mode: 'sparse', rows: LARGE_ROWS, movers: 1 },
|
|
81
|
+
{ mode: 'sparse', rows: LARGE_ROWS, movers: 100 },
|
|
82
|
+
{ mode: 'mixed', rows: LARGE_ROWS, movers: LARGE_ROWS / 10 },
|
|
83
|
+
{ mode: 'full', rows: LARGE_ROWS, movers: 0 },
|
|
76
84
|
];
|
|
77
85
|
|
|
78
|
-
const processLike = (
|
|
79
|
-
globalThis as typeof globalThis & {
|
|
80
|
-
process?: { memoryUsage(): { heapUsed: number }; env?: Record<string, string | undefined> };
|
|
81
|
-
}
|
|
82
|
-
).process;
|
|
83
|
-
|
|
84
86
|
function percentile(values: readonly number[], fraction: number): number {
|
|
85
87
|
const sorted = [...values].sort((left, right) => left - right);
|
|
86
88
|
const index = Math.min(sorted.length - 1, Math.ceil(sorted.length * fraction) - 1);
|
|
@@ -294,8 +296,9 @@ function runWorkload(workload: Workload): FlatReceipt {
|
|
|
294
296
|
}
|
|
295
297
|
|
|
296
298
|
describe('real ECS flat Transform propagation benchmark', () => {
|
|
297
|
-
// Coverage instrumentation expands the 100k-row allocation-sensitive workload
|
|
298
|
-
//
|
|
299
|
+
// Coverage instrumentation expands the default 100k-row allocation-sensitive workload
|
|
300
|
+
// substantially; CI selects a bounded 20k-row large case while local runs retain the full
|
|
301
|
+
// benchmark budget and receipt values.
|
|
299
302
|
it('covers dynamic full, sparse, and mixed C workloads without a static shortcut', () => {
|
|
300
303
|
const receipts = WORKLOADS.map(runWorkload);
|
|
301
304
|
// biome-ignore lint/suspicious/noConsole: benchmark output is the machine evidence receipt.
|
|
@@ -330,7 +333,5 @@ describe('real ECS flat Transform propagation benchmark', () => {
|
|
|
330
333
|
|
|
331
334
|
const source = readFileSync('packages/scene/src/systems/propagate-transforms.ts', 'utf8');
|
|
332
335
|
expect(source).not.toMatch(/new (Map|Set)|\\b(Map|Set)</);
|
|
333
|
-
// biome-ignore lint/suspicious/noConsole: benchmark output is the machine evidence receipt.
|
|
334
|
-
console.info(JSON.stringify({ schemaVersion: 1, receipts }));
|
|
335
336
|
}, 120_000);
|
|
336
337
|
});
|