Browse Source

Merge remote-tracking branch 'upstream/dev' into dev51

Mugen87 5 years ago
parent
commit
941beb6bae
38 changed files with 423 additions and 390 deletions
  1. 2 1
      build/three.js
  2. 3 3
      build/three.min.js
  3. 2 1
      build/three.module.js
  4. 46 0
      docs/api/en/lights/HemisphereLightProbe.html
  5. 46 0
      docs/api/zh/lights/HemisphereLightProbe.html
  6. 2 0
      docs/list.js
  7. 14 22
      editor/css/main.css
  8. 0 1
      editor/index.html
  9. 2 0
      editor/js/EditorControls.js
  10. 0 5
      editor/js/Menubar.File.js
  11. 1 1
      editor/js/Sidebar.Object.js
  12. 16 3
      editor/js/Sidebar.Scene.js
  13. 3 0
      editor/js/Viewport.js
  14. 0 2
      editor/js/libs/app/index.html
  15. 0 1
      editor/sw.js
  16. 6 6
      examples/js/controls/OrbitControls.js
  17. 8 8
      examples/js/controls/PointerLockControls.js
  18. 115 115
      examples/js/controls/TrackballControls.js
  19. 6 6
      examples/js/controls/TransformControls.js
  20. 0 48
      examples/js/vr/HelioWebXRPolyfill.js
  21. 6 6
      examples/jsm/controls/OrbitControls.js
  22. 8 8
      examples/jsm/controls/PointerLockControls.js
  23. 115 115
      examples/jsm/controls/TrackballControls.js
  24. 6 6
      examples/jsm/controls/TransformControls.js
  25. 14 7
      examples/webgl_animation_cloth.html
  26. 0 2
      examples/webxr_vr_ballshooter.html
  27. 0 2
      examples/webxr_vr_cubes.html
  28. 0 2
      examples/webxr_vr_dragging.html
  29. 0 3
      examples/webxr_vr_lorenzattractor.html
  30. 0 2
      examples/webxr_vr_paint.html
  31. 0 2
      examples/webxr_vr_panorama.html
  32. 0 2
      examples/webxr_vr_panorama_depth.html
  33. 0 3
      examples/webxr_vr_rollercoaster.html
  34. 0 3
      examples/webxr_vr_sandbox.html
  35. 0 2
      examples/webxr_vr_sculpt.html
  36. 0 2
      examples/webxr_vr_video.html
  37. 1 0
      src/renderers/WebGLRenderer.js
  38. 1 0
      src/renderers/shaders/ShaderLib/shadow_vert.glsl.js

+ 2 - 1
build/three.js

@@ -15136,7 +15136,7 @@
 
 
 	var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
 	var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
 
 
-	var shadow_vert = "#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
+	var shadow_vert = "#include <common>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
 
 
 	var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
 	var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
 
 
@@ -26001,6 +26001,7 @@
 					material.isMeshBasicMaterial ||
 					material.isMeshBasicMaterial ||
 					material.isMeshStandardMaterial ||
 					material.isMeshStandardMaterial ||
 					material.isShaderMaterial ||
 					material.isShaderMaterial ||
+					material.isShadowMaterial ||
 					material.skinning ) {
 					material.skinning ) {
 
 
 					p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
 					p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );

+ 3 - 3
build/three.min.js

@@ -195,8 +195,8 @@ e.state.directionalShadow,c.spotLights.value=e.state.spot,c.spotLightShadows.val
 c.pointShadowMatrix.value=e.state.pointShadowMatrix);a=d.program.getUniforms();a=Fb.seqWithValue(a.seq,c);d.uniformsList=a}function t(a,b,c,d){!0!==b.isScene&&(b=oa);Q.resetTextureUnits();var e=b.fog,f=c.isMeshStandardMaterial?b.environment:null,g=null===G?B.outputEncoding:G.texture.encoding,h=P.get(c),l=aa.state.lights;!0!==Le||!0!==ng&&a===W||Va.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,h,a===W&&c.id===N);c.version===h.__version?void 0===h.program?v(c,b,d):c.fog&&h.fog!==e?v(c,
 c.pointShadowMatrix.value=e.state.pointShadowMatrix);a=d.program.getUniforms();a=Fb.seqWithValue(a.seq,c);d.uniformsList=a}function t(a,b,c,d){!0!==b.isScene&&(b=oa);Q.resetTextureUnits();var e=b.fog,f=c.isMeshStandardMaterial?b.environment:null,g=null===G?B.outputEncoding:G.texture.encoding,h=P.get(c),l=aa.state.lights;!0!==Le||!0!==ng&&a===W||Va.setState(c.clippingPlanes,c.clipIntersection,c.clipShadows,a,h,a===W&&c.id===N);c.version===h.__version?void 0===h.program?v(c,b,d):c.fog&&h.fog!==e?v(c,
 b,d):h.environment!==f?v(c,b,d):h.needsLights&&h.lightsStateVersion!==l.state.version?v(c,b,d):void 0===h.numClippingPlanes||h.numClippingPlanes===Va.numPlanes&&h.numIntersection===Va.numIntersection?h.outputEncoding!==g&&v(c,b,d):v(c,b,d):(v(c,b,d),h.__version=c.version);var n=!1,q=!1,k=!1;b=h.program;g=b.getUniforms();l=h.uniforms;V.useProgram(b.program)&&(k=q=n=!0);c.id!==N&&(N=c.id,q=!0);if(n||W!==a){g.setValue(I,"projectionMatrix",a.projectionMatrix);Ga.logarithmicDepthBuffer&&g.setValue(I,"logDepthBufFC",
 b,d):h.environment!==f?v(c,b,d):h.needsLights&&h.lightsStateVersion!==l.state.version?v(c,b,d):void 0===h.numClippingPlanes||h.numClippingPlanes===Va.numPlanes&&h.numIntersection===Va.numIntersection?h.outputEncoding!==g&&v(c,b,d):v(c,b,d):(v(c,b,d),h.__version=c.version);var n=!1,q=!1,k=!1;b=h.program;g=b.getUniforms();l=h.uniforms;V.useProgram(b.program)&&(k=q=n=!0);c.id!==N&&(N=c.id,q=!0);if(n||W!==a){g.setValue(I,"projectionMatrix",a.projectionMatrix);Ga.logarithmicDepthBuffer&&g.setValue(I,"logDepthBufFC",
 2/(Math.log(a.far+1)/Math.LN2));W!==a&&(W=a,k=q=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshStandardMaterial||c.envMap)n=g.map.cameraPosition,void 0!==n&&n.setValue(I,Ib.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial)&&g.setValue(I,"isOrthographic",!0===a.isOrthographicCamera);(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||
 2/(Math.log(a.far+1)/Math.LN2));W!==a&&(W=a,k=q=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshStandardMaterial||c.envMap)n=g.map.cameraPosition,void 0!==n&&n.setValue(I,Ib.setFromMatrixPosition(a.matrixWorld));(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial)&&g.setValue(I,"isOrthographic",!0===a.isOrthographicCamera);(c.isMeshPhongMaterial||c.isMeshToonMaterial||c.isMeshLambertMaterial||
-c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&g.setValue(I,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&(g.setOptional(I,d,"bindMatrix"),g.setOptional(I,d,"bindMatrixInverse"),a=d.skeleton))if(n=a.bones,Ga.floatVertexTextures){if(void 0===a.boneTexture){n=Math.sqrt(4*n.length);n=K.ceilPowerOfTwo(n);n=Math.max(n,4);var p=new Float32Array(n*n*4);p.set(a.boneMatrices);var r=new $b(p,n,n,1023,1015);a.boneMatrices=p;a.boneTexture=r;a.boneTextureSize=n}g.setValue(I,
-"boneTexture",a.boneTexture,Q);g.setValue(I,"boneTextureSize",a.boneTextureSize)}else g.setOptional(I,a,"boneMatrices");if(q||h.receiveShadow!==d.receiveShadow)h.receiveShadow=d.receiveShadow,g.setValue(I,"receiveShadow",d.receiveShadow);q&&(g.setValue(I,"toneMappingExposure",B.toneMappingExposure),h.needsLights&&(q=k,l.ambientLightColor.needsUpdate=q,l.lightProbe.needsUpdate=q,l.directionalLights.needsUpdate=q,l.directionalLightShadows.needsUpdate=q,l.pointLights.needsUpdate=q,l.pointLightShadows.needsUpdate=
+c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.isShadowMaterial||c.skinning)&&g.setValue(I,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&(g.setOptional(I,d,"bindMatrix"),g.setOptional(I,d,"bindMatrixInverse"),a=d.skeleton))if(n=a.bones,Ga.floatVertexTextures){if(void 0===a.boneTexture){n=Math.sqrt(4*n.length);n=K.ceilPowerOfTwo(n);n=Math.max(n,4);var p=new Float32Array(n*n*4);p.set(a.boneMatrices);var r=new $b(p,n,n,1023,1015);a.boneMatrices=p;a.boneTexture=r;a.boneTextureSize=
+n}g.setValue(I,"boneTexture",a.boneTexture,Q);g.setValue(I,"boneTextureSize",a.boneTextureSize)}else g.setOptional(I,a,"boneMatrices");if(q||h.receiveShadow!==d.receiveShadow)h.receiveShadow=d.receiveShadow,g.setValue(I,"receiveShadow",d.receiveShadow);q&&(g.setValue(I,"toneMappingExposure",B.toneMappingExposure),h.needsLights&&(q=k,l.ambientLightColor.needsUpdate=q,l.lightProbe.needsUpdate=q,l.directionalLights.needsUpdate=q,l.directionalLightShadows.needsUpdate=q,l.pointLights.needsUpdate=q,l.pointLightShadows.needsUpdate=
 q,l.spotLights.needsUpdate=q,l.spotLightShadows.needsUpdate=q,l.rectAreaLights.needsUpdate=q,l.hemisphereLights.needsUpdate=q),e&&c.fog&&ya.refreshFogUniforms(l,e),ya.refreshMaterialUniforms(l,c,f,da,ea),void 0!==l.ltc_1&&(l.ltc_1.value=y.LTC_1),void 0!==l.ltc_2&&(l.ltc_2.value=y.LTC_2),Fb.upload(I,h.uniformsList,l,Q));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&&(Fb.upload(I,h.uniformsList,l,Q),c.uniformsNeedUpdate=!1);c.isSpriteMaterial&&g.setValue(I,"center",d.center);g.setValue(I,"modelViewMatrix",
 q,l.spotLights.needsUpdate=q,l.spotLightShadows.needsUpdate=q,l.rectAreaLights.needsUpdate=q,l.hemisphereLights.needsUpdate=q),e&&c.fog&&ya.refreshFogUniforms(l,e),ya.refreshMaterialUniforms(l,c,f,da,ea),void 0!==l.ltc_1&&(l.ltc_1.value=y.LTC_1),void 0!==l.ltc_2&&(l.ltc_2.value=y.LTC_2),Fb.upload(I,h.uniformsList,l,Q));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&&(Fb.upload(I,h.uniformsList,l,Q),c.uniformsNeedUpdate=!1);c.isSpriteMaterial&&g.setValue(I,"center",d.center);g.setValue(I,"modelViewMatrix",
 d.modelViewMatrix);g.setValue(I,"normalMatrix",d.normalMatrix);g.setValue(I,"modelMatrix",d.matrixWorld);return b}a=a||{};var r=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),u=void 0!==a.context?a.context:null,A=void 0!==a.alpha?a.alpha:!1,E=void 0!==a.depth?a.depth:!0,x=void 0!==a.stencil?a.stencil:!0,Ea=void 0!==a.antialias?a.antialias:!1,ka=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,U=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:
 d.modelViewMatrix);g.setValue(I,"normalMatrix",d.normalMatrix);g.setValue(I,"modelMatrix",d.matrixWorld);return b}a=a||{};var r=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),u=void 0!==a.context?a.context:null,A=void 0!==a.alpha?a.alpha:!1,E=void 0!==a.depth?a.depth:!0,x=void 0!==a.stencil?a.stencil:!0,Ea=void 0!==a.antialias?a.antialias:!1,ka=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,U=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:
 !1,C=void 0!==a.powerPreference?a.powerPreference:"default",z=void 0!==a.failIfMajorPerformanceCaveat?a.failIfMajorPerformanceCaveat:!1,O=null,aa=null;this.domElement=r;this.debug={checkShaderErrors:!0};this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.outputEncoding=3E3;this.physicallyCorrectLights=!1;this.toneMapping=0;this.toneMappingExposure=1;this.maxMorphTargets=8;this.maxMorphNormals=
 !1,C=void 0!==a.powerPreference?a.powerPreference:"default",z=void 0!==a.failIfMajorPerformanceCaveat?a.failIfMajorPerformanceCaveat:!1,O=null,aa=null;this.domElement=r;this.debug={checkShaderErrors:!0};this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.outputEncoding=3E3;this.physicallyCorrectLights=!1;this.toneMapping=0;this.toneMappingExposure=1;this.maxMorphTargets=8;this.maxMorphNormals=
@@ -667,7 +667,7 @@ normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED )
 normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",
 normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",
 points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
 points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",
 points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",
 points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",
-shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
+shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",shadow_vert:"#include <common>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",
 sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
 sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",
 sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},
 sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}"},
 gb={basic:{uniforms:va([y.common,y.specularmap,y.envmap,y.aomap,y.lightmap,y.fog]),vertexShader:N.meshbasic_vert,fragmentShader:N.meshbasic_frag},lambert:{uniforms:va([y.common,y.specularmap,y.envmap,y.aomap,y.lightmap,y.emissivemap,y.fog,y.lights,{emissive:{value:new D(0)}}]),vertexShader:N.meshlambert_vert,fragmentShader:N.meshlambert_frag},phong:{uniforms:va([y.common,y.specularmap,y.envmap,y.aomap,y.lightmap,y.emissivemap,y.bumpmap,y.normalmap,y.displacementmap,y.fog,y.lights,{emissive:{value:new D(0)},
 gb={basic:{uniforms:va([y.common,y.specularmap,y.envmap,y.aomap,y.lightmap,y.fog]),vertexShader:N.meshbasic_vert,fragmentShader:N.meshbasic_frag},lambert:{uniforms:va([y.common,y.specularmap,y.envmap,y.aomap,y.lightmap,y.emissivemap,y.fog,y.lights,{emissive:{value:new D(0)}}]),vertexShader:N.meshlambert_vert,fragmentShader:N.meshlambert_frag},phong:{uniforms:va([y.common,y.specularmap,y.envmap,y.aomap,y.lightmap,y.emissivemap,y.bumpmap,y.normalmap,y.displacementmap,y.fog,y.lights,{emissive:{value:new D(0)},

+ 2 - 1
build/three.module.js

@@ -15100,7 +15100,7 @@ var points_vert = "uniform float size;\nuniform float scale;\n#include <common>\
 
 
 var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
 var shadow_frag = "uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
 
 
-var shadow_vert = "#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
+var shadow_vert = "#include <common>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}";
 
 
 var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
 var sprite_frag = "uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}";
 
 
@@ -25971,6 +25971,7 @@ function WebGLRenderer( parameters ) {
 				material.isMeshBasicMaterial ||
 				material.isMeshBasicMaterial ||
 				material.isMeshStandardMaterial ||
 				material.isMeshStandardMaterial ||
 				material.isShaderMaterial ||
 				material.isShaderMaterial ||
+				material.isShadowMaterial ||
 				material.skinning ) {
 				material.skinning ) {
 
 
 				p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
 				p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );

+ 46 - 0
docs/api/en/lights/HemisphereLightProbe.html

@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8" />
+		<base href="../../../" />
+		<script src="list.js"></script>
+		<script src="page.js"></script>
+		<link type="text/css" rel="stylesheet" href="page.css" />
+	</head>
+	<body>
+		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
+
+		<h1>[name]</h1>
+
+		<p class="desc">
+			Light probes are an alternative way of adding light to a 3D scene. HemisphereLightProbe is the light estimation data 
+			of a single hemisphere light in the scene. For more information about light probes, go to [page:LightProbe].
+		</p>
+
+		<h2>Constructor</h2>
+
+		<h3>[name]( [param:Color skyColor], [param:Color groundColor], [param:Float intensity] )</h3>
+		<p>
+			[page:Color skyColor] - (optional) An instance of Color, string representing a color or a number representing a color.<br />
+			[page:Color groundColor] - (optional) An instance of Color, string representing a color or a number representing a color.<br />
+			[page:Float intensity] - (optional) Numeric value of the light probe's intensity. Default is 1.<br /><br />
+
+			Creates a new [name].
+		</p>
+
+		<h2>Properties</h2>
+		<p>
+				See the base [page:LightProbe LightProbe] class for common properties.
+		</p>
+
+		<h2>Methods</h2>
+		<p>
+				See the base [page:LightProbe LightProbe] class for common methods.
+		</p>
+		<h2>Source</h2>
+
+		<p>
+			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
+		</p>
+	</body>
+</html>

+ 46 - 0
docs/api/zh/lights/HemisphereLightProbe.html

@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html lang="zh">
+	<head>
+		<meta charset="utf-8" />
+		<base href="../../../" />
+		<script src="list.js"></script>
+		<script src="page.js"></script>
+		<link type="text/css" rel="stylesheet" href="page.css" />
+	</head>
+	<body>
+		[page:Object3D] &rarr; [page:Light] &rarr; [page:LightProbe]
+
+		<h1>[name]</h1>
+
+		<p class="desc">
+			Light probes are an alternative way of adding light to a 3D scene. HemisphereLightProbe is the light estimation data 
+			of a single hemisphere light in the scene. For more information about light probes, go to [page:LightProbe].
+		</p>
+
+		<h2>Constructor</h2>
+
+		<h3>[name]( [param:Color skyColor], [param:Color groundColor], [param:Float intensity] )</h3>
+		<p>
+			[page:Color skyColor] - (optional) An instance of Color, string representing a color or a number representing a color.<br />
+			[page:Color groundColor] - (optional) An instance of Color, string representing a color or a number representing a color.<br />
+			[page:Float intensity] - (optional) Numeric value of the light probe's intensity. Default is 1.<br /><br />
+
+			Creates a new [name].
+		</p>
+
+		<h2>Properties</h2>
+		<p>
+				See the base [page:LightProbe LightProbe] class for common properties.
+		</p>
+
+		<h2>Methods</h2>
+		<p>
+				See the base [page:LightProbe LightProbe] class for common methods.
+		</p>
+		<h2>Source</h2>
+
+		<p>
+			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
+		</p>
+	</body>
+</html>

+ 2 - 0
docs/list.js

@@ -204,6 +204,7 @@ var list = {
 				"AmbientLightProbe": "api/en/lights/AmbientLightProbe",
 				"AmbientLightProbe": "api/en/lights/AmbientLightProbe",
 				"DirectionalLight": "api/en/lights/DirectionalLight",
 				"DirectionalLight": "api/en/lights/DirectionalLight",
 				"HemisphereLight": "api/en/lights/HemisphereLight",
 				"HemisphereLight": "api/en/lights/HemisphereLight",
+				"HemisphereLightProbe": "api/en/lights/HemisphereLightProbe",
 				"Light": "api/en/lights/Light",
 				"Light": "api/en/lights/Light",
 				"LightProbe": "api/en/lights/LightProbe",
 				"LightProbe": "api/en/lights/LightProbe",
 				"PointLight": "api/en/lights/PointLight",
 				"PointLight": "api/en/lights/PointLight",
@@ -664,6 +665,7 @@ var list = {
 				"AmbientLightProbe": "api/zh/lights/AmbientLightProbe",
 				"AmbientLightProbe": "api/zh/lights/AmbientLightProbe",
 				"DirectionalLight": "api/zh/lights/DirectionalLight",
 				"DirectionalLight": "api/zh/lights/DirectionalLight",
 				"HemisphereLight": "api/zh/lights/HemisphereLight",
 				"HemisphereLight": "api/zh/lights/HemisphereLight",
+				"HemisphereLightProbe": "api/zh/lights/HemisphereLightProbe",
 				"Light": "api/zh/lights/Light",
 				"Light": "api/zh/lights/Light",
 				"LightProbe": "api/zh/lights/LightProbe",
 				"LightProbe": "api/zh/lights/LightProbe",
 				"PointLight": "api/zh/lights/PointLight",
 				"PointLight": "api/zh/lights/PointLight",

+ 14 - 22
editor/css/main.css

@@ -188,10 +188,22 @@ textarea, input { outline: none; } /* osx */
 	content: '●';
 	content: '●';
 }
 }
 
 
+/* */
+
 #outliner .Scene {
 #outliner .Scene {
-	color: #ccccff;
+	color: #8888dd;
+}
+
+#outliner .Camera {
+	color: #dd8888;
+}
+
+#outliner .Light {
+	color: #dddd88;
 }
 }
 
 
+/* */
+
 #outliner .Object3D {
 #outliner .Object3D {
 	color: #aaaaee;
 	color: #aaaaee;
 }
 }
@@ -214,32 +226,12 @@ textarea, input { outline: none; } /* osx */
 
 
 /* */
 /* */
 
 
-#outliner .PointLight {
-	color: #dddd00;
-}
-
-/* */
-
 #outliner .Geometry {
 #outliner .Geometry {
-	color: #88ff88;
-}
-
-#outliner .BoxGeometry {
-	color: #bbeebb;
-}
-
-#outliner .TorusGeometry {
 	color: #aaeeaa;
 	color: #aaeeaa;
 }
 }
 
 
-/* */
-
 #outliner .Material {
 #outliner .Material {
-	color: #ff8888;
-}
-
-#outliner .MeshPhongMaterial {
-	color: #ffaa88;
+	color: #eeaaee;
 }
 }
 
 
 /* */
 /* */

+ 0 - 1
editor/index.html

@@ -42,7 +42,6 @@
 		<script src="js/libs/ternjs/doc_comment.js"></script>
 		<script src="js/libs/ternjs/doc_comment.js"></script>
 		<script src="js/libs/tern-threejs/threejs.js"></script>
 		<script src="js/libs/tern-threejs/threejs.js"></script>
 		<script src="js/libs/signals.min.js"></script>
 		<script src="js/libs/signals.min.js"></script>
-		<script src="../examples/js/vr/HelioWebXRPolyfill.js"></script>
 
 
 		<script type="module">
 		<script type="module">
 
 

+ 2 - 0
editor/js/EditorControls.js

@@ -188,6 +188,8 @@ function EditorControls( object, domElement ) {
 
 
 	function onMouseWheel( event ) {
 	function onMouseWheel( event ) {
 
 
+		if ( scope.enabled === false ) return;
+
 		event.preventDefault();
 		event.preventDefault();
 
 
 		// Normalize deltaY due to https://bugzilla.mozilla.org/show_bug.cgi?id=1392460
 		// Normalize deltaY due to https://bugzilla.mozilla.org/show_bug.cgi?id=1392460

+ 0 - 5
editor/js/Menubar.File.js

@@ -446,11 +446,6 @@ function MenubarFile( editor ) {
 			zip.file( 'js/VRButton.js', content );
 			zip.file( 'js/VRButton.js', content );
 
 
 		} );
 		} );
-		loader.load( '../examples/js/vr/HelioWebXRPolyfill.js', function ( content ) {
-
-			zip.file( 'js/HelioWebXRPolyfill.js', content );
-
-		} );
 
 
 	} );
 	} );
 	options.add( option );
 	options.add( option );

+ 1 - 1
editor/js/Sidebar.Object.js

@@ -308,7 +308,7 @@ function SidebarObject( editor ) {
 
 
 	objectShadowBiasRow.add( new UIText( strings.getKey( 'sidebar/object/shadowBias' ) ).setWidth( '90px' ) );
 	objectShadowBiasRow.add( new UIText( strings.getKey( 'sidebar/object/shadowBias' ) ).setWidth( '90px' ) );
 
 
-	var objectShadowBias = new UINumber( 0 ).setPrecision( 6 ).setStep( 0.001 ).setNudge( 0.000001 ).onChange( update );
+	var objectShadowBias = new UINumber( 0 ).setPrecision( 5 ).setStep( 0.0001 ).setNudge( 0.00001 ).onChange( update );
 	objectShadowBiasRow.add( objectShadowBias );
 	objectShadowBiasRow.add( objectShadowBias );
 
 
 	container.add( objectShadowBiasRow );
 	container.add( objectShadowBiasRow );

+ 16 - 3
editor/js/Sidebar.Scene.js

@@ -86,17 +86,30 @@ function SidebarScene( editor ) {
 
 
 	}
 	}
 
 
+	function getObjectType( object ) {
+
+		if ( object.isScene ) return 'Scene';
+		if ( object.isCamera ) return 'Camera';
+		if ( object.isLight ) return 'Light';
+		if ( object.isMesh ) return 'Mesh';
+		if ( object.isLine ) return 'Line';
+		if ( object.isPoints ) return 'Points';
+
+		return 'Object3D';
+
+	}
+
 	function buildHTML( object ) {
 	function buildHTML( object ) {
 
 
-		var html = `<span class="type ${ object.type }"></span> ${ escapeHTML( object.name ) }`;
+		var html = `<span class="type ${ getObjectType( object ) }"></span> ${ escapeHTML( object.name ) }`;
 
 
 		if ( object.isMesh ) {
 		if ( object.isMesh ) {
 
 
 			var geometry = object.geometry;
 			var geometry = object.geometry;
 			var material = object.material;
 			var material = object.material;
 
 
-			html += ` <span class="type ${ geometry.type }"></span> ${ escapeHTML( geometry.name ) }`;
-			html += ` <span class="type ${ material.type }"></span> ${ escapeHTML( getMaterialName( material ) ) }`;
+			html += ` <span class="type Geometry"></span> ${ escapeHTML( geometry.name ) }`;
+			html += ` <span class="type Material"></span> ${ escapeHTML( getMaterialName( material ) ) }`;
 
 
 		}
 		}
 
 

+ 3 - 0
editor/js/Viewport.js

@@ -617,6 +617,9 @@ function Viewport( editor ) {
 
 
 		}
 		}
 
 
+		// Disable EditorControls when setting a user camera
+		controls.enabled = viewportCamera === editor.camera;
+
 		camera = viewportCamera;
 		camera = viewportCamera;
 
 
 		render();
 		render();

+ 0 - 2
editor/js/libs/app/index.html

@@ -16,8 +16,6 @@
 		</style>
 		</style>
 	</head>
 	</head>
 	<body ontouchstart="">
 	<body ontouchstart="">
-		<script src="./js/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from './js/three.module.js';
 			import * as THREE from './js/three.module.js';

+ 0 - 1
editor/sw.js

@@ -51,7 +51,6 @@ const assets = [
 
 
 	'../examples/jsm/geometries/TeapotBufferGeometry.js',
 	'../examples/jsm/geometries/TeapotBufferGeometry.js',
 
 
-	'../examples/js/vr/HelioWebXRPolyfill.js',
 	'../examples/jsm/webxr/VRButton.js',
 	'../examples/jsm/webxr/VRButton.js',
 
 
 	'./manifest.json',
 	'./manifest.json',

+ 6 - 6
examples/js/controls/OrbitControls.js

@@ -256,8 +256,8 @@ THREE.OrbitControls = function ( object, domElement ) {
 		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
 		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
 		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
 		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
 
 
-		document.removeEventListener( 'mousemove', onMouseMove, false );
-		document.removeEventListener( 'mouseup', onMouseUp, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );
 
 
 		scope.domElement.removeEventListener( 'keydown', onKeyDown, false );
 		scope.domElement.removeEventListener( 'keydown', onKeyDown, false );
 
 
@@ -850,8 +850,8 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 
 		if ( state !== STATE.NONE ) {
 		if ( state !== STATE.NONE ) {
 
 
-			document.addEventListener( 'mousemove', onMouseMove, false );
-			document.addEventListener( 'mouseup', onMouseUp, false );
+			scope.domElement.ownerDocument.addEventListener( 'mousemove', onMouseMove, false );
+			scope.domElement.ownerDocument.addEventListener( 'mouseup', onMouseUp, false );
 
 
 			scope.dispatchEvent( startEvent );
 			scope.dispatchEvent( startEvent );
 
 
@@ -901,8 +901,8 @@ THREE.OrbitControls = function ( object, domElement ) {
 
 
 		handleMouseUp( event );
 		handleMouseUp( event );
 
 
-		document.removeEventListener( 'mousemove', onMouseMove, false );
-		document.removeEventListener( 'mouseup', onMouseUp, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );
 
 
 		scope.dispatchEvent( endEvent );
 		scope.dispatchEvent( endEvent );
 
 

+ 8 - 8
examples/js/controls/PointerLockControls.js

@@ -59,7 +59,7 @@ THREE.PointerLockControls = function ( camera, domElement ) {
 
 
 	function onPointerlockChange() {
 	function onPointerlockChange() {
 
 
-		if ( document.pointerLockElement === scope.domElement ) {
+		if ( scope.domElement.ownerDocument.pointerLockElement === scope.domElement ) {
 
 
 			scope.dispatchEvent( lockEvent );
 			scope.dispatchEvent( lockEvent );
 
 
@@ -83,17 +83,17 @@ THREE.PointerLockControls = function ( camera, domElement ) {
 
 
 	this.connect = function () {
 	this.connect = function () {
 
 
-		document.addEventListener( 'mousemove', onMouseMove, false );
-		document.addEventListener( 'pointerlockchange', onPointerlockChange, false );
-		document.addEventListener( 'pointerlockerror', onPointerlockError, false );
+		scope.domElement.ownerDocument.addEventListener( 'mousemove', onMouseMove, false );
+		scope.domElement.ownerDocument.addEventListener( 'pointerlockchange', onPointerlockChange, false );
+		scope.domElement.ownerDocument.addEventListener( 'pointerlockerror', onPointerlockError, false );
 
 
 	};
 	};
 
 
 	this.disconnect = function () {
 	this.disconnect = function () {
 
 
-		document.removeEventListener( 'mousemove', onMouseMove, false );
-		document.removeEventListener( 'pointerlockchange', onPointerlockChange, false );
-		document.removeEventListener( 'pointerlockerror', onPointerlockError, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerlockchange', onPointerlockChange, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerlockerror', onPointerlockError, false );
 
 
 	};
 	};
 
 
@@ -150,7 +150,7 @@ THREE.PointerLockControls = function ( camera, domElement ) {
 
 
 	this.unlock = function () {
 	this.unlock = function () {
 
 
-		document.exitPointerLock();
+		scope.domElement.ownerDocument.exitPointerLock();
 
 
 	};
 	};
 
 

+ 115 - 115
examples/js/controls/TrackballControls.js

@@ -11,7 +11,7 @@ THREE.TrackballControls = function ( object, domElement ) {
 	if ( domElement === undefined ) console.warn( 'THREE.TrackballControls: The second parameter "domElement" is now mandatory.' );
 	if ( domElement === undefined ) console.warn( 'THREE.TrackballControls: The second parameter "domElement" is now mandatory.' );
 	if ( domElement === document ) console.error( 'THREE.TrackballControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.' );
 	if ( domElement === document ) console.error( 'THREE.TrackballControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.' );
 
 
-	var _this = this;
+	var scope = this;
 	var STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 };
 	var STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 };
 
 
 	this.object = object;
 	this.object = object;
@@ -88,13 +88,13 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	this.handleResize = function () {
 	this.handleResize = function () {
 
 
-		var box = this.domElement.getBoundingClientRect();
+		var box = scope.domElement.getBoundingClientRect();
 		// adjustments come from similar code in the jquery offset() function
 		// adjustments come from similar code in the jquery offset() function
-		var d = this.domElement.ownerDocument.documentElement;
-		this.screen.left = box.left + window.pageXOffset - d.clientLeft;
-		this.screen.top = box.top + window.pageYOffset - d.clientTop;
-		this.screen.width = box.width;
-		this.screen.height = box.height;
+		var d = scope.domElement.ownerDocument.documentElement;
+		scope.screen.left = box.left + window.pageXOffset - d.clientLeft;
+		scope.screen.top = box.top + window.pageYOffset - d.clientTop;
+		scope.screen.width = box.width;
+		scope.screen.height = box.height;
 
 
 	};
 	};
 
 
@@ -105,8 +105,8 @@ THREE.TrackballControls = function ( object, domElement ) {
 		return function getMouseOnScreen( pageX, pageY ) {
 		return function getMouseOnScreen( pageX, pageY ) {
 
 
 			vector.set(
 			vector.set(
-				( pageX - _this.screen.left ) / _this.screen.width,
-				( pageY - _this.screen.top ) / _this.screen.height
+				( pageX - scope.screen.left ) / scope.screen.width,
+				( pageY - scope.screen.top ) / scope.screen.height
 			);
 			);
 
 
 			return vector;
 			return vector;
@@ -122,8 +122,8 @@ THREE.TrackballControls = function ( object, domElement ) {
 		return function getMouseOnCircle( pageX, pageY ) {
 		return function getMouseOnCircle( pageX, pageY ) {
 
 
 			vector.set(
 			vector.set(
-				( ( pageX - _this.screen.width * 0.5 - _this.screen.left ) / ( _this.screen.width * 0.5 ) ),
-				( ( _this.screen.height + 2 * ( _this.screen.top - pageY ) ) / _this.screen.width ) // screen.width intentional
+				( ( pageX - scope.screen.width * 0.5 - scope.screen.left ) / ( scope.screen.width * 0.5 ) ),
+				( ( scope.screen.height + 2 * ( scope.screen.top - pageY ) ) / scope.screen.width ) // screen.width intentional
 			);
 			);
 
 
 			return vector;
 			return vector;
@@ -149,10 +149,10 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 			if ( angle ) {
 			if ( angle ) {
 
 
-				_eye.copy( _this.object.position ).sub( _this.target );
+				_eye.copy( scope.object.position ).sub( scope.target );
 
 
 				eyeDirection.copy( _eye ).normalize();
 				eyeDirection.copy( _eye ).normalize();
-				objectUpDirection.copy( _this.object.up ).normalize();
+				objectUpDirection.copy( scope.object.up ).normalize();
 				objectSidewaysDirection.crossVectors( objectUpDirection, eyeDirection ).normalize();
 				objectSidewaysDirection.crossVectors( objectUpDirection, eyeDirection ).normalize();
 
 
 				objectUpDirection.setLength( _moveCurr.y - _movePrev.y );
 				objectUpDirection.setLength( _moveCurr.y - _movePrev.y );
@@ -162,22 +162,22 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 				axis.crossVectors( moveDirection, _eye ).normalize();
 				axis.crossVectors( moveDirection, _eye ).normalize();
 
 
-				angle *= _this.rotateSpeed;
+				angle *= scope.rotateSpeed;
 				quaternion.setFromAxisAngle( axis, angle );
 				quaternion.setFromAxisAngle( axis, angle );
 
 
 				_eye.applyQuaternion( quaternion );
 				_eye.applyQuaternion( quaternion );
-				_this.object.up.applyQuaternion( quaternion );
+				scope.object.up.applyQuaternion( quaternion );
 
 
 				_lastAxis.copy( axis );
 				_lastAxis.copy( axis );
 				_lastAngle = angle;
 				_lastAngle = angle;
 
 
-			} else if ( ! _this.staticMoving && _lastAngle ) {
+			} else if ( ! scope.staticMoving && _lastAngle ) {
 
 
-				_lastAngle *= Math.sqrt( 1.0 - _this.dynamicDampingFactor );
-				_eye.copy( _this.object.position ).sub( _this.target );
+				_lastAngle *= Math.sqrt( 1.0 - scope.dynamicDampingFactor );
+				_eye.copy( scope.object.position ).sub( scope.target );
 				quaternion.setFromAxisAngle( _lastAxis, _lastAngle );
 				quaternion.setFromAxisAngle( _lastAxis, _lastAngle );
 				_eye.applyQuaternion( quaternion );
 				_eye.applyQuaternion( quaternion );
-				_this.object.up.applyQuaternion( quaternion );
+				scope.object.up.applyQuaternion( quaternion );
 
 
 			}
 			}
 
 
@@ -197,14 +197,14 @@ THREE.TrackballControls = function ( object, domElement ) {
 			factor = _touchZoomDistanceStart / _touchZoomDistanceEnd;
 			factor = _touchZoomDistanceStart / _touchZoomDistanceEnd;
 			_touchZoomDistanceStart = _touchZoomDistanceEnd;
 			_touchZoomDistanceStart = _touchZoomDistanceEnd;
 
 
-			if ( _this.object.isPerspectiveCamera ) {
+			if ( scope.object.isPerspectiveCamera ) {
 
 
 				_eye.multiplyScalar( factor );
 				_eye.multiplyScalar( factor );
 
 
-			} else if ( _this.object.isOrthographicCamera ) {
+			} else if ( scope.object.isOrthographicCamera ) {
 
 
-				_this.object.zoom *= factor;
-				_this.object.updateProjectionMatrix();
+				scope.object.zoom *= factor;
+				scope.object.updateProjectionMatrix();
 
 
 			} else {
 			} else {
 
 
@@ -214,18 +214,18 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 		} else {
 		} else {
 
 
-			factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed;
+			factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * scope.zoomSpeed;
 
 
 			if ( factor !== 1.0 && factor > 0.0 ) {
 			if ( factor !== 1.0 && factor > 0.0 ) {
 
 
-				if ( _this.object.isPerspectiveCamera ) {
+				if ( scope.object.isPerspectiveCamera ) {
 
 
 					_eye.multiplyScalar( factor );
 					_eye.multiplyScalar( factor );
 
 
-				} else if ( _this.object.isOrthographicCamera ) {
+				} else if ( scope.object.isOrthographicCamera ) {
 
 
-					_this.object.zoom /= factor;
-					_this.object.updateProjectionMatrix();
+					scope.object.zoom /= factor;
+					scope.object.updateProjectionMatrix();
 
 
 				} else {
 				} else {
 
 
@@ -235,7 +235,7 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 			}
 			}
 
 
-			if ( _this.staticMoving ) {
+			if ( scope.staticMoving ) {
 
 
 				_zoomStart.copy( _zoomEnd );
 				_zoomStart.copy( _zoomEnd );
 
 
@@ -261,31 +261,31 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 			if ( mouseChange.lengthSq() ) {
 			if ( mouseChange.lengthSq() ) {
 
 
-				if ( _this.object.isOrthographicCamera ) {
+				if ( scope.object.isOrthographicCamera ) {
 
 
-					var scale_x = ( _this.object.right - _this.object.left ) / _this.object.zoom / _this.domElement.clientWidth;
-					var scale_y = ( _this.object.top - _this.object.bottom ) / _this.object.zoom / _this.domElement.clientWidth;
+					var scale_x = ( scope.object.right - scope.object.left ) / scope.object.zoom / scope.domElement.clientWidth;
+					var scale_y = ( scope.object.top - scope.object.bottom ) / scope.object.zoom / scope.domElement.clientWidth;
 
 
 					mouseChange.x *= scale_x;
 					mouseChange.x *= scale_x;
 					mouseChange.y *= scale_y;
 					mouseChange.y *= scale_y;
 
 
 				}
 				}
 
 
-				mouseChange.multiplyScalar( _eye.length() * _this.panSpeed );
+				mouseChange.multiplyScalar( _eye.length() * scope.panSpeed );
 
 
-				pan.copy( _eye ).cross( _this.object.up ).setLength( mouseChange.x );
-				pan.add( objectUp.copy( _this.object.up ).setLength( mouseChange.y ) );
+				pan.copy( _eye ).cross( scope.object.up ).setLength( mouseChange.x );
+				pan.add( objectUp.copy( scope.object.up ).setLength( mouseChange.y ) );
 
 
-				_this.object.position.add( pan );
-				_this.target.add( pan );
+				scope.object.position.add( pan );
+				scope.target.add( pan );
 
 
-				if ( _this.staticMoving ) {
+				if ( scope.staticMoving ) {
 
 
 					_panStart.copy( _panEnd );
 					_panStart.copy( _panEnd );
 
 
 				} else {
 				} else {
 
 
-					_panStart.add( mouseChange.subVectors( _panEnd, _panStart ).multiplyScalar( _this.dynamicDampingFactor ) );
+					_panStart.add( mouseChange.subVectors( _panEnd, _panStart ).multiplyScalar( scope.dynamicDampingFactor ) );
 
 
 				}
 				}
 
 
@@ -297,18 +297,18 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	this.checkDistances = function () {
 	this.checkDistances = function () {
 
 
-		if ( ! _this.noZoom || ! _this.noPan ) {
+		if ( ! scope.noZoom || ! scope.noPan ) {
 
 
-			if ( _eye.lengthSq() > _this.maxDistance * _this.maxDistance ) {
+			if ( _eye.lengthSq() > scope.maxDistance * scope.maxDistance ) {
 
 
-				_this.object.position.addVectors( _this.target, _eye.setLength( _this.maxDistance ) );
+				scope.object.position.addVectors( scope.target, _eye.setLength( scope.maxDistance ) );
 				_zoomStart.copy( _zoomEnd );
 				_zoomStart.copy( _zoomEnd );
 
 
 			}
 			}
 
 
-			if ( _eye.lengthSq() < _this.minDistance * _this.minDistance ) {
+			if ( _eye.lengthSq() < scope.minDistance * scope.minDistance ) {
 
 
-				_this.object.position.addVectors( _this.target, _eye.setLength( _this.minDistance ) );
+				scope.object.position.addVectors( scope.target, _eye.setLength( scope.minDistance ) );
 				_zoomStart.copy( _zoomEnd );
 				_zoomStart.copy( _zoomEnd );
 
 
 			}
 			}
@@ -319,52 +319,52 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	this.update = function () {
 	this.update = function () {
 
 
-		_eye.subVectors( _this.object.position, _this.target );
+		_eye.subVectors( scope.object.position, scope.target );
 
 
-		if ( ! _this.noRotate ) {
+		if ( ! scope.noRotate ) {
 
 
-			_this.rotateCamera();
+			scope.rotateCamera();
 
 
 		}
 		}
 
 
-		if ( ! _this.noZoom ) {
+		if ( ! scope.noZoom ) {
 
 
-			_this.zoomCamera();
+			scope.zoomCamera();
 
 
 		}
 		}
 
 
-		if ( ! _this.noPan ) {
+		if ( ! scope.noPan ) {
 
 
-			_this.panCamera();
+			scope.panCamera();
 
 
 		}
 		}
 
 
-		_this.object.position.addVectors( _this.target, _eye );
+		scope.object.position.addVectors( scope.target, _eye );
 
 
-		if ( _this.object.isPerspectiveCamera ) {
+		if ( scope.object.isPerspectiveCamera ) {
 
 
-			_this.checkDistances();
+			scope.checkDistances();
 
 
-			_this.object.lookAt( _this.target );
+			scope.object.lookAt( scope.target );
 
 
-			if ( lastPosition.distanceToSquared( _this.object.position ) > EPS ) {
+			if ( lastPosition.distanceToSquared( scope.object.position ) > EPS ) {
 
 
-				_this.dispatchEvent( changeEvent );
+				scope.dispatchEvent( changeEvent );
 
 
-				lastPosition.copy( _this.object.position );
+				lastPosition.copy( scope.object.position );
 
 
 			}
 			}
 
 
-		} else if ( _this.object.isOrthographicCamera ) {
+		} else if ( scope.object.isOrthographicCamera ) {
 
 
-			_this.object.lookAt( _this.target );
+			scope.object.lookAt( scope.target );
 
 
-			if ( lastPosition.distanceToSquared( _this.object.position ) > EPS || lastZoom !== _this.object.zoom ) {
+			if ( lastPosition.distanceToSquared( scope.object.position ) > EPS || lastZoom !== scope.object.zoom ) {
 
 
-				_this.dispatchEvent( changeEvent );
+				scope.dispatchEvent( changeEvent );
 
 
-				lastPosition.copy( _this.object.position );
-				lastZoom = _this.object.zoom;
+				lastPosition.copy( scope.object.position );
+				lastZoom = scope.object.zoom;
 
 
 			}
 			}
 
 
@@ -381,21 +381,21 @@ THREE.TrackballControls = function ( object, domElement ) {
 		_state = STATE.NONE;
 		_state = STATE.NONE;
 		_keyState = STATE.NONE;
 		_keyState = STATE.NONE;
 
 
-		_this.target.copy( _this.target0 );
-		_this.object.position.copy( _this.position0 );
-		_this.object.up.copy( _this.up0 );
-		_this.object.zoom = _this.zoom0;
+		scope.target.copy( scope.target0 );
+		scope.object.position.copy( scope.position0 );
+		scope.object.up.copy( scope.up0 );
+		scope.object.zoom = scope.zoom0;
 
 
-		_this.object.updateProjectionMatrix();
+		scope.object.updateProjectionMatrix();
 
 
-		_eye.subVectors( _this.object.position, _this.target );
+		_eye.subVectors( scope.object.position, scope.target );
 
 
-		_this.object.lookAt( _this.target );
+		scope.object.lookAt( scope.target );
 
 
-		_this.dispatchEvent( changeEvent );
+		scope.dispatchEvent( changeEvent );
 
 
-		lastPosition.copy( _this.object.position );
-		lastZoom = _this.object.zoom;
+		lastPosition.copy( scope.object.position );
+		lastZoom = scope.object.zoom;
 
 
 	};
 	};
 
 
@@ -403,7 +403,7 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	function keydown( event ) {
 	function keydown( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		window.removeEventListener( 'keydown', keydown );
 		window.removeEventListener( 'keydown', keydown );
 
 
@@ -411,15 +411,15 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 			return;
 			return;
 
 
-		} else if ( event.keyCode === _this.keys[ STATE.ROTATE ] && ! _this.noRotate ) {
+		} else if ( event.keyCode === scope.keys[ STATE.ROTATE ] && ! scope.noRotate ) {
 
 
 			_keyState = STATE.ROTATE;
 			_keyState = STATE.ROTATE;
 
 
-		} else if ( event.keyCode === _this.keys[ STATE.ZOOM ] && ! _this.noZoom ) {
+		} else if ( event.keyCode === scope.keys[ STATE.ZOOM ] && ! scope.noZoom ) {
 
 
 			_keyState = STATE.ZOOM;
 			_keyState = STATE.ZOOM;
 
 
-		} else if ( event.keyCode === _this.keys[ STATE.PAN ] && ! _this.noPan ) {
+		} else if ( event.keyCode === scope.keys[ STATE.PAN ] && ! scope.noPan ) {
 
 
 			_keyState = STATE.PAN;
 			_keyState = STATE.PAN;
 
 
@@ -429,7 +429,7 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	function keyup() {
 	function keyup() {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		_keyState = STATE.NONE;
 		_keyState = STATE.NONE;
 
 
@@ -439,7 +439,7 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	function mousedown( event ) {
 	function mousedown( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
@@ -448,15 +448,15 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 			switch ( event.button ) {
 			switch ( event.button ) {
 
 
-				case _this.mouseButtons.LEFT:
+				case scope.mouseButtons.LEFT:
 					_state = STATE.ROTATE;
 					_state = STATE.ROTATE;
 					break;
 					break;
 
 
-				case _this.mouseButtons.MIDDLE:
+				case scope.mouseButtons.MIDDLE:
 					_state = STATE.ZOOM;
 					_state = STATE.ZOOM;
 					break;
 					break;
 
 
-				case _this.mouseButtons.RIGHT:
+				case scope.mouseButtons.RIGHT:
 					_state = STATE.PAN;
 					_state = STATE.PAN;
 					break;
 					break;
 
 
@@ -469,49 +469,49 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 		var state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 		var state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 
 
-		if ( state === STATE.ROTATE && ! _this.noRotate ) {
+		if ( state === STATE.ROTATE && ! scope.noRotate ) {
 
 
 			_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 			_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 			_movePrev.copy( _moveCurr );
 			_movePrev.copy( _moveCurr );
 
 
-		} else if ( state === STATE.ZOOM && ! _this.noZoom ) {
+		} else if ( state === STATE.ZOOM && ! scope.noZoom ) {
 
 
 			_zoomStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_zoomStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_zoomEnd.copy( _zoomStart );
 			_zoomEnd.copy( _zoomStart );
 
 
-		} else if ( state === STATE.PAN && ! _this.noPan ) {
+		} else if ( state === STATE.PAN && ! scope.noPan ) {
 
 
 			_panStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_panStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_panEnd.copy( _panStart );
 			_panEnd.copy( _panStart );
 
 
 		}
 		}
 
 
-		document.addEventListener( 'mousemove', mousemove, false );
-		document.addEventListener( 'mouseup', mouseup, false );
+		scope.domElement.ownerDocument.addEventListener( 'mousemove', mousemove, false );
+		scope.domElement.ownerDocument.addEventListener( 'mouseup', mouseup, false );
 
 
-		_this.dispatchEvent( startEvent );
+		scope.dispatchEvent( startEvent );
 
 
 	}
 	}
 
 
 	function mousemove( event ) {
 	function mousemove( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
 
 
 		var state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 		var state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 
 
-		if ( state === STATE.ROTATE && ! _this.noRotate ) {
+		if ( state === STATE.ROTATE && ! scope.noRotate ) {
 
 
 			_movePrev.copy( _moveCurr );
 			_movePrev.copy( _moveCurr );
 			_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 			_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 
 
-		} else if ( state === STATE.ZOOM && ! _this.noZoom ) {
+		} else if ( state === STATE.ZOOM && ! scope.noZoom ) {
 
 
 			_zoomEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_zoomEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 
 
-		} else if ( state === STATE.PAN && ! _this.noPan ) {
+		} else if ( state === STATE.PAN && ! scope.noPan ) {
 
 
 			_panEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_panEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 
 
@@ -521,24 +521,24 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	function mouseup( event ) {
 	function mouseup( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
 
 
 		_state = STATE.NONE;
 		_state = STATE.NONE;
 
 
-		document.removeEventListener( 'mousemove', mousemove );
-		document.removeEventListener( 'mouseup', mouseup );
-		_this.dispatchEvent( endEvent );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', mousemove );
+		scope.domElement.ownerDocument.removeEventListener( 'mouseup', mouseup );
+		scope.dispatchEvent( endEvent );
 
 
 	}
 	}
 
 
 	function mousewheel( event ) {
 	function mousewheel( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
-		if ( _this.noZoom === true ) return;
+		if ( scope.noZoom === true ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
@@ -562,14 +562,14 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 		}
 		}
 
 
-		_this.dispatchEvent( startEvent );
-		_this.dispatchEvent( endEvent );
+		scope.dispatchEvent( startEvent );
+		scope.dispatchEvent( endEvent );
 
 
 	}
 	}
 
 
 	function touchstart( event ) {
 	function touchstart( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 
 
@@ -595,13 +595,13 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 		}
 		}
 
 
-		_this.dispatchEvent( startEvent );
+		scope.dispatchEvent( startEvent );
 
 
 	}
 	}
 
 
 	function touchmove( event ) {
 	function touchmove( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
@@ -629,7 +629,7 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	function touchend( event ) {
 	function touchend( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		switch ( event.touches.length ) {
 		switch ( event.touches.length ) {
 
 
@@ -645,13 +645,13 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 		}
 		}
 
 
-		_this.dispatchEvent( endEvent );
+		scope.dispatchEvent( endEvent );
 
 
 	}
 	}
 
 
 	function contextmenu( event ) {
 	function contextmenu( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 
 
@@ -659,16 +659,16 @@ THREE.TrackballControls = function ( object, domElement ) {
 
 
 	this.dispose = function () {
 	this.dispose = function () {
 
 
-		this.domElement.removeEventListener( 'contextmenu', contextmenu, false );
-		this.domElement.removeEventListener( 'mousedown', mousedown, false );
-		this.domElement.removeEventListener( 'wheel', mousewheel, false );
+		scope.domElement.removeEventListener( 'contextmenu', contextmenu, false );
+		scope.domElement.removeEventListener( 'mousedown', mousedown, false );
+		scope.domElement.removeEventListener( 'wheel', mousewheel, false );
 
 
-		this.domElement.removeEventListener( 'touchstart', touchstart, false );
-		this.domElement.removeEventListener( 'touchend', touchend, false );
-		this.domElement.removeEventListener( 'touchmove', touchmove, false );
+		scope.domElement.removeEventListener( 'touchstart', touchstart, false );
+		scope.domElement.removeEventListener( 'touchend', touchend, false );
+		scope.domElement.removeEventListener( 'touchmove', touchmove, false );
 
 
-		document.removeEventListener( 'mousemove', mousemove, false );
-		document.removeEventListener( 'mouseup', mouseup, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', mousemove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mouseup', mouseup, false );
 
 
 		window.removeEventListener( 'keydown', keydown, false );
 		window.removeEventListener( 'keydown', keydown, false );
 		window.removeEventListener( 'keyup', keyup, false );
 		window.removeEventListener( 'keyup', keyup, false );

+ 6 - 6
examples/js/controls/TransformControls.js

@@ -133,7 +133,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 		domElement.addEventListener( "mousemove", onPointerHover, false );
 		domElement.addEventListener( "mousemove", onPointerHover, false );
 		domElement.addEventListener( "touchmove", onPointerHover, false );
 		domElement.addEventListener( "touchmove", onPointerHover, false );
 		domElement.addEventListener( "touchmove", onPointerMove, false );
 		domElement.addEventListener( "touchmove", onPointerMove, false );
-		document.addEventListener( "mouseup", onPointerUp, false );
+		scope.domElement.ownerDocument.addEventListener( "mouseup", onPointerUp, false );
 		domElement.addEventListener( "touchend", onPointerUp, false );
 		domElement.addEventListener( "touchend", onPointerUp, false );
 		domElement.addEventListener( "touchcancel", onPointerUp, false );
 		domElement.addEventListener( "touchcancel", onPointerUp, false );
 		domElement.addEventListener( "touchleave", onPointerUp, false );
 		domElement.addEventListener( "touchleave", onPointerUp, false );
@@ -145,10 +145,10 @@ THREE.TransformControls = function ( camera, domElement ) {
 		domElement.removeEventListener( "mousedown", onPointerDown );
 		domElement.removeEventListener( "mousedown", onPointerDown );
 		domElement.removeEventListener( "touchstart", onPointerDown );
 		domElement.removeEventListener( "touchstart", onPointerDown );
 		domElement.removeEventListener( "mousemove", onPointerHover );
 		domElement.removeEventListener( "mousemove", onPointerHover );
-		document.removeEventListener( "mousemove", onPointerMove );
+		scope.domElement.ownerDocument.removeEventListener( "mousemove", onPointerMove );
 		domElement.removeEventListener( "touchmove", onPointerHover );
 		domElement.removeEventListener( "touchmove", onPointerHover );
 		domElement.removeEventListener( "touchmove", onPointerMove );
 		domElement.removeEventListener( "touchmove", onPointerMove );
-		document.removeEventListener( "mouseup", onPointerUp );
+		scope.domElement.ownerDocument.removeEventListener( "mouseup", onPointerUp );
 		domElement.removeEventListener( "touchend", onPointerUp );
 		domElement.removeEventListener( "touchend", onPointerUp );
 		domElement.removeEventListener( "touchcancel", onPointerUp );
 		domElement.removeEventListener( "touchcancel", onPointerUp );
 		domElement.removeEventListener( "touchleave", onPointerUp );
 		domElement.removeEventListener( "touchleave", onPointerUp );
@@ -599,7 +599,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 
 	function getPointer( event ) {
 	function getPointer( event ) {
 
 
-		if ( document.pointerLockElement ) {
+		if ( scope.domElement.ownerDocument.pointerLockElement ) {
 
 
 			return {
 			return {
 				x: 0,
 				x: 0,
@@ -637,7 +637,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 
 		if ( ! scope.enabled ) return;
 		if ( ! scope.enabled ) return;
 
 
-		document.addEventListener( "mousemove", onPointerMove, false );
+		scope.domElement.ownerDocument.addEventListener( "mousemove", onPointerMove, false );
 
 
 		scope.pointerHover( getPointer( event ) );
 		scope.pointerHover( getPointer( event ) );
 		scope.pointerDown( getPointer( event ) );
 		scope.pointerDown( getPointer( event ) );
@@ -656,7 +656,7 @@ THREE.TransformControls = function ( camera, domElement ) {
 
 
 		if ( ! scope.enabled ) return;
 		if ( ! scope.enabled ) return;
 
 
-		document.removeEventListener( "mousemove", onPointerMove, false );
+		scope.domElement.ownerDocument.removeEventListener( "mousemove", onPointerMove, false );
 
 
 		scope.pointerUp( getPointer( event ) );
 		scope.pointerUp( getPointer( event ) );
 
 

+ 0 - 48
examples/js/vr/HelioWebXRPolyfill.js

@@ -1,48 +0,0 @@
-/**
- * @author mvilledieu / http://github.com/mvilledieu
- */
-
-if ( /(Helio)/g.test( navigator.userAgent ) && 'xr' in navigator ) {
-
-	console.log( "Helio WebXR Polyfill (Lumin 0.98.0)" );
-
-	if ( 'isSessionSupported' in navigator.xr ) {
-
-		const tempIsSessionSupported = navigator.xr.isSessionSupported.bind( navigator.xr );
-
-		navigator.xr.isSessionSupported = function ( /*sessionType*/ ) {
-
-			// Force using immersive-ar
-			return tempIsSessionSupported( 'immersive-ar' );
-
-		};
-
-	}
-
-	if ( 'isSessionSupported' in navigator.xr && 'requestSession' in navigator.xr ) {
-
-		const tempRequestSession = navigator.xr.requestSession.bind( navigator.xr );
-
-		navigator.xr.requestSession = function ( /*sessionType*/ ) {
-
-			return new Promise( function ( resolve, reject ) {
-
-				var sessionInit = { optionalFeatures: [ 'local-floor', 'bounded-floor' ] };
-
-				tempRequestSession( 'immersive-ar', sessionInit ).then( function ( session ) {
-
-					resolve( session );
-
-				} ).catch( function ( error ) {
-
-					return reject( error );
-
-				} );
-
-			} );
-
-		};
-
-	}
-
-}

+ 6 - 6
examples/jsm/controls/OrbitControls.js

@@ -265,8 +265,8 @@ var OrbitControls = function ( object, domElement ) {
 		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
 		scope.domElement.removeEventListener( 'touchend', onTouchEnd, false );
 		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
 		scope.domElement.removeEventListener( 'touchmove', onTouchMove, false );
 
 
-		document.removeEventListener( 'mousemove', onMouseMove, false );
-		document.removeEventListener( 'mouseup', onMouseUp, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );
 
 
 		scope.domElement.removeEventListener( 'keydown', onKeyDown, false );
 		scope.domElement.removeEventListener( 'keydown', onKeyDown, false );
 
 
@@ -859,8 +859,8 @@ var OrbitControls = function ( object, domElement ) {
 
 
 		if ( state !== STATE.NONE ) {
 		if ( state !== STATE.NONE ) {
 
 
-			document.addEventListener( 'mousemove', onMouseMove, false );
-			document.addEventListener( 'mouseup', onMouseUp, false );
+			scope.domElement.ownerDocument.addEventListener( 'mousemove', onMouseMove, false );
+			scope.domElement.ownerDocument.addEventListener( 'mouseup', onMouseUp, false );
 
 
 			scope.dispatchEvent( startEvent );
 			scope.dispatchEvent( startEvent );
 
 
@@ -910,8 +910,8 @@ var OrbitControls = function ( object, domElement ) {
 
 
 		handleMouseUp( event );
 		handleMouseUp( event );
 
 
-		document.removeEventListener( 'mousemove', onMouseMove, false );
-		document.removeEventListener( 'mouseup', onMouseUp, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );
 
 
 		scope.dispatchEvent( endEvent );
 		scope.dispatchEvent( endEvent );
 
 

+ 8 - 8
examples/jsm/controls/PointerLockControls.js

@@ -64,7 +64,7 @@ var PointerLockControls = function ( camera, domElement ) {
 
 
 	function onPointerlockChange() {
 	function onPointerlockChange() {
 
 
-		if ( document.pointerLockElement === scope.domElement ) {
+		if ( scope.domElement.ownerDocument.pointerLockElement === scope.domElement ) {
 
 
 			scope.dispatchEvent( lockEvent );
 			scope.dispatchEvent( lockEvent );
 
 
@@ -88,17 +88,17 @@ var PointerLockControls = function ( camera, domElement ) {
 
 
 	this.connect = function () {
 	this.connect = function () {
 
 
-		document.addEventListener( 'mousemove', onMouseMove, false );
-		document.addEventListener( 'pointerlockchange', onPointerlockChange, false );
-		document.addEventListener( 'pointerlockerror', onPointerlockError, false );
+		scope.domElement.ownerDocument.addEventListener( 'mousemove', onMouseMove, false );
+		scope.domElement.ownerDocument.addEventListener( 'pointerlockchange', onPointerlockChange, false );
+		scope.domElement.ownerDocument.addEventListener( 'pointerlockerror', onPointerlockError, false );
 
 
 	};
 	};
 
 
 	this.disconnect = function () {
 	this.disconnect = function () {
 
 
-		document.removeEventListener( 'mousemove', onMouseMove, false );
-		document.removeEventListener( 'pointerlockchange', onPointerlockChange, false );
-		document.removeEventListener( 'pointerlockerror', onPointerlockError, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerlockchange', onPointerlockChange, false );
+		scope.domElement.ownerDocument.removeEventListener( 'pointerlockerror', onPointerlockError, false );
 
 
 	};
 	};
 
 
@@ -155,7 +155,7 @@ var PointerLockControls = function ( camera, domElement ) {
 
 
 	this.unlock = function () {
 	this.unlock = function () {
 
 
-		document.exitPointerLock();
+		scope.domElement.ownerDocument.exitPointerLock();
 
 
 	};
 	};
 
 

+ 115 - 115
examples/jsm/controls/TrackballControls.js

@@ -18,7 +18,7 @@ var TrackballControls = function ( object, domElement ) {
 	if ( domElement === undefined ) console.warn( 'THREE.TrackballControls: The second parameter "domElement" is now mandatory.' );
 	if ( domElement === undefined ) console.warn( 'THREE.TrackballControls: The second parameter "domElement" is now mandatory.' );
 	if ( domElement === document ) console.error( 'THREE.TrackballControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.' );
 	if ( domElement === document ) console.error( 'THREE.TrackballControls: "document" should not be used as the target "domElement". Please use "renderer.domElement" instead.' );
 
 
-	var _this = this;
+	var scope = this;
 	var STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 };
 	var STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 };
 
 
 	this.object = object;
 	this.object = object;
@@ -95,13 +95,13 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	this.handleResize = function () {
 	this.handleResize = function () {
 
 
-		var box = this.domElement.getBoundingClientRect();
+		var box = scope.domElement.getBoundingClientRect();
 		// adjustments come from similar code in the jquery offset() function
 		// adjustments come from similar code in the jquery offset() function
-		var d = this.domElement.ownerDocument.documentElement;
-		this.screen.left = box.left + window.pageXOffset - d.clientLeft;
-		this.screen.top = box.top + window.pageYOffset - d.clientTop;
-		this.screen.width = box.width;
-		this.screen.height = box.height;
+		var d = scope.domElement.ownerDocument.documentElement;
+		scope.screen.left = box.left + window.pageXOffset - d.clientLeft;
+		scope.screen.top = box.top + window.pageYOffset - d.clientTop;
+		scope.screen.width = box.width;
+		scope.screen.height = box.height;
 
 
 	};
 	};
 
 
@@ -112,8 +112,8 @@ var TrackballControls = function ( object, domElement ) {
 		return function getMouseOnScreen( pageX, pageY ) {
 		return function getMouseOnScreen( pageX, pageY ) {
 
 
 			vector.set(
 			vector.set(
-				( pageX - _this.screen.left ) / _this.screen.width,
-				( pageY - _this.screen.top ) / _this.screen.height
+				( pageX - scope.screen.left ) / scope.screen.width,
+				( pageY - scope.screen.top ) / scope.screen.height
 			);
 			);
 
 
 			return vector;
 			return vector;
@@ -129,8 +129,8 @@ var TrackballControls = function ( object, domElement ) {
 		return function getMouseOnCircle( pageX, pageY ) {
 		return function getMouseOnCircle( pageX, pageY ) {
 
 
 			vector.set(
 			vector.set(
-				( ( pageX - _this.screen.width * 0.5 - _this.screen.left ) / ( _this.screen.width * 0.5 ) ),
-				( ( _this.screen.height + 2 * ( _this.screen.top - pageY ) ) / _this.screen.width ) // screen.width intentional
+				( ( pageX - scope.screen.width * 0.5 - scope.screen.left ) / ( scope.screen.width * 0.5 ) ),
+				( ( scope.screen.height + 2 * ( scope.screen.top - pageY ) ) / scope.screen.width ) // screen.width intentional
 			);
 			);
 
 
 			return vector;
 			return vector;
@@ -156,10 +156,10 @@ var TrackballControls = function ( object, domElement ) {
 
 
 			if ( angle ) {
 			if ( angle ) {
 
 
-				_eye.copy( _this.object.position ).sub( _this.target );
+				_eye.copy( scope.object.position ).sub( scope.target );
 
 
 				eyeDirection.copy( _eye ).normalize();
 				eyeDirection.copy( _eye ).normalize();
-				objectUpDirection.copy( _this.object.up ).normalize();
+				objectUpDirection.copy( scope.object.up ).normalize();
 				objectSidewaysDirection.crossVectors( objectUpDirection, eyeDirection ).normalize();
 				objectSidewaysDirection.crossVectors( objectUpDirection, eyeDirection ).normalize();
 
 
 				objectUpDirection.setLength( _moveCurr.y - _movePrev.y );
 				objectUpDirection.setLength( _moveCurr.y - _movePrev.y );
@@ -169,22 +169,22 @@ var TrackballControls = function ( object, domElement ) {
 
 
 				axis.crossVectors( moveDirection, _eye ).normalize();
 				axis.crossVectors( moveDirection, _eye ).normalize();
 
 
-				angle *= _this.rotateSpeed;
+				angle *= scope.rotateSpeed;
 				quaternion.setFromAxisAngle( axis, angle );
 				quaternion.setFromAxisAngle( axis, angle );
 
 
 				_eye.applyQuaternion( quaternion );
 				_eye.applyQuaternion( quaternion );
-				_this.object.up.applyQuaternion( quaternion );
+				scope.object.up.applyQuaternion( quaternion );
 
 
 				_lastAxis.copy( axis );
 				_lastAxis.copy( axis );
 				_lastAngle = angle;
 				_lastAngle = angle;
 
 
-			} else if ( ! _this.staticMoving && _lastAngle ) {
+			} else if ( ! scope.staticMoving && _lastAngle ) {
 
 
-				_lastAngle *= Math.sqrt( 1.0 - _this.dynamicDampingFactor );
-				_eye.copy( _this.object.position ).sub( _this.target );
+				_lastAngle *= Math.sqrt( 1.0 - scope.dynamicDampingFactor );
+				_eye.copy( scope.object.position ).sub( scope.target );
 				quaternion.setFromAxisAngle( _lastAxis, _lastAngle );
 				quaternion.setFromAxisAngle( _lastAxis, _lastAngle );
 				_eye.applyQuaternion( quaternion );
 				_eye.applyQuaternion( quaternion );
-				_this.object.up.applyQuaternion( quaternion );
+				scope.object.up.applyQuaternion( quaternion );
 
 
 			}
 			}
 
 
@@ -204,14 +204,14 @@ var TrackballControls = function ( object, domElement ) {
 			factor = _touchZoomDistanceStart / _touchZoomDistanceEnd;
 			factor = _touchZoomDistanceStart / _touchZoomDistanceEnd;
 			_touchZoomDistanceStart = _touchZoomDistanceEnd;
 			_touchZoomDistanceStart = _touchZoomDistanceEnd;
 
 
-			if ( _this.object.isPerspectiveCamera ) {
+			if ( scope.object.isPerspectiveCamera ) {
 
 
 				_eye.multiplyScalar( factor );
 				_eye.multiplyScalar( factor );
 
 
-			} else if ( _this.object.isOrthographicCamera ) {
+			} else if ( scope.object.isOrthographicCamera ) {
 
 
-				_this.object.zoom *= factor;
-				_this.object.updateProjectionMatrix();
+				scope.object.zoom *= factor;
+				scope.object.updateProjectionMatrix();
 
 
 			} else {
 			} else {
 
 
@@ -221,18 +221,18 @@ var TrackballControls = function ( object, domElement ) {
 
 
 		} else {
 		} else {
 
 
-			factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * _this.zoomSpeed;
+			factor = 1.0 + ( _zoomEnd.y - _zoomStart.y ) * scope.zoomSpeed;
 
 
 			if ( factor !== 1.0 && factor > 0.0 ) {
 			if ( factor !== 1.0 && factor > 0.0 ) {
 
 
-				if ( _this.object.isPerspectiveCamera ) {
+				if ( scope.object.isPerspectiveCamera ) {
 
 
 					_eye.multiplyScalar( factor );
 					_eye.multiplyScalar( factor );
 
 
-				} else if ( _this.object.isOrthographicCamera ) {
+				} else if ( scope.object.isOrthographicCamera ) {
 
 
-					_this.object.zoom /= factor;
-					_this.object.updateProjectionMatrix();
+					scope.object.zoom /= factor;
+					scope.object.updateProjectionMatrix();
 
 
 				} else {
 				} else {
 
 
@@ -242,7 +242,7 @@ var TrackballControls = function ( object, domElement ) {
 
 
 			}
 			}
 
 
-			if ( _this.staticMoving ) {
+			if ( scope.staticMoving ) {
 
 
 				_zoomStart.copy( _zoomEnd );
 				_zoomStart.copy( _zoomEnd );
 
 
@@ -268,31 +268,31 @@ var TrackballControls = function ( object, domElement ) {
 
 
 			if ( mouseChange.lengthSq() ) {
 			if ( mouseChange.lengthSq() ) {
 
 
-				if ( _this.object.isOrthographicCamera ) {
+				if ( scope.object.isOrthographicCamera ) {
 
 
-					var scale_x = ( _this.object.right - _this.object.left ) / _this.object.zoom / _this.domElement.clientWidth;
-					var scale_y = ( _this.object.top - _this.object.bottom ) / _this.object.zoom / _this.domElement.clientWidth;
+					var scale_x = ( scope.object.right - scope.object.left ) / scope.object.zoom / scope.domElement.clientWidth;
+					var scale_y = ( scope.object.top - scope.object.bottom ) / scope.object.zoom / scope.domElement.clientWidth;
 
 
 					mouseChange.x *= scale_x;
 					mouseChange.x *= scale_x;
 					mouseChange.y *= scale_y;
 					mouseChange.y *= scale_y;
 
 
 				}
 				}
 
 
-				mouseChange.multiplyScalar( _eye.length() * _this.panSpeed );
+				mouseChange.multiplyScalar( _eye.length() * scope.panSpeed );
 
 
-				pan.copy( _eye ).cross( _this.object.up ).setLength( mouseChange.x );
-				pan.add( objectUp.copy( _this.object.up ).setLength( mouseChange.y ) );
+				pan.copy( _eye ).cross( scope.object.up ).setLength( mouseChange.x );
+				pan.add( objectUp.copy( scope.object.up ).setLength( mouseChange.y ) );
 
 
-				_this.object.position.add( pan );
-				_this.target.add( pan );
+				scope.object.position.add( pan );
+				scope.target.add( pan );
 
 
-				if ( _this.staticMoving ) {
+				if ( scope.staticMoving ) {
 
 
 					_panStart.copy( _panEnd );
 					_panStart.copy( _panEnd );
 
 
 				} else {
 				} else {
 
 
-					_panStart.add( mouseChange.subVectors( _panEnd, _panStart ).multiplyScalar( _this.dynamicDampingFactor ) );
+					_panStart.add( mouseChange.subVectors( _panEnd, _panStart ).multiplyScalar( scope.dynamicDampingFactor ) );
 
 
 				}
 				}
 
 
@@ -304,18 +304,18 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	this.checkDistances = function () {
 	this.checkDistances = function () {
 
 
-		if ( ! _this.noZoom || ! _this.noPan ) {
+		if ( ! scope.noZoom || ! scope.noPan ) {
 
 
-			if ( _eye.lengthSq() > _this.maxDistance * _this.maxDistance ) {
+			if ( _eye.lengthSq() > scope.maxDistance * scope.maxDistance ) {
 
 
-				_this.object.position.addVectors( _this.target, _eye.setLength( _this.maxDistance ) );
+				scope.object.position.addVectors( scope.target, _eye.setLength( scope.maxDistance ) );
 				_zoomStart.copy( _zoomEnd );
 				_zoomStart.copy( _zoomEnd );
 
 
 			}
 			}
 
 
-			if ( _eye.lengthSq() < _this.minDistance * _this.minDistance ) {
+			if ( _eye.lengthSq() < scope.minDistance * scope.minDistance ) {
 
 
-				_this.object.position.addVectors( _this.target, _eye.setLength( _this.minDistance ) );
+				scope.object.position.addVectors( scope.target, _eye.setLength( scope.minDistance ) );
 				_zoomStart.copy( _zoomEnd );
 				_zoomStart.copy( _zoomEnd );
 
 
 			}
 			}
@@ -326,52 +326,52 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	this.update = function () {
 	this.update = function () {
 
 
-		_eye.subVectors( _this.object.position, _this.target );
+		_eye.subVectors( scope.object.position, scope.target );
 
 
-		if ( ! _this.noRotate ) {
+		if ( ! scope.noRotate ) {
 
 
-			_this.rotateCamera();
+			scope.rotateCamera();
 
 
 		}
 		}
 
 
-		if ( ! _this.noZoom ) {
+		if ( ! scope.noZoom ) {
 
 
-			_this.zoomCamera();
+			scope.zoomCamera();
 
 
 		}
 		}
 
 
-		if ( ! _this.noPan ) {
+		if ( ! scope.noPan ) {
 
 
-			_this.panCamera();
+			scope.panCamera();
 
 
 		}
 		}
 
 
-		_this.object.position.addVectors( _this.target, _eye );
+		scope.object.position.addVectors( scope.target, _eye );
 
 
-		if ( _this.object.isPerspectiveCamera ) {
+		if ( scope.object.isPerspectiveCamera ) {
 
 
-			_this.checkDistances();
+			scope.checkDistances();
 
 
-			_this.object.lookAt( _this.target );
+			scope.object.lookAt( scope.target );
 
 
-			if ( lastPosition.distanceToSquared( _this.object.position ) > EPS ) {
+			if ( lastPosition.distanceToSquared( scope.object.position ) > EPS ) {
 
 
-				_this.dispatchEvent( changeEvent );
+				scope.dispatchEvent( changeEvent );
 
 
-				lastPosition.copy( _this.object.position );
+				lastPosition.copy( scope.object.position );
 
 
 			}
 			}
 
 
-		} else if ( _this.object.isOrthographicCamera ) {
+		} else if ( scope.object.isOrthographicCamera ) {
 
 
-			_this.object.lookAt( _this.target );
+			scope.object.lookAt( scope.target );
 
 
-			if ( lastPosition.distanceToSquared( _this.object.position ) > EPS || lastZoom !== _this.object.zoom ) {
+			if ( lastPosition.distanceToSquared( scope.object.position ) > EPS || lastZoom !== scope.object.zoom ) {
 
 
-				_this.dispatchEvent( changeEvent );
+				scope.dispatchEvent( changeEvent );
 
 
-				lastPosition.copy( _this.object.position );
-				lastZoom = _this.object.zoom;
+				lastPosition.copy( scope.object.position );
+				lastZoom = scope.object.zoom;
 
 
 			}
 			}
 
 
@@ -388,21 +388,21 @@ var TrackballControls = function ( object, domElement ) {
 		_state = STATE.NONE;
 		_state = STATE.NONE;
 		_keyState = STATE.NONE;
 		_keyState = STATE.NONE;
 
 
-		_this.target.copy( _this.target0 );
-		_this.object.position.copy( _this.position0 );
-		_this.object.up.copy( _this.up0 );
-		_this.object.zoom = _this.zoom0;
+		scope.target.copy( scope.target0 );
+		scope.object.position.copy( scope.position0 );
+		scope.object.up.copy( scope.up0 );
+		scope.object.zoom = scope.zoom0;
 
 
-		_this.object.updateProjectionMatrix();
+		scope.object.updateProjectionMatrix();
 
 
-		_eye.subVectors( _this.object.position, _this.target );
+		_eye.subVectors( scope.object.position, scope.target );
 
 
-		_this.object.lookAt( _this.target );
+		scope.object.lookAt( scope.target );
 
 
-		_this.dispatchEvent( changeEvent );
+		scope.dispatchEvent( changeEvent );
 
 
-		lastPosition.copy( _this.object.position );
-		lastZoom = _this.object.zoom;
+		lastPosition.copy( scope.object.position );
+		lastZoom = scope.object.zoom;
 
 
 	};
 	};
 
 
@@ -410,7 +410,7 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	function keydown( event ) {
 	function keydown( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		window.removeEventListener( 'keydown', keydown );
 		window.removeEventListener( 'keydown', keydown );
 
 
@@ -418,15 +418,15 @@ var TrackballControls = function ( object, domElement ) {
 
 
 			return;
 			return;
 
 
-		} else if ( event.keyCode === _this.keys[ STATE.ROTATE ] && ! _this.noRotate ) {
+		} else if ( event.keyCode === scope.keys[ STATE.ROTATE ] && ! scope.noRotate ) {
 
 
 			_keyState = STATE.ROTATE;
 			_keyState = STATE.ROTATE;
 
 
-		} else if ( event.keyCode === _this.keys[ STATE.ZOOM ] && ! _this.noZoom ) {
+		} else if ( event.keyCode === scope.keys[ STATE.ZOOM ] && ! scope.noZoom ) {
 
 
 			_keyState = STATE.ZOOM;
 			_keyState = STATE.ZOOM;
 
 
-		} else if ( event.keyCode === _this.keys[ STATE.PAN ] && ! _this.noPan ) {
+		} else if ( event.keyCode === scope.keys[ STATE.PAN ] && ! scope.noPan ) {
 
 
 			_keyState = STATE.PAN;
 			_keyState = STATE.PAN;
 
 
@@ -436,7 +436,7 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	function keyup() {
 	function keyup() {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		_keyState = STATE.NONE;
 		_keyState = STATE.NONE;
 
 
@@ -446,7 +446,7 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	function mousedown( event ) {
 	function mousedown( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
@@ -455,15 +455,15 @@ var TrackballControls = function ( object, domElement ) {
 
 
 			switch ( event.button ) {
 			switch ( event.button ) {
 
 
-				case _this.mouseButtons.LEFT:
+				case scope.mouseButtons.LEFT:
 					_state = STATE.ROTATE;
 					_state = STATE.ROTATE;
 					break;
 					break;
 
 
-				case _this.mouseButtons.MIDDLE:
+				case scope.mouseButtons.MIDDLE:
 					_state = STATE.ZOOM;
 					_state = STATE.ZOOM;
 					break;
 					break;
 
 
-				case _this.mouseButtons.RIGHT:
+				case scope.mouseButtons.RIGHT:
 					_state = STATE.PAN;
 					_state = STATE.PAN;
 					break;
 					break;
 
 
@@ -476,49 +476,49 @@ var TrackballControls = function ( object, domElement ) {
 
 
 		var state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 		var state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 
 
-		if ( state === STATE.ROTATE && ! _this.noRotate ) {
+		if ( state === STATE.ROTATE && ! scope.noRotate ) {
 
 
 			_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 			_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 			_movePrev.copy( _moveCurr );
 			_movePrev.copy( _moveCurr );
 
 
-		} else if ( state === STATE.ZOOM && ! _this.noZoom ) {
+		} else if ( state === STATE.ZOOM && ! scope.noZoom ) {
 
 
 			_zoomStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_zoomStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_zoomEnd.copy( _zoomStart );
 			_zoomEnd.copy( _zoomStart );
 
 
-		} else if ( state === STATE.PAN && ! _this.noPan ) {
+		} else if ( state === STATE.PAN && ! scope.noPan ) {
 
 
 			_panStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_panStart.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_panEnd.copy( _panStart );
 			_panEnd.copy( _panStart );
 
 
 		}
 		}
 
 
-		document.addEventListener( 'mousemove', mousemove, false );
-		document.addEventListener( 'mouseup', mouseup, false );
+		scope.domElement.ownerDocument.addEventListener( 'mousemove', mousemove, false );
+		scope.domElement.ownerDocument.addEventListener( 'mouseup', mouseup, false );
 
 
-		_this.dispatchEvent( startEvent );
+		scope.dispatchEvent( startEvent );
 
 
 	}
 	}
 
 
 	function mousemove( event ) {
 	function mousemove( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
 
 
 		var state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 		var state = ( _keyState !== STATE.NONE ) ? _keyState : _state;
 
 
-		if ( state === STATE.ROTATE && ! _this.noRotate ) {
+		if ( state === STATE.ROTATE && ! scope.noRotate ) {
 
 
 			_movePrev.copy( _moveCurr );
 			_movePrev.copy( _moveCurr );
 			_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 			_moveCurr.copy( getMouseOnCircle( event.pageX, event.pageY ) );
 
 
-		} else if ( state === STATE.ZOOM && ! _this.noZoom ) {
+		} else if ( state === STATE.ZOOM && ! scope.noZoom ) {
 
 
 			_zoomEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_zoomEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 
 
-		} else if ( state === STATE.PAN && ! _this.noPan ) {
+		} else if ( state === STATE.PAN && ! scope.noPan ) {
 
 
 			_panEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 			_panEnd.copy( getMouseOnScreen( event.pageX, event.pageY ) );
 
 
@@ -528,24 +528,24 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	function mouseup( event ) {
 	function mouseup( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
 
 
 		_state = STATE.NONE;
 		_state = STATE.NONE;
 
 
-		document.removeEventListener( 'mousemove', mousemove );
-		document.removeEventListener( 'mouseup', mouseup );
-		_this.dispatchEvent( endEvent );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', mousemove );
+		scope.domElement.ownerDocument.removeEventListener( 'mouseup', mouseup );
+		scope.dispatchEvent( endEvent );
 
 
 	}
 	}
 
 
 	function mousewheel( event ) {
 	function mousewheel( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
-		if ( _this.noZoom === true ) return;
+		if ( scope.noZoom === true ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
@@ -569,14 +569,14 @@ var TrackballControls = function ( object, domElement ) {
 
 
 		}
 		}
 
 
-		_this.dispatchEvent( startEvent );
-		_this.dispatchEvent( endEvent );
+		scope.dispatchEvent( startEvent );
+		scope.dispatchEvent( endEvent );
 
 
 	}
 	}
 
 
 	function touchstart( event ) {
 	function touchstart( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 
 
@@ -602,13 +602,13 @@ var TrackballControls = function ( object, domElement ) {
 
 
 		}
 		}
 
 
-		_this.dispatchEvent( startEvent );
+		scope.dispatchEvent( startEvent );
 
 
 	}
 	}
 
 
 	function touchmove( event ) {
 	function touchmove( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 		event.stopPropagation();
 		event.stopPropagation();
@@ -636,7 +636,7 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	function touchend( event ) {
 	function touchend( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		switch ( event.touches.length ) {
 		switch ( event.touches.length ) {
 
 
@@ -652,13 +652,13 @@ var TrackballControls = function ( object, domElement ) {
 
 
 		}
 		}
 
 
-		_this.dispatchEvent( endEvent );
+		scope.dispatchEvent( endEvent );
 
 
 	}
 	}
 
 
 	function contextmenu( event ) {
 	function contextmenu( event ) {
 
 
-		if ( _this.enabled === false ) return;
+		if ( scope.enabled === false ) return;
 
 
 		event.preventDefault();
 		event.preventDefault();
 
 
@@ -666,16 +666,16 @@ var TrackballControls = function ( object, domElement ) {
 
 
 	this.dispose = function () {
 	this.dispose = function () {
 
 
-		this.domElement.removeEventListener( 'contextmenu', contextmenu, false );
-		this.domElement.removeEventListener( 'mousedown', mousedown, false );
-		this.domElement.removeEventListener( 'wheel', mousewheel, false );
+		scope.domElement.removeEventListener( 'contextmenu', contextmenu, false );
+		scope.domElement.removeEventListener( 'mousedown', mousedown, false );
+		scope.domElement.removeEventListener( 'wheel', mousewheel, false );
 
 
-		this.domElement.removeEventListener( 'touchstart', touchstart, false );
-		this.domElement.removeEventListener( 'touchend', touchend, false );
-		this.domElement.removeEventListener( 'touchmove', touchmove, false );
+		scope.domElement.removeEventListener( 'touchstart', touchstart, false );
+		scope.domElement.removeEventListener( 'touchend', touchend, false );
+		scope.domElement.removeEventListener( 'touchmove', touchmove, false );
 
 
-		document.removeEventListener( 'mousemove', mousemove, false );
-		document.removeEventListener( 'mouseup', mouseup, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mousemove', mousemove, false );
+		scope.domElement.ownerDocument.removeEventListener( 'mouseup', mouseup, false );
 
 
 		window.removeEventListener( 'keydown', keydown, false );
 		window.removeEventListener( 'keydown', keydown, false );
 		window.removeEventListener( 'keyup', keyup, false );
 		window.removeEventListener( 'keyup', keyup, false );

+ 6 - 6
examples/jsm/controls/TransformControls.js

@@ -155,7 +155,7 @@ var TransformControls = function ( camera, domElement ) {
 		domElement.addEventListener( "mousemove", onPointerHover, false );
 		domElement.addEventListener( "mousemove", onPointerHover, false );
 		domElement.addEventListener( "touchmove", onPointerHover, false );
 		domElement.addEventListener( "touchmove", onPointerHover, false );
 		domElement.addEventListener( "touchmove", onPointerMove, false );
 		domElement.addEventListener( "touchmove", onPointerMove, false );
-		document.addEventListener( "mouseup", onPointerUp, false );
+		scope.domElement.ownerDocument.addEventListener( "mouseup", onPointerUp, false );
 		domElement.addEventListener( "touchend", onPointerUp, false );
 		domElement.addEventListener( "touchend", onPointerUp, false );
 		domElement.addEventListener( "touchcancel", onPointerUp, false );
 		domElement.addEventListener( "touchcancel", onPointerUp, false );
 		domElement.addEventListener( "touchleave", onPointerUp, false );
 		domElement.addEventListener( "touchleave", onPointerUp, false );
@@ -167,10 +167,10 @@ var TransformControls = function ( camera, domElement ) {
 		domElement.removeEventListener( "mousedown", onPointerDown );
 		domElement.removeEventListener( "mousedown", onPointerDown );
 		domElement.removeEventListener( "touchstart", onPointerDown );
 		domElement.removeEventListener( "touchstart", onPointerDown );
 		domElement.removeEventListener( "mousemove", onPointerHover );
 		domElement.removeEventListener( "mousemove", onPointerHover );
-		document.removeEventListener( "mousemove", onPointerMove );
+		scope.domElement.ownerDocument.removeEventListener( "mousemove", onPointerMove );
 		domElement.removeEventListener( "touchmove", onPointerHover );
 		domElement.removeEventListener( "touchmove", onPointerHover );
 		domElement.removeEventListener( "touchmove", onPointerMove );
 		domElement.removeEventListener( "touchmove", onPointerMove );
-		document.removeEventListener( "mouseup", onPointerUp );
+		scope.domElement.ownerDocument.removeEventListener( "mouseup", onPointerUp );
 		domElement.removeEventListener( "touchend", onPointerUp );
 		domElement.removeEventListener( "touchend", onPointerUp );
 		domElement.removeEventListener( "touchcancel", onPointerUp );
 		domElement.removeEventListener( "touchcancel", onPointerUp );
 		domElement.removeEventListener( "touchleave", onPointerUp );
 		domElement.removeEventListener( "touchleave", onPointerUp );
@@ -621,7 +621,7 @@ var TransformControls = function ( camera, domElement ) {
 
 
 	function getPointer( event ) {
 	function getPointer( event ) {
 
 
-		if ( document.pointerLockElement ) {
+		if ( scope.domElement.ownerDocument.pointerLockElement ) {
 
 
 			return {
 			return {
 				x: 0,
 				x: 0,
@@ -659,7 +659,7 @@ var TransformControls = function ( camera, domElement ) {
 
 
 		if ( ! scope.enabled ) return;
 		if ( ! scope.enabled ) return;
 
 
-		document.addEventListener( "mousemove", onPointerMove, false );
+		scope.domElement.ownerDocument.addEventListener( "mousemove", onPointerMove, false );
 
 
 		scope.pointerHover( getPointer( event ) );
 		scope.pointerHover( getPointer( event ) );
 		scope.pointerDown( getPointer( event ) );
 		scope.pointerDown( getPointer( event ) );
@@ -678,7 +678,7 @@ var TransformControls = function ( camera, domElement ) {
 
 
 		if ( ! scope.enabled ) return;
 		if ( ! scope.enabled ) return;
 
 
-		document.removeEventListener( "mousemove", onPointerMove, false );
+		scope.domElement.ownerDocument.removeEventListener( "mousemove", onPointerMove, false );
 
 
 		scope.pointerUp( getPointer( event ) );
 		scope.pointerUp( getPointer( event ) );
 
 

+ 14 - 7
examples/webgl_animation_cloth.html

@@ -45,7 +45,7 @@
 			var params = {
 			var params = {
 				enableWind: true,
 				enableWind: true,
 				showBall: false,
 				showBall: false,
-				tooglePins: togglePins
+				togglePins: togglePins
 			};
 			};
 
 
 			var DAMPING = 0.03;
 			var DAMPING = 0.03;
@@ -581,13 +581,20 @@
 				//
 				//
 
 
 				var gui = new GUI();
 				var gui = new GUI();
-				gui.add( params, 'enableWind' );
-				gui.add( params, 'showBall' );
-				gui.add( params, 'tooglePins' );
-
+				gui.add( params, 'enableWind' ).name( 'Enable wind' );
+				gui.add( params, 'showBall' ).name( 'Show ball' );
+				gui.add( params, 'togglePins' ).name( 'Toggle pins' );
 				//
 				//
 
 
-				if ( typeof TESTING !== 'undefined' ) { for ( var i = 0; i < 50; i ++ ) { simulate( 500 - 10 * i ); }; };
+				if ( typeof TESTING !== 'undefined' ) {
+
+					for ( var i = 0; i < 50; i ++ ) {
+
+						simulate( 500 - 10 * i );
+
+					}
+
+				}
 
 
 			}
 			}
 
 
@@ -637,4 +644,4 @@
 
 
 		</script>
 		</script>
 	</body>
 	</body>
-</html>
+</html>

+ 0 - 2
examples/webxr_vr_ballshooter.html

@@ -12,8 +12,6 @@
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - ball shooter
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - ball shooter
 		</div>
 		</div>
 
 
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 2
examples/webxr_vr_cubes.html

@@ -12,8 +12,6 @@
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - interactive cubes
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - interactive cubes
 		</div>
 		</div>
 
 
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 2
examples/webxr_vr_dragging.html

@@ -12,8 +12,6 @@
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - dragging
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - dragging
 		</div>
 		</div>
 
 
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 3
examples/webxr_vr_lorenzattractor.html

@@ -7,9 +7,6 @@
 		<link type="text/css" rel="stylesheet" href="main.css">
 		<link type="text/css" rel="stylesheet" href="main.css">
 	</head>
 	</head>
 	<body>
 	<body>
-
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 2
examples/webxr_vr_paint.html

@@ -12,8 +12,6 @@
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - paint
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - paint
 		</div>
 		</div>
 
 
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 2
examples/webxr_vr_panorama.html

@@ -7,8 +7,6 @@
 		<link type="text/css" rel="stylesheet" href="main.css">
 		<link type="text/css" rel="stylesheet" href="main.css">
 	</head>
 	</head>
 	<body>
 	<body>
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 2
examples/webxr_vr_panorama_depth.html

@@ -14,8 +14,6 @@
 			Created by <a href="https://orfleisher.com" target="_blank" rel="noopener">@juniorxsound</a>. Panorama from <a href="https://krpano.com/examples/?depthmap" target="_blank" rel="noopener">krpano</a>.
 			Created by <a href="https://orfleisher.com" target="_blank" rel="noopener">@juniorxsound</a>. Panorama from <a href="https://krpano.com/examples/?depthmap" target="_blank" rel="noopener">krpano</a>.
 		</div>
 		</div>
 
 
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 3
examples/webxr_vr_rollercoaster.html

@@ -7,9 +7,6 @@
 		<link type="text/css" rel="stylesheet" href="main.css">
 		<link type="text/css" rel="stylesheet" href="main.css">
 	</head>
 	</head>
 	<body>
 	<body>
-
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 3
examples/webxr_vr_sandbox.html

@@ -7,9 +7,6 @@
 		<link type="text/css" rel="stylesheet" href="main.css">
 		<link type="text/css" rel="stylesheet" href="main.css">
 	</head>
 	</head>
 	<body>
 	<body>
-
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 2
examples/webxr_vr_sculpt.html

@@ -12,8 +12,6 @@
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - sculpt
 			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> vr - sculpt
 		</div>
 		</div>
 
 
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<script type="module">
 		<script type="module">
 
 
 			import * as THREE from '../build/three.module.js';
 			import * as THREE from '../build/three.module.js';

+ 0 - 2
examples/webxr_vr_video.html

@@ -14,8 +14,6 @@
 			stereoscopic panoramic render by <a href="http://pedrofe.com/rendering-for-oculus-rift-with-arnold/" target="_blank" rel="noopener">pedrofe</a>. scene from <a href="http://www.meryproject.com/" target="_blank" rel="noopener">mery project</a>.
 			stereoscopic panoramic render by <a href="http://pedrofe.com/rendering-for-oculus-rift-with-arnold/" target="_blank" rel="noopener">pedrofe</a>. scene from <a href="http://www.meryproject.com/" target="_blank" rel="noopener">mery project</a>.
 		</div>
 		</div>
 
 
-		<script src="js/vr/HelioWebXRPolyfill.js"></script>
-
 		<video id="video" loop muted crossOrigin="anonymous" playsinline style="display:none">
 		<video id="video" loop muted crossOrigin="anonymous" playsinline style="display:none">
 			<source src="textures/MaryOculus.webm">
 			<source src="textures/MaryOculus.webm">
 			<source src="textures/MaryOculus.mp4">
 			<source src="textures/MaryOculus.mp4">

+ 1 - 0
src/renderers/WebGLRenderer.js

@@ -1790,6 +1790,7 @@ function WebGLRenderer( parameters ) {
 				material.isMeshBasicMaterial ||
 				material.isMeshBasicMaterial ||
 				material.isMeshStandardMaterial ||
 				material.isMeshStandardMaterial ||
 				material.isShaderMaterial ||
 				material.isShaderMaterial ||
+				material.isShadowMaterial ||
 				material.skinning ) {
 				material.skinning ) {
 
 
 				p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );
 				p_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );

+ 1 - 0
src/renderers/shaders/ShaderLib/shadow_vert.glsl.js

@@ -1,4 +1,5 @@
 export default /* glsl */`
 export default /* glsl */`
+#include <common>
 #include <fog_pars_vertex>
 #include <fog_pars_vertex>
 #include <shadowmap_pars_vertex>
 #include <shadowmap_pars_vertex>