import { BufferGeometry, Float32BufferAttribute, Uint32BufferAttribute } from 'three';
class PRTLoader {
constructor() {}
load(url, onLoad, onProgress, onError) {
const loader = new FileLoader();
loader.setResponseType('arraybuffer');
loader.load(url, (data) => {
const geometry = this.parse(data);
onLoad(geometry);
}, onProgress, onError);
}
parse(data) {
const view = new DataView(data);
let offset = 0;
const version = view.getUint32(offset, true);
offset += 4;
console.log(`PRT File Version: ${version}`);
const vertexCount = view.getUint32(offset, true);
offset += 4;
console.log(`Vertex Count: ${vertexCount}`);
const faceCount = view.getUint32(offset, true);
offset += 4;
console.log(`Face Count: ${faceCount}`);
const vertices = new Float32Array(vertexCount * 3);
for (let i = 0; i < vertexCount; i++) {
const x = view.getFloat32(offset, true);
offset += 4;
const y = view.getFloat32(offset, true);
offset += 4;
const z = view.getFloat32(offset, true);
offset += 4;
vertices[i * 3] = x;
vertices[i * 3 + 1] = y;
vertices[i * 3 + 2] = z;
}
console.log(`Vertices Parsed: ${vertices}`);
const indices = new Uint32Array(faceCount * 3);
for (let i = 0; i < faceCount; i++) {
const a = view.getUint32(offset, true);
offset += 4;
const b = view.getUint32(offset, true);
offset += 4;
const c = view.getUint32(offset, true);
offset += 4;
indices[i * 3] = a;
indices[i * 3 + 1] = b;
indices[i * 3 + 2] = c;
}
console.log(`Faces Parsed: ${indices}`);
const geometry = new BufferGeometry();
geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
geometry.setIndex(new Uint32BufferAttribute(indices, 1));
geometry.computeVertexNormals();
return geometry;
}
}
export { PRTLoader };