1 line
39 KiB
Plaintext
1 line
39 KiB
Plaintext
|
|
{"version":3,"file":"LWOLoader.cjs","sources":["../../src/loaders/LWOLoader.js"],"sourcesContent":["/**\n * @version 1.1.1\n *\n * @desc Load files in LWO3 and LWO2 format on Three.js\n *\n * LWO3 format specification:\n * \thttp://static.lightwave3d.com/sdk/2018/html/filefmts/lwo3.html\n *\n * LWO2 format specification:\n * \thttp://static.lightwave3d.com/sdk/2018/html/filefmts/lwo2.html\n *\n **/\n\nimport {\n AddOperation,\n BackSide,\n BufferAttribute,\n BufferGeometry,\n ClampToEdgeWrapping,\n Color,\n DoubleSide,\n EquirectangularReflectionMapping,\n EquirectangularRefractionMapping,\n FileLoader,\n Float32BufferAttribute,\n FrontSide,\n LineBasicMaterial,\n LineSegments,\n Loader,\n Mesh,\n MeshPhongMaterial,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n MirroredRepeatWrapping,\n Points,\n PointsMaterial,\n RepeatWrapping,\n TextureLoader,\n Vector2,\n} from 'three'\n\nimport { IFFParser } from './lwo/IFFParser.js'\nimport { UV1 } from '../_polyfill/uv1.ts'\n\nlet _lwoTree\n\nclass LWOLoader extends Loader {\n constructor(manager, parameters = {}) {\n super(manager)\n\n this.resourcePath = parameters.resourcePath !== undefined ? parameters.resourcePath : ''\n }\n\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const path = scope.path === '' ? extractParentUrl(url, 'Objects') : scope.path\n\n // give the mesh a default name based on the filename\n const modelName = url.split(path).pop().split('.')[0]\n\n const loader = new FileLoader(this.manager)\n loader.setPath(scope.path)\n loader.setResponseType('arraybuffer')\n\n loader.load(\n url,\n function (buffer) {\n // console.time( 'Total parsing: ' );\n\n try {\n onLoad(scope.parse(buffer, path, modelName))\n } catch (e) {\n if (onError) {\n onError(e)\n } else {\n console.error(e)\n }\n\n scope.manager.itemError(url)\n }\n\n // console.timeEnd( 'Total parsing: ' );\n },\n onProgress,\n onError,\n )\n }\n\n parse(iffBuffer, path, modelName) {\n _lwoTree = new IFFParser().parse(iffBuffer)\n\n // console.log( 'lwoTree', lwoTree );\n\n const textureLoader = new TextureLoader(this.manager)\n .setPath(this.resourcePath || path)\n .setCrossOrigin(this.crossOrigin)\n\n return new LWOTreeParser(textureLoader).parse(modelName)\n }\n}\n\n// Parse the lwoTree object\nclass LWOTreeParser {\n constructor(textureLoader) {\n this.textureLoader = textureLoader\n }\n\n parse(modelName) {\n this.materials = new MaterialParser(this.textureLoader).parse()\n this.defaultLayerName = modelName\n\n this.meshes = this.parseLayers()\n\n return {\n materials: this.materials,\n meshes: this.meshes,\n }\n }\n\n parseLayers() {\n // array of all meshes for building hierarchy\n const meshes = []\n\n // final array containing meshes with scene graph hierarchy set up\n const finalMeshes = []\n\n const geometryParser = new GeometryParser()\n\n const scope = this\n _lwoTree.layers.forEach(function (layer) {\n const geometry = geometryParser.parse(layer.geometry, layer)\n\n const mesh = scope.parseMesh(geometry, layer)\n\n meshes[layer.number] = mesh\n\n if (layer.parent === -1) finalMeshes.push(mesh)\n else meshes[layer.parent].add(mesh)\n })\n\n this.applyPivots(finalMeshes)\n\n return finalMeshes\n }\n\n parseMesh(geometry, layer) {\n let mesh\n\n const materials = this.getMaterials(geometry.userData.matNames, layer.geometry.type)\n\n if (UV1 === 'uv2') this.duplicateUVs(geometry, materials)\n\n if (layer.geometry.type === 'points') mesh = new Points(geometry, materials)\n else if (layer.geometry.type === 'lines') mesh = new LineSegments(geometry, materials)\n else mesh = new Mesh(geometry, materials)\n\n if (layer.name) mesh.name = layer.name\n else mesh.name = this.defaultLayerName + '_layer_' + layer.number\n\n mesh.userData.pivot = layer.pivot\n\n
|