super-three 0.157.1 → 0.160.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/README.md +6 -4
  2. package/build/three.cjs +3100 -1537
  3. package/build/three.js +3100 -1537
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +3093 -1538
  6. package/build/three.module.min.js +1 -1
  7. package/examples/jsm/Addons.js +291 -0
  8. package/examples/jsm/controls/FlyControls.js +26 -0
  9. package/examples/jsm/controls/OrbitControls.js +62 -41
  10. package/examples/jsm/controls/TransformControls.js +27 -11
  11. package/examples/jsm/csm/CSMShader.js +53 -48
  12. package/examples/jsm/exporters/GLTFExporter.js +151 -3
  13. package/examples/jsm/exporters/USDZExporter.js +27 -19
  14. package/examples/jsm/geometries/InstancedPointsGeometry.js +174 -0
  15. package/examples/jsm/geometries/SDFGeometryGenerator.js +144 -0
  16. package/examples/jsm/helpers/TextureHelper.js +237 -0
  17. package/examples/jsm/interactive/HTMLMesh.js +9 -2
  18. package/examples/jsm/libs/lottie_canvas.module.js +6 -1
  19. package/examples/jsm/libs/opentype.module.js +13 -75
  20. package/examples/jsm/libs/surfaceNet.js +201 -0
  21. package/examples/jsm/lines/LineMaterial.js +16 -33
  22. package/examples/jsm/loaders/ColladaLoader.js +0 -6
  23. package/examples/jsm/loaders/DRACOLoader.js +4 -3
  24. package/examples/jsm/loaders/FBXLoader.js +294 -124
  25. package/examples/jsm/loaders/GLTFLoader.js +83 -6
  26. package/examples/jsm/loaders/LUTImageLoader.js +162 -0
  27. package/examples/jsm/loaders/MaterialXLoader.js +73 -54
  28. package/examples/jsm/loaders/NRRDLoader.js +0 -13
  29. package/examples/jsm/loaders/SVGLoader.js +4 -4
  30. package/examples/jsm/loaders/USDZLoader.js +3 -17
  31. package/examples/jsm/loaders/lwo/IFFParser.js +89 -93
  32. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  33. package/examples/jsm/math/Capsule.js +0 -55
  34. package/examples/jsm/math/Octree.js +85 -7
  35. package/examples/jsm/misc/Timer.js +119 -0
  36. package/examples/jsm/misc/TubePainter.js +3 -6
  37. package/examples/jsm/modifiers/CurveModifier.js +20 -2
  38. package/examples/jsm/modifiers/SimplifyModifier.js +103 -11
  39. package/examples/jsm/modifiers/TessellateModifier.js +3 -3
  40. package/examples/jsm/nodes/Nodes.js +16 -12
  41. package/examples/jsm/nodes/accessors/CameraNode.js +18 -2
  42. package/examples/jsm/nodes/accessors/CubeTextureNode.js +5 -73
  43. package/examples/jsm/nodes/accessors/InstanceNode.js +3 -3
  44. package/examples/jsm/nodes/accessors/InstancedPointsMaterialNode.js +21 -0
  45. package/examples/jsm/nodes/accessors/MaterialNode.js +68 -31
  46. package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +11 -2
  47. package/examples/jsm/nodes/accessors/ModelNode.js +1 -2
  48. package/examples/jsm/nodes/accessors/ModelViewProjectionNode.js +12 -3
  49. package/examples/jsm/nodes/accessors/MorphNode.js +191 -16
  50. package/examples/jsm/nodes/accessors/NormalNode.js +1 -1
  51. package/examples/jsm/nodes/accessors/PositionNode.js +1 -1
  52. package/examples/jsm/nodes/accessors/ReferenceNode.js +25 -1
  53. package/examples/jsm/nodes/accessors/SkinningNode.js +13 -3
  54. package/examples/jsm/nodes/accessors/TextureNode.js +123 -37
  55. package/examples/jsm/nodes/code/CodeNode.js +3 -3
  56. package/examples/jsm/nodes/code/FunctionNode.js +1 -1
  57. package/examples/jsm/nodes/core/AssignNode.js +72 -0
  58. package/examples/jsm/nodes/core/AttributeNode.js +7 -1
  59. package/examples/jsm/nodes/core/CacheNode.js +4 -1
  60. package/examples/jsm/nodes/core/ConstNode.js +1 -1
  61. package/examples/jsm/nodes/core/LightingModel.js +3 -1
  62. package/examples/jsm/nodes/core/Node.js +13 -15
  63. package/examples/jsm/nodes/core/NodeBuilder.js +209 -42
  64. package/examples/jsm/nodes/core/NodeFrame.js +10 -8
  65. package/examples/jsm/nodes/core/NodeUniform.js +12 -0
  66. package/examples/jsm/nodes/core/NodeUtils.js +7 -9
  67. package/examples/jsm/nodes/core/OutputStructNode.js +4 -4
  68. package/examples/jsm/nodes/core/ParameterNode.js +33 -0
  69. package/examples/jsm/nodes/core/PropertyNode.js +15 -6
  70. package/examples/jsm/nodes/core/StackNode.js +7 -17
  71. package/examples/jsm/nodes/core/StructTypeNode.js +4 -4
  72. package/examples/jsm/nodes/core/TempNode.js +1 -1
  73. package/examples/jsm/nodes/core/UniformGroup.js +13 -0
  74. package/examples/jsm/nodes/core/UniformGroupNode.js +36 -0
  75. package/examples/jsm/nodes/core/UniformNode.js +17 -0
  76. package/examples/jsm/nodes/core/VarNode.js +7 -34
  77. package/examples/jsm/nodes/core/VaryingNode.js +3 -7
  78. package/examples/jsm/nodes/display/BumpMapNode.js +35 -13
  79. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +6 -10
  80. package/examples/jsm/nodes/display/GaussianBlurNode.js +170 -0
  81. package/examples/jsm/nodes/display/NormalMapNode.js +3 -1
  82. package/examples/jsm/nodes/display/PassNode.js +182 -0
  83. package/examples/jsm/nodes/display/ViewportDepthNode.js +31 -3
  84. package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +2 -2
  85. package/examples/jsm/nodes/display/ViewportNode.js +17 -10
  86. package/examples/jsm/nodes/functions/BSDF/BRDF_Sheen.js +20 -6
  87. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +8 -7
  88. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +8 -3
  89. package/examples/jsm/nodes/functions/BSDF/Schlick_to_F0.js +8 -0
  90. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +8 -0
  91. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +93 -43
  92. package/examples/jsm/nodes/gpgpu/ComputeNode.js +2 -2
  93. package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
  94. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +55 -6
  95. package/examples/jsm/nodes/lighting/DirectionalLightNode.js +1 -1
  96. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -18
  97. package/examples/jsm/nodes/lighting/LightingContextNode.js +21 -57
  98. package/examples/jsm/nodes/lighting/LightsNode.js +80 -20
  99. package/examples/jsm/nodes/lighting/PointLightNode.js +1 -1
  100. package/examples/jsm/nodes/lighting/SpotLightNode.js +1 -1
  101. package/examples/jsm/nodes/materials/InstancedPointsNodeMaterial.js +162 -0
  102. package/examples/jsm/nodes/materials/Line2NodeMaterial.js +76 -77
  103. package/examples/jsm/nodes/materials/LineDashedNodeMaterial.js +5 -5
  104. package/examples/jsm/nodes/materials/Materials.js +1 -0
  105. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +1 -0
  106. package/examples/jsm/nodes/materials/MeshNormalNodeMaterial.js +3 -3
  107. package/examples/jsm/nodes/materials/MeshPhongNodeMaterial.js +3 -3
  108. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +47 -20
  109. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +6 -6
  110. package/examples/jsm/nodes/materials/NodeMaterial.js +82 -60
  111. package/examples/jsm/nodes/materials/PointsNodeMaterial.js +0 -10
  112. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +0 -7
  113. package/examples/jsm/nodes/materialx/MaterialXNodes.js +10 -10
  114. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +128 -54
  115. package/examples/jsm/nodes/materialx/lib/mx_noise.js +1430 -618
  116. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +24 -14
  117. package/examples/jsm/nodes/math/MathNode.js +2 -0
  118. package/examples/jsm/nodes/math/OperatorNode.js +24 -27
  119. package/examples/jsm/nodes/shadernode/ShaderNode.js +158 -10
  120. package/examples/jsm/nodes/utils/ArrayElementNode.js +2 -0
  121. package/examples/jsm/nodes/utils/DiscardNode.js +3 -2
  122. package/examples/jsm/nodes/utils/FunctionOverloadingNode.js +95 -0
  123. package/examples/jsm/nodes/utils/JoinNode.js +11 -1
  124. package/examples/jsm/nodes/utils/LoopNode.js +36 -24
  125. package/examples/jsm/nodes/utils/RemapNode.js +2 -2
  126. package/examples/jsm/nodes/utils/SplitNode.js +10 -2
  127. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +3 -3
  128. package/examples/jsm/objects/InstancedPoints.js +21 -0
  129. package/examples/jsm/objects/Lensflare.js +20 -0
  130. package/examples/jsm/objects/QuadMesh.js +60 -0
  131. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -0
  132. package/examples/jsm/objects/Refractor.js +3 -0
  133. package/examples/jsm/objects/Sky.js +5 -3
  134. package/examples/jsm/objects/Water.js +5 -2
  135. package/examples/jsm/objects/Water2.js +3 -0
  136. package/examples/jsm/physics/AmmoPhysics.js +21 -0
  137. package/examples/jsm/physics/RapierPhysics.js +21 -0
  138. package/examples/jsm/postprocessing/BokehPass.js +3 -2
  139. package/examples/jsm/postprocessing/GTAOPass.js +572 -0
  140. package/examples/jsm/postprocessing/LUTPass.js +2 -1
  141. package/examples/jsm/postprocessing/OutputPass.js +3 -0
  142. package/examples/jsm/postprocessing/Pass.js +14 -3
  143. package/examples/jsm/postprocessing/SAOPass.js +0 -1
  144. package/examples/jsm/postprocessing/SMAAPass.js +0 -2
  145. package/examples/jsm/postprocessing/TAARenderPass.js +1 -2
  146. package/examples/jsm/renderers/CSS3DRenderer.js +3 -9
  147. package/examples/jsm/renderers/SVGRenderer.js +9 -6
  148. package/examples/jsm/renderers/common/Animation.js +10 -21
  149. package/examples/jsm/renderers/common/Backend.js +19 -3
  150. package/examples/jsm/renderers/common/Background.js +20 -22
  151. package/examples/jsm/renderers/common/Bindings.js +31 -22
  152. package/examples/jsm/renderers/common/ChainMap.js +3 -3
  153. package/examples/jsm/renderers/common/Color4.js +37 -0
  154. package/examples/jsm/renderers/common/Geometries.js +4 -4
  155. package/examples/jsm/renderers/common/Info.js +12 -2
  156. package/examples/jsm/renderers/common/Pipelines.js +3 -51
  157. package/examples/jsm/renderers/common/PostProcessing.js +25 -0
  158. package/examples/jsm/renderers/common/RenderContext.js +1 -1
  159. package/examples/jsm/renderers/common/RenderContexts.js +1 -1
  160. package/examples/jsm/renderers/common/RenderObject.js +21 -2
  161. package/examples/jsm/renderers/common/RenderObjects.js +5 -3
  162. package/examples/jsm/renderers/common/Renderer.js +137 -37
  163. package/examples/jsm/renderers/common/StorageTexture.js +1 -0
  164. package/examples/jsm/renderers/common/Textures.js +8 -37
  165. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +10 -2
  166. package/examples/jsm/renderers/common/nodes/NodeUniformsGroup.js +44 -0
  167. package/examples/jsm/renderers/common/nodes/Nodes.js +121 -19
  168. package/examples/jsm/renderers/webgl/WebGLBackend.js +366 -67
  169. package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +183 -38
  170. package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +92 -5
  171. package/examples/jsm/renderers/webgl/utils/WebGLCapabilities.js +36 -0
  172. package/examples/jsm/renderers/webgl/utils/WebGLExtensions.js +11 -1
  173. package/examples/jsm/renderers/webgl/utils/WebGLState.js +14 -2
  174. package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +71 -2
  175. package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +42 -0
  176. package/examples/jsm/renderers/webgl-legacy/nodes/SlotNode.js +1 -1
  177. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +33 -3
  178. package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodes.js +4 -14
  179. package/examples/jsm/renderers/webgpu/WebGPUBackend.js +188 -137
  180. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +1 -1
  181. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +241 -90
  182. package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -10
  183. package/examples/jsm/renderers/webgpu/utils/WebGPUBindingUtils.js +11 -3
  184. package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +2 -3
  185. package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +88 -6
  186. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +2 -0
  187. package/examples/jsm/shaders/AfterimageShader.js +2 -0
  188. package/examples/jsm/shaders/BasicShader.js +2 -0
  189. package/examples/jsm/shaders/BlendShader.js +2 -0
  190. package/examples/jsm/shaders/BokehShader.js +2 -0
  191. package/examples/jsm/shaders/BokehShader2.js +4 -0
  192. package/examples/jsm/shaders/BrightnessContrastShader.js +2 -0
  193. package/examples/jsm/shaders/ColorCorrectionShader.js +2 -0
  194. package/examples/jsm/shaders/DOFMipMapShader.js +2 -0
  195. package/examples/jsm/shaders/DepthLimitedBlurShader.js +5 -0
  196. package/examples/jsm/shaders/FXAAShader.js +135 -133
  197. package/examples/jsm/shaders/FilmShader.js +1 -1
  198. package/examples/jsm/shaders/FocusShader.js +2 -0
  199. package/examples/jsm/shaders/FreiChenShader.js +2 -0
  200. package/examples/jsm/shaders/GTAOShader.js +424 -0
  201. package/examples/jsm/shaders/GodRaysShader.js +8 -0
  202. package/examples/jsm/shaders/HalftoneShader.js +2 -0
  203. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +2 -0
  204. package/examples/jsm/shaders/HueSaturationShader.js +2 -0
  205. package/examples/jsm/shaders/KaleidoShader.js +2 -0
  206. package/examples/jsm/shaders/LuminosityHighPassShader.js +2 -0
  207. package/examples/jsm/shaders/LuminosityShader.js +2 -0
  208. package/examples/jsm/shaders/MMDToonShader.js +2 -0
  209. package/examples/jsm/shaders/MirrorShader.js +2 -0
  210. package/examples/jsm/shaders/NormalMapShader.js +2 -0
  211. package/examples/jsm/shaders/OutputShader.js +8 -5
  212. package/examples/jsm/shaders/PoissonDenoiseShader.js +226 -0
  213. package/examples/jsm/shaders/SAOShader.js +7 -3
  214. package/examples/jsm/shaders/SMAAShader.js +6 -0
  215. package/examples/jsm/shaders/SSAOShader.js +8 -3
  216. package/examples/jsm/shaders/SSRShader.js +6 -0
  217. package/examples/jsm/shaders/SobelOperatorShader.js +2 -0
  218. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +2 -0
  219. package/examples/jsm/shaders/TechnicolorShader.js +2 -0
  220. package/examples/jsm/shaders/TriangleBlurShader.js +2 -0
  221. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -0
  222. package/examples/jsm/shaders/VelocityShader.js +2 -0
  223. package/examples/jsm/shaders/VerticalTiltShiftShader.js +2 -0
  224. package/examples/jsm/shaders/WaterRefractionShader.js +2 -0
  225. package/examples/jsm/transpiler/AST.js +270 -0
  226. package/examples/jsm/transpiler/GLSLDecoder.js +941 -0
  227. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  228. package/examples/jsm/transpiler/TSLEncoder.js +715 -0
  229. package/examples/jsm/transpiler/Transpiler.js +18 -0
  230. package/examples/jsm/utils/SortUtils.js +158 -0
  231. package/examples/jsm/utils/TextureUtils.js +33 -21
  232. package/examples/jsm/webxr/ARButton.js +14 -0
  233. package/examples/jsm/webxr/VRButton.js +24 -9
  234. package/examples/jsm/webxr/XRButton.js +27 -11
  235. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  236. package/package.json +8 -6
  237. package/src/Three.js +1 -0
  238. package/src/constants.js +8 -1
  239. package/src/core/BufferAttribute.js +21 -2
  240. package/src/core/InterleavedBuffer.js +21 -1
  241. package/src/core/Object3D.js +60 -12
  242. package/src/core/UniformsGroup.js +7 -1
  243. package/src/extras/PMREMGenerator.js +7 -1
  244. package/src/extras/curves/LineCurve3.js +4 -0
  245. package/src/loaders/AudioLoader.js +1 -1
  246. package/src/loaders/BufferGeometryLoader.js +0 -7
  247. package/src/loaders/ImageBitmapLoader.js +25 -1
  248. package/src/loaders/MaterialLoader.js +10 -2
  249. package/src/loaders/ObjectLoader.js +49 -0
  250. package/src/materials/Material.js +27 -13
  251. package/src/materials/ShaderMaterial.js +2 -1
  252. package/src/math/Box3.js +35 -18
  253. package/src/math/ColorManagement.js +0 -16
  254. package/src/math/Quaternion.js +5 -4
  255. package/src/math/Sphere.js +2 -0
  256. package/src/math/Triangle.js +17 -5
  257. package/src/math/Vector3.js +11 -12
  258. package/src/objects/BatchedMesh.js +1020 -0
  259. package/src/objects/Skeleton.js +1 -3
  260. package/src/objects/SkinnedMesh.js +6 -7
  261. package/src/renderers/WebGL3DRenderTarget.js +2 -2
  262. package/src/renderers/WebGLArrayRenderTarget.js +2 -2
  263. package/src/renderers/WebGLRenderer.js +165 -43
  264. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -0
  265. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +19 -0
  266. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  267. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -2
  268. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -5
  269. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +31 -4
  270. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  271. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +9 -4
  272. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +8 -6
  273. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +6 -0
  274. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +9 -17
  275. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +84 -0
  276. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +6 -0
  277. package/src/renderers/shaders/ShaderChunk.js +4 -0
  278. package/src/renderers/shaders/ShaderLib/depth.glsl.js +2 -0
  279. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +2 -0
  280. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -0
  281. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -0
  282. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +3 -0
  283. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +2 -0
  284. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -0
  285. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -2
  286. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -0
  287. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +3 -0
  288. package/src/renderers/webgl/WebGLAttributes.js +39 -5
  289. package/src/renderers/webgl/WebGLBufferRenderer.js +31 -0
  290. package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
  291. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  292. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +31 -0
  293. package/src/renderers/webgl/WebGLLights.js +11 -2
  294. package/src/renderers/webgl/WebGLProgram.js +100 -51
  295. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  296. package/src/renderers/webgl/WebGLShadowMap.js +35 -0
  297. package/src/renderers/webgl/WebGLState.js +25 -4
  298. package/src/renderers/webgl/WebGLTextures.js +7 -11
  299. package/src/renderers/webgl/WebGLUniforms.js +11 -1
  300. package/src/renderers/webgl/WebGLUniformsGroups.js +72 -93
  301. package/src/renderers/webxr/WebXRManager.js +16 -0
  302. package/examples/jsm/nodes/accessors/ExtendedMaterialNode.js +0 -76
  303. package/examples/jsm/nodes/accessors/LineMaterialNode.js +0 -29
@@ -98,9 +98,9 @@ class Object3D extends EventDispatcher {
98
98
  this.matrixWorld = new Matrix4();
99
99
 
100
100
  this.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;
101
- this.matrixWorldNeedsUpdate = false;
102
101
 
103
102
  this.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer
103
+ this.matrixWorldNeedsUpdate = false;
104
104
 
105
105
  this.layers = new Layers();
106
106
  this.visible = true;
@@ -117,6 +117,10 @@ class Object3D extends EventDispatcher {
117
117
 
118
118
  }
119
119
 
120
+ onBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}
121
+
122
+ onAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}
123
+
120
124
  onBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}
121
125
 
122
126
  onAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}
@@ -457,21 +461,15 @@ class Object3D extends EventDispatcher {
457
461
 
458
462
  }
459
463
 
460
- getObjectsByProperty( name, value ) {
461
-
462
- let result = [];
464
+ getObjectsByProperty( name, value, result = [] ) {
463
465
 
464
466
  if ( this[ name ] === value ) result.push( this );
465
467
 
466
- for ( let i = 0, l = this.children.length; i < l; i ++ ) {
467
-
468
- const childResult = this.children[ i ].getObjectsByProperty( name, value );
469
-
470
- if ( childResult.length > 0 ) {
468
+ const children = this.children;
471
469
 
472
- result = result.concat( childResult );
470
+ for ( let i = 0, l = children.length; i < l; i ++ ) {
473
471
 
474
- }
472
+ children[ i ].getObjectsByProperty( name, value, result );
475
473
 
476
474
  }
477
475
 
@@ -719,6 +717,56 @@ class Object3D extends EventDispatcher {
719
717
 
720
718
  }
721
719
 
720
+ if ( this.isBatchedMesh ) {
721
+
722
+ object.type = 'BatchedMesh';
723
+ object.perObjectFrustumCulled = this.perObjectFrustumCulled;
724
+ object.sortObjects = this.sortObjects;
725
+
726
+ object.drawRanges = this._drawRanges;
727
+ object.reservedRanges = this._reservedRanges;
728
+
729
+ object.visibility = this._visibility;
730
+ object.active = this._active;
731
+ object.bounds = this._bounds.map( bound => ( {
732
+ boxInitialized: bound.boxInitialized,
733
+ boxMin: bound.box.min.toArray(),
734
+ boxMax: bound.box.max.toArray(),
735
+
736
+ sphereInitialized: bound.sphereInitialized,
737
+ sphereRadius: bound.sphere.radius,
738
+ sphereCenter: bound.sphere.center.toArray()
739
+ } ) );
740
+
741
+ object.maxGeometryCount = this._maxGeometryCount;
742
+ object.maxVertexCount = this._maxVertexCount;
743
+ object.maxIndexCount = this._maxIndexCount;
744
+
745
+ object.geometryInitialized = this._geometryInitialized;
746
+ object.geometryCount = this._geometryCount;
747
+
748
+ object.matricesTexture = this._matricesTexture.toJSON( meta );
749
+
750
+ if ( this.boundingSphere !== null ) {
751
+
752
+ object.boundingSphere = {
753
+ center: object.boundingSphere.center.toArray(),
754
+ radius: object.boundingSphere.radius
755
+ };
756
+
757
+ }
758
+
759
+ if ( this.boundingBox !== null ) {
760
+
761
+ object.boundingBox = {
762
+ min: object.boundingBox.min.toArray(),
763
+ max: object.boundingBox.max.toArray()
764
+ };
765
+
766
+ }
767
+
768
+ }
769
+
722
770
  //
723
771
 
724
772
  function serialize( library, element ) {
@@ -919,9 +967,9 @@ class Object3D extends EventDispatcher {
919
967
  this.matrixWorld.copy( source.matrixWorld );
920
968
 
921
969
  this.matrixAutoUpdate = source.matrixAutoUpdate;
922
- this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
923
970
 
924
971
  this.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;
972
+ this.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;
925
973
 
926
974
  this.layers.mask = source.layers.mask;
927
975
  this.visible = source.visible;
@@ -73,7 +73,13 @@ class UniformsGroup extends EventDispatcher {
73
73
 
74
74
  for ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {
75
75
 
76
- this.uniforms.push( uniformsSource[ i ].clone() );
76
+ const uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];
77
+
78
+ for ( let j = 0; j < uniforms.length; j ++ ) {
79
+
80
+ this.uniforms.push( uniforms[ j ].clone() );
81
+
82
+ }
77
83
 
78
84
  }
79
85
 
@@ -38,6 +38,8 @@ const MAX_SAMPLES = 20;
38
38
  const _flatCamera = /*@__PURE__*/ new OrthographicCamera();
39
39
  const _clearColor = /*@__PURE__*/ new Color();
40
40
  let _oldTarget = null;
41
+ let _oldActiveCubeFace = 0;
42
+ let _oldActiveMipmapLevel = 0;
41
43
 
42
44
  // Golden Ratio
43
45
  const PHI = ( 1 + Math.sqrt( 5 ) ) / 2;
@@ -103,6 +105,8 @@ class PMREMGenerator {
103
105
  fromScene( scene, sigma = 0, near = 0.1, far = 100 ) {
104
106
 
105
107
  _oldTarget = this._renderer.getRenderTarget();
108
+ _oldActiveCubeFace = this._renderer.getActiveCubeFace();
109
+ _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();
106
110
 
107
111
  this._setSize( 256 );
108
112
 
@@ -215,7 +219,7 @@ class PMREMGenerator {
215
219
 
216
220
  _cleanup( outputTarget ) {
217
221
 
218
- this._renderer.setRenderTarget( _oldTarget );
222
+ this._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );
219
223
  outputTarget.scissorTest = false;
220
224
  _setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );
221
225
 
@@ -234,6 +238,8 @@ class PMREMGenerator {
234
238
  }
235
239
 
236
240
  _oldTarget = this._renderer.getRenderTarget();
241
+ _oldActiveCubeFace = this._renderer.getActiveCubeFace();
242
+ _oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();
237
243
 
238
244
  const cubeUVRenderTarget = renderTarget || this._allocateTargets();
239
245
  this._textureToCubeUV( texture, cubeUVRenderTarget );
@@ -15,6 +15,7 @@ class LineCurve3 extends Curve {
15
15
  this.v2 = v2;
16
16
 
17
17
  }
18
+
18
19
  getPoint( t, optionalTarget = new Vector3() ) {
19
20
 
20
21
  const point = optionalTarget;
@@ -33,6 +34,7 @@ class LineCurve3 extends Curve {
33
34
  return point;
34
35
 
35
36
  }
37
+
36
38
  // Line curve is linear, so we can overwrite default getPointAt
37
39
  getPointAt( u, optionalTarget ) {
38
40
 
@@ -62,6 +64,7 @@ class LineCurve3 extends Curve {
62
64
  return this;
63
65
 
64
66
  }
67
+
65
68
  toJSON() {
66
69
 
67
70
  const data = super.toJSON();
@@ -72,6 +75,7 @@ class LineCurve3 extends Curve {
72
75
  return data;
73
76
 
74
77
  }
78
+
75
79
  fromJSON( json ) {
76
80
 
77
81
  super.fromJSON( json );
@@ -32,7 +32,7 @@ class AudioLoader extends Loader {
32
32
 
33
33
  onLoad( audioBuffer );
34
34
 
35
- }, handleError );
35
+ } ).catch( handleError );
36
36
 
37
37
  } catch ( e ) {
38
38
 
@@ -125,13 +125,6 @@ class BufferGeometryLoader extends Loader {
125
125
  if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;
126
126
  if ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );
127
127
 
128
- if ( attribute.updateRange !== undefined ) {
129
-
130
- bufferAttribute.updateRange.offset = attribute.updateRange.offset;
131
- bufferAttribute.updateRange.count = attribute.updateRange.count;
132
-
133
- }
134
-
135
128
  geometry.setAttribute( key, bufferAttribute );
136
129
 
137
130
  }
@@ -49,6 +49,25 @@ class ImageBitmapLoader extends Loader {
49
49
 
50
50
  scope.manager.itemStart( url );
51
51
 
52
+ // If cached is a promise, wait for it to resolve
53
+ if ( cached.then ) {
54
+
55
+ cached.then( imageBitmap => {
56
+
57
+ if ( onLoad ) onLoad( imageBitmap );
58
+
59
+ scope.manager.itemEnd( url );
60
+
61
+ } ).catch( e => {
62
+
63
+ if ( onError ) onError( e );
64
+
65
+ } );
66
+ return;
67
+
68
+ }
69
+
70
+ // If cached is not a promise (i.e., it's already an imageBitmap)
52
71
  setTimeout( function () {
53
72
 
54
73
  if ( onLoad ) onLoad( cached );
@@ -65,7 +84,7 @@ class ImageBitmapLoader extends Loader {
65
84
  fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';
66
85
  fetchOptions.headers = this.requestHeader;
67
86
 
68
- fetch( url, fetchOptions ).then( function ( res ) {
87
+ const promise = fetch( url, fetchOptions ).then( function ( res ) {
69
88
 
70
89
  return res.blob();
71
90
 
@@ -81,15 +100,20 @@ class ImageBitmapLoader extends Loader {
81
100
 
82
101
  scope.manager.itemEnd( url );
83
102
 
103
+ return imageBitmap;
104
+
84
105
  } ).catch( function ( e ) {
85
106
 
86
107
  if ( onError ) onError( e );
87
108
 
109
+ Cache.remove( url );
110
+
88
111
  scope.manager.itemError( url );
89
112
  scope.manager.itemEnd( url );
90
113
 
91
114
  } );
92
115
 
116
+ Cache.add( url, promise );
93
117
  scope.manager.itemStart( url );
94
118
 
95
119
  }
@@ -122,11 +122,18 @@ class MaterialLoader extends Loader {
122
122
  if ( json.transparent !== undefined ) material.transparent = json.transparent;
123
123
  if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;
124
124
  if ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;
125
+ if ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;
125
126
  if ( json.depthTest !== undefined ) material.depthTest = json.depthTest;
126
127
  if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;
127
128
  if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;
128
-
129
- if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;
129
+ if ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;
130
+ if ( json.blendDst !== undefined ) material.blendDst = json.blendDst;
131
+ if ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;
132
+ if ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;
133
+ if ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;
134
+ if ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;
135
+ if ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );
136
+ if ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;
130
137
  if ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;
131
138
  if ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;
132
139
  if ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;
@@ -134,6 +141,7 @@ class MaterialLoader extends Loader {
134
141
  if ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;
135
142
  if ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;
136
143
  if ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;
144
+ if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;
137
145
 
138
146
  if ( json.wireframe !== undefined ) material.wireframe = json.wireframe;
139
147
  if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;
@@ -22,6 +22,7 @@ import { Color } from '../math/Color.js';
22
22
  import { Object3D } from '../core/Object3D.js';
23
23
  import { Group } from '../objects/Group.js';
24
24
  import { InstancedMesh } from '../objects/InstancedMesh.js';
25
+ import { BatchedMesh } from '../objects/BatchedMesh.js';
25
26
  import { Sprite } from '../objects/Sprite.js';
26
27
  import { Points } from '../objects/Points.js';
27
28
  import { Line } from '../objects/Line.js';
@@ -59,6 +60,8 @@ import { Loader } from './Loader.js';
59
60
  import { FileLoader } from './FileLoader.js';
60
61
  import * as Geometries from '../geometries/Geometries.js';
61
62
  import { getTypedArray } from '../utils.js';
63
+ import { Box3 } from '../math/Box3.js';
64
+ import { Sphere } from '../math/Sphere.js';
62
65
 
63
66
  class ObjectLoader extends Loader {
64
67
 
@@ -912,6 +915,52 @@ class ObjectLoader extends Loader {
912
915
 
913
916
  break;
914
917
 
918
+ case 'BatchedMesh':
919
+
920
+ geometry = getGeometry( data.geometry );
921
+ material = getMaterial( data.material );
922
+
923
+ object = new BatchedMesh( data.maxGeometryCount, data.maxVertexCount, data.maxIndexCount, material );
924
+ object.geometry = geometry;
925
+ object.perObjectFrustumCulled = data.perObjectFrustumCulled;
926
+ object.sortObjects = data.sortObjects;
927
+
928
+ object._drawRanges = data.drawRanges;
929
+ object._reservedRanges = data.reservedRanges;
930
+
931
+ object._visibility = data.visibility;
932
+ object._active = data.active;
933
+ object._bounds = data.bounds.map( bound => {
934
+
935
+ const box = new Box3();
936
+ box.min.fromArray( bound.boxMin );
937
+ box.max.fromArray( bound.boxMax );
938
+
939
+ const sphere = new Sphere();
940
+ sphere.radius = bound.sphereRadius;
941
+ sphere.center.fromArray( bound.sphereCenter );
942
+
943
+ return {
944
+ boxInitialized: bound.boxInitialized,
945
+ box: box,
946
+
947
+ sphereInitialized: bound.sphereInitialized,
948
+ sphere: sphere
949
+ };
950
+
951
+ } );
952
+
953
+ object._maxGeometryCount = data.maxGeometryCount;
954
+ object._maxVertexCount = data.maxVertexCount;
955
+ object._maxIndexCount = data.maxIndexCount;
956
+
957
+ object._geometryInitialized = data.geometryInitialized;
958
+ object._geometryCount = data.geometryCount;
959
+
960
+ object._matricesTexture = getTexture( data.matricesTexture.uuid );
961
+
962
+ break;
963
+
915
964
  case 'LOD':
916
965
 
917
966
  object = new LOD();
@@ -1,3 +1,4 @@
1
+ import { Color } from '../math/Color.js';
1
2
  import { EventDispatcher } from '../core/EventDispatcher.js';
2
3
  import { FrontSide, NormalBlending, LessEqualDepth, AddEquation, OneMinusSrcAlphaFactor, SrcAlphaFactor, AlwaysStencilFunc, KeepStencilOp } from '../constants.js';
3
4
  import * as MathUtils from '../math/MathUtils.js';
@@ -33,6 +34,8 @@ class Material extends EventDispatcher {
33
34
  this.blendSrcAlpha = null;
34
35
  this.blendDstAlpha = null;
35
36
  this.blendEquationAlpha = null;
37
+ this.blendColor = new Color( 0, 0, 0 );
38
+ this.blendAlpha = 0;
36
39
 
37
40
  this.depthFunc = LessEqualDepth;
38
41
  this.depthTest = true;
@@ -325,19 +328,28 @@ class Material extends EventDispatcher {
325
328
  if ( this.opacity < 1 ) data.opacity = this.opacity;
326
329
  if ( this.transparent === true ) data.transparent = true;
327
330
 
328
- data.depthFunc = this.depthFunc;
329
- data.depthTest = this.depthTest;
330
- data.depthWrite = this.depthWrite;
331
- data.colorWrite = this.colorWrite;
332
-
333
- data.stencilWrite = this.stencilWrite;
334
- data.stencilWriteMask = this.stencilWriteMask;
335
- data.stencilFunc = this.stencilFunc;
336
- data.stencilRef = this.stencilRef;
337
- data.stencilFuncMask = this.stencilFuncMask;
338
- data.stencilFail = this.stencilFail;
339
- data.stencilZFail = this.stencilZFail;
340
- data.stencilZPass = this.stencilZPass;
331
+ if ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;
332
+ if ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;
333
+ if ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;
334
+ if ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;
335
+ if ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;
336
+ if ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;
337
+ if ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();
338
+ if ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;
339
+
340
+ if ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;
341
+ if ( this.depthTest === false ) data.depthTest = this.depthTest;
342
+ if ( this.depthWrite === false ) data.depthWrite = this.depthWrite;
343
+ if ( this.colorWrite === false ) data.colorWrite = this.colorWrite;
344
+
345
+ if ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;
346
+ if ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;
347
+ if ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;
348
+ if ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;
349
+ if ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;
350
+ if ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;
351
+ if ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;
352
+ if ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;
341
353
 
342
354
  // rotation (SpriteMaterial)
343
355
  if ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;
@@ -429,6 +441,8 @@ class Material extends EventDispatcher {
429
441
  this.blendSrcAlpha = source.blendSrcAlpha;
430
442
  this.blendDstAlpha = source.blendDstAlpha;
431
443
  this.blendEquationAlpha = source.blendEquationAlpha;
444
+ this.blendColor.copy( source.blendColor );
445
+ this.blendAlpha = source.blendAlpha;
432
446
 
433
447
  this.depthFunc = source.depthFunc;
434
448
  this.depthTest = source.depthTest;
@@ -36,7 +36,8 @@ class ShaderMaterial extends Material {
36
36
  derivatives: false, // set to use derivatives
37
37
  fragDepth: false, // set to use fragment depth values
38
38
  drawBuffers: false, // set to use draw buffers
39
- shaderTextureLOD: false // set to use shader texture LOD
39
+ shaderTextureLOD: false, // set to use shader texture LOD
40
+ clipCullDistance: false // set to use vertex shader clipping
40
41
  };
41
42
 
42
43
  // When rendered geometry doesn't include these attributes but the material does,
package/src/math/Box3.js CHANGED
@@ -159,37 +159,53 @@ class Box3 {
159
159
 
160
160
  object.updateWorldMatrix( false, false );
161
161
 
162
- if ( object.boundingBox !== undefined ) {
162
+ const geometry = object.geometry;
163
163
 
164
- if ( object.boundingBox === null ) {
164
+ if ( geometry !== undefined ) {
165
165
 
166
- object.computeBoundingBox();
166
+ const positionAttribute = geometry.getAttribute( 'position' );
167
167
 
168
- }
168
+ // precise AABB computation based on vertex data requires at least a position attribute.
169
+ // instancing isn't supported so far and uses the normal (conservative) code path.
169
170
 
170
- _box.copy( object.boundingBox );
171
- _box.applyMatrix4( object.matrixWorld );
171
+ if ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {
172
172
 
173
- this.union( _box );
173
+ for ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {
174
174
 
175
- } else {
175
+ if ( object.isMesh === true ) {
176
+
177
+ object.getVertexPosition( i, _vector );
178
+
179
+ } else {
180
+
181
+ _vector.fromBufferAttribute( positionAttribute, i );
182
+
183
+ }
184
+
185
+ _vector.applyMatrix4( object.matrixWorld );
186
+ this.expandByPoint( _vector );
176
187
 
177
- const geometry = object.geometry;
188
+ }
189
+
190
+ } else {
178
191
 
179
- if ( geometry !== undefined ) {
192
+ if ( object.boundingBox !== undefined ) {
180
193
 
181
- if ( precise && geometry.attributes !== undefined && geometry.attributes.position !== undefined ) {
194
+ // object-level bounding box
182
195
 
183
- const position = geometry.attributes.position;
184
- for ( let i = 0, l = position.count; i < l; i ++ ) {
196
+ if ( object.boundingBox === null ) {
185
197
 
186
- _vector.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );
187
- this.expandByPoint( _vector );
198
+ object.computeBoundingBox();
188
199
 
189
200
  }
190
201
 
202
+ _box.copy( object.boundingBox );
203
+
204
+
191
205
  } else {
192
206
 
207
+ // geometry-level bounding box
208
+
193
209
  if ( geometry.boundingBox === null ) {
194
210
 
195
211
  geometry.computeBoundingBox();
@@ -197,12 +213,13 @@ class Box3 {
197
213
  }
198
214
 
199
215
  _box.copy( geometry.boundingBox );
200
- _box.applyMatrix4( object.matrixWorld );
201
-
202
- this.union( _box );
203
216
 
204
217
  }
205
218
 
219
+ _box.applyMatrix4( object.matrixWorld );
220
+
221
+ this.union( _box );
222
+
206
223
  }
207
224
 
208
225
  }
@@ -64,22 +64,6 @@ export const ColorManagement = {
64
64
 
65
65
  _workingColorSpace: LinearSRGBColorSpace,
66
66
 
67
- get legacyMode() {
68
-
69
- console.warn( 'THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150.' );
70
-
71
- return ! this.enabled;
72
-
73
- },
74
-
75
- set legacyMode( legacyMode ) {
76
-
77
- console.warn( 'THREE.ColorManagement: .legacyMode=false renamed to .enabled=true in r150.' );
78
-
79
- this.enabled = ! legacyMode;
80
-
81
- },
82
-
83
67
  get workingColorSpace() {
84
68
 
85
69
  return this._workingColorSpace;
@@ -198,7 +198,7 @@ class Quaternion {
198
198
 
199
199
  }
200
200
 
201
- setFromEuler( euler, update ) {
201
+ setFromEuler( euler, update = true ) {
202
202
 
203
203
  const x = euler._x, y = euler._y, z = euler._z, order = euler._order;
204
204
 
@@ -266,7 +266,7 @@ class Quaternion {
266
266
 
267
267
  }
268
268
 
269
- if ( update !== false ) this._onChangeCallback();
269
+ if ( update === true ) this._onChangeCallback();
270
270
 
271
271
  return this;
272
272
 
@@ -561,8 +561,7 @@ class Quaternion {
561
561
  this._y = s * y + t * this._y;
562
562
  this._z = s * z + t * this._z;
563
563
 
564
- this.normalize();
565
- this._onChangeCallback();
564
+ this.normalize(); // normalize calls _onChangeCallback()
566
565
 
567
566
  return this;
568
567
 
@@ -650,6 +649,8 @@ class Quaternion {
650
649
  this._z = attribute.getZ( index );
651
650
  this._w = attribute.getW( index );
652
651
 
652
+ this._onChangeCallback();
653
+
653
654
  return this;
654
655
 
655
656
  }
@@ -9,6 +9,8 @@ class Sphere {
9
9
 
10
10
  constructor( center = new Vector3(), radius = - 1 ) {
11
11
 
12
+ this.isSphere = true;
13
+
12
14
  this.center = center;
13
15
  this.radius = radius;
14
16
 
@@ -60,9 +60,8 @@ class Triangle {
60
60
  // collinear or singular triangle
61
61
  if ( denom === 0 ) {
62
62
 
63
- // arbitrary location outside of triangle?
64
- // not sure if this is the best idea, maybe should be returning undefined
65
- return target.set( - 2, - 1, - 1 );
63
+ target.set( 0, 0, 0 );
64
+ return null;
66
65
 
67
66
  }
68
67
 
@@ -77,7 +76,12 @@ class Triangle {
77
76
 
78
77
  static containsPoint( point, a, b, c ) {
79
78
 
80
- this.getBarycoord( point, a, b, c, _v3 );
79
+ // if the triangle is degenerate then we can't contain a point
80
+ if ( this.getBarycoord( point, a, b, c, _v3 ) === null ) {
81
+
82
+ return false;
83
+
84
+ }
81
85
 
82
86
  return ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );
83
87
 
@@ -99,7 +103,15 @@ class Triangle {
99
103
 
100
104
  static getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {
101
105
 
102
- this.getBarycoord( point, p1, p2, p3, _v3 );
106
+ if ( this.getBarycoord( point, p1, p2, p3, _v3 ) === null ) {
107
+
108
+ target.x = 0;
109
+ target.y = 0;
110
+ if ( 'z' in target ) target.z = 0;
111
+ if ( 'w' in target ) target.w = 0;
112
+ return null;
113
+
114
+ }
103
115
 
104
116
  target.setScalar( 0 );
105
117
  target.addScaledVector( v1, _v3.x );