@carbonenginejs/runtime-trinity 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,5 @@
1
+ import { IDENTITY, Types, ZERO4, toRawLayout, buildLayouts } from './constantLayout.js';
2
+
1
3
  // Per-object constant-data layouts.
2
4
  //
3
5
  // This catalog has no CarbonEngine counterpart, which is why it is Cjs* rather
@@ -11,6 +13,9 @@
11
13
  // the entire binding contract: renaming a field is safe, reordering or resizing
12
14
  // one silently shifts every field after it.
13
15
  //
16
+ // The declaration vocabulary and the resolver are shared with the per-frame
17
+ // catalog; see constantLayout.js.
18
+ //
14
19
  // Layouts are grouped per object, with up to three buffers:
15
20
  //
16
21
  // vs - bound to the vertex stage (and cs/gs/hs/ds, per Carbon's mask)
@@ -27,53 +32,6 @@
27
32
  // "unwritten slots = allocator garbage". Declaring a default opts a field out
28
33
  // of that.
29
34
 
30
- /**
31
- * Declared C++ member types. String values rather than ordinals so a typo
32
- * throws at lookup instead of silently packing wrong, and a layout dump reads
33
- * `"matrix4"` rather than `3`.
34
- */
35
- const Types = Object.freeze({
36
- /** 16 floats. Stored transposed; written with SetAndTranspose. */
37
- MATRIX4: "matrix4",
38
- /** 4 floats. */
39
- QUATERNION: "quaternion",
40
- /** 4 floats. */
41
- VECTOR4: "vector4",
42
- /** 3 floats. */
43
- VECTOR3: "vector3",
44
- /** 2 floats. */
45
- VECTOR2: "vector2",
46
- /** 1 float. */
47
- FLOAT: "float",
48
- /** 1 lane, bit-cast into the buffer's Uint32 view. */
49
- UINT32: "uint32",
50
- /** 1 lane, two's-complement bit-cast. */
51
- INT32: "int32"
52
- });
53
-
54
- /** Float lanes per declared type. */
55
- const LANES = Object.freeze({
56
- [Types.MATRIX4]: 16,
57
- [Types.QUATERNION]: 4,
58
- [Types.VECTOR4]: 4,
59
- [Types.VECTOR3]: 3,
60
- [Types.VECTOR2]: 2,
61
- [Types.FLOAT]: 1,
62
- [Types.UINT32]: 1,
63
- [Types.INT32]: 1
64
- });
65
-
66
- /**
67
- * Declared type -> the encoder kind that writes its bytes. These are the string
68
- * values of `RawDataType`; see ToRawLayout for why they are not imported.
69
- */
70
- const ENCODINGS = Object.freeze({
71
- [Types.MATRIX4]: "matrix",
72
- [Types.UINT32]: "uint",
73
- [Types.INT32]: "int"
74
- });
75
- const ZERO4 = Object.freeze([0, 0, 0, 0]);
76
- const IDENTITY = Object.freeze([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
77
35
 
78
36
  /** EveTransform.h:161-163 - three matrices, the simplest placeable payload. */
79
37
  const EveBasic = Object.freeze({
@@ -759,13 +717,6 @@ const GROUPS = Object.freeze({
759
717
  Tr2PerObject
760
718
  });
761
719
 
762
- /** Which stages each group key binds to. */
763
- const STAGES = Object.freeze({
764
- vs: Object.freeze(["vs"]),
765
- ps: Object.freeze(["ps"]),
766
- shared: Object.freeze(["vs", "ps"])
767
- });
768
-
769
720
  /**
770
721
  * Resolved per-object layouts, keyed by struct name.
771
722
  *
@@ -799,44 +750,12 @@ class CjsPerObjectLayouts {
799
750
  * A layout in the shape RawData consumes: float offsets keyed by name,
800
751
  * plus the stride, stages, and the defaults to apply on allocation.
801
752
  *
802
- * Encodings are the string values of `RawDataType`, written literally
803
- * rather than imported so this module stays free of a cycle (RawData
804
- * imports this one for its persistent factory). `per-object-layouts.test.js`
805
- * asserts the two agree.
806
- *
807
- * A default on an array field is repeated across every element: the neutral
808
- * for a slot - identity for an unused custom mask - applies to every slot,
809
- * not just the first.
753
+ * `per-object-layouts.test.js` asserts the encodings agree with
754
+ * `RawDataType`, which constantLayout.js deliberately does not import.
810
755
  */
811
756
  static ToRawLayout(struct) {
812
757
  const layout = CjsPerObjectLayouts.Get(struct);
813
- if (!layout) {
814
- return null;
815
- }
816
- const fields = {};
817
- const defaults = [];
818
- for (const field of layout.fields.values()) {
819
- fields[field.name] = {
820
- offset: field.offset,
821
- size: field.size,
822
- elements: field.count,
823
- encoding: ENCODINGS[field.type] ?? "vector"
824
- };
825
- if (field.default) {
826
- defaults.push({
827
- offset: field.offset,
828
- values: field.count > 1 ? Array.from({
829
- length: field.count
830
- }, () => [...field.default]).flat() : [...field.default]
831
- });
832
- }
833
- }
834
- return {
835
- fields,
836
- stride: layout.stride,
837
- stages: layout.stages,
838
- defaults
839
- };
758
+ return layout ? toRawLayout(layout) : null;
840
759
  }
841
760
 
842
761
  /** The group a struct belongs to, with its stage key, or null. */
@@ -861,71 +780,11 @@ class CjsPerObjectLayouts {
861
780
  */
862
781
  static #Resolved() {
863
782
  if (!CjsPerObjectLayouts.#layouts) {
864
- CjsPerObjectLayouts.#layouts = buildLayouts();
783
+ CjsPerObjectLayouts.#layouts = buildLayouts(GROUPS, "CjsPerObjectLayouts");
865
784
  }
866
785
  return CjsPerObjectLayouts.#layouts;
867
786
  }
868
787
  }
869
788
 
870
- /** Resolves every group's buffers into flat, offset-bearing layouts. */
871
- function buildLayouts() {
872
- const layouts = new Map();
873
- for (const [group, buffers] of Object.entries(GROUPS)) {
874
- for (const [key, buffer] of Object.entries(buffers)) {
875
- if (layouts.has(buffer.struct)) {
876
- throw new Error(`CjsPerObjectLayouts: duplicate struct name "${buffer.struct}"`);
877
- }
878
- layouts.set(buffer.struct, resolveLayout(group, key, buffer));
879
- }
880
- }
881
- return layouts;
882
- }
883
-
884
- /** Lays out one buffer, asserting Carbon's two register invariants. */
885
- function resolveLayout(group, key, buffer) {
886
- const fields = new Map();
887
- let offset = 0;
888
- for (const [name, declared] of Object.entries(buffer.fields)) {
889
- const lanes = LANES[declared.type];
890
- if (lanes === undefined) {
891
- throw new Error(`CjsPerObjectLayouts: ${buffer.struct}.${name} has unknown type "${declared.type}"`);
892
- }
893
- const count = declared.count ?? 1;
894
-
895
- // Carbon hand-pads its per-object structs so no float4-sized member
896
- // ever needs implicit padding. A catalog entry that breaks that is
897
- // wrong, so it fails loud rather than silently inserting a gap.
898
- if (lanes >= 4 && offset % 4) {
899
- throw new Error(`CjsPerObjectLayouts: ${buffer.struct}.${name} would start at float ${offset}, ` + "which is not a register boundary");
900
- }
901
- fields.set(name, {
902
- name,
903
- type: declared.type,
904
- offset,
905
- size: lanes,
906
- count,
907
- default: declared.default ?? null,
908
- isMatrix: declared.type === Types.MATRIX4,
909
- isInteger: declared.type === Types.UINT32 || declared.type === Types.INT32
910
- });
911
- offset += lanes * count;
912
- }
913
-
914
- // Tr2PerObjectData.h:57 - "Size of per-object data must be a multiple of
915
- // Vector4". Reproduced so a bad catalog entry fails at build, not on screen.
916
- if (offset % 4) {
917
- throw new Error(`CjsPerObjectLayouts: ${buffer.struct} is ${offset} floats, not a multiple of Vector4`);
918
- }
919
- return Object.freeze({
920
- struct: buffer.struct,
921
- group,
922
- key,
923
- stages: STAGES[key] ?? STAGES.vs,
924
- fields,
925
- stride: offset,
926
- registerCount: offset / 4
927
- });
928
- }
929
-
930
789
  export { CjsPerObjectLayouts, EveBasic, EveBoosterSet, EveChildBulletStorm, EveChildSpherePin, EveLensflare, EveMissileWarhead, EvePerObject, EveSceneStaticParticles, EveSpaceObject, EveSpaceObjectDecal, EveSpacePerObject, EveSpherePin, EveStretch2, EveTurretSet, Tr2PerObject };
931
790
  //# sourceMappingURL=CjsPerObjectLayouts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CjsPerObjectLayouts.js","sources":["../../../../src/trinityCore/rawData/CjsPerObjectLayouts.js"],"sourcesContent":["// Per-object constant-data layouts.\n//\n// This catalog has no CarbonEngine counterpart, which is why it is Cjs* rather\n// than Tr2*/Tri*: C++ gets a struct's layout free from the type system\n// (`accumulator->Allocate<T>()` + placement new), so Carbon never needs to\n// declare one. JavaScript has to.\n//\n// Carbon uploads per-object data by memcpy'ing the C++ struct straight into the\n// constant buffer (EveSpaceObject2.cpp:1469-1483), so the C++ declaration order\n// IS the byte layout the shader reads. Field ORDER and field SIZE are therefore\n// the entire binding contract: renaming a field is safe, reordering or resizing\n// one silently shifts every field after it.\n//\n// Layouts are grouped per object, with up to three buffers:\n//\n// vs - bound to the vertex stage (and cs/gs/hs/ds, per Carbon's mask)\n// ps - bound to the pixel stage\n// shared - ONE buffer bound to both stages, where Carbon uploads the same\n// bytes twice rather than declaring a pair\n//\n// Every matrix stored here is TRANSPOSED, matching Carbon's `= Transpose(m)`\n// staging fill. See the carbon-math-conventions skill.\n//\n// Defaults are frozen and are COPIED into a record's buffer on allocation,\n// never assigned by reference. Carbon's arena does not clear on Alloc, so a\n// field with no default shows the previous tenant's bytes - that reproduces\n// \"unwritten slots = allocator garbage\". Declaring a default opts a field out\n// of that.\n\n\n/**\n * Declared C++ member types. String values rather than ordinals so a typo\n * throws at lookup instead of silently packing wrong, and a layout dump reads\n * `\"matrix4\"` rather than `3`.\n */\nconst Types = Object.freeze({\n /** 16 floats. Stored transposed; written with SetAndTranspose. */\n MATRIX4: \"matrix4\",\n\n /** 4 floats. */\n QUATERNION: \"quaternion\",\n\n /** 4 floats. */\n VECTOR4: \"vector4\",\n\n /** 3 floats. */\n VECTOR3: \"vector3\",\n\n /** 2 floats. */\n VECTOR2: \"vector2\",\n\n /** 1 float. */\n FLOAT: \"float\",\n\n /** 1 lane, bit-cast into the buffer's Uint32 view. */\n UINT32: \"uint32\",\n\n /** 1 lane, two's-complement bit-cast. */\n INT32: \"int32\"\n});\n\n\n/** Float lanes per declared type. */\nconst LANES = Object.freeze({\n [Types.MATRIX4]: 16,\n [Types.QUATERNION]: 4,\n [Types.VECTOR4]: 4,\n [Types.VECTOR3]: 3,\n [Types.VECTOR2]: 2,\n [Types.FLOAT]: 1,\n [Types.UINT32]: 1,\n [Types.INT32]: 1\n});\n\n\n/**\n * Declared type -> the encoder kind that writes its bytes. These are the string\n * values of `RawDataType`; see ToRawLayout for why they are not imported.\n */\nconst ENCODINGS = Object.freeze({\n [Types.MATRIX4]: \"matrix\",\n [Types.UINT32]: \"uint\",\n [Types.INT32]: \"int\"\n});\n\n\nconst ZERO4 = Object.freeze([0, 0, 0, 0]);\n\n\nconst IDENTITY = Object.freeze([\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n]);\n\n\n/** EveTransform.h:161-163 - three matrices, the simplest placeable payload. */\nexport const EveBasic = Object.freeze({\n vs: {\n struct: \"EveBasicPerObjectData\",\n fields: {\n world: { type: Types.MATRIX4, default: IDENTITY },\n worldLast: { type: Types.MATRIX4, default: IDENTITY },\n worldInverse: { type: Types.MATRIX4, default: IDENTITY }\n }\n }\n});\n\n\n/** EveMissileWarhead.h:194 */\nexport const EveMissileWarhead = Object.freeze({\n vs: {\n struct: \"EveMissileWarheadPerObjectData\",\n fields: {\n world: { type: Types.MATRIX4, default: IDENTITY },\n missileSize: { type: Types.VECTOR4 }\n }\n }\n});\n\n\n/** EveSceneStaticParticles.h:105 */\nexport const EveSceneStaticParticles = Object.freeze({\n vs: {\n struct: \"EveSceneStaticParticlesPerObjectData\",\n fields: {\n world: { type: Types.MATRIX4, default: IDENTITY },\n lastWorld: { type: Types.MATRIX4, default: IDENTITY }\n }\n }\n});\n\n\n/**\n * EveConstantBufferFormats.h:16/:11 - the generic Tr2PerObjectDataStandard\n * pair, consumed by EveLineSet / EveCurveLineSet / EveEllipseSet. Each half is\n * one WorldMat, uploaded as two separate buffers.\n */\nexport const EvePerObject = Object.freeze({\n vs: {\n struct: \"EvePerObjectVSData\",\n fields: { WorldMat: { type: Types.MATRIX4, default: IDENTITY } }\n },\n ps: {\n struct: \"EvePerObjectPSData\",\n fields: { WorldMat: { type: Types.MATRIX4, default: IDENTITY } }\n }\n});\n\n\n/**\n * EveLensflare.cpp:41-45 - same bytes bound to VS and PS. `indices[2..3]` are\n * never written in Carbon and are left as allocator garbage.\n */\nexport const EveLensflare = Object.freeze({\n shared: {\n struct: \"EveLensflarePerObjectData\",\n fields: {\n directionScale: { type: Types.VECTOR4 },\n indices: { type: Types.UINT32, count: 4 }\n }\n }\n});\n\n\n/** EveSpherePin.h:25 - the ui variant (EveSpherePin.cpp:415-425). */\nexport const EveSpherePin = Object.freeze({\n shared: {\n struct: \"EveSpherePinPerObjectData\",\n fields: {\n worldMatrix: { type: Types.MATRIX4, default: IDENTITY },\n pinPosition: { type: Types.VECTOR4 },\n pinRotation: { type: Types.VECTOR4 },\n pinColor: { type: Types.VECTOR4 },\n pinThreshold: { type: Types.VECTOR4 },\n pinRadiusPrecalc: { type: Types.VECTOR4 },\n pinUV: { type: Types.VECTOR4 }\n }\n }\n});\n\n\n/** EveChildSpherePin.h:16 - the same field run as the ui pin. */\nexport const EveChildSpherePin = Object.freeze({\n shared: {\n struct: \"EveChildSpherePinPerObjectData\",\n fields: {\n worldMatrix: { type: Types.MATRIX4, default: IDENTITY },\n pinPosition: { type: Types.VECTOR4 },\n pinRotation: { type: Types.VECTOR4 },\n pinColor: { type: Types.VECTOR4 },\n pinThreshold: { type: Types.VECTOR4 },\n pinRadiusPrecalc: { type: Types.VECTOR4 },\n pinUV: { type: Types.VECTOR4 }\n }\n }\n});\n\n\n/**\n * EveSpaceObjectDecal.h:27-45 - uploaded as two constant buffers\n * (cpp:975-976). `unused` shares clipRadius2Sq's register and is Carbon's\n * explicit pad; it is declared so the layout is right and never written.\n */\nexport const EveSpaceObjectDecal = Object.freeze({\n vs: {\n struct: \"DecalVSPerObjectData\",\n fields: {\n worldMatrix: { type: Types.MATRIX4, default: IDENTITY },\n invWorldMatrix: { type: Types.MATRIX4, default: IDENTITY },\n decalMatrix: { type: Types.MATRIX4, default: IDENTITY },\n inverseDecalMatrix: { type: Types.MATRIX4, default: IDENTITY },\n parentBoneMatrix: { type: Types.MATRIX4, default: IDENTITY },\n invParentBoneMatrix: { type: Types.MATRIX4, default: IDENTITY }\n }\n },\n ps: {\n struct: \"DecalPSPerObjectData\",\n fields: {\n // .x killCount (a uint widened to float), .y the 0..1 visibility\n // ramp, .zw reserved (cpp:369-382).\n displayData: { type: Types.VECTOR4 },\n shipData: { type: Types.VECTOR4 },\n clipData: { type: Types.VECTOR4 },\n clipRadius2Sq: { type: Types.FLOAT },\n unused: { type: Types.VECTOR3 },\n shLightingCoefficients: { type: Types.VECTOR4, count: 7, default: ZERO4 }\n }\n }\n});\n\n\n/**\n * EveBoosterSet2.h:48-71 - a VertexShaderData + PixelShaderData pair uploaded\n * as two constant buffers (cpp:1325-1329). `boosterIntensity` is declared on\n * BOTH stages and written separately for each; it is not a duplicate. The\n * padding scalars are Carbon's explicit register pads and stay unwritten.\n */\nexport const EveBoosterSet = Object.freeze({\n vs: {\n struct: \"EveBoosterSetVSData\",\n fields: {\n shipMatrix: { type: Types.MATRIX4, default: IDENTITY },\n boosterIntensity: { type: Types.FLOAT },\n shipSpeed: { type: Types.FLOAT },\n maxBoosterSize: { type: Types.FLOAT },\n padding: { type: Types.FLOAT },\n // EVE_MAX_CONTROL_POINT_COUNT (EveBoosterSet2.h:36)\n trailsControlPositions: { type: Types.VECTOR4, count: 5 },\n trailsControlNormals: { type: Types.VECTOR4, count: 5 }\n }\n },\n ps: {\n struct: \"EveBoosterSetPSData\",\n fields: {\n boosterIntensity: { type: Types.FLOAT },\n trailIntensity: { type: Types.FLOAT },\n warpIntensity: { type: Types.FLOAT },\n padding2: { type: Types.FLOAT }\n }\n }\n});\n\n\n/**\n * EveChildBulletStorm.h:20 - VS only. `targetPositionsWS` slots past the filled\n * target count stay allocator garbage (cpp:403-407); the bound is a bare\n * literal `[10]` in Carbon, not a named constant.\n */\nexport const EveChildBulletStorm = Object.freeze({\n vs: {\n struct: \"EveChildBulletStormPerObjectData\",\n fields: {\n worldTransform: { type: Types.MATRIX4, default: IDENTITY },\n effectInfo: { type: Types.VECTOR4 },\n targetPositionsWS: { type: Types.VECTOR4, count: 10 }\n }\n }\n});\n\n\n/**\n * EveStretch2.cpp:327-337 - Carbon uploads the contiguous member run\n * m_source..m_effectData[2] (EveStretch2.h:105-109) as four vec4s to VS and PS.\n */\nexport const EveStretch2 = Object.freeze({\n shared: {\n struct: \"EveStretch2PerObjectData\",\n fields: {\n sourceData: { type: Types.VECTOR4 },\n destinationData: { type: Types.VECTOR4 },\n effectData: { type: Types.VECTOR4, count: 2 }\n }\n }\n});\n\n\n/**\n * EveSpaceObject2.h:99 (vs) / :122 (ps) - the persistent pair. Unlike every\n * other entry here these live as members on the owner across frames and are\n * READ BACK (GetParentData cpp:1877-1883, GetPerObjectStructs cpp:1485-1490),\n * which is why the record exposes Get accessors at all.\n *\n * The HLSL counterpart names are from shadercompiler/tests/RayTracingTest.cpp:654-666,\n * which declares this block field-for-field.\n */\nexport const EveSpaceObject = Object.freeze({\n vs: {\n struct: \"EveSpaceObjectVSData\",\n fields: {\n worldTransform: { type: Types.MATRIX4, default: IDENTITY },\n worldTransformLast: { type: Types.MATRIX4, default: IDENTITY },\n invWorldTransform: { type: Types.MATRIX4, default: IDENTITY },\n // Four independent floats, not a bitfield: .x booster glow\n // intensity, .y activation strength, .z dirt level, .w bounding\n // sphere radius. Constructor value at cpp:195.\n shipData: { type: Types.VECTOR4, default: Object.freeze([1, 1, 0, 1]) },\n clipData: { type: Types.VECTOR4 },\n // Carbon's spelling (sic) - \"ellpsoid\" matches the source struct.\n ellpsoidRadii: { type: Types.VECTOR4 },\n ellpsoidCenter: { type: Types.VECTOR4 },\n // EVE_SPACEOBJECT_CUSTOWMASK_MAX (sic) = 2, EveSpaceObject2.h:49.\n // EveCustomMask::ZeroPerObjectData writes IDENTITY into an unused\n // slot, not zero (EveCustomMask.cpp:88-93).\n customMaskMatrix: { type: Types.MATRIX4, count: 2, default: IDENTITY },\n customMaskData: { type: Types.VECTOR4, count: 2 },\n // GPU ring offsets - engine-owned, no CPU derivation exists.\n boneOffsets: { type: Types.UINT32, count: 4 },\n morphTargetVertexDataOffset: { type: Types.UINT32 },\n morphTargetAnimationDataOffset: { type: Types.UINT32 },\n activeMorphTargetsCount: { type: Types.UINT32 },\n bakedMorphTargetVertexDataOffset: { type: Types.UINT32 },\n customData: { type: Types.VECTOR4, default: Object.freeze([0, 0, 0, 0]) }\n }\n },\n ps: {\n struct: \"EveSpaceObjectPSData\",\n fields: {\n worldTransform: { type: Types.MATRIX4, default: IDENTITY },\n worldTransformLast: { type: Types.MATRIX4, default: IDENTITY },\n invWorldTransform: { type: Types.MATRIX4, default: IDENTITY },\n shipData: { type: Types.VECTOR4, default: Object.freeze([1, 1, 0, 1]) },\n // Clipdata1.xyz / .w - a SIGNED squared radius; the sign carries\n // the inside/outside test (RayTracingTest.cpp:678-679).\n clipSphereCenter: { type: Types.VECTOR3 },\n clipRadiusSq: { type: Types.FLOAT },\n // Miscdata.xyzw - all four lanes used.\n clipRadius2Sq: { type: Types.FLOAT },\n impactDataOffset: { type: Types.FLOAT },\n clipSphereFactor2: { type: Types.FLOAT },\n clipSphereFactor: { type: Types.FLOAT },\n // Tr2ShLightingManager::PACKED_COEFFICIENT_COUNT = 7.\n shLightingCoefficients: { type: Types.VECTOR4, count: 7, default: ZERO4 },\n customMaskMaterialIDs: { type: Types.VECTOR4, count: 2 },\n customMaskTargets: { type: Types.VECTOR4, count: 2 },\n // Both slots packed into one vec4: (u0, v0, u1, v1).\n customMaskClamps: { type: Types.VECTOR4 },\n // EveSpaceObject2 never writes this; the children's literal is the\n // only documented neutral (EveChildMesh.cpp:65).\n screenSize: { type: Types.VECTOR4, default: Object.freeze([0.5, 0.5, 0.5, 1]) },\n customData: { type: Types.VECTOR4, default: Object.freeze([0, 0, 0, 0]) }\n }\n }\n});\n\n\n/**\n * EveTurretSet.h:47 (vs) / :63 (ps). The turret translation and rotation rings\n * are filled for VISIBLE turrets only; the remainder stays allocator garbage.\n */\nexport const EveTurretSet = Object.freeze({\n vs: {\n struct: \"EveTurretSetVSData\",\n fields: {\n baseCutoffData: { type: Types.VECTOR4 },\n turretSetData: { type: Types.VECTOR4 },\n shipMatrix: { type: Types.MATRIX4, default: IDENTITY },\n prevShipMatrix: { type: Types.MATRIX4, default: IDENTITY },\n // GPU bone-ring offsets - engine-owned.\n currentBoneOffset: { type: Types.UINT32 },\n prevBoneOffset: { type: Types.UINT32 },\n _unused: { type: Types.UINT32, count: 2 },\n // EVE_MAX_TURRETS_PER_SET (EveTurretSet.h:43)\n turretTranslation: { type: Types.VECTOR4, count: 24 },\n turretRotation: { type: Types.QUATERNION, count: 24 }\n }\n },\n ps: {\n struct: \"EveTurretSetPSData\",\n fields: {\n shipData: { type: Types.VECTOR4 },\n clipData1: { type: Types.VECTOR4 },\n clipRadius2Sq: { type: Types.FLOAT },\n unused: { type: Types.VECTOR3 },\n shLightingCoefficients: { type: Types.VECTOR4, count: 7, default: ZERO4 }\n }\n }\n});\n\n\n/**\n * EveSpaceObject2.h:143 - the merged VS+PS variant used by the instanced path.\n * Uploaded through a STRUCTURED BUFFER rather than a constant buffer\n * (EveInstancedMeshManager.cpp:69-77), so it carries no register.\n *\n * Field order is NOT the same as the EveSpaceObject VS/PS pair: the five clip\n * scalars sit at fields 6-10 here, before the ellipsoid. Since the upload is a\n * raw memcpy, that order is the contract.\n */\nexport const EveSpacePerObject = Object.freeze({\n shared: {\n struct: \"EveSpacePerObjectData\",\n fields: {\n worldTransform: { type: Types.MATRIX4, default: IDENTITY },\n worldTransformLast: { type: Types.MATRIX4, default: IDENTITY },\n invWorldTransform: { type: Types.MATRIX4, default: IDENTITY },\n // This struct's own initialiser is (0,0,0,0), unlike the\n // EveSpaceObject2 constructor's (1,1,0,1).\n shipData: { type: Types.VECTOR4 },\n clipSphereCenter: { type: Types.VECTOR3 },\n clipRadiusSq: { type: Types.FLOAT },\n clipRadius2Sq: { type: Types.FLOAT },\n impactDataOffset: { type: Types.FLOAT },\n clipSphereFactor2: { type: Types.FLOAT },\n clipSphereFactor: { type: Types.FLOAT },\n ellpsoidRadii: { type: Types.VECTOR4 },\n ellpsoidCenter: { type: Types.VECTOR4 },\n // EveSpaceObject2.h:160 initialises this to all-zero, contradicting\n // EveCustomMask::ZeroPerObjectData's IdentityMatrix. The zero path\n // is the live one, so identity wins; reproduced as written.\n customMaskMatrix: { type: Types.MATRIX4, count: 2, default: IDENTITY },\n customMaskData: { type: Types.VECTOR4, count: 2 },\n customMaskMaterialIDs: { type: Types.VECTOR4, count: 2 },\n customMaskTargets: { type: Types.VECTOR4, count: 2 },\n customMaskClamps: { type: Types.VECTOR4 },\n boneOffsets: { type: Types.UINT32, count: 4 },\n customData: { type: Types.VECTOR4 },\n shLighting: { type: Types.VECTOR4, count: 7, default: ZERO4 }\n }\n }\n});\n\n\n/** Tr2ConstantBufferFormats.h:35 - the generic, non-EVE per-object block. */\n/**\n * Tr2ConstantBufferFormats.h:35. Catalogued but deliberately PRODUCERLESS in\n * this package: its only Carbon filler is `Tr2InteriorPlaceable::GetPerObjectData`\n * (Interior/Tr2InteriorPlaceable.cpp:555-585), and interior placeables are not\n * runtime-trinity classes. The layout lives here because the catalog is the\n * org-wide truth, exported on the `/perobject` subpath; whichever package ports\n * the placeable consumes it from there rather than redeclaring it.\n */\nexport const Tr2PerObject = Object.freeze({\n vs: {\n struct: \"Tr2PerObjectVSData\",\n fields: {\n WorldMat: { type: Types.MATRIX4, default: IDENTITY },\n boundingCylinderLocalHeight: { type: Types.FLOAT },\n boundingCylinderLocalXZCenter: { type: Types.VECTOR2 },\n boundingCylinderRotation: { type: Types.FLOAT }\n }\n }\n});\n\n\nconst GROUPS = Object.freeze({\n EveBasic,\n EveMissileWarhead,\n EveSceneStaticParticles,\n EvePerObject,\n EveLensflare,\n EveSpherePin,\n EveChildSpherePin,\n EveSpaceObjectDecal,\n EveBoosterSet,\n EveChildBulletStorm,\n EveStretch2,\n EveSpaceObject,\n EveTurretSet,\n EveSpacePerObject,\n Tr2PerObject\n});\n\n\n/** Which stages each group key binds to. */\nconst STAGES = Object.freeze({\n vs: Object.freeze([\"vs\"]),\n ps: Object.freeze([\"ps\"]),\n shared: Object.freeze([\"vs\", \"ps\"])\n});\n\n\n/**\n * Resolved per-object layouts, keyed by struct name.\n *\n * Offsets are FLOAT offsets from the start of one record. Carbon's C++ layout\n * needs no padding here because every per-object struct is hand-padded with\n * explicit `_unused` / `padding` members so each float4-sized member already\n * lands on a register boundary; both invariants are asserted at build time.\n */\nexport class CjsPerObjectLayouts\n{\n\n static Types = Types;\n\n static Groups = GROUPS;\n\n /** Resolved layouts by struct name, built once. */\n static #layouts = null;\n\n /**\n * The layout for one struct name, or null when it is not catalogued. A\n * caller must treat null as \"not covered\" and fail rather than guess.\n */\n static Get(struct)\n {\n const layouts = CjsPerObjectLayouts.#Resolved();\n\n return layouts.get(struct) ?? null;\n }\n\n /** Every catalogued struct name. */\n static Names()\n {\n return [...CjsPerObjectLayouts.#Resolved().keys()];\n }\n\n /**\n * A layout in the shape RawData consumes: float offsets keyed by name,\n * plus the stride, stages, and the defaults to apply on allocation.\n *\n * Encodings are the string values of `RawDataType`, written literally\n * rather than imported so this module stays free of a cycle (RawData\n * imports this one for its persistent factory). `per-object-layouts.test.js`\n * asserts the two agree.\n *\n * A default on an array field is repeated across every element: the neutral\n * for a slot - identity for an unused custom mask - applies to every slot,\n * not just the first.\n */\n static ToRawLayout(struct)\n {\n const layout = CjsPerObjectLayouts.Get(struct);\n\n if (!layout)\n {\n return null;\n }\n\n const fields = {};\n const defaults = [];\n\n for (const field of layout.fields.values())\n {\n fields[field.name] = {\n offset: field.offset,\n size: field.size,\n elements: field.count,\n encoding: ENCODINGS[field.type] ?? \"vector\"\n };\n\n if (field.default)\n {\n defaults.push({\n offset: field.offset,\n values: field.count > 1\n ? Array.from({ length: field.count }, () => [ ...field.default ]).flat()\n : [ ...field.default ]\n });\n }\n }\n\n return { fields, stride: layout.stride, stages: layout.stages, defaults };\n }\n\n /** The group a struct belongs to, with its stage key, or null. */\n static Find(struct)\n {\n for (const [group, buffers] of Object.entries(GROUPS))\n {\n for (const [key, buffer] of Object.entries(buffers))\n {\n if (buffer.struct === struct)\n {\n return { group, key, buffer };\n }\n }\n }\n\n return null;\n }\n\n /**\n * The resolved layout map, built once on first use and cached.\n * @returns {Map} struct name -> resolved layout\n */\n static #Resolved()\n {\n if (!CjsPerObjectLayouts.#layouts)\n {\n CjsPerObjectLayouts.#layouts = buildLayouts();\n }\n\n return CjsPerObjectLayouts.#layouts;\n }\n\n}\n\n\n/** Resolves every group's buffers into flat, offset-bearing layouts. */\nfunction buildLayouts()\n{\n const layouts = new Map();\n\n for (const [group, buffers] of Object.entries(GROUPS))\n {\n for (const [key, buffer] of Object.entries(buffers))\n {\n if (layouts.has(buffer.struct))\n {\n throw new Error(`CjsPerObjectLayouts: duplicate struct name \"${buffer.struct}\"`);\n }\n\n layouts.set(buffer.struct, resolveLayout(group, key, buffer));\n }\n }\n\n return layouts;\n}\n\n\n/** Lays out one buffer, asserting Carbon's two register invariants. */\nfunction resolveLayout(group, key, buffer)\n{\n const fields = new Map();\n let offset = 0;\n\n for (const [name, declared] of Object.entries(buffer.fields))\n {\n const lanes = LANES[declared.type];\n\n if (lanes === undefined)\n {\n throw new Error(`CjsPerObjectLayouts: ${buffer.struct}.${name} has unknown type \"${declared.type}\"`);\n }\n\n const count = declared.count ?? 1;\n\n // Carbon hand-pads its per-object structs so no float4-sized member\n // ever needs implicit padding. A catalog entry that breaks that is\n // wrong, so it fails loud rather than silently inserting a gap.\n if (lanes >= 4 && offset % 4)\n {\n throw new Error(\n `CjsPerObjectLayouts: ${buffer.struct}.${name} would start at float ${offset}, `\n + \"which is not a register boundary\"\n );\n }\n\n fields.set(name, {\n name,\n type: declared.type,\n offset,\n size: lanes,\n count,\n default: declared.default ?? null,\n isMatrix: declared.type === Types.MATRIX4,\n isInteger: declared.type === Types.UINT32 || declared.type === Types.INT32\n });\n\n offset += lanes * count;\n }\n\n // Tr2PerObjectData.h:57 - \"Size of per-object data must be a multiple of\n // Vector4\". Reproduced so a bad catalog entry fails at build, not on screen.\n if (offset % 4)\n {\n throw new Error(\n `CjsPerObjectLayouts: ${buffer.struct} is ${offset} floats, not a multiple of Vector4`\n );\n }\n\n return Object.freeze({\n struct: buffer.struct,\n group,\n key,\n stages: STAGES[key] ?? STAGES.vs,\n fields,\n stride: offset,\n registerCount: offset / 4\n });\n}\n"],"names":["Types","Object","freeze","MATRIX4","QUATERNION","VECTOR4","VECTOR3","VECTOR2","FLOAT","UINT32","INT32","LANES","ENCODINGS","ZERO4","IDENTITY","EveBasic","vs","struct","fields","world","type","default","worldLast","worldInverse","EveMissileWarhead","missileSize","EveSceneStaticParticles","lastWorld","EvePerObject","WorldMat","ps","EveLensflare","shared","directionScale","indices","count","EveSpherePin","worldMatrix","pinPosition","pinRotation","pinColor","pinThreshold","pinRadiusPrecalc","pinUV","EveChildSpherePin","EveSpaceObjectDecal","invWorldMatrix","decalMatrix","inverseDecalMatrix","parentBoneMatrix","invParentBoneMatrix","displayData","shipData","clipData","clipRadius2Sq","unused","shLightingCoefficients","EveBoosterSet","shipMatrix","boosterIntensity","shipSpeed","maxBoosterSize","padding","trailsControlPositions","trailsControlNormals","trailIntensity","warpIntensity","padding2","EveChildBulletStorm","worldTransform","effectInfo","targetPositionsWS","EveStretch2","sourceData","destinationData","effectData","EveSpaceObject","worldTransformLast","invWorldTransform","ellpsoidRadii","ellpsoidCenter","customMaskMatrix","customMaskData","boneOffsets","morphTargetVertexDataOffset","morphTargetAnimationDataOffset","activeMorphTargetsCount","bakedMorphTargetVertexDataOffset","customData","clipSphereCenter","clipRadiusSq","impactDataOffset","clipSphereFactor2","clipSphereFactor","customMaskMaterialIDs","customMaskTargets","customMaskClamps","screenSize","EveTurretSet","baseCutoffData","turretSetData","prevShipMatrix","currentBoneOffset","prevBoneOffset","_unused","turretTranslation","turretRotation","clipData1","EveSpacePerObject","shLighting","Tr2PerObject","boundingCylinderLocalHeight","boundingCylinderLocalXZCenter","boundingCylinderRotation","GROUPS","STAGES","CjsPerObjectLayouts","Groups","Get","layouts","get","Names","keys","ToRawLayout","layout","defaults","field","values","name","offset","size","elements","encoding","push","Array","from","length","flat","stride","stages","Find","group","buffers","entries","key","buffer","#Resolved","buildLayouts","Map","has","Error","set","resolveLayout","declared","lanes","undefined","isMatrix","isInteger","registerCount"],"mappings":"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"}
1
+ {"version":3,"file":"CjsPerObjectLayouts.js","sources":["../../../../src/trinityCore/rawData/CjsPerObjectLayouts.js"],"sourcesContent":["// Per-object constant-data layouts.\n//\n// This catalog has no CarbonEngine counterpart, which is why it is Cjs* rather\n// than Tr2*/Tri*: C++ gets a struct's layout free from the type system\n// (`accumulator->Allocate<T>()` + placement new), so Carbon never needs to\n// declare one. JavaScript has to.\n//\n// Carbon uploads per-object data by memcpy'ing the C++ struct straight into the\n// constant buffer (EveSpaceObject2.cpp:1469-1483), so the C++ declaration order\n// IS the byte layout the shader reads. Field ORDER and field SIZE are therefore\n// the entire binding contract: renaming a field is safe, reordering or resizing\n// one silently shifts every field after it.\n//\n// The declaration vocabulary and the resolver are shared with the per-frame\n// catalog; see constantLayout.js.\n//\n// Layouts are grouped per object, with up to three buffers:\n//\n// vs - bound to the vertex stage (and cs/gs/hs/ds, per Carbon's mask)\n// ps - bound to the pixel stage\n// shared - ONE buffer bound to both stages, where Carbon uploads the same\n// bytes twice rather than declaring a pair\n//\n// Every matrix stored here is TRANSPOSED, matching Carbon's `= Transpose(m)`\n// staging fill. See the carbon-math-conventions skill.\n//\n// Defaults are frozen and are COPIED into a record's buffer on allocation,\n// never assigned by reference. Carbon's arena does not clear on Alloc, so a\n// field with no default shows the previous tenant's bytes - that reproduces\n// \"unwritten slots = allocator garbage\". Declaring a default opts a field out\n// of that.\n\n\nimport { IDENTITY, Types, ZERO4, buildLayouts, toRawLayout } from \"./constantLayout.js\";\n\n\n/** EveTransform.h:161-163 - three matrices, the simplest placeable payload. */\nexport const EveBasic = Object.freeze({\n vs: {\n struct: \"EveBasicPerObjectData\",\n fields: {\n world: { type: Types.MATRIX4, default: IDENTITY },\n worldLast: { type: Types.MATRIX4, default: IDENTITY },\n worldInverse: { type: Types.MATRIX4, default: IDENTITY }\n }\n }\n});\n\n\n/** EveMissileWarhead.h:194 */\nexport const EveMissileWarhead = Object.freeze({\n vs: {\n struct: \"EveMissileWarheadPerObjectData\",\n fields: {\n world: { type: Types.MATRIX4, default: IDENTITY },\n missileSize: { type: Types.VECTOR4 }\n }\n }\n});\n\n\n/** EveSceneStaticParticles.h:105 */\nexport const EveSceneStaticParticles = Object.freeze({\n vs: {\n struct: \"EveSceneStaticParticlesPerObjectData\",\n fields: {\n world: { type: Types.MATRIX4, default: IDENTITY },\n lastWorld: { type: Types.MATRIX4, default: IDENTITY }\n }\n }\n});\n\n\n/**\n * EveConstantBufferFormats.h:16/:11 - the generic Tr2PerObjectDataStandard\n * pair, consumed by EveLineSet / EveCurveLineSet / EveEllipseSet. Each half is\n * one WorldMat, uploaded as two separate buffers.\n */\nexport const EvePerObject = Object.freeze({\n vs: {\n struct: \"EvePerObjectVSData\",\n fields: { WorldMat: { type: Types.MATRIX4, default: IDENTITY } }\n },\n ps: {\n struct: \"EvePerObjectPSData\",\n fields: { WorldMat: { type: Types.MATRIX4, default: IDENTITY } }\n }\n});\n\n\n/**\n * EveLensflare.cpp:41-45 - same bytes bound to VS and PS. `indices[2..3]` are\n * never written in Carbon and are left as allocator garbage.\n */\nexport const EveLensflare = Object.freeze({\n shared: {\n struct: \"EveLensflarePerObjectData\",\n fields: {\n directionScale: { type: Types.VECTOR4 },\n indices: { type: Types.UINT32, count: 4 }\n }\n }\n});\n\n\n/** EveSpherePin.h:25 - the ui variant (EveSpherePin.cpp:415-425). */\nexport const EveSpherePin = Object.freeze({\n shared: {\n struct: \"EveSpherePinPerObjectData\",\n fields: {\n worldMatrix: { type: Types.MATRIX4, default: IDENTITY },\n pinPosition: { type: Types.VECTOR4 },\n pinRotation: { type: Types.VECTOR4 },\n pinColor: { type: Types.VECTOR4 },\n pinThreshold: { type: Types.VECTOR4 },\n pinRadiusPrecalc: { type: Types.VECTOR4 },\n pinUV: { type: Types.VECTOR4 }\n }\n }\n});\n\n\n/** EveChildSpherePin.h:16 - the same field run as the ui pin. */\nexport const EveChildSpherePin = Object.freeze({\n shared: {\n struct: \"EveChildSpherePinPerObjectData\",\n fields: {\n worldMatrix: { type: Types.MATRIX4, default: IDENTITY },\n pinPosition: { type: Types.VECTOR4 },\n pinRotation: { type: Types.VECTOR4 },\n pinColor: { type: Types.VECTOR4 },\n pinThreshold: { type: Types.VECTOR4 },\n pinRadiusPrecalc: { type: Types.VECTOR4 },\n pinUV: { type: Types.VECTOR4 }\n }\n }\n});\n\n\n/**\n * EveSpaceObjectDecal.h:27-45 - uploaded as two constant buffers\n * (cpp:975-976). `unused` shares clipRadius2Sq's register and is Carbon's\n * explicit pad; it is declared so the layout is right and never written.\n */\nexport const EveSpaceObjectDecal = Object.freeze({\n vs: {\n struct: \"DecalVSPerObjectData\",\n fields: {\n worldMatrix: { type: Types.MATRIX4, default: IDENTITY },\n invWorldMatrix: { type: Types.MATRIX4, default: IDENTITY },\n decalMatrix: { type: Types.MATRIX4, default: IDENTITY },\n inverseDecalMatrix: { type: Types.MATRIX4, default: IDENTITY },\n parentBoneMatrix: { type: Types.MATRIX4, default: IDENTITY },\n invParentBoneMatrix: { type: Types.MATRIX4, default: IDENTITY }\n }\n },\n ps: {\n struct: \"DecalPSPerObjectData\",\n fields: {\n // .x killCount (a uint widened to float), .y the 0..1 visibility\n // ramp, .zw reserved (cpp:369-382).\n displayData: { type: Types.VECTOR4 },\n shipData: { type: Types.VECTOR4 },\n clipData: { type: Types.VECTOR4 },\n clipRadius2Sq: { type: Types.FLOAT },\n unused: { type: Types.VECTOR3 },\n shLightingCoefficients: { type: Types.VECTOR4, count: 7, default: ZERO4 }\n }\n }\n});\n\n\n/**\n * EveBoosterSet2.h:48-71 - a VertexShaderData + PixelShaderData pair uploaded\n * as two constant buffers (cpp:1325-1329). `boosterIntensity` is declared on\n * BOTH stages and written separately for each; it is not a duplicate. The\n * padding scalars are Carbon's explicit register pads and stay unwritten.\n */\nexport const EveBoosterSet = Object.freeze({\n vs: {\n struct: \"EveBoosterSetVSData\",\n fields: {\n shipMatrix: { type: Types.MATRIX4, default: IDENTITY },\n boosterIntensity: { type: Types.FLOAT },\n shipSpeed: { type: Types.FLOAT },\n maxBoosterSize: { type: Types.FLOAT },\n padding: { type: Types.FLOAT },\n // EVE_MAX_CONTROL_POINT_COUNT (EveBoosterSet2.h:36)\n trailsControlPositions: { type: Types.VECTOR4, count: 5 },\n trailsControlNormals: { type: Types.VECTOR4, count: 5 }\n }\n },\n ps: {\n struct: \"EveBoosterSetPSData\",\n fields: {\n boosterIntensity: { type: Types.FLOAT },\n trailIntensity: { type: Types.FLOAT },\n warpIntensity: { type: Types.FLOAT },\n padding2: { type: Types.FLOAT }\n }\n }\n});\n\n\n/**\n * EveChildBulletStorm.h:20 - VS only. `targetPositionsWS` slots past the filled\n * target count stay allocator garbage (cpp:403-407); the bound is a bare\n * literal `[10]` in Carbon, not a named constant.\n */\nexport const EveChildBulletStorm = Object.freeze({\n vs: {\n struct: \"EveChildBulletStormPerObjectData\",\n fields: {\n worldTransform: { type: Types.MATRIX4, default: IDENTITY },\n effectInfo: { type: Types.VECTOR4 },\n targetPositionsWS: { type: Types.VECTOR4, count: 10 }\n }\n }\n});\n\n\n/**\n * EveStretch2.cpp:327-337 - Carbon uploads the contiguous member run\n * m_source..m_effectData[2] (EveStretch2.h:105-109) as four vec4s to VS and PS.\n */\nexport const EveStretch2 = Object.freeze({\n shared: {\n struct: \"EveStretch2PerObjectData\",\n fields: {\n sourceData: { type: Types.VECTOR4 },\n destinationData: { type: Types.VECTOR4 },\n effectData: { type: Types.VECTOR4, count: 2 }\n }\n }\n});\n\n\n/**\n * EveSpaceObject2.h:99 (vs) / :122 (ps) - the persistent pair. Unlike every\n * other entry here these live as members on the owner across frames and are\n * READ BACK (GetParentData cpp:1877-1883, GetPerObjectStructs cpp:1485-1490),\n * which is why the record exposes Get accessors at all.\n *\n * The HLSL counterpart names are from shadercompiler/tests/RayTracingTest.cpp:654-666,\n * which declares this block field-for-field.\n */\nexport const EveSpaceObject = Object.freeze({\n vs: {\n struct: \"EveSpaceObjectVSData\",\n fields: {\n worldTransform: { type: Types.MATRIX4, default: IDENTITY },\n worldTransformLast: { type: Types.MATRIX4, default: IDENTITY },\n invWorldTransform: { type: Types.MATRIX4, default: IDENTITY },\n // Four independent floats, not a bitfield: .x booster glow\n // intensity, .y activation strength, .z dirt level, .w bounding\n // sphere radius. Constructor value at cpp:195.\n shipData: { type: Types.VECTOR4, default: Object.freeze([1, 1, 0, 1]) },\n clipData: { type: Types.VECTOR4 },\n // Carbon's spelling (sic) - \"ellpsoid\" matches the source struct.\n ellpsoidRadii: { type: Types.VECTOR4 },\n ellpsoidCenter: { type: Types.VECTOR4 },\n // EVE_SPACEOBJECT_CUSTOWMASK_MAX (sic) = 2, EveSpaceObject2.h:49.\n // EveCustomMask::ZeroPerObjectData writes IDENTITY into an unused\n // slot, not zero (EveCustomMask.cpp:88-93).\n customMaskMatrix: { type: Types.MATRIX4, count: 2, default: IDENTITY },\n customMaskData: { type: Types.VECTOR4, count: 2 },\n // GPU ring offsets - engine-owned, no CPU derivation exists.\n boneOffsets: { type: Types.UINT32, count: 4 },\n morphTargetVertexDataOffset: { type: Types.UINT32 },\n morphTargetAnimationDataOffset: { type: Types.UINT32 },\n activeMorphTargetsCount: { type: Types.UINT32 },\n bakedMorphTargetVertexDataOffset: { type: Types.UINT32 },\n customData: { type: Types.VECTOR4, default: Object.freeze([0, 0, 0, 0]) }\n }\n },\n ps: {\n struct: \"EveSpaceObjectPSData\",\n fields: {\n worldTransform: { type: Types.MATRIX4, default: IDENTITY },\n worldTransformLast: { type: Types.MATRIX4, default: IDENTITY },\n invWorldTransform: { type: Types.MATRIX4, default: IDENTITY },\n shipData: { type: Types.VECTOR4, default: Object.freeze([1, 1, 0, 1]) },\n // Clipdata1.xyz / .w - a SIGNED squared radius; the sign carries\n // the inside/outside test (RayTracingTest.cpp:678-679).\n clipSphereCenter: { type: Types.VECTOR3 },\n clipRadiusSq: { type: Types.FLOAT },\n // Miscdata.xyzw - all four lanes used.\n clipRadius2Sq: { type: Types.FLOAT },\n impactDataOffset: { type: Types.FLOAT },\n clipSphereFactor2: { type: Types.FLOAT },\n clipSphereFactor: { type: Types.FLOAT },\n // Tr2ShLightingManager::PACKED_COEFFICIENT_COUNT = 7.\n shLightingCoefficients: { type: Types.VECTOR4, count: 7, default: ZERO4 },\n customMaskMaterialIDs: { type: Types.VECTOR4, count: 2 },\n customMaskTargets: { type: Types.VECTOR4, count: 2 },\n // Both slots packed into one vec4: (u0, v0, u1, v1).\n customMaskClamps: { type: Types.VECTOR4 },\n // EveSpaceObject2 never writes this; the children's literal is the\n // only documented neutral (EveChildMesh.cpp:65).\n screenSize: { type: Types.VECTOR4, default: Object.freeze([0.5, 0.5, 0.5, 1]) },\n customData: { type: Types.VECTOR4, default: Object.freeze([0, 0, 0, 0]) }\n }\n }\n});\n\n\n/**\n * EveTurretSet.h:47 (vs) / :63 (ps). The turret translation and rotation rings\n * are filled for VISIBLE turrets only; the remainder stays allocator garbage.\n */\nexport const EveTurretSet = Object.freeze({\n vs: {\n struct: \"EveTurretSetVSData\",\n fields: {\n baseCutoffData: { type: Types.VECTOR4 },\n turretSetData: { type: Types.VECTOR4 },\n shipMatrix: { type: Types.MATRIX4, default: IDENTITY },\n prevShipMatrix: { type: Types.MATRIX4, default: IDENTITY },\n // GPU bone-ring offsets - engine-owned.\n currentBoneOffset: { type: Types.UINT32 },\n prevBoneOffset: { type: Types.UINT32 },\n _unused: { type: Types.UINT32, count: 2 },\n // EVE_MAX_TURRETS_PER_SET (EveTurretSet.h:43)\n turretTranslation: { type: Types.VECTOR4, count: 24 },\n turretRotation: { type: Types.QUATERNION, count: 24 }\n }\n },\n ps: {\n struct: \"EveTurretSetPSData\",\n fields: {\n shipData: { type: Types.VECTOR4 },\n clipData1: { type: Types.VECTOR4 },\n clipRadius2Sq: { type: Types.FLOAT },\n unused: { type: Types.VECTOR3 },\n shLightingCoefficients: { type: Types.VECTOR4, count: 7, default: ZERO4 }\n }\n }\n});\n\n\n/**\n * EveSpaceObject2.h:143 - the merged VS+PS variant used by the instanced path.\n * Uploaded through a STRUCTURED BUFFER rather than a constant buffer\n * (EveInstancedMeshManager.cpp:69-77), so it carries no register.\n *\n * Field order is NOT the same as the EveSpaceObject VS/PS pair: the five clip\n * scalars sit at fields 6-10 here, before the ellipsoid. Since the upload is a\n * raw memcpy, that order is the contract.\n */\nexport const EveSpacePerObject = Object.freeze({\n shared: {\n struct: \"EveSpacePerObjectData\",\n fields: {\n worldTransform: { type: Types.MATRIX4, default: IDENTITY },\n worldTransformLast: { type: Types.MATRIX4, default: IDENTITY },\n invWorldTransform: { type: Types.MATRIX4, default: IDENTITY },\n // This struct's own initialiser is (0,0,0,0), unlike the\n // EveSpaceObject2 constructor's (1,1,0,1).\n shipData: { type: Types.VECTOR4 },\n clipSphereCenter: { type: Types.VECTOR3 },\n clipRadiusSq: { type: Types.FLOAT },\n clipRadius2Sq: { type: Types.FLOAT },\n impactDataOffset: { type: Types.FLOAT },\n clipSphereFactor2: { type: Types.FLOAT },\n clipSphereFactor: { type: Types.FLOAT },\n ellpsoidRadii: { type: Types.VECTOR4 },\n ellpsoidCenter: { type: Types.VECTOR4 },\n // EveSpaceObject2.h:160 initialises this to all-zero, contradicting\n // EveCustomMask::ZeroPerObjectData's IdentityMatrix. The zero path\n // is the live one, so identity wins; reproduced as written.\n customMaskMatrix: { type: Types.MATRIX4, count: 2, default: IDENTITY },\n customMaskData: { type: Types.VECTOR4, count: 2 },\n customMaskMaterialIDs: { type: Types.VECTOR4, count: 2 },\n customMaskTargets: { type: Types.VECTOR4, count: 2 },\n customMaskClamps: { type: Types.VECTOR4 },\n boneOffsets: { type: Types.UINT32, count: 4 },\n customData: { type: Types.VECTOR4 },\n shLighting: { type: Types.VECTOR4, count: 7, default: ZERO4 }\n }\n }\n});\n\n\n/** Tr2ConstantBufferFormats.h:35 - the generic, non-EVE per-object block. */\n/**\n * Tr2ConstantBufferFormats.h:35. Catalogued but deliberately PRODUCERLESS in\n * this package: its only Carbon filler is `Tr2InteriorPlaceable::GetPerObjectData`\n * (Interior/Tr2InteriorPlaceable.cpp:555-585), and interior placeables are not\n * runtime-trinity classes. The layout lives here because the catalog is the\n * org-wide truth, exported on the `/perobject` subpath; whichever package ports\n * the placeable consumes it from there rather than redeclaring it.\n */\nexport const Tr2PerObject = Object.freeze({\n vs: {\n struct: \"Tr2PerObjectVSData\",\n fields: {\n WorldMat: { type: Types.MATRIX4, default: IDENTITY },\n boundingCylinderLocalHeight: { type: Types.FLOAT },\n boundingCylinderLocalXZCenter: { type: Types.VECTOR2 },\n boundingCylinderRotation: { type: Types.FLOAT }\n }\n }\n});\n\n\nconst GROUPS = Object.freeze({\n EveBasic,\n EveMissileWarhead,\n EveSceneStaticParticles,\n EvePerObject,\n EveLensflare,\n EveSpherePin,\n EveChildSpherePin,\n EveSpaceObjectDecal,\n EveBoosterSet,\n EveChildBulletStorm,\n EveStretch2,\n EveSpaceObject,\n EveTurretSet,\n EveSpacePerObject,\n Tr2PerObject\n});\n\n\n/**\n * Resolved per-object layouts, keyed by struct name.\n *\n * Offsets are FLOAT offsets from the start of one record. Carbon's C++ layout\n * needs no padding here because every per-object struct is hand-padded with\n * explicit `_unused` / `padding` members so each float4-sized member already\n * lands on a register boundary; both invariants are asserted at build time.\n */\nexport class CjsPerObjectLayouts\n{\n\n static Types = Types;\n\n static Groups = GROUPS;\n\n /** Resolved layouts by struct name, built once. */\n static #layouts = null;\n\n /**\n * The layout for one struct name, or null when it is not catalogued. A\n * caller must treat null as \"not covered\" and fail rather than guess.\n */\n static Get(struct)\n {\n const layouts = CjsPerObjectLayouts.#Resolved();\n\n return layouts.get(struct) ?? null;\n }\n\n /** Every catalogued struct name. */\n static Names()\n {\n return [...CjsPerObjectLayouts.#Resolved().keys()];\n }\n\n /**\n * A layout in the shape RawData consumes: float offsets keyed by name,\n * plus the stride, stages, and the defaults to apply on allocation.\n *\n * `per-object-layouts.test.js` asserts the encodings agree with\n * `RawDataType`, which constantLayout.js deliberately does not import.\n */\n static ToRawLayout(struct)\n {\n const layout = CjsPerObjectLayouts.Get(struct);\n\n return layout ? toRawLayout(layout) : null;\n }\n\n /** The group a struct belongs to, with its stage key, or null. */\n static Find(struct)\n {\n for (const [group, buffers] of Object.entries(GROUPS))\n {\n for (const [key, buffer] of Object.entries(buffers))\n {\n if (buffer.struct === struct)\n {\n return { group, key, buffer };\n }\n }\n }\n\n return null;\n }\n\n /**\n * The resolved layout map, built once on first use and cached.\n * @returns {Map} struct name -> resolved layout\n */\n static #Resolved()\n {\n if (!CjsPerObjectLayouts.#layouts)\n {\n CjsPerObjectLayouts.#layouts = buildLayouts(GROUPS, \"CjsPerObjectLayouts\");\n }\n\n return CjsPerObjectLayouts.#layouts;\n }\n\n}\n"],"names":["EveBasic","Object","freeze","vs","struct","fields","world","type","Types","MATRIX4","default","IDENTITY","worldLast","worldInverse","EveMissileWarhead","missileSize","VECTOR4","EveSceneStaticParticles","lastWorld","EvePerObject","WorldMat","ps","EveLensflare","shared","directionScale","indices","UINT32","count","EveSpherePin","worldMatrix","pinPosition","pinRotation","pinColor","pinThreshold","pinRadiusPrecalc","pinUV","EveChildSpherePin","EveSpaceObjectDecal","invWorldMatrix","decalMatrix","inverseDecalMatrix","parentBoneMatrix","invParentBoneMatrix","displayData","shipData","clipData","clipRadius2Sq","FLOAT","unused","VECTOR3","shLightingCoefficients","ZERO4","EveBoosterSet","shipMatrix","boosterIntensity","shipSpeed","maxBoosterSize","padding","trailsControlPositions","trailsControlNormals","trailIntensity","warpIntensity","padding2","EveChildBulletStorm","worldTransform","effectInfo","targetPositionsWS","EveStretch2","sourceData","destinationData","effectData","EveSpaceObject","worldTransformLast","invWorldTransform","ellpsoidRadii","ellpsoidCenter","customMaskMatrix","customMaskData","boneOffsets","morphTargetVertexDataOffset","morphTargetAnimationDataOffset","activeMorphTargetsCount","bakedMorphTargetVertexDataOffset","customData","clipSphereCenter","clipRadiusSq","impactDataOffset","clipSphereFactor2","clipSphereFactor","customMaskMaterialIDs","customMaskTargets","customMaskClamps","screenSize","EveTurretSet","baseCutoffData","turretSetData","prevShipMatrix","currentBoneOffset","prevBoneOffset","_unused","turretTranslation","turretRotation","QUATERNION","clipData1","EveSpacePerObject","shLighting","Tr2PerObject","boundingCylinderLocalHeight","boundingCylinderLocalXZCenter","VECTOR2","boundingCylinderRotation","GROUPS","CjsPerObjectLayouts","Groups","Get","layouts","get","Names","keys","ToRawLayout","layout","toRawLayout","Find","group","buffers","entries","key","buffer","#Resolved","buildLayouts"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { CjsPerFrameLayouts } from './CjsPerFrameLayouts.js';
1
2
  import { CjsPerObjectLayouts } from './CjsPerObjectLayouts.js';
2
3
 
3
4
  // GPU-free per-object / per-frame constant data.
@@ -84,6 +85,13 @@ const RawDataType = Object.freeze({
84
85
  * the slice start (the views are already sliced to this struct's slot).
85
86
  * `size` is the DESTINATION footprint in floats per element.
86
87
  */
88
+ // Module scratch for wrapping a scalar write. Written and consumed inside one
89
+ // synchronous encoder call, so it never outlives the statement that filled it.
90
+ const SCALAR_SCRATCH = [0];
91
+ function SCALAR_SCRATCH_SET(value) {
92
+ SCALAR_SCRATCH[0] = value;
93
+ return SCALAR_SCRATCH;
94
+ }
87
95
  const RawDataEncoders = Object.freeze({
88
96
  [RawDataType.MATRIX](floats, _uints, field, value) {
89
97
  const n = Math.sqrt(field.size);
@@ -264,7 +272,23 @@ class RawData {
264
272
  if (!encoder) {
265
273
  throw new Error(`RawData: no encoder for encoding "${field.encoding}" (field "${name}")`);
266
274
  }
267
- encoder(this.#floats, this.#uints, field, value);
275
+ encoder(this.#floats, this.#uints, field, this.#Normalize(field, name, value));
276
+ }
277
+
278
+ /**
279
+ * Every encoder reads `value[index]`, so a bare number would write NaN into
280
+ * each lane instead of failing. A single-lane field - a float, a uint, an
281
+ * int - is unambiguous, so accept the scalar and wrap it; anything wider
282
+ * must be indexable, and says so rather than silently filling with NaN.
283
+ */
284
+ #Normalize(field, name, value) {
285
+ if (typeof value === "number") {
286
+ if (field.size * field.elements !== 1) {
287
+ throw new Error(`RawData: field "${name}" is ${field.size * field.elements} lanes wide ` + "and needs an indexable value, not a number");
288
+ }
289
+ return SCALAR_SCRATCH_SET(value);
290
+ }
291
+ return value;
268
292
  }
269
293
 
270
294
  /**
@@ -405,11 +429,15 @@ class RawData {
405
429
  * want Get/GetTransposed.
406
430
  *
407
431
  * Defaults are applied once here rather than per allocation.
432
+ *
433
+ * Both catalogs are consulted. Per-frame buffers are only ever persistent -
434
+ * the scene owns them across the frame and reads them back - so they have no
435
+ * transient counterpart and never appear in an arena lease.
408
436
  */
409
437
  static create(struct) {
410
- const layout = CjsPerObjectLayouts.ToRawLayout(struct);
438
+ const layout = CjsPerObjectLayouts.ToRawLayout(struct) ?? CjsPerFrameLayouts.ToRawLayout(struct);
411
439
  if (!layout) {
412
- throw new Error(`RawData: struct "${struct}" is not in CjsPerObjectLayouts`);
440
+ throw new Error(`RawData: struct "${struct}" is in neither CjsPerObjectLayouts nor CjsPerFrameLayouts`);
413
441
  }
414
442
  const floats = new Float32Array(layout.stride);
415
443
  const uints = new Uint32Array(floats.buffer);
@@ -1 +1 @@
1
- {"version":3,"file":"RawData.js","sources":["../../../../src/trinityCore/rawData/RawData.js"],"sourcesContent":["import { CjsPerObjectLayouts } from \"./CjsPerObjectLayouts.js\";\n\n\n// GPU-free per-object / per-frame constant data.\n//\n// A RawData is a thin, write-mostly view over a slice of a packed constant\n// buffer: name -> encoded bytes. It is NOT a CjsModel (no persistence, no\n// reactivity) - it is GPU staging. Most records are leased per frame from the\n// arena and consumed by the engine's uploader; a few are PERSISTENT, owned by\n// an object across frames via RawData.create and marked with Invalidate.\n//\n// Why matrices are stored transposed: Carbon transposes every per-object matrix\n// on its way to the GPU (`m_vsData.worldTransform = Transpose( m_worldTransform )`\n// and every other PopulatePerObjectData), because HLSL constant buffers pack\n// column_major by default while Carbon's Matrix is row-major. The requirement is\n// the shader's, not a math-library artifact, so the port pays it identically.\n//\n// Verbs (name ALWAYS first - a keyed store, not a math op):\n// SetAndTranspose(name, value) a MATRIX4 field; PERFORMS the transpose\n// GetTransposed(name) a MATRIX4 field; returns what is stored\n// Set(name, value) / Get(name) everything else; both throw on a matrix\n// Copy(name, out) bytes OUT into a caller-owned buffer\n// ...Index(name, index, ...) one element of an array field\n//\n// Every matrix is stored TRANSPOSED, so Set/Get refuse matrix fields and name\n// the pair to use instead. The orientation is stated at the call site and\n// checked at runtime rather than remembered. There is no SetRaw: its only two\n// uses computed Inverse(Transpose(M)), which equals Transpose(Inverse(M)), so\n// inverting the logical matrix gives the same bytes. See the\n// carbon-math-conventions skill, F6.\n//\n// The indexed forms exist because Carbon fills arrays PARTIALLY - it writes\n// m_turretTranslation[i] for VISIBLE turrets only, and the unwritten tail keeps\n// whatever the arena held. A whole-array write would destroy that parity.\n//\n// Get returns a LIVE reference into the buffer, so writing through it is a\n// zero-copy write. That is deliberate: Carbon hands out a raw pointer into\n// m_psData for exactly this (EveSpaceObject2.cpp:1877-1883).\n//\n// MULTI-PAYLOAD RENDERABLES: Carbon's dominant composite shape is a distinct\n// VS struct + PS struct uploaded as TWO constant buffers (turret, decal,\n// booster, the Tr2PerObjectDataWithPersistentBuffers family). That is TWO\n// Allocs here, returned from GetPerObjectData as a plain record:\n// { vs: store.Alloc(\"DecalVSPerObjectData\"), ps: store.Alloc(\"DecalPSPerObjectData\") }\n// The batch pipeline threads the record through untouched. A payload bound to\n// more than one stage from the SAME bytes (sphere pin, lensflare) stays ONE\n// RawData whose struct is registered with stages: [\"vs\", \"ps\"] - the engine\n// reads the binding from GetLayout().stages.\n\n/**\n * The encoding KIND of a struct field - a packing directive, not a math type.\n * Selects which encoder writes the bytes. Constants (not bare strings) so a\n * typo throws at the lookup instead of silently packing wrong.\n */\nexport const RawDataType = Object.freeze({\n /** Square matrix, stored TRANSPOSED (HLSL column_major). N inferred from size. */\n MATRIX: \"matrix\",\n\n /** Straight copy - float / vec2 / vec3 / vec4. */\n VECTOR: \"vector\",\n\n /** Integer bit-cast into the float buffer's Uint32 lanes (e.g. bone offsets). */\n UINT: \"uint\",\n\n /**\n * SIGNED integer bit-cast (two's complement) - e.g. the interior lightCount.\n * Same bytes as UINT for non-negatives; kept distinct so a reflection-based\n * packer can type the lane i32 vs u32.\n */\n INT: \"int\",\n\n /**\n * mat4 packed column-stride into 12 floats (Carbon Float4x3; skill gotcha 7).\n *\n * No CATALOGUED struct has a Float4x3 field - Carbon's per-object structs\n * carry bone ring OFFSETS, not the palette itself - so this encoder is\n * currently exercised only by `test/raw-data.test.js`. It is kept rather than\n * removed because the packing rule it encodes is the one that shipped wrong\n * once already (row-stride instead of column-stride, invisible for identity\n * bones), and `Tr2GrannyAnimation` maintains exactly such a palette. If a\n * struct ever declares a Float4x3, this is the encoder it needs.\n */\n MATRIX_3X4: \"matrix3x4\"\n});\n\n/**\n * Encoders: (floats, uints, field, value) -> void. `field` is the resolved\n * layout entry { offset, size, elements, encoding } with offset RELATIVE to\n * the slice start (the views are already sliced to this struct's slot).\n * `size` is the DESTINATION footprint in floats per element.\n */\nexport const RawDataEncoders = Object.freeze({\n [RawDataType.MATRIX](floats, _uints, field, value)\n {\n const n = Math.sqrt(field.size);\n\n for (let element = 0; element < field.elements; element++)\n {\n const source = element * field.size;\n const destination = field.offset + element * field.size;\n\n // Transpose on the shared byte layout: buffer(r,c) = value(c,r). This is\n // exactly Carbon's `= Transpose(m)` staging fill.\n for (let row = 0; row < n; row++)\n {\n for (let column = 0; column < n; column++)\n {\n floats[destination + row * n + column] = value[source + column * n + row];\n }\n }\n }\n },\n\n [RawDataType.VECTOR](floats, _uints, field, value)\n {\n const total = field.size * field.elements;\n\n for (let index = 0; index < total; index++)\n {\n floats[field.offset + index] = value[index];\n }\n },\n\n [RawDataType.UINT](_floats, uints, field, value)\n {\n const total = field.size * field.elements;\n\n for (let index = 0; index < total; index++)\n {\n uints[field.offset + index] = value[index] >>> 0;\n }\n },\n\n [RawDataType.INT](_floats, uints, field, value)\n {\n const total = field.size * field.elements;\n\n // Uint32 assignment stores the two's-complement bit pattern, which is\n // exactly what a signed lane needs (-1 -> 0xFFFFFFFF).\n for (let index = 0; index < total; index++)\n {\n uints[field.offset + index] = value[index] | 0;\n }\n },\n\n [RawDataType.MATRIX_3X4](floats, _uints, field, value)\n {\n // Column-stride pack of a 16-float mat4 into 12 floats (size must be 12):\n // rows come from (v0,v4,v8,v12) / (v1,v5,v9,v13) / (v2,v6,v10,v14).\n for (let element = 0; element < field.elements; element++)\n {\n const source = element * 16;\n const destination = field.offset + element * field.size;\n\n for (let row = 0; row < 3; row++)\n {\n floats[destination + row * 4 + 0] = value[source + row + 0];\n floats[destination + row * 4 + 1] = value[source + row + 4];\n floats[destination + row * 4 + 2] = value[source + row + 8];\n floats[destination + row * 4 + 3] = value[source + row + 12];\n }\n }\n }\n});\n\n/**\n * A packed constant-data slice bound to a resolved layout. Instances are\n * handed out by a TriPoolAllocator (transient, arena-backed) or constructed\n * directly by an object that owns a persistent buffer.\n */\nexport class RawData\n{\n /** Resolved layout: { fields: { name -> { offset, size, elements, encoding } }, stride }. */\n #layout = null;\n\n /** Float32 view of this struct's slot (offsets are relative to its start). */\n #floats = null;\n\n /** Uint32 view over the SAME bytes, for UINT lanes. */\n #uints = null;\n\n /** Whether the payload has changed since an uploader last matched it. */\n #dirty = true;\n\n /** Catalogued struct name, when this record was built from one. */\n #struct = null;\n\n /**\n * @param {object} layout - resolved layout for one struct\n * @param {Float32Array} floats - the slice (start = struct slot)\n * @param {Uint32Array} uints - Uint32 view over the same slice\n * @param {String} [struct] - catalogued struct name, when there is one\n */\n constructor(layout, floats, uints, struct = null)\n {\n this.#layout = layout;\n this.#floats = floats;\n this.#uints = uints;\n this.#struct = struct;\n }\n\n /** The catalogued struct name, or null for an ad-hoc record. */\n GetStruct()\n {\n return this.#struct;\n }\n\n /** Whether a field exists in the layout. */\n Has(name)\n {\n return Object.prototype.hasOwnProperty.call(this.#layout.fields, name);\n }\n\n /**\n * Resolve a field, optionally narrowed to ONE element of an array field.\n * The narrowed view shifts the offset by element * size and clamps\n * elements to 1, so every verb writes exactly one slot and the unwritten\n * tail keeps its arena bytes (Carbon's visible-turrets-only fill).\n */\n #Field(name, element)\n {\n const field = this.#layout.fields[name];\n\n if (!field)\n {\n throw new Error(`RawData: unknown field \"${name}\"`);\n }\n\n if (element === undefined)\n {\n return field;\n }\n\n if (!Number.isInteger(element) || element < 0 || element >= field.elements)\n {\n throw new Error(`RawData: element ${element} is out of range for field \"${name}\" (elements: ${field.elements})`);\n }\n\n return {\n offset: field.offset + element * field.size,\n size: field.size,\n elements: 1,\n encoding: field.encoding\n };\n }\n\n /**\n * Write a LOGICAL value, encoded per the field's kind (MATRIX transposes,\n * UINT/INT bit-cast, MATRIX_3X4 column-stride packs, VECTOR copies). Pass\n * `element` to write one slot of an array field.\n */\n Set(name, value, element)\n {\n this.#NotMatrix(name, \"Set\");\n this.#Write(this.#Field(name, element), name, value);\n }\n\n /**\n * Copy a field's packed bytes OUT into a caller-owned buffer. Never returns\n * a reference into the payload. Debug / inspection only - the render path is\n * write-only. Pass `element` to copy one slot of an array field.\n */\n Copy(name, out, element)\n {\n const field = this.#Field(name, element);\n const total = field.size * field.elements;\n\n for (let index = 0; index < total; index++)\n {\n out[index] = this.#floats[field.offset + index];\n }\n\n return out;\n }\n\n /**\n * Write a matrix, transposing it into the buffer.\n *\n * Carbon stores every per-object matrix transposed (`m_vsData.worldTransform\n * = Transpose( m_worldTransform )`), so the record is GPU-form and terminal.\n * This method performs the transpose, which means a producer passes its\n * LOGICAL matrix and cannot forget the step; it also transposes straight into\n * the destination, so no scratch matrix is needed.\n *\n * Matrix fields only. See carbon-math-conventions F1/F6.\n */\n SetAndTranspose(name, value)\n {\n this.#AssertMatrix(name);\n this.#Write(this.#Field(name, undefined), name, value);\n }\n\n /** SetAndTranspose for one element of an array field, e.g. customMaskMatrix. */\n SetAndTransposeIndex(name, index, value)\n {\n this.#AssertMatrix(name);\n this.#Write(this.#Field(name, index), name, value);\n }\n\n /** Write one element of an array field. Non-matrix fields only. */\n SetIndex(name, index, value)\n {\n this.#NotMatrix(name, \"SetIndex\");\n this.#Write(this.#Field(name, index), name, value);\n }\n\n /** Encodes one value into a resolved field. */\n #Write(field, name, value)\n {\n const encoder = RawDataEncoders[field.encoding];\n\n if (!encoder)\n {\n throw new Error(`RawData: no encoder for encoding \"${field.encoding}\" (field \"${name}\")`);\n }\n\n encoder(this.#floats, this.#uints, field, value);\n }\n\n /**\n * A live reference into the buffer for one field - writing through it is a\n * zero-copy write, which is deliberate: Carbon hands out a raw pointer into\n * `m_psData` for exactly this (GetParentData, cpp:1877-1883).\n *\n * Non-matrix fields only; a matrix is transposed and indistinguishable from a\n * logical one, so it must be read through GetTransposed.\n */\n Get(name)\n {\n this.#NotMatrix(name, \"Get\");\n\n return this.#View(this.#Field(name, undefined));\n }\n\n /** Get for one element of an array field. Non-matrix fields only. */\n GetIndex(name, index)\n {\n this.#NotMatrix(name, \"GetIndex\");\n\n return this.#View(this.#Field(name, index));\n }\n\n /**\n * A live reference to a stored matrix. The value IS transposed - the name\n * says so at the call site, because doing maths with it as though it were\n * logical is silently wrong.\n */\n GetTransposed(name)\n {\n this.#AssertMatrix(name);\n\n return this.#View(this.#Field(name, undefined));\n }\n\n /** GetTransposed for one element of an array field. */\n GetTransposedIndex(name, index)\n {\n this.#AssertMatrix(name);\n\n return this.#View(this.#Field(name, index));\n }\n\n /** Copy one element of an array field out into a caller-owned buffer. */\n CopyIndex(name, index, out)\n {\n return this.Copy(name, out, index);\n }\n\n /**\n * Zero every byte - Carbon's `memset( &data, 0, sizeof(data) )`. Declared\n * defaults are NOT re-applied: memset does not respect them either, and a\n * caller that wants them writes them back explicitly, as Carbon does.\n */\n Zero()\n {\n this.#floats.fill(0);\n this.#dirty = true;\n\n return this;\n }\n\n /**\n * Copy another record's bytes into this one wholesale - Carbon's by-value\n * struct assignment (`vsData = m_vsData`, cpp:1487). Both records must carry\n * the SAME layout: the bytes are copied without re-encoding, so a mismatched\n * stride would silently reinterpret every field after the first difference.\n */\n CopyFrom(other)\n {\n const source = other?.GetLayout?.();\n\n // A store-registered layout and a RawData.create layout are distinct\n // objects for the same struct, so identity cannot be the only test - but\n // the STRIDE cannot stand in for it either: EveSpaceObjectVSData and\n // EveSpaceObjectPSData are both 116 floats and share nothing else. The\n // struct name is the test; an unnamed ad-hoc record needs the same layout\n // object.\n const sameStruct = this.#struct !== null && other.GetStruct?.() === this.#struct;\n\n if (!source || (!sameStruct && source !== this.#layout))\n {\n throw new Error(\n `RawData: CopyFrom requires a record of the same struct (this \"${this.#struct}\", other \"${other?.GetStruct?.() ?? \"unknown\"}\")`\n );\n }\n\n this.#floats.set(other.GetData());\n this.#dirty = true;\n\n return this;\n }\n\n /** A Float32 view over one field's lanes, sharing the record's bytes. */\n #View(field)\n {\n const total = field.size * field.elements;\n\n return this.#floats.subarray(field.offset, field.offset + total);\n }\n\n /** Asserts a field IS a matrix. */\n #AssertMatrix(name)\n {\n const field = this.#Field(name, undefined);\n\n if (field.encoding !== RawDataType.MATRIX)\n {\n throw new Error(\n `RawData: field \"${name}\" is \"${field.encoding}\", not a matrix - use Set/Get, not the transposed pair`\n );\n }\n }\n\n /** Asserts a field is NOT a matrix, so the orientation cannot be lost. */\n #NotMatrix(name, verb)\n {\n const field = this.#Field(name, undefined);\n\n if (field.encoding === RawDataType.MATRIX)\n {\n throw new Error(\n `RawData: field \"${name}\" is a matrix and is stored TRANSPOSED - `\n + `use ${verb.startsWith(\"Set\") ? \"SetAndTranspose\" : \"GetTransposed\"}, not ${verb}`\n );\n }\n }\n\n /**\n * Marks the payload as changed since the engine last uploaded it.\n *\n * Only meaningful for a PERSISTENT record - one owned by an object across\n * frames rather than leased from the arena. Carbon's equivalent is\n * `Tr2PersistentPerObjectData::InvalidateBufferData`, called once per frame\n * from the owner's async update (EveSpaceObject2.cpp:626-627); when the flag\n * is clear the engine rebinds the existing GPU buffer with no lock and no\n * memcpy (Tr2PersistentPerObjectData.h:118-124).\n *\n * A transient arena record needs none of this - it is filled and consumed\n * within the frame - so the flag simply stays true there.\n */\n Invalidate()\n {\n this.#dirty = true;\n\n return this;\n }\n\n /** Whether the payload has changed since ClearDirty. */\n IsDirty()\n {\n return this.#dirty;\n }\n\n /** Called by an uploader once the GPU buffer matches this payload. */\n ClearDirty()\n {\n this.#dirty = false;\n\n return this;\n }\n\n /**\n * A PERSISTENT record: one this object owns across frames, with its own\n * buffer, outside the arena.\n *\n * This is Carbon's second per-object shape. Most payloads are leased from the\n * frame pool and die at Reset, but five types keep theirs as members because\n * the values are stable across a frame AND are read back - EveSpaceObject2\n * reads its own stored matrices (cpp:3747) and hands shLighting to\n * attachments as a live pointer (cpp:1877-1883). Those are the records that\n * want Get/GetTransposed.\n *\n * Defaults are applied once here rather than per allocation.\n */\n static create(struct)\n {\n const layout = CjsPerObjectLayouts.ToRawLayout(struct);\n\n if (!layout)\n {\n throw new Error(`RawData: struct \"${struct}\" is not in CjsPerObjectLayouts`);\n }\n\n const floats = new Float32Array(layout.stride);\n const uints = new Uint32Array(floats.buffer);\n\n for (const preset of layout.defaults)\n {\n floats.set(preset.values, preset.offset);\n }\n\n return new RawData(layout, floats, uints, struct);\n }\n\n /** The packed Float32 slice - what the engine uploader memcpys/binds. */\n GetData()\n {\n return this.#floats;\n }\n\n /** The resolved layout (offsets/sizes/encodings) - the engine's bind map. */\n GetLayout()\n {\n return this.#layout;\n }\n}\n"],"names":["RawDataType","Object","freeze","MATRIX","VECTOR","UINT","INT","MATRIX_3X4","RawDataEncoders","floats","_uints","field","value","n","Math","sqrt","size","element","elements","source","destination","offset","row","column","total","index","_floats","uints","RawData","constructor","layout","struct","GetStruct","Has","name","prototype","hasOwnProperty","call","fields","#Field","Error","undefined","Number","isInteger","encoding","Set","Copy","out","SetAndTranspose","SetAndTransposeIndex","SetIndex","#Write","encoder","Get","GetIndex","GetTransposed","GetTransposedIndex","CopyIndex","Zero","fill","CopyFrom","other","GetLayout","sameStruct","set","GetData","#View","subarray","#AssertMatrix","#NotMatrix","verb","startsWith","Invalidate","IsDirty","ClearDirty","create","CjsPerObjectLayouts","ToRawLayout","Float32Array","stride","Uint32Array","buffer","preset","defaults","values"],"mappings":"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"}
1
+ {"version":3,"file":"RawData.js","sources":["../../../../src/trinityCore/rawData/RawData.js"],"sourcesContent":["import { CjsPerFrameLayouts } from \"./CjsPerFrameLayouts.js\";\nimport { CjsPerObjectLayouts } from \"./CjsPerObjectLayouts.js\";\n\n\n// GPU-free per-object / per-frame constant data.\n//\n// A RawData is a thin, write-mostly view over a slice of a packed constant\n// buffer: name -> encoded bytes. It is NOT a CjsModel (no persistence, no\n// reactivity) - it is GPU staging. Most records are leased per frame from the\n// arena and consumed by the engine's uploader; a few are PERSISTENT, owned by\n// an object across frames via RawData.create and marked with Invalidate.\n//\n// Why matrices are stored transposed: Carbon transposes every per-object matrix\n// on its way to the GPU (`m_vsData.worldTransform = Transpose( m_worldTransform )`\n// and every other PopulatePerObjectData), because HLSL constant buffers pack\n// column_major by default while Carbon's Matrix is row-major. The requirement is\n// the shader's, not a math-library artifact, so the port pays it identically.\n//\n// Verbs (name ALWAYS first - a keyed store, not a math op):\n// SetAndTranspose(name, value) a MATRIX4 field; PERFORMS the transpose\n// GetTransposed(name) a MATRIX4 field; returns what is stored\n// Set(name, value) / Get(name) everything else; both throw on a matrix\n// Copy(name, out) bytes OUT into a caller-owned buffer\n// ...Index(name, index, ...) one element of an array field\n//\n// Every matrix is stored TRANSPOSED, so Set/Get refuse matrix fields and name\n// the pair to use instead. The orientation is stated at the call site and\n// checked at runtime rather than remembered. There is no SetRaw: its only two\n// uses computed Inverse(Transpose(M)), which equals Transpose(Inverse(M)), so\n// inverting the logical matrix gives the same bytes. See the\n// carbon-math-conventions skill, F6.\n//\n// The indexed forms exist because Carbon fills arrays PARTIALLY - it writes\n// m_turretTranslation[i] for VISIBLE turrets only, and the unwritten tail keeps\n// whatever the arena held. A whole-array write would destroy that parity.\n//\n// Get returns a LIVE reference into the buffer, so writing through it is a\n// zero-copy write. That is deliberate: Carbon hands out a raw pointer into\n// m_psData for exactly this (EveSpaceObject2.cpp:1877-1883).\n//\n// MULTI-PAYLOAD RENDERABLES: Carbon's dominant composite shape is a distinct\n// VS struct + PS struct uploaded as TWO constant buffers (turret, decal,\n// booster, the Tr2PerObjectDataWithPersistentBuffers family). That is TWO\n// Allocs here, returned from GetPerObjectData as a plain record:\n// { vs: store.Alloc(\"DecalVSPerObjectData\"), ps: store.Alloc(\"DecalPSPerObjectData\") }\n// The batch pipeline threads the record through untouched. A payload bound to\n// more than one stage from the SAME bytes (sphere pin, lensflare) stays ONE\n// RawData whose struct is registered with stages: [\"vs\", \"ps\"] - the engine\n// reads the binding from GetLayout().stages.\n\n/**\n * The encoding KIND of a struct field - a packing directive, not a math type.\n * Selects which encoder writes the bytes. Constants (not bare strings) so a\n * typo throws at the lookup instead of silently packing wrong.\n */\nexport const RawDataType = Object.freeze({\n /** Square matrix, stored TRANSPOSED (HLSL column_major). N inferred from size. */\n MATRIX: \"matrix\",\n\n /** Straight copy - float / vec2 / vec3 / vec4. */\n VECTOR: \"vector\",\n\n /** Integer bit-cast into the float buffer's Uint32 lanes (e.g. bone offsets). */\n UINT: \"uint\",\n\n /**\n * SIGNED integer bit-cast (two's complement) - e.g. the interior lightCount.\n * Same bytes as UINT for non-negatives; kept distinct so a reflection-based\n * packer can type the lane i32 vs u32.\n */\n INT: \"int\",\n\n /**\n * mat4 packed column-stride into 12 floats (Carbon Float4x3; skill gotcha 7).\n *\n * No CATALOGUED struct has a Float4x3 field - Carbon's per-object structs\n * carry bone ring OFFSETS, not the palette itself - so this encoder is\n * currently exercised only by `test/raw-data.test.js`. It is kept rather than\n * removed because the packing rule it encodes is the one that shipped wrong\n * once already (row-stride instead of column-stride, invisible for identity\n * bones), and `Tr2GrannyAnimation` maintains exactly such a palette. If a\n * struct ever declares a Float4x3, this is the encoder it needs.\n */\n MATRIX_3X4: \"matrix3x4\"\n});\n\n/**\n * Encoders: (floats, uints, field, value) -> void. `field` is the resolved\n * layout entry { offset, size, elements, encoding } with offset RELATIVE to\n * the slice start (the views are already sliced to this struct's slot).\n * `size` is the DESTINATION footprint in floats per element.\n */\n// Module scratch for wrapping a scalar write. Written and consumed inside one\n// synchronous encoder call, so it never outlives the statement that filled it.\nconst SCALAR_SCRATCH = [0];\n\n\nfunction SCALAR_SCRATCH_SET(value)\n{\n SCALAR_SCRATCH[0] = value;\n\n return SCALAR_SCRATCH;\n}\n\n\nexport const RawDataEncoders = Object.freeze({\n [RawDataType.MATRIX](floats, _uints, field, value)\n {\n const n = Math.sqrt(field.size);\n\n for (let element = 0; element < field.elements; element++)\n {\n const source = element * field.size;\n const destination = field.offset + element * field.size;\n\n // Transpose on the shared byte layout: buffer(r,c) = value(c,r). This is\n // exactly Carbon's `= Transpose(m)` staging fill.\n for (let row = 0; row < n; row++)\n {\n for (let column = 0; column < n; column++)\n {\n floats[destination + row * n + column] = value[source + column * n + row];\n }\n }\n }\n },\n\n [RawDataType.VECTOR](floats, _uints, field, value)\n {\n const total = field.size * field.elements;\n\n for (let index = 0; index < total; index++)\n {\n floats[field.offset + index] = value[index];\n }\n },\n\n [RawDataType.UINT](_floats, uints, field, value)\n {\n const total = field.size * field.elements;\n\n for (let index = 0; index < total; index++)\n {\n uints[field.offset + index] = value[index] >>> 0;\n }\n },\n\n [RawDataType.INT](_floats, uints, field, value)\n {\n const total = field.size * field.elements;\n\n // Uint32 assignment stores the two's-complement bit pattern, which is\n // exactly what a signed lane needs (-1 -> 0xFFFFFFFF).\n for (let index = 0; index < total; index++)\n {\n uints[field.offset + index] = value[index] | 0;\n }\n },\n\n [RawDataType.MATRIX_3X4](floats, _uints, field, value)\n {\n // Column-stride pack of a 16-float mat4 into 12 floats (size must be 12):\n // rows come from (v0,v4,v8,v12) / (v1,v5,v9,v13) / (v2,v6,v10,v14).\n for (let element = 0; element < field.elements; element++)\n {\n const source = element * 16;\n const destination = field.offset + element * field.size;\n\n for (let row = 0; row < 3; row++)\n {\n floats[destination + row * 4 + 0] = value[source + row + 0];\n floats[destination + row * 4 + 1] = value[source + row + 4];\n floats[destination + row * 4 + 2] = value[source + row + 8];\n floats[destination + row * 4 + 3] = value[source + row + 12];\n }\n }\n }\n});\n\n/**\n * A packed constant-data slice bound to a resolved layout. Instances are\n * handed out by a TriPoolAllocator (transient, arena-backed) or constructed\n * directly by an object that owns a persistent buffer.\n */\nexport class RawData\n{\n /** Resolved layout: { fields: { name -> { offset, size, elements, encoding } }, stride }. */\n #layout = null;\n\n /** Float32 view of this struct's slot (offsets are relative to its start). */\n #floats = null;\n\n /** Uint32 view over the SAME bytes, for UINT lanes. */\n #uints = null;\n\n /** Whether the payload has changed since an uploader last matched it. */\n #dirty = true;\n\n /** Catalogued struct name, when this record was built from one. */\n #struct = null;\n\n /**\n * @param {object} layout - resolved layout for one struct\n * @param {Float32Array} floats - the slice (start = struct slot)\n * @param {Uint32Array} uints - Uint32 view over the same slice\n * @param {String} [struct] - catalogued struct name, when there is one\n */\n constructor(layout, floats, uints, struct = null)\n {\n this.#layout = layout;\n this.#floats = floats;\n this.#uints = uints;\n this.#struct = struct;\n }\n\n /** The catalogued struct name, or null for an ad-hoc record. */\n GetStruct()\n {\n return this.#struct;\n }\n\n /** Whether a field exists in the layout. */\n Has(name)\n {\n return Object.prototype.hasOwnProperty.call(this.#layout.fields, name);\n }\n\n /**\n * Resolve a field, optionally narrowed to ONE element of an array field.\n * The narrowed view shifts the offset by element * size and clamps\n * elements to 1, so every verb writes exactly one slot and the unwritten\n * tail keeps its arena bytes (Carbon's visible-turrets-only fill).\n */\n #Field(name, element)\n {\n const field = this.#layout.fields[name];\n\n if (!field)\n {\n throw new Error(`RawData: unknown field \"${name}\"`);\n }\n\n if (element === undefined)\n {\n return field;\n }\n\n if (!Number.isInteger(element) || element < 0 || element >= field.elements)\n {\n throw new Error(`RawData: element ${element} is out of range for field \"${name}\" (elements: ${field.elements})`);\n }\n\n return {\n offset: field.offset + element * field.size,\n size: field.size,\n elements: 1,\n encoding: field.encoding\n };\n }\n\n /**\n * Write a LOGICAL value, encoded per the field's kind (MATRIX transposes,\n * UINT/INT bit-cast, MATRIX_3X4 column-stride packs, VECTOR copies). Pass\n * `element` to write one slot of an array field.\n */\n Set(name, value, element)\n {\n this.#NotMatrix(name, \"Set\");\n this.#Write(this.#Field(name, element), name, value);\n }\n\n /**\n * Copy a field's packed bytes OUT into a caller-owned buffer. Never returns\n * a reference into the payload. Debug / inspection only - the render path is\n * write-only. Pass `element` to copy one slot of an array field.\n */\n Copy(name, out, element)\n {\n const field = this.#Field(name, element);\n const total = field.size * field.elements;\n\n for (let index = 0; index < total; index++)\n {\n out[index] = this.#floats[field.offset + index];\n }\n\n return out;\n }\n\n /**\n * Write a matrix, transposing it into the buffer.\n *\n * Carbon stores every per-object matrix transposed (`m_vsData.worldTransform\n * = Transpose( m_worldTransform )`), so the record is GPU-form and terminal.\n * This method performs the transpose, which means a producer passes its\n * LOGICAL matrix and cannot forget the step; it also transposes straight into\n * the destination, so no scratch matrix is needed.\n *\n * Matrix fields only. See carbon-math-conventions F1/F6.\n */\n SetAndTranspose(name, value)\n {\n this.#AssertMatrix(name);\n this.#Write(this.#Field(name, undefined), name, value);\n }\n\n /** SetAndTranspose for one element of an array field, e.g. customMaskMatrix. */\n SetAndTransposeIndex(name, index, value)\n {\n this.#AssertMatrix(name);\n this.#Write(this.#Field(name, index), name, value);\n }\n\n /** Write one element of an array field. Non-matrix fields only. */\n SetIndex(name, index, value)\n {\n this.#NotMatrix(name, \"SetIndex\");\n this.#Write(this.#Field(name, index), name, value);\n }\n\n /** Encodes one value into a resolved field. */\n #Write(field, name, value)\n {\n const encoder = RawDataEncoders[field.encoding];\n\n if (!encoder)\n {\n throw new Error(`RawData: no encoder for encoding \"${field.encoding}\" (field \"${name}\")`);\n }\n\n encoder(this.#floats, this.#uints, field, this.#Normalize(field, name, value));\n }\n\n /**\n * Every encoder reads `value[index]`, so a bare number would write NaN into\n * each lane instead of failing. A single-lane field - a float, a uint, an\n * int - is unambiguous, so accept the scalar and wrap it; anything wider\n * must be indexable, and says so rather than silently filling with NaN.\n */\n #Normalize(field, name, value)\n {\n if (typeof value === \"number\")\n {\n if (field.size * field.elements !== 1)\n {\n throw new Error(\n `RawData: field \"${name}\" is ${field.size * field.elements} lanes wide `\n + \"and needs an indexable value, not a number\"\n );\n }\n\n return SCALAR_SCRATCH_SET(value);\n }\n\n return value;\n }\n\n /**\n * A live reference into the buffer for one field - writing through it is a\n * zero-copy write, which is deliberate: Carbon hands out a raw pointer into\n * `m_psData` for exactly this (GetParentData, cpp:1877-1883).\n *\n * Non-matrix fields only; a matrix is transposed and indistinguishable from a\n * logical one, so it must be read through GetTransposed.\n */\n Get(name)\n {\n this.#NotMatrix(name, \"Get\");\n\n return this.#View(this.#Field(name, undefined));\n }\n\n /** Get for one element of an array field. Non-matrix fields only. */\n GetIndex(name, index)\n {\n this.#NotMatrix(name, \"GetIndex\");\n\n return this.#View(this.#Field(name, index));\n }\n\n /**\n * A live reference to a stored matrix. The value IS transposed - the name\n * says so at the call site, because doing maths with it as though it were\n * logical is silently wrong.\n */\n GetTransposed(name)\n {\n this.#AssertMatrix(name);\n\n return this.#View(this.#Field(name, undefined));\n }\n\n /** GetTransposed for one element of an array field. */\n GetTransposedIndex(name, index)\n {\n this.#AssertMatrix(name);\n\n return this.#View(this.#Field(name, index));\n }\n\n /** Copy one element of an array field out into a caller-owned buffer. */\n CopyIndex(name, index, out)\n {\n return this.Copy(name, out, index);\n }\n\n /**\n * Zero every byte - Carbon's `memset( &data, 0, sizeof(data) )`. Declared\n * defaults are NOT re-applied: memset does not respect them either, and a\n * caller that wants them writes them back explicitly, as Carbon does.\n */\n Zero()\n {\n this.#floats.fill(0);\n this.#dirty = true;\n\n return this;\n }\n\n /**\n * Copy another record's bytes into this one wholesale - Carbon's by-value\n * struct assignment (`vsData = m_vsData`, cpp:1487). Both records must carry\n * the SAME layout: the bytes are copied without re-encoding, so a mismatched\n * stride would silently reinterpret every field after the first difference.\n */\n CopyFrom(other)\n {\n const source = other?.GetLayout?.();\n\n // A store-registered layout and a RawData.create layout are distinct\n // objects for the same struct, so identity cannot be the only test - but\n // the STRIDE cannot stand in for it either: EveSpaceObjectVSData and\n // EveSpaceObjectPSData are both 116 floats and share nothing else. The\n // struct name is the test; an unnamed ad-hoc record needs the same layout\n // object.\n const sameStruct = this.#struct !== null && other.GetStruct?.() === this.#struct;\n\n if (!source || (!sameStruct && source !== this.#layout))\n {\n throw new Error(\n `RawData: CopyFrom requires a record of the same struct (this \"${this.#struct}\", other \"${other?.GetStruct?.() ?? \"unknown\"}\")`\n );\n }\n\n this.#floats.set(other.GetData());\n this.#dirty = true;\n\n return this;\n }\n\n /** A Float32 view over one field's lanes, sharing the record's bytes. */\n #View(field)\n {\n const total = field.size * field.elements;\n\n return this.#floats.subarray(field.offset, field.offset + total);\n }\n\n /** Asserts a field IS a matrix. */\n #AssertMatrix(name)\n {\n const field = this.#Field(name, undefined);\n\n if (field.encoding !== RawDataType.MATRIX)\n {\n throw new Error(\n `RawData: field \"${name}\" is \"${field.encoding}\", not a matrix - use Set/Get, not the transposed pair`\n );\n }\n }\n\n /** Asserts a field is NOT a matrix, so the orientation cannot be lost. */\n #NotMatrix(name, verb)\n {\n const field = this.#Field(name, undefined);\n\n if (field.encoding === RawDataType.MATRIX)\n {\n throw new Error(\n `RawData: field \"${name}\" is a matrix and is stored TRANSPOSED - `\n + `use ${verb.startsWith(\"Set\") ? \"SetAndTranspose\" : \"GetTransposed\"}, not ${verb}`\n );\n }\n }\n\n /**\n * Marks the payload as changed since the engine last uploaded it.\n *\n * Only meaningful for a PERSISTENT record - one owned by an object across\n * frames rather than leased from the arena. Carbon's equivalent is\n * `Tr2PersistentPerObjectData::InvalidateBufferData`, called once per frame\n * from the owner's async update (EveSpaceObject2.cpp:626-627); when the flag\n * is clear the engine rebinds the existing GPU buffer with no lock and no\n * memcpy (Tr2PersistentPerObjectData.h:118-124).\n *\n * A transient arena record needs none of this - it is filled and consumed\n * within the frame - so the flag simply stays true there.\n */\n Invalidate()\n {\n this.#dirty = true;\n\n return this;\n }\n\n /** Whether the payload has changed since ClearDirty. */\n IsDirty()\n {\n return this.#dirty;\n }\n\n /** Called by an uploader once the GPU buffer matches this payload. */\n ClearDirty()\n {\n this.#dirty = false;\n\n return this;\n }\n\n /**\n * A PERSISTENT record: one this object owns across frames, with its own\n * buffer, outside the arena.\n *\n * This is Carbon's second per-object shape. Most payloads are leased from the\n * frame pool and die at Reset, but five types keep theirs as members because\n * the values are stable across a frame AND are read back - EveSpaceObject2\n * reads its own stored matrices (cpp:3747) and hands shLighting to\n * attachments as a live pointer (cpp:1877-1883). Those are the records that\n * want Get/GetTransposed.\n *\n * Defaults are applied once here rather than per allocation.\n *\n * Both catalogs are consulted. Per-frame buffers are only ever persistent -\n * the scene owns them across the frame and reads them back - so they have no\n * transient counterpart and never appear in an arena lease.\n */\n static create(struct)\n {\n const layout = CjsPerObjectLayouts.ToRawLayout(struct)\n ?? CjsPerFrameLayouts.ToRawLayout(struct);\n\n if (!layout)\n {\n throw new Error(`RawData: struct \"${struct}\" is in neither CjsPerObjectLayouts nor CjsPerFrameLayouts`);\n }\n\n const floats = new Float32Array(layout.stride);\n const uints = new Uint32Array(floats.buffer);\n\n for (const preset of layout.defaults)\n {\n floats.set(preset.values, preset.offset);\n }\n\n return new RawData(layout, floats, uints, struct);\n }\n\n /** The packed Float32 slice - what the engine uploader memcpys/binds. */\n GetData()\n {\n return this.#floats;\n }\n\n /** The resolved layout (offsets/sizes/encodings) - the engine's bind map. */\n GetLayout()\n {\n return this.#layout;\n }\n}\n"],"names":["RawDataType","Object","freeze","MATRIX","VECTOR","UINT","INT","MATRIX_3X4","SCALAR_SCRATCH","SCALAR_SCRATCH_SET","value","RawDataEncoders","floats","_uints","field","n","Math","sqrt","size","element","elements","source","destination","offset","row","column","total","index","_floats","uints","RawData","constructor","layout","struct","GetStruct","Has","name","prototype","hasOwnProperty","call","fields","#Field","Error","undefined","Number","isInteger","encoding","Set","Copy","out","SetAndTranspose","SetAndTransposeIndex","SetIndex","#Write","encoder","#Normalize","Get","GetIndex","GetTransposed","GetTransposedIndex","CopyIndex","Zero","fill","CopyFrom","other","GetLayout","sameStruct","set","GetData","#View","subarray","#AssertMatrix","#NotMatrix","verb","startsWith","Invalidate","IsDirty","ClearDirty","create","CjsPerObjectLayouts","ToRawLayout","CjsPerFrameLayouts","Float32Array","stride","Uint32Array","buffer","preset","defaults","values"],"mappings":";;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;MACaA,WAAW,GAAGC,MAAM,CAACC,MAAM,CAAC;AACvC;AACAC,EAAAA,MAAM,EAAE,QAAQ;AAEhB;AACAC,EAAAA,MAAM,EAAE,QAAQ;AAEhB;AACAC,EAAAA,IAAI,EAAE,MAAM;AAEZ;AACF;AACA;AACA;AACA;AACEC,EAAAA,GAAG,EAAE,KAAK;AAEV;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,UAAU,EAAE;AACd,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAc,GAAG,CAAC,CAAC,CAAC;AAG1B,SAASC,kBAAkBA,CAACC,KAAK,EACjC;AACEF,EAAAA,cAAc,CAAC,CAAC,CAAC,GAAGE,KAAK;AAEzB,EAAA,OAAOF,cAAc;AACvB;MAGaG,eAAe,GAAGV,MAAM,CAACC,MAAM,CAAC;EAC3C,CAACF,WAAW,CAACG,MAAM,CAAA,CAAES,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAEJ,KAAK,EACjD;IACE,MAAMK,CAAC,GAAGC,IAAI,CAACC,IAAI,CAACH,KAAK,CAACI,IAAI,CAAC;AAE/B,IAAA,KAAK,IAAIC,OAAO,GAAG,CAAC,EAAEA,OAAO,GAAGL,KAAK,CAACM,QAAQ,EAAED,OAAO,EAAE,EACzD;AACE,MAAA,MAAME,MAAM,GAAGF,OAAO,GAAGL,KAAK,CAACI,IAAI;MACnC,MAAMI,WAAW,GAAGR,KAAK,CAACS,MAAM,GAAGJ,OAAO,GAAGL,KAAK,CAACI,IAAI;;AAEvD;AACA;MACA,KAAK,IAAIM,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAGT,CAAC,EAAES,GAAG,EAAE,EAChC;QACE,KAAK,IAAIC,MAAM,GAAG,CAAC,EAAEA,MAAM,GAAGV,CAAC,EAAEU,MAAM,EAAE,EACzC;AACEb,UAAAA,MAAM,CAACU,WAAW,GAAGE,GAAG,GAAGT,CAAC,GAAGU,MAAM,CAAC,GAAGf,KAAK,CAACW,MAAM,GAAGI,MAAM,GAAGV,CAAC,GAAGS,GAAG,CAAC;AAC3E,QAAA;AACF,MAAA;AACF,IAAA;EACF,CAAC;EAED,CAACxB,WAAW,CAACI,MAAM,CAAA,CAAEQ,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAEJ,KAAK,EACjD;IACE,MAAMgB,KAAK,GAAGZ,KAAK,CAACI,IAAI,GAAGJ,KAAK,CAACM,QAAQ;IAEzC,KAAK,IAAIO,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGD,KAAK,EAAEC,KAAK,EAAE,EAC1C;MACEf,MAAM,CAACE,KAAK,CAACS,MAAM,GAAGI,KAAK,CAAC,GAAGjB,KAAK,CAACiB,KAAK,CAAC;AAC7C,IAAA;EACF,CAAC;EAED,CAAC3B,WAAW,CAACK,IAAI,CAAA,CAAEuB,OAAO,EAAEC,KAAK,EAAEf,KAAK,EAAEJ,KAAK,EAC/C;IACE,MAAMgB,KAAK,GAAGZ,KAAK,CAACI,IAAI,GAAGJ,KAAK,CAACM,QAAQ;IAEzC,KAAK,IAAIO,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGD,KAAK,EAAEC,KAAK,EAAE,EAC1C;AACEE,MAAAA,KAAK,CAACf,KAAK,CAACS,MAAM,GAAGI,KAAK,CAAC,GAAGjB,KAAK,CAACiB,KAAK,CAAC,KAAK,CAAC;AAClD,IAAA;EACF,CAAC;EAED,CAAC3B,WAAW,CAACM,GAAG,CAAA,CAAEsB,OAAO,EAAEC,KAAK,EAAEf,KAAK,EAAEJ,KAAK,EAC9C;IACE,MAAMgB,KAAK,GAAGZ,KAAK,CAACI,IAAI,GAAGJ,KAAK,CAACM,QAAQ;;AAEzC;AACA;IACA,KAAK,IAAIO,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGD,KAAK,EAAEC,KAAK,EAAE,EAC1C;AACEE,MAAAA,KAAK,CAACf,KAAK,CAACS,MAAM,GAAGI,KAAK,CAAC,GAAGjB,KAAK,CAACiB,KAAK,CAAC,GAAG,CAAC;AAChD,IAAA;EACF,CAAC;EAED,CAAC3B,WAAW,CAACO,UAAU,CAAA,CAAEK,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAEJ,KAAK,EACrD;AACE;AACA;AACA,IAAA,KAAK,IAAIS,OAAO,GAAG,CAAC,EAAEA,OAAO,GAAGL,KAAK,CAACM,QAAQ,EAAED,OAAO,EAAE,EACzD;AACE,MAAA,MAAME,MAAM,GAAGF,OAAO,GAAG,EAAE;MAC3B,MAAMG,WAAW,GAAGR,KAAK,CAACS,MAAM,GAAGJ,OAAO,GAAGL,KAAK,CAACI,IAAI;MAEvD,KAAK,IAAIM,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAG,CAAC,EAAEA,GAAG,EAAE,EAChC;AACEZ,QAAAA,MAAM,CAACU,WAAW,GAAGE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAGd,KAAK,CAACW,MAAM,GAAGG,GAAG,GAAG,CAAC,CAAC;AAC3DZ,QAAAA,MAAM,CAACU,WAAW,GAAGE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAGd,KAAK,CAACW,MAAM,GAAGG,GAAG,GAAG,CAAC,CAAC;AAC3DZ,QAAAA,MAAM,CAACU,WAAW,GAAGE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAGd,KAAK,CAACW,MAAM,GAAGG,GAAG,GAAG,CAAC,CAAC;AAC3DZ,QAAAA,MAAM,CAACU,WAAW,GAAGE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAGd,KAAK,CAACW,MAAM,GAAGG,GAAG,GAAG,EAAE,CAAC;AAC9D,MAAA;AACF,IAAA;AACF,EAAA;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,MAAMM,OAAO,CACpB;AACE;EACA,OAAO,GAAG,IAAI;;AAEd;EACA,OAAO,GAAG,IAAI;;AAEd;EACA,MAAM,GAAG,IAAI;;AAEb;EACA,MAAM,GAAG,IAAI;;AAEb;EACA,OAAO,GAAG,IAAI;;AAEd;AACF;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,MAAM,EAAEpB,MAAM,EAAEiB,KAAK,EAAEI,MAAM,GAAG,IAAI,EAChD;AACE,IAAA,IAAI,CAAC,OAAO,GAAGD,MAAM;AACrB,IAAA,IAAI,CAAC,OAAO,GAAGpB,MAAM;AACrB,IAAA,IAAI,CAAC,MAAM,GAAGiB,KAAK;AACnB,IAAA,IAAI,CAAC,OAAO,GAAGI,MAAM;AACvB,EAAA;;AAEA;AACAC,EAAAA,SAASA,GACT;IACE,OAAO,IAAI,CAAC,OAAO;AACrB,EAAA;;AAEA;EACAC,GAAGA,CAACC,IAAI,EACR;AACE,IAAA,OAAOnC,MAAM,CAACoC,SAAS,CAACC,cAAc,CAACC,IAAI,CAAC,IAAI,CAAC,OAAO,CAACC,MAAM,EAAEJ,IAAI,CAAC;AACxE,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACE,EAAA,MAAMK,CAACL,IAAI,EAAEjB,OAAO,EACpB;IACE,MAAML,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC0B,MAAM,CAACJ,IAAI,CAAC;IAEvC,IAAI,CAACtB,KAAK,EACV;AACE,MAAA,MAAM,IAAI4B,KAAK,CAAC,CAAA,wBAAA,EAA2BN,IAAI,GAAG,CAAC;AACrD,IAAA;IAEA,IAAIjB,OAAO,KAAKwB,SAAS,EACzB;AACE,MAAA,OAAO7B,KAAK;AACd,IAAA;AAEA,IAAA,IAAI,CAAC8B,MAAM,CAACC,SAAS,CAAC1B,OAAO,CAAC,IAAIA,OAAO,GAAG,CAAC,IAAIA,OAAO,IAAIL,KAAK,CAACM,QAAQ,EAC1E;AACE,MAAA,MAAM,IAAIsB,KAAK,CAAC,CAAA,iBAAA,EAAoBvB,OAAO,CAAA,4BAAA,EAA+BiB,IAAI,CAAA,aAAA,EAAgBtB,KAAK,CAACM,QAAQ,CAAA,CAAA,CAAG,CAAC;AAClH,IAAA;IAEA,OAAO;MACLG,MAAM,EAAET,KAAK,CAACS,MAAM,GAAGJ,OAAO,GAAGL,KAAK,CAACI,IAAI;MAC3CA,IAAI,EAAEJ,KAAK,CAACI,IAAI;AAChBE,MAAAA,QAAQ,EAAE,CAAC;MACX0B,QAAQ,EAAEhC,KAAK,CAACgC;KACjB;AACH,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEC,EAAAA,GAAGA,CAACX,IAAI,EAAE1B,KAAK,EAAES,OAAO,EACxB;AACE,IAAA,IAAI,CAAC,UAAU,CAACiB,IAAI,EAAE,KAAK,CAAC;AAC5B,IAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAACA,IAAI,EAAEjB,OAAO,CAAC,EAAEiB,IAAI,EAAE1B,KAAK,CAAC;AACtD,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEsC,EAAAA,IAAIA,CAACZ,IAAI,EAAEa,GAAG,EAAE9B,OAAO,EACvB;IACE,MAAML,KAAK,GAAG,IAAI,CAAC,MAAM,CAACsB,IAAI,EAAEjB,OAAO,CAAC;IACxC,MAAMO,KAAK,GAAGZ,KAAK,CAACI,IAAI,GAAGJ,KAAK,CAACM,QAAQ;IAEzC,KAAK,IAAIO,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGD,KAAK,EAAEC,KAAK,EAAE,EAC1C;AACEsB,MAAAA,GAAG,CAACtB,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAACb,KAAK,CAACS,MAAM,GAAGI,KAAK,CAAC;AACjD,IAAA;AAEA,IAAA,OAAOsB,GAAG;AACZ,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEC,EAAAA,eAAeA,CAACd,IAAI,EAAE1B,KAAK,EAC3B;AACE,IAAA,IAAI,CAAC,aAAa,CAAC0B,IAAI,CAAC;AACxB,IAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAACA,IAAI,EAAEO,SAAS,CAAC,EAAEP,IAAI,EAAE1B,KAAK,CAAC;AACxD,EAAA;;AAEA;AACAyC,EAAAA,oBAAoBA,CAACf,IAAI,EAAET,KAAK,EAAEjB,KAAK,EACvC;AACE,IAAA,IAAI,CAAC,aAAa,CAAC0B,IAAI,CAAC;AACxB,IAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAACA,IAAI,EAAET,KAAK,CAAC,EAAES,IAAI,EAAE1B,KAAK,CAAC;AACpD,EAAA;;AAEA;AACA0C,EAAAA,QAAQA,CAAChB,IAAI,EAAET,KAAK,EAAEjB,KAAK,EAC3B;AACE,IAAA,IAAI,CAAC,UAAU,CAAC0B,IAAI,EAAE,UAAU,CAAC;AACjC,IAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAACA,IAAI,EAAET,KAAK,CAAC,EAAES,IAAI,EAAE1B,KAAK,CAAC;AACpD,EAAA;;AAEA;AACA,EAAA,MAAM2C,CAACvC,KAAK,EAAEsB,IAAI,EAAE1B,KAAK,EACzB;AACE,IAAA,MAAM4C,OAAO,GAAG3C,eAAe,CAACG,KAAK,CAACgC,QAAQ,CAAC;IAE/C,IAAI,CAACQ,OAAO,EACZ;MACE,MAAM,IAAIZ,KAAK,CAAC,CAAA,kCAAA,EAAqC5B,KAAK,CAACgC,QAAQ,CAAA,UAAA,EAAaV,IAAI,CAAA,EAAA,CAAI,CAAC;AAC3F,IAAA;IAEAkB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAExC,KAAK,EAAE,IAAI,CAAC,UAAU,CAACA,KAAK,EAAEsB,IAAI,EAAE1B,KAAK,CAAC,CAAC;AAChF,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACE,EAAA,UAAU6C,CAACzC,KAAK,EAAEsB,IAAI,EAAE1B,KAAK,EAC7B;AACE,IAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAC7B;MACE,IAAII,KAAK,CAACI,IAAI,GAAGJ,KAAK,CAACM,QAAQ,KAAK,CAAC,EACrC;AACE,QAAA,MAAM,IAAIsB,KAAK,CACb,CAAA,gBAAA,EAAmBN,IAAI,QAAQtB,KAAK,CAACI,IAAI,GAAGJ,KAAK,CAACM,QAAQ,CAAA,YAAA,CAAc,GACtE,4CACJ,CAAC;AACH,MAAA;MAEA,OAAOX,kBAAkB,CAACC,KAAK,CAAC;AAClC,IAAA;AAEA,IAAA,OAAOA,KAAK;AACd,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE8C,GAAGA,CAACpB,IAAI,EACR;AACE,IAAA,IAAI,CAAC,UAAU,CAACA,IAAI,EAAE,KAAK,CAAC;AAE5B,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAACA,IAAI,EAAEO,SAAS,CAAC,CAAC;AACjD,EAAA;;AAEA;AACAc,EAAAA,QAAQA,CAACrB,IAAI,EAAET,KAAK,EACpB;AACE,IAAA,IAAI,CAAC,UAAU,CAACS,IAAI,EAAE,UAAU,CAAC;AAEjC,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAACA,IAAI,EAAET,KAAK,CAAC,CAAC;AAC7C,EAAA;;AAEA;AACF;AACA;AACA;AACA;EACE+B,aAAaA,CAACtB,IAAI,EAClB;AACE,IAAA,IAAI,CAAC,aAAa,CAACA,IAAI,CAAC;AAExB,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAACA,IAAI,EAAEO,SAAS,CAAC,CAAC;AACjD,EAAA;;AAEA;AACAgB,EAAAA,kBAAkBA,CAACvB,IAAI,EAAET,KAAK,EAC9B;AACE,IAAA,IAAI,CAAC,aAAa,CAACS,IAAI,CAAC;AAExB,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAACA,IAAI,EAAET,KAAK,CAAC,CAAC;AAC7C,EAAA;;AAEA;AACAiC,EAAAA,SAASA,CAACxB,IAAI,EAAET,KAAK,EAAEsB,GAAG,EAC1B;IACE,OAAO,IAAI,CAACD,IAAI,CAACZ,IAAI,EAAEa,GAAG,EAAEtB,KAAK,CAAC;AACpC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACEkC,EAAAA,IAAIA,GACJ;AACE,IAAA,IAAI,CAAC,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC;AACpB,IAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAElB,IAAA,OAAO,IAAI;AACb,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACEC,QAAQA,CAACC,KAAK,EACd;AACE,IAAA,MAAM3C,MAAM,GAAG2C,KAAK,EAAEC,SAAS,IAAI;;AAEnC;AACA;AACA;AACA;AACA;AACA;AACA,IAAA,MAAMC,UAAU,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,IAAIF,KAAK,CAAC9B,SAAS,IAAI,KAAK,IAAI,CAAC,OAAO;AAEhF,IAAA,IAAI,CAACb,MAAM,IAAK,CAAC6C,UAAU,IAAI7C,MAAM,KAAK,IAAI,CAAC,OAAQ,EACvD;AACE,MAAA,MAAM,IAAIqB,KAAK,CACb,CAAA,8DAAA,EAAiE,IAAI,CAAC,OAAO,CAAA,UAAA,EAAasB,KAAK,EAAE9B,SAAS,IAAI,IAAI,SAAS,IAC7H,CAAC;AACH,IAAA;IAEA,IAAI,CAAC,OAAO,CAACiC,GAAG,CAACH,KAAK,CAACI,OAAO,EAAE,CAAC;AACjC,IAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAElB,IAAA,OAAO,IAAI;AACb,EAAA;;AAEA;EACA,KAAKC,CAACvD,KAAK,EACX;IACE,MAAMY,KAAK,GAAGZ,KAAK,CAACI,IAAI,GAAGJ,KAAK,CAACM,QAAQ;AAEzC,IAAA,OAAO,IAAI,CAAC,OAAO,CAACkD,QAAQ,CAACxD,KAAK,CAACS,MAAM,EAAET,KAAK,CAACS,MAAM,GAAGG,KAAK,CAAC;AAClE,EAAA;;AAEA;EACA,aAAa6C,CAACnC,IAAI,EAClB;IACE,MAAMtB,KAAK,GAAG,IAAI,CAAC,MAAM,CAACsB,IAAI,EAAEO,SAAS,CAAC;AAE1C,IAAA,IAAI7B,KAAK,CAACgC,QAAQ,KAAK9C,WAAW,CAACG,MAAM,EACzC;MACE,MAAM,IAAIuC,KAAK,CACb,CAAA,gBAAA,EAAmBN,IAAI,SAAStB,KAAK,CAACgC,QAAQ,CAAA,sDAAA,CAChD,CAAC;AACH,IAAA;AACF,EAAA;;AAEA;AACA,EAAA,UAAU0B,CAACpC,IAAI,EAAEqC,IAAI,EACrB;IACE,MAAM3D,KAAK,GAAG,IAAI,CAAC,MAAM,CAACsB,IAAI,EAAEO,SAAS,CAAC;AAE1C,IAAA,IAAI7B,KAAK,CAACgC,QAAQ,KAAK9C,WAAW,CAACG,MAAM,EACzC;MACE,MAAM,IAAIuC,KAAK,CACb,CAAA,gBAAA,EAAmBN,IAAI,CAAA,yCAAA,CAA2C,GAChE,OAAOqC,IAAI,CAACC,UAAU,CAAC,KAAK,CAAC,GAAG,iBAAiB,GAAG,eAAe,CAAA,MAAA,EAASD,IAAI,CAAA,CACpF,CAAC;AACH,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEE,EAAAA,UAAUA,GACV;AACE,IAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAElB,IAAA,OAAO,IAAI;AACb,EAAA;;AAEA;AACAC,EAAAA,OAAOA,GACP;IACE,OAAO,IAAI,CAAC,MAAM;AACpB,EAAA;;AAEA;AACAC,EAAAA,UAAUA,GACV;AACE,IAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AAEnB,IAAA,OAAO,IAAI;AACb,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,MAAMA,CAAC7C,MAAM,EACpB;AACE,IAAA,MAAMD,MAAM,GAAG+C,mBAAmB,CAACC,WAAW,CAAC/C,MAAM,CAAC,IACjDgD,kBAAkB,CAACD,WAAW,CAAC/C,MAAM,CAAC;IAE3C,IAAI,CAACD,MAAM,EACX;AACE,MAAA,MAAM,IAAIU,KAAK,CAAC,CAAA,iBAAA,EAAoBT,MAAM,4DAA4D,CAAC;AACzG,IAAA;IAEA,MAAMrB,MAAM,GAAG,IAAIsE,YAAY,CAAClD,MAAM,CAACmD,MAAM,CAAC;IAC9C,MAAMtD,KAAK,GAAG,IAAIuD,WAAW,CAACxE,MAAM,CAACyE,MAAM,CAAC;AAE5C,IAAA,KAAK,MAAMC,MAAM,IAAItD,MAAM,CAACuD,QAAQ,EACpC;MACE3E,MAAM,CAACuD,GAAG,CAACmB,MAAM,CAACE,MAAM,EAAEF,MAAM,CAAC/D,MAAM,CAAC;AAC1C,IAAA;IAEA,OAAO,IAAIO,OAAO,CAACE,MAAM,EAAEpB,MAAM,EAAEiB,KAAK,EAAEI,MAAM,CAAC;AACnD,EAAA;;AAEA;AACAmC,EAAAA,OAAOA,GACP;IACE,OAAO,IAAI,CAAC,OAAO;AACrB,EAAA;;AAEA;AACAH,EAAAA,SAASA,GACT;IACE,OAAO,IAAI,CAAC,OAAO;AACrB,EAAA;AACF;;;;"}