@carbonenginejs/runtime 0.1.0-alpha.2 → 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.
- package/dist/global/model/CjsModel.js +3 -1
- package/dist/global/model/CjsModel.js.map +1 -1
- package/dist/global/model/document/CjsDocumentHydrator.js +5 -1
- package/dist/global/model/document/CjsDocumentHydrator.js.map +1 -1
- package/dist/global/schema/CjsSchema.js +98 -18
- package/dist/global/schema/CjsSchema.js.map +1 -1
- package/dist/global/schema/hydration.js +10 -8
- package/dist/global/schema/hydration.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resource/CjsResMan.js +177 -4
- package/dist/resource/CjsResMan.js.map +1 -1
- package/dist/resource/format/CjsBlueReader.js +8 -1
- package/dist/resource/format/CjsBlueReader.js.map +1 -1
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js +7 -1
- package/dist/resource/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
- package/dist/resource/index.js +2 -0
- package/dist/resource/index.js.map +1 -1
- package/dist/resource/texture/SolidColorTextureConstructor.js +46 -0
- package/dist/resource/texture/SolidColorTextureConstructor.js.map +1 -0
- package/dist/resource/texture/TriTextureRes.js +43 -0
- package/dist/resource/texture/TriTextureRes.js.map +1 -1
- package/dist/resource/texture/index.js +2 -0
- package/dist/resource/texture/index.js.map +1 -1
- package/dist/resource/texture/solidColorTexture.js +111 -0
- package/dist/resource/texture/solidColorTexture.js.map +1 -0
- package/dist/trinity/eve/attachment/decal/EveSpaceObjectDecal.js +19 -8
- package/dist/trinity/eve/attachment/decal/EveSpaceObjectDecal.js.map +1 -1
- package/dist/trinity/eve/child/EveChildMesh.js +17 -3
- package/dist/trinity/eve/child/EveChildMesh.js.map +1 -1
- package/dist/trinity/eve/locator/EveLocatorSets.js +12 -3
- package/dist/trinity/eve/locator/EveLocatorSets.js.map +1 -1
- package/dist/trinity/eve/spaceObject/EveSpaceObject2.js +15 -2
- package/dist/trinity/eve/spaceObject/EveSpaceObject2.js.map +1 -1
- package/dist/trinity/eve/spaceObject/IEveSpaceObject2ParentData.js +44 -52
- package/dist/trinity/eve/spaceObject/IEveSpaceObject2ParentData.js.map +1 -1
- package/docs/resource/concepts/resource-lifecycle.md +10 -8
- package/docs/resource/formats/geometry-interchange.md +50 -0
- package/docs/resource/formats/webgl/decl-io.md +241 -397
- package/docs/resource/formats/webgl/memory-structured.md +91 -128
- package/docs/resource/formats/webgl/texture-sample.md +306 -469
- package/docs/resource/reference/classes/texture.md +11 -1
- package/docs/resource/reference/motherlode-cache.md +24 -11
- package/docs/resource/reference/queues.md +23 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EveSpaceObjectDecal.js","sources":["../../../../../../src/trinity/eve/attachment/decal/EveSpaceObjectDecal.js"],"sourcesContent":["// Source: trinity/trinity/Eve/SpaceObject/Attachments/EveSpaceObjectDecal.h\n// Source: trinity/trinity/Eve/SpaceObject/Attachments/EveSpaceObjectDecal.cpp\n// Source: trinity/trinity/Eve/SpaceObject/Attachments/EveSpaceObjectDecal_Blue.cpp\nimport { box3 } from \"#math/box3\";\nimport { mat4 } from \"#math/mat4\";\nimport { quat } from \"#math/quat\";\nimport { vec3 } from \"#math/vec3\";\nimport { CjsModel } from \"#model\";\nimport { carbon, impl, io, type } from \"#schema\";\nimport { IEveSpaceObject2ParentData } from \"../../spaceObject/IEveSpaceObject2ParentData.js\";\nimport { TriBatchType } from \"#consts/graphics\";\nimport { withITr2Renderable } from \"../../../core/ITr2Renderable.js\";\nimport { BuildDecalGeometry, BuildStaticDecalGeometry } from \"./decalIndices.js\";\n\n\n/**\n * A decal projected onto a parent hull, owning its oriented projection matrix,\n * optional bone attachment, per-LOD triangle index lists and screen-size\n * visibility ramp.\n */\n@type.define({ className: \"EveSpaceObjectDecal\", family: \"eve/attachment/decal\" })\nexport class EveSpaceObjectDecal extends withITr2Renderable(CjsModel)\n{\n /**\n * Establishes Carbon's opaque decal batch type after schema initialization,\n * because the schema's legacy TriBatchType default is 0.\n */\n constructor()\n {\n super();\n // The schema's legacy TriBatchType default is 0. Carbon's decal default is\n // the opaque batch (1), so establish it after model/schema initialization.\n this.batchType = 1;\n }\n\n @io.persist\n @type.string\n name = \"\";\n\n @io.read\n @type.int32\n @type.enum(\"TriBatchType\")\n batchType = 1;\n\n @io.notify\n @io.persist\n @type.vec3\n position = vec3.create();\n\n @io.persist\n @type.float32\n minScreenSize = 0;\n\n @io.notify\n @io.persist\n @type.quat\n rotation = quat.create();\n\n @io.notify\n @io.persist\n @type.vec3\n scaling = vec3.fromValues(1, 1, 1);\n\n @io.persist\n @type.int32\n parentBoneIndex = -1;\n\n @io.rebuild(\"packedGeometry\")\n @io.persist\n @type.objectRef(\"Tr2Effect\")\n decalEffect = null;\n\n @io.readwrite\n @type.boolean\n display = true;\n\n // SOF-authored per-LOD triangle indices; persisted so the values\n // interchange reproduces Carbon's hidden decal geometry selection.\n @io.rebuild(\"packedGeometry\")\n @io.persist\n @type.array(\"unknown\")\n staticIndexBuffers = [];\n\n #decalMatrix = mat4.create();\n\n #inverseDecalMatrix = mat4.create();\n\n #priority = 0;\n\n /** m_baseGeometryResource (TriGeometryResPtr) - the hull's, not the decal's. */\n #baseGeometryResource = null;\n\n /** m_geometryLodIndex (int) */\n #geometryLodIndex = 0;\n\n /** m_decalGeometry (std::shared_ptr<MeshDecalData>) */\n #decalGeometry = null;\n\n /** m_isGeometryFrozen (bool) - pins the decal to LOD 0. */\n #isGeometryFrozen = false;\n\n /** m_parentData (EveSpaceObjectDecal.h:178) - copied by value from the\n * owning space object each frame; zeroed with an identity transform by\n * Carbon's constructor (cpp:56-57). Runtime state, never persisted. */\n #parentData = new IEveSpaceObject2ParentData();\n\n /** m_parentBoneMatrix (h:190) - the animated parent bone this decal rides,\n * identity until SetBoneMatrix supplies one. */\n #parentBoneMatrix = mat4.create();\n\n /** m_isVisible (h:204) - a float, not a bool: the non-LOD paths set exactly\n * 0 or 1 while the LOD path writes a 0..1 fade ramp (cpp:119-176). */\n #isVisible = 0;\n\n /** m_minBounds / m_maxBounds (h:215) - the geometry mesh bounds an instanced\n * decal measures instead of the unit cube. Stamped by the loader. */\n #minBounds = vec3.create();\n\n #maxBounds = vec3.create();\n\n /** m_instanceData (h:212) - non-null selects the instanced visibility path.\n * The instance buffer itself is engine-owned; the graph only needs to know\n * whether one is attached. */\n #instanceData = null;\n\n /** Carbon m_invParentBoneMatrix (h:191) is declared but never assigned; the\n * value the shader sees is recomputed per fill (cpp:366), so this port keeps\n * no member for it. */\n #inverseParentBoneMatrix = mat4.create();\n\n #shLightingScratch = new Float32Array(IEveSpaceObject2ParentData.SH_COEFFICIENT_COUNT * 4);\n\n /**\n * Property form of HasStaticIndexBuffers: whether any LOD carries decal\n * triangle indices.\n */\n get hasStaticIndexBuffers()\n {\n return this.HasStaticIndexBuffers();\n }\n\n /**\n * Builds the decal matrix and its inverse from the authored position, rotation\n * and scaling; returns false when the composed matrix is not invertible.\n */\n @carbon.method\n @impl.adapted\n Initialize()\n {\n return this.#updateDecalMatrix();\n }\n\n /**\n * Rebuilds the decal matrix and its inverse after an authored placement\n * change.\n */\n @carbon.method\n @impl.adapted\n OnModified(_options = {})\n {\n this.#updateDecalMatrix();\n return true;\n }\n\n /**\n * Copies another decal's authored description - name, display, placement, bone\n * index, minimum screen size, effect and batch type - and rebuilds the decal\n * matrix; the per-LOD index buffers are not copied. Returns false when source\n * is missing.\n */\n @carbon.method\n @impl.adapted\n CopyFrom(source)\n {\n if (!source) return false;\n this.name = String(source.name ?? \"\");\n this.display = !!source.display;\n vec3.copy(this.position, source.position || EveSpaceObjectDecal.#zero);\n quat.copy(this.rotation, source.rotation || EveSpaceObjectDecal.#identityRotation);\n vec3.copy(this.scaling, source.scaling || EveSpaceObjectDecal.#one);\n this.parentBoneIndex = Number(source.parentBoneIndex) | 0;\n this.minScreenSize = Number(source.minScreenSize) || 0;\n this.decalEffect = source.decalEffect ?? null;\n this.batchType = Number(source.batchType) | 0;\n return this.#updateDecalMatrix();\n }\n\n /**\n * Copies the authored decal position into the caller-owned out vector and\n * returns it.\n */\n @carbon.method\n @impl.adapted\n GetPosition(out = vec3.create())\n {\n return vec3.copy(out, this.position);\n }\n\n /**\n * Sets the authored decal position and rebuilds the decal matrix; a missing\n * value is taken as the origin.\n */\n @carbon.method\n @impl.adapted\n SetPosition(value)\n {\n vec3.copy(this.position, value || EveSpaceObjectDecal.#zero);\n return this.#updateDecalMatrix();\n }\n\n /**\n * Copies the authored decal rotation into the caller-owned out quaternion and\n * returns it.\n */\n @carbon.method\n @impl.adapted\n GetRotation(out = quat.create())\n {\n return quat.copy(out, this.rotation);\n }\n\n /**\n * Sets the authored decal rotation and rebuilds the decal matrix; a missing\n * value is taken as the identity rotation.\n */\n @carbon.method\n @impl.adapted\n SetRotation(value)\n {\n quat.copy(this.rotation, value || EveSpaceObjectDecal.#identityRotation);\n return this.#updateDecalMatrix();\n }\n\n /**\n * Copies the authored decal scaling into the caller-owned out vector and\n * returns it.\n */\n @carbon.method\n @impl.adapted\n GetScaling(out = vec3.create())\n {\n return vec3.copy(out, this.scaling);\n }\n\n /**\n * Copies the decal's projection matrix into out; the value is only current as\n * of the last Initialize, OnModified or placement setter.\n */\n @carbon.method\n @impl.adapted\n GetDecalMatrix(out = mat4.create())\n {\n return mat4.copy(out, this.#decalMatrix);\n }\n\n /**\n * Copies the inverse of the decal's projection matrix into out, which is what\n * maps hull-space positions into the decal's unit cube.\n */\n @carbon.method\n @impl.adapted\n GetInverseDecalMatrix(out = mat4.create())\n {\n return mat4.copy(out, this.#inverseDecalMatrix);\n }\n\n /**\n * Sets the authored decal scaling and rebuilds the decal matrix; a missing\n * value is taken as unit scale.\n */\n @carbon.method\n @impl.adapted\n SetScaling(value)\n {\n vec3.copy(this.scaling, value || EveSpaceObjectDecal.#one);\n return this.#updateDecalMatrix();\n }\n\n /**\n * The parent mesh bone the decal rides, or -1 when it rides the hull transform\n * directly.\n */\n @carbon.method\n @impl.adapted\n GetBoneIndex()\n {\n return this.parentBoneIndex;\n }\n\n /**\n * Sets the parent mesh bone the decal rides; the bone matrix itself is only\n * picked up on the next SetBoneMatrix.\n */\n @carbon.method\n @impl.adapted\n SetBoneIndex(index)\n {\n this.parentBoneIndex = Number(index) | 0;\n return true;\n }\n\n /**\n * Replaces the SOF-authored triangle index lists, one array per LOD, coercing\n * each entry to an unsigned integer.\n */\n @carbon.method\n @impl.adapted\n SetIndices(indices)\n {\n this.staticIndexBuffers = Array.from(indices || [], lod => Array.from(lod || [], value => Number(value) >>> 0));\n return true;\n }\n\n /**\n * The per-LOD triangle index lists as fresh copies, so a caller cannot mutate\n * the stored buffers.\n */\n @carbon.method\n @impl.adapted\n GetStaticIndexBuffers()\n {\n return this.staticIndexBuffers.map(lod => lod.slice());\n }\n\n /**\n * Whether any LOD carries triangle indices; a decal without them has no\n * geometry to draw.\n */\n @carbon.method\n @impl.adapted\n HasStaticIndexBuffers()\n {\n return this.staticIndexBuffers.some(lod => lod.length > 0);\n }\n\n /** The triangle count per LOD, being each index list's length divided by three. */\n @carbon.method\n @impl.adapted\n GetDecalPrimitiveCounts()\n {\n return this.staticIndexBuffers.map(lod => Math.trunc(lod.length / 3));\n }\n\n /**\n * Sets the LOD threshold in screen pixels below which UpdateVisibility culls\n * the decal; zero disables the test and makes the decal always visible.\n */\n @carbon.method\n @impl.adapted\n SetMinScreenSize(value)\n {\n this.minScreenSize = Number(value) || 0;\n return true;\n }\n\n /** Sets the effect that draws the decal; a decal without one is never visible. */\n @carbon.method\n @impl.adapted\n SetEffect(effect)\n {\n this.decalEffect = effect ?? null;\n return true;\n }\n\n /**\n * Sets a shader option on the decal effect; returns false when no effect that\n * accepts options is attached.\n */\n @carbon.method\n @impl.adapted\n SetShaderOption(name, value)\n {\n if (!this.decalEffect?.SetOption) return false;\n this.decalEffect.SetOption(name, value);\n return true;\n }\n\n /**\n * Sets the TriBatchType the decal submits under, overriding the opaque default\n * the constructor establishes.\n */\n @carbon.method\n @impl.adapted\n SetBatchType(value)\n {\n this.batchType = Number(value) | 0;\n return true;\n }\n\n /**\n * Sets the draw priority the engine sorts decals on; the value is runtime-only\n * and never persisted.\n */\n @carbon.method\n @impl.adapted\n SetPriority(value)\n {\n this.#priority = Number(value) >>> 0;\n return true;\n }\n\n /** Carbon EveSpaceObjectDecal::SetBoneMatrix (cpp:475-491): expands the\n * parent's Float4x3 mesh bone at m_parentBoneIndex into the 4x4 bone matrix.\n * A -1 index or an out-of-range index leaves the identity in place. */\n @carbon.method\n @impl.implemented\n SetBoneMatrix(boneMatrices, boneMatrixCount)\n {\n if (this.parentBoneIndex === -1 || this.parentBoneIndex >= boneMatrixCount)\n {\n return false;\n }\n\n const bone = boneMatrices?.[this.parentBoneIndex];\n if (!bone) return false;\n\n // Float4x3 is COLUMN-stride on the shared byte layout: each packed row is\n // (v0, v4, v8, v12) of the logical matrix (math skill gotcha 7), so the\n // expansion writes the transpose of the three packed rows back into the\n // 4x4 basis and leaves the last column as identity.\n const out = this.#parentBoneMatrix;\n for (let row = 0; row < 3; row++)\n {\n out[row] = bone[row * 4 + 0];\n out[4 + row] = bone[row * 4 + 1];\n out[8 + row] = bone[row * 4 + 2];\n out[12 + row] = bone[row * 4 + 3];\n }\n out[3] = 0;\n out[7] = 0;\n out[11] = 0;\n out[15] = 1;\n\n return true;\n }\n\n /** Carbon copies the parent data by value at the two points UpdateVisibility\n * accepts the decal (cpp:145, cpp:178). shLighting is a borrowed pointer into\n * the parent's own PS data, so it is carried by reference exactly as Carbon\n * carries the pointer. */\n #CopyParentData(parentData)\n {\n if (this.#parentData.SetValues) this.#parentData.SetValues(parentData);\n else Object.assign(this.#parentData, parentData);\n\n this.#parentData.shLighting = parentData.shLighting ?? null;\n }\n\n /**\n * Carbon EveSpaceObjectDecal::UpdateVisibility (cpp:117-179).\n *\n * `m_isVisible` is a FLOAT: zero when culled, one when no minimum screen\n * size is authored, otherwise a 0..1 fade ramp that reaches the shader as\n * displayData.y. The ramp has no lower clamp because the below-minimum case\n * already returned.\n *\n * On every cull path Carbon leaves m_parentData STALE - only the visibility\n * is cleared - so the copy happens solely on the accept paths.\n */\n @carbon.method\n @impl.implemented\n UpdateVisibility(updateContext, parentData)\n {\n this.#isVisible = 0;\n\n if (!this.display || !this.decalEffect || !parentData) return false;\n\n if (!(this.minScreenSize > 0))\n {\n this.#isVisible = 1;\n this.#CopyParentData(parentData);\n return true;\n }\n\n const frustum = updateContext?.GetFrustum?.() ?? updateContext?.frustum ?? null;\n if (!frustum) return false;\n\n // Carbon (row-vector): m_parentBoneMatrix * parentData->transform - the\n // bone applies first, so the gl operands swap.\n const worldDecalMatrix = mat4.multiply(\n EveSpaceObjectDecal.#worldDecalScratch,\n parentData.transform,\n this.#parentBoneMatrix\n );\n const bounds = box3.set(EveSpaceObjectDecal.#boundsScratch, -1, -1, -1, 1, 1, 1);\n\n if (this.#instanceData)\n {\n // Instanced decals measure the geometry mesh bounds instead of the unit\n // cube (cpp:135-155). Carbon transforms only the two CORNERS here (not\n // the eight, as it does below), so this is vec3, not box3.transformMat4.\n // Carbon transforms only the two CORNERS here (not the eight, as it does\n // below). A mirroring transform swaps them, which Carbon leaves inverted\n // and box3 would read as EMPTY, so the pair is accumulated as points -\n // ordering it. The eight-corner transform below is indifferent to order,\n // so this only affects the mirrored-decal early-outs (parity note\n // divergence 7).\n const corner = EveSpaceObjectDecal.#pointScratch;\n box3.empty(bounds);\n vec3.transformMat4(corner, this.#minBounds, worldDecalMatrix);\n box3.addPoint(bounds, bounds, corner);\n vec3.transformMat4(corner, this.#maxBounds, worldDecalMatrix);\n box3.addPoint(bounds, bounds, corner);\n\n if (box3.containsPoint(bounds, frustum.viewPos))\n {\n this.#isVisible = 1;\n this.#CopyParentData(parentData);\n return true;\n }\n\n if (!frustum.IsBoxVisible?.(bounds))\n {\n return false;\n }\n\n // Measure from the closest point of the box rather than its centre, so a\n // long box does not lod out while one end is near the camera.\n const offset = box3.getClampedPoint(\n EveSpaceObjectDecal.#pointScratch,\n bounds,\n frustum.viewPos\n );\n vec3.subtract(offset, offset, frustum.viewPos);\n mat4.multiply(\n worldDecalMatrix,\n mat4.fromTranslation(EveSpaceObjectDecal.#offsetScratch, offset),\n worldDecalMatrix\n );\n }\n\n // Carbon: m_decalMatrix * worldDecalMatrix - the decal applies first.\n mat4.multiply(worldDecalMatrix, worldDecalMatrix, this.#decalMatrix);\n box3.transformMat4(bounds, bounds, worldDecalMatrix);\n\n // Carbon's sphere is the box's circumscribing sphere: the centre of the\n // transformed box and HALF ITS FULL DIAGONAL (cpp:159-160).\n const center = EveSpaceObjectDecal.#pointScratch;\n const radius = box3.toPositionRadius(bounds, center);\n const pixelSize = frustum.GetPixelSizeAccrossEst(center, radius);\n const modifiedMinScreen = this.minScreenSize * (updateContext?.GetLodFactor() ?? 1);\n\n if (pixelSize < modifiedMinScreen) return false;\n\n this.#isVisible = Math.min((pixelSize - modifiedMinScreen) / (modifiedMinScreen * 0.5), 1);\n this.#CopyParentData(parentData);\n return true;\n }\n\n /** The visibility fade Carbon writes to displayData.y; 0 when lodded out. */\n @carbon.method\n @impl.adapted\n @impl.reason(\"Carbon reads the m_isVisible member directly; JavaScript exposes the private runtime value through an accessor.\")\n GetVisibility()\n {\n return this.#isVisible;\n }\n\n /** Carbon EveSpaceObjectDecal::HasTransparentBatches (cpp:241-244). */\n @carbon.method\n @impl.implemented\n HasTransparentBatches()\n {\n return true;\n }\n\n /** Carbon EveSpaceObjectDecal::GetSortValue (cpp:337-340). */\n @carbon.method\n @impl.implemented\n GetSortValue()\n {\n return 1;\n }\n\n /** Carbon ITr2Pickable::GetID is inline on the decal (h:113-116) and returns\n * the object itself; the area id selects nothing on this class. */\n @carbon.method\n @impl.implemented\n GetID(_areaId)\n {\n return this;\n }\n\n /**\n * Carbon EveSpaceObjectDecal::GetPerObjectData (cpp:346-386): the\n * EveDecalPerObjectData composite - a DecalVSPerObjectData +\n * DecalPSPerObjectData pair uploaded as TWO constant buffers (cpp:975-976).\n * Here that is two Allocs returned as a { vs, ps } record.\n *\n * SetAndTranspose performs Carbon's Transpose. Carbon computes the two\n * inverses FROM the already-transposed matrices; because Inverse(M-transpose)\n * equals Inverse(M)-transpose (carbon-math-conventions F2), inverting the\n * logical matrix and letting the encoder transpose produces byte-identical\n * output with one transpose less work.\n */\n @carbon.method\n @impl.implemented\n GetPerObjectData(accumulator)\n {\n const vs = accumulator.Alloc(\"DecalVSPerObjectData\");\n const ps = accumulator.Alloc(\"DecalPSPerObjectData\");\n const parentData = this.#parentData;\n\n vs.SetAndTranspose(\"worldMatrix\", parentData.transform);\n // cpp:358 inverts the transposed world matrix in place; by F2 that is the\n // transpose of the logical inverse, so this is the same bytes.\n mat4.invert(this.#inverseParentBoneMatrix, parentData.transform);\n vs.SetAndTranspose(\"invWorldMatrix\", this.#inverseParentBoneMatrix);\n\n vs.SetAndTranspose(\"decalMatrix\", this.#decalMatrix);\n vs.SetAndTranspose(\"inverseDecalMatrix\", this.#inverseDecalMatrix);\n vs.SetAndTranspose(\"parentBoneMatrix\", this.#parentBoneMatrix);\n\n // cpp:366 - Inverse(Transpose(m_parentBoneMatrix)), recomputed per fill;\n // Carbon never reads its own m_invParentBoneMatrix member. Same F2\n // identity as above.\n mat4.invert(this.#inverseParentBoneMatrix, this.#parentBoneMatrix);\n vs.SetAndTranspose(\"invParentBoneMatrix\", this.#inverseParentBoneMatrix);\n\n // cpp:374 - killCount is a uint widened to float; isVisible is the 0..1\n // visibility ramp; z and w are reserved literals.\n ps.Set(\"displayData\", [parentData.killCount, this.#isVisible, 0, 0]);\n ps.Set(\"shipData\", parentData.shipData);\n ps.Set(\"clipData\", [\n parentData.clipSphereCenter[0],\n parentData.clipSphereCenter[1],\n parentData.clipSphereCenter[2],\n parentData.clipRadiusSq\n ]);\n ps.Set(\"clipRadius2Sq\", [parentData.clipRadius2Sq]);\n\n // cpp:376-383 - copy the parent's seven packed coefficients, or zero the\n // whole block when the parent supplied none. m_unused stays unwritten.\n const coefficients = this.#shLightingScratch;\n coefficients.fill(0);\n const shLighting = parentData.shLighting;\n if (shLighting)\n {\n for (let index = 0; index < coefficients.length && index < shLighting.length; index++)\n {\n coefficients[index] = shLighting[index];\n }\n }\n ps.Set(\"shLightingCoefficients\", coefficients);\n\n return { vs, ps };\n }\n\n /**\n * Adds this decal to the renderable list once its geometry is ready.\n *\n * Carbon EveSpaceObjectDecal::GetRenderables (cpp:182-225). EveSpaceObject2\n * already calls this per decal with the hull's geometry resource and mesh\n * screen size (cpp:1578-1591); ours does the same.\n *\n * The decal is a RENDERABLE, not a batch source the parent drains: it puts\n * itself in the list and the renderer asks it for batches later, which is why\n * everything expensive happens here and GetBatches only submits.\n *\n * @param {Array} out Renderable list.\n * @param {object} _meshCache Carbon's DecalMeshCache, only used by the\n * selection path to avoid re-mapping hull buffers; unused here because a\n * decoded payload is already CPU-side.\n * @param {object} geometryResource The hull's geometry.\n * @param {number} screenSize The parent's mesh screen size, for LOD choice.\n * @returns {boolean} Whether the decal was added.\n */\n @carbon.method\n @impl.adapted\n @impl.reason(\"Trinity selects the LOD and builds the index list; the engine owns the device index buffer, so validity is judged on the built list rather than on a GPU allocation.\")\n GetRenderables(out = [], _meshCache = null, geometryResource = null, screenSize = Infinity)\n {\n if (this.#isVisible <= 0 || !geometryResource) return false;\n\n // A NEW MESH INVALIDATES THE BUILD. Carbon's comment calls this out as slow\n // and to be avoided, which is why it is keyed on identity rather than\n // rebuilt every frame.\n if (geometryResource !== this.#baseGeometryResource)\n {\n this.#decalGeometry = null;\n this.#baseGeometryResource = geometryResource;\n }\n\n const mesh = geometryResource.GetMeshData(0);\n\n if (!this.#decalGeometry || (mesh && mesh.lodMask !== this.#decalGeometry.lodMask))\n {\n this.#decalGeometry = this.#BuildGeometry(mesh);\n }\n\n if (!this.#decalGeometry) return false;\n\n this.#geometryLodIndex = this.#isGeometryFrozen\n ? 0\n : geometryResource.GetLodIndexForScreenSize(0, screenSize);\n\n const lod = this.#decalGeometry.lods?.[this.#geometryLodIndex];\n\n // A LOD the decal does not reach carries zero primitives, which is how\n // Carbon says \"not covered here\" - hence testing the count, not the buffer.\n if (!lod || !lod.primitiveCount) return false;\n\n out.push(this);\n\n return true;\n }\n\n /**\n * Builds the decal's index list for the hull it is attached to.\n *\n * The static lists win when present, exactly as Carbon orders it: every decal\n * on a shipped hull arrives with them, and triangle selection sits behind the\n * g_buildDecalBuffers global for decals placed at runtime (cpp:196-207).\n *\n * @param {object} mesh Decoded mesh data.\n * @returns {object|null} Built geometry, or null when there is nothing to draw.\n */\n #BuildGeometry(mesh)\n {\n if (!mesh) return null;\n\n const built = this.HasStaticIndexBuffers()\n ? BuildStaticDecalGeometry(mesh, this.staticIndexBuffers)\n : BuildDecalGeometry(mesh, this.#decalMatrix, this.#inverseDecalMatrix);\n\n if (!built.indices.length) return null;\n\n return {\n inverseDecalMatrix: mat4.clone(this.#inverseDecalMatrix),\n lodMask: mesh.lodMask ?? 0,\n lods: built.lods,\n indices: built.indices\n };\n }\n\n /** Carbon EveSpaceObjectDecal::SetHighDetailDecalState (cpp:514-517). */\n @carbon.method\n @impl.implemented\n SetHighDetailDecalState(isFrozen)\n {\n this.#isGeometryFrozen = !!isFrozen;\n return true;\n }\n\n /** Carbon EveSpaceObjectDecal::GetBatches (cpp:250-331) submits the packed\n * decal index buffers against the device geometry resource. */\n @carbon.method\n @impl.notImplemented\n GetBatches(_batches, _batchType, _perObjectData, _reason)\n {\n throw new Error(\"EveSpaceObjectDecal.GetBatches is not implemented in CarbonEngineJS.\");\n }\n\n /** Carbon EveSpaceObjectDecal::GetPickingBatches (cpp:919-926) forwards to\n * GetBatches once the attachment pick-type mask passes. */\n @carbon.method\n @impl.notImplemented\n GetPickingBatches(_batches, _pickTypes, _perObjectData)\n {\n throw new Error(\"EveSpaceObjectDecal.GetPickingBatches is not implemented in CarbonEngineJS.\");\n }\n\n /**\n * Recomposes the decal matrix from the authored rotation, position and scaling\n * and inverts it; returns whether the inverse existed.\n */\n #updateDecalMatrix()\n {\n mat4.fromRotationTranslationScale(this.#decalMatrix, this.rotation, this.position, this.scaling);\n return !!mat4.invert(this.#inverseDecalMatrix, this.#decalMatrix);\n }\n\n /** Per-frame scratch - UpdateVisibility must not allocate. */\n static #boundsScratch = box3.create();\n\n static #worldDecalScratch = mat4.create();\n\n static #offsetScratch = mat4.create();\n\n static #pointScratch = vec3.create();\n\n static #zero = vec3.create();\n\n static #one = vec3.fromValues(1, 1, 1);\n\n static #identityRotation = quat.create();\n\n static TriBatchType = TriBatchType;\n\n}\n"],"names":["_EveSpaceObjectDecal","_identity","EveSpaceObjectDecal","_withITr2Renderable","withITr2Renderable","CjsModel","e","_init_name","_init_extra_name","_init_batchType","_init_extra_batchType","_init_position","_init_extra_position","_init_minScreenSize","_init_extra_minScreenSize","_init_rotation","_init_extra_rotation","_init_scaling","_init_extra_scaling","_init_parentBoneIndex","_init_extra_parentBoneIndex","_init_decalEffect","_init_extra_decalEffect","_init_display","_init_extra_display","_init_staticIndexBuffers","_init_extra_staticIndexBuffers","_initProto","c","_initClass","_applyDecs","type","define","className","family","io","persist","string","read","int32","enum","notify","vec3","float32","quat","rebuild","objectRef","readwrite","boolean","array","carbon","method","impl","adapted","implemented","reason","notImplemented","constructor","batchType","name","position","create","minScreenSize","rotation","scaling","fromValues","parentBoneIndex","decalEffect","display","staticIndexBuffers","mat4","IEveSpaceObject2ParentData","Float32Array","SH_COEFFICIENT_COUNT","hasStaticIndexBuffers","HasStaticIndexBuffers","Initialize","OnModified","_options","CopyFrom","source","String","copy","Number","GetPosition","out","SetPosition","value","GetRotation","SetRotation","GetScaling","GetDecalMatrix","GetInverseDecalMatrix","SetScaling","GetBoneIndex","SetBoneIndex","index","SetIndices","indices","Array","from","lod","GetStaticIndexBuffers","map","slice","some","length","GetDecalPrimitiveCounts","Math","trunc","SetMinScreenSize","SetEffect","effect","SetShaderOption","SetOption","SetBatchType","SetPriority","SetBoneMatrix","boneMatrices","boneMatrixCount","bone","row","#CopyParentData","parentData","SetValues","Object","assign","shLighting","UpdateVisibility","updateContext","frustum","GetFrustum","worldDecalMatrix","multiply","transform","bounds","box3","set","corner","empty","transformMat4","addPoint","containsPoint","viewPos","IsBoxVisible","offset","getClampedPoint","subtract","fromTranslation","center","radius","toPositionRadius","pixelSize","GetPixelSizeAccrossEst","modifiedMinScreen","GetLodFactor","min","GetVisibility","HasTransparentBatches","GetSortValue","GetID","_areaId","GetPerObjectData","accumulator","vs","Alloc","ps","SetAndTranspose","invert","Set","killCount","shipData","clipSphereCenter","clipRadiusSq","clipRadius2Sq","coefficients","fill","GetRenderables","_meshCache","geometryResource","screenSize","Infinity","mesh","GetMeshData","lodMask","GetLodIndexForScreenSize","lods","primitiveCount","push","#BuildGeometry","built","BuildStaticDecalGeometry","BuildDecalGeometry","inverseDecalMatrix","clone","SetHighDetailDecalState","isFrozen","GetBatches","_batches","_batchType","_perObjectData","_reason","Error","GetPickingBatches","_pickTypes","#updateDecalMatrix","fromRotationTranslationScale","TriBatchType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EveSpaceObjectDecal.js","sources":["../../../../../../src/trinity/eve/attachment/decal/EveSpaceObjectDecal.js"],"sourcesContent":["// Source: trinity/trinity/Eve/SpaceObject/Attachments/EveSpaceObjectDecal.h\n// Source: trinity/trinity/Eve/SpaceObject/Attachments/EveSpaceObjectDecal.cpp\n// Source: trinity/trinity/Eve/SpaceObject/Attachments/EveSpaceObjectDecal_Blue.cpp\nimport { box3 } from \"#math/box3\";\nimport { mat4 } from \"#math/mat4\";\nimport { quat } from \"#math/quat\";\nimport { vec3 } from \"#math/vec3\";\nimport { vec4 } from \"#math/vec4\";\nimport { CjsModel } from \"#model\";\nimport { carbon, impl, io, type } from \"#schema\";\nimport { IEveSpaceObject2ParentData } from \"../../spaceObject/IEveSpaceObject2ParentData.js\";\nimport { TriBatchType } from \"#consts/graphics\";\nimport { withITr2Renderable } from \"../../../core/ITr2Renderable.js\";\nimport { BuildDecalGeometry, BuildStaticDecalGeometry } from \"./decalIndices.js\";\n\n\n/**\n * A decal projected onto a parent hull, owning its oriented projection matrix,\n * optional bone attachment, per-LOD triangle index lists and screen-size\n * visibility ramp.\n */\n@type.define({ className: \"EveSpaceObjectDecal\", family: \"eve/attachment/decal\" })\nexport class EveSpaceObjectDecal extends withITr2Renderable(CjsModel)\n{\n /**\n * Establishes Carbon's opaque decal batch type after schema initialization,\n * because the schema's legacy TriBatchType default is 0.\n */\n constructor()\n {\n super();\n // The schema's legacy TriBatchType default is 0. Carbon's decal default is\n // the opaque batch (1), so establish it after model/schema initialization.\n this.batchType = 1;\n }\n\n @io.persist\n @type.string\n name = \"\";\n\n @io.read\n @type.int32\n @type.enum(\"TriBatchType\")\n batchType = 1;\n\n @io.notify\n @io.persist\n @type.vec3\n position = vec3.create();\n\n @io.persist\n @type.float32\n minScreenSize = 0;\n\n @io.notify\n @io.persist\n @type.quat\n rotation = quat.create();\n\n @io.notify\n @io.persist\n @type.vec3\n scaling = vec3.fromValues(1, 1, 1);\n\n @io.persist\n @type.int32\n parentBoneIndex = -1;\n\n @io.rebuild(\"packedGeometry\")\n @io.persist\n @type.objectRef(\"Tr2Effect\")\n decalEffect = null;\n\n @io.readwrite\n @type.boolean\n display = true;\n\n // SOF-authored per-LOD triangle indices; persisted so the values\n // interchange reproduces Carbon's hidden decal geometry selection.\n @io.rebuild(\"packedGeometry\")\n @io.persist\n @type.array(\"unknown\")\n staticIndexBuffers = [];\n\n #decalMatrix = mat4.create();\n\n #inverseDecalMatrix = mat4.create();\n\n #priority = 0;\n\n /** m_baseGeometryResource (TriGeometryResPtr) - the hull's, not the decal's. */\n #baseGeometryResource = null;\n\n /** m_geometryLodIndex (int) */\n #geometryLodIndex = 0;\n\n /** m_decalGeometry (std::shared_ptr<MeshDecalData>) */\n #decalGeometry = null;\n\n /** m_isGeometryFrozen (bool) - pins the decal to LOD 0. */\n #isGeometryFrozen = false;\n\n /** m_parentData (EveSpaceObjectDecal.h:178) - copied by value from the\n * owning space object each frame; zeroed with an identity transform by\n * Carbon's constructor (cpp:56-57). Runtime state, never persisted. */\n #parentData = new IEveSpaceObject2ParentData();\n\n /** m_parentBoneMatrix (h:190) - the animated parent bone this decal rides,\n * identity until SetBoneMatrix supplies one. */\n #parentBoneMatrix = mat4.create();\n\n /** m_isVisible (h:204) - a float, not a bool: the non-LOD paths set exactly\n * 0 or 1 while the LOD path writes a 0..1 fade ramp (cpp:119-176). */\n #isVisible = 0;\n\n /** m_minBounds / m_maxBounds (h:215) - the geometry mesh bounds an instanced\n * decal measures instead of the unit cube. Stamped by the loader. */\n #minBounds = vec3.create();\n\n #maxBounds = vec3.create();\n\n /** m_instanceData (h:212) - non-null selects the instanced visibility path.\n * The instance buffer itself is engine-owned; the graph only needs to know\n * whether one is attached. */\n #instanceData = null;\n\n /** Carbon m_invParentBoneMatrix (h:191) is declared but never assigned; the\n * value the shader sees is recomputed per fill (cpp:366), so this port keeps\n * no member for it. */\n #inverseParentBoneMatrix = mat4.create();\n\n #shLightingScratch = new Float32Array(IEveSpaceObject2ParentData.SH_COEFFICIENT_COUNT * 4);\n\n /**\n * Property form of HasStaticIndexBuffers: whether any LOD carries decal\n * triangle indices.\n */\n get hasStaticIndexBuffers()\n {\n return this.HasStaticIndexBuffers();\n }\n\n /**\n * Builds the decal matrix and its inverse from the authored position, rotation\n * and scaling; returns false when the composed matrix is not invertible.\n */\n @carbon.method\n @impl.adapted\n Initialize()\n {\n return this.#updateDecalMatrix();\n }\n\n /**\n * Rebuilds the decal matrix and its inverse after an authored placement\n * change.\n */\n @carbon.method\n @impl.adapted\n OnModified(_options = {})\n {\n this.#updateDecalMatrix();\n return true;\n }\n\n /**\n * Copies another decal's authored description - name, display, placement, bone\n * index, minimum screen size, effect and batch type - and rebuilds the decal\n * matrix; the per-LOD index buffers are not copied. Returns false when source\n * is missing.\n */\n @carbon.method\n @impl.adapted\n CopyFrom(source)\n {\n if (!source) return false;\n this.name = String(source.name ?? \"\");\n this.display = !!source.display;\n vec3.copy(this.position, source.position || EveSpaceObjectDecal.#zero);\n quat.copy(this.rotation, source.rotation || EveSpaceObjectDecal.#identityRotation);\n vec3.copy(this.scaling, source.scaling || EveSpaceObjectDecal.#one);\n this.parentBoneIndex = Number(source.parentBoneIndex) | 0;\n this.minScreenSize = Number(source.minScreenSize) || 0;\n this.decalEffect = source.decalEffect ?? null;\n this.batchType = Number(source.batchType) | 0;\n return this.#updateDecalMatrix();\n }\n\n /**\n * Copies the authored decal position into the caller-owned out vector and\n * returns it.\n */\n @carbon.method\n @impl.adapted\n GetPosition(out = vec3.create())\n {\n return vec3.copy(out, this.position);\n }\n\n /**\n * Sets the authored decal position and rebuilds the decal matrix; a missing\n * value is taken as the origin.\n */\n @carbon.method\n @impl.adapted\n SetPosition(value)\n {\n vec3.copy(this.position, value || EveSpaceObjectDecal.#zero);\n return this.#updateDecalMatrix();\n }\n\n /**\n * Copies the authored decal rotation into the caller-owned out quaternion and\n * returns it.\n */\n @carbon.method\n @impl.adapted\n GetRotation(out = quat.create())\n {\n return quat.copy(out, this.rotation);\n }\n\n /**\n * Sets the authored decal rotation and rebuilds the decal matrix; a missing\n * value is taken as the identity rotation.\n */\n @carbon.method\n @impl.adapted\n SetRotation(value)\n {\n quat.copy(this.rotation, value || EveSpaceObjectDecal.#identityRotation);\n return this.#updateDecalMatrix();\n }\n\n /**\n * Copies the authored decal scaling into the caller-owned out vector and\n * returns it.\n */\n @carbon.method\n @impl.adapted\n GetScaling(out = vec3.create())\n {\n return vec3.copy(out, this.scaling);\n }\n\n /**\n * Copies the decal's projection matrix into out; the value is only current as\n * of the last Initialize, OnModified or placement setter.\n */\n @carbon.method\n @impl.adapted\n GetDecalMatrix(out = mat4.create())\n {\n return mat4.copy(out, this.#decalMatrix);\n }\n\n /**\n * Copies the inverse of the decal's projection matrix into out, which is what\n * maps hull-space positions into the decal's unit cube.\n */\n @carbon.method\n @impl.adapted\n GetInverseDecalMatrix(out = mat4.create())\n {\n return mat4.copy(out, this.#inverseDecalMatrix);\n }\n\n /**\n * Sets the authored decal scaling and rebuilds the decal matrix; a missing\n * value is taken as unit scale.\n */\n @carbon.method\n @impl.adapted\n SetScaling(value)\n {\n vec3.copy(this.scaling, value || EveSpaceObjectDecal.#one);\n return this.#updateDecalMatrix();\n }\n\n /**\n * The parent mesh bone the decal rides, or -1 when it rides the hull transform\n * directly.\n */\n @carbon.method\n @impl.adapted\n GetBoneIndex()\n {\n return this.parentBoneIndex;\n }\n\n /**\n * Sets the parent mesh bone the decal rides; the bone matrix itself is only\n * picked up on the next SetBoneMatrix.\n */\n @carbon.method\n @impl.adapted\n SetBoneIndex(index)\n {\n this.parentBoneIndex = Number(index) | 0;\n return true;\n }\n\n /**\n * Replaces the SOF-authored triangle index lists, one array per LOD, coercing\n * each entry to an unsigned integer.\n */\n @carbon.method\n @impl.adapted\n SetIndices(indices)\n {\n this.staticIndexBuffers = Array.from(indices || [], lod => Array.from(lod || [], value => Number(value) >>> 0));\n return true;\n }\n\n /**\n * The per-LOD triangle index lists as fresh copies, so a caller cannot mutate\n * the stored buffers.\n */\n @carbon.method\n @impl.adapted\n GetStaticIndexBuffers()\n {\n return this.staticIndexBuffers.map(lod => lod.slice());\n }\n\n /**\n * Whether any LOD carries triangle indices; a decal without them has no\n * geometry to draw.\n */\n @carbon.method\n @impl.adapted\n HasStaticIndexBuffers()\n {\n return this.staticIndexBuffers.some(lod => lod.length > 0);\n }\n\n /** The triangle count per LOD, being each index list's length divided by three. */\n @carbon.method\n @impl.adapted\n GetDecalPrimitiveCounts()\n {\n return this.staticIndexBuffers.map(lod => Math.trunc(lod.length / 3));\n }\n\n /**\n * Sets the LOD threshold in screen pixels below which UpdateVisibility culls\n * the decal; zero disables the test and makes the decal always visible.\n */\n @carbon.method\n @impl.adapted\n SetMinScreenSize(value)\n {\n this.minScreenSize = Number(value) || 0;\n return true;\n }\n\n /** Sets the effect that draws the decal; a decal without one is never visible. */\n @carbon.method\n @impl.adapted\n SetEffect(effect)\n {\n this.decalEffect = effect ?? null;\n return true;\n }\n\n /**\n * Sets a shader option on the decal effect; returns false when no effect that\n * accepts options is attached.\n */\n @carbon.method\n @impl.adapted\n SetShaderOption(name, value)\n {\n if (!this.decalEffect?.SetOption) return false;\n this.decalEffect.SetOption(name, value);\n return true;\n }\n\n /**\n * Sets the TriBatchType the decal submits under, overriding the opaque default\n * the constructor establishes.\n */\n @carbon.method\n @impl.adapted\n SetBatchType(value)\n {\n this.batchType = Number(value) | 0;\n return true;\n }\n\n /**\n * Sets the draw priority the engine sorts decals on; the value is runtime-only\n * and never persisted.\n */\n @carbon.method\n @impl.adapted\n SetPriority(value)\n {\n this.#priority = Number(value) >>> 0;\n return true;\n }\n\n /** Carbon EveSpaceObjectDecal::SetBoneMatrix (cpp:475-491): expands the\n * parent's Float4x3 mesh bone at m_parentBoneIndex into the 4x4 bone matrix.\n * A -1 index or an out-of-range index leaves the identity in place. */\n @carbon.method\n @impl.implemented\n SetBoneMatrix(boneMatrices, boneMatrixCount)\n {\n if (this.parentBoneIndex === -1 || this.parentBoneIndex >= boneMatrixCount)\n {\n return false;\n }\n\n const bone = boneMatrices?.[this.parentBoneIndex];\n if (!bone) return false;\n\n // Float4x3 is COLUMN-stride on the shared byte layout: each packed row is\n // (v0, v4, v8, v12) of the logical matrix (math skill gotcha 7), so the\n // expansion writes the transpose of the three packed rows back into the\n // 4x4 basis and leaves the last column as identity.\n const out = this.#parentBoneMatrix;\n for (let row = 0; row < 3; row++)\n {\n out[row] = bone[row * 4 + 0];\n out[4 + row] = bone[row * 4 + 1];\n out[8 + row] = bone[row * 4 + 2];\n out[12 + row] = bone[row * 4 + 3];\n }\n out[3] = 0;\n out[7] = 0;\n out[11] = 0;\n out[15] = 1;\n\n return true;\n }\n\n /** Carbon copies the parent data by value at the two points UpdateVisibility\n * accepts the decal (cpp:145, cpp:178): `m_parentData = *parentData`. Member\n * by member is that struct copy - no export, no allocation, on a per-decal\n * per-frame path. shLighting is a borrowed pointer into the parent's own PS\n * data, so it is carried by reference exactly as Carbon carries the pointer. */\n #CopyParentData(parentData)\n {\n const own = this.#parentData;\n mat4.copy(own.transform, parentData.transform);\n own.killCount = parentData.killCount;\n vec4.copy(own.shipData, parentData.shipData);\n vec3.copy(own.clipSphereCenter, parentData.clipSphereCenter);\n own.clipRadiusSq = parentData.clipRadiusSq;\n own.clipRadius2Sq = parentData.clipRadius2Sq;\n own.clipFactor = parentData.clipFactor;\n own.clipFactor2 = parentData.clipFactor2;\n own.shLighting = parentData.shLighting;\n vec4.copy(own.customData, parentData.customData);\n }\n\n /**\n * Carbon EveSpaceObjectDecal::UpdateVisibility (cpp:117-179).\n *\n * `m_isVisible` is a FLOAT: zero when culled, one when no minimum screen\n * size is authored, otherwise a 0..1 fade ramp that reaches the shader as\n * displayData.y. The ramp has no lower clamp because the below-minimum case\n * already returned.\n *\n * On every cull path Carbon leaves m_parentData STALE - only the visibility\n * is cleared - so the copy happens solely on the accept paths.\n */\n @carbon.method\n @impl.implemented\n UpdateVisibility(updateContext, parentData)\n {\n this.#isVisible = 0;\n\n if (!this.display || !this.decalEffect || !parentData) return false;\n\n if (!(this.minScreenSize > 0))\n {\n this.#isVisible = 1;\n this.#CopyParentData(parentData);\n return true;\n }\n\n const frustum = updateContext?.GetFrustum?.() ?? updateContext?.frustum ?? null;\n if (!frustum) return false;\n\n // Carbon (row-vector): m_parentBoneMatrix * parentData->transform - the\n // bone applies first, so the gl operands swap.\n const worldDecalMatrix = mat4.multiply(\n EveSpaceObjectDecal.#worldDecalScratch,\n parentData.transform,\n this.#parentBoneMatrix\n );\n const bounds = box3.set(EveSpaceObjectDecal.#boundsScratch, -1, -1, -1, 1, 1, 1);\n\n if (this.#instanceData)\n {\n // Instanced decals measure the geometry mesh bounds instead of the unit\n // cube (cpp:135-155). Carbon transforms only the two CORNERS here (not\n // the eight, as it does below), so this is vec3, not box3.transformMat4.\n // Carbon transforms only the two CORNERS here (not the eight, as it does\n // below). A mirroring transform swaps them, which Carbon leaves inverted\n // and box3 would read as EMPTY, so the pair is accumulated as points -\n // ordering it. The eight-corner transform below is indifferent to order,\n // so this only affects the mirrored-decal early-outs (parity note\n // divergence 7).\n const corner = EveSpaceObjectDecal.#pointScratch;\n box3.empty(bounds);\n vec3.transformMat4(corner, this.#minBounds, worldDecalMatrix);\n box3.addPoint(bounds, bounds, corner);\n vec3.transformMat4(corner, this.#maxBounds, worldDecalMatrix);\n box3.addPoint(bounds, bounds, corner);\n\n if (box3.containsPoint(bounds, frustum.viewPos))\n {\n this.#isVisible = 1;\n this.#CopyParentData(parentData);\n return true;\n }\n\n if (!frustum.IsBoxVisible?.(bounds))\n {\n return false;\n }\n\n // Measure from the closest point of the box rather than its centre, so a\n // long box does not lod out while one end is near the camera.\n const offset = box3.getClampedPoint(\n EveSpaceObjectDecal.#pointScratch,\n bounds,\n frustum.viewPos\n );\n vec3.subtract(offset, offset, frustum.viewPos);\n mat4.multiply(\n worldDecalMatrix,\n mat4.fromTranslation(EveSpaceObjectDecal.#offsetScratch, offset),\n worldDecalMatrix\n );\n }\n\n // Carbon: m_decalMatrix * worldDecalMatrix - the decal applies first.\n mat4.multiply(worldDecalMatrix, worldDecalMatrix, this.#decalMatrix);\n box3.transformMat4(bounds, bounds, worldDecalMatrix);\n\n // Carbon's sphere is the box's circumscribing sphere: the centre of the\n // transformed box and HALF ITS FULL DIAGONAL (cpp:159-160).\n const center = EveSpaceObjectDecal.#pointScratch;\n const radius = box3.toPositionRadius(bounds, center);\n const pixelSize = frustum.GetPixelSizeAccrossEst(center, radius);\n const modifiedMinScreen = this.minScreenSize * (updateContext?.GetLodFactor() ?? 1);\n\n if (pixelSize < modifiedMinScreen) return false;\n\n this.#isVisible = Math.min((pixelSize - modifiedMinScreen) / (modifiedMinScreen * 0.5), 1);\n this.#CopyParentData(parentData);\n return true;\n }\n\n /** The visibility fade Carbon writes to displayData.y; 0 when lodded out. */\n @carbon.method\n @impl.adapted\n @impl.reason(\"Carbon reads the m_isVisible member directly; JavaScript exposes the private runtime value through an accessor.\")\n GetVisibility()\n {\n return this.#isVisible;\n }\n\n /** Carbon EveSpaceObjectDecal::HasTransparentBatches (cpp:241-244). */\n @carbon.method\n @impl.implemented\n HasTransparentBatches()\n {\n return true;\n }\n\n /** Carbon EveSpaceObjectDecal::GetSortValue (cpp:337-340). */\n @carbon.method\n @impl.implemented\n GetSortValue()\n {\n return 1;\n }\n\n /** Carbon ITr2Pickable::GetID is inline on the decal (h:113-116) and returns\n * the object itself; the area id selects nothing on this class. */\n @carbon.method\n @impl.implemented\n GetID(_areaId)\n {\n return this;\n }\n\n /**\n * Carbon EveSpaceObjectDecal::GetPerObjectData (cpp:346-386): the\n * EveDecalPerObjectData composite - a DecalVSPerObjectData +\n * DecalPSPerObjectData pair uploaded as TWO constant buffers (cpp:975-976).\n * Here that is two Allocs returned as a { vs, ps } record.\n *\n * SetAndTranspose performs Carbon's Transpose. Carbon computes the two\n * inverses FROM the already-transposed matrices; because Inverse(M-transpose)\n * equals Inverse(M)-transpose (carbon-math-conventions F2), inverting the\n * logical matrix and letting the encoder transpose produces byte-identical\n * output with one transpose less work.\n */\n @carbon.method\n @impl.implemented\n GetPerObjectData(accumulator)\n {\n const vs = accumulator.Alloc(\"DecalVSPerObjectData\");\n const ps = accumulator.Alloc(\"DecalPSPerObjectData\");\n const parentData = this.#parentData;\n\n vs.SetAndTranspose(\"worldMatrix\", parentData.transform);\n // cpp:358 inverts the transposed world matrix in place; by F2 that is the\n // transpose of the logical inverse, so this is the same bytes.\n mat4.invert(this.#inverseParentBoneMatrix, parentData.transform);\n vs.SetAndTranspose(\"invWorldMatrix\", this.#inverseParentBoneMatrix);\n\n vs.SetAndTranspose(\"decalMatrix\", this.#decalMatrix);\n vs.SetAndTranspose(\"inverseDecalMatrix\", this.#inverseDecalMatrix);\n vs.SetAndTranspose(\"parentBoneMatrix\", this.#parentBoneMatrix);\n\n // cpp:366 - Inverse(Transpose(m_parentBoneMatrix)), recomputed per fill;\n // Carbon never reads its own m_invParentBoneMatrix member. Same F2\n // identity as above.\n mat4.invert(this.#inverseParentBoneMatrix, this.#parentBoneMatrix);\n vs.SetAndTranspose(\"invParentBoneMatrix\", this.#inverseParentBoneMatrix);\n\n // cpp:374 - killCount is a uint widened to float; isVisible is the 0..1\n // visibility ramp; z and w are reserved literals.\n ps.Set(\"displayData\", [parentData.killCount, this.#isVisible, 0, 0]);\n ps.Set(\"shipData\", parentData.shipData);\n ps.Set(\"clipData\", [\n parentData.clipSphereCenter[0],\n parentData.clipSphereCenter[1],\n parentData.clipSphereCenter[2],\n parentData.clipRadiusSq\n ]);\n ps.Set(\"clipRadius2Sq\", [parentData.clipRadius2Sq]);\n\n // cpp:376-383 - copy the parent's seven packed coefficients, or zero the\n // whole block when the parent supplied none. m_unused stays unwritten.\n const coefficients = this.#shLightingScratch;\n coefficients.fill(0);\n const shLighting = parentData.shLighting;\n if (shLighting)\n {\n for (let index = 0; index < coefficients.length && index < shLighting.length; index++)\n {\n coefficients[index] = shLighting[index];\n }\n }\n ps.Set(\"shLightingCoefficients\", coefficients);\n\n return { vs, ps };\n }\n\n /**\n * Adds this decal to the renderable list once its geometry is ready.\n *\n * Carbon EveSpaceObjectDecal::GetRenderables (cpp:182-225). EveSpaceObject2\n * already calls this per decal with the hull's geometry resource and mesh\n * screen size (cpp:1578-1591); ours does the same.\n *\n * The decal is a RENDERABLE, not a batch source the parent drains: it puts\n * itself in the list and the renderer asks it for batches later, which is why\n * everything expensive happens here and GetBatches only submits.\n *\n * @param {Array} out Renderable list.\n * @param {object} _meshCache Carbon's DecalMeshCache, only used by the\n * selection path to avoid re-mapping hull buffers; unused here because a\n * decoded payload is already CPU-side.\n * @param {object} geometryResource The hull's geometry.\n * @param {number} screenSize The parent's mesh screen size, for LOD choice.\n * @returns {boolean} Whether the decal was added.\n */\n @carbon.method\n @impl.adapted\n @impl.reason(\"Trinity selects the LOD and builds the index list; the engine owns the device index buffer, so validity is judged on the built list rather than on a GPU allocation.\")\n GetRenderables(out = [], _meshCache = null, geometryResource = null, screenSize = Infinity)\n {\n if (this.#isVisible <= 0 || !geometryResource) return false;\n\n // A NEW MESH INVALIDATES THE BUILD. Carbon's comment calls this out as slow\n // and to be avoided, which is why it is keyed on identity rather than\n // rebuilt every frame.\n if (geometryResource !== this.#baseGeometryResource)\n {\n this.#decalGeometry = null;\n this.#baseGeometryResource = geometryResource;\n }\n\n const mesh = geometryResource.GetMeshData(0);\n\n if (!this.#decalGeometry || (mesh && mesh.lodMask !== this.#decalGeometry.lodMask))\n {\n this.#decalGeometry = this.#BuildGeometry(mesh);\n }\n\n if (!this.#decalGeometry) return false;\n\n this.#geometryLodIndex = this.#isGeometryFrozen\n ? 0\n : geometryResource.GetLodIndexForScreenSize(0, screenSize);\n\n const lod = this.#decalGeometry.lods?.[this.#geometryLodIndex];\n\n // A LOD the decal does not reach carries zero primitives, which is how\n // Carbon says \"not covered here\" - hence testing the count, not the buffer.\n if (!lod || !lod.primitiveCount) return false;\n\n out.push(this);\n\n return true;\n }\n\n /**\n * Builds the decal's index list for the hull it is attached to.\n *\n * The static lists win when present, exactly as Carbon orders it: every decal\n * on a shipped hull arrives with them, and triangle selection sits behind the\n * g_buildDecalBuffers global for decals placed at runtime (cpp:196-207).\n *\n * @param {object} mesh Decoded mesh data.\n * @returns {object|null} Built geometry, or null when there is nothing to draw.\n */\n #BuildGeometry(mesh)\n {\n if (!mesh) return null;\n\n const built = this.HasStaticIndexBuffers()\n ? BuildStaticDecalGeometry(mesh, this.staticIndexBuffers)\n : BuildDecalGeometry(mesh, this.#decalMatrix, this.#inverseDecalMatrix);\n\n if (!built.indices.length) return null;\n\n return {\n inverseDecalMatrix: mat4.clone(this.#inverseDecalMatrix),\n lodMask: mesh.lodMask ?? 0,\n lods: built.lods,\n indices: built.indices\n };\n }\n\n /** Carbon EveSpaceObjectDecal::SetHighDetailDecalState (cpp:514-517). */\n @carbon.method\n @impl.implemented\n SetHighDetailDecalState(isFrozen)\n {\n this.#isGeometryFrozen = !!isFrozen;\n return true;\n }\n\n /** Carbon EveSpaceObjectDecal::GetBatches (cpp:250-331) submits the packed\n * decal index buffers against the device geometry resource. */\n @carbon.method\n @impl.notImplemented\n GetBatches(_batches, _batchType, _perObjectData, _reason)\n {\n throw new Error(\"EveSpaceObjectDecal.GetBatches is not implemented in CarbonEngineJS.\");\n }\n\n /** Carbon EveSpaceObjectDecal::GetPickingBatches (cpp:919-926) forwards to\n * GetBatches once the attachment pick-type mask passes. */\n @carbon.method\n @impl.notImplemented\n GetPickingBatches(_batches, _pickTypes, _perObjectData)\n {\n throw new Error(\"EveSpaceObjectDecal.GetPickingBatches is not implemented in CarbonEngineJS.\");\n }\n\n /**\n * Recomposes the decal matrix from the authored rotation, position and scaling\n * and inverts it; returns whether the inverse existed.\n */\n #updateDecalMatrix()\n {\n mat4.fromRotationTranslationScale(this.#decalMatrix, this.rotation, this.position, this.scaling);\n return !!mat4.invert(this.#inverseDecalMatrix, this.#decalMatrix);\n }\n\n /** Per-frame scratch - UpdateVisibility must not allocate. */\n static #boundsScratch = box3.create();\n\n static #worldDecalScratch = mat4.create();\n\n static #offsetScratch = mat4.create();\n\n static #pointScratch = vec3.create();\n\n static #zero = vec3.create();\n\n static #one = vec3.fromValues(1, 1, 1);\n\n static #identityRotation = quat.create();\n\n static TriBatchType = TriBatchType;\n\n}\n"],"names":["_EveSpaceObjectDecal","_identity","EveSpaceObjectDecal","_withITr2Renderable","withITr2Renderable","CjsModel","e","_init_name","_init_extra_name","_init_batchType","_init_extra_batchType","_init_position","_init_extra_position","_init_minScreenSize","_init_extra_minScreenSize","_init_rotation","_init_extra_rotation","_init_scaling","_init_extra_scaling","_init_parentBoneIndex","_init_extra_parentBoneIndex","_init_decalEffect","_init_extra_decalEffect","_init_display","_init_extra_display","_init_staticIndexBuffers","_init_extra_staticIndexBuffers","_initProto","c","_initClass","_applyDecs","type","define","className","family","io","persist","string","read","int32","enum","notify","vec3","float32","quat","rebuild","objectRef","readwrite","boolean","array","carbon","method","impl","adapted","implemented","reason","notImplemented","constructor","batchType","name","position","create","minScreenSize","rotation","scaling","fromValues","parentBoneIndex","decalEffect","display","staticIndexBuffers","mat4","IEveSpaceObject2ParentData","Float32Array","SH_COEFFICIENT_COUNT","hasStaticIndexBuffers","HasStaticIndexBuffers","Initialize","OnModified","_options","CopyFrom","source","String","copy","Number","GetPosition","out","SetPosition","value","GetRotation","SetRotation","GetScaling","GetDecalMatrix","GetInverseDecalMatrix","SetScaling","GetBoneIndex","SetBoneIndex","index","SetIndices","indices","Array","from","lod","GetStaticIndexBuffers","map","slice","some","length","GetDecalPrimitiveCounts","Math","trunc","SetMinScreenSize","SetEffect","effect","SetShaderOption","SetOption","SetBatchType","SetPriority","SetBoneMatrix","boneMatrices","boneMatrixCount","bone","row","#CopyParentData","parentData","own","transform","killCount","vec4","shipData","clipSphereCenter","clipRadiusSq","clipRadius2Sq","clipFactor","clipFactor2","shLighting","customData","UpdateVisibility","updateContext","frustum","GetFrustum","worldDecalMatrix","multiply","bounds","box3","set","corner","empty","transformMat4","addPoint","containsPoint","viewPos","IsBoxVisible","offset","getClampedPoint","subtract","fromTranslation","center","radius","toPositionRadius","pixelSize","GetPixelSizeAccrossEst","modifiedMinScreen","GetLodFactor","min","GetVisibility","HasTransparentBatches","GetSortValue","GetID","_areaId","GetPerObjectData","accumulator","vs","Alloc","ps","SetAndTranspose","invert","Set","coefficients","fill","GetRenderables","_meshCache","geometryResource","screenSize","Infinity","mesh","GetMeshData","lodMask","GetLodIndexForScreenSize","lods","primitiveCount","push","#BuildGeometry","built","BuildStaticDecalGeometry","BuildDecalGeometry","inverseDecalMatrix","clone","SetHighDetailDecalState","isFrozen","GetBatches","_batches","_batchType","_perObjectData","_reason","Error","GetPickingBatches","_pickTypes","#updateDecalMatrix","fromRotationTranslationScale","TriBatchType"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { ShouldReflect, EveComponentType } from '../EveComponentTypes.js';
|
|
|
13
13
|
import { Tr2RenderReason } from '../../generated/trinityCore/enums.js';
|
|
14
14
|
import { Tr2Lod } from '#consts/trinity';
|
|
15
15
|
import '../../core/rawData/perObjectData/Tr2PerObjectData.js';
|
|
16
|
+
import { IEveSpaceObject2ParentData } from '../spaceObject/IEveSpaceObject2ParentData.js';
|
|
16
17
|
import { TR2_PICK_TYPE_DEFAULT, Tr2PickType } from '../../core/view/Tr2PickType.js';
|
|
17
18
|
import { createChildPerObjectRecords, inheritParentPerObjectData, stampChildTransforms } from '../perObjectData/childPerObjectRecords.js';
|
|
18
19
|
import { Float4x3 as _Float4x } from '../../utilities/Float4x3.js';
|
|
@@ -100,6 +101,10 @@ new class extends _identity {
|
|
|
100
101
|
/** Identity rest-pose palette for skinned shaders without live animation. */
|
|
101
102
|
#restPoseBoneTransforms = null;
|
|
102
103
|
#parentOverlayEffects = null;
|
|
104
|
+
|
|
105
|
+
/** m_parentData (IEveSpaceObject2::ParentData) - refreshed from the space
|
|
106
|
+
* object parent in UpdateSyncronous and handed to the decals (cpp:1015, 450). */
|
|
107
|
+
#parentData = new IEveSpaceObject2ParentData();
|
|
103
108
|
#overlayAreaBlocks = [[], []];
|
|
104
109
|
#overlayAreaBlocksBuilt = false;
|
|
105
110
|
|
|
@@ -516,6 +521,9 @@ new class extends _identity {
|
|
|
516
521
|
// data by this child's translation, then stamp our own transforms.
|
|
517
522
|
const parent = params?.spaceObjectParent ?? null;
|
|
518
523
|
inheritParentPerObjectData(this.#perObjectData, parent, this.translation);
|
|
524
|
+
// Carbon cpp:1015: the decals' parent data comes from the space object
|
|
525
|
+
// parent, then is made relevant to this child below.
|
|
526
|
+
if (parent) parent.GetParentData(this.#parentData);
|
|
519
527
|
this.#parentOverlayEffects = this.inheritOverlayEffects && Array.isArray(parent?.overlayEffects) ? parent.overlayEffects : null;
|
|
520
528
|
if (parent && !this.inheritOverlayEffects) {
|
|
521
529
|
this.#perObjectData.vs.Set("clipData", [0, 0, 0, 0]);
|
|
@@ -523,7 +531,14 @@ new class extends _identity {
|
|
|
523
531
|
this.#perObjectData.ps.Set("clipRadius2Sq", [0]);
|
|
524
532
|
this.#perObjectData.ps.Set("clipSphereFactor", [0]);
|
|
525
533
|
this.#perObjectData.ps.Set("clipSphereFactor2", [0]);
|
|
534
|
+
// cpp:1033-1036: the decals lose the inherited clip sphere too.
|
|
535
|
+
this.#parentData.clipRadiusSq = 0;
|
|
536
|
+
this.#parentData.clipRadius2Sq = 0;
|
|
537
|
+
this.#parentData.clipFactor = 0;
|
|
538
|
+
this.#parentData.clipFactor2 = 0;
|
|
526
539
|
}
|
|
540
|
+
// cpp:1044: the decals are placed by this child's world transform.
|
|
541
|
+
if (parent) mat4.copy(this.#parentData.transform, this.worldTransform);
|
|
527
542
|
stampChildTransforms(this.#perObjectData, this.worldTransform, this.#lastWorldTransform);
|
|
528
543
|
this.#activationStrength = Number(params?.activationStrength ?? 1);
|
|
529
544
|
if (this.damageOverlay) {
|
|
@@ -721,9 +736,8 @@ new class extends _identity {
|
|
|
721
736
|
for (const decal of this.decals) {
|
|
722
737
|
// Carbon (cpp:441-446) feeds animated bone matrices to the decal first
|
|
723
738
|
// - skipped until the JS animation seam exists. Carbon passes
|
|
724
|
-
// &m_parentData (
|
|
725
|
-
|
|
726
|
-
decal?.UpdateVisibility(updateContext, this);
|
|
739
|
+
// &m_parentData (cpp:450), refreshed in UpdateSyncronous.
|
|
740
|
+
decal?.UpdateVisibility(updateContext, this.#parentData);
|
|
727
741
|
}
|
|
728
742
|
}
|
|
729
743
|
return this.#isVisible;
|