From ae4ab8602e1ab23de742e698af8a388c0c6205fb Mon Sep 17 00:00:00 2001 From: zy410419243 Date: Fri, 31 May 2019 07:33:19 +0800 Subject: [PATCH] fix: export CleanWebpackPlugin, for https://github.com/johnagan/clean-webpack-plugin/pull/144 --- dist/Trunk.js | 2 +- dist/Trunk.js.map | 2 +- dist/index.html | 2 +- webpack.prod.js | 20 +++++++++++--------- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/dist/Trunk.js b/dist/Trunk.js index 9043ec2..71705b1 100644 --- a/dist/Trunk.js +++ b/dist/Trunk.js @@ -1,2 +1,2 @@ -!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("three"));else if("function"==typeof define&&define.amd)define(["three"],t);else{var n="object"==typeof exports?t(require("three")):t(e.three);for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var a=t[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)n.d(r,a,function(t){return e[t]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=2)}([function(t,n){t.exports=e},function(e,t,n){"use strict";var r,a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};void 0===(r=function(){var e,t=Object.prototype.toString,n=Object.prototype.hasOwnProperty,r={"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regExp","[object Object]":"object"},o=function(e){return null==e?String(e):r[t.call(e)]||"object"},i=Array.isArray||function(e){return"array"===o(e)},s=function(e){if(!e||"object"!==o(e)||e.nodeType||function(e){return e&&"object"===(void 0===e?"undefined":a(e))&&"setInterval"in e}(e))return!1;if(e.constructor&&!n.call(e,"constructor")&&!n.call(e.constructor.prototype,"isPrototypeOf"))return!1;var t;for(t in e);return void 0===t||n.call(e,t)};return function t(n,r){for(var a in r){var o,c=n[a],u=r[a];n!==u&&(u&&(s(u)||(e=i(u)))?(e?(e=!1,o=c&&i(c)?c:[]):o=c&&s(c)?c:{},n[a]=t(o,u)):void 0!==u&&(n[a]=u))}return n}}.apply(t,[]))||(e.exports=r)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return e&&e.__esModule?e:{default:e}}(n(3));t.default=r.default},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(n(0)),a=c(n(4)),o=c(n(7)),i=c(n(8)),s=c(n(1));function c(e){return e&&e.__esModule?e:{default:e}}function u(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t.5?200*Math.random()+300:500*-Math.random()-1e3},r[t]=a),n.position.set(a.x,a.y,a.z)},this.dealObjectInLoadCirculStart=function(t,n){if(t.name&&(/border$/.test(t.name)&&(t.visible=n),t instanceof r.Mesh)){var a=t.name.split("_")[0];e.initAreaPosition(a,t)}},this.changeModel4DataRefresh=function(t,n){var r=t.name;if(/pillar$/.test(r)){var a=r.split("_")[0],o=t.userData.val;if(a){var i=0;n&&0!==n&&(i=15*(o/n)),i<=0?t.visible=!1:(e.setHeightSlow(t,i),t.visible=!0)}else a=r?r.split("_")[0]:"",t.visible=!1}},this.setHeightSlow=function(t,n){e.setHeight(t,1);var r=1,a=void 0;a=setInterval(function(){if(r<300){var o=Math.floor(n*r/300);e.setHeight(t,o),r++}else 300===r?(r++,e.setHeight(t,n)):(clearInterval(a),delete e.intervals[a])},function(){}),e.intervals[a]=a},this.setHeight=function(e,t){(0===t||isNaN(t))&&(t=1);var n=e.geometry;n.verticesNeedUpdate=!0;var r=n.vertices,a=r[0].z,o=!0,i=!1,s=void 0;try{for(var c,u=r[Symbol.iterator]();!(o=(c=u.next()).done);o=!0){var l=c.value.z;if(a!=l){a=Math.min(l,a);break}}}catch(e){i=!0,s=e}finally{try{!o&&u.return&&u.return()}finally{if(i)throw s}}var h=!0,f=!1,d=void 0;try{for(var p,m=r[Symbol.iterator]();!(h=(p=m.next()).done);h=!0){var v=p.value;v.z!==a&&(v.z=a+t)}}catch(e){f=!0,d=e}finally{try{!h&&m.return&&m.return()}finally{if(f)throw d}}},this.initListener=function(t){e.container.addEventListener("mousemove",function(t){return e.setMeshHighLightStatus(t)},!1),e.container.addEventListener("click",function(n){return e.showDetail(n,t)},!1)},this.setMeshHighLightStatus=function(t){var n=e.config,r=e.objectFromMouse(t.pageX,t.pageY).object,a=n.texture;if(r){var o=e.current&&e.current.uuid;if(o===r.uuid)return;r.name.includes("border")||r.name.includes("line")||r.name.includes("pillar")||r.name.includes("texture")||r.name.includes("river")||(o?(e.current.material.color.set(a.top),e.old=e.current,e.current=r,r.material.color.set(a.select)):(e.current=r,r.material.color.set(a.select)))}},this.showDetail=function(t,n){var r=e.config;t.preventDefault();var a=e.objectFromMouse(t.pageX,t.pageY).object;if(a&&r.showDetail){var o=r.showDetail(a);e.meshMove(!!o,n)}},this.objectFromMouse=function(t,n){var a=e.container,o=e.renderer.domElement,i=o.offsetLeft,s=n-o.offsetTop,c=(t-i)/a.offsetWidth*2-1,u=-s/a.offsetHeight*2+1,l=new r.Vector2(c,u),h=new r.Raycaster;h.setFromCamera(l,e.camera);var f=h.intersectObjects(e.root.children,!0);if(f.length>0){var d=f[0];if(d)return d}return{object:null,point:null,face:null}},this.getOffset=function(t,n){return n||((n={}).top=0,n.left=0),t==document.body?n:(n.top+=t.offsetTop,n.left+=t.offsetLeft,e.getOffset(t.parentNode,n))},this.meshMove=function(t,n){var r=e.camera,a=e.renderer,o=e.container,i=e.getMeshWidth,s=e._getCoordinate2InScene,c=e.config,u={x:0,y:0,z:0};Math.PI;if(t){({x:-Math.PI/4,y:Math.PI/180*10,z:0});var l=o.clientWidth/550;e.withdrawPosition||(e.withdrawPosition=s({x:30*l,y:a.domElement.offsetHeight/2},r,a.domElement),e.withdrawPosition.x+=i(n).length/4,e.tweenInOut(r.position,{z:80},1e3)),u=e.withdrawPosition,e.tweenInOut(n.position,u,1e3)}else e.tweenInOut(r.position,c.cameraPosition,1e3),e.tweenInOut(n.position,u,1e3),e.withdrawPosition=null},this.getMeshWidth=function(e){var t=new r.BoxHelper(e,16711680),n=(new r.Box3).setFromObject(e);return t.update(),{length:n.max.x-n.min.x,width:n.max.y-n.min.y,height:n.max.z-n.min.z}},this.handleModelShift=function(t){var n=e._startPositions,r=e.config;if(n[t.name.split("_")[0]])return r.meshShiftTime&&r.meshShiftTime()},this.childMapping=function(t){var n=e.config;n.childMapping&&n.childMapping(t)},this._getCoordinate2InScene=function(t,n,a){n.updateMatrixWorld(!0);var o=e.getVector2InScene(t,a),i=new r.Vector3(o.x,o.y,0);i.unproject(n),i.sub(n.position),i.normalize();var s=new r.Raycaster(n.position,i),c=s.ray.origin,u=s.ray.direction,l=new r.Vector3;return l.setX(c.x-(c.z-0)*u.x/u.z),l.setY(c.y-(c.z-0)*u.y/u.z),l},this.getVector2InScene=function(e,t){var n=new r.Vector2;return n.x=e.x/t.offsetWidth*2-1,n.y=-e.y/t.offsetHeight*2+1,n},this.tweenInOut=function(e,t,n,r,a){var o=new i.default.Tween(e).to(t,n).easing(i.default.Easing.Exponential.InOut);return r&&o.onComplete(r),a&&o.onStart(a),o.start()},this.loadMaterials=function(e,t,n,r){t.load(e[0],function(a){n?n.materialsInfo=[].concat(u(n.materialsInfo),u(a.materialsInfo)):n=a,e.shift(),0!=e.length?loadMaterials(e,t,n,r):r(n)})},this.loadObjects=function(e,t,n,r){t.load(e[0],function(a){n?n.children=a.children.concat(n.children):n=(0,s.default)({},a),e.shift(),0!=e.length?loadObjects(e,t,n,r):r(n)})},this.initParams=function(){var t=e.config,n=t.cameraPosition,a=t.clientWidth,i=t.clientHeight,s=n.x,c=n.y,u=n.z;e.container=t.container;var l=a/i;e.camera=new r.PerspectiveCamera(45,l,1,1e4),e.camera.position.set(s,c,u),e.renderer=new r.WebGLRenderer({alpha:!0,antialias:!0}),e.resize(a,i-4),e.renderer.shadowMap.enabled=!0,e.renderer.shadowMap.type=r.PCFSoftShadowMap,e.container.appendChild(e.renderer.domElement),e.scene=new r.Scene,e.scene.add(e.camera);var h=new o.default(e.camera,e.renderer.domElement);if(Object.assign(h,t.controls),e.controls=h,t.light){var f=t.light(),d=!0,p=!1,m=void 0;try{for(var v,b=f[Symbol.iterator]();!(d=(v=b.next()).done);d=!0){var g=v.value;e.scene.add(g)}}catch(e){p=!0,m=e}finally{try{!d&&b.return&&b.return()}finally{if(p)throw m}}}t.clearColor&&e.renderer.setClearColor(t.clearColor,t.clearOpacity)},this.afterMovementMesh=function(){var t=e.config.afterRotation;!function n(){requestAnimationFrame(n),e.root.rotation.x>=t&&(e.root.rotation.x-=e.config.rotationSpeed),e.renderer.render(e.scene,e.camera)}()},this.handleMesh=function(t){var n=e.config,a=e._startTweenCount;t.traverse(function(o){if(!(o instanceof r.Group)){o instanceof r.Mesh?o.geometry=(new r.Geometry).fromBufferGeometry(o.geometry):o instanceof r.Line&&console.log(o.name),"texture"==o.name&&(e.modelTexture=o),e.dealObjectInLoadCirculStart(o,n.borderVisible),e.childMapping(o,n);var i=e.handleModelShift(o,n);e.tweenInOut(o.position,{x:0,y:0,z:0},i,function(){if(0===--a){e.renderPillar(t),e.afterMovementMesh();var n=!0,r=!1,o=void 0;try{for(var i,s=t.children[Symbol.iterator]();!(n=(i=s.next()).done);n=!0){var c=i.value;e.config.before_animate&&e.config.before_animate(c,!0)}}catch(e){r=!0,o=e}finally{try{!n&&s.return&&s.return()}finally{if(r)throw o}}e.initListener(t)}}),a++}})},this.showTexture=function(t,n){n&&(new r.TextureLoader).load(n,function(n){e.modelTexture.material.map=n,e.modelTexture.material=Object.assign(e.modelTexture.material,t),e.modelTexture.visible=!e.modelTexture.visible})},this.getObject=function(){return e.dataObject},this.refreshPillar=function(t){var n=e.dataObject;n=t,e.renderPillar(n)},this.flush=function(){!function t(){requestAnimationFrame(t),i.default.update(),e.controls.update(),e.renderer.render(e.scene,e.camera)}()},this.renderPillar=function(t){var n=e.config;t.traverse(function(t){e.changeModel4DataRefresh(t,n.divisor)})},this.resize=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.documentElement.clientWidth,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document.documentElement.clientHeight-4;e.renderer.setSize(t,n)},this.init=function(){var t=e.config,n=t.data,o=n.materials,i=n.objects;t.beforeInit&&t.beforeInit(t),new a.default(t).load(o,i,function(n){t.data.load(n,function(t){e.dataObject=t,e.handleMesh(t),e.root=(new r.Object3D).add(t),e.scene.add(e.root),e.flush()})})}};t.default=function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),l.call(this),this.config=(0,s.default)(this.config,t),this.initParams(this.config)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=i(n(5)),a=i(n(6)),o=i(n(1));function i(e){return e&&e.__esModule?e:{default:e}}function s(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0?i.substring(0,c):i;u=u.toLowerCase();var l=c>=0?i.substring(c+1):"";if(l=l.trim(),"newmtl"===u)n={name:l},a[l]=n;else if(n)if("ka"===u||"kd"===u||"ks"===u){var h=l.split(r,3);n[u]=[parseFloat(h[0]),parseFloat(h[1]),parseFloat(h[2])]}else n[u]=l}}var f=new s(this.texturePath||this.path,this.materialOptions);return f.setCrossOrigin(this.crossOrigin),f.setManager(this.manager),f.setMaterials(a),f}}]),e}(),s=function(){function e(t,n){o(this,e),this.crossOrigin="Anonymous",this.baseUrl=t||"",this.options=n,this.materialsInfo={},this.materials={},this.materialsArray=[],this.nameLookup={},this.side=this.options&&this.options.side?this.options.side:a.FrontSide,this.wrap=this.options&&this.options.wrap?this.options.wrap:a.RepeatWrapping}return r(e,[{key:"setCrossOrigin",value:function(e){this.crossOrigin=e}},{key:"setManager",value:function(e){this.manager=e}},{key:"setMaterials",value:function(e){this.materialsInfo=this.convert(e),this.materials={},this.materialsArray=[],this.nameLookup={}}},{key:"convert",value:function(e){if(!this.options)return e;var t={};for(var n in e){var r=e[n],a={};for(var o in t[n]=a,r){var i=!0,s=r[o],c=o.toLowerCase();switch(c){case"kd":case"ka":case"ks":this.options&&this.options.normalizeRGB&&(s=[s[0]/255,s[1]/255,s[2]/255]),this.options&&this.options.ignoreZeroRGBs&&0===s[0]&&0===s[1]&&0===s[2]&&(i=!1)}i&&(a[c]=s)}}return t}},{key:"preload",value:function(){for(var e in this.materialsInfo)this.create(e)}},{key:"getIndex",value:function(e){return this.nameLookup[e]}},{key:"getAsArray",value:function(){var e=0;for(var t in this.materialsInfo)this.materialsArray[e]=this.create(t),this.nameLookup[t]=e,e++;return this.materialsArray}},{key:"create",value:function(e){return void 0===this.materials[e]&&this.createMaterial(e),this.materials[e]}},{key:"createMaterial",value:function(e){var t=this,n=this.materialsInfo[e],r={name:e,side:this.side};function o(e,n){if(!r[e]){var a=t.getTextureParams(n,r),o=t.loadTexture(function(e,t){return"string"!=typeof t||""===t?"":/^https?:\/\//i.test(t)?t:e+t}(t.baseUrl,a.url));o.repeat.copy(a.scale),o.offset.copy(a.offset),o.wrapS=t.wrap,o.wrapT=t.wrap,r[e]=o}}for(var i in n){var s,c=n[i];if(""!==c)switch(i.toLowerCase()){case"kd":r.color=(new a.Color).fromArray(c);break;case"ks":r.specular=(new a.Color).fromArray(c);break;case"map_kd":o("map",c);break;case"map_ks":o("specularMap",c);break;case"norm":o("normalMap",c);break;case"map_bump":case"bump":o("bumpMap",c);break;case"ns":r.shininess=parseFloat(c);break;case"d":(s=parseFloat(c))<1&&(r.opacity=s,r.transparent=!0);break;case"tr":(s=parseFloat(c))>0&&(r.opacity=1-s,r.transparent=!0)}}return this.materials[e]=new a.MeshPhongMaterial(r),this.materials[e]}},{key:"getTextureParams",value:function(e,t){var n,r={scale:new a.Vector2(1,1),offset:new a.Vector2(0,0)},o=e.split(/\s+/);return(n=o.indexOf("-bm"))>=0&&(t.bumpScale=parseFloat(o[n+1]),o.splice(n,2)),(n=o.indexOf("-s"))>=0&&(r.scale.set(parseFloat(o[n+1]),parseFloat(o[n+2])),o.splice(n,4)),(n=o.indexOf("-o"))>=0&&(r.offset.set(parseFloat(o[n+1]),parseFloat(o[n+2])),o.splice(n,4)),r.url=o.join(" ").trim(),r}},{key:"loadTexture",value:function(e,t,n,r,o){var i,s=a.Loader.Handlers.get(e),c=void 0!==this.manager?this.manager:a.DefaultLoadingManager;return null===s&&(s=new a.TextureLoader(c)),s.setCrossOrigin&&s.setCrossOrigin(this.crossOrigin),i=s.load(e,n,r,o),void 0!==t&&(i.mapping=t),i}}]),e}();t.default=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n0?t[t.length-1]:"",smooth:void 0!==n?n.smooth:this.smooth,groupStart:void 0!==n?n.groupEnd:0,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(e){var t={index:"number"==typeof e?e:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1};return t.clone=this.clone.bind(t),t}};return this.materials.push(r),r},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},finalize:function(e){var t=this.currentMaterial();if(t&&-1===t.groupEnd&&(t.groupEnd=this.geometry.vertices.length/3,t.groupCount=t.groupEnd-t.groupStart,t.inherited=!1),e&&this.materials.length>1)for(var n=this.materials.length-1;n>=0;n--)this.materials[n].groupCount<=0&&this.materials.splice(n,1);return e&&0===this.materials.length&&this.materials.push({name:"",smooth:this.smooth}),t}},n&&n.name&&"function"==typeof n.clone){var r=n.clone(0);r.inherited=!0,this.object.materials.push(r)}this.objects.push(this.object)},finalize:function(){this.object&&"function"==typeof this.object.finalize&&this.object.finalize(!0)},parseVertexIndex:function(e,t){var n=parseInt(e,10);return 3*(n>=0?n-1:n+t/3)},parseNormalIndex:function(e,t){var n=parseInt(e,10);return 3*(n>=0?n-1:n+t/3)},parseUVIndex:function(e,t){var n=parseInt(e,10);return 2*(n>=0?n-1:n+t/2)},addVertex:function(e,t,n){var r=this.vertices,a=this.object.geometry.vertices;a.push(r[e+0]),a.push(r[e+1]),a.push(r[e+2]),a.push(r[t+0]),a.push(r[t+1]),a.push(r[t+2]),a.push(r[n+0]),a.push(r[n+1]),a.push(r[n+2])},addVertexLine:function(e){var t=this.vertices,n=this.object.geometry.vertices;n.push(t[e+0]),n.push(t[e+1]),n.push(t[e+2])},addNormal:function(e,t,n){var r=this.normals,a=this.object.geometry.normals;a.push(r[e+0]),a.push(r[e+1]),a.push(r[e+2]),a.push(r[t+0]),a.push(r[t+1]),a.push(r[t+2]),a.push(r[n+0]),a.push(r[n+1]),a.push(r[n+2])},addUV:function(e,t,n){var r=this.uvs,a=this.object.geometry.uvs;a.push(r[e+0]),a.push(r[e+1]),a.push(r[t+0]),a.push(r[t+1]),a.push(r[n+0]),a.push(r[n+1])},addUVLine:function(e){var t=this.uvs,n=this.object.geometry.uvs;n.push(t[e+0]),n.push(t[e+1])},addFace:function(e,t,n,r,a,o,i,s,c,u,l,h){var f,d=this.vertices.length,p=this.parseVertexIndex(e,d),m=this.parseVertexIndex(t,d),v=this.parseVertexIndex(n,d);if(void 0===r?this.addVertex(p,m,v):(f=this.parseVertexIndex(r,d),this.addVertex(p,m,f),this.addVertex(m,v,f)),void 0!==a){var b=this.uvs.length;p=this.parseUVIndex(a,b),m=this.parseUVIndex(o,b),v=this.parseUVIndex(i,b),void 0===r?this.addUV(p,m,v):(f=this.parseUVIndex(s,b),this.addUV(p,m,f),this.addUV(m,v,f))}if(void 0!==c){var g=this.normals.length;p=this.parseNormalIndex(c,g),m=c===u?p:this.parseNormalIndex(u,g),v=c===l?p:this.parseNormalIndex(l,g),void 0===r?this.addNormal(p,m,v):(f=this.parseNormalIndex(h,g),this.addNormal(p,m,f),this.addNormal(m,v,f))}},addLineGeometry:function(e,t){this.object.geometry.type="Line";for(var n=this.vertices.length,r=this.uvs.length,a=0,o=e.length;a0?j.addAttribute("normal",new a.BufferAttribute(new Float32Array(O.normals),3)):j.computeVertexNormals(),O.uvs.length>0&&j.addAttribute("uv",new a.BufferAttribute(new Float32Array(O.uvs),2));for(var P,I=[],L=0,S=M.length;L1){for(L=0,S=M.length;Lu||8*(1-v.dot(n.object.quaternion))>u)&&(n.dispatchEvent(a),m.copy(n.object.position),v.copy(n.object.quaternion),p=!1,!0)}}(),this.dispose=function(){n.domElement.removeEventListener("contextmenu",z,!1),n.domElement.removeEventListener("mousedown",k,!1),n.domElement.removeEventListener("wheel",F,!1),n.domElement.removeEventListener("touchstart",N,!1),n.domElement.removeEventListener("touchend",_,!1),n.domElement.removeEventListener("touchmove",U,!1),document.removeEventListener("mousemove",A,!1),document.removeEventListener("mouseup",V,!1),window.removeEventListener("keydown",R,!1)};var n=this,a={type:"change"},o={type:"start"},i={type:"end"},s={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY_PAN:4},c=s.NONE,u=1e-6,l=new r.Spherical,h=new r.Spherical,f=1,d=new r.Vector3,p=!1,m=new r.Vector2,v=new r.Vector2,b=new r.Vector2,g=new r.Vector2,y=new r.Vector2,w=new r.Vector2,x=new r.Vector2,O=new r.Vector2,M=new r.Vector2;function E(){return Math.pow(.95,n.zoomSpeed)}function j(e){h.theta-=e}function P(e){h.phi-=e}var I=function(){var e=new r.Vector3;return function(t,n){e.setFromMatrixColumn(n,0),e.multiplyScalar(-t),d.add(e)}}(),L=function(){var e=new r.Vector3;return function(t,r){!0===n.screenSpacePanning?e.setFromMatrixColumn(r,1):(e.setFromMatrixColumn(r,0),e.crossVectors(n.object.up,e)),e.multiplyScalar(t),d.add(e)}}(),S=function(){var e=new r.Vector3;return function(t,r){var a=n.domElement===document?n.domElement.body:n.domElement;if(n.object.isPerspectiveCamera){var o=n.object.position;e.copy(o).sub(n.target);var i=e.length();i*=Math.tan(n.object.fov/2*Math.PI/180),I(2*t*i/a.clientHeight,n.object.matrix),L(2*r*i/a.clientHeight,n.object.matrix)}else n.object.isOrthographicCamera?(I(t*(n.object.right-n.object.left)/n.object.zoom/a.clientWidth,n.object.matrix),L(r*(n.object.top-n.object.bottom)/n.object.zoom/a.clientHeight,n.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),n.enablePan=!1)}}();function T(e){n.object.isPerspectiveCamera?f/=e:n.object.isOrthographicCamera?(n.object.zoom=Math.max(n.minZoom,Math.min(n.maxZoom,n.object.zoom*e)),n.object.updateProjectionMatrix(),p=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),n.enableZoom=!1)}function C(e){n.object.isPerspectiveCamera?f*=e:n.object.isOrthographicCamera?(n.object.zoom=Math.max(n.minZoom,Math.min(n.maxZoom,n.object.zoom/e)),n.object.updateProjectionMatrix(),p=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),n.enableZoom=!1)}function k(e){if(!1!==n.enabled){switch(e.preventDefault(),e.button){case n.mouseButtons.ORBIT:if(!1===n.enableRotate)return;!function(e){m.set(e.clientX,e.clientY)}(e),c=s.ROTATE;break;case n.mouseButtons.ZOOM:if(!1===n.enableZoom)return;!function(e){x.set(e.clientX,e.clientY)}(e),c=s.DOLLY;break;case n.mouseButtons.PAN:if(!1===n.enablePan)return;!function(e){g.set(e.clientX,e.clientY)}(e),c=s.PAN}c!==s.NONE&&(document.addEventListener("mousemove",A,!1),document.addEventListener("mouseup",V,!1),n.dispatchEvent(o))}}function A(e){if(!1!==n.enabled)switch(e.preventDefault(),c){case s.ROTATE:if(!1===n.enableRotate)return;!function(e){v.set(e.clientX,e.clientY),b.subVectors(v,m).multiplyScalar(n.rotateSpeed);var t=n.domElement===document?n.domElement.body:n.domElement;j(2*Math.PI*b.x/t.clientWidth),P(2*Math.PI*b.y/t.clientHeight),m.copy(v),n.update()}(e);break;case s.DOLLY:if(!1===n.enableZoom)return;!function(e){O.set(e.clientX,e.clientY),M.subVectors(O,x),M.y>0?T(E()):M.y<0&&C(E()),x.copy(O),n.update()}(e);break;case s.PAN:if(!1===n.enablePan)return;!function(e){y.set(e.clientX,e.clientY),w.subVectors(y,g).multiplyScalar(n.panSpeed),S(w.x,w.y),g.copy(y),n.update()}(e)}}function V(e){!1!==n.enabled&&(document.removeEventListener("mousemove",A,!1),document.removeEventListener("mouseup",V,!1),n.dispatchEvent(i),c=s.NONE)}function F(e){!1===n.enabled||!1===n.enableZoom||c!==s.NONE&&c!==s.ROTATE||(e.preventDefault(),e.stopPropagation(),n.dispatchEvent(o),function(e){e.deltaY<0?C(E()):e.deltaY>0&&T(E()),n.update()}(e),n.dispatchEvent(i))}function R(e){!1!==n.enabled&&!1!==n.enableKeys&&!1!==n.enablePan&&function(e){switch(e.keyCode){case n.keys.UP:S(0,n.keyPanSpeed),n.update();break;case n.keys.BOTTOM:S(0,-n.keyPanSpeed),n.update();break;case n.keys.LEFT:S(n.keyPanSpeed,0),n.update();break;case n.keys.RIGHT:S(-n.keyPanSpeed,0),n.update()}}(e)}function N(e){if(!1!==n.enabled){switch(e.preventDefault(),e.touches.length){case 1:if(!1===n.enableRotate)return;!function(e){m.set(e.touches[0].pageX,e.touches[0].pageY)}(e),c=s.TOUCH_ROTATE;break;case 2:if(!1===n.enableZoom&&!1===n.enablePan)return;!function(e){if(n.enableZoom){var t=e.touches[0].pageX-e.touches[1].pageX,r=e.touches[0].pageY-e.touches[1].pageY,a=Math.sqrt(t*t+r*r);x.set(0,a)}if(n.enablePan){var o=.5*(e.touches[0].pageX+e.touches[1].pageX),i=.5*(e.touches[0].pageY+e.touches[1].pageY);g.set(o,i)}}(e),c=s.TOUCH_DOLLY_PAN;break;default:c=s.NONE}c!==s.NONE&&n.dispatchEvent(o)}}function U(e){if(!1!==n.enabled)switch(e.preventDefault(),e.stopPropagation(),e.touches.length){case 1:if(!1===n.enableRotate)return;if(c!==s.TOUCH_ROTATE)return;!function(e){v.set(e.touches[0].pageX,e.touches[0].pageY),b.subVectors(v,m).multiplyScalar(n.rotateSpeed);var t=n.domElement===document?n.domElement.body:n.domElement;j(2*Math.PI*b.x/t.clientWidth),P(2*Math.PI*b.y/t.clientHeight),m.copy(v),n.update()}(e);break;case 2:if(!1===n.enableZoom&&!1===n.enablePan)return;if(c!==s.TOUCH_DOLLY_PAN)return;!function(e){if(n.enableZoom){var t=e.touches[0].pageX-e.touches[1].pageX,r=e.touches[0].pageY-e.touches[1].pageY,a=Math.sqrt(t*t+r*r);O.set(0,a),M.set(0,Math.pow(O.y/x.y,n.zoomSpeed)),T(M.y),x.copy(O)}if(n.enablePan){var o=.5*(e.touches[0].pageX+e.touches[1].pageX),i=.5*(e.touches[0].pageY+e.touches[1].pageY);y.set(o,i),w.subVectors(y,g).multiplyScalar(n.panSpeed),S(w.x,w.y),g.copy(y)}n.update()}(e);break;default:c=s.NONE}}function _(e){!1!==n.enabled&&(n.dispatchEvent(i),c=s.NONE)}function z(e){!1!==n.enabled&&e.preventDefault()}n.domElement.addEventListener("contextmenu",z,!1),n.domElement.addEventListener("mousedown",k,!1),n.domElement.addEventListener("wheel",F,!1),n.domElement.addEventListener("touchstart",N,!1),n.domElement.addEventListener("touchend",_,!1),n.domElement.addEventListener("touchmove",U,!1),window.addEventListener("keydown",R,!1),this.update()},r.OrbitControls.prototype=Object.create(r.EventDispatcher.prototype),r.OrbitControls.prototype.constructor=r.OrbitControls,Object.defineProperties(r.OrbitControls.prototype,{center:{get:function(){return console.warn("THREE.OrbitControls: .center has been renamed to .target"),this.target}},noZoom:{get:function(){return console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),!this.enableZoom},set:function(e){console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),this.enableZoom=!e}},noRotate:{get:function(){return console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),!this.enableRotate},set:function(e){console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),this.enableRotate=!e}},noPan:{get:function(){return console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),!this.enablePan},set:function(e){console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),this.enablePan=!e}},noKeys:{get:function(){return console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),!this.enableKeys},set:function(e){console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),this.enableKeys=!e}},staticMoving:{get:function(){return console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),!this.enableDamping},set:function(e){console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),this.enableDamping=!e}},dynamicDampingFactor:{get:function(){return console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.dampingFactor},set:function(e){console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.dampingFactor=e}}}),e.exports=t.default=r.OrbitControls},function(e,t){void 0===Date.now&&(Date.now=function(){return(new Date).valueOf()});var n=n||function(){var e=[];return{REVISION:"8",getAll:function(){return e},removeAll:function(){e=[]},add:function(t){e.push(t)},remove:function(t){var n=e.indexOf(t);-1!==n&&e.splice(n,1)},update:function(t){if(0===e.length)return!1;var n=0,r=e.length;for(t=void 0!==t?t:Date.now();n1?1:n);for(var m in r){var v=r[m],b=a[m];b instanceof Array?t[m]=u(b,i):t[m]=v+(b-v)*i}if(null!==d&&d.call(t,i),1==n){null!==p&&p.call(t);for(var g=0,y=l.length;g1?i(e[r],e[r-1],r-a):i(e[o],e[o+1>r?r:o+1],a-o)},Bezier:function(e,t){var r,a=0,o=e.length-1,i=Math.pow,s=n.Interpolation.Utils.Bernstein;for(r=0;r<=o;r++)a+=i(1-t,o-r)*i(t,r)*e[r]*s(o,r);return a},CatmullRom:function(e,t){var r=e.length-1,a=r*t,o=Math.floor(a),i=n.Interpolation.Utils.CatmullRom;return e[0]===e[r]?(t<0&&(o=Math.floor(a=r*(1+t))),i(e[(o-1+r)%r],e[o],e[(o+1)%r],e[(o+2)%r],a-o)):t<0?e[0]-(i(e[0],e[0],e[1],e[1],-a)-e[0]):t>1?e[r]-(i(e[r],e[r],e[r-1],e[r-1],a-r)-e[r]):i(e[o?o-1:0],e[o],e[r1;n--)r*=n;return e[t]=r}}(),CatmullRom:function(e,t,n,r,a){var o=.5*(n-e),i=.5*(r-t),s=a*a;return(2*t-2*n+o+i)*(a*s)+(-3*t+3*n-2*o-i)*s+o*a+t}}},e.exports=n}])}); +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("three"));else if("function"==typeof define&&define.amd)define(["three"],t);else{var n="object"==typeof exports?t(require("three")):t(e.three);for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(window,function(e){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=4)}([function(t,n){t.exports=e},function(e,t,n){var r;function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}void 0===(r=function(){var e,t=Object.prototype.toString,n=Object.prototype.hasOwnProperty,r={"[object Boolean]":"boolean","[object Number]":"number","[object String]":"string","[object Function]":"function","[object Array]":"array","[object Date]":"date","[object RegExp]":"regExp","[object Object]":"object"},a=function(e){return null==e?String(e):r[t.call(e)]||"object"},i=Array.isArray||function(e){return"array"===a(e)},s=function(e){if(!e||"object"!==a(e)||e.nodeType||function(e){return e&&"object"===o(e)&&"setInterval"in e}(e))return!1;if(e.constructor&&!n.call(e,"constructor")&&!n.call(e.constructor.prototype,"isPrototypeOf"))return!1;var t;for(t in e);return void 0===t||n.call(e,t)};return function t(n,r){for(var o in r){var a,c=n[o],u=r[o];n!==u&&(u&&(s(u)||(e=i(u)))?(e?(e=!1,a=c&&i(c)?c:[]):a=c&&s(c)?c:{},n[o]=t(a,u)):void 0!==u&&(n[o]=u))}return n}}.apply(t,[]))||(e.exports=r)},function(e,t){void 0===Date.now&&(Date.now=function(){return(new Date).valueOf()});var n,r,o=o||(n=[],{REVISION:"8",getAll:function(){return n},removeAll:function(){n=[]},add:function(e){n.push(e)},remove:function(e){var t=n.indexOf(e);-1!==t&&n.splice(t,1)},update:function(e){if(0===n.length)return!1;var t=0,r=n.length;for(e=void 0!==e?e:Date.now();t1?1:o);for(var m in n){var b=n[m],v=r[m];v instanceof Array?t[m]=u(v,i):t[m]=b+(v-b)*i}if(null!==d&&d.call(t,i),1==o){null!==p&&p.call(t);for(var g=0,y=l.length;g1?i(e[n],e[n-1],n-r):i(e[a],e[a+1>n?n:a+1],r-a)},Bezier:function(e,t){var n,r=0,a=e.length-1,i=Math.pow,s=o.Interpolation.Utils.Bernstein;for(n=0;n<=a;n++)r+=i(1-t,a-n)*i(t,n)*e[n]*s(a,n);return r},CatmullRom:function(e,t){var n=e.length-1,r=n*t,a=Math.floor(r),i=o.Interpolation.Utils.CatmullRom;return e[0]===e[n]?(t<0&&(a=Math.floor(r=n*(1+t))),i(e[(a-1+n)%n],e[a],e[(a+1)%n],e[(a+2)%n],r-a)):t<0?e[0]-(i(e[0],e[0],e[1],e[1],-r)-e[0]):t>1?e[n]-(i(e[n],e[n],e[n-1],e[n-1],r-n)-e[n]):i(e[a?a-1:0],e[a],e[n1;t--)n*=t;return r[e]=n}),CatmullRom:function(e,t,n,r,o){var a=.5*(n-e),i=.5*(r-t),s=o*o;return(2*t-2*n+a+i)*(o*s)+(-3*t+3*n-2*a-i)*s+a*o+t}}},e.exports=o},function(e,t,n){var r=n(0);r.OrbitControls=function(e,t){var n,o,a,i,s;this.object=e,this.domElement=void 0!==t?t:document,this.enabled=!0,this.target=new r.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.25,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!1,this.keyPanSpeed=7,this.autoRotate=!1,this.autoRotateSpeed=2,this.enableKeys=!0,this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40},this.mouseButtons={LEFT:r.MOUSE.LEFT,MIDDLE:r.MOUSE.MIDDLE,RIGHT:r.MOUSE.RIGHT},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this.getPolarAngle=function(){return m.phi},this.getAzimuthalAngle=function(){return m.theta},this.saveState=function(){c.target0.copy(c.target),c.position0.copy(c.object.position),c.zoom0=c.object.zoom},this.reset=function(){c.target.copy(c.target0),c.object.position.copy(c.position0),c.object.zoom=c.zoom0,c.object.updateProjectionMatrix(),c.dispatchEvent(u),c.update(),d=f.NONE},this.update=(n=new r.Vector3,o=(new r.Quaternion).setFromUnitVectors(e.up,new r.Vector3(0,1,0)),a=o.clone().inverse(),i=new r.Vector3,s=new r.Quaternion,function(){var e=c.object.position;return n.copy(e).sub(c.target),n.applyQuaternion(o),m.setFromVector3(n),c.autoRotate&&d===f.NONE&&T(2*Math.PI/60/60*c.autoRotateSpeed),m.theta+=b.theta,m.phi+=b.phi,m.theta=Math.max(c.minAzimuthAngle,Math.min(c.maxAzimuthAngle,m.theta)),m.phi=Math.max(c.minPolarAngle,Math.min(c.maxPolarAngle,m.phi)),m.makeSafe(),m.radius*=v,m.radius=Math.max(c.minDistance,Math.min(c.maxDistance,m.radius)),c.target.add(g),n.setFromSpherical(m),n.applyQuaternion(a),e.copy(c.target).add(n),c.object.lookAt(c.target),!0===c.enableDamping?(b.theta*=1-c.dampingFactor,b.phi*=1-c.dampingFactor,g.multiplyScalar(1-c.dampingFactor)):(b.set(0,0,0),g.set(0,0,0)),v=1,!!(y||i.distanceToSquared(c.object.position)>p||8*(1-s.dot(c.object.quaternion))>p)&&(c.dispatchEvent(u),i.copy(c.object.position),s.copy(c.object.quaternion),y=!1,!0)}),this.dispose=function(){c.domElement.removeEventListener("contextmenu",X,!1),c.domElement.removeEventListener("mousedown",z,!1),c.domElement.removeEventListener("wheel",_,!1),c.domElement.removeEventListener("touchstart",Y,!1),c.domElement.removeEventListener("touchend",G,!1),c.domElement.removeEventListener("touchmove",Z,!1),document.removeEventListener("mousemove",D,!1),document.removeEventListener("mouseup",H,!1),window.removeEventListener("keydown",B,!1)};var c=this,u={type:"change"},l={type:"start"},h={type:"end"},f={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY_PAN:4},d=f.NONE,p=1e-6,m=new r.Spherical,b=new r.Spherical,v=1,g=new r.Vector3,y=!1,w=new r.Vector2,x=new r.Vector2,O=new r.Vector2,M=new r.Vector2,E=new r.Vector2,j=new r.Vector2,P=new r.Vector2,I=new r.Vector2,L=new r.Vector2;function S(){return Math.pow(.95,c.zoomSpeed)}function T(e){b.theta-=e}function A(e){b.phi-=e}var C,k=(C=new r.Vector3,function(e,t){C.setFromMatrixColumn(t,0),C.multiplyScalar(-e),g.add(C)}),V=function(){var e=new r.Vector3;return function(t,n){!0===c.screenSpacePanning?e.setFromMatrixColumn(n,1):(e.setFromMatrixColumn(n,0),e.crossVectors(c.object.up,e)),e.multiplyScalar(t),g.add(e)}}(),F=function(){var e=new r.Vector3;return function(t,n){var r=c.domElement===document?c.domElement.body:c.domElement;if(c.object.isPerspectiveCamera){var o=c.object.position;e.copy(o).sub(c.target);var a=e.length();a*=Math.tan(c.object.fov/2*Math.PI/180),k(2*t*a/r.clientHeight,c.object.matrix),V(2*n*a/r.clientHeight,c.object.matrix)}else c.object.isOrthographicCamera?(k(t*(c.object.right-c.object.left)/c.object.zoom/r.clientWidth,c.object.matrix),V(n*(c.object.top-c.object.bottom)/c.object.zoom/r.clientHeight,c.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),c.enablePan=!1)}}();function R(e){c.object.isPerspectiveCamera?v/=e:c.object.isOrthographicCamera?(c.object.zoom=Math.max(c.minZoom,Math.min(c.maxZoom,c.object.zoom*e)),c.object.updateProjectionMatrix(),y=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),c.enableZoom=!1)}function N(e){c.object.isPerspectiveCamera?v*=e:c.object.isOrthographicCamera?(c.object.zoom=Math.max(c.minZoom,Math.min(c.maxZoom,c.object.zoom/e)),c.object.updateProjectionMatrix(),y=!0):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),c.enableZoom=!1)}function U(e){M.set(e.clientX,e.clientY)}function z(e){if(!1!==c.enabled){switch(e.preventDefault(),c.domElement.focus?c.domElement.focus():window.focus(),e.button){case c.mouseButtons.LEFT:if(e.ctrlKey||e.metaKey||e.shiftKey){if(!1===c.enablePan)return;U(e),d=f.PAN}else{if(!1===c.enableRotate)return;!function(e){w.set(e.clientX,e.clientY)}(e),d=f.ROTATE}break;case c.mouseButtons.MIDDLE:if(!1===c.enableZoom)return;!function(e){P.set(e.clientX,e.clientY)}(e),d=f.DOLLY;break;case c.mouseButtons.RIGHT:if(!1===c.enablePan)return;U(e),d=f.PAN}d!==f.NONE&&(document.addEventListener("mousemove",D,!1),document.addEventListener("mouseup",H,!1),c.dispatchEvent(l))}}function D(e){if(!1!==c.enabled)switch(e.preventDefault(),d){case f.ROTATE:if(!1===c.enableRotate)return;!function(e){x.set(e.clientX,e.clientY),O.subVectors(x,w).multiplyScalar(c.rotateSpeed);var t=c.domElement===document?c.domElement.body:c.domElement;T(2*Math.PI*O.x/t.clientHeight),A(2*Math.PI*O.y/t.clientHeight),w.copy(x),c.update()}(e);break;case f.DOLLY:if(!1===c.enableZoom)return;!function(e){I.set(e.clientX,e.clientY),L.subVectors(I,P),L.y>0?R(S()):L.y<0&&N(S()),P.copy(I),c.update()}(e);break;case f.PAN:if(!1===c.enablePan)return;!function(e){E.set(e.clientX,e.clientY),j.subVectors(E,M).multiplyScalar(c.panSpeed),F(j.x,j.y),M.copy(E),c.update()}(e)}}function H(e){!1!==c.enabled&&(document.removeEventListener("mousemove",D,!1),document.removeEventListener("mouseup",H,!1),c.dispatchEvent(h),d=f.NONE)}function _(e){!1===c.enabled||!1===c.enableZoom||d!==f.NONE&&d!==f.ROTATE||(e.preventDefault(),e.stopPropagation(),c.dispatchEvent(l),function(e){e.deltaY<0?N(S()):e.deltaY>0&&R(S()),c.update()}(e),c.dispatchEvent(h))}function B(e){!1!==c.enabled&&!1!==c.enableKeys&&!1!==c.enablePan&&function(e){var t=!1;switch(e.keyCode){case c.keys.UP:F(0,c.keyPanSpeed),t=!0;break;case c.keys.BOTTOM:F(0,-c.keyPanSpeed),t=!0;break;case c.keys.LEFT:F(c.keyPanSpeed,0),t=!0;break;case c.keys.RIGHT:F(-c.keyPanSpeed,0),t=!0}t&&(e.preventDefault(),c.update())}(e)}function Y(e){if(!1!==c.enabled){switch(e.preventDefault(),e.touches.length){case 1:if(!1===c.enableRotate)return;!function(e){w.set(e.touches[0].pageX,e.touches[0].pageY)}(e),d=f.TOUCH_ROTATE;break;case 2:if(!1===c.enableZoom&&!1===c.enablePan)return;!function(e){if(c.enableZoom){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);P.set(0,r)}if(c.enablePan){var o=.5*(e.touches[0].pageX+e.touches[1].pageX),a=.5*(e.touches[0].pageY+e.touches[1].pageY);M.set(o,a)}}(e),d=f.TOUCH_DOLLY_PAN;break;default:d=f.NONE}d!==f.NONE&&c.dispatchEvent(l)}}function Z(e){if(!1!==c.enabled)switch(e.preventDefault(),e.stopPropagation(),e.touches.length){case 1:if(!1===c.enableRotate)return;if(d!==f.TOUCH_ROTATE)return;!function(e){x.set(e.touches[0].pageX,e.touches[0].pageY),O.subVectors(x,w).multiplyScalar(c.rotateSpeed);var t=c.domElement===document?c.domElement.body:c.domElement;T(2*Math.PI*O.x/t.clientHeight),A(2*Math.PI*O.y/t.clientHeight),w.copy(x),c.update()}(e);break;case 2:if(!1===c.enableZoom&&!1===c.enablePan)return;if(d!==f.TOUCH_DOLLY_PAN)return;!function(e){if(c.enableZoom){var t=e.touches[0].pageX-e.touches[1].pageX,n=e.touches[0].pageY-e.touches[1].pageY,r=Math.sqrt(t*t+n*n);I.set(0,r),L.set(0,Math.pow(I.y/P.y,c.zoomSpeed)),R(L.y),P.copy(I)}if(c.enablePan){var o=.5*(e.touches[0].pageX+e.touches[1].pageX),a=.5*(e.touches[0].pageY+e.touches[1].pageY);E.set(o,a),j.subVectors(E,M).multiplyScalar(c.panSpeed),F(j.x,j.y),M.copy(E)}c.update()}(e);break;default:d=f.NONE}}function G(e){!1!==c.enabled&&(c.dispatchEvent(h),d=f.NONE)}function X(e){!1!==c.enabled&&e.preventDefault()}c.domElement.addEventListener("contextmenu",X,!1),c.domElement.addEventListener("mousedown",z,!1),c.domElement.addEventListener("wheel",_,!1),c.domElement.addEventListener("touchstart",Y,!1),c.domElement.addEventListener("touchend",G,!1),c.domElement.addEventListener("touchmove",Z,!1),window.addEventListener("keydown",B,!1),this.update()},r.OrbitControls.prototype=Object.create(r.EventDispatcher.prototype),r.OrbitControls.prototype.constructor=r.OrbitControls,Object.defineProperties(r.OrbitControls.prototype,{center:{get:function(){return console.warn("THREE.OrbitControls: .center has been renamed to .target"),this.target}},noZoom:{get:function(){return console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),!this.enableZoom},set:function(e){console.warn("THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead."),this.enableZoom=!e}},noRotate:{get:function(){return console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),!this.enableRotate},set:function(e){console.warn("THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead."),this.enableRotate=!e}},noPan:{get:function(){return console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),!this.enablePan},set:function(e){console.warn("THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead."),this.enablePan=!e}},noKeys:{get:function(){return console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),!this.enableKeys},set:function(e){console.warn("THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead."),this.enableKeys=!e}},staticMoving:{get:function(){return console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),!this.enableDamping},set:function(e){console.warn("THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead."),this.enableDamping=!e}},dynamicDampingFactor:{get:function(){return console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.dampingFactor},set:function(e){console.warn("THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead."),this.dampingFactor=e}}}),e.exports=t.default=r.OrbitControls},function(e,t,n){"use strict";n.r(t);var r=n(0);function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n=0?i.substring(0,s):i;u=u.toLowerCase();var l=s>=0?i.substring(s+1):"";if(l=l.trim(),"newmtl"===u)n={name:l},o[l]=n;else if(n)if("ka"===u||"kd"===u||"ks"===u){var h=l.split(r,3);n[u]=[parseFloat(h[0]),parseFloat(h[1]),parseFloat(h[2])]}else n[u]=l}}var f=new c(this.texturePath||this.path,this.materialOptions);return f.setCrossOrigin(this.crossOrigin),f.setManager(this.manager),f.setMaterials(o),f}}]),e}(),c=function(){function e(t,n){var a,i,s;o(this,e),s="Anonymous",(i="crossOrigin")in(a=this)?Object.defineProperty(a,i,{value:s,enumerable:!0,configurable:!0,writable:!0}):a[i]=s,this.baseUrl=t||"",this.options=n,this.materialsInfo={},this.materials={},this.materialsArray=[],this.nameLookup={},this.side=this.options&&this.options.side?this.options.side:r.FrontSide,this.wrap=this.options&&this.options.wrap?this.options.wrap:r.RepeatWrapping}return i(e,[{key:"setCrossOrigin",value:function(e){this.crossOrigin=e}},{key:"setManager",value:function(e){this.manager=e}},{key:"setMaterials",value:function(e){this.materialsInfo=this.convert(e),this.materials={},this.materialsArray=[],this.nameLookup={}}},{key:"convert",value:function(e){if(!this.options)return e;var t={};for(var n in e){var r=e[n],o={};for(var a in t[n]=o,r){var i=!0,s=r[a],c=a.toLowerCase();switch(c){case"kd":case"ka":case"ks":this.options&&this.options.normalizeRGB&&(s=[s[0]/255,s[1]/255,s[2]/255]),this.options&&this.options.ignoreZeroRGBs&&0===s[0]&&0===s[1]&&0===s[2]&&(i=!1)}i&&(o[c]=s)}}return t}},{key:"preload",value:function(){for(var e in this.materialsInfo)this.create(e)}},{key:"getIndex",value:function(e){return this.nameLookup[e]}},{key:"getAsArray",value:function(){var e=0;for(var t in this.materialsInfo)this.materialsArray[e]=this.create(t),this.nameLookup[t]=e,e++;return this.materialsArray}},{key:"create",value:function(e){return void 0===this.materials[e]&&this.createMaterial(e),this.materials[e]}},{key:"createMaterial",value:function(e){var t=this,n=this.materialsInfo[e],o={name:e,side:this.side};function a(e,n){if(!o[e]){var r,a,i=t.getTextureParams(n,o),s=t.loadTexture((r=t.baseUrl,"string"!=typeof(a=i.url)||""===a?"":/^https?:\/\//i.test(a)?a:r+a));s.repeat.copy(i.scale),s.offset.copy(i.offset),s.wrapS=t.wrap,s.wrapT=t.wrap,o[e]=s}}for(var i in n){var s,c=n[i];if(""!==c)switch(i.toLowerCase()){case"kd":o.color=(new r.Color).fromArray(c);break;case"ks":o.specular=(new r.Color).fromArray(c);break;case"map_kd":a("map",c);break;case"map_ks":a("specularMap",c);break;case"norm":a("normalMap",c);break;case"map_bump":case"bump":a("bumpMap",c);break;case"ns":o.shininess=parseFloat(c);break;case"d":(s=parseFloat(c))<1&&(o.opacity=s,o.transparent=!0);break;case"tr":(s=parseFloat(c))>0&&(o.opacity=1-s,o.transparent=!0)}}return this.materials[e]=new r.MeshPhongMaterial(o),this.materials[e]}},{key:"getTextureParams",value:function(e,t){var n,o={scale:new r.Vector2(1,1),offset:new r.Vector2(0,0)},a=e.split(/\s+/);return(n=a.indexOf("-bm"))>=0&&(t.bumpScale=parseFloat(a[n+1]),a.splice(n,2)),(n=a.indexOf("-s"))>=0&&(o.scale.set(parseFloat(a[n+1]),parseFloat(a[n+2])),a.splice(n,4)),(n=a.indexOf("-o"))>=0&&(o.offset.set(parseFloat(a[n+1]),parseFloat(a[n+2])),a.splice(n,4)),o.url=a.join(" ").trim(),o}},{key:"loadTexture",value:function(e,t,n,o,a){var i,s=r.Loader.Handlers.get(e),c=void 0!==this.manager?this.manager:r.DefaultLoadingManager;return null===s&&(s=new r.TextureLoader(c)),s.setCrossOrigin&&s.setCrossOrigin(this.crossOrigin),i=s.load(e,n,o,a),void 0!==t&&(i.mapping=t),i}}]),e}(),u=s;function l(e,t){for(var n=0;n0?t[t.length-1]:"",smooth:void 0!==n?n.smooth:this.smooth,groupStart:void 0!==n?n.groupEnd:0,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(e){var t={index:"number"==typeof e?e:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1};return t.clone=this.clone.bind(t),t}};return this.materials.push(r),r},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},finalize:function(e){var t=this.currentMaterial();if(t&&-1===t.groupEnd&&(t.groupEnd=this.geometry.vertices.length/3,t.groupCount=t.groupEnd-t.groupStart,t.inherited=!1),e&&this.materials.length>1)for(var n=this.materials.length-1;n>=0;n--)this.materials[n].groupCount<=0&&this.materials.splice(n,1);return e&&0===this.materials.length&&this.materials.push({name:"",smooth:this.smooth}),t}},n&&n.name&&"function"==typeof n.clone){var r=n.clone(0);r.inherited=!0,this.object.materials.push(r)}this.objects.push(this.object)},finalize:function(){this.object&&"function"==typeof this.object.finalize&&this.object.finalize(!0)},parseVertexIndex:function(e,t){var n=parseInt(e,10);return 3*(n>=0?n-1:n+t/3)},parseNormalIndex:function(e,t){var n=parseInt(e,10);return 3*(n>=0?n-1:n+t/3)},parseUVIndex:function(e,t){var n=parseInt(e,10);return 2*(n>=0?n-1:n+t/2)},addVertex:function(e,t,n){var r=this.vertices,o=this.object.geometry.vertices;o.push(r[e+0]),o.push(r[e+1]),o.push(r[e+2]),o.push(r[t+0]),o.push(r[t+1]),o.push(r[t+2]),o.push(r[n+0]),o.push(r[n+1]),o.push(r[n+2])},addVertexLine:function(e){var t=this.vertices,n=this.object.geometry.vertices;n.push(t[e+0]),n.push(t[e+1]),n.push(t[e+2])},addNormal:function(e,t,n){var r=this.normals,o=this.object.geometry.normals;o.push(r[e+0]),o.push(r[e+1]),o.push(r[e+2]),o.push(r[t+0]),o.push(r[t+1]),o.push(r[t+2]),o.push(r[n+0]),o.push(r[n+1]),o.push(r[n+2])},addUV:function(e,t,n){var r=this.uvs,o=this.object.geometry.uvs;o.push(r[e+0]),o.push(r[e+1]),o.push(r[t+0]),o.push(r[t+1]),o.push(r[n+0]),o.push(r[n+1])},addUVLine:function(e){var t=this.uvs,n=this.object.geometry.uvs;n.push(t[e+0]),n.push(t[e+1])},addFace:function(e,t,n,r,o,a,i,s,c,u,l,h){var f,d=this.vertices.length,p=this.parseVertexIndex(e,d),m=this.parseVertexIndex(t,d),b=this.parseVertexIndex(n,d);if(void 0===r?this.addVertex(p,m,b):(f=this.parseVertexIndex(r,d),this.addVertex(p,m,f),this.addVertex(m,b,f)),void 0!==o){var v=this.uvs.length;p=this.parseUVIndex(o,v),m=this.parseUVIndex(a,v),b=this.parseUVIndex(i,v),void 0===r?this.addUV(p,m,b):(f=this.parseUVIndex(s,v),this.addUV(p,m,f),this.addUV(m,b,f))}if(void 0!==c){var g=this.normals.length;p=this.parseNormalIndex(c,g),m=c===u?p:this.parseNormalIndex(u,g),b=c===l?p:this.parseNormalIndex(l,g),void 0===r?this.addNormal(p,m,b):(f=this.parseNormalIndex(h,g),this.addNormal(p,m,f),this.addNormal(m,b,f))}},addLineGeometry:function(e,t){this.object.geometry.type="Line";for(var n=this.vertices.length,r=this.uvs.length,o=0,a=e.length;o0?j.addAttribute("normal",new r.BufferAttribute(new Float32Array(O.normals),3)):j.computeVertexNormals(),O.uvs.length>0&&j.addAttribute("uv",new r.BufferAttribute(new Float32Array(O.uvs),2));for(var P,I=[],L=0,S=M.length;L1){for(L=0,S=M.length;L.5?200*Math.random()+300:500*-Math.random()-1e3},r[e]=o),t.position.set(o.x,o.y,o.z)}),I(j(n),"dealObjectInLoadCirculStart",function(e,t){if(e.name&&(/border$/.test(e.name)&&(e.visible=t),e instanceof r.Mesh)){var o=e.name.split("_")[0];n.initAreaPosition(o,e)}}),I(j(n),"changeModel4DataRefresh",function(e,t){var r=e.name;if(/pillar$/.test(r)){var o=r.split("_")[0],a=e.userData.val;if(o){var i=0;t&&0!==t&&(i=15*(a/t)),i<=0?e.visible=!1:(n.setHeightSlow(e,i),e.visible=!0)}else o=r?r.split("_")[0]:"",e.visible=!1}}),I(j(n),"setHeightSlow",function(e,t){n.setHeight(e,1);var r,o=1;r=setInterval(function(){if(o<300){var a=Math.floor(t*o/300);n.setHeight(e,a),o++}else 300===o?(o++,n.setHeight(e,t)):(clearInterval(r),delete n.intervals[r])},function(){}),n.intervals[r]=r}),I(j(n),"setHeight",function(e,t){(0===t||isNaN(t))&&(t=1);var n=e.geometry;n.verticesNeedUpdate=!0;var r=n.vertices,o=r[0].z,a=!0,i=!1,s=void 0;try{for(var c,u=r[Symbol.iterator]();!(a=(c=u.next()).done);a=!0){var l=c.value.z;if(o!=l){o=Math.min(l,o);break}}}catch(e){i=!0,s=e}finally{try{a||null==u.return||u.return()}finally{if(i)throw s}}var h=!0,f=!1,d=void 0;try{for(var p,m=r[Symbol.iterator]();!(h=(p=m.next()).done);h=!0){var b=p.value;b.z!==o&&(b.z=o+t)}}catch(e){f=!0,d=e}finally{try{h||null==m.return||m.return()}finally{if(f)throw d}}}),I(j(n),"initListener",function(e){n.container.addEventListener("mousemove",function(e){return n.setMeshHighLightStatus(e)},!1),n.container.addEventListener("click",function(t){return n.showDetail(t,e)},!1)}),I(j(n),"setMeshHighLightStatus",function(e){var t=j(n).config,r=n.objectFromMouse(e.pageX,e.pageY).object,o=t.texture;if(r){var a=n.current&&n.current.uuid;if(a===r.uuid)return;r.name.includes("border")||r.name.includes("line")||r.name.includes("pillar")||r.name.includes("texture")||r.name.includes("river")||(a?(n.current.material.color.set(o.top),n.old=n.current,n.current=r,r.material.color.set(o.select)):(n.current=r,r.material.color.set(o.select)))}}),I(j(n),"showDetail",function(e,t){var r=j(n).config;e.preventDefault();var o=n.objectFromMouse(e.pageX,e.pageY).object;if(o&&r.showDetail){var a=r.showDetail(o);n.meshMove(!!a,t)}}),I(j(n),"objectFromMouse",function(e,t){var o=j(n).container,a=n.renderer.domElement,i=a.offsetLeft,s=t-a.offsetTop,c=(e-i)/o.offsetWidth*2-1,u=-s/o.offsetHeight*2+1,l=new r.Vector2(c,u),h=new r.Raycaster;h.setFromCamera(l,n.camera);var f=h.intersectObjects(n.root.children,!0);if(f.length>0){var d=f[0];if(d)return d}return{object:null,point:null,face:null}}),I(j(n),"getOffset",function(e,t){return t||((t={}).top=0,t.left=0),e==document.body?t:(t.top+=e.offsetTop,t.left+=e.offsetLeft,n.getOffset(e.parentNode,t))}),I(j(n),"meshMove",function(e,t){var r=j(n),o=r.camera,a=r.renderer,i=r.container,s=r.getMeshWidth,c=r._getCoordinate2InScene,u=r.config,l={x:0,y:0,z:0};Math.PI;if(e){({x:-Math.PI/4,y:Math.PI/180*10,z:0});var h=i.clientWidth/550;n.withdrawPosition||(n.withdrawPosition=c({x:30*h,y:a.domElement.offsetHeight/2},o,a.domElement),n.withdrawPosition.x+=s(t).length/4,n.tweenInOut(o.position,{z:80},1e3)),l=n.withdrawPosition,n.tweenInOut(t.position,l,1e3)}else n.tweenInOut(o.position,u.cameraPosition,1e3),n.tweenInOut(t.position,l,1e3),n.withdrawPosition=null}),I(j(n),"getMeshWidth",function(e){var t=new r.BoxHelper(e,16711680),n=(new r.Box3).setFromObject(e);return t.update(),{length:n.max.x-n.min.x,width:n.max.y-n.min.y,height:n.max.z-n.min.z}}),I(j(n),"handleModelShift",function(e){var t=j(n),r=t._startPositions,o=t.config;if(r[e.name.split("_")[0]])return o.meshShiftTime&&o.meshShiftTime()}),I(j(n),"childMapping",function(e){var t=j(n).config;t.childMapping&&t.childMapping(e)}),I(j(n),"_getCoordinate2InScene",function(e,t,o){t.updateMatrixWorld(!0);var a=n.getVector2InScene(e,o),i=new r.Vector3(a.x,a.y,0);i.unproject(t),i.sub(t.position),i.normalize();var s=new r.Raycaster(t.position,i),c=s.ray.origin,u=s.ray.direction,l=new r.Vector3;return l.setX(c.x-(c.z-0)*u.x/u.z),l.setY(c.y-(c.z-0)*u.y/u.z),l}),I(j(n),"getVector2InScene",function(e,t){var n=new r.Vector2;return n.x=e.x/t.offsetWidth*2-1,n.y=-e.y/t.offsetHeight*2+1,n}),I(j(n),"tweenInOut",function(e,t,n,r,o){var a=new w.a.Tween(e).to(t,n).easing(w.a.Easing.Exponential.InOut);return r&&a.onComplete(r),o&&a.onStart(o),a.start()}),I(j(n),"loadMaterials",function(e,t,n,r){t.load(e[0],function(o){n?n.materialsInfo=[].concat(M(n.materialsInfo),M(o.materialsInfo)):n=o,e.shift(),0!=e.length?loadMaterials(e,t,n,r):r(n)})}),I(j(n),"loadObjects",function(e,t,n,r){t.load(e[0],function(o){n?n.children=o.children.concat(n.children):n=d()({},o),e.shift(),0!=e.length?loadObjects(e,t,n,r):r(n)})}),I(j(n),"initParams",function(){var e=j(n).config,t=e.cameraPosition,o=e.clientWidth,a=e.clientHeight,i=t.x,s=t.y,c=t.z;n.container=e.container;var u=o/a;n.camera=new r.PerspectiveCamera(45,u,1,1e4),n.camera.position.set(i,s,c),n.renderer=new r.WebGLRenderer({alpha:!0,antialias:!0}),n.resize(o,a-4),n.renderer.shadowMap.enabled=!0,n.renderer.shadowMap.type=r.PCFSoftShadowMap,n.container.appendChild(n.renderer.domElement),n.scene=new r.Scene,n.scene.add(n.camera);var l=new g.a(n.camera,n.renderer.domElement);if(Object.assign(l,e.controls),n.controls=l,e.light){var h=e.light(),f=!0,d=!1,p=void 0;try{for(var m,b=h[Symbol.iterator]();!(f=(m=b.next()).done);f=!0){var v=m.value;n.scene.add(v)}}catch(e){d=!0,p=e}finally{try{f||null==b.return||b.return()}finally{if(d)throw p}}}e.clearColor&&n.renderer.setClearColor(e.clearColor,e.clearOpacity)}),I(j(n),"afterMovementMesh",function(){var e=n.config.afterRotation;!function t(){requestAnimationFrame(t),n.root.rotation.x>=e&&(n.root.rotation.x-=n.config.rotationSpeed),n.renderer.render(n.scene,n.camera)}()}),I(j(n),"handleMesh",function(e){var t=j(n),o=t.config,a=t._startTweenCount;e.traverse(function(t){if(!(t instanceof r.Group)){t instanceof r.Mesh?t.geometry=(new r.Geometry).fromBufferGeometry(t.geometry):t instanceof r.Line&&console.log(t.name),"texture"==t.name&&(n.modelTexture=t),n.dealObjectInLoadCirculStart(t,o.borderVisible),n.childMapping(t,o);var i=n.handleModelShift(t,o);n.tweenInOut(t.position,{x:0,y:0,z:0},i,function(){if(0===--a){n.renderPillar(e),n.afterMovementMesh();var t=!0,r=!1,o=void 0;try{for(var i,s=e.children[Symbol.iterator]();!(t=(i=s.next()).done);t=!0){var c=i.value;n.config.beforeAnimate&&n.config.beforeAnimate(c,!0)}}catch(e){r=!0,o=e}finally{try{t||null==s.return||s.return()}finally{if(r)throw o}}n.initListener(e)}}),a++}})}),I(j(n),"showTexture",function(e,t){t&&(new r.TextureLoader).load(t,function(t){n.modelTexture.material.map=t,n.modelTexture.material=Object.assign(n.modelTexture.material,e),n.modelTexture.visible=!n.modelTexture.visible})}),I(j(n),"getObject",function(){return n.dataObject}),I(j(n),"refreshPillar",function(e){var t=j(n).dataObject;t=e,n.renderPillar(t)}),I(j(n),"flush",function(){!function e(){requestAnimationFrame(e),w.a.update(),n.controls.update(),n.renderer.render(n.scene,n.camera)}()}),I(j(n),"renderPillar",function(e){var t=j(n).config;e.traverse(function(e){n.changeModel4DataRefresh(e,t.divisor)})}),I(j(n),"resize",function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document.documentElement.clientWidth,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:document.documentElement.clientHeight-4;n.renderer.setSize(e,t)}),I(j(n),"init",function(){var e=j(n).config,t=e.data,o=t.materials,a=t.objects;e.beforeInit&&e.beforeInit(e),new b(e).load(o,a,function(t){e.data.load(t,function(e){n.dataObject=e,n.handleMesh(e),n.root=(new r.Object3D).add(e),n.scene.add(n.root),n.flush()})})}),n.config=d()(n.config,e),n.initParams(n.config),n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&P(e,t)}(t,x),t}();t.default=L}])}); //# sourceMappingURL=Trunk.js.map \ No newline at end of file diff --git a/dist/Trunk.js.map b/dist/Trunk.js.map index d2b0bf9..b328ba7 100644 --- a/dist/Trunk.js.map +++ b/dist/Trunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///external \"three\"","webpack:///./src/util/DeepClone.js","webpack:///./src/index.js","webpack:///./src/core/index.js","webpack:///./src/core/Loader.js","webpack:///./src/loader/MTLLoader.js","webpack:///./src/loader/OBJLoader.js","webpack:///./node_modules/_three-orbitcontrols@2.1.2@three-orbitcontrols/OrbitControls.js","webpack:///./node_modules/_tween@0.9.0@tween/tween.js"],"names":["root","factory","exports","module","require","define","amd","a","i","window","__WEBPACK_EXTERNAL_MODULE__0__","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","undefined","__WEBPACK_AMD_DEFINE_RESULT__","copyIsArray","toString","hasOwn","class2type","[object Boolean]","[object Number]","[object String]","[object Function]","[object Array]","[object Date]","[object RegExp]","[object Object]","type","obj","String","isArray","Array","isPlainObject","nodeType","_typeof","isWindow","constructor","extend","target","options","clone","src","copy","apply","Trunk","THREE","config","clearOpacity","meshShiftTime","Math","random","beforeInit","borderVisible","divisor","cameraPosition","x","y","z","afterRotation","PI","rotationSpeed","texture","line","pillar","top","bottom","border","select","light","lights","push","HemisphereLight","controls","maxPolarAngle","minPolarAngle","clientWidth","document","documentElement","body","clientHeight","_startPositions","_startTweenCount","intervals","old","current","withdrawPosition","dataObject","container","modelTexture","camera","renderer","scene","initAreaPosition","area","child","_this","before_animate","position","set","dealObjectInLoadCirculStart","visible","test","Mesh","split","changeModel4DataRefresh","dmName","data","userData","val","height","setHeightSlow","setHeight","sh","setInterval","h","floor","clearInterval","isNaN","geometry","verticesNeedUpdate","vertices","minz","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","iterator","next","done","min","err","return","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","vertice","initListener","addEventListener","e","setMeshHighLightStatus","showDetail","event","objectFromMouse","pageX","pageY","uuid","includes","material","color","preventDefault","flag","meshMove","pagex","pagey","_renderer$domElement","domElement","offsetLeft","elty","offsetTop","vpx","offsetWidth","vpy","offsetHeight","vector","Vector2","raycaster","Raycaster","setFromCamera","intersects","intersectObjects","children","length","intersect","point","face","getOffset","node","offset","left","parentNode","withdraw","getMeshWidth","_getCoordinate2InScene","gap","tweenInOut","boxHelper","BoxHelper","box","Box3","setFromObject","update","max","width","handleModelShift","childMapping","updateMatrixWorld","b","getVector2InScene","j","Vector3","unproject","sub","normalize","f","ray","origin","g","direction","setX","setY","tween","TWEEN","Tween","to","easing","Easing","Exponential","InOut","onComplete","onStart","start","loadMaterials","paths","loader","callback","load","materials","materialsInfo","concat","_toConsumableArray","shift","loadObjects","objects","_DeepClone2","default","initParams","cameraAspect","PerspectiveCamera","WebGLRenderer","alpha","antialias","resize","shadowMap","enabled","PCFSoftShadowMap","appendChild","Scene","add","OrbitControls","assign","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","clearColor","setClearColor","afterMovementMesh","rotateAnimate","requestAnimationFrame","rotation","render","handleMesh","traverse","Group","Geometry","fromBufferGeometry","Line","console","log","time","renderPillar","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","showTexture","url","TextureLoader","map","getObject","refreshPillar","flush","arguments","setSize","init","_config$data","Loader","newObject","Object3D","_classCallCheck","this","_initialiseProps","mtlUrl","objUrl","setMaterial","OBJLoader","setMaterials","mtlLoader","objectLoader","MTLLoader","manager","DefaultLoadingManager","onLoad","onProgress","onError","scope","FileLoader","setPath","path","text","parse","texturePath","warn","setTexturePath","crossOrigin","materialOptions","lines","info","delimiterPattern","trim","charAt","pos","indexOf","substring","toLowerCase","ss","parseFloat","materialCreator","MaterialCreator","setCrossOrigin","setManager","baseUrl","materialsArray","nameLookup","side","FrontSide","wrap","RepeatWrapping","convert","converted","mn","mat","covmat","prop","save","lprop","normalizeRGB","ignoreZeroRGBs","materialName","index","createMaterial","params","setMapForType","mapType","texParams","getTextureParams","loadTexture","resolveURL","repeat","scale","wrapS","wrapT","Color","fromArray","specular","shininess","opacity","transparent","MeshPhongMaterial","matParams","items","bumpScale","splice","join","mapping","Handlers","regexp","vertexPattern","normalPattern","uvPattern","faceVertex","faceVertexUv","faceVertexUvNormal","faceVertexNormal","objectPattern","smoothingPattern","materialLibraryPattern","materialUsePattern","state","normals","uvs","materialLibraries","startObject","fromDeclaration","previousMaterial","currentMaterial","finalize","smooth","startMaterial","libraries","previous","inherited","groupCount","mtllib","groupStart","groupEnd","cloned","end","lastMultiMaterial","mi","declared","parseVertexIndex","len","parseInt","parseNormalIndex","parseUVIndex","addVertex","dst","addVertexLine","addNormal","addUV","addUVLine","addFace","ua","ub","uc","ud","na","nb","nc","nd","id","vLen","ia","ib","ic","uvLen","nLen","addLineGeometry","vi","uvi","createParserState","replace","lineFirstChar","lineSecondChar","result","trimLeft","exec","Error","lineParts","lineVertices","lineUVs","li","llen","parts","substr","isLine","buffergeometry","BufferGeometry","addAttribute","BufferAttribute","Float32Array","computeVertexNormals","mesh","createdMaterials","miLen","sourceMaterial","LineBasicMaterial","materialLine","flatShading","SmoothShading","FlatShading","addGroup","LineSegments","timeEnd","minDistance","maxDistance","Infinity","minZoom","maxZoom","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","panSpeed","screenSpacePanning","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","MOUSE","ZOOM","MIDDLE","PAN","target0","position0","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","reset","updateProjectionMatrix","dispatchEvent","changeEvent","STATE","NONE","quat","Quaternion","setFromUnitVectors","up","quatInverse","inverse","lastPosition","lastQuaternion","applyQuaternion","setFromVector3","rotateLeft","sphericalDelta","makeSafe","radius","panOffset","setFromSpherical","lookAt","multiplyScalar","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","startEvent","endEvent","ROTATE","DOLLY","TOUCH_ROTATE","TOUCH_DOLLY_PAN","Spherical","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","pow","angle","rotateUp","panLeft","v","distance","objectMatrix","setFromMatrixColumn","panUp","crossVectors","pan","deltaX","deltaY","element","isPerspectiveCamera","targetDistance","tan","fov","matrix","isOrthographicCamera","right","dollyIn","dollyScale","dollyOut","button","clientX","clientY","handleMouseDownRotate","handleMouseDownDolly","handleMouseDownPan","subVectors","handleMouseMoveRotate","handleMouseMoveDolly","handleMouseMovePan","stopPropagation","handleMouseWheel","keyCode","handleKeyDown","touches","handleTouchStartRotate","dx","dy","sqrt","handleTouchStartDollyPan","handleTouchMoveRotate","handleTouchMoveDollyPan","EventDispatcher","defineProperties","center","noZoom","noRotate","noPan","noKeys","staticMoving","dynamicDampingFactor","Date","now","valueOf","_tweens","REVISION","getAll","removeAll","remove","numTweens","_object","_valuesStart","_valuesEnd","_duration","_delayTime","_startTime","_easingFunction","Linear","None","_interpolationFunction","Interpolation","_chainedTweens","_onStartCallback","_onStartCallbackFired","_onUpdateCallback","_onCompleteCallback","properties","duration","stop","delay","amount","interpolation","chain","onUpdate","elapsed","numChainedTweens","k","Quadratic","In","Out","Cubic","Quartic","Quintic","Sinusoidal","cos","sin","Circular","Elastic","asin","Back","Bounce","fn","Utils","Bezier","pw","bn","Bernstein","CatmullRom","p0","p1","fc","Factorial","p2","p3","v0","v1","t2"],"mappings":"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","file":"Trunk.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"three\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"three\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"three\")) : factory(root[\"three\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__0__;","define([], () => {\r\n\tvar copyIsArray,\r\n\t\ttoString = Object.prototype.toString,\r\n\t\thasOwn = Object.prototype.hasOwnProperty;\r\n\r\n\tvar class2type = {\r\n\t\t\t'[object Boolean]': 'boolean',\r\n\t\t\t'[object Number]': 'number',\r\n\t\t\t'[object String]': 'string',\r\n\t\t\t'[object Function]': 'function',\r\n\t\t\t'[object Array]': 'array',\r\n\t\t\t'[object Date]': 'date',\r\n\t\t\t'[object RegExp]': 'regExp',\r\n\t\t\t'[object Object]': 'object'\r\n\t\t},\r\n\r\n\t\ttype = function (obj) {\r\n\t\t\treturn obj == null\r\n\t\t\t\t? String(obj)\r\n\t\t\t\t: class2type[toString.call(obj)] || 'object';\r\n\t\t},\r\n\r\n\t\tisWindow = function (obj) {\r\n\t\t\treturn obj && typeof obj === 'object' && 'setInterval' in obj;\r\n\t\t},\r\n\r\n\t\tisArray = Array.isArray || function (obj) {\r\n\t\t\treturn type(obj) === 'array';\r\n\t\t},\r\n\r\n\t\tisPlainObject = function (obj) {\r\n\t\t\tif (!obj || type(obj) !== 'object' || obj.nodeType || isWindow(obj)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (obj.constructor && !hasOwn.call(obj, 'constructor') && !hasOwn.call(obj.constructor.prototype, 'isPrototypeOf')) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tvar key;\r\n\r\n\t\t\tfor (key in obj) {}\r\n\r\n\t\t\treturn key === undefined || hasOwn.call(obj, key);\r\n\t\t},\r\n\r\n\t\textend = function (target, options) {\r\n\t\t\tfor (var name in options) {\r\n\t\t\t\tvar src = target[name];\r\n\t\t\t\tvar copy = options[name];\r\n\r\n\t\t\t\tif (target === copy) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\r\n\t\t\t\t\tvar clone;\r\n\r\n\t\t\t\t\tif (copyIsArray) {\r\n\t\t\t\t\t\tcopyIsArray = false;\r\n\t\t\t\t\t\tclone = src && isArray(src)\r\n\t\t\t\t\t\t\t? src\r\n\t\t\t\t\t\t\t: [];\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclone = src && isPlainObject(src)\r\n\t\t\t\t\t\t\t? src\r\n\t\t\t\t\t\t\t: {};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttarget[name] = extend(clone, copy);\r\n\t\t\t\t} else if (copy !== undefined) {\r\n\t\t\t\t\ttarget[name] = copy;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn target;\r\n\t\t};\r\n\r\n\treturn extend;\r\n});","/*\r\n * @Author: zy9@github.com/zy410419243\r\n * @Date: 2018-04-24 15:34:46\r\n * @Last Modified by: zy9\r\n * @Last Modified time: 2018-07-13 08:55:29\r\n */\r\nimport Trunk from './core';\r\n\r\nexport default Trunk;","/*\r\n * @Author: zy9@github.com/zy410419243\r\n * @Date: 2018-04-24 15:33:50\r\n * @Last Modified by: zy9\r\n * @Last Modified time: 2018-07-23 22:16:42\r\n */\r\nimport * as THREE from 'three';\r\nimport Loader from './Loader';\r\nimport OrbitControls from 'three-orbitcontrols';\r\nimport TWEEN from 'tween';\r\nimport extend from '../util/DeepClone';\r\n\r\nexport default class Trunk {\r\n\tconstructor (config) {\r\n\t\tthis.config = extend(this.config, config);\r\n\r\n\t\tthis.initParams(this.config);\r\n\t}\r\n\t// 默认配置\r\n\tconfig = {\r\n\t\t// clearColor: 0x4584b4, // 画布颜色\r\n\t\tclearOpacity: 0.2, // 画布透明度\r\n\t\tmeshShiftTime: () => Math.random() * 1000 * 5 + 1000, // 板块移动时间\r\n\t\tbeforeInit: null, // 初始化前的钩子\r\n\t\tborderVisible: true, // 边界是否显示\r\n\t\tdivisor: 100, // 控制柱子高度,该数越大,柱子越矮\r\n\t\tcameraPosition: { x: 0, y: 0, z: 65 }, // 相机position中的z\r\n\t\tafterRotation: -Math.PI / 4, // 开场动画后视角旋转角度\r\n\t\trotationSpeed: 0.02, // 开场动画后视角旋转速度\r\n\t\ttexture: {\r\n\t\t\tline: '#055290', // 内部乡镇边界贴图\r\n\t\t\tpillar: '#2377e8', // 柱子贴图\r\n\t\t\ttop: '#07205b', // 上表面贴图\r\n\t\t\tbottom: '#000', // 底部贴图\r\n\t\t\tborder: '#2a8fdf', // 边缘边界贴图\r\n\t\t\tselect: '#071C5B', // 鼠标移入时贴图\r\n\t\t},\r\n\t\tlight: () => { // x轴正方向是屏幕右边,y轴正方向是屏幕里边,z轴正方向是屏幕上边\r\n\t\t\tlet lights = [];\r\n\r\n\t\t\tlights.push(new THREE.HemisphereLight(16777215, 16777215, 0.3));\r\n\r\n\t\t\treturn lights;\r\n\t\t},\r\n\t\tcontrols: {\r\n\t\t\tmaxPolarAngle: Math.PI * 0.75,\r\n\t\t\tminPolarAngle: Math.PI * 0.25,\r\n\t\t},\r\n\t\tclientWidth: document.documentElement.clientWidth || document.body.clientWidth,\r\n\t\tclientHeight: document.documentElement.clientHeight || document.body.clientHeight\r\n\t};\r\n\r\n\t_startPositions = {};\r\n\t_startTweenCount = 0;\r\n\r\n\t// 柱子高度变化的定时器\r\n\tintervals = {};\r\n\r\n\t// 鼠标移入板块高亮\r\n\told = {};\r\n\tcurrent = {};\r\n\r\n\t/**\r\n\t * 渲染模型容器,相当于对div进行appendChild\r\n * 这里具体干的是往scene里加Object3D,然后所有模型都放在Object3D对象里\r\n * 原因是scene上不能直接渲染Mesh啊Group之类的对象,需要这么个载体\r\n\t*/\r\n\troot = {};\r\n\r\n\t// 标识模型是否移动过\r\n\twithdrawPosition = false;\r\n\r\n\t// 模型数据\r\n\tdataObject = {};\r\n\r\n\t// 多次用到容器节点,存到全局变量里方便调用\r\n\tcontainer = {};\r\n\r\n\t// 整个模块的贴图,用作等值面\r\n\tmodelTexture = {};\r\n\r\n\t// 初始化three渲染三要素\r\n\tcamera = null;\r\n\trenderer = null;\r\n\tscene = null;\r\n\r\n\t// 轨道控制\r\n\tcontrols = null;\r\n\r\n\t// 初始化开场动画前板块位置\r\n\tinitAreaPosition = (area, child) => {\r\n\t\tlet { _startPositions } = this;\r\n\r\n\t\tlet p = _startPositions[area];\r\n\r\n\t\tthis.config.before_animate && this.config.before_animate(child);\r\n\r\n\t\tif (!p) {\r\n\t\t\tp = {\r\n\t\t\t\tx: Math.random() * 1000 - 500,\r\n\t\t\t\ty: Math.random() * 1000 - 500,\r\n\t\t\t\tz: Math.random() > 0.5 ? (Math.random() * 200 + 300) : (-Math.random() * 500 - 1000)\r\n\t\t\t};\r\n\t\t\t_startPositions[area] = p;\r\n\t\t}\r\n\t\tchild.position.set(p.x, p.y, p.z);\r\n\t}\r\n\r\n\t// 处理开场动画参数\r\n\tdealObjectInLoadCirculStart = (child, visible) => {\r\n\t\tif (!child.name) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// 设置上下边界是否显示\r\n\t\tif (/border$/.test(child.name)) {\r\n\t\t\tchild.visible = visible;\r\n\t\t}\r\n\r\n\t\tif (child instanceof THREE.Mesh) {\r\n\t\t\tlet area = child.name.split('_')[0];\r\n\r\n\t\t\tthis.initAreaPosition(area, child);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n * 处理柱子渲染\r\n * @param child 当前遍历模型对象\r\n * @param divisor 计算柱子高度,柱子高度 = 当前模型中数据 / divisor * 15,也就是说divisor越小,柱子越高\r\n */\r\n\tchangeModel4DataRefresh = (child, divisor) => {\r\n\t\tlet name = child.name;\r\n\r\n\t\tif (/pillar$/.test(name)) {\r\n\t\t\tlet dmName = name.split('_')[0];\r\n\t\t\tlet data = child.userData.val;\r\n\r\n\t\t\tif (dmName) {\r\n\t\t\t\tlet height = 0;\r\n\t\t\t\tlet proportion = 0;\r\n\r\n\t\t\t\tif (divisor && divisor !== 0) {\r\n\t\t\t\t\tproportion = data / divisor;\r\n\t\t\t\t\theight = proportion * 15;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 不支持负数,但万一传了负数,暂按0处理\r\n\t\t\t\tif (height <= 0) {\r\n\t\t\t\t\tchild.visible = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.setHeightSlow(child, height);\r\n\t\t\t\t\tchild.visible = true;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tdmName = name ? name.split('_')[0] : '';\r\n\t\t\t\t// TODO 与上面height <= 0重复,代码需精简\r\n\t\t\t\tchild.visible = false;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n * 设置柱子高度(缓慢变高,高度从1开始变到指定高度)\r\n * 这个方法不要加太多逻辑,这里我试着在循环里console.log,渣电脑甚至能掉帧\r\n * @param child\r\n * @param height\r\n * @private\r\n */\r\n\tsetHeightSlow = (child, height) => {\r\n\t\tthis.setHeight(child, 1);\r\n\t\tlet i = 1;\r\n\t\tlet sh;\r\n\t\t// 柱子高度上升速度\r\n\t\tlet times = 300;\r\n\r\n\t\tconst show = () => {\r\n\t\t\tif (i < times) {\r\n\t\t\t\tlet h = Math.floor(height * i / times);\r\n\r\n\t\t\t\tthis.setHeight(child, h);\r\n\t\t\t\ti++;\r\n\t\t\t} else if (i === times) {\r\n\t\t\t\ti++;\r\n\t\t\t\tthis.setHeight(child, height);\r\n\t\t\t} else {\r\n\t\t\t\tclearInterval(sh);\r\n\t\t\t\tdelete this.intervals[sh];\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tsh = setInterval(show, () => { });\r\n\t\tthis.intervals[sh] = sh;\r\n\t};\r\n\r\n\t/**\r\n * 设置柱子高度\r\n * 这个方法不要加太多逻辑,这里我试着在循环里console.log,渣电脑甚至能掉帧\r\n * @param child\r\n * @param height\r\n * @private\r\n */\r\n\tsetHeight = (child, height) => {\r\n\t\tif (height === 0 || isNaN(height)) {\r\n\t\t\t// 不能高度设置为0,否则下一次设置的时候会出问题,\r\n\t\t\theight = 1;\r\n\t\t}\r\n\t\tlet geometry = child.geometry;\r\n\r\n\t\tgeometry.verticesNeedUpdate = true;\r\n\r\n\t\tlet vertices = geometry.vertices;\r\n\r\n \t/*\r\n * 此处应该当有掌声,当然可能是写的人的特有感慨\r\n * 这里区分了顶面和底面的点,前提是给的模型数据里的柱子高度不能为0\r\n\t\t*\r\n * 下面这段代码看上去简单,但领悟到顶面和底面不能在同一个面上,否则就区分不出的痛整整花了一天时间\r\n\t\t*\r\n\t\t*\t这里先区分z,不是特别花俏的柱子一般只有六个面八个点两种z\r\n * 然后底面的z不变,顶面的z加高度\r\n */\r\n\t\tlet minz = vertices[0].z;\r\n\r\n\t\tfor (let vertice of vertices) {\r\n\t\t\tlet z = vertice.z;\r\n\r\n\t\t\tif (minz != z) {\r\n\t\t\t\tminz = Math.min(z, minz);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (let vertice of vertices) {\r\n\t\t\tif (vertice.z !== minz) {\r\n\t\t\t\tvertice.z = minz + height;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n * 事件绑定\r\n * @private\r\n * @param config 模型配置文件\r\n * @param object .obj文件,所有模型数据。这里得注意跟child的区别,变量名写惯了都是object..\r\n */\r\n\tinitListener = object => {\r\n\t\tthis.container.addEventListener('mousemove', e => this.setMeshHighLightStatus(e), false);\r\n\r\n\t\tthis.container.addEventListener('click', e => this.showDetail(e, object), false);\r\n\t};\r\n\r\n\t/*\r\n 改变板块的高亮状态\r\n\r\n 鼠标移上去,如果是板块,那改变该板块材质中的颜色\r\n 移开后恢复原来的材质\r\n 得注意边界线也是种模型,需要额外判断\r\n */\r\n\tsetMeshHighLightStatus = event => {\r\n\t\tconst { config } = this;\r\n\t\tlet intersected = this.objectFromMouse(event.pageX, event.pageY);\r\n\t\tlet child = intersected.object;\r\n\r\n\t\tlet texture = config.texture;\r\n\r\n\t\t// 设置/移除高亮\r\n\t\tif (child) {\r\n\t\t\tlet uuid = this.current && this.current.uuid;\r\n\r\n\t\t\tif (uuid === child.uuid) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (!child.name.includes('border') && !child.name.includes('line') && !child.name.includes('pillar') && !child.name.includes('texture') && !child.name.includes('river')) {\r\n\t\t\t\tif (!uuid) { // 第一次\r\n\t\t\t\t\tthis.current = child;\r\n\r\n\t\t\t\t\t// 鼠标移入设置移入的颜色\r\n\t\t\t\t\tchild.material.color.set(texture.select);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 鼠标移开设置原先表面的颜色\r\n\t\t\t\t\tthis.current.material.color.set(texture.top);\r\n\r\n\t\t\t\t\tthis.old = this.current;\r\n\t\t\t\t\tthis.current = child;\r\n\r\n\t\t\t\t\t// 鼠标移入设置移入的颜色\r\n\t\t\t\t\tchild.material.color.set(texture.select);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t}\r\n\r\n\t// 点击板块,板块左移,右边空出来的地方显示表格\r\n\tshowDetail = (event, object) => {\r\n\t\tconst { config } = this;\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tlet intersected = this.objectFromMouse(event.pageX, event.pageY);\r\n\t\tlet child = intersected.object;\r\n\r\n\t\tif (child) {\r\n\t\t\t// 右侧表格数据的显示\r\n\t\t\tif (config.showDetail) {\r\n\t\t\t\tlet flag = config.showDetail(child);\r\n\r\n\t\t\t\tthis.meshMove(!!flag, object);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// 获得鼠标位置的板块模型对象\r\n\tobjectFromMouse = (pagex, pagey) => {\r\n\t\tlet { container } = this;\r\n\t\tconst { offsetLeft, offsetTop } = this.renderer.domElement;\r\n\r\n\t\tlet eltx = pagex - offsetLeft;\r\n\t\tlet elty = pagey - offsetTop;\r\n\r\n\t\tlet vpx = (eltx / container.offsetWidth) * 2 - 1;\r\n\t\tlet vpy = -(elty / container.offsetHeight) * 2 + 1;\r\n\t\tlet vector = new THREE.Vector2(vpx, vpy);\r\n\t\tlet raycaster = new THREE.Raycaster();\r\n\r\n\t\traycaster.setFromCamera(vector, this.camera);\r\n\r\n\t\tlet intersects = raycaster.intersectObjects(this.root.children, true);\r\n\r\n\t\tif (intersects.length > 0) {\r\n\t\t\tlet intersect = intersects[0];\r\n\r\n\t\t\tif (intersect) {\r\n\t\t\t\treturn intersect;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn { object: null, point: null, face: null };\r\n\t}\r\n\r\n\t// 获得元素相对整个页面的偏移量\r\n\tgetOffset = (node, offset) => {\r\n\t\tif (!offset) {\r\n\t\t\toffset = {};\r\n\t\t\toffset.top = 0;\r\n\t\t\toffset.left = 0;\r\n\t\t}\r\n\r\n\t\tif (node == document.body) { // 当该节点为body节点时,结束递归\r\n\t\t\treturn offset;\r\n\t\t}\r\n\r\n\t\toffset.top += node.offsetTop;\r\n\t\toffset.left += node.offsetLeft;\r\n\r\n\t\treturn this.getOffset(node.parentNode, offset); // 向上累加offset里的值\r\n\t}\r\n\r\n\t/**\r\n * 整个模型漂移\r\n * 如果withdraw为true,表示需要把模型移开,即从中心点向左移\r\n *\r\n * 如果withdraw为false,表示需要还原至中心\r\n * @param withdraw 是否移开\r\n * @private\r\n */\r\n\tmeshMove = (withdraw, object) => {\r\n\t\tlet { camera, renderer, container, getMeshWidth, _getCoordinate2InScene, config } = this;\r\n\t\tlet point = { x: 0, y: 0, z: 0 };\r\n\t\tlet rotation = { x: -Math.PI / 4, y: 0, z: 0 };\r\n\r\n\t\tif (withdraw) {\r\n\t\t\trotation = { x: -Math.PI / 4, y: Math.PI / 180 * 10, z: 0 };\r\n\r\n\t\t\t// 默认配比是500 * 300的设置\r\n\t\t\tlet gap = container.clientWidth / 550;\r\n\t\t\t// 算移开的位置,移开的位置是固定的,只算一遍\r\n\r\n\t\t\tif (!this.withdrawPosition) {\r\n\t\t\t\tthis.withdrawPosition = _getCoordinate2InScene({\r\n\t\t\t\t\tx: 30 * gap,\r\n\t\t\t\t\ty: renderer.domElement.offsetHeight / 2\r\n\t\t\t\t}, camera, renderer.domElement);\r\n\r\n\t\t\t\t// 避免飞出画布\r\n\t\t\t\tthis.withdrawPosition.x += getMeshWidth(object).length / 4;\r\n\r\n\t\t\t\tthis.tweenInOut(camera.position, { z: 80 }, 1000);\r\n\t\t\t}\r\n\t\t\tpoint = this.withdrawPosition;\r\n\r\n\t\t\tthis.tweenInOut(object.position, point, 1000);\r\n\t\t} else {\r\n \t\t/* 在开场动画结束后,模型需要填满整个页面,但点击板块显示详情时会出现空间不够的情况\r\n 于是这里除了改变模型水平位置,还需要改变相机位置给详情腾地方\r\n\r\n 至于为什么不改变模型的z...因为还有个轨道控制。如果改变了y,但模型仍旧是照着x轴旋转的,\r\n 这就会造成模型转出屏幕的问题*/\r\n\t\t\tthis.tweenInOut(camera.position, config.cameraPosition, 1000);\r\n\t\t\tthis.tweenInOut(object.position, point, 1000);\r\n\r\n\t\t\tthis.withdrawPosition = null;\r\n\t\t}\r\n\t}\r\n\r\n\t// 获得模型宽度\r\n\tgetMeshWidth = object => {\r\n\t\tlet c = 16711680, length = 0, width = 0, height = 0;\r\n\t\tlet boxHelper = new THREE.BoxHelper(object, c);\r\n\t\tlet box = new THREE.Box3().setFromObject(object);\r\n\r\n\t\tboxHelper.update();\r\n\r\n\t\tlength = box.max.x - box.min.x;\r\n\t\twidth = box.max.y - box.min.y;\r\n\t\theight = box.max.z - box.min.z;\r\n\r\n\t\treturn { length, width, height };\r\n\t}\r\n\r\n\t// 定义各板块移动速度\r\n\thandleModelShift = child => {\r\n\t\tlet { _startPositions, config } = this;\r\n\r\n\t\tlet name = child.name.split('_');\r\n\t\tlet area = name[0];\r\n\r\n\t\tif (!_startPositions[area]) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treturn config.meshShiftTime && config.meshShiftTime();\r\n\t}\r\n\r\n\t/**\r\n * 遍历所有模型对象时的回调\r\n * @param {*} child 当前遍历模型\r\n */\r\n\tchildMapping = child => {\r\n\t\tlet { config } = this;\r\n\r\n\t\tconfig.childMapping && config.childMapping(child);\r\n\t}\r\n\r\n\t// 计算模型移动距离\r\n\t_getCoordinate2InScene = (i, d, c) => {\r\n\t\td.updateMatrixWorld(true);\r\n\r\n\t\tlet b = this.getVector2InScene(i, c);\r\n\t\tlet j = new THREE.Vector3(b.x, b.y, 0);\r\n\r\n\t\tj.unproject(d);\r\n\t\tj.sub(d.position);\r\n\t\tj.normalize();\r\n\r\n\t\tlet f = new THREE.Raycaster(d.position, j);\r\n\t\tlet h = f.ray.origin;\r\n\t\tlet g = f.ray.direction;\r\n\t\tlet e = 0;\r\n\t\tlet a = new THREE.Vector3();\r\n\r\n\t\ta.setX(h.x - ((h.z - e) * g.x / g.z));\r\n\t\ta.setY(h.y - ((h.z - e) * g.y / g.z));\r\n\r\n\t\treturn a;\r\n\t}\r\n\r\n\tgetVector2InScene = (a, c) => {\r\n\t\tlet b = new THREE.Vector2();\r\n\r\n\t\tb.x = (a.x / c.offsetWidth) * 2 - 1;\r\n\t\tb.y = -(a.y / c.offsetHeight) * 2 + 1;\r\n\r\n\t\treturn b;\r\n\t};\r\n\r\n\t/**\r\n * TWEEN动画,封装一下调用的时候写简单点\r\n * @param a 起点\r\n * @param b 终点\r\n * @param t 过渡时间\r\n * @param c 动画加载完成回调\r\n * @param s 动画开始回调\r\n */\r\n\ttweenInOut = (a, b, t, c, s) => {\r\n\t\tlet tween = new TWEEN.Tween(a)\r\n\t\t\t.to(b, t)\r\n\t\t\t.easing(TWEEN.Easing.Exponential.InOut);\r\n\r\n\t\tc && tween.onComplete(c);\r\n\t\ts && tween.onStart(s);\r\n\r\n\t\treturn tween.start();\r\n\t};\r\n\r\n\t/**\r\n * 递归加载、合并多个材质文件\r\n * TODO 弃用深拷贝,略浪费性能\r\n * @param {*} paths config.data.materials,数组\r\n * @param {*} loader 文件加载器\r\n * @param {*} material 加载完成后的材质对象,调用时传null就行了\r\n * @param {*} callback 加载完成后的回调,相当于ajax里的success,传回材质对象\r\n */\r\n\tloadMaterials = (paths, loader, material, callback) => {\r\n\t\tloader.load(paths[0], materials => {\r\n\t\t\tmaterial ? material.materialsInfo = [...material.materialsInfo, ...materials.materialsInfo] : material = materials;\r\n\r\n\t\t\tpaths.shift();\r\n\r\n\t\t\tpaths.length != 0 ? loadMaterials(paths, loader, material, callback) : callback(material);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * 递归加载、合并多个模型文件\r\n * TODO 弃用深拷贝,略浪费性能\r\n * @param {*} paths config.data.objects,数组\r\n * @param {*} loader 文件加载器\r\n * @param {*} object 加载完成后的模型对象,调用时传null就行了\r\n * @param {*} callback 加载完成后的回调,相当于ajax里的success,传回模型对象\r\n */\r\n\tloadObjects = (paths, loader, object, callback) => {\r\n\t\tloader.load(paths[0], objects => {\r\n\t\t\tobject ? object.children = objects.children.concat(object.children) : object = extend({}, objects);\r\n\r\n\t\t\tpaths.shift();\r\n\r\n\t\t\tpaths.length != 0 ? loadObjects(paths, loader, object, callback) : callback(object);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * 初始化参数\r\n */\r\n\tinitParams = () => {\r\n\t\tconst { config } = this;\r\n\t\tconst { cameraPosition, clientWidth, clientHeight } = config;\r\n\t\tconst { x, y, z } = cameraPosition;\r\n\r\n\t\t// 挂载画布的dom\r\n\t\tthis.container = config.container;\r\n\r\n\t\t// 相机视锥体的长宽比\r\n\t\tconst cameraAspect = clientWidth / clientHeight;\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera(45, cameraAspect, 1, 10000);\r\n\t\tthis.camera.position.set(x, y, z);\r\n\r\n\t\t// 设置画布透明\r\n\t\tthis.renderer = new THREE.WebGLRenderer({\r\n\t\t\talpha: true,\r\n\t\t\tantialias: true\r\n\t\t});\r\n\t\t// this.renderer.setSize(clientWidth, clientHeight - 4);\r\n\t\tthis.resize(clientWidth, clientHeight - 4);\r\n\t\tthis.renderer.shadowMap.enabled = true; // 启用阴影选项\r\n\t\tthis.renderer.shadowMap.type = THREE.PCFSoftShadowMap;\r\n\r\n\t\tthis.container.appendChild(this.renderer.domElement);\r\n\r\n\t\tthis.scene = new THREE.Scene();\r\n\t\tthis.scene.add(this.camera);\r\n\r\n\t\t// 初始化轨道控制\r\n\t\tlet controls = new OrbitControls(this.camera, this.renderer.domElement);\r\n\r\n\t\tObject.assign(controls, config.controls);\r\n\t\tthis.controls = controls;\r\n\r\n\t\t// 初始化光线\r\n\t\tif (config.light) {\r\n\t\t\tlet lights = config.light();\r\n\r\n\t\t\tfor (let light of lights) {\r\n\t\t\t\tthis.scene.add(light);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 设置背景颜色\r\n\t\tconfig.clearColor && this.renderer.setClearColor(config.clearColor, config.clearOpacity);\r\n\t}\r\n\r\n\t/**\r\n * 完成开场动画后,相机视角变动\r\n * 一种是旋转mesh,一种是改变相机位置\r\n * 这是旋转mesh\r\n */\r\n\tafterMovementMesh = () => {\r\n\t\tconst { afterRotation } = this.config;\r\n\r\n\t\tconst rotateAnimate = () => {\r\n\t\t\trequestAnimationFrame(rotateAnimate);\r\n\r\n\t\t\t// 沿x轴旋转\r\n\t\t\tthis.root.rotation.x >= afterRotation ? this.root.rotation.x -= this.config.rotationSpeed : null;\r\n\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\r\n\t\trotateAnimate();\r\n\t}\r\n\r\n\t/**\r\n * 预处理模型数据\r\n * @param object 模型数据\r\n */\r\n\thandleMesh = object => {\r\n\t\tlet { config, _startTweenCount } = this;\r\n\r\n\t\tobject.traverse(child => {\r\n\t\t\tif (child instanceof THREE.Group) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (child instanceof THREE.Mesh) {\r\n\t\t\t\tchild.geometry = new THREE.Geometry().fromBufferGeometry(child.geometry);\r\n\t\t\t} else if (child instanceof THREE.Line) {\r\n\t\t\t\tconsole.log(child.name);\r\n\t\t\t}\r\n\r\n\t\t\tchild.name == 'texture' && (this.modelTexture = child);\r\n\r\n\t\t\tthis.dealObjectInLoadCirculStart(child, config.borderVisible);\r\n\r\n\t\t\tthis.childMapping(child, config);\r\n\r\n\t\t\tlet time = this.handleModelShift(child, config);\r\n\r\n\t\t\t// 开始动画\r\n\t\t\tthis.tweenInOut(child.position, { x: 0, y: 0, z: 0 }, time, () => {\r\n\t\t\t\t_startTweenCount--;\r\n\r\n\t\t\t\tif (_startTweenCount === 0) {\r\n\t\t\t\t\tthis.renderPillar(object);\r\n\t\t\t\t\tthis.afterMovementMesh();\r\n\r\n\t\t\t\t\t// TODO 这里不该循环,应急\r\n\t\t\t\t\tfor (let child of object.children) {\r\n\t\t\t\t\t\tthis.config.before_animate && this.config.before_animate(child, true);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// 绑定事件,比如鼠标移到板块上高亮\r\n\t\t\t\t\tthis.initListener(object);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t_startTweenCount++;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * 显示贴图\r\n * @param material 传入的材质,最后和原材质中的属性合并\r\n * @param url 等值面图片地址\r\n */\r\n\tshowTexture = (material, url) => {\r\n\t\tif (url) {\r\n\t\t\tnew THREE.TextureLoader().load(url, map => {\r\n\t\t\t\tthis.modelTexture.material.map = map;\r\n\r\n\t\t\t\tthis.modelTexture.material = Object.assign(this.modelTexture.material, material);\r\n\t\t\t\tthis.modelTexture.visible = !this.modelTexture.visible;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgetObject = () => this.dataObject;\r\n\r\n\t/**\r\n * 更新数据并刷新柱子高度,也就是动画重播一遍\r\n * TODO 根据传入对象判断哪些对象需要更新\r\n * @param {*} object 新的模型对象\r\n */\r\n\trefreshPillar = object => {\r\n\t\tlet { dataObject } = this;\r\n\r\n\t\tdataObject = object;\r\n\t\tthis.renderPillar(dataObject);\r\n\t}\r\n\r\n\tflush = () => {\r\n\t\t// 实时渲染\r\n\t\tconst render = () => {\r\n\t\t\trequestAnimationFrame(render);\r\n\r\n\t\t\tTWEEN.update();\r\n\t\t\tthis.controls.update();\r\n\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\r\n\t\trender();\r\n\t}\r\n\r\n\t// 渲染柱子\r\n\trenderPillar = object => {\r\n\t\tconst { config } = this;\r\n\r\n\t\tobject.traverse(child => {\r\n\t\t\tthis.changeModel4DataRefresh(child, config.divisor);\r\n\t\t});\r\n\t}\r\n\r\n\tresize = (width = document.documentElement.clientWidth, height = document.documentElement.clientHeight - 4) => {\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tinit = () => {\r\n\t\tlet { config } = this;\r\n\r\n\t\tconst { materials, objects } = config.data;\r\n\r\n\t\t// 初始化前的钩子\r\n\t\tconfig.beforeInit && config.beforeInit(config);\r\n\r\n\t\tconst loader = new Loader(config);\r\n\r\n\t\tloader.load(materials, objects, object => {\r\n\t\t\t// 请求业务数据\r\n\t\t\tconfig.data.load(object, newObject => {\r\n\t\t\t\tthis.dataObject = newObject;\r\n\r\n\t\t\t\tthis.handleMesh(newObject);\r\n\r\n\t\t\t\tthis.root = new THREE.Object3D().add(newObject);\r\n\t\t\t\tthis.scene.add(this.root);\r\n\r\n\t\t\t\tthis.flush();\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n}","/*\r\n * @Author: zy9@github.com/zy410419243\r\n * @Date: 2018-07-22 22:14:42\r\n * @Last Modified by: zy9\r\n * @Last Modified time: 2018-07-23 21:45:15\r\n * @Description: 递归加载数组中所有mtl跟obj文件\r\n */\r\nimport MTLLoader from '../loader/MTLLoader';\r\nimport OBJLoader from '../loader/OBJLoader';\r\nimport extend from '../util/DeepClone';\r\n\r\nexport default class Loader {\r\n\tconstructor (config, mtlLoader, objectLoader) {\r\n\t\tthis.mtlLoader = mtlLoader ? mtlLoader : new MTLLoader();\r\n\t\tthis.objectLoader = objectLoader ? objectLoader : new OBJLoader();\r\n\t\tthis.config = config;\r\n\t}\r\n\r\n\tload = (mtlUrl, objUrl, callback) => {\r\n\t\tconst { config } = this;\r\n\r\n\t\tthis.loadMaterials(mtlUrl, null, materials => {\r\n \t\tconfig.setMaterial && (materials = config.setMaterial(materials));\r\n\r\n \t\tlet objLoader = new OBJLoader();\r\n\r\n \t\tobjLoader.setMaterials(materials);\r\n\r\n \t\tthis.loadObjects(objUrl, null, objects => callback(objects));\r\n \t});\r\n\t}\r\n\r\n\t/**\r\n * 递归加载、合并多个材质文件\r\n * TODO 弃用深拷贝,略浪费性能\r\n * @param {*} paths config.data.materials,数组\r\n * @param {*} material 加载完成后的材质对象,调用时传null就行了\r\n * @param {*} callback 加载完成后的回调,相当于ajax里的success,传回材质对象\r\n */\r\n loadMaterials = (paths, material, callback) => {\r\n \tthis.mtlLoader.load(paths[0], materials => {\r\n \t\tmaterial ? material.materialsInfo = [...material.materialsInfo, ...materials.materialsInfo] : material = materials;\r\n\r\n \t\tpaths.shift();\r\n\r\n \t\tpaths.length != 0 ? loadMaterials(paths, material, callback) : callback(material);\r\n \t});\r\n }\r\n\r\n\t/**\r\n * 递归加载、合并多个模型文件\r\n * TODO 弃用深拷贝,略浪费性能\r\n * @param {*} paths config.data.objects,数组\r\n * @param {*} object 加载完成后的模型对象,调用时传null就行了\r\n * @param {*} callback 加载完成后的回调,相当于ajax里的success,传回模型对象\r\n */\r\n loadObjects = (paths, object, callback) => {\r\n \tthis.objectLoader.load(paths[0], objects => {\r\n \t\tobject ? object.children = objects.children.concat(object.children) : object = extend({}, objects);\r\n\r\n \t\tpaths.shift();\r\n\r\n \t\tpaths.length != 0 ? loadObjects(paths, object, callback) : callback(object);\r\n \t});\r\n }\r\n}","/**\r\n * Loads a Wavefront .mtl file specifying materials\r\n *\r\n * @author angelxuanchang\r\n * edited by lucascassiano as an ES6 module - http://lucascassiano.github.io\r\n */\r\nimport * as THREE from 'three';\r\n\r\nclass MTLLoader {\r\n\r\n\tconstructor (manager) {\r\n\t\tthis.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Loads and parses a MTL asset from a URL.\r\n\t *\r\n\t * @param {String} url - URL to the MTL file.\r\n\t * @param {Function} [onLoad] - Callback invoked with the loaded object.\r\n\t * @param {Function} [onProgress] - Callback for download progress.\r\n\t * @param {Function} [onError] - Callback for download errors.\r\n\t *\r\n\t * @see setPath setTexturePath\r\n\t *\r\n\t * @note In order for relative texture references to resolve correctly\r\n\t * you must call setPath and/or setTexturePath explicitly prior to load.\r\n\t */\r\n\tload (url, onLoad, onProgress, onError) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar loader = new THREE.FileLoader(this.manager);\r\n\r\n\t\tloader.setPath(this.path);\r\n\t\tloader.load(url, (text) => {\r\n\r\n\t\t\tonLoad(scope.parse(text));\r\n\r\n\t\t}, onProgress, onError);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Set base path for resolving references.\r\n\t * If set this path will be prepended to each loaded and found reference.\r\n\t *\r\n\t * @see setTexturePath\r\n\t * @param {String} path\r\n\t *\r\n\t * @example\r\n\t * mtlLoader.setPath( 'assets/obj/' );\r\n\t * mtlLoader.load( 'my.mtl', ... );\r\n\t */\r\n\tsetPath (path) {\r\n\t\tthis.path = path;\r\n\t}\r\n\r\n\t/**\r\n\t * Set base path for resolving texture references.\r\n\t * If set this path will be prepended found texture reference.\r\n\t * If not set and setPath is, it will be used as texture base path.\r\n\t *\r\n\t * @see setPath\r\n\t * @param {String} path\r\n\t *\r\n\t * @example\r\n\t * mtlLoader.setPath( 'assets/obj/' );\r\n\t * mtlLoader.setTexturePath( 'assets/textures/' );\r\n\t * mtlLoader.load( 'my.mtl', ... );\r\n\t */\r\n\tsetTexturePath (path) {\r\n\r\n\t\tthis.texturePath = path;\r\n\r\n\t}\r\n\r\n\tsetBaseUrl (path) {\r\n\r\n\t\tconsole.warn('THREE.MTLLoader: .setBaseUrl() is deprecated. Use .setTexturePath( path ) for texture path or .setPath( path ) for general base path instead.');\r\n\r\n\t\tthis.setTexturePath(path);\r\n\r\n\t}\r\n\r\n\tsetCrossOrigin (value) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t}\r\n\r\n\tsetMaterialOptions (value) {\r\n\r\n\t\tthis.materialOptions = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Parses a MTL file.\r\n\t *\r\n\t * @param {String} text - Content of MTL file\r\n\t * @return {THREE.MTLLoader.MaterialCreator}\r\n\t *\r\n\t * @see setPath setTexturePath\r\n\t *\r\n\t * @note In order for relative texture references to resolve correctly\r\n\t * you must call setPath and/or setTexturePath explicitly prior to parse.\r\n\t */\r\n\tparse (text) {\r\n\r\n\t\tvar lines = text.split('\\n');\r\n\t\tvar info = {};\r\n\t\tvar delimiterPattern = /\\s+/;\r\n\t\tvar materialsInfo = {};\r\n\r\n\t\tfor (var i = 0; i < lines.length; i++) {\r\n\r\n\t\t\tvar line = lines[i];\r\n\r\n\t\t\tline = line.trim();\r\n\r\n\t\t\tif (line.length === 0 || line.charAt(0) === '#') {\r\n\r\n\t\t\t\t// Blank line or comment ignore\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar pos = line.indexOf(' ');\r\n\r\n\t\t\tvar key = (pos >= 0) ? line.substring(0, pos) : line;\r\n\r\n\t\t\tkey = key.toLowerCase();\r\n\r\n\t\t\tvar value = (pos >= 0) ? line.substring(pos + 1) : '';\r\n\r\n\t\t\tvalue = value.trim();\r\n\r\n\t\t\tif (key === 'newmtl') {\r\n\r\n\t\t\t\t// New material\r\n\r\n\t\t\t\tinfo = { name: value };\r\n\t\t\t\tmaterialsInfo[value] = info;\r\n\r\n\t\t\t} else if (info) {\r\n\r\n\t\t\t\tif (key === 'ka' || key === 'kd' || key === 'ks') {\r\n\r\n\t\t\t\t\tvar ss = value.split(delimiterPattern, 3);\r\n\r\n\t\t\t\t\tinfo[key] = [parseFloat(ss[0]), parseFloat(ss[1]), parseFloat(ss[2])];\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tinfo[key] = value;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar materialCreator = new MaterialCreator(this.texturePath || this.path, this.materialOptions);\r\n\r\n\t\tmaterialCreator.setCrossOrigin(this.crossOrigin);\r\n\t\tmaterialCreator.setManager(this.manager);\r\n\t\tmaterialCreator.setMaterials(materialsInfo);\r\n\t\treturn materialCreator;\r\n\r\n\t}\r\n}\r\n\r\nclass MaterialCreator {\r\n\tconstructor (baseUrl, options) {\r\n\r\n\t\tthis.baseUrl = baseUrl || '';\r\n\t\tthis.options = options;\r\n\t\tthis.materialsInfo = {};\r\n\t\tthis.materials = {};\r\n\t\tthis.materialsArray = [];\r\n\t\tthis.nameLookup = {};\r\n\r\n\t\tthis.side = (this.options && this.options.side) ? this.options.side : THREE.FrontSide;\r\n\t\tthis.wrap = (this.options && this.options.wrap) ? this.options.wrap : THREE.RepeatWrapping;\r\n\r\n\t}\r\n\r\n\tcrossOrigin = 'Anonymous';\r\n\r\n\tsetCrossOrigin (value) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t}\r\n\r\n\tsetManager (value) {\r\n\r\n\t\tthis.manager = value;\r\n\r\n\t}\r\n\r\n\tsetMaterials (materialsInfo) {\r\n\r\n\t\tthis.materialsInfo = this.convert(materialsInfo);\r\n\t\tthis.materials = {};\r\n\t\tthis.materialsArray = [];\r\n\t\tthis.nameLookup = {};\r\n\r\n\t}\r\n\r\n\tconvert (materialsInfo) {\r\n\r\n\t\tif (!this.options) return materialsInfo;\r\n\r\n\t\tvar converted = {};\r\n\r\n\t\tfor (var mn in materialsInfo) {\r\n\r\n\t\t\t// Convert materials info into normalized form based on options\r\n\r\n\t\t\tvar mat = materialsInfo[mn];\r\n\r\n\t\t\tvar covmat = {};\r\n\r\n\t\t\tconverted[mn] = covmat;\r\n\r\n\t\t\tfor (var prop in mat) {\r\n\r\n\t\t\t\tvar save = true;\r\n\t\t\t\tvar value = mat[prop];\r\n\t\t\t\tvar lprop = prop.toLowerCase();\r\n\r\n\t\t\t\tswitch (lprop) {\r\n\r\n\t\t\t\t\tcase 'kd':\r\n\t\t\t\t\tcase 'ka':\r\n\t\t\t\t\tcase 'ks':\r\n\r\n\t\t\t\t\t\t// Diffuse color (color under white light) using RGB values\r\n\r\n\t\t\t\t\t\tif (this.options && this.options.normalizeRGB) {\r\n\r\n\t\t\t\t\t\t\tvalue = [value[0] / 255, value[1] / 255, value[2] / 255];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (this.options && this.options.ignoreZeroRGBs) {\r\n\r\n\t\t\t\t\t\t\tif (value[0] === 0 && value[1] === 0 && value[2] === 0) {\r\n\r\n\t\t\t\t\t\t\t\t// ignore\r\n\r\n\t\t\t\t\t\t\t\tsave = false;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tdefault:\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (save) {\r\n\r\n\t\t\t\t\tcovmat[lprop] = value;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn converted;\r\n\r\n\t}\r\n\r\n\tpreload () {\r\n\r\n\t\tfor (var mn in this.materialsInfo) {\r\n\r\n\t\t\tthis.create(mn);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgetIndex (materialName) {\r\n\r\n\t\treturn this.nameLookup[materialName];\r\n\r\n\t}\r\n\r\n\tgetAsArray () {\r\n\r\n\t\tvar index = 0;\r\n\r\n\t\tfor (var mn in this.materialsInfo) {\r\n\r\n\t\t\tthis.materialsArray[index] = this.create(mn);\r\n\t\t\tthis.nameLookup[mn] = index;\r\n\t\t\tindex++;\r\n\r\n\t\t}\r\n\r\n\t\treturn this.materialsArray;\r\n\r\n\t}\r\n\r\n\tcreate (materialName) {\r\n\r\n\t\tif (this.materials[materialName] === undefined) {\r\n\r\n\t\t\tthis.createMaterial(materialName);\r\n\r\n\t\t}\r\n\r\n\t\treturn this.materials[materialName];\r\n\r\n\t}\r\n\r\n\tcreateMaterial (materialName) {\r\n\r\n\t\t// Create material\r\n\r\n\t\tvar scope = this;\r\n\t\tvar mat = this.materialsInfo[materialName];\r\n\t\tvar params = {\r\n\r\n\t\t\tname: materialName,\r\n\t\t\tside: this.side\r\n\r\n\t\t};\r\n\r\n\t\tfunction resolveURL (baseUrl, url) {\r\n\r\n\t\t\tif (typeof url !== 'string' || url === '')\r\n\t\t\t\treturn '';\r\n\r\n\t\t\t// Absolute URL\r\n\t\t\tif (/^https?:\\/\\//i.test(url)) return url;\r\n\r\n\t\t\treturn baseUrl + url;\r\n\r\n\t\t}\r\n\r\n\t\tfunction setMapForType (mapType, value) {\r\n\r\n\t\t\tif (params[mapType]) return; // Keep the first encountered texture\r\n\r\n\t\t\tvar texParams = scope.getTextureParams(value, params);\r\n\t\t\tvar map = scope.loadTexture(resolveURL(scope.baseUrl, texParams.url));\r\n\r\n\t\t\tmap.repeat.copy(texParams.scale);\r\n\t\t\tmap.offset.copy(texParams.offset);\r\n\r\n\t\t\tmap.wrapS = scope.wrap;\r\n\t\t\tmap.wrapT = scope.wrap;\r\n\r\n\t\t\tparams[mapType] = map;\r\n\r\n\t\t}\r\n\r\n\t\tfor (var prop in mat) {\r\n\r\n\t\t\tvar value = mat[prop];\r\n\t\t\tvar n;\r\n\r\n\t\t\tif (value === '') continue;\r\n\r\n\t\t\tswitch (prop.toLowerCase()) {\r\n\r\n\t\t\t\t// Ns is material specular exponent\r\n\r\n\t\t\t\tcase 'kd':\r\n\r\n\t\t\t\t\t// Diffuse color (color under white light) using RGB values\r\n\r\n\t\t\t\t\tparams.color = new THREE.Color().fromArray(value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'ks':\r\n\r\n\t\t\t\t\t// Specular color (color when light is reflected from shiny surface) using RGB values\r\n\t\t\t\t\tparams.specular = new THREE.Color().fromArray(value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'map_kd':\r\n\r\n\t\t\t\t\t// Diffuse texture map\r\n\r\n\t\t\t\t\tsetMapForType('map', value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'map_ks':\r\n\r\n\t\t\t\t\t// Specular map\r\n\r\n\t\t\t\t\tsetMapForType('specularMap', value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'norm':\r\n\r\n\t\t\t\t\tsetMapForType('normalMap', value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'map_bump':\r\n\t\t\t\tcase 'bump':\r\n\r\n\t\t\t\t\t// Bump texture map\r\n\r\n\t\t\t\t\tsetMapForType('bumpMap', value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'ns':\r\n\r\n\t\t\t\t\t// The specular exponent (defines the focus of the specular highlight)\r\n\t\t\t\t\t// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.\r\n\r\n\t\t\t\t\tparams.shininess = parseFloat(value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'd':\r\n\t\t\t\t\tn = parseFloat(value);\r\n\r\n\t\t\t\t\tif (n < 1) {\r\n\r\n\t\t\t\t\t\tparams.opacity = n;\r\n\t\t\t\t\t\tparams.transparent = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'tr':\r\n\t\t\t\t\tn = parseFloat(value);\r\n\r\n\t\t\t\t\tif (n > 0) {\r\n\r\n\t\t\t\t\t\tparams.opacity = 1 - n;\r\n\t\t\t\t\t\tparams.transparent = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.materials[materialName] = new THREE.MeshPhongMaterial(params);\r\n\t\treturn this.materials[materialName];\r\n\r\n\t}\r\n\r\n\tgetTextureParams (value, matParams) {\r\n\r\n\t\tvar texParams = {\r\n\r\n\t\t\tscale: new THREE.Vector2(1, 1),\r\n\t\t\toffset: new THREE.Vector2(0, 0)\r\n\r\n\t\t};\r\n\r\n\t\tvar items = value.split(/\\s+/);\r\n\t\tvar pos;\r\n\r\n\t\tpos = items.indexOf('-bm');\r\n\r\n\t\tif (pos >= 0) {\r\n\r\n\t\t\tmatParams.bumpScale = parseFloat(items[pos + 1]);\r\n\t\t\titems.splice(pos, 2);\r\n\r\n\t\t}\r\n\r\n\t\tpos = items.indexOf('-s');\r\n\r\n\t\tif (pos >= 0) {\r\n\r\n\t\t\ttexParams.scale.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2]));\r\n\t\t\titems.splice(pos, 4); // we expect 3 parameters here!\r\n\r\n\t\t}\r\n\r\n\t\tpos = items.indexOf('-o');\r\n\r\n\t\tif (pos >= 0) {\r\n\r\n\t\t\ttexParams.offset.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2]));\r\n\t\t\titems.splice(pos, 4); // we expect 3 parameters here!\r\n\r\n\t\t}\r\n\r\n\t\ttexParams.url = items.join(' ').trim();\r\n\t\treturn texParams;\r\n\r\n\t}\r\n\r\n\tloadTexture (url, mapping, onLoad, onProgress, onError) {\r\n\r\n\t\tvar texture;\r\n\t\tvar loader = THREE.Loader.Handlers.get(url);\r\n\t\tvar manager = (this.manager !== undefined) ? this.manager : THREE.DefaultLoadingManager;\r\n\r\n\t\tif (loader === null) {\r\n\r\n\t\t\tloader = new THREE.TextureLoader(manager);\r\n\r\n\t\t}\r\n\r\n\t\tif (loader.setCrossOrigin) loader.setCrossOrigin(this.crossOrigin);\r\n\t\ttexture = loader.load(url, onLoad, onProgress, onError);\r\n\r\n\t\tif (mapping !== undefined) texture.mapping = mapping;\r\n\r\n\t\treturn texture;\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default MTLLoader;","/**\r\n * @author lucascassiano / http://lucascassiano.github.io\r\n * @edited as an ES6 module based on script from mrdoob / http://mrdoob.com/\r\n */\r\n\r\nimport * as THREE from 'three';\r\n\r\nclass OBJLoader {\r\n\tconstructor (manager) {\r\n\t\tthis.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager;\r\n\r\n\t\tthis.materials = null;\r\n\r\n\t\tthis.regexp = {\r\n\t\t\t// v float float float\r\n\t\t\tvertexPattern: /^v\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)/,\r\n\t\t\t// vn float float float\r\n\t\t\tnormalPattern: /^vn\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)/,\r\n\t\t\t// vt float float\r\n\t\t\tuvPattern: /^vt\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)/,\r\n\t\t\t// f vertex vertex vertex\r\n\t\t\tfaceVertex: /^f\\s+(-?\\d+)\\s+(-?\\d+)\\s+(-?\\d+)(?:\\s+(-?\\d+))?/,\r\n\t\t\t// f vertex/uv vertex/uv vertex/uv\r\n\t\t\tfaceVertexUv: /^f\\s+(-?\\d+)\\/(-?\\d+)\\s+(-?\\d+)\\/(-?\\d+)\\s+(-?\\d+)\\/(-?\\d+)(?:\\s+(-?\\d+)\\/(-?\\d+))?/,\r\n\t\t\t// f vertex/uv/normal vertex/uv/normal vertex/uv/normal\r\n\t\t\tfaceVertexUvNormal: /^f\\s+(-?\\d+)\\/(-?\\d+)\\/(-?\\d+)\\s+(-?\\d+)\\/(-?\\d+)\\/(-?\\d+)\\s+(-?\\d+)\\/(-?\\d+)\\/(-?\\d+)(?:\\s+(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/,\r\n\t\t\t// f vertex//normal vertex//normal vertex//normal\r\n\t\t\tfaceVertexNormal: /^f\\s+(-?\\d+)\\/\\/(-?\\d+)\\s+(-?\\d+)\\/\\/(-?\\d+)\\s+(-?\\d+)\\/\\/(-?\\d+)(?:\\s+(-?\\d+)\\/\\/(-?\\d+))?/,\r\n\t\t\t// o object_name | g group_name\r\n\t\t\tobjectPattern: /^[og]\\s*(.+)?/,\r\n\t\t\t// s boolean\r\n\t\t\tsmoothingPattern: /^s\\s+(\\d+|on|off)/,\r\n\t\t\t// mtllib file_reference\r\n\t\t\tmaterialLibraryPattern: /^mtllib /,\r\n\t\t\t// usemtl material_name\r\n\t\t\tmaterialUsePattern: /^usemtl /\r\n\t\t};\r\n\t}\r\n\r\n\tload (url, onLoad, onProgress, onError) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar loader = new THREE.FileLoader(scope.manager);\r\n\r\n\t\tloader.setPath(this.path);\r\n\t\tloader.load(url, (text) => {\r\n\r\n\t\t\tonLoad(scope.parse(text));\r\n\r\n\t\t}, onProgress, onError);\r\n\r\n\t}\r\n\r\n\tsetPath (value) {\r\n\r\n\t\tthis.path = value;\r\n\r\n\t}\r\n\r\n\tsetMaterials (materials) {\r\n\r\n\t\tthis.materials = materials;\r\n\r\n\t}\r\n\r\n\tcreateParserState () {\r\n\r\n\t\tvar state = {\r\n\t\t\tobjects: [],\r\n\t\t\tobject: {},\r\n\r\n\t\t\tvertices: [],\r\n\t\t\tnormals: [],\r\n\t\t\tuvs: [],\r\n\r\n\t\t\tmaterialLibraries: [],\r\n\r\n\t\t\tstartObject: function (name, fromDeclaration) {\r\n\r\n\t\t\t\t// If the current object (initial from reset) is not from a g/o declaration in the parsed\r\n\t\t\t\t// file. We need to use it for the first parsed g/o to keep things in sync.\r\n\t\t\t\tif (this.object && this.object.fromDeclaration === false) {\r\n\r\n\t\t\t\t\tthis.object.name = name;\r\n\t\t\t\t\tthis.object.fromDeclaration = (fromDeclaration !== false);\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar previousMaterial = (this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined);\r\n\r\n\t\t\t\tif (this.object && typeof this.object.finalize === 'function') {\r\n\r\n\t\t\t\t\tthis.object.finalize(true);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.object = {\r\n\t\t\t\t\tname: name || '',\r\n\t\t\t\t\tfromDeclaration: (fromDeclaration !== false),\r\n\r\n\t\t\t\t\tgeometry: {\r\n\t\t\t\t\t\tvertices: [],\r\n\t\t\t\t\t\tnormals: [],\r\n\t\t\t\t\t\tuvs: []\r\n\t\t\t\t\t},\r\n\t\t\t\t\tmaterials: [],\r\n\t\t\t\t\tsmooth: true,\r\n\r\n\t\t\t\t\tstartMaterial: function (name, libraries) {\r\n\r\n\t\t\t\t\t\tvar previous = this.finalize(false);\r\n\r\n\t\t\t\t\t\t// New usemtl declaration overwrites an inherited material, except if faces were declared\r\n\t\t\t\t\t\t// after the material, then it must be preserved for proper MultiMaterial continuation.\r\n\t\t\t\t\t\tif (previous && (previous.inherited || previous.groupCount <= 0)) {\r\n\r\n\t\t\t\t\t\t\tthis.materials.splice(previous.index, 1);\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar material = {\r\n\t\t\t\t\t\t\tindex: this.materials.length,\r\n\t\t\t\t\t\t\tname: name || '',\r\n\t\t\t\t\t\t\tmtllib: (Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : ''),\r\n\t\t\t\t\t\t\tsmooth: (previous !== undefined ? previous.smooth : this.smooth),\r\n\t\t\t\t\t\t\tgroupStart: (previous !== undefined ? previous.groupEnd : 0),\r\n\t\t\t\t\t\t\tgroupEnd: -1,\r\n\t\t\t\t\t\t\tgroupCount: -1,\r\n\t\t\t\t\t\t\tinherited: false,\r\n\r\n\t\t\t\t\t\t\tclone: function (index) {\r\n\t\t\t\t\t\t\t\tvar cloned = {\r\n\t\t\t\t\t\t\t\t\tindex: (typeof index === 'number' ? index : this.index),\r\n\t\t\t\t\t\t\t\t\tname: this.name,\r\n\t\t\t\t\t\t\t\t\tmtllib: this.mtllib,\r\n\t\t\t\t\t\t\t\t\tsmooth: this.smooth,\r\n\t\t\t\t\t\t\t\t\tgroupStart: 0,\r\n\t\t\t\t\t\t\t\t\tgroupEnd: -1,\r\n\t\t\t\t\t\t\t\t\tgroupCount: -1,\r\n\t\t\t\t\t\t\t\t\tinherited: false\r\n\t\t\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t\t\tcloned.clone = this.clone.bind(cloned);\r\n\t\t\t\t\t\t\t\treturn cloned;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tthis.materials.push(material);\r\n\r\n\t\t\t\t\t\treturn material;\r\n\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tcurrentMaterial: function () {\r\n\r\n\t\t\t\t\t\tif (this.materials.length > 0) {\r\n\t\t\t\t\t\t\treturn this.materials[this.materials.length - 1];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn undefined;\r\n\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tfinalize: function (end) {\r\n\r\n\t\t\t\t\t\tvar lastMultiMaterial = this.currentMaterial();\r\n\r\n\t\t\t\t\t\tif (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) {\r\n\r\n\t\t\t\t\t\t\tlastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\r\n\t\t\t\t\t\t\tlastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\r\n\t\t\t\t\t\t\tlastMultiMaterial.inherited = false;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Ignore objects tail materials if no face declarations followed them before a new o/g started.\r\n\t\t\t\t\t\tif (end && this.materials.length > 1) {\r\n\r\n\t\t\t\t\t\t\tfor (var mi = this.materials.length - 1; mi >= 0; mi--) {\r\n\t\t\t\t\t\t\t\tif (this.materials[mi].groupCount <= 0) {\r\n\t\t\t\t\t\t\t\t\tthis.materials.splice(mi, 1);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Guarantee at least one empty material, this makes the creation later more straight forward.\r\n\t\t\t\t\t\tif (end && this.materials.length === 0) {\r\n\r\n\t\t\t\t\t\t\tthis.materials.push({\r\n\t\t\t\t\t\t\t\tname: '',\r\n\t\t\t\t\t\t\t\tsmooth: this.smooth\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn lastMultiMaterial;\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// Inherit previous objects material.\r\n\t\t\t\t// Spec tells us that a declared material must be set to all objects until a new material is declared.\r\n\t\t\t\t// If a usemtl declaration is encountered while this new object is being parsed, it will\r\n\t\t\t\t// overwrite the inherited material. Exception being that there was already face declarations\r\n\t\t\t\t// to the inherited material, then it will be preserved for proper MultiMaterial continuation.\r\n\r\n\t\t\t\tif (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function') {\r\n\r\n\t\t\t\t\tvar declared = previousMaterial.clone(0);\r\n\r\n\t\t\t\t\tdeclared.inherited = true;\r\n\t\t\t\t\tthis.object.materials.push(declared);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.objects.push(this.object);\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfinalize: function () {\r\n\r\n\t\t\t\tif (this.object && typeof this.object.finalize === 'function') {\r\n\r\n\t\t\t\t\tthis.object.finalize(true);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t},\r\n\r\n\t\t\tparseVertexIndex: function (value, len) {\r\n\r\n\t\t\t\tvar index = parseInt(value, 10);\r\n\r\n\t\t\t\treturn (index >= 0 ? index - 1 : index + len / 3) * 3;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tparseNormalIndex: function (value, len) {\r\n\r\n\t\t\t\tvar index = parseInt(value, 10);\r\n\r\n\t\t\t\treturn (index >= 0 ? index - 1 : index + len / 3) * 3;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tparseUVIndex: function (value, len) {\r\n\r\n\t\t\t\tvar index = parseInt(value, 10);\r\n\r\n\t\t\t\treturn (index >= 0 ? index - 1 : index + len / 2) * 2;\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddVertex: function (a, b, c) {\r\n\r\n\t\t\t\tvar src = this.vertices;\r\n\t\t\t\tvar dst = this.object.geometry.vertices;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\t\t\t\tdst.push(src[a + 2]);\r\n\t\t\t\tdst.push(src[b + 0]);\r\n\t\t\t\tdst.push(src[b + 1]);\r\n\t\t\t\tdst.push(src[b + 2]);\r\n\t\t\t\tdst.push(src[c + 0]);\r\n\t\t\t\tdst.push(src[c + 1]);\r\n\t\t\t\tdst.push(src[c + 2]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddVertexLine: function (a) {\r\n\r\n\t\t\t\tvar src = this.vertices;\r\n\t\t\t\tvar dst = this.object.geometry.vertices;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\t\t\t\tdst.push(src[a + 2]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddNormal: function (a, b, c) {\r\n\r\n\t\t\t\tvar src = this.normals;\r\n\t\t\t\tvar dst = this.object.geometry.normals;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\t\t\t\tdst.push(src[a + 2]);\r\n\t\t\t\tdst.push(src[b + 0]);\r\n\t\t\t\tdst.push(src[b + 1]);\r\n\t\t\t\tdst.push(src[b + 2]);\r\n\t\t\t\tdst.push(src[c + 0]);\r\n\t\t\t\tdst.push(src[c + 1]);\r\n\t\t\t\tdst.push(src[c + 2]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddUV: function (a, b, c) {\r\n\r\n\t\t\t\tvar src = this.uvs;\r\n\t\t\t\tvar dst = this.object.geometry.uvs;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\t\t\t\tdst.push(src[b + 0]);\r\n\t\t\t\tdst.push(src[b + 1]);\r\n\t\t\t\tdst.push(src[c + 0]);\r\n\t\t\t\tdst.push(src[c + 1]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddUVLine: function (a) {\r\n\r\n\t\t\t\tvar src = this.uvs;\r\n\t\t\t\tvar dst = this.object.geometry.uvs;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddFace: function (a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {\r\n\r\n\t\t\t\tvar vLen = this.vertices.length;\r\n\r\n\t\t\t\tvar ia = this.parseVertexIndex(a, vLen);\r\n\t\t\t\tvar ib = this.parseVertexIndex(b, vLen);\r\n\t\t\t\tvar ic = this.parseVertexIndex(c, vLen);\r\n\t\t\t\tvar id;\r\n\r\n\t\t\t\tif (d === undefined) {\r\n\r\n\t\t\t\t\tthis.addVertex(ia, ib, ic);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tid = this.parseVertexIndex(d, vLen);\r\n\r\n\t\t\t\t\tthis.addVertex(ia, ib, id);\r\n\t\t\t\t\tthis.addVertex(ib, ic, id);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (ua !== undefined) {\r\n\r\n\t\t\t\t\tvar uvLen = this.uvs.length;\r\n\r\n\t\t\t\t\tia = this.parseUVIndex(ua, uvLen);\r\n\t\t\t\t\tib = this.parseUVIndex(ub, uvLen);\r\n\t\t\t\t\tic = this.parseUVIndex(uc, uvLen);\r\n\r\n\t\t\t\t\tif (d === undefined) {\r\n\r\n\t\t\t\t\t\tthis.addUV(ia, ib, ic);\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tid = this.parseUVIndex(ud, uvLen);\r\n\r\n\t\t\t\t\t\tthis.addUV(ia, ib, id);\r\n\t\t\t\t\t\tthis.addUV(ib, ic, id);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (na !== undefined) {\r\n\r\n\t\t\t\t\t// Normals are many times the same. If so, skip function call and parseInt.\r\n\t\t\t\t\tvar nLen = this.normals.length;\r\n\r\n\t\t\t\t\tia = this.parseNormalIndex(na, nLen);\r\n\r\n\t\t\t\t\tib = na === nb ? ia : this.parseNormalIndex(nb, nLen);\r\n\t\t\t\t\tic = na === nc ? ia : this.parseNormalIndex(nc, nLen);\r\n\r\n\t\t\t\t\tif (d === undefined) {\r\n\r\n\t\t\t\t\t\tthis.addNormal(ia, ib, ic);\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tid = this.parseNormalIndex(nd, nLen);\r\n\r\n\t\t\t\t\t\tthis.addNormal(ia, ib, id);\r\n\t\t\t\t\t\tthis.addNormal(ib, ic, id);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddLineGeometry: function (vertices, uvs) {\r\n\r\n\t\t\t\tthis.object.geometry.type = 'Line';\r\n\r\n\t\t\t\tvar vLen = this.vertices.length;\r\n\t\t\t\tvar uvLen = this.uvs.length;\r\n\r\n\t\t\t\tfor (var vi = 0, l = vertices.length; vi < l; vi++) {\r\n\r\n\t\t\t\t\tthis.addVertexLine(this.parseVertexIndex(vertices[vi], vLen));\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tl = uvs.length;\r\n\r\n\t\t\t\tfor (var uvi = 0; uvi < l; uvi++) {\r\n\r\n\t\t\t\t\tthis.addUVLine(this.parseUVIndex(uvs[uvi], uvLen));\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tstate.startObject('', false);\r\n\r\n\t\treturn state;\r\n\r\n\t}\r\n\r\n\tparse (text) {\r\n\r\n\t\tconsole.time('OBJLoader');\r\n\r\n\t\tvar state = this.createParserState();\r\n\r\n\t\tif (text.indexOf('\\r\\n') !== - 1) {\r\n\r\n\t\t\t// This is faster than String.split with regex that splits on both\r\n\t\t\ttext = text.replace(/\\r\\n/g, '\\n');\r\n\r\n\t\t}\r\n\r\n\t\tif (text.indexOf('\\\\\\n') !== - 1) {\r\n\r\n\t\t\t// join lines separated by a line continuation character (\\)\r\n\t\t\ttext = text.replace(/\\\\\\n/g, '');\r\n\r\n\t\t}\r\n\r\n\t\tvar lines = text.split('\\n');\r\n\t\tvar line = '', lineFirstChar = '', lineSecondChar = '';\r\n\t\tvar lineLength = 0;\r\n\t\tvar result = [];\r\n\r\n\t\t// Faster to just trim left side of the line. Use if available.\r\n\t\tvar trimLeft = (typeof ''.trimLeft === 'function');\r\n\r\n\t\tfor (var i = 0, l = lines.length; i < l; i++) {\r\n\r\n\t\t\tline = lines[i];\r\n\r\n\t\t\tline = trimLeft ? line.trimLeft() : line.trim();\r\n\r\n\t\t\tlineLength = line.length;\r\n\r\n\t\t\tif (lineLength === 0) continue;\r\n\r\n\t\t\tlineFirstChar = line.charAt(0);\r\n\r\n\t\t\t// @todo invoke passed in handler if any\r\n\t\t\tif (lineFirstChar === '#') continue;\r\n\r\n\t\t\tif (lineFirstChar === 'v') {\r\n\r\n\t\t\t\tlineSecondChar = line.charAt(1);\r\n\r\n\t\t\t\tif (lineSecondChar === ' ' && (result = this.regexp.vertexPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// 0 1 2 3\r\n\t\t\t\t\t// [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\r\n\r\n\t\t\t\t\tstate.vertices.push(\r\n\t\t\t\t\t\tparseFloat(result[1]),\r\n\t\t\t\t\t\tparseFloat(result[2]),\r\n\t\t\t\t\t\tparseFloat(result[3])\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if (lineSecondChar === 'n' && (result = this.regexp.normalPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// 0 1 2 3\r\n\t\t\t\t\t// [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\r\n\r\n\t\t\t\t\tstate.normals.push(\r\n\t\t\t\t\t\tparseFloat(result[1]),\r\n\t\t\t\t\t\tparseFloat(result[2]),\r\n\t\t\t\t\t\tparseFloat(result[3])\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if (lineSecondChar === 't' && (result = this.regexp.uvPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// 0 1 2\r\n\t\t\t\t\t// [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\r\n\r\n\t\t\t\t\tstate.uvs.push(\r\n\t\t\t\t\t\tparseFloat(result[1]),\r\n\t\t\t\t\t\tparseFloat(result[2])\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tthrow new Error('Unexpected vertex/normal/uv line: \\'' + line + '\\'');\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (lineFirstChar === 'f') {\r\n\r\n\t\t\t\tif ((result = this.regexp.faceVertexUvNormal.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// f vertex/uv/normal vertex/uv/normal vertex/uv/normal\r\n\t\t\t\t\t// 0 1 2 3 4 5 6 7 8 9 10 11 12\r\n\t\t\t\t\t// [\"f 1/1/1 2/2/2 3/3/3\", \"1\", \"1\", \"1\", \"2\", \"2\", \"2\", \"3\", \"3\", \"3\", undefined, undefined, undefined]\r\n\r\n\t\t\t\t\tstate.addFace(\r\n\t\t\t\t\t\tresult[1], result[4], result[7], result[10],\r\n\t\t\t\t\t\tresult[2], result[5], result[8], result[11],\r\n\t\t\t\t\t\tresult[3], result[6], result[9], result[12]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if ((result = this.regexp.faceVertexUv.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// f vertex/uv vertex/uv vertex/uv\r\n\t\t\t\t\t// 0 1 2 3 4 5 6 7 8\r\n\t\t\t\t\t// [\"f 1/1 2/2 3/3\", \"1\", \"1\", \"2\", \"2\", \"3\", \"3\", undefined, undefined]\r\n\r\n\t\t\t\t\tstate.addFace(\r\n\t\t\t\t\t\tresult[1], result[3], result[5], result[7],\r\n\t\t\t\t\t\tresult[2], result[4], result[6], result[8]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if ((result = this.regexp.faceVertexNormal.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// f vertex//normal vertex//normal vertex//normal\r\n\t\t\t\t\t// 0 1 2 3 4 5 6 7 8\r\n\t\t\t\t\t// [\"f 1//1 2//2 3//3\", \"1\", \"1\", \"2\", \"2\", \"3\", \"3\", undefined, undefined]\r\n\r\n\t\t\t\t\tstate.addFace(\r\n\t\t\t\t\t\tresult[1], result[3], result[5], result[7],\r\n\t\t\t\t\t\tundefined, undefined, undefined, undefined,\r\n\t\t\t\t\t\tresult[2], result[4], result[6], result[8]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if ((result = this.regexp.faceVertex.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// f vertex vertex vertex\r\n\t\t\t\t\t// 0 1 2 3 4\r\n\t\t\t\t\t// [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\r\n\r\n\t\t\t\t\tstate.addFace(\r\n\t\t\t\t\t\tresult[1], result[2], result[3], result[4]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tthrow new Error('Unexpected face line: \\'' + line + '\\'');\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (lineFirstChar === 'l') {\r\n\r\n\t\t\t\tvar lineParts = line.substring(1).trim().split(' ');\r\n\t\t\t\tvar lineVertices = [], lineUVs = [];\r\n\r\n\t\t\t\tif (line.indexOf('/') === - 1) {\r\n\r\n\t\t\t\t\tlineVertices = lineParts;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tfor (var li = 0, llen = lineParts.length; li < llen; li++) {\r\n\r\n\t\t\t\t\t\tvar parts = lineParts[li].split('/');\r\n\r\n\t\t\t\t\t\tif (parts[0] !== '') lineVertices.push(parts[0]);\r\n\t\t\t\t\t\tif (parts[1] !== '') lineUVs.push(parts[1]);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t\tstate.addLineGeometry(lineVertices, lineUVs);\r\n\r\n\t\t\t} else if ((result = this.regexp.objectPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t// o object_name\r\n\t\t\t\t// or\r\n\t\t\t\t// g group_name\r\n\r\n\t\t\t\t// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\r\n\t\t\t\t// var name = result[ 0 ].substr( 1 ).trim();\r\n\t\t\t\tvar name = (' ' + result[0].substr(1).trim()).substr(1);\r\n\r\n\t\t\t\tstate.startObject(name);\r\n\r\n\t\t\t} else if (this.regexp.materialUsePattern.test(line)) {\r\n\r\n\t\t\t\t// material\r\n\r\n\t\t\t\tstate.object.startMaterial(line.substring(7).trim(), state.materialLibraries);\r\n\r\n\t\t\t} else if (this.regexp.materialLibraryPattern.test(line)) {\r\n\r\n\t\t\t\t// mtl file\r\n\r\n\t\t\t\tstate.materialLibraries.push(line.substring(7).trim());\r\n\r\n\t\t\t} else if ((result = this.regexp.smoothingPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t// smooth shading\r\n\r\n\t\t\t\t// @todo Handle files that have varying smooth values for a set of faces inside one geometry,\r\n\t\t\t\t// but does not define a usemtl for each face set.\r\n\t\t\t\t// This should be detected and a dummy material created (later MultiMaterial and geometry groups).\r\n\t\t\t\t// This requires some care to not create extra material on each smooth value for \"normal\" obj files.\r\n\t\t\t\t// where explicit usemtl defines geometry groups.\r\n\t\t\t\t// Example asset: examples/models/obj/cerberus/Cerberus.obj\r\n\r\n\t\t\t\tvar value = result[1].trim().toLowerCase();\r\n\r\n\t\t\t\tstate.object.smooth = (value === '1' || value === 'on');\r\n\r\n\t\t\t\tvar material = state.object.currentMaterial();\r\n\r\n\t\t\t\tif (material) {\r\n\r\n\t\t\t\t\tmaterial.smooth = state.object.smooth;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// Handle null terminated files without exception\r\n\t\t\t\tif (line === '\\0') continue;\r\n\r\n\t\t\t\tthrow new Error('Unexpected line: \\'' + line + '\\'');\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tstate.finalize();\r\n\r\n\t\tvar container = new THREE.Group();\r\n\r\n\t\tcontainer.materialLibraries = [].concat(state.materialLibraries);\r\n\r\n\t\tfor (i = 0, l = state.objects.length; i < l; i++) {\r\n\r\n\t\t\tvar object = state.objects[i];\r\n\t\t\tvar geometry = object.geometry;\r\n\t\t\tvar materials = object.materials;\r\n\t\t\tvar isLine = (geometry.type === 'Line');\r\n\r\n\t\t\t// Skip o/g line declarations that did not follow with any faces\r\n\t\t\tif (geometry.vertices.length === 0) continue;\r\n\r\n\t\t\tvar buffergeometry = new THREE.BufferGeometry();\r\n\r\n\t\t\tbuffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));\r\n\r\n\t\t\tif (geometry.normals.length > 0) {\r\n\r\n\t\t\t\tbuffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbuffergeometry.computeVertexNormals();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif (geometry.uvs.length > 0) {\r\n\r\n\t\t\t\tbuffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Create materials\r\n\r\n\t\t\tvar createdMaterials = [];\r\n\r\n\t\t\tfor (var mi = 0, miLen = materials.length; mi < miLen; mi++) {\r\n\r\n\t\t\t\tvar sourceMaterial = materials[mi];\r\n\r\n\t\t\t\tmaterial = undefined;\r\n\r\n\t\t\t\tif (this.materials !== null) {\r\n\r\n\t\t\t\t\tmaterial = this.materials.create(sourceMaterial.name);\r\n\r\n\t\t\t\t\t// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\r\n\t\t\t\t\tif (isLine && material && !(material instanceof THREE.LineBasicMaterial)) {\r\n\r\n\t\t\t\t\t\tvar materialLine = new THREE.LineBasicMaterial();\r\n\r\n\t\t\t\t\t\tmaterialLine.copy(material);\r\n\t\t\t\t\t\tmaterial = materialLine;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!material) {\r\n\r\n\t\t\t\t\tmaterial = (!isLine ? new THREE.MeshPhongMaterial() : new THREE.LineBasicMaterial());\r\n\t\t\t\t\tmaterial.name = sourceMaterial.name;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmaterial.flatShading = sourceMaterial.smooth ? THREE.SmoothShading : THREE.FlatShading;\r\n\r\n\t\t\t\tcreatedMaterials.push(material);\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Create mesh\r\n\r\n\t\t\tvar mesh;\r\n\r\n\t\t\tif (createdMaterials.length > 1) {\r\n\r\n\t\t\t\tfor (mi = 0, miLen = materials.length; mi < miLen; mi++) {\r\n\r\n\t\t\t\t\tsourceMaterial = materials[mi];\r\n\r\n\t\t\t\t\tbuffergeometry.addGroup(sourceMaterial.groupStart, sourceMaterial.groupCount, mi);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmesh = (!isLine ? new THREE.Mesh(buffergeometry, createdMaterials) : new THREE.LineSegments(buffergeometry, createdMaterials));\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tmesh = (!isLine ? new THREE.Mesh(buffergeometry, createdMaterials[0]) : new THREE.LineSegments(buffergeometry, createdMaterials[0]));\r\n\t\t\t}\r\n\r\n\t\t\tmesh.name = object.name;\r\n\r\n\t\t\tcontainer.add(mesh);\r\n\r\n\t\t}\r\n\r\n\t\tconsole.timeEnd('OBJLoader');\r\n\r\n\t\treturn container;\r\n\r\n\t}\r\n\r\n}\r\nexport default OBJLoader;","var THREE = require('three')\n\n/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or arrow keys / touch: two-finger move\n\nTHREE.OrbitControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new THREE.Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.25;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.panSpeed = 1.0;\n\tthis.screenSpacePanning = false; // if true, pan in screen-space\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn spherical.phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn spherical.theta;\n\n\t};\n\n\tthis.saveState = function () {\n\n\t\tscope.target0.copy( scope.target );\n\t\tscope.position0.copy( scope.object.position );\n\t\tscope.zoom0 = scope.object.zoom;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function () {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new THREE.Vector3();\n\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\treturn function update() {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\t\t\tspherical.setFromVector3( offset );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t// restrict theta to be between desired limits\n\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\tspherical.makeSafe();\n\n\n\t\t\tspherical.radius *= scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t// move target to panned location\n\t\t\tscope.target.add( panOffset );\n\n\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\tpanOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function () {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = { NONE: - 1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 };\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar spherical = new THREE.Spherical();\n\tvar sphericalDelta = new THREE.Spherical();\n\n\tvar scale = 1;\n\tvar panOffset = new THREE.Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tsphericalDelta.theta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tsphericalDelta.phi -= angle;\n\n\t}\n\n\tvar panLeft = function () {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\tv.multiplyScalar( - distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\tvar panUp = function () {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\tif ( scope.screenSpacePanning === true ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t\tv.crossVectors( scope.object.up, v );\n\n\t\t\t}\n\n\t\t\tv.multiplyScalar( distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function () {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\treturn function pan( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\t//console.log( 'handleMouseDownPan' );\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\n\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\t//console.log( 'handleMouseMovePan' );\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( event ) {\n\n\t\t// console.log( 'handleMouseUp' );\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\t// console.log( 'handleMouseWheel' );\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\t//console.log( 'handleKeyDown' );\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchStartDollyPan( event ) {\n\n\t\t//console.log( 'handleTouchStartDollyPan' );\n\n\t\tif ( scope.enableZoom ) {\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tif ( scope.enablePan ) {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\tpanStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMoveDollyPan( event ) {\n\n\t\t//console.log( 'handleTouchMoveDollyPan' );\n\n\t\tif ( scope.enableZoom ) {\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n\t\t\tdollyIn( dollyDelta.y );\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t}\n\n\t\tif ( scope.enablePan ) {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\tpanEnd.set( x, y );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchEnd( event ) {\n\n\t\t//console.log( 'handleTouchEnd' );\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tswitch ( event.button ) {\n\n\t\t\tcase scope.mouseButtons.ORBIT:\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase scope.mouseButtons.ZOOM:\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase scope.mouseButtons.PAN:\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tswitch ( state ) {\n\n\t\t\tcase STATE.ROTATE:\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.DOLLY:\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.PAN:\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tscope.dispatchEvent( startEvent );\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly-pan\n\n\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchStartDollyPan( event );\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly-pan\n\n\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY_PAN ) return; // is this needed?\n\n\t\t\t\thandleTouchMoveDollyPan( event );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nTHREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nTHREE.OrbitControls.prototype.constructor = THREE.OrbitControls;\n\nObject.defineProperties( THREE.OrbitControls.prototype, {\n\n\tcenter: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\treturn this.target;\n\n\t\t}\n\n\t},\n\n\t// backward compatibility\n\n\tnoZoom: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\treturn ! this.enableZoom;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\tthis.enableZoom = ! value;\n\n\t\t}\n\n\t},\n\n\tnoRotate: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\treturn ! this.enableRotate;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\tthis.enableRotate = ! value;\n\n\t\t}\n\n\t},\n\n\tnoPan: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\treturn ! this.enablePan;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\tthis.enablePan = ! value;\n\n\t\t}\n\n\t},\n\n\tnoKeys: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\treturn ! this.enableKeys;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\tthis.enableKeys = ! value;\n\n\t\t}\n\n\t},\n\n\tstaticMoving: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\treturn ! this.enableDamping;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\tthis.enableDamping = ! value;\n\n\t\t}\n\n\t},\n\n\tdynamicDampingFactor: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\treturn this.dampingFactor;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\tthis.dampingFactor = value;\n\n\t\t}\n\n\t}\n\n} );\n\nmodule.exports = exports.default = THREE.OrbitControls\n","/**\n * @author sole / http://soledadpenades.com\n * @author mrdoob / http://mrdoob.com\n * @author Robert Eisele / http://www.xarg.org\n * @author Philippe / http://philippe.elsass.me\n * @author Robert Penner / http://www.robertpenner.com/easing_terms_of_use.html\n * @author Paul Lewis / http://www.aerotwist.com/\n * @author lechecacharro\n * @author Josh Faul / http://jocafa.com/\n * @author egraether / http://egraether.com/\n */\n\nif ( Date.now === undefined ) {\n\n Date.now = function () {\n\n return new Date().valueOf();\n\n }\n\n}\n\nvar TWEEN = TWEEN || ( function () {\n\n var _tweens = [];\n\n return {\n\n REVISION: '8',\n\n getAll: function () {\n\n return _tweens;\n\n },\n\n removeAll: function () {\n\n _tweens = [];\n\n },\n\n add: function ( tween ) {\n\n _tweens.push( tween );\n\n },\n\n remove: function ( tween ) {\n\n var i = _tweens.indexOf( tween );\n\n if ( i !== -1 ) {\n\n _tweens.splice( i, 1 );\n\n }\n\n },\n\n update: function ( time ) {\n\n if ( _tweens.length === 0 ) return false;\n\n var i = 0, numTweens = _tweens.length;\n\n time = time !== undefined ? time : Date.now();\n\n while ( i < numTweens ) {\n\n if ( _tweens[ i ].update( time ) ) {\n\n i ++;\n\n } else {\n\n _tweens.splice( i, 1 );\n\n numTweens --;\n\n }\n\n }\n\n return true;\n\n }\n\n };\n\n} )();\n\nTWEEN.Tween = function ( object ) {\n\n var _object = object;\n var _valuesStart = {};\n var _valuesEnd = {};\n var _duration = 1000;\n var _delayTime = 0;\n var _startTime = null;\n var _easingFunction = TWEEN.Easing.Linear.None;\n var _interpolationFunction = TWEEN.Interpolation.Linear;\n var _chainedTweens = [];\n var _onStartCallback = null;\n var _onStartCallbackFired = false;\n var _onUpdateCallback = null;\n var _onCompleteCallback = null;\n\n this.to = function ( properties, duration ) {\n\n if ( duration !== undefined ) {\n\n _duration = duration;\n\n }\n\n _valuesEnd = properties;\n\n return this;\n\n };\n\n this.start = function ( time ) {\n\n TWEEN.add( this );\n\n _onStartCallbackFired = false;\n\n _startTime = time !== undefined ? time : Date.now();\n _startTime += _delayTime;\n\n for ( var property in _valuesEnd ) {\n\n // This prevents the interpolation of null values or of non-existing properties\n if( _object[ property ] === null || !(property in _object) ) {\n\n continue;\n\n }\n\n // check if an Array was provided as property value\n if ( _valuesEnd[ property ] instanceof Array ) {\n\n if ( _valuesEnd[ property ].length === 0 ) {\n\n continue;\n\n }\n\n // create a local copy of the Array with the start value at the front\n _valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] );\n\n }\n\n _valuesStart[ property ] = _object[ property ];\n\n }\n\n return this;\n\n };\n\n this.stop = function () {\n\n TWEEN.remove( this );\n return this;\n\n };\n\n this.delay = function ( amount ) {\n\n _delayTime = amount;\n return this;\n\n };\n\n this.easing = function ( easing ) {\n\n _easingFunction = easing;\n return this;\n\n };\n\n this.interpolation = function ( interpolation ) {\n\n _interpolationFunction = interpolation;\n return this;\n\n };\n\n this.chain = function () {\n\n _chainedTweens = arguments;\n return this;\n\n };\n\n this.onStart = function ( callback ) {\n\n _onStartCallback = callback;\n return this;\n\n };\n\n this.onUpdate = function ( callback ) {\n\n _onUpdateCallback = callback;\n return this;\n\n };\n\n this.onComplete = function ( callback ) {\n\n _onCompleteCallback = callback;\n return this;\n\n };\n\n this.update = function ( time ) {\n\n if ( time < _startTime ) {\n\n return true;\n\n }\n\n if ( _onStartCallbackFired === false ) {\n\n if ( _onStartCallback !== null ) {\n\n _onStartCallback.call( _object );\n\n }\n\n _onStartCallbackFired = true;\n\n }\n\n var elapsed = ( time - _startTime ) / _duration;\n elapsed = elapsed > 1 ? 1 : elapsed;\n\n var value = _easingFunction( elapsed );\n\n for ( var property in _valuesStart ) {\n\n var start = _valuesStart[ property ];\n var end = _valuesEnd[ property ];\n\n if ( end instanceof Array ) {\n\n _object[ property ] = _interpolationFunction( end, value );\n\n } else {\n\n _object[ property ] = start + ( end - start ) * value;\n\n }\n\n }\n\n if ( _onUpdateCallback !== null ) {\n\n _onUpdateCallback.call( _object, value );\n\n }\n\n if ( elapsed == 1 ) {\n\n if ( _onCompleteCallback !== null ) {\n\n _onCompleteCallback.call( _object );\n\n }\n\n for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i ++ ) {\n\n _chainedTweens[ i ].start( time );\n\n }\n\n return false;\n\n }\n\n return true;\n\n };\n\n};\n\nTWEEN.Easing = {\n\n Linear: {\n\n None: function ( k ) {\n\n return k;\n\n }\n\n },\n\n Quadratic: {\n\n In: function ( k ) {\n\n return k * k;\n\n },\n\n Out: function ( k ) {\n\n return k * ( 2 - k );\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1 ) return 0.5 * k * k;\n return - 0.5 * ( --k * ( k - 2 ) - 1 );\n\n }\n\n },\n\n Cubic: {\n\n In: function ( k ) {\n\n return k * k * k;\n\n },\n\n Out: function ( k ) {\n\n return --k * k * k + 1;\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k;\n return 0.5 * ( ( k -= 2 ) * k * k + 2 );\n\n }\n\n },\n\n Quartic: {\n\n In: function ( k ) {\n\n return k * k * k * k;\n\n },\n\n Out: function ( k ) {\n\n return 1 - ( --k * k * k * k );\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k;\n return - 0.5 * ( ( k -= 2 ) * k * k * k - 2 );\n\n }\n\n },\n\n Quintic: {\n\n In: function ( k ) {\n\n return k * k * k * k * k;\n\n },\n\n Out: function ( k ) {\n\n return --k * k * k * k * k + 1;\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k;\n return 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 );\n\n }\n\n },\n\n Sinusoidal: {\n\n In: function ( k ) {\n\n return 1 - Math.cos( k * Math.PI / 2 );\n\n },\n\n Out: function ( k ) {\n\n return Math.sin( k * Math.PI / 2 );\n\n },\n\n InOut: function ( k ) {\n\n return 0.5 * ( 1 - Math.cos( Math.PI * k ) );\n\n }\n\n },\n\n Exponential: {\n\n In: function ( k ) {\n\n return k === 0 ? 0 : Math.pow( 1024, k - 1 );\n\n },\n\n Out: function ( k ) {\n\n return k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k );\n\n },\n\n InOut: function ( k ) {\n\n if ( k === 0 ) return 0;\n if ( k === 1 ) return 1;\n if ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 );\n return 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 );\n\n }\n\n },\n\n Circular: {\n\n In: function ( k ) {\n\n return 1 - Math.sqrt( 1 - k * k );\n\n },\n\n Out: function ( k ) {\n\n return Math.sqrt( 1 - ( --k * k ) );\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1);\n return 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1);\n\n }\n\n },\n\n Elastic: {\n\n In: function ( k ) {\n\n var s, a = 0.1, p = 0.4;\n if ( k === 0 ) return 0;\n if ( k === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n return - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );\n\n },\n\n Out: function ( k ) {\n\n var s, a = 0.1, p = 0.4;\n if ( k === 0 ) return 0;\n if ( k === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n\n },\n\n InOut: function ( k ) {\n\n var s, a = 0.1, p = 0.4;\n if ( k === 0 ) return 0;\n if ( k === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n if ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );\n return a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;\n\n }\n\n },\n\n Back: {\n\n In: function ( k ) {\n\n var s = 1.70158;\n return k * k * ( ( s + 1 ) * k - s );\n\n },\n\n Out: function ( k ) {\n\n var s = 1.70158;\n return --k * k * ( ( s + 1 ) * k + s ) + 1;\n\n },\n\n InOut: function ( k ) {\n\n var s = 1.70158 * 1.525;\n if ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) );\n return 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 );\n\n }\n\n },\n\n Bounce: {\n\n In: function ( k ) {\n\n return 1 - TWEEN.Easing.Bounce.Out( 1 - k );\n\n },\n\n Out: function ( k ) {\n\n if ( k < ( 1 / 2.75 ) ) {\n\n return 7.5625 * k * k;\n\n } else if ( k < ( 2 / 2.75 ) ) {\n\n return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;\n\n } else if ( k < ( 2.5 / 2.75 ) ) {\n\n return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;\n\n } else {\n\n return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;\n\n }\n\n },\n\n InOut: function ( k ) {\n\n if ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5;\n return TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5;\n\n }\n\n }\n\n};\n\nTWEEN.Interpolation = {\n\n Linear: function ( v, k ) {\n\n var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear;\n\n if ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f );\n if ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f );\n\n return fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i );\n\n },\n\n Bezier: function ( v, k ) {\n\n var b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i;\n\n for ( i = 0; i <= n; i++ ) {\n b += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i );\n }\n\n return b;\n\n },\n\n CatmullRom: function ( v, k ) {\n\n var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom;\n\n if ( v[ 0 ] === v[ m ] ) {\n\n if ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) );\n\n return fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i );\n\n } else {\n\n if ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] );\n if ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] );\n\n return fn( v[ i ? i - 1 : 0 ], v[ i ], v[ m < i + 1 ? m : i + 1 ], v[ m < i + 2 ? m : i + 2 ], f - i );\n\n }\n\n },\n\n Utils: {\n\n Linear: function ( p0, p1, t ) {\n\n return ( p1 - p0 ) * t + p0;\n\n },\n\n Bernstein: function ( n , i ) {\n\n var fc = TWEEN.Interpolation.Utils.Factorial;\n return fc( n ) / fc( i ) / fc( n - i );\n\n },\n\n Factorial: ( function () {\n\n var a = [ 1 ];\n\n return function ( n ) {\n\n var s = 1, i;\n if ( a[ n ] ) return a[ n ];\n for ( i = n; i > 1; i-- ) s *= i;\n return a[ n ] = s;\n\n };\n\n } )(),\n\n CatmullRom: function ( p0, p1, p2, p3, t ) {\n\n var v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2;\n return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n }\n\n }\n\n};\n\nmodule.exports = TWEEN;"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///external \"three\"","webpack:///./src/util/DeepClone.js","webpack:///./node_modules/tween/tween.js","webpack:///./node_modules/three-orbitcontrols/OrbitControls.js","webpack:///./src/loader/MTLLoader.js","webpack:///./src/loader/OBJLoader.js","webpack:///./src/core/Loader.js","webpack:///./src/core/lifecycle.js","webpack:///./src/core/index.js","webpack:///./src/index.js"],"names":["root","factory","exports","module","require","define","amd","a","i","window","__WEBPACK_EXTERNAL_MODULE__0__","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","undefined","__WEBPACK_AMD_DEFINE_RESULT__","copyIsArray","toString","hasOwn","class2type","[object Boolean]","[object Number]","[object String]","[object Function]","[object Array]","[object Date]","[object RegExp]","[object Object]","type","obj","String","isArray","Array","isPlainObject","nodeType","_typeof","isWindow","constructor","extend","target","options","clone","src","copy","apply","Date","now","valueOf","_tweens","TWEEN","REVISION","getAll","removeAll","add","tween","push","remove","indexOf","splice","update","time","length","numTweens","Tween","_object","_valuesStart","_valuesEnd","_duration","_delayTime","_startTime","_easingFunction","Easing","Linear","None","_interpolationFunction","Interpolation","_chainedTweens","_onStartCallback","_onStartCallbackFired","_onUpdateCallback","_onCompleteCallback","this","to","properties","duration","start","concat","stop","delay","amount","easing","interpolation","chain","arguments","onStart","callback","onUpdate","onComplete","elapsed","end","numChainedTweens","k","Quadratic","In","Out","InOut","Cubic","Quartic","Quintic","Sinusoidal","Math","cos","PI","sin","Exponential","pow","Circular","sqrt","Elastic","asin","Back","Bounce","v","f","floor","fn","Utils","Bezier","b","pw","bn","Bernstein","CatmullRom","p0","p1","fc","Factorial","p2","p3","v0","v1","t2","THREE","OrbitControls","domElement","offset","quat","quatInverse","lastPosition","lastQuaternion","document","enabled","Vector3","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","panSpeed","screenSpacePanning","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","MOUSE","MIDDLE","target0","position0","position","zoom0","zoom","getPolarAngle","spherical","phi","getAzimuthalAngle","theta","saveState","scope","reset","updateProjectionMatrix","dispatchEvent","changeEvent","state","STATE","NONE","Quaternion","setFromUnitVectors","up","inverse","sub","applyQuaternion","setFromVector3","rotateLeft","sphericalDelta","max","min","makeSafe","radius","scale","panOffset","setFromSpherical","lookAt","multiplyScalar","set","zoomChanged","distanceToSquared","EPS","dot","quaternion","dispose","removeEventListener","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","startEvent","endEvent","ROTATE","DOLLY","PAN","TOUCH_ROTATE","TOUCH_DOLLY_PAN","Spherical","rotateStart","Vector2","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","angle","rotateUp","panLeft","distance","objectMatrix","setFromMatrixColumn","panUp","crossVectors","pan","deltaX","deltaY","element","body","isPerspectiveCamera","targetDistance","tan","fov","clientHeight","matrix","isOrthographicCamera","right","left","clientWidth","top","bottom","console","warn","dollyIn","dollyScale","dollyOut","handleMouseDownPan","event","clientX","clientY","preventDefault","focus","button","ctrlKey","metaKey","shiftKey","handleMouseDownRotate","handleMouseDownDolly","addEventListener","subVectors","x","y","handleMouseMoveRotate","handleMouseMoveDolly","handleMouseMovePan","stopPropagation","handleMouseWheel","needsUpdate","keyCode","handleKeyDown","touches","pageX","pageY","handleTouchStartRotate","dx","dy","handleTouchStartDollyPan","handleTouchMoveRotate","handleTouchMoveDollyPan","EventDispatcher","defineProperties","center","noZoom","noRotate","noPan","noKeys","staticMoving","dynamicDampingFactor","default","MTLLoader","manager","_classCallCheck","url","onLoad","onProgress","onError","loader","setPath","path","load","text","parse","texturePath","setTexturePath","crossOrigin","materialOptions","lines","split","info","delimiterPattern","materialsInfo","line","trim","charAt","pos","substring","toLowerCase","ss","parseFloat","materialCreator","MaterialCreator","setCrossOrigin","setManager","setMaterials","baseUrl","materials","materialsArray","nameLookup","side","wrap","convert","converted","mn","mat","covmat","prop","save","lprop","normalizeRGB","ignoreZeroRGBs","materialName","index","createMaterial","params","setMapForType","mapType","texParams","getTextureParams","map","loadTexture","test","repeat","wrapS","wrapT","color","fromArray","specular","shininess","opacity","transparent","matParams","items","bumpScale","join","mapping","texture","Handlers","OBJLoader","OBJLoader_classCallCheck","regexp","vertexPattern","normalPattern","uvPattern","faceVertex","faceVertexUv","faceVertexUvNormal","faceVertexNormal","objectPattern","smoothingPattern","materialLibraryPattern","materialUsePattern","objects","vertices","normals","uvs","materialLibraries","startObject","fromDeclaration","previousMaterial","currentMaterial","finalize","geometry","smooth","startMaterial","libraries","previous","inherited","groupCount","material","mtllib","groupStart","groupEnd","cloned","lastMultiMaterial","mi","declared","parseVertexIndex","len","parseInt","parseNormalIndex","parseUVIndex","addVertex","dst","addVertexLine","addNormal","addUV","addUVLine","addFace","ua","ub","uc","ud","na","nb","nc","nd","id","vLen","ia","ib","ic","uvLen","nLen","addLineGeometry","vi","uvi","createParserState","replace","lineFirstChar","lineSecondChar","result","trimLeft","exec","Error","lineParts","lineVertices","lineUVs","li","llen","parts","substr","container","isLine","buffergeometry","addAttribute","Float32Array","computeVertexNormals","mesh","createdMaterials","miLen","sourceMaterial","materialLine","flatShading","addGroup","timeEnd","Loader","config","mtlLoader","objectLoader","_this","Loader_classCallCheck","Loader_defineProperty","mtlUrl","objUrl","loadMaterials","setMaterial","loadObjects","paths","_toConsumableArray","shift","children","LifeCycle","lifecycle_classCallCheck","Trunk","core_classCallCheck","_getPrototypeOf","core_defineProperty","_assertThisInitialized","clearOpacity","meshShiftTime","random","beforeInit","borderVisible","divisor","cameraPosition","z","afterRotation","rotationSpeed","pillar","border","select","light","lights","controls","documentElement","area","child","_startPositions","beforeAnimate","visible","initAreaPosition","dmName","data","userData","val","height","setHeightSlow","setHeight","sh","setInterval","h","clearInterval","intervals","isNaN","verticesNeedUpdate","minz","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","iterator","next","done","err","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","vertice","e","setMeshHighLightStatus","showDetail","objectFromMouse","uuid","current","includes","old","flag","meshMove","pagex","pagey","_this$renderer$domEle","renderer","offsetLeft","elty","offsetTop","vpx","offsetWidth","vpy","offsetHeight","vector","raycaster","setFromCamera","camera","intersects","intersectObjects","intersect","point","face","node","getOffset","parentNode","withdraw","_assertThisInitialize5","getMeshWidth","_getCoordinate2InScene","gap","withdrawPosition","tweenInOut","boxHelper","box","setFromObject","width","_assertThisInitialize6","childMapping","updateMatrixWorld","getVector2InScene","j","unproject","normalize","ray","origin","g","direction","setX","setY","core_toConsumableArray","cameraAspect","alpha","antialias","resize","shadowMap","appendChild","scene","assign","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","clearColor","setClearColor","rotateAnimate","requestAnimationFrame","rotation","render","_assertThisInitialize9","_startTweenCount","traverse","fromBufferGeometry","log","modelTexture","dealObjectInLoadCirculStart","handleModelShift","renderPillar","afterMovementMesh","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","initListener","dataObject","changeModel4DataRefresh","setSize","_config$data","newObject","handleMesh","flush","initParams"],"mappings":"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","file":"Trunk.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"three\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"three\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"three\")) : factory(root[\"three\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__0__;","define([], () => {\r\n\tvar copyIsArray,\r\n\t\ttoString = Object.prototype.toString,\r\n\t\thasOwn = Object.prototype.hasOwnProperty;\r\n\r\n\tvar class2type = {\r\n\t\t\t'[object Boolean]': 'boolean',\r\n\t\t\t'[object Number]': 'number',\r\n\t\t\t'[object String]': 'string',\r\n\t\t\t'[object Function]': 'function',\r\n\t\t\t'[object Array]': 'array',\r\n\t\t\t'[object Date]': 'date',\r\n\t\t\t'[object RegExp]': 'regExp',\r\n\t\t\t'[object Object]': 'object'\r\n\t\t},\r\n\r\n\t\ttype = function (obj) {\r\n\t\t\treturn obj == null\r\n\t\t\t\t? String(obj)\r\n\t\t\t\t: class2type[toString.call(obj)] || 'object';\r\n\t\t},\r\n\r\n\t\tisWindow = function (obj) {\r\n\t\t\treturn obj && typeof obj === 'object' && 'setInterval' in obj;\r\n\t\t},\r\n\r\n\t\tisArray = Array.isArray || function (obj) {\r\n\t\t\treturn type(obj) === 'array';\r\n\t\t},\r\n\r\n\t\tisPlainObject = function (obj) {\r\n\t\t\tif (!obj || type(obj) !== 'object' || obj.nodeType || isWindow(obj)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (obj.constructor && !hasOwn.call(obj, 'constructor') && !hasOwn.call(obj.constructor.prototype, 'isPrototypeOf')) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tvar key;\r\n\r\n\t\t\tfor (key in obj) {}\r\n\r\n\t\t\treturn key === undefined || hasOwn.call(obj, key);\r\n\t\t},\r\n\r\n\t\textend = function (target, options) {\r\n\t\t\tfor (var name in options) {\r\n\t\t\t\tvar src = target[name];\r\n\t\t\t\tvar copy = options[name];\r\n\r\n\t\t\t\tif (target === copy) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\r\n\t\t\t\t\tvar clone;\r\n\r\n\t\t\t\t\tif (copyIsArray) {\r\n\t\t\t\t\t\tcopyIsArray = false;\r\n\t\t\t\t\t\tclone = src && isArray(src)\r\n\t\t\t\t\t\t\t? src\r\n\t\t\t\t\t\t\t: [];\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclone = src && isPlainObject(src)\r\n\t\t\t\t\t\t\t? src\r\n\t\t\t\t\t\t\t: {};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttarget[name] = extend(clone, copy);\r\n\t\t\t\t} else if (copy !== undefined) {\r\n\t\t\t\t\ttarget[name] = copy;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn target;\r\n\t\t};\r\n\r\n\treturn extend;\r\n});","/**\n * @author sole / http://soledadpenades.com\n * @author mrdoob / http://mrdoob.com\n * @author Robert Eisele / http://www.xarg.org\n * @author Philippe / http://philippe.elsass.me\n * @author Robert Penner / http://www.robertpenner.com/easing_terms_of_use.html\n * @author Paul Lewis / http://www.aerotwist.com/\n * @author lechecacharro\n * @author Josh Faul / http://jocafa.com/\n * @author egraether / http://egraether.com/\n */\n\nif ( Date.now === undefined ) {\n\n Date.now = function () {\n\n return new Date().valueOf();\n\n }\n\n}\n\nvar TWEEN = TWEEN || ( function () {\n\n var _tweens = [];\n\n return {\n\n REVISION: '8',\n\n getAll: function () {\n\n return _tweens;\n\n },\n\n removeAll: function () {\n\n _tweens = [];\n\n },\n\n add: function ( tween ) {\n\n _tweens.push( tween );\n\n },\n\n remove: function ( tween ) {\n\n var i = _tweens.indexOf( tween );\n\n if ( i !== -1 ) {\n\n _tweens.splice( i, 1 );\n\n }\n\n },\n\n update: function ( time ) {\n\n if ( _tweens.length === 0 ) return false;\n\n var i = 0, numTweens = _tweens.length;\n\n time = time !== undefined ? time : Date.now();\n\n while ( i < numTweens ) {\n\n if ( _tweens[ i ].update( time ) ) {\n\n i ++;\n\n } else {\n\n _tweens.splice( i, 1 );\n\n numTweens --;\n\n }\n\n }\n\n return true;\n\n }\n\n };\n\n} )();\n\nTWEEN.Tween = function ( object ) {\n\n var _object = object;\n var _valuesStart = {};\n var _valuesEnd = {};\n var _duration = 1000;\n var _delayTime = 0;\n var _startTime = null;\n var _easingFunction = TWEEN.Easing.Linear.None;\n var _interpolationFunction = TWEEN.Interpolation.Linear;\n var _chainedTweens = [];\n var _onStartCallback = null;\n var _onStartCallbackFired = false;\n var _onUpdateCallback = null;\n var _onCompleteCallback = null;\n\n this.to = function ( properties, duration ) {\n\n if ( duration !== undefined ) {\n\n _duration = duration;\n\n }\n\n _valuesEnd = properties;\n\n return this;\n\n };\n\n this.start = function ( time ) {\n\n TWEEN.add( this );\n\n _onStartCallbackFired = false;\n\n _startTime = time !== undefined ? time : Date.now();\n _startTime += _delayTime;\n\n for ( var property in _valuesEnd ) {\n\n // This prevents the interpolation of null values or of non-existing properties\n if( _object[ property ] === null || !(property in _object) ) {\n\n continue;\n\n }\n\n // check if an Array was provided as property value\n if ( _valuesEnd[ property ] instanceof Array ) {\n\n if ( _valuesEnd[ property ].length === 0 ) {\n\n continue;\n\n }\n\n // create a local copy of the Array with the start value at the front\n _valuesEnd[ property ] = [ _object[ property ] ].concat( _valuesEnd[ property ] );\n\n }\n\n _valuesStart[ property ] = _object[ property ];\n\n }\n\n return this;\n\n };\n\n this.stop = function () {\n\n TWEEN.remove( this );\n return this;\n\n };\n\n this.delay = function ( amount ) {\n\n _delayTime = amount;\n return this;\n\n };\n\n this.easing = function ( easing ) {\n\n _easingFunction = easing;\n return this;\n\n };\n\n this.interpolation = function ( interpolation ) {\n\n _interpolationFunction = interpolation;\n return this;\n\n };\n\n this.chain = function () {\n\n _chainedTweens = arguments;\n return this;\n\n };\n\n this.onStart = function ( callback ) {\n\n _onStartCallback = callback;\n return this;\n\n };\n\n this.onUpdate = function ( callback ) {\n\n _onUpdateCallback = callback;\n return this;\n\n };\n\n this.onComplete = function ( callback ) {\n\n _onCompleteCallback = callback;\n return this;\n\n };\n\n this.update = function ( time ) {\n\n if ( time < _startTime ) {\n\n return true;\n\n }\n\n if ( _onStartCallbackFired === false ) {\n\n if ( _onStartCallback !== null ) {\n\n _onStartCallback.call( _object );\n\n }\n\n _onStartCallbackFired = true;\n\n }\n\n var elapsed = ( time - _startTime ) / _duration;\n elapsed = elapsed > 1 ? 1 : elapsed;\n\n var value = _easingFunction( elapsed );\n\n for ( var property in _valuesStart ) {\n\n var start = _valuesStart[ property ];\n var end = _valuesEnd[ property ];\n\n if ( end instanceof Array ) {\n\n _object[ property ] = _interpolationFunction( end, value );\n\n } else {\n\n _object[ property ] = start + ( end - start ) * value;\n\n }\n\n }\n\n if ( _onUpdateCallback !== null ) {\n\n _onUpdateCallback.call( _object, value );\n\n }\n\n if ( elapsed == 1 ) {\n\n if ( _onCompleteCallback !== null ) {\n\n _onCompleteCallback.call( _object );\n\n }\n\n for ( var i = 0, numChainedTweens = _chainedTweens.length; i < numChainedTweens; i ++ ) {\n\n _chainedTweens[ i ].start( time );\n\n }\n\n return false;\n\n }\n\n return true;\n\n };\n\n};\n\nTWEEN.Easing = {\n\n Linear: {\n\n None: function ( k ) {\n\n return k;\n\n }\n\n },\n\n Quadratic: {\n\n In: function ( k ) {\n\n return k * k;\n\n },\n\n Out: function ( k ) {\n\n return k * ( 2 - k );\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1 ) return 0.5 * k * k;\n return - 0.5 * ( --k * ( k - 2 ) - 1 );\n\n }\n\n },\n\n Cubic: {\n\n In: function ( k ) {\n\n return k * k * k;\n\n },\n\n Out: function ( k ) {\n\n return --k * k * k + 1;\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k;\n return 0.5 * ( ( k -= 2 ) * k * k + 2 );\n\n }\n\n },\n\n Quartic: {\n\n In: function ( k ) {\n\n return k * k * k * k;\n\n },\n\n Out: function ( k ) {\n\n return 1 - ( --k * k * k * k );\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1) return 0.5 * k * k * k * k;\n return - 0.5 * ( ( k -= 2 ) * k * k * k - 2 );\n\n }\n\n },\n\n Quintic: {\n\n In: function ( k ) {\n\n return k * k * k * k * k;\n\n },\n\n Out: function ( k ) {\n\n return --k * k * k * k * k + 1;\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1 ) return 0.5 * k * k * k * k * k;\n return 0.5 * ( ( k -= 2 ) * k * k * k * k + 2 );\n\n }\n\n },\n\n Sinusoidal: {\n\n In: function ( k ) {\n\n return 1 - Math.cos( k * Math.PI / 2 );\n\n },\n\n Out: function ( k ) {\n\n return Math.sin( k * Math.PI / 2 );\n\n },\n\n InOut: function ( k ) {\n\n return 0.5 * ( 1 - Math.cos( Math.PI * k ) );\n\n }\n\n },\n\n Exponential: {\n\n In: function ( k ) {\n\n return k === 0 ? 0 : Math.pow( 1024, k - 1 );\n\n },\n\n Out: function ( k ) {\n\n return k === 1 ? 1 : 1 - Math.pow( 2, - 10 * k );\n\n },\n\n InOut: function ( k ) {\n\n if ( k === 0 ) return 0;\n if ( k === 1 ) return 1;\n if ( ( k *= 2 ) < 1 ) return 0.5 * Math.pow( 1024, k - 1 );\n return 0.5 * ( - Math.pow( 2, - 10 * ( k - 1 ) ) + 2 );\n\n }\n\n },\n\n Circular: {\n\n In: function ( k ) {\n\n return 1 - Math.sqrt( 1 - k * k );\n\n },\n\n Out: function ( k ) {\n\n return Math.sqrt( 1 - ( --k * k ) );\n\n },\n\n InOut: function ( k ) {\n\n if ( ( k *= 2 ) < 1) return - 0.5 * ( Math.sqrt( 1 - k * k) - 1);\n return 0.5 * ( Math.sqrt( 1 - ( k -= 2) * k) + 1);\n\n }\n\n },\n\n Elastic: {\n\n In: function ( k ) {\n\n var s, a = 0.1, p = 0.4;\n if ( k === 0 ) return 0;\n if ( k === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n return - ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );\n\n },\n\n Out: function ( k ) {\n\n var s, a = 0.1, p = 0.4;\n if ( k === 0 ) return 0;\n if ( k === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n return ( a * Math.pow( 2, - 10 * k) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) + 1 );\n\n },\n\n InOut: function ( k ) {\n\n var s, a = 0.1, p = 0.4;\n if ( k === 0 ) return 0;\n if ( k === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n if ( ( k *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) );\n return a * Math.pow( 2, -10 * ( k -= 1 ) ) * Math.sin( ( k - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;\n\n }\n\n },\n\n Back: {\n\n In: function ( k ) {\n\n var s = 1.70158;\n return k * k * ( ( s + 1 ) * k - s );\n\n },\n\n Out: function ( k ) {\n\n var s = 1.70158;\n return --k * k * ( ( s + 1 ) * k + s ) + 1;\n\n },\n\n InOut: function ( k ) {\n\n var s = 1.70158 * 1.525;\n if ( ( k *= 2 ) < 1 ) return 0.5 * ( k * k * ( ( s + 1 ) * k - s ) );\n return 0.5 * ( ( k -= 2 ) * k * ( ( s + 1 ) * k + s ) + 2 );\n\n }\n\n },\n\n Bounce: {\n\n In: function ( k ) {\n\n return 1 - TWEEN.Easing.Bounce.Out( 1 - k );\n\n },\n\n Out: function ( k ) {\n\n if ( k < ( 1 / 2.75 ) ) {\n\n return 7.5625 * k * k;\n\n } else if ( k < ( 2 / 2.75 ) ) {\n\n return 7.5625 * ( k -= ( 1.5 / 2.75 ) ) * k + 0.75;\n\n } else if ( k < ( 2.5 / 2.75 ) ) {\n\n return 7.5625 * ( k -= ( 2.25 / 2.75 ) ) * k + 0.9375;\n\n } else {\n\n return 7.5625 * ( k -= ( 2.625 / 2.75 ) ) * k + 0.984375;\n\n }\n\n },\n\n InOut: function ( k ) {\n\n if ( k < 0.5 ) return TWEEN.Easing.Bounce.In( k * 2 ) * 0.5;\n return TWEEN.Easing.Bounce.Out( k * 2 - 1 ) * 0.5 + 0.5;\n\n }\n\n }\n\n};\n\nTWEEN.Interpolation = {\n\n Linear: function ( v, k ) {\n\n var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.Linear;\n\n if ( k < 0 ) return fn( v[ 0 ], v[ 1 ], f );\n if ( k > 1 ) return fn( v[ m ], v[ m - 1 ], m - f );\n\n return fn( v[ i ], v[ i + 1 > m ? m : i + 1 ], f - i );\n\n },\n\n Bezier: function ( v, k ) {\n\n var b = 0, n = v.length - 1, pw = Math.pow, bn = TWEEN.Interpolation.Utils.Bernstein, i;\n\n for ( i = 0; i <= n; i++ ) {\n b += pw( 1 - k, n - i ) * pw( k, i ) * v[ i ] * bn( n, i );\n }\n\n return b;\n\n },\n\n CatmullRom: function ( v, k ) {\n\n var m = v.length - 1, f = m * k, i = Math.floor( f ), fn = TWEEN.Interpolation.Utils.CatmullRom;\n\n if ( v[ 0 ] === v[ m ] ) {\n\n if ( k < 0 ) i = Math.floor( f = m * ( 1 + k ) );\n\n return fn( v[ ( i - 1 + m ) % m ], v[ i ], v[ ( i + 1 ) % m ], v[ ( i + 2 ) % m ], f - i );\n\n } else {\n\n if ( k < 0 ) return v[ 0 ] - ( fn( v[ 0 ], v[ 0 ], v[ 1 ], v[ 1 ], -f ) - v[ 0 ] );\n if ( k > 1 ) return v[ m ] - ( fn( v[ m ], v[ m ], v[ m - 1 ], v[ m - 1 ], f - m ) - v[ m ] );\n\n return fn( v[ i ? i - 1 : 0 ], v[ i ], v[ m < i + 1 ? m : i + 1 ], v[ m < i + 2 ? m : i + 2 ], f - i );\n\n }\n\n },\n\n Utils: {\n\n Linear: function ( p0, p1, t ) {\n\n return ( p1 - p0 ) * t + p0;\n\n },\n\n Bernstein: function ( n , i ) {\n\n var fc = TWEEN.Interpolation.Utils.Factorial;\n return fc( n ) / fc( i ) / fc( n - i );\n\n },\n\n Factorial: ( function () {\n\n var a = [ 1 ];\n\n return function ( n ) {\n\n var s = 1, i;\n if ( a[ n ] ) return a[ n ];\n for ( i = n; i > 1; i-- ) s *= i;\n return a[ n ] = s;\n\n };\n\n } )(),\n\n CatmullRom: function ( p0, p1, p2, p3, t ) {\n\n var v0 = ( p2 - p0 ) * 0.5, v1 = ( p3 - p1 ) * 0.5, t2 = t * t, t3 = t * t2;\n return ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n }\n\n }\n\n};\n\nmodule.exports = TWEEN;","/* three-orbitcontrols addendum */ var THREE = require('three');\n/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nTHREE.OrbitControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new THREE.Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.25;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.panSpeed = 1.0;\n\tthis.screenSpacePanning = false; // if true, pan in screen-space\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { LEFT: THREE.MOUSE.LEFT, MIDDLE: THREE.MOUSE.MIDDLE, RIGHT: THREE.MOUSE.RIGHT };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn spherical.phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn spherical.theta;\n\n\t};\n\n\tthis.saveState = function () {\n\n\t\tscope.target0.copy( scope.target );\n\t\tscope.position0.copy( scope.object.position );\n\t\tscope.zoom0 = scope.object.zoom;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function () {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new THREE.Vector3();\n\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\treturn function update() {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\t\t\tspherical.setFromVector3( offset );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t// restrict theta to be between desired limits\n\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\tspherical.makeSafe();\n\n\n\t\t\tspherical.radius *= scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t// move target to panned location\n\t\t\tscope.target.add( panOffset );\n\n\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\tpanOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function () {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = { NONE: - 1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_DOLLY_PAN: 4 };\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar spherical = new THREE.Spherical();\n\tvar sphericalDelta = new THREE.Spherical();\n\n\tvar scale = 1;\n\tvar panOffset = new THREE.Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tsphericalDelta.theta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tsphericalDelta.phi -= angle;\n\n\t}\n\n\tvar panLeft = function () {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\tv.multiplyScalar( - distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\tvar panUp = function () {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\tif ( scope.screenSpacePanning === true ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t\tv.crossVectors( scope.object.up, v );\n\n\t\t\t}\n\n\t\t\tv.multiplyScalar( distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function () {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\treturn function pan( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\t//console.log( 'handleMouseDownPan' );\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\n\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\t//console.log( 'handleMouseMovePan' );\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( event ) {\n\n\t\t// console.log( 'handleMouseUp' );\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\t// console.log( 'handleMouseWheel' );\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\t// console.log( 'handleKeyDown' );\n\n\t\tvar needsUpdate = false;\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\tevent.preventDefault();\n\n\t\t\tscope.update();\n\n\t\t}\n\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchStartDollyPan( event ) {\n\n\t\t//console.log( 'handleTouchStartDollyPan' );\n\n\t\tif ( scope.enableZoom ) {\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tif ( scope.enablePan ) {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\tpanStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMoveDollyPan( event ) {\n\n\t\t//console.log( 'handleTouchMoveDollyPan' );\n\n\t\tif ( scope.enableZoom ) {\n\n\t\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n\t\t\tdollyIn( dollyDelta.y );\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t}\n\n\t\tif ( scope.enablePan ) {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\tpanEnd.set( x, y );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchEnd( event ) {\n\n\t\t//console.log( 'handleTouchEnd' );\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\t// Prevent the browser from scrolling.\n\n\t\tevent.preventDefault();\n\n\t\t// Manually set the focus since calling preventDefault above\n\t\t// prevents the browser from setting it automatically.\n\n\t\tscope.domElement.focus ? scope.domElement.focus() : window.focus();\n\n\t\tswitch ( event.button ) {\n\n\t\t\tcase scope.mouseButtons.LEFT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase scope.mouseButtons.MIDDLE:\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase scope.mouseButtons.RIGHT:\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tswitch ( state ) {\n\n\t\t\tcase STATE.ROTATE:\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.DOLLY:\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.PAN:\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tscope.dispatchEvent( startEvent );\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly-pan\n\n\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchStartDollyPan( event );\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly-pan\n\n\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY_PAN ) return; // is this needed?\n\n\t\t\t\thandleTouchMoveDollyPan( event );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nTHREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nTHREE.OrbitControls.prototype.constructor = THREE.OrbitControls;\n\nObject.defineProperties( THREE.OrbitControls.prototype, {\n\n\tcenter: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\treturn this.target;\n\n\t\t}\n\n\t},\n\n\t// backward compatibility\n\n\tnoZoom: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\treturn ! this.enableZoom;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\tthis.enableZoom = ! value;\n\n\t\t}\n\n\t},\n\n\tnoRotate: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\treturn ! this.enableRotate;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\tthis.enableRotate = ! value;\n\n\t\t}\n\n\t},\n\n\tnoPan: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\treturn ! this.enablePan;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\tthis.enablePan = ! value;\n\n\t\t}\n\n\t},\n\n\tnoKeys: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\treturn ! this.enableKeys;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\tthis.enableKeys = ! value;\n\n\t\t}\n\n\t},\n\n\tstaticMoving: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\treturn ! this.enableDamping;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\tthis.enableDamping = ! value;\n\n\t\t}\n\n\t},\n\n\tdynamicDampingFactor: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\treturn this.dampingFactor;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\tthis.dampingFactor = value;\n\n\t\t}\n\n\t}\n\n} );\n/* three-orbitcontrols addendum */ module.exports = exports.default = THREE.OrbitControls;\n","/**\r\n * Loads a Wavefront .mtl file specifying materials\r\n *\r\n * @author angelxuanchang\r\n * edited by lucascassiano as an ES6 module - http://lucascassiano.github.io\r\n */\r\nimport * as THREE from 'three';\r\n\r\nclass MTLLoader {\r\n\r\n\tconstructor (manager) {\r\n\t\tthis.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Loads and parses a MTL asset from a URL.\r\n\t *\r\n\t * @param {String} url - URL to the MTL file.\r\n\t * @param {Function} [onLoad] - Callback invoked with the loaded object.\r\n\t * @param {Function} [onProgress] - Callback for download progress.\r\n\t * @param {Function} [onError] - Callback for download errors.\r\n\t *\r\n\t * @see setPath setTexturePath\r\n\t *\r\n\t * @note In order for relative texture references to resolve correctly\r\n\t * you must call setPath and/or setTexturePath explicitly prior to load.\r\n\t */\r\n\tload (url, onLoad, onProgress, onError) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar loader = new THREE.FileLoader(this.manager);\r\n\r\n\t\tloader.setPath(this.path);\r\n\t\tloader.load(url, (text) => {\r\n\r\n\t\t\tonLoad(scope.parse(text));\r\n\r\n\t\t}, onProgress, onError);\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Set base path for resolving references.\r\n\t * If set this path will be prepended to each loaded and found reference.\r\n\t *\r\n\t * @see setTexturePath\r\n\t * @param {String} path\r\n\t *\r\n\t * @example\r\n\t * mtlLoader.setPath( 'assets/obj/' );\r\n\t * mtlLoader.load( 'my.mtl', ... );\r\n\t */\r\n\tsetPath (path) {\r\n\t\tthis.path = path;\r\n\t}\r\n\r\n\t/**\r\n\t * Set base path for resolving texture references.\r\n\t * If set this path will be prepended found texture reference.\r\n\t * If not set and setPath is, it will be used as texture base path.\r\n\t *\r\n\t * @see setPath\r\n\t * @param {String} path\r\n\t *\r\n\t * @example\r\n\t * mtlLoader.setPath( 'assets/obj/' );\r\n\t * mtlLoader.setTexturePath( 'assets/textures/' );\r\n\t * mtlLoader.load( 'my.mtl', ... );\r\n\t */\r\n\tsetTexturePath (path) {\r\n\r\n\t\tthis.texturePath = path;\r\n\r\n\t}\r\n\r\n\tsetBaseUrl (path) {\r\n\r\n\t\tconsole.warn('THREE.MTLLoader: .setBaseUrl() is deprecated. Use .setTexturePath( path ) for texture path or .setPath( path ) for general base path instead.');\r\n\r\n\t\tthis.setTexturePath(path);\r\n\r\n\t}\r\n\r\n\tsetCrossOrigin (value) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t}\r\n\r\n\tsetMaterialOptions (value) {\r\n\r\n\t\tthis.materialOptions = value;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Parses a MTL file.\r\n\t *\r\n\t * @param {String} text - Content of MTL file\r\n\t * @return {THREE.MTLLoader.MaterialCreator}\r\n\t *\r\n\t * @see setPath setTexturePath\r\n\t *\r\n\t * @note In order for relative texture references to resolve correctly\r\n\t * you must call setPath and/or setTexturePath explicitly prior to parse.\r\n\t */\r\n\tparse (text) {\r\n\r\n\t\tvar lines = text.split('\\n');\r\n\t\tvar info = {};\r\n\t\tvar delimiterPattern = /\\s+/;\r\n\t\tvar materialsInfo = {};\r\n\r\n\t\tfor (var i = 0; i < lines.length; i++) {\r\n\r\n\t\t\tvar line = lines[i];\r\n\r\n\t\t\tline = line.trim();\r\n\r\n\t\t\tif (line.length === 0 || line.charAt(0) === '#') {\r\n\r\n\t\t\t\t// Blank line or comment ignore\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t}\r\n\r\n\t\t\tvar pos = line.indexOf(' ');\r\n\r\n\t\t\tvar key = (pos >= 0) ? line.substring(0, pos) : line;\r\n\r\n\t\t\tkey = key.toLowerCase();\r\n\r\n\t\t\tvar value = (pos >= 0) ? line.substring(pos + 1) : '';\r\n\r\n\t\t\tvalue = value.trim();\r\n\r\n\t\t\tif (key === 'newmtl') {\r\n\r\n\t\t\t\t// New material\r\n\r\n\t\t\t\tinfo = { name: value };\r\n\t\t\t\tmaterialsInfo[value] = info;\r\n\r\n\t\t\t} else if (info) {\r\n\r\n\t\t\t\tif (key === 'ka' || key === 'kd' || key === 'ks') {\r\n\r\n\t\t\t\t\tvar ss = value.split(delimiterPattern, 3);\r\n\r\n\t\t\t\t\tinfo[key] = [parseFloat(ss[0]), parseFloat(ss[1]), parseFloat(ss[2])];\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tinfo[key] = value;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tvar materialCreator = new MaterialCreator(this.texturePath || this.path, this.materialOptions);\r\n\r\n\t\tmaterialCreator.setCrossOrigin(this.crossOrigin);\r\n\t\tmaterialCreator.setManager(this.manager);\r\n\t\tmaterialCreator.setMaterials(materialsInfo);\r\n\t\treturn materialCreator;\r\n\r\n\t}\r\n}\r\n\r\nclass MaterialCreator {\r\n\tconstructor (baseUrl, options) {\r\n\r\n\t\tthis.baseUrl = baseUrl || '';\r\n\t\tthis.options = options;\r\n\t\tthis.materialsInfo = {};\r\n\t\tthis.materials = {};\r\n\t\tthis.materialsArray = [];\r\n\t\tthis.nameLookup = {};\r\n\r\n\t\tthis.side = (this.options && this.options.side) ? this.options.side : THREE.FrontSide;\r\n\t\tthis.wrap = (this.options && this.options.wrap) ? this.options.wrap : THREE.RepeatWrapping;\r\n\r\n\t}\r\n\r\n\tcrossOrigin = 'Anonymous';\r\n\r\n\tsetCrossOrigin (value) {\r\n\r\n\t\tthis.crossOrigin = value;\r\n\r\n\t}\r\n\r\n\tsetManager (value) {\r\n\r\n\t\tthis.manager = value;\r\n\r\n\t}\r\n\r\n\tsetMaterials (materialsInfo) {\r\n\r\n\t\tthis.materialsInfo = this.convert(materialsInfo);\r\n\t\tthis.materials = {};\r\n\t\tthis.materialsArray = [];\r\n\t\tthis.nameLookup = {};\r\n\r\n\t}\r\n\r\n\tconvert (materialsInfo) {\r\n\r\n\t\tif (!this.options) return materialsInfo;\r\n\r\n\t\tvar converted = {};\r\n\r\n\t\tfor (var mn in materialsInfo) {\r\n\r\n\t\t\t// Convert materials info into normalized form based on options\r\n\r\n\t\t\tvar mat = materialsInfo[mn];\r\n\r\n\t\t\tvar covmat = {};\r\n\r\n\t\t\tconverted[mn] = covmat;\r\n\r\n\t\t\tfor (var prop in mat) {\r\n\r\n\t\t\t\tvar save = true;\r\n\t\t\t\tvar value = mat[prop];\r\n\t\t\t\tvar lprop = prop.toLowerCase();\r\n\r\n\t\t\t\tswitch (lprop) {\r\n\r\n\t\t\t\t\tcase 'kd':\r\n\t\t\t\t\tcase 'ka':\r\n\t\t\t\t\tcase 'ks':\r\n\r\n\t\t\t\t\t\t// Diffuse color (color under white light) using RGB values\r\n\r\n\t\t\t\t\t\tif (this.options && this.options.normalizeRGB) {\r\n\r\n\t\t\t\t\t\t\tvalue = [value[0] / 255, value[1] / 255, value[2] / 255];\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (this.options && this.options.ignoreZeroRGBs) {\r\n\r\n\t\t\t\t\t\t\tif (value[0] === 0 && value[1] === 0 && value[2] === 0) {\r\n\r\n\t\t\t\t\t\t\t\t// ignore\r\n\r\n\t\t\t\t\t\t\t\tsave = false;\r\n\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tdefault:\r\n\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (save) {\r\n\r\n\t\t\t\t\tcovmat[lprop] = value;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn converted;\r\n\r\n\t}\r\n\r\n\tpreload () {\r\n\r\n\t\tfor (var mn in this.materialsInfo) {\r\n\r\n\t\t\tthis.create(mn);\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgetIndex (materialName) {\r\n\r\n\t\treturn this.nameLookup[materialName];\r\n\r\n\t}\r\n\r\n\tgetAsArray () {\r\n\r\n\t\tvar index = 0;\r\n\r\n\t\tfor (var mn in this.materialsInfo) {\r\n\r\n\t\t\tthis.materialsArray[index] = this.create(mn);\r\n\t\t\tthis.nameLookup[mn] = index;\r\n\t\t\tindex++;\r\n\r\n\t\t}\r\n\r\n\t\treturn this.materialsArray;\r\n\r\n\t}\r\n\r\n\tcreate (materialName) {\r\n\r\n\t\tif (this.materials[materialName] === undefined) {\r\n\r\n\t\t\tthis.createMaterial(materialName);\r\n\r\n\t\t}\r\n\r\n\t\treturn this.materials[materialName];\r\n\r\n\t}\r\n\r\n\tcreateMaterial (materialName) {\r\n\r\n\t\t// Create material\r\n\r\n\t\tvar scope = this;\r\n\t\tvar mat = this.materialsInfo[materialName];\r\n\t\tvar params = {\r\n\r\n\t\t\tname: materialName,\r\n\t\t\tside: this.side\r\n\r\n\t\t};\r\n\r\n\t\tfunction resolveURL (baseUrl, url) {\r\n\r\n\t\t\tif (typeof url !== 'string' || url === '')\r\n\t\t\t\treturn '';\r\n\r\n\t\t\t// Absolute URL\r\n\t\t\tif (/^https?:\\/\\//i.test(url)) return url;\r\n\r\n\t\t\treturn baseUrl + url;\r\n\r\n\t\t}\r\n\r\n\t\tfunction setMapForType (mapType, value) {\r\n\r\n\t\t\tif (params[mapType]) return; // Keep the first encountered texture\r\n\r\n\t\t\tvar texParams = scope.getTextureParams(value, params);\r\n\t\t\tvar map = scope.loadTexture(resolveURL(scope.baseUrl, texParams.url));\r\n\r\n\t\t\tmap.repeat.copy(texParams.scale);\r\n\t\t\tmap.offset.copy(texParams.offset);\r\n\r\n\t\t\tmap.wrapS = scope.wrap;\r\n\t\t\tmap.wrapT = scope.wrap;\r\n\r\n\t\t\tparams[mapType] = map;\r\n\r\n\t\t}\r\n\r\n\t\tfor (var prop in mat) {\r\n\r\n\t\t\tvar value = mat[prop];\r\n\t\t\tvar n;\r\n\r\n\t\t\tif (value === '') continue;\r\n\r\n\t\t\tswitch (prop.toLowerCase()) {\r\n\r\n\t\t\t\t// Ns is material specular exponent\r\n\r\n\t\t\t\tcase 'kd':\r\n\r\n\t\t\t\t\t// Diffuse color (color under white light) using RGB values\r\n\r\n\t\t\t\t\tparams.color = new THREE.Color().fromArray(value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'ks':\r\n\r\n\t\t\t\t\t// Specular color (color when light is reflected from shiny surface) using RGB values\r\n\t\t\t\t\tparams.specular = new THREE.Color().fromArray(value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'map_kd':\r\n\r\n\t\t\t\t\t// Diffuse texture map\r\n\r\n\t\t\t\t\tsetMapForType('map', value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'map_ks':\r\n\r\n\t\t\t\t\t// Specular map\r\n\r\n\t\t\t\t\tsetMapForType('specularMap', value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'norm':\r\n\r\n\t\t\t\t\tsetMapForType('normalMap', value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'map_bump':\r\n\t\t\t\tcase 'bump':\r\n\r\n\t\t\t\t\t// Bump texture map\r\n\r\n\t\t\t\t\tsetMapForType('bumpMap', value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'ns':\r\n\r\n\t\t\t\t\t// The specular exponent (defines the focus of the specular highlight)\r\n\t\t\t\t\t// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.\r\n\r\n\t\t\t\t\tparams.shininess = parseFloat(value);\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'd':\r\n\t\t\t\t\tn = parseFloat(value);\r\n\r\n\t\t\t\t\tif (n < 1) {\r\n\r\n\t\t\t\t\t\tparams.opacity = n;\r\n\t\t\t\t\t\tparams.transparent = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase 'tr':\r\n\t\t\t\t\tn = parseFloat(value);\r\n\r\n\t\t\t\t\tif (n > 0) {\r\n\r\n\t\t\t\t\t\tparams.opacity = 1 - n;\r\n\t\t\t\t\t\tparams.transparent = true;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis.materials[materialName] = new THREE.MeshPhongMaterial(params);\r\n\t\treturn this.materials[materialName];\r\n\r\n\t}\r\n\r\n\tgetTextureParams (value, matParams) {\r\n\r\n\t\tvar texParams = {\r\n\r\n\t\t\tscale: new THREE.Vector2(1, 1),\r\n\t\t\toffset: new THREE.Vector2(0, 0)\r\n\r\n\t\t};\r\n\r\n\t\tvar items = value.split(/\\s+/);\r\n\t\tvar pos;\r\n\r\n\t\tpos = items.indexOf('-bm');\r\n\r\n\t\tif (pos >= 0) {\r\n\r\n\t\t\tmatParams.bumpScale = parseFloat(items[pos + 1]);\r\n\t\t\titems.splice(pos, 2);\r\n\r\n\t\t}\r\n\r\n\t\tpos = items.indexOf('-s');\r\n\r\n\t\tif (pos >= 0) {\r\n\r\n\t\t\ttexParams.scale.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2]));\r\n\t\t\titems.splice(pos, 4); // we expect 3 parameters here!\r\n\r\n\t\t}\r\n\r\n\t\tpos = items.indexOf('-o');\r\n\r\n\t\tif (pos >= 0) {\r\n\r\n\t\t\ttexParams.offset.set(parseFloat(items[pos + 1]), parseFloat(items[pos + 2]));\r\n\t\t\titems.splice(pos, 4); // we expect 3 parameters here!\r\n\r\n\t\t}\r\n\r\n\t\ttexParams.url = items.join(' ').trim();\r\n\t\treturn texParams;\r\n\r\n\t}\r\n\r\n\tloadTexture (url, mapping, onLoad, onProgress, onError) {\r\n\r\n\t\tvar texture;\r\n\t\tvar loader = THREE.Loader.Handlers.get(url);\r\n\t\tvar manager = (this.manager !== undefined) ? this.manager : THREE.DefaultLoadingManager;\r\n\r\n\t\tif (loader === null) {\r\n\r\n\t\t\tloader = new THREE.TextureLoader(manager);\r\n\r\n\t\t}\r\n\r\n\t\tif (loader.setCrossOrigin) loader.setCrossOrigin(this.crossOrigin);\r\n\t\ttexture = loader.load(url, onLoad, onProgress, onError);\r\n\r\n\t\tif (mapping !== undefined) texture.mapping = mapping;\r\n\r\n\t\treturn texture;\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport default MTLLoader;","/**\r\n * @author lucascassiano / http://lucascassiano.github.io\r\n * @edited as an ES6 module based on script from mrdoob / http://mrdoob.com/\r\n */\r\n\r\nimport * as THREE from 'three';\r\n\r\nclass OBJLoader {\r\n\tconstructor (manager) {\r\n\t\tthis.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager;\r\n\r\n\t\tthis.materials = null;\r\n\r\n\t\tthis.regexp = {\r\n\t\t\t// v float float float\r\n\t\t\tvertexPattern: /^v\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)/,\r\n\t\t\t// vn float float float\r\n\t\t\tnormalPattern: /^vn\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)/,\r\n\t\t\t// vt float float\r\n\t\t\tuvPattern: /^vt\\s+([\\d|.|+|\\-|e|E]+)\\s+([\\d|.|+|\\-|e|E]+)/,\r\n\t\t\t// f vertex vertex vertex\r\n\t\t\tfaceVertex: /^f\\s+(-?\\d+)\\s+(-?\\d+)\\s+(-?\\d+)(?:\\s+(-?\\d+))?/,\r\n\t\t\t// f vertex/uv vertex/uv vertex/uv\r\n\t\t\tfaceVertexUv: /^f\\s+(-?\\d+)\\/(-?\\d+)\\s+(-?\\d+)\\/(-?\\d+)\\s+(-?\\d+)\\/(-?\\d+)(?:\\s+(-?\\d+)\\/(-?\\d+))?/,\r\n\t\t\t// f vertex/uv/normal vertex/uv/normal vertex/uv/normal\r\n\t\t\tfaceVertexUvNormal: /^f\\s+(-?\\d+)\\/(-?\\d+)\\/(-?\\d+)\\s+(-?\\d+)\\/(-?\\d+)\\/(-?\\d+)\\s+(-?\\d+)\\/(-?\\d+)\\/(-?\\d+)(?:\\s+(-?\\d+)\\/(-?\\d+)\\/(-?\\d+))?/,\r\n\t\t\t// f vertex//normal vertex//normal vertex//normal\r\n\t\t\tfaceVertexNormal: /^f\\s+(-?\\d+)\\/\\/(-?\\d+)\\s+(-?\\d+)\\/\\/(-?\\d+)\\s+(-?\\d+)\\/\\/(-?\\d+)(?:\\s+(-?\\d+)\\/\\/(-?\\d+))?/,\r\n\t\t\t// o object_name | g group_name\r\n\t\t\tobjectPattern: /^[og]\\s*(.+)?/,\r\n\t\t\t// s boolean\r\n\t\t\tsmoothingPattern: /^s\\s+(\\d+|on|off)/,\r\n\t\t\t// mtllib file_reference\r\n\t\t\tmaterialLibraryPattern: /^mtllib /,\r\n\t\t\t// usemtl material_name\r\n\t\t\tmaterialUsePattern: /^usemtl /\r\n\t\t};\r\n\t}\r\n\r\n\tload (url, onLoad, onProgress, onError) {\r\n\r\n\t\tvar scope = this;\r\n\r\n\t\tvar loader = new THREE.FileLoader(scope.manager);\r\n\r\n\t\tloader.setPath(this.path);\r\n\t\tloader.load(url, (text) => {\r\n\r\n\t\t\tonLoad(scope.parse(text));\r\n\r\n\t\t}, onProgress, onError);\r\n\r\n\t}\r\n\r\n\tsetPath (value) {\r\n\r\n\t\tthis.path = value;\r\n\r\n\t}\r\n\r\n\tsetMaterials (materials) {\r\n\r\n\t\tthis.materials = materials;\r\n\r\n\t}\r\n\r\n\tcreateParserState () {\r\n\r\n\t\tvar state = {\r\n\t\t\tobjects: [],\r\n\t\t\tobject: {},\r\n\r\n\t\t\tvertices: [],\r\n\t\t\tnormals: [],\r\n\t\t\tuvs: [],\r\n\r\n\t\t\tmaterialLibraries: [],\r\n\r\n\t\t\tstartObject: function (name, fromDeclaration) {\r\n\r\n\t\t\t\t// If the current object (initial from reset) is not from a g/o declaration in the parsed\r\n\t\t\t\t// file. We need to use it for the first parsed g/o to keep things in sync.\r\n\t\t\t\tif (this.object && this.object.fromDeclaration === false) {\r\n\r\n\t\t\t\t\tthis.object.name = name;\r\n\t\t\t\t\tthis.object.fromDeclaration = (fromDeclaration !== false);\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar previousMaterial = (this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined);\r\n\r\n\t\t\t\tif (this.object && typeof this.object.finalize === 'function') {\r\n\r\n\t\t\t\t\tthis.object.finalize(true);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.object = {\r\n\t\t\t\t\tname: name || '',\r\n\t\t\t\t\tfromDeclaration: (fromDeclaration !== false),\r\n\r\n\t\t\t\t\tgeometry: {\r\n\t\t\t\t\t\tvertices: [],\r\n\t\t\t\t\t\tnormals: [],\r\n\t\t\t\t\t\tuvs: []\r\n\t\t\t\t\t},\r\n\t\t\t\t\tmaterials: [],\r\n\t\t\t\t\tsmooth: true,\r\n\r\n\t\t\t\t\tstartMaterial: function (name, libraries) {\r\n\r\n\t\t\t\t\t\tvar previous = this.finalize(false);\r\n\r\n\t\t\t\t\t\t// New usemtl declaration overwrites an inherited material, except if faces were declared\r\n\t\t\t\t\t\t// after the material, then it must be preserved for proper MultiMaterial continuation.\r\n\t\t\t\t\t\tif (previous && (previous.inherited || previous.groupCount <= 0)) {\r\n\r\n\t\t\t\t\t\t\tthis.materials.splice(previous.index, 1);\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar material = {\r\n\t\t\t\t\t\t\tindex: this.materials.length,\r\n\t\t\t\t\t\t\tname: name || '',\r\n\t\t\t\t\t\t\tmtllib: (Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : ''),\r\n\t\t\t\t\t\t\tsmooth: (previous !== undefined ? previous.smooth : this.smooth),\r\n\t\t\t\t\t\t\tgroupStart: (previous !== undefined ? previous.groupEnd : 0),\r\n\t\t\t\t\t\t\tgroupEnd: -1,\r\n\t\t\t\t\t\t\tgroupCount: -1,\r\n\t\t\t\t\t\t\tinherited: false,\r\n\r\n\t\t\t\t\t\t\tclone: function (index) {\r\n\t\t\t\t\t\t\t\tvar cloned = {\r\n\t\t\t\t\t\t\t\t\tindex: (typeof index === 'number' ? index : this.index),\r\n\t\t\t\t\t\t\t\t\tname: this.name,\r\n\t\t\t\t\t\t\t\t\tmtllib: this.mtllib,\r\n\t\t\t\t\t\t\t\t\tsmooth: this.smooth,\r\n\t\t\t\t\t\t\t\t\tgroupStart: 0,\r\n\t\t\t\t\t\t\t\t\tgroupEnd: -1,\r\n\t\t\t\t\t\t\t\t\tgroupCount: -1,\r\n\t\t\t\t\t\t\t\t\tinherited: false\r\n\t\t\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t\t\tcloned.clone = this.clone.bind(cloned);\r\n\t\t\t\t\t\t\t\treturn cloned;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tthis.materials.push(material);\r\n\r\n\t\t\t\t\t\treturn material;\r\n\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tcurrentMaterial: function () {\r\n\r\n\t\t\t\t\t\tif (this.materials.length > 0) {\r\n\t\t\t\t\t\t\treturn this.materials[this.materials.length - 1];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn undefined;\r\n\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\tfinalize: function (end) {\r\n\r\n\t\t\t\t\t\tvar lastMultiMaterial = this.currentMaterial();\r\n\r\n\t\t\t\t\t\tif (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) {\r\n\r\n\t\t\t\t\t\t\tlastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\r\n\t\t\t\t\t\t\tlastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\r\n\t\t\t\t\t\t\tlastMultiMaterial.inherited = false;\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Ignore objects tail materials if no face declarations followed them before a new o/g started.\r\n\t\t\t\t\t\tif (end && this.materials.length > 1) {\r\n\r\n\t\t\t\t\t\t\tfor (var mi = this.materials.length - 1; mi >= 0; mi--) {\r\n\t\t\t\t\t\t\t\tif (this.materials[mi].groupCount <= 0) {\r\n\t\t\t\t\t\t\t\t\tthis.materials.splice(mi, 1);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Guarantee at least one empty material, this makes the creation later more straight forward.\r\n\t\t\t\t\t\tif (end && this.materials.length === 0) {\r\n\r\n\t\t\t\t\t\t\tthis.materials.push({\r\n\t\t\t\t\t\t\t\tname: '',\r\n\t\t\t\t\t\t\t\tsmooth: this.smooth\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn lastMultiMaterial;\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// Inherit previous objects material.\r\n\t\t\t\t// Spec tells us that a declared material must be set to all objects until a new material is declared.\r\n\t\t\t\t// If a usemtl declaration is encountered while this new object is being parsed, it will\r\n\t\t\t\t// overwrite the inherited material. Exception being that there was already face declarations\r\n\t\t\t\t// to the inherited material, then it will be preserved for proper MultiMaterial continuation.\r\n\r\n\t\t\t\tif (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function') {\r\n\r\n\t\t\t\t\tvar declared = previousMaterial.clone(0);\r\n\r\n\t\t\t\t\tdeclared.inherited = true;\r\n\t\t\t\t\tthis.object.materials.push(declared);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.objects.push(this.object);\r\n\r\n\t\t\t},\r\n\r\n\t\t\tfinalize: function () {\r\n\r\n\t\t\t\tif (this.object && typeof this.object.finalize === 'function') {\r\n\r\n\t\t\t\t\tthis.object.finalize(true);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t},\r\n\r\n\t\t\tparseVertexIndex: function (value, len) {\r\n\r\n\t\t\t\tvar index = parseInt(value, 10);\r\n\r\n\t\t\t\treturn (index >= 0 ? index - 1 : index + len / 3) * 3;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tparseNormalIndex: function (value, len) {\r\n\r\n\t\t\t\tvar index = parseInt(value, 10);\r\n\r\n\t\t\t\treturn (index >= 0 ? index - 1 : index + len / 3) * 3;\r\n\r\n\t\t\t},\r\n\r\n\t\t\tparseUVIndex: function (value, len) {\r\n\r\n\t\t\t\tvar index = parseInt(value, 10);\r\n\r\n\t\t\t\treturn (index >= 0 ? index - 1 : index + len / 2) * 2;\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddVertex: function (a, b, c) {\r\n\r\n\t\t\t\tvar src = this.vertices;\r\n\t\t\t\tvar dst = this.object.geometry.vertices;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\t\t\t\tdst.push(src[a + 2]);\r\n\t\t\t\tdst.push(src[b + 0]);\r\n\t\t\t\tdst.push(src[b + 1]);\r\n\t\t\t\tdst.push(src[b + 2]);\r\n\t\t\t\tdst.push(src[c + 0]);\r\n\t\t\t\tdst.push(src[c + 1]);\r\n\t\t\t\tdst.push(src[c + 2]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddVertexLine: function (a) {\r\n\r\n\t\t\t\tvar src = this.vertices;\r\n\t\t\t\tvar dst = this.object.geometry.vertices;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\t\t\t\tdst.push(src[a + 2]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddNormal: function (a, b, c) {\r\n\r\n\t\t\t\tvar src = this.normals;\r\n\t\t\t\tvar dst = this.object.geometry.normals;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\t\t\t\tdst.push(src[a + 2]);\r\n\t\t\t\tdst.push(src[b + 0]);\r\n\t\t\t\tdst.push(src[b + 1]);\r\n\t\t\t\tdst.push(src[b + 2]);\r\n\t\t\t\tdst.push(src[c + 0]);\r\n\t\t\t\tdst.push(src[c + 1]);\r\n\t\t\t\tdst.push(src[c + 2]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddUV: function (a, b, c) {\r\n\r\n\t\t\t\tvar src = this.uvs;\r\n\t\t\t\tvar dst = this.object.geometry.uvs;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\t\t\t\tdst.push(src[b + 0]);\r\n\t\t\t\tdst.push(src[b + 1]);\r\n\t\t\t\tdst.push(src[c + 0]);\r\n\t\t\t\tdst.push(src[c + 1]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddUVLine: function (a) {\r\n\r\n\t\t\t\tvar src = this.uvs;\r\n\t\t\t\tvar dst = this.object.geometry.uvs;\r\n\r\n\t\t\t\tdst.push(src[a + 0]);\r\n\t\t\t\tdst.push(src[a + 1]);\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddFace: function (a, b, c, d, ua, ub, uc, ud, na, nb, nc, nd) {\r\n\r\n\t\t\t\tvar vLen = this.vertices.length;\r\n\r\n\t\t\t\tvar ia = this.parseVertexIndex(a, vLen);\r\n\t\t\t\tvar ib = this.parseVertexIndex(b, vLen);\r\n\t\t\t\tvar ic = this.parseVertexIndex(c, vLen);\r\n\t\t\t\tvar id;\r\n\r\n\t\t\t\tif (d === undefined) {\r\n\r\n\t\t\t\t\tthis.addVertex(ia, ib, ic);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tid = this.parseVertexIndex(d, vLen);\r\n\r\n\t\t\t\t\tthis.addVertex(ia, ib, id);\r\n\t\t\t\t\tthis.addVertex(ib, ic, id);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (ua !== undefined) {\r\n\r\n\t\t\t\t\tvar uvLen = this.uvs.length;\r\n\r\n\t\t\t\t\tia = this.parseUVIndex(ua, uvLen);\r\n\t\t\t\t\tib = this.parseUVIndex(ub, uvLen);\r\n\t\t\t\t\tic = this.parseUVIndex(uc, uvLen);\r\n\r\n\t\t\t\t\tif (d === undefined) {\r\n\r\n\t\t\t\t\t\tthis.addUV(ia, ib, ic);\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tid = this.parseUVIndex(ud, uvLen);\r\n\r\n\t\t\t\t\t\tthis.addUV(ia, ib, id);\r\n\t\t\t\t\t\tthis.addUV(ib, ic, id);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (na !== undefined) {\r\n\r\n\t\t\t\t\t// Normals are many times the same. If so, skip function call and parseInt.\r\n\t\t\t\t\tvar nLen = this.normals.length;\r\n\r\n\t\t\t\t\tia = this.parseNormalIndex(na, nLen);\r\n\r\n\t\t\t\t\tib = na === nb ? ia : this.parseNormalIndex(nb, nLen);\r\n\t\t\t\t\tic = na === nc ? ia : this.parseNormalIndex(nc, nLen);\r\n\r\n\t\t\t\t\tif (d === undefined) {\r\n\r\n\t\t\t\t\t\tthis.addNormal(ia, ib, ic);\r\n\r\n\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\tid = this.parseNormalIndex(nd, nLen);\r\n\r\n\t\t\t\t\t\tthis.addNormal(ia, ib, id);\r\n\t\t\t\t\t\tthis.addNormal(ib, ic, id);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t},\r\n\r\n\t\t\taddLineGeometry: function (vertices, uvs) {\r\n\r\n\t\t\t\tthis.object.geometry.type = 'Line';\r\n\r\n\t\t\t\tvar vLen = this.vertices.length;\r\n\t\t\t\tvar uvLen = this.uvs.length;\r\n\r\n\t\t\t\tfor (var vi = 0, l = vertices.length; vi < l; vi++) {\r\n\r\n\t\t\t\t\tthis.addVertexLine(this.parseVertexIndex(vertices[vi], vLen));\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tl = uvs.length;\r\n\r\n\t\t\t\tfor (var uvi = 0; uvi < l; uvi++) {\r\n\r\n\t\t\t\t\tthis.addUVLine(this.parseUVIndex(uvs[uvi], uvLen));\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t};\r\n\r\n\t\tstate.startObject('', false);\r\n\r\n\t\treturn state;\r\n\r\n\t}\r\n\r\n\tparse (text) {\r\n\r\n\t\tconsole.time('OBJLoader');\r\n\r\n\t\tvar state = this.createParserState();\r\n\r\n\t\tif (text.indexOf('\\r\\n') !== - 1) {\r\n\r\n\t\t\t// This is faster than String.split with regex that splits on both\r\n\t\t\ttext = text.replace(/\\r\\n/g, '\\n');\r\n\r\n\t\t}\r\n\r\n\t\tif (text.indexOf('\\\\\\n') !== - 1) {\r\n\r\n\t\t\t// join lines separated by a line continuation character (\\)\r\n\t\t\ttext = text.replace(/\\\\\\n/g, '');\r\n\r\n\t\t}\r\n\r\n\t\tvar lines = text.split('\\n');\r\n\t\tvar line = '', lineFirstChar = '', lineSecondChar = '';\r\n\t\tvar lineLength = 0;\r\n\t\tvar result = [];\r\n\r\n\t\t// Faster to just trim left side of the line. Use if available.\r\n\t\tvar trimLeft = (typeof ''.trimLeft === 'function');\r\n\r\n\t\tfor (var i = 0, l = lines.length; i < l; i++) {\r\n\r\n\t\t\tline = lines[i];\r\n\r\n\t\t\tline = trimLeft ? line.trimLeft() : line.trim();\r\n\r\n\t\t\tlineLength = line.length;\r\n\r\n\t\t\tif (lineLength === 0) continue;\r\n\r\n\t\t\tlineFirstChar = line.charAt(0);\r\n\r\n\t\t\t// @todo invoke passed in handler if any\r\n\t\t\tif (lineFirstChar === '#') continue;\r\n\r\n\t\t\tif (lineFirstChar === 'v') {\r\n\r\n\t\t\t\tlineSecondChar = line.charAt(1);\r\n\r\n\t\t\t\tif (lineSecondChar === ' ' && (result = this.regexp.vertexPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// 0 1 2 3\r\n\t\t\t\t\t// [\"v 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\r\n\r\n\t\t\t\t\tstate.vertices.push(\r\n\t\t\t\t\t\tparseFloat(result[1]),\r\n\t\t\t\t\t\tparseFloat(result[2]),\r\n\t\t\t\t\t\tparseFloat(result[3])\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if (lineSecondChar === 'n' && (result = this.regexp.normalPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// 0 1 2 3\r\n\t\t\t\t\t// [\"vn 1.0 2.0 3.0\", \"1.0\", \"2.0\", \"3.0\"]\r\n\r\n\t\t\t\t\tstate.normals.push(\r\n\t\t\t\t\t\tparseFloat(result[1]),\r\n\t\t\t\t\t\tparseFloat(result[2]),\r\n\t\t\t\t\t\tparseFloat(result[3])\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if (lineSecondChar === 't' && (result = this.regexp.uvPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// 0 1 2\r\n\t\t\t\t\t// [\"vt 0.1 0.2\", \"0.1\", \"0.2\"]\r\n\r\n\t\t\t\t\tstate.uvs.push(\r\n\t\t\t\t\t\tparseFloat(result[1]),\r\n\t\t\t\t\t\tparseFloat(result[2])\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tthrow new Error('Unexpected vertex/normal/uv line: \\'' + line + '\\'');\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (lineFirstChar === 'f') {\r\n\r\n\t\t\t\tif ((result = this.regexp.faceVertexUvNormal.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// f vertex/uv/normal vertex/uv/normal vertex/uv/normal\r\n\t\t\t\t\t// 0 1 2 3 4 5 6 7 8 9 10 11 12\r\n\t\t\t\t\t// [\"f 1/1/1 2/2/2 3/3/3\", \"1\", \"1\", \"1\", \"2\", \"2\", \"2\", \"3\", \"3\", \"3\", undefined, undefined, undefined]\r\n\r\n\t\t\t\t\tstate.addFace(\r\n\t\t\t\t\t\tresult[1], result[4], result[7], result[10],\r\n\t\t\t\t\t\tresult[2], result[5], result[8], result[11],\r\n\t\t\t\t\t\tresult[3], result[6], result[9], result[12]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if ((result = this.regexp.faceVertexUv.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// f vertex/uv vertex/uv vertex/uv\r\n\t\t\t\t\t// 0 1 2 3 4 5 6 7 8\r\n\t\t\t\t\t// [\"f 1/1 2/2 3/3\", \"1\", \"1\", \"2\", \"2\", \"3\", \"3\", undefined, undefined]\r\n\r\n\t\t\t\t\tstate.addFace(\r\n\t\t\t\t\t\tresult[1], result[3], result[5], result[7],\r\n\t\t\t\t\t\tresult[2], result[4], result[6], result[8]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if ((result = this.regexp.faceVertexNormal.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// f vertex//normal vertex//normal vertex//normal\r\n\t\t\t\t\t// 0 1 2 3 4 5 6 7 8\r\n\t\t\t\t\t// [\"f 1//1 2//2 3//3\", \"1\", \"1\", \"2\", \"2\", \"3\", \"3\", undefined, undefined]\r\n\r\n\t\t\t\t\tstate.addFace(\r\n\t\t\t\t\t\tresult[1], result[3], result[5], result[7],\r\n\t\t\t\t\t\tundefined, undefined, undefined, undefined,\r\n\t\t\t\t\t\tresult[2], result[4], result[6], result[8]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else if ((result = this.regexp.faceVertex.exec(line)) !== null) {\r\n\r\n\t\t\t\t\t// f vertex vertex vertex\r\n\t\t\t\t\t// 0 1 2 3 4\r\n\t\t\t\t\t// [\"f 1 2 3\", \"1\", \"2\", \"3\", undefined]\r\n\r\n\t\t\t\t\tstate.addFace(\r\n\t\t\t\t\t\tresult[1], result[2], result[3], result[4]\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tthrow new Error('Unexpected face line: \\'' + line + '\\'');\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (lineFirstChar === 'l') {\r\n\r\n\t\t\t\tvar lineParts = line.substring(1).trim().split(' ');\r\n\t\t\t\tvar lineVertices = [], lineUVs = [];\r\n\r\n\t\t\t\tif (line.indexOf('/') === - 1) {\r\n\r\n\t\t\t\t\tlineVertices = lineParts;\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tfor (var li = 0, llen = lineParts.length; li < llen; li++) {\r\n\r\n\t\t\t\t\t\tvar parts = lineParts[li].split('/');\r\n\r\n\t\t\t\t\t\tif (parts[0] !== '') lineVertices.push(parts[0]);\r\n\t\t\t\t\t\tif (parts[1] !== '') lineUVs.push(parts[1]);\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t\tstate.addLineGeometry(lineVertices, lineUVs);\r\n\r\n\t\t\t} else if ((result = this.regexp.objectPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t// o object_name\r\n\t\t\t\t// or\r\n\t\t\t\t// g group_name\r\n\r\n\t\t\t\t// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\r\n\t\t\t\t// var name = result[ 0 ].substr( 1 ).trim();\r\n\t\t\t\tvar name = (' ' + result[0].substr(1).trim()).substr(1);\r\n\r\n\t\t\t\tstate.startObject(name);\r\n\r\n\t\t\t} else if (this.regexp.materialUsePattern.test(line)) {\r\n\r\n\t\t\t\t// material\r\n\r\n\t\t\t\tstate.object.startMaterial(line.substring(7).trim(), state.materialLibraries);\r\n\r\n\t\t\t} else if (this.regexp.materialLibraryPattern.test(line)) {\r\n\r\n\t\t\t\t// mtl file\r\n\r\n\t\t\t\tstate.materialLibraries.push(line.substring(7).trim());\r\n\r\n\t\t\t} else if ((result = this.regexp.smoothingPattern.exec(line)) !== null) {\r\n\r\n\t\t\t\t// smooth shading\r\n\r\n\t\t\t\t// @todo Handle files that have varying smooth values for a set of faces inside one geometry,\r\n\t\t\t\t// but does not define a usemtl for each face set.\r\n\t\t\t\t// This should be detected and a dummy material created (later MultiMaterial and geometry groups).\r\n\t\t\t\t// This requires some care to not create extra material on each smooth value for \"normal\" obj files.\r\n\t\t\t\t// where explicit usemtl defines geometry groups.\r\n\t\t\t\t// Example asset: examples/models/obj/cerberus/Cerberus.obj\r\n\r\n\t\t\t\tvar value = result[1].trim().toLowerCase();\r\n\r\n\t\t\t\tstate.object.smooth = (value === '1' || value === 'on');\r\n\r\n\t\t\t\tvar material = state.object.currentMaterial();\r\n\r\n\t\t\t\tif (material) {\r\n\r\n\t\t\t\t\tmaterial.smooth = state.object.smooth;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// Handle null terminated files without exception\r\n\t\t\t\tif (line === '\\0') continue;\r\n\r\n\t\t\t\tthrow new Error('Unexpected line: \\'' + line + '\\'');\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tstate.finalize();\r\n\r\n\t\tvar container = new THREE.Group();\r\n\r\n\t\tcontainer.materialLibraries = [].concat(state.materialLibraries);\r\n\r\n\t\tfor (i = 0, l = state.objects.length; i < l; i++) {\r\n\r\n\t\t\tvar object = state.objects[i];\r\n\t\t\tvar geometry = object.geometry;\r\n\t\t\tvar materials = object.materials;\r\n\t\t\tvar isLine = (geometry.type === 'Line');\r\n\r\n\t\t\t// Skip o/g line declarations that did not follow with any faces\r\n\t\t\tif (geometry.vertices.length === 0) continue;\r\n\r\n\t\t\tvar buffergeometry = new THREE.BufferGeometry();\r\n\r\n\t\t\tbuffergeometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(geometry.vertices), 3));\r\n\r\n\t\t\tif (geometry.normals.length > 0) {\r\n\r\n\t\t\t\tbuffergeometry.addAttribute('normal', new THREE.BufferAttribute(new Float32Array(geometry.normals), 3));\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbuffergeometry.computeVertexNormals();\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif (geometry.uvs.length > 0) {\r\n\r\n\t\t\t\tbuffergeometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array(geometry.uvs), 2));\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Create materials\r\n\r\n\t\t\tvar createdMaterials = [];\r\n\r\n\t\t\tfor (var mi = 0, miLen = materials.length; mi < miLen; mi++) {\r\n\r\n\t\t\t\tvar sourceMaterial = materials[mi];\r\n\r\n\t\t\t\tmaterial = undefined;\r\n\r\n\t\t\t\tif (this.materials !== null) {\r\n\r\n\t\t\t\t\tmaterial = this.materials.create(sourceMaterial.name);\r\n\r\n\t\t\t\t\t// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\r\n\t\t\t\t\tif (isLine && material && !(material instanceof THREE.LineBasicMaterial)) {\r\n\r\n\t\t\t\t\t\tvar materialLine = new THREE.LineBasicMaterial();\r\n\r\n\t\t\t\t\t\tmaterialLine.copy(material);\r\n\t\t\t\t\t\tmaterial = materialLine;\r\n\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!material) {\r\n\r\n\t\t\t\t\tmaterial = (!isLine ? new THREE.MeshPhongMaterial() : new THREE.LineBasicMaterial());\r\n\t\t\t\t\tmaterial.name = sourceMaterial.name;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmaterial.flatShading = sourceMaterial.smooth ? THREE.SmoothShading : THREE.FlatShading;\r\n\r\n\t\t\t\tcreatedMaterials.push(material);\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Create mesh\r\n\r\n\t\t\tvar mesh;\r\n\r\n\t\t\tif (createdMaterials.length > 1) {\r\n\r\n\t\t\t\tfor (mi = 0, miLen = materials.length; mi < miLen; mi++) {\r\n\r\n\t\t\t\t\tsourceMaterial = materials[mi];\r\n\r\n\t\t\t\t\tbuffergeometry.addGroup(sourceMaterial.groupStart, sourceMaterial.groupCount, mi);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmesh = (!isLine ? new THREE.Mesh(buffergeometry, createdMaterials) : new THREE.LineSegments(buffergeometry, createdMaterials));\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tmesh = (!isLine ? new THREE.Mesh(buffergeometry, createdMaterials[0]) : new THREE.LineSegments(buffergeometry, createdMaterials[0]));\r\n\t\t\t}\r\n\r\n\t\t\tmesh.name = object.name;\r\n\r\n\t\t\tcontainer.add(mesh);\r\n\r\n\t\t}\r\n\r\n\t\tconsole.timeEnd('OBJLoader');\r\n\r\n\t\treturn container;\r\n\r\n\t}\r\n\r\n}\r\nexport default OBJLoader;","/*\r\n * @Author: zy9@github.com/zy410419243\r\n * @Date: 2018-07-22 22:14:42\r\n * @Last Modified by: zy9\r\n * @Last Modified time: 2018-07-23 21:45:15\r\n * @Description: 递归加载数组中所有mtl跟obj文件\r\n */\r\nimport MTLLoader from '../loader/MTLLoader';\r\nimport OBJLoader from '../loader/OBJLoader';\r\nimport extend from '../util/DeepClone';\r\n\r\nexport default class Loader {\r\n\tconstructor (config, mtlLoader, objectLoader) {\r\n\t\tthis.mtlLoader = mtlLoader ? mtlLoader : new MTLLoader();\r\n\t\tthis.objectLoader = objectLoader ? objectLoader : new OBJLoader();\r\n\t\tthis.config = config;\r\n\t}\r\n\r\n\tload = (mtlUrl, objUrl, callback) => {\r\n\t\tconst { config } = this;\r\n\r\n\t\tthis.loadMaterials(mtlUrl, null, materials => {\r\n \t\tconfig.setMaterial && (materials = config.setMaterial(materials));\r\n\r\n \t\tlet objLoader = new OBJLoader();\r\n\r\n \t\tobjLoader.setMaterials(materials);\r\n\r\n \t\tthis.loadObjects(objUrl, null, objects => callback(objects));\r\n \t});\r\n\t}\r\n\r\n\t/**\r\n * 递归加载、合并多个材质文件\r\n * TODO 弃用深拷贝,略浪费性能\r\n * @param {*} paths config.data.materials,数组\r\n * @param {*} material 加载完成后的材质对象,调用时传null就行了\r\n * @param {*} callback 加载完成后的回调,相当于ajax里的success,传回材质对象\r\n */\r\n loadMaterials = (paths, material, callback) => {\r\n \tthis.mtlLoader.load(paths[0], materials => {\r\n \t\tmaterial ? material.materialsInfo = [...material.materialsInfo, ...materials.materialsInfo] : material = materials;\r\n\r\n \t\tpaths.shift();\r\n\r\n \t\tpaths.length != 0 ? loadMaterials(paths, material, callback) : callback(material);\r\n \t});\r\n }\r\n\r\n\t/**\r\n * 递归加载、合并多个模型文件\r\n * TODO 弃用深拷贝,略浪费性能\r\n * @param {*} paths config.data.objects,数组\r\n * @param {*} object 加载完成后的模型对象,调用时传null就行了\r\n * @param {*} callback 加载完成后的回调,相当于ajax里的success,传回模型对象\r\n */\r\n loadObjects = (paths, object, callback) => {\r\n \tthis.objectLoader.load(paths[0], objects => {\r\n \t\tobject ? object.children = objects.children.concat(object.children) : object = extend({}, objects);\r\n\r\n \t\tpaths.shift();\r\n\r\n \t\tpaths.length != 0 ? loadObjects(paths, object, callback) : callback(object);\r\n \t});\r\n }\r\n}","/*\r\n * @Author: zy9@github.com/zy410419243\r\n * @Date: 2018-08-11 16:30:06\r\n * @Last Modified by: zy9\r\n * @Last Modified time: 2018-08-11 17:13:58\r\n */\r\nexport default class LifeCycle {\r\n\tconstructor (config) {\r\n\r\n\t}\r\n}","/*\r\n * @Author: zy9@github.com/zy410419243\r\n * @Date: 2018-04-24 15:33:50\r\n * @Last Modified by: zy9\r\n * @Last Modified time: 2018-08-11 17:16:19\r\n */\r\nimport * as THREE from 'three';\r\nimport Loader from './Loader';\r\nimport OrbitControls from 'three-orbitcontrols';\r\nimport TWEEN from 'tween';\r\nimport extend from '../util/DeepClone';\r\n\r\nimport LifeCycle from './lifecycle';\r\n\r\nexport default class Trunk extends LifeCycle {\r\n\tconstructor (config) {\r\n\t\tsuper(config);\r\n\r\n\t\tthis.config = extend(this.config, config);\r\n\r\n\t\tthis.initParams(this.config);\r\n\t}\r\n\t// 默认配置\r\n\tconfig = {\r\n\t\t// clearColor: 0x4584b4, // 画布颜色\r\n\t\tclearOpacity: 0.2, // 画布透明度\r\n\t\tmeshShiftTime: () => Math.random() * 1000 * 5 + 1000, // 板块移动时间\r\n\t\tbeforeInit: null, // 初始化前的钩子\r\n\t\tborderVisible: true, // 边界是否显示\r\n\t\tdivisor: 100, // 控制柱子高度,该数越大,柱子越矮\r\n\t\tcameraPosition: { x: 0, y: 0, z: 65 }, // 相机position中的z\r\n\t\tafterRotation: -Math.PI / 4, // 开场动画后视角旋转角度\r\n\t\trotationSpeed: 0.02, // 开场动画后视角旋转速度\r\n\t\ttexture: {\r\n\t\t\tline: '#055290', // 内部乡镇边界贴图\r\n\t\t\tpillar: '#2377e8', // 柱子贴图\r\n\t\t\ttop: '#07205b', // 上表面贴图\r\n\t\t\tbottom: '#000', // 底部贴图\r\n\t\t\tborder: '#2a8fdf', // 边缘边界贴图\r\n\t\t\tselect: '#071C5B', // 鼠标移入时贴图\r\n\t\t},\r\n\t\tlight: () => { // x轴正方向是屏幕右边,y轴正方向是屏幕里边,z轴正方向是屏幕上边\r\n\t\t\tlet lights = [];\r\n\r\n\t\t\tlights.push(new THREE.HemisphereLight(16777215, 16777215, 0.3));\r\n\r\n\t\t\treturn lights;\r\n\t\t},\r\n\t\tcontrols: {\r\n\t\t\tmaxPolarAngle: Math.PI * 0.75,\r\n\t\t\tminPolarAngle: Math.PI * 0.25,\r\n\t\t},\r\n\t\tclientWidth: document.documentElement.clientWidth || document.body.clientWidth,\r\n\t\tclientHeight: document.documentElement.clientHeight || document.body.clientHeight\r\n\t};\r\n\r\n\t_startPositions = {};\r\n\t_startTweenCount = 0;\r\n\r\n\t// 柱子高度变化的定时器\r\n\tintervals = {};\r\n\r\n\t// 鼠标移入板块高亮\r\n\told = {};\r\n\tcurrent = {};\r\n\r\n\t/**\r\n\t * 渲染模型容器,相当于对div进行appendChild\r\n * 这里具体干的是往scene里加Object3D,然后所有模型都放在Object3D对象里\r\n * 原因是scene上不能直接渲染Mesh啊Group之类的对象,需要这么个载体\r\n\t*/\r\n\troot = {};\r\n\r\n\t// 标识模型是否移动过\r\n\twithdrawPosition = false;\r\n\r\n\t// 模型数据\r\n\tdataObject = {};\r\n\r\n\t// 多次用到容器节点,存到全局变量里方便调用\r\n\tcontainer = {};\r\n\r\n\t// 整个模块的贴图,用作等值面\r\n\tmodelTexture = {};\r\n\r\n\t// 初始化three渲染三要素\r\n\tcamera = null;\r\n\trenderer = null;\r\n\tscene = null;\r\n\r\n\t// 轨道控制\r\n\tcontrols = null;\r\n\r\n\t// 初始化开场动画前板块位置\r\n\tinitAreaPosition = (area, child) => {\r\n\t\tlet { _startPositions } = this;\r\n\r\n\t\tlet p = _startPositions[area];\r\n\r\n\t\tthis.config.beforeAnimate && this.config.beforeAnimate(child);\r\n\r\n\t\tif (!p) {\r\n\t\t\tp = {\r\n\t\t\t\tx: Math.random() * 1000 - 500,\r\n\t\t\t\ty: Math.random() * 1000 - 500,\r\n\t\t\t\tz: Math.random() > 0.5 ? (Math.random() * 200 + 300) : (-Math.random() * 500 - 1000)\r\n\t\t\t};\r\n\t\t\t_startPositions[area] = p;\r\n\t\t}\r\n\t\tchild.position.set(p.x, p.y, p.z);\r\n\t}\r\n\r\n\t// 处理开场动画参数\r\n\tdealObjectInLoadCirculStart = (child, visible) => {\r\n\t\tif (!child.name) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// 设置上下边界是否显示\r\n\t\tif (/border$/.test(child.name)) {\r\n\t\t\tchild.visible = visible;\r\n\t\t}\r\n\r\n\t\tif (child instanceof THREE.Mesh) {\r\n\t\t\tlet area = child.name.split('_')[0];\r\n\r\n\t\t\tthis.initAreaPosition(area, child);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n * 处理柱子渲染\r\n * @param child 当前遍历模型对象\r\n * @param divisor 计算柱子高度,柱子高度 = 当前模型中数据 / divisor * 15,也就是说divisor越小,柱子越高\r\n */\r\n\tchangeModel4DataRefresh = (child, divisor) => {\r\n\t\tlet name = child.name;\r\n\r\n\t\tif (/pillar$/.test(name)) {\r\n\t\t\tlet dmName = name.split('_')[0];\r\n\t\t\tlet data = child.userData.val;\r\n\r\n\t\t\tif (dmName) {\r\n\t\t\t\tlet height = 0;\r\n\t\t\t\tlet proportion = 0;\r\n\r\n\t\t\t\tif (divisor && divisor !== 0) {\r\n\t\t\t\t\tproportion = data / divisor;\r\n\t\t\t\t\theight = proportion * 15;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 不支持负数,但万一传了负数,暂按0处理\r\n\t\t\t\tif (height <= 0) {\r\n\t\t\t\t\tchild.visible = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.setHeightSlow(child, height);\r\n\t\t\t\t\tchild.visible = true;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tdmName = name ? name.split('_')[0] : '';\r\n\t\t\t\t// TODO 与上面height <= 0重复,代码需精简\r\n\t\t\t\tchild.visible = false;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n * 设置柱子高度(缓慢变高,高度从1开始变到指定高度)\r\n * 这个方法不要加太多逻辑,这里我试着在循环里console.log,渣电脑甚至能掉帧\r\n * @param child\r\n * @param height\r\n * @private\r\n */\r\n\tsetHeightSlow = (child, height) => {\r\n\t\tthis.setHeight(child, 1);\r\n\t\tlet i = 1;\r\n\t\tlet sh;\r\n\t\t// 柱子高度上升速度\r\n\t\tlet times = 300;\r\n\r\n\t\tconst show = () => {\r\n\t\t\tif (i < times) {\r\n\t\t\t\tlet h = Math.floor(height * i / times);\r\n\r\n\t\t\t\tthis.setHeight(child, h);\r\n\t\t\t\ti++;\r\n\t\t\t} else if (i === times) {\r\n\t\t\t\ti++;\r\n\t\t\t\tthis.setHeight(child, height);\r\n\t\t\t} else {\r\n\t\t\t\tclearInterval(sh);\r\n\t\t\t\tdelete this.intervals[sh];\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tsh = setInterval(show, () => { });\r\n\t\tthis.intervals[sh] = sh;\r\n\t};\r\n\r\n\t/**\r\n * 设置柱子高度\r\n * 这个方法不要加太多逻辑,这里我试着在循环里console.log,渣电脑甚至能掉帧\r\n * @param child\r\n * @param height\r\n * @private\r\n */\r\n\tsetHeight = (child, height) => {\r\n\t\tif (height === 0 || isNaN(height)) {\r\n\t\t\t// 不能高度设置为0,否则下一次设置的时候会出问题,\r\n\t\t\theight = 1;\r\n\t\t}\r\n\t\tlet geometry = child.geometry;\r\n\r\n\t\tgeometry.verticesNeedUpdate = true;\r\n\r\n\t\tlet vertices = geometry.vertices;\r\n\r\n \t/*\r\n * 此处应该当有掌声,当然可能是写的人的特有感慨\r\n * 这里区分了顶面和底面的点,前提是给的模型数据里的柱子高度不能为0\r\n\t\t*\r\n * 下面这段代码看上去简单,但领悟到顶面和底面不能在同一个面上,否则就区分不出的痛整整花了一天时间\r\n\t\t*\r\n\t\t*\t这里先区分z,不是特别花俏的柱子一般只有六个面八个点两种z\r\n * 然后底面的z不变,顶面的z加高度\r\n */\r\n\t\tlet minz = vertices[0].z;\r\n\r\n\t\tfor (let vertice of vertices) {\r\n\t\t\tlet z = vertice.z;\r\n\r\n\t\t\tif (minz != z) {\r\n\t\t\t\tminz = Math.min(z, minz);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (let vertice of vertices) {\r\n\t\t\tif (vertice.z !== minz) {\r\n\t\t\t\tvertice.z = minz + height;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n * 事件绑定\r\n * @private\r\n * @param config 模型配置文件\r\n * @param object .obj文件,所有模型数据。这里得注意跟child的区别,变量名写惯了都是object..\r\n */\r\n\tinitListener = object => {\r\n\t\tthis.container.addEventListener('mousemove', e => this.setMeshHighLightStatus(e), false);\r\n\r\n\t\tthis.container.addEventListener('click', e => this.showDetail(e, object), false);\r\n\t};\r\n\r\n\t/*\r\n 改变板块的高亮状态\r\n\r\n 鼠标移上去,如果是板块,那改变该板块材质中的颜色\r\n 移开后恢复原来的材质\r\n 得注意边界线也是种模型,需要额外判断\r\n */\r\n\tsetMeshHighLightStatus = event => {\r\n\t\tconst { config } = this;\r\n\t\tlet intersected = this.objectFromMouse(event.pageX, event.pageY);\r\n\t\tlet child = intersected.object;\r\n\r\n\t\tlet texture = config.texture;\r\n\r\n\t\t// 设置/移除高亮\r\n\t\tif (child) {\r\n\t\t\tlet uuid = this.current && this.current.uuid;\r\n\r\n\t\t\tif (uuid === child.uuid) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (!child.name.includes('border') && !child.name.includes('line') && !child.name.includes('pillar') && !child.name.includes('texture') && !child.name.includes('river')) {\r\n\t\t\t\tif (!uuid) { // 第一次\r\n\t\t\t\t\tthis.current = child;\r\n\r\n\t\t\t\t\t// 鼠标移入设置移入的颜色\r\n\t\t\t\t\tchild.material.color.set(texture.select);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 鼠标移开设置原先表面的颜色\r\n\t\t\t\t\tthis.current.material.color.set(texture.top);\r\n\r\n\t\t\t\t\tthis.old = this.current;\r\n\t\t\t\t\tthis.current = child;\r\n\r\n\t\t\t\t\t// 鼠标移入设置移入的颜色\r\n\t\t\t\t\tchild.material.color.set(texture.select);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t}\r\n\r\n\t// 点击板块,板块左移,右边空出来的地方显示表格\r\n\tshowDetail = (event, object) => {\r\n\t\tconst { config } = this;\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tlet intersected = this.objectFromMouse(event.pageX, event.pageY);\r\n\t\tlet child = intersected.object;\r\n\r\n\t\tif (child) {\r\n\t\t\t// 右侧表格数据的显示\r\n\t\t\tif (config.showDetail) {\r\n\t\t\t\tlet flag = config.showDetail(child);\r\n\r\n\t\t\t\tthis.meshMove(!!flag, object);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// 获得鼠标位置的板块模型对象\r\n\tobjectFromMouse = (pagex, pagey) => {\r\n\t\tlet { container } = this;\r\n\t\tconst { offsetLeft, offsetTop } = this.renderer.domElement;\r\n\r\n\t\tlet eltx = pagex - offsetLeft;\r\n\t\tlet elty = pagey - offsetTop;\r\n\r\n\t\tlet vpx = (eltx / container.offsetWidth) * 2 - 1;\r\n\t\tlet vpy = -(elty / container.offsetHeight) * 2 + 1;\r\n\t\tlet vector = new THREE.Vector2(vpx, vpy);\r\n\t\tlet raycaster = new THREE.Raycaster();\r\n\r\n\t\traycaster.setFromCamera(vector, this.camera);\r\n\r\n\t\tlet intersects = raycaster.intersectObjects(this.root.children, true);\r\n\r\n\t\tif (intersects.length > 0) {\r\n\t\t\tlet intersect = intersects[0];\r\n\r\n\t\t\tif (intersect) {\r\n\t\t\t\treturn intersect;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn { object: null, point: null, face: null };\r\n\t}\r\n\r\n\t// 获得元素相对整个页面的偏移量\r\n\tgetOffset = (node, offset) => {\r\n\t\tif (!offset) {\r\n\t\t\toffset = {};\r\n\t\t\toffset.top = 0;\r\n\t\t\toffset.left = 0;\r\n\t\t}\r\n\r\n\t\tif (node == document.body) { // 当该节点为body节点时,结束递归\r\n\t\t\treturn offset;\r\n\t\t}\r\n\r\n\t\toffset.top += node.offsetTop;\r\n\t\toffset.left += node.offsetLeft;\r\n\r\n\t\treturn this.getOffset(node.parentNode, offset); // 向上累加offset里的值\r\n\t}\r\n\r\n\t/**\r\n * 整个模型漂移\r\n * 如果withdraw为true,表示需要把模型移开,即从中心点向左移\r\n *\r\n * 如果withdraw为false,表示需要还原至中心\r\n * @param withdraw 是否移开\r\n * @private\r\n */\r\n\tmeshMove = (withdraw, object) => {\r\n\t\tlet { camera, renderer, container, getMeshWidth, _getCoordinate2InScene, config } = this;\r\n\t\tlet point = { x: 0, y: 0, z: 0 };\r\n\t\tlet rotation = { x: -Math.PI / 4, y: 0, z: 0 };\r\n\r\n\t\tif (withdraw) {\r\n\t\t\trotation = { x: -Math.PI / 4, y: Math.PI / 180 * 10, z: 0 };\r\n\r\n\t\t\t// 默认配比是500 * 300的设置\r\n\t\t\tlet gap = container.clientWidth / 550;\r\n\t\t\t// 算移开的位置,移开的位置是固定的,只算一遍\r\n\r\n\t\t\tif (!this.withdrawPosition) {\r\n\t\t\t\tthis.withdrawPosition = _getCoordinate2InScene({\r\n\t\t\t\t\tx: 30 * gap,\r\n\t\t\t\t\ty: renderer.domElement.offsetHeight / 2\r\n\t\t\t\t}, camera, renderer.domElement);\r\n\r\n\t\t\t\t// 避免飞出画布\r\n\t\t\t\tthis.withdrawPosition.x += getMeshWidth(object).length / 4;\r\n\r\n\t\t\t\tthis.tweenInOut(camera.position, { z: 80 }, 1000);\r\n\t\t\t}\r\n\t\t\tpoint = this.withdrawPosition;\r\n\r\n\t\t\tthis.tweenInOut(object.position, point, 1000);\r\n\t\t} else {\r\n \t\t/* 在开场动画结束后,模型需要填满整个页面,但点击板块显示详情时会出现空间不够的情况\r\n 于是这里除了改变模型水平位置,还需要改变相机位置给详情腾地方\r\n\r\n 至于为什么不改变模型的z...因为还有个轨道控制。如果改变了y,但模型仍旧是照着x轴旋转的,\r\n 这就会造成模型转出屏幕的问题*/\r\n\t\t\tthis.tweenInOut(camera.position, config.cameraPosition, 1000);\r\n\t\t\tthis.tweenInOut(object.position, point, 1000);\r\n\r\n\t\t\tthis.withdrawPosition = null;\r\n\t\t}\r\n\t}\r\n\r\n\t// 获得模型宽度\r\n\tgetMeshWidth = object => {\r\n\t\tlet c = 16711680, length = 0, width = 0, height = 0;\r\n\t\tlet boxHelper = new THREE.BoxHelper(object, c);\r\n\t\tlet box = new THREE.Box3().setFromObject(object);\r\n\r\n\t\tboxHelper.update();\r\n\r\n\t\tlength = box.max.x - box.min.x;\r\n\t\twidth = box.max.y - box.min.y;\r\n\t\theight = box.max.z - box.min.z;\r\n\r\n\t\treturn { length, width, height };\r\n\t}\r\n\r\n\t// 定义各板块移动速度\r\n\thandleModelShift = child => {\r\n\t\tlet { _startPositions, config } = this;\r\n\r\n\t\tlet name = child.name.split('_');\r\n\t\tlet area = name[0];\r\n\r\n\t\tif (!_startPositions[area]) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treturn config.meshShiftTime && config.meshShiftTime();\r\n\t}\r\n\r\n\t/**\r\n * 遍历所有模型对象时的回调\r\n * @param {*} child 当前遍历模型\r\n */\r\n\tchildMapping = child => {\r\n\t\tlet { config } = this;\r\n\r\n\t\tconfig.childMapping && config.childMapping(child);\r\n\t}\r\n\r\n\t// 计算模型移动距离\r\n\t_getCoordinate2InScene = (i, d, c) => {\r\n\t\td.updateMatrixWorld(true);\r\n\r\n\t\tlet b = this.getVector2InScene(i, c);\r\n\t\tlet j = new THREE.Vector3(b.x, b.y, 0);\r\n\r\n\t\tj.unproject(d);\r\n\t\tj.sub(d.position);\r\n\t\tj.normalize();\r\n\r\n\t\tlet f = new THREE.Raycaster(d.position, j);\r\n\t\tlet h = f.ray.origin;\r\n\t\tlet g = f.ray.direction;\r\n\t\tlet e = 0;\r\n\t\tlet a = new THREE.Vector3();\r\n\r\n\t\ta.setX(h.x - ((h.z - e) * g.x / g.z));\r\n\t\ta.setY(h.y - ((h.z - e) * g.y / g.z));\r\n\r\n\t\treturn a;\r\n\t}\r\n\r\n\tgetVector2InScene = (a, c) => {\r\n\t\tlet b = new THREE.Vector2();\r\n\r\n\t\tb.x = (a.x / c.offsetWidth) * 2 - 1;\r\n\t\tb.y = -(a.y / c.offsetHeight) * 2 + 1;\r\n\r\n\t\treturn b;\r\n\t};\r\n\r\n\t/**\r\n * TWEEN动画,封装一下调用的时候写简单点\r\n * @param a 起点\r\n * @param b 终点\r\n * @param t 过渡时间\r\n * @param c 动画加载完成回调\r\n * @param s 动画开始回调\r\n */\r\n\ttweenInOut = (a, b, t, c, s) => {\r\n\t\tlet tween = new TWEEN.Tween(a)\r\n\t\t\t.to(b, t)\r\n\t\t\t.easing(TWEEN.Easing.Exponential.InOut);\r\n\r\n\t\tc && tween.onComplete(c);\r\n\t\ts && tween.onStart(s);\r\n\r\n\t\treturn tween.start();\r\n\t};\r\n\r\n\t/**\r\n * 递归加载、合并多个材质文件\r\n * TODO 弃用深拷贝,略浪费性能\r\n * @param {*} paths config.data.materials,数组\r\n * @param {*} loader 文件加载器\r\n * @param {*} material 加载完成后的材质对象,调用时传null就行了\r\n * @param {*} callback 加载完成后的回调,相当于ajax里的success,传回材质对象\r\n */\r\n\tloadMaterials = (paths, loader, material, callback) => {\r\n\t\tloader.load(paths[0], materials => {\r\n\t\t\tmaterial ? material.materialsInfo = [...material.materialsInfo, ...materials.materialsInfo] : material = materials;\r\n\r\n\t\t\tpaths.shift();\r\n\r\n\t\t\tpaths.length != 0 ? loadMaterials(paths, loader, material, callback) : callback(material);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * 递归加载、合并多个模型文件\r\n * TODO 弃用深拷贝,略浪费性能\r\n * @param {*} paths config.data.objects,数组\r\n * @param {*} loader 文件加载器\r\n * @param {*} object 加载完成后的模型对象,调用时传null就行了\r\n * @param {*} callback 加载完成后的回调,相当于ajax里的success,传回模型对象\r\n */\r\n\tloadObjects = (paths, loader, object, callback) => {\r\n\t\tloader.load(paths[0], objects => {\r\n\t\t\tobject ? object.children = objects.children.concat(object.children) : object = extend({}, objects);\r\n\r\n\t\t\tpaths.shift();\r\n\r\n\t\t\tpaths.length != 0 ? loadObjects(paths, loader, object, callback) : callback(object);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * 初始化参数\r\n */\r\n\tinitParams = () => {\r\n\t\tconst { config } = this;\r\n\t\tconst { cameraPosition, clientWidth, clientHeight } = config;\r\n\t\tconst { x, y, z } = cameraPosition;\r\n\r\n\t\t// 挂载画布的dom\r\n\t\tthis.container = config.container;\r\n\r\n\t\t// 相机视锥体的长宽比\r\n\t\tconst cameraAspect = clientWidth / clientHeight;\r\n\r\n\t\tthis.camera = new THREE.PerspectiveCamera(45, cameraAspect, 1, 10000);\r\n\t\tthis.camera.position.set(x, y, z);\r\n\r\n\t\t// 设置画布透明\r\n\t\tthis.renderer = new THREE.WebGLRenderer({\r\n\t\t\talpha: true,\r\n\t\t\tantialias: true\r\n\t\t});\r\n\t\t// this.renderer.setSize(clientWidth, clientHeight - 4);\r\n\t\tthis.resize(clientWidth, clientHeight - 4);\r\n\t\tthis.renderer.shadowMap.enabled = true; // 启用阴影选项\r\n\t\tthis.renderer.shadowMap.type = THREE.PCFSoftShadowMap;\r\n\r\n\t\tthis.container.appendChild(this.renderer.domElement);\r\n\r\n\t\tthis.scene = new THREE.Scene();\r\n\t\tthis.scene.add(this.camera);\r\n\r\n\t\t// 初始化轨道控制\r\n\t\tlet controls = new OrbitControls(this.camera, this.renderer.domElement);\r\n\r\n\t\tObject.assign(controls, config.controls);\r\n\t\tthis.controls = controls;\r\n\r\n\t\t// 初始化光线\r\n\t\tif (config.light) {\r\n\t\t\tlet lights = config.light();\r\n\r\n\t\t\tfor (let light of lights) {\r\n\t\t\t\tthis.scene.add(light);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 设置背景颜色\r\n\t\tconfig.clearColor && this.renderer.setClearColor(config.clearColor, config.clearOpacity);\r\n\t}\r\n\r\n\t/**\r\n * 完成开场动画后,相机视角变动\r\n * 一种是旋转mesh,一种是改变相机位置\r\n * 这是旋转mesh\r\n */\r\n\tafterMovementMesh = () => {\r\n\t\tconst { afterRotation } = this.config;\r\n\r\n\t\tconst rotateAnimate = () => {\r\n\t\t\trequestAnimationFrame(rotateAnimate);\r\n\r\n\t\t\t// 沿x轴旋转\r\n\t\t\tthis.root.rotation.x >= afterRotation ? this.root.rotation.x -= this.config.rotationSpeed : null;\r\n\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\r\n\t\trotateAnimate();\r\n\t}\r\n\r\n\t/**\r\n * 预处理模型数据\r\n * @param object 模型数据\r\n */\r\n\thandleMesh = object => {\r\n\t\tlet { config, _startTweenCount } = this;\r\n\r\n\t\tobject.traverse(child => {\r\n\t\t\tif (child instanceof THREE.Group) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (child instanceof THREE.Mesh) {\r\n\t\t\t\tchild.geometry = new THREE.Geometry().fromBufferGeometry(child.geometry);\r\n\t\t\t} else if (child instanceof THREE.Line) {\r\n\t\t\t\tconsole.log(child.name);\r\n\t\t\t}\r\n\r\n\t\t\tchild.name == 'texture' && (this.modelTexture = child);\r\n\r\n\t\t\tthis.dealObjectInLoadCirculStart(child, config.borderVisible);\r\n\r\n\t\t\tthis.childMapping(child, config);\r\n\r\n\t\t\tlet time = this.handleModelShift(child, config);\r\n\r\n\t\t\t// 开始动画\r\n\t\t\tthis.tweenInOut(child.position, { x: 0, y: 0, z: 0 }, time, () => {\r\n\t\t\t\t_startTweenCount--;\r\n\r\n\t\t\t\tif (_startTweenCount === 0) {\r\n\t\t\t\t\tthis.renderPillar(object);\r\n\t\t\t\t\tthis.afterMovementMesh();\r\n\r\n\t\t\t\t\t// TODO 这里不该循环,应急\r\n\t\t\t\t\tfor (let child of object.children) {\r\n\t\t\t\t\t\tthis.config.beforeAnimate && this.config.beforeAnimate(child, true);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// 绑定事件,比如鼠标移到板块上高亮\r\n\t\t\t\t\tthis.initListener(object);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t_startTweenCount++;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n * 显示贴图\r\n * @param material 传入的材质,最后和原材质中的属性合并\r\n * @param url 等值面图片地址\r\n */\r\n\tshowTexture = (material, url) => {\r\n\t\tif (url) {\r\n\t\t\tnew THREE.TextureLoader().load(url, map => {\r\n\t\t\t\tthis.modelTexture.material.map = map;\r\n\r\n\t\t\t\tthis.modelTexture.material = Object.assign(this.modelTexture.material, material);\r\n\t\t\t\tthis.modelTexture.visible = !this.modelTexture.visible;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgetObject = () => this.dataObject;\r\n\r\n\t/**\r\n * 更新数据并刷新柱子高度,也就是动画重播一遍\r\n * TODO 根据传入对象判断哪些对象需要更新\r\n * @param {*} object 新的模型对象\r\n */\r\n\trefreshPillar = object => {\r\n\t\tlet { dataObject } = this;\r\n\r\n\t\tdataObject = object;\r\n\t\tthis.renderPillar(dataObject);\r\n\t}\r\n\r\n\tflush = () => {\r\n\t\t// 实时渲染\r\n\t\tconst render = () => {\r\n\t\t\trequestAnimationFrame(render);\r\n\r\n\t\t\tTWEEN.update();\r\n\t\t\tthis.controls.update();\r\n\r\n\t\t\tthis.renderer.render(this.scene, this.camera);\r\n\t\t};\r\n\r\n\t\trender();\r\n\t}\r\n\r\n\t// 渲染柱子\r\n\trenderPillar = object => {\r\n\t\tconst { config } = this;\r\n\r\n\t\tobject.traverse(child => {\r\n\t\t\tthis.changeModel4DataRefresh(child, config.divisor);\r\n\t\t});\r\n\t}\r\n\r\n\tresize = (width = document.documentElement.clientWidth, height = document.documentElement.clientHeight - 4) => {\r\n\t\tthis.renderer.setSize(width, height);\r\n\t}\r\n\r\n\tinit = () => {\r\n\t\tlet { config } = this;\r\n\r\n\t\tconst { materials, objects } = config.data;\r\n\r\n\t\t// 初始化前的钩子\r\n\t\tconfig.beforeInit && config.beforeInit(config);\r\n\r\n\t\tconst loader = new Loader(config);\r\n\r\n\t\tloader.load(materials, objects, object => {\r\n\t\t\t// 请求业务数据\r\n\t\t\tconfig.data.load(object, newObject => {\r\n\t\t\t\tthis.dataObject = newObject;\r\n\r\n\t\t\t\tthis.handleMesh(newObject);\r\n\r\n\t\t\t\tthis.root = new THREE.Object3D().add(newObject);\r\n\t\t\t\tthis.scene.add(this.root);\r\n\r\n\t\t\t\tthis.flush();\r\n\t\t\t});\r\n\t\t});\r\n\t};\r\n}","/*\r\n * @Author: zy9@github.com/zy410419243\r\n * @Date: 2018-04-24 15:34:46\r\n * @Last Modified by: zy9\r\n * @Last Modified time: 2018-07-13 08:55:29\r\n */\r\nimport Trunk from './core';\r\n\r\nexport default Trunk;"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/index.html b/dist/index.html index 3156a86..d4f52f7 100644 --- a/dist/index.html +++ b/dist/index.html @@ -1 +1 @@ -
显示等值面
刷新柱子
\ No newline at end of file +
显示等值面
刷新柱子
\ No newline at end of file diff --git a/webpack.prod.js b/webpack.prod.js index 125a2b6..2c0ecf8 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -6,7 +6,7 @@ */ const webpack = require('webpack'); const fs = require('fs'); -const CleanWebpackPlugin = require('clean-webpack-plugin'); +const { CleanWebpackPlugin } = require('clean-webpack-plugin'); // const CopyWebpackPlugin = require('copy-webpack-plugin'); // const TohoLogPlugin = require('toho-log-plugin'); const TohoLogPlugin = require('./plugins/toho-log-plugin'); @@ -26,20 +26,22 @@ let plugins = commonPlugin; plugins.push(new TohoLogPlugin({ dev: false })); -plugins.push(new CleanWebpackPlugin(['dist'], { - verbose: false -})); +plugins.push( + new CleanWebpackPlugin({ + verbose: false, + }), +); const options = { mode: 'production', devServer: { - port: 9099 + port: 9099, }, resolve: { extensions: ['.js'], }, externals: { - 'three': 'three' + three: 'three', }, devtool: 'source-map', entry: { @@ -49,10 +51,10 @@ const options = { path: __dirname + '/dist', filename: '[name].js', chunkFilename: 'vendor/[name].js', - libraryTarget: 'umd' + libraryTarget: 'umd', }, plugins, - module: commonModule + module: commonModule, }; -webpack(options).run(); \ No newline at end of file +webpack(options).run();