UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

1 lines 51.9 kB
{"version":3,"file":"3DMLoader.cjs","sources":["../../src/loaders/3DMLoader.js"],"sourcesContent":["import {\n BufferGeometryLoader,\n FileLoader,\n Loader,\n Object3D,\n MeshStandardMaterial,\n Mesh,\n Color,\n Points,\n PointsMaterial,\n Line,\n LineBasicMaterial,\n Matrix4,\n DirectionalLight,\n PointLight,\n SpotLight,\n RectAreaLight,\n Vector3,\n Sprite,\n SpriteMaterial,\n CanvasTexture,\n LinearFilter,\n ClampToEdgeWrapping,\n TextureLoader,\n} from 'three'\n\nconst _taskCache = new WeakMap()\n\nclass Rhino3dmLoader extends Loader {\n constructor(manager) {\n super(manager)\n\n this.libraryPath = ''\n this.libraryPending = null\n this.libraryBinary = null\n this.libraryConfig = {}\n\n this.url = ''\n\n this.workerLimit = 4\n this.workerPool = []\n this.workerNextTaskID = 1\n this.workerSourceURL = ''\n this.workerConfig = {}\n\n this.materials = []\n }\n\n setLibraryPath(path) {\n this.libraryPath = path\n\n return this\n }\n\n setWorkerLimit(workerLimit) {\n this.workerLimit = workerLimit\n\n return this\n }\n\n load(url, onLoad, onProgress, onError) {\n const loader = new FileLoader(this.manager)\n\n loader.setPath(this.path)\n loader.setResponseType('arraybuffer')\n loader.setRequestHeader(this.requestHeader)\n\n this.url = url\n\n loader.load(\n url,\n (buffer) => {\n // Check for an existing task using this buffer. A transferred buffer cannot be transferred\n // again from this thread.\n if (_taskCache.has(buffer)) {\n const cachedTask = _taskCache.get(buffer)\n\n return cachedTask.promise.then(onLoad).catch(onError)\n }\n\n this.decodeObjects(buffer, url).then(onLoad).catch(onError)\n },\n onProgress,\n onError,\n )\n }\n\n debug() {\n console.log(\n 'Task load: ',\n this.workerPool.map((worker) => worker._taskLoad),\n )\n }\n\n decodeObjects(buffer, url) {\n let worker\n let taskID\n\n const taskCost = buffer.byteLength\n\n const objectPending = this._getWorker(taskCost)\n .then((_worker) => {\n worker = _worker\n taskID = this.workerNextTaskID++ //hmmm\n\n return new Promise((resolve, reject) => {\n worker._callbacks[taskID] = { resolve, reject }\n\n worker.postMessage({ type: 'decode', id: taskID, buffer }, [buffer])\n\n //this.debug();\n })\n })\n .then((message) => this._createGeometry(message.data))\n\n // Remove task from the task list.\n // Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n objectPending\n .catch(() => true)\n .then(() => {\n if (worker && taskID) {\n this._releaseTask(worker, taskID)\n\n //this.debug();\n }\n })\n\n // Cache the task result.\n _taskCache.set(buffer, {\n url: url,\n promise: objectPending,\n })\n\n return objectPending\n }\n\n parse(data, onLoad, onError) {\n this.decodeObjects(data, '').then(onLoad).catch(onError)\n }\n\n _compareMaterials(material) {\n const mat = {}\n mat.name = material.name\n mat.color = {}\n mat.color.r = material.color.r\n mat.color.g = material.color.g\n mat.color.b = material.color.b\n mat.type = material.type\n\n for (let i = 0; i < this.materials.length; i++) {\n const m = this.materials[i]\n const _mat = {}\n _mat.name = m.name\n _mat.color = {}\n _mat.color.r = m.color.r\n _mat.color.g = m.color.g\n _mat.color.b = m.color.b\n _mat.type = m.type\n\n if (JSON.stringify(mat) === JSON.stringify(_mat)) {\n return m\n }\n }\n\n this.materials.push(material)\n\n return material\n }\n\n _createMaterial(material) {\n if (material === undefined) {\n return new MeshStandardMaterial({\n color: new Color(1, 1, 1),\n metalness: 0.8,\n name: 'default',\n side: 2,\n })\n }\n\n const _diffuseColor = material.diffuseColor\n\n const diffusecolor = new Color(_diffuseColor.r / 255.0, _diffuseColor.g / 255.0, _diffuseColor.b / 255.0)\n\n if (_diffuseColor.r === 0 && _diffuseColor.g === 0 && _diffuseColor.b === 0) {\n diffusecolor.r = 1\n diffusecolor.g = 1\n diffusecolor.b = 1\n }\n\n // console.log( material );\n\n const mat = new MeshStandardMaterial({\n color: diffusecolor,\n name: material.name,\n side: 2,\n transparent: material.transparency > 0 ? true : false,\n opacity: 1.0 - material.transparency,\n })\n\n const textureLoader = new TextureLoader()\n\n for (let i = 0; i < material.textures.length; i++) {\n const texture = material.textures[i]\n\n if (texture.image !== null) {\n const map = textureLoader.load(texture.image)\n\n switch (texture.type) {\n case 'Diffuse':\n mat.map = map\n\n break\n\n case 'Bump':\n mat.bumpMap = map\n\n break\n\n case 'Transparency':\n mat.alphaMap = map\n mat.transparent = true\n\n break\n\n case 'Emap':\n mat.envMap = map\n\n break\n }\n }\n }\n\n return mat\n }\n\n _createGeometry(data) {\n // console.log(data);\n\n const object = new Object3D()\n const instanceDefinitionObjects = []\n const instanceDefinitions = []\n const instanceReferences = []\n\n object.userData['layers'] = data.layers\n object.userData['groups'] = data.groups\n object.userData['settings'] = data.settings\n object.userData['objectType'] = 'File3dm'\n object.userData['materials'] = null\n object.name = this.url\n\n let objects = data.objects\n const materials = data.materials\n\n for (let i = 0; i < objects.length; i++) {\n const obj = objects[i]\n const attributes = obj.attributes\n\n switch (obj.objectType) {\n case 'InstanceDefinition':\n instanceDefinitions.push(obj)\n\n break\n\n case 'InstanceReference':\n instanceReferences.push(obj)\n\n break\n\n default:\n let _object\n\n if (attributes.materialIndex >= 0) {\n const rMaterial = materials[attributes.materialIndex]\n let material = this._createMaterial(rMaterial)\n material = this._compareMaterials(material)\n _object = this._createObject(obj, material)\n } else {\n const material = this._createMaterial()\n _object = this._createObject(obj, material)\n }\n\n if (_object === undefined) {\n continue\n }\n\n const layer = data.layers[attributes.layerIndex]\n\n _object.visible = layer ? data.layers[attributes.layerIndex].visible : true\n\n if (attributes.isInstanceDefinitionObject) {\n instanceDefinitionObjects.push(_object)\n } else {\n object.add(_object)\n }\n\n break\n }\n }\n\n for (let i = 0; i < instanceDefinitions.length; i++) {\n const iDef = instanceDefinitions[i]\n\n objects = []\n\n for (let j = 0; j < iDef.attributes.objectIds.length; j++) {\n const objId = iDef.attributes.objectIds[j]\n\n for (let p = 0; p < instanceDefinitionObjects.length; p++) {\n const idoId = instanceDefinitionObjects[p].userData.attributes.id\n\n if (objId === idoId) {\n objects.push(instanceDefinitionObjects[p])\n }\n }\n }\n\n // Currently clones geometry and does not take advantage of instancing\n\n for (let j = 0; j < instanceReferences.length; j++) {\n const iRef = instanceReferences[j]\n\n if (iRef.geometry.parentIdefId === iDef.attributes.id) {\n const iRefObject = new Object3D()\n const xf = iRef.geometry.xform.array\n\n const matrix = new Matrix4()\n matrix.set(\n xf[0],\n xf[1],\n xf[2],\n xf[3],\n xf[4],\n xf[5],\n xf[6],\n xf[7],\n xf[8],\n xf[9],\n xf[10],\n xf[11],\n xf[12],\n xf[13],\n xf[14],\n xf[15],\n )\n\n iRefObject.applyMatrix4(matrix)\n\n for (let p = 0; p < objects.length; p++) {\n iRefObject.add(objects[p].clone(true))\n }\n\n object.add(iRefObject)\n }\n }\n }\n\n object.userData['materials'] = this.materials\n return object\n }\n\n _createObject(obj, mat) {\n const loader = new BufferGeometryLoader()\n\n const attributes = obj.attributes\n\n let geometry, material, _color, color\n\n switch (obj.objectType) {\n case 'Point':\n case 'PointSet':\n geometry = loader.parse(obj.geometry)\n\n if (geometry.attributes.hasOwnProperty('color')) {\n material = new PointsMaterial({ vertexColors: true, sizeAttenuation: false, size: 2 })\n } else {\n _color = attributes.drawColor\n color = new Color(_color.r / 255.0, _color.g / 255.0, _color.b / 255.0)\n material = new PointsMaterial({ color: color, sizeAttenuation: false, size: 2 })\n }\n\n material = this._compareMaterials(material)\n\n const points = new Points(geometry, material)\n points.userData['attributes'] = attributes\n points.userData['objectType'] = obj.objectType\n\n if (attributes.name) {\n points.name = attributes.name\n }\n\n return points\n\n case 'Mesh':\n case 'Extrusion':\n case 'SubD':\n case 'Brep':\n if (obj.geometry === null) return\n\n geometry = loader.parse(obj.geometry)\n\n if (geometry.attributes.hasOwnProperty('color')) {\n mat.vertexColors = true\n }\n\n if (mat === null) {\n mat = this._createMaterial()\n mat = this._compareMaterials(mat)\n }\n\n const mesh = new Mesh(geometry, mat)\n mesh.castShadow = attributes.castsShadows\n mesh.receiveShadow = attributes.receivesShadows\n mesh.userData['attributes'] = attributes\n mesh.userData['objectType'] = obj.objectType\n\n if (attributes.name) {\n mesh.name = attributes.name\n }\n\n return mesh\n\n case 'Curve':\n geometry = loader.parse(obj.geometry)\n\n _color = attributes.drawColor\n color = new Color(_color.r / 255.0, _color.g / 255.0, _color.b / 255.0)\n\n material = new LineBasicMaterial({ color: color })\n material = this._compareMaterials(material)\n\n const lines = new Line(geometry, material)\n lines.userData['attributes'] = attributes\n lines.userData['objectType'] = obj.objectType\n\n if (attributes.name) {\n lines.name = attributes.name\n }\n\n return lines\n\n case 'TextDot':\n geometry = obj.geometry\n\n const ctx = document.createElement('canvas').getContext('2d')\n const font = `${geometry.fontHeight}px ${geometry.fontFace}`\n ctx.font = font\n const width = ctx.measureText(geometry.text).width + 10\n const height = geometry.fontHeight + 10\n\n const r = window.devicePixelRatio\n\n ctx.canvas.width = width * r\n ctx.canvas.height = height * r\n ctx.canvas.style.width = width + 'px'\n ctx.canvas.style.height = height + 'px'\n ctx.setTransform(r, 0, 0, r, 0, 0)\n\n ctx.font = font\n ctx.textBaseline = 'middle'\n ctx.textAlign = 'center'\n color = attributes.drawColor\n ctx.fillStyle = `rgba(${color.r},${color.g},${color.b},${color.a})`\n ctx.fillRect(0, 0, width, height)\n ctx.fillStyle = 'white'\n ctx.fillText(geometry.text, width / 2, height / 2)\n\n const texture = new CanvasTexture(ctx.canvas)\n texture.minFilter = LinearFilter\n texture.wrapS = ClampToEdgeWrapping\n texture.wrapT = ClampToEdgeWrapping\n\n material = new SpriteMaterial({ map: texture, depthTest: false })\n const sprite = new Sprite(material)\n sprite.position.set(geometry.point[0], geometry.point[1], geometry.point[2])\n sprite.scale.set(width / 10, height / 10, 1.0)\n\n sprite.userData['attributes'] = attributes\n sprite.userData['objectType'] = obj.objectType\n\n if (attributes.name) {\n sprite.name = attributes.name\n }\n\n return sprite\n\n case 'Light':\n geometry = obj.geometry\n\n let light\n\n if (geometry.isDirectionalLight) {\n light = new DirectionalLight()\n light.castShadow = attributes.castsShadows\n light.position.set(geometry.location[0], geometry.location[1], geometry.location[2])\n light.target.position.set(geometry.direction[0], geometry.direction[1], geometry.direction[2])\n light.shadow.normalBias = 0.1\n } else if (geometry.isPointLight) {\n light = new PointLight()\n light.castShadow = attributes.castsShadows\n light.position.set(geometry.location[0], geometry.location[1], geometry.location[2])\n light.shadow.normalBias = 0.1\n } else if (geometry.isRectangularLight) {\n light = new RectAreaLight()\n\n const width = Math.abs(geometry.width[2])\n const height = Math.abs(geometry.length[0])\n\n light.position.set(geometry.location[0] - height / 2, geometry.location[1], geometry.location[2] - width / 2)\n\n light.height = height\n light.width = width\n\n light.lookAt(new Vector3(geometry.direction[0], geometry.direction[1], geometry.direction[2]))\n } else if (geometry.isSpotLight) {\n light = new SpotLight()\n light.castShadow = attributes.castsShadows\n light.position.set(geometry.location[0], geometry.location[1], geometry.location[2])\n light.target.position.set(geometry.direction[0], geometry.direction[1], geometry.direction[2])\n light.angle = geometry.spotAngleRadians\n light.shadow.normalBias = 0.1\n } else if (geometry.isLinearLight) {\n console.warn('THREE.3DMLoader: No conversion exists for linear lights.')\n\n return\n }\n\n if (light) {\n light.intensity = geometry.intensity\n _color = geometry.diffuse\n color = new Color(_color.r / 255.0, _color.g / 255.0, _color.b / 255.0)\n light.color = color\n light.userData['attributes'] = attributes\n light.userData['objectType'] = obj.objectType\n }\n\n return light\n }\n }\n\n _initLibrary() {\n if (!this.libraryPending) {\n // Load rhino3dm wrapper.\n const jsLoader = new FileLoader(this.manager)\n jsLoader.setPath(this.libraryPath)\n const jsContent = new Promise((resolve, reject) => {\n jsLoader.load('rhino3dm.js', resolve, undefined, reject)\n })\n\n // Load rhino3dm WASM binary.\n const binaryLoader = new FileLoader(this.manager)\n binaryLoader.setPath(this.libraryPath)\n binaryLoader.setResponseType('arraybuffer')\n const binaryContent = new Promise((resolve, reject) => {\n binaryLoader.load('rhino3dm.wasm', resolve, undefined, reject)\n })\n\n this.libraryPending = Promise.all([jsContent, binaryContent]).then(([jsContent, binaryContent]) => {\n //this.libraryBinary = binaryContent;\n this.libraryConfig.wasmBinary = binaryContent\n\n const fn = Rhino3dmWorker.toString()\n\n const body = [\n '/* rhino3dm.js */',\n jsContent,\n '/* worker */',\n fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}')),\n ].join('\\n')\n\n this.workerSourceURL = URL.createObjectURL(new Blob([body]))\n })\n }\n\n return this.libraryPending\n }\n\n _getWorker(taskCost) {\n return this._initLibrary().then(() => {\n if (this.workerPool.length < this.workerLimit) {\n const worker = new Worker(this.workerSourceURL)\n\n worker._callbacks = {}\n worker._taskCosts = {}\n worker._taskLoad = 0\n\n worker.postMessage({\n type: 'init',\n libraryConfig: this.libraryConfig,\n })\n\n worker.onmessage = function (e) {\n const message = e.data\n\n switch (message.type) {\n case 'decode':\n worker._callbacks[message.id].resolve(message)\n break\n\n case 'error':\n worker._callbacks[message.id].reject(message)\n break\n\n default:\n console.error('THREE.Rhino3dmLoader: Unexpected message, \"' + message.type + '\"')\n }\n }\n\n this.workerPool.push(worker)\n } else {\n this.workerPool.sort(function (a, b) {\n return a._taskLoad > b._taskLoad ? -1 : 1\n })\n }\n\n const worker = this.workerPool[this.workerPool.length - 1]\n\n worker._taskLoad += taskCost\n\n return worker\n })\n }\n\n _releaseTask(worker, taskID) {\n worker._taskLoad -= worker._taskCosts[taskID]\n delete worker._callbacks[taskID]\n delete worker._taskCosts[taskID]\n }\n\n dispose() {\n for (let i = 0; i < this.workerPool.length; ++i) {\n this.workerPool[i].terminate()\n }\n\n this.workerPool.length = 0\n\n return this\n }\n}\n\n/* WEB WORKER */\n\nfunction Rhino3dmWorker() {\n let libraryPending\n let libraryConfig\n let rhino\n\n onmessage = function (e) {\n const message = e.data\n\n switch (message.type) {\n case 'init':\n libraryConfig = message.libraryConfig\n const wasmBinary = libraryConfig.wasmBinary\n let RhinoModule\n libraryPending = new Promise(function (resolve) {\n /* Like Basis Loader */\n RhinoModule = { wasmBinary, onRuntimeInitialized: resolve }\n\n rhino3dm(RhinoModule)\n }).then(() => {\n rhino = RhinoModule\n })\n\n break\n\n case 'decode':\n const buffer = message.buffer\n libraryPending.then(() => {\n const data = decodeObjects(rhino, buffer)\n\n self.postMessage({ type: 'decode', id: message.id, data })\n })\n\n break\n }\n }\n\n function decodeObjects(rhino, buffer) {\n const arr = new Uint8Array(buffer)\n const doc = rhino.File3dm.fromByteArray(arr)\n\n const objects = []\n const materials = []\n const layers = []\n const views = []\n const namedViews = []\n const groups = []\n\n //Handle objects\n\n const objs = doc.objects()\n const cnt = objs.count\n\n for (let i = 0; i < cnt; i++) {\n const _object = objs.get(i)\n\n const object = extractObjectData(_object, doc)\n\n _object.delete()\n\n if (object) {\n objects.push(object)\n }\n }\n\n // Handle instance definitions\n // console.log( `Instance Definitions Count: ${doc.instanceDefinitions().count()}` );\n\n for (let i = 0; i < doc.instanceDefinitions().count(); i++) {\n const idef = doc.instanceDefinitions().get(i)\n const idefAttributes = extractProperties(idef)\n idefAttributes.objectIds = idef.getObjectIds()\n\n objects.push({ geometry: null, attributes: idefAttributes, objectType: 'InstanceDefinition' })\n }\n\n // Handle materials\n\n const textureTypes = [\n // rhino.TextureType.Bitmap,\n rhino.TextureType.Diffuse,\n rhino.TextureType.Bump,\n rhino.TextureType.Transparency,\n rhino.TextureType.Opacity,\n rhino.TextureType.Emap,\n ]\n\n const pbrTextureTypes = [\n rhino.TextureType.PBR_BaseColor,\n rhino.TextureType.PBR_Subsurface,\n rhino.TextureType.PBR_SubsurfaceScattering,\n rhino.TextureType.PBR_SubsurfaceScatteringRadius,\n rhino.TextureType.PBR_Metallic,\n rhino.TextureType.PBR_Specular,\n rhino.TextureType.PBR_SpecularTint,\n rhino.TextureType.PBR_Roughness,\n rhino.TextureType.PBR_Anisotropic,\n rhino.TextureType.PBR_Anisotropic_Rotation,\n rhino.TextureType.PBR_Sheen,\n rhino.TextureType.PBR_SheenTint,\n rhino.TextureType.PBR_Clearcoat,\n rhino.TextureType.PBR_ClearcoatBump,\n rhino.TextureType.PBR_ClearcoatRoughness,\n rhino.TextureType.PBR_OpacityIor,\n rhino.TextureType.PBR_OpacityRoughness,\n rhino.TextureType.PBR_Emission,\n rhino.TextureType.PBR_AmbientOcclusion,\n rhino.TextureType.PBR_Displacement,\n ]\n\n for (let i = 0; i < doc.materials().count(); i++) {\n const _material = doc.materials().get(i)\n const _pbrMaterial = _material.physicallyBased()\n\n let material = extractProperties(_material)\n\n const textures = []\n\n for (let j = 0; j < textureTypes.length; j++) {\n const _texture = _material.getTexture(textureTypes[j])\n if (_texture) {\n let textureType = textureTypes[j].constructor.name\n textureType = textureType.substring(12, textureType.length)\n const texture = { type: textureType }\n\n const image = doc.getEmbeddedFileAsBase64(_texture.fileName)\n\n if (image) {\n texture.image = 'data:image/png;base64,' + image\n } else {\n console.warn(`THREE.3DMLoader: Image for ${textureType} texture not embedded in file.`)\n texture.image = null\n }\n\n textures.push(texture)\n\n _texture.delete()\n }\n }\n\n material.textures = textures\n\n if (_pbrMaterial.supported) {\n console.log('pbr true')\n\n for (let j = 0; j < pbrTextureTypes.length; j++) {\n const _texture = _material.getTexture(textureTypes[j])\n if (_texture) {\n const image = doc.getEmbeddedFileAsBase64(_texture.fileName)\n let textureType = textureTypes[j].constructor.name\n textureType = textureType.substring(12, textureType.length)\n const texture = { type: textureType, image: 'data:image/png;base64,' + image }\n textures.push(texture)\n\n _texture.delete()\n }\n }\n\n const pbMaterialProperties = extractProperties(_material.physicallyBased())\n\n material = Object.assign(pbMaterialProperties, material)\n }\n\n materials.push(material)\n\n _material.delete()\n _pbrMaterial.delete()\n }\n\n // Handle layers\n\n for (let i = 0; i < doc.layers().count(); i++) {\n const _layer = doc.layers().get(i)\n const layer = extractProperties(_layer)\n\n layers.push(layer)\n\n _layer.delete()\n }\n\n // Handle views\n\n for (let i = 0; i < doc.views().count(); i++) {\n const _view = doc.views().get(i)\n const view = extractProperties(_view)\n\n views.push(view)\n\n _view.delete()\n }\n\n // Handle named views\n\n for (let i = 0; i < doc.namedViews().count(); i++) {\n const _namedView = doc.namedViews().get(i)\n const namedView = extractProperties(_namedView)\n\n namedViews.push(namedView)\n\n _namedView.delete()\n }\n\n // Handle groups\n\n for (let i = 0; i < doc.groups().count(); i++) {\n const _group = doc.groups().get(i)\n const group = extractProperties(_group)\n\n groups.push(group)\n\n _group.delete()\n }\n\n // Handle settings\n\n const settings = extractProperties(doc.settings())\n\n //TODO: Handle other document stuff like dimstyles, instance definitions, bitmaps etc.\n\n // Handle dimstyles\n // console.log( `Dimstyle Count: ${doc.dimstyles().count()}` );\n\n // Handle bitmaps\n // console.log( `Bitmap Count: ${doc.bitmaps().count()}` );\n\n // Handle strings -- this seems to be broken at the moment in rhino3dm\n // console.log( `Document Strings Count: ${doc.strings().count()}` );\n\n /*\n\t\tfor( var i = 0; i < doc.strings().count(); i++ ){\n\n\t\t\tvar _string= doc.strings().get( i );\n\n\t\t\tconsole.log(_string);\n\t\t\tvar string = extractProperties( _group );\n\n\t\t\tstrings.push( string );\n\n\t\t\t_string.delete();\n\n\t\t}\n\t\t*/\n\n doc.delete()\n\n return { objects, materials, layers, views, namedViews, groups, settings }\n }\n\n function extractObjectData(object, doc) {\n const _geometry = object.geometry()\n const _attributes = object.attributes()\n let objectType = _geometry.objectType\n let geometry, attributes, position, data, mesh\n\n // skip instance definition objects\n //if( _attributes.isInstanceDefinitionObject ) { continue; }\n\n // TODO: handle other geometry types\n switch (objectType) {\n case rhino.ObjectType.Curve:\n const pts = curveToPoints(_geometry, 100)\n\n position = {}\n attributes = {}\n data = {}\n\n position.itemSize = 3\n position.type = 'Float32Array'\n position.array = []\n\n for (let j = 0; j < pts.length; j++) {\n position.array.push(pts[j][0])\n position.array.push(pts[j][1])\n position.array.push(pts[j][2])\n }\n\n attributes.position = position\n data.attributes = attributes\n\n geometry = { data }\n\n break\n\n case rhino.ObjectType.Point:\n const pt = _geometry.location\n\n position = {}\n const color = {}\n attributes = {}\n data = {}\n\n position.itemSize = 3\n position.type = 'Float32Array'\n position.array = [pt[0], pt[1], pt[2]]\n\n const _color = _attributes.drawColor(doc)\n\n color.itemSize = 3\n color.type = 'Float32Array'\n color.array = [_color.r / 255.0, _color.g / 255.0, _color.b / 255.0]\n\n attributes.position = position\n attributes.color = color\n data.attributes = attributes\n\n geometry = { data }\n\n break\n\n case rhino.ObjectType.PointSet:\n case rhino.ObjectType.Mesh:\n geometry = _geometry.toThreejsJSON()\n\n break\n\n case rhino.ObjectType.Brep:\n const faces = _geometry.faces()\n mesh = new rhino.Mesh()\n\n for (let faceIndex = 0; faceIndex < faces.count; faceIndex++) {\n const face = faces.get(faceIndex)\n const _mesh = face.getMesh(rhino.MeshType.Any)\n\n if (_mesh) {\n mesh.append(_mesh)\n _mesh.delete()\n }\n\n face.delete()\n }\n\n if (mesh.faces().count > 0) {\n mesh.compact()\n geometry = mesh.toThreejsJSON()\n faces.delete()\n }\n\n mesh.delete()\n\n break\n\n case rhino.ObjectType.Extrusion:\n mesh = _geometry.getMesh(rhino.MeshType.Any)\n\n if (mesh) {\n geometry = mesh.toThreejsJSON()\n mesh.delete()\n }\n\n break\n\n case rhino.ObjectType.TextDot:\n geometry = extractProperties(_geometry)\n\n break\n\n case rhino.ObjectType.Light:\n geometry = extractProperties(_geometry)\n\n break\n\n case rhino.ObjectType.InstanceReference:\n geometry = extractProperties(_geometry)\n geometry.xform = extractProperties(_geometry.xform)\n geometry.xform.array = _geometry.xform.toFloatArray(true)\n\n break\n\n case rhino.ObjectType.SubD:\n // TODO: precalculate resulting vertices and faces and warn on excessive results\n _geometry.subdivide(3)\n mesh = rhino.Mesh.createFromSubDControlNet(_geometry)\n if (mesh) {\n geometry = mesh.toThreejsJSON()\n mesh.delete()\n }\n\n break\n\n /*\n\t\t\t\tcase rhino.ObjectType.Annotation:\n\t\t\t\tcase rhino.ObjectType.Hatch:\n\t\t\t\tcase rhino.ObjectType.ClipPlane:\n\t\t\t\t*/\n\n default:\n console.warn(`THREE.3DMLoader: TODO: Implement ${objectType.constructor.name}`)\n break\n }\n\n if (geometry) {\n attributes = extractProperties(_attributes)\n attributes.geometry = extractProperties(_geometry)\n\n if (_attributes.groupCount > 0) {\n attributes.groupIds = _attributes.getGroupList()\n }\n\n if (_attributes.userStringCount > 0) {\n attributes.userStrings = _attributes.getUserStrings()\n }\n\n if (_geometry.userStringCount > 0) {\n attributes.geometry.userStrings = _geometry.getUserStrings()\n }\n\n attributes.drawColor = _attributes.drawColor(doc)\n\n objectType = objectType.constructor.name\n objectType = objectType.substring(11, objectType.length)\n\n return { geometry, attributes, objectType }\n } else {\n console.warn(`THREE.3DMLoader: ${objectType.constructor.name} has no associated mesh geometry.`)\n }\n }\n\n function extractProperties(object) {\n const result = {}\n\n for (const property in object) {\n const value = object[property]\n\n if (typeof value !== 'function') {\n if (typeof value === 'object' && value !== null && value.hasOwnProperty('constructor')) {\n result[property] = { name: value.constructor.name, value: value.value }\n } else {\n result[property] = value\n }\n } else {\n // these are functions that could be called to extract more data.\n //console.log( `${property}: ${object[ property ].constructor.name}` );\n }\n }\n\n return result\n }\n\n function curveToPoints(curve, pointLimit) {\n let pointCount = pointLimit\n let rc = []\n const ts = []\n\n if (curve instanceof rhino.LineCurve) {\n return [curve.pointAtStart, curve.pointAtEnd]\n }\n\n if (curve instanceof rhino.PolylineCurve) {\n pointCount = curve.pointCount\n for (let i = 0; i < pointCount; i++) {\n rc.push(curve.point(i))\n }\n\n return rc\n }\n\n if (curve instanceof rhino.PolyCurve) {\n const segmentCount = curve.segmentCount\n\n for (let i = 0; i < segmentCount; i++) {\n const segment = curve.segmentCurve(i)\n const segmentArray = curveToPoints(segment, pointCount)\n rc = rc.concat(segmentArray)\n segment.delete()\n }\n\n return rc\n }\n\n if (curve instanceof rhino.ArcCurve) {\n pointCount = Math.floor(curve.angleDegrees / 5)\n pointCount = pointCount < 2 ? 2 : pointCount\n // alternative to this hardcoded version: https://stackoverflow.com/a/18499923/2179399\n }\n\n if (curve instanceof rhino.NurbsCurve && curve.degree === 1) {\n const pLine = curve.tryGetPolyline()\n\n for (let i = 0; i < pLine.count; i++) {\n rc.push(pLine.get(i))\n }\n\n pLine.delete()\n\n return rc\n }\n\n const domain = curve.domain\n const divisions = pointCount - 1.0\n\n for (let j = 0; j < pointCount; j++) {\n const t = domain[0] + (j / divisions) * (domain[1] - domain[0])\n\n if (t === domain[0] || t === domain[1]) {\n ts.push(t)\n continue\n }\n\n const tan = curve.tangentAt(t)\n const prevTan = curve.tangentAt(ts.slice(-1)[0])\n\n // Duplicated from THREE.Vector3\n // How to pass imports to worker?\n\n const tS = tan[0] * tan[0] + tan[1] * tan[1] + tan[2] * tan[2]\n const ptS = prevTan[0] * prevTan[0] + prevTan[1] * prevTan[1] + prevTan[2] * prevTan[2]\n\n const denominator = Math.sqrt(tS * ptS)\n\n let angle\n\n if (denominator === 0) {\n angle = Math.PI / 2\n } else {\n const theta = (tan.x * prevTan.x + tan.y * prevTan.y + tan.z * prevTan.z) / denominator\n angle = Math.acos(Math.max(-1, Math.min(1, theta)))\n }\n\n if (angle < 0.1) continue\n\n ts.push(t)\n }\n\n rc = ts.map((t) => curve.pointAt(t))\n return rc\n }\n}\n\nexport { Rhino3dmLoader }\n"],"names":["Loader","FileLoader","MeshStandardMaterial","Color","TextureLoader","Object3D","Matrix4","BufferGeometryLoader","PointsMaterial","Points","Mesh","LineBasicMaterial","Line","CanvasTexture","LinearFilter","ClampToEdgeWrapping","SpriteMaterial","Sprite","DirectionalLight","PointLight","RectAreaLight","width","height","Vector3","SpotLight","jsContent","binaryContent","worker","rhino"],"mappings":"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