@aura3d/ecs 1.3.2 → 1.3.3

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.
Files changed (49) hide show
  1. package/dist/SystemScheduler.js +5 -4
  2. package/dist/SystemScheduler.js.map +1 -1
  3. package/dist/components/CameraComponent.d.ts +30 -0
  4. package/dist/components/CameraComponent.d.ts.map +1 -0
  5. package/dist/components/CameraComponent.js +27 -0
  6. package/dist/components/CameraComponent.js.map +1 -0
  7. package/dist/components/HierarchyComponent.d.ts +10 -0
  8. package/dist/components/HierarchyComponent.d.ts.map +1 -1
  9. package/dist/components/HierarchyComponent.js +10 -0
  10. package/dist/components/HierarchyComponent.js.map +1 -1
  11. package/dist/components/LightComponent.d.ts +18 -0
  12. package/dist/components/LightComponent.d.ts.map +1 -0
  13. package/dist/components/LightComponent.js +17 -0
  14. package/dist/components/LightComponent.js.map +1 -0
  15. package/dist/components/MeshComponent.d.ts +19 -0
  16. package/dist/components/MeshComponent.d.ts.map +1 -0
  17. package/dist/components/MeshComponent.js +21 -0
  18. package/dist/components/MeshComponent.js.map +1 -0
  19. package/dist/components/WorldTransformComponent.d.ts +12 -0
  20. package/dist/components/WorldTransformComponent.d.ts.map +1 -0
  21. package/dist/components/WorldTransformComponent.js +22 -0
  22. package/dist/components/WorldTransformComponent.js.map +1 -0
  23. package/dist/index.d.ts +4 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +4 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/systems/CameraSystem.d.ts +17 -0
  28. package/dist/systems/CameraSystem.d.ts.map +1 -0
  29. package/dist/systems/CameraSystem.js +38 -0
  30. package/dist/systems/CameraSystem.js.map +1 -0
  31. package/dist/systems/TransformSystem.d.ts +16 -0
  32. package/dist/systems/TransformSystem.d.ts.map +1 -0
  33. package/dist/systems/TransformSystem.js +99 -0
  34. package/dist/systems/TransformSystem.js.map +1 -0
  35. package/dist/systems/index.d.ts +2 -0
  36. package/dist/systems/index.d.ts.map +1 -1
  37. package/dist/systems/index.js +2 -0
  38. package/dist/systems/index.js.map +1 -1
  39. package/package.json +3 -3
  40. package/src/SystemScheduler.ts +4 -2
  41. package/src/components/CameraComponent.ts +32 -0
  42. package/src/components/HierarchyComponent.ts +10 -0
  43. package/src/components/LightComponent.ts +18 -0
  44. package/src/components/MeshComponent.ts +23 -0
  45. package/src/components/WorldTransformComponent.ts +22 -0
  46. package/src/index.ts +4 -0
  47. package/src/systems/CameraSystem.ts +50 -0
  48. package/src/systems/TransformSystem.ts +108 -0
  49. package/src/systems/index.ts +2 -0
@@ -62,10 +62,11 @@ function sortSystems(systems) {
62
62
  throw new ValidationError("ECS_SYSTEM_CYCLE", "ECS system dependency cycle rejected.");
63
63
  return result;
64
64
  function addEdge(from, to) {
65
- if (!byName.has(from))
66
- throw new ValidationError("MISSING_ECS_SYSTEM_DEPENDENCY", `Missing ECS system dependency: ${from}`);
67
- if (!byName.has(to))
68
- throw new ValidationError("MISSING_ECS_SYSTEM_DEPENDENCY", `Missing ECS system dependency: ${to}`);
65
+ // `before`/`after` are soft ordering constraints: if the referenced
66
+ // system is not registered (or runs in a different phase), the edge is
67
+ // simply skipped instead of failing the whole schedule.
68
+ if (!byName.has(from) || !byName.has(to))
69
+ return;
69
70
  const edges = graph.get(from);
70
71
  if (!edges.has(to)) {
71
72
  edges.add(to);
@@ -1 +1 @@
1
- {"version":3,"file":"SystemScheduler.js","sourceRoot":"","sources":["../../../../packages/ecs/src/SystemScheduler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SystemScheduler.js","sourceRoot":"","sources":["../../../../packages/ecs/src/SystemScheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export type CameraKind = "perspective" | "orthographic";
2
+ /**
3
+ * Camera parameters + computed matrices for an ECS entity.
4
+ *
5
+ * {@link CameraSystem} computes `projectionMatrix`, `viewMatrix`, and
6
+ * `viewProjectionMatrix` each frame from the entity's
7
+ * {@link WorldTransformComponent}.
8
+ */
9
+ export declare class CameraComponent {
10
+ kind: CameraKind;
11
+ fovYRadians: number;
12
+ aspect: number;
13
+ near: number;
14
+ far: number;
15
+ left: number;
16
+ right: number;
17
+ bottom: number;
18
+ top: number;
19
+ zoom: number;
20
+ projectionMatrix: Float32Array<ArrayBuffer>;
21
+ viewMatrix: Float32Array<ArrayBuffer>;
22
+ viewProjectionMatrix: Float32Array<ArrayBuffer>;
23
+ viewport: {
24
+ x: number;
25
+ y: number;
26
+ width: number;
27
+ height: number;
28
+ };
29
+ }
30
+ //# sourceMappingURL=CameraComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/CameraComponent.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,cAAc,CAAC;AAExD;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,IAAI,EAAE,UAAU,CAAiB;IAGjC,WAAW,SAAe;IAC1B,MAAM,SAAK;IACX,IAAI,SAAO;IACX,GAAG,SAAQ;IAGX,IAAI,SAAM;IACV,KAAK,SAAK;IACV,MAAM,SAAM;IACZ,GAAG,SAAK;IACR,IAAI,SAAK;IAGT,gBAAgB,4BAAwB;IACxC,UAAU,4BAAwB;IAClC,oBAAoB,4BAAwB;IAE5C,QAAQ;;;;;MAAuC;CAChD"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Camera parameters + computed matrices for an ECS entity.
3
+ *
4
+ * {@link CameraSystem} computes `projectionMatrix`, `viewMatrix`, and
5
+ * `viewProjectionMatrix` each frame from the entity's
6
+ * {@link WorldTransformComponent}.
7
+ */
8
+ export class CameraComponent {
9
+ kind = "perspective";
10
+ // Perspective
11
+ fovYRadians = Math.PI / 3;
12
+ aspect = 1;
13
+ near = 0.1;
14
+ far = 1000;
15
+ // Orthographic
16
+ left = -1;
17
+ right = 1;
18
+ bottom = -1;
19
+ top = 1;
20
+ zoom = 1;
21
+ // Computed each frame by CameraSystem
22
+ projectionMatrix = new Float32Array(16);
23
+ viewMatrix = new Float32Array(16);
24
+ viewProjectionMatrix = new Float32Array(16);
25
+ viewport = { x: 0, y: 0, width: 1, height: 1 };
26
+ }
27
+ //# sourceMappingURL=CameraComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/CameraComponent.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAC1B,IAAI,GAAe,aAAa,CAAC;IAEjC,cAAc;IACd,WAAW,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1B,MAAM,GAAG,CAAC,CAAC;IACX,IAAI,GAAG,GAAG,CAAC;IACX,GAAG,GAAG,IAAI,CAAC;IAEX,eAAe;IACf,IAAI,GAAG,CAAC,CAAC,CAAC;IACV,KAAK,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,CAAC,CAAC,CAAC;IACZ,GAAG,GAAG,CAAC,CAAC;IACR,IAAI,GAAG,CAAC,CAAC;IAET,sCAAsC;IACtC,gBAAgB,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IACxC,UAAU,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IAClC,oBAAoB,GAAG,IAAI,YAAY,CAAC,EAAE,CAAC,CAAC;IAE5C,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;CAChD"}
@@ -8,6 +8,16 @@ export interface SerializedHierarchyComponent {
8
8
  readonly depth: number;
9
9
  }
10
10
  export declare class HierarchyComponent {
11
+ /**
12
+ * Parent entity, or `null` for root entities.
13
+ *
14
+ * Must be set via `HierarchySystem.setParent` (or `addChild`), which
15
+ * maintains {@link depth}, sibling links, and the parent's child list.
16
+ * Setting this field directly (including via the constructor argument)
17
+ * leaves `depth` stale at 0 — `TransformSystem` recomputes depth
18
+ * defensively for its parents-before-children ordering, but child/sibling
19
+ * bookkeeping will remain out of sync until `setParent` is used.
20
+ */
11
21
  parent: Entity | null;
12
22
  previousSibling: Entity | null;
13
23
  nextSibling: Entity | null;
@@ -1 +1 @@
1
- {"version":3,"file":"HierarchyComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/HierarchyComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAElE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAkB;IAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,KAAK,SAAK;IACV,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAElC,MAAM,GAAE,MAAM,GAAG,IAAW;IAIxC,IAAI,QAAQ,IAAI,SAAS,MAAM,EAAE,CAEhC;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,OAAO;IAItB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC,YAAY,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIrD,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAKxC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIvC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOpC,cAAc,IAAI,IAAI;IAItB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9C,MAAM,IAAI,4BAA4B;IAUtC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAkBrC;CACH"}
1
+ {"version":3,"file":"HierarchyComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/HierarchyComponent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAElE,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAkB;IAC7B;;;;;;;;;OASG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAClC,KAAK,SAAK;IACV,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;gBAElC,MAAM,GAAE,MAAM,GAAG,IAAW;IAIxC,IAAI,QAAQ,IAAI,SAAS,MAAM,EAAE,CAEhC;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAED,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,OAAO;IAItB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC,YAAY,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIrD,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAKxC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIvC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAOpC,cAAc,IAAI,IAAI;IAItB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO9C,MAAM,IAAI,4BAA4B;IAUtC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAkBrC;CACH"}
@@ -2,6 +2,16 @@ import { ValidationError } from "@aura3d/core";
2
2
  import {} from "../Component.js";
3
3
  import { entityKey, sameEntity } from "../Entity.js";
4
4
  export class HierarchyComponent {
5
+ /**
6
+ * Parent entity, or `null` for root entities.
7
+ *
8
+ * Must be set via `HierarchySystem.setParent` (or `addChild`), which
9
+ * maintains {@link depth}, sibling links, and the parent's child list.
10
+ * Setting this field directly (including via the constructor argument)
11
+ * leaves `depth` stale at 0 — `TransformSystem` recomputes depth
12
+ * defensively for its parents-before-children ordering, but child/sibling
13
+ * bookkeeping will remain out of sync until `setParent` is used.
14
+ */
5
15
  parent;
6
16
  previousSibling = null;
7
17
  nextSibling = null;
@@ -1 +1 @@
1
- {"version":3,"file":"HierarchyComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/HierarchyComponent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HierarchyComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/HierarchyComponent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type LightKind = "directional" | "point" | "spot" | "ambient";
2
+ /**
3
+ * Light parameters for an ECS entity.
4
+ *
5
+ * The ECS render bridge collects lights each frame and passes them to the
6
+ * renderer as part of the {@link RenderSource} lighting state.
7
+ */
8
+ export declare class LightComponent {
9
+ kind: LightKind;
10
+ color: [number, number, number];
11
+ intensity: number;
12
+ range: number;
13
+ angle: number;
14
+ penumbra: number;
15
+ castsShadow: boolean;
16
+ layerMask: number;
17
+ }
18
+ //# sourceMappingURL=LightComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/LightComponent.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAErE;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,IAAI,EAAE,SAAS,CAAiB;IAChC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAa;IAC5C,SAAS,SAAK;IACd,KAAK,SAAM;IACX,KAAK,SAAe;IACpB,QAAQ,SAAK;IACb,WAAW,UAAS;IACpB,SAAS,SAAK;CACf"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Light parameters for an ECS entity.
3
+ *
4
+ * The ECS render bridge collects lights each frame and passes them to the
5
+ * renderer as part of the {@link RenderSource} lighting state.
6
+ */
7
+ export class LightComponent {
8
+ kind = "directional";
9
+ color = [1, 1, 1];
10
+ intensity = 1;
11
+ range = 10;
12
+ angle = Math.PI / 4; // spot only
13
+ penumbra = 0; // spot only
14
+ castsShadow = false;
15
+ layerMask = 1;
16
+ }
17
+ //# sourceMappingURL=LightComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/LightComponent.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACzB,IAAI,GAAc,aAAa,CAAC;IAChC,KAAK,GAA6B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,SAAS,GAAG,CAAC,CAAC;IACd,KAAK,GAAG,EAAE,CAAC;IACX,KAAK,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY;IACjC,QAAQ,GAAG,CAAC,CAAC,CAAC,YAAY;IAC1B,WAAW,GAAG,KAAK,CAAC;IACpB,SAAS,GAAG,CAAC,CAAC;CACf"}
@@ -0,0 +1,19 @@
1
+ import type { SkinningPaletteBinding } from "@aura3d/rendering";
2
+ /**
3
+ * Renderable geometry + material binding for an ECS entity.
4
+ *
5
+ * References resources by name/handle; the ECS render bridge resolves them
6
+ * through the {@link ECSRenderLibraries} map at collection time.
7
+ */
8
+ export declare class MeshComponent {
9
+ geometry: string;
10
+ material: string;
11
+ castShadow: boolean;
12
+ receiveShadow: boolean;
13
+ skinning?: SkinningPaletteBinding;
14
+ morphWeights?: readonly number[];
15
+ instanceTransforms?: Float32Array;
16
+ instanceColors?: Float32Array;
17
+ constructor(geometry: string, material: string);
18
+ }
19
+ //# sourceMappingURL=MeshComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeshComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/MeshComponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,UAAQ;IAClB,aAAa,UAAQ;IACrB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,kBAAkB,CAAC,EAAE,YAAY,CAAC;IAClC,cAAc,CAAC,EAAE,YAAY,CAAC;gBAElB,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAI/C"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Renderable geometry + material binding for an ECS entity.
3
+ *
4
+ * References resources by name/handle; the ECS render bridge resolves them
5
+ * through the {@link ECSRenderLibraries} map at collection time.
6
+ */
7
+ export class MeshComponent {
8
+ geometry;
9
+ material;
10
+ castShadow = true;
11
+ receiveShadow = true;
12
+ skinning;
13
+ morphWeights;
14
+ instanceTransforms;
15
+ instanceColors;
16
+ constructor(geometry, material) {
17
+ this.geometry = geometry;
18
+ this.material = material;
19
+ }
20
+ }
21
+ //# sourceMappingURL=MeshComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeshComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/MeshComponent.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IACxB,QAAQ,CAAS;IACjB,QAAQ,CAAS;IACjB,UAAU,GAAG,IAAI,CAAC;IAClB,aAAa,GAAG,IAAI,CAAC;IACrB,QAAQ,CAA0B;IAClC,YAAY,CAAqB;IACjC,kBAAkB,CAAgB;IAClC,cAAc,CAAgB;IAE9B,YAAY,QAAgB,EAAE,QAAgB;QAC5C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Computed world-space transform for an ECS entity.
3
+ *
4
+ * Written by {@link TransformSystem} each frame from the entity's
5
+ * {@link TransformComponent} and {@link HierarchyComponent} parent chain.
6
+ * The renderer bridge reads this directly — it never touches local transforms.
7
+ */
8
+ export declare class WorldTransformComponent {
9
+ worldMatrix: Float32Array<ArrayBuffer>;
10
+ normalMatrix: Float32Array<ArrayBuffer>;
11
+ }
12
+ //# sourceMappingURL=WorldTransformComponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorldTransformComponent.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/WorldTransformComponent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,uBAAuB;IAClC,WAAW,4BAKR;IAEH,YAAY,4BAKT;CACJ"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Computed world-space transform for an ECS entity.
3
+ *
4
+ * Written by {@link TransformSystem} each frame from the entity's
5
+ * {@link TransformComponent} and {@link HierarchyComponent} parent chain.
6
+ * The renderer bridge reads this directly — it never touches local transforms.
7
+ */
8
+ export class WorldTransformComponent {
9
+ worldMatrix = new Float32Array([
10
+ 1, 0, 0, 0,
11
+ 0, 1, 0, 0,
12
+ 0, 0, 1, 0,
13
+ 0, 0, 0, 1
14
+ ]);
15
+ normalMatrix = new Float32Array([
16
+ 1, 0, 0, 0,
17
+ 0, 1, 0, 0,
18
+ 0, 0, 1, 0,
19
+ 0, 0, 0, 1
20
+ ]);
21
+ }
22
+ //# sourceMappingURL=WorldTransformComponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorldTransformComponent.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/components/WorldTransformComponent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,OAAO,uBAAuB;IAClC,WAAW,GAAG,IAAI,YAAY,CAAC;QAC7B,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,YAAY,GAAG,IAAI,YAAY,CAAC;QAC9B,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;KACX,CAAC,CAAC;CACJ"}
package/dist/index.d.ts CHANGED
@@ -14,6 +14,10 @@ export * from "./World.js";
14
14
  export * from "./ECSSerializer.js";
15
15
  export * from "./ECSProfiler.js";
16
16
  export * from "./components/TransformComponent.js";
17
+ export * from "./components/WorldTransformComponent.js";
18
+ export * from "./components/CameraComponent.js";
19
+ export * from "./components/LightComponent.js";
20
+ export * from "./components/MeshComponent.js";
17
21
  export * from "./components/NameComponent.js";
18
22
  export * from "./components/TagComponent.js";
19
23
  export * from "./components/ActiveComponent.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/ecs/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -14,6 +14,10 @@ export * from "./World.js";
14
14
  export * from "./ECSSerializer.js";
15
15
  export * from "./ECSProfiler.js";
16
16
  export * from "./components/TransformComponent.js";
17
+ export * from "./components/WorldTransformComponent.js";
18
+ export * from "./components/CameraComponent.js";
19
+ export * from "./components/LightComponent.js";
20
+ export * from "./components/MeshComponent.js";
17
21
  export * from "./components/NameComponent.js";
18
22
  export * from "./components/TagComponent.js";
19
23
  export * from "./components/ActiveComponent.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/ecs/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/ecs/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type System, type SystemContext } from "../System.js";
2
+ import { type World } from "../World.js";
3
+ /**
4
+ * Computes camera projection and view matrices for entities that have
5
+ * both {@link CameraComponent} and {@link WorldTransformComponent}.
6
+ *
7
+ * Runs after {@link TransformSystem} so the camera entity's world matrix
8
+ * is already computed.
9
+ */
10
+ export declare class CameraSystem implements System {
11
+ readonly name = "CameraSystem";
12
+ readonly phase = "update";
13
+ readonly priority = -70;
14
+ readonly after: string[];
15
+ update(world: World, _context: SystemContext): void;
16
+ }
17
+ //# sourceMappingURL=CameraSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraSystem.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/CameraSystem.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC;;;;;;GAMG;AACH,qBAAa,YAAa,YAAW,MAAM;IACzC,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,YAAY;IAC1B,QAAQ,CAAC,QAAQ,OAAO;IAGxB,QAAQ,CAAC,KAAK,WAAuB;IAErC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;CA4BpD"}
@@ -0,0 +1,38 @@
1
+ import { Matrix4 } from "@aura3d/math";
2
+ import {} from "../System.js";
3
+ import {} from "../World.js";
4
+ import { CameraComponent } from "../components/CameraComponent.js";
5
+ import { WorldTransformComponent } from "../components/WorldTransformComponent.js";
6
+ /**
7
+ * Computes camera projection and view matrices for entities that have
8
+ * both {@link CameraComponent} and {@link WorldTransformComponent}.
9
+ *
10
+ * Runs after {@link TransformSystem} so the camera entity's world matrix
11
+ * is already computed.
12
+ */
13
+ export class CameraSystem {
14
+ name = "CameraSystem";
15
+ phase = "update";
16
+ priority = -70;
17
+ // Soft ordering constraint: the scheduler skips this edge when
18
+ // TransformSystem is not registered, so CameraSystem can run standalone.
19
+ after = ["TransformSystem"];
20
+ update(world, _context) {
21
+ for (const entity of world
22
+ .query({ include: [CameraComponent, WorldTransformComponent] })
23
+ .toArray()) {
24
+ const cam = world.get(entity, CameraComponent);
25
+ const wt = world.get(entity, WorldTransformComponent);
26
+ const projection = cam.kind === "perspective"
27
+ ? Matrix4.perspective(cam.fovYRadians, cam.aspect, cam.near, cam.far)
28
+ : Matrix4.orthographic(cam.left / cam.zoom, cam.right / cam.zoom, cam.bottom / cam.zoom, cam.top / cam.zoom, cam.near, cam.far);
29
+ // viewMatrix = inverse(worldMatrix)
30
+ const worldMat = new Matrix4(wt.worldMatrix);
31
+ const view = worldMat.inverse();
32
+ cam.projectionMatrix.set(projection.elements);
33
+ cam.viewMatrix.set(view.elements);
34
+ cam.viewProjectionMatrix.set(projection.multiply(view).elements);
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=CameraSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraSystem.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/CameraSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAmC,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAc,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAEnF;;;;;;GAMG;AACH,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,cAAc,CAAC;IACtB,KAAK,GAAG,QAAQ,CAAC;IACjB,QAAQ,GAAG,CAAC,EAAE,CAAC;IACxB,+DAA+D;IAC/D,yEAAyE;IAChE,KAAK,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAErC,MAAM,CAAC,KAAY,EAAE,QAAuB;QAC1C,KAAK,MAAM,MAAM,IAAI,KAAK;aACvB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,eAAe,EAAE,uBAAuB,CAAC,EAAE,CAAC;aAC9D,OAAO,EAAE,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAE,CAAC;YAChD,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAE,CAAC;YAEvD,MAAM,UAAU,GACd,GAAG,CAAC,IAAI,KAAK,aAAa;gBACxB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;gBACrE,CAAC,CAAC,OAAO,CAAC,YAAY,CAClB,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,EACnB,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,EACpB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EACrB,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,EAClB,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,GAAG,CACR,CAAC;YAER,oCAAoC;YACpC,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC,WAA6C,CAAC,CAAC;YAC/E,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YAE/B,GAAG,CAAC,gBAAiC,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC/D,GAAG,CAAC,UAA2B,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnD,GAAG,CAAC,oBAAqC,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import { type System, type SystemContext } from "../System.js";
2
+ import { type World } from "../World.js";
3
+ /**
4
+ * Computes {@link WorldTransformComponent} for every entity that has both
5
+ * {@link TransformComponent} and {@link HierarchyComponent}.
6
+ *
7
+ * Entities are processed in depth order (parents before children) so the
8
+ * world matrix cascade is correct in a single pass.
9
+ */
10
+ export declare class TransformSystem implements System {
11
+ readonly name = "TransformSystem";
12
+ readonly phase = "update";
13
+ readonly priority = -80;
14
+ update(world: World, _context: SystemContext): void;
15
+ }
16
+ //# sourceMappingURL=TransformSystem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformSystem.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/TransformSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAQzC;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,MAAM;IAC5C,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,KAAK,YAAY;IAC1B,QAAQ,CAAC,QAAQ,OAAO;IAExB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;CAmCpD"}
@@ -0,0 +1,99 @@
1
+ import { Matrix4, Quaternion, Vector3 } from "@aura3d/math";
2
+ import {} from "../Entity.js";
3
+ import {} from "../System.js";
4
+ import {} from "../World.js";
5
+ import { HierarchyComponent } from "../components/HierarchyComponent.js";
6
+ import { TransformComponent } from "../components/TransformComponent.js";
7
+ import { WorldTransformComponent } from "../components/WorldTransformComponent.js";
8
+ /** Safety cap for defensive parent-chain walks (guards against cycles created by direct `parent` mutation). */
9
+ const MAX_HIERARCHY_DEPTH = 4096;
10
+ /**
11
+ * Computes {@link WorldTransformComponent} for every entity that has both
12
+ * {@link TransformComponent} and {@link HierarchyComponent}.
13
+ *
14
+ * Entities are processed in depth order (parents before children) so the
15
+ * world matrix cascade is correct in a single pass.
16
+ */
17
+ export class TransformSystem {
18
+ name = "TransformSystem";
19
+ phase = "update";
20
+ priority = -80;
21
+ update(world, _context) {
22
+ const entities = world
23
+ .query({ include: [TransformComponent, HierarchyComponent] })
24
+ .toArray()
25
+ .sort((a, b) => effectiveDepth(world, a) - effectiveDepth(world, b));
26
+ for (const entity of entities) {
27
+ const transform = world.get(entity, TransformComponent);
28
+ const hierarchy = world.get(entity, HierarchyComponent);
29
+ const local = Matrix4.compose(new Vector3(...transform.position), new Quaternion(...transform.rotation), new Vector3(...transform.scale));
30
+ let worldMat;
31
+ if (hierarchy.parent) {
32
+ const parentWtc = world.get(hierarchy.parent, WorldTransformComponent);
33
+ worldMat = parentWtc
34
+ ? new Matrix4(parentWtc.worldMatrix).multiply(local)
35
+ : local;
36
+ }
37
+ else {
38
+ worldMat = local;
39
+ }
40
+ let wtc = world.get(entity, WorldTransformComponent);
41
+ if (!wtc) {
42
+ wtc = new WorldTransformComponent();
43
+ world.add(entity, WorldTransformComponent, wtc);
44
+ }
45
+ wtc.worldMatrix.set(worldMat.elements);
46
+ wtc.normalMatrix.set(computeNormalMatrix(worldMat));
47
+ }
48
+ }
49
+ }
50
+ /**
51
+ * Returns the depth used for parents-before-children ordering.
52
+ *
53
+ * {@link HierarchyComponent.depth} is maintained by `HierarchySystem.setParent`.
54
+ * If `parent` was set directly (constructor argument or field mutation) the
55
+ * stored depth is stale at 0, so recompute it defensively by walking the
56
+ * parent chain.
57
+ */
58
+ function effectiveDepth(world, entity) {
59
+ const hierarchy = world.get(entity, HierarchyComponent);
60
+ if (!hierarchy)
61
+ return 0;
62
+ if (hierarchy.depth > 0 || hierarchy.parent === null)
63
+ return hierarchy.depth;
64
+ let depth = 0;
65
+ let current = hierarchy.parent;
66
+ while (current && depth < MAX_HIERARCHY_DEPTH) {
67
+ depth += 1;
68
+ const parentHierarchy = world.entities.isAlive(current)
69
+ ? world.get(current, HierarchyComponent)
70
+ : undefined;
71
+ current = parentHierarchy?.parent ?? null;
72
+ }
73
+ return depth;
74
+ }
75
+ function computeNormalMatrix(worldMat) {
76
+ // Normal matrix = inverse-TRANSPOSE of the world matrix, matching the
77
+ // renderer's reference `normalMatrixFromModel` (Renderer.ts):
78
+ // transpose(invert(model)), then extract the upper-left 3x3 into a 4x4
79
+ // with identity in the 4th row/col (column-major layout).
80
+ // Avoid crashing on singular matrices (zero scale) by falling back to identity.
81
+ try {
82
+ const m = worldMat.inverse().transpose().elements;
83
+ return new Float32Array([
84
+ m[0], m[1], m[2], 0,
85
+ m[4], m[5], m[6], 0,
86
+ m[8], m[9], m[10], 0,
87
+ 0, 0, 0, 1,
88
+ ]);
89
+ }
90
+ catch {
91
+ return new Float32Array([
92
+ 1, 0, 0, 0,
93
+ 0, 1, 0, 0,
94
+ 0, 0, 1, 0,
95
+ 0, 0, 0, 1,
96
+ ]);
97
+ }
98
+ }
99
+ //# sourceMappingURL=TransformSystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformSystem.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/TransformSystem.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
1
  export * from "./ActiveSystem.js";
2
2
  export * from "./HierarchySystem.js";
3
+ export * from "./TransformSystem.js";
4
+ export * from "./CameraSystem.js";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
@@ -1,3 +1,5 @@
1
1
  export * from "./ActiveSystem.js";
2
2
  export * from "./HierarchySystem.js";
3
+ export * from "./TransformSystem.js";
4
+ export * from "./CameraSystem.js";
3
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/ecs/src/systems/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aura3d/ecs",
3
- "version": "1.3.2",
3
+ "version": "1.3.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "sideEffects": false,
14
14
  "dependencies": {
15
- "@aura3d/math": "1.3.2",
16
- "@aura3d/core": "1.3.2"
15
+ "@aura3d/core": "1.3.3",
16
+ "@aura3d/math": "1.3.3"
17
17
  }
18
18
  }
@@ -64,8 +64,10 @@ function sortSystems(systems: System[]): System[] {
64
64
  return result;
65
65
 
66
66
  function addEdge(from: string, to: string): void {
67
- if (!byName.has(from)) throw new ValidationError("MISSING_ECS_SYSTEM_DEPENDENCY", `Missing ECS system dependency: ${from}`);
68
- if (!byName.has(to)) throw new ValidationError("MISSING_ECS_SYSTEM_DEPENDENCY", `Missing ECS system dependency: ${to}`);
67
+ // `before`/`after` are soft ordering constraints: if the referenced
68
+ // system is not registered (or runs in a different phase), the edge is
69
+ // simply skipped instead of failing the whole schedule.
70
+ if (!byName.has(from) || !byName.has(to)) return;
69
71
  const edges = graph.get(from) as Set<string>;
70
72
  if (!edges.has(to)) {
71
73
  edges.add(to);
@@ -0,0 +1,32 @@
1
+ export type CameraKind = "perspective" | "orthographic";
2
+
3
+ /**
4
+ * Camera parameters + computed matrices for an ECS entity.
5
+ *
6
+ * {@link CameraSystem} computes `projectionMatrix`, `viewMatrix`, and
7
+ * `viewProjectionMatrix` each frame from the entity's
8
+ * {@link WorldTransformComponent}.
9
+ */
10
+ export class CameraComponent {
11
+ kind: CameraKind = "perspective";
12
+
13
+ // Perspective
14
+ fovYRadians = Math.PI / 3;
15
+ aspect = 1;
16
+ near = 0.1;
17
+ far = 1000;
18
+
19
+ // Orthographic
20
+ left = -1;
21
+ right = 1;
22
+ bottom = -1;
23
+ top = 1;
24
+ zoom = 1;
25
+
26
+ // Computed each frame by CameraSystem
27
+ projectionMatrix = new Float32Array(16);
28
+ viewMatrix = new Float32Array(16);
29
+ viewProjectionMatrix = new Float32Array(16);
30
+
31
+ viewport = { x: 0, y: 0, width: 1, height: 1 };
32
+ }
@@ -11,6 +11,16 @@ export interface SerializedHierarchyComponent {
11
11
  }
12
12
 
13
13
  export class HierarchyComponent {
14
+ /**
15
+ * Parent entity, or `null` for root entities.
16
+ *
17
+ * Must be set via `HierarchySystem.setParent` (or `addChild`), which
18
+ * maintains {@link depth}, sibling links, and the parent's child list.
19
+ * Setting this field directly (including via the constructor argument)
20
+ * leaves `depth` stale at 0 — `TransformSystem` recomputes depth
21
+ * defensively for its parents-before-children ordering, but child/sibling
22
+ * bookkeeping will remain out of sync until `setParent` is used.
23
+ */
14
24
  parent: Entity | null;
15
25
  previousSibling: Entity | null = null;
16
26
  nextSibling: Entity | null = null;
@@ -0,0 +1,18 @@
1
+ export type LightKind = "directional" | "point" | "spot" | "ambient";
2
+
3
+ /**
4
+ * Light parameters for an ECS entity.
5
+ *
6
+ * The ECS render bridge collects lights each frame and passes them to the
7
+ * renderer as part of the {@link RenderSource} lighting state.
8
+ */
9
+ export class LightComponent {
10
+ kind: LightKind = "directional";
11
+ color: [number, number, number] = [1, 1, 1];
12
+ intensity = 1;
13
+ range = 10;
14
+ angle = Math.PI / 4; // spot only
15
+ penumbra = 0; // spot only
16
+ castsShadow = false;
17
+ layerMask = 1;
18
+ }
@@ -0,0 +1,23 @@
1
+ import type { SkinningPaletteBinding } from "@aura3d/rendering";
2
+
3
+ /**
4
+ * Renderable geometry + material binding for an ECS entity.
5
+ *
6
+ * References resources by name/handle; the ECS render bridge resolves them
7
+ * through the {@link ECSRenderLibraries} map at collection time.
8
+ */
9
+ export class MeshComponent {
10
+ geometry: string;
11
+ material: string;
12
+ castShadow = true;
13
+ receiveShadow = true;
14
+ skinning?: SkinningPaletteBinding;
15
+ morphWeights?: readonly number[];
16
+ instanceTransforms?: Float32Array;
17
+ instanceColors?: Float32Array;
18
+
19
+ constructor(geometry: string, material: string) {
20
+ this.geometry = geometry;
21
+ this.material = material;
22
+ }
23
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Computed world-space transform for an ECS entity.
3
+ *
4
+ * Written by {@link TransformSystem} each frame from the entity's
5
+ * {@link TransformComponent} and {@link HierarchyComponent} parent chain.
6
+ * The renderer bridge reads this directly — it never touches local transforms.
7
+ */
8
+ export class WorldTransformComponent {
9
+ worldMatrix = new Float32Array([
10
+ 1, 0, 0, 0,
11
+ 0, 1, 0, 0,
12
+ 0, 0, 1, 0,
13
+ 0, 0, 0, 1
14
+ ]);
15
+
16
+ normalMatrix = new Float32Array([
17
+ 1, 0, 0, 0,
18
+ 0, 1, 0, 0,
19
+ 0, 0, 1, 0,
20
+ 0, 0, 0, 1
21
+ ]);
22
+ }
package/src/index.ts CHANGED
@@ -14,6 +14,10 @@ export * from "./World.js";
14
14
  export * from "./ECSSerializer.js";
15
15
  export * from "./ECSProfiler.js";
16
16
  export * from "./components/TransformComponent.js";
17
+ export * from "./components/WorldTransformComponent.js";
18
+ export * from "./components/CameraComponent.js";
19
+ export * from "./components/LightComponent.js";
20
+ export * from "./components/MeshComponent.js";
17
21
  export * from "./components/NameComponent.js";
18
22
  export * from "./components/TagComponent.js";
19
23
  export * from "./components/ActiveComponent.js";
@@ -0,0 +1,50 @@
1
+ import { Matrix4 } from "@aura3d/math";
2
+ import { type System, type SystemContext } from "../System.js";
3
+ import { type World } from "../World.js";
4
+ import { CameraComponent } from "../components/CameraComponent.js";
5
+ import { WorldTransformComponent } from "../components/WorldTransformComponent.js";
6
+
7
+ /**
8
+ * Computes camera projection and view matrices for entities that have
9
+ * both {@link CameraComponent} and {@link WorldTransformComponent}.
10
+ *
11
+ * Runs after {@link TransformSystem} so the camera entity's world matrix
12
+ * is already computed.
13
+ */
14
+ export class CameraSystem implements System {
15
+ readonly name = "CameraSystem";
16
+ readonly phase = "update";
17
+ readonly priority = -70;
18
+ // Soft ordering constraint: the scheduler skips this edge when
19
+ // TransformSystem is not registered, so CameraSystem can run standalone.
20
+ readonly after = ["TransformSystem"];
21
+
22
+ update(world: World, _context: SystemContext): void {
23
+ for (const entity of world
24
+ .query({ include: [CameraComponent, WorldTransformComponent] })
25
+ .toArray()) {
26
+ const cam = world.get(entity, CameraComponent)!;
27
+ const wt = world.get(entity, WorldTransformComponent)!;
28
+
29
+ const projection =
30
+ cam.kind === "perspective"
31
+ ? Matrix4.perspective(cam.fovYRadians, cam.aspect, cam.near, cam.far)
32
+ : Matrix4.orthographic(
33
+ cam.left / cam.zoom,
34
+ cam.right / cam.zoom,
35
+ cam.bottom / cam.zoom,
36
+ cam.top / cam.zoom,
37
+ cam.near,
38
+ cam.far
39
+ );
40
+
41
+ // viewMatrix = inverse(worldMatrix)
42
+ const worldMat = new Matrix4(wt.worldMatrix as unknown as Matrix4["elements"]);
43
+ const view = worldMat.inverse();
44
+
45
+ (cam.projectionMatrix as Float32Array).set(projection.elements);
46
+ (cam.viewMatrix as Float32Array).set(view.elements);
47
+ (cam.viewProjectionMatrix as Float32Array).set(projection.multiply(view).elements);
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,108 @@
1
+ import { Matrix4, Quaternion, Vector3 } from "@aura3d/math";
2
+ import { type Entity } from "../Entity.js";
3
+ import { type System, type SystemContext } from "../System.js";
4
+ import { type World } from "../World.js";
5
+ import { HierarchyComponent } from "../components/HierarchyComponent.js";
6
+ import { TransformComponent } from "../components/TransformComponent.js";
7
+ import { WorldTransformComponent } from "../components/WorldTransformComponent.js";
8
+
9
+ /** Safety cap for defensive parent-chain walks (guards against cycles created by direct `parent` mutation). */
10
+ const MAX_HIERARCHY_DEPTH = 4096;
11
+
12
+ /**
13
+ * Computes {@link WorldTransformComponent} for every entity that has both
14
+ * {@link TransformComponent} and {@link HierarchyComponent}.
15
+ *
16
+ * Entities are processed in depth order (parents before children) so the
17
+ * world matrix cascade is correct in a single pass.
18
+ */
19
+ export class TransformSystem implements System {
20
+ readonly name = "TransformSystem";
21
+ readonly phase = "update";
22
+ readonly priority = -80;
23
+
24
+ update(world: World, _context: SystemContext): void {
25
+ const entities = world
26
+ .query({ include: [TransformComponent, HierarchyComponent] })
27
+ .toArray()
28
+ .sort((a, b) => effectiveDepth(world, a) - effectiveDepth(world, b));
29
+
30
+ for (const entity of entities) {
31
+ const transform = world.get(entity, TransformComponent)!;
32
+ const hierarchy = world.get(entity, HierarchyComponent)!;
33
+
34
+ const local = Matrix4.compose(
35
+ new Vector3(...transform.position),
36
+ new Quaternion(...transform.rotation),
37
+ new Vector3(...transform.scale)
38
+ );
39
+
40
+ let worldMat: Matrix4;
41
+ if (hierarchy.parent) {
42
+ const parentWtc = world.get(hierarchy.parent, WorldTransformComponent);
43
+ worldMat = parentWtc
44
+ ? new Matrix4(parentWtc.worldMatrix as unknown as Matrix4["elements"]).multiply(local)
45
+ : local;
46
+ } else {
47
+ worldMat = local;
48
+ }
49
+
50
+ let wtc = world.get(entity, WorldTransformComponent);
51
+ if (!wtc) {
52
+ wtc = new WorldTransformComponent();
53
+ world.add(entity, WorldTransformComponent, wtc);
54
+ }
55
+ (wtc.worldMatrix as Float32Array).set(worldMat.elements);
56
+ (wtc.normalMatrix as Float32Array).set(computeNormalMatrix(worldMat));
57
+ }
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Returns the depth used for parents-before-children ordering.
63
+ *
64
+ * {@link HierarchyComponent.depth} is maintained by `HierarchySystem.setParent`.
65
+ * If `parent` was set directly (constructor argument or field mutation) the
66
+ * stored depth is stale at 0, so recompute it defensively by walking the
67
+ * parent chain.
68
+ */
69
+ function effectiveDepth(world: World, entity: Entity): number {
70
+ const hierarchy = world.get(entity, HierarchyComponent);
71
+ if (!hierarchy) return 0;
72
+ if (hierarchy.depth > 0 || hierarchy.parent === null) return hierarchy.depth;
73
+
74
+ let depth = 0;
75
+ let current: Entity | null = hierarchy.parent;
76
+ while (current && depth < MAX_HIERARCHY_DEPTH) {
77
+ depth += 1;
78
+ const parentHierarchy: HierarchyComponent | undefined = world.entities.isAlive(current)
79
+ ? world.get(current, HierarchyComponent)
80
+ : undefined;
81
+ current = parentHierarchy?.parent ?? null;
82
+ }
83
+ return depth;
84
+ }
85
+
86
+ function computeNormalMatrix(worldMat: Matrix4): Float32Array {
87
+ // Normal matrix = inverse-TRANSPOSE of the world matrix, matching the
88
+ // renderer's reference `normalMatrixFromModel` (Renderer.ts):
89
+ // transpose(invert(model)), then extract the upper-left 3x3 into a 4x4
90
+ // with identity in the 4th row/col (column-major layout).
91
+ // Avoid crashing on singular matrices (zero scale) by falling back to identity.
92
+ try {
93
+ const m = worldMat.inverse().transpose().elements;
94
+ return new Float32Array([
95
+ m[0], m[1], m[2], 0,
96
+ m[4], m[5], m[6], 0,
97
+ m[8], m[9], m[10], 0,
98
+ 0, 0, 0, 1,
99
+ ]);
100
+ } catch {
101
+ return new Float32Array([
102
+ 1, 0, 0, 0,
103
+ 0, 1, 0, 0,
104
+ 0, 0, 1, 0,
105
+ 0, 0, 0, 1,
106
+ ]);
107
+ }
108
+ }
@@ -1,2 +1,4 @@
1
1
  export * from "./ActiveSystem.js";
2
2
  export * from "./HierarchySystem.js";
3
+ export * from "./TransformSystem.js";
4
+ export * from "./CameraSystem.js";