UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

222 lines (175 loc) 6.68 kB
import { newInstance as newInstance$1, obj, get, setGet, event } from '../../macros.js'; import DataAccessHelper from '../Core/DataAccessHelper.js'; import vtkTexture from '../../Rendering/Core/Texture.js'; import '../Core/DataAccessHelper/LiteHttpDataAccessHelper.js'; // import 'vtk.js/Sources/IO/Core/DataAccessHelper/HttpDataAccessHelper'; // HTTP + gz // import 'vtk.js/Sources/IO/Core/DataAccessHelper/HtmlDataAccessHelper'; // html + base64 + zip // import 'vtk.js/Sources/IO/Core/DataAccessHelper/JSZipDataAccessHelper'; // zip // ---------------------------------------------------------------------------- // vtkMTLReader methods // ---------------------------------------------------------------------------- function vtkMTLReader(publicAPI, model) { // Set our className model.classHierarchy.push('vtkMTLReader'); function imageReady() { model.requestCount--; if (model.requestCount === 0) { publicAPI.invokeBusy(false); } } function parseLine(line) { if (line[0] === '#' || line.length === 0) { return; } var tokens = line.split(/[ \t]+/).map(function (s) { return s.trim(); }).filter(function (s) { return s.length; }); if (tokens[0] === 'newmtl') { tokens.shift(); model.currentMaterial = tokens.join(' ').trim(); } else if (model.currentMaterial) { if (tokens.length < 2) { return; } if (!model.materials[model.currentMaterial]) { model.materials[model.currentMaterial] = {}; } model.materials[model.currentMaterial][tokens[0]] = tokens.slice(1); if (tokens[0] === 'map_Kd') { var image = new Image(); image.onload = function () { return setTimeout(imageReady, 0); }; image.src = [model.baseURL, tokens[1]].join('/'); model.materials[model.currentMaterial].image = image; model.requestCount++; } } } // Create default dataAccessHelper if not available if (!model.dataAccessHelper) { model.dataAccessHelper = DataAccessHelper.get('http'); } // Internal method to fetch Array function fetchData(url, options) { return model.dataAccessHelper.fetchText(publicAPI, url, options); } // Set DataSet url publicAPI.setUrl = function (url) { var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (url.indexOf('.mtl') === -1 && !option.fullpath) { model.baseURL = url; model.url = "".concat(url, "/index.mtl"); } else { model.url = url; // Remove the file in the URL var path = url.split('/'); path.pop(); model.baseURL = path.join('/'); } // Fetch metadata return publicAPI.loadData(option); }; // Fetch the actual data arrays publicAPI.loadData = function (option) { return new Promise(function (resolve, reject) { fetchData(model.url, option).then(function (content) { publicAPI.parseAsText(content); resolve(); }, function (err) { reject(); }); }); }; publicAPI.parseAsText = function (content) { publicAPI.modified(); model.materials = {}; content.split('\n').forEach(parseLine); }; // return Busy state publicAPI.isBusy = function () { return !!model.requestCount; }; publicAPI.getMaterialNames = function () { return Object.keys(model.materials); }; publicAPI.getMaterial = function (name) { return model.materials[name]; }; publicAPI.listImages = function () { return Object.keys(model.materials).map(function (name) { return model.materials[name].map_Kd; }).filter(function (fileName) { return !!fileName; }).map(function (s) { return s[0].trim(); }); }; publicAPI.setImageSrc = function (imagePath, src) { return new Promise(function (resolve, reject) { var selectedName = Object.keys(model.materials).find(function (name) { return model.materials[name].map_Kd && model.materials[name].map_Kd[0].trim() === imagePath.trim(); }); var material = model.materials[selectedName]; if (material && material.image) { material.image.src = src; material.image.onload = function () { return setTimeout(resolve, 0); }; } else { resolve(); } }); }; publicAPI.applyMaterialToActor = function (name, actor) { var material = model.materials[name]; if (material && actor) { var white = [1, 1, 1]; var actorProp = { ambientColor: material.Ka ? material.Ka.map(function (i) { return Number(i); }) : white, specularColor: material.Ks ? material.Ks.map(function (i) { return Number(i); }) : white, diffuseColor: material.Kd ? material.Kd.map(function (i) { return Number(i); }) : white, opacity: material.d ? Number(material.d) : 1, specularPower: material.Ns ? Number(material.Ns) : 1 }; var illum = Number(material.illum || 2); ['ambient', 'diffuse', 'specular'].forEach(function (k, idx) { actorProp[k] = idx <= illum ? 1.0 : 0.0; }); if (material.image) { var texture = vtkTexture.newInstance({ interpolate: model.interpolateTextures }); texture.setImage(material.image); actor.addTexture(texture); } actor.getProperty().set(actorProp); } }; } // ---------------------------------------------------------------------------- // Object factory // ---------------------------------------------------------------------------- var DEFAULT_VALUES = { numberOfOutputs: 1, requestCount: 0, materials: {}, interpolateTextures: true // baseURL: null, // dataAccessHelper: null, // url: null, }; // ---------------------------------------------------------------------------- function extend(publicAPI, model) { var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; Object.assign(model, DEFAULT_VALUES, initialValues); // Build VTK API obj(publicAPI, model); get(publicAPI, model, ['url', 'baseURL']); setGet(publicAPI, model, ['dataAccessHelper', 'interpolateTextures', 'splitGroup']); event(publicAPI, model, 'busy'); // Object methods vtkMTLReader(publicAPI, model); } // ---------------------------------------------------------------------------- var newInstance = newInstance$1(extend, 'vtkMTLReader'); // ---------------------------------------------------------------------------- var vtkMTLReader$1 = { newInstance: newInstance, extend: extend }; export { vtkMTLReader$1 as default, extend, newInstance };