@carbonenginejs/runtime 0.1.0-alpha.1 → 0.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/global/model/CjsModel.js +3 -1
  2. package/dist/global/model/CjsModel.js.map +1 -1
  3. package/dist/global/model/document/CjsDocumentHydrator.js +5 -1
  4. package/dist/global/model/document/CjsDocumentHydrator.js.map +1 -1
  5. package/dist/global/schema/CjsSchema.js +100 -2
  6. package/dist/global/schema/CjsSchema.js.map +1 -1
  7. package/dist/global/schema/hydration.js +16 -0
  8. package/dist/global/schema/hydration.js.map +1 -1
  9. package/dist/index.js +2 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/resource/CjsResMan.js +177 -4
  12. package/dist/resource/CjsResMan.js.map +1 -1
  13. package/dist/resource/format/CjsBlueReader.js +8 -1
  14. package/dist/resource/format/CjsBlueReader.js.map +1 -1
  15. package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js +23 -5
  16. package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  17. package/dist/resource/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js +12 -3
  18. package/dist/resource/formats/webgl/core/glsl/DxbcGlslOperandFormatter.js.map +1 -1
  19. package/dist/resource/index.js +2 -0
  20. package/dist/resource/index.js.map +1 -1
  21. package/dist/resource/texture/SolidColorTextureConstructor.js +46 -0
  22. package/dist/resource/texture/SolidColorTextureConstructor.js.map +1 -0
  23. package/dist/resource/texture/TriTextureRes.js +43 -0
  24. package/dist/resource/texture/TriTextureRes.js.map +1 -1
  25. package/dist/resource/texture/index.js +2 -0
  26. package/dist/resource/texture/index.js.map +1 -1
  27. package/dist/resource/texture/solidColorTexture.js +111 -0
  28. package/dist/resource/texture/solidColorTexture.js.map +1 -0
  29. package/dist/trinity/eve/attachment/decal/EveSpaceObjectDecal.js +19 -8
  30. package/dist/trinity/eve/attachment/decal/EveSpaceObjectDecal.js.map +1 -1
  31. package/dist/trinity/eve/child/EveChildMesh.js +17 -3
  32. package/dist/trinity/eve/child/EveChildMesh.js.map +1 -1
  33. package/dist/trinity/eve/locator/EveLocatorSets.js +12 -3
  34. package/dist/trinity/eve/locator/EveLocatorSets.js.map +1 -1
  35. package/dist/trinity/eve/spaceObject/EveSpaceObject2.js +15 -2
  36. package/dist/trinity/eve/spaceObject/EveSpaceObject2.js.map +1 -1
  37. package/dist/trinity/eve/spaceObject/IEveSpaceObject2ParentData.js +44 -52
  38. package/dist/trinity/eve/spaceObject/IEveSpaceObject2ParentData.js.map +1 -1
  39. package/docs/resource/concepts/resource-lifecycle.md +10 -8
  40. package/docs/resource/formats/geometry-interchange.md +50 -0
  41. package/docs/resource/formats/webgl/decl-io.md +241 -397
  42. package/docs/resource/formats/webgl/memory-structured.md +91 -128
  43. package/docs/resource/formats/webgl/texture-sample.md +306 -469
  44. package/docs/resource/formats/webgpu/reference/wgsl-compatibility.md +54 -85
  45. package/docs/resource/reference/classes/texture.md +11 -1
  46. package/docs/resource/reference/motherlode-cache.md +24 -11
  47. package/docs/resource/reference/queues.md +23 -1
  48. package/docs/trinityal/reference/classes/dropped.md +11 -1
  49. package/package.json +1 -1
@@ -2,7 +2,7 @@ import { identity as _identity, applyDecs2311 as _applyDecs2311 } from '../../..
2
2
  import { mat4 } from '#math/mat4';
3
3
  import { vec3 } from '#math/vec3';
4
4
  import { CjsModel } from '#model';
5
- import { io, type, carbon, impl } from '#schema';
5
+ import { io, type, carbon, impl, CjsSchema } from '#schema';
6
6
  import { MatrixCopyFrom3x4 } from '../lights/lightConversion.js';
7
7
  import { Locator as _Locator } from './Locator.js';
8
8
 
@@ -85,7 +85,10 @@ new class extends _identity {
85
85
  */
86
86
  Append(locators) {
87
87
  for (const locator of locators) {
88
- this.locators.push(_Locator.from(locator));
88
+ // A value copy, live or plain: from() takes values only.
89
+ const copy = new _Locator();
90
+ CjsSchema.copy(copy, locator);
91
+ this.locators.push(copy);
89
92
  }
90
93
  }
91
94
 
@@ -118,7 +121,13 @@ new class extends _identity {
118
121
  */
119
122
  Set(name, locators) {
120
123
  this.SetName(name);
121
- this.locators = locators.map(locator => _Locator.from(locator));
124
+ // A value copy of each locator, live or plain - Carbon copies the vector by
125
+ // value. from() takes values only, so a live Locator is copied explicitly.
126
+ this.locators = locators.map(locator => {
127
+ const copy = new _Locator();
128
+ CjsSchema.copy(copy, locator);
129
+ return copy;
130
+ });
122
131
  }
123
132
 
124
133
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"EveLocatorSets.js","sources":["../../../../../src/trinity/eve/locator/EveLocatorSets.js"],"sourcesContent":["// Source: trinity/trinity/Eve/SpaceObject/Utils/EveLocatorSets.h\r\n// Source: trinity/trinity/Eve/SpaceObject/Utils/EveLocatorSets.cpp\r\nimport { mat4 } from \"#math/mat4\";\r\nimport { vec3 } from \"#math/vec3\";\r\nimport { CjsModel } from \"#model\";\r\nimport { carbon, impl, io, type } from \"#schema\";\r\nimport { MatrixCopyFrom3x4 } from \"../lights/lightConversion.js\";\r\nimport { Locator } from \"./Locator.js\";\r\n\r\nconst UNIT_Y = vec3.fromValues(0, 1, 0);\r\nconst POSE_BONE_SCRATCH = mat4.create();\r\n\r\n/**\r\n * Resolves a locator to its posed position and direction, transformed by the\r\n * animation updater's mesh bone when the locator is bone-attached.\r\n *\r\n * Carbon `EveGetLocatorPose` (EveLocatorSets.cpp:11-27). The direction is +Y\r\n * rotated by the authored quaternion. Carbon assumes bone 0 is unanimated for\r\n * performance, so only `boneIndex > 0` applies a bone matrix, and the\r\n * direction is deliberately NOT normalized here - the merged-damage caller in\r\n * EveSpaceObject2 normalizes after its own transform, and other callers take\r\n * the raw basis-transformed value.\r\n *\r\n * @param {Float32Array} outPosition - receives the object-space position\r\n * @param {Float32Array} outDirection - receives the unnormalized direction\r\n * @param {Object|null} animationUpdater - Tr2GrannyAnimation or null\r\n * @param {Object} locator - a Locator record\r\n */\r\nexport function EveGetLocatorPose(outPosition, outDirection, animationUpdater, locator)\r\n{\r\n vec3.copy(outPosition, locator.position);\r\n vec3.transformQuat(outDirection, UNIT_Y, locator.direction);\r\n\r\n if (locator.boneIndex > 0 && animationUpdater && animationUpdater.IsInitialized() &&\r\n locator.boneIndex < animationUpdater.GetMeshBoneCount())\r\n {\r\n const bones = animationUpdater.GetMeshBoneMatrixList();\r\n // Carbon leaves the outputs caller-uninitialized when the palette is\r\n // absent; CarbonEngineJS keeps the unskinned values instead.\r\n if (!bones || (locator.boneIndex + 1) * 12 > bones.length) return;\r\n MatrixCopyFrom3x4(POSE_BONE_SCRATCH, bones, locator.boneIndex);\r\n vec3.transformMat4(outPosition, locator.position, POSE_BONE_SCRATCH);\r\n const [ x, y, z ] = outDirection;\r\n outDirection[0] = POSE_BONE_SCRATCH[0] * x + POSE_BONE_SCRATCH[4] * y + POSE_BONE_SCRATCH[8] * z;\r\n outDirection[1] = POSE_BONE_SCRATCH[1] * x + POSE_BONE_SCRATCH[5] * y + POSE_BONE_SCRATCH[9] * z;\r\n outDirection[2] = POSE_BONE_SCRATCH[2] * x + POSE_BONE_SCRATCH[6] * y + POSE_BONE_SCRATCH[10] * z;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Named group of locators that a space object publishes for turrets, effects and\r\n * distributions to attach to.\r\n */\r\n@type.define({\r\n className: \"EveLocatorSets\",\r\n family: \"eve/utils\"\r\n})\r\nexport class EveLocatorSets extends CjsModel\r\n{\r\n @io.persist\r\n @type.list(\"Locator\")\r\n locators = [];\r\n\r\n @io.persist\r\n @type.string\r\n name = \"\";\r\n\r\n /**\r\n * Shifts the position of every locator in the set by an offset, doing nothing\r\n * for a zero offset.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n Translate(offset)\r\n {\r\n if (EveLocatorSets.#lengthSq(offset) === 0)\r\n {\r\n return;\r\n }\r\n for (const locator of this.locators)\r\n {\r\n vec3.add(locator.position, locator.position, offset);\r\n }\r\n }\r\n\r\n /**\r\n * Appends copies of the given locators, so the set never aliases the caller's\r\n * records.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n Append(locators)\r\n {\r\n for (const locator of locators)\r\n {\r\n this.locators.push(Locator.from(locator));\r\n }\r\n }\r\n\r\n /**\r\n * Reports whether the set carries exactly this name; set lookups are an exact\r\n * string match.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n HasName(name)\r\n {\r\n return this.name === String(name);\r\n }\r\n\r\n /** Returns the set's live locator list, not a copy. */\r\n @carbon.method\r\n @impl.implemented\r\n GetLocators()\r\n {\r\n return this.locators;\r\n }\r\n\r\n /** Returns the name callers look this set up by. */\r\n @carbon.method\r\n @impl.implemented\r\n GetName()\r\n {\r\n return this.name;\r\n }\r\n\r\n /** Sets the name callers look this set up by, coercing the value to a string. */\r\n @carbon.method\r\n @impl.implemented\r\n SetName(name)\r\n {\r\n this.name = String(name);\r\n }\r\n\r\n /**\r\n * Replaces both the set name and its whole locator list with copies of the\r\n * given locators.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n Set(name, locators)\r\n {\r\n this.SetName(name);\r\n this.locators = locators.map(locator => Locator.from(locator));\r\n }\r\n\r\n /**\r\n * Overwrites the locator at an index from a plain value, defaulting a missing\r\n * scale to zero and a missing bone index to 0; an index outside the list is\r\n * ignored.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n SetLocator(index, value)\r\n {\r\n const existing = this.locators[index];\r\n if (existing)\r\n {\r\n existing.SetValues({\r\n position: value.position,\r\n direction: value.direction,\r\n scale: value.scale ?? [0, 0, 0],\r\n boneIndex: value.boneIndex ?? 0\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Squared length of a three-component value, used to test an offset for being\r\n * zero without a square root.\r\n */\r\n static #lengthSq(value)\r\n {\r\n return value[0] * value[0] + value[1] * value[1] + value[2] * value[2];\r\n }\r\n}\r\n"],"names":["UNIT_Y","vec3","fromValues","POSE_BONE_SCRATCH","mat4","create","EveGetLocatorPose","outPosition","outDirection","animationUpdater","locator","copy","position","transformQuat","direction","boneIndex","IsInitialized","GetMeshBoneCount","bones","GetMeshBoneMatrixList","length","MatrixCopyFrom3x4","transformMat4","x","y","z","_EveLocatorSets","_identity","EveLocatorSets","CjsModel","e","_init_locators","_init_extra_locators","_init_name","_init_extra_name","_initProto","c","_initClass","_applyDecs","type","define","className","family","io","persist","list","string","carbon","method","impl","implemented","adapted","constructor","args","locators","name","Translate","offset","add","Append","push","Locator","from","HasName","String","GetLocators","GetName","SetName","Set","map","SetLocator","index","value","existing","SetValues","scale","#lengthSq"],"mappings":"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"}
1
+ {"version":3,"file":"EveLocatorSets.js","sources":["../../../../../src/trinity/eve/locator/EveLocatorSets.js"],"sourcesContent":["// Source: trinity/trinity/Eve/SpaceObject/Utils/EveLocatorSets.h\r\n// Source: trinity/trinity/Eve/SpaceObject/Utils/EveLocatorSets.cpp\r\nimport { mat4 } from \"#math/mat4\";\r\nimport { vec3 } from \"#math/vec3\";\r\nimport { CjsModel } from \"#model\";\r\nimport { carbon, CjsSchema, impl, io, type } from \"#schema\";\r\nimport { MatrixCopyFrom3x4 } from \"../lights/lightConversion.js\";\r\nimport { Locator } from \"./Locator.js\";\r\n\r\nconst UNIT_Y = vec3.fromValues(0, 1, 0);\r\nconst POSE_BONE_SCRATCH = mat4.create();\r\n\r\n/**\r\n * Resolves a locator to its posed position and direction, transformed by the\r\n * animation updater's mesh bone when the locator is bone-attached.\r\n *\r\n * Carbon `EveGetLocatorPose` (EveLocatorSets.cpp:11-27). The direction is +Y\r\n * rotated by the authored quaternion. Carbon assumes bone 0 is unanimated for\r\n * performance, so only `boneIndex > 0` applies a bone matrix, and the\r\n * direction is deliberately NOT normalized here - the merged-damage caller in\r\n * EveSpaceObject2 normalizes after its own transform, and other callers take\r\n * the raw basis-transformed value.\r\n *\r\n * @param {Float32Array} outPosition - receives the object-space position\r\n * @param {Float32Array} outDirection - receives the unnormalized direction\r\n * @param {Object|null} animationUpdater - Tr2GrannyAnimation or null\r\n * @param {Object} locator - a Locator record\r\n */\r\nexport function EveGetLocatorPose(outPosition, outDirection, animationUpdater, locator)\r\n{\r\n vec3.copy(outPosition, locator.position);\r\n vec3.transformQuat(outDirection, UNIT_Y, locator.direction);\r\n\r\n if (locator.boneIndex > 0 && animationUpdater && animationUpdater.IsInitialized() &&\r\n locator.boneIndex < animationUpdater.GetMeshBoneCount())\r\n {\r\n const bones = animationUpdater.GetMeshBoneMatrixList();\r\n // Carbon leaves the outputs caller-uninitialized when the palette is\r\n // absent; CarbonEngineJS keeps the unskinned values instead.\r\n if (!bones || (locator.boneIndex + 1) * 12 > bones.length) return;\r\n MatrixCopyFrom3x4(POSE_BONE_SCRATCH, bones, locator.boneIndex);\r\n vec3.transformMat4(outPosition, locator.position, POSE_BONE_SCRATCH);\r\n const [ x, y, z ] = outDirection;\r\n outDirection[0] = POSE_BONE_SCRATCH[0] * x + POSE_BONE_SCRATCH[4] * y + POSE_BONE_SCRATCH[8] * z;\r\n outDirection[1] = POSE_BONE_SCRATCH[1] * x + POSE_BONE_SCRATCH[5] * y + POSE_BONE_SCRATCH[9] * z;\r\n outDirection[2] = POSE_BONE_SCRATCH[2] * x + POSE_BONE_SCRATCH[6] * y + POSE_BONE_SCRATCH[10] * z;\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Named group of locators that a space object publishes for turrets, effects and\r\n * distributions to attach to.\r\n */\r\n@type.define({\r\n className: \"EveLocatorSets\",\r\n family: \"eve/utils\"\r\n})\r\nexport class EveLocatorSets extends CjsModel\r\n{\r\n @io.persist\r\n @type.list(\"Locator\")\r\n locators = [];\r\n\r\n @io.persist\r\n @type.string\r\n name = \"\";\r\n\r\n /**\r\n * Shifts the position of every locator in the set by an offset, doing nothing\r\n * for a zero offset.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n Translate(offset)\r\n {\r\n if (EveLocatorSets.#lengthSq(offset) === 0)\r\n {\r\n return;\r\n }\r\n for (const locator of this.locators)\r\n {\r\n vec3.add(locator.position, locator.position, offset);\r\n }\r\n }\r\n\r\n /**\r\n * Appends copies of the given locators, so the set never aliases the caller's\r\n * records.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n Append(locators)\r\n {\r\n for (const locator of locators)\r\n {\r\n // A value copy, live or plain: from() takes values only.\r\n const copy = new Locator();\r\n CjsSchema.copy(copy, locator);\r\n this.locators.push(copy);\r\n }\r\n }\r\n\r\n /**\r\n * Reports whether the set carries exactly this name; set lookups are an exact\r\n * string match.\r\n */\r\n @carbon.method\r\n @impl.implemented\r\n HasName(name)\r\n {\r\n return this.name === String(name);\r\n }\r\n\r\n /** Returns the set's live locator list, not a copy. */\r\n @carbon.method\r\n @impl.implemented\r\n GetLocators()\r\n {\r\n return this.locators;\r\n }\r\n\r\n /** Returns the name callers look this set up by. */\r\n @carbon.method\r\n @impl.implemented\r\n GetName()\r\n {\r\n return this.name;\r\n }\r\n\r\n /** Sets the name callers look this set up by, coercing the value to a string. */\r\n @carbon.method\r\n @impl.implemented\r\n SetName(name)\r\n {\r\n this.name = String(name);\r\n }\r\n\r\n /**\r\n * Replaces both the set name and its whole locator list with copies of the\r\n * given locators.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n Set(name, locators)\r\n {\r\n this.SetName(name);\r\n // A value copy of each locator, live or plain - Carbon copies the vector by\r\n // value. from() takes values only, so a live Locator is copied explicitly.\r\n this.locators = locators.map(locator =>\r\n {\r\n const copy = new Locator();\r\n CjsSchema.copy(copy, locator);\r\n return copy;\r\n });\r\n }\r\n\r\n /**\r\n * Overwrites the locator at an index from a plain value, defaulting a missing\r\n * scale to zero and a missing bone index to 0; an index outside the list is\r\n * ignored.\r\n */\r\n @carbon.method\r\n @impl.adapted\r\n SetLocator(index, value)\r\n {\r\n const existing = this.locators[index];\r\n if (existing)\r\n {\r\n existing.SetValues({\r\n position: value.position,\r\n direction: value.direction,\r\n scale: value.scale ?? [0, 0, 0],\r\n boneIndex: value.boneIndex ?? 0\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Squared length of a three-component value, used to test an offset for being\r\n * zero without a square root.\r\n */\r\n static #lengthSq(value)\r\n {\r\n return value[0] * value[0] + value[1] * value[1] + value[2] * value[2];\r\n }\r\n}\r\n"],"names":["UNIT_Y","vec3","fromValues","POSE_BONE_SCRATCH","mat4","create","EveGetLocatorPose","outPosition","outDirection","animationUpdater","locator","copy","position","transformQuat","direction","boneIndex","IsInitialized","GetMeshBoneCount","bones","GetMeshBoneMatrixList","length","MatrixCopyFrom3x4","transformMat4","x","y","z","_EveLocatorSets","_identity","EveLocatorSets","CjsModel","e","_init_locators","_init_extra_locators","_init_name","_init_extra_name","_initProto","c","_initClass","_applyDecs","type","define","className","family","io","persist","list","string","carbon","method","impl","implemented","adapted","constructor","args","locators","name","Translate","offset","add","Append","Locator","CjsSchema","push","HasName","String","GetLocators","GetName","SetName","Set","map","SetLocator","index","value","existing","SetValues","scale","#lengthSq"],"mappings":"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"}
@@ -31,7 +31,7 @@ import { Tr2EffectStateManager as _Tr2EffectStateManage } from '../../shader/Tr2
31
31
  import { CarbonVertexElements } from '../../core/vertex/vertexUsage.js';
32
32
  import { RawData } from '../../core/rawData/RawData.js';
33
33
  import { TR2_PICK_TYPE_DEFAULT, Tr2PickType } from '../../core/view/Tr2PickType.js';
34
- import { IEveSpaceObject2ParentData as _IEveSpaceObject2Pare } from './IEveSpaceObject2ParentData.js';
34
+ import { IEveSpaceObject2ParentData } from './IEveSpaceObject2ParentData.js';
35
35
  import { EveCustomMask as _EveCustomMask } from '../EveCustomMask.js';
36
36
  import { EveCollectAreas } from '../child/EveSpaceObjectChild.js';
37
37
  import { EveLocatorSets as _EveLocatorSets, EveGetLocatorPose } from '../locator/EveLocatorSets.js';
@@ -313,6 +313,9 @@ new class extends _identity {
313
313
  // (cpp:3747 takes the world translation out of the STORED transposed matrix).
314
314
  // Carbon's paired m_perObjectDataVs/m_perObjectDataPs GPU buffers are the
315
315
  // engine's business; Invalidate on these records carries the same signal.
316
+ /** The ParentData Carbon builds on the stack for the decal pass
317
+ * (EveSpaceObject2.cpp:1696), held here so the pass does not allocate. */
318
+ #decalParentData = new IEveSpaceObject2ParentData();
316
319
  #vsData = RawData.create("EveSpaceObjectVSData");
317
320
  #psData = RawData.create("EveSpaceObjectPSData");
318
321
 
@@ -658,7 +661,7 @@ new class extends _identity {
658
661
  * attachment reading it sees the hull's current coefficients.
659
662
  * @param {Object} [out] - caller-owned record, refreshed in place
660
663
  */
661
- GetParentData(out = new _IEveSpaceObject2Pare()) {
664
+ GetParentData(out = new IEveSpaceObject2ParentData()) {
662
665
  mat4.copy(out.transform, this.worldTransform);
663
666
  // Carbon memsets the record and never assigns killCount on this path.
664
667
  out.killCount = 0;
@@ -874,6 +877,16 @@ new class extends _identity {
874
877
  for (const child of this.effectChildren) {
875
878
  child?.UpdateVisibility(updateContext, this.worldTransform, this.#lodLevelWithChildren);
876
879
  }
880
+
881
+ // Carbon cpp:1694-1706: the decals take one ParentData built for the pass,
882
+ // after the mesh bone palette when the updater has one.
883
+ if (this.#isMeshVisible) {
884
+ const parentData = this.GetParentData(this.#decalParentData);
885
+ for (const decal of this.decals) {
886
+ if (boneCount) decal.SetBoneMatrix(bones, boneCount);
887
+ decal.UpdateVisibility(updateContext, parentData);
888
+ }
889
+ }
877
890
  if (this.mesh && this.#boundingSphereWorldRadius > 0) {
878
891
  _EveSpaceObject.#SetSphere(_EveSpaceObject.#worldSphere, this.modelWorldPosition, this.#boundingSphereWorldRadius);
879
892
  this.#meshScreenSize = _EveSpaceObject.#GetEstimatedPixelSize(frustum, _EveSpaceObject.#worldSphere) * lodFactor;