@openhps/core
Version:
Open Hybrid Positioning System - Core component
152 lines (143 loc) • 4.03 kB
JavaScript
import { nodeObject, float } from '../../nodes/tsl/TSLBase.js';
import { Loader } from '../Loader.js';
import { FileLoader } from '../../loaders/FileLoader.js';
/**
* A loader for loading node objects in the three.js JSON Object/Scene format.
*
* @augments Loader
*/
class NodeLoader extends Loader {
/**
* Constructs a new node loader.
*
* @param {LoadingManager} [manager] - A reference to a loading manager.
*/
constructor(manager) {
super(manager);
/**
* Represents a dictionary of textures.
*
* @type {Object<string,Texture>}
*/
this.textures = {};
/**
* Represents a dictionary of node types.
*
* @type {Object<string,Node.constructor>}
*/
this.nodes = {};
}
/**
* Loads the node definitions from the given URL.
*
* @param {string} url - The path/URL of the file to be loaded.
* @param {Function} onLoad - Will be called when load completes.
* @param {Function} onProgress - Will be called while load progresses.
* @param {Function} onError - Will be called when errors are thrown during the loading process.
*/
load(url, onLoad, onProgress, onError) {
const loader = new FileLoader(this.manager);
loader.setPath(this.path);
loader.setRequestHeader(this.requestHeader);
loader.setWithCredentials(this.withCredentials);
loader.load(url, text => {
try {
onLoad(this.parse(JSON.parse(text)));
} catch (e) {
if (onError) {
onError(e);
} else {
console.error(e);
}
this.manager.itemError(url);
}
}, onProgress, onError);
}
/**
* Parse the node dependencies for the loaded node.
*
* @param {Array<Object>} [json] - The JSON definition
* @return {Object<string,Node>} A dictionary with node dependencies.
*/
parseNodes(json) {
const nodes = {};
if (json !== undefined) {
for (const nodeJSON of json) {
const {
uuid,
type
} = nodeJSON;
nodes[uuid] = this.createNodeFromType(type);
nodes[uuid].uuid = uuid;
}
const meta = {
nodes,
textures: this.textures
};
for (const nodeJSON of json) {
nodeJSON.meta = meta;
const node = nodes[nodeJSON.uuid];
node.deserialize(nodeJSON);
delete nodeJSON.meta;
}
}
return nodes;
}
/**
* Parses the node from the given JSON.
*
* @param {Object} json - The JSON definition
* @param {string} json.type - The node type.
* @param {string} json.uuid - The node UUID.
* @param {Array<Object>} [json.nodes] - The node dependencies.
* @param {Object} [json.meta] - The meta data.
* @return {Node} The parsed node.
*/
parse(json) {
const node = this.createNodeFromType(json.type);
node.uuid = json.uuid;
const nodes = this.parseNodes(json.nodes);
const meta = {
nodes,
textures: this.textures
};
json.meta = meta;
node.deserialize(json);
delete json.meta;
return node;
}
/**
* Defines the dictionary of textures.
*
* @param {Object<string,Texture>} value - The texture library defines as `<uuid,texture>`.
* @return {NodeLoader} A reference to this loader.
*/
setTextures(value) {
this.textures = value;
return this;
}
/**
* Defines the dictionary of node types.
*
* @param {Object<string,Node.constructor>} value - The node library defined as `<classname,class>`.
* @return {NodeLoader} A reference to this loader.
*/
setNodes(value) {
this.nodes = value;
return this;
}
/**
* Creates a node object from the given type.
*
* @param {string} type - The node type.
* @return {Node} The created node instance.
*/
createNodeFromType(type) {
if (this.nodes[type] === undefined) {
console.error('THREE.NodeLoader: Node type not found:', type);
return float();
}
return nodeObject(new this.nodes[type]());
}
}
export default NodeLoader;