1 line
39 KiB
Plaintext
1 line
39 KiB
Plaintext
|
|
{"version":3,"file":"TDSLoader.cjs","sources":["../../src/loaders/TDSLoader.js"],"sourcesContent":["import {\n AdditiveBlending,\n BufferGeometry,\n Color,\n DoubleSide,\n FileLoader,\n Float32BufferAttribute,\n Group,\n Loader,\n LoaderUtils,\n Matrix4,\n Mesh,\n MeshPhongMaterial,\n TextureLoader,\n} from 'three'\n\n/**\n * Autodesk 3DS three.js file loader, based on lib3ds.\n *\n * Loads geometry with uv and materials basic properties with texture support.\n *\n * @class TDSLoader\n * @constructor\n */\n\nclass TDSLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.debug = false\n\n this.group = null\n this.position = 0\n\n this.materials = []\n this.meshes = []\n }\n\n /**\n * Load 3ds file from url.\n *\n * @method load\n * @param {[type]} url URL for the file.\n * @param {Function} onLoad onLoad callback, receives group Object3D as argument.\n * @param {Function} onProgress onProgress callback.\n * @param {Function} onError onError callback.\n */\n load(url, onLoad, onProgress, onError) {\n const scope = this\n\n const path = this.path === '' ? LoaderUtils.extractUrlBase(url) : this.path\n\n const loader = new FileLoader(this.manager)\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n loader.setWithCredentials(this.withCredentials)\n\n loader.load(\n url,\n function (data) {\n try {\n onLoad(scope.parse(data, path))\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 onProgress,\n onError,\n )\n }\n\n /**\n * Parse arraybuffer data and load 3ds file.\n *\n * @method parse\n * @param {ArrayBuffer} arraybuffer Arraybuffer data to be loaded.\n * @param {String} path Path for external resources.\n * @return {Group} Group loaded from 3ds file.\n */\n parse(arraybuffer, path) {\n this.group = new Group()\n this.position = 0\n this.materials = []\n this.meshes = []\n\n this.readFile(arraybuffer, path)\n\n for (let i = 0; i < this.meshes.length; i++) {\n this.group.add(this.meshes[i])\n }\n\n return this.group\n }\n\n /**\n * Decode file content to read 3ds data.\n *\n * @method readFile\n * @param {ArrayBuffer} arraybuffer Arraybuffer data to be loaded.\n * @param {String} path Path for external resources.\n */\n readFile(arraybuffer, path) {\n const data = new DataView(arraybuffer)\n const chunk = this.readChunk(data)\n\n if (chunk.id === MLIBMAGIC || chunk.id === CMAGIC || chunk.id === M3DMAGIC) {\n let next = this.nextChunk(data, chunk)\n\n while (next !== 0) {\n if (next === M3D_VERSION) {\n const version = this.readDWord(data)\n this.debugMessage('3DS file version: ' + version)\n } else if (next === MDATA) {\n this.resetPosition(data)\n this.readMeshData(data, path)\n } else {\n this.debugMessage('Unknown main chunk: ' + next.toString(16))\n }\n\n next = this.nextChunk(data, chunk)\n }\n }\n\n this.debugMessage('Parsed ' + this.meshes.length + ' meshes')\n }\n\n /**\n * Read mesh data chunk.\n *\n * @method readMeshData\n * @param {Dataview} data Dataview in use.\n * @param {String} path Path for external resources.\n */\n readMeshData(data, path) {\n const chunk = this.readChunk(data)\n let next = this.nextChunk(data, chunk)\n\n while (next !== 0) {\n if (next === MESH_VERSION) {\n const version = +this.readDWord(data)\n this.debugMessage('Mesh Version: ' + version)\n } else if (next === MASTER_SCALE) {\n const scale = this.readFloat(data)\n this.debugMessage('Master scale: ' + scale)\n this.group.scale.set(scale, scale, scale)\n } else if (next === NAMED_OBJECT) {\n this.debugMessage('Named Object')\n this.resetPosi
|