@flighthq/mesh 0.3.0 → 0.3.1-next.1041.35b950c

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 (48) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/meshGeometry.d.ts +1 -0
  6. package/dist/meshGeometry.d.ts.map +1 -1
  7. package/dist/meshGeometry.js +17 -8
  8. package/dist/meshGeometry.js.map +1 -1
  9. package/dist/meshGeometryAttributes.d.ts.map +1 -1
  10. package/dist/meshGeometryAttributes.js +47 -87
  11. package/dist/meshGeometryAttributes.js.map +1 -1
  12. package/dist/meshGeometryBuilders.d.ts.map +1 -1
  13. package/dist/meshGeometryBuilders.js +152 -134
  14. package/dist/meshGeometryBuilders.js.map +1 -1
  15. package/dist/meshGeometryCompute.d.ts +3 -2
  16. package/dist/meshGeometryCompute.d.ts.map +1 -1
  17. package/dist/meshGeometryCompute.js +283 -294
  18. package/dist/meshGeometryCompute.js.map +1 -1
  19. package/dist/meshGeometryIndex.js +4 -4
  20. package/dist/meshGeometryIndex.js.map +1 -1
  21. package/dist/meshGeometryLayout.d.ts.map +1 -1
  22. package/dist/meshGeometryLayout.js +2 -67
  23. package/dist/meshGeometryLayout.js.map +1 -1
  24. package/dist/meshGeometryOperations.d.ts.map +1 -1
  25. package/dist/meshGeometryOperations.js +93 -7
  26. package/dist/meshGeometryOperations.js.map +1 -1
  27. package/dist/meshGeometryTransforms.d.ts.map +1 -1
  28. package/dist/meshGeometryTransforms.js +90 -19
  29. package/dist/meshGeometryTransforms.js.map +1 -1
  30. package/dist/meshGeometryUvs.d.ts +0 -1
  31. package/dist/meshGeometryUvs.d.ts.map +1 -1
  32. package/dist/meshGeometryUvs.js +10 -18
  33. package/dist/meshGeometryUvs.js.map +1 -1
  34. package/dist/vertexFormat.d.ts +6 -0
  35. package/dist/vertexFormat.d.ts.map +1 -0
  36. package/dist/vertexFormat.js +61 -0
  37. package/dist/vertexFormat.js.map +1 -0
  38. package/package.json +4 -4
  39. package/src/meshGeometry.test.ts +23 -22
  40. package/src/meshGeometryAttributes.test.ts +37 -0
  41. package/src/meshGeometryBuilders.test.ts +333 -10
  42. package/src/meshGeometryCompute.test.ts +246 -95
  43. package/src/meshGeometryDeformationClone.test.ts +2 -0
  44. package/src/meshGeometryLayout.test.ts +1 -12
  45. package/src/meshGeometryOperations.test.ts +98 -0
  46. package/src/meshGeometryTransforms.test.ts +103 -1
  47. package/src/meshGeometryUvs.test.ts +1 -40
  48. package/src/vertexFormat.test.ts +38 -0
@@ -1,9 +1,12 @@
1
1
  import { createAabb } from '@flighthq/geometry/contract';
2
2
  import { getVertexAttributeFloatOffset } from './meshGeometryAttributes';
3
3
  import { computeMeshGeometryBounds } from './meshGeometryCompute';
4
- // Geometry transform operations: apply a Matrix4 to positions and the inverse-transpose to
5
- // normals and tangent.xyz (tangent.w handedness sign is preserved). All in-place operations
6
- // bump geometry.version. Out-parameter variants are alias-safe (out === source is valid).
4
+ // Geometry transform operations: apply a Matrix4 to positions, the inverse-transpose to normals,
5
+ // and the plain upper 3x3 to tangent.xyz — a normal is a covector and a tangent is a true vector,
6
+ // so they follow different matrices and only coincide under rotation and uniform scale. A transform
7
+ // that mirrors (determinant < 0) also reverses triangle winding and negates tangent.w, because a
8
+ // baked transform leaves no determinant for a renderer to detect. All in-place operations bump
9
+ // geometry.version. Out-parameter variants are alias-safe (out === source is valid).
7
10
  // Centers the geometry so that the cached AABB's center moves to the origin. If bounds have
8
11
  // not been computed yet, they are computed first. Bumps geometry.version.
9
12
  export function centerMeshGeometry(geometry) {
@@ -20,25 +23,33 @@ export function centerMeshGeometry(geometry) {
20
23
  return;
21
24
  translateMeshGeometry(geometry, -cx, -cy, -cz);
22
25
  }
23
- // Scales all vertex positions in-place by (sx, sy, sz). Normals and tangents are transformed
24
- // via the inverse-transpose of the pure scale matrix (i.e. (1/sx, 1/sy, 1/sz)) and
25
- // re-normalized. Bumps geometry.version.
26
+ // Scales all vertex positions in-place by (sx, sy, sz). Normals are transformed by the
27
+ // inverse-transpose of the scale (1/sx, 1/sy, 1/sz) and tangents by the scale itself, both
28
+ // re-normalized. A negative-determinant scale mirrors the mesh, so triangle winding is reversed and
29
+ // tangent.w negated to keep front faces front-facing. Bumps geometry.version.
26
30
  export function scaleMeshGeometry(geometry, sx, sy, sz) {
27
31
  transformMeshGeometryPositions(geometry, geometry, sx, sy, sz, 0, 0, 0);
32
+ restoreMirroredWindingAndHandedness(geometry, sx * sy * sz);
28
33
  }
29
34
  // Applies a Matrix4 to the geometry's vertices in place. Positions are transformed as points
30
- // (w=1); normals and tangent.xyz are transformed by the inverse-transpose of the matrix's
31
- // upper-left 3×3 and re-normalized. Returns false when the matrix is singular. Bumps
32
- // geometry.version. Alias-safe (this function does not need an alias form because it is
33
- // always in-place, but positions are read before write in the core loop).
35
+ // (w=1); normals by the INVERSE-TRANSPOSE of the upper-left 3×3 and tangent.xyz by the PLAIN
36
+ // upper-left 3×3, both re-normalized — see transformMeshGeometryInto for why the two differ.
37
+ // Returns false when the matrix is singular. Bumps geometry.version. Alias-safe (this function
38
+ // does not need an alias form because it is always in-place, but positions are read before write
39
+ // in the core loop).
34
40
  export function transformMeshGeometry(geometry, matrix) {
35
41
  return transformMeshGeometryInto(geometry, geometry, matrix);
36
42
  }
37
43
  // Applies a Matrix4 to `source` geometry and writes the result into `out`. Positions are
38
- // transformed as points (w=1), normals and tangent.xyz are transformed by the inverse-transpose
39
- // of the matrix's upper-left 3×3 (ignoring translation) and re-normalized. tangent.w is
40
- // preserved. Returns false and leaves `out` unchanged when the matrix has no inverse (singular),
41
- // because the correct normal transform is undefined. Alias-safe: out === source is valid.
44
+ // transformed as points (w=1). Normals follow the INVERSE-TRANSPOSE of the upper-left 3×3
45
+ // (ignoring translation); tangent.xyz follows the PLAIN upper-left 3×3. Both are re-normalized and
46
+ // tangent.w is preserved. The two matrices differ on purpose: a normal is a covector and a tangent
47
+ // is a true vector lying along the surface, so under non-uniform scale one inverse-transpose for
48
+ // both tilts the tangent out of perpendicular with its own normal. They coincide under rotation
49
+ // and uniform scale, which is why sharing one matrix looked correct for as long as it did — the
50
+ // body carries the same note at the tangent block, and a test pins the distinction.
51
+ // Returns false and leaves `out` unchanged when the matrix has no inverse (singular), because the
52
+ // correct normal transform is undefined. Alias-safe: out === source is valid.
42
53
  export function transformMeshGeometryInto(out, source, matrix) {
43
54
  // Compute inverse-transpose of the 3×3 upper-left for normals/tangents.
44
55
  const invT = computeMatrix3x3InverseTranspose(matrix);
@@ -85,10 +96,15 @@ export function transformMeshGeometryInto(out, source, matrix) {
85
96
  if (tanFloatOffset >= 0) {
86
97
  const tb = vertBase + tanFloatOffset;
87
98
  const tx = srcVerts[tb], ty = srcVerts[tb + 1], tz = srcVerts[tb + 2];
88
- const tw = srcVerts[tb + 3]; // preserve handedness sign
89
- let ttx = invT[0] * tx + invT[3] * ty + invT[6] * tz;
90
- let tty = invT[1] * tx + invT[4] * ty + invT[7] * tz;
91
- let ttz = invT[2] * tx + invT[5] * ty + invT[8] * tz;
99
+ const tw = srcVerts[tb + 3]; // handedness, a sign rather than a direction
100
+ // A tangent lies ALONG the surface, so it is a true vector and follows the plain upper 3x3,
101
+ // the same matrix a position follows. Only the normal is a covector needing the
102
+ // inverse-transpose. The two coincide under rotation and uniform scale, which is why sharing
103
+ // one matrix looked right; under non-uniform scale it tilts the tangent off the surface and
104
+ // out of perpendicular with its own normal. `skinTangents` draws the same distinction.
105
+ let ttx = m[0] * tx + m[4] * ty + m[8] * tz;
106
+ let tty = m[1] * tx + m[5] * ty + m[9] * tz;
107
+ let ttz = m[2] * tx + m[6] * ty + m[10] * tz;
92
108
  const len = Math.sqrt(ttx * ttx + tty * tty + ttz * ttz);
93
109
  if (len > 0) {
94
110
  ttx /= len;
@@ -101,6 +117,7 @@ export function transformMeshGeometryInto(out, source, matrix) {
101
117
  dstVerts[tb + 3] = tw;
102
118
  }
103
119
  }
120
+ restoreMirroredWindingAndHandedness(out, m[0] * (m[5] * m[10] - m[6] * m[9]) - m[4] * (m[1] * m[10] - m[2] * m[9]) + m[8] * (m[1] * m[6] - m[2] * m[5]));
104
121
  out.version++;
105
122
  // Recompute bounds if they were cached, since all positions have changed.
106
123
  if (out.bounds) {
@@ -172,6 +189,58 @@ function computeMatrix3x3InverseTranspose(matrix) {
172
189
  }
173
190
  // Applies a pure-scale transform to positions. Normals/tangents are transformed by the
174
191
  // inverse scale and re-normalized. Internal helper used by scaleMeshGeometry.
192
+ // Restores the counter-clockwise-front / outward-normal invariant after a transform that mirrors the
193
+ // geometry (determinant < 0). A reflection turns every triangle inside out and flips the handedness
194
+ // of every tangent frame, and a BAKED transform leaves no determinant behind for a renderer to notice
195
+ // — the mesh simply uploads inside-out under an identity model matrix. So the correction has to
196
+ // happen here, at the point the mirror is applied.
197
+ //
198
+ // Mirroring is a legitimate request, not an error, so this never rejects a negative determinant.
199
+ //
200
+ // `tangent.w` is handedness (B = w * cross(N, T)), so a reflection negates it. That part is
201
+ // topology-independent and always applied. The winding reversal is not: swapping two corners of a
202
+ // triple is only meaningful for a triangle list. A triangle STRIP shares each vertex between up to
203
+ // three triangles, so per-triple swaps do not describe it, and this repository has no established
204
+ // strip winding reversal to follow — the one in `scene3d-formats` (`reverseTriangleWinding`) steps by
205
+ // three and is list-only. Rather than invent one, strips are left unreversed and the gap is reported.
206
+ // A line or point stream has no winding to reverse at all.
207
+ function restoreMirroredWindingAndHandedness(geometry, determinant) {
208
+ if (determinant >= 0)
209
+ return;
210
+ const tanFloatOffset = getVertexAttributeFloatOffset(geometry.layout, 'tangent');
211
+ const floatsPerVertex = geometry.layout.stride / 4;
212
+ const vertices = geometry.vertices;
213
+ if (tanFloatOffset >= 0 && floatsPerVertex > 0) {
214
+ const vertexCount = Math.floor(vertices.length / floatsPerVertex);
215
+ for (let i = 0; i < vertexCount; i++) {
216
+ const wIndex = i * floatsPerVertex + tanFloatOffset + 3;
217
+ vertices[wIndex] = -vertices[wIndex];
218
+ }
219
+ }
220
+ if (geometry.topology !== 'triangle-list')
221
+ return;
222
+ const indices = geometry.indices;
223
+ if (indices !== null) {
224
+ for (let i = 0; i + 2 < indices.length; i += 3) {
225
+ const swap = indices[i + 1];
226
+ indices[i + 1] = indices[i + 2];
227
+ indices[i + 2] = swap;
228
+ }
229
+ return;
230
+ }
231
+ // Non-indexed: the records themselves carry the order, so the second and third of each triple swap.
232
+ if (floatsPerVertex <= 0)
233
+ return;
234
+ const vertexCount = Math.floor(vertices.length / floatsPerVertex);
235
+ const scratch = new Float32Array(floatsPerVertex);
236
+ for (let triangle = 0; triangle + 2 < vertexCount; triangle += 3) {
237
+ const second = (triangle + 1) * floatsPerVertex;
238
+ const third = (triangle + 2) * floatsPerVertex;
239
+ scratch.set(vertices.subarray(second, second + floatsPerVertex));
240
+ vertices.copyWithin(second, third, third + floatsPerVertex);
241
+ vertices.set(scratch, third);
242
+ }
243
+ }
175
244
  function transformMeshGeometryPositions(out, source, sx, sy, sz, tx, ty, tz) {
176
245
  const posFloatOffset = getVertexAttributeFloatOffset(source.layout, 'position');
177
246
  const normFloatOffset = getVertexAttributeFloatOffset(source.layout, 'normal');
@@ -214,7 +283,9 @@ function transformMeshGeometryPositions(out, source, sx, sy, sz, tx, ty, tz) {
214
283
  const tb = vertBase + tanFloatOffset;
215
284
  const ttx = srcVerts[tb], tty = srcVerts[tb + 1], ttz = srcVerts[tb + 2];
216
285
  const tw = srcVerts[tb + 3];
217
- let ntx = ttx * invSx, nty = tty * invSy, ntz = ttz * invSz;
286
+ // Plain scale, not the inverse: a tangent lies along the surface and follows the same
287
+ // transform a position does. See the note on `transformMeshGeometryInto`.
288
+ let ntx = ttx * sx, nty = tty * sy, ntz = ttz * sz;
218
289
  const len = Math.sqrt(ntx * ntx + nty * nty + ntz * ntz);
219
290
  if (len > 0) {
220
291
  ntx /= len;
@@ -1 +1 @@
1
- {"version":3,"file":"meshGeometryTransforms.js","sourceRoot":"","sources":["../src/meshGeometryTransforms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meshGeometryTransforms.js","sourceRoot":"","sources":["../src/meshGeometryTransforms.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import type { MeshGeometry } from '@flighthq/types/contract';
2
2
  export declare function offsetMeshGeometryUvs(geometry: MeshGeometry, du: number, dv: number): void;
3
3
  export declare function scaleMeshGeometryUvs(geometry: MeshGeometry, su: number, sv: number): void;
4
- export declare function wrapMeshGeometryUvs(geometry: MeshGeometry): void;
5
4
  //# sourceMappingURL=meshGeometryUvs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"meshGeometryUvs.d.ts","sourceRoot":"","sources":["../src/meshGeometryUvs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAW7D,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAY1F;AAID,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAYzF;AAKD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAYhE"}
1
+ {"version":3,"file":"meshGeometryUvs.d.ts","sourceRoot":"","sources":["../src/meshGeometryUvs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAW7D,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAY1F;AAcD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAYzF"}
@@ -22,6 +22,16 @@ export function offsetMeshGeometryUvs(geometry, du, dv) {
22
22
  }
23
23
  // Scales every uv0 coordinate by (su, sv) around the origin: u' = u * su, v' = v * sv. Useful
24
24
  // for tiling — e.g. scaleMeshGeometryUvs(geo, 2, 2) tiles the texture 2× in each direction.
25
+ //
26
+ // ★ A NEGATIVE SCALE MIRRORS THE SAMPLING BUT NOT THE STORED TANGENT FRAME. Tangents are derived
27
+ // from the UV gradient, so mirroring u or v reverses the direction a tangent should point and the
28
+ // handedness that goes with it, while the tangent records already in the vertex stream keep their
29
+ // old values. Any normal-mapped material then reconstructs its bitangent from a frame that no
30
+ // longer matches the coordinates it samples, which reads as lighting flipped across the mirrored
31
+ // axis. The remedy is the caller's: run `computeMeshGeometryTangents` afterwards to re-derive the
32
+ // frame from the new coordinates. This operation deliberately does NOT do that for you — a UV edit
33
+ // that silently rewrote the tangent attribute would be exactly the hidden side effect this codebase
34
+ // rules out, and callers that only ever scale positively should not pay for a recompute.
25
35
  export function scaleMeshGeometryUvs(geometry, su, sv) {
26
36
  const floatOffset = getVertexAttributeFloatOffset(geometry.layout, 'uv0');
27
37
  if (floatOffset < 0)
@@ -37,22 +47,4 @@ export function scaleMeshGeometryUvs(geometry, su, sv) {
37
47
  if (vertexCount > 0)
38
48
  geometry.version++;
39
49
  }
40
- // Wraps every uv0 coordinate into [0, 1) using the fractional-part operation: u' = u - floor(u).
41
- // Useful after scale or offset operations that push coordinates outside the 0..1 atlas tile.
42
- // Coordinates that are exactly on integer boundaries (e.g. u = 1.0) wrap to 0.0.
43
- export function wrapMeshGeometryUvs(geometry) {
44
- const floatOffset = getVertexAttributeFloatOffset(geometry.layout, 'uv0');
45
- if (floatOffset < 0)
46
- return;
47
- const floatsPerVertex = geometry.layout.stride / 4;
48
- const vertexCount = floatsPerVertex > 0 ? Math.floor(geometry.vertices.length / floatsPerVertex) : 0;
49
- const verts = geometry.vertices;
50
- for (let i = 0; i < vertexCount; i++) {
51
- const base = i * floatsPerVertex + floatOffset;
52
- verts[base] = verts[base] - Math.floor(verts[base]);
53
- verts[base + 1] = verts[base + 1] - Math.floor(verts[base + 1]);
54
- }
55
- if (vertexCount > 0)
56
- geometry.version++;
57
- }
58
50
  //# sourceMappingURL=meshGeometryUvs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"meshGeometryUvs.js","sourceRoot":"","sources":["../src/meshGeometryUvs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meshGeometryUvs.js","sourceRoot":"","sources":["../src/meshGeometryUvs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAEzE,gGAAgG;AAChG,8FAA8F;AAC9F,+FAA+F;AAC/F,8FAA8F;AAE9F,+FAA+F;AAC/F,wCAAwC;AACxC,MAAM,UAAU,qBAAqB,CAAC,QAAsB,EAAE,EAAU,EAAE,EAAU;IAClF,MAAM,WAAW,GAAG,6BAA6B,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1E,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO;IAC5B,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,GAAG,eAAe,GAAG,WAAW,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,WAAW,GAAG,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED,8FAA8F;AAC9F,4FAA4F;AAC5F,EAAE;AACF,iGAAiG;AACjG,kGAAkG;AAClG,kGAAkG;AAClG,8FAA8F;AAC9F,iGAAiG;AACjG,kGAAkG;AAClG,mGAAmG;AACnG,oGAAoG;AACpG,yFAAyF;AACzF,MAAM,UAAU,oBAAoB,CAAC,QAAsB,EAAE,EAAU,EAAE,EAAU;IACjF,MAAM,WAAW,GAAG,6BAA6B,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1E,IAAI,WAAW,GAAG,CAAC;QAAE,OAAO;IAC5B,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,GAAG,eAAe,GAAG,WAAW,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,WAAW,GAAG,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { VertexFormat } from '@flighthq/types/contract';
2
+ export declare function getVertexFormatByteLength(format: VertexFormat): number;
3
+ export declare function getVertexFormatComponentCount(format: VertexFormat): number;
4
+ export declare function readVertexFormatComponent(view: Readonly<DataView>, byteOffset: number, format: VertexFormat, component: number): number;
5
+ export declare function writeVertexFormatComponent(view: DataView, byteOffset: number, format: VertexFormat, component: number, value: number): void;
6
+ //# sourceMappingURL=vertexFormat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexFormat.d.ts","sourceRoot":"","sources":["../src/vertexFormat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CActE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAY1E;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GAChB,MAAM,CAaR;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,IAAI,CAiBN"}
@@ -0,0 +1,61 @@
1
+ export function getVertexFormatByteLength(format) {
2
+ switch (format) {
3
+ case 'float32x2':
4
+ return 8;
5
+ case 'float32x3':
6
+ return 12;
7
+ case 'float32x4':
8
+ return 16;
9
+ case 'uint16x4':
10
+ return 8;
11
+ case 'uint8x4':
12
+ case 'unorm8x4':
13
+ return 4;
14
+ }
15
+ }
16
+ export function getVertexFormatComponentCount(format) {
17
+ switch (format) {
18
+ case 'float32x2':
19
+ return 2;
20
+ case 'float32x3':
21
+ return 3;
22
+ case 'float32x4':
23
+ case 'uint16x4':
24
+ case 'uint8x4':
25
+ case 'unorm8x4':
26
+ return 4;
27
+ }
28
+ }
29
+ export function readVertexFormatComponent(view, byteOffset, format, component) {
30
+ switch (format) {
31
+ case 'float32x2':
32
+ case 'float32x3':
33
+ case 'float32x4':
34
+ return view.getFloat32(byteOffset + component * 4, true);
35
+ case 'uint16x4':
36
+ return view.getUint16(byteOffset + component * 2, true);
37
+ case 'uint8x4':
38
+ return view.getUint8(byteOffset + component);
39
+ case 'unorm8x4':
40
+ return view.getUint8(byteOffset + component) / 255;
41
+ }
42
+ }
43
+ export function writeVertexFormatComponent(view, byteOffset, format, component, value) {
44
+ switch (format) {
45
+ case 'float32x2':
46
+ case 'float32x3':
47
+ case 'float32x4':
48
+ view.setFloat32(byteOffset + component * 4, value, true);
49
+ return;
50
+ case 'uint16x4':
51
+ view.setUint16(byteOffset + component * 2, Math.round(Math.min(0xffff, Math.max(0, value))), true);
52
+ return;
53
+ case 'uint8x4':
54
+ view.setUint8(byteOffset + component, Math.round(Math.min(0xff, Math.max(0, value))));
55
+ return;
56
+ case 'unorm8x4':
57
+ view.setUint8(byteOffset + component, Math.round(Math.min(1, Math.max(0, value)) * 255));
58
+ return;
59
+ }
60
+ }
61
+ //# sourceMappingURL=vertexFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexFormat.js","sourceRoot":"","sources":["../src/vertexFormat.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,yBAAyB,CAAC,MAAoB;IAC5D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,CAAC,CAAC;QACX,KAAK,WAAW;YACd,OAAO,EAAE,CAAC;QACZ,KAAK,WAAW;YACd,OAAO,EAAE,CAAC;QACZ,KAAK,UAAU;YACb,OAAO,CAAC,CAAC;QACX,KAAK,SAAS,CAAC;QACf,KAAK,UAAU;YACb,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAoB;IAChE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,CAAC,CAAC;QACX,KAAK,WAAW;YACd,OAAO,CAAC,CAAC;QACX,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,UAAU;YACb,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAwB,EACxB,UAAkB,EAClB,MAAoB,EACpB,SAAiB;IAEjB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW;YACd,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3D,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1D,KAAK,SAAS;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;QAC/C,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,IAAc,EACd,UAAkB,EAClB,MAAoB,EACpB,SAAiB,EACjB,KAAa;IAEb,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,WAAW;YACd,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,SAAS,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACzD,OAAO;QACT,KAAK,UAAU;YACb,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACnG,OAAO;QACT,KAAK,SAAS;YACZ,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,OAAO;QACT,KAAK,UAAU;YACb,IAAI,CAAC,QAAQ,CAAC,UAAU,GAAG,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACzF,OAAO;IACX,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/mesh",
3
- "version": "0.3.0",
3
+ "version": "0.3.1-next.1041.35b950c",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,9 +38,9 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/entity": "0.3.0",
42
- "@flighthq/geometry": "0.3.0",
43
- "@flighthq/types": "0.3.0"
41
+ "@flighthq/entity": "0.3.1-next.1041.35b950c",
42
+ "@flighthq/geometry": "0.3.1-next.1041.35b950c",
43
+ "@flighthq/types": "0.3.1-next.1041.35b950c"
44
44
  },
45
45
  "devDependencies": {
46
46
  "typescript": "^5.3.0"
@@ -8,6 +8,7 @@ import { EntityRuntimeKey } from '@flighthq/types/contract';
8
8
 
9
9
  import {
10
10
  cloneMeshGeometry,
11
+ cloneMeshGeometryMetadata,
11
12
  createMeshGeometry,
12
13
  destroyMeshGeometryGlData,
13
14
  destroyMeshGeometryWgpuData,
@@ -21,20 +22,6 @@ import {
21
22
  setMeshGeometrySkinBindPose,
22
23
  } from './meshGeometry';
23
24
 
24
- const CANONICAL_LAYOUT: VertexAttributeLayout = {
25
- attributes: [
26
- { byteOffset: 0, format: 'float32x3', semantic: 'position' },
27
- { byteOffset: 12, format: 'float32x3', semantic: 'normal' },
28
- { byteOffset: 24, format: 'float32x4', semantic: 'tangent' },
29
- { byteOffset: 40, format: 'float32x2', semantic: 'uv0' },
30
- ],
31
- stride: 48,
32
- };
33
-
34
- function makeVertices(count: number): Float32Array<ArrayBuffer> {
35
- return new Float32Array(count * 12);
36
- }
37
-
38
25
  describe('cloneMeshGeometry', () => {
39
26
  it('deep-copies vertices and indices independently', () => {
40
27
  const vertices = makeVertices(3);
@@ -68,16 +55,29 @@ describe('cloneMeshGeometry', () => {
68
55
  expect(clone.bounds!.min.x).toBe(-1);
69
56
  expect(clone.bounds!.max.z).toBe(1);
70
57
  });
58
+ });
71
59
 
72
- it('copies tangent-split smoothing identity without sharing its runtime array', () => {
73
- const source = createMeshGeometry({ layout: CANONICAL_LAYOUT, vertices: makeVertices(2) });
74
- (source[EntityRuntimeKey] as MeshGeometryRuntime).tangentSmoothingSources = new Uint32Array([0, 0]);
60
+ const CANONICAL_LAYOUT: VertexAttributeLayout = {
61
+ attributes: [
62
+ { byteOffset: 0, format: 'float32x3', semantic: 'position' },
63
+ { byteOffset: 12, format: 'float32x3', semantic: 'normal' },
64
+ { byteOffset: 24, format: 'float32x4', semantic: 'tangent' },
65
+ { byteOffset: 40, format: 'float32x2', semantic: 'uv0' },
66
+ ],
67
+ stride: 48,
68
+ };
75
69
 
76
- const clone = cloneMeshGeometry(source);
70
+ function makeVertices(count: number): Float32Array<ArrayBuffer> {
71
+ return new Float32Array(count * 12);
72
+ }
77
73
 
78
- const clonedSources = (clone[EntityRuntimeKey] as MeshGeometryRuntime).tangentSmoothingSources;
79
- expect(Array.from(clonedSources!)).toEqual([0, 0]);
80
- expect(clonedSources).not.toBe((source[EntityRuntimeKey] as MeshGeometryRuntime).tangentSmoothingSources);
74
+ describe('cloneMeshGeometryMetadata', () => {
75
+ it('copies descriptors without copying the vertex stream', () => {
76
+ const source = createMeshGeometry({ layout: CANONICAL_LAYOUT, vertices: new Float32Array(12) });
77
+ const copy = cloneMeshGeometryMetadata(source);
78
+ expect(copy.vertices.length).toBe(0);
79
+ expect(copy.layout).toBe(source.layout);
80
+ expect(copy[EntityRuntimeKey]).not.toBe(source[EntityRuntimeKey]);
81
81
  });
82
82
  });
83
83
 
@@ -130,7 +130,6 @@ describe('createMeshGeometry', () => {
130
130
  const runtime = geometry[EntityRuntimeKey] as MeshGeometryRuntime;
131
131
  expect(runtime.webglData).toBeNull();
132
132
  expect(runtime.webgpuData).toBeNull();
133
- expect(runtime.tangentSmoothingSources).toBeNull();
134
133
  });
135
134
  });
136
135
 
@@ -250,6 +249,8 @@ describe('setMeshGeometrySkinBindPose', () => {
250
249
  positions: new Float32Array(3),
251
250
  skinnedNormals: new Float32Array(3),
252
251
  skinnedPositions: new Float32Array(3),
252
+ skinnedTangents: new Float32Array(0),
253
+ tangents: new Float32Array(0),
253
254
  weights: new Float32Array(4),
254
255
  };
255
256
 
@@ -284,6 +284,43 @@ describe('getVertexAttributeFloatOffset', () => {
284
284
  });
285
285
  });
286
286
 
287
+ describe('mesh vertex accessor rejection family', () => {
288
+ it.each([
289
+ ['color0', getMeshGeometryVertexColor0],
290
+ ['joints0', getMeshGeometryVertexJoints0],
291
+ ['weights0', getMeshGeometryVertexWeights0],
292
+ ])('leaves four-component output untouched when %s is absent', (_semantic, read) => {
293
+ const out = { w: 7, x: 8, y: 9, z: 10 };
294
+ expect(read(out, makeOneVertex(), 0)).toBe(false);
295
+ expect(out).toEqual({ w: 7, x: 8, y: 9, z: 10 });
296
+ });
297
+
298
+ it.each([
299
+ ['normal', getMeshGeometryVertexNormal],
300
+ ['position', getMeshGeometryVertexPosition],
301
+ ['tangent', getMeshGeometryVertexTangent],
302
+ ])('leaves float3/4 output untouched when %s is absent', (_semantic, read) => {
303
+ const out = { w: 7, x: 8, y: 9, z: 10 };
304
+ expect(
305
+ read(out, createMeshGeometry({ layout: { attributes: [], stride: 0 }, vertices: new Float32Array(0) }), 0),
306
+ ).toBe(false);
307
+ expect(out).toEqual({ w: 7, x: 8, y: 9, z: 10 });
308
+ });
309
+
310
+ it('rejects non-float formats, negative/past indices, and zero stride without touching output', () => {
311
+ const packed = createMeshGeometry({
312
+ layout: { attributes: [{ byteOffset: 0, format: 'uint8x4', semantic: 'position' }], stride: 4 },
313
+ vertices: new Float32Array(1),
314
+ });
315
+ const out = { x: 7, y: 8, z: 9 };
316
+ expect(getMeshGeometryVertexPosition(out, packed, 0)).toBe(false);
317
+ expect(out).toEqual({ x: 7, y: 8, z: 9 });
318
+ expect(getMeshGeometryVertexPosition(out, makeOneVertex(), -1)).toBe(false);
319
+ expect(getMeshGeometryVertexPosition(out, makeOneVertex(), 1)).toBe(false);
320
+ expect(out).toEqual({ x: 7, y: 8, z: 9 });
321
+ });
322
+ });
323
+
287
324
  describe('setMeshGeometryVertexColor0', () => {
288
325
  it('encodes and versions the declared color storage', () => {
289
326
  const geometry = makePackedVertex();