@ifc-lite/renderer 1.0.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/dist/index.js ADDED
@@ -0,0 +1,397 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * @ifc-lite/renderer - WebGPU renderer
6
+ */
7
+ export { WebGPUDevice } from './device.js';
8
+ export { RenderPipeline } from './pipeline.js';
9
+ export { Camera } from './camera.js';
10
+ export { Scene } from './scene.js';
11
+ export { Picker } from './picker.js';
12
+ export { MathUtils } from './math.js';
13
+ export { SectionPlaneRenderer } from './section-plane.js';
14
+ export * from './types.js';
15
+ import { WebGPUDevice } from './device.js';
16
+ import { RenderPipeline } from './pipeline.js';
17
+ import { Camera } from './camera.js';
18
+ import { Scene } from './scene.js';
19
+ import { Picker } from './picker.js';
20
+ import { FrustumUtils } from '@ifc-lite/spatial';
21
+ import { SectionPlaneRenderer } from './section-plane.js';
22
+ /**
23
+ * Main renderer class
24
+ */
25
+ export class Renderer {
26
+ device;
27
+ pipeline = null;
28
+ camera;
29
+ scene;
30
+ picker = null;
31
+ canvas;
32
+ sectionPlaneRenderer = null;
33
+ modelBounds = null;
34
+ constructor(canvas) {
35
+ this.canvas = canvas;
36
+ this.device = new WebGPUDevice();
37
+ this.camera = new Camera();
38
+ this.scene = new Scene();
39
+ }
40
+ /**
41
+ * Initialize renderer
42
+ */
43
+ async init() {
44
+ await this.device.init(this.canvas);
45
+ // Get canvas dimensions (use pixel dimensions if set, otherwise use CSS dimensions)
46
+ const rect = this.canvas.getBoundingClientRect();
47
+ const width = this.canvas.width || Math.max(1, Math.floor(rect.width));
48
+ const height = this.canvas.height || Math.max(1, Math.floor(rect.height));
49
+ // Set pixel dimensions if not already set
50
+ if (!this.canvas.width || !this.canvas.height) {
51
+ this.canvas.width = width;
52
+ this.canvas.height = height;
53
+ }
54
+ this.pipeline = new RenderPipeline(this.device, width, height);
55
+ this.picker = new Picker(this.device, width, height);
56
+ this.sectionPlaneRenderer = new SectionPlaneRenderer(this.device.getDevice(), this.device.getFormat());
57
+ this.camera.setAspect(width / height);
58
+ }
59
+ /**
60
+ * Add mesh to scene with per-mesh GPU resources for unique colors
61
+ */
62
+ addMesh(mesh) {
63
+ // Create per-mesh uniform buffer and bind group if not already created
64
+ if (!mesh.uniformBuffer && this.pipeline && this.device.isInitialized()) {
65
+ const device = this.device.getDevice();
66
+ // Create uniform buffer for this mesh
67
+ mesh.uniformBuffer = device.createBuffer({
68
+ size: this.pipeline.getUniformBufferSize(),
69
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
70
+ });
71
+ // Create bind group for this mesh
72
+ mesh.bindGroup = device.createBindGroup({
73
+ layout: this.pipeline.getBindGroupLayout(),
74
+ entries: [
75
+ {
76
+ binding: 0,
77
+ resource: { buffer: mesh.uniformBuffer },
78
+ },
79
+ ],
80
+ });
81
+ }
82
+ this.scene.addMesh(mesh);
83
+ }
84
+ /**
85
+ * Ensure all meshes have GPU resources (call after adding meshes if pipeline wasn't ready)
86
+ */
87
+ ensureMeshResources() {
88
+ if (!this.pipeline || !this.device.isInitialized())
89
+ return;
90
+ const device = this.device.getDevice();
91
+ let created = 0;
92
+ for (const mesh of this.scene.getMeshes()) {
93
+ if (!mesh.uniformBuffer) {
94
+ mesh.uniformBuffer = device.createBuffer({
95
+ size: this.pipeline.getUniformBufferSize(),
96
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
97
+ });
98
+ mesh.bindGroup = device.createBindGroup({
99
+ layout: this.pipeline.getBindGroupLayout(),
100
+ entries: [
101
+ {
102
+ binding: 0,
103
+ resource: { buffer: mesh.uniformBuffer },
104
+ },
105
+ ],
106
+ });
107
+ created++;
108
+ }
109
+ }
110
+ if (created > 0) {
111
+ console.log(`[Renderer] Created GPU resources for ${created} meshes`);
112
+ }
113
+ }
114
+ /**
115
+ * Render frame
116
+ */
117
+ render(options = {}) {
118
+ if (!this.device.isInitialized() || !this.pipeline)
119
+ return;
120
+ // Validate canvas dimensions
121
+ const rect = this.canvas.getBoundingClientRect();
122
+ const width = Math.max(1, Math.floor(rect.width));
123
+ const height = Math.max(1, Math.floor(rect.height));
124
+ // Skip rendering if canvas is too small
125
+ if (width < 10 || height < 10)
126
+ return;
127
+ // Update canvas pixel dimensions if needed
128
+ const dimensionsChanged = this.canvas.width !== width || this.canvas.height !== height;
129
+ if (dimensionsChanged) {
130
+ this.canvas.width = width;
131
+ this.canvas.height = height;
132
+ this.camera.setAspect(width / height);
133
+ // Force reconfigure when dimensions change
134
+ this.device.configureContext();
135
+ // Also resize the depth texture immediately
136
+ this.pipeline.resize(width, height);
137
+ }
138
+ // Skip rendering if canvas is invalid
139
+ if (this.canvas.width === 0 || this.canvas.height === 0)
140
+ return;
141
+ // Ensure context is valid before rendering (handles HMR, focus changes, etc.)
142
+ if (!this.device.ensureContext()) {
143
+ return; // Skip this frame, context will be ready next frame
144
+ }
145
+ const device = this.device.getDevice();
146
+ const viewProj = this.camera.getViewProjMatrix().m;
147
+ // Ensure all meshes have GPU resources (in case they were added before pipeline was ready)
148
+ this.ensureMeshResources();
149
+ let meshes = this.scene.getMeshes();
150
+ // Frustum culling (if enabled and spatial index available)
151
+ if (options.enableFrustumCulling && options.spatialIndex) {
152
+ try {
153
+ const frustum = FrustumUtils.fromViewProjMatrix(viewProj);
154
+ const visibleIds = new Set(options.spatialIndex.queryFrustum(frustum));
155
+ meshes = meshes.filter(mesh => visibleIds.has(mesh.expressId));
156
+ }
157
+ catch (error) {
158
+ // Fallback: render all meshes if frustum culling fails
159
+ console.warn('Frustum culling failed:', error);
160
+ }
161
+ }
162
+ // Visibility filtering
163
+ if (options.hiddenIds && options.hiddenIds.size > 0) {
164
+ meshes = meshes.filter(mesh => !options.hiddenIds.has(mesh.expressId));
165
+ }
166
+ if (options.isolatedIds !== null && options.isolatedIds !== undefined) {
167
+ meshes = meshes.filter(mesh => options.isolatedIds.has(mesh.expressId));
168
+ }
169
+ // Resize depth texture if needed
170
+ if (this.pipeline.needsResize(this.canvas.width, this.canvas.height)) {
171
+ this.pipeline.resize(this.canvas.width, this.canvas.height);
172
+ }
173
+ // Get current texture safely - may return null if context needs reconfiguration
174
+ const currentTexture = this.device.getCurrentTexture();
175
+ if (!currentTexture) {
176
+ return; // Skip this frame, context will be reconfigured next frame
177
+ }
178
+ try {
179
+ const clearColor = options.clearColor
180
+ ? (Array.isArray(options.clearColor)
181
+ ? { r: options.clearColor[0], g: options.clearColor[1], b: options.clearColor[2], a: options.clearColor[3] }
182
+ : options.clearColor)
183
+ : { r: 0.1, g: 0.1, b: 0.1, a: 1 };
184
+ const textureView = currentTexture.createView();
185
+ // Separate meshes into opaque and transparent
186
+ const opaqueMeshes = [];
187
+ const transparentMeshes = [];
188
+ for (const mesh of meshes) {
189
+ const alpha = mesh.color[3];
190
+ const transparency = mesh.material?.transparency ?? 0.0;
191
+ const isTransparent = alpha < 0.99 || transparency > 0.01;
192
+ if (isTransparent) {
193
+ transparentMeshes.push(mesh);
194
+ }
195
+ else {
196
+ opaqueMeshes.push(mesh);
197
+ }
198
+ }
199
+ // Sort transparent meshes back-to-front for proper blending
200
+ if (transparentMeshes.length > 0) {
201
+ transparentMeshes.sort((a, b) => {
202
+ return b.expressId - a.expressId; // Back to front (simplified)
203
+ });
204
+ }
205
+ // Write uniform data to each mesh's buffer BEFORE recording commands
206
+ // This ensures each mesh has its own color data
207
+ const allMeshes = [...opaqueMeshes, ...transparentMeshes];
208
+ const selectedId = options.selectedId;
209
+ const selectedIds = options.selectedIds;
210
+ // Calculate section plane parameters if enabled
211
+ let sectionPlaneData;
212
+ if (options.sectionPlane?.enabled) {
213
+ // Calculate plane normal based on axis
214
+ const normal = [0, 0, 0];
215
+ if (options.sectionPlane.axis === 'x')
216
+ normal[0] = 1;
217
+ else if (options.sectionPlane.axis === 'y')
218
+ normal[1] = 1;
219
+ else
220
+ normal[2] = 1;
221
+ // Get model bounds for calculating plane position and visual
222
+ const boundsMin = { x: Infinity, y: Infinity, z: Infinity };
223
+ const boundsMax = { x: -Infinity, y: -Infinity, z: -Infinity };
224
+ if (meshes.length > 0) {
225
+ for (const mesh of meshes) {
226
+ if (mesh.bounds) {
227
+ boundsMin.x = Math.min(boundsMin.x, mesh.bounds.min[0]);
228
+ boundsMin.y = Math.min(boundsMin.y, mesh.bounds.min[1]);
229
+ boundsMin.z = Math.min(boundsMin.z, mesh.bounds.min[2]);
230
+ boundsMax.x = Math.max(boundsMax.x, mesh.bounds.max[0]);
231
+ boundsMax.y = Math.max(boundsMax.y, mesh.bounds.max[1]);
232
+ boundsMax.z = Math.max(boundsMax.z, mesh.bounds.max[2]);
233
+ }
234
+ }
235
+ if (!Number.isFinite(boundsMin.x)) {
236
+ boundsMin.x = boundsMin.y = boundsMin.z = -100;
237
+ boundsMax.x = boundsMax.y = boundsMax.z = 100;
238
+ }
239
+ }
240
+ else {
241
+ boundsMin.x = boundsMin.y = boundsMin.z = -100;
242
+ boundsMax.x = boundsMax.y = boundsMax.z = 100;
243
+ }
244
+ // Store bounds for section plane visual
245
+ this.modelBounds = { min: boundsMin, max: boundsMax };
246
+ // Get axis-specific range
247
+ const axisIdx = options.sectionPlane.axis === 'x' ? 'x' : options.sectionPlane.axis === 'y' ? 'y' : 'z';
248
+ const minVal = boundsMin[axisIdx];
249
+ const maxVal = boundsMax[axisIdx];
250
+ // Calculate plane distance from position percentage
251
+ const range = maxVal - minVal;
252
+ const distance = minVal + (options.sectionPlane.position / 100) * range;
253
+ sectionPlaneData = { normal, distance, enabled: true };
254
+ }
255
+ for (const mesh of allMeshes) {
256
+ if (mesh.uniformBuffer) {
257
+ // Extended buffer: 48 floats = 192 bytes
258
+ const buffer = new Float32Array(48);
259
+ const flagBuffer = new Uint32Array(buffer.buffer, 176, 4);
260
+ buffer.set(viewProj, 0);
261
+ buffer.set(mesh.transform.m, 16);
262
+ // Check if mesh is selected (single or multi-selection)
263
+ const isSelected = (selectedId !== undefined && selectedId !== null && mesh.expressId === selectedId)
264
+ || (selectedIds !== undefined && selectedIds.has(mesh.expressId));
265
+ // Apply selection highlight effect
266
+ if (isSelected) {
267
+ // Use original color, shader will handle highlight
268
+ buffer.set(mesh.color, 32);
269
+ buffer[36] = mesh.material?.metallic ?? 0.0;
270
+ buffer[37] = mesh.material?.roughness ?? 0.6;
271
+ }
272
+ else {
273
+ buffer.set(mesh.color, 32);
274
+ buffer[36] = mesh.material?.metallic ?? 0.0;
275
+ buffer[37] = mesh.material?.roughness ?? 0.6;
276
+ }
277
+ // Section plane data (offset 40-43)
278
+ if (sectionPlaneData) {
279
+ buffer[40] = sectionPlaneData.normal[0];
280
+ buffer[41] = sectionPlaneData.normal[1];
281
+ buffer[42] = sectionPlaneData.normal[2];
282
+ buffer[43] = sectionPlaneData.distance;
283
+ }
284
+ // Flags (offset 44-47 as u32)
285
+ flagBuffer[0] = isSelected ? 1 : 0;
286
+ flagBuffer[1] = sectionPlaneData?.enabled ? 1 : 0;
287
+ flagBuffer[2] = 0;
288
+ flagBuffer[3] = 0;
289
+ device.queue.writeBuffer(mesh.uniformBuffer, 0, buffer);
290
+ }
291
+ }
292
+ // Now record draw commands
293
+ const encoder = device.createCommandEncoder();
294
+ const pass = encoder.beginRenderPass({
295
+ colorAttachments: [
296
+ {
297
+ view: textureView,
298
+ loadOp: 'clear',
299
+ clearValue: clearColor,
300
+ storeOp: 'store',
301
+ },
302
+ ],
303
+ depthStencilAttachment: {
304
+ view: this.pipeline.getDepthTextureView(),
305
+ depthClearValue: 1.0,
306
+ depthLoadOp: 'clear',
307
+ depthStoreOp: 'store',
308
+ },
309
+ });
310
+ pass.setPipeline(this.pipeline.getPipeline());
311
+ // Render opaque meshes with per-mesh bind groups
312
+ for (const mesh of opaqueMeshes) {
313
+ if (mesh.bindGroup) {
314
+ pass.setBindGroup(0, mesh.bindGroup);
315
+ }
316
+ else {
317
+ pass.setBindGroup(0, this.pipeline.getBindGroup());
318
+ }
319
+ pass.setVertexBuffer(0, mesh.vertexBuffer);
320
+ pass.setIndexBuffer(mesh.indexBuffer, 'uint32');
321
+ pass.drawIndexed(mesh.indexCount, 1, 0, 0, 0);
322
+ }
323
+ // Render transparent meshes with per-mesh bind groups
324
+ for (const mesh of transparentMeshes) {
325
+ if (mesh.bindGroup) {
326
+ pass.setBindGroup(0, mesh.bindGroup);
327
+ }
328
+ else {
329
+ pass.setBindGroup(0, this.pipeline.getBindGroup());
330
+ }
331
+ pass.setVertexBuffer(0, mesh.vertexBuffer);
332
+ pass.setIndexBuffer(mesh.indexBuffer, 'uint32');
333
+ pass.drawIndexed(mesh.indexCount, 1, 0, 0, 0);
334
+ }
335
+ pass.end();
336
+ // Render section plane visual if enabled
337
+ if (sectionPlaneData?.enabled && this.sectionPlaneRenderer && this.modelBounds) {
338
+ this.sectionPlaneRenderer.render(encoder, textureView, this.pipeline.getDepthTextureView(), {
339
+ axis: options.sectionPlane.axis,
340
+ position: options.sectionPlane.position,
341
+ bounds: this.modelBounds,
342
+ viewProj,
343
+ });
344
+ }
345
+ device.queue.submit([encoder.finish()]);
346
+ }
347
+ catch (error) {
348
+ // Handle WebGPU errors (e.g., device lost, invalid state)
349
+ // Mark context as invalid so it gets reconfigured next frame
350
+ this.device.invalidateContext();
351
+ // Only log occasional errors to avoid spam
352
+ if (Math.random() < 0.01) {
353
+ console.warn('Render error (context will be reconfigured):', error);
354
+ }
355
+ }
356
+ }
357
+ /**
358
+ * Pick object at screen coordinates
359
+ */
360
+ async pick(x, y) {
361
+ if (!this.picker)
362
+ return null;
363
+ const meshes = this.scene.getMeshes();
364
+ const viewProj = this.camera.getViewProjMatrix().m;
365
+ return this.picker.pick(x, y, this.canvas.width, this.canvas.height, meshes, viewProj);
366
+ }
367
+ /**
368
+ * Resize canvas
369
+ */
370
+ resize(width, height) {
371
+ this.canvas.width = width;
372
+ this.canvas.height = height;
373
+ this.camera.setAspect(width / height);
374
+ }
375
+ getCamera() {
376
+ return this.camera;
377
+ }
378
+ getScene() {
379
+ return this.scene;
380
+ }
381
+ /**
382
+ * Check if renderer is fully initialized and ready to use
383
+ */
384
+ isReady() {
385
+ return this.device.isInitialized() && this.pipeline !== null;
386
+ }
387
+ /**
388
+ * Get the GPU device (returns null if not initialized)
389
+ */
390
+ getGPUDevice() {
391
+ if (!this.device.isInitialized()) {
392
+ return null;
393
+ }
394
+ return this.device.getDevice();
395
+ }
396
+ }
397
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/math.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Math utilities for 3D transformations
3
+ */
4
+ import type { Vec3, Mat4 } from './types.js';
5
+ export declare class MathUtils {
6
+ /**
7
+ * Create identity matrix
8
+ */
9
+ static identity(): Mat4;
10
+ /**
11
+ * Create perspective projection matrix
12
+ */
13
+ static perspective(fov: number, aspect: number, near: number, far: number): Mat4;
14
+ /**
15
+ * Create look-at view matrix
16
+ */
17
+ static lookAt(eye: Vec3, target: Vec3, up: Vec3): Mat4;
18
+ /**
19
+ * Multiply matrices
20
+ */
21
+ static multiply(a: Mat4, b: Mat4): Mat4;
22
+ }
23
+ //# sourceMappingURL=math.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,SAAS;IAClB;;OAEG;IACH,MAAM,CAAC,QAAQ,IAAI,IAAI;IAMvB;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAahF;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI;IAgCtD;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI;CA+B1C"}
package/dist/math.js ADDED
@@ -0,0 +1,102 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export class MathUtils {
5
+ /**
6
+ * Create identity matrix
7
+ */
8
+ static identity() {
9
+ const m = new Float32Array(16);
10
+ m[0] = 1;
11
+ m[5] = 1;
12
+ m[10] = 1;
13
+ m[15] = 1;
14
+ return { m };
15
+ }
16
+ /**
17
+ * Create perspective projection matrix
18
+ */
19
+ static perspective(fov, aspect, near, far) {
20
+ const f = 1.0 / Math.tan(fov / 2);
21
+ const nf = 1 / (near - far);
22
+ const m = new Float32Array(16);
23
+ m[0] = f / aspect;
24
+ m[5] = f;
25
+ m[10] = (far + near) * nf;
26
+ m[11] = -1;
27
+ m[14] = (2 * far * near) * nf;
28
+ return { m };
29
+ }
30
+ /**
31
+ * Create look-at view matrix
32
+ */
33
+ static lookAt(eye, target, up) {
34
+ const zx = eye.x - target.x;
35
+ const zy = eye.y - target.y;
36
+ const zz = eye.z - target.z;
37
+ const len = 1 / Math.sqrt(zx * zx + zy * zy + zz * zz);
38
+ const z0 = zx * len;
39
+ const z1 = zy * len;
40
+ const z2 = zz * len;
41
+ const xx = up.y * z2 - up.z * z1;
42
+ const xy = up.z * z0 - up.x * z2;
43
+ const xz = up.x * z1 - up.y * z0;
44
+ const len2 = 1 / Math.sqrt(xx * xx + xy * xy + xz * xz);
45
+ const x0 = xx * len2;
46
+ const x1 = xy * len2;
47
+ const x2 = xz * len2;
48
+ const y0 = z1 * x2 - z2 * x1;
49
+ const y1 = z2 * x0 - z0 * x2;
50
+ const y2 = z0 * x1 - z1 * x0;
51
+ const m = new Float32Array(16);
52
+ m[0] = x0;
53
+ m[1] = y0;
54
+ m[2] = z0;
55
+ m[3] = 0;
56
+ m[4] = x1;
57
+ m[5] = y1;
58
+ m[6] = z1;
59
+ m[7] = 0;
60
+ m[8] = x2;
61
+ m[9] = y2;
62
+ m[10] = z2;
63
+ m[11] = 0;
64
+ m[12] = -(x0 * eye.x + x1 * eye.y + x2 * eye.z);
65
+ m[13] = -(y0 * eye.x + y1 * eye.y + y2 * eye.z);
66
+ m[14] = -(z0 * eye.x + z1 * eye.y + z2 * eye.z);
67
+ m[15] = 1;
68
+ return { m };
69
+ }
70
+ /**
71
+ * Multiply matrices
72
+ */
73
+ static multiply(a, b) {
74
+ const out = new Float32Array(16);
75
+ const a00 = a.m[0], a01 = a.m[1], a02 = a.m[2], a03 = a.m[3];
76
+ const a10 = a.m[4], a11 = a.m[5], a12 = a.m[6], a13 = a.m[7];
77
+ const a20 = a.m[8], a21 = a.m[9], a22 = a.m[10], a23 = a.m[11];
78
+ const a30 = a.m[12], a31 = a.m[13], a32 = a.m[14], a33 = a.m[15];
79
+ const b00 = b.m[0], b01 = b.m[1], b02 = b.m[2], b03 = b.m[3];
80
+ const b10 = b.m[4], b11 = b.m[5], b12 = b.m[6], b13 = b.m[7];
81
+ const b20 = b.m[8], b21 = b.m[9], b22 = b.m[10], b23 = b.m[11];
82
+ const b30 = b.m[12], b31 = b.m[13], b32 = b.m[14], b33 = b.m[15];
83
+ out[0] = b00 * a00 + b01 * a10 + b02 * a20 + b03 * a30;
84
+ out[1] = b00 * a01 + b01 * a11 + b02 * a21 + b03 * a31;
85
+ out[2] = b00 * a02 + b01 * a12 + b02 * a22 + b03 * a32;
86
+ out[3] = b00 * a03 + b01 * a13 + b02 * a23 + b03 * a33;
87
+ out[4] = b10 * a00 + b11 * a10 + b12 * a20 + b13 * a30;
88
+ out[5] = b10 * a01 + b11 * a11 + b12 * a21 + b13 * a31;
89
+ out[6] = b10 * a02 + b11 * a12 + b12 * a22 + b13 * a32;
90
+ out[7] = b10 * a03 + b11 * a13 + b12 * a23 + b13 * a33;
91
+ out[8] = b20 * a00 + b21 * a10 + b22 * a20 + b23 * a30;
92
+ out[9] = b20 * a01 + b21 * a11 + b22 * a21 + b23 * a31;
93
+ out[10] = b20 * a02 + b21 * a12 + b22 * a22 + b23 * a32;
94
+ out[11] = b20 * a03 + b21 * a13 + b22 * a23 + b23 * a33;
95
+ out[12] = b30 * a00 + b31 * a10 + b32 * a20 + b33 * a30;
96
+ out[13] = b30 * a01 + b31 * a11 + b32 * a21 + b33 * a31;
97
+ out[14] = b30 * a02 + b31 * a12 + b32 * a22 + b33 * a32;
98
+ out[15] = b30 * a03 + b31 * a13 + b32 * a23 + b33 * a33;
99
+ return { m: out };
100
+ }
101
+ }
102
+ //# sourceMappingURL=math.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"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CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEjE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEjE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACvD,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACxD,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACxD,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACxD,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACxD,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QACxD,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;QAExD,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IACtB,CAAC;CACJ"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * GPU-based object picking
3
+ */
4
+ import { WebGPUDevice } from './device.js';
5
+ import type { Mesh } from './types.js';
6
+ export declare class Picker {
7
+ private device;
8
+ private pipeline;
9
+ private depthTexture;
10
+ private colorTexture;
11
+ private uniformBuffer;
12
+ private expressIdBuffer;
13
+ private bindGroup;
14
+ private maxMeshes;
15
+ constructor(device: WebGPUDevice, width?: number, height?: number);
16
+ /**
17
+ * Pick object at screen coordinates
18
+ */
19
+ pick(x: number, y: number, width: number, height: number, meshes: Mesh[], viewProj: Float32Array): Promise<number | null>;
20
+ updateUniforms(viewProj: Float32Array): void;
21
+ }
22
+ //# sourceMappingURL=picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../src/picker.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,eAAe,CAAY;IACnC,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,SAAS,CAAiB;gBAEtB,MAAM,EAAE,YAAY,EAAE,KAAK,GAAE,MAAU,EAAE,MAAM,GAAE,MAAU;IAiHvE;;OAEG;IACG,IAAI,CACR,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,IAAI,EAAE,EACd,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA2GzB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;CAI7C"}