@ifc-lite/renderer 1.1.7 → 1.2.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/bvh.d.ts +50 -0
- package/dist/bvh.d.ts.map +1 -0
- package/dist/bvh.js +177 -0
- package/dist/bvh.js.map +1 -0
- package/dist/camera.d.ts +17 -0
- package/dist/camera.d.ts.map +1 -1
- package/dist/camera.js +72 -6
- package/dist/camera.js.map +1 -1
- package/dist/index.d.ts +42 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +429 -87
- package/dist/index.js.map +1 -1
- package/dist/math.d.ts +30 -0
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +103 -0
- package/dist/math.js.map +1 -1
- package/dist/picker.js +2 -2
- package/dist/picker.js.map +1 -1
- package/dist/pipeline.d.ts +17 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +347 -47
- package/dist/pipeline.js.map +1 -1
- package/dist/raycaster.d.ts +67 -0
- package/dist/raycaster.d.ts.map +1 -0
- package/dist/raycaster.js +192 -0
- package/dist/raycaster.js.map +1 -0
- package/dist/scene.d.ts +56 -2
- package/dist/scene.d.ts.map +1 -1
- package/dist/scene.js +362 -26
- package/dist/scene.js.map +1 -1
- package/dist/snap-detector.d.ts +73 -0
- package/dist/snap-detector.d.ts.map +1 -0
- package/dist/snap-detector.js +291 -0
- package/dist/snap-detector.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/zero-copy-uploader.d.ts +145 -0
- package/dist/zero-copy-uploader.d.ts.map +1 -0
- package/dist/zero-copy-uploader.js +146 -0
- package/dist/zero-copy-uploader.js.map +1 -0
- package/package.json +11 -10
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { Raycaster } from './raycaster';
|
|
2
|
+
export var SnapType;
|
|
3
|
+
(function (SnapType) {
|
|
4
|
+
SnapType["VERTEX"] = "vertex";
|
|
5
|
+
SnapType["EDGE"] = "edge";
|
|
6
|
+
SnapType["EDGE_MIDPOINT"] = "edge_midpoint";
|
|
7
|
+
SnapType["FACE"] = "face";
|
|
8
|
+
SnapType["FACE_CENTER"] = "face_center";
|
|
9
|
+
})(SnapType || (SnapType = {}));
|
|
10
|
+
export class SnapDetector {
|
|
11
|
+
raycaster = new Raycaster();
|
|
12
|
+
defaultOptions = {
|
|
13
|
+
snapToVertices: true,
|
|
14
|
+
snapToEdges: true,
|
|
15
|
+
snapToFaces: true,
|
|
16
|
+
snapRadius: 0.1, // 10cm in world units (meters)
|
|
17
|
+
screenSnapRadius: 20, // pixels
|
|
18
|
+
};
|
|
19
|
+
// Cache for processed mesh geometry (vertices and edges)
|
|
20
|
+
geometryCache = new Map();
|
|
21
|
+
/**
|
|
22
|
+
* Detect best snap target near cursor
|
|
23
|
+
*/
|
|
24
|
+
detectSnapTarget(ray, meshes, intersection, camera, screenHeight, options = {}) {
|
|
25
|
+
const opts = { ...this.defaultOptions, ...options };
|
|
26
|
+
if (!intersection) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
const targets = [];
|
|
30
|
+
// Calculate world-space snap radius based on screen-space radius and distance
|
|
31
|
+
const distanceToCamera = this.distance(camera.position, intersection.point);
|
|
32
|
+
const worldSnapRadius = this.screenToWorldRadius(opts.screenSnapRadius, distanceToCamera, camera.fov, screenHeight);
|
|
33
|
+
// Only check the intersected mesh for snap targets (performance optimization)
|
|
34
|
+
// Checking all meshes was causing severe framerate drops with large models
|
|
35
|
+
const intersectedMesh = meshes[intersection.meshIndex];
|
|
36
|
+
if (intersectedMesh) {
|
|
37
|
+
// Detect vertices
|
|
38
|
+
if (opts.snapToVertices) {
|
|
39
|
+
targets.push(...this.findVertices(intersectedMesh, intersection.point, worldSnapRadius));
|
|
40
|
+
}
|
|
41
|
+
// Detect edges
|
|
42
|
+
if (opts.snapToEdges) {
|
|
43
|
+
targets.push(...this.findEdges(intersectedMesh, intersection.point, worldSnapRadius));
|
|
44
|
+
}
|
|
45
|
+
// Detect faces
|
|
46
|
+
if (opts.snapToFaces) {
|
|
47
|
+
targets.push(...this.findFaces(intersectedMesh, intersection, worldSnapRadius));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Return best target
|
|
51
|
+
return this.getBestSnapTarget(targets, intersection.point);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get or compute geometry cache for a mesh
|
|
55
|
+
*/
|
|
56
|
+
getGeometryCache(mesh) {
|
|
57
|
+
const cached = this.geometryCache.get(mesh.expressId);
|
|
58
|
+
if (cached) {
|
|
59
|
+
return cached;
|
|
60
|
+
}
|
|
61
|
+
// Compute and cache vertices
|
|
62
|
+
const positions = mesh.positions;
|
|
63
|
+
// Validate input
|
|
64
|
+
if (!positions || positions.length === 0) {
|
|
65
|
+
const emptyCache = { vertices: [], edges: [] };
|
|
66
|
+
this.geometryCache.set(mesh.expressId, emptyCache);
|
|
67
|
+
return emptyCache;
|
|
68
|
+
}
|
|
69
|
+
const vertexMap = new Map();
|
|
70
|
+
for (let i = 0; i < positions.length; i += 3) {
|
|
71
|
+
const vertex = {
|
|
72
|
+
x: positions[i],
|
|
73
|
+
y: positions[i + 1],
|
|
74
|
+
z: positions[i + 2],
|
|
75
|
+
};
|
|
76
|
+
// Skip invalid vertices
|
|
77
|
+
if (!isFinite(vertex.x) || !isFinite(vertex.y) || !isFinite(vertex.z)) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Use reduced precision for deduplication
|
|
81
|
+
const key = `${vertex.x.toFixed(4)}_${vertex.y.toFixed(4)}_${vertex.z.toFixed(4)}`;
|
|
82
|
+
vertexMap.set(key, vertex);
|
|
83
|
+
}
|
|
84
|
+
const vertices = Array.from(vertexMap.values());
|
|
85
|
+
// Compute and cache edges
|
|
86
|
+
const edges = [];
|
|
87
|
+
const indices = mesh.indices;
|
|
88
|
+
if (indices) {
|
|
89
|
+
const edgeMap = new Map();
|
|
90
|
+
for (let i = 0; i < indices.length; i += 3) {
|
|
91
|
+
const triangleEdges = [
|
|
92
|
+
[indices[i], indices[i + 1]],
|
|
93
|
+
[indices[i + 1], indices[i + 2]],
|
|
94
|
+
[indices[i + 2], indices[i]],
|
|
95
|
+
];
|
|
96
|
+
for (const [idx0, idx1] of triangleEdges) {
|
|
97
|
+
const i0 = idx0 * 3;
|
|
98
|
+
const i1 = idx1 * 3;
|
|
99
|
+
const v0 = {
|
|
100
|
+
x: positions[i0],
|
|
101
|
+
y: positions[i0 + 1],
|
|
102
|
+
z: positions[i0 + 2],
|
|
103
|
+
};
|
|
104
|
+
const v1 = {
|
|
105
|
+
x: positions[i1],
|
|
106
|
+
y: positions[i1 + 1],
|
|
107
|
+
z: positions[i1 + 2],
|
|
108
|
+
};
|
|
109
|
+
// Create canonical edge key (smaller index first)
|
|
110
|
+
const key = idx0 < idx1 ? `${idx0}_${idx1}` : `${idx1}_${idx0}`;
|
|
111
|
+
if (!edgeMap.has(key)) {
|
|
112
|
+
edgeMap.set(key, { v0, v1, index: edgeMap.size });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
edges.push(...edgeMap.values());
|
|
117
|
+
}
|
|
118
|
+
const cache = { vertices, edges };
|
|
119
|
+
this.geometryCache.set(mesh.expressId, cache);
|
|
120
|
+
return cache;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Find vertices near point
|
|
124
|
+
*/
|
|
125
|
+
findVertices(mesh, point, radius) {
|
|
126
|
+
const targets = [];
|
|
127
|
+
const cache = this.getGeometryCache(mesh);
|
|
128
|
+
// Find vertices within radius - ONLY when VERY close for smooth edge sliding
|
|
129
|
+
for (const vertex of cache.vertices) {
|
|
130
|
+
const dist = this.distance(vertex, point);
|
|
131
|
+
// Only snap to vertices when within 20% of snap radius (very tight) to avoid sticky behavior
|
|
132
|
+
if (dist < radius * 0.2) {
|
|
133
|
+
targets.push({
|
|
134
|
+
type: SnapType.VERTEX,
|
|
135
|
+
position: vertex,
|
|
136
|
+
expressId: mesh.expressId,
|
|
137
|
+
confidence: 0.95 - dist / (radius * 0.2), // Lower than edges, only wins when VERY close
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return targets;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Find edges near point
|
|
145
|
+
*/
|
|
146
|
+
findEdges(mesh, point, radius) {
|
|
147
|
+
const targets = [];
|
|
148
|
+
const cache = this.getGeometryCache(mesh);
|
|
149
|
+
// Use MUCH larger radius for edges - very forgiving, cursor "jumps" to edges
|
|
150
|
+
const edgeRadius = radius * 3.0; // Tripled for easy detection
|
|
151
|
+
// Find edges near point using cached data
|
|
152
|
+
for (const edge of cache.edges) {
|
|
153
|
+
const closestPoint = this.raycaster.closestPointOnSegment(point, edge.v0, edge.v1);
|
|
154
|
+
const dist = this.distance(closestPoint, point);
|
|
155
|
+
if (dist < edgeRadius) {
|
|
156
|
+
// Edge snap - ABSOLUTE HIGHEST priority for smooth sliding along edges
|
|
157
|
+
// Maximum confidence ensures edges ALWAYS win over vertices/faces
|
|
158
|
+
targets.push({
|
|
159
|
+
type: SnapType.EDGE,
|
|
160
|
+
position: closestPoint,
|
|
161
|
+
expressId: mesh.expressId,
|
|
162
|
+
confidence: 0.999 * (1.0 - dist / edgeRadius), // Nearly perfect priority for edges
|
|
163
|
+
metadata: { vertices: [edge.v0, edge.v1], edgeIndex: edge.index },
|
|
164
|
+
});
|
|
165
|
+
// Edge midpoint snap - only when very close to midpoint
|
|
166
|
+
const midpoint = {
|
|
167
|
+
x: (edge.v0.x + edge.v1.x) / 2,
|
|
168
|
+
y: (edge.v0.y + edge.v1.y) / 2,
|
|
169
|
+
z: (edge.v0.z + edge.v1.z) / 2,
|
|
170
|
+
};
|
|
171
|
+
const midDist = this.distance(midpoint, point);
|
|
172
|
+
// Only snap to midpoint when within 1/3 of snap radius
|
|
173
|
+
if (midDist < radius * 0.33) {
|
|
174
|
+
targets.push({
|
|
175
|
+
type: SnapType.EDGE_MIDPOINT,
|
|
176
|
+
position: midpoint,
|
|
177
|
+
expressId: mesh.expressId,
|
|
178
|
+
confidence: 1.0 * (1.0 - midDist / (radius * 0.33)), // Very high when close
|
|
179
|
+
metadata: { vertices: [edge.v0, edge.v1], edgeIndex: edge.index },
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return targets;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Clear geometry cache (call when meshes change)
|
|
188
|
+
*/
|
|
189
|
+
clearCache() {
|
|
190
|
+
this.geometryCache.clear();
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Find faces/planes near intersection
|
|
194
|
+
*/
|
|
195
|
+
findFaces(mesh, intersection, radius) {
|
|
196
|
+
const targets = [];
|
|
197
|
+
// Add the intersected face
|
|
198
|
+
targets.push({
|
|
199
|
+
type: SnapType.FACE,
|
|
200
|
+
position: intersection.point,
|
|
201
|
+
normal: intersection.normal,
|
|
202
|
+
expressId: mesh.expressId,
|
|
203
|
+
confidence: 0.5, // Lower priority than vertices/edges
|
|
204
|
+
metadata: { faceIndex: intersection.triangleIndex },
|
|
205
|
+
});
|
|
206
|
+
// Calculate face center (centroid of triangle)
|
|
207
|
+
const positions = mesh.positions;
|
|
208
|
+
const indices = mesh.indices;
|
|
209
|
+
if (indices) {
|
|
210
|
+
const triIndex = intersection.triangleIndex * 3;
|
|
211
|
+
const i0 = indices[triIndex] * 3;
|
|
212
|
+
const i1 = indices[triIndex + 1] * 3;
|
|
213
|
+
const i2 = indices[triIndex + 2] * 3;
|
|
214
|
+
const v0 = {
|
|
215
|
+
x: positions[i0],
|
|
216
|
+
y: positions[i0 + 1],
|
|
217
|
+
z: positions[i0 + 2],
|
|
218
|
+
};
|
|
219
|
+
const v1 = {
|
|
220
|
+
x: positions[i1],
|
|
221
|
+
y: positions[i1 + 1],
|
|
222
|
+
z: positions[i1 + 2],
|
|
223
|
+
};
|
|
224
|
+
const v2 = {
|
|
225
|
+
x: positions[i2],
|
|
226
|
+
y: positions[i2 + 1],
|
|
227
|
+
z: positions[i2 + 2],
|
|
228
|
+
};
|
|
229
|
+
const center = {
|
|
230
|
+
x: (v0.x + v1.x + v2.x) / 3,
|
|
231
|
+
y: (v0.y + v1.y + v2.y) / 3,
|
|
232
|
+
z: (v0.z + v1.z + v2.z) / 3,
|
|
233
|
+
};
|
|
234
|
+
const dist = this.distance(center, intersection.point);
|
|
235
|
+
if (dist < radius) {
|
|
236
|
+
targets.push({
|
|
237
|
+
type: SnapType.FACE_CENTER,
|
|
238
|
+
position: center,
|
|
239
|
+
normal: intersection.normal,
|
|
240
|
+
expressId: mesh.expressId,
|
|
241
|
+
confidence: 0.7 * (1.0 - dist / radius),
|
|
242
|
+
metadata: { faceIndex: intersection.triangleIndex },
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return targets;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Select best snap target based on confidence and priority
|
|
250
|
+
*/
|
|
251
|
+
getBestSnapTarget(targets, cursorPoint) {
|
|
252
|
+
if (targets.length === 0)
|
|
253
|
+
return null;
|
|
254
|
+
// Priority order: vertex > edge_midpoint > edge > face_center > face
|
|
255
|
+
const priorityMap = {
|
|
256
|
+
[SnapType.VERTEX]: 5,
|
|
257
|
+
[SnapType.EDGE_MIDPOINT]: 4,
|
|
258
|
+
[SnapType.EDGE]: 3,
|
|
259
|
+
[SnapType.FACE_CENTER]: 2,
|
|
260
|
+
[SnapType.FACE]: 1,
|
|
261
|
+
};
|
|
262
|
+
// Sort by priority then confidence
|
|
263
|
+
targets.sort((a, b) => {
|
|
264
|
+
const priorityDiff = priorityMap[b.type] - priorityMap[a.type];
|
|
265
|
+
if (priorityDiff !== 0)
|
|
266
|
+
return priorityDiff;
|
|
267
|
+
return b.confidence - a.confidence;
|
|
268
|
+
});
|
|
269
|
+
return targets[0];
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Convert screen-space radius to world-space radius
|
|
273
|
+
*/
|
|
274
|
+
screenToWorldRadius(screenRadius, distance, fov, screenHeight) {
|
|
275
|
+
// Calculate world height at distance
|
|
276
|
+
const fovRadians = (fov * Math.PI) / 180;
|
|
277
|
+
const worldHeight = 2 * distance * Math.tan(fovRadians / 2);
|
|
278
|
+
// Convert screen pixels to world units
|
|
279
|
+
return (screenRadius / screenHeight) * worldHeight;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Vector utilities
|
|
283
|
+
*/
|
|
284
|
+
distance(a, b) {
|
|
285
|
+
const dx = a.x - b.x;
|
|
286
|
+
const dy = a.y - b.y;
|
|
287
|
+
const dz = a.z - b.z;
|
|
288
|
+
return Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=snap-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snap-detector.js","sourceRoot":"","sources":["../src/snap-detector.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -92,4 +92,13 @@ export interface RenderOptions {
|
|
|
92
92
|
sectionPlane?: SectionPlane;
|
|
93
93
|
isStreaming?: boolean;
|
|
94
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Options for GPU picking/selection
|
|
97
|
+
* Filters out hidden/invisible elements so users can select what's visible
|
|
98
|
+
*/
|
|
99
|
+
export interface PickOptions {
|
|
100
|
+
isStreaming?: boolean;
|
|
101
|
+
hiddenIds?: Set<number>;
|
|
102
|
+
isolatedIds?: Set<number> | null;
|
|
103
|
+
}
|
|
95
104
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zero-Copy GPU Uploader - uploads geometry directly from WASM memory to WebGPU
|
|
3
|
+
*
|
|
4
|
+
* This module provides efficient GPU buffer creation and upload from WASM memory.
|
|
5
|
+
* It eliminates intermediate JavaScript copies by using TypedArray views directly
|
|
6
|
+
* into WASM linear memory.
|
|
7
|
+
*
|
|
8
|
+
* Performance benefits:
|
|
9
|
+
* - 60-70% reduction in peak RAM usage
|
|
10
|
+
* - 40-50% faster geometry-to-GPU pipeline
|
|
11
|
+
* - Reduced GC pressure
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* WASM memory interface for zero-copy access
|
|
15
|
+
*/
|
|
16
|
+
export interface WasmMemoryHandle {
|
|
17
|
+
buffer: ArrayBuffer;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* GPU-ready geometry with pointer access
|
|
21
|
+
*/
|
|
22
|
+
export interface GpuGeometryData {
|
|
23
|
+
vertexDataPtr: number;
|
|
24
|
+
vertexDataLen: number;
|
|
25
|
+
vertexDataByteLength: number;
|
|
26
|
+
indicesPtr: number;
|
|
27
|
+
indicesLen: number;
|
|
28
|
+
indicesByteLength: number;
|
|
29
|
+
meshCount: number;
|
|
30
|
+
totalVertexCount: number;
|
|
31
|
+
totalTriangleCount: number;
|
|
32
|
+
getMeshMetadata(index: number): {
|
|
33
|
+
expressId: number;
|
|
34
|
+
vertexOffset: number;
|
|
35
|
+
vertexCount: number;
|
|
36
|
+
indexOffset: number;
|
|
37
|
+
indexCount: number;
|
|
38
|
+
color: number[];
|
|
39
|
+
} | undefined;
|
|
40
|
+
free(): void;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* GPU-ready instanced geometry with pointer access
|
|
44
|
+
*/
|
|
45
|
+
export interface GpuInstancedGeometryData {
|
|
46
|
+
geometryId: bigint;
|
|
47
|
+
vertexDataPtr: number;
|
|
48
|
+
vertexDataLen: number;
|
|
49
|
+
vertexDataByteLength: number;
|
|
50
|
+
indicesPtr: number;
|
|
51
|
+
indicesLen: number;
|
|
52
|
+
indicesByteLength: number;
|
|
53
|
+
instanceDataPtr: number;
|
|
54
|
+
instanceDataLen: number;
|
|
55
|
+
instanceDataByteLength: number;
|
|
56
|
+
instanceExpressIdsPtr: number;
|
|
57
|
+
instanceCount: number;
|
|
58
|
+
vertexCount: number;
|
|
59
|
+
triangleCount: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Mesh metadata for draw calls and selection
|
|
63
|
+
*/
|
|
64
|
+
export interface ZeroCopyMeshMetadata {
|
|
65
|
+
expressId: number;
|
|
66
|
+
vertexOffset: number;
|
|
67
|
+
vertexCount: number;
|
|
68
|
+
indexOffset: number;
|
|
69
|
+
indexCount: number;
|
|
70
|
+
color: [number, number, number, number];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Result of uploading a geometry batch
|
|
74
|
+
*/
|
|
75
|
+
export interface ZeroCopyUploadResult {
|
|
76
|
+
vertexBuffer: GPUBuffer;
|
|
77
|
+
indexBuffer: GPUBuffer;
|
|
78
|
+
meshMetadata: ZeroCopyMeshMetadata[];
|
|
79
|
+
stats: {
|
|
80
|
+
meshCount: number;
|
|
81
|
+
vertexCount: number;
|
|
82
|
+
triangleCount: number;
|
|
83
|
+
uploadTimeMs: number;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Result of uploading instanced geometry
|
|
88
|
+
*/
|
|
89
|
+
export interface ZeroCopyInstancedUploadResult {
|
|
90
|
+
geometryId: bigint;
|
|
91
|
+
vertexBuffer: GPUBuffer;
|
|
92
|
+
indexBuffer: GPUBuffer;
|
|
93
|
+
instanceBuffer: GPUBuffer;
|
|
94
|
+
indexCount: number;
|
|
95
|
+
instanceCount: number;
|
|
96
|
+
expressIds: number[];
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Zero-copy GPU uploader for direct WASM-to-GPU data transfer
|
|
100
|
+
*/
|
|
101
|
+
export declare class ZeroCopyGpuUploader {
|
|
102
|
+
private device;
|
|
103
|
+
private wasmMemory;
|
|
104
|
+
private cachedBuffer;
|
|
105
|
+
constructor(device: GPUDevice, wasmMemory: WasmMemoryHandle);
|
|
106
|
+
/**
|
|
107
|
+
* Get current WASM memory buffer (may change if memory grows)
|
|
108
|
+
*/
|
|
109
|
+
private getBuffer;
|
|
110
|
+
/**
|
|
111
|
+
* Create Float32Array view into WASM memory (zero-copy)
|
|
112
|
+
*/
|
|
113
|
+
private createFloat32View;
|
|
114
|
+
/**
|
|
115
|
+
* Create Uint32Array view into WASM memory (zero-copy)
|
|
116
|
+
*/
|
|
117
|
+
private createUint32View;
|
|
118
|
+
/**
|
|
119
|
+
* Upload GPU geometry with zero-copy from WASM memory
|
|
120
|
+
*
|
|
121
|
+
* IMPORTANT: Call this synchronously - don't await between getting
|
|
122
|
+
* the geometry and calling this method!
|
|
123
|
+
*
|
|
124
|
+
* @param geometry GPU-ready geometry from WASM
|
|
125
|
+
* @returns Upload result with GPU buffers and metadata
|
|
126
|
+
*/
|
|
127
|
+
uploadGeometry(geometry: GpuGeometryData): ZeroCopyUploadResult;
|
|
128
|
+
/**
|
|
129
|
+
* Upload instanced geometry with zero-copy from WASM memory
|
|
130
|
+
*/
|
|
131
|
+
uploadInstancedGeometry(geometry: GpuInstancedGeometryData): ZeroCopyInstancedUploadResult;
|
|
132
|
+
/**
|
|
133
|
+
* Upload geometry and immediately free WASM memory
|
|
134
|
+
*
|
|
135
|
+
* Convenience method that handles the upload-then-free pattern
|
|
136
|
+
*/
|
|
137
|
+
uploadAndFree(geometry: GpuGeometryData): ZeroCopyUploadResult;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a zero-copy uploader from a GPU device and WASM API
|
|
141
|
+
*/
|
|
142
|
+
export declare function createZeroCopyUploader(device: GPUDevice, wasmApi: {
|
|
143
|
+
getMemory(): WasmMemoryHandle;
|
|
144
|
+
}): ZeroCopyGpuUploader;
|
|
145
|
+
//# sourceMappingURL=zero-copy-uploader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zero-copy-uploader.d.ts","sourceRoot":"","sources":["../src/zero-copy-uploader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
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
|
+
* Zero-copy GPU uploader for direct WASM-to-GPU data transfer
|
|
6
|
+
*/
|
|
7
|
+
export class ZeroCopyGpuUploader {
|
|
8
|
+
device;
|
|
9
|
+
wasmMemory;
|
|
10
|
+
cachedBuffer = null;
|
|
11
|
+
constructor(device, wasmMemory) {
|
|
12
|
+
this.device = device;
|
|
13
|
+
this.wasmMemory = wasmMemory;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get current WASM memory buffer (may change if memory grows)
|
|
17
|
+
*/
|
|
18
|
+
getBuffer() {
|
|
19
|
+
const currentBuffer = this.wasmMemory.buffer;
|
|
20
|
+
if (this.cachedBuffer !== currentBuffer) {
|
|
21
|
+
this.cachedBuffer = currentBuffer;
|
|
22
|
+
}
|
|
23
|
+
return currentBuffer;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create Float32Array view into WASM memory (zero-copy)
|
|
27
|
+
*/
|
|
28
|
+
createFloat32View(byteOffset, length) {
|
|
29
|
+
return new Float32Array(this.getBuffer(), byteOffset, length);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create Uint32Array view into WASM memory (zero-copy)
|
|
33
|
+
*/
|
|
34
|
+
createUint32View(byteOffset, length) {
|
|
35
|
+
return new Uint32Array(this.getBuffer(), byteOffset, length);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Upload GPU geometry with zero-copy from WASM memory
|
|
39
|
+
*
|
|
40
|
+
* IMPORTANT: Call this synchronously - don't await between getting
|
|
41
|
+
* the geometry and calling this method!
|
|
42
|
+
*
|
|
43
|
+
* @param geometry GPU-ready geometry from WASM
|
|
44
|
+
* @returns Upload result with GPU buffers and metadata
|
|
45
|
+
*/
|
|
46
|
+
uploadGeometry(geometry) {
|
|
47
|
+
const startTime = performance.now();
|
|
48
|
+
// Create zero-copy views into WASM memory
|
|
49
|
+
const vertexView = this.createFloat32View(geometry.vertexDataPtr, geometry.vertexDataLen);
|
|
50
|
+
const indexView = this.createUint32View(geometry.indicesPtr, geometry.indicesLen);
|
|
51
|
+
// Create GPU buffers
|
|
52
|
+
const vertexBuffer = this.device.createBuffer({
|
|
53
|
+
size: geometry.vertexDataByteLength,
|
|
54
|
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
55
|
+
});
|
|
56
|
+
const indexBuffer = this.device.createBuffer({
|
|
57
|
+
size: geometry.indicesByteLength,
|
|
58
|
+
usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
|
|
59
|
+
});
|
|
60
|
+
// Upload directly from WASM memory (single copy to GPU)
|
|
61
|
+
this.device.queue.writeBuffer(vertexBuffer, 0, vertexView);
|
|
62
|
+
this.device.queue.writeBuffer(indexBuffer, 0, indexView);
|
|
63
|
+
// Extract mesh metadata
|
|
64
|
+
const meshMetadata = [];
|
|
65
|
+
for (let i = 0; i < geometry.meshCount; i++) {
|
|
66
|
+
const meta = geometry.getMeshMetadata(i);
|
|
67
|
+
if (meta) {
|
|
68
|
+
meshMetadata.push({
|
|
69
|
+
expressId: meta.expressId,
|
|
70
|
+
vertexOffset: meta.vertexOffset,
|
|
71
|
+
vertexCount: meta.vertexCount,
|
|
72
|
+
indexOffset: meta.indexOffset,
|
|
73
|
+
indexCount: meta.indexCount,
|
|
74
|
+
color: meta.color,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const uploadTimeMs = performance.now() - startTime;
|
|
79
|
+
return {
|
|
80
|
+
vertexBuffer,
|
|
81
|
+
indexBuffer,
|
|
82
|
+
meshMetadata,
|
|
83
|
+
stats: {
|
|
84
|
+
meshCount: geometry.meshCount,
|
|
85
|
+
vertexCount: geometry.totalVertexCount,
|
|
86
|
+
triangleCount: geometry.totalTriangleCount,
|
|
87
|
+
uploadTimeMs,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Upload instanced geometry with zero-copy from WASM memory
|
|
93
|
+
*/
|
|
94
|
+
uploadInstancedGeometry(geometry) {
|
|
95
|
+
// Create zero-copy views
|
|
96
|
+
const vertexView = this.createFloat32View(geometry.vertexDataPtr, geometry.vertexDataLen);
|
|
97
|
+
const indexView = this.createUint32View(geometry.indicesPtr, geometry.indicesLen);
|
|
98
|
+
const instanceView = this.createFloat32View(geometry.instanceDataPtr, geometry.instanceDataLen);
|
|
99
|
+
const expressIdsView = this.createUint32View(geometry.instanceExpressIdsPtr, geometry.instanceCount);
|
|
100
|
+
// Create GPU buffers
|
|
101
|
+
const vertexBuffer = this.device.createBuffer({
|
|
102
|
+
size: geometry.vertexDataByteLength,
|
|
103
|
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
104
|
+
});
|
|
105
|
+
const indexBuffer = this.device.createBuffer({
|
|
106
|
+
size: geometry.indicesByteLength,
|
|
107
|
+
usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
|
|
108
|
+
});
|
|
109
|
+
const instanceBuffer = this.device.createBuffer({
|
|
110
|
+
size: geometry.instanceDataByteLength,
|
|
111
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
|
|
112
|
+
});
|
|
113
|
+
// Upload directly from WASM memory
|
|
114
|
+
this.device.queue.writeBuffer(vertexBuffer, 0, vertexView);
|
|
115
|
+
this.device.queue.writeBuffer(indexBuffer, 0, indexView);
|
|
116
|
+
this.device.queue.writeBuffer(instanceBuffer, 0, instanceView);
|
|
117
|
+
// Copy express IDs (small array)
|
|
118
|
+
const expressIds = Array.from(expressIdsView);
|
|
119
|
+
return {
|
|
120
|
+
geometryId: geometry.geometryId,
|
|
121
|
+
vertexBuffer,
|
|
122
|
+
indexBuffer,
|
|
123
|
+
instanceBuffer,
|
|
124
|
+
indexCount: geometry.indicesLen,
|
|
125
|
+
instanceCount: geometry.instanceCount,
|
|
126
|
+
expressIds,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Upload geometry and immediately free WASM memory
|
|
131
|
+
*
|
|
132
|
+
* Convenience method that handles the upload-then-free pattern
|
|
133
|
+
*/
|
|
134
|
+
uploadAndFree(geometry) {
|
|
135
|
+
const result = this.uploadGeometry(geometry);
|
|
136
|
+
geometry.free();
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Create a zero-copy uploader from a GPU device and WASM API
|
|
142
|
+
*/
|
|
143
|
+
export function createZeroCopyUploader(device, wasmApi) {
|
|
144
|
+
return new ZeroCopyGpuUploader(device, wasmApi.getMemory());
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=zero-copy-uploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zero-copy-uploader.js","sourceRoot":"","sources":["../src/zero-copy-uploader.ts"],"names":[],"mappings":"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"}
|