@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/LICENSE +373 -0
- package/dist/camera.d.ts +178 -0
- package/dist/camera.d.ts.map +1 -0
- package/dist/camera.js +921 -0
- package/dist/camera.js.map +1 -0
- package/dist/device.d.ts +46 -0
- package/dist/device.d.ts.map +1 -0
- package/dist/device.js +135 -0
- package/dist/device.js.map +1 -0
- package/dist/index.d.ts +63 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +397 -0
- package/dist/index.js.map +1 -0
- package/dist/math.d.ts +23 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +102 -0
- package/dist/math.js.map +1 -0
- package/dist/picker.d.ts +22 -0
- package/dist/picker.d.ts.map +1 -0
- package/dist/picker.js +215 -0
- package/dist/picker.js.map +1 -0
- package/dist/pipeline.d.ts +40 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +266 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/post-processor.d.ts +32 -0
- package/dist/post-processor.d.ts.map +1 -0
- package/dist/post-processor.js +42 -0
- package/dist/post-processor.js.map +1 -0
- package/dist/scene.d.ts +35 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +46 -0
- package/dist/scene.js.map +1 -0
- package/dist/section-plane.d.ts +34 -0
- package/dist/section-plane.d.ts.map +1 -0
- package/dist/section-plane.js +232 -0
- package/dist/section-plane.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
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
|
package/dist/math.js.map
ADDED
|
@@ -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"}
|
package/dist/picker.d.ts
ADDED
|
@@ -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"}
|