@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.
- package/LICENSE +21 -0
- package/README.md +201 -1
- package/dist/attributes.d.ts +8 -0
- package/dist/attributes.d.ts.map +1 -0
- package/dist/attributes.js +91 -0
- package/dist/attributes.js.map +1 -0
- package/dist/camera.d.ts +8 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +53 -0
- package/dist/camera.js.map +1 -0
- package/dist/color.d.ts +5 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +36 -0
- package/dist/color.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/lights.d.ts +5 -0
- package/dist/lights.d.ts.map +1 -0
- package/dist/lights.js +186 -0
- package/dist/lights.js.map +1 -0
- package/dist/materials.d.ts +18 -0
- package/dist/materials.d.ts.map +1 -0
- package/dist/materials.js +268 -0
- package/dist/materials.js.map +1 -0
- package/dist/math.d.ts +14 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +137 -0
- package/dist/math.js.map +1 -0
- package/dist/morphs.d.ts +22 -0
- package/dist/morphs.d.ts.map +1 -0
- package/dist/morphs.js +108 -0
- package/dist/morphs.js.map +1 -0
- package/dist/scene.d.ts +3 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +220 -0
- package/dist/scene.js.map +1 -0
- package/dist/skinning.d.ts +15 -0
- package/dist/skinning.d.ts.map +1 -0
- package/dist/skinning.js +88 -0
- package/dist/skinning.js.map +1 -0
- package/dist/types.d.ts +313 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/native.d.ts +178 -0
- package/native.js +580 -0
- 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
|
package/dist/math.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../api/math.ts"],"names":[],"mappings":"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"}
|
package/dist/morphs.d.ts
ADDED
|
@@ -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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"}
|
package/dist/scene.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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"}
|
package/dist/skinning.js
ADDED
|
@@ -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
|