streamkit-pointcloud 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +345 -0
- package/dist/core/validators.d.ts +44 -0
- package/dist/core/validators.d.ts.map +1 -0
- package/dist/core/validators.js +115 -0
- package/dist/core/validators.js.map +1 -0
- package/dist/draco/decoder.d.ts +31 -0
- package/dist/draco/decoder.d.ts.map +1 -0
- package/dist/draco/decoder.js +204 -0
- package/dist/draco/decoder.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/three/pointCloudLayer.d.ts +43 -0
- package/dist/three/pointCloudLayer.d.ts.map +1 -0
- package/dist/three/pointCloudLayer.js +494 -0
- package/dist/three/pointCloudLayer.js.map +1 -0
- package/dist/three/three-types.d.ts +39 -0
- package/dist/three/three-types.d.ts.map +1 -0
- package/dist/three/three-types.js +6 -0
- package/dist/three/three-types.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streamkit/pointcloud - Three.js PointCloud Layer
|
|
3
|
+
*
|
|
4
|
+
* High-performance point cloud rendering layer for Three.js.
|
|
5
|
+
* Manages geometry, material, and lifecycle for point cloud visualization.
|
|
6
|
+
*/
|
|
7
|
+
import * as THREE from "three";
|
|
8
|
+
import { hasMatchingColorCount, normalizeColorValue, } from "../core/validators.js";
|
|
9
|
+
/** Default point size in world units */
|
|
10
|
+
const DEFAULT_POINT_SIZE = 0.01;
|
|
11
|
+
/** Default point color (white) */
|
|
12
|
+
const DEFAULT_POINT_COLOR = 0xffffff;
|
|
13
|
+
/** Default initial buffer capacity for append mode */
|
|
14
|
+
const DEFAULT_BUFFER_CAPACITY = 100000;
|
|
15
|
+
/** Growth factor when buffer needs expansion */
|
|
16
|
+
const BUFFER_GROWTH_FACTOR = 2;
|
|
17
|
+
/**
|
|
18
|
+
* Writes points directly into a Float32Array at the specified offset.
|
|
19
|
+
* @param target - Target array to write into
|
|
20
|
+
* @param points - Points to write
|
|
21
|
+
* @param startIndex - Starting point index in target
|
|
22
|
+
*/
|
|
23
|
+
function writePointsToArray(target, points, startIndex) {
|
|
24
|
+
const baseIdx = startIndex * 3;
|
|
25
|
+
for (let i = 0; i < points.length; i++) {
|
|
26
|
+
const point = points[i];
|
|
27
|
+
const idx = baseIdx + i * 3;
|
|
28
|
+
target[idx] = point.x;
|
|
29
|
+
target[idx + 1] = point.y;
|
|
30
|
+
target[idx + 2] = point.z;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Writes colors directly into a Float32Array at the specified offset (normalized).
|
|
35
|
+
* @param target - Target array to write into
|
|
36
|
+
* @param colors - Colors to write (0-255 range)
|
|
37
|
+
* @param startIndex - Starting point index in target
|
|
38
|
+
*/
|
|
39
|
+
function writeColorsToArray(target, colors, startIndex) {
|
|
40
|
+
const baseIdx = startIndex * 3;
|
|
41
|
+
for (let i = 0; i < colors.length; i++) {
|
|
42
|
+
const color = colors[i];
|
|
43
|
+
const idx = baseIdx + i * 3;
|
|
44
|
+
target[idx] = normalizeColorValue(color.r);
|
|
45
|
+
target[idx + 1] = normalizeColorValue(color.g);
|
|
46
|
+
target[idx + 2] = normalizeColorValue(color.b);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Converts PointCloudData points to a Float32Array for BufferGeometry.
|
|
51
|
+
* @param points - Array of points
|
|
52
|
+
* @param capacity - Optional pre-allocated capacity (for streaming)
|
|
53
|
+
* @returns Float32Array of positions
|
|
54
|
+
*/
|
|
55
|
+
function pointsToPositionArray(points, capacity) {
|
|
56
|
+
const size = capacity ?? points.length;
|
|
57
|
+
const array = new Float32Array(size * 3);
|
|
58
|
+
writePointsToArray(array, points, 0);
|
|
59
|
+
return array;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Converts PointCloudData colors to a Float32Array (normalized 0-1).
|
|
63
|
+
* @param colors - Array of colors (0-255 range)
|
|
64
|
+
* @param capacity - Optional pre-allocated capacity (for streaming)
|
|
65
|
+
* @returns Float32Array of normalized colors
|
|
66
|
+
*/
|
|
67
|
+
function colorsToColorArray(colors, capacity) {
|
|
68
|
+
const size = capacity ?? colors.length;
|
|
69
|
+
const array = new Float32Array(size * 3);
|
|
70
|
+
writeColorsToArray(array, colors, 0);
|
|
71
|
+
return array;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Creates a new BufferGeometry from PointCloudData.
|
|
75
|
+
* @param data - The point cloud data
|
|
76
|
+
* @returns Configured BufferGeometry
|
|
77
|
+
*/
|
|
78
|
+
function createGeometry(data) {
|
|
79
|
+
const geometry = new THREE.BufferGeometry();
|
|
80
|
+
// Set positions
|
|
81
|
+
const positions = pointsToPositionArray(data.points);
|
|
82
|
+
geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3));
|
|
83
|
+
// Set colors if available and matching
|
|
84
|
+
if (data.colors && hasMatchingColorCount(data)) {
|
|
85
|
+
const colors = colorsToColorArray(data.colors);
|
|
86
|
+
geometry.setAttribute("color", new THREE.BufferAttribute(colors, 3));
|
|
87
|
+
}
|
|
88
|
+
// Compute bounding sphere for frustum culling
|
|
89
|
+
geometry.computeBoundingSphere();
|
|
90
|
+
return geometry;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Creates a PointsMaterial configured for the given data.
|
|
94
|
+
* @param data - The point cloud data
|
|
95
|
+
* @param defaultSize - Default point size
|
|
96
|
+
* @param defaultColor - Default point color
|
|
97
|
+
* @returns Configured PointsMaterial
|
|
98
|
+
*/
|
|
99
|
+
function createMaterial(data, defaultSize, defaultColor) {
|
|
100
|
+
const hasVertexColors = data.colors && hasMatchingColorCount(data);
|
|
101
|
+
const useUniformColor = data.color !== undefined && !hasVertexColors;
|
|
102
|
+
return new THREE.PointsMaterial({
|
|
103
|
+
size: data.size ?? defaultSize,
|
|
104
|
+
color: useUniformColor ? data.color : defaultColor,
|
|
105
|
+
vertexColors: hasVertexColors,
|
|
106
|
+
opacity: data.opacity ?? 1.0,
|
|
107
|
+
transparent: (data.opacity ?? 1.0) < 1.0,
|
|
108
|
+
sizeAttenuation: true, // Points get smaller with distance
|
|
109
|
+
depthWrite: true,
|
|
110
|
+
depthTest: true,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Updates an existing BufferGeometry with new data.
|
|
115
|
+
* Reuses buffers when possible for better performance.
|
|
116
|
+
* @param geometry - The geometry to update
|
|
117
|
+
* @param data - New point cloud data
|
|
118
|
+
* @returns True if geometry was updated in place, false if rebuild needed
|
|
119
|
+
*/
|
|
120
|
+
function updateGeometry(geometry, data) {
|
|
121
|
+
const positionAttr = geometry.getAttribute("position");
|
|
122
|
+
const colorAttr = geometry.getAttribute("color");
|
|
123
|
+
// Check if we can reuse the position buffer
|
|
124
|
+
const currentCount = positionAttr.count;
|
|
125
|
+
const newCount = data.points.length;
|
|
126
|
+
// If point count changed significantly, we need to rebuild
|
|
127
|
+
if (newCount !== currentCount) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
// Update positions in place
|
|
131
|
+
const positions = pointsToPositionArray(data.points);
|
|
132
|
+
positionAttr.array.set(positions);
|
|
133
|
+
positionAttr.needsUpdate = true;
|
|
134
|
+
// Update colors
|
|
135
|
+
if (data.colors && hasMatchingColorCount(data)) {
|
|
136
|
+
const colors = colorsToColorArray(data.colors);
|
|
137
|
+
if (colorAttr && colorAttr.count === newCount) {
|
|
138
|
+
// Update existing color buffer
|
|
139
|
+
colorAttr.array.set(colors);
|
|
140
|
+
colorAttr.needsUpdate = true;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// Need to add color attribute
|
|
144
|
+
geometry.setAttribute("color", new THREE.BufferAttribute(colors, 3));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else if (colorAttr) {
|
|
148
|
+
// Remove color attribute if no longer needed
|
|
149
|
+
geometry.deleteAttribute?.("color");
|
|
150
|
+
}
|
|
151
|
+
// Update bounding sphere
|
|
152
|
+
geometry.computeBoundingSphere();
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Updates material properties based on new data.
|
|
157
|
+
* @param material - The material to update
|
|
158
|
+
* @param data - New point cloud data
|
|
159
|
+
* @param defaultSize - Default point size
|
|
160
|
+
* @param defaultColor - Default point color
|
|
161
|
+
*/
|
|
162
|
+
function updateMaterial(material, data, defaultSize, defaultColor) {
|
|
163
|
+
const hasVertexColors = Boolean(data.colors && hasMatchingColorCount(data));
|
|
164
|
+
material.size = data.size ?? defaultSize;
|
|
165
|
+
material.vertexColors = hasVertexColors;
|
|
166
|
+
material.color.setHex(data.color ?? defaultColor);
|
|
167
|
+
material.opacity = data.opacity ?? 1.0;
|
|
168
|
+
material.transparent = material.opacity < 1.0;
|
|
169
|
+
material.needsUpdate = true;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Creates a PointCloud rendering layer for Three.js.
|
|
173
|
+
*
|
|
174
|
+
* This function returns a controller object that manages the lifecycle
|
|
175
|
+
* of a point cloud in a Three.js scene.
|
|
176
|
+
*
|
|
177
|
+
* @param options - Configuration options
|
|
178
|
+
* @returns PointCloudLayer controller
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* import * as THREE from 'three'
|
|
183
|
+
* import { createPointCloudLayer } from '@streamkit/pointcloud'
|
|
184
|
+
*import { ThreeBufferGeometryLike } from './three-types';
|
|
185
|
+
|
|
186
|
+
* const scene = new THREE.Scene()
|
|
187
|
+
* const layer = createPointCloudLayer({ scene })
|
|
188
|
+
*
|
|
189
|
+
* // Build initial point cloud
|
|
190
|
+
* layer.build({
|
|
191
|
+
* points: [{ x: 0, y: 0, z: 0 }, { x: 1, y: 1, z: 1 }],
|
|
192
|
+
* colors: [{ r: 255, g: 0, b: 0 }, { r: 0, g: 255, b: 0 }]
|
|
193
|
+
* })
|
|
194
|
+
*
|
|
195
|
+
* // Incremental append
|
|
196
|
+
* layer.update(newData, { mode: 'append' })
|
|
197
|
+
*
|
|
198
|
+
* // Partial update at offset
|
|
199
|
+
* layer.update(partialData, { mode: 'partial', offset: 100 })
|
|
200
|
+
*
|
|
201
|
+
* // Clean up when done
|
|
202
|
+
* layer.dispose()
|
|
203
|
+
* ```
|
|
204
|
+
*/
|
|
205
|
+
export function createPointCloudLayer(options) {
|
|
206
|
+
const { scene, defaultSize = DEFAULT_POINT_SIZE, defaultColor = DEFAULT_POINT_COLOR, } = options;
|
|
207
|
+
// Internal state
|
|
208
|
+
let geometry = null;
|
|
209
|
+
let material = null;
|
|
210
|
+
let points = null;
|
|
211
|
+
let isDisposed = false;
|
|
212
|
+
// Streaming state: tracks actual point count vs buffer capacity
|
|
213
|
+
let activePointCount = 0;
|
|
214
|
+
let bufferCapacity = 0;
|
|
215
|
+
let hasColors = false;
|
|
216
|
+
/**
|
|
217
|
+
* Validates that the layer has not been disposed.
|
|
218
|
+
*/
|
|
219
|
+
function assertNotDisposed() {
|
|
220
|
+
if (isDisposed) {
|
|
221
|
+
throw new Error("PointCloudLayer has been disposed and cannot be used");
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Removes the current point cloud from the scene without disposing resources.
|
|
226
|
+
*/
|
|
227
|
+
function removeFromScene() {
|
|
228
|
+
if (points) {
|
|
229
|
+
scene.remove(points);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Disposes of geometry and material resources.
|
|
234
|
+
*/
|
|
235
|
+
function disposeResources() {
|
|
236
|
+
if (geometry) {
|
|
237
|
+
geometry.dispose();
|
|
238
|
+
geometry = null;
|
|
239
|
+
}
|
|
240
|
+
if (material) {
|
|
241
|
+
material.dispose();
|
|
242
|
+
material = null;
|
|
243
|
+
}
|
|
244
|
+
points = null;
|
|
245
|
+
activePointCount = 0;
|
|
246
|
+
bufferCapacity = 0;
|
|
247
|
+
hasColors = false;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Creates geometry with pre-allocated buffers for streaming.
|
|
251
|
+
*/
|
|
252
|
+
function createStreamingGeometry(data, capacity) {
|
|
253
|
+
const geo = new THREE.BufferGeometry();
|
|
254
|
+
const positions = pointsToPositionArray(data.points, capacity);
|
|
255
|
+
const posAttr = new THREE.BufferAttribute(positions, 3);
|
|
256
|
+
posAttr.setUsage(THREE.DynamicDrawUsage);
|
|
257
|
+
geo.setAttribute("position", posAttr);
|
|
258
|
+
if (data.colors && hasMatchingColorCount(data)) {
|
|
259
|
+
const colors = colorsToColorArray(data.colors, capacity);
|
|
260
|
+
const colorAttr = new THREE.BufferAttribute(colors, 3);
|
|
261
|
+
colorAttr.setUsage(THREE.DynamicDrawUsage);
|
|
262
|
+
geo.setAttribute("color", colorAttr);
|
|
263
|
+
hasColors = true;
|
|
264
|
+
}
|
|
265
|
+
// Set draw range to actual point count
|
|
266
|
+
geo.setDrawRange(0, data.points.length);
|
|
267
|
+
geo.computeBoundingSphere();
|
|
268
|
+
return geo;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Expands buffer capacity by creating new larger buffers.
|
|
272
|
+
*/
|
|
273
|
+
function expandBuffers(requiredCapacity) {
|
|
274
|
+
if (!geometry)
|
|
275
|
+
return;
|
|
276
|
+
const newCapacity = Math.max(requiredCapacity, Math.ceil(bufferCapacity * BUFFER_GROWTH_FACTOR));
|
|
277
|
+
const oldPosAttr = geometry.getAttribute("position");
|
|
278
|
+
const newPositions = new Float32Array(newCapacity * 3);
|
|
279
|
+
newPositions.set(oldPosAttr.array.slice(0, activePointCount * 3));
|
|
280
|
+
const newPosAttr = new THREE.BufferAttribute(newPositions, 3);
|
|
281
|
+
newPosAttr.setUsage(THREE.DynamicDrawUsage);
|
|
282
|
+
geometry.setAttribute("position", newPosAttr);
|
|
283
|
+
if (hasColors) {
|
|
284
|
+
const oldColorAttr = geometry.getAttribute("color");
|
|
285
|
+
if (oldColorAttr) {
|
|
286
|
+
const newColors = new Float32Array(newCapacity * 3);
|
|
287
|
+
newColors.set(oldColorAttr.array.slice(0, activePointCount * 3));
|
|
288
|
+
const newColorAttr = new THREE.BufferAttribute(newColors, 3);
|
|
289
|
+
newColorAttr.setUsage(THREE.DynamicDrawUsage);
|
|
290
|
+
geometry.setAttribute("color", newColorAttr);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
bufferCapacity = newCapacity;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Handles 'append' mode: adds new points to existing buffer.
|
|
297
|
+
*/
|
|
298
|
+
function handleAppend(data, maxPoints) {
|
|
299
|
+
if (!geometry || !material) {
|
|
300
|
+
// First append: create with initial capacity
|
|
301
|
+
const initialCapacity = Math.max(DEFAULT_BUFFER_CAPACITY, data.points.length * BUFFER_GROWTH_FACTOR);
|
|
302
|
+
geometry = createStreamingGeometry(data, initialCapacity);
|
|
303
|
+
material = createMaterial(data, defaultSize, defaultColor);
|
|
304
|
+
points = new THREE.Points(geometry, material);
|
|
305
|
+
scene.add(points);
|
|
306
|
+
activePointCount = data.points.length;
|
|
307
|
+
bufferCapacity = initialCapacity;
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const newTotal = activePointCount + data.points.length;
|
|
311
|
+
// Check if we need to enforce maxPoints (ring buffer behavior)
|
|
312
|
+
if (maxPoints && newTotal > maxPoints) {
|
|
313
|
+
const overflow = newTotal - maxPoints;
|
|
314
|
+
const keepCount = activePointCount - overflow;
|
|
315
|
+
if (keepCount > 0) {
|
|
316
|
+
// Shift existing data to make room
|
|
317
|
+
const posAttr = geometry.getAttribute("position");
|
|
318
|
+
const posArray = posAttr.array;
|
|
319
|
+
posArray.copyWithin(0, overflow * 3, activePointCount * 3);
|
|
320
|
+
if (hasColors) {
|
|
321
|
+
const colorAttr = geometry.getAttribute("color");
|
|
322
|
+
if (colorAttr) {
|
|
323
|
+
const colorArray = colorAttr.array;
|
|
324
|
+
colorArray.copyWithin(0, overflow * 3, activePointCount * 3);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
activePointCount = keepCount;
|
|
328
|
+
}
|
|
329
|
+
else {
|
|
330
|
+
// New data exceeds maxPoints entirely, replace
|
|
331
|
+
activePointCount = 0;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
const requiredCapacity = activePointCount + data.points.length;
|
|
335
|
+
// Expand buffers if needed
|
|
336
|
+
if (requiredCapacity > bufferCapacity) {
|
|
337
|
+
expandBuffers(requiredCapacity);
|
|
338
|
+
}
|
|
339
|
+
// Write new points at current end position
|
|
340
|
+
const posAttr = geometry.getAttribute("position");
|
|
341
|
+
writePointsToArray(posAttr.array, data.points, activePointCount);
|
|
342
|
+
posAttr.needsUpdate = true;
|
|
343
|
+
// Write new colors if provided
|
|
344
|
+
if (data.colors && hasMatchingColorCount(data)) {
|
|
345
|
+
let colorAttr = geometry.getAttribute("color");
|
|
346
|
+
if (!colorAttr && hasColors) {
|
|
347
|
+
const colors = new Float32Array(bufferCapacity * 3);
|
|
348
|
+
const newColorAttr = new THREE.BufferAttribute(colors, 3);
|
|
349
|
+
newColorAttr.setUsage(THREE.DynamicDrawUsage);
|
|
350
|
+
geometry.setAttribute("color", newColorAttr);
|
|
351
|
+
colorAttr = newColorAttr;
|
|
352
|
+
}
|
|
353
|
+
if (colorAttr) {
|
|
354
|
+
writeColorsToArray(colorAttr.array, data.colors, activePointCount);
|
|
355
|
+
colorAttr.needsUpdate = true;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
activePointCount += data.points.length;
|
|
359
|
+
geometry.setDrawRange(0, activePointCount);
|
|
360
|
+
geometry.computeBoundingSphere();
|
|
361
|
+
updateMaterial(material, data, defaultSize, defaultColor);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Handles 'partial' mode: updates subset of points at offset.
|
|
365
|
+
*/
|
|
366
|
+
function handlePartial(data, offset) {
|
|
367
|
+
if (!geometry || !material) {
|
|
368
|
+
console.warn("PointCloudLayer.update: No geometry to update partially. Use build() first.");
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
// Validate offset
|
|
372
|
+
if (offset < 0) {
|
|
373
|
+
console.warn("PointCloudLayer.update: Invalid offset (negative)");
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
if (offset >= activePointCount) {
|
|
377
|
+
console.warn("PointCloudLayer.update: Offset exceeds current point count");
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
// Calculate how many points we can actually update
|
|
381
|
+
const maxUpdateCount = activePointCount - offset;
|
|
382
|
+
const updateCount = Math.min(data.points.length, maxUpdateCount);
|
|
383
|
+
if (updateCount === 0) {
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
// Update positions
|
|
387
|
+
const posAttr = geometry.getAttribute("position");
|
|
388
|
+
const posArray = posAttr.array;
|
|
389
|
+
const baseIdx = offset * 3;
|
|
390
|
+
for (let i = 0; i < updateCount; i++) {
|
|
391
|
+
const point = data.points[i];
|
|
392
|
+
const idx = baseIdx + i * 3;
|
|
393
|
+
posArray[idx] = point.x;
|
|
394
|
+
posArray[idx + 1] = point.y;
|
|
395
|
+
posArray[idx + 2] = point.z;
|
|
396
|
+
}
|
|
397
|
+
posAttr.needsUpdate = true;
|
|
398
|
+
// Update colors if provided
|
|
399
|
+
if (data.colors && data.colors.length >= updateCount && hasColors) {
|
|
400
|
+
const colorAttr = geometry.getAttribute("color");
|
|
401
|
+
if (colorAttr) {
|
|
402
|
+
const colorArray = colorAttr.array;
|
|
403
|
+
for (let i = 0; i < updateCount; i++) {
|
|
404
|
+
const color = data.colors[i];
|
|
405
|
+
const idx = baseIdx + i * 3;
|
|
406
|
+
colorArray[idx] = normalizeColorValue(color.r);
|
|
407
|
+
colorArray[idx + 1] = normalizeColorValue(color.g);
|
|
408
|
+
colorArray[idx + 2] = normalizeColorValue(color.b);
|
|
409
|
+
}
|
|
410
|
+
colorAttr.needsUpdate = true;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
geometry.computeBoundingSphere();
|
|
414
|
+
updateMaterial(material, data, defaultSize, defaultColor);
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Handles 'replace' mode: full geometry replacement.
|
|
418
|
+
*/
|
|
419
|
+
function handleReplace(data) {
|
|
420
|
+
// Clean up existing resources
|
|
421
|
+
removeFromScene();
|
|
422
|
+
disposeResources();
|
|
423
|
+
// Create new geometry and material
|
|
424
|
+
geometry = createGeometry(data);
|
|
425
|
+
material = createMaterial(data, defaultSize, defaultColor);
|
|
426
|
+
// Track state
|
|
427
|
+
activePointCount = data.points.length;
|
|
428
|
+
bufferCapacity = data.points.length;
|
|
429
|
+
hasColors = Boolean(data.colors && hasMatchingColorCount(data));
|
|
430
|
+
// Create Points object and add to scene
|
|
431
|
+
points = new THREE.Points(geometry, material);
|
|
432
|
+
scene.add(points);
|
|
433
|
+
}
|
|
434
|
+
return {
|
|
435
|
+
build(data) {
|
|
436
|
+
assertNotDisposed();
|
|
437
|
+
if (!data.points || data.points.length === 0) {
|
|
438
|
+
console.warn("PointCloudLayer.build: No points provided");
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
handleReplace(data);
|
|
442
|
+
},
|
|
443
|
+
update(data, options) {
|
|
444
|
+
assertNotDisposed();
|
|
445
|
+
if (!data.points || data.points.length === 0) {
|
|
446
|
+
console.warn("PointCloudLayer.update: No points provided");
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
const mode = options?.mode ?? "replace";
|
|
450
|
+
switch (mode) {
|
|
451
|
+
case "append":
|
|
452
|
+
handleAppend(data, options?.maxPoints);
|
|
453
|
+
break;
|
|
454
|
+
case "partial":
|
|
455
|
+
handlePartial(data, options?.offset ?? 0);
|
|
456
|
+
break;
|
|
457
|
+
case "replace":
|
|
458
|
+
default:
|
|
459
|
+
// If no existing geometry or point count differs, rebuild
|
|
460
|
+
if (!geometry || !material || !points) {
|
|
461
|
+
handleReplace(data);
|
|
462
|
+
}
|
|
463
|
+
else if (data.points.length === activePointCount) {
|
|
464
|
+
// Try in-place update for same-size data
|
|
465
|
+
const updated = updateGeometry(geometry, data);
|
|
466
|
+
if (updated) {
|
|
467
|
+
updateMaterial(material, data, defaultSize, defaultColor);
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
handleReplace(data);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
handleReplace(data);
|
|
475
|
+
}
|
|
476
|
+
break;
|
|
477
|
+
}
|
|
478
|
+
},
|
|
479
|
+
clear() {
|
|
480
|
+
assertNotDisposed();
|
|
481
|
+
removeFromScene();
|
|
482
|
+
disposeResources();
|
|
483
|
+
},
|
|
484
|
+
dispose() {
|
|
485
|
+
if (isDisposed) {
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
removeFromScene();
|
|
489
|
+
disposeResources();
|
|
490
|
+
isDisposed = true;
|
|
491
|
+
},
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=pointCloudLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pointCloudLayer.js","sourceRoot":"","sources":["../../src/three/pointCloudLayer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal structural typings for Three.js objects
|
|
3
|
+
* We avoid importing THREE types to prevent duplicate type conflicts.
|
|
4
|
+
*/
|
|
5
|
+
export interface ThreeSceneLike {
|
|
6
|
+
add(object: any): void;
|
|
7
|
+
remove(object: any): void;
|
|
8
|
+
}
|
|
9
|
+
export interface ThreeBufferAttributeLike {
|
|
10
|
+
array: Float32Array;
|
|
11
|
+
count: number;
|
|
12
|
+
itemSize: number;
|
|
13
|
+
needsUpdate?: boolean;
|
|
14
|
+
setUsage?(usage: number): void;
|
|
15
|
+
}
|
|
16
|
+
export interface ThreeBufferGeometryLike {
|
|
17
|
+
getAttribute(name: string): ThreeBufferAttributeLike | undefined;
|
|
18
|
+
setAttribute(name: string, attr: ThreeBufferAttributeLike): void;
|
|
19
|
+
deleteAttribute?(name: string): void;
|
|
20
|
+
setDrawRange(start: number, count: number): void;
|
|
21
|
+
computeBoundingSphere(): void;
|
|
22
|
+
dispose(): void;
|
|
23
|
+
}
|
|
24
|
+
export interface ThreeMaterialLike {
|
|
25
|
+
size: number;
|
|
26
|
+
vertexColors: boolean;
|
|
27
|
+
opacity: number;
|
|
28
|
+
transparent: boolean;
|
|
29
|
+
needsUpdate: boolean;
|
|
30
|
+
color: {
|
|
31
|
+
setHex(hex: number): void;
|
|
32
|
+
};
|
|
33
|
+
dispose(): void;
|
|
34
|
+
}
|
|
35
|
+
export interface ThreePointsLike {
|
|
36
|
+
geometry: ThreeBufferGeometryLike;
|
|
37
|
+
material: ThreeMaterialLike;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=three-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-types.d.ts","sourceRoot":"","sources":["../../src/three/three-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAAC;IACjE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACjE,eAAe,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,qBAAqB,IAAI,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE;QACL,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;IACF,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,uBAAuB,CAAC;IAClC,QAAQ,EAAE,iBAAiB,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"three-types.js","sourceRoot":"","sources":["../../src/three/three-types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @streamkit/pointcloud - Core Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Stable, runtime-agnostic types for PointCloud data.
|
|
5
|
+
* These types intentionally avoid importing Three.js typings
|
|
6
|
+
* to prevent duplicate type conflicts.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Represents a single point in 3D space.
|
|
10
|
+
*/
|
|
11
|
+
export interface PointCloudPoint {
|
|
12
|
+
x: number;
|
|
13
|
+
y: number;
|
|
14
|
+
z: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Represents an RGB color with values in the 0-255 range.
|
|
18
|
+
*/
|
|
19
|
+
export interface PointCloudColor {
|
|
20
|
+
r: number;
|
|
21
|
+
g: number;
|
|
22
|
+
b: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Core data structure for PointCloud data.
|
|
26
|
+
*
|
|
27
|
+
* This is the primary data exchange format used throughout the library.
|
|
28
|
+
* It is designed to be serializable and network-friendly.
|
|
29
|
+
*/
|
|
30
|
+
export interface PointCloudData {
|
|
31
|
+
/** Array of 3D points */
|
|
32
|
+
points: PointCloudPoint[];
|
|
33
|
+
/** Optional per-vertex colors (0-255 range) */
|
|
34
|
+
colors?: PointCloudColor[];
|
|
35
|
+
/** Point size override for rendering */
|
|
36
|
+
size?: number;
|
|
37
|
+
/** Uniform color override (hex format, e.g., 0xff0000) */
|
|
38
|
+
color?: number;
|
|
39
|
+
/** Opacity value (0-1) */
|
|
40
|
+
opacity?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Minimal structural contract for a Three.js Scene.
|
|
44
|
+
* The consumer provides a real THREE.Scene at runtime.
|
|
45
|
+
*/
|
|
46
|
+
export interface ThreeSceneLike {
|
|
47
|
+
add(object: any): void;
|
|
48
|
+
remove(object: any): void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Options for creating a PointCloud layer.
|
|
52
|
+
*/
|
|
53
|
+
export interface PointCloudLayerOptions {
|
|
54
|
+
/** Scene-like object to render into (typically THREE.Scene) */
|
|
55
|
+
scene: ThreeSceneLike;
|
|
56
|
+
/** Default point size when not specified in data */
|
|
57
|
+
defaultSize?: number;
|
|
58
|
+
/** Default color when not specified in data (hex format) */
|
|
59
|
+
defaultColor?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Interface for the PointCloud layer controller.
|
|
63
|
+
*/
|
|
64
|
+
export interface PointCloudLayer {
|
|
65
|
+
build(data: PointCloudData): void;
|
|
66
|
+
update(data: PointCloudData, options?: PointCloudUpdateOptions): void;
|
|
67
|
+
clear(): void;
|
|
68
|
+
dispose(): void;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Options for the Draco decoder.
|
|
72
|
+
*/
|
|
73
|
+
export interface DracoDecoderOptions {
|
|
74
|
+
/** Path to Draco decoder WASM/JS files */
|
|
75
|
+
decoderPath?: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* A timestamped frame of point cloud data.
|
|
79
|
+
*/
|
|
80
|
+
export interface PointCloudFrame {
|
|
81
|
+
frameId: number;
|
|
82
|
+
timestamp: number;
|
|
83
|
+
data: PointCloudData;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Update mode for incremental point cloud operations.
|
|
87
|
+
*/
|
|
88
|
+
export type PointCloudUpdateMode = "replace" | "append" | "partial";
|
|
89
|
+
/**
|
|
90
|
+
* Options for incremental point cloud updates.
|
|
91
|
+
*/
|
|
92
|
+
export interface PointCloudUpdateOptions {
|
|
93
|
+
mode: PointCloudUpdateMode;
|
|
94
|
+
offset?: number;
|
|
95
|
+
maxPoints?: number;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;CAC3B;AAMD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,+DAA+D;IAC/D,KAAK,EAAE,cAAc,CAAC;IACtB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACtE,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
|