super-three 0.165.0 → 0.167.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 (370) hide show
  1. package/build/three.cjs +706 -383
  2. package/build/three.module.js +702 -384
  3. package/build/three.module.min.js +1 -1
  4. package/build/three.webgpu.js +76086 -0
  5. package/build/three.webgpu.min.js +6 -0
  6. package/examples/jsm/Addons.js +2 -1
  7. package/examples/jsm/csm/CSMShader.js +4 -4
  8. package/examples/jsm/exporters/GLTFExporter.js +7 -3
  9. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  10. package/examples/jsm/helpers/ViewHelper.js +51 -2
  11. package/examples/jsm/libs/tween.module.js +64 -75
  12. package/examples/jsm/lights/RectAreaLightTexturesLib.js +91 -0
  13. package/examples/jsm/lights/RectAreaLightUniformsLib.js +8 -63
  14. package/examples/jsm/lines/webgpu/Line2.js +20 -0
  15. package/examples/jsm/lines/webgpu/LineSegments2.js +376 -0
  16. package/examples/jsm/loaders/FBXLoader.js +23 -45
  17. package/examples/jsm/loaders/GLTFLoader.js +10 -4
  18. package/examples/jsm/loaders/MaterialXLoader.js +2 -9
  19. package/examples/jsm/loaders/USDZLoader.js +124 -76
  20. package/examples/jsm/loaders/UltraHDRLoader.js +583 -0
  21. package/examples/jsm/loaders/VTKLoader.js +76 -3
  22. package/examples/jsm/misc/GPUComputationRenderer.js +9 -19
  23. package/examples/jsm/modifiers/SimplifyModifier.js +2 -1
  24. package/examples/jsm/objects/InstancedPoints.js +2 -2
  25. package/examples/jsm/postprocessing/RenderTransitionPass.js +13 -38
  26. package/examples/jsm/postprocessing/SSAOPass.js +6 -9
  27. package/examples/jsm/postprocessing/UnrealBloomPass.js +4 -4
  28. package/examples/jsm/shaders/ColorifyShader.js +1 -2
  29. package/examples/jsm/shaders/FXAAShader.js +0 -2
  30. package/examples/jsm/shaders/GTAOShader.js +1 -1
  31. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -3
  32. package/examples/jsm/transpiler/GLSLDecoder.js +46 -4
  33. package/examples/jsm/transpiler/TSLEncoder.js +17 -15
  34. package/package.json +7 -6
  35. package/src/Three.WebGPU.js +194 -0
  36. package/src/Three.js +2 -0
  37. package/src/constants.js +4 -1
  38. package/src/core/Object3D.js +22 -22
  39. package/src/extras/TextureUtils.js +210 -0
  40. package/src/lights/Light.js +1 -0
  41. package/src/lights/LightShadow.js +5 -0
  42. package/{examples/jsm/lights → src/lights/webgpu}/IESSpotLight.js +1 -1
  43. package/src/loaders/ObjectLoader.js +33 -2
  44. package/src/materials/Material.js +13 -4
  45. package/src/math/Box2.js +4 -4
  46. package/src/math/Box3.js +6 -6
  47. package/src/math/ColorManagement.js +10 -0
  48. package/src/math/Matrix2.js +54 -0
  49. package/src/math/Vector4.js +13 -0
  50. package/{examples/jsm → src}/nodes/Nodes.js +30 -12
  51. package/{examples/jsm → src}/nodes/accessors/BatchNode.js +28 -10
  52. package/{examples/jsm → src}/nodes/accessors/BufferAttributeNode.js +36 -1
  53. package/src/nodes/accessors/CameraNode.js +19 -0
  54. package/{examples/jsm → src}/nodes/accessors/CubeTextureNode.js +22 -5
  55. package/src/nodes/accessors/InstanceNode.js +140 -0
  56. package/{examples/jsm → src}/nodes/accessors/MaterialNode.js +22 -2
  57. package/{examples/jsm → src}/nodes/accessors/ModelNode.js +2 -1
  58. package/{examples/jsm → src}/nodes/accessors/MorphNode.js +24 -20
  59. package/{examples/jsm → src}/nodes/accessors/NormalNode.js +1 -1
  60. package/{examples/jsm → src}/nodes/accessors/Object3DNode.js +1 -1
  61. package/{examples/jsm → src}/nodes/accessors/ReferenceNode.js +1 -1
  62. package/{examples/jsm → src}/nodes/accessors/ReflectVectorNode.js +4 -0
  63. package/{examples/jsm → src}/nodes/accessors/StorageBufferNode.js +50 -1
  64. package/{examples/jsm → src}/nodes/accessors/StorageTextureNode.js +12 -3
  65. package/{examples/jsm → src}/nodes/accessors/TextureNode.js +55 -18
  66. package/{examples/jsm → src}/nodes/accessors/UniformsNode.js +7 -1
  67. package/{examples/jsm → src}/nodes/accessors/VertexColorNode.js +2 -1
  68. package/{examples/jsm → src}/nodes/code/ScriptableNode.js +14 -0
  69. package/{examples/jsm → src}/nodes/code/ScriptableValueNode.js +2 -1
  70. package/{examples/jsm → src}/nodes/core/AttributeNode.js +20 -6
  71. package/{examples/jsm → src}/nodes/core/CacheNode.js +7 -10
  72. package/{examples/jsm → src}/nodes/core/IndexNode.js +6 -0
  73. package/{examples/jsm → src}/nodes/core/LightingModel.js +2 -2
  74. package/src/nodes/core/MRTNode.js +76 -0
  75. package/{examples/jsm → src}/nodes/core/Node.js +18 -12
  76. package/{examples/jsm → src}/nodes/core/NodeBuilder.js +175 -37
  77. package/src/nodes/core/NodeCache.js +36 -0
  78. package/{examples/jsm → src}/nodes/core/NodeFrame.js +42 -0
  79. package/{examples/jsm → src}/nodes/core/NodeFunction.js +2 -2
  80. package/{examples/jsm → src}/nodes/core/NodeUniform.js +1 -2
  81. package/{examples/jsm → src}/nodes/core/NodeUtils.js +6 -1
  82. package/{examples/jsm → src}/nodes/core/PropertyNode.js +1 -0
  83. package/{examples/jsm → src}/nodes/core/TempNode.js +2 -2
  84. package/{examples/jsm → src}/nodes/core/UniformGroupNode.js +20 -0
  85. package/{examples/jsm → src}/nodes/core/UniformNode.js +10 -1
  86. package/{examples/jsm → src}/nodes/core/VarNode.js +2 -6
  87. package/{examples/jsm → src}/nodes/core/VaryingNode.js +8 -0
  88. package/{examples/jsm → src}/nodes/display/AfterImageNode.js +19 -27
  89. package/{examples/jsm → src}/nodes/display/AnamorphicNode.js +18 -21
  90. package/src/nodes/display/BloomNode.js +333 -0
  91. package/{examples/jsm → src}/nodes/display/ColorAdjustmentNode.js +7 -2
  92. package/{examples/jsm → src}/nodes/display/ColorSpaceNode.js +1 -1
  93. package/src/nodes/display/DenoiseNode.js +198 -0
  94. package/src/nodes/display/DepthOfFieldNode.js +119 -0
  95. package/src/nodes/display/DotScreenNode.js +75 -0
  96. package/src/nodes/display/FXAANode.js +327 -0
  97. package/src/nodes/display/FilmNode.js +52 -0
  98. package/{examples/jsm → src}/nodes/display/FrontFacingNode.js +2 -1
  99. package/src/nodes/display/GTAONode.js +324 -0
  100. package/{examples/jsm → src}/nodes/display/GaussianBlurNode.js +34 -17
  101. package/src/nodes/display/Lut3DNode.js +53 -0
  102. package/{examples/jsm → src}/nodes/display/NormalMapNode.js +1 -1
  103. package/src/nodes/display/PassNode.js +291 -0
  104. package/src/nodes/display/PixelationPassNode.js +201 -0
  105. package/src/nodes/display/RGBShiftNode.js +49 -0
  106. package/src/nodes/display/RenderOutputNode.js +56 -0
  107. package/src/nodes/display/SobelOperatorNode.js +121 -0
  108. package/{examples/jsm → src}/nodes/display/ToneMappingNode.js +44 -5
  109. package/src/nodes/display/TransitionNode.js +76 -0
  110. package/{examples/jsm → src}/nodes/display/ViewportDepthNode.js +39 -16
  111. package/{examples/jsm → src}/nodes/display/ViewportDepthTextureNode.js +2 -1
  112. package/{examples/jsm → src}/nodes/display/ViewportNode.js +2 -1
  113. package/{examples/jsm → src}/nodes/display/ViewportSharedTextureNode.js +2 -1
  114. package/{examples/jsm → src}/nodes/display/ViewportTextureNode.js +5 -2
  115. package/src/nodes/functions/BSDF/LTC.js +131 -0
  116. package/src/nodes/functions/BasicLightingModel.js +78 -0
  117. package/{examples/jsm → src}/nodes/functions/PhongLightingModel.js +5 -3
  118. package/{examples/jsm → src}/nodes/functions/PhysicalLightingModel.js +42 -1
  119. package/{examples/jsm → src}/nodes/functions/ToonLightingModel.js +3 -1
  120. package/{examples/jsm → src}/nodes/geometry/RangeNode.js +19 -6
  121. package/{examples/jsm → src}/nodes/lighting/AONode.js +1 -4
  122. package/{examples/jsm → src}/nodes/lighting/AmbientLightNode.js +1 -1
  123. package/src/nodes/lighting/AnalyticLightNode.js +333 -0
  124. package/src/nodes/lighting/BasicEnvironmentNode.js +26 -0
  125. package/src/nodes/lighting/BasicLightMapNode.js +29 -0
  126. package/{examples/jsm → src}/nodes/lighting/DirectionalLightNode.js +2 -3
  127. package/{examples/jsm → src}/nodes/lighting/EnvironmentNode.js +5 -4
  128. package/{examples/jsm → src}/nodes/lighting/HemisphereLightNode.js +2 -1
  129. package/{examples/jsm → src}/nodes/lighting/IESSpotLightNode.js +1 -1
  130. package/{examples/jsm → src}/nodes/lighting/LightingNode.js +2 -0
  131. package/{examples/jsm → src}/nodes/lighting/LightsNode.js +1 -3
  132. package/{examples/jsm → src}/nodes/lighting/PointLightNode.js +2 -3
  133. package/src/nodes/lighting/RectAreaLightNode.js +97 -0
  134. package/{examples/jsm → src}/nodes/lighting/SpotLightNode.js +2 -3
  135. package/{examples/jsm → src}/nodes/loaders/NodeLoader.js +3 -1
  136. package/{examples/jsm → src}/nodes/loaders/NodeMaterialLoader.js +2 -1
  137. package/{examples/jsm → src}/nodes/loaders/NodeObjectLoader.js +2 -1
  138. package/{examples/jsm → src}/nodes/materials/InstancedPointsNodeMaterial.js +3 -3
  139. package/{examples/jsm → src}/nodes/materials/Line2NodeMaterial.js +3 -3
  140. package/{examples/jsm → src}/nodes/materials/LineBasicNodeMaterial.js +3 -3
  141. package/{examples/jsm → src}/nodes/materials/LineDashedNodeMaterial.js +4 -3
  142. package/src/nodes/materials/MeshBasicNodeMaterial.js +73 -0
  143. package/{examples/jsm → src}/nodes/materials/MeshLambertNodeMaterial.js +12 -3
  144. package/{examples/jsm → src}/nodes/materials/MeshMatcapNodeMaterial.js +6 -5
  145. package/{examples/jsm → src}/nodes/materials/MeshNormalNodeMaterial.js +5 -3
  146. package/{examples/jsm → src}/nodes/materials/MeshPhongNodeMaterial.js +11 -3
  147. package/{examples/jsm → src}/nodes/materials/MeshPhysicalNodeMaterial.js +5 -4
  148. package/{examples/jsm → src}/nodes/materials/MeshStandardNodeMaterial.js +14 -3
  149. package/{examples/jsm → src}/nodes/materials/MeshToonNodeMaterial.js +3 -3
  150. package/{examples/jsm → src}/nodes/materials/NodeMaterial.js +85 -20
  151. package/{examples/jsm → src}/nodes/materials/PointsNodeMaterial.js +3 -3
  152. package/{examples/jsm → src}/nodes/materials/ShadowNodeMaterial.js +3 -3
  153. package/{examples/jsm → src}/nodes/materials/SpriteNodeMaterial.js +3 -3
  154. package/{examples/jsm → src}/nodes/materialx/lib/mx_hsv.js +9 -17
  155. package/{examples/jsm → src}/nodes/materialx/lib/mx_noise.js +474 -577
  156. package/{examples/jsm → src}/nodes/materialx/lib/mx_transform_color.js +2 -8
  157. package/{examples/jsm → src}/nodes/math/CondNode.js +13 -6
  158. package/{examples/jsm → src}/nodes/math/MathNode.js +14 -1
  159. package/{examples/jsm → src}/nodes/math/OperatorNode.js +6 -6
  160. package/{examples/jsm → src}/nodes/parsers/GLSLNodeFunction.js +7 -7
  161. package/{examples/jsm → src}/nodes/pmrem/PMREMNode.js +2 -1
  162. package/{examples/jsm → src}/nodes/shadernode/ShaderNode.js +2 -0
  163. package/{examples/jsm → src}/nodes/utils/DiscardNode.js +1 -0
  164. package/{examples/jsm → src}/nodes/utils/FunctionOverloadingNode.js +2 -0
  165. package/{examples/jsm → src}/nodes/utils/LoopNode.js +7 -6
  166. package/{examples/jsm → src}/nodes/utils/MaxMipLevelNode.js +8 -2
  167. package/src/nodes/utils/RTTNode.js +130 -0
  168. package/{examples/jsm → src}/nodes/utils/ReflectorNode.js +9 -1
  169. package/src/objects/BatchedMesh.js +168 -188
  170. package/src/objects/InstancedMesh.js +1 -1
  171. package/src/renderers/WebGLRenderer.js +38 -25
  172. package/{examples/jsm → src}/renderers/common/Attributes.js +2 -1
  173. package/{examples/jsm → src}/renderers/common/Backend.js +30 -27
  174. package/{examples/jsm → src}/renderers/common/Background.js +9 -3
  175. package/src/renderers/common/BindGroup.js +16 -0
  176. package/{examples/jsm → src}/renderers/common/Bindings.js +38 -23
  177. package/{examples/jsm → src}/renderers/common/ClippingContext.js +4 -2
  178. package/{examples/jsm → src}/renderers/common/Color4.js +1 -1
  179. package/{examples/jsm → src}/renderers/common/CubeRenderTarget.js +7 -1
  180. package/{examples/jsm → src}/renderers/common/Geometries.js +37 -5
  181. package/{examples/jsm → src}/renderers/common/Info.js +34 -6
  182. package/src/renderers/common/PostProcessing.js +87 -0
  183. package/{examples/jsm/objects → src/renderers/common}/QuadMesh.js +6 -3
  184. package/{examples/jsm → src}/renderers/common/RenderContext.js +1 -1
  185. package/{examples/jsm → src}/renderers/common/RenderContexts.js +1 -1
  186. package/{examples/jsm → src}/renderers/common/RenderObject.js +44 -11
  187. package/{examples/jsm → src}/renderers/common/Renderer.js +84 -32
  188. package/{examples/jsm → src}/renderers/common/SampledTexture.js +2 -2
  189. package/{examples/jsm → src}/renderers/common/StorageBufferAttribute.js +1 -1
  190. package/{examples/jsm → src}/renderers/common/StorageInstancedBufferAttribute.js +1 -1
  191. package/{examples/jsm → src}/renderers/common/StorageTexture.js +2 -1
  192. package/{examples/jsm → src}/renderers/common/Textures.js +6 -2
  193. package/{examples/jsm → src}/renderers/common/Uniform.js +9 -4
  194. package/{examples/jsm → src}/renderers/common/UniformsGroup.js +69 -31
  195. package/{examples/jsm → src}/renderers/common/extras/PMREMGenerator.js +13 -12
  196. package/src/renderers/common/nodes/NodeBuilderState.js +58 -0
  197. package/{examples/jsm → src}/renderers/common/nodes/NodeSampledTexture.js +6 -5
  198. package/{examples/jsm → src}/renderers/common/nodes/NodeSampler.js +2 -1
  199. package/{examples/jsm → src}/renderers/common/nodes/NodeStorageBuffer.js +5 -1
  200. package/{examples/jsm → src}/renderers/common/nodes/NodeUniform.js +3 -3
  201. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformBuffer.js +2 -1
  202. package/{examples/jsm → src}/renderers/common/nodes/NodeUniformsGroup.js +2 -8
  203. package/{examples/jsm → src}/renderers/common/nodes/Nodes.js +37 -16
  204. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +16 -1
  205. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
  206. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +1 -1
  207. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +0 -9
  208. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -10
  209. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +3 -3
  210. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +45 -13
  211. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -4
  212. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +3 -0
  213. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +3 -3
  214. package/src/renderers/shaders/ShaderLib/depth.glsl.js +8 -0
  215. package/src/renderers/shaders/UniformsLib.js +3 -0
  216. package/src/renderers/webgl/WebGLAttributes.js +2 -2
  217. package/src/renderers/webgl/WebGLBufferRenderer.js +6 -19
  218. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +6 -18
  219. package/src/renderers/webgl/WebGLLights.js +6 -0
  220. package/src/renderers/webgl/WebGLProgram.js +26 -0
  221. package/src/renderers/webgl/WebGLPrograms.js +1 -1
  222. package/src/renderers/webgl/WebGLTextures.js +14 -53
  223. package/src/renderers/webgl/WebGLUniforms.js +12 -2
  224. package/src/renderers/webgl/WebGLUniformsGroups.js +7 -7
  225. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBackend.js +156 -54
  226. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/nodes/GLSLNodeBuilder.js +178 -43
  227. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLAttributeUtils.js +2 -2
  228. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLConstants.js +1 -0
  229. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLExtensions.js +2 -0
  230. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLState.js +1 -1
  231. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLTextureUtils.js +34 -2
  232. package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLUtils.js +1 -1
  233. package/{examples/jsm → src}/renderers/webgpu/WebGPUBackend.js +164 -76
  234. package/{examples/jsm → src}/renderers/webgpu/WebGPURenderer.js +2 -2
  235. package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeBuilder.js +194 -56
  236. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +159 -0
  237. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  238. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUBindingUtils.js +20 -13
  239. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUConstants.js +3 -1
  240. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUPipelineUtils.js +28 -21
  241. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTextureUtils.js +40 -23
  242. package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUUtils.js +24 -3
  243. package/src/renderers/webxr/WebXRDepthSensing.js +6 -0
  244. package/src/renderers/webxr/WebXRManager.js +6 -0
  245. package/src/textures/CompressedArrayTexture.js +1 -1
  246. package/examples/jsm/nodes/accessors/CameraNode.js +0 -12
  247. package/examples/jsm/nodes/accessors/InstanceNode.js +0 -94
  248. package/examples/jsm/nodes/core/NodeCache.js +0 -26
  249. package/examples/jsm/nodes/display/PassNode.js +0 -201
  250. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +0 -256
  251. package/examples/jsm/nodes/materials/MeshBasicNodeMaterial.js +0 -28
  252. package/examples/jsm/renderers/common/PostProcessing.js +0 -33
  253. package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +0 -44
  254. package/examples/jsm/renderers/webgpu/nodes/WGSLNodeFunction.js +0 -104
  255. /package/{examples/jsm → src}/nodes/accessors/AccessorsUtils.js +0 -0
  256. /package/{examples/jsm → src}/nodes/accessors/BitangentNode.js +0 -0
  257. /package/{examples/jsm → src}/nodes/accessors/BufferNode.js +0 -0
  258. /package/{examples/jsm → src}/nodes/accessors/ClippingNode.js +0 -0
  259. /package/{examples/jsm → src}/nodes/accessors/InstancedPointsMaterialNode.js +0 -0
  260. /package/{examples/jsm → src}/nodes/accessors/MaterialReferenceNode.js +0 -0
  261. /package/{examples/jsm → src}/nodes/accessors/ModelViewProjectionNode.js +0 -0
  262. /package/{examples/jsm → src}/nodes/accessors/PointUVNode.js +0 -0
  263. /package/{examples/jsm → src}/nodes/accessors/PositionNode.js +0 -0
  264. /package/{examples/jsm → src}/nodes/accessors/RendererReferenceNode.js +0 -0
  265. /package/{examples/jsm → src}/nodes/accessors/SceneNode.js +0 -0
  266. /package/{examples/jsm → src}/nodes/accessors/SkinningNode.js +0 -0
  267. /package/{examples/jsm → src}/nodes/accessors/TangentNode.js +0 -0
  268. /package/{examples/jsm → src}/nodes/accessors/Texture3DNode.js +0 -0
  269. /package/{examples/jsm → src}/nodes/accessors/TextureBicubicNode.js +0 -0
  270. /package/{examples/jsm → src}/nodes/accessors/TextureSizeNode.js +0 -0
  271. /package/{examples/jsm → src}/nodes/accessors/UVNode.js +0 -0
  272. /package/{examples/jsm → src}/nodes/accessors/UserDataNode.js +0 -0
  273. /package/{examples/jsm → src}/nodes/code/CodeNode.js +0 -0
  274. /package/{examples/jsm → src}/nodes/code/ExpressionNode.js +0 -0
  275. /package/{examples/jsm → src}/nodes/code/FunctionCallNode.js +0 -0
  276. /package/{examples/jsm → src}/nodes/code/FunctionNode.js +0 -0
  277. /package/{examples/jsm → src}/nodes/core/AssignNode.js +0 -0
  278. /package/{examples/jsm → src}/nodes/core/BypassNode.js +0 -0
  279. /package/{examples/jsm → src}/nodes/core/ConstNode.js +0 -0
  280. /package/{examples/jsm → src}/nodes/core/ContextNode.js +0 -0
  281. /package/{examples/jsm → src}/nodes/core/InputNode.js +0 -0
  282. /package/{examples/jsm → src}/nodes/core/NodeAttribute.js +0 -0
  283. /package/{examples/jsm → src}/nodes/core/NodeCode.js +0 -0
  284. /package/{examples/jsm → src}/nodes/core/NodeFunctionInput.js +0 -0
  285. /package/{examples/jsm → src}/nodes/core/NodeKeywords.js +0 -0
  286. /package/{examples/jsm → src}/nodes/core/NodeParser.js +0 -0
  287. /package/{examples/jsm → src}/nodes/core/NodeVar.js +0 -0
  288. /package/{examples/jsm → src}/nodes/core/NodeVarying.js +0 -0
  289. /package/{examples/jsm → src}/nodes/core/OutputStructNode.js +0 -0
  290. /package/{examples/jsm → src}/nodes/core/ParameterNode.js +0 -0
  291. /package/{examples/jsm → src}/nodes/core/StackNode.js +0 -0
  292. /package/{examples/jsm → src}/nodes/core/StructTypeNode.js +0 -0
  293. /package/{examples/jsm → src}/nodes/core/UniformGroup.js +0 -0
  294. /package/{examples/jsm → src}/nodes/core/constants.js +0 -0
  295. /package/{examples/jsm → src}/nodes/display/BlendModeNode.js +0 -0
  296. /package/{examples/jsm → src}/nodes/display/BumpMapNode.js +0 -0
  297. /package/{examples/jsm → src}/nodes/display/PosterizeNode.js +0 -0
  298. /package/{examples/jsm → src}/nodes/fog/FogExp2Node.js +0 -0
  299. /package/{examples/jsm → src}/nodes/fog/FogNode.js +0 -0
  300. /package/{examples/jsm → src}/nodes/fog/FogRangeNode.js +0 -0
  301. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_GGX.js +0 -0
  302. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Lambert.js +0 -0
  303. /package/{examples/jsm → src}/nodes/functions/BSDF/BRDF_Sheen.js +0 -0
  304. /package/{examples/jsm → src}/nodes/functions/BSDF/DFGApprox.js +0 -0
  305. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX.js +0 -0
  306. /package/{examples/jsm → src}/nodes/functions/BSDF/D_GGX_Anisotropic.js +0 -0
  307. /package/{examples/jsm → src}/nodes/functions/BSDF/EnvironmentBRDF.js +0 -0
  308. /package/{examples/jsm → src}/nodes/functions/BSDF/F_Schlick.js +0 -0
  309. /package/{examples/jsm → src}/nodes/functions/BSDF/Schlick_to_F0.js +0 -0
  310. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +0 -0
  311. /package/{examples/jsm → src}/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +0 -0
  312. /package/{examples/jsm → src}/nodes/functions/ShadowMaskModel.js +0 -0
  313. /package/{examples/jsm → src}/nodes/functions/material/getGeometryRoughness.js +0 -0
  314. /package/{examples/jsm → src}/nodes/functions/material/getRoughness.js +0 -0
  315. /package/{examples/jsm → src}/nodes/gpgpu/ComputeNode.js +0 -0
  316. /package/{examples/jsm → src}/nodes/lighting/IrradianceNode.js +0 -0
  317. /package/{examples/jsm → src}/nodes/lighting/LightNode.js +0 -0
  318. /package/{examples/jsm → src}/nodes/lighting/LightUtils.js +0 -0
  319. /package/{examples/jsm → src}/nodes/lighting/LightingContextNode.js +0 -0
  320. /package/{examples/jsm → src}/nodes/materials/Materials.js +0 -0
  321. /package/{examples/jsm → src}/nodes/materials/MeshSSSNodeMaterial.js +0 -0
  322. /package/{examples/jsm → src}/nodes/materials/VolumeNodeMaterial.js +0 -0
  323. /package/{examples/jsm → src}/nodes/materialx/DISCLAIMER.md +0 -0
  324. /package/{examples/jsm → src}/nodes/materialx/MaterialXNodes.js +0 -0
  325. /package/{examples/jsm → src}/nodes/math/HashNode.js +0 -0
  326. /package/{examples/jsm → src}/nodes/math/MathUtils.js +0 -0
  327. /package/{examples/jsm → src}/nodes/math/TriNoise3D.js +0 -0
  328. /package/{examples/jsm → src}/nodes/parsers/GLSLNodeParser.js +0 -0
  329. /package/{examples/jsm → src}/nodes/pmrem/PMREMUtils.js +0 -0
  330. /package/{examples/jsm → src}/nodes/procedural/CheckerNode.js +0 -0
  331. /package/{examples/jsm → src}/nodes/utils/ArrayElementNode.js +0 -0
  332. /package/{examples/jsm → src}/nodes/utils/ConvertNode.js +0 -0
  333. /package/{examples/jsm → src}/nodes/utils/EquirectUVNode.js +0 -0
  334. /package/{examples/jsm → src}/nodes/utils/JoinNode.js +0 -0
  335. /package/{examples/jsm → src}/nodes/utils/MatcapUVNode.js +0 -0
  336. /package/{examples/jsm → src}/nodes/utils/OscNode.js +0 -0
  337. /package/{examples/jsm → src}/nodes/utils/PackingNode.js +0 -0
  338. /package/{examples/jsm → src}/nodes/utils/RemapNode.js +0 -0
  339. /package/{examples/jsm → src}/nodes/utils/RotateNode.js +0 -0
  340. /package/{examples/jsm → src}/nodes/utils/RotateUVNode.js +0 -0
  341. /package/{examples/jsm → src}/nodes/utils/SetNode.js +0 -0
  342. /package/{examples/jsm → src}/nodes/utils/SplitNode.js +0 -0
  343. /package/{examples/jsm → src}/nodes/utils/SpriteSheetUVNode.js +0 -0
  344. /package/{examples/jsm → src}/nodes/utils/StorageArrayElementNode.js +0 -0
  345. /package/{examples/jsm → src}/nodes/utils/TimerNode.js +0 -0
  346. /package/{examples/jsm → src}/nodes/utils/TriplanarTexturesNode.js +0 -0
  347. /package/{examples/jsm → src}/renderers/common/Animation.js +0 -0
  348. /package/{examples/jsm → src}/renderers/common/Binding.js +0 -0
  349. /package/{examples/jsm → src}/renderers/common/Buffer.js +0 -0
  350. /package/{examples/jsm → src}/renderers/common/BufferUtils.js +0 -0
  351. /package/{examples/jsm → src}/renderers/common/ChainMap.js +0 -0
  352. /package/{examples/jsm → src}/renderers/common/ComputePipeline.js +0 -0
  353. /package/{examples/jsm → src}/renderers/common/Constants.js +0 -0
  354. /package/{examples/jsm → src}/renderers/common/DataMap.js +0 -0
  355. /package/{examples/jsm → src}/renderers/common/Pipeline.js +0 -0
  356. /package/{examples/jsm → src}/renderers/common/Pipelines.js +0 -0
  357. /package/{examples/jsm → src}/renderers/common/ProgrammableStage.js +0 -0
  358. /package/{examples/jsm → src}/renderers/common/RenderBundle.js +0 -0
  359. /package/{examples/jsm → src}/renderers/common/RenderBundles.js +0 -0
  360. /package/{examples/jsm → src}/renderers/common/RenderList.js +0 -0
  361. /package/{examples/jsm → src}/renderers/common/RenderLists.js +0 -0
  362. /package/{examples/jsm → src}/renderers/common/RenderObjects.js +0 -0
  363. /package/{examples/jsm → src}/renderers/common/RenderPipeline.js +0 -0
  364. /package/{examples/jsm → src}/renderers/common/Sampler.js +0 -0
  365. /package/{examples/jsm → src}/renderers/common/StorageBuffer.js +0 -0
  366. /package/{examples/jsm → src}/renderers/common/UniformBuffer.js +0 -0
  367. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/WebGLBufferRenderer.js +0 -0
  368. /package/{examples/jsm/renderers/webgl → src/renderers/webgl-fallback}/utils/WebGLCapabilities.js +0 -0
  369. /package/{examples/jsm → src}/renderers/webgpu/nodes/WGSLNodeParser.js +0 -0
  370. /package/{examples/jsm → src}/renderers/webgpu/utils/WebGPUTexturePassUtils.js +0 -0
@@ -0,0 +1,583 @@
1
+ import {
2
+ ClampToEdgeWrapping,
3
+ DataTexture,
4
+ DataUtils,
5
+ FileLoader,
6
+ HalfFloatType,
7
+ LinearFilter,
8
+ LinearMipMapLinearFilter,
9
+ LinearSRGBColorSpace,
10
+ Loader,
11
+ RGBAFormat,
12
+ UVMapping,
13
+ } from 'three';
14
+
15
+ // UltraHDR Image Format - https://developer.android.com/media/platform/hdr-image-format
16
+ // HDR/EXR to UltraHDR Converter - https://gainmap-creator.monogrid.com/
17
+
18
+ /**
19
+ *
20
+ * Short format brief:
21
+ *
22
+ * [JPEG headers]
23
+ * [XMP metadata describing the MPF container and *both* SDR and gainmap images]
24
+ * [Optional metadata] [EXIF] [ICC Profile]
25
+ * [SDR image]
26
+ * [XMP metadata describing only the gainmap image]
27
+ * [Gainmap image]
28
+ *
29
+ * Each section is separated by a 0xFFXX byte followed by a descriptor byte (0xFFE0, 0xFFE1, 0xFFE2.)
30
+ * Binary image storages are prefixed with a unique 0xFFD8 16-bit descriptor.
31
+ */
32
+
33
+ /**
34
+ * Current feature set:
35
+ * - JPEG headers (required)
36
+ * - XMP metadata (required)
37
+ * - XMP validation (not implemented)
38
+ * - EXIF profile (not implemented)
39
+ * - ICC profile (not implemented)
40
+ * - Binary storage for SDR & HDR images (required)
41
+ * - Gainmap metadata (required)
42
+ * - Non-JPEG image formats (not implemented)
43
+ * - Primary image as an HDR image (not implemented)
44
+ */
45
+
46
+ /* Calculating this SRGB powers is extremely slow for 4K images and can be sufficiently precalculated for a 3-4x speed boost */
47
+ const SRGB_TO_LINEAR = Array( 1024 )
48
+ .fill( 0 )
49
+ .map( ( _, value ) =>
50
+ Math.pow( ( value / 255 ) * 0.9478672986 + 0.0521327014, 2.4 )
51
+ );
52
+
53
+ class UltraHDRLoader extends Loader {
54
+
55
+ constructor( manager ) {
56
+
57
+ super( manager );
58
+
59
+ this.type = HalfFloatType;
60
+
61
+ }
62
+
63
+ setDataType( value ) {
64
+
65
+ this.type = value;
66
+
67
+ return this;
68
+
69
+ }
70
+
71
+ parse( buffer, onLoad ) {
72
+
73
+ const xmpMetadata = {
74
+ version: null,
75
+ baseRenditionIsHDR: null,
76
+ gainMapMin: null,
77
+ gainMapMax: null,
78
+ gamma: null,
79
+ offsetSDR: null,
80
+ offsetHDR: null,
81
+ hdrCapacityMin: null,
82
+ hdrCapacityMax: null,
83
+ };
84
+ const textDecoder = new TextDecoder();
85
+
86
+ const data = new DataView( buffer );
87
+
88
+ let byteOffset = 0;
89
+ const sections = [];
90
+
91
+ while ( byteOffset < data.byteLength ) {
92
+
93
+ const byte = data.getUint8( byteOffset );
94
+
95
+ if ( byte === 0xff ) {
96
+
97
+ const leadingByte = data.getUint8( byteOffset + 1 );
98
+
99
+ if (
100
+ [
101
+ /* Valid section headers */
102
+ 0xd8, // SOI
103
+ 0xe0, // APP0
104
+ 0xe1, // APP1
105
+ 0xe2, // APP2
106
+ ].includes( leadingByte )
107
+ ) {
108
+
109
+ sections.push( {
110
+ sectionType: leadingByte,
111
+ section: [ byte, leadingByte ],
112
+ sectionOffset: byteOffset + 2,
113
+ } );
114
+
115
+ byteOffset += 2;
116
+
117
+ } else {
118
+
119
+ sections[ sections.length - 1 ].section.push( byte, leadingByte );
120
+
121
+ byteOffset += 2;
122
+
123
+ }
124
+
125
+ } else {
126
+
127
+ sections[ sections.length - 1 ].section.push( byte );
128
+
129
+ byteOffset ++;
130
+
131
+ }
132
+
133
+ }
134
+
135
+ let primaryImage, gainmapImage;
136
+
137
+ for ( let i = 0; i < sections.length; i ++ ) {
138
+
139
+ const { sectionType, section, sectionOffset } = sections[ i ];
140
+
141
+ if ( sectionType === 0xe0 ) {
142
+ /* JPEG Header - no useful information */
143
+ } else if ( sectionType === 0xe1 ) {
144
+
145
+ /* XMP Metadata */
146
+
147
+ this._parseXMPMetadata(
148
+ textDecoder.decode( new Uint8Array( section ) ),
149
+ xmpMetadata
150
+ );
151
+
152
+ } else if ( sectionType === 0xe2 ) {
153
+
154
+ /* Data Sections - MPF / EXIF / ICC Profile */
155
+
156
+ const sectionData = new DataView(
157
+ new Uint8Array( section.slice( 2 ) ).buffer
158
+ );
159
+ const sectionHeader = sectionData.getUint32( 2, false );
160
+
161
+ if ( sectionHeader === 0x4d504600 ) {
162
+
163
+ /* MPF Section */
164
+
165
+ /* Section contains a list of static bytes and ends with offsets indicating location of SDR and gainmap images */
166
+ /* First bytes after header indicate little / big endian ordering (0x49492A00 - LE / 0x4D4D002A - BE) */
167
+ /*
168
+ ... 60 bytes indicating tags, versions, etc. ...
169
+
170
+ bytes | bits | description
171
+
172
+ 4 32 primary image size
173
+ 4 32 primary image offset
174
+ 2 16 0x0000
175
+ 2 16 0x0000
176
+
177
+ 4 32 0x00000000
178
+ 4 32 gainmap image size
179
+ 4 32 gainmap image offset
180
+ 2 16 0x0000
181
+ 2 16 0x0000
182
+ */
183
+
184
+ const mpfLittleEndian = sectionData.getUint32( 6 ) === 0x49492a00;
185
+ const mpfBytesOffset = 60;
186
+
187
+ /* SDR size includes the metadata length, SDR offset is always 0 */
188
+
189
+ const primaryImageSize = sectionData.getUint32(
190
+ mpfBytesOffset,
191
+ mpfLittleEndian
192
+ );
193
+ const primaryImageOffset = sectionData.getUint32(
194
+ mpfBytesOffset + 4,
195
+ mpfLittleEndian
196
+ );
197
+
198
+ /* Gainmap size is an absolute value starting from its offset, gainmap offset needs 6 bytes padding to take into account 0x00 bytes at the end of XMP */
199
+ const gainmapImageSize = sectionData.getUint32(
200
+ mpfBytesOffset + 16,
201
+ mpfLittleEndian
202
+ );
203
+ const gainmapImageOffset =
204
+ sectionData.getUint32( mpfBytesOffset + 20, mpfLittleEndian ) +
205
+ sectionOffset +
206
+ 6;
207
+
208
+ primaryImage = new Uint8Array(
209
+ data.buffer,
210
+ primaryImageOffset,
211
+ primaryImageSize
212
+ );
213
+
214
+ gainmapImage = new Uint8Array(
215
+ data.buffer,
216
+ gainmapImageOffset,
217
+ gainmapImageSize
218
+ );
219
+
220
+ }
221
+
222
+ }
223
+
224
+ }
225
+
226
+ /* Minimal sufficient validation - https://developer.android.com/media/platform/hdr-image-format#signal_of_the_format */
227
+ if ( ! xmpMetadata.version ) {
228
+
229
+ throw new Error( 'THREE.UltraHDRLoader: Not a valid UltraHDR image' );
230
+
231
+ }
232
+
233
+ if ( primaryImage && gainmapImage ) {
234
+
235
+ this._applyGainmapToSDR(
236
+ xmpMetadata,
237
+ primaryImage,
238
+ gainmapImage,
239
+ ( hdrBuffer, width, height ) => {
240
+
241
+ onLoad( {
242
+ width,
243
+ height,
244
+ data: hdrBuffer,
245
+ format: RGBAFormat,
246
+ type: this.type,
247
+ } );
248
+
249
+ },
250
+ ( error ) => {
251
+
252
+ throw new Error( error );
253
+
254
+ }
255
+ );
256
+
257
+ } else {
258
+
259
+ throw new Error( 'THREE.UltraHDRLoader: Could not parse UltraHDR images' );
260
+
261
+ }
262
+
263
+ }
264
+
265
+ load( url, onLoad, onProgress, onError ) {
266
+
267
+ const texture = new DataTexture(
268
+ this.type === HalfFloatType ? new Uint16Array() : new Float32Array(),
269
+ 0,
270
+ 0,
271
+ RGBAFormat,
272
+ this.type,
273
+ UVMapping,
274
+ ClampToEdgeWrapping,
275
+ ClampToEdgeWrapping,
276
+ LinearFilter,
277
+ LinearMipMapLinearFilter,
278
+ 1,
279
+ LinearSRGBColorSpace
280
+ );
281
+ texture.generateMipmaps = true;
282
+ texture.flipY = true;
283
+
284
+ const loader = new FileLoader( this.manager );
285
+ loader.setResponseType( 'arraybuffer' );
286
+ loader.setRequestHeader( this.requestHeader );
287
+ loader.setPath( this.path );
288
+ loader.setWithCredentials( this.withCredentials );
289
+ loader.load( url, ( buffer ) => {
290
+
291
+ try {
292
+
293
+ this.parse(
294
+ buffer,
295
+ ( texData ) => {
296
+
297
+ texture.image = {
298
+ data: texData.data,
299
+ width: texData.width,
300
+ height: texData.height,
301
+ };
302
+ texture.needsUpdate = true;
303
+
304
+ if ( onLoad ) onLoad( texture, texData );
305
+
306
+ }
307
+ );
308
+
309
+ } catch ( error ) {
310
+
311
+ if ( onError ) onError( error );
312
+
313
+ console.error( error );
314
+
315
+ }
316
+
317
+ }, onProgress, onError );
318
+
319
+ return texture;
320
+
321
+ }
322
+
323
+ _parseXMPMetadata( xmpDataString, xmpMetadata ) {
324
+
325
+ const domParser = new DOMParser();
326
+
327
+ const xmpXml = domParser.parseFromString(
328
+ xmpDataString.substring(
329
+ xmpDataString.indexOf( '<' ),
330
+ xmpDataString.lastIndexOf( '>' ) + 1
331
+ ),
332
+ 'text/xml'
333
+ );
334
+
335
+ /* Determine if given XMP metadata is the primary GContainer descriptor or a gainmap descriptor */
336
+ const [ hasHDRContainerDescriptor ] = xmpXml.getElementsByTagName(
337
+ 'Container:Directory'
338
+ );
339
+
340
+ if ( hasHDRContainerDescriptor ) {
341
+ /* There's not much useful information in the container descriptor besides memory-validation */
342
+ } else {
343
+
344
+ /* Gainmap descriptor - defaults from https://developer.android.com/media/platform/hdr-image-format#HDR_gain_map_metadata */
345
+
346
+ const [ gainmapNode ] = xmpXml.getElementsByTagName( 'rdf:Description' );
347
+
348
+ xmpMetadata.version = gainmapNode.getAttribute( 'hdrgm:Version' );
349
+ xmpMetadata.baseRenditionIsHDR =
350
+ gainmapNode.getAttribute( 'hdrgm:BaseRenditionIsHDR' ) === 'True';
351
+ xmpMetadata.gainMapMin = parseFloat(
352
+ gainmapNode.getAttribute( 'hdrgm:GainMapMin' ) || 0.0
353
+ );
354
+ xmpMetadata.gainMapMax = parseFloat(
355
+ gainmapNode.getAttribute( 'hdrgm:GainMapMax' ) || 1.0
356
+ );
357
+ xmpMetadata.gamma = parseFloat(
358
+ gainmapNode.getAttribute( 'hdrgm:Gamma' ) || 1.0
359
+ );
360
+ xmpMetadata.offsetSDR = parseFloat(
361
+ gainmapNode.getAttribute( 'hdrgm:OffsetSDR' ) / ( 1 / 64 )
362
+ );
363
+ xmpMetadata.offsetHDR = parseFloat(
364
+ gainmapNode.getAttribute( 'hdrgm:OffsetHDR' ) / ( 1 / 64 )
365
+ );
366
+ xmpMetadata.hdrCapacityMin = parseFloat(
367
+ gainmapNode.getAttribute( 'hdrgm:HDRCapacityMin' ) || 0.0
368
+ );
369
+ xmpMetadata.hdrCapacityMax = parseFloat(
370
+ gainmapNode.getAttribute( 'hdrgm:HDRCapacityMax' ) || 1.0
371
+ );
372
+
373
+ }
374
+
375
+ }
376
+
377
+ _srgbToLinear( value ) {
378
+
379
+ if ( value / 255 < 0.04045 ) {
380
+
381
+ return ( value / 255 ) * 0.0773993808;
382
+
383
+ }
384
+
385
+ if ( value < 1024 ) {
386
+
387
+ return SRGB_TO_LINEAR[ ~ ~ value ];
388
+
389
+ }
390
+
391
+ return Math.pow( ( value / 255 ) * 0.9478672986 + 0.0521327014, 2.4 );
392
+
393
+ }
394
+
395
+ _applyGainmapToSDR(
396
+ xmpMetadata,
397
+ sdrBuffer,
398
+ gainmapBuffer,
399
+ onSuccess,
400
+ onError
401
+ ) {
402
+
403
+ const getImageDataFromBuffer = ( buffer ) =>
404
+ new Promise( ( resolve, reject ) => {
405
+
406
+ const imageLoader = document.createElement( 'img' );
407
+
408
+ imageLoader.onload = () => {
409
+
410
+ const image = {
411
+ width: imageLoader.naturalWidth,
412
+ height: imageLoader.naturalHeight,
413
+ source: imageLoader,
414
+ };
415
+
416
+ URL.revokeObjectURL( imageLoader.src );
417
+
418
+ resolve( image );
419
+
420
+ };
421
+
422
+ imageLoader.onerror = () => {
423
+
424
+ URL.revokeObjectURL( imageLoader.src );
425
+
426
+ reject();
427
+
428
+ };
429
+
430
+ imageLoader.src = URL.createObjectURL(
431
+ new Blob( [ buffer ], { type: 'image/jpeg' } )
432
+ );
433
+
434
+ } );
435
+
436
+ Promise.all( [
437
+ getImageDataFromBuffer( sdrBuffer ),
438
+ getImageDataFromBuffer( gainmapBuffer ),
439
+ ] )
440
+ .then( ( [ sdrImage, gainmapImage ] ) => {
441
+
442
+ const sdrImageAspect = sdrImage.width / sdrImage.height;
443
+ const gainmapImageAspect = gainmapImage.width / gainmapImage.height;
444
+
445
+ if ( sdrImageAspect !== gainmapImageAspect ) {
446
+
447
+ onError(
448
+ 'THREE.UltraHDRLoader Error: Aspect ratio mismatch between SDR and Gainmap images'
449
+ );
450
+
451
+ return;
452
+
453
+ }
454
+
455
+ const canvas = document.createElement( 'canvas' );
456
+ const ctx = canvas.getContext( '2d', {
457
+ willReadFrequently: true,
458
+ colorSpace: 'srgb',
459
+ } );
460
+
461
+ canvas.width = sdrImage.width;
462
+ canvas.height = sdrImage.height;
463
+
464
+ /* Use out-of-the-box interpolation of Canvas API to scale gainmap to fit the SDR resolution */
465
+ ctx.drawImage(
466
+ gainmapImage.source,
467
+ 0,
468
+ 0,
469
+ gainmapImage.width,
470
+ gainmapImage.height,
471
+ 0,
472
+ 0,
473
+ sdrImage.width,
474
+ sdrImage.height
475
+ );
476
+ const gainmapImageData = ctx.getImageData(
477
+ 0,
478
+ 0,
479
+ sdrImage.width,
480
+ sdrImage.height,
481
+ { colorSpace: 'srgb' }
482
+ );
483
+
484
+ ctx.drawImage( sdrImage.source, 0, 0 );
485
+ const sdrImageData = ctx.getImageData(
486
+ 0,
487
+ 0,
488
+ sdrImage.width,
489
+ sdrImage.height,
490
+ { colorSpace: 'srgb' }
491
+ );
492
+
493
+ /* HDR Recovery formula - https://developer.android.com/media/platform/hdr-image-format#use_the_gain_map_to_create_adapted_HDR_rendition */
494
+ let hdrBuffer;
495
+
496
+ if ( this.type === HalfFloatType ) {
497
+
498
+ hdrBuffer = new Uint16Array( sdrImageData.data.length ).fill( 23544 );
499
+
500
+ } else {
501
+
502
+ hdrBuffer = new Float32Array( sdrImageData.data.length ).fill( 255 );
503
+
504
+ }
505
+
506
+ const maxDisplayBoost = Math.sqrt(
507
+ Math.pow(
508
+ /* 1.8 instead of 2 near-perfectly rectifies approximations introduced by precalculated SRGB_TO_LINEAR values */
509
+ 1.8,
510
+ xmpMetadata.hdrCapacityMax
511
+ )
512
+ );
513
+ const unclampedWeightFactor =
514
+ ( Math.log2( maxDisplayBoost ) - xmpMetadata.hdrCapacityMin ) /
515
+ ( xmpMetadata.hdrCapacityMax - xmpMetadata.hdrCapacityMin );
516
+ const weightFactor = Math.min(
517
+ Math.max( unclampedWeightFactor, 0.0 ),
518
+ 1.0
519
+ );
520
+ const useGammaOne = xmpMetadata.gamma === 1.0;
521
+
522
+ for (
523
+ let pixelIndex = 0;
524
+ pixelIndex < sdrImageData.data.length;
525
+ pixelIndex += 4
526
+ ) {
527
+
528
+ const x = ( pixelIndex / 4 ) % sdrImage.width;
529
+ const y = Math.floor( pixelIndex / 4 / sdrImage.width );
530
+
531
+ for ( let channelIndex = 0; channelIndex < 3; channelIndex ++ ) {
532
+
533
+ const sdrValue = sdrImageData.data[ pixelIndex + channelIndex ];
534
+
535
+ const gainmapIndex = ( y * sdrImage.width + x ) * 4 + channelIndex;
536
+ const gainmapValue = gainmapImageData.data[ gainmapIndex ] / 255.0;
537
+
538
+ /* Gamma is 1.0 by default */
539
+ const logRecovery = useGammaOne
540
+ ? gainmapValue
541
+ : Math.pow( gainmapValue, 1.0 / xmpMetadata.gamma );
542
+
543
+ const logBoost =
544
+ xmpMetadata.gainMapMin * ( 1.0 - logRecovery ) +
545
+ xmpMetadata.gainMapMax * logRecovery;
546
+
547
+ const hdrValue =
548
+ ( sdrValue + xmpMetadata.offsetSDR ) *
549
+ ( logBoost * weightFactor === 0.0
550
+ ? 1.0
551
+ : Math.pow( 2, logBoost * weightFactor ) ) -
552
+ xmpMetadata.offsetHDR;
553
+
554
+ const linearHDRValue = Math.min(
555
+ Math.max( this._srgbToLinear( hdrValue ), 0 ),
556
+ 65504
557
+ );
558
+
559
+ hdrBuffer[ pixelIndex + channelIndex ] =
560
+ this.type === HalfFloatType
561
+ ? DataUtils.toHalfFloat( linearHDRValue )
562
+ : linearHDRValue;
563
+
564
+ }
565
+
566
+ }
567
+
568
+ onSuccess( hdrBuffer, sdrImage.width, sdrImage.height );
569
+
570
+ } )
571
+ .catch( () => {
572
+
573
+ throw new Error(
574
+ 'THREE.UltraHDRLoader Error: Could not parse UltraHDR images'
575
+ );
576
+
577
+ } );
578
+
579
+ }
580
+
581
+ }
582
+
583
+ export { UltraHDRLoader };
@@ -447,7 +447,6 @@ class VTKLoader extends Loader {
447
447
 
448
448
  } else {
449
449
 
450
-
451
450
  indices[ indicesIndex ++ ] = strip[ j ];
452
451
  indices[ indicesIndex ++ ] = strip[ j + 1 ];
453
452
  indices[ indicesIndex ++ ] = strip[ j + 2 ];
@@ -620,7 +619,17 @@ class VTKLoader extends Loader {
620
619
 
621
620
  const tmp = xmlToJson( item );
622
621
 
623
- if ( tmp !== '' ) obj[ nodeName ] = tmp;
622
+ if ( tmp !== '' ) {
623
+
624
+ if ( Array.isArray( tmp[ '#text' ] ) ) {
625
+
626
+ tmp[ '#text' ] = tmp[ '#text' ][ 0 ];
627
+
628
+ }
629
+
630
+ obj[ nodeName ] = tmp;
631
+
632
+ }
624
633
 
625
634
  } else {
626
635
 
@@ -633,7 +642,17 @@ class VTKLoader extends Loader {
633
642
 
634
643
  const tmp = xmlToJson( item );
635
644
 
636
- if ( tmp !== '' ) obj[ nodeName ].push( tmp );
645
+ if ( tmp !== '' ) {
646
+
647
+ if ( Array.isArray( tmp[ '#text' ] ) ) {
648
+
649
+ tmp[ '#text' ] = tmp[ '#text' ][ 0 ];
650
+
651
+ }
652
+
653
+ obj[ nodeName ].push( tmp );
654
+
655
+ }
637
656
 
638
657
  }
639
658
 
@@ -894,6 +913,60 @@ class VTKLoader extends Loader {
894
913
  let normals = [];
895
914
  let indices = [];
896
915
 
916
+ if ( json.AppendedData ) {
917
+
918
+ const appendedData = json.AppendedData[ '#text' ].slice( 1 );
919
+ const piece = json.PolyData.Piece;
920
+
921
+ const sections = [ 'PointData', 'CellData', 'Points', 'Verts', 'Lines', 'Strips', 'Polys' ];
922
+ let sectionIndex = 0;
923
+
924
+ const offsets = sections.map( s => {
925
+
926
+ const sect = piece[ s ];
927
+
928
+ if ( sect && sect.DataArray ) {
929
+
930
+ const arr = Array.isArray( sect.DataArray ) ? sect.DataArray : [ sect.DataArray ];
931
+
932
+ return arr.map( a => a.attributes.offset );
933
+
934
+ }
935
+
936
+ return [];
937
+
938
+ } ).flat();
939
+
940
+ for ( const sect of sections ) {
941
+
942
+ const section = piece[ sect ];
943
+
944
+ if ( section && section.DataArray ) {
945
+
946
+ if ( Array.isArray( section.DataArray ) ) {
947
+
948
+ for ( const sectionEle of section.DataArray ) {
949
+
950
+ sectionEle[ '#text' ] = appendedData.slice( offsets[ sectionIndex ], offsets[ sectionIndex + 1 ] );
951
+ sectionEle.attributes.format = 'binary';
952
+ sectionIndex ++;
953
+
954
+ }
955
+
956
+ } else {
957
+
958
+ section.DataArray[ '#text' ] = appendedData.slice( offsets[ sectionIndex ], offsets[ sectionIndex + 1 ] );
959
+ section.DataArray.attributes.format = 'binary';
960
+ sectionIndex ++;
961
+
962
+ }
963
+
964
+ }
965
+
966
+ }
967
+
968
+ }
969
+
897
970
  if ( json.PolyData ) {
898
971
 
899
972
  const piece = json.PolyData.Piece;