UNPKG

@giro3d/giro3d

Version:

A JS/WebGL framework for 3D geospatial data visualization

76 lines (64 loc) 2.14 kB
import type { BaseMessageMap, Message, SuccessResponse } from '../../utils/WorkerPool'; import { createErrorResponse } from '../../utils/WorkerPool'; import type { PotreePointCloudAttribute } from './attributes'; import type { BufferAttributeDescriptor } from './bin'; import { readBinFile } from './bin'; export type MessageType = 'ReadBinFile'; export type TypedMessage<K extends MessageType, T> = Message<T> & { type: K }; type ReadBinFileMessage = TypedMessage< 'ReadBinFile', { buffer: ArrayBuffer; info: { positionAttribute: PotreePointCloudAttribute; optionalAttribute?: PotreePointCloudAttribute; pointByteSize: number; }; } >; type ReadBinFileResponse = SuccessResponse<{ position: BufferAttributeDescriptor; attribute?: BufferAttributeDescriptor; }>; type Messages = ReadBinFileMessage; export interface MessageMap extends BaseMessageMap<MessageType> { ReadBinFile: { payload: ReadBinFileMessage['payload']; response: ReadBinFileResponse['payload']; }; } function processReadBinMessage(msg: ReadBinFileMessage) { try { const { buffer, info } = msg.payload; const result = readBinFile( buffer, info.pointByteSize, info.positionAttribute, info.optionalAttribute, ); const response: ReadBinFileResponse = { requestId: msg.id, payload: { position: result.positionBuffer, attribute: result.attributeBuffer, }, }; const position = result.positionBuffer.array; const attribute = result.attributeBuffer?.array; const transfer = [position]; if (attribute) { transfer.push(attribute); } postMessage(response, { transfer }); } catch (err) { postMessage(createErrorResponse(msg.id, err)); } } onmessage = (e: MessageEvent<Messages>) => { const message = e.data; switch (message.type) { case 'ReadBinFile': processReadBinMessage(message); break; } };