@openhps/core
Version:
Open Hybrid Positioning System - Core component
166 lines (163 loc) • 7.08 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BufferGeometryLoader = void 0;
var _Sphere = require("../math/Sphere.js");
var _Vector = require("../math/Vector3.js");
var _BufferAttribute = require("../core/BufferAttribute.js");
var _BufferGeometry = require("../core/BufferGeometry.js");
var _FileLoader = require("./FileLoader.js");
var _Loader = require("./Loader.js");
var _InstancedBufferGeometry = require("../core/InstancedBufferGeometry.js");
var _InstancedBufferAttribute = require("../core/InstancedBufferAttribute.js");
var _InterleavedBufferAttribute = require("../core/InterleavedBufferAttribute.js");
var _InterleavedBuffer = require("../core/InterleavedBuffer.js");
var _utils = require("../utils.js");
/**
* Class for loading geometries. The files are internally
* loaded via {@link FileLoader}.
*
* ```js
* const loader = new THREE.BufferGeometryLoader();
* const geometry = await loader.loadAsync( 'models/json/pressure.json' );
*
* const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );
* const object = new THREE.Mesh( geometry, material );
* scene.add( object );
* ```
*
* @augments Loader
*/
class BufferGeometryLoader extends _Loader.Loader {
/**
* Constructs a new geometry loader.
*
* @param {LoadingManager} [manager] - The loading manager.
*/
constructor(manager) {
super(manager);
}
/**
* Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.
*
* @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
* @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.
* @param {onProgressCallback} onProgress - Executed while the loading is in progress.
* @param {onErrorCallback} onError - Executed when errors occur.
*/
load(url, onLoad, onProgress, onError) {
const scope = this;
const loader = new _FileLoader.FileLoader(scope.manager);
loader.setPath(scope.path);
loader.setRequestHeader(scope.requestHeader);
loader.setWithCredentials(scope.withCredentials);
loader.load(url, function (text) {
try {
onLoad(scope.parse(JSON.parse(text)));
} catch (e) {
if (onError) {
onError(e);
} else {
console.error(e);
}
scope.manager.itemError(url);
}
}, onProgress, onError);
}
/**
* Parses the given JSON object and returns a geometry.
*
* @param {Object} json - The serialized geometry.
* @return {BufferGeometry} The parsed geometry.
*/
parse(json) {
const interleavedBufferMap = {};
const arrayBufferMap = {};
function getInterleavedBuffer(json, uuid) {
if (interleavedBufferMap[uuid] !== undefined) return interleavedBufferMap[uuid];
const interleavedBuffers = json.interleavedBuffers;
const interleavedBuffer = interleavedBuffers[uuid];
const buffer = getArrayBuffer(json, interleavedBuffer.buffer);
const array = (0, _utils.getTypedArray)(interleavedBuffer.type, buffer);
const ib = new _InterleavedBuffer.InterleavedBuffer(array, interleavedBuffer.stride);
ib.uuid = interleavedBuffer.uuid;
interleavedBufferMap[uuid] = ib;
return ib;
}
function getArrayBuffer(json, uuid) {
if (arrayBufferMap[uuid] !== undefined) return arrayBufferMap[uuid];
const arrayBuffers = json.arrayBuffers;
const arrayBuffer = arrayBuffers[uuid];
const ab = new Uint32Array(arrayBuffer).buffer;
arrayBufferMap[uuid] = ab;
return ab;
}
const geometry = json.isInstancedBufferGeometry ? new _InstancedBufferGeometry.InstancedBufferGeometry() : new _BufferGeometry.BufferGeometry();
const index = json.data.index;
if (index !== undefined) {
const typedArray = (0, _utils.getTypedArray)(index.type, index.array);
geometry.setIndex(new _BufferAttribute.BufferAttribute(typedArray, 1));
}
const attributes = json.data.attributes;
for (const key in attributes) {
const attribute = attributes[key];
let bufferAttribute;
if (attribute.isInterleavedBufferAttribute) {
const interleavedBuffer = getInterleavedBuffer(json.data, attribute.data);
bufferAttribute = new _InterleavedBufferAttribute.InterleavedBufferAttribute(interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized);
} else {
const typedArray = (0, _utils.getTypedArray)(attribute.type, attribute.array);
const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? _InstancedBufferAttribute.InstancedBufferAttribute : _BufferAttribute.BufferAttribute;
bufferAttribute = new bufferAttributeConstr(typedArray, attribute.itemSize, attribute.normalized);
}
if (attribute.name !== undefined) bufferAttribute.name = attribute.name;
if (attribute.usage !== undefined) bufferAttribute.setUsage(attribute.usage);
geometry.setAttribute(key, bufferAttribute);
}
const morphAttributes = json.data.morphAttributes;
if (morphAttributes) {
for (const key in morphAttributes) {
const attributeArray = morphAttributes[key];
const array = [];
for (let i = 0, il = attributeArray.length; i < il; i++) {
const attribute = attributeArray[i];
let bufferAttribute;
if (attribute.isInterleavedBufferAttribute) {
const interleavedBuffer = getInterleavedBuffer(json.data, attribute.data);
bufferAttribute = new _InterleavedBufferAttribute.InterleavedBufferAttribute(interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized);
} else {
const typedArray = (0, _utils.getTypedArray)(attribute.type, attribute.array);
bufferAttribute = new _BufferAttribute.BufferAttribute(typedArray, attribute.itemSize, attribute.normalized);
}
if (attribute.name !== undefined) bufferAttribute.name = attribute.name;
array.push(bufferAttribute);
}
geometry.morphAttributes[key] = array;
}
}
const morphTargetsRelative = json.data.morphTargetsRelative;
if (morphTargetsRelative) {
geometry.morphTargetsRelative = true;
}
const groups = json.data.groups || json.data.drawcalls || json.data.offsets;
if (groups !== undefined) {
for (let i = 0, n = groups.length; i !== n; ++i) {
const group = groups[i];
geometry.addGroup(group.start, group.count, group.materialIndex);
}
}
const boundingSphere = json.data.boundingSphere;
if (boundingSphere !== undefined) {
const center = new _Vector.Vector3();
if (boundingSphere.center !== undefined) {
center.fromArray(boundingSphere.center);
}
geometry.boundingSphere = new _Sphere.Sphere(center, boundingSphere.radius);
}
if (json.name) geometry.name = json.name;
if (json.userData) geometry.userData = json.userData;
return geometry;
}
}
exports.BufferGeometryLoader = BufferGeometryLoader;