@tinypoly/gpu-renderer 0.0.0-stage → 0.0.1
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/ARCHITECTURE.md +339 -0
- package/LICENSE +21 -0
- package/README.md +284 -2
- package/dist/accumulator.d.ts +27 -0
- package/dist/accumulator.d.ts.map +1 -0
- package/dist/accumulator.js +57 -0
- package/dist/accumulator.js.map +1 -0
- package/dist/bvh.d.ts +26 -0
- package/dist/bvh.d.ts.map +1 -0
- package/dist/bvh.js +296 -0
- package/dist/bvh.js.map +1 -0
- package/dist/bvhBuilder.d.ts +72 -0
- package/dist/bvhBuilder.d.ts.map +1 -0
- package/dist/bvhBuilder.js +126 -0
- package/dist/bvhBuilder.js.map +1 -0
- package/dist/bvhWorker.d.ts +2 -0
- package/dist/bvhWorker.d.ts.map +1 -0
- package/dist/bvhWorker.js +8 -0
- package/dist/bvhWorker.js.map +1 -0
- package/dist/camera.d.ts +29 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +48 -0
- package/dist/camera.js.map +1 -0
- package/dist/canvas.d.ts +9 -0
- package/dist/canvas.d.ts.map +1 -0
- package/dist/canvas.js +11 -0
- package/dist/canvas.js.map +1 -0
- package/dist/denoise.d.ts +69 -0
- package/dist/denoise.d.ts.map +1 -0
- package/dist/denoise.js +455 -0
- package/dist/denoise.js.map +1 -0
- package/dist/device.d.ts +37 -0
- package/dist/device.d.ts.map +1 -0
- package/dist/device.js +52 -0
- package/dist/device.js.map +1 -0
- package/dist/dispatchScheduler.d.ts +43 -0
- package/dist/dispatchScheduler.d.ts.map +1 -0
- package/dist/dispatchScheduler.js +49 -0
- package/dist/dispatchScheduler.js.map +1 -0
- package/dist/environment.d.ts +39 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +168 -0
- package/dist/environment.js.map +1 -0
- package/dist/frameLayout.d.ts +4 -0
- package/dist/frameLayout.d.ts.map +1 -0
- package/dist/frameLayout.js +58 -0
- package/dist/frameLayout.js.map +1 -0
- package/dist/geometry.d.ts +75 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +799 -0
- package/dist/geometry.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/lights.d.ts +64 -0
- package/dist/lights.d.ts.map +1 -0
- package/dist/lights.js +264 -0
- package/dist/lights.js.map +1 -0
- package/dist/materialLayout.d.ts +143 -0
- package/dist/materialLayout.d.ts.map +1 -0
- package/dist/materialLayout.js +297 -0
- package/dist/materialLayout.js.map +1 -0
- package/dist/math.d.ts +10 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +40 -0
- package/dist/math.js.map +1 -0
- package/dist/pathTracePass.d.ts +27 -0
- package/dist/pathTracePass.d.ts.map +1 -0
- package/dist/pathTracePass.js +83 -0
- package/dist/pathTracePass.js.map +1 -0
- package/dist/planarCapture.d.ts +38 -0
- package/dist/planarCapture.d.ts.map +1 -0
- package/dist/planarCapture.js +163 -0
- package/dist/planarCapture.js.map +1 -0
- package/dist/presentPass.d.ts +31 -0
- package/dist/presentPass.d.ts.map +1 -0
- package/dist/presentPass.js +78 -0
- package/dist/presentPass.js.map +1 -0
- package/dist/renderer.d.ts +209 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +847 -0
- package/dist/renderer.js.map +1 -0
- package/dist/sceneAssets.d.ts +24 -0
- package/dist/sceneAssets.d.ts.map +1 -0
- package/dist/sceneAssets.js +77 -0
- package/dist/sceneAssets.js.map +1 -0
- package/dist/sceneUpload.d.ts +61 -0
- package/dist/sceneUpload.d.ts.map +1 -0
- package/dist/sceneUpload.js +98 -0
- package/dist/sceneUpload.js.map +1 -0
- package/dist/shaderModule.d.ts +7 -0
- package/dist/shaderModule.d.ts.map +1 -0
- package/dist/shaderModule.js +19 -0
- package/dist/shaderModule.js.map +1 -0
- package/dist/shaderProgram.d.ts +124 -0
- package/dist/shaderProgram.d.ts.map +1 -0
- package/dist/shaderProgram.js +1030 -0
- package/dist/shaderProgram.js.map +1 -0
- package/dist/structLayout.d.ts +28 -0
- package/dist/structLayout.d.ts.map +1 -0
- package/dist/structLayout.js +58 -0
- package/dist/structLayout.js.map +1 -0
- package/dist/texturePack.d.ts +54 -0
- package/dist/texturePack.d.ts.map +1 -0
- package/dist/texturePack.js +86 -0
- package/dist/texturePack.js.map +1 -0
- package/dist/upstream.d.ts +7 -0
- package/dist/upstream.d.ts.map +1 -0
- package/dist/upstream.js +11 -0
- package/dist/upstream.js.map +1 -0
- package/dist/volumetric.d.ts +10 -0
- package/dist/volumetric.d.ts.map +1 -0
- package/dist/volumetric.js +34 -0
- package/dist/volumetric.js.map +1 -0
- package/dist/wgsl/bsdf.wgsl.d.ts +13 -0
- package/dist/wgsl/bsdf.wgsl.d.ts.map +1 -0
- package/dist/wgsl/bsdf.wgsl.js +619 -0
- package/dist/wgsl/bsdf.wgsl.js.map +1 -0
- package/dist/wgsl/bvh.wgsl.d.ts +3 -0
- package/dist/wgsl/bvh.wgsl.d.ts.map +1 -0
- package/dist/wgsl/bvh.wgsl.js +218 -0
- package/dist/wgsl/bvh.wgsl.js.map +1 -0
- package/dist/wgsl/common.wgsl.d.ts +3 -0
- package/dist/wgsl/common.wgsl.d.ts.map +1 -0
- package/dist/wgsl/common.wgsl.js +193 -0
- package/dist/wgsl/common.wgsl.js.map +1 -0
- package/dist/wgsl/environment.wgsl.d.ts +10 -0
- package/dist/wgsl/environment.wgsl.d.ts.map +1 -0
- package/dist/wgsl/environment.wgsl.js +145 -0
- package/dist/wgsl/environment.wgsl.js.map +1 -0
- package/dist/wgsl/lights.wgsl.d.ts +10 -0
- package/dist/wgsl/lights.wgsl.d.ts.map +1 -0
- package/dist/wgsl/lights.wgsl.js +434 -0
- package/dist/wgsl/lights.wgsl.js.map +1 -0
- package/dist/wgsl/pathTrace.wgsl.d.ts +14 -0
- package/dist/wgsl/pathTrace.wgsl.d.ts.map +1 -0
- package/dist/wgsl/pathTrace.wgsl.js +1020 -0
- package/dist/wgsl/pathTrace.wgsl.js.map +1 -0
- package/dist/wgsl/present.wgsl.d.ts +7 -0
- package/dist/wgsl/present.wgsl.d.ts.map +1 -0
- package/dist/wgsl/present.wgsl.js +154 -0
- package/dist/wgsl/present.wgsl.js.map +1 -0
- package/dist/wgsl/random.wgsl.d.ts +9 -0
- package/dist/wgsl/random.wgsl.d.ts.map +1 -0
- package/dist/wgsl/random.wgsl.js +91 -0
- package/dist/wgsl/random.wgsl.js.map +1 -0
- package/dist/wgsl/sampling.wgsl.d.ts +3 -0
- package/dist/wgsl/sampling.wgsl.d.ts.map +1 -0
- package/dist/wgsl/sampling.wgsl.js +31 -0
- package/dist/wgsl/sampling.wgsl.js.map +1 -0
- package/dist/wgsl/shaderSupport.wgsl.d.ts +6 -0
- package/dist/wgsl/shaderSupport.wgsl.d.ts.map +1 -0
- package/dist/wgsl/shaderSupport.wgsl.js +120 -0
- package/dist/wgsl/shaderSupport.wgsl.js.map +1 -0
- package/dist/wgsl/surface.wgsl.d.ts +10 -0
- package/dist/wgsl/surface.wgsl.d.ts.map +1 -0
- package/dist/wgsl/surface.wgsl.js +794 -0
- package/dist/wgsl/surface.wgsl.js.map +1 -0
- package/dist/wgsl/texture.wgsl.d.ts +11 -0
- package/dist/wgsl/texture.wgsl.d.ts.map +1 -0
- package/dist/wgsl/texture.wgsl.js +132 -0
- package/dist/wgsl/texture.wgsl.js.map +1 -0
- package/package.json +77 -3
- package/src/accumulator.ts +64 -0
- package/src/bvh.ts +336 -0
- package/src/bvhBuilder.ts +178 -0
- package/src/bvhWorker.ts +13 -0
- package/src/camera.ts +77 -0
- package/src/canvas.ts +13 -0
- package/src/denoise.ts +514 -0
- package/src/device.ts +81 -0
- package/src/dispatchScheduler.ts +71 -0
- package/src/environment.ts +233 -0
- package/src/frameLayout.ts +59 -0
- package/src/geometry.ts +1067 -0
- package/src/index.ts +64 -0
- package/src/lights.ts +365 -0
- package/src/materialLayout.ts +408 -0
- package/src/math.ts +48 -0
- package/src/pathTracePass.ts +97 -0
- package/src/planarCapture.ts +225 -0
- package/src/presentPass.ts +99 -0
- package/src/renderer.ts +1145 -0
- package/src/sceneAssets.ts +118 -0
- package/src/sceneUpload.ts +185 -0
- package/src/shaderModule.ts +19 -0
- package/src/shaderProgram.ts +1370 -0
- package/src/structLayout.ts +93 -0
- package/src/texturePack.ts +152 -0
- package/src/upstream.ts +56 -0
- package/src/volumetric.ts +42 -0
- package/src/wgsl/bsdf.wgsl.ts +618 -0
- package/src/wgsl/bvh.wgsl.ts +217 -0
- package/src/wgsl/common.wgsl.ts +193 -0
- package/src/wgsl/environment.wgsl.ts +144 -0
- package/src/wgsl/lights.wgsl.ts +433 -0
- package/src/wgsl/pathTrace.wgsl.ts +1019 -0
- package/src/wgsl/present.wgsl.ts +153 -0
- package/src/wgsl/random.wgsl.ts +90 -0
- package/src/wgsl/sampling.wgsl.ts +30 -0
- package/src/wgsl/shaderSupport.wgsl.ts +119 -0
- package/src/wgsl/surface.wgsl.ts +793 -0
- package/src/wgsl/texture.wgsl.ts +131 -0
package/dist/bvh.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Binned SAH bounding volume hierarchy, built straight into the layout the shader reads: eight words per node, the
|
|
3
|
+
* first four a minimum corner and a left child or leaf start, the last four a maximum corner and a right child or
|
|
4
|
+
* triangle count, matching `struct BvhNode` in `wgsl/bvh.wgsl.ts`.
|
|
5
|
+
*
|
|
6
|
+
* The bounds are computed from the same `Float32Array` the shader traverses, so every corner is already a float and
|
|
7
|
+
* needs no widening. Building from double precision positions, as the CPU renderer does, would need each minimum
|
|
8
|
+
* rounded down and each maximum rounded up before they reach the GPU.
|
|
9
|
+
*/
|
|
10
|
+
/** Words per node in the packed buffer. */
|
|
11
|
+
export const NODE_WORDS = 8;
|
|
12
|
+
/** Triangles a leaf may hold. */
|
|
13
|
+
const MAX_LEAF_SIZE = 4;
|
|
14
|
+
/** Candidate split positions evaluated per axis. */
|
|
15
|
+
const BIN_COUNT = 12;
|
|
16
|
+
/** What descending one more level costs, relative to intersecting one triangle. */
|
|
17
|
+
const TRAVERSAL_COST = 0.125;
|
|
18
|
+
/**
|
|
19
|
+
* Deepest node the builder produces. The shader traverses with a fixed stack, and one entry per level is enough
|
|
20
|
+
* because a node only pushes its far child. Depth is capped rather than trusted.
|
|
21
|
+
*/
|
|
22
|
+
export const MAX_BVH_DEPTH = 32;
|
|
23
|
+
/** Per-triangle bounds and centroids, the only inputs the split needs. */
|
|
24
|
+
function triangleBounds(positions, triangleCount) {
|
|
25
|
+
const min = new Float32Array(triangleCount * 3);
|
|
26
|
+
const max = new Float32Array(triangleCount * 3);
|
|
27
|
+
const centroid = new Float64Array(triangleCount * 3);
|
|
28
|
+
for (let triangle = 0; triangle < triangleCount; triangle++) {
|
|
29
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
30
|
+
const a = positions[triangle * 9 + axis];
|
|
31
|
+
const b = positions[triangle * 9 + 3 + axis];
|
|
32
|
+
const c = positions[triangle * 9 + 6 + axis];
|
|
33
|
+
min[triangle * 3 + axis] = Math.min(a, b, c);
|
|
34
|
+
max[triangle * 3 + axis] = Math.max(a, b, c);
|
|
35
|
+
centroid[triangle * 3 + axis] = (a + b + c) / 3;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { min, max, centroid };
|
|
39
|
+
}
|
|
40
|
+
export function buildBvh(positions, triangleCount) {
|
|
41
|
+
const order = new Uint32Array(triangleCount);
|
|
42
|
+
for (let i = 0; i < triangleCount; i++)
|
|
43
|
+
order[i] = i;
|
|
44
|
+
if (triangleCount === 0)
|
|
45
|
+
return { nodes: new ArrayBuffer(0), nodeCount: 0, order, maxDepth: 0 };
|
|
46
|
+
const { min, max, centroid } = triangleBounds(positions, triangleCount);
|
|
47
|
+
// The heuristic may split down to one triangle per leaf, so the pool starts at the common case and grows.
|
|
48
|
+
let nodes = new ArrayBuffer(Math.max(4, Math.ceil(triangleCount / 2)) * NODE_WORDS * 4);
|
|
49
|
+
let floats = new Float32Array(nodes);
|
|
50
|
+
let ints = new Int32Array(nodes);
|
|
51
|
+
const reserve = (needed) => {
|
|
52
|
+
if (needed * NODE_WORDS * 4 <= nodes.byteLength)
|
|
53
|
+
return;
|
|
54
|
+
const grown = new ArrayBuffer(Math.max(needed, Math.ceil(nodes.byteLength / (NODE_WORDS * 4) * 1.6))
|
|
55
|
+
* NODE_WORDS * 4);
|
|
56
|
+
new Float32Array(grown).set(floats);
|
|
57
|
+
nodes = grown;
|
|
58
|
+
floats = new Float32Array(nodes);
|
|
59
|
+
ints = new Int32Array(nodes);
|
|
60
|
+
};
|
|
61
|
+
// The pending ranges, four integers each: start, count, node and depth. Typed, so the loop allocates nothing.
|
|
62
|
+
let stack = new Int32Array(4 * 2 * MAX_BVH_DEPTH + 8);
|
|
63
|
+
let top = 1;
|
|
64
|
+
const bins = new Bins();
|
|
65
|
+
let nodeCount = 1;
|
|
66
|
+
let maxDepth = 0;
|
|
67
|
+
stack[0] = 0;
|
|
68
|
+
stack[1] = triangleCount;
|
|
69
|
+
stack[2] = 0;
|
|
70
|
+
stack[3] = 0;
|
|
71
|
+
while (top) {
|
|
72
|
+
top--;
|
|
73
|
+
const start = stack[top * 4], count = stack[top * 4 + 1], node = stack[top * 4 + 2], depth = stack[top * 4 + 3];
|
|
74
|
+
const end = start + count;
|
|
75
|
+
if (depth > maxDepth)
|
|
76
|
+
maxDepth = depth;
|
|
77
|
+
// The node's bounds and its centroids' bounds, in one pass. Doubles, so the corners are exactly the floats read.
|
|
78
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity, maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
79
|
+
let cMinX = Infinity, cMinY = Infinity, cMinZ = Infinity, cMaxX = -Infinity, cMaxY = -Infinity, cMaxZ = -Infinity;
|
|
80
|
+
for (let i = start; i < end; i++) {
|
|
81
|
+
const triangle = order[i] * 3;
|
|
82
|
+
let value = min[triangle];
|
|
83
|
+
if (value < minX)
|
|
84
|
+
minX = value;
|
|
85
|
+
value = min[triangle + 1];
|
|
86
|
+
if (value < minY)
|
|
87
|
+
minY = value;
|
|
88
|
+
value = min[triangle + 2];
|
|
89
|
+
if (value < minZ)
|
|
90
|
+
minZ = value;
|
|
91
|
+
value = max[triangle];
|
|
92
|
+
if (value > maxX)
|
|
93
|
+
maxX = value;
|
|
94
|
+
value = max[triangle + 1];
|
|
95
|
+
if (value > maxY)
|
|
96
|
+
maxY = value;
|
|
97
|
+
value = max[triangle + 2];
|
|
98
|
+
if (value > maxZ)
|
|
99
|
+
maxZ = value;
|
|
100
|
+
value = centroid[triangle];
|
|
101
|
+
if (value < cMinX)
|
|
102
|
+
cMinX = value;
|
|
103
|
+
if (value > cMaxX)
|
|
104
|
+
cMaxX = value;
|
|
105
|
+
value = centroid[triangle + 1];
|
|
106
|
+
if (value < cMinY)
|
|
107
|
+
cMinY = value;
|
|
108
|
+
if (value > cMaxY)
|
|
109
|
+
cMaxY = value;
|
|
110
|
+
value = centroid[triangle + 2];
|
|
111
|
+
if (value < cMinZ)
|
|
112
|
+
cMinZ = value;
|
|
113
|
+
if (value > cMaxZ)
|
|
114
|
+
cMaxZ = value;
|
|
115
|
+
}
|
|
116
|
+
const word = node * NODE_WORDS;
|
|
117
|
+
floats[word] = minX;
|
|
118
|
+
floats[word + 1] = minY;
|
|
119
|
+
floats[word + 2] = minZ;
|
|
120
|
+
floats[word + 4] = maxX;
|
|
121
|
+
floats[word + 5] = maxY;
|
|
122
|
+
floats[word + 6] = maxZ;
|
|
123
|
+
let split = -1;
|
|
124
|
+
if (count > MAX_LEAF_SIZE && depth + 1 < MAX_BVH_DEPTH) {
|
|
125
|
+
bins.centroidMin[0] = cMinX;
|
|
126
|
+
bins.centroidMin[1] = cMinY;
|
|
127
|
+
bins.centroidMin[2] = cMinZ;
|
|
128
|
+
bins.centroidMax[0] = cMaxX;
|
|
129
|
+
bins.centroidMax[1] = cMaxY;
|
|
130
|
+
bins.centroidMax[2] = cMaxZ;
|
|
131
|
+
split = partition(order, centroid, min, max, start, end, area(minX, minY, minZ, maxX, maxY, maxZ), bins);
|
|
132
|
+
}
|
|
133
|
+
if (split < 0) {
|
|
134
|
+
// A leaf points into `order` instead of into the node array, which the sign of the first link tells apart.
|
|
135
|
+
ints[word + 3] = -1 - start;
|
|
136
|
+
ints[word + 7] = count;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
reserve(nodeCount + 2);
|
|
140
|
+
const left = nodeCount++;
|
|
141
|
+
const right = nodeCount++;
|
|
142
|
+
ints[word + 3] = left;
|
|
143
|
+
ints[word + 7] = right;
|
|
144
|
+
if ((top + 2) * 4 > stack.length) {
|
|
145
|
+
const grown = new Int32Array(stack.length * 2);
|
|
146
|
+
grown.set(stack);
|
|
147
|
+
stack = grown;
|
|
148
|
+
}
|
|
149
|
+
// Left first, then right, so the right side is built first, as the order the tree was always built in.
|
|
150
|
+
stack.set([start, split - start, left, depth + 1, split, end - split, right, depth + 1], top * 4);
|
|
151
|
+
top += 2;
|
|
152
|
+
}
|
|
153
|
+
return { nodes: nodes.slice(0, nodeCount * NODE_WORDS * 4), nodeCount, order, maxDepth };
|
|
154
|
+
}
|
|
155
|
+
/** Surface area, the cost the split heuristic weighs each side by. Empty bounds cost nothing. */
|
|
156
|
+
function area(minX, minY, minZ, maxX, maxY, maxZ) {
|
|
157
|
+
const x = maxX - minX, y = maxY - minY, z = maxZ - minZ;
|
|
158
|
+
return x < 0 || y < 0 || z < 0 ? 0 : 2 * (x * y + y * z + z * x);
|
|
159
|
+
}
|
|
160
|
+
/** Scratch space for one split, kept across every node so binning allocates nothing. */
|
|
161
|
+
class Bins {
|
|
162
|
+
centroidMin = new Float64Array(3);
|
|
163
|
+
centroidMax = new Float64Array(3);
|
|
164
|
+
/** Six doubles per bin and axis: the minimum corner, then the maximum. */
|
|
165
|
+
bounds = new Float64Array(3 * BIN_COUNT * 6);
|
|
166
|
+
counts = new Int32Array(3 * BIN_COUNT);
|
|
167
|
+
rightArea = new Float64Array(BIN_COUNT);
|
|
168
|
+
rightCount = new Int32Array(BIN_COUNT);
|
|
169
|
+
scale = new Float64Array(3);
|
|
170
|
+
reset() {
|
|
171
|
+
const bounds = this.bounds;
|
|
172
|
+
for (let i = 0; i < bounds.length; i += 6) {
|
|
173
|
+
bounds[i] = bounds[i + 1] = bounds[i + 2] = Infinity;
|
|
174
|
+
bounds[i + 3] = bounds[i + 4] = bounds[i + 5] = -Infinity;
|
|
175
|
+
}
|
|
176
|
+
this.counts.fill(0);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Reorders `order` in place so the range splits in two, and returns where the right side starts, or -1 when no split
|
|
181
|
+
* beats keeping the range as a leaf. Bins the centroids on all three axes in one pass and sweeps the surface area
|
|
182
|
+
* heuristic on each.
|
|
183
|
+
*/
|
|
184
|
+
function partition(order, centroid, min, max, start, end, parentArea, bins) {
|
|
185
|
+
if (parentArea <= 0)
|
|
186
|
+
return -1;
|
|
187
|
+
const { centroidMin, centroidMax, bounds, counts, rightArea, rightCount, scale } = bins;
|
|
188
|
+
let binned = false;
|
|
189
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
190
|
+
const extent = centroidMax[axis] - centroidMin[axis];
|
|
191
|
+
// Every centroid sits at the same place on this axis: no split here separates anything.
|
|
192
|
+
scale[axis] = extent > 0 ? BIN_COUNT / extent : 0;
|
|
193
|
+
binned ||= extent > 0;
|
|
194
|
+
}
|
|
195
|
+
if (!binned)
|
|
196
|
+
return -1;
|
|
197
|
+
bins.reset();
|
|
198
|
+
for (let i = start; i < end; i++) {
|
|
199
|
+
const triangle = order[i] * 3;
|
|
200
|
+
const x0 = min[triangle], y0 = min[triangle + 1], z0 = min[triangle + 2];
|
|
201
|
+
const x1 = max[triangle], y1 = max[triangle + 1], z1 = max[triangle + 2];
|
|
202
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
203
|
+
if (scale[axis] === 0)
|
|
204
|
+
continue;
|
|
205
|
+
const bin = axis * BIN_COUNT + binOf(centroid[triangle + axis], centroidMin[axis], scale[axis]);
|
|
206
|
+
const at = bin * 6;
|
|
207
|
+
counts[bin]++;
|
|
208
|
+
if (x0 < bounds[at])
|
|
209
|
+
bounds[at] = x0;
|
|
210
|
+
if (y0 < bounds[at + 1])
|
|
211
|
+
bounds[at + 1] = y0;
|
|
212
|
+
if (z0 < bounds[at + 2])
|
|
213
|
+
bounds[at + 2] = z0;
|
|
214
|
+
if (x1 > bounds[at + 3])
|
|
215
|
+
bounds[at + 3] = x1;
|
|
216
|
+
if (y1 > bounds[at + 4])
|
|
217
|
+
bounds[at + 4] = y1;
|
|
218
|
+
if (z1 > bounds[at + 5])
|
|
219
|
+
bounds[at + 5] = z1;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Splitting costs a traversal step, so a split only wins when it beats shading the whole range as one leaf.
|
|
223
|
+
let bestCost = end - start, bestAxis = -1, bestBin = -1;
|
|
224
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
225
|
+
if (scale[axis] === 0)
|
|
226
|
+
continue;
|
|
227
|
+
// Sweeping once from each side turns the heuristic into two passes instead of one per candidate split.
|
|
228
|
+
let minX = Infinity, minY = Infinity, minZ = Infinity, maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
|
|
229
|
+
let running = 0;
|
|
230
|
+
for (let bin = BIN_COUNT - 1; bin > 0; bin--) {
|
|
231
|
+
const at = (axis * BIN_COUNT + bin) * 6;
|
|
232
|
+
if (bounds[at] < minX)
|
|
233
|
+
minX = bounds[at];
|
|
234
|
+
if (bounds[at + 1] < minY)
|
|
235
|
+
minY = bounds[at + 1];
|
|
236
|
+
if (bounds[at + 2] < minZ)
|
|
237
|
+
minZ = bounds[at + 2];
|
|
238
|
+
if (bounds[at + 3] > maxX)
|
|
239
|
+
maxX = bounds[at + 3];
|
|
240
|
+
if (bounds[at + 4] > maxY)
|
|
241
|
+
maxY = bounds[at + 4];
|
|
242
|
+
if (bounds[at + 5] > maxZ)
|
|
243
|
+
maxZ = bounds[at + 5];
|
|
244
|
+
running += counts[axis * BIN_COUNT + bin];
|
|
245
|
+
rightArea[bin] = area(minX, minY, minZ, maxX, maxY, maxZ);
|
|
246
|
+
rightCount[bin] = running;
|
|
247
|
+
}
|
|
248
|
+
minX = minY = minZ = Infinity;
|
|
249
|
+
maxX = maxY = maxZ = -Infinity;
|
|
250
|
+
running = 0;
|
|
251
|
+
for (let bin = 0; bin < BIN_COUNT - 1; bin++) {
|
|
252
|
+
const at = (axis * BIN_COUNT + bin) * 6;
|
|
253
|
+
if (bounds[at] < minX)
|
|
254
|
+
minX = bounds[at];
|
|
255
|
+
if (bounds[at + 1] < minY)
|
|
256
|
+
minY = bounds[at + 1];
|
|
257
|
+
if (bounds[at + 2] < minZ)
|
|
258
|
+
minZ = bounds[at + 2];
|
|
259
|
+
if (bounds[at + 3] > maxX)
|
|
260
|
+
maxX = bounds[at + 3];
|
|
261
|
+
if (bounds[at + 4] > maxY)
|
|
262
|
+
maxY = bounds[at + 4];
|
|
263
|
+
if (bounds[at + 5] > maxZ)
|
|
264
|
+
maxZ = bounds[at + 5];
|
|
265
|
+
running += counts[axis * BIN_COUNT + bin];
|
|
266
|
+
if (!running || !rightCount[bin + 1])
|
|
267
|
+
continue;
|
|
268
|
+
const cost = TRAVERSAL_COST
|
|
269
|
+
+ (area(minX, minY, minZ, maxX, maxY, maxZ) * running + rightArea[bin + 1] * rightCount[bin + 1]) / parentArea;
|
|
270
|
+
if (cost < bestCost) {
|
|
271
|
+
bestCost = cost;
|
|
272
|
+
bestAxis = axis;
|
|
273
|
+
bestBin = bin;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (bestAxis < 0)
|
|
278
|
+
return -1;
|
|
279
|
+
const pivot = centroidMin[bestAxis];
|
|
280
|
+
const bestScale = scale[bestAxis];
|
|
281
|
+
let left = start;
|
|
282
|
+
for (let i = start; i < end; i++) {
|
|
283
|
+
if (binOf(centroid[order[i] * 3 + bestAxis], pivot, bestScale) <= bestBin) {
|
|
284
|
+
const swap = order[i];
|
|
285
|
+
order[i] = order[left];
|
|
286
|
+
order[left] = swap;
|
|
287
|
+
left++;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// The sweep only proposes splits both sides occupy, so this is a guard against rounding, not an expected outcome.
|
|
291
|
+
return left === start || left === end ? -1 : left;
|
|
292
|
+
}
|
|
293
|
+
function binOf(value, origin, scale) {
|
|
294
|
+
return Math.min(BIN_COUNT - 1, Math.max(0, Math.floor((value - origin) * scale)));
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=bvh.js.map
|
package/dist/bvh.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bvh.js","sourceRoot":"","sources":["../src/bvh.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type PackedBvh } from "./bvh.js";
|
|
2
|
+
/** What the page sends the worker: its own copy of the positions, transferred. */
|
|
3
|
+
export interface BvhRequest {
|
|
4
|
+
id: number;
|
|
5
|
+
positions: Float32Array;
|
|
6
|
+
triangleCount: number;
|
|
7
|
+
}
|
|
8
|
+
/** The hierarchy back, its buffers transferred, or why it could not be built. */
|
|
9
|
+
export type BvhResponse = {
|
|
10
|
+
id: number;
|
|
11
|
+
nodes: ArrayBuffer;
|
|
12
|
+
nodeCount: number;
|
|
13
|
+
order: Uint32Array;
|
|
14
|
+
maxDepth: number;
|
|
15
|
+
} | {
|
|
16
|
+
id: number;
|
|
17
|
+
error: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* What the renderer needs from a worker: the shape of a Web `Worker`. Any transport that carries structured clones and
|
|
21
|
+
* transfer lists fits, such as a `worker_threads` thread behind an adapter.
|
|
22
|
+
*/
|
|
23
|
+
export interface BvhWorker {
|
|
24
|
+
postMessage(message: BvhRequest, transfer?: Transferable[]): void;
|
|
25
|
+
terminate(): void;
|
|
26
|
+
onmessage: ((event: {
|
|
27
|
+
data: BvhResponse;
|
|
28
|
+
}) => void) | null;
|
|
29
|
+
onerror: ((event: {
|
|
30
|
+
message?: string;
|
|
31
|
+
preventDefault?(): void;
|
|
32
|
+
}) => void) | null;
|
|
33
|
+
}
|
|
34
|
+
export type BvhWorkerFactory = () => BvhWorker;
|
|
35
|
+
/**
|
|
36
|
+
* Below this many triangles the hierarchy is built on the page: it takes a few milliseconds, less than copying the
|
|
37
|
+
* positions to a worker and the hierarchy back.
|
|
38
|
+
*/
|
|
39
|
+
export declare const BVH_WORKER_MIN_TRIANGLES = 50000;
|
|
40
|
+
/** The worker this package ships, next to this module. Replace it when the bundler cannot follow the URL. */
|
|
41
|
+
export declare function createDefaultBvhWorker(): BvhWorker;
|
|
42
|
+
/** The worker's side of the exchange, apart from the worker itself so it can be run anywhere. */
|
|
43
|
+
export declare function respondToBvhRequest(request: BvhRequest): {
|
|
44
|
+
response: BvhResponse;
|
|
45
|
+
transfer: Transferable[];
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Builds hierarchies in a worker, so a large scene does not hold the page while it is split. The worker is started on
|
|
49
|
+
* the first build that needs it and kept for the next ones. If it cannot be started or fails to load, every build from
|
|
50
|
+
* then on happens on the page, with the same result: the worker only moves the work, it never changes it.
|
|
51
|
+
*/
|
|
52
|
+
export declare class BvhBuilder {
|
|
53
|
+
private readonly enabled;
|
|
54
|
+
private readonly createWorker;
|
|
55
|
+
private readonly minTriangles;
|
|
56
|
+
private worker;
|
|
57
|
+
private failed;
|
|
58
|
+
private disposed;
|
|
59
|
+
private next;
|
|
60
|
+
private readonly pending;
|
|
61
|
+
constructor(enabled: boolean, createWorker?: BvhWorkerFactory, minTriangles?: number);
|
|
62
|
+
/** Whether builds go to the worker: it is enabled and has not failed. */
|
|
63
|
+
get usesWorker(): boolean;
|
|
64
|
+
build(positions: Float32Array, triangleCount: number): Promise<PackedBvh>;
|
|
65
|
+
/** Stops the worker. Builds still waiting for it reject with an `AbortError`. */
|
|
66
|
+
dispose(): void;
|
|
67
|
+
private connect;
|
|
68
|
+
private receive;
|
|
69
|
+
/** The worker is gone for good: what it was building, and everything after, is built on the page instead. */
|
|
70
|
+
private fail;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=bvhBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bvhBuilder.d.ts","sourceRoot":"","sources":["../src/bvhBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpD,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,YAAY,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,iFAAiF;AACjF,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC3F;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAClE,SAAS,IAAI,IAAI,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,IAAI,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CAClF;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C,6GAA6G;AAC7G,wBAAgB,sBAAsB,IAAI,SAAS,CAKlD;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAa5G;AASD;;;;GAIG;AACH,qBAAa,UAAU;IAQnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAT/B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;gBAGnC,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,gBAAyC,EACvD,YAAY,SAA2B;IAE1D,yEAAyE;IACzE,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,KAAK,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAiBzE,iFAAiF;IACjF,OAAO;IAUP,OAAO,CAAC,OAAO;IAyBf,OAAO,CAAC,OAAO;IAaf,6GAA6G;IAC7G,OAAO,CAAC,IAAI;CAoBb"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { buildBvh } from "./bvh.js";
|
|
2
|
+
/**
|
|
3
|
+
* Below this many triangles the hierarchy is built on the page: it takes a few milliseconds, less than copying the
|
|
4
|
+
* positions to a worker and the hierarchy back.
|
|
5
|
+
*/
|
|
6
|
+
export const BVH_WORKER_MIN_TRIANGLES = 50_000;
|
|
7
|
+
/** The worker this package ships, next to this module. Replace it when the bundler cannot follow the URL. */
|
|
8
|
+
export function createDefaultBvhWorker() {
|
|
9
|
+
if (typeof Worker === "undefined")
|
|
10
|
+
throw new Error("Web Workers are unavailable here: pass `createBvhWorker`, or `bvhWorker: false`.");
|
|
11
|
+
return new Worker(new URL("./bvhWorker.js", import.meta.url), { type: "module" });
|
|
12
|
+
}
|
|
13
|
+
/** The worker's side of the exchange, apart from the worker itself so it can be run anywhere. */
|
|
14
|
+
export function respondToBvhRequest(request) {
|
|
15
|
+
try {
|
|
16
|
+
const bvh = buildBvh(request.positions, request.triangleCount);
|
|
17
|
+
return {
|
|
18
|
+
response: { id: request.id, ...bvh },
|
|
19
|
+
transfer: [bvh.nodes, bvh.order.buffer],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
24
|
+
return { response: { id: request.id, error: message }, transfer: [] };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builds hierarchies in a worker, so a large scene does not hold the page while it is split. The worker is started on
|
|
29
|
+
* the first build that needs it and kept for the next ones. If it cannot be started or fails to load, every build from
|
|
30
|
+
* then on happens on the page, with the same result: the worker only moves the work, it never changes it.
|
|
31
|
+
*/
|
|
32
|
+
export class BvhBuilder {
|
|
33
|
+
enabled;
|
|
34
|
+
createWorker;
|
|
35
|
+
minTriangles;
|
|
36
|
+
worker = null;
|
|
37
|
+
failed = false;
|
|
38
|
+
disposed = false;
|
|
39
|
+
next = 0;
|
|
40
|
+
pending = new Map();
|
|
41
|
+
constructor(enabled, createWorker = createDefaultBvhWorker, minTriangles = BVH_WORKER_MIN_TRIANGLES) {
|
|
42
|
+
this.enabled = enabled;
|
|
43
|
+
this.createWorker = createWorker;
|
|
44
|
+
this.minTriangles = minTriangles;
|
|
45
|
+
}
|
|
46
|
+
/** Whether builds go to the worker: it is enabled and has not failed. */
|
|
47
|
+
get usesWorker() {
|
|
48
|
+
return this.enabled && !this.failed && !this.disposed;
|
|
49
|
+
}
|
|
50
|
+
build(positions, triangleCount) {
|
|
51
|
+
if (this.disposed)
|
|
52
|
+
return Promise.reject(abortError());
|
|
53
|
+
const worker = this.usesWorker && triangleCount >= this.minTriangles ? this.connect() : null;
|
|
54
|
+
if (!worker)
|
|
55
|
+
return Promise.resolve(buildBvh(positions, triangleCount));
|
|
56
|
+
const id = this.next++;
|
|
57
|
+
// The page still uploads the positions, so the worker gets a copy it can own.
|
|
58
|
+
const copy = positions.slice(0, triangleCount * 9);
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
this.pending.set(id, { positions, triangleCount, resolve, reject });
|
|
61
|
+
worker.postMessage({ id, positions: copy, triangleCount }, [copy.buffer]);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** Stops the worker. Builds still waiting for it reject with an `AbortError`. */
|
|
65
|
+
dispose() {
|
|
66
|
+
this.disposed = true;
|
|
67
|
+
this.worker?.terminate();
|
|
68
|
+
this.worker = null;
|
|
69
|
+
for (const pending of this.pending.values())
|
|
70
|
+
pending.reject(abortError());
|
|
71
|
+
this.pending.clear();
|
|
72
|
+
}
|
|
73
|
+
connect() {
|
|
74
|
+
if (this.worker)
|
|
75
|
+
return this.worker;
|
|
76
|
+
let worker;
|
|
77
|
+
try {
|
|
78
|
+
worker = this.createWorker();
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
this.fail(error instanceof Error ? error.message : String(error));
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
worker.onmessage = event => this.receive(event.data);
|
|
85
|
+
worker.onerror = event => {
|
|
86
|
+
event.preventDefault?.();
|
|
87
|
+
this.fail(event.message || "the worker failed to load");
|
|
88
|
+
};
|
|
89
|
+
this.worker = worker;
|
|
90
|
+
return worker;
|
|
91
|
+
}
|
|
92
|
+
receive(response) {
|
|
93
|
+
const pending = this.pending.get(response.id);
|
|
94
|
+
if (!pending)
|
|
95
|
+
return;
|
|
96
|
+
this.pending.delete(response.id);
|
|
97
|
+
if ("error" in response)
|
|
98
|
+
pending.reject(new Error(`GPU renderer: building the BVH failed: ${response.error}`));
|
|
99
|
+
else
|
|
100
|
+
pending.resolve({
|
|
101
|
+
nodes: response.nodes, nodeCount: response.nodeCount, order: response.order, maxDepth: response.maxDepth,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** The worker is gone for good: what it was building, and everything after, is built on the page instead. */
|
|
105
|
+
fail(reason) {
|
|
106
|
+
if (!this.failed)
|
|
107
|
+
console.warn(`GPU renderer: the BVH worker is unavailable (${reason}); building on the main thread instead.`);
|
|
108
|
+
this.failed = true;
|
|
109
|
+
this.worker?.terminate();
|
|
110
|
+
this.worker = null;
|
|
111
|
+
const waiting = [...this.pending.values()];
|
|
112
|
+
this.pending.clear();
|
|
113
|
+
for (const pending of waiting) {
|
|
114
|
+
try {
|
|
115
|
+
pending.resolve(buildBvh(pending.positions, pending.triangleCount));
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
pending.reject(error instanceof Error ? error : new Error(String(error)));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function abortError() {
|
|
124
|
+
return Object.assign(new Error("The renderer was disposed."), { name: "AbortError" });
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=bvhBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bvhBuilder.js","sourceRoot":"","sources":["../src/bvhBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bvhWorker.d.ts","sourceRoot":"","sources":["../src/bvhWorker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// The worker `createDefaultBvhWorker` starts: it builds one hierarchy per message, off the page's thread.
|
|
2
|
+
import { respondToBvhRequest } from "./bvhBuilder.js";
|
|
3
|
+
const scope = self;
|
|
4
|
+
scope.onmessage = event => {
|
|
5
|
+
const { response, transfer } = respondToBvhRequest(event.data);
|
|
6
|
+
scope.postMessage(response, transfer);
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=bvhWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bvhWorker.js","sourceRoot":"","sources":["../src/bvhWorker.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,OAAO,EAAE,mBAAmB,EAAqC,MAAM,iBAAiB,CAAC;AAEzF,MAAM,KAAK,GAAG,IAGb,CAAC;AAEF,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE;IACxB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/D,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC,CAAC"}
|
package/dist/camera.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Matrix4 } from "three";
|
|
2
|
+
import type { CameraState } from "./upstream.js";
|
|
3
|
+
/**
|
|
4
|
+
* Everything the renderer derives from a camera snapshot. Rays are cast through the inverse of the camera's own
|
|
5
|
+
* projection, so zoom, film offsets, `setViewOffset` and any custom projection come out exactly as Three draws them,
|
|
6
|
+
* and so do the near and far planes, which clip a camera ray the way they clip a rasterized fragment.
|
|
7
|
+
*/
|
|
8
|
+
export interface CameraMatrices {
|
|
9
|
+
/** Column-major, as Three stores them. */
|
|
10
|
+
cameraWorld: number[];
|
|
11
|
+
view: number[];
|
|
12
|
+
projection: number[];
|
|
13
|
+
inverseProjection: number[];
|
|
14
|
+
orthographic: boolean;
|
|
15
|
+
near: number;
|
|
16
|
+
far: number;
|
|
17
|
+
/** Vertical field of view in degrees, for the lens; 50 when the snapshot has none. */
|
|
18
|
+
fov: number;
|
|
19
|
+
position: number[];
|
|
20
|
+
}
|
|
21
|
+
/** The camera's projection: the snapshot's own when it has one, otherwise rebuilt from its parameters. */
|
|
22
|
+
export declare function cameraProjection(camera: CameraState, aspect: number): Matrix4;
|
|
23
|
+
export declare function cameraMatrices(camera: CameraState, width: number, height: number): CameraMatrices;
|
|
24
|
+
/** A column-major 4x4 matrix times a point, with the w it produced. */
|
|
25
|
+
export declare function transform4(matrix: ArrayLike<number>, x: number, y: number, z: number, w?: number): number[];
|
|
26
|
+
/** A point in clip space back to world space, through the camera that produced it. */
|
|
27
|
+
export declare function clipToWorld(camera: CameraMatrices, clip: readonly number[]): number[];
|
|
28
|
+
export declare function worldToClip(camera: CameraMatrices, point: readonly number[]): number[];
|
|
29
|
+
//# sourceMappingURL=camera.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAyC,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,0GAA0G;AAC1G,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAW7E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAgBjG;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,SAAI,GAAG,MAAM,EAAE,CAOtG;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAKrF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAItF"}
|
package/dist/camera.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Matrix4, OrthographicCamera, PerspectiveCamera } from "three";
|
|
2
|
+
/** The camera's projection: the snapshot's own when it has one, otherwise rebuilt from its parameters. */
|
|
3
|
+
export function cameraProjection(camera, aspect) {
|
|
4
|
+
if (camera.projectionMatrix)
|
|
5
|
+
return new Matrix4().fromArray(camera.projectionMatrix);
|
|
6
|
+
const projection = camera.type === "orthographic"
|
|
7
|
+
? new OrthographicCamera(camera.left, camera.right, camera.top, camera.bottom, camera.near, camera.far)
|
|
8
|
+
: new PerspectiveCamera(camera.fov ?? 50, camera.aspect ?? aspect, camera.near, camera.far);
|
|
9
|
+
projection.zoom = camera.zoom ?? 1;
|
|
10
|
+
projection.updateProjectionMatrix();
|
|
11
|
+
return projection.projectionMatrix;
|
|
12
|
+
}
|
|
13
|
+
export function cameraMatrices(camera, width, height) {
|
|
14
|
+
const world = new Matrix4().fromArray(camera.matrixWorld);
|
|
15
|
+
const projection = cameraProjection(camera, width / height);
|
|
16
|
+
const orthographic = camera.type === "orthographic" || (projection.elements[11] === 0 && projection.elements[15] === 1);
|
|
17
|
+
return {
|
|
18
|
+
cameraWorld: world.toArray(),
|
|
19
|
+
view: world.clone().invert().toArray(),
|
|
20
|
+
projection: projection.toArray(),
|
|
21
|
+
inverseProjection: projection.clone().invert().toArray(),
|
|
22
|
+
orthographic,
|
|
23
|
+
near: camera.near,
|
|
24
|
+
far: camera.far,
|
|
25
|
+
fov: camera.fov ?? 50,
|
|
26
|
+
position: [camera.matrixWorld[12], camera.matrixWorld[13], camera.matrixWorld[14]],
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** A column-major 4x4 matrix times a point, with the w it produced. */
|
|
30
|
+
export function transform4(matrix, x, y, z, w = 1) {
|
|
31
|
+
return [
|
|
32
|
+
matrix[0] * x + matrix[4] * y + matrix[8] * z + matrix[12] * w,
|
|
33
|
+
matrix[1] * x + matrix[5] * y + matrix[9] * z + matrix[13] * w,
|
|
34
|
+
matrix[2] * x + matrix[6] * y + matrix[10] * z + matrix[14] * w,
|
|
35
|
+
matrix[3] * x + matrix[7] * y + matrix[11] * z + matrix[15] * w,
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
/** A point in clip space back to world space, through the camera that produced it. */
|
|
39
|
+
export function clipToWorld(camera, clip) {
|
|
40
|
+
const view = transform4(camera.inverseProjection, clip[0], clip[1], clip[2], clip[3]);
|
|
41
|
+
const w = view[3] || 1e-30;
|
|
42
|
+
return transform4(camera.cameraWorld, view[0] / w, view[1] / w, view[2] / w).slice(0, 3);
|
|
43
|
+
}
|
|
44
|
+
export function worldToClip(camera, point) {
|
|
45
|
+
const view = transform4(camera.view, point[0], point[1], point[2]);
|
|
46
|
+
return transform4(camera.projection, view[0], view[1], view[2], view[3]);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=camera.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera.js","sourceRoot":"","sources":["../src/camera.ts"],"names":[],"mappings":"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"}
|