ThreeJS-Webpack-ES6-Boilerp.../build/js/0.app.js.map

1 line
279 KiB
Plaintext

{"version":3,"sources":["webpack:///./src/js/utils/orbitControls.js","webpack:///./src/js/data/config.js","webpack:///./src/js/utils/detector.js","webpack:///./src/js/app/components/renderer.js","webpack:///./src/js/app/components/camera.js","webpack:///./src/js/app/components/light.js","webpack:///./src/js/app/components/controls.js","webpack:///./src/js/app/components/material.js","webpack:///./src/js/app/helpers/stats.js","webpack:///./src/js/app/components/geometry.js","webpack:///./src/js/app/helpers/vertexNormalsHelper.js","webpack:///./src/js/app/helpers/meshHelper.js","webpack:///./src/js/utils/helpers.js","webpack:///./src/js/app/model/texture.js","webpack:///./src/js/utils/bufferGeometryUtils.js","webpack:///./src/js/app/loaders/GLTFLoader.js","webpack:///./src/js/app/model/model.js","webpack:///./src/js/utils/keyboard.js","webpack:///./src/js/app/managers/interaction.js","webpack:///./src/js/app/managers/datGUI.js","webpack:///./src/js/app/main.js","webpack:///./src/js/app.js"],"names":["module","exports","THREE","MOUSE","OrbitConstraint","object","this","target","Vector3","minDistance","maxDistance","Infinity","minZoom","maxZoom","minPolarAngle","maxPolarAngle","Math","PI","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","theta","phi","v","offset","quat","quatInverse","lastPosition","lastQuaternion","scope","EPS","phiDelta","thetaDelta","scale","panOffset","zoomChanged","getPolarAngle","getAzimuthalAngle","rotateLeft","angle","rotateUp","panLeft","distance","te","matrix","elements","set","multiplyScalar","add","panUp","pan","deltaX","deltaY","screenWidth","screenHeight","PerspectiveCamera","targetDistance","position","clone","sub","length","tan","fov","OrthographicCamera","right","left","top","bottom","console","warn","dollyIn","dollyScale","zoom","max","min","updateProjectionMatrix","dollyOut","update","Quaternion","setFromUnitVectors","up","inverse","copy","applyQuaternion","atan2","x","z","sqrt","y","radius","sin","cos","lookAt","distanceToSquared","dot","quaternion","OrbitControls","domElement","constraint","undefined","document","Object","defineProperty","get","enabled","center","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","keys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","ORBIT","ZOOM","MIDDLE","PAN","rotateStart","Vector2","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","STATE","state","target0","position0","zoom0","changeEvent","type","startEvent","endEvent","element","body","clientWidth","clientHeight","getZoomScale","pow","onMouseDown","event","preventDefault","button","clientX","clientY","addEventListener","onMouseMove","onMouseUp","dispatchEvent","subVectors","removeEventListener","onMouseWheel","stopPropagation","delta","wheelDelta","detail","onKeyDown","keyCode","touchstart","touches","pageX","pageY","dx","dy","touchmove","touchend","contextmenu","reset","dispose","window","prototype","create","EventDispatcher","constructor","defineProperties","value","noZoom","noRotate","noPan","noKeys","staticMoving","dynamicDampingFactor","isDev","isShowingStats","isLoaded","isTweening","isRotating","isMouseMoving","isMouseOver","maxAnisotropy","dpr","easing","TWEEN","Easing","Quadratic","InOut","duration","model","selected","initialTypes","models","path","texture","imageFiles","name","image","mesh","enableHelper","wireframe","translucent","material","color","emissive","fog","near","camera","far","aspect","posX","posY","posZ","controls","ambientLight","directionalLight","intensity","shadow","helperEnabled","bias","mapWidth","mapHeight","pointLight","hemiLight","groundColor","canvas","CanvasRenderingContext2D","webgl","createElement","WebGLRenderingContext","getContext","e","workers","Worker","fileapi","File","FileReader","FileList","Blob","getWebGLErrorMessage","id","style","fontFamily","fontSize","fontWeight","textAlign","background","padding","width","margin","innerHTML","join","addGetWebGLMessage","parameters","parent","appendChild","Renderer","scene","container","threeRenderer","antialias","setClearColor","setPixelRatio","devicePixelRatio","shadowMap","Config","capabilities","getMaxAnisotropy","updateSize","setSize","offsetWidth","offsetHeight","render","Camera","renderer","height","threeCamera","Light","init","visible","castShadow","mapSize","directionalLightHelper","lightName","Controls","orbitControls","threeControls","Material","basic","side","standard","shading","roughness","metalness","wire","rS","bS","glS","tS","Geometry","geo","widthSegments","heightSegments","rotation","receiveShadow","Stats","start","tick","frame","end","BrowserStats","glStats","threeStats","rStats","CSSPath","userTimingAPI","values","caption","over","average","avgMs","fps","below","calls","raf","rstats","groups","fractions","base","steps","plugins","_v1","_v2","_normalMatrix","Matrix3","_keys","VertexNormalsHelper","size","hex","nNormals","objGeometry","geometry","isGeometry","faces","isBufferGeometry","attributes","normal","count","BufferGeometry","positions","Float32BufferAttribute","setAttribute","LineSegments","call","LineBasicMaterial","toneMapped","matrixAutoUpdate","idx","updateMatrixWorld","getNormalMatrix","matrixWorld","vertices","i","l","face","j","jl","vertexNormals","vertex","applyMatrix4","applyMatrix3","normalize","setXYZ","objPos","objNorm","getX","getY","getZ","needsUpdate","MeshHelper","wireLine","depthTest","opacity","transparent","edges","edgesLine","vertexHelper","boxHelper","remove","Helpers","fn","threshhold","last","deferTimer","context","now","Date","args","arguments","clearTimeout","setTimeout","apply","xhr","lengthComputable","percentComplete","loaded","total","log","round","error","replace","setHex","vertexColors","verticesNeedUpdate","normalsNeedUpdate","colorsNeedUpdate","materialKey","textures","key","Texture","loader","promiseArray","setPath","forEach","imageFile","push","Promise","resolve","reject","load","anisotropy","modelOBJ","logProgress","Error","all","then","reason","BufferGeometryUtils","index","uv","indices","array","normals","uvs","nVertices","tangent","BufferAttribute","Float32Array","tangents","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","il","group","handleTriangle","w","t","test","tmp","tmp2","n","n2","handleVertex","a","b","c","fromArray","r","isFinite","addScaledVector","crossVectors","GLTFLoader","manager","Loader","dracoLoader","ddsLoader","GLTFRegistry","objects","removeAll","assign","url","onLoad","onProgress","onError","resourcePath","LoaderUtils","extractUrlBase","itemStart","_onError","itemError","itemEnd","FileLoader","setResponseType","crossOrigin","setWithCredentials","data","parse","gltf","setDRACOLoader","setDDSLoader","content","extensions","decodeText","Uint8Array","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","json","JSON","asset","version","extensionsUsed","extensionName","extensionsRequired","KHR_LIGHTS_PUNCTUAL","GLTFLightsExtension","KHR_MATERIALS_CLEARCOAT","GLTFMaterialsClearcoatExtension","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS","GLTFMaterialsPbrSpecularGlossinessExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","MSFT_TEXTURE_DDS","GLTFTextureDDSExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","indexOf","GLTFParser","extension","lightDefs","lights","loadLight","lightIndex","lightNode","lightDef","Color","range","DirectionalLight","PointLight","SpotLight","spot","innerConeAngle","outerConeAngle","penumbra","decay","getMaterialType","MeshBasicMaterial","extendParams","materialParams","materialDef","parser","pending","metallicRoughness","pbrMetallicRoughness","Array","isArray","baseColorFactor","baseColorTexture","assignTexture","MeshPhysicalMaterial","clearcoatFactor","clearcoat","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughness","clearcoatRoughnessTexture","clearcoatNormalTexture","clearcoatNormalScale","BINARY_EXTENSION_CHUNK_TYPES","headerView","DataView","header","magic","slice","getUint32","chunkView","chunkIndex","byteLength","chunkLength","chunkType","contentArray","byteOffset","preload","GLTFMeshStandardSGMaterial","params","MeshStandardMaterial","isGLTFSpecularGlossinessMaterial","specularMapParsFragmentChunk","glossinessMapParsFragmentChunk","specularMapFragmentChunk","glossinessMapFragmentChunk","lightPhysicalFragmentChunk","uniforms","specular","glossiness","specularMap","glossinessMap","_extraUniforms","onBeforeCompile","shader","uniformName","fragmentShader","defines","USE_GLOSSINESSMAP","USE_ROUGHNESSMAP","metalnessMap","roughnessMap","setValues","specularGlossinessParams","pbrSpecularGlossiness","diffuseFactor","diffuseTexture","glossinessFactor","specularFactor","specularGlossinessTexture","specGlossMapDef","createMaterial","map","lightMap","lightMapIntensity","aoMap","aoMapIntensity","emissiveIntensity","emissiveMap","bumpMap","bumpScale","normalMap","normalMapType","TangentSpaceNormalMap","normalScale","displacementMap","displacementScale","displacementBias","alphaMap","envMap","envMapIntensity","refractionRatio","GLTFCubicSplineInterpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","Interpolant","decodePrimitive","primitive","bufferViewIndex","bufferView","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","attributeName","threeAttributeName","ATTRIBUTES","toLowerCase","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","normalized","getDependency","decodeDracoFile","attribute","extendTexture","transform","repeat","texCoord","source","copySampleValue_","result","valueSize","beforeStart_","afterEnd_","interpolate_","i1","t0","t1","stride","stride2","stride3","td","p","pp","ppp","offset1","offset0","s2","s3","s0","s1","p0","m0","p1","m1","WEBGL_CONSTANTS","5120","Int8Array","5121","5122","Int16Array","5123","Uint16Array","5125","Uint32Array","5126","WEBGL_FILTERS","9728","NearestFilter","9729","LinearFilter","9984","NearestMipmapNearestFilter","9985","LinearMipmapNearestFilter","9986","NearestMipmapLinearFilter","9987","LinearMipmapLinearFilter","WEBGL_WRAPPINGS","33071","ClampToEdgeWrapping","33648","MirroredRepeatWrapping","10497","RepeatWrapping","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","weights","INTERPOLATION","CUBICSPLINE","LINEAR","InterpolateLinear","STEP","InterpolateDiscrete","ALPHA_MODES","MIME_TYPE_FORMATS","RGBAFormat","RGBFormat","resolveURL","addUnknownExtensionsToUserData","knownExtensions","objectDef","userData","gltfExtensions","assignExtrasToUserData","gltfDef","extras","updateMorphTargets","meshDef","morphTargetInfluences","targetNames","morphTargetDictionary","createAttributesKey","attributesKey","sort","options","cache","primitiveCache","textureLoader","TextureLoader","setCrossOrigin","fileLoader","addPrimitiveAttributes","primitiveDef","assignAttributeAccessor","accessorIndex","accessor","gltfAttributeName","setIndex","box","Box3","targets","maxDisplacement","vector","setX","abs","setY","setZ","expandByVector","boundingBox","sphere","Sphere","getCenter","distanceTo","boundingSphere","computeBounds","hasMorphPosition","hasMorphNormal","pendingPositionAccessors","pendingNormalAccessors","pendingAccessor","morphPositions","morphNormals","morphAttributes","morphTargetsRelative","addMorphTargets","toTrianglesDrawMode","drawMode","getIndex","getAttribute","numberOfTriangles","newIndices","TriangleFanDrawMode","newGeometry","markDefs","getDependencies","dependencies","scenes","animations","cameras","nodeDefs","nodes","skinDefs","skins","meshDefs","meshes","meshReferences","meshUses","skinIndex","skinLength","joints","isBone","nodeIndex","nodeLength","nodeDef","skin","isSkinnedMesh","cacheKey","dependency","loadScene","loadNode","loadMesh","loadAccessor","loadBufferView","loadBuffer","loadMaterial","loadTexture","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","buffers","uri","bufferViewDef","bufferViews","buffer","sparse","pendingBufferViews","bufferAttribute","itemSize","TypedArray","elementBytes","BYTES_PER_ELEMENT","itemBytes","byteStride","ibSlice","floor","ibCacheKey","ib","InterleavedBuffer","InterleavedBufferAttribute","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","setW","textureIndex","URL","self","webkitURL","textureDef","textureExtensions","sourceURI","images","isObjectURL","blob","mimeType","createObjectURL","getHandler","revokeObjectURL","flipY","format","sampler","samplers","magFilter","minFilter","wrapS","wrapT","mapName","mapDef","isCompressedTexture","assignFinalMaterial","useVertexTangents","useVertexColors","useFlatShading","useSkinning","useMorphTargets","useMorphNormals","isPoints","uuid","pointsMaterial","PointsMaterial","sizeAttenuation","isLine","lineMaterial","cachedMaterial","skinning","vertexTangents","flatShading","morphTargets","uv2","materialIndex","materialType","materials","materialExtensions","sgExtension","kmuExtension","metallicFactor","roughnessFactor","metallicRoughnessTexture","doubleSided","DoubleSide","alphaMode","depthWrite","alphaTest","alphaCutoff","normalTexture","occlusionTexture","strength","emissiveFactor","emissiveTexture","clearcoatExtension","encoding","sRGBEncoding","loadGeometries","primitives","createDracoPrimitive","dracoExtension","geometryPromise","mode","cached","promise","meshIndex","FrontSide","results","geometries","SkinnedMesh","Mesh","skinWeight","normalizeSkinWeights","TriangleStripDrawMode","Line","LineLoop","Points","Group","cameraIndex","cameraDef","MathUtils","radToDeg","yfov","aspectRatio","znear","zfar","xmag","ymag","skinDef","skinEntry","inverseBindMatrices","animationIndex","animationDef","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","channel","node","input","output","inputAccessors","outputAccessors","tracks","inputAccessor","outputAccessor","TypedKeyframeTrack","updateMatrix","NumberKeyframeTrack","QuaternionKeyframeTrack","VectorKeyframeTrack","targetName","interpolation","traverse","isMesh","outputArray","scaled","track","createInterpolant","times","getValueSize","isInterpolantFactoryMethodGLTFCubicSpline","AnimationClip","instanceNum","o","light","Bone","Object3D","PropertyBinding","sanitizeNodeName","Matrix4","buildNodeHierachy","nodeId","parentObject","pendingJoints","jointNodes","bones","boneInverses","jointNode","mat","bind","Skeleton","children","child","sceneIndex","sceneDef","nodeIds","Model","obj","ref","isLight","logError","UV","ALIAS","Keyboard","keyCodes","onKeyChange","onBlur","prop","keyDesc","split","pressed","toUpperCase","charCodeAt","aliases","aliasKeys","shiftKey","ctrlKey","altKey","metaKey","Interaction","timeout","keyboard","throttle","onMouseLeave","onMouseOver","eventMatches","DatGUI","main","gui","dat","GUI","meshHelper","cameraFolder","addFolder","cameraFOVGui","onChange","onFinishChange","cameraAspectGui","addColor","cameraFogNearGui","density","controlsFolder","controlsAutoRotateSpeedGui","disable","unload","meshFolder","enable","ambientLightFolder","directionalLightFolder","directionalLightIntensityGui","directionalLightPositionXGui","directionalLightPositionYGui","directionalLightPositionZGui","shadowFolder","shadowNearGui","shadowFarGui","shadowTopGui","shadowRightGui","shadowBottomGui","shadowLeftGui","shadowBiasGui","pointLightFolder","pointLightIntensityGui","pointLightDistanceGui","pointLightPositionXGui","pointLightPositionYGui","pointLightPositionZGui","hemiLightFolder","hemiLightIntensityGui","hemiLightPositionXGui","hemiLightPositionYGui","hemiLightPositionZGui","destroy","Main","clock","place","make","stats","setUp","item","querySelector","display","requestAnimationFrame","Detector","getElementById"],"mappings":"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","file":"0.app.js","sourcesContent":["module.exports = function (THREE) {\n var MOUSE = THREE.MOUSE;\n if (!MOUSE) MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\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 /*global THREE, console */\n\n function OrbitConstraint(object) {\n this.object = object;\n\n // \"target\" sets the location of focus, where the object orbits around\n // and where it pans with respect to.\n this.target = new THREE.Vector3();\n\n // Limits to how far you can dolly in and out ( PerspectiveCamera only )\n this.minDistance = 0;\n this.maxDistance = Infinity;\n\n // Limits to how far you can zoom in and out ( OrthographicCamera only )\n this.minZoom = 0;\n this.maxZoom = Infinity;\n\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n this.minPolarAngle = 0; // radians\n this.maxPolarAngle = Math.PI; // radians\n\n // How far you can orbit horizontally, upper and lower limits.\n // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n this.minAzimuthAngle = -Infinity; // radians\n this.maxAzimuthAngle = Infinity; // radians\n\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n this.enableDamping = false;\n this.dampingFactor = 0.25;\n\n ////////////\n // internals\n\n var scope = this;\n\n var EPS = 0.000001;\n\n // Current position in spherical coordinate system.\n var theta;\n var phi;\n\n // Pending changes\n var phiDelta = 0;\n var thetaDelta = 0;\n var scale = 1;\n var panOffset = new THREE.Vector3();\n var zoomChanged = false;\n\n // API\n\n this.getPolarAngle = function () {\n return phi;\n };\n\n this.getAzimuthalAngle = function () {\n return theta;\n };\n\n this.rotateLeft = function (angle) {\n thetaDelta -= angle;\n };\n\n this.rotateUp = function (angle) {\n phiDelta -= angle;\n };\n\n // pass in distance in world space to move left\n this.panLeft = (function () {\n var v = new THREE.Vector3();\n\n return function panLeft(distance) {\n var te = this.object.matrix.elements;\n\n // get X column of matrix\n v.set(te[0], te[1], te[2]);\n v.multiplyScalar(-distance);\n\n panOffset.add(v);\n };\n })();\n\n // pass in distance in world space to move up\n this.panUp = (function () {\n var v = new THREE.Vector3();\n\n return function panUp(distance) {\n var te = this.object.matrix.elements;\n\n // get Y column of matrix\n v.set(te[4], te[5], te[6]);\n v.multiplyScalar(distance);\n\n panOffset.add(v);\n };\n })();\n\n // pass in x,y of change desired in pixel space,\n // right and down are positive\n this.pan = function (deltaX, deltaY, screenWidth, screenHeight) {\n if (scope.object instanceof THREE.PerspectiveCamera) {\n // perspective\n var position = scope.object.position;\n var offset = position.clone().sub(scope.target);\n var targetDistance = offset.length();\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0);\n\n // we actually don't use screenWidth, since perspective camera is fixed to screen height\n scope.panLeft((2 * deltaX * targetDistance) / screenHeight);\n scope.panUp((2 * deltaY * targetDistance) / screenHeight);\n } else if (scope.object instanceof THREE.OrthographicCamera) {\n // orthographic\n scope.panLeft((deltaX * (scope.object.right - scope.object.left)) / screenWidth);\n scope.panUp((deltaY * (scope.object.top - scope.object.bottom)) / screenHeight);\n } else {\n // camera neither orthographic or perspective\n console.warn(\n 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.'\n );\n }\n };\n\n this.dollyIn = function (dollyScale) {\n if (scope.object instanceof THREE.PerspectiveCamera) {\n scale /= dollyScale;\n } else if (scope.object instanceof THREE.OrthographicCamera) {\n scope.object.zoom = Math.max(\n this.minZoom,\n Math.min(this.maxZoom, this.object.zoom * dollyScale)\n );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n } else {\n console.warn(\n 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.'\n );\n }\n };\n\n this.dollyOut = function (dollyScale) {\n if (scope.object instanceof THREE.PerspectiveCamera) {\n scale *= dollyScale;\n } else if (scope.object instanceof THREE.OrthographicCamera) {\n scope.object.zoom = Math.max(\n this.minZoom,\n Math.min(this.maxZoom, this.object.zoom / dollyScale)\n );\n scope.object.updateProjectionMatrix();\n zoomChanged = true;\n } else {\n console.warn(\n 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.'\n );\n }\n };\n\n this.update = (function () {\n var offset = new THREE.Vector3();\n\n // so camera.up is the orbit axis\n var quat = new THREE.Quaternion().setFromUnitVectors(object.up, new THREE.Vector3(0, 1, 0));\n var quatInverse = quat.clone().inverse();\n\n var lastPosition = new THREE.Vector3();\n var lastQuaternion = new THREE.Quaternion();\n\n return function () {\n var position = this.object.position;\n\n offset.copy(position).sub(this.target);\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat);\n\n // angle from z-axis around y-axis\n\n theta = Math.atan2(offset.x, offset.z);\n\n // angle from y-axis\n\n phi = Math.atan2(Math.sqrt(offset.x * offset.x + offset.z * offset.z), offset.y);\n\n theta += thetaDelta;\n phi += phiDelta;\n\n // restrict theta to be between desired limits\n theta = Math.max(this.minAzimuthAngle, Math.min(this.maxAzimuthAngle, theta));\n\n // restrict phi to be between desired limits\n phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, phi));\n\n // restrict phi to be betwee EPS and PI-EPS\n phi = Math.max(EPS, Math.min(Math.PI - EPS, phi));\n\n var radius = offset.length() * scale;\n\n // restrict radius to be between desired limits\n radius = Math.max(this.minDistance, Math.min(this.maxDistance, radius));\n\n // move target to panned location\n this.target.add(panOffset);\n\n offset.x = radius * Math.sin(phi) * Math.sin(theta);\n offset.y = radius * Math.cos(phi);\n offset.z = radius * Math.sin(phi) * Math.cos(theta);\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse);\n\n position.copy(this.target).add(offset);\n\n this.object.lookAt(this.target);\n\n if (this.enableDamping === true) {\n thetaDelta *= 1 - this.dampingFactor;\n phiDelta *= 1 - this.dampingFactor;\n } else {\n thetaDelta = 0;\n phiDelta = 0;\n }\n\n scale = 1;\n panOffset.set(0, 0, 0);\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (\n zoomChanged ||\n lastPosition.distanceToSquared(this.object.position) > EPS ||\n 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS\n ) {\n lastPosition.copy(this.object.position);\n lastQuaternion.copy(this.object.quaternion);\n zoomChanged = false;\n\n return true;\n }\n\n return false;\n };\n })();\n }\n\n // This set of controls performs orbiting, dollying (zooming), and panning. It maintains\n // the \"up\" direction as +Y, unlike the TrackballControls. Touch on tablet and phones is\n // supported.\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: three finter swipe\n\n function OrbitControls(object, domElement) {\n var constraint = new OrbitConstraint(object);\n\n this.domElement = domElement !== undefined ? domElement : document;\n\n // API\n\n Object.defineProperty(this, 'constraint', {\n get: function () {\n return constraint;\n },\n });\n\n this.getPolarAngle = function () {\n return constraint.getPolarAngle();\n };\n\n this.getAzimuthalAngle = function () {\n return constraint.getAzimuthalAngle();\n };\n\n // Set to false to disable this control\n this.enabled = true;\n\n // center is old, deprecated; use \"target\" instead\n this.center = this.target;\n\n // This option actually enables dollying in and out; left as \"zoom\" for\n // backwards compatibility.\n // Set to false to disable zooming\n this.enableZoom = true;\n this.zoomSpeed = 1.0;\n\n // Set to false to disable rotating\n this.enableRotate = true;\n this.rotateSpeed = 1.0;\n\n // Set to false to disable panning\n this.enablePan = true;\n this.keyPanSpeed = 7.0; // pixels moved per arrow key push\n\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n this.autoRotate = false;\n this.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n // Set to false to disable use of the keys\n this.enableKeys = true;\n\n // The four arrow keys\n this.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n // Mouse buttons\n this.mouseButtons = {\n ORBIT: THREE.MOUSE.LEFT,\n ZOOM: THREE.MOUSE.MIDDLE,\n PAN: THREE.MOUSE.RIGHT,\n };\n\n ////////////\n // internals\n\n var scope = this;\n\n var rotateStart = new THREE.Vector2();\n var rotateEnd = new THREE.Vector2();\n var rotateDelta = new THREE.Vector2();\n\n var panStart = new THREE.Vector2();\n var panEnd = new THREE.Vector2();\n var panDelta = new THREE.Vector2();\n\n var dollyStart = new THREE.Vector2();\n var dollyEnd = new THREE.Vector2();\n var dollyDelta = new THREE.Vector2();\n\n var STATE = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_DOLLY: 4,\n TOUCH_PAN: 5,\n };\n\n var state = STATE.NONE;\n\n // for reset\n\n this.target0 = this.target.clone();\n this.position0 = this.object.position.clone();\n this.zoom0 = this.object.zoom;\n\n // events\n\n var changeEvent = { type: 'change' };\n var startEvent = { type: 'start' };\n var endEvent = { type: 'end' };\n\n // pass in x,y of change desired in pixel space,\n // right and down are positive\n function pan(deltaX, deltaY) {\n var element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n constraint.pan(deltaX, deltaY, element.clientWidth, element.clientHeight);\n }\n\n this.update = function () {\n if (this.autoRotate && state === STATE.NONE) {\n constraint.rotateLeft(getAutoRotationAngle());\n }\n\n if (constraint.update() === true) {\n this.dispatchEvent(changeEvent);\n }\n };\n\n this.reset = function () {\n state = STATE.NONE;\n\n this.target.copy(this.target0);\n this.object.position.copy(this.position0);\n this.object.zoom = this.zoom0;\n\n this.object.updateProjectionMatrix();\n this.dispatchEvent(changeEvent);\n\n this.update();\n };\n\n function getAutoRotationAngle() {\n return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed;\n }\n\n function getZoomScale() {\n return Math.pow(0.95, scope.zoomSpeed);\n }\n\n function onMouseDown(event) {\n if (scope.enabled === false) return;\n\n event.preventDefault();\n\n if (event.button === scope.mouseButtons.ORBIT) {\n if (scope.enableRotate === false) return;\n\n state = STATE.ROTATE;\n\n rotateStart.set(event.clientX, event.clientY);\n } else if (event.button === scope.mouseButtons.ZOOM) {\n if (scope.enableZoom === false) return;\n\n state = STATE.DOLLY;\n\n dollyStart.set(event.clientX, event.clientY);\n } else if (event.button === scope.mouseButtons.PAN) {\n if (scope.enablePan === false) return;\n\n state = STATE.PAN;\n\n panStart.set(event.clientX, event.clientY);\n }\n\n if (state !== STATE.NONE) {\n document.addEventListener('mousemove', onMouseMove, false);\n document.addEventListener('mouseup', onMouseUp, false);\n scope.dispatchEvent(startEvent);\n }\n }\n\n function onMouseMove(event) {\n if (scope.enabled === false) return;\n\n event.preventDefault();\n\n var element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n if (state === STATE.ROTATE) {\n if (scope.enableRotate === false) return;\n\n rotateEnd.set(event.clientX, event.clientY);\n rotateDelta.subVectors(rotateEnd, rotateStart);\n\n // rotating across whole screen goes 360 degrees around\n constraint.rotateLeft(\n ((2 * Math.PI * rotateDelta.x) / element.clientWidth) * scope.rotateSpeed\n );\n\n // rotating up and down along whole screen attempts to go 360, but limited to 180\n constraint.rotateUp(\n ((2 * Math.PI * rotateDelta.y) / element.clientHeight) * scope.rotateSpeed\n );\n\n rotateStart.copy(rotateEnd);\n } else if (state === STATE.DOLLY) {\n if (scope.enableZoom === false) return;\n\n dollyEnd.set(event.clientX, event.clientY);\n dollyDelta.subVectors(dollyEnd, dollyStart);\n\n if (dollyDelta.y > 0) {\n constraint.dollyIn(getZoomScale());\n } else if (dollyDelta.y < 0) {\n constraint.dollyOut(getZoomScale());\n }\n\n dollyStart.copy(dollyEnd);\n } else if (state === STATE.PAN) {\n if (scope.enablePan === false) return;\n\n panEnd.set(event.clientX, event.clientY);\n panDelta.subVectors(panEnd, panStart);\n\n pan(panDelta.x, panDelta.y);\n\n panStart.copy(panEnd);\n }\n\n if (state !== STATE.NONE) scope.update();\n }\n\n function onMouseUp(/* event */) {\n if (scope.enabled === false) return;\n\n document.removeEventListener('mousemove', onMouseMove, false);\n document.removeEventListener('mouseup', onMouseUp, false);\n scope.dispatchEvent(endEvent);\n state = STATE.NONE;\n }\n\n function onMouseWheel(event) {\n if (scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n var delta = 0;\n\n if (event.wheelDelta !== undefined) {\n // WebKit / Opera / Explorer 9\n\n delta = event.wheelDelta;\n } else if (event.detail !== undefined) {\n // Firefox\n\n delta = -event.detail;\n }\n\n if (delta > 0) {\n constraint.dollyOut(getZoomScale());\n } else if (delta < 0) {\n constraint.dollyIn(getZoomScale());\n }\n\n scope.update();\n scope.dispatchEvent(startEvent);\n scope.dispatchEvent(endEvent);\n }\n\n function onKeyDown(event) {\n if (scope.enabled === false || scope.enableKeys === false || scope.enablePan === false)\n return;\n\n switch (event.keyCode) {\n case scope.keys.UP:\n pan(0, scope.keyPanSpeed);\n scope.update();\n break;\n\n case scope.keys.BOTTOM:\n pan(0, -scope.keyPanSpeed);\n scope.update();\n break;\n\n case scope.keys.LEFT:\n pan(scope.keyPanSpeed, 0);\n scope.update();\n break;\n\n case scope.keys.RIGHT:\n pan(-scope.keyPanSpeed, 0);\n scope.update();\n break;\n }\n }\n\n function touchstart(event) {\n if (scope.enabled === false) return;\n\n switch (event.touches.length) {\n case 1: // one-fingered touch: rotate\n if (scope.enableRotate === false) return;\n\n state = STATE.TOUCH_ROTATE;\n\n rotateStart.set(event.touches[0].pageX, event.touches[0].pageY);\n break;\n\n case 2: // two-fingered touch: dolly\n if (scope.enableZoom === false) return;\n\n state = STATE.TOUCH_DOLLY;\n\n var dx = event.touches[0].pageX - event.touches[1].pageX;\n var dy = event.touches[0].pageY - event.touches[1].pageY;\n var distance = Math.sqrt(dx * dx + dy * dy);\n dollyStart.set(0, distance);\n break;\n\n case 3: // three-fingered touch: pan\n if (scope.enablePan === false) return;\n\n state = STATE.TOUCH_PAN;\n\n panStart.set(event.touches[0].pageX, event.touches[0].pageY);\n break;\n\n default:\n state = STATE.NONE;\n }\n\n if (state !== STATE.NONE) scope.dispatchEvent(startEvent);\n }\n\n function touchmove(event) {\n if (scope.enabled === false) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n var element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n switch (event.touches.length) {\n case 1: // one-fingered touch: rotate\n if (scope.enableRotate === false) return;\n if (state !== STATE.TOUCH_ROTATE) return;\n\n rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n rotateDelta.subVectors(rotateEnd, rotateStart);\n\n // rotating across whole screen goes 360 degrees around\n constraint.rotateLeft(\n ((2 * Math.PI * rotateDelta.x) / element.clientWidth) * scope.rotateSpeed\n );\n // rotating up and down along whole screen attempts to go 360, but limited to 180\n constraint.rotateUp(\n ((2 * Math.PI * rotateDelta.y) / element.clientHeight) * scope.rotateSpeed\n );\n\n rotateStart.copy(rotateEnd);\n\n scope.update();\n break;\n\n case 2: // two-fingered touch: dolly\n if (scope.enableZoom === false) return;\n if (state !== STATE.TOUCH_DOLLY) return;\n\n var dx = event.touches[0].pageX - event.touches[1].pageX;\n var dy = event.touches[0].pageY - event.touches[1].pageY;\n var distance = Math.sqrt(dx * dx + dy * dy);\n\n dollyEnd.set(0, distance);\n dollyDelta.subVectors(dollyEnd, dollyStart);\n\n if (dollyDelta.y > 0) {\n constraint.dollyOut(getZoomScale());\n } else if (dollyDelta.y < 0) {\n constraint.dollyIn(getZoomScale());\n }\n\n dollyStart.copy(dollyEnd);\n\n scope.update();\n break;\n\n case 3: // three-fingered touch: pan\n if (scope.enablePan === false) return;\n if (state !== STATE.TOUCH_PAN) return;\n\n panEnd.set(event.touches[0].pageX, event.touches[0].pageY);\n panDelta.subVectors(panEnd, panStart);\n\n pan(panDelta.x, panDelta.y);\n\n panStart.copy(panEnd);\n\n scope.update();\n break;\n\n default:\n state = STATE.NONE;\n }\n }\n\n function touchend(/* event */) {\n if (scope.enabled === false) return;\n\n scope.dispatchEvent(endEvent);\n state = STATE.NONE;\n }\n\n function contextmenu(event) {\n event.preventDefault();\n }\n\n this.dispose = function () {\n this.domElement.removeEventListener('contextmenu', contextmenu, false);\n this.domElement.removeEventListener('mousedown', onMouseDown, false);\n this.domElement.removeEventListener('mousewheel', onMouseWheel, false);\n this.domElement.removeEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\n this.domElement.removeEventListener('touchstart', touchstart, false);\n this.domElement.removeEventListener('touchend', touchend, false);\n this.domElement.removeEventListener('touchmove', touchmove, false);\n\n document.removeEventListener('mousemove', onMouseMove, false);\n document.removeEventListener('mouseup', onMouseUp, false);\n\n window.removeEventListener('keydown', onKeyDown, false);\n };\n\n this.domElement.addEventListener('contextmenu', contextmenu, false);\n\n this.domElement.addEventListener('mousedown', onMouseDown, false);\n this.domElement.addEventListener('mousewheel', onMouseWheel, false);\n this.domElement.addEventListener('MozMousePixelScroll', onMouseWheel, false); // firefox\n\n this.domElement.addEventListener('touchstart', touchstart, false);\n this.domElement.addEventListener('touchend', touchend, false);\n this.domElement.addEventListener('touchmove', touchmove, false);\n\n window.addEventListener('keydown', onKeyDown, false);\n\n // force an update at start\n this.update();\n }\n\n OrbitControls.prototype = Object.create(THREE.EventDispatcher.prototype);\n OrbitControls.prototype.constructor = OrbitControls;\n\n Object.defineProperties(OrbitControls.prototype, {\n object: {\n get: function () {\n return this.constraint.object;\n },\n },\n\n target: {\n get: function () {\n return this.constraint.target;\n },\n\n set: function (value) {\n console.warn('THREE.OrbitControls: target is now immutable. Use target.set() instead.');\n this.constraint.target.copy(value);\n },\n },\n\n minDistance: {\n get: function () {\n return this.constraint.minDistance;\n },\n\n set: function (value) {\n this.constraint.minDistance = value;\n },\n },\n\n maxDistance: {\n get: function () {\n return this.constraint.maxDistance;\n },\n\n set: function (value) {\n this.constraint.maxDistance = value;\n },\n },\n\n minZoom: {\n get: function () {\n return this.constraint.minZoom;\n },\n\n set: function (value) {\n this.constraint.minZoom = value;\n },\n },\n\n maxZoom: {\n get: function () {\n return this.constraint.maxZoom;\n },\n\n set: function (value) {\n this.constraint.maxZoom = value;\n },\n },\n\n minPolarAngle: {\n get: function () {\n return this.constraint.minPolarAngle;\n },\n\n set: function (value) {\n this.constraint.minPolarAngle = value;\n },\n },\n\n maxPolarAngle: {\n get: function () {\n return this.constraint.maxPolarAngle;\n },\n\n set: function (value) {\n this.constraint.maxPolarAngle = value;\n },\n },\n\n minAzimuthAngle: {\n get: function () {\n return this.constraint.minAzimuthAngle;\n },\n\n set: function (value) {\n this.constraint.minAzimuthAngle = value;\n },\n },\n\n maxAzimuthAngle: {\n get: function () {\n return this.constraint.maxAzimuthAngle;\n },\n\n set: function (value) {\n this.constraint.maxAzimuthAngle = value;\n },\n },\n\n enableDamping: {\n get: function () {\n return this.constraint.enableDamping;\n },\n\n set: function (value) {\n this.constraint.enableDamping = value;\n },\n },\n\n dampingFactor: {\n get: function () {\n return this.constraint.dampingFactor;\n },\n\n set: function (value) {\n this.constraint.dampingFactor = value;\n },\n },\n\n // backward compatibility\n\n noZoom: {\n get: function () {\n console.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n return !this.enableZoom;\n },\n\n set: function (value) {\n console.warn('THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');\n this.enableZoom = !value;\n },\n },\n\n noRotate: {\n get: function () {\n console.warn(\n 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'\n );\n return !this.enableRotate;\n },\n\n set: function (value) {\n console.warn(\n 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.'\n );\n this.enableRotate = !value;\n },\n },\n\n noPan: {\n get: function () {\n console.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n return !this.enablePan;\n },\n\n set: function (value) {\n console.warn('THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.');\n this.enablePan = !value;\n },\n },\n\n noKeys: {\n get: function () {\n console.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n return !this.enableKeys;\n },\n\n set: function (value) {\n console.warn('THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');\n this.enableKeys = !value;\n },\n },\n\n staticMoving: {\n get: function () {\n console.warn(\n 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'\n );\n return !this.constraint.enableDamping;\n },\n\n set: function (value) {\n console.warn(\n 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.'\n );\n this.constraint.enableDamping = !value;\n },\n },\n\n dynamicDampingFactor: {\n get: function () {\n console.warn(\n 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'\n );\n return this.constraint.dampingFactor;\n },\n\n set: function (value) {\n console.warn(\n 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.'\n );\n this.constraint.dampingFactor = value;\n },\n },\n });\n\n return OrbitControls;\n};\n","import TWEEN from '@tweenjs/tween.js';\n\n// This object contains the state of the app\nexport default {\n isDev: false,\n isShowingStats: true,\n isLoaded: false,\n isTweening: false,\n isRotating: true,\n isMouseMoving: false,\n isMouseOver: false,\n maxAnisotropy: 1,\n dpr: 1,\n easing: TWEEN.Easing.Quadratic.InOut,\n duration: 500,\n model: {\n selected: 0,\n initialTypes: ['gltf', 'object'],\n type: 'gltf'\n },\n models: [\n {\n path: './assets/models/duck.gltf',\n scale: 20,\n type: 'gltf'\n },\n {\n path: './assets/models/Teapot.json',\n scale: 20,\n type: 'object'\n }\n ],\n texture: {\n path: './assets/textures/',\n imageFiles: [\n { name: 'UV', image: 'UV_Grid_Sm.jpg' }\n ]\n },\n mesh: {\n enableHelper: true,\n wireframe: false,\n translucent: false,\n material: {\n color: 0xffffff,\n emissive: 0xffffff\n }\n },\n fog: {\n color: 0xffffff,\n near: 0.0008\n },\n camera: {\n fov: 40,\n near: 2,\n far: 1000,\n aspect: 1,\n posX: 0,\n posY: 30,\n posZ: 40\n },\n controls: {\n autoRotate: true,\n autoRotateSpeed: -0.5,\n rotateSpeed: 0.5,\n zoomSpeed: 0.8,\n minDistance: 200,\n maxDistance: 600,\n minPolarAngle: Math.PI / 5,\n maxPolarAngle: Math.PI / 2,\n minAzimuthAngle: -Infinity,\n maxAzimuthAngle: Infinity,\n enableDamping: true,\n dampingFactor: 0.5,\n enableZoom: true,\n target: {\n x: 0,\n y: 0,\n z: 0\n }\n },\n ambientLight: {\n enabled: true,\n color: 0x141414\n },\n directionalLight: {\n enabled: true,\n color: 0xf0f0f0,\n intensity: 0.4,\n x: -75,\n y: 280,\n z: 150\n },\n shadow: {\n enabled: true,\n helperEnabled: true,\n bias: 0,\n mapWidth: 2048,\n mapHeight: 2048,\n near: 250,\n far: 400,\n top: 100,\n right: 100,\n bottom: -100,\n left: -100\n },\n pointLight: {\n enabled: true,\n color: 0xffffff,\n intensity: 0.34,\n distance: 115,\n x: 0,\n y: 0,\n z: 0\n },\n hemiLight: {\n enabled: true,\n color: 0xc8c8c8,\n groundColor: 0xffffff,\n intensity: 0.55,\n x: 0,\n y: 0,\n z: 0\n }\n};\n","/**\n * @author alteredq / http://alteredqualia.com/\n * @author mr.doob / http://mrdoob.com/\n */\n\nexport default {\n canvas: !!window.CanvasRenderingContext2D,\n webgl: (function() {\n try {\n var canvas = document.createElement('canvas');\n\n return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')));\n } catch(e) {\n return false;\n }\n })(),\n\n workers: !!window.Worker,\n fileapi: window.File && window.FileReader && window.FileList && window.Blob,\n\n getWebGLErrorMessage: function() {\n var element = document.createElement('div');\n element.id = 'webgl-error-message';\n element.style.fontFamily = 'monospace';\n element.style.fontSize = '13px';\n element.style.fontWeight = 'normal';\n element.style.textAlign = 'center';\n element.style.background = '#fff';\n element.style.color = '#000';\n element.style.padding = '1.5em';\n element.style.width = '400px';\n element.style.margin = '5em auto 0';\n\n if(!this.webgl) {\n element.innerHTML = window.WebGLRenderingContext ? [\n 'Your graphics card does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\" style=\"color:#000000\">WebGL</a>.<br />',\n 'Find out how to get it <a href=\"http://get.webgl.org/\" style=\"color:#000000\">here</a>.'\n ].join('\\n') : [\n 'Your browser does not seem to support <a href=\"http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation\" style=\"color:#000000\">WebGL</a>.<br/>',\n 'Find out how to get it <a href=\"http://get.webgl.org/\" style=\"color:#000000\">here</a>.'\n ].join('\\n');\n }\n\n return element;\n },\n\n addGetWebGLMessage: function(parameters) {\n var parent, id, element;\n\n parameters = parameters || {};\n\n parent = parameters.parent !== undefined ? parameters.parent : document.body;\n id = parameters.id !== undefined ? parameters.id : 'oldie';\n\n element = this.getWebGLErrorMessage();\n element.id = id;\n\n parent.appendChild(element);\n }\n};\n","import * as THREE from 'three';\n\nimport Config from '../../data/config';\n\n// Main webGL renderer class\nexport default class Renderer {\n constructor(scene, container) {\n // Properties\n this.scene = scene;\n this.container = container;\n\n // Create WebGL renderer and set its antialias\n this.threeRenderer = new THREE.WebGLRenderer({antialias: true});\n\n // Set clear color to fog to enable fog or to hex color for no fog\n this.threeRenderer.setClearColor(scene.fog.color);\n this.threeRenderer.setPixelRatio(window.devicePixelRatio); // For retina\n\n // Appends canvas\n container.appendChild(this.threeRenderer.domElement);\n\n // Shadow map options\n this.threeRenderer.shadowMap.enabled = true;\n this.threeRenderer.shadowMap.type = THREE.PCFSoftShadowMap;\n\n // Get anisotropy for textures\n Config.maxAnisotropy = this.threeRenderer.capabilities.getMaxAnisotropy();\n\n // Initial size update set to canvas container\n this.updateSize();\n\n // Listeners\n document.addEventListener('DOMContentLoaded', () => this.updateSize(), false);\n window.addEventListener('resize', () => this.updateSize(), false);\n }\n\n updateSize() {\n this.threeRenderer.setSize(this.container.offsetWidth, this.container.offsetHeight);\n }\n\n render(scene, camera) {\n // Renders scene to canvas target\n this.threeRenderer.render(scene, camera);\n }\n}\n","import * as THREE from 'three';\n\nimport Config from '../../data/config';\n\n// Class that creates and updates the main camera\nexport default class Camera {\n constructor(renderer) {\n const width = renderer.domElement.width;\n const height = renderer.domElement.height;\n\n // Create and position a Perspective Camera\n this.threeCamera = new THREE.PerspectiveCamera(Config.camera.fov, width / height, Config.camera.near, Config.camera.far);\n this.threeCamera.position.set(Config.camera.posX, Config.camera.posY, Config.camera.posZ);\n\n // Initial sizing\n this.updateSize(renderer);\n \n // Listeners\n window.addEventListener('resize', () => this.updateSize(renderer), false);\n }\n\n updateSize(renderer) {\n // Update camera aspect ratio with window aspect ratio\n this.threeCamera.aspect = renderer.domElement.width / renderer.domElement.height;\n\n // Always call updateProjectionMatrix on camera change\n this.threeCamera.updateProjectionMatrix();\n }\n}\n","import * as THREE from 'three';\n\nimport Config from '../../data/config';\n\n// Sets up and places all lights in scene\nexport default class Light {\n constructor(scene) {\n this.scene = scene;\n\n this.init();\n }\n\n init() {\n // Ambient\n this.ambientLight = new THREE.AmbientLight(Config.ambientLight.color);\n this.ambientLight.visible = Config.ambientLight.enabled;\n\n // Point light\n this.pointLight = new THREE.PointLight(Config.pointLight.color, Config.pointLight.intensity, Config.pointLight.distance);\n this.pointLight.position.set(Config.pointLight.x, Config.pointLight.y, Config.pointLight.z);\n this.pointLight.visible = Config.pointLight.enabled;\n\n // Directional light\n this.directionalLight = new THREE.DirectionalLight(Config.directionalLight.color, Config.directionalLight.intensity);\n this.directionalLight.position.set(Config.directionalLight.x, Config.directionalLight.y, Config.directionalLight.z);\n this.directionalLight.visible = Config.directionalLight.enabled;\n\n // Shadow map\n this.directionalLight.castShadow = Config.shadow.enabled;\n this.directionalLight.shadow.bias = Config.shadow.bias;\n this.directionalLight.shadow.camera.near = Config.shadow.near;\n this.directionalLight.shadow.camera.far = Config.shadow.far;\n this.directionalLight.shadow.camera.left = Config.shadow.left;\n this.directionalLight.shadow.camera.right = Config.shadow.right;\n this.directionalLight.shadow.camera.top = Config.shadow.top;\n this.directionalLight.shadow.camera.bottom = Config.shadow.bottom;\n this.directionalLight.shadow.mapSize.width = Config.shadow.mapWidth;\n this.directionalLight.shadow.mapSize.height = Config.shadow.mapHeight;\n\n // Shadow camera helper\n this.directionalLightHelper = new THREE.CameraHelper(this.directionalLight.shadow.camera);\n this.directionalLightHelper.visible = Config.shadow.helperEnabled;\n\n // Hemisphere light\n this.hemiLight = new THREE.HemisphereLight(Config.hemiLight.color, Config.hemiLight.groundColor, Config.hemiLight.intensity);\n this.hemiLight.position.set(Config.hemiLight.x, Config.hemiLight.y, Config.hemiLight.z);\n this.hemiLight.visible = Config.hemiLight.enabled;\n }\n\n place(lightName) {\n switch(lightName) {\n case 'ambient':\n this.scene.add(this.ambientLight);\n break;\n\n case 'directional':\n this.scene.add(this.directionalLight);\n this.scene.add(this.directionalLightHelper);\n break;\n\n case 'point':\n this.scene.add(this.pointLight);\n break;\n\n case 'hemi':\n this.scene.add(this.hemiLight);\n break;\n }\n }\n}\n","import * as THREE from 'three';\n\nimport OrbitControls from '../../utils/orbitControls';\nimport Config from '../../data/config';\n\n// Controls based on orbit controls\nexport default class Controls {\n constructor(camera, container) {\n // Orbit controls first needs to pass in THREE to constructor\n const orbitControls = new OrbitControls(THREE);\n this.threeControls = new orbitControls(camera, container);\n\n this.init();\n }\n\n init() {\n this.threeControls.target.set(Config.controls.target.x, Config.controls.target.y, Config.controls.target.z);\n this.threeControls.autoRotate = Config.controls.autoRotate;\n this.threeControls.autoRotateSpeed = Config.controls.autoRotateSpeed;\n this.threeControls.rotateSpeed = Config.controls.rotateSpeed;\n this.threeControls.zoomSpeed = Config.controls.zoomSpeed;\n this.threeControls.minDistance = Config.controls.minDistance;\n this.threeControls.maxDistance = Config.controls.maxDistance;\n this.threeControls.minPolarAngle = Config.controls.minPolarAngle;\n this.threeControls.maxPolarAngle = Config.controls.maxPolarAngle;\n this.threeControls.enableDamping = Config.controls.enableDamping;\n this.threeControls.enableZoom = Config.controls.enableZoom;\n this.threeControls.dampingFactor = Config.controls.dampingFactor;\n }\n}\n","import * as THREE from 'three';\n\n// USe this class as a helper to set up some default materials\nexport default class Material {\n constructor(color) {\n this.basic = new THREE.MeshBasicMaterial({\n color,\n side: THREE.DoubleSide\n });\n\n this.standard = new THREE.MeshStandardMaterial({\n color,\n shading: THREE.FlatShading,\n roughness: 1,\n metalness: 0,\n side: THREE.DoubleSide\n });\n\n this.wire = new THREE.MeshBasicMaterial({wireframe: true});\n }\n}\n\n","// Local vars for rStats\nlet rS, bS, glS, tS;\n\nexport default class Stats {\n constructor(renderer) {\n this.renderer = renderer;\n }\n\n setUp() {\n bS = new BrowserStats();\n glS = new glStats();\n tS = new threeStats(this.renderer.threeRenderer);\n\n rS = new rStats({\n CSSPath: './css/',\n userTimingAPI: true,\n values: {\n frame: { caption: 'Total frame time (ms)', over: 16, average: true, avgMs: 100 },\n fps: { caption: 'Framerate (FPS)', below: 30 },\n calls: { caption: 'Calls (three.js)', over: 3000 },\n raf: { caption: 'Time since last rAF (ms)', average: true, avgMs: 100 },\n rstats: { caption: 'rStats update (ms)', average: true, avgMs: 100 },\n texture: { caption: 'GenTex', average: true, avgMs: 100 }\n },\n groups: [\n { caption: 'Framerate', values: ['fps', 'raf'] },\n { caption: 'Frame Budget', values: ['frame', 'texture', 'setup', 'render'] }\n ],\n fractions: [\n { base: 'frame', steps: ['texture', 'setup', 'render'] }\n ],\n plugins: [bS, tS]\n });\n }\n\n static start() {\n rS('frame').start();\n glS.start();\n\n rS('rAF').tick();\n rS('FPS').frame();\n\n rS('render').start();\n }\n\n static end() {\n rS('render').end(); // render finished\n rS('frame').end(); // frame finished\n\n // Local rStats update\n rS('rStats').start();\n rS().update();\n rS('rStats').end();\n }\n}\n","import * as THREE from 'three';\n\nimport Material from './material';\nimport Config from '../../data/config';\n\n// This helper class can be used to create and then place geometry in the scene\nexport default class Geometry {\n constructor(scene) {\n this.scene = scene;\n this.geo = null;\n }\n\n make(type) {\n if(type === 'plane') {\n return (width, height, widthSegments = 1, heightSegments = 1) => {\n this.geo = new THREE.PlaneGeometry(width, height, widthSegments, heightSegments);\n };\n }\n\n if(type === 'sphere') {\n return (radius, widthSegments = 32, heightSegments = 32) => {\n this.geo = new THREE.SphereGeometry(radius, widthSegments, heightSegments);\n };\n }\n }\n\n place(position, rotation) {\n const material = new Material(0xeeeeee).standard;\n const mesh = new THREE.Mesh(this.geo, material);\n\n // Use ES6 spread to set position and rotation from passed in array\n mesh.position.set(...position);\n mesh.rotation.set(...rotation);\n\n if(Config.shadow.enabled) {\n mesh.receiveShadow = true;\n }\n\n this.scene.add(mesh);\n }\n}\n","/**\n * @author mrdoob / http://mrdoob.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nimport {\n BufferGeometry,\n Float32BufferAttribute,\n LineSegments,\n LineBasicMaterial,\n Matrix3,\n Vector3,\n} from 'three';\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _normalMatrix = new Matrix3();\nconst _keys = ['a', 'b', 'c'];\n\nfunction VertexNormalsHelper(object, size, hex) {\n this.object = object;\n this.size = size !== undefined ? size : 0.1;\n\n const color = hex !== undefined ? hex : 0xff0000;\n\n //\n\n let nNormals = 0;\n\n const objGeometry = this.object.geometry;\n\n if (objGeometry && objGeometry.isGeometry) {\n nNormals = objGeometry.faces.length * 3;\n } else if (objGeometry && objGeometry.isBufferGeometry) {\n nNormals = objGeometry.attributes.normal.count;\n }\n\n //\n\n const geometry = new BufferGeometry();\n const positions = new Float32BufferAttribute(nNormals * 2 * 3, 3);\n\n geometry.setAttribute('position', positions);\n\n LineSegments.call(this, geometry, new LineBasicMaterial({ color: color, toneMapped: false }));\n\n this.type = 'VertexNormalsHelper';\n\n //\n\n this.matrixAutoUpdate = false;\n\n this.update();\n}\n\nVertexNormalsHelper.prototype = Object.create(LineSegments.prototype);\nVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\nVertexNormalsHelper.prototype.update = function () {\n let idx;\n this.object.updateMatrixWorld(true);\n\n _normalMatrix.getNormalMatrix(this.object.matrixWorld);\n\n const matrixWorld = this.object.matrixWorld;\n const position = this.geometry.attributes.position;\n\n //\n\n const objGeometry = this.object.geometry;\n\n if (objGeometry && objGeometry.isGeometry) {\n const vertices = objGeometry.vertices;\n\n const faces = objGeometry.faces;\n\n idx = 0;\n\n for (let i = 0, l = faces.length; i < l; i++) {\n const face = faces[i];\n\n for (let j = 0, jl = face.vertexNormals.length; j < jl; j++) {\n const vertex = vertices[face[_keys[j]]];\n const normal = face.vertexNormals[j];\n\n _v1.copy(vertex).applyMatrix4(matrixWorld);\n _v2.copy(normal).applyMatrix3(_normalMatrix).normalize().multiplyScalar(this.size).add(_v1);\n\n position.setXYZ(idx, _v1.x, _v1.y, _v1.z);\n\n idx = idx + 1;\n\n position.setXYZ(idx, _v2.x, _v2.y, _v2.z);\n\n idx = idx + 1;\n }\n }\n } else if (objGeometry && objGeometry.isBufferGeometry) {\n const objPos = objGeometry.attributes.position;\n const objNorm = objGeometry.attributes.normal;\n\n idx = 0;\n\n // for simplicity, ignore index and drawcalls, and render every normal\n\n for (var j = 0, jl = objPos.count; j < jl; j++) {\n _v1.set(objPos.getX(j), objPos.getY(j), objPos.getZ(j)).applyMatrix4(matrixWorld);\n _v2.set(objNorm.getX(j), objNorm.getY(j), objNorm.getZ(j));\n _v2.applyMatrix3(_normalMatrix).normalize().multiplyScalar(this.size).add(_v1);\n\n position.setXYZ(idx, _v1.x, _v1.y, _v1.z);\n\n idx = idx + 1;\n\n position.setXYZ(idx, _v2.x, _v2.y, _v2.z);\n\n idx = idx + 1;\n }\n }\n\n position.needsUpdate = true;\n};\n\nexport { VertexNormalsHelper };\n","import * as THREE from 'three';\nimport { VertexNormalsHelper } from './vertexNormalsHelper';\n\n// Simple mesh helper that shows edges, wireframes, and face and vertex normals\nexport default class MeshHelper {\n constructor(scene, mesh) {\n this.mesh = mesh;\n this.scene = scene;\n\n const wireframe = new THREE.WireframeGeometry(this.mesh.geometry);\n this.wireLine = new THREE.LineSegments(wireframe);\n this.wireLine.material.depthTest = false;\n this.wireLine.material.opacity = 0.25;\n this.wireLine.material.transparent = true;\n\n const edges = new THREE.EdgesGeometry(this.mesh.geometry);\n this.edgesLine = new THREE.LineSegments(edges);\n this.edgesLine.material.depthTest = false;\n this.edgesLine.material.opacity = 0.25;\n this.edgesLine.material.transparent = true;\n\n this.vertexHelper = new VertexNormalsHelper(this.mesh, 2);\n this.boxHelper = new THREE.BoxHelper(this.mesh);\n }\n\n enable() {\n this.mesh.add(this.wireLine);\n this.mesh.add(this.edgesLine);\n\n this.scene.add(this.vertexHelper);\n this.scene.add(this.boxHelper);\n }\n\n disable() {\n this.mesh.remove(this.wireLine);\n this.mesh.remove(this.edgesLine);\n\n this.scene.remove(this.vertexHelper);\n this.scene.remove(this.boxHelper);\n }\n}\n","// Provides simple static functions that are used multiple times in the app\nexport default class Helpers {\n static throttle(fn, threshhold, scope) {\n threshhold || (threshhold = 250);\n let last, deferTimer;\n\n return function() {\n const context = scope || this;\n\n const now = +new Date,\n args = arguments;\n\n if(last && now < last + threshhold) {\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function() {\n last = now;\n fn.apply(context, args);\n }, threshhold);\n }\n else {\n last = now;\n fn.apply(context, args);\n }\n };\n }\n\n static logProgress() {\n return function(xhr) {\n if(xhr.lengthComputable) {\n const percentComplete = xhr.loaded / xhr.total * 100;\n\n console.log(Math.round(percentComplete, 2) + '% downloaded');\n }\n }\n }\n\n static logError() {\n return function(xhr) {\n console.error(xhr);\n }\n }\n\n static handleColorChange(color) {\n return (value) => {\n if(typeof value === 'string') {\n value = value.replace('#', '0x');\n }\n\n color.setHex(value);\n };\n }\n\n static update(mesh) {\n this.needsUpdate(mesh.material, mesh.geometry);\n }\n\n static needsUpdate(material, geometry) {\n return function() {\n material.shading = +material.shading; //Ensure number\n material.vertexColors = +material.vertexColors; //Ensure number\n material.side = +material.side; //Ensure number\n material.needsUpdate = true;\n geometry.verticesNeedUpdate = true;\n geometry.normalsNeedUpdate = true;\n geometry.colorsNeedUpdate = true;\n };\n }\n\n static updateTexture(material, materialKey, textures) {\n return function(key) {\n material[materialKey] = textures[key];\n material.needsUpdate = true;\n };\n }\n}\n","import * as THREE from 'three';\n// Promise polyfill for IE\nimport { Promise } from 'es6-promise';\n\nimport Helpers from '../../utils/helpers';\nimport Config from '../../data/config';\n\n// This class preloads all textures in the imageFiles array in the Config via ES6 Promises.\n// Once all textures are done loading the model itself will be loaded after the Promise .then() callback.\n// Using promises to preload textures prevents issues when applying textures to materials\n// before the textures have loaded.\nexport default class Texture {\n constructor() {\n // Prop that will contain all loaded textures\n this.textures = {};\n }\n\n load() {\n const loader = new THREE.TextureLoader();\n const maxAnisotropy = Config.maxAnisotropy;\n const imageFiles = Config.texture.imageFiles;\n const promiseArray = [];\n\n loader.setPath(Config.texture.path);\n\n imageFiles.forEach(imageFile => {\n // Add an individual Promise for each image in array\n promiseArray.push(new Promise((resolve, reject) => {\n // Each Promise will attempt to load the image file\n loader.load(imageFile.image,\n // This gets called on load with the loaded texture\n texture => {\n texture.anisotropy = maxAnisotropy;\n\n // Resolve Promise with object of texture if it is instance of THREE.Texture\n const modelOBJ = {};\n modelOBJ[imageFile.name] = texture;\n if(modelOBJ[imageFile.name] instanceof THREE.Texture)\n resolve(modelOBJ);\n },\n Helpers.logProgress(),\n xhr => reject(new Error(xhr + 'An error occurred loading while loading ' + imageFile.image))\n )\n }));\n });\n\n // Iterate through all Promises in array and return another Promise when all have resolved or console log reason when any reject\n return Promise.all(promiseArray).then(textures => {\n // Set the textures prop object to have name be the resolved texture\n for(let i = 0; i < textures.length; i++) {\n this.textures[Object.keys(textures[i])[0]] = textures[i][Object.keys(textures[i])[0]];\n }\n }, reason => console.log(reason));\n }\n}\n","/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nimport {\n BufferAttribute,\n BufferGeometry,\n InterleavedBuffer,\n InterleavedBufferAttribute,\n TriangleFanDrawMode,\n TriangleStripDrawMode,\n TrianglesDrawMode,\n Vector2,\n Vector3,\n} from 'three';\n\nvar BufferGeometryUtils = {\n computeTangents: function (geometry) {\n var index = geometry.index;\n var attributes = geometry.attributes;\n\n // based on http://www.terathon.com/code/tangent.html\n // (per vertex tangents)\n\n if (\n index === null ||\n attributes.position === undefined ||\n attributes.normal === undefined ||\n attributes.uv === undefined\n ) {\n console.error(\n 'THREE.BufferGeometryUtils: .computeTangents() failed. Missing required attributes (index, position, normal or uv)'\n );\n return;\n }\n\n var indices = index.array;\n var positions = attributes.position.array;\n var normals = attributes.normal.array;\n var uvs = attributes.uv.array;\n\n var nVertices = positions.length / 3;\n\n if (attributes.tangent === undefined) {\n geometry.setAttribute('tangent', new BufferAttribute(new Float32Array(4 * nVertices), 4));\n }\n\n var tangents = attributes.tangent.array;\n\n var tan1 = [],\n tan2 = [];\n\n for (var i = 0; i < nVertices; i++) {\n tan1[i] = new Vector3();\n tan2[i] = new Vector3();\n }\n\n var vA = new Vector3(),\n vB = new Vector3(),\n vC = new Vector3(),\n uvA = new Vector2(),\n uvB = new Vector2(),\n uvC = new Vector2(),\n sdir = new Vector3(),\n tdir = new Vector3();\n\n function handleTriangle(a, b, c) {\n vA.fromArray(positions, a * 3);\n vB.fromArray(positions, b * 3);\n vC.fromArray(positions, c * 3);\n\n uvA.fromArray(uvs, a * 2);\n uvB.fromArray(uvs, b * 2);\n uvC.fromArray(uvs, c * 2);\n\n vB.sub(vA);\n vC.sub(vA);\n\n uvB.sub(uvA);\n uvC.sub(uvA);\n\n var r = 1.0 / (uvB.x * uvC.y - uvC.x * uvB.y);\n\n // silently ignore degenerate uv triangles having coincident or colinear vertices\n\n if (!isFinite(r)) return;\n\n sdir.copy(vB).multiplyScalar(uvC.y).addScaledVector(vC, -uvB.y).multiplyScalar(r);\n tdir.copy(vC).multiplyScalar(uvB.x).addScaledVector(vB, -uvC.x).multiplyScalar(r);\n\n tan1[a].add(sdir);\n tan1[b].add(sdir);\n tan1[c].add(sdir);\n\n tan2[a].add(tdir);\n tan2[b].add(tdir);\n tan2[c].add(tdir);\n }\n\n var groups = geometry.groups;\n\n if (groups.length === 0) {\n groups = [\n {\n start: 0,\n count: indices.length,\n },\n ];\n }\n\n for (var i = 0, il = groups.length; i < il; ++i) {\n var group = groups[i];\n\n var start = group.start;\n var count = group.count;\n\n for (var j = start, jl = start + count; j < jl; j += 3) {\n handleTriangle(indices[j + 0], indices[j + 1], indices[j + 2]);\n }\n }\n\n var tmp = new Vector3(),\n tmp2 = new Vector3();\n var n = new Vector3(),\n n2 = new Vector3();\n var w, t, test;\n\n function handleVertex(v) {\n n.fromArray(normals, v * 3);\n n2.copy(n);\n\n t = tan1[v];\n\n // Gram-Schmidt orthogonalize\n\n tmp.copy(t);\n tmp.sub(n.multiplyScalar(n.dot(t))).normalize();\n\n // Calculate handedness\n\n tmp2.crossVectors(n2, t);\n test = tmp2.dot(tan2[v]);\n w = test < 0.0 ? -1.0 : 1.0;\n\n tangents[v * 4] = tmp.x;\n tangents[v * 4 + 1] = tmp.y;\n tangents[v * 4 + 2] = tmp.z;\n tangents[v * 4 + 3] = w;\n }\n\n for (var i = 0, il = groups.length; i < il; ++i) {\n var group = groups[i];\n\n var start = group.start;\n var count = group.count;\n\n for (var j = start, jl = start + count; j < jl; j += 3) {\n handleVertex(indices[j + 0]);\n handleVertex(indices[j + 1]);\n handleVertex(indices[j + 2]);\n }\n }\n },\n\n /**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\n mergeBufferGeometries: function (geometries, useGroups) {\n var isIndexed = geometries[0].index !== null;\n\n var attributesUsed = new Set(Object.keys(geometries[0].attributes));\n var morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n\n var attributes = {};\n var morphAttributes = {};\n\n var morphTargetsRelative = geometries[0].morphTargetsRelative;\n\n var mergedGeometry = new BufferGeometry();\n\n var offset = 0;\n\n for (var i = 0; i < geometries.length; ++i) {\n var geometry = geometries[i];\n var attributesCount = 0;\n\n // ensure that all geometries are indexed, or none\n\n if (isIndexed !== (geometry.index !== null)) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' +\n i +\n '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n\n // gather attributes, exit early if they're different\n\n for (var name in geometry.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' +\n i +\n '. All geometries must have compatible attributes; make sure \"' +\n name +\n '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n\n if (attributes[name] === undefined) attributes[name] = [];\n\n attributes[name].push(geometry.attributes[name]);\n\n attributesCount++;\n }\n\n // ensure geometries have the same number of attributes\n\n if (attributesCount !== attributesUsed.size) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' +\n i +\n '. Make sure all geometries have the same number of attributes.'\n );\n return null;\n }\n\n // gather morph attributes, exit early if they're different\n\n if (morphTargetsRelative !== geometry.morphTargetsRelative) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' +\n i +\n '. .morphTargetsRelative must be consistent throughout all geometries.'\n );\n return null;\n }\n\n for (var name in geometry.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' +\n i +\n '. .morphAttributes must be consistent throughout all geometries.'\n );\n return null;\n }\n\n if (morphAttributes[name] === undefined) morphAttributes[name] = [];\n\n morphAttributes[name].push(geometry.morphAttributes[name]);\n }\n\n // gather .userData\n\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geometry.userData);\n\n if (useGroups) {\n var count;\n\n if (isIndexed) {\n count = geometry.index.count;\n } else if (geometry.attributes.position !== undefined) {\n count = geometry.attributes.position.count;\n } else {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' +\n i +\n '. The geometry must have either an index or a position attribute'\n );\n return null;\n }\n\n mergedGeometry.addGroup(offset, count, i);\n\n offset += count;\n }\n }\n\n // merge indices\n\n if (isIndexed) {\n var indexOffset = 0;\n var mergedIndex = [];\n\n for (var i = 0; i < geometries.length; ++i) {\n var index = geometries[i].index;\n\n for (var j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n\n indexOffset += geometries[i].attributes.position.count;\n }\n\n mergedGeometry.setIndex(mergedIndex);\n }\n\n // merge attributes\n\n for (var name in attributes) {\n var mergedAttribute = this.mergeBufferAttributes(attributes[name]);\n\n if (!mergedAttribute) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the ' +\n name +\n ' attribute.'\n );\n return null;\n }\n\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n\n // merge morph attributes\n\n for (var name in morphAttributes) {\n var numMorphTargets = morphAttributes[name][0].length;\n\n if (numMorphTargets === 0) break;\n\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n\n for (var i = 0; i < numMorphTargets; ++i) {\n var morphAttributesToMerge = [];\n\n for (var j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n\n var mergedMorphAttribute = this.mergeBufferAttributes(morphAttributesToMerge);\n\n if (!mergedMorphAttribute) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the ' +\n name +\n ' morphAttribute.'\n );\n return null;\n }\n\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n\n return mergedGeometry;\n },\n\n /**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\n mergeBufferAttributes: function (attributes) {\n var TypedArray;\n var itemSize;\n var normalized;\n var arrayLength = 0;\n\n for (var i = 0; i < attributes.length; ++i) {\n var attribute = attributes[i];\n\n if (attribute.isInterleavedBufferAttribute) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. InterleavedBufferAttributes are not supported.'\n );\n return null;\n }\n\n if (TypedArray === undefined) TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.'\n );\n return null;\n }\n\n if (itemSize === undefined) itemSize = attribute.itemSize;\n if (itemSize !== attribute.itemSize) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.'\n );\n return null;\n }\n\n if (normalized === undefined) normalized = attribute.normalized;\n if (normalized !== attribute.normalized) {\n console.error(\n 'THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.'\n );\n return null;\n }\n\n arrayLength += attribute.array.length;\n }\n\n var array = new TypedArray(arrayLength);\n var offset = 0;\n\n for (var i = 0; i < attributes.length; ++i) {\n array.set(attributes[i].array, offset);\n\n offset += attributes[i].array.length;\n }\n\n return new BufferAttribute(array, itemSize, normalized);\n },\n\n /**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\n interleaveAttributes: function (attributes) {\n // Interleaves the provided attributes into an InterleavedBuffer and returns\n // a set of InterleavedBufferAttributes for each attribute\n var TypedArray;\n var arrayLength = 0;\n var stride = 0;\n\n // calculate the the length and type of the interleavedBuffer\n for (var i = 0, l = attributes.length; i < l; ++i) {\n var attribute = attributes[i];\n\n if (TypedArray === undefined) TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error('AttributeBuffers of different types cannot be interleaved');\n return null;\n }\n\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n\n // Create the set of buffer attributes\n var interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n var offset = 0;\n var res = [];\n var getters = ['getX', 'getY', 'getZ', 'getW'];\n var setters = ['setX', 'setY', 'setZ', 'setW'];\n\n for (var j = 0, l = attributes.length; j < l; j++) {\n var attribute = attributes[j];\n var itemSize = attribute.itemSize;\n var count = attribute.count;\n var iba = new InterleavedBufferAttribute(\n interleavedBuffer,\n itemSize,\n offset,\n attribute.normalized\n );\n res.push(iba);\n\n offset += itemSize;\n\n // Move the data for each attribute into the new interleavedBuffer\n // at the appropriate offset\n for (var c = 0; c < count; c++) {\n for (var k = 0; k < itemSize; k++) {\n iba[setters[k]](c, attribute[getters[k]](c));\n }\n }\n }\n\n return res;\n },\n\n /**\n * @param {Array<BufferGeometry>} geometry\n * @return {number}\n */\n estimateBytesUsed: function (geometry) {\n // Return the estimated memory used by this geometry in bytes\n // Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n // for InterleavedBufferAttributes.\n var mem = 0;\n for (var name in geometry.attributes) {\n var attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n\n var indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n },\n\n /**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry>}\n */\n mergeVertices: function (geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n\n // Generate an index buffer if the geometry doesn't have one, or optimize it\n // if it's already available.\n var hashToIndex = {};\n var indices = geometry.getIndex();\n var positions = geometry.getAttribute('position');\n var vertexCount = indices ? indices.count : positions.count;\n\n // next value for triangle indices\n var nextIndex = 0;\n\n // attributes and new attribute arrays\n var attributeNames = Object.keys(geometry.attributes);\n var attrArrays = {};\n var morphAttrsArrays = {};\n var newIndices = [];\n var getters = ['getX', 'getY', 'getZ', 'getW'];\n\n // initialize the arrays\n for (var i = 0, l = attributeNames.length; i < l; i++) {\n var name = attributeNames[i];\n\n attrArrays[name] = [];\n\n var morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill().map(() => []);\n }\n }\n\n // convert the error tolerance to an amount of decimal places to truncate to\n var decimalShift = Math.log10(1 / tolerance);\n var shiftMultiplier = Math.pow(10, decimalShift);\n for (var i = 0; i < vertexCount; i++) {\n var index = indices ? indices.getX(i) : i;\n\n // Generate a hash for the vertex attributes at the current index 'i'\n var hash = '';\n for (var j = 0, l = attributeNames.length; j < l; j++) {\n var name = attributeNames[j];\n var attribute = geometry.getAttribute(name);\n var itemSize = attribute.itemSize;\n\n for (var k = 0; k < itemSize; k++) {\n // double tilde truncates the decimal value\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n\n // Add another reference to the vertex if it's already\n // used by another index\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n // copy data to the new index in the attribute arrays\n for (var j = 0, l = attributeNames.length; j < l; j++) {\n var name = attributeNames[j];\n var attribute = geometry.getAttribute(name);\n var morphAttr = geometry.morphAttributes[name];\n var itemSize = attribute.itemSize;\n var newarray = attrArrays[name];\n var newMorphArrays = morphAttrsArrays[name];\n\n for (var k = 0; k < itemSize; k++) {\n var getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n\n if (morphAttr) {\n for (var m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n\n // Generate typed arrays from new attribute arrays and update\n // the attributeBuffers\n const result = geometry.clone();\n for (var i = 0, l = attributeNames.length; i < l; i++) {\n var name = attributeNames[i];\n var oldAttribute = geometry.getAttribute(name);\n\n var buffer = new oldAttribute.array.constructor(attrArrays[name]);\n var attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n\n result.setAttribute(name, attribute);\n\n // Update the attribute arrays\n if (name in morphAttrsArrays) {\n for (var j = 0; j < morphAttrsArrays[name].length; j++) {\n var oldMorphAttribute = geometry.morphAttributes[name][j];\n\n var buffer = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n var morphAttribute = new BufferAttribute(\n buffer,\n oldMorphAttribute.itemSize,\n oldMorphAttribute.normalized\n );\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n\n // indices\n\n result.setIndex(newIndices);\n\n return result;\n },\n\n /**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry>}\n */\n toTrianglesDrawMode: function (geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\n 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.'\n );\n return geometry;\n }\n\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n var index = geometry.getIndex();\n\n // generate index if not present\n\n if (index === null) {\n var indices = [];\n\n var position = geometry.getAttribute('position');\n\n if (position !== undefined) {\n for (var i = 0; i < position.count; i++) {\n indices.push(i);\n }\n\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.'\n );\n return geometry;\n }\n }\n\n //\n\n var numberOfTriangles = index.count - 2;\n var newIndices = [];\n\n if (drawMode === TriangleFanDrawMode) {\n // gl.TRIANGLE_FAN\n\n for (var i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n // gl.TRIANGLE_STRIP\n\n for (var i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\n 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.'\n );\n }\n\n // build final geometry\n\n var newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n\n return newGeometry;\n }\n\n console.error('THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode);\n return geometry;\n },\n};\n\nexport { BufferGeometryUtils };\n","/**\n * @author Rich Tibbett / https://github.com/richtr\n * @author mrdoob / http://mrdoob.com/\n * @author Tony Parisi / http://www.tonyparisi.com/\n * @author Takahiro / https://github.com/takahirox\n * @author Don McCurdy / https://www.donmccurdy.com\n */\n\nimport {\n AnimationClip,\n Bone,\n Box3,\n BufferAttribute,\n BufferGeometry,\n ClampToEdgeWrapping,\n Color,\n DirectionalLight,\n DoubleSide,\n FileLoader,\n FrontSide,\n Group,\n InterleavedBuffer,\n InterleavedBufferAttribute,\n Interpolant,\n InterpolateDiscrete,\n InterpolateLinear,\n Line,\n LineBasicMaterial,\n LineLoop,\n LineSegments,\n LinearFilter,\n LinearMipmapLinearFilter,\n LinearMipmapNearestFilter,\n Loader,\n LoaderUtils,\n Material,\n MathUtils,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n MirroredRepeatWrapping,\n NearestFilter,\n NearestMipmapLinearFilter,\n NearestMipmapNearestFilter,\n NumberKeyframeTrack,\n Object3D,\n OrthographicCamera,\n PerspectiveCamera,\n PointLight,\n Points,\n PointsMaterial,\n PropertyBinding,\n QuaternionKeyframeTrack,\n RGBAFormat,\n RGBFormat,\n RepeatWrapping,\n Skeleton,\n SkinnedMesh,\n Sphere,\n SpotLight,\n TangentSpaceNormalMap,\n TextureLoader,\n TriangleFanDrawMode,\n TriangleStripDrawMode,\n Vector2,\n Vector3,\n VectorKeyframeTrack,\n sRGBEncoding\n} from 'three';\n\nconst GLTFLoader = (function () {\n function GLTFLoader(manager) {\n Loader.call(this, manager);\n\n this.dracoLoader = null;\n this.ddsLoader = null;\n }\n\n GLTFLoader.prototype = Object.assign(Object.create(Loader.prototype), {\n constructor: GLTFLoader,\n\n load: function (url, onLoad, onProgress, onError) {\n var scope = this;\n\n var resourcePath;\n\n if (this.resourcePath !== '') {\n resourcePath = this.resourcePath;\n } else if (this.path !== '') {\n resourcePath = this.path;\n } else {\n resourcePath = LoaderUtils.extractUrlBase(url);\n }\n\n // Tells the LoadingManager to track an extra item, which resolves after\n // the model is fully loaded. This means the count of items loaded will\n // be incorrect, but ensures manager.onLoad() does not fire early.\n scope.manager.itemStart(url);\n\n var _onError = function (e) {\n if (onError) {\n onError(e);\n } else {\n console.error(e);\n }\n\n scope.manager.itemError(url);\n scope.manager.itemEnd(url);\n };\n\n var loader = new FileLoader(scope.manager);\n\n loader.setPath(this.path);\n loader.setResponseType('arraybuffer');\n\n if (scope.crossOrigin === 'use-credentials') {\n loader.setWithCredentials(true);\n }\n\n loader.load(\n url,\n function (data) {\n try {\n scope.parse(\n data,\n resourcePath,\n function (gltf) {\n onLoad(gltf);\n\n scope.manager.itemEnd(url);\n },\n _onError\n );\n } catch (e) {\n _onError(e);\n }\n },\n onProgress,\n _onError\n );\n },\n\n setDRACOLoader: function (dracoLoader) {\n this.dracoLoader = dracoLoader;\n return this;\n },\n\n setDDSLoader: function (ddsLoader) {\n this.ddsLoader = ddsLoader;\n return this;\n },\n\n parse: function (data, path, onLoad, onError) {\n var content;\n var extensions = {};\n\n if (typeof data === 'string') {\n content = data;\n } else {\n var magic = LoaderUtils.decodeText(new Uint8Array(data, 0, 4));\n\n if (magic === BINARY_EXTENSION_HEADER_MAGIC) {\n try {\n extensions[EXTENSIONS.KHR_BINARY_GLTF] = new GLTFBinaryExtension(data);\n } catch (error) {\n if (onError) onError(error);\n return;\n }\n\n content = extensions[EXTENSIONS.KHR_BINARY_GLTF].content;\n } else {\n content = LoaderUtils.decodeText(new Uint8Array(data));\n }\n }\n\n var json = JSON.parse(content);\n\n if (json.asset === undefined || json.asset.version[0] < 2) {\n if (onError)\n onError(\n new Error('THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.')\n );\n return;\n }\n\n if (json.extensionsUsed) {\n for (var i = 0; i < json.extensionsUsed.length; ++i) {\n var extensionName = json.extensionsUsed[i];\n var extensionsRequired = json.extensionsRequired || [];\n\n switch (extensionName) {\n case EXTENSIONS.KHR_LIGHTS_PUNCTUAL:\n extensions[extensionName] = new GLTFLightsExtension(json);\n break;\n\n case EXTENSIONS.KHR_MATERIALS_CLEARCOAT:\n extensions[extensionName] = new GLTFMaterialsClearcoatExtension();\n break;\n\n case EXTENSIONS.KHR_MATERIALS_UNLIT:\n extensions[extensionName] = new GLTFMaterialsUnlitExtension();\n break;\n\n case EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n extensions[extensionName] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n break;\n\n case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n extensions[extensionName] = new GLTFDracoMeshCompressionExtension(\n json,\n this.dracoLoader\n );\n break;\n\n case EXTENSIONS.MSFT_TEXTURE_DDS:\n extensions[extensionName] = new GLTFTextureDDSExtension(this.ddsLoader);\n break;\n\n case EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n extensions[extensionName] = new GLTFTextureTransformExtension();\n break;\n\n case EXTENSIONS.KHR_MESH_QUANTIZATION:\n extensions[extensionName] = new GLTFMeshQuantizationExtension();\n break;\n\n default:\n if (extensionsRequired.indexOf(extensionName) >= 0) {\n console.warn('THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".');\n }\n }\n }\n }\n\n var parser = new GLTFParser(json, extensions, {\n path: path || this.resourcePath || '',\n crossOrigin: this.crossOrigin,\n manager: this.manager\n });\n\n parser.parse(onLoad, onError);\n },\n });\n\n /* GLTFREGISTRY */\n\n function GLTFRegistry() {\n var objects = {};\n\n return {\n get: function (key) {\n return objects[key];\n },\n\n add: function (key, object) {\n objects[key] = object;\n },\n\n remove: function (key) {\n delete objects[key];\n },\n\n removeAll: function () {\n objects = {};\n },\n };\n }\n\n /*********************************/\n /********** EXTENSIONS ***********/\n /*********************************/\n\n var EXTENSIONS = {\n KHR_BINARY_GLTF: 'KHR_binary_glTF',\n KHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n KHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n KHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n MSFT_TEXTURE_DDS: 'MSFT_texture_dds'\n };\n\n /**\n * DDS Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds\n *\n */\n function GLTFTextureDDSExtension(ddsLoader) {\n if (!ddsLoader) {\n throw new Error(\n 'THREE.GLTFLoader: Attempting to load .dds texture without importing DDSLoader'\n );\n }\n\n this.name = EXTENSIONS.MSFT_TEXTURE_DDS;\n this.ddsLoader = ddsLoader;\n }\n\n /**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\n function GLTFLightsExtension(json) {\n this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n var extension = (json.extensions && json.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL]) || {};\n this.lightDefs = extension.lights || [];\n }\n\n GLTFLightsExtension.prototype.loadLight = function (lightIndex) {\n var lightDef = this.lightDefs[lightIndex];\n var lightNode;\n\n var color = new Color(0xffffff);\n if (lightDef.color !== undefined) color.fromArray(lightDef.color);\n\n var range = lightDef.range !== undefined ? lightDef.range : 0;\n\n switch (lightDef.type) {\n case 'directional':\n lightNode = new DirectionalLight(color);\n lightNode.target.position.set(0, 0, -1);\n lightNode.add(lightNode.target);\n break;\n\n case 'point':\n lightNode = new PointLight(color);\n lightNode.distance = range;\n break;\n\n case 'spot':\n lightNode = new SpotLight(color);\n lightNode.distance = range;\n // Handle spotlight properties.\n lightDef.spot = lightDef.spot || {};\n lightDef.spot.innerConeAngle =\n lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n lightDef.spot.outerConeAngle =\n lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n lightNode.angle = lightDef.spot.outerConeAngle;\n lightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n lightNode.target.position.set(0, 0, -1);\n lightNode.add(lightNode.target);\n break;\n\n default:\n throw new Error('THREE.GLTFLoader: Unexpected light type, \"' + lightDef.type + '\".');\n }\n\n // Some lights (e.g. spot) default to a position other than the origin. Reset the position\n // here, because node-level parsing will only override position if explicitly specified.\n lightNode.position.set(0, 0, 0);\n\n lightNode.decay = 2;\n\n if (lightDef.intensity !== undefined) lightNode.intensity = lightDef.intensity;\n\n lightNode.name = lightDef.name || 'light_' + lightIndex;\n\n return Promise.resolve(lightNode);\n };\n\n /**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\n function GLTFMaterialsUnlitExtension() {\n this.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n }\n\n GLTFMaterialsUnlitExtension.prototype.getMaterialType = function () {\n return MeshBasicMaterial;\n };\n\n GLTFMaterialsUnlitExtension.prototype.extendParams = function (\n materialParams,\n materialDef,\n parser\n ) {\n var pending = [];\n\n materialParams.color = new Color(1.0, 1.0, 1.0);\n materialParams.opacity = 1.0;\n\n var metallicRoughness = materialDef.pbrMetallicRoughness;\n\n if (metallicRoughness) {\n if (Array.isArray(metallicRoughness.baseColorFactor)) {\n var array = metallicRoughness.baseColorFactor;\n\n materialParams.color.fromArray(array);\n materialParams.opacity = array[3];\n }\n\n if (metallicRoughness.baseColorTexture !== undefined) {\n pending.push(\n parser.assignTexture(materialParams, 'map', metallicRoughness.baseColorTexture)\n );\n }\n }\n\n return Promise.all(pending);\n };\n\n /**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\n function GLTFMaterialsClearcoatExtension() {\n this.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n }\n\n GLTFMaterialsClearcoatExtension.prototype.getMaterialType = function () {\n return MeshPhysicalMaterial;\n };\n\n GLTFMaterialsClearcoatExtension.prototype.extendParams = function (\n materialParams,\n materialDef,\n parser\n ) {\n var pending = [];\n\n var extension = materialDef.extensions[this.name];\n\n if (extension.clearcoatFactor !== undefined) {\n materialParams.clearcoat = extension.clearcoatFactor;\n }\n\n if (extension.clearcoatTexture !== undefined) {\n pending.push(\n parser.assignTexture(materialParams, 'clearcoatMap', extension.clearcoatTexture)\n );\n }\n\n if (extension.clearcoatRoughnessFactor !== undefined) {\n materialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n }\n\n if (extension.clearcoatRoughnessTexture !== undefined) {\n pending.push(\n parser.assignTexture(\n materialParams,\n 'clearcoatRoughnessMap',\n extension.clearcoatRoughnessTexture\n )\n );\n }\n\n if (extension.clearcoatNormalTexture !== undefined) {\n pending.push(\n parser.assignTexture(\n materialParams,\n 'clearcoatNormalMap',\n extension.clearcoatNormalTexture\n )\n );\n\n if (extension.clearcoatNormalTexture.scale !== undefined) {\n var scale = extension.clearcoatNormalTexture.scale;\n\n materialParams.clearcoatNormalScale = new Vector2(scale, scale);\n }\n }\n\n return Promise.all(pending);\n };\n\n /* BINARY EXTENSION */\n var BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\n var BINARY_EXTENSION_HEADER_LENGTH = 12;\n var BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4e4f534a, BIN: 0x004e4942 };\n\n function GLTFBinaryExtension(data) {\n this.name = EXTENSIONS.KHR_BINARY_GLTF;\n this.content = null;\n this.body = null;\n\n var headerView = new DataView(data, 0, BINARY_EXTENSION_HEADER_LENGTH);\n\n this.header = {\n magic: LoaderUtils.decodeText(new Uint8Array(data.slice(0, 4))),\n version: headerView.getUint32(4, true),\n length: headerView.getUint32(8, true)\n };\n\n if (this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC) {\n throw new Error('THREE.GLTFLoader: Unsupported glTF-Binary header.');\n } else if (this.header.version < 2.0) {\n throw new Error('THREE.GLTFLoader: Legacy binary file detected.');\n }\n\n var chunkView = new DataView(data, BINARY_EXTENSION_HEADER_LENGTH);\n var chunkIndex = 0;\n\n while (chunkIndex < chunkView.byteLength) {\n var chunkLength = chunkView.getUint32(chunkIndex, true);\n chunkIndex += 4;\n\n var chunkType = chunkView.getUint32(chunkIndex, true);\n chunkIndex += 4;\n\n if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON) {\n var contentArray = new Uint8Array(\n data,\n BINARY_EXTENSION_HEADER_LENGTH + chunkIndex,\n chunkLength\n );\n this.content = LoaderUtils.decodeText(contentArray);\n } else if (chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN) {\n var byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n this.body = data.slice(byteOffset, byteOffset + chunkLength);\n }\n\n // Clients must ignore chunks with unknown types.\n\n chunkIndex += chunkLength;\n }\n\n if (this.content === null) {\n throw new Error('THREE.GLTFLoader: JSON content not found.');\n }\n }\n\n /**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\n function GLTFDracoMeshCompressionExtension(json, dracoLoader) {\n if (!dracoLoader) {\n throw new Error('THREE.GLTFLoader: No DRACOLoader instance provided.');\n }\n\n this.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n this.json = json;\n this.dracoLoader = dracoLoader;\n this.dracoLoader.preload();\n }\n\n GLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function (primitive, parser) {\n var json = this.json;\n var dracoLoader = this.dracoLoader;\n var bufferViewIndex = primitive.extensions[this.name].bufferView;\n var gltfAttributeMap = primitive.extensions[this.name].attributes;\n var threeAttributeMap = {};\n var attributeNormalizedMap = {};\n var attributeTypeMap = {};\n\n for (var attributeName in gltfAttributeMap) {\n var threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase();\n\n threeAttributeMap[threeAttributeName] = gltfAttributeMap[attributeName];\n }\n\n for (attributeName in primitive.attributes) {\n var threeAttributeName = ATTRIBUTES[attributeName] || attributeName.toLowerCase();\n\n if (gltfAttributeMap[attributeName] !== undefined) {\n var accessorDef = json.accessors[primitive.attributes[attributeName]];\n var componentType = WEBGL_COMPONENT_TYPES[accessorDef.componentType];\n\n attributeTypeMap[threeAttributeName] = componentType;\n attributeNormalizedMap[threeAttributeName] = accessorDef.normalized === true;\n }\n }\n\n return parser.getDependency('bufferView', bufferViewIndex).then(function (bufferView) {\n return new Promise(function (resolve) {\n dracoLoader.decodeDracoFile(\n bufferView,\n function (geometry) {\n for (var attributeName in geometry.attributes) {\n var attribute = geometry.attributes[attributeName];\n var normalized = attributeNormalizedMap[attributeName];\n\n if (normalized !== undefined) attribute.normalized = normalized;\n }\n\n resolve(geometry);\n },\n threeAttributeMap,\n attributeTypeMap\n );\n });\n });\n };\n\n /**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\n function GLTFTextureTransformExtension() {\n this.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n }\n\n GLTFTextureTransformExtension.prototype.extendTexture = function (texture, transform) {\n texture = texture.clone();\n\n if (transform.offset !== undefined) {\n texture.offset.fromArray(transform.offset);\n }\n\n if (transform.rotation !== undefined) {\n texture.rotation = transform.rotation;\n }\n\n if (transform.scale !== undefined) {\n texture.repeat.fromArray(transform.scale);\n }\n\n if (transform.texCoord !== undefined) {\n console.warn(\n 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.'\n );\n }\n\n texture.needsUpdate = true;\n\n return texture;\n };\n\n /**\n * Specular-Glossiness Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n */\n\n /**\n * A sub class of StandardMaterial with some of the functionality\n * changed via the `onBeforeCompile` callback\n * @pailhead\n */\n\n function GLTFMeshStandardSGMaterial(params) {\n MeshStandardMaterial.call(this);\n\n this.isGLTFSpecularGlossinessMaterial = true;\n\n //various chunks that need replacing\n var specularMapParsFragmentChunk = [\n '#ifdef USE_SPECULARMAP',\n '\tuniform sampler2D specularMap;',\n '#endif',\n ].join('\\n');\n\n var glossinessMapParsFragmentChunk = [\n '#ifdef USE_GLOSSINESSMAP',\n '\tuniform sampler2D glossinessMap;',\n '#endif',\n ].join('\\n');\n\n var specularMapFragmentChunk = [\n 'vec3 specularFactor = specular;',\n '#ifdef USE_SPECULARMAP',\n '\tvec4 texelSpecular = texture2D( specularMap, vUv );',\n '\ttexelSpecular = sRGBToLinear( texelSpecular );',\n '\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture',\n '\tspecularFactor *= texelSpecular.rgb;',\n '#endif',\n ].join('\\n');\n\n var glossinessMapFragmentChunk = [\n 'float glossinessFactor = glossiness;',\n '#ifdef USE_GLOSSINESSMAP',\n '\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );',\n '\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture',\n '\tglossinessFactor *= texelGlossiness.a;',\n '#endif',\n ].join('\\n');\n\n var lightPhysicalFragmentChunk = [\n 'PhysicalMaterial material;',\n 'material.diffuseColor = diffuseColor.rgb;',\n 'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );',\n 'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );',\n 'material.specularRoughness = max( 1.0 - glossinessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.',\n 'material.specularRoughness += geometryRoughness;',\n 'material.specularRoughness = min( material.specularRoughness, 1.0 );',\n 'material.specularColor = specularFactor.rgb;',\n ].join('\\n');\n\n var uniforms = {\n specular: { value: new Color().setHex(0xffffff) },\n glossiness: { value: 1 },\n specularMap: { value: null },\n glossinessMap: { value: null },\n };\n\n this._extraUniforms = uniforms;\n\n // please see #14031 or #13198 for an alternate approach\n this.onBeforeCompile = function (shader) {\n for (var uniformName in uniforms) {\n shader.uniforms[uniformName] = uniforms[uniformName];\n }\n\n shader.fragmentShader = shader.fragmentShader.replace(\n 'uniform float roughness;',\n 'uniform vec3 specular;'\n );\n shader.fragmentShader = shader.fragmentShader.replace(\n 'uniform float metalness;',\n 'uniform float glossiness;'\n );\n shader.fragmentShader = shader.fragmentShader.replace(\n '#include <roughnessmap_pars_fragment>',\n specularMapParsFragmentChunk\n );\n shader.fragmentShader = shader.fragmentShader.replace(\n '#include <metalnessmap_pars_fragment>',\n glossinessMapParsFragmentChunk\n );\n shader.fragmentShader = shader.fragmentShader.replace(\n '#include <roughnessmap_fragment>',\n specularMapFragmentChunk\n );\n shader.fragmentShader = shader.fragmentShader.replace(\n '#include <metalnessmap_fragment>',\n glossinessMapFragmentChunk\n );\n shader.fragmentShader = shader.fragmentShader.replace(\n '#include <lights_physical_fragment>',\n lightPhysicalFragmentChunk\n );\n };\n\n /*eslint-disable*/\n Object.defineProperties(this, {\n specular: {\n get: function () {\n return uniforms.specular.value;\n },\n set: function (v) {\n uniforms.specular.value = v;\n },\n },\n specularMap: {\n get: function () {\n return uniforms.specularMap.value;\n },\n set: function (v) {\n uniforms.specularMap.value = v;\n },\n },\n glossiness: {\n get: function () {\n return uniforms.glossiness.value;\n },\n set: function (v) {\n uniforms.glossiness.value = v;\n },\n },\n glossinessMap: {\n get: function () {\n return uniforms.glossinessMap.value;\n },\n set: function (v) {\n uniforms.glossinessMap.value = v;\n //how about something like this - @pailhead\n if (v) {\n this.defines.USE_GLOSSINESSMAP = '';\n // set USE_ROUGHNESSMAP to enable vUv\n this.defines.USE_ROUGHNESSMAP = '';\n } else {\n delete this.defines.USE_ROUGHNESSMAP;\n delete this.defines.USE_GLOSSINESSMAP;\n }\n },\n },\n });\n\n /*eslint-enable*/\n delete this.metalness;\n delete this.roughness;\n delete this.metalnessMap;\n delete this.roughnessMap;\n\n this.setValues(params);\n }\n\n GLTFMeshStandardSGMaterial.prototype = Object.create(MeshStandardMaterial.prototype);\n GLTFMeshStandardSGMaterial.prototype.constructor = GLTFMeshStandardSGMaterial;\n\n GLTFMeshStandardSGMaterial.prototype.copy = function (source) {\n MeshStandardMaterial.prototype.copy.call(this, source);\n this.specularMap = source.specularMap;\n this.specular.copy(source.specular);\n this.glossinessMap = source.glossinessMap;\n this.glossiness = source.glossiness;\n delete this.metalness;\n delete this.roughness;\n delete this.metalnessMap;\n delete this.roughnessMap;\n return this;\n };\n\n function GLTFMaterialsPbrSpecularGlossinessExtension() {\n return {\n name: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,\n\n specularGlossinessParams: [\n 'color',\n 'map',\n 'lightMap',\n 'lightMapIntensity',\n 'aoMap',\n 'aoMapIntensity',\n 'emissive',\n 'emissiveIntensity',\n 'emissiveMap',\n 'bumpMap',\n 'bumpScale',\n 'normalMap',\n 'normalMapType',\n 'displacementMap',\n 'displacementScale',\n 'displacementBias',\n 'specularMap',\n 'specular',\n 'glossinessMap',\n 'glossiness',\n 'alphaMap',\n 'envMap',\n 'envMapIntensity',\n 'refractionRatio',\n ],\n\n getMaterialType: function () {\n return GLTFMeshStandardSGMaterial;\n },\n\n extendParams: function (materialParams, materialDef, parser) {\n var pbrSpecularGlossiness = materialDef.extensions[this.name];\n\n materialParams.color = new Color(1.0, 1.0, 1.0);\n materialParams.opacity = 1.0;\n\n var pending = [];\n\n if (Array.isArray(pbrSpecularGlossiness.diffuseFactor)) {\n var array = pbrSpecularGlossiness.diffuseFactor;\n\n materialParams.color.fromArray(array);\n materialParams.opacity = array[3];\n }\n\n if (pbrSpecularGlossiness.diffuseTexture !== undefined) {\n pending.push(\n parser.assignTexture(materialParams, 'map', pbrSpecularGlossiness.diffuseTexture)\n );\n }\n\n materialParams.emissive = new Color(0.0, 0.0, 0.0);\n materialParams.glossiness =\n pbrSpecularGlossiness.glossinessFactor !== undefined\n ? pbrSpecularGlossiness.glossinessFactor\n : 1.0;\n materialParams.specular = new Color(1.0, 1.0, 1.0);\n\n if (Array.isArray(pbrSpecularGlossiness.specularFactor)) {\n materialParams.specular.fromArray(pbrSpecularGlossiness.specularFactor);\n }\n\n if (pbrSpecularGlossiness.specularGlossinessTexture !== undefined) {\n var specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n pending.push(parser.assignTexture(materialParams, 'glossinessMap', specGlossMapDef));\n pending.push(parser.assignTexture(materialParams, 'specularMap', specGlossMapDef));\n }\n\n return Promise.all(pending);\n },\n\n createMaterial: function (materialParams) {\n var material = new GLTFMeshStandardSGMaterial(materialParams);\n material.fog = true;\n\n material.color = materialParams.color;\n\n material.map = materialParams.map === undefined ? null : materialParams.map;\n\n material.lightMap = null;\n material.lightMapIntensity = 1.0;\n\n material.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;\n material.aoMapIntensity = 1.0;\n\n material.emissive = materialParams.emissive;\n material.emissiveIntensity = 1.0;\n material.emissiveMap =\n materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;\n\n material.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;\n material.bumpScale = 1;\n\n material.normalMap =\n materialParams.normalMap === undefined ? null : materialParams.normalMap;\n material.normalMapType = TangentSpaceNormalMap;\n\n if (materialParams.normalScale) material.normalScale = materialParams.normalScale;\n\n material.displacementMap = null;\n material.displacementScale = 1;\n material.displacementBias = 0;\n\n material.specularMap =\n materialParams.specularMap === undefined ? null : materialParams.specularMap;\n material.specular = materialParams.specular;\n\n material.glossinessMap =\n materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;\n material.glossiness = materialParams.glossiness;\n\n material.alphaMap = null;\n\n material.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;\n material.envMapIntensity = 1.0;\n\n material.refractionRatio = 0.98;\n\n return material;\n },\n };\n }\n\n /**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\n function GLTFMeshQuantizationExtension() {\n this.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n }\n\n /*********************************/\n /********** INTERPOLATION ********/\n /*********************************/\n\n // Spline Interpolation\n // Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\n function GLTFCubicSplineInterpolant(parameterPositions, sampleValues, sampleSize, resultBuffer) {\n Interpolant.call(this, parameterPositions, sampleValues, sampleSize, resultBuffer);\n }\n\n GLTFCubicSplineInterpolant.prototype = Object.create(Interpolant.prototype);\n GLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant;\n\n GLTFCubicSplineInterpolant.prototype.copySampleValue_ = function (index) {\n // Copies a sample value to the result buffer. See description of glTF\n // CUBICSPLINE values layout in interpolate_() function below.\n\n var result = this.resultBuffer,\n values = this.sampleValues,\n valueSize = this.valueSize,\n offset = index * valueSize * 3 + valueSize;\n\n for (var i = 0; i !== valueSize; i++) {\n result[i] = values[offset + i];\n }\n\n return result;\n };\n\n GLTFCubicSplineInterpolant.prototype.beforeStart_ =\n GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n GLTFCubicSplineInterpolant.prototype.afterEnd_ =\n GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n GLTFCubicSplineInterpolant.prototype.interpolate_ = function (i1, t0, t, t1) {\n var result = this.resultBuffer;\n var values = this.sampleValues;\n var stride = this.valueSize;\n\n var stride2 = stride * 2;\n var stride3 = stride * 3;\n\n var td = t1 - t0;\n\n var p = (t - t0) / td;\n var pp = p * p;\n var ppp = pp * p;\n\n var offset1 = i1 * stride3;\n var offset0 = offset1 - stride3;\n\n var s2 = -2 * ppp + 3 * pp;\n var s3 = ppp - pp;\n var s0 = 1 - s2;\n var s1 = s3 - pp + p;\n\n // Layout of keyframe output values for CUBICSPLINE animations:\n // [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n for (var i = 0; i !== stride; i++) {\n var p0 = values[offset0 + i + stride]; // splineVertex_k\n var m0 = values[offset0 + i + stride2] * td; // outTangent_k * (t_k+1 - t_k)\n var p1 = values[offset1 + i + stride]; // splineVertex_k+1\n var m1 = values[offset1 + i] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n result[i] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n }\n\n return result;\n };\n\n /*********************************/\n /********** INTERNALS ************/\n /*********************************/\n\n /* CONSTANTS */\n\n var WEBGL_CONSTANTS = {\n FLOAT: 5126,\n //FLOAT_MAT2: 35674,\n FLOAT_MAT3: 35675,\n FLOAT_MAT4: 35676,\n FLOAT_VEC2: 35664,\n FLOAT_VEC3: 35665,\n FLOAT_VEC4: 35666,\n LINEAR: 9729,\n REPEAT: 10497,\n SAMPLER_2D: 35678,\n POINTS: 0,\n LINES: 1,\n LINE_LOOP: 2,\n LINE_STRIP: 3,\n TRIANGLES: 4,\n TRIANGLE_STRIP: 5,\n TRIANGLE_FAN: 6,\n UNSIGNED_BYTE: 5121,\n UNSIGNED_SHORT: 5123,\n };\n\n var WEBGL_COMPONENT_TYPES = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array,\n };\n\n var WEBGL_FILTERS = {\n 9728: NearestFilter,\n 9729: LinearFilter,\n 9984: NearestMipmapNearestFilter,\n 9985: LinearMipmapNearestFilter,\n 9986: NearestMipmapLinearFilter,\n 9987: LinearMipmapLinearFilter,\n };\n\n var WEBGL_WRAPPINGS = {\n 33071: ClampToEdgeWrapping,\n 33648: MirroredRepeatWrapping,\n 10497: RepeatWrapping,\n };\n\n var WEBGL_TYPE_SIZES = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16,\n };\n\n var ATTRIBUTES = {\n POSITION: 'position',\n NORMAL: 'normal',\n TANGENT: 'tangent',\n TEXCOORD_0: 'uv',\n TEXCOORD_1: 'uv2',\n COLOR_0: 'color',\n WEIGHTS_0: 'skinWeight',\n JOINTS_0: 'skinIndex',\n };\n\n var PATH_PROPERTIES = {\n scale: 'scale',\n translation: 'position',\n rotation: 'quaternion',\n weights: 'morphTargetInfluences',\n };\n\n var INTERPOLATION = {\n CUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n // keyframe track will be initialized with a default interpolation type, then modified.\n LINEAR: InterpolateLinear,\n STEP: InterpolateDiscrete,\n };\n\n var ALPHA_MODES = {\n OPAQUE: 'OPAQUE',\n MASK: 'MASK',\n BLEND: 'BLEND',\n };\n\n var MIME_TYPE_FORMATS = {\n 'image/png': RGBAFormat,\n 'image/jpeg': RGBFormat,\n };\n\n /* UTILITY FUNCTIONS */\n\n function resolveURL(url, path) {\n // Invalid URL\n if (typeof url !== 'string' || url === '') return '';\n\n // Host Relative URL\n if (/^https?:\\/\\//i.test(path) && /^\\//.test(url)) {\n // eslint-disable-next-line no-useless-escape\n path = path.replace(/(^https?:\\/\\/[^\\/]+).*/i, '$1');\n }\n\n // Absolute URL http://,https://,//\n if (/^(https?:)?\\/\\//i.test(url)) return url;\n\n // Data URI\n if (/^data:.*,.*$/i.test(url)) return url;\n\n // Blob URL\n if (/^blob:.*$/i.test(url)) return url;\n\n // Relative URL\n return path + url;\n }\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\n function createDefaultMaterial(cache) {\n if (cache['DefaultMaterial'] === undefined) {\n cache['DefaultMaterial'] = new MeshStandardMaterial({\n color: 0xffffff,\n emissive: 0x000000,\n metalness: 1,\n roughness: 1,\n transparent: false,\n depthTest: true,\n side: FrontSide,\n });\n }\n\n return cache['DefaultMaterial'];\n }\n\n function addUnknownExtensionsToUserData(knownExtensions, object, objectDef) {\n // Add unknown glTF extensions to an object's userData.\n\n for (var name in objectDef.extensions) {\n if (knownExtensions[name] === undefined) {\n object.userData.gltfExtensions = object.userData.gltfExtensions || {};\n object.userData.gltfExtensions[name] = objectDef.extensions[name];\n }\n }\n }\n\n /**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\n function assignExtrasToUserData(object, gltfDef) {\n if (gltfDef.extras !== undefined) {\n if (typeof gltfDef.extras === 'object') {\n Object.assign(object.userData, gltfDef.extras);\n } else {\n console.warn('THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras);\n }\n }\n }\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\n function addMorphTargets(geometry, targets, parser) {\n var hasMorphPosition = false;\n var hasMorphNormal = false;\n\n for (var i = 0, il = targets.length; i < il; i++) {\n var target = targets[i];\n\n if (target.POSITION !== undefined) hasMorphPosition = true;\n if (target.NORMAL !== undefined) hasMorphNormal = true;\n\n if (hasMorphPosition && hasMorphNormal) break;\n }\n\n if (!hasMorphPosition && !hasMorphNormal) return Promise.resolve(geometry);\n\n var pendingPositionAccessors = [];\n var pendingNormalAccessors = [];\n\n for (var i = 0, il = targets.length; i < il; i++) {\n var target = targets[i];\n\n if (hasMorphPosition) {\n var pendingAccessor =\n target.POSITION !== undefined\n ? parser.getDependency('accessor', target.POSITION)\n : geometry.attributes.position;\n\n pendingPositionAccessors.push(pendingAccessor);\n }\n\n if (hasMorphNormal) {\n var pendingAccessor =\n target.NORMAL !== undefined\n ? parser.getDependency('accessor', target.NORMAL)\n : geometry.attributes.normal;\n\n pendingNormalAccessors.push(pendingAccessor);\n }\n }\n\n return Promise.all([\n Promise.all(pendingPositionAccessors),\n Promise.all(pendingNormalAccessors),\n ]).then(function (accessors) {\n var morphPositions = accessors[0];\n var morphNormals = accessors[1];\n\n if (hasMorphPosition) geometry.morphAttributes.position = morphPositions;\n if (hasMorphNormal) geometry.morphAttributes.normal = morphNormals;\n geometry.morphTargetsRelative = true;\n\n return geometry;\n });\n }\n\n /**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\n function updateMorphTargets(mesh, meshDef) {\n mesh.updateMorphTargets();\n\n if (meshDef.weights !== undefined) {\n for (var i = 0, il = meshDef.weights.length; i < il; i++) {\n mesh.morphTargetInfluences[i] = meshDef.weights[i];\n }\n }\n\n // .extras has user-defined data, so check that .extras.targetNames is an array.\n if (meshDef.extras && Array.isArray(meshDef.extras.targetNames)) {\n var targetNames = meshDef.extras.targetNames;\n\n if (mesh.morphTargetInfluences.length === targetNames.length) {\n mesh.morphTargetDictionary = {};\n\n for (var i = 0, il = targetNames.length; i < il; i++) {\n mesh.morphTargetDictionary[targetNames[i]] = i;\n }\n } else {\n console.warn('THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.');\n }\n }\n }\n\n function createPrimitiveKey(primitiveDef) {\n var dracoExtension =\n primitiveDef.extensions && primitiveDef.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];\n var geometryKey;\n\n if (dracoExtension) {\n geometryKey =\n 'draco:' +\n dracoExtension.bufferView +\n ':' +\n dracoExtension.indices +\n ':' +\n createAttributesKey(dracoExtension.attributes);\n } else {\n geometryKey =\n primitiveDef.indices +\n ':' +\n createAttributesKey(primitiveDef.attributes) +\n ':' +\n primitiveDef.mode;\n }\n\n return geometryKey;\n }\n\n function createAttributesKey(attributes) {\n var attributesKey = '';\n\n var keys = Object.keys(attributes).sort();\n\n for (var i = 0, il = keys.length; i < il; i++) {\n attributesKey += keys[i] + ':' + attributes[keys[i]] + ';';\n }\n\n return attributesKey;\n }\n\n /* GLTF PARSER */\n\n function GLTFParser(json, extensions, options) {\n this.json = json || {};\n this.extensions = extensions || {};\n this.options = options || {};\n\n // loader object cache\n this.cache = new GLTFRegistry();\n\n // BufferGeometry caching\n this.primitiveCache = {};\n\n this.textureLoader = new TextureLoader(this.options.manager);\n this.textureLoader.setCrossOrigin(this.options.crossOrigin);\n\n this.fileLoader = new FileLoader(this.options.manager);\n this.fileLoader.setResponseType('arraybuffer');\n\n if (this.options.crossOrigin === 'use-credentials') {\n this.fileLoader.setWithCredentials(true);\n }\n }\n\n GLTFParser.prototype.parse = function (onLoad, onError) {\n var parser = this;\n var json = this.json;\n var extensions = this.extensions;\n\n // Clear the loader cache\n this.cache.removeAll();\n\n // Mark the special nodes/meshes in json for efficient parse\n this.markDefs();\n\n Promise.all([\n this.getDependencies('scene'),\n this.getDependencies('animation'),\n this.getDependencies('camera'),\n ])\n .then(function (dependencies) {\n var result = {\n scene: dependencies[0][json.scene || 0],\n scenes: dependencies[0],\n animations: dependencies[1],\n cameras: dependencies[2],\n asset: json.asset,\n parser: parser,\n userData: {},\n };\n\n addUnknownExtensionsToUserData(extensions, result, json);\n\n assignExtrasToUserData(result, json);\n\n onLoad(result);\n })\n .catch(onError);\n };\n\n /**\n * Marks the special nodes/meshes in json for efficient parse.\n */\n GLTFParser.prototype.markDefs = function () {\n var nodeDefs = this.json.nodes || [];\n var skinDefs = this.json.skins || [];\n var meshDefs = this.json.meshes || [];\n\n var meshReferences = {};\n var meshUses = {};\n\n // Nothing in the node definition indicates whether it is a Bone or an\n // Object3D. Use the skins' joint references to mark bones.\n for (var skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex++) {\n var joints = skinDefs[skinIndex].joints;\n\n for (var i = 0, il = joints.length; i < il; i++) {\n nodeDefs[joints[i]].isBone = true;\n }\n }\n\n // Meshes can (and should) be reused by multiple nodes in a glTF asset. To\n // avoid having more than one Mesh with the same name, count\n // references and rename instances below.\n //\n // Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n for (var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex++) {\n var nodeDef = nodeDefs[nodeIndex];\n\n if (nodeDef.mesh !== undefined) {\n if (meshReferences[nodeDef.mesh] === undefined) {\n meshReferences[nodeDef.mesh] = meshUses[nodeDef.mesh] = 0;\n }\n\n meshReferences[nodeDef.mesh]++;\n\n // Nothing in the mesh definition indicates whether it is\n // a SkinnedMesh or Mesh. Use the node's mesh reference\n // to mark SkinnedMesh if node has skin.\n if (nodeDef.skin !== undefined) {\n meshDefs[nodeDef.mesh].isSkinnedMesh = true;\n }\n }\n }\n\n this.json.meshReferences = meshReferences;\n this.json.meshUses = meshUses;\n };\n\n /**\n * Requests the specified dependency asynchronously, with caching.\n * @param {string} type\n * @param {number} index\n * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n */\n GLTFParser.prototype.getDependency = function (type, index) {\n var cacheKey = type + ':' + index;\n var dependency = this.cache.get(cacheKey);\n\n if (!dependency) {\n switch (type) {\n case 'scene':\n dependency = this.loadScene(index);\n break;\n\n case 'node':\n dependency = this.loadNode(index);\n break;\n\n case 'mesh':\n dependency = this.loadMesh(index);\n break;\n\n case 'accessor':\n dependency = this.loadAccessor(index);\n break;\n\n case 'bufferView':\n dependency = this.loadBufferView(index);\n break;\n\n case 'buffer':\n dependency = this.loadBuffer(index);\n break;\n\n case 'material':\n dependency = this.loadMaterial(index);\n break;\n\n case 'texture':\n dependency = this.loadTexture(index);\n break;\n\n case 'skin':\n dependency = this.loadSkin(index);\n break;\n\n case 'animation':\n dependency = this.loadAnimation(index);\n break;\n\n case 'camera':\n dependency = this.loadCamera(index);\n break;\n\n case 'light':\n dependency = this.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].loadLight(index);\n break;\n\n default:\n throw new Error('Unknown type: ' + type);\n }\n\n this.cache.add(cacheKey, dependency);\n }\n\n return dependency;\n };\n\n /**\n * Requests all dependencies of the specified type asynchronously, with caching.\n * @param {string} type\n * @return {Promise<Array<Object>>}\n */\n GLTFParser.prototype.getDependencies = function (type) {\n var dependencies = this.cache.get(type);\n\n if (!dependencies) {\n var parser = this;\n var defs = this.json[type + (type === 'mesh' ? 'es' : 's')] || [];\n\n dependencies = Promise.all(\n defs.map(function (def, index) {\n return parser.getDependency(type, index);\n })\n );\n\n this.cache.add(type, dependencies);\n }\n\n return dependencies;\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n * @param {number} bufferIndex\n * @return {Promise<ArrayBuffer>}\n */\n GLTFParser.prototype.loadBuffer = function (bufferIndex) {\n var bufferDef = this.json.buffers[bufferIndex];\n var loader = this.fileLoader;\n\n if (bufferDef.type && bufferDef.type !== 'arraybuffer') {\n throw new Error('THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.');\n }\n\n // If present, GLB container is required to be the first buffer.\n if (bufferDef.uri === undefined && bufferIndex === 0) {\n return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body);\n }\n\n var options = this.options;\n\n return new Promise(function (resolve, reject) {\n loader.load(resolveURL(bufferDef.uri, options.path), resolve, undefined, function () {\n reject(new Error('THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".'));\n });\n });\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n * @param {number} bufferViewIndex\n * @return {Promise<ArrayBuffer>}\n */\n GLTFParser.prototype.loadBufferView = function (bufferViewIndex) {\n var bufferViewDef = this.json.bufferViews[bufferViewIndex];\n\n return this.getDependency('buffer', bufferViewDef.buffer).then(function (buffer) {\n var byteLength = bufferViewDef.byteLength || 0;\n var byteOffset = bufferViewDef.byteOffset || 0;\n return buffer.slice(byteOffset, byteOffset + byteLength);\n });\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n * @param {number} accessorIndex\n * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n */\n GLTFParser.prototype.loadAccessor = function (accessorIndex) {\n var parser = this;\n var json = this.json;\n\n var accessorDef = this.json.accessors[accessorIndex];\n\n if (accessorDef.bufferView === undefined && accessorDef.sparse === undefined) {\n // Ignore empty accessors, which may be used to declare runtime\n // information about attributes coming from another source (e.g. Draco\n // compression extension).\n return Promise.resolve(null);\n }\n\n var pendingBufferViews = [];\n\n if (accessorDef.bufferView !== undefined) {\n pendingBufferViews.push(this.getDependency('bufferView', accessorDef.bufferView));\n } else {\n pendingBufferViews.push(null);\n }\n\n if (accessorDef.sparse !== undefined) {\n pendingBufferViews.push(\n this.getDependency('bufferView', accessorDef.sparse.indices.bufferView)\n );\n pendingBufferViews.push(\n this.getDependency('bufferView', accessorDef.sparse.values.bufferView)\n );\n }\n\n return Promise.all(pendingBufferViews).then(function (bufferViews) {\n var bufferView = bufferViews[0];\n\n var itemSize = WEBGL_TYPE_SIZES[accessorDef.type];\n var TypedArray = WEBGL_COMPONENT_TYPES[accessorDef.componentType];\n\n // For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n var elementBytes = TypedArray.BYTES_PER_ELEMENT;\n var itemBytes = elementBytes * itemSize;\n var byteOffset = accessorDef.byteOffset || 0;\n var byteStride =\n accessorDef.bufferView !== undefined\n ? json.bufferViews[accessorDef.bufferView].byteStride\n : undefined;\n var normalized = accessorDef.normalized === true;\n var array, bufferAttribute;\n\n // The buffer is not interleaved if the stride is the item size in bytes.\n if (byteStride && byteStride !== itemBytes) {\n // Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n // This makes sure that IBA.count reflects accessor.count properly\n var ibSlice = Math.floor(byteOffset / byteStride);\n var ibCacheKey =\n 'InterleavedBuffer:' +\n accessorDef.bufferView +\n ':' +\n accessorDef.componentType +\n ':' +\n ibSlice +\n ':' +\n accessorDef.count;\n var ib = parser.cache.get(ibCacheKey);\n\n if (!ib) {\n array = new TypedArray(\n bufferView,\n ibSlice * byteStride,\n (accessorDef.count * byteStride) / elementBytes\n );\n\n // Integer parameters to IB/IBA are in array elements, not bytes.\n ib = new InterleavedBuffer(array, byteStride / elementBytes);\n\n parser.cache.add(ibCacheKey, ib);\n }\n\n bufferAttribute = new InterleavedBufferAttribute(\n ib,\n itemSize,\n (byteOffset % byteStride) / elementBytes,\n normalized\n );\n } else {\n if (bufferView === null) {\n array = new TypedArray(accessorDef.count * itemSize);\n } else {\n array = new TypedArray(bufferView, byteOffset, accessorDef.count * itemSize);\n }\n\n bufferAttribute = new BufferAttribute(array, itemSize, normalized);\n }\n\n // https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n if (accessorDef.sparse !== undefined) {\n var itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n var TypedArrayIndices = WEBGL_COMPONENT_TYPES[accessorDef.sparse.indices.componentType];\n\n var byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n var byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n var sparseIndices = new TypedArrayIndices(\n bufferViews[1],\n byteOffsetIndices,\n accessorDef.sparse.count * itemSizeIndices\n );\n var sparseValues = new TypedArray(\n bufferViews[2],\n byteOffsetValues,\n accessorDef.sparse.count * itemSize\n );\n\n if (bufferView !== null) {\n // Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n bufferAttribute = new BufferAttribute(\n bufferAttribute.array.slice(),\n bufferAttribute.itemSize,\n bufferAttribute.normalized\n );\n }\n\n for (var i = 0, il = sparseIndices.length; i < il; i++) {\n var index = sparseIndices[i];\n\n bufferAttribute.setX(index, sparseValues[i * itemSize]);\n if (itemSize >= 2) bufferAttribute.setY(index, sparseValues[i * itemSize + 1]);\n if (itemSize >= 3) bufferAttribute.setZ(index, sparseValues[i * itemSize + 2]);\n if (itemSize >= 4) bufferAttribute.setW(index, sparseValues[i * itemSize + 3]);\n if (itemSize >= 5)\n throw new Error('THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.');\n }\n }\n\n return bufferAttribute;\n });\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n * @param {number} textureIndex\n * @return {Promise<THREE.Texture>}\n */\n GLTFParser.prototype.loadTexture = function (textureIndex) {\n var parser = this;\n var json = this.json;\n var options = this.options;\n var textureLoader = this.textureLoader;\n\n var URL = self.URL || self.webkitURL;\n\n var textureDef = json.textures[textureIndex];\n\n var textureExtensions = textureDef.extensions || {};\n\n var source;\n\n if (textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]) {\n source = json.images[textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS].source];\n } else {\n source = json.images[textureDef.source];\n }\n\n var sourceURI = source.uri;\n var isObjectURL = false;\n\n if (source.bufferView !== undefined) {\n // Load binary image data from bufferView, if provided.\n\n sourceURI = parser.getDependency('bufferView', source.bufferView).then(function (bufferView) {\n isObjectURL = true;\n var blob = new Blob([bufferView], { type: source.mimeType });\n sourceURI = URL.createObjectURL(blob);\n return sourceURI;\n });\n }\n\n return Promise.resolve(sourceURI)\n .then(function (sourceURI) {\n // Load Texture resource.\n\n var loader = options.manager.getHandler(sourceURI);\n\n if (!loader) {\n loader = textureExtensions[EXTENSIONS.MSFT_TEXTURE_DDS]\n ? parser.extensions[EXTENSIONS.MSFT_TEXTURE_DDS].ddsLoader\n : textureLoader;\n }\n\n return new Promise(function (resolve, reject) {\n loader.load(resolveURL(sourceURI, options.path), resolve, undefined, reject);\n });\n })\n .then(function (texture) {\n // Clean up resources and configure Texture.\n\n if (isObjectURL === true) {\n URL.revokeObjectURL(sourceURI);\n }\n\n texture.flipY = false;\n\n if (textureDef.name) texture.name = textureDef.name;\n\n // Ignore unknown mime types, like DDS files.\n if (source.mimeType in MIME_TYPE_FORMATS) {\n texture.format = MIME_TYPE_FORMATS[source.mimeType];\n }\n\n var samplers = json.samplers || {};\n var sampler = samplers[textureDef.sampler] || {};\n\n texture.magFilter = WEBGL_FILTERS[sampler.magFilter] || LinearFilter;\n texture.minFilter = WEBGL_FILTERS[sampler.minFilter] || LinearMipmapLinearFilter;\n texture.wrapS = WEBGL_WRAPPINGS[sampler.wrapS] || RepeatWrapping;\n texture.wrapT = WEBGL_WRAPPINGS[sampler.wrapT] || RepeatWrapping;\n\n return texture;\n });\n };\n\n /**\n * Asynchronously assigns a texture to the given material parameters.\n * @param {Object} materialParams\n * @param {string} mapName\n * @param {Object} mapDef\n * @return {Promise}\n */\n GLTFParser.prototype.assignTexture = function (materialParams, mapName, mapDef) {\n var parser = this;\n\n return this.getDependency('texture', mapDef.index).then(function (texture) {\n if (!texture.isCompressedTexture) {\n switch (mapName) {\n case 'aoMap':\n case 'emissiveMap':\n case 'metalnessMap':\n case 'normalMap':\n case 'roughnessMap':\n texture.format = RGBFormat;\n break;\n }\n }\n\n // Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured\n // However, we will copy UV set 0 to UV set 1 on demand for aoMap\n if (\n mapDef.texCoord !== undefined &&\n mapDef.texCoord != 0 &&\n !(mapName === 'aoMap' && mapDef.texCoord == 1)\n ) {\n console.warn(\n 'THREE.GLTFLoader: Custom UV set ' +\n mapDef.texCoord +\n ' for texture ' +\n mapName +\n ' not yet supported.'\n );\n }\n\n if (parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]) {\n var transform =\n mapDef.extensions !== undefined\n ? mapDef.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]\n : undefined;\n\n if (transform) {\n texture = parser.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(\n texture,\n transform\n );\n }\n }\n\n materialParams[mapName] = texture;\n });\n };\n\n /**\n * Assigns final material to a Mesh, Line, or Points instance. The instance\n * already has a material (generated from the glTF material options alone)\n * but reuse of the same glTF material may require multiple threejs materials\n * to accomodate different primitive types, defines, etc. New materials will\n * be created if necessary, and reused from a cache.\n * @param {Object3D} mesh Mesh, Line, or Points instance.\n */\n GLTFParser.prototype.assignFinalMaterial = function (mesh) {\n var geometry = mesh.geometry;\n var material = mesh.material;\n\n var useVertexTangents = geometry.attributes.tangent !== undefined;\n var useVertexColors = geometry.attributes.color !== undefined;\n var useFlatShading = geometry.attributes.normal === undefined;\n var useSkinning = mesh.isSkinnedMesh === true;\n var useMorphTargets = Object.keys(geometry.morphAttributes).length > 0;\n var useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined;\n\n if (mesh.isPoints) {\n var cacheKey = 'PointsMaterial:' + material.uuid;\n\n var pointsMaterial = this.cache.get(cacheKey);\n\n if (!pointsMaterial) {\n pointsMaterial = new PointsMaterial();\n Material.prototype.copy.call(pointsMaterial, material);\n pointsMaterial.color.copy(material.color);\n pointsMaterial.map = material.map;\n pointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n this.cache.add(cacheKey, pointsMaterial);\n }\n\n material = pointsMaterial;\n } else if (mesh.isLine) {\n var cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n var lineMaterial = this.cache.get(cacheKey);\n\n if (!lineMaterial) {\n lineMaterial = new LineBasicMaterial();\n Material.prototype.copy.call(lineMaterial, material);\n lineMaterial.color.copy(material.color);\n\n this.cache.add(cacheKey, lineMaterial);\n }\n\n material = lineMaterial;\n }\n\n // Clone the material if it will be modified\n if (useVertexTangents || useVertexColors || useFlatShading || useSkinning || useMorphTargets) {\n var cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n if (material.isGLTFSpecularGlossinessMaterial) cacheKey += 'specular-glossiness:';\n if (useSkinning) cacheKey += 'skinning:';\n if (useVertexTangents) cacheKey += 'vertex-tangents:';\n if (useVertexColors) cacheKey += 'vertex-colors:';\n if (useFlatShading) cacheKey += 'flat-shading:';\n if (useMorphTargets) cacheKey += 'morph-targets:';\n if (useMorphNormals) cacheKey += 'morph-normals:';\n\n var cachedMaterial = this.cache.get(cacheKey);\n\n if (!cachedMaterial) {\n cachedMaterial = material.clone();\n\n if (useSkinning) cachedMaterial.skinning = true;\n if (useVertexTangents) cachedMaterial.vertexTangents = true;\n if (useVertexColors) cachedMaterial.vertexColors = true;\n if (useFlatShading) cachedMaterial.flatShading = true;\n if (useMorphTargets) cachedMaterial.morphTargets = true;\n if (useMorphNormals) cachedMaterial.morphNormals = true;\n\n this.cache.add(cacheKey, cachedMaterial);\n }\n\n material = cachedMaterial;\n }\n\n // workarounds for mesh and geometry\n\n if (\n material.aoMap &&\n geometry.attributes.uv2 === undefined &&\n geometry.attributes.uv !== undefined\n ) {\n geometry.setAttribute('uv2', geometry.attributes.uv);\n }\n\n // https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n if (material.normalScale && !useVertexTangents) {\n material.normalScale.y = -material.normalScale.y;\n }\n\n if (material.clearcoatNormalScale && !useVertexTangents) {\n material.clearcoatNormalScale.y = -material.clearcoatNormalScale.y;\n }\n\n mesh.material = material;\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n * @param {number} materialIndex\n * @return {Promise<Material>}\n */\n GLTFParser.prototype.loadMaterial = function (materialIndex) {\n var parser = this;\n var json = this.json;\n var extensions = this.extensions;\n var materialDef = json.materials[materialIndex];\n\n var materialType;\n var materialParams = {};\n var materialExtensions = materialDef.extensions || {};\n\n var pending = [];\n\n if (materialExtensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]) {\n var sgExtension = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS];\n materialType = sgExtension.getMaterialType();\n pending.push(sgExtension.extendParams(materialParams, materialDef, parser));\n } else if (materialExtensions[EXTENSIONS.KHR_MATERIALS_UNLIT]) {\n var kmuExtension = extensions[EXTENSIONS.KHR_MATERIALS_UNLIT];\n materialType = kmuExtension.getMaterialType();\n pending.push(kmuExtension.extendParams(materialParams, materialDef, parser));\n } else {\n // Specification:\n // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n materialType = MeshStandardMaterial;\n\n var metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n materialParams.color = new Color(1.0, 1.0, 1.0);\n materialParams.opacity = 1.0;\n\n if (Array.isArray(metallicRoughness.baseColorFactor)) {\n var array = metallicRoughness.baseColorFactor;\n\n materialParams.color.fromArray(array);\n materialParams.opacity = array[3];\n }\n\n if (metallicRoughness.baseColorTexture !== undefined) {\n pending.push(\n parser.assignTexture(materialParams, 'map', metallicRoughness.baseColorTexture)\n );\n }\n\n materialParams.metalness =\n metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n materialParams.roughness =\n metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n if (metallicRoughness.metallicRoughnessTexture !== undefined) {\n pending.push(\n parser.assignTexture(\n materialParams,\n 'metalnessMap',\n metallicRoughness.metallicRoughnessTexture\n )\n );\n pending.push(\n parser.assignTexture(\n materialParams,\n 'roughnessMap',\n metallicRoughness.metallicRoughnessTexture\n )\n );\n }\n }\n\n if (materialDef.doubleSided === true) {\n materialParams.side = DoubleSide;\n }\n\n var alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n if (alphaMode === ALPHA_MODES.BLEND) {\n materialParams.transparent = true;\n\n // See: https://github.com/mrdoob/three.js/issues/17706\n materialParams.depthWrite = false;\n } else {\n materialParams.transparent = false;\n\n if (alphaMode === ALPHA_MODES.MASK) {\n materialParams.alphaTest =\n materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n }\n }\n\n if (materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial) {\n pending.push(parser.assignTexture(materialParams, 'normalMap', materialDef.normalTexture));\n\n materialParams.normalScale = new Vector2(1, 1);\n\n if (materialDef.normalTexture.scale !== undefined) {\n materialParams.normalScale.set(\n materialDef.normalTexture.scale,\n materialDef.normalTexture.scale\n );\n }\n }\n\n if (materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial) {\n pending.push(parser.assignTexture(materialParams, 'aoMap', materialDef.occlusionTexture));\n\n if (materialDef.occlusionTexture.strength !== undefined) {\n materialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n }\n }\n\n if (materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial) {\n materialParams.emissive = new Color().fromArray(materialDef.emissiveFactor);\n }\n\n if (materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial) {\n pending.push(\n parser.assignTexture(materialParams, 'emissiveMap', materialDef.emissiveTexture)\n );\n }\n\n if (materialExtensions[EXTENSIONS.KHR_MATERIALS_CLEARCOAT]) {\n var clearcoatExtension = extensions[EXTENSIONS.KHR_MATERIALS_CLEARCOAT];\n materialType = clearcoatExtension.getMaterialType();\n pending.push(\n clearcoatExtension.extendParams(materialParams, { extensions: materialExtensions }, parser)\n );\n }\n\n return Promise.all(pending).then(function () {\n var material;\n\n if (materialType === GLTFMeshStandardSGMaterial) {\n material = extensions[EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(\n materialParams\n );\n } else {\n material = new materialType(materialParams);\n }\n\n if (materialDef.name) material.name = materialDef.name;\n\n // baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding.\n if (material.map) material.map.encoding = sRGBEncoding;\n if (material.emissiveMap) material.emissiveMap.encoding = sRGBEncoding;\n\n assignExtrasToUserData(material, materialDef);\n\n if (materialDef.extensions) addUnknownExtensionsToUserData(extensions, material, materialDef);\n\n return material;\n });\n };\n\n /**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\n function computeBounds(geometry, primitiveDef, parser) {\n var attributes = primitiveDef.attributes;\n\n var box = new Box3();\n\n if (attributes.POSITION !== undefined) {\n var accessor = parser.json.accessors[attributes.POSITION];\n\n var min = accessor.min;\n var max = accessor.max;\n\n // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n if (min !== undefined && max !== undefined) {\n box.set(new Vector3(min[0], min[1], min[2]), new Vector3(max[0], max[1], max[2]));\n } else {\n console.warn('THREE.GLTFLoader: Missing min/max properties for accessor POSITION.');\n\n return;\n }\n } else {\n return;\n }\n\n var targets = primitiveDef.targets;\n\n if (targets !== undefined) {\n var maxDisplacement = new Vector3();\n var vector = new Vector3();\n\n for (var i = 0, il = targets.length; i < il; i++) {\n var target = targets[i];\n\n if (target.POSITION !== undefined) {\n var accessor = parser.json.accessors[target.POSITION];\n var min = accessor.min;\n var max = accessor.max;\n\n // glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n if (min !== undefined && max !== undefined) {\n // we need to get max of absolute components because target weight is [-1,1]\n vector.setX(Math.max(Math.abs(min[0]), Math.abs(max[0])));\n vector.setY(Math.max(Math.abs(min[1]), Math.abs(max[1])));\n vector.setZ(Math.max(Math.abs(min[2]), Math.abs(max[2])));\n\n // Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n // to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n // are used to implement key-frame animations and as such only two are active at a time - this results in very large\n // boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n maxDisplacement.max(vector);\n } else {\n console.warn('THREE.GLTFLoader: Missing min/max properties for accessor POSITION.');\n }\n }\n }\n\n // As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n box.expandByVector(maxDisplacement);\n }\n\n geometry.boundingBox = box;\n\n var sphere = new Sphere();\n\n box.getCenter(sphere.center);\n sphere.radius = box.min.distanceTo(box.max) / 2;\n\n geometry.boundingSphere = sphere;\n }\n\n /**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\n function addPrimitiveAttributes(geometry, primitiveDef, parser) {\n var attributes = primitiveDef.attributes;\n\n var pending = [];\n\n function assignAttributeAccessor(accessorIndex, attributeName) {\n return parser.getDependency('accessor', accessorIndex).then(function (accessor) {\n geometry.setAttribute(attributeName, accessor);\n });\n }\n\n for (var gltfAttributeName in attributes) {\n var threeAttributeName = ATTRIBUTES[gltfAttributeName] || gltfAttributeName.toLowerCase();\n\n // Skip attributes already provided by e.g. Draco extension.\n if (threeAttributeName in geometry.attributes) continue;\n\n pending.push(assignAttributeAccessor(attributes[gltfAttributeName], threeAttributeName));\n }\n\n if (primitiveDef.indices !== undefined && !geometry.index) {\n var accessor = parser\n .getDependency('accessor', primitiveDef.indices)\n .then(function (accessor) {\n geometry.setIndex(accessor);\n });\n\n pending.push(accessor);\n }\n\n assignExtrasToUserData(geometry, primitiveDef);\n\n computeBounds(geometry, primitiveDef, parser);\n\n return Promise.all(pending).then(function () {\n return primitiveDef.targets !== undefined\n ? addMorphTargets(geometry, primitiveDef.targets, parser)\n : geometry;\n });\n }\n\n /**\n * @param {BufferGeometry} geometry\n * @param {Number} drawMode\n * @return {BufferGeometry}\n */\n function toTrianglesDrawMode(geometry, drawMode) {\n var index = geometry.getIndex();\n\n // generate index if not present\n\n if (index === null) {\n var indices = [];\n\n var position = geometry.getAttribute('position');\n\n if (position !== undefined) {\n for (var i = 0; i < position.count; i++) {\n indices.push(i);\n }\n\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.'\n );\n return geometry;\n }\n }\n\n //\n\n var numberOfTriangles = index.count - 2;\n var newIndices = [];\n\n if (drawMode === TriangleFanDrawMode) {\n // gl.TRIANGLE_FAN\n\n for (var i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n // gl.TRIANGLE_STRIP\n\n for (var i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\n 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.'\n );\n }\n\n // build final geometry\n\n var newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n\n return newGeometry;\n }\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n *\n * Creates BufferGeometries from primitives.\n *\n * @param {Array<GLTF.Primitive>} primitives\n * @return {Promise<Array<BufferGeometry>>}\n */\n GLTFParser.prototype.loadGeometries = function (primitives) {\n var parser = this;\n var extensions = this.extensions;\n var cache = this.primitiveCache;\n\n function createDracoPrimitive(primitive) {\n return extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]\n .decodePrimitive(primitive, parser)\n .then(function (geometry) {\n return addPrimitiveAttributes(geometry, primitive, parser);\n });\n }\n\n var pending = [];\n\n for (var i = 0, il = primitives.length; i < il; i++) {\n var primitive = primitives[i];\n var cacheKey = createPrimitiveKey(primitive);\n\n // See if we've already created this geometry\n var cached = cache[cacheKey];\n\n if (cached) {\n // Use the cached geometry if it exists\n pending.push(cached.promise);\n } else {\n var geometryPromise;\n\n if (primitive.extensions && primitive.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]) {\n // Use DRACO geometry if available\n geometryPromise = createDracoPrimitive(primitive);\n } else {\n // Otherwise create a new geometry\n geometryPromise = addPrimitiveAttributes(new BufferGeometry(), primitive, parser);\n }\n\n // Cache this geometry\n cache[cacheKey] = { primitive: primitive, promise: geometryPromise };\n\n pending.push(geometryPromise);\n }\n }\n\n return Promise.all(pending);\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n * @param {number} meshIndex\n * @return {Promise<Group|Mesh|SkinnedMesh>}\n */\n GLTFParser.prototype.loadMesh = function (meshIndex) {\n var parser = this;\n var json = this.json;\n\n var meshDef = json.meshes[meshIndex];\n var primitives = meshDef.primitives;\n\n var pending = [];\n\n for (var i = 0, il = primitives.length; i < il; i++) {\n var material =\n primitives[i].material === undefined\n ? createDefaultMaterial(this.cache)\n : this.getDependency('material', primitives[i].material);\n\n pending.push(material);\n }\n\n pending.push(parser.loadGeometries(primitives));\n\n return Promise.all(pending).then(function (results) {\n var materials = results.slice(0, results.length - 1);\n var geometries = results[results.length - 1];\n\n var meshes = [];\n\n for (var i = 0, il = geometries.length; i < il; i++) {\n var geometry = geometries[i];\n var primitive = primitives[i];\n\n // 1. create Mesh\n\n var mesh;\n\n var material = materials[i];\n\n if (\n primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n primitive.mode === undefined\n ) {\n // .isSkinnedMesh isn't in glTF spec. See .markDefs()\n mesh =\n meshDef.isSkinnedMesh === true\n ? new SkinnedMesh(geometry, material)\n : new Mesh(geometry, material);\n\n if (mesh.isSkinnedMesh === true && !mesh.geometry.attributes.skinWeight.normalized) {\n // we normalize floating point skin weight array to fix malformed assets (see #15319)\n // it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n mesh.normalizeSkinWeights();\n }\n\n if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP) {\n mesh.geometry = toTrianglesDrawMode(mesh.geometry, TriangleStripDrawMode);\n } else if (primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN) {\n mesh.geometry = toTrianglesDrawMode(mesh.geometry, TriangleFanDrawMode);\n }\n } else if (primitive.mode === WEBGL_CONSTANTS.LINES) {\n mesh = new LineSegments(geometry, material);\n } else if (primitive.mode === WEBGL_CONSTANTS.LINE_STRIP) {\n mesh = new Line(geometry, material);\n } else if (primitive.mode === WEBGL_CONSTANTS.LINE_LOOP) {\n mesh = new LineLoop(geometry, material);\n } else if (primitive.mode === WEBGL_CONSTANTS.POINTS) {\n mesh = new Points(geometry, material);\n } else {\n throw new Error('THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode);\n }\n\n if (Object.keys(mesh.geometry.morphAttributes).length > 0) {\n updateMorphTargets(mesh, meshDef);\n }\n\n mesh.name = meshDef.name || 'mesh_' + meshIndex;\n\n if (geometries.length > 1) mesh.name += '_' + i;\n\n assignExtrasToUserData(mesh, meshDef);\n\n parser.assignFinalMaterial(mesh);\n\n meshes.push(mesh);\n }\n\n if (meshes.length === 1) {\n return meshes[0];\n }\n\n var group = new Group();\n\n for (var i = 0, il = meshes.length; i < il; i++) {\n group.add(meshes[i]);\n }\n\n return group;\n });\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n * @param {number} cameraIndex\n * @return {Promise<THREE.Camera>}\n */\n GLTFParser.prototype.loadCamera = function (cameraIndex) {\n var camera;\n var cameraDef = this.json.cameras[cameraIndex];\n var params = cameraDef[cameraDef.type];\n\n if (!params) {\n console.warn('THREE.GLTFLoader: Missing camera parameters.');\n return;\n }\n\n if (cameraDef.type === 'perspective') {\n camera = new PerspectiveCamera(\n MathUtils.radToDeg(params.yfov),\n params.aspectRatio || 1,\n params.znear || 1,\n params.zfar || 2e6\n );\n } else if (cameraDef.type === 'orthographic') {\n camera = new OrthographicCamera(\n -params.xmag,\n params.xmag,\n params.ymag,\n -params.ymag,\n params.znear,\n params.zfar\n );\n }\n\n if (cameraDef.name) camera.name = cameraDef.name;\n\n assignExtrasToUserData(camera, cameraDef);\n\n return Promise.resolve(camera);\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n * @param {number} skinIndex\n * @return {Promise<Object>}\n */\n GLTFParser.prototype.loadSkin = function (skinIndex) {\n var skinDef = this.json.skins[skinIndex];\n\n var skinEntry = { joints: skinDef.joints };\n\n if (skinDef.inverseBindMatrices === undefined) {\n return Promise.resolve(skinEntry);\n }\n\n return this.getDependency('accessor', skinDef.inverseBindMatrices).then(function (accessor) {\n skinEntry.inverseBindMatrices = accessor;\n\n return skinEntry;\n });\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n * @param {number} animationIndex\n * @return {Promise<AnimationClip>}\n */\n GLTFParser.prototype.loadAnimation = function (animationIndex) {\n var json = this.json;\n\n var animationDef = json.animations[animationIndex];\n\n var pendingNodes = [];\n var pendingInputAccessors = [];\n var pendingOutputAccessors = [];\n var pendingSamplers = [];\n var pendingTargets = [];\n\n for (var i = 0, il = animationDef.channels.length; i < il; i++) {\n var channel = animationDef.channels[i];\n var sampler = animationDef.samplers[channel.sampler];\n var target = channel.target;\n var name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated.\n var input =\n animationDef.parameters !== undefined\n ? animationDef.parameters[sampler.input]\n : sampler.input;\n var output =\n animationDef.parameters !== undefined\n ? animationDef.parameters[sampler.output]\n : sampler.output;\n\n pendingNodes.push(this.getDependency('node', name));\n pendingInputAccessors.push(this.getDependency('accessor', input));\n pendingOutputAccessors.push(this.getDependency('accessor', output));\n pendingSamplers.push(sampler);\n pendingTargets.push(target);\n }\n\n return Promise.all([\n Promise.all(pendingNodes),\n Promise.all(pendingInputAccessors),\n Promise.all(pendingOutputAccessors),\n Promise.all(pendingSamplers),\n Promise.all(pendingTargets),\n ]).then(function (dependencies) {\n var nodes = dependencies[0];\n var inputAccessors = dependencies[1];\n var outputAccessors = dependencies[2];\n var samplers = dependencies[3];\n var targets = dependencies[4];\n\n var tracks = [];\n\n for (var i = 0, il = nodes.length; i < il; i++) {\n var node = nodes[i];\n var inputAccessor = inputAccessors[i];\n var outputAccessor = outputAccessors[i];\n var sampler = samplers[i];\n var target = targets[i];\n\n if (node === undefined) continue;\n\n node.updateMatrix();\n node.matrixAutoUpdate = true;\n\n var TypedKeyframeTrack;\n\n switch (PATH_PROPERTIES[target.path]) {\n case PATH_PROPERTIES.weights:\n TypedKeyframeTrack = NumberKeyframeTrack;\n break;\n\n case PATH_PROPERTIES.rotation:\n TypedKeyframeTrack = QuaternionKeyframeTrack;\n break;\n\n case PATH_PROPERTIES.position:\n case PATH_PROPERTIES.scale:\n default:\n TypedKeyframeTrack = VectorKeyframeTrack;\n break;\n }\n\n var targetName = node.name ? node.name : node.uuid;\n\n var interpolation =\n sampler.interpolation !== undefined\n ? INTERPOLATION[sampler.interpolation]\n : InterpolateLinear;\n\n var targetNames = [];\n\n if (PATH_PROPERTIES[target.path] === PATH_PROPERTIES.weights) {\n // Node may be a Group (glTF mesh with several primitives) or a Mesh.\n node.traverse(function (object) {\n if (object.isMesh === true && object.morphTargetInfluences) {\n targetNames.push(object.name ? object.name : object.uuid);\n }\n });\n } else {\n targetNames.push(targetName);\n }\n\n var outputArray = outputAccessor.array;\n\n if (outputAccessor.normalized) {\n var scale;\n\n if (outputArray.constructor === Int8Array) {\n scale = 1 / 127;\n } else if (outputArray.constructor === Uint8Array) {\n scale = 1 / 255;\n } else if (outputArray.constructor == Int16Array) {\n scale = 1 / 32767;\n } else if (outputArray.constructor === Uint16Array) {\n scale = 1 / 65535;\n } else {\n throw new Error('THREE.GLTFLoader: Unsupported output accessor component type.');\n }\n\n var scaled = new Float32Array(outputArray.length);\n\n for (var j = 0, jl = outputArray.length; j < jl; j++) {\n scaled[j] = outputArray[j] * scale;\n }\n\n outputArray = scaled;\n }\n\n for (var j = 0, jl = targetNames.length; j < jl; j++) {\n var track = new TypedKeyframeTrack(\n targetNames[j] + '.' + PATH_PROPERTIES[target.path],\n inputAccessor.array,\n outputArray,\n interpolation\n );\n\n // Override interpolation with custom factory method.\n if (sampler.interpolation === 'CUBICSPLINE') {\n track.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline(result) {\n // A CUBICSPLINE keyframe in glTF has three output values for each input value,\n // representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n // must be divided by three to get the interpolant's sampleSize argument.\n\n return new GLTFCubicSplineInterpolant(\n this.times,\n this.values,\n this.getValueSize() / 3,\n result\n );\n };\n\n // Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n }\n\n tracks.push(track);\n }\n }\n\n var name = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n return new AnimationClip(name, undefined, tracks);\n });\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n * @param {number} nodeIndex\n * @return {Promise<Object3D>}\n */\n GLTFParser.prototype.loadNode = function (nodeIndex) {\n var json = this.json;\n var extensions = this.extensions;\n var parser = this;\n\n var meshReferences = json.meshReferences;\n var meshUses = json.meshUses;\n\n var nodeDef = json.nodes[nodeIndex];\n\n return (function () {\n var pending = [];\n\n if (nodeDef.mesh !== undefined) {\n pending.push(\n parser.getDependency('mesh', nodeDef.mesh).then(function (mesh) {\n var node;\n\n if (meshReferences[nodeDef.mesh] > 1) {\n var instanceNum = meshUses[nodeDef.mesh]++;\n\n node = mesh.clone();\n node.name += '_instance_' + instanceNum;\n } else {\n node = mesh;\n }\n\n // if weights are provided on the node, override weights on the mesh.\n if (nodeDef.weights !== undefined) {\n node.traverse(function (o) {\n if (!o.isMesh) return;\n\n for (var i = 0, il = nodeDef.weights.length; i < il; i++) {\n o.morphTargetInfluences[i] = nodeDef.weights[i];\n }\n });\n }\n\n return node;\n })\n );\n }\n\n if (nodeDef.camera !== undefined) {\n pending.push(parser.getDependency('camera', nodeDef.camera));\n }\n\n if (\n nodeDef.extensions &&\n nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL] &&\n nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].light !== undefined\n ) {\n pending.push(\n parser.getDependency('light', nodeDef.extensions[EXTENSIONS.KHR_LIGHTS_PUNCTUAL].light)\n );\n }\n\n return Promise.all(pending);\n })().then(function (objects) {\n var node;\n\n // .isBone isn't in glTF spec. See .markDefs\n if (nodeDef.isBone === true) {\n node = new Bone();\n } else if (objects.length > 1) {\n node = new Group();\n } else if (objects.length === 1) {\n node = objects[0];\n } else {\n node = new Object3D();\n }\n\n if (node !== objects[0]) {\n for (var i = 0, il = objects.length; i < il; i++) {\n node.add(objects[i]);\n }\n }\n\n if (nodeDef.name) {\n node.userData.name = nodeDef.name;\n node.name = PropertyBinding.sanitizeNodeName(nodeDef.name);\n }\n\n assignExtrasToUserData(node, nodeDef);\n\n if (nodeDef.extensions) addUnknownExtensionsToUserData(extensions, node, nodeDef);\n\n if (nodeDef.matrix !== undefined) {\n var matrix = new Matrix4();\n matrix.fromArray(nodeDef.matrix);\n node.applyMatrix4(matrix);\n } else {\n if (nodeDef.translation !== undefined) {\n node.position.fromArray(nodeDef.translation);\n }\n\n if (nodeDef.rotation !== undefined) {\n node.quaternion.fromArray(nodeDef.rotation);\n }\n\n if (nodeDef.scale !== undefined) {\n node.scale.fromArray(nodeDef.scale);\n }\n }\n\n return node;\n });\n };\n\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n * @param {number} sceneIndex\n * @return {Promise<Group>}\n */\n GLTFParser.prototype.loadScene = (function () {\n // scene node hierachy builder\n\n function buildNodeHierachy(nodeId, parentObject, json, parser) {\n var nodeDef = json.nodes[nodeId];\n\n return parser\n .getDependency('node', nodeId)\n .then(function (node) {\n if (nodeDef.skin === undefined) return node;\n\n // build skeleton here as well\n\n var skinEntry;\n\n return parser\n .getDependency('skin', nodeDef.skin)\n .then(function (skin) {\n skinEntry = skin;\n\n var pendingJoints = [];\n\n for (var i = 0, il = skinEntry.joints.length; i < il; i++) {\n pendingJoints.push(parser.getDependency('node', skinEntry.joints[i]));\n }\n\n return Promise.all(pendingJoints);\n })\n .then(function (jointNodes) {\n node.traverse(function (mesh) {\n if (!mesh.isMesh) return;\n\n var bones = [];\n var boneInverses = [];\n\n for (var j = 0, jl = jointNodes.length; j < jl; j++) {\n var jointNode = jointNodes[j];\n\n if (jointNode) {\n bones.push(jointNode);\n\n var mat = new Matrix4();\n\n if (skinEntry.inverseBindMatrices !== undefined) {\n mat.fromArray(skinEntry.inverseBindMatrices.array, j * 16);\n }\n\n boneInverses.push(mat);\n } else {\n console.warn(\n 'THREE.GLTFLoader: Joint \"%s\" could not be found.',\n skinEntry.joints[j]\n );\n }\n }\n\n mesh.bind(new Skeleton(bones, boneInverses), mesh.matrixWorld);\n });\n\n return node;\n });\n })\n .then(function (node) {\n // build node hierachy\n\n parentObject.add(node);\n\n var pending = [];\n\n if (nodeDef.children) {\n var children = nodeDef.children;\n\n for (var i = 0, il = children.length; i < il; i++) {\n var child = children[i];\n pending.push(buildNodeHierachy(child, node, json, parser));\n }\n }\n\n return Promise.all(pending);\n });\n }\n\n return function loadScene(sceneIndex) {\n var json = this.json;\n var extensions = this.extensions;\n var sceneDef = this.json.scenes[sceneIndex];\n var parser = this;\n\n // Loader returns Group, not Scene.\n // See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n var scene = new Group();\n if (sceneDef.name) scene.name = sceneDef.name;\n\n assignExtrasToUserData(scene, sceneDef);\n\n if (sceneDef.extensions) addUnknownExtensionsToUserData(extensions, scene, sceneDef);\n\n var nodeIds = sceneDef.nodes || [];\n\n var pending = [];\n\n for (var i = 0, il = nodeIds.length; i < il; i++) {\n pending.push(buildNodeHierachy(nodeIds[i], scene, json, parser));\n }\n\n return Promise.all(pending).then(function () {\n return scene;\n });\n };\n })();\n\n return GLTFLoader;\n})();\n\nexport { GLTFLoader };\n","import * as THREE from 'three';\n\nimport Material from '../components/material';\nimport Helpers from '../../utils/helpers';\nimport { BufferGeometryUtils } from '../../utils/bufferGeometryUtils';\nimport { GLTFLoader } from '../loaders/GLTFLoader';\nimport Config from '../../data/config';\n\n// Loads in a single object from the config file\nexport default class Model {\n constructor(scene, manager, textures) {\n this.scene = scene;\n this.textures = textures;\n this.manager = manager;\n\n this.obj = null;\n this.ref = null;\n }\n\n load(type) {\n // Manager is passed in to loader to determine when loading done in main\n\n switch (type) {\n case 'gltf':\n // Load model with selected loader\n new GLTFLoader(this.manager).load(\n Config.models[Config.model.selected].path,\n (gltf) => {\n const scene = gltf.scene;\n let mesh;\n\n if (Config.shadow.enabled) {\n scene.traverse(function(node) {\n if (node.isMesh || node.isLight) node.castShadow = true;\n if (node.isMesh) {\n node.material.wireframe = Config.mesh.wireframe;\n mesh = node;\n }\n });\n }\n\n this.obj = mesh;\n\n BufferGeometryUtils.computeTangents(mesh.geometry);\n\n var group = new THREE.Group();\n group.scale.multiplyScalar(0.25);\n this.scene.add( group );\n\n this.ref = group;\n\n // To make sure that the matrixWorld is up to date for the boxhelpers\n group.updateMatrixWorld(true);\n group.add(mesh);\n\n // Add to scene\n this.scene.add(scene);\n },\n Helpers.logProgress(),\n Helpers.logError()\n );\n break;\n\n case 'object':\n // Load model with ObjectLoader\n new THREE.ObjectLoader(this.manager).load(\n Config.models[Config.model.selected].path,\n obj => {\n obj.traverse(child => {\n if(child instanceof THREE.Mesh) {\n // Create material for mesh and set its map to texture by name from preloaded textures\n const material = new Material(0xffffff).standard;\n material.map = this.textures.UV;\n child.material = material;\n\n // Set to cast and receive shadow if enabled\n if(Config.shadow.enabled) {\n child.receiveShadow = true;\n child.castShadow = true;\n }\n }\n });\n\n // Set prop to obj so it can be accessed from outside the class\n this.obj = obj;\n this.ref = obj;\n\n obj.scale.multiplyScalar(Config.models[Config.model.selected].scale);\n this.scene.add(obj);\n },\n Helpers.logProgress(),\n Helpers.logError()\n );\n break;\n }\n }\n\n unload() {\n this.scene.remove(this.ref);\n }\n}\n","const ALIAS = {\n 'left'\t\t: 37,\n 'up'\t\t : 38,\n 'right'\t\t: 39,\n 'down'\t\t: 40,\n 'space'\t\t: 32,\n 'tab'\t\t : 9,\n 'escape'\t: 27\n};\n\nexport default class Keyboard {\n constructor(domElement) {\n this.domElement = domElement || document;\n this.keyCodes = {};\n\n // bind keyEvents\n this.domElement.addEventListener('keydown', (event) => this.onKeyChange(event), false);\n this.domElement.addEventListener('keyup', (event) => this.onKeyChange(event), false);\n\n // bind window blur\n window.addEventListener('blur', () => this.onBlur, false);\n }\n\n destroy() {\n this.domElement.removeEventListener('keydown', (event) => this.onKeyChange(event), false);\n this.domElement.removeEventListener('keyup', (event) => this.onKeyChange(event), false);\n\n // unbind window blur event\n window.removeEventListener('blur', () => this.onBlur, false);\n }\n\n onBlur() {\n for(const prop in this.keyCodes)\n this.keyCodes[prop] = false;\n }\n\n onKeyChange(event) {\n // log to debug\n //console.log('onKeyChange', event, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n\n // update this.keyCodes\n const keyCode = event.keyCode;\n this.keyCodes[keyCode] = event.type === 'keydown';\n }\n\n pressed(keyDesc) {\n const keys = keyDesc.split('+');\n for(let i = 0; i < keys.length; i++) {\n const key = keys[i];\n let pressed = false;\n if(Object.keys(ALIAS).indexOf(key) != -1) {\n pressed = this.keyCodes[ALIAS[key]];\n } else {\n pressed = this.keyCodes[key.toUpperCase().charCodeAt(0)];\n }\n if(!pressed)\n return false;\n }\n\n return true;\n }\n\n eventMatches(event, keyDesc) {\n const aliases = ALIAS;\n const aliasKeys = Object.keys(aliases);\n const keys = keyDesc.split('+');\n // log to debug\n // console.log('eventMatches', event, event.keyCode, event.shiftKey, event.ctrlKey, event.altKey, event.metaKey)\n for(let i = 0; i < keys.length; i++) {\n const key = keys[i];\n let pressed = false;\n if(key === 'shift') {\n pressed = event.shiftKey ? true : false;\n } else if(key === 'ctrl') {\n pressed = event.ctrlKey ? true : false;\n } else if(key === 'alt') {\n pressed = event.altKey ? true : false;\n } else if(key === 'meta') {\n pressed = event.metaKey ? true : false;\n } else if(aliasKeys.indexOf(key) !== -1) {\n pressed = event.keyCode === aliases[key];\n } else if(event.keyCode === key.toUpperCase().charCodeAt(0)) {\n pressed = true;\n }\n if(!pressed)\n return false;\n }\n\n return true;\n }\n}\n","import Keyboard from '../../utils/keyboard';\nimport Helpers from '../../utils/helpers';\nimport Config from '../../data/config';\n\n// Manages all input interactions\nexport default class Interaction {\n constructor(renderer, scene, camera, controls) {\n // Properties\n this.renderer = renderer;\n this.scene = scene;\n this.camera = camera;\n this.controls = controls;\n\n this.timeout = null;\n\n // Instantiate keyboard helper\n this.keyboard = new Keyboard();\n\n // Listeners\n // Mouse events\n this.renderer.domElement.addEventListener('mousemove', (event) => Helpers.throttle(this.onMouseMove(event), 250), false);\n this.renderer.domElement.addEventListener('mouseleave', (event) => this.onMouseLeave(event), false);\n this.renderer.domElement.addEventListener('mouseover', (event) => this.onMouseOver(event), false);\n\n // Keyboard events\n this.keyboard.domElement.addEventListener('keydown', (event) => {\n // Only once\n if(event.repeat) {\n return;\n }\n\n if(this.keyboard.eventMatches(event, 'escape')) {\n console.log('Escape pressed');\n }\n });\n }\n\n onMouseOver(event) {\n event.preventDefault();\n\n Config.isMouseOver = true;\n }\n\n onMouseLeave(event) {\n event.preventDefault();\n\n Config.isMouseOver = false;\n }\n\n onMouseMove(event) {\n event.preventDefault();\n\n clearTimeout(this.timeout);\n\n this.timeout = setTimeout(function() {\n Config.isMouseMoving = false;\n }, 200);\n\n Config.isMouseMoving = true;\n }\n}\n","import Config from '../../data/config';\n\n// Manages all dat.GUI interactions\nexport default class DatGUI {\n constructor(main) {\n this.gui = new dat.GUI();\n\n this.camera = main.camera.threeCamera;\n this.controls = main.controls.threeControls;\n this.light = main.light;\n this.scene = main.scene;\n\n this.model = null;\n this.meshHelper = null;\n }\n\n load(main, mesh) {\n /* Global */\n //this.gui.close();\n\n this.model = main.model;\n this.meshHelper = main.meshHelper;\n\n /* Camera */\n const cameraFolder = this.gui.addFolder('Camera');\n const cameraFOVGui = cameraFolder.add(Config.camera, 'fov', 0, 180).name('Camera FOV');\n cameraFOVGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.camera.fov = value;\n });\n cameraFOVGui.onFinishChange(() => {\n this.camera.updateProjectionMatrix();\n\n this.controls.enableRotate = true;\n });\n const cameraAspectGui = cameraFolder.add(Config.camera, 'aspect', 0, 4).name('Camera Aspect');\n cameraAspectGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.camera.aspect = value;\n });\n cameraAspectGui.onFinishChange(() => {\n this.camera.updateProjectionMatrix();\n\n this.controls.enableRotate = true;\n });\n const cameraFogColorGui = cameraFolder.addColor(Config.fog, 'color').name('Fog Color');\n cameraFogColorGui.onChange((value) => {\n this.scene.fog.color.setHex(value);\n });\n const cameraFogNearGui = cameraFolder.add(Config.fog, 'near', 0.000, 0.010).name('Fog Near');\n cameraFogNearGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.scene.fog.density = value;\n });\n cameraFogNearGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n\n\n /* Controls */\n const controlsFolder = this.gui.addFolder('Controls');\n controlsFolder.add(Config.controls, 'autoRotate').name('Auto Rotate').onChange((value) => {\n this.controls.autoRotate = value;\n });\n const controlsAutoRotateSpeedGui = controlsFolder.add(Config.controls, 'autoRotateSpeed', -1, 1).name('Rotation Speed');\n controlsAutoRotateSpeedGui.onChange((value) => {\n this.controls.enableRotate = false;\n this.controls.autoRotateSpeed = value;\n });\n controlsAutoRotateSpeedGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n\n\n /* Model */\n const modelFolder = this.gui.addFolder('Model');\n modelFolder.add(Config.model, 'type', [...Config.model.initialTypes]).name('Select Model').onChange((value) => {\n if (value) {\n if (Config.mesh.enableHelper)\n this.meshHelper.disable();\n\n Config.model.selected = Config.model.initialTypes.indexOf(value);\n this.unload();\n this.model.unload();\n this.model.load(value);\n }\n });\n\n /* Mesh */\n const meshFolder = this.gui.addFolder('Mesh');\n meshFolder.add(Config.mesh, 'enableHelper', true).name('Enable Helpers').onChange((value) => {\n if(value) {\n this.meshHelper.enable();\n } else {\n this.meshHelper.disable();\n }\n });\n meshFolder.add(Config.mesh, 'translucent', true).name('Translucent').onChange((value) => {\n if(value) {\n mesh.material.transparent = true;\n mesh.material.opacity = 0.5;\n } else {\n mesh.material.opacity = 1.0;\n }\n });\n meshFolder.add(Config.mesh, 'wireframe', true).name('Wireframe').onChange((value) => {\n mesh.material.wireframe = value;\n });\n\n\n /* Lights */\n // Ambient Light\n const ambientLightFolder = this.gui.addFolder('Ambient Light');\n ambientLightFolder.add(Config.ambientLight, 'enabled').name('Enabled').onChange((value) => {\n this.light.ambientLight.visible = value;\n });\n ambientLightFolder.addColor(Config.ambientLight, 'color').name('Color').onChange((value) => {\n this.light.ambientLight.color.setHex(value);\n });\n\n\n // Directional Light\n const directionalLightFolder = this.gui.addFolder('Directional Light');\n directionalLightFolder.add(Config.directionalLight, 'enabled').name('Enabled').onChange((value) => {\n this.light.directionalLight.visible = value;\n });\n directionalLightFolder.addColor(Config.directionalLight, 'color').name('Color').onChange((value) => {\n this.light.directionalLight.color.setHex(value);\n });\n const directionalLightIntensityGui = directionalLightFolder.add(Config.directionalLight, 'intensity', 0, 2).name('Intensity');\n directionalLightIntensityGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.intensity = value;\n });\n directionalLightIntensityGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const directionalLightPositionXGui = directionalLightFolder.add(Config.directionalLight, 'x', -1000, 1000).name('Position X');\n directionalLightPositionXGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.position.x = value;\n });\n directionalLightPositionXGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const directionalLightPositionYGui = directionalLightFolder.add(Config.directionalLight, 'y', -1000, 1000).name('Position Y');\n directionalLightPositionYGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.position.y = value;\n });\n directionalLightPositionYGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const directionalLightPositionZGui = directionalLightFolder.add(Config.directionalLight, 'z', -1000, 1000).name('Position Z');\n directionalLightPositionZGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.position.z = value;\n });\n directionalLightPositionZGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n\n // Shadow Map\n const shadowFolder = this.gui.addFolder('Shadow Map');\n shadowFolder.add(Config.shadow, 'enabled').name('Enabled').onChange((value) => {\n this.light.directionalLight.castShadow = value;\n });\n shadowFolder.add(Config.shadow, 'helperEnabled').name('Helper Enabled').onChange((value) => {\n this.light.directionalLightHelper.visible = value;\n });\n const shadowNearGui = shadowFolder.add(Config.shadow, 'near', 0, 400).name('Near');\n shadowNearGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.shadow.camera.near = value;\n });\n shadowNearGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n this.light.directionalLight.shadow.map.dispose();\n this.light.directionalLight.shadow.map = null;\n this.light.directionalLightHelper.update();\n });\n const shadowFarGui = shadowFolder.add(Config.shadow, 'far', 0, 1200).name('Far');\n shadowFarGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.shadow.camera.far = value;\n });\n shadowFarGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n this.light.directionalLight.shadow.map.dispose();\n this.light.directionalLight.shadow.map = null;\n this.light.directionalLightHelper.update();\n });\n const shadowTopGui = shadowFolder.add(Config.shadow, 'top', -400, 400).name('Top');\n shadowTopGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.shadow.camera.top = value;\n });\n shadowTopGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n this.light.directionalLight.shadow.map.dispose();\n this.light.directionalLight.shadow.map = null;\n this.light.directionalLightHelper.update();\n });\n const shadowRightGui = shadowFolder.add(Config.shadow, 'right', -400, 400).name('Right');\n shadowRightGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.shadow.camera.right = value;\n });\n shadowRightGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n this.light.directionalLight.shadow.map.dispose();\n this.light.directionalLight.shadow.map = null;\n this.light.directionalLightHelper.update();\n });\n const shadowBottomGui = shadowFolder.add(Config.shadow, 'bottom', -400, 400).name('Bottom');\n shadowBottomGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.shadow.camera.bottom = value;\n });\n shadowBottomGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n this.light.directionalLight.shadow.map.dispose();\n this.light.directionalLight.shadow.map = null;\n this.light.directionalLightHelper.update();\n });\n const shadowLeftGui = shadowFolder.add(Config.shadow, 'left', -400, 400).name('Left');\n shadowLeftGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.shadow.camera.left = value;\n });\n shadowLeftGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n this.light.directionalLight.shadow.map.dispose();\n this.light.directionalLight.shadow.map = null;\n this.light.directionalLightHelper.update();\n });\n const shadowBiasGui = shadowFolder.add(Config.shadow, 'bias', -0.000010, 1).name('Bias');\n shadowBiasGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.directionalLight.shadow.bias = value;\n });\n shadowBiasGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n this.light.directionalLight.shadow.map.dispose();\n this.light.directionalLight.shadow.map = null;\n this.light.directionalLightHelper.update();\n });\n\n\n // Point Light\n const pointLightFolder = this.gui.addFolder('Point Light');\n pointLightFolder.add(Config.pointLight, 'enabled').name('Enabled').onChange((value) => {\n this.light.pointLight.visible = value;\n });\n pointLightFolder.addColor(Config.pointLight, 'color').name('Color').onChange((value) => {\n this.light.pointLight.color.setHex(value);\n });\n const pointLightIntensityGui = pointLightFolder.add(Config.pointLight, 'intensity', 0, 2).name('Intensity');\n pointLightIntensityGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.pointLight.intensity = value;\n });\n pointLightIntensityGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const pointLightDistanceGui = pointLightFolder.add(Config.pointLight, 'distance', 0, 1000).name('Distance');\n pointLightDistanceGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.pointLight.distance = value;\n });\n pointLightDistanceGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const pointLightPositionXGui = pointLightFolder.add(Config.pointLight, 'x', -1000, 1000).name('Position X');\n pointLightPositionXGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.pointLight.position.x = value;\n });\n pointLightPositionXGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const pointLightPositionYGui = pointLightFolder.add(Config.pointLight, 'y', -1000, 1000).name('Position Y');\n pointLightPositionYGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.pointLight.position.y = value;\n });\n pointLightPositionYGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const pointLightPositionZGui = pointLightFolder.add(Config.pointLight, 'z', -1000, 1000).name('Position Z');\n pointLightPositionZGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.pointLight.position.z = value;\n });\n pointLightPositionZGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n\n\n // Hemi Light\n const hemiLightFolder = this.gui.addFolder('Hemi Light');\n hemiLightFolder.add(Config.hemiLight, 'enabled').name('Enabled').onChange((value) => {\n this.light.hemiLight.visible = value;\n });\n hemiLightFolder.addColor(Config.hemiLight, 'color').name('Color').onChange((value) => {\n this.light.hemiLight.color.setHex(value);\n });\n hemiLightFolder.addColor(Config.hemiLight, 'groundColor').name('ground Color').onChange((value) => {\n this.light.hemiLight.groundColor.setHex(value);\n });\n const hemiLightIntensityGui = hemiLightFolder.add(Config.hemiLight, 'intensity', 0, 2).name('Intensity');\n hemiLightIntensityGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.hemiLight.intensity = value;\n });\n hemiLightIntensityGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const hemiLightPositionXGui = hemiLightFolder.add(Config.hemiLight, 'x', -1000, 1000).name('Position X');\n hemiLightPositionXGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.hemiLight.position.x = value;\n });\n hemiLightPositionXGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const hemiLightPositionYGui = hemiLightFolder.add(Config.hemiLight, 'y', -500, 1000).name('Position Y');\n hemiLightPositionYGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.hemiLight.position.y = value;\n });\n hemiLightPositionYGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n const hemiLightPositionZGui = hemiLightFolder.add(Config.hemiLight, 'z', -1000, 1000).name('Position Z');\n hemiLightPositionZGui.onChange((value) => {\n this.controls.enableRotate = false;\n\n this.light.hemiLight.position.z = value;\n });\n hemiLightPositionZGui.onFinishChange(() => {\n this.controls.enableRotate = true;\n });\n }\n\n unload() {\n this.gui.destroy();\n this.gui = new dat.GUI();\n }\n}\n","// Global imports -\nimport * as THREE from 'three';\nimport TWEEN from '@tweenjs/tween.js';\n\n// Local imports -\n// Components\nimport Renderer from './components/renderer';\nimport Camera from './components/camera';\nimport Light from './components/light';\nimport Controls from './components/controls';\nimport Geometry from './components/geometry';\n\n// Helpers\nimport Stats from './helpers/stats';\nimport MeshHelper from './helpers/meshHelper';\n\n// Model\nimport Texture from './model/texture';\nimport Model from './model/model';\n\n// Managers\nimport Interaction from './managers/interaction';\nimport DatGUI from './managers/datGUI';\n\n// data\nimport Config from './../data/config';\n// -- End of imports\n\n// This class instantiates and ties all of the components together, starts the loading process and renders the main loop\nexport default class Main {\n constructor(container) {\n // Set container property to container element\n this.container = container;\n\n // Start Three clock\n this.clock = new THREE.Clock();\n\n // Main scene creation\n this.scene = new THREE.Scene();\n this.scene.fog = new THREE.FogExp2(Config.fog.color, Config.fog.near);\n\n // Get Device Pixel Ratio first for retina\n if(window.devicePixelRatio) {\n Config.dpr = window.devicePixelRatio;\n }\n\n // Main renderer constructor\n this.renderer = new Renderer(this.scene, container);\n\n // Components instantiations\n this.camera = new Camera(this.renderer.threeRenderer);\n this.controls = new Controls(this.camera.threeCamera, container);\n this.light = new Light(this.scene);\n\n // Create and place lights in scene\n const lights = ['ambient', 'directional', 'point', 'hemi'];\n lights.forEach((light) => this.light.place(light));\n\n // Create and place geo in scene\n this.geometry = new Geometry(this.scene);\n this.geometry.make('plane')(150, 150, 10, 10);\n this.geometry.place([0, -20, 0], [Math.PI / 2, 0, 0]);\n\n // Set up rStats if dev environment\n if(Config.isDev && Config.isShowingStats) {\n this.stats = new Stats(this.renderer);\n this.stats.setUp();\n }\n\n // Set up gui\n if (Config.isDev) {\n this.gui = new DatGUI(this)\n }\n\n // Instantiate texture class\n this.texture = new Texture();\n\n // Start loading the textures and then go on to load the model after the texture Promises have resolved\n this.texture.load().then(() => {\n this.manager = new THREE.LoadingManager();\n\n // Textures loaded, load model\n this.model = new Model(this.scene, this.manager, this.texture.textures);\n this.model.load(Config.models[Config.model.selected].type);\n\n // onProgress callback\n this.manager.onProgress = (item, loaded, total) => {\n console.log(`${item}: ${loaded} ${total}`);\n };\n\n // All loaders done now\n this.manager.onLoad = () => {\n // Set up interaction manager with the app now that the model is finished loading\n new Interaction(this.renderer.threeRenderer, this.scene, this.camera.threeCamera, this.controls.threeControls);\n\n // Add dat.GUI controls if dev\n if(Config.isDev) {\n this.meshHelper = new MeshHelper(this.scene, this.model.obj);\n if (Config.mesh.enableHelper) this.meshHelper.enable();\n\n this.gui.load(this, this.model.obj);\n }\n\n // Everything is now fully loaded\n Config.isLoaded = true;\n this.container.querySelector('#loading').style.display = 'none';\n };\n });\n\n // Start render which does not wait for model fully loaded\n this.render();\n }\n\n render() {\n // Render rStats if Dev\n if(Config.isDev && Config.isShowingStats) {\n Stats.start();\n }\n\n // Call render function and pass in created scene and camera\n this.renderer.render(this.scene, this.camera.threeCamera);\n\n // rStats has finished determining render call now\n if(Config.isDev && Config.isShowingStats) {\n Stats.end();\n }\n\n // Delta time is sometimes needed for certain updates\n //const delta = this.clock.getDelta();\n\n // Call any vendor or module frame updates here\n TWEEN.update();\n this.controls.threeControls.update();\n\n // RAF\n requestAnimationFrame(this.render.bind(this)); // Bind the main class instead of window object\n }\n}\n","import Config from './data/config';\nimport Detector from './utils/detector';\nimport Main from './app/main';\n\n// Styles\nimport './../css/app.scss';\n\n// Check environment and set the Config helper\nif(__ENV__ === 'dev') {\n console.log('----- RUNNING IN DEV ENVIRONMENT! -----');\n\n Config.isDev = true;\n}\n\nfunction init() {\n // Check for webGL capabilities\n if(!Detector.webgl) {\n Detector.addGetWebGLMessage();\n } else {\n const container = document.getElementById('appContainer');\n new Main(container);\n }\n}\n\ninit();\n"],"sourceRoot":""}