@gnsx/three 0.185.16 → 0.186.1

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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -1,25 +1,20 @@
1
1
  import {
2
- BufferGeometry,
3
- Color,
4
- Float32BufferAttribute,
5
- Vector2,
6
- Vector3,
7
- Vector4
2
+ BufferAttribute,
3
+ BufferGeometry
8
4
  } from '@gnsx/three';
9
- import * as BufferGeometryUtils from '../utils/BufferGeometryUtils.js';
10
-
11
- const _cb = new Vector3(), _ab = new Vector3();
5
+ import { MeshoptSimplifier } from '../libs/meshopt_simplifier.module.js';
6
+ import { mergeVertices } from '../utils/BufferGeometryUtils.js';
12
7
 
13
8
  /**
14
9
  * This class can be used to modify a geometry by simplifying it. A typical use
15
10
  * case for such a modifier is automatic LOD generation.
16
11
  *
17
- * The implementation is based on [Progressive Mesh type Polygon Reduction Algorithm](https://web.archive.org/web/20230610044040/http://www.melax.com/polychop/)
18
- * by Stan Melax in 1998.
12
+ * The implementation is based on [meshoptimizer]{@link https://github.com/zeux/meshoptimizer}.
13
+ * If you only need a simplified index buffer, use {@link MeshoptSimplifier} directly.
19
14
  *
20
15
  * ```js
21
16
  * const modifier = new SimplifyModifier();
22
- * geometry = modifier.modify( geometry );
17
+ * geometry = await modifier.modify( geometry, count );
23
18
  * ```
24
19
  *
25
20
  * @three_import import { SimplifyModifier } from 'three/addons/modifiers/SimplifyModifier.js';
@@ -27,206 +22,113 @@ const _cb = new Vector3(), _ab = new Vector3();
27
22
  class SimplifyModifier {
28
23
 
29
24
  /**
30
- * Returns a new, modified version of the given geometry by applying a simplification.
31
- * Please note that the resulting geometry is always non-indexed.
25
+ * Returns a new, simplified version of the given geometry. The vertex buffers
26
+ * of the result only contain vertices referenced by the simplified index.
32
27
  *
28
+ * @async
33
29
  * @param {BufferGeometry} geometry - The geometry to modify.
34
- * @param {number} count - The number of vertices to remove.
35
- * @return {BufferGeometry} A new, modified geometry.
30
+ * @param {number} count - The approximate number of vertices to remove.
31
+ * @return {Promise<BufferGeometry>} A promise that resolves with the new, modified geometry.
36
32
  */
37
- modify( geometry, count ) {
38
-
39
- geometry = geometry.clone();
40
-
41
- // currently morphAttributes are not supported
42
- delete geometry.morphAttributes.position;
43
- delete geometry.morphAttributes.normal;
44
- const attributes = geometry.attributes;
45
-
46
- // this modifier can only process indexed and non-indexed geometries with at least a position attribute
47
-
48
- for ( const name in attributes ) {
49
-
50
- if ( name !== 'position' && name !== 'uv' && name !== 'normal' && name !== 'tangent' && name !== 'color' ) geometry.deleteAttribute( name );
51
-
52
- }
53
-
54
- geometry = BufferGeometryUtils.mergeVertices( geometry );
33
+ async modify( geometry, count ) {
55
34
 
56
- //
57
- // put data of original geometry in different data structures
58
- //
35
+ await MeshoptSimplifier.ready;
59
36
 
60
- const vertices = [];
61
- const faces = [];
37
+ // non-indexed geometries must be welded so the simplifier can collapse edges
62
38
 
63
- // add vertices
39
+ if ( geometry.getIndex() === null ) geometry = mergeVertices( geometry );
64
40
 
41
+ const index = geometry.getIndex();
65
42
  const positionAttribute = geometry.getAttribute( 'position' );
66
- const uvAttribute = geometry.getAttribute( 'uv' );
67
- const normalAttribute = geometry.getAttribute( 'normal' );
68
- const tangentAttribute = geometry.getAttribute( 'tangent' );
69
- const colorAttribute = geometry.getAttribute( 'color' );
70
-
71
- let t = null;
72
- let v2 = null;
73
- let nor = null;
74
- let col = null;
75
-
76
- for ( let i = 0; i < positionAttribute.count; i ++ ) {
77
-
78
- const v = new Vector3().fromBufferAttribute( positionAttribute, i );
79
- if ( uvAttribute ) {
80
-
81
- v2 = new Vector2().fromBufferAttribute( uvAttribute, i );
82
-
83
- }
84
-
85
- if ( normalAttribute ) {
86
-
87
- nor = new Vector3().fromBufferAttribute( normalAttribute, i );
88
-
89
- }
90
43
 
91
- if ( tangentAttribute ) {
44
+ // the simplifier requires tightly packed positions
92
45
 
93
- t = new Vector4().fromBufferAttribute( tangentAttribute, i );
46
+ const positions = new Float32Array( positionAttribute.count * 3 );
94
47
 
95
- }
48
+ for ( let i = 0; i < positionAttribute.count; i ++ ) {
96
49
 
97
- if ( colorAttribute ) {
50
+ positions[ i * 3 + 0 ] = positionAttribute.getX( i );
51
+ positions[ i * 3 + 1 ] = positionAttribute.getY( i );
52
+ positions[ i * 3 + 2 ] = positionAttribute.getZ( i );
98
53
 
99
- col = new Color().fromBufferAttribute( colorAttribute, i );
54
+ }
100
55
 
101
- }
56
+ const ratio = Math.min( 1, Math.max( 0, 1 - count / positionAttribute.count ) );
57
+ const targetIndexCount = Math.max( 3, Math.floor( index.count * ratio / 3 ) * 3 );
102
58
 
103
- const vertex = new Vertex( v, v2, nor, t, col );
104
- vertices.push( vertex );
59
+ // normals and uvs, when present, contribute to the error metric so collapses
60
+ // that would distort shading or texture seams are penalized
105
61
 
106
- }
62
+ const normalAttribute = geometry.getAttribute( 'normal' );
63
+ const uvAttribute = geometry.getAttribute( 'uv' );
64
+ const attributeStride = ( normalAttribute ? 3 : 0 ) + ( uvAttribute ? 2 : 0 );
107
65
 
108
- // add faces
66
+ let indices;
109
67
 
110
- let index = geometry.getIndex();
68
+ if ( attributeStride > 0 ) {
111
69
 
112
- if ( index !== null ) {
70
+ const vertexAttributes = new Float32Array( positionAttribute.count * attributeStride );
71
+ const attributeWeights = [];
113
72
 
114
- for ( let i = 0; i < index.count; i += 3 ) {
73
+ if ( normalAttribute ) attributeWeights.push( 0.25, 0.25, 0.25 );
74
+ if ( uvAttribute ) attributeWeights.push( 0.5, 0.5 );
115
75
 
116
- const a = index.getX( i );
117
- const b = index.getX( i + 1 );
118
- const c = index.getX( i + 2 );
76
+ for ( let i = 0, o = 0; i < positionAttribute.count; i ++ ) {
119
77
 
120
- const triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );
121
- faces.push( triangle );
78
+ if ( normalAttribute ) {
122
79
 
123
- }
80
+ vertexAttributes[ o ++ ] = normalAttribute.getX( i );
81
+ vertexAttributes[ o ++ ] = normalAttribute.getY( i );
82
+ vertexAttributes[ o ++ ] = normalAttribute.getZ( i );
124
83
 
125
- } else {
84
+ }
126
85
 
127
- for ( let i = 0; i < positionAttribute.count; i += 3 ) {
86
+ if ( uvAttribute ) {
128
87
 
129
- const a = i;
130
- const b = i + 1;
131
- const c = i + 2;
88
+ vertexAttributes[ o ++ ] = uvAttribute.getX( i );
89
+ vertexAttributes[ o ++ ] = uvAttribute.getY( i );
132
90
 
133
- const triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );
134
- faces.push( triangle );
91
+ }
135
92
 
136
93
  }
137
94
 
138
- }
139
-
140
- // compute all edge collapse costs
95
+ indices = MeshoptSimplifier.simplifyWithAttributes( index.array, positions, 3, vertexAttributes, attributeStride, attributeWeights, null, targetIndexCount, 1 )[ 0 ];
141
96
 
142
- for ( let i = 0, il = vertices.length; i < il; i ++ ) {
97
+ } else {
143
98
 
144
- computeEdgeCostAtVertex( vertices[ i ] );
99
+ indices = MeshoptSimplifier.simplify( index.array, positions, 3, targetIndexCount, 1 )[ 0 ];
145
100
 
146
101
  }
147
102
 
148
- let nextVertex;
103
+ // drop vertices that are no longer referenced and rebuild the attributes
149
104
 
150
- let z = count;
151
-
152
- while ( z -- ) {
153
-
154
- nextVertex = minimumCostEdge( vertices );
155
-
156
- if ( ! nextVertex ) {
157
-
158
- console.log( 'THREE.SimplifyModifier: No next vertex' );
159
- break;
160
-
161
- }
162
-
163
- collapse( vertices, faces, nextVertex, nextVertex.collapseNeighbor );
164
-
165
- }
166
-
167
- //
105
+ const [ remap, unique ] = MeshoptSimplifier.compactMesh( indices ); // rewrites indices in place
168
106
 
169
107
  const simplifiedGeometry = new BufferGeometry();
170
- const position = [];
171
- const uv = [];
172
- const normal = [];
173
- const tangent = [];
174
- const color = [];
175
-
176
- index = [];
177
-
178
- //
179
-
180
- for ( let i = 0; i < vertices.length; i ++ ) {
181
108
 
182
- const vertex = vertices[ i ];
183
- position.push( vertex.position.x, vertex.position.y, vertex.position.z );
184
- if ( vertex.uv ) {
109
+ for ( const name in geometry.attributes ) {
185
110
 
186
- uv.push( vertex.uv.x, vertex.uv.y );
111
+ const attribute = geometry.getAttribute( name );
112
+ const itemSize = attribute.itemSize;
113
+ const newAttribute = new BufferAttribute( new attribute.array.constructor( unique * itemSize ), itemSize, attribute.normalized );
187
114
 
188
- }
189
-
190
- if ( vertex.normal ) {
115
+ // scatter each vertex to its new slot; 0xffffffff marks unreferenced vertices
191
116
 
192
- normal.push( vertex.normal.x, vertex.normal.y, vertex.normal.z );
117
+ for ( let i = 0; i < remap.length; i ++ ) {
193
118
 
194
- }
119
+ const target = remap[ i ];
195
120
 
196
- if ( vertex.tangent ) {
121
+ if ( target === 0xffffffff ) continue;
197
122
 
198
- tangent.push( vertex.tangent.x, vertex.tangent.y, vertex.tangent.z, vertex.tangent.w );
123
+ for ( let k = 0; k < itemSize; k ++ ) newAttribute.setComponent( target, k, attribute.getComponent( i, k ) );
199
124
 
200
125
  }
201
126
 
202
- if ( vertex.color ) {
203
-
204
- color.push( vertex.color.r, vertex.color.g, vertex.color.b );
205
-
206
- }
207
-
208
-
209
- // cache final index to GREATLY speed up faces reconstruction
210
- vertex.id = i;
211
-
212
- }
213
-
214
- //
215
-
216
- for ( let i = 0; i < faces.length; i ++ ) {
217
-
218
- const face = faces[ i ];
219
- index.push( face.v1.id, face.v2.id, face.v3.id );
127
+ simplifiedGeometry.setAttribute( name, newAttribute );
220
128
 
221
129
  }
222
130
 
223
- simplifiedGeometry.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );
224
- if ( uv.length > 0 ) simplifiedGeometry.setAttribute( 'uv', new Float32BufferAttribute( uv, 2 ) );
225
- if ( normal.length > 0 ) simplifiedGeometry.setAttribute( 'normal', new Float32BufferAttribute( normal, 3 ) );
226
- if ( tangent.length > 0 ) simplifiedGeometry.setAttribute( 'tangent', new Float32BufferAttribute( tangent, 4 ) );
227
- if ( color.length > 0 ) simplifiedGeometry.setAttribute( 'color', new Float32BufferAttribute( color, 3 ) );
228
-
229
- simplifiedGeometry.setIndex( index );
131
+ simplifiedGeometry.setIndex( new BufferAttribute( indices, 1 ) );
230
132
 
231
133
  return simplifiedGeometry;
232
134
 
@@ -234,399 +136,4 @@ class SimplifyModifier {
234
136
 
235
137
  }
236
138
 
237
- function pushIfUnique( array, object ) {
238
-
239
- if ( array.indexOf( object ) === - 1 ) array.push( object );
240
-
241
- }
242
-
243
- function removeFromArray( array, object ) {
244
-
245
- const k = array.indexOf( object );
246
- if ( k > - 1 ) array.splice( k, 1 );
247
-
248
- }
249
-
250
- function computeEdgeCollapseCost( u, v ) {
251
-
252
- // if we collapse edge uv by moving u to v then how
253
- // much different will the model change, i.e. the "error".
254
-
255
- const edgelength = v.position.distanceTo( u.position );
256
- let curvature = 0;
257
-
258
- const sideFaces = [];
259
-
260
- // find the "sides" triangles that are on the edge uv
261
- for ( let i = 0, il = u.faces.length; i < il; i ++ ) {
262
-
263
- const face = u.faces[ i ];
264
-
265
- if ( face.hasVertex( v ) ) {
266
-
267
- sideFaces.push( face );
268
-
269
- }
270
-
271
- }
272
-
273
- // use the triangle facing most away from the sides
274
- // to determine our curvature term
275
- for ( let i = 0, il = u.faces.length; i < il; i ++ ) {
276
-
277
- let minCurvature = 1;
278
- const face = u.faces[ i ];
279
-
280
- for ( let j = 0; j < sideFaces.length; j ++ ) {
281
-
282
- const sideFace = sideFaces[ j ];
283
- // use dot product of face normals.
284
- const dotProd = face.normal.dot( sideFace.normal );
285
- minCurvature = Math.min( minCurvature, ( 1.001 - dotProd ) / 2 );
286
-
287
- }
288
-
289
- curvature = Math.max( curvature, minCurvature );
290
-
291
- }
292
-
293
- // crude approach in attempt to preserve borders
294
- // though it seems not to be totally correct
295
- const borders = 0;
296
-
297
- if ( sideFaces.length < 2 ) {
298
-
299
- // we add some arbitrary cost for borders,
300
- // borders += 10;
301
- curvature = 1;
302
-
303
- }
304
-
305
- const amt = edgelength * curvature + borders;
306
-
307
- return amt;
308
-
309
- }
310
-
311
- function computeEdgeCostAtVertex( v ) {
312
-
313
- // compute the edge collapse cost for all edges that start
314
- // from vertex v. Since we are only interested in reducing
315
- // the object by selecting the min cost edge at each step, we
316
- // only cache the cost of the least cost edge at this vertex
317
- // (in member variable collapse) as well as the value of the
318
- // cost (in member variable collapseCost).
319
-
320
- if ( v.neighbors.length === 0 ) {
321
-
322
- // collapse if no neighbors.
323
- v.collapseNeighbor = null;
324
- v.collapseCost = - 0.01;
325
-
326
- return;
327
-
328
- }
329
-
330
- v.collapseCost = 100000;
331
- v.collapseNeighbor = null;
332
-
333
- // search all neighboring edges for "least cost" edge
334
- for ( let i = 0; i < v.neighbors.length; i ++ ) {
335
-
336
- const collapseCost = computeEdgeCollapseCost( v, v.neighbors[ i ] );
337
-
338
- if ( ! v.collapseNeighbor ) {
339
-
340
- v.collapseNeighbor = v.neighbors[ i ];
341
- v.collapseCost = collapseCost;
342
- v.minCost = collapseCost;
343
- v.totalCost = 0;
344
- v.costCount = 0;
345
-
346
- }
347
-
348
- v.costCount ++;
349
- v.totalCost += collapseCost;
350
-
351
- if ( collapseCost < v.minCost ) {
352
-
353
- v.collapseNeighbor = v.neighbors[ i ];
354
- v.minCost = collapseCost;
355
-
356
- }
357
-
358
- }
359
-
360
- // we average the cost of collapsing at this vertex
361
- v.collapseCost = v.totalCost / v.costCount;
362
- // v.collapseCost = v.minCost;
363
-
364
- }
365
-
366
- function removeVertex( v, vertices ) {
367
-
368
- console.assert( v.faces.length === 0 );
369
-
370
- while ( v.neighbors.length ) {
371
-
372
- const n = v.neighbors.pop();
373
- removeFromArray( n.neighbors, v );
374
-
375
- }
376
-
377
- removeFromArray( vertices, v );
378
-
379
- }
380
-
381
- function removeFace( f, faces ) {
382
-
383
- removeFromArray( faces, f );
384
-
385
- if ( f.v1 ) removeFromArray( f.v1.faces, f );
386
- if ( f.v2 ) removeFromArray( f.v2.faces, f );
387
- if ( f.v3 ) removeFromArray( f.v3.faces, f );
388
-
389
- // TODO optimize this!
390
- const vs = [ f.v1, f.v2, f.v3 ];
391
-
392
- for ( let i = 0; i < 3; i ++ ) {
393
-
394
- const v1 = vs[ i ];
395
- const v2 = vs[ ( i + 1 ) % 3 ];
396
-
397
- if ( ! v1 || ! v2 ) continue;
398
-
399
- v1.removeIfNonNeighbor( v2 );
400
- v2.removeIfNonNeighbor( v1 );
401
-
402
- }
403
-
404
- }
405
-
406
- function collapse( vertices, faces, u, v ) {
407
-
408
- // Collapse the edge uv by moving vertex u onto v
409
-
410
- if ( ! v ) {
411
-
412
- // u is a vertex all by itself so just delete it..
413
- removeVertex( u, vertices );
414
- return;
415
-
416
- }
417
-
418
- if ( v.uv ) {
419
-
420
- u.uv.copy( v.uv );
421
-
422
- }
423
-
424
- if ( v.normal ) {
425
-
426
- v.normal.add( u.normal ).normalize();
427
-
428
- }
429
-
430
- if ( v.tangent ) {
431
-
432
- v.tangent.add( u.tangent ).normalize();
433
-
434
- }
435
-
436
- const tmpVertices = [];
437
-
438
- for ( let i = 0; i < u.neighbors.length; i ++ ) {
439
-
440
- tmpVertices.push( u.neighbors[ i ] );
441
-
442
- }
443
-
444
-
445
- // delete triangles on edge uv:
446
- for ( let i = u.faces.length - 1; i >= 0; i -- ) {
447
-
448
- if ( u.faces[ i ] && u.faces[ i ].hasVertex( v ) ) {
449
-
450
- removeFace( u.faces[ i ], faces );
451
-
452
- }
453
-
454
- }
455
-
456
- // update remaining triangles to have v instead of u
457
- for ( let i = u.faces.length - 1; i >= 0; i -- ) {
458
-
459
- u.faces[ i ].replaceVertex( u, v );
460
-
461
- }
462
-
463
-
464
- removeVertex( u, vertices );
465
-
466
- // recompute the edge collapse costs in neighborhood
467
- for ( let i = 0; i < tmpVertices.length; i ++ ) {
468
-
469
- computeEdgeCostAtVertex( tmpVertices[ i ] );
470
-
471
- }
472
-
473
- }
474
-
475
-
476
-
477
- function minimumCostEdge( vertices ) {
478
-
479
- // O(n * n) approach. TODO optimize this
480
-
481
- let least = vertices[ 0 ];
482
-
483
- for ( let i = 0; i < vertices.length; i ++ ) {
484
-
485
- if ( vertices[ i ].collapseCost < least.collapseCost ) {
486
-
487
- least = vertices[ i ];
488
-
489
- }
490
-
491
- }
492
-
493
- return least;
494
-
495
- }
496
-
497
- // we use a triangle class to represent structure of face slightly differently
498
-
499
- class Triangle {
500
-
501
- constructor( v1, v2, v3, a, b, c ) {
502
-
503
- this.a = a;
504
- this.b = b;
505
- this.c = c;
506
-
507
- this.v1 = v1;
508
- this.v2 = v2;
509
- this.v3 = v3;
510
-
511
- this.normal = new Vector3();
512
-
513
- this.computeNormal();
514
-
515
- v1.faces.push( this );
516
- v1.addUniqueNeighbor( v2 );
517
- v1.addUniqueNeighbor( v3 );
518
-
519
- v2.faces.push( this );
520
- v2.addUniqueNeighbor( v1 );
521
- v2.addUniqueNeighbor( v3 );
522
-
523
-
524
- v3.faces.push( this );
525
- v3.addUniqueNeighbor( v1 );
526
- v3.addUniqueNeighbor( v2 );
527
-
528
- }
529
-
530
- computeNormal() {
531
-
532
- const vA = this.v1.position;
533
- const vB = this.v2.position;
534
- const vC = this.v3.position;
535
-
536
- _cb.subVectors( vC, vB );
537
- _ab.subVectors( vA, vB );
538
- _cb.cross( _ab ).normalize();
539
-
540
- this.normal.copy( _cb );
541
-
542
- }
543
-
544
- hasVertex( v ) {
545
-
546
- return v === this.v1 || v === this.v2 || v === this.v3;
547
-
548
- }
549
-
550
- replaceVertex( oldv, newv ) {
551
-
552
- if ( oldv === this.v1 ) this.v1 = newv;
553
- else if ( oldv === this.v2 ) this.v2 = newv;
554
- else if ( oldv === this.v3 ) this.v3 = newv;
555
-
556
- removeFromArray( oldv.faces, this );
557
- newv.faces.push( this );
558
-
559
-
560
- oldv.removeIfNonNeighbor( this.v1 );
561
- this.v1.removeIfNonNeighbor( oldv );
562
-
563
- oldv.removeIfNonNeighbor( this.v2 );
564
- this.v2.removeIfNonNeighbor( oldv );
565
-
566
- oldv.removeIfNonNeighbor( this.v3 );
567
- this.v3.removeIfNonNeighbor( oldv );
568
-
569
- this.v1.addUniqueNeighbor( this.v2 );
570
- this.v1.addUniqueNeighbor( this.v3 );
571
-
572
- this.v2.addUniqueNeighbor( this.v1 );
573
- this.v2.addUniqueNeighbor( this.v3 );
574
-
575
- this.v3.addUniqueNeighbor( this.v1 );
576
- this.v3.addUniqueNeighbor( this.v2 );
577
-
578
- this.computeNormal();
579
-
580
- }
581
-
582
- }
583
-
584
- class Vertex {
585
-
586
- constructor( v, uv, normal, tangent, color ) {
587
-
588
- this.position = v;
589
- this.uv = uv;
590
- this.normal = normal;
591
- this.tangent = tangent;
592
- this.color = color;
593
-
594
- this.id = - 1; // external use position in vertices list (for e.g. face generation)
595
-
596
- this.faces = []; // faces vertex is connected
597
- this.neighbors = []; // neighbouring vertices aka "adjacentVertices"
598
-
599
- // these will be computed in computeEdgeCostAtVertex()
600
- this.collapseCost = 0; // cost of collapsing this vertex, the less the better. aka objdist
601
- this.collapseNeighbor = null; // best candidate for collapsing
602
-
603
- }
604
-
605
- addUniqueNeighbor( vertex ) {
606
-
607
- pushIfUnique( this.neighbors, vertex );
608
-
609
- }
610
-
611
- removeIfNonNeighbor( n ) {
612
-
613
- const neighbors = this.neighbors;
614
- const faces = this.faces;
615
-
616
- const offset = neighbors.indexOf( n );
617
-
618
- if ( offset === - 1 ) return;
619
-
620
- for ( let i = 0; i < faces.length; i ++ ) {
621
-
622
- if ( faces[ i ].hasVertex( n ) ) return;
623
-
624
- }
625
-
626
- neighbors.splice( offset, 1 );
627
-
628
- }
629
-
630
- }
631
-
632
139
  export { SimplifyModifier };