@headless-three/renderer 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -1
  3. package/dist/attributes.d.ts +8 -0
  4. package/dist/attributes.d.ts.map +1 -0
  5. package/dist/attributes.js +91 -0
  6. package/dist/attributes.js.map +1 -0
  7. package/dist/camera.d.ts +8 -0
  8. package/dist/camera.d.ts.map +1 -0
  9. package/dist/camera.js +53 -0
  10. package/dist/camera.js.map +1 -0
  11. package/dist/color.d.ts +5 -0
  12. package/dist/color.d.ts.map +1 -0
  13. package/dist/color.js +36 -0
  14. package/dist/color.js.map +1 -0
  15. package/dist/index.d.ts +9 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +72 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lights.d.ts +5 -0
  20. package/dist/lights.d.ts.map +1 -0
  21. package/dist/lights.js +186 -0
  22. package/dist/lights.js.map +1 -0
  23. package/dist/materials.d.ts +18 -0
  24. package/dist/materials.d.ts.map +1 -0
  25. package/dist/materials.js +268 -0
  26. package/dist/materials.js.map +1 -0
  27. package/dist/math.d.ts +14 -0
  28. package/dist/math.d.ts.map +1 -0
  29. package/dist/math.js +137 -0
  30. package/dist/math.js.map +1 -0
  31. package/dist/morphs.d.ts +22 -0
  32. package/dist/morphs.d.ts.map +1 -0
  33. package/dist/morphs.js +108 -0
  34. package/dist/morphs.js.map +1 -0
  35. package/dist/scene.d.ts +3 -0
  36. package/dist/scene.d.ts.map +1 -0
  37. package/dist/scene.js +220 -0
  38. package/dist/scene.js.map +1 -0
  39. package/dist/skinning.d.ts +15 -0
  40. package/dist/skinning.d.ts.map +1 -0
  41. package/dist/skinning.js +88 -0
  42. package/dist/skinning.js.map +1 -0
  43. package/dist/types.d.ts +313 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +4 -0
  46. package/dist/types.js.map +1 -0
  47. package/native.d.ts +178 -0
  48. package/native.js +580 -0
  49. package/package.json +83 -4
package/dist/math.js ADDED
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OPENGL_TO_WGPU_CLIP = exports.IDENTITY_4X4 = void 0;
4
+ exports.multiplyMatrices = multiplyMatrices;
5
+ exports.invertMatrix4 = invertMatrix4;
6
+ exports.blendBoneMatrices = blendBoneMatrices;
7
+ exports.matrixElements = matrixElements;
8
+ exports.clampInteger = clampInteger;
9
+ exports.numberOrUndefined = numberOrUndefined;
10
+ exports.isFinitePositive = isFinitePositive;
11
+ exports.assertFinite = assertFinite;
12
+ exports.areFiniteNumbers = areFiniteNumbers;
13
+ exports.clamp01 = clamp01;
14
+ exports.IDENTITY_4X4 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
15
+ // Three.js projection matrices use WebGL/OpenGL clip-space depth (-1..1).
16
+ // wgpu/WebGPU expects 0..1, so the public adapter converts clip-space here.
17
+ exports.OPENGL_TO_WGPU_CLIP = [
18
+ 1, 0, 0, 0,
19
+ 0, 1, 0, 0,
20
+ 0, 0, 0.5, 0,
21
+ 0, 0, 0.5, 1,
22
+ ];
23
+ function multiplyMatrices(a, b) {
24
+ const out = new Array(16);
25
+ for (let column = 0; column < 4; column += 1) {
26
+ for (let row = 0; row < 4; row += 1) {
27
+ out[column * 4 + row] =
28
+ a[row] * b[column * 4] +
29
+ a[4 + row] * b[column * 4 + 1] +
30
+ a[8 + row] * b[column * 4 + 2] +
31
+ a[12 + row] * b[column * 4 + 3];
32
+ }
33
+ }
34
+ return out;
35
+ }
36
+ function invertMatrix4(m) {
37
+ const a00 = m[0], a01 = m[1], a02 = m[2], a03 = m[3];
38
+ const a10 = m[4], a11 = m[5], a12 = m[6], a13 = m[7];
39
+ const a20 = m[8], a21 = m[9], a22 = m[10], a23 = m[11];
40
+ const a30 = m[12], a31 = m[13], a32 = m[14], a33 = m[15];
41
+ const b00 = a00 * a11 - a01 * a10;
42
+ const b01 = a00 * a12 - a02 * a10;
43
+ const b02 = a00 * a13 - a03 * a10;
44
+ const b03 = a01 * a12 - a02 * a11;
45
+ const b04 = a01 * a13 - a03 * a11;
46
+ const b05 = a02 * a13 - a03 * a12;
47
+ const b06 = a20 * a31 - a21 * a30;
48
+ const b07 = a20 * a32 - a22 * a30;
49
+ const b08 = a20 * a33 - a23 * a30;
50
+ const b09 = a21 * a32 - a22 * a31;
51
+ const b10 = a21 * a33 - a23 * a31;
52
+ const b11 = a22 * a33 - a23 * a32;
53
+ let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
54
+ if (Math.abs(det) < 1e-12)
55
+ return exports.IDENTITY_4X4.slice();
56
+ det = 1.0 / det;
57
+ return [
58
+ (a11 * b11 - a12 * b10 + a13 * b09) * det,
59
+ (a02 * b10 - a01 * b11 - a03 * b09) * det,
60
+ (a31 * b05 - a32 * b04 + a33 * b03) * det,
61
+ (a22 * b04 - a21 * b05 - a23 * b03) * det,
62
+ (a12 * b08 - a10 * b11 - a13 * b07) * det,
63
+ (a00 * b11 - a02 * b08 + a03 * b07) * det,
64
+ (a32 * b02 - a30 * b05 - a33 * b01) * det,
65
+ (a20 * b05 - a22 * b02 + a23 * b01) * det,
66
+ (a10 * b10 - a11 * b08 + a13 * b06) * det,
67
+ (a01 * b08 - a00 * b10 - a03 * b06) * det,
68
+ (a30 * b04 - a31 * b02 + a33 * b00) * det,
69
+ (a21 * b02 - a20 * b04 - a23 * b00) * det,
70
+ (a11 * b07 - a10 * b09 - a12 * b06) * det,
71
+ (a00 * b09 - a01 * b07 + a02 * b06) * det,
72
+ (a31 * b01 - a30 * b03 - a32 * b00) * det,
73
+ (a20 * b03 - a21 * b01 + a22 * b00) * det,
74
+ ];
75
+ }
76
+ function blendBoneMatrices(boneMatrices, boneCount, ji0, ji1, ji2, ji3, jw0, jw1, jw2, jw3) {
77
+ const out = new Array(16);
78
+ for (let k = 0; k < 16; k++) {
79
+ out[k] = 0;
80
+ }
81
+ if (jw0 > 0 && ji0 >= 0 && ji0 < boneCount) {
82
+ const m = boneMatrices[ji0];
83
+ for (let k = 0; k < 16; k++)
84
+ out[k] += jw0 * m[k];
85
+ }
86
+ if (jw1 > 0 && ji1 >= 0 && ji1 < boneCount) {
87
+ const m = boneMatrices[ji1];
88
+ for (let k = 0; k < 16; k++)
89
+ out[k] += jw1 * m[k];
90
+ }
91
+ if (jw2 > 0 && ji2 >= 0 && ji2 < boneCount) {
92
+ const m = boneMatrices[ji2];
93
+ for (let k = 0; k < 16; k++)
94
+ out[k] += jw2 * m[k];
95
+ }
96
+ if (jw3 > 0 && ji3 >= 0 && ji3 < boneCount) {
97
+ const m = boneMatrices[ji3];
98
+ for (let k = 0; k < 16; k++)
99
+ out[k] += jw3 * m[k];
100
+ }
101
+ const sum = jw0 + jw1 + jw2 + jw3;
102
+ if (sum < 1e-8) {
103
+ return exports.IDENTITY_4X4;
104
+ }
105
+ return out;
106
+ }
107
+ function matrixElements(matrix, label) {
108
+ const elements = matrix?.elements;
109
+ if (!elements || elements.length !== 16) {
110
+ throw new TypeError(`${label} must be a THREE.Matrix4`);
111
+ }
112
+ return Array.from(elements, (value) => assertFinite(value, label));
113
+ }
114
+ function clampInteger(value, min, max) {
115
+ if (!Number.isFinite(value))
116
+ return max;
117
+ return Math.max(min, Math.min(max, Math.trunc(value)));
118
+ }
119
+ function numberOrUndefined(value) {
120
+ return Number.isFinite(value) ? value : undefined;
121
+ }
122
+ function isFinitePositive(value) {
123
+ return Number.isFinite(value) && value > 0;
124
+ }
125
+ function assertFinite(value, label) {
126
+ if (!Number.isFinite(value)) {
127
+ throw new TypeError(`${label} must be finite`);
128
+ }
129
+ return value;
130
+ }
131
+ function areFiniteNumbers(...values) {
132
+ return values.every(Number.isFinite);
133
+ }
134
+ function clamp01(value) {
135
+ return Math.min(1, Math.max(0, value));
136
+ }
137
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../api/math.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ThreeObject3DLike } from './types';
2
+ /**
3
+ * CPU-side morph target (blend shape / shape key) application.
4
+ *
5
+ * Supports:
6
+ * - Three.js `BufferGeometry.morphAttributes` with `mesh.morphTargetInfluences`
7
+ * - VRM blend shapes (`@pixiv/three-vrm` sets `morphTargetInfluences` on the mesh)
8
+ * - Blender shape keys exported via glTF (`GLTFLoader` populates the same attributes)
9
+ *
10
+ * Three.js morph target formula per vertex:
11
+ * morphedPosition = basePosition + sum(influence[i] * morphPosition[i][vertex])
12
+ * morphedNormal = normalize(baseNormal + sum(influence[i] * morphNormal[i][vertex]))
13
+ *
14
+ * When `geometry.morphTargetsRelative` is true (the default for glTF), the morph
15
+ * attributes store deltas. When false (legacy Three.js), they store absolute
16
+ * positions and we compute the delta as `morphAttr[i][v] - baseAttr[v]`.
17
+ */
18
+ export declare function applyMorphTargets(mesh: ThreeObject3DLike, positions: number[], normals: number[] | null): {
19
+ positions: number[];
20
+ normals: number[] | null;
21
+ };
22
+ //# sourceMappingURL=morphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morphs.d.ts","sourceRoot":"","sources":["../api/morphs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAA4B,MAAM,SAAS,CAAA;AAG1E;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,EACvB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,GACvB;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CA6FnD"}
package/dist/morphs.js ADDED
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyMorphTargets = applyMorphTargets;
4
+ const attributes_1 = require("./attributes");
5
+ /**
6
+ * CPU-side morph target (blend shape / shape key) application.
7
+ *
8
+ * Supports:
9
+ * - Three.js `BufferGeometry.morphAttributes` with `mesh.morphTargetInfluences`
10
+ * - VRM blend shapes (`@pixiv/three-vrm` sets `morphTargetInfluences` on the mesh)
11
+ * - Blender shape keys exported via glTF (`GLTFLoader` populates the same attributes)
12
+ *
13
+ * Three.js morph target formula per vertex:
14
+ * morphedPosition = basePosition + sum(influence[i] * morphPosition[i][vertex])
15
+ * morphedNormal = normalize(baseNormal + sum(influence[i] * morphNormal[i][vertex]))
16
+ *
17
+ * When `geometry.morphTargetsRelative` is true (the default for glTF), the morph
18
+ * attributes store deltas. When false (legacy Three.js), they store absolute
19
+ * positions and we compute the delta as `morphAttr[i][v] - baseAttr[v]`.
20
+ */
21
+ function applyMorphTargets(mesh, positions, normals) {
22
+ const geometry = mesh.geometry;
23
+ if (!geometry)
24
+ return { positions, normals };
25
+ const influences = mesh.morphTargetInfluences;
26
+ if (!influences || influences.length === 0)
27
+ return { positions, normals };
28
+ const morphAttributes = geometry.morphAttributes;
29
+ if (!morphAttributes)
30
+ return { positions, normals };
31
+ const morphPositions = morphAttributes.position;
32
+ const morphNormals = morphAttributes.normal;
33
+ if (!morphPositions || morphPositions.length === 0)
34
+ return { positions, normals };
35
+ // Check if any influence is actually non-zero before allocating.
36
+ const targetCount = Math.min(influences.length, morphPositions.length);
37
+ let hasEffect = false;
38
+ for (let t = 0; t < targetCount; t++) {
39
+ if (influences[t] !== 0 && Number.isFinite(influences[t])) {
40
+ hasEffect = true;
41
+ break;
42
+ }
43
+ }
44
+ if (!hasEffect)
45
+ return { positions, normals };
46
+ const isRelative = geometry.morphTargetsRelative !== false;
47
+ const vertexCount = positions.length / 3;
48
+ const morphedPositions = positions.slice();
49
+ const morphedNormals = normals ? normals.slice() : null;
50
+ for (let t = 0; t < targetCount; t++) {
51
+ const weight = influences[t];
52
+ if (!Number.isFinite(weight) || weight === 0)
53
+ continue;
54
+ const morphPosAttr = morphPositions[t];
55
+ if (!morphPosAttr)
56
+ continue;
57
+ const morphNormAttr = morphNormals?.[t];
58
+ const count = Math.min(vertexCount, morphPosAttr.count ?? 0);
59
+ for (let vi = 0; vi < count; vi++) {
60
+ const mx = (0, attributes_1.attributeComponent)(morphPosAttr, vi, 0);
61
+ const my = (0, attributes_1.attributeComponent)(morphPosAttr, vi, 1);
62
+ const mz = (0, attributes_1.attributeComponent)(morphPosAttr, vi, 2);
63
+ if (isRelative) {
64
+ // Morph attributes store deltas
65
+ morphedPositions[vi * 3] += weight * mx;
66
+ morphedPositions[vi * 3 + 1] += weight * my;
67
+ morphedPositions[vi * 3 + 2] += weight * mz;
68
+ }
69
+ else {
70
+ // Legacy absolute mode: delta = morphPos - basePos
71
+ morphedPositions[vi * 3] += weight * (mx - positions[vi * 3]);
72
+ morphedPositions[vi * 3 + 1] += weight * (my - positions[vi * 3 + 1]);
73
+ morphedPositions[vi * 3 + 2] += weight * (mz - positions[vi * 3 + 2]);
74
+ }
75
+ if (morphedNormals && morphNormAttr) {
76
+ const nx = (0, attributes_1.attributeComponent)(morphNormAttr, vi, 0);
77
+ const ny = (0, attributes_1.attributeComponent)(morphNormAttr, vi, 1);
78
+ const nz = (0, attributes_1.attributeComponent)(morphNormAttr, vi, 2);
79
+ if (isRelative) {
80
+ morphedNormals[vi * 3] += weight * nx;
81
+ morphedNormals[vi * 3 + 1] += weight * ny;
82
+ morphedNormals[vi * 3 + 2] += weight * nz;
83
+ }
84
+ else {
85
+ morphedNormals[vi * 3] += weight * (nx - normals[vi * 3]);
86
+ morphedNormals[vi * 3 + 1] += weight * (ny - normals[vi * 3 + 1]);
87
+ morphedNormals[vi * 3 + 2] += weight * (nz - normals[vi * 3 + 2]);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ // Re-normalize morphed normals
93
+ if (morphedNormals) {
94
+ for (let vi = 0; vi < vertexCount; vi++) {
95
+ const nx = morphedNormals[vi * 3];
96
+ const ny = morphedNormals[vi * 3 + 1];
97
+ const nz = morphedNormals[vi * 3 + 2];
98
+ const len = Math.sqrt(nx * nx + ny * ny + nz * nz);
99
+ if (len > 1e-8) {
100
+ morphedNormals[vi * 3] = nx / len;
101
+ morphedNormals[vi * 3 + 1] = ny / len;
102
+ morphedNormals[vi * 3 + 2] = nz / len;
103
+ }
104
+ }
105
+ }
106
+ return { positions: morphedPositions, normals: morphedNormals };
107
+ }
108
+ //# sourceMappingURL=morphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"morphs.js","sourceRoot":"","sources":["../api/morphs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ThreeObject3DLike, NativeSceneMesh } from './types';
2
+ export declare function flattenScene(scene: ThreeObject3DLike): NativeSceneMesh[];
3
+ //# sourceMappingURL=scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../api/scene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAA2B,eAAe,EAAiB,MAAM,SAAS,CAAA;AAOzG,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,eAAe,EAAE,CAIxE"}
package/dist/scene.js ADDED
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.flattenScene = flattenScene;
4
+ const math_1 = require("./math");
5
+ const attributes_1 = require("./attributes");
6
+ const materials_1 = require("./materials");
7
+ const skinning_1 = require("./skinning");
8
+ const morphs_1 = require("./morphs");
9
+ function flattenScene(scene) {
10
+ const meshes = [];
11
+ visitObject(scene, true, meshes);
12
+ return meshes;
13
+ }
14
+ function visitObject(object, parentVisible, meshes) {
15
+ if (!object || !parentVisible || object.visible === false)
16
+ return;
17
+ if (object.isMesh === true && object.geometry) {
18
+ appendMesh(object, meshes);
19
+ }
20
+ else if ((object.isLineSegments === true || object.isLineLoop === true || object.isLine === true) && object.geometry) {
21
+ appendLineOrPoints(object, meshes, 'lines');
22
+ }
23
+ else if (object.isPoints === true && object.geometry) {
24
+ appendLineOrPoints(object, meshes, 'points');
25
+ }
26
+ const children = Array.isArray(object.children) ? object.children : [];
27
+ for (const child of children) {
28
+ visitObject(child, true, meshes);
29
+ }
30
+ }
31
+ function appendMesh(object, meshes) {
32
+ const geometry = object.geometry;
33
+ const position = (0, attributes_1.getAttribute)(geometry, 'position');
34
+ if (!position)
35
+ return;
36
+ let positions = (0, attributes_1.readVec3Attribute)(position);
37
+ const uvAttribute = (0, attributes_1.getAttribute)(geometry, 'uv');
38
+ const uvs = uvAttribute ? (0, attributes_1.readVec2Attribute)(uvAttribute) : null;
39
+ const normalAttribute = (0, attributes_1.getAttribute)(geometry, 'normal');
40
+ let normals = normalAttribute ? (0, attributes_1.readVec3Attribute)(normalAttribute) : null;
41
+ const vertexColors = (0, attributes_1.getAttribute)(geometry, 'color');
42
+ const index = geometry.index ? (0, attributes_1.readIndexAttribute)(geometry.index) : null;
43
+ const groups = effectiveGroups(geometry, index, position.count);
44
+ // CPU-side morph targets (blend shapes / shape keys / VRM blendshapes)
45
+ if (object.morphTargetInfluences && object.morphTargetInfluences.length > 0) {
46
+ const morphed = (0, morphs_1.applyMorphTargets)(object, positions, normals);
47
+ positions = morphed.positions;
48
+ normals = morphed.normals;
49
+ }
50
+ // CPU-side skinning for SkinnedMesh (Three.js, VRM, VRMA)
51
+ if (object.isSkinnedMesh === true && object.skeleton) {
52
+ const skinned = (0, skinning_1.applyCpuSkinning)(object, positions, normals);
53
+ positions = skinned.positions;
54
+ normals = skinned.normals;
55
+ }
56
+ // For skinned meshes, positions are already in world space after CPU skinning.
57
+ const isSkinned = object.isSkinnedMesh === true && object.skeleton;
58
+ const meshTransform = isSkinned
59
+ ? math_1.IDENTITY_4X4.slice()
60
+ : (0, math_1.matrixElements)(object.matrixWorld, 'mesh.matrixWorld');
61
+ for (const group of groups) {
62
+ const material = (0, materials_1.materialForGroup)(object.material, group.materialIndex);
63
+ if (material?.visible === false)
64
+ continue;
65
+ const color = (0, materials_1.materialColor)(material);
66
+ const useVertexColors = vertexColors && material?.vertexColors !== false;
67
+ const pbrProps = (0, materials_1.extractPbrProperties)(material);
68
+ const textureInfo = (0, materials_1.extractTextureData)(material);
69
+ const castShadow = object.castShadow === true ? true : undefined;
70
+ const receiveShadow = object.receiveShadow === true ? true : undefined;
71
+ if (index) {
72
+ const indices = index.slice(group.start, group.start + group.count);
73
+ if (indices.length % 3 !== 0) {
74
+ throw new Error(`THREE.Mesh "${object.name || object.uuid || '<unnamed>'}" has a non-triangle index range`);
75
+ }
76
+ meshes.push({
77
+ positions,
78
+ indices,
79
+ normals: normals ?? undefined,
80
+ color,
81
+ colors: useVertexColors ? (0, attributes_1.readColorAttribute)(vertexColors, color) : undefined,
82
+ uvs: uvs ?? undefined,
83
+ texture: textureInfo?.data,
84
+ textureWidth: textureInfo?.width ?? undefined,
85
+ textureHeight: textureInfo?.height ?? undefined,
86
+ textureWrapS: textureInfo?.wrapS,
87
+ textureWrapT: textureInfo?.wrapT,
88
+ transform: meshTransform,
89
+ castShadow,
90
+ receiveShadow,
91
+ ...pbrProps,
92
+ });
93
+ }
94
+ else {
95
+ if (group.count % 3 !== 0) {
96
+ throw new Error(`THREE.Mesh "${object.name || object.uuid || '<unnamed>'}" has a non-triangle vertex range`);
97
+ }
98
+ meshes.push({
99
+ positions: positions.slice(group.start * 3, (group.start + group.count) * 3),
100
+ normals: normals ? normals.slice(group.start * 3, (group.start + group.count) * 3) : undefined,
101
+ color,
102
+ colors: useVertexColors
103
+ ? (0, attributes_1.readColorAttribute)(vertexColors, color).slice(group.start * 4, (group.start + group.count) * 4)
104
+ : undefined,
105
+ uvs: uvs ? uvs.slice(group.start * 2, (group.start + group.count) * 2) : undefined,
106
+ texture: textureInfo?.data,
107
+ textureWidth: textureInfo?.width ?? undefined,
108
+ textureHeight: textureInfo?.height ?? undefined,
109
+ textureWrapS: textureInfo?.wrapS,
110
+ textureWrapT: textureInfo?.wrapT,
111
+ transform: meshTransform,
112
+ castShadow,
113
+ receiveShadow,
114
+ ...pbrProps,
115
+ });
116
+ }
117
+ }
118
+ }
119
+ function effectiveGroups(geometry, index, vertexCount) {
120
+ const range = geometry.drawRange ?? {};
121
+ const maxCount = index ? index.length : vertexCount;
122
+ const drawStart = (0, math_1.clampInteger)(range.start ?? 0, 0, maxCount);
123
+ const requestedCount = range.count == null || range.count === Infinity ? maxCount : range.count;
124
+ const drawEnd = (0, math_1.clampInteger)(drawStart + requestedCount, drawStart, maxCount);
125
+ const sourceGroups = Array.isArray(geometry.groups) && geometry.groups.length
126
+ ? geometry.groups
127
+ : [{ start: drawStart, count: drawEnd - drawStart, materialIndex: 0 }];
128
+ const groups = [];
129
+ for (const group of sourceGroups) {
130
+ const start = Math.max(drawStart, (0, math_1.clampInteger)(group.start ?? 0, 0, maxCount));
131
+ const end = Math.min(drawEnd, (0, math_1.clampInteger)((group.start ?? 0) + (group.count ?? 0), 0, maxCount));
132
+ if (end > start) {
133
+ groups.push({
134
+ start,
135
+ count: end - start,
136
+ materialIndex: group.materialIndex ?? 0,
137
+ });
138
+ }
139
+ }
140
+ return groups;
141
+ }
142
+ /**
143
+ * Emit a `NativeSceneMesh` with `topology: 'lines'` or `'points'` for
144
+ * `THREE.Line` / `THREE.LineSegments` / `THREE.LineLoop` / `THREE.Points`.
145
+ * Lines are always expanded to a LineList (pairs of vertex indices) so the
146
+ * Rust side only has to deal with one line topology.
147
+ */
148
+ function appendLineOrPoints(object, meshes, topology) {
149
+ const geometry = object.geometry;
150
+ const position = (0, attributes_1.getAttribute)(geometry, 'position');
151
+ if (!position)
152
+ return;
153
+ const material = (0, materials_1.materialForGroup)(object.material, 0);
154
+ if (material?.visible === false)
155
+ return;
156
+ const positions = (0, attributes_1.readVec3Attribute)(position);
157
+ const vertexColors = (0, attributes_1.getAttribute)(geometry, 'color');
158
+ const indexAttr = geometry.index ? (0, attributes_1.readIndexAttribute)(geometry.index) : null;
159
+ const vertexCount = position.count;
160
+ const range = geometry.drawRange ?? {};
161
+ const sourceCount = indexAttr ? indexAttr.length : vertexCount;
162
+ const drawStart = (0, math_1.clampInteger)(range.start ?? 0, 0, sourceCount);
163
+ const requestedCount = range.count == null || range.count === Infinity ? sourceCount : range.count;
164
+ const drawEnd = (0, math_1.clampInteger)(drawStart + requestedCount, drawStart, sourceCount);
165
+ let indices = null;
166
+ if (topology === 'lines') {
167
+ const source = indexAttr ?? rangeIndices(vertexCount);
168
+ indices = expandLineIndices(source, drawStart, drawEnd, object);
169
+ if (indices.length < 2)
170
+ return;
171
+ }
172
+ else if (indexAttr) {
173
+ indices = indexAttr.slice(drawStart, drawEnd);
174
+ if (indices.length === 0)
175
+ return;
176
+ }
177
+ const color = (0, materials_1.materialColor)(material);
178
+ const useVertexColors = vertexColors && material?.vertexColors !== false;
179
+ const colors = useVertexColors ? (0, attributes_1.readColorAttribute)(vertexColors, color) : undefined;
180
+ meshes.push({
181
+ positions,
182
+ indices: indices ?? undefined,
183
+ color,
184
+ colors,
185
+ transform: (0, math_1.matrixElements)(object.matrixWorld, 'object.matrixWorld'),
186
+ transparent: material?.transparent === true || (material?.opacity != null && material.opacity < 1),
187
+ alphaTest: material && Number.isFinite(material.alphaTest) && material.alphaTest > 0 ? material.alphaTest : undefined,
188
+ shadingModel: 'basic',
189
+ topology,
190
+ });
191
+ }
192
+ function rangeIndices(count) {
193
+ const out = new Array(count);
194
+ for (let i = 0; i < count; i++)
195
+ out[i] = i;
196
+ return out;
197
+ }
198
+ /**
199
+ * Convert a LineStrip / LineSegments / LineLoop index stream into a flat
200
+ * LineList `[a, b, b, c, ...]` array.
201
+ */
202
+ function expandLineIndices(source, start, end, object) {
203
+ const count = end - start;
204
+ if (count < 2)
205
+ return [];
206
+ if (object.isLineSegments === true) {
207
+ // already pairs; just validate alignment
208
+ const aligned = count - (count % 2);
209
+ return source.slice(start, start + aligned);
210
+ }
211
+ const out = [];
212
+ for (let i = 0; i < count - 1; i++) {
213
+ out.push(source[start + i], source[start + i + 1]);
214
+ }
215
+ if (object.isLineLoop === true && count >= 2) {
216
+ out.push(source[start + count - 1], source[start]);
217
+ }
218
+ return out;
219
+ }
220
+ //# sourceMappingURL=scene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene.js","sourceRoot":"","sources":["../api/scene.ts"],"names":[],"mappings":";;AAOA,oCAIC;AAVD,iCAAmE;AACnE,6CAAyH;AACzH,2CAAuG;AACvG,yCAA6C;AAC7C,qCAA4C;AAE5C,SAAgB,YAAY,CAAC,KAAwB;IACnD,MAAM,MAAM,GAAsB,EAAE,CAAA;IACpC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,WAAW,CAAC,MAAyB,EAAE,aAAsB,EAAE,MAAyB;IAC/F,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;QAAE,OAAM;IAEjE,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC9C,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvH,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvD,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;IACtE,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAClC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAyB,EAAE,MAAyB;IACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAS,CAAA;IACjC,MAAM,QAAQ,GAAG,IAAA,yBAAY,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAM;IAErB,IAAI,SAAS,GAAG,IAAA,8BAAiB,EAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,WAAW,GAAG,IAAA,yBAAY,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAChD,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,IAAA,8BAAiB,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC/D,MAAM,eAAe,GAAG,IAAA,yBAAY,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACxD,IAAI,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,IAAA,8BAAiB,EAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACzE,MAAM,YAAY,GAAG,IAAA,yBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,+BAAkB,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACxE,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE/D,uEAAuE;IACvE,IAAI,MAAM,CAAC,qBAAqB,IAAI,MAAM,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,IAAA,0BAAiB,EAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;QAC7D,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;QAC7B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,0DAA0D;IAC1D,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,IAAA,2BAAgB,EAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;QAC5D,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;QAC7B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAC3B,CAAC;IAED,+EAA+E;IAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAA;IAClE,MAAM,aAAa,GAAG,SAAS;QAC7B,CAAC,CAAC,mBAAY,CAAC,KAAK,EAAE;QACtB,CAAC,CAAC,IAAA,qBAAc,EAAC,MAAM,CAAC,WAAY,EAAE,kBAAkB,CAAC,CAAA;IAE3D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAA,4BAAgB,EAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;QACvE,IAAI,QAAQ,EAAE,OAAO,KAAK,KAAK;YAAE,SAAQ;QAEzC,MAAM,KAAK,GAAG,IAAA,yBAAa,EAAC,QAAQ,CAAC,CAAA;QACrC,MAAM,eAAe,GAAG,YAAY,IAAI,QAAQ,EAAE,YAAY,KAAK,KAAK,CAAA;QACxE,MAAM,QAAQ,GAAG,IAAA,gCAAoB,EAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,WAAW,GAAG,IAAA,8BAAkB,EAAC,QAAQ,CAAC,CAAA;QAChD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QAChE,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QAEtE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;YACnE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,WAAW,kCAAkC,CAAC,CAAA;YAC7G,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS;gBACT,OAAO;gBACP,OAAO,EAAE,OAAO,IAAI,SAAS;gBAC7B,KAAK;gBACL,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,IAAA,+BAAkB,EAAC,YAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC9E,GAAG,EAAE,GAAG,IAAI,SAAS;gBACrB,OAAO,EAAE,WAAW,EAAE,IAAI;gBAC1B,YAAY,EAAE,WAAW,EAAE,KAAK,IAAI,SAAS;gBAC7C,aAAa,EAAE,WAAW,EAAE,MAAM,IAAI,SAAS;gBAC/C,YAAY,EAAE,WAAW,EAAE,KAAK;gBAChC,YAAY,EAAE,WAAW,EAAE,KAAK;gBAChC,SAAS,EAAE,aAAa;gBACxB,UAAU;gBACV,aAAa;gBACb,GAAG,QAAQ;aACZ,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,WAAW,mCAAmC,CAAC,CAAA;YAC9G,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5E,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC9F,KAAK;gBACL,MAAM,EAAE,eAAe;oBACrB,CAAC,CAAC,IAAA,+BAAkB,EAAC,YAAa,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAClG,CAAC,CAAC,SAAS;gBACb,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;gBAClF,OAAO,EAAE,WAAW,EAAE,IAAI;gBAC1B,YAAY,EAAE,WAAW,EAAE,KAAK,IAAI,SAAS;gBAC7C,aAAa,EAAE,WAAW,EAAE,MAAM,IAAI,SAAS;gBAC/C,YAAY,EAAE,WAAW,EAAE,KAAK;gBAChC,YAAY,EAAE,WAAW,EAAE,KAAK;gBAChC,SAAS,EAAE,aAAa;gBACxB,UAAU;gBACV,aAAa;gBACb,GAAG,QAAQ;aACZ,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CACtB,QAAiC,EACjC,KAAsB,EACtB,WAAmB;IAEnB,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAA;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAA;IACnD,MAAM,SAAS,GAAG,IAAA,mBAAY,EAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC7D,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;IAC/F,MAAM,OAAO,GAAG,IAAA,mBAAY,EAAC,SAAS,GAAG,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC7E,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM;QAC3E,CAAC,CAAC,QAAQ,CAAC,MAAM;QACjB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAA;IAExE,MAAM,MAAM,GAAoB,EAAE,CAAA;IAClC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAA,mBAAY,EAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAA,mBAAY,EAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;QACjG,IAAI,GAAG,GAAG,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK;gBACL,KAAK,EAAE,GAAG,GAAG,KAAK;gBAClB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;aACxC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,MAAyB,EACzB,MAAyB,EACzB,QAA4B;IAE5B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAS,CAAA;IACjC,MAAM,QAAQ,GAAG,IAAA,yBAAY,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAM;IAErB,MAAM,QAAQ,GAAG,IAAA,4BAAgB,EAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACrD,IAAI,QAAQ,EAAE,OAAO,KAAK,KAAK;QAAE,OAAM;IAEvC,MAAM,SAAS,GAAG,IAAA,8BAAiB,EAAC,QAAQ,CAAC,CAAA;IAC7C,MAAM,YAAY,GAAG,IAAA,yBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAA,+BAAkB,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5E,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAA;IAElC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAA;IACtC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAA;IAC9D,MAAM,SAAS,GAAG,IAAA,mBAAY,EAAC,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;IAChE,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;IAClG,MAAM,OAAO,GAAG,IAAA,mBAAY,EAAC,SAAS,GAAG,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;IAEhF,IAAI,OAAO,GAAoB,IAAI,CAAA;IACnC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,SAAS,IAAI,YAAY,CAAC,WAAW,CAAC,CAAA;QACrD,OAAO,GAAG,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QAC/D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAM;IAChC,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;IAClC,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,yBAAa,EAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,eAAe,GAAG,YAAY,IAAI,QAAQ,EAAE,YAAY,KAAK,KAAK,CAAA;IACxE,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,IAAA,+BAAkB,EAAC,YAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAErF,MAAM,CAAC,IAAI,CAAC;QACV,SAAS;QACT,OAAO,EAAE,OAAO,IAAI,SAAS;QAC7B,KAAK;QACL,MAAM;QACN,SAAS,EAAE,IAAA,qBAAc,EAAC,MAAM,CAAC,WAAY,EAAE,oBAAoB,CAAC;QACpE,WAAW,EAAE,QAAQ,EAAE,WAAW,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,IAAI,IAAI,IAAI,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;QAClG,SAAS,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAU,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACtH,YAAY,EAAE,OAAO;QACrB,QAAQ;KACT,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAS,KAAK,CAAC,CAAA;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IAC1C,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CACxB,MAAgB,EAChB,KAAa,EACb,GAAW,EACX,MAAyB;IAEzB,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAA;IACzB,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAExB,IAAI,MAAM,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;QACnC,yCAAyC;QACzC,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAA;QACnC,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ThreeObject3DLike } from './types';
2
+ /**
3
+ * CPU-side skeletal skinning for SkinnedMesh.
4
+ * Supports Three.js SkinnedMesh, @pixiv/three-vrm, and VRMA animations.
5
+ *
6
+ * Three.js bone transform formula per vertex:
7
+ * boneMatrix[i] = skeleton.bones[i].matrixWorld * skeleton.boneInverses[i]
8
+ * skinMatrix = sum(weight[i] * boneMatrix[skinIndex[i]])
9
+ * worldPos = mesh.bindMatrixInverse * skinMatrix * mesh.bindMatrix * localPos
10
+ */
11
+ export declare function applyCpuSkinning(mesh: ThreeObject3DLike, positions: number[], normals: number[] | null): {
12
+ positions: number[];
13
+ normals: number[] | null;
14
+ };
15
+ //# sourceMappingURL=skinning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skinning.d.ts","sourceRoot":"","sources":["../api/skinning.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAQ,MAAM,SAAS,CAAA;AAItD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,iBAAiB,EACvB,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,GACvB;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CAyFnD"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyCpuSkinning = applyCpuSkinning;
4
+ const math_1 = require("./math");
5
+ const attributes_1 = require("./attributes");
6
+ /**
7
+ * CPU-side skeletal skinning for SkinnedMesh.
8
+ * Supports Three.js SkinnedMesh, @pixiv/three-vrm, and VRMA animations.
9
+ *
10
+ * Three.js bone transform formula per vertex:
11
+ * boneMatrix[i] = skeleton.bones[i].matrixWorld * skeleton.boneInverses[i]
12
+ * skinMatrix = sum(weight[i] * boneMatrix[skinIndex[i]])
13
+ * worldPos = mesh.bindMatrixInverse * skinMatrix * mesh.bindMatrix * localPos
14
+ */
15
+ function applyCpuSkinning(mesh, positions, normals) {
16
+ const geometry = mesh.geometry;
17
+ const skeleton = mesh.skeleton;
18
+ const skinIndexAttr = (0, attributes_1.getAttribute)(geometry, 'skinIndex');
19
+ const skinWeightAttr = (0, attributes_1.getAttribute)(geometry, 'skinWeight');
20
+ if (!skinIndexAttr || !skinWeightAttr || !skeleton) {
21
+ return { positions, normals };
22
+ }
23
+ if (typeof skeleton.update === 'function') {
24
+ skeleton.update();
25
+ }
26
+ const bones = skeleton.bones;
27
+ const boneInverses = skeleton.boneInverses;
28
+ if (!bones || !boneInverses || bones.length === 0) {
29
+ return { positions, normals };
30
+ }
31
+ const boneCount = bones.length;
32
+ const boneMatrices = new Array(boneCount);
33
+ for (let i = 0; i < boneCount; i++) {
34
+ const boneWorld = bones[i]?.matrixWorld?.elements;
35
+ const boneInv = boneInverses[i]?.elements;
36
+ if (!boneWorld || !boneInv) {
37
+ boneMatrices[i] = math_1.IDENTITY_4X4;
38
+ continue;
39
+ }
40
+ boneMatrices[i] = (0, math_1.multiplyMatrices)(Array.from(boneWorld), Array.from(boneInv));
41
+ }
42
+ const bindMatrix = mesh.bindMatrix?.elements
43
+ ? Array.from(mesh.bindMatrix.elements)
44
+ : math_1.IDENTITY_4X4;
45
+ const bindMatrixInverse = mesh.bindMatrixInverse?.elements
46
+ ? Array.from(mesh.bindMatrixInverse.elements)
47
+ : (0, math_1.invertMatrix4)(bindMatrix);
48
+ const vertexCount = positions.length / 3;
49
+ const skinnedPositions = new Array(positions.length);
50
+ const skinnedNormals = normals ? new Array(normals.length) : null;
51
+ for (let vi = 0; vi < vertexCount; vi++) {
52
+ const ji0 = Math.floor((0, attributes_1.attributeComponent)(skinIndexAttr, vi, 0));
53
+ const ji1 = Math.floor((0, attributes_1.attributeComponent)(skinIndexAttr, vi, 1));
54
+ const ji2 = Math.floor((0, attributes_1.attributeComponent)(skinIndexAttr, vi, 2));
55
+ const ji3 = Math.floor((0, attributes_1.attributeComponent)(skinIndexAttr, vi, 3));
56
+ const jw0 = (0, attributes_1.attributeComponent)(skinWeightAttr, vi, 0);
57
+ const jw1 = (0, attributes_1.attributeComponent)(skinWeightAttr, vi, 1);
58
+ const jw2 = (0, attributes_1.attributeComponent)(skinWeightAttr, vi, 2);
59
+ const jw3 = (0, attributes_1.attributeComponent)(skinWeightAttr, vi, 3);
60
+ const skinMatrix = (0, math_1.blendBoneMatrices)(boneMatrices, boneCount, ji0, ji1, ji2, ji3, jw0, jw1, jw2, jw3);
61
+ const finalMatrix = (0, math_1.multiplyMatrices)(bindMatrixInverse, (0, math_1.multiplyMatrices)(skinMatrix, bindMatrix));
62
+ const px = positions[vi * 3];
63
+ const py = positions[vi * 3 + 1];
64
+ const pz = positions[vi * 3 + 2];
65
+ skinnedPositions[vi * 3] = finalMatrix[0] * px + finalMatrix[4] * py + finalMatrix[8] * pz + finalMatrix[12];
66
+ skinnedPositions[vi * 3 + 1] = finalMatrix[1] * px + finalMatrix[5] * py + finalMatrix[9] * pz + finalMatrix[13];
67
+ skinnedPositions[vi * 3 + 2] = finalMatrix[2] * px + finalMatrix[6] * py + finalMatrix[10] * pz + finalMatrix[14];
68
+ if (normals && skinnedNormals) {
69
+ const nx = normals[vi * 3];
70
+ const ny = normals[vi * 3 + 1];
71
+ const nz = normals[vi * 3 + 2];
72
+ let snx = finalMatrix[0] * nx + finalMatrix[4] * ny + finalMatrix[8] * nz;
73
+ let sny = finalMatrix[1] * nx + finalMatrix[5] * ny + finalMatrix[9] * nz;
74
+ let snz = finalMatrix[2] * nx + finalMatrix[6] * ny + finalMatrix[10] * nz;
75
+ const len = Math.sqrt(snx * snx + sny * sny + snz * snz);
76
+ if (len > 1e-8) {
77
+ snx /= len;
78
+ sny /= len;
79
+ snz /= len;
80
+ }
81
+ skinnedNormals[vi * 3] = snx;
82
+ skinnedNormals[vi * 3 + 1] = sny;
83
+ skinnedNormals[vi * 3 + 2] = snz;
84
+ }
85
+ }
86
+ return { positions: skinnedPositions, normals: skinnedNormals };
87
+ }
88
+ //# sourceMappingURL=skinning.js.map