super-three 0.181.0 → 0.184.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -1,7 +1,7 @@
1
1
  import {
2
- Clock,
3
2
  HalfFloatType,
4
3
  NoBlending,
4
+ Timer,
5
5
  Vector2,
6
6
  WebGLRenderTarget
7
7
  } from 'three';
@@ -123,12 +123,12 @@ class EffectComposer {
123
123
  this.copyPass.material.blending = NoBlending;
124
124
 
125
125
  /**
126
- * The internal clock for managing time data.
126
+ * The internal timer for managing time data.
127
127
  *
128
128
  * @private
129
- * @type {Clock}
129
+ * @type {Timer}
130
130
  */
131
- this.clock = new Clock();
131
+ this.timer = new Timer();
132
132
 
133
133
  this.onSessionStateChange = this.onSessionStateChange.bind( this );
134
134
  this.renderer.xr.addEventListener( 'sessionstart', this.onSessionStateChange );
@@ -233,9 +233,11 @@ class EffectComposer {
233
233
 
234
234
  // deltaTime value is in seconds
235
235
 
236
+ this.timer.update();
237
+
236
238
  if ( deltaTime === undefined ) {
237
239
 
238
- deltaTime = this.clock.getDelta();
240
+ deltaTime = this.timer.getDelta();
239
241
 
240
242
  }
241
243
 
@@ -39,6 +39,15 @@ class OutputPass extends Pass {
39
39
 
40
40
  super();
41
41
 
42
+ /**
43
+ * This flag indicates that this is an output pass.
44
+ *
45
+ * @type {boolean}
46
+ * @readonly
47
+ * @default true
48
+ */
49
+ this.isOutputPass = true;
50
+
42
51
  /**
43
52
  * The pass uniforms.
44
53
  *
@@ -93,6 +93,16 @@ class RenderPass extends Pass {
93
93
  * @default false
94
94
  */
95
95
  this.needsSwap = false;
96
+
97
+ /**
98
+ * This flag indicates that this pass renders the scene itself.
99
+ *
100
+ * @type {boolean}
101
+ * @readonly
102
+ * @default true
103
+ */
104
+ this.isRenderPass = true;
105
+
96
106
  this._oldClearColor = new Color();
97
107
 
98
108
  }
@@ -114,7 +114,7 @@ class RenderTransitionPass extends Pass {
114
114
  }
115
115
 
116
116
  /**
117
- * Sets the texture threshold. This value defined how strong the texture effects
117
+ * Sets the texture threshold. This value defines how strong the texture effects
118
118
  * the transition. Must be in the range `[0,1]` (0 means full effect, 1 means no effect).
119
119
  *
120
120
  * @param {boolean|number} value - The threshold value.
@@ -56,7 +56,7 @@ class UnrealBloomPass extends Pass {
56
56
  this.strength = strength;
57
57
 
58
58
  /**
59
- * The Bloom radius.
59
+ * The Bloom radius. Must be in the range `[0,1]`.
60
60
  *
61
61
  * @type {number}
62
62
  */
@@ -187,6 +187,7 @@ class UnrealBloomPass extends Pass {
187
187
  uniforms: this.copyUniforms,
188
188
  vertexShader: CopyShader.vertexShader,
189
189
  fragmentShader: CopyShader.fragmentShader,
190
+ premultipliedAlpha: true,
190
191
  blending: AdditiveBlending,
191
192
  depthTest: false,
192
193
  depthWrite: false,
@@ -399,33 +400,46 @@ class UnrealBloomPass extends Pass {
399
400
  'gaussianCoefficients': { value: coefficients } // precomputed Gaussian coefficients
400
401
  },
401
402
 
402
- vertexShader:
403
- `varying vec2 vUv;
403
+ vertexShader: /* glsl */`
404
+
405
+ varying vec2 vUv;
406
+
404
407
  void main() {
408
+
405
409
  vUv = uv;
406
410
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
411
+
407
412
  }`,
408
413
 
409
- fragmentShader:
410
- `#include <common>
414
+ fragmentShader: /* glsl */`
415
+
416
+ #include <common>
417
+
411
418
  varying vec2 vUv;
419
+
412
420
  uniform sampler2D colorTexture;
413
421
  uniform vec2 invSize;
414
422
  uniform vec2 direction;
415
423
  uniform float gaussianCoefficients[KERNEL_RADIUS];
416
424
 
417
425
  void main() {
426
+
418
427
  float weightSum = gaussianCoefficients[0];
419
428
  vec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;
420
- for( int i = 1; i < KERNEL_RADIUS; i ++ ) {
421
- float x = float(i);
429
+
430
+ for ( int i = 1; i < KERNEL_RADIUS; i ++ ) {
431
+
432
+ float x = float( i );
422
433
  float w = gaussianCoefficients[i];
423
434
  vec2 uvOffset = direction * invSize * x;
424
435
  vec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;
425
436
  vec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;
426
437
  diffuseSum += ( sample1 + sample2 ) * w;
438
+
427
439
  }
440
+
428
441
  gl_FragColor = vec4( diffuseSum, 1.0 );
442
+
429
443
  }`
430
444
  } );
431
445
 
@@ -451,15 +465,21 @@ class UnrealBloomPass extends Pass {
451
465
  'bloomRadius': { value: 0.0 }
452
466
  },
453
467
 
454
- vertexShader:
455
- `varying vec2 vUv;
468
+ vertexShader: /* glsl */`
469
+
470
+ varying vec2 vUv;
471
+
456
472
  void main() {
473
+
457
474
  vUv = uv;
458
475
  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
476
+
459
477
  }`,
460
478
 
461
- fragmentShader:
462
- `varying vec2 vUv;
479
+ fragmentShader: /* glsl */`
480
+
481
+ varying vec2 vUv;
482
+
463
483
  uniform sampler2D blurTexture1;
464
484
  uniform sampler2D blurTexture2;
465
485
  uniform sampler2D blurTexture3;
@@ -470,17 +490,27 @@ class UnrealBloomPass extends Pass {
470
490
  uniform float bloomFactors[NUM_MIPS];
471
491
  uniform vec3 bloomTintColors[NUM_MIPS];
472
492
 
473
- float lerpBloomFactor(const in float factor) {
493
+ float lerpBloomFactor( const in float factor ) {
494
+
474
495
  float mirrorFactor = 1.2 - factor;
475
- return mix(factor, mirrorFactor, bloomRadius);
496
+ return mix( factor, mirrorFactor, bloomRadius );
497
+
476
498
  }
477
499
 
478
500
  void main() {
479
- gl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +
480
- lerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +
481
- lerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +
482
- lerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +
483
- lerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );
501
+
502
+ // 3.0 for backwards compatibility with previous alpha-based intensity
503
+ vec3 bloom = 3.0 * bloomStrength * (
504
+ lerpBloomFactor( bloomFactors[ 0 ] ) * bloomTintColors[ 0 ] * texture2D( blurTexture1, vUv ).rgb +
505
+ lerpBloomFactor( bloomFactors[ 1 ] ) * bloomTintColors[ 1 ] * texture2D( blurTexture2, vUv ).rgb +
506
+ lerpBloomFactor( bloomFactors[ 2 ] ) * bloomTintColors[ 2 ] * texture2D( blurTexture3, vUv ).rgb +
507
+ lerpBloomFactor( bloomFactors[ 3 ] ) * bloomTintColors[ 3 ] * texture2D( blurTexture4, vUv ).rgb +
508
+ lerpBloomFactor( bloomFactors[ 4 ] ) * bloomTintColors[ 4 ] * texture2D( blurTexture5, vUv ).rgb
509
+ );
510
+
511
+ float bloomAlpha = max( bloom.r, max( bloom.g, bloom.b ) );
512
+ gl_FragColor = vec4( bloom, bloomAlpha );
513
+
484
514
  }`
485
515
  } );
486
516
 
@@ -141,7 +141,7 @@ const _matrix2 = new Matrix4();
141
141
  * This renderer can be used to apply hierarchical 3D transformations to DOM elements
142
142
  * via the CSS3 [transform](https://www.w3schools.com/cssref/css3_pr_transform.asp) property.
143
143
  * `CSS3DRenderer` is particularly interesting if you want to apply 3D effects to a website without
144
- * canvas based rendering. It can also be used in order to combine DOM elements with WebGLcontent.
144
+ * canvas based rendering. It can also be used in order to combine DOM elements with WebGL content.
145
145
  *
146
146
  * There are, however, some important limitations:
147
147
  *
@@ -139,7 +139,7 @@ class Projector {
139
139
  _face, _faceCount, _facePoolLength = 0,
140
140
  _line, _lineCount, _linePoolLength = 0,
141
141
  _sprite, _spriteCount, _spritePoolLength = 0,
142
- _modelMatrix;
142
+ _modelMatrix, _clipInput = [], _clipOutput = [];
143
143
 
144
144
  const
145
145
 
@@ -159,7 +159,19 @@ class Projector {
159
159
 
160
160
  _frustum = new Frustum(),
161
161
 
162
- _objectPool = [], _vertexPool = [], _facePool = [], _linePool = [], _spritePool = [];
162
+ _objectPool = [], _vertexPool = [], _facePool = [], _linePool = [], _spritePool = [],
163
+
164
+ _clipVertexPool = [],
165
+ _clipPos1 = new Vector4(),
166
+ _clipPos2 = new Vector4(),
167
+ _clipPos3 = new Vector4(),
168
+ _screenVertexPool = [],
169
+ _clipInputVertices = [ null, null, null ],
170
+
171
+ _clipPlanes = [
172
+ { sign: + 1 },
173
+ { sign: - 1 }
174
+ ];
163
175
 
164
176
  //
165
177
 
@@ -298,48 +310,168 @@ class Projector {
298
310
  const v2 = _vertexPool[ b ];
299
311
  const v3 = _vertexPool[ c ];
300
312
 
301
- if ( checkTriangleVisibility( v1, v2, v3 ) === false ) return;
313
+ // Derive near/far clip distances from NDC z and stored clip-space w
314
+ // (projectVertex already computed positionScreen = clipPos / w, with w preserved)
315
+ const w1 = v1.positionScreen.w;
316
+ const w2 = v2.positionScreen.w;
317
+ const w3 = v3.positionScreen.w;
318
+
319
+ const nearDist1 = w1 * ( v1.positionScreen.z + 1 );
320
+ const nearDist2 = w2 * ( v2.positionScreen.z + 1 );
321
+ const nearDist3 = w3 * ( v3.positionScreen.z + 1 );
322
+ const farDist1 = w1 * ( 1 - v1.positionScreen.z );
323
+ const farDist2 = w2 * ( 1 - v2.positionScreen.z );
324
+ const farDist3 = w3 * ( 1 - v3.positionScreen.z );
302
325
 
303
- if ( material.side === DoubleSide || checkBackfaceCulling( v1, v2, v3 ) === true ) {
326
+ // Check if completely outside
327
+ if ( ( nearDist1 < 0 && nearDist2 < 0 && nearDist3 < 0 ) ||
328
+ ( farDist1 < 0 && farDist2 < 0 && farDist3 < 0 ) ) {
329
+
330
+ return; // Triangle completely clipped
331
+
332
+ }
304
333
 
305
- _face = getNextFaceInPool();
334
+ // Check if completely inside (no clipping needed)
335
+ if ( nearDist1 >= 0 && nearDist2 >= 0 && nearDist3 >= 0 &&
336
+ farDist1 >= 0 && farDist2 >= 0 && farDist3 >= 0 ) {
306
337
 
307
- _face.id = object.id;
308
- _face.v1.copy( v1 );
309
- _face.v2.copy( v2 );
310
- _face.v3.copy( v3 );
311
- _face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3;
312
- _face.renderOrder = object.renderOrder;
338
+ // No clipping needed - use original path
339
+ if ( checkTriangleVisibility( v1, v2, v3 ) === false ) return;
313
340
 
314
- // face normal
315
- _vector3.subVectors( v3.position, v2.position );
316
- _vector4.subVectors( v1.position, v2.position );
317
- _vector3.cross( _vector4 );
318
- _face.normalModel.copy( _vector3 );
319
- _face.normalModel.applyMatrix3( normalMatrix ).normalize();
341
+ if ( material.side === DoubleSide || checkBackfaceCulling( v1, v2, v3 ) === true ) {
320
342
 
321
- for ( let i = 0; i < 3; i ++ ) {
343
+ _face = getNextFaceInPool();
322
344
 
323
- const normal = _face.vertexNormalsModel[ i ];
324
- normal.fromArray( normals, arguments[ i ] * 3 );
325
- normal.applyMatrix3( normalMatrix ).normalize();
345
+ _face.id = object.id;
346
+ _face.v1.copy( v1 );
347
+ _face.v2.copy( v2 );
348
+ _face.v3.copy( v3 );
349
+ _face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3;
350
+ _face.renderOrder = object.renderOrder;
326
351
 
327
- const uv = _face.uvs[ i ];
328
- uv.fromArray( uvs, arguments[ i ] * 2 );
352
+ // face normal
353
+ _vector3.subVectors( v3.position, v2.position );
354
+ _vector4.subVectors( v1.position, v2.position );
355
+ _vector3.cross( _vector4 );
356
+ _face.normalModel.copy( _vector3 );
357
+ _face.normalModel.applyMatrix3( normalMatrix ).normalize();
358
+
359
+ for ( let i = 0; i < 3; i ++ ) {
360
+
361
+ const normal = _face.vertexNormalsModel[ i ];
362
+ normal.fromArray( normals, arguments[ i ] * 3 );
363
+ normal.applyMatrix3( normalMatrix ).normalize();
364
+
365
+ const uv = _face.uvs[ i ];
366
+ uv.fromArray( uvs, arguments[ i ] * 2 );
367
+
368
+ }
369
+
370
+ _face.vertexNormalsLength = 3;
371
+
372
+ _face.material = material;
373
+
374
+ if ( material.vertexColors ) {
375
+
376
+ _face.color.fromArray( colors, a * 3 );
377
+
378
+ }
379
+
380
+ _renderData.elements.push( _face );
329
381
 
330
382
  }
331
383
 
332
- _face.vertexNormalsLength = 3;
384
+ return;
385
+
386
+ }
387
+
388
+ // Triangle needs clipping - reconstruct clip-space positions from NDC + w
389
+ _clipPos1.set( v1.positionScreen.x * w1, v1.positionScreen.y * w1, v1.positionScreen.z * w1, w1 );
390
+ _clipPos2.set( v2.positionScreen.x * w2, v2.positionScreen.y * w2, v2.positionScreen.z * w2, w2 );
391
+ _clipPos3.set( v3.positionScreen.x * w3, v3.positionScreen.y * w3, v3.positionScreen.z * w3, w3 );
392
+ _clipInputVertices[ 0 ] = _clipPos1;
393
+ _clipInputVertices[ 1 ] = _clipPos2;
394
+ _clipInputVertices[ 2 ] = _clipPos3;
395
+ const clippedCount = clipTriangle( _clipInputVertices );
333
396
 
334
- _face.material = material;
397
+ if ( clippedCount < 3 ) return; // Triangle completely clipped
335
398
 
336
- if ( material.vertexColors ) {
399
+ // Perform perspective divide on clipped vertices and create screen vertices
400
+ for ( let i = 0; i < clippedCount; i ++ ) {
337
401
 
338
- _face.color.fromArray( colors, a * 3 );
402
+ const cv = _clipInput[ i ];
403
+
404
+ // Get or create renderable vertex from pool
405
+ let sv = _screenVertexPool[ i ];
406
+ if ( ! sv ) {
407
+
408
+ sv = new RenderableVertex();
409
+ _screenVertexPool[ i ] = sv;
339
410
 
340
411
  }
341
412
 
342
- _renderData.elements.push( _face );
413
+ // Perform perspective divide
414
+ const invW = 1 / cv.w;
415
+ sv.positionScreen.set( cv.x * invW, cv.y * invW, cv.z * invW, 1 );
416
+
417
+ // Interpolate world position (simplified - using weighted average based on barycentric-like coords)
418
+ // For a proper implementation, we'd need to track interpolation weights
419
+ sv.positionWorld.copy( v1.positionWorld );
420
+
421
+ sv.visible = true;
422
+
423
+ }
424
+
425
+ // Triangulate the clipped polygon (simple fan triangulation)
426
+ for ( let i = 1; i < clippedCount - 1; i ++ ) {
427
+
428
+ const tv1 = _screenVertexPool[ 0 ];
429
+ const tv2 = _screenVertexPool[ i ];
430
+ const tv3 = _screenVertexPool[ i + 1 ];
431
+
432
+ if ( material.side === DoubleSide || checkBackfaceCulling( tv1, tv2, tv3 ) === true ) {
433
+
434
+ _face = getNextFaceInPool();
435
+
436
+ _face.id = object.id;
437
+ _face.v1.copy( tv1 );
438
+ _face.v2.copy( tv2 );
439
+ _face.v3.copy( tv3 );
440
+ _face.z = ( tv1.positionScreen.z + tv2.positionScreen.z + tv3.positionScreen.z ) / 3;
441
+ _face.renderOrder = object.renderOrder;
442
+
443
+ // face normal - use original triangle's normal
444
+ _vector3.subVectors( v3.position, v2.position );
445
+ _vector4.subVectors( v1.position, v2.position );
446
+ _vector3.cross( _vector4 );
447
+ _face.normalModel.copy( _vector3 );
448
+ _face.normalModel.applyMatrix3( normalMatrix ).normalize();
449
+
450
+ // Use original vertex normals and UVs (simplified - proper impl would interpolate)
451
+ for ( let j = 0; j < 3; j ++ ) {
452
+
453
+ const normal = _face.vertexNormalsModel[ j ];
454
+ normal.fromArray( normals, arguments[ j ] * 3 );
455
+ normal.applyMatrix3( normalMatrix ).normalize();
456
+
457
+ const uv = _face.uvs[ j ];
458
+ uv.fromArray( uvs, arguments[ j ] * 2 );
459
+
460
+ }
461
+
462
+ _face.vertexNormalsLength = 3;
463
+
464
+ _face.material = material;
465
+
466
+ if ( material.vertexColors ) {
467
+
468
+ _face.color.fromArray( colors, a * 3 );
469
+
470
+ }
471
+
472
+ _renderData.elements.push( _face );
473
+
474
+ }
343
475
 
344
476
  }
345
477
 
@@ -858,6 +990,92 @@ class Projector {
858
990
 
859
991
  }
860
992
 
993
+ // Sutherland-Hodgman triangle clipping in homogeneous clip space
994
+ // Returns count of vertices in clipped polygon (0 if completely clipped, 3+ if partially clipped)
995
+ // Result vertices are in _clipInput array
996
+ function clipTriangle( vertices ) {
997
+
998
+ // Initialize input with the three input vertices
999
+ _clipInput[ 0 ] = vertices[ 0 ];
1000
+ _clipInput[ 1 ] = vertices[ 1 ];
1001
+ _clipInput[ 2 ] = vertices[ 2 ];
1002
+
1003
+ let inputCount = 3;
1004
+ let outputCount = 0;
1005
+
1006
+ for ( let p = 0; p < _clipPlanes.length; p ++ ) {
1007
+
1008
+ const plane = _clipPlanes[ p ];
1009
+ outputCount = 0;
1010
+
1011
+ if ( inputCount === 0 ) break;
1012
+
1013
+ for ( let i = 0; i < inputCount; i ++ ) {
1014
+
1015
+ const v1 = _clipInput[ i ];
1016
+ const v2 = _clipInput[ ( i + 1 ) % inputCount ];
1017
+
1018
+ const d1 = plane.sign * v1.z + v1.w;
1019
+ const d2 = plane.sign * v2.z + v2.w;
1020
+
1021
+ const v1Inside = d1 >= 0;
1022
+ const v2Inside = d2 >= 0;
1023
+
1024
+ if ( v1Inside && v2Inside ) {
1025
+
1026
+ // Both inside - add v1
1027
+ _clipOutput[ outputCount ++ ] = v1;
1028
+
1029
+ } else if ( v1Inside && ! v2Inside ) {
1030
+
1031
+ // v1 inside, v2 outside - add v1 and intersection
1032
+ _clipOutput[ outputCount ++ ] = v1;
1033
+
1034
+ const t = d1 / ( d1 - d2 );
1035
+ let intersection = _clipVertexPool[ outputCount ];
1036
+ if ( ! intersection ) {
1037
+
1038
+ intersection = new Vector4();
1039
+ _clipVertexPool[ outputCount ] = intersection;
1040
+
1041
+ }
1042
+
1043
+ intersection.lerpVectors( v1, v2, t );
1044
+ _clipOutput[ outputCount ++ ] = intersection;
1045
+
1046
+ } else if ( ! v1Inside && v2Inside ) {
1047
+
1048
+ // v1 outside, v2 inside - add intersection only
1049
+ const t = d1 / ( d1 - d2 );
1050
+ let intersection = _clipVertexPool[ outputCount ];
1051
+ if ( ! intersection ) {
1052
+
1053
+ intersection = new Vector4();
1054
+ _clipVertexPool[ outputCount ] = intersection;
1055
+
1056
+ }
1057
+
1058
+ intersection.lerpVectors( v1, v2, t );
1059
+ _clipOutput[ outputCount ++ ] = intersection;
1060
+
1061
+ }
1062
+
1063
+ // Both outside - add nothing
1064
+
1065
+ }
1066
+
1067
+ // Swap input/output
1068
+ const temp = _clipInput;
1069
+ _clipInput = _clipOutput;
1070
+ _clipOutput = temp;
1071
+ inputCount = outputCount;
1072
+
1073
+ }
1074
+
1075
+ return inputCount;
1076
+
1077
+ }
1078
+
861
1079
  function clipLine( s1, s2 ) {
862
1080
 
863
1081
  let alpha1 = 0, alpha2 = 1;