UNPKG

@xeokit/xeokit-convert

Version:

JavaScript utilities to create .XKT files

109 lines (97 loc) 3.01 kB
import {parse} from '@loaders.gl/core'; import {PLYLoader} from '@loaders.gl/ply'; /** * @desc Parses PLY file data into an {@link XKTModel}. * * ## Usage * * In the example below we'll create an {@link XKTModel}, then load a PLY model into it. * * ````javascript * utils.loadArraybuffer("./models/ply/test.ply", async (data) => { * * const xktModel = new XKTModel(); * * parsePLYIntoXKTModel({data, xktModel}).then(()=>{ * xktModel.finalize(); * }, * (msg) => { * console.error(msg); * }); * }); * ```` * * @param {Object} params Parsing params. * @param {ArrayBuffer} params.data PLY file data. * @param {XKTModel} params.xktModel XKTModel to parse into. * @param {Object} [params.stats] Collects statistics. * @param {function} [params.log] Logging callback. @returns {Promise} Resolves when PLY has been parsed. */ async function parsePLYIntoXKTModel({data, xktModel, stats, log}) { if (log) { log("Using parser: parsePLYIntoXKTModel"); } if (!data) { throw "Argument expected: data"; } if (!xktModel) { throw "Argument expected: xktModel"; } let parsedData; try { parsedData = await parse(data, PLYLoader); } catch (e) { if (log) { log("Error: " + e); } return; } const attributes = parsedData.attributes; const hasColors = !!attributes.COLOR_0; if (hasColors) { const colorsValue = hasColors ? attributes.COLOR_0.value : null; const colorsCompressed = []; for (let i = 0, len = colorsValue.length; i < len; i += 4) { colorsCompressed.push(colorsValue[i]); colorsCompressed.push(colorsValue[i + 1]); colorsCompressed.push(colorsValue[i + 2]); } xktModel.createGeometry({ geometryId: "plyGeometry", primitiveType: "triangles", positions: attributes.POSITION.value, indices: parsedData.indices ? parsedData.indices.value : [], colorsCompressed: colorsCompressed }); } else { xktModel.createGeometry({ geometryId: "plyGeometry", primitiveType: "triangles", positions: attributes.POSITION.value, indices: parsedData.indices ? parsedData.indices.value : [] }); } xktModel.createMesh({ meshId: "plyMesh", geometryId: "plyGeometry", color: (!hasColors) ? [1, 1, 1] : null }); xktModel.createEntity({ entityId: "ply", meshIds: ["plyMesh"] }); if (stats) { stats.sourceFormat = "PLY"; stats.schemaVersion = ""; stats.title = ""; stats.author = ""; stats.created = ""; stats.numMetaObjects = 2; stats.numPropertySets = 0; stats.numObjects = 1; stats.numGeometries = 1; stats.numVertices = attributes.POSITION.value.length / 3; } } export {parsePLYIntoXKTModel};