three-stdlib 2.35.3 → 2.35.4

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 (514) hide show
  1. package/_polyfill/CapsuleGeometry.cjs +20 -17
  2. package/_polyfill/CapsuleGeometry.cjs.map +1 -1
  3. package/_polyfill/CapsuleGeometry.js +20 -17
  4. package/_polyfill/CapsuleGeometry.js.map +1 -1
  5. package/_polyfill/constants.cjs +1 -1
  6. package/_polyfill/constants.cjs.map +1 -1
  7. package/_polyfill/constants.js +1 -1
  8. package/_polyfill/constants.js.map +1 -1
  9. package/animation/AnimationClipCreator.cjs +13 -13
  10. package/animation/AnimationClipCreator.cjs.map +1 -1
  11. package/animation/AnimationClipCreator.js +13 -13
  12. package/animation/AnimationClipCreator.js.map +1 -1
  13. package/animation/CCDIKSolver.cjs +11 -11
  14. package/animation/CCDIKSolver.cjs.map +1 -1
  15. package/animation/CCDIKSolver.js +12 -12
  16. package/animation/CCDIKSolver.js.map +1 -1
  17. package/animation/MMDAnimationHelper.cjs +1 -1
  18. package/animation/MMDAnimationHelper.cjs.map +1 -1
  19. package/animation/MMDAnimationHelper.js +1 -1
  20. package/animation/MMDAnimationHelper.js.map +1 -1
  21. package/animation/MMDPhysics.cjs +4 -4
  22. package/animation/MMDPhysics.cjs.map +1 -1
  23. package/animation/MMDPhysics.js +4 -4
  24. package/animation/MMDPhysics.js.map +1 -1
  25. package/controls/ArcballControls.cjs +2 -2
  26. package/controls/ArcballControls.cjs.map +1 -1
  27. package/controls/ArcballControls.js +3 -3
  28. package/controls/ArcballControls.js.map +1 -1
  29. package/controls/FirstPersonControls.cjs +1 -1
  30. package/controls/FirstPersonControls.cjs.map +1 -1
  31. package/controls/FirstPersonControls.js +1 -1
  32. package/controls/FirstPersonControls.js.map +1 -1
  33. package/controls/OrbitControls.cjs +2 -2
  34. package/controls/OrbitControls.cjs.map +1 -1
  35. package/controls/OrbitControls.js +3 -3
  36. package/controls/OrbitControls.js.map +1 -1
  37. package/controls/PointerLockControls.cjs +2 -2
  38. package/controls/PointerLockControls.cjs.map +1 -1
  39. package/controls/PointerLockControls.js +3 -3
  40. package/controls/PointerLockControls.js.map +1 -1
  41. package/csm/CSM.cjs +4 -4
  42. package/csm/CSM.cjs.map +1 -1
  43. package/csm/CSM.js +5 -5
  44. package/csm/CSM.js.map +1 -1
  45. package/csm/CSMFrustum.cjs +1 -1
  46. package/csm/CSMFrustum.cjs.map +1 -1
  47. package/csm/CSMFrustum.js +2 -2
  48. package/csm/CSMFrustum.js.map +1 -1
  49. package/deprecated/Geometry.cjs +722 -715
  50. package/deprecated/Geometry.cjs.map +1 -1
  51. package/deprecated/Geometry.js +723 -716
  52. package/deprecated/Geometry.js.map +1 -1
  53. package/effects/AnaglyphEffect.cjs +2 -1
  54. package/effects/AnaglyphEffect.cjs.map +1 -1
  55. package/effects/AnaglyphEffect.js +3 -2
  56. package/effects/AnaglyphEffect.js.map +1 -1
  57. package/effects/OutlineEffect.cjs +2 -1
  58. package/effects/OutlineEffect.cjs.map +1 -1
  59. package/effects/OutlineEffect.js +3 -2
  60. package/effects/OutlineEffect.js.map +1 -1
  61. package/effects/ParallaxBarrierEffect.cjs +2 -1
  62. package/effects/ParallaxBarrierEffect.cjs.map +1 -1
  63. package/effects/ParallaxBarrierEffect.js +3 -2
  64. package/effects/ParallaxBarrierEffect.js.map +1 -1
  65. package/exporters/DRACOExporter.cjs +133 -122
  66. package/exporters/DRACOExporter.cjs.map +1 -1
  67. package/exporters/DRACOExporter.d.ts +23 -21
  68. package/exporters/DRACOExporter.js +133 -122
  69. package/exporters/DRACOExporter.js.map +1 -1
  70. package/exporters/GLTFExporter.cjs +170 -167
  71. package/exporters/GLTFExporter.cjs.map +1 -1
  72. package/exporters/GLTFExporter.js +170 -167
  73. package/exporters/GLTFExporter.js.map +1 -1
  74. package/geometries/LightningStrike.cjs +524 -515
  75. package/geometries/LightningStrike.cjs.map +1 -1
  76. package/geometries/LightningStrike.js +524 -515
  77. package/geometries/LightningStrike.js.map +1 -1
  78. package/geometries/RoundedBoxGeometry.cjs +1 -1
  79. package/geometries/RoundedBoxGeometry.cjs.map +1 -1
  80. package/geometries/RoundedBoxGeometry.js +2 -2
  81. package/geometries/RoundedBoxGeometry.js.map +1 -1
  82. package/helpers/RaycasterHelper.cjs +2 -2
  83. package/helpers/RaycasterHelper.cjs.map +1 -1
  84. package/helpers/RaycasterHelper.js +3 -3
  85. package/helpers/RaycasterHelper.js.map +1 -1
  86. package/helpers/VertexNormalsHelper.cjs +3 -3
  87. package/helpers/VertexNormalsHelper.cjs.map +1 -1
  88. package/helpers/VertexNormalsHelper.js +4 -4
  89. package/helpers/VertexNormalsHelper.js.map +1 -1
  90. package/helpers/VertexTangentsHelper.cjs +2 -2
  91. package/helpers/VertexTangentsHelper.cjs.map +1 -1
  92. package/helpers/VertexTangentsHelper.js +3 -3
  93. package/helpers/VertexTangentsHelper.js.map +1 -1
  94. package/interactive/InteractiveGroup.cjs +1 -1
  95. package/interactive/InteractiveGroup.cjs.map +1 -1
  96. package/interactive/InteractiveGroup.js +2 -2
  97. package/interactive/InteractiveGroup.js.map +1 -1
  98. package/interactive/SelectionBox.cjs +15 -15
  99. package/interactive/SelectionBox.cjs.map +1 -1
  100. package/interactive/SelectionBox.js +16 -16
  101. package/interactive/SelectionBox.js.map +1 -1
  102. package/libs/chevrotain.cjs +1 -1
  103. package/libs/chevrotain.cjs.map +1 -1
  104. package/libs/chevrotain.js +1 -1
  105. package/libs/chevrotain.js.map +1 -1
  106. package/libs/lottie.cjs +1 -1
  107. package/libs/lottie.cjs.map +1 -1
  108. package/libs/lottie.js +1 -1
  109. package/libs/lottie.js.map +1 -1
  110. package/libs/opentype.cjs +1 -1
  111. package/libs/opentype.cjs.map +1 -1
  112. package/libs/opentype.js +1 -1
  113. package/libs/opentype.js.map +1 -1
  114. package/lights/LightProbeGenerator.cjs +5 -5
  115. package/lights/LightProbeGenerator.cjs.map +1 -1
  116. package/lights/LightProbeGenerator.js +5 -5
  117. package/lights/LightProbeGenerator.js.map +1 -1
  118. package/lights/RectAreaLightUniformsLib.cjs +3 -3
  119. package/lights/RectAreaLightUniformsLib.cjs.map +1 -1
  120. package/lights/RectAreaLightUniformsLib.js +3 -3
  121. package/lights/RectAreaLightUniformsLib.js.map +1 -1
  122. package/lines/LineMaterial.cjs +2 -1
  123. package/lines/LineMaterial.cjs.map +1 -1
  124. package/lines/LineMaterial.js +3 -2
  125. package/lines/LineMaterial.js.map +1 -1
  126. package/lines/LineSegments2.cjs +13 -13
  127. package/lines/LineSegments2.cjs.map +1 -1
  128. package/lines/LineSegments2.js +14 -14
  129. package/lines/LineSegments2.js.map +1 -1
  130. package/lines/LineSegmentsGeometry.cjs +2 -2
  131. package/lines/LineSegmentsGeometry.cjs.map +1 -1
  132. package/lines/LineSegmentsGeometry.js +3 -3
  133. package/lines/LineSegmentsGeometry.js.map +1 -1
  134. package/lines/Wireframe.cjs +3 -3
  135. package/lines/Wireframe.cjs.map +1 -1
  136. package/lines/Wireframe.js +4 -4
  137. package/lines/Wireframe.js.map +1 -1
  138. package/loaders/BasisTextureLoader.cjs +441 -435
  139. package/loaders/BasisTextureLoader.cjs.map +1 -1
  140. package/loaders/BasisTextureLoader.js +441 -435
  141. package/loaders/BasisTextureLoader.js.map +1 -1
  142. package/loaders/EXRLoader.cjs +2 -1
  143. package/loaders/EXRLoader.cjs.map +1 -1
  144. package/loaders/EXRLoader.js +3 -2
  145. package/loaders/EXRLoader.js.map +1 -1
  146. package/loaders/FBXLoader.cjs +2 -2
  147. package/loaders/FBXLoader.cjs.map +1 -1
  148. package/loaders/FBXLoader.js +2 -2
  149. package/loaders/FBXLoader.js.map +1 -1
  150. package/loaders/FontLoader.cjs +2 -2
  151. package/loaders/FontLoader.cjs.map +1 -1
  152. package/loaders/FontLoader.d.ts +2 -2
  153. package/loaders/FontLoader.js +2 -2
  154. package/loaders/FontLoader.js.map +1 -1
  155. package/loaders/GLTFLoader.cjs +2 -2
  156. package/loaders/GLTFLoader.cjs.map +1 -1
  157. package/loaders/GLTFLoader.js +2 -2
  158. package/loaders/GLTFLoader.js.map +1 -1
  159. package/loaders/KTX2Loader.cjs +377 -374
  160. package/loaders/KTX2Loader.cjs.map +1 -1
  161. package/loaders/KTX2Loader.js +377 -374
  162. package/loaders/KTX2Loader.js.map +1 -1
  163. package/loaders/LDrawLoader.cjs +5 -4
  164. package/loaders/LDrawLoader.cjs.map +1 -1
  165. package/loaders/LDrawLoader.js +6 -5
  166. package/loaders/LDrawLoader.js.map +1 -1
  167. package/loaders/OBJLoader.cjs +5 -5
  168. package/loaders/OBJLoader.cjs.map +1 -1
  169. package/loaders/OBJLoader.js +6 -6
  170. package/loaders/OBJLoader.js.map +1 -1
  171. package/loaders/PRWMLoader.cjs +46 -43
  172. package/loaders/PRWMLoader.cjs.map +1 -1
  173. package/loaders/PRWMLoader.js +46 -43
  174. package/loaders/PRWMLoader.js.map +1 -1
  175. package/loaders/SVGLoader.cjs +1694 -1688
  176. package/loaders/SVGLoader.cjs.map +1 -1
  177. package/loaders/SVGLoader.js +1694 -1688
  178. package/loaders/SVGLoader.js.map +1 -1
  179. package/loaders/XLoader.cjs +1 -1
  180. package/loaders/XLoader.cjs.map +1 -1
  181. package/loaders/XLoader.js +1 -1
  182. package/loaders/XLoader.js.map +1 -1
  183. package/math/Capsule.cjs +3 -3
  184. package/math/Capsule.cjs.map +1 -1
  185. package/math/Capsule.js +3 -3
  186. package/math/Capsule.js.map +1 -1
  187. package/math/ColorConverter.cjs +9 -9
  188. package/math/ColorConverter.cjs.map +1 -1
  189. package/math/ColorConverter.js +9 -9
  190. package/math/ColorConverter.js.map +1 -1
  191. package/math/ConvexHull.cjs +53 -50
  192. package/math/ConvexHull.cjs.map +1 -1
  193. package/math/ConvexHull.js +53 -50
  194. package/math/ConvexHull.js.map +1 -1
  195. package/math/ImprovedNoise.cjs +1 -1
  196. package/math/ImprovedNoise.cjs.map +1 -1
  197. package/math/ImprovedNoise.js +1 -1
  198. package/math/ImprovedNoise.js.map +1 -1
  199. package/math/MeshSurfaceSampler.cjs +2 -2
  200. package/math/MeshSurfaceSampler.cjs.map +1 -1
  201. package/math/MeshSurfaceSampler.js +2 -2
  202. package/math/MeshSurfaceSampler.js.map +1 -1
  203. package/math/OBB.cjs +14 -14
  204. package/math/OBB.cjs.map +1 -1
  205. package/math/OBB.js +15 -15
  206. package/math/OBB.js.map +1 -1
  207. package/math/Octree.cjs +7 -7
  208. package/math/Octree.cjs.map +1 -1
  209. package/math/Octree.js +8 -8
  210. package/math/Octree.js.map +1 -1
  211. package/misc/ConvexObjectBreaker.cjs +271 -268
  212. package/misc/ConvexObjectBreaker.cjs.map +1 -1
  213. package/misc/ConvexObjectBreaker.js +272 -269
  214. package/misc/ConvexObjectBreaker.js.map +1 -1
  215. package/misc/Gyroscope.cjs +6 -6
  216. package/misc/Gyroscope.cjs.map +1 -1
  217. package/misc/Gyroscope.js +7 -7
  218. package/misc/Gyroscope.js.map +1 -1
  219. package/modifiers/CurveModifier.cjs +1 -1
  220. package/modifiers/CurveModifier.cjs.map +1 -1
  221. package/modifiers/CurveModifier.js +2 -2
  222. package/modifiers/CurveModifier.js.map +1 -1
  223. package/modifiers/SimplifyModifier.cjs +2 -2
  224. package/modifiers/SimplifyModifier.cjs.map +1 -1
  225. package/modifiers/SimplifyModifier.js +2 -2
  226. package/modifiers/SimplifyModifier.js.map +1 -1
  227. package/objects/BatchedMesh.cjs +2 -2
  228. package/objects/BatchedMesh.cjs.map +1 -1
  229. package/objects/BatchedMesh.js +3 -3
  230. package/objects/BatchedMesh.js.map +1 -1
  231. package/objects/GroundProjectedEnv.cjs +2 -1
  232. package/objects/GroundProjectedEnv.cjs.map +1 -1
  233. package/objects/GroundProjectedEnv.js +3 -2
  234. package/objects/GroundProjectedEnv.js.map +1 -1
  235. package/objects/Lensflare.cjs +209 -206
  236. package/objects/Lensflare.cjs.map +1 -1
  237. package/objects/Lensflare.js +209 -206
  238. package/objects/Lensflare.js.map +1 -1
  239. package/objects/Reflector.cjs +154 -146
  240. package/objects/Reflector.cjs.map +1 -1
  241. package/objects/Reflector.js +154 -146
  242. package/objects/Reflector.js.map +1 -1
  243. package/objects/ReflectorForSSRPass.cjs +183 -180
  244. package/objects/ReflectorForSSRPass.cjs.map +1 -1
  245. package/objects/ReflectorForSSRPass.js +183 -180
  246. package/objects/ReflectorForSSRPass.js.map +1 -1
  247. package/objects/Refractor.cjs +164 -161
  248. package/objects/Refractor.cjs.map +1 -1
  249. package/objects/Refractor.js +164 -161
  250. package/objects/Refractor.js.map +1 -1
  251. package/objects/ShadowMesh.cjs +1 -1
  252. package/objects/ShadowMesh.cjs.map +1 -1
  253. package/objects/ShadowMesh.js +2 -2
  254. package/objects/ShadowMesh.js.map +1 -1
  255. package/objects/Sky.cjs +35 -32
  256. package/objects/Sky.cjs.map +1 -1
  257. package/objects/Sky.d.ts +100 -6
  258. package/objects/Sky.js +35 -32
  259. package/objects/Sky.js.map +1 -1
  260. package/objects/Water.cjs +2 -1
  261. package/objects/Water.cjs.map +1 -1
  262. package/objects/Water.js +3 -2
  263. package/objects/Water.js.map +1 -1
  264. package/objects/Water2.cjs +143 -140
  265. package/objects/Water2.cjs.map +1 -1
  266. package/objects/Water2.js +143 -140
  267. package/objects/Water2.js.map +1 -1
  268. package/package.json +1 -1
  269. package/postprocessing/SAOPass.cjs +267 -264
  270. package/postprocessing/SAOPass.cjs.map +1 -1
  271. package/postprocessing/SAOPass.js +267 -264
  272. package/postprocessing/SAOPass.js.map +1 -1
  273. package/postprocessing/SSAOPass.cjs +253 -250
  274. package/postprocessing/SSAOPass.cjs.map +1 -1
  275. package/postprocessing/SSAOPass.js +253 -250
  276. package/postprocessing/SSAOPass.js.map +1 -1
  277. package/postprocessing/SSRPass.cjs +379 -376
  278. package/postprocessing/SSRPass.cjs.map +1 -1
  279. package/postprocessing/SSRPass.js +379 -376
  280. package/postprocessing/SSRPass.js.map +1 -1
  281. package/postprocessing/UnrealBloomPass.cjs +205 -202
  282. package/postprocessing/UnrealBloomPass.cjs.map +1 -1
  283. package/postprocessing/UnrealBloomPass.js +205 -202
  284. package/postprocessing/UnrealBloomPass.js.map +1 -1
  285. package/renderers/CSS2DRenderer.cjs +5 -5
  286. package/renderers/CSS2DRenderer.cjs.map +1 -1
  287. package/renderers/CSS2DRenderer.js +5 -5
  288. package/renderers/CSS2DRenderer.js.map +1 -1
  289. package/renderers/CSS3DRenderer.cjs +5 -5
  290. package/renderers/CSS3DRenderer.cjs.map +1 -1
  291. package/renderers/CSS3DRenderer.js +6 -6
  292. package/renderers/CSS3DRenderer.js.map +1 -1
  293. package/shaders/ACESFilmicToneMappingShader.cjs +71 -46
  294. package/shaders/ACESFilmicToneMappingShader.cjs.map +1 -1
  295. package/shaders/ACESFilmicToneMappingShader.js +71 -46
  296. package/shaders/ACESFilmicToneMappingShader.js.map +1 -1
  297. package/shaders/AfterimageShader.cjs +41 -22
  298. package/shaders/AfterimageShader.cjs.map +1 -1
  299. package/shaders/AfterimageShader.js +41 -22
  300. package/shaders/AfterimageShader.js.map +1 -1
  301. package/shaders/BasicShader.cjs +20 -6
  302. package/shaders/BasicShader.cjs.map +1 -1
  303. package/shaders/BasicShader.js +20 -6
  304. package/shaders/BasicShader.js.map +1 -1
  305. package/shaders/BleachBypassShader.cjs +46 -26
  306. package/shaders/BleachBypassShader.cjs.map +1 -1
  307. package/shaders/BleachBypassShader.js +46 -26
  308. package/shaders/BleachBypassShader.js.map +1 -1
  309. package/shaders/BlendShader.cjs +33 -19
  310. package/shaders/BlendShader.cjs.map +1 -1
  311. package/shaders/BlendShader.js +33 -19
  312. package/shaders/BlendShader.js.map +1 -1
  313. package/shaders/BokehShader.cjs +117 -90
  314. package/shaders/BokehShader.cjs.map +1 -1
  315. package/shaders/BokehShader.js +117 -90
  316. package/shaders/BokehShader.js.map +1 -1
  317. package/shaders/BokehShader2.cjs +333 -232
  318. package/shaders/BokehShader2.cjs.map +1 -1
  319. package/shaders/BokehShader2.js +333 -232
  320. package/shaders/BokehShader2.js.map +1 -1
  321. package/shaders/BrightnessContrastShader.cjs +38 -22
  322. package/shaders/BrightnessContrastShader.cjs.map +1 -1
  323. package/shaders/BrightnessContrastShader.js +38 -22
  324. package/shaders/BrightnessContrastShader.js.map +1 -1
  325. package/shaders/ColorCorrectionShader.cjs +35 -21
  326. package/shaders/ColorCorrectionShader.cjs.map +1 -1
  327. package/shaders/ColorCorrectionShader.js +35 -21
  328. package/shaders/ColorCorrectionShader.js.map +1 -1
  329. package/shaders/ColorifyShader.cjs +34 -19
  330. package/shaders/ColorifyShader.cjs.map +1 -1
  331. package/shaders/ColorifyShader.js +34 -19
  332. package/shaders/ColorifyShader.js.map +1 -1
  333. package/shaders/ConvolutionShader.cjs +43 -24
  334. package/shaders/ConvolutionShader.cjs.map +1 -1
  335. package/shaders/ConvolutionShader.js +43 -24
  336. package/shaders/ConvolutionShader.js.map +1 -1
  337. package/shaders/CopyShader.cjs +30 -16
  338. package/shaders/CopyShader.cjs.map +1 -1
  339. package/shaders/CopyShader.js +30 -16
  340. package/shaders/CopyShader.js.map +1 -1
  341. package/shaders/DOFMipMapShader.cjs +38 -21
  342. package/shaders/DOFMipMapShader.cjs.map +1 -1
  343. package/shaders/DOFMipMapShader.js +38 -21
  344. package/shaders/DOFMipMapShader.js.map +1 -1
  345. package/shaders/DepthLimitedBlurShader.cjs +98 -69
  346. package/shaders/DepthLimitedBlurShader.cjs.map +1 -1
  347. package/shaders/DepthLimitedBlurShader.js +98 -69
  348. package/shaders/DepthLimitedBlurShader.js.map +1 -1
  349. package/shaders/DigitalGlitch.cjs +70 -59
  350. package/shaders/DigitalGlitch.cjs.map +1 -1
  351. package/shaders/DigitalGlitch.js +70 -59
  352. package/shaders/DigitalGlitch.js.map +1 -1
  353. package/shaders/DotScreenShader.cjs +49 -28
  354. package/shaders/DotScreenShader.cjs.map +1 -1
  355. package/shaders/DotScreenShader.js +49 -28
  356. package/shaders/DotScreenShader.js.map +1 -1
  357. package/shaders/FXAAShader.cjs +1098 -1089
  358. package/shaders/FXAAShader.cjs.map +1 -1
  359. package/shaders/FXAAShader.js +1098 -1089
  360. package/shaders/FXAAShader.js.map +1 -1
  361. package/shaders/FilmShader.cjs +57 -29
  362. package/shaders/FilmShader.cjs.map +1 -1
  363. package/shaders/FilmShader.js +57 -29
  364. package/shaders/FilmShader.js.map +1 -1
  365. package/shaders/FocusShader.cjs +70 -43
  366. package/shaders/FocusShader.cjs.map +1 -1
  367. package/shaders/FocusShader.js +70 -43
  368. package/shaders/FocusShader.js.map +1 -1
  369. package/shaders/FreiChenShader.cjs +74 -53
  370. package/shaders/FreiChenShader.cjs.map +1 -1
  371. package/shaders/FreiChenShader.js +74 -53
  372. package/shaders/FreiChenShader.js.map +1 -1
  373. package/shaders/FresnelShader.cjs +55 -35
  374. package/shaders/FresnelShader.cjs.map +1 -1
  375. package/shaders/FresnelShader.js +55 -35
  376. package/shaders/FresnelShader.js.map +1 -1
  377. package/shaders/GammaCorrectionShader.cjs +33 -19
  378. package/shaders/GammaCorrectionShader.cjs.map +1 -1
  379. package/shaders/GammaCorrectionShader.js +33 -19
  380. package/shaders/GammaCorrectionShader.js.map +1 -1
  381. package/shaders/GodRaysShader.cjs +193 -116
  382. package/shaders/GodRaysShader.cjs.map +1 -1
  383. package/shaders/GodRaysShader.js +193 -116
  384. package/shaders/GodRaysShader.js.map +1 -1
  385. package/shaders/HalftoneShader.cjs +270 -192
  386. package/shaders/HalftoneShader.cjs.map +1 -1
  387. package/shaders/HalftoneShader.js +270 -192
  388. package/shaders/HalftoneShader.js.map +1 -1
  389. package/shaders/HorizontalTiltShiftShader.cjs +43 -27
  390. package/shaders/HorizontalTiltShiftShader.cjs.map +1 -1
  391. package/shaders/HorizontalTiltShiftShader.js +43 -27
  392. package/shaders/HorizontalTiltShiftShader.js.map +1 -1
  393. package/shaders/HueSaturationShader.cjs +47 -31
  394. package/shaders/HueSaturationShader.cjs.map +1 -1
  395. package/shaders/HueSaturationShader.js +47 -31
  396. package/shaders/HueSaturationShader.js.map +1 -1
  397. package/shaders/KaleidoShader.cjs +37 -24
  398. package/shaders/KaleidoShader.cjs.map +1 -1
  399. package/shaders/KaleidoShader.js +37 -24
  400. package/shaders/KaleidoShader.js.map +1 -1
  401. package/shaders/LuminosityHighPassShader.cjs +43 -24
  402. package/shaders/LuminosityHighPassShader.cjs.map +1 -1
  403. package/shaders/LuminosityHighPassShader.js +43 -24
  404. package/shaders/LuminosityHighPassShader.js.map +1 -1
  405. package/shaders/LuminosityShader.cjs +34 -17
  406. package/shaders/LuminosityShader.cjs.map +1 -1
  407. package/shaders/LuminosityShader.js +34 -17
  408. package/shaders/LuminosityShader.js.map +1 -1
  409. package/shaders/MirrorShader.cjs +39 -26
  410. package/shaders/MirrorShader.cjs.map +1 -1
  411. package/shaders/MirrorShader.js +39 -26
  412. package/shaders/MirrorShader.js.map +1 -1
  413. package/shaders/NormalMapShader.cjs +36 -21
  414. package/shaders/NormalMapShader.cjs.map +1 -1
  415. package/shaders/NormalMapShader.js +36 -21
  416. package/shaders/NormalMapShader.js.map +1 -1
  417. package/shaders/ParallaxShader.cjs +147 -97
  418. package/shaders/ParallaxShader.cjs.map +1 -1
  419. package/shaders/ParallaxShader.js +147 -97
  420. package/shaders/ParallaxShader.js.map +1 -1
  421. package/shaders/PixelShader.cjs +31 -18
  422. package/shaders/PixelShader.cjs.map +1 -1
  423. package/shaders/PixelShader.js +31 -18
  424. package/shaders/PixelShader.js.map +1 -1
  425. package/shaders/RGBShiftShader.cjs +33 -20
  426. package/shaders/RGBShiftShader.cjs.map +1 -1
  427. package/shaders/RGBShiftShader.js +33 -20
  428. package/shaders/RGBShiftShader.js.map +1 -1
  429. package/shaders/SAOShader.cjs +154 -117
  430. package/shaders/SAOShader.cjs.map +1 -1
  431. package/shaders/SAOShader.js +154 -117
  432. package/shaders/SAOShader.js.map +1 -1
  433. package/shaders/SMAAShader.cjs +358 -270
  434. package/shaders/SMAAShader.cjs.map +1 -1
  435. package/shaders/SMAAShader.js +358 -270
  436. package/shaders/SMAAShader.js.map +1 -1
  437. package/shaders/SSAOShader.cjs +236 -142
  438. package/shaders/SSAOShader.cjs.map +1 -1
  439. package/shaders/SSAOShader.js +236 -142
  440. package/shaders/SSAOShader.js.map +1 -1
  441. package/shaders/SSRShader.cjs +4 -4
  442. package/shaders/SSRShader.cjs.map +1 -1
  443. package/shaders/SSRShader.js +4 -4
  444. package/shaders/SSRShader.js.map +1 -1
  445. package/shaders/SepiaShader.cjs +36 -20
  446. package/shaders/SepiaShader.cjs.map +1 -1
  447. package/shaders/SepiaShader.js +36 -20
  448. package/shaders/SepiaShader.js.map +1 -1
  449. package/shaders/SobelOperatorShader.cjs +64 -37
  450. package/shaders/SobelOperatorShader.cjs.map +1 -1
  451. package/shaders/SobelOperatorShader.js +64 -37
  452. package/shaders/SobelOperatorShader.js.map +1 -1
  453. package/shaders/TechnicolorShader.cjs +29 -16
  454. package/shaders/TechnicolorShader.cjs.map +1 -1
  455. package/shaders/TechnicolorShader.js +29 -16
  456. package/shaders/TechnicolorShader.js.map +1 -1
  457. package/shaders/ToneMapShader.cjs +55 -35
  458. package/shaders/ToneMapShader.cjs.map +1 -1
  459. package/shaders/ToneMapShader.js +55 -35
  460. package/shaders/ToneMapShader.js.map +1 -1
  461. package/shaders/ToonShader.cjs +275 -165
  462. package/shaders/ToonShader.cjs.map +1 -1
  463. package/shaders/ToonShader.js +275 -165
  464. package/shaders/ToonShader.js.map +1 -1
  465. package/shaders/TriangleBlurShader.cjs +50 -27
  466. package/shaders/TriangleBlurShader.cjs.map +1 -1
  467. package/shaders/TriangleBlurShader.js +50 -27
  468. package/shaders/TriangleBlurShader.js.map +1 -1
  469. package/shaders/UnpackDepthRGBAShader.cjs +32 -17
  470. package/shaders/UnpackDepthRGBAShader.cjs.map +1 -1
  471. package/shaders/UnpackDepthRGBAShader.js +32 -17
  472. package/shaders/UnpackDepthRGBAShader.js.map +1 -1
  473. package/shaders/VerticalTiltShiftShader.cjs +43 -27
  474. package/shaders/VerticalTiltShiftShader.cjs.map +1 -1
  475. package/shaders/VerticalTiltShiftShader.js +43 -27
  476. package/shaders/VerticalTiltShiftShader.js.map +1 -1
  477. package/shaders/VignetteShader.cjs +43 -27
  478. package/shaders/VignetteShader.cjs.map +1 -1
  479. package/shaders/VignetteShader.js +43 -27
  480. package/shaders/VignetteShader.js.map +1 -1
  481. package/shaders/VolumeShader.cjs +264 -213
  482. package/shaders/VolumeShader.cjs.map +1 -1
  483. package/shaders/VolumeShader.js +264 -213
  484. package/shaders/VolumeShader.js.map +1 -1
  485. package/shaders/WaterRefractionShader.cjs +63 -35
  486. package/shaders/WaterRefractionShader.cjs.map +1 -1
  487. package/shaders/WaterRefractionShader.js +63 -35
  488. package/shaders/WaterRefractionShader.js.map +1 -1
  489. package/utils/GeometryCompressionUtils.cjs +2 -1
  490. package/utils/GeometryCompressionUtils.cjs.map +1 -1
  491. package/utils/GeometryCompressionUtils.js +3 -2
  492. package/utils/GeometryCompressionUtils.js.map +1 -1
  493. package/utils/RoughnessMipmapper.cjs +3 -3
  494. package/utils/RoughnessMipmapper.cjs.map +1 -1
  495. package/utils/RoughnessMipmapper.js +4 -4
  496. package/utils/RoughnessMipmapper.js.map +1 -1
  497. package/webxr/ARButton.cjs +109 -106
  498. package/webxr/ARButton.cjs.map +1 -1
  499. package/webxr/ARButton.d.ts +4 -3
  500. package/webxr/ARButton.js +109 -106
  501. package/webxr/ARButton.js.map +1 -1
  502. package/webxr/OculusHandPointerModel.cjs +2 -2
  503. package/webxr/OculusHandPointerModel.cjs.map +1 -1
  504. package/webxr/OculusHandPointerModel.js +2 -2
  505. package/webxr/OculusHandPointerModel.js.map +1 -1
  506. package/webxr/VRButton.cjs +98 -95
  507. package/webxr/VRButton.cjs.map +1 -1
  508. package/webxr/VRButton.d.ts +6 -5
  509. package/webxr/VRButton.js +98 -95
  510. package/webxr/VRButton.js.map +1 -1
  511. package/webxr/XRHandPrimitiveModel.cjs +2 -2
  512. package/webxr/XRHandPrimitiveModel.cjs.map +1 -1
  513. package/webxr/XRHandPrimitiveModel.js +3 -3
  514. package/webxr/XRHandPrimitiveModel.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ConvexObjectBreaker.js","sources":["../../src/misc/ConvexObjectBreaker.js"],"sourcesContent":["import { Line3, Mesh, Plane, Vector3 } from 'three'\nimport { ConvexGeometry } from '../geometries/ConvexGeometry'\n\n/**\n * @fileoverview This class can be used to subdivide a convex Geometry object into pieces.\n *\n * Usage:\n *\n * Use the function prepareBreakableObject to prepare a Mesh object to be broken.\n *\n * Then, call the various functions to subdivide the object (subdivideByImpact, cutByPlane)\n *\n * Sub-objects that are product of subdivision don't need prepareBreakableObject to be called on them.\n *\n * Requisites for the object:\n *\n * - Mesh object must have a buffer geometry and a material\n *\n * - Vertex normals must be planar (not smoothed)\n *\n * - The geometry must be convex (this is not checked in the library). You can create convex\n * geometries with ConvexGeometry. The BoxGeometry, SphereGeometry and other convex primitives\n * can also be used.\n *\n * Note: This lib adds member variables to object's userData member (see prepareBreakableObject function)\n * Use with caution and read the code when using with other libs.\n *\n * @param {double} minSizeForBreak Min size a debris can have to break.\n * @param {double} smallDelta Max distance to consider that a point belongs to a plane.\n *\n */\n\nconst _v1 = new Vector3()\n\nclass ConvexObjectBreaker {\n constructor(minSizeForBreak = 1.4, smallDelta = 0.0001) {\n this.minSizeForBreak = minSizeForBreak\n this.smallDelta = smallDelta\n\n this.tempLine1 = new Line3()\n this.tempPlane1 = new Plane()\n this.tempPlane2 = new Plane()\n this.tempPlane_Cut = new Plane()\n this.tempCM1 = new Vector3()\n this.tempCM2 = new Vector3()\n this.tempVector3 = new Vector3()\n this.tempVector3_2 = new Vector3()\n this.tempVector3_3 = new Vector3()\n this.tempVector3_P0 = new Vector3()\n this.tempVector3_P1 = new Vector3()\n this.tempVector3_P2 = new Vector3()\n this.tempVector3_N0 = new Vector3()\n this.tempVector3_N1 = new Vector3()\n this.tempVector3_AB = new Vector3()\n this.tempVector3_CB = new Vector3()\n this.tempResultObjects = { object1: null, object2: null }\n\n this.segments = []\n const n = 30 * 30\n for (let i = 0; i < n; i++) this.segments[i] = false\n }\n\n prepareBreakableObject(object, mass, velocity, angularVelocity, breakable) {\n // object is a Object3d (normally a Mesh), must have a buffer geometry, and it must be convex.\n // Its material property is propagated to its children (sub-pieces)\n // mass must be > 0\n\n const userData = object.userData\n userData.mass = mass\n userData.velocity = velocity.clone()\n userData.angularVelocity = angularVelocity.clone()\n userData.breakable = breakable\n }\n\n /*\n * @param {int} maxRadialIterations Iterations for radial cuts.\n * @param {int} maxRandomIterations Max random iterations for not-radial cuts\n *\n * Returns the array of pieces\n */\n subdivideByImpact(object, pointOfImpact, normal, maxRadialIterations, maxRandomIterations) {\n const debris = []\n\n const tempPlane1 = this.tempPlane1\n const tempPlane2 = this.tempPlane2\n\n this.tempVector3.addVectors(pointOfImpact, normal)\n tempPlane1.setFromCoplanarPoints(pointOfImpact, object.position, this.tempVector3)\n\n const maxTotalIterations = maxRandomIterations + maxRadialIterations\n\n const scope = this\n\n function subdivideRadial(subObject, startAngle, endAngle, numIterations) {\n if (Math.random() < numIterations * 0.05 || numIterations > maxTotalIterations) {\n debris.push(subObject)\n\n return\n }\n\n let angle = Math.PI\n\n if (numIterations === 0) {\n tempPlane2.normal.copy(tempPlane1.normal)\n tempPlane2.constant = tempPlane1.constant\n } else {\n if (numIterations <= maxRadialIterations) {\n angle = (endAngle - startAngle) * (0.2 + 0.6 * Math.random()) + startAngle\n\n // Rotate tempPlane2 at impact point around normal axis and the angle\n scope.tempVector3_2.copy(object.position).sub(pointOfImpact).applyAxisAngle(normal, angle).add(pointOfImpact)\n tempPlane2.setFromCoplanarPoints(pointOfImpact, scope.tempVector3, scope.tempVector3_2)\n } else {\n angle = (0.5 * (numIterations & 1) + 0.2 * (2 - Math.random())) * Math.PI\n\n // Rotate tempPlane2 at object position around normal axis and the angle\n scope.tempVector3_2\n .copy(pointOfImpact)\n .sub(subObject.position)\n .applyAxisAngle(normal, angle)\n .add(subObject.position)\n scope.tempVector3_3.copy(normal).add(subObject.position)\n tempPlane2.setFromCoplanarPoints(subObject.position, scope.tempVector3_3, scope.tempVector3_2)\n }\n }\n\n // Perform the cut\n scope.cutByPlane(subObject, tempPlane2, scope.tempResultObjects)\n\n const obj1 = scope.tempResultObjects.object1\n const obj2 = scope.tempResultObjects.object2\n\n if (obj1) {\n subdivideRadial(obj1, startAngle, angle, numIterations + 1)\n }\n\n if (obj2) {\n subdivideRadial(obj2, angle, endAngle, numIterations + 1)\n }\n }\n\n subdivideRadial(object, 0, 2 * Math.PI, 0)\n\n return debris\n }\n\n cutByPlane(object, plane, output) {\n // Returns breakable objects in output.object1 and output.object2 members, the resulting 2 pieces of the cut.\n // object2 can be null if the plane doesn't cut the object.\n // object1 can be null only in case of internal error\n // Returned value is number of pieces, 0 for error.\n\n const geometry = object.geometry\n const coords = geometry.attributes.position.array\n const normals = geometry.attributes.normal.array\n\n const numPoints = coords.length / 3\n let numFaces = numPoints / 3\n\n let indices = geometry.getIndex()\n\n if (indices) {\n indices = indices.array\n numFaces = indices.length / 3\n }\n\n function getVertexIndex(faceIdx, vert) {\n // vert = 0, 1 or 2.\n\n const idx = faceIdx * 3 + vert\n\n return indices ? indices[idx] : idx\n }\n\n const points1 = []\n const points2 = []\n\n const delta = this.smallDelta\n\n // Reset segments mark\n const numPointPairs = numPoints * numPoints\n for (let i = 0; i < numPointPairs; i++) this.segments[i] = false\n\n const p0 = this.tempVector3_P0\n const p1 = this.tempVector3_P1\n const n0 = this.tempVector3_N0\n const n1 = this.tempVector3_N1\n\n // Iterate through the faces to mark edges shared by coplanar faces\n for (let i = 0; i < numFaces - 1; i++) {\n const a1 = getVertexIndex(i, 0)\n const b1 = getVertexIndex(i, 1)\n const c1 = getVertexIndex(i, 2)\n\n // Assuming all 3 vertices have the same normal\n n0.set(normals[a1], normals[a1] + 1, normals[a1] + 2)\n\n for (let j = i + 1; j < numFaces; j++) {\n const a2 = getVertexIndex(j, 0)\n const b2 = getVertexIndex(j, 1)\n const c2 = getVertexIndex(j, 2)\n\n // Assuming all 3 vertices have the same normal\n n1.set(normals[a2], normals[a2] + 1, normals[a2] + 2)\n\n const coplanar = 1 - n0.dot(n1) < delta\n\n if (coplanar) {\n if (a1 === a2 || a1 === b2 || a1 === c2) {\n if (b1 === a2 || b1 === b2 || b1 === c2) {\n this.segments[a1 * numPoints + b1] = true\n this.segments[b1 * numPoints + a1] = true\n } else {\n this.segments[c1 * numPoints + a1] = true\n this.segments[a1 * numPoints + c1] = true\n }\n } else if (b1 === a2 || b1 === b2 || b1 === c2) {\n this.segments[c1 * numPoints + b1] = true\n this.segments[b1 * numPoints + c1] = true\n }\n }\n }\n }\n\n // Transform the plane to object local space\n const localPlane = this.tempPlane_Cut\n object.updateMatrix()\n ConvexObjectBreaker.transformPlaneToLocalSpace(plane, object.matrix, localPlane)\n\n // Iterate through the faces adding points to both pieces\n for (let i = 0; i < numFaces; i++) {\n const va = getVertexIndex(i, 0)\n const vb = getVertexIndex(i, 1)\n const vc = getVertexIndex(i, 2)\n\n for (let segment = 0; segment < 3; segment++) {\n const i0 = segment === 0 ? va : segment === 1 ? vb : vc\n const i1 = segment === 0 ? vb : segment === 1 ? vc : va\n\n const segmentState = this.segments[i0 * numPoints + i1]\n\n if (segmentState) continue // The segment already has been processed in another face\n\n // Mark segment as processed (also inverted segment)\n this.segments[i0 * numPoints + i1] = true\n this.segments[i1 * numPoints + i0] = true\n\n p0.set(coords[3 * i0], coords[3 * i0 + 1], coords[3 * i0 + 2])\n p1.set(coords[3 * i1], coords[3 * i1 + 1], coords[3 * i1 + 2])\n\n // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n let mark0 = 0\n\n let d = localPlane.distanceToPoint(p0)\n\n if (d > delta) {\n mark0 = 2\n points2.push(p0.clone())\n } else if (d < -delta) {\n mark0 = 1\n points1.push(p0.clone())\n } else {\n mark0 = 3\n points1.push(p0.clone())\n points2.push(p0.clone())\n }\n\n // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n let mark1 = 0\n\n d = localPlane.distanceToPoint(p1)\n\n if (d > delta) {\n mark1 = 2\n points2.push(p1.clone())\n } else if (d < -delta) {\n mark1 = 1\n points1.push(p1.clone())\n } else {\n mark1 = 3\n points1.push(p1.clone())\n points2.push(p1.clone())\n }\n\n if ((mark0 === 1 && mark1 === 2) || (mark0 === 2 && mark1 === 1)) {\n // Intersection of segment with the plane\n\n this.tempLine1.start.copy(p0)\n this.tempLine1.end.copy(p1)\n\n let intersection = new Vector3()\n intersection = localPlane.intersectLine(this.tempLine1, intersection)\n\n if (intersection === null) {\n // Shouldn't happen\n console.error('Internal error: segment does not intersect plane.')\n output.segmentedObject1 = null\n output.segmentedObject2 = null\n return 0\n }\n\n points1.push(intersection)\n points2.push(intersection.clone())\n }\n }\n }\n\n // Calculate debris mass (very fast and imprecise):\n const newMass = object.userData.mass * 0.5\n\n // Calculate debris Center of Mass (again fast and imprecise)\n this.tempCM1.set(0, 0, 0)\n let radius1 = 0\n const numPoints1 = points1.length\n\n if (numPoints1 > 0) {\n for (let i = 0; i < numPoints1; i++) this.tempCM1.add(points1[i])\n\n this.tempCM1.divideScalar(numPoints1)\n for (let i = 0; i < numPoints1; i++) {\n const p = points1[i]\n p.sub(this.tempCM1)\n radius1 = Math.max(radius1, p.x, p.y, p.z)\n }\n\n this.tempCM1.add(object.position)\n }\n\n this.tempCM2.set(0, 0, 0)\n let radius2 = 0\n const numPoints2 = points2.length\n if (numPoints2 > 0) {\n for (let i = 0; i < numPoints2; i++) this.tempCM2.add(points2[i])\n\n this.tempCM2.divideScalar(numPoints2)\n for (let i = 0; i < numPoints2; i++) {\n const p = points2[i]\n p.sub(this.tempCM2)\n radius2 = Math.max(radius2, p.x, p.y, p.z)\n }\n\n this.tempCM2.add(object.position)\n }\n\n let object1 = null\n let object2 = null\n\n let numObjects = 0\n\n if (numPoints1 > 4) {\n object1 = new Mesh(new ConvexGeometry(points1), object.material)\n object1.position.copy(this.tempCM1)\n object1.quaternion.copy(object.quaternion)\n\n this.prepareBreakableObject(\n object1,\n newMass,\n object.userData.velocity,\n object.userData.angularVelocity,\n 2 * radius1 > this.minSizeForBreak,\n )\n\n numObjects++\n }\n\n if (numPoints2 > 4) {\n object2 = new Mesh(new ConvexGeometry(points2), object.material)\n object2.position.copy(this.tempCM2)\n object2.quaternion.copy(object.quaternion)\n\n this.prepareBreakableObject(\n object2,\n newMass,\n object.userData.velocity,\n object.userData.angularVelocity,\n 2 * radius2 > this.minSizeForBreak,\n )\n\n numObjects++\n }\n\n output.object1 = object1\n output.object2 = object2\n\n return numObjects\n }\n\n static transformFreeVector(v, m) {\n // input:\n // vector interpreted as a free vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[4] * y + e[8] * z\n v.y = e[1] * x + e[5] * y + e[9] * z\n v.z = e[2] * x + e[6] * y + e[10] * z\n\n return v\n }\n\n static transformFreeVectorInverse(v, m) {\n // input:\n // vector interpreted as a free vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[1] * y + e[2] * z\n v.y = e[4] * x + e[5] * y + e[6] * z\n v.z = e[8] * x + e[9] * y + e[10] * z\n\n return v\n }\n\n static transformTiedVectorInverse(v, m) {\n // input:\n // vector interpreted as a tied (ordinary) vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[1] * y + e[2] * z - e[12]\n v.y = e[4] * x + e[5] * y + e[6] * z - e[13]\n v.z = e[8] * x + e[9] * y + e[10] * z - e[14]\n\n return v\n }\n\n static transformPlaneToLocalSpace(plane, m, resultPlane) {\n resultPlane.normal.copy(plane.normal)\n resultPlane.constant = plane.constant\n\n const referencePoint = ConvexObjectBreaker.transformTiedVectorInverse(plane.coplanarPoint(_v1), m)\n\n ConvexObjectBreaker.transformFreeVectorInverse(resultPlane.normal, m)\n\n // recalculate constant (like in setFromNormalAndCoplanarPoint)\n resultPlane.constant = -referencePoint.dot(resultPlane.normal)\n }\n}\n\nexport { ConvexObjectBreaker }\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConvexObjectBreaker.js","sources":["../../src/misc/ConvexObjectBreaker.js"],"sourcesContent":["import { Line3, Mesh, Plane, Vector3 } from 'three'\nimport { ConvexGeometry } from '../geometries/ConvexGeometry'\n\n/**\n * @fileoverview This class can be used to subdivide a convex Geometry object into pieces.\n *\n * Usage:\n *\n * Use the function prepareBreakableObject to prepare a Mesh object to be broken.\n *\n * Then, call the various functions to subdivide the object (subdivideByImpact, cutByPlane)\n *\n * Sub-objects that are product of subdivision don't need prepareBreakableObject to be called on them.\n *\n * Requisites for the object:\n *\n * - Mesh object must have a buffer geometry and a material\n *\n * - Vertex normals must be planar (not smoothed)\n *\n * - The geometry must be convex (this is not checked in the library). You can create convex\n * geometries with ConvexGeometry. The BoxGeometry, SphereGeometry and other convex primitives\n * can also be used.\n *\n * Note: This lib adds member variables to object's userData member (see prepareBreakableObject function)\n * Use with caution and read the code when using with other libs.\n *\n * @param {double} minSizeForBreak Min size a debris can have to break.\n * @param {double} smallDelta Max distance to consider that a point belongs to a plane.\n *\n */\n\nconst _v1 = /* @__PURE__ */ new Vector3()\n\nconst ConvexObjectBreaker = /* @__PURE__ */ (() => {\n class ConvexObjectBreaker {\n constructor(minSizeForBreak = 1.4, smallDelta = 0.0001) {\n this.minSizeForBreak = minSizeForBreak\n this.smallDelta = smallDelta\n\n this.tempLine1 = new Line3()\n this.tempPlane1 = new Plane()\n this.tempPlane2 = new Plane()\n this.tempPlane_Cut = new Plane()\n this.tempCM1 = new Vector3()\n this.tempCM2 = new Vector3()\n this.tempVector3 = new Vector3()\n this.tempVector3_2 = new Vector3()\n this.tempVector3_3 = new Vector3()\n this.tempVector3_P0 = new Vector3()\n this.tempVector3_P1 = new Vector3()\n this.tempVector3_P2 = new Vector3()\n this.tempVector3_N0 = new Vector3()\n this.tempVector3_N1 = new Vector3()\n this.tempVector3_AB = new Vector3()\n this.tempVector3_CB = new Vector3()\n this.tempResultObjects = { object1: null, object2: null }\n\n this.segments = []\n const n = 30 * 30\n for (let i = 0; i < n; i++) this.segments[i] = false\n }\n\n prepareBreakableObject(object, mass, velocity, angularVelocity, breakable) {\n // object is a Object3d (normally a Mesh), must have a buffer geometry, and it must be convex.\n // Its material property is propagated to its children (sub-pieces)\n // mass must be > 0\n\n const userData = object.userData\n userData.mass = mass\n userData.velocity = velocity.clone()\n userData.angularVelocity = angularVelocity.clone()\n userData.breakable = breakable\n }\n\n /*\n * @param {int} maxRadialIterations Iterations for radial cuts.\n * @param {int} maxRandomIterations Max random iterations for not-radial cuts\n *\n * Returns the array of pieces\n */\n subdivideByImpact(object, pointOfImpact, normal, maxRadialIterations, maxRandomIterations) {\n const debris = []\n\n const tempPlane1 = this.tempPlane1\n const tempPlane2 = this.tempPlane2\n\n this.tempVector3.addVectors(pointOfImpact, normal)\n tempPlane1.setFromCoplanarPoints(pointOfImpact, object.position, this.tempVector3)\n\n const maxTotalIterations = maxRandomIterations + maxRadialIterations\n\n const scope = this\n\n function subdivideRadial(subObject, startAngle, endAngle, numIterations) {\n if (Math.random() < numIterations * 0.05 || numIterations > maxTotalIterations) {\n debris.push(subObject)\n\n return\n }\n\n let angle = Math.PI\n\n if (numIterations === 0) {\n tempPlane2.normal.copy(tempPlane1.normal)\n tempPlane2.constant = tempPlane1.constant\n } else {\n if (numIterations <= maxRadialIterations) {\n angle = (endAngle - startAngle) * (0.2 + 0.6 * Math.random()) + startAngle\n\n // Rotate tempPlane2 at impact point around normal axis and the angle\n scope.tempVector3_2\n .copy(object.position)\n .sub(pointOfImpact)\n .applyAxisAngle(normal, angle)\n .add(pointOfImpact)\n tempPlane2.setFromCoplanarPoints(pointOfImpact, scope.tempVector3, scope.tempVector3_2)\n } else {\n angle = (0.5 * (numIterations & 1) + 0.2 * (2 - Math.random())) * Math.PI\n\n // Rotate tempPlane2 at object position around normal axis and the angle\n scope.tempVector3_2\n .copy(pointOfImpact)\n .sub(subObject.position)\n .applyAxisAngle(normal, angle)\n .add(subObject.position)\n scope.tempVector3_3.copy(normal).add(subObject.position)\n tempPlane2.setFromCoplanarPoints(subObject.position, scope.tempVector3_3, scope.tempVector3_2)\n }\n }\n\n // Perform the cut\n scope.cutByPlane(subObject, tempPlane2, scope.tempResultObjects)\n\n const obj1 = scope.tempResultObjects.object1\n const obj2 = scope.tempResultObjects.object2\n\n if (obj1) {\n subdivideRadial(obj1, startAngle, angle, numIterations + 1)\n }\n\n if (obj2) {\n subdivideRadial(obj2, angle, endAngle, numIterations + 1)\n }\n }\n\n subdivideRadial(object, 0, 2 * Math.PI, 0)\n\n return debris\n }\n\n cutByPlane(object, plane, output) {\n // Returns breakable objects in output.object1 and output.object2 members, the resulting 2 pieces of the cut.\n // object2 can be null if the plane doesn't cut the object.\n // object1 can be null only in case of internal error\n // Returned value is number of pieces, 0 for error.\n\n const geometry = object.geometry\n const coords = geometry.attributes.position.array\n const normals = geometry.attributes.normal.array\n\n const numPoints = coords.length / 3\n let numFaces = numPoints / 3\n\n let indices = geometry.getIndex()\n\n if (indices) {\n indices = indices.array\n numFaces = indices.length / 3\n }\n\n function getVertexIndex(faceIdx, vert) {\n // vert = 0, 1 or 2.\n\n const idx = faceIdx * 3 + vert\n\n return indices ? indices[idx] : idx\n }\n\n const points1 = []\n const points2 = []\n\n const delta = this.smallDelta\n\n // Reset segments mark\n const numPointPairs = numPoints * numPoints\n for (let i = 0; i < numPointPairs; i++) this.segments[i] = false\n\n const p0 = this.tempVector3_P0\n const p1 = this.tempVector3_P1\n const n0 = this.tempVector3_N0\n const n1 = this.tempVector3_N1\n\n // Iterate through the faces to mark edges shared by coplanar faces\n for (let i = 0; i < numFaces - 1; i++) {\n const a1 = getVertexIndex(i, 0)\n const b1 = getVertexIndex(i, 1)\n const c1 = getVertexIndex(i, 2)\n\n // Assuming all 3 vertices have the same normal\n n0.set(normals[a1], normals[a1] + 1, normals[a1] + 2)\n\n for (let j = i + 1; j < numFaces; j++) {\n const a2 = getVertexIndex(j, 0)\n const b2 = getVertexIndex(j, 1)\n const c2 = getVertexIndex(j, 2)\n\n // Assuming all 3 vertices have the same normal\n n1.set(normals[a2], normals[a2] + 1, normals[a2] + 2)\n\n const coplanar = 1 - n0.dot(n1) < delta\n\n if (coplanar) {\n if (a1 === a2 || a1 === b2 || a1 === c2) {\n if (b1 === a2 || b1 === b2 || b1 === c2) {\n this.segments[a1 * numPoints + b1] = true\n this.segments[b1 * numPoints + a1] = true\n } else {\n this.segments[c1 * numPoints + a1] = true\n this.segments[a1 * numPoints + c1] = true\n }\n } else if (b1 === a2 || b1 === b2 || b1 === c2) {\n this.segments[c1 * numPoints + b1] = true\n this.segments[b1 * numPoints + c1] = true\n }\n }\n }\n }\n\n // Transform the plane to object local space\n const localPlane = this.tempPlane_Cut\n object.updateMatrix()\n ConvexObjectBreaker.transformPlaneToLocalSpace(plane, object.matrix, localPlane)\n\n // Iterate through the faces adding points to both pieces\n for (let i = 0; i < numFaces; i++) {\n const va = getVertexIndex(i, 0)\n const vb = getVertexIndex(i, 1)\n const vc = getVertexIndex(i, 2)\n\n for (let segment = 0; segment < 3; segment++) {\n const i0 = segment === 0 ? va : segment === 1 ? vb : vc\n const i1 = segment === 0 ? vb : segment === 1 ? vc : va\n\n const segmentState = this.segments[i0 * numPoints + i1]\n\n if (segmentState) continue // The segment already has been processed in another face\n\n // Mark segment as processed (also inverted segment)\n this.segments[i0 * numPoints + i1] = true\n this.segments[i1 * numPoints + i0] = true\n\n p0.set(coords[3 * i0], coords[3 * i0 + 1], coords[3 * i0 + 2])\n p1.set(coords[3 * i1], coords[3 * i1 + 1], coords[3 * i1 + 2])\n\n // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n let mark0 = 0\n\n let d = localPlane.distanceToPoint(p0)\n\n if (d > delta) {\n mark0 = 2\n points2.push(p0.clone())\n } else if (d < -delta) {\n mark0 = 1\n points1.push(p0.clone())\n } else {\n mark0 = 3\n points1.push(p0.clone())\n points2.push(p0.clone())\n }\n\n // mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n let mark1 = 0\n\n d = localPlane.distanceToPoint(p1)\n\n if (d > delta) {\n mark1 = 2\n points2.push(p1.clone())\n } else if (d < -delta) {\n mark1 = 1\n points1.push(p1.clone())\n } else {\n mark1 = 3\n points1.push(p1.clone())\n points2.push(p1.clone())\n }\n\n if ((mark0 === 1 && mark1 === 2) || (mark0 === 2 && mark1 === 1)) {\n // Intersection of segment with the plane\n\n this.tempLine1.start.copy(p0)\n this.tempLine1.end.copy(p1)\n\n let intersection = new Vector3()\n intersection = localPlane.intersectLine(this.tempLine1, intersection)\n\n if (intersection === null) {\n // Shouldn't happen\n console.error('Internal error: segment does not intersect plane.')\n output.segmentedObject1 = null\n output.segmentedObject2 = null\n return 0\n }\n\n points1.push(intersection)\n points2.push(intersection.clone())\n }\n }\n }\n\n // Calculate debris mass (very fast and imprecise):\n const newMass = object.userData.mass * 0.5\n\n // Calculate debris Center of Mass (again fast and imprecise)\n this.tempCM1.set(0, 0, 0)\n let radius1 = 0\n const numPoints1 = points1.length\n\n if (numPoints1 > 0) {\n for (let i = 0; i < numPoints1; i++) this.tempCM1.add(points1[i])\n\n this.tempCM1.divideScalar(numPoints1)\n for (let i = 0; i < numPoints1; i++) {\n const p = points1[i]\n p.sub(this.tempCM1)\n radius1 = Math.max(radius1, p.x, p.y, p.z)\n }\n\n this.tempCM1.add(object.position)\n }\n\n this.tempCM2.set(0, 0, 0)\n let radius2 = 0\n const numPoints2 = points2.length\n if (numPoints2 > 0) {\n for (let i = 0; i < numPoints2; i++) this.tempCM2.add(points2[i])\n\n this.tempCM2.divideScalar(numPoints2)\n for (let i = 0; i < numPoints2; i++) {\n const p = points2[i]\n p.sub(this.tempCM2)\n radius2 = Math.max(radius2, p.x, p.y, p.z)\n }\n\n this.tempCM2.add(object.position)\n }\n\n let object1 = null\n let object2 = null\n\n let numObjects = 0\n\n if (numPoints1 > 4) {\n object1 = new Mesh(new ConvexGeometry(points1), object.material)\n object1.position.copy(this.tempCM1)\n object1.quaternion.copy(object.quaternion)\n\n this.prepareBreakableObject(\n object1,\n newMass,\n object.userData.velocity,\n object.userData.angularVelocity,\n 2 * radius1 > this.minSizeForBreak,\n )\n\n numObjects++\n }\n\n if (numPoints2 > 4) {\n object2 = new Mesh(new ConvexGeometry(points2), object.material)\n object2.position.copy(this.tempCM2)\n object2.quaternion.copy(object.quaternion)\n\n this.prepareBreakableObject(\n object2,\n newMass,\n object.userData.velocity,\n object.userData.angularVelocity,\n 2 * radius2 > this.minSizeForBreak,\n )\n\n numObjects++\n }\n\n output.object1 = object1\n output.object2 = object2\n\n return numObjects\n }\n\n static transformFreeVector(v, m) {\n // input:\n // vector interpreted as a free vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[4] * y + e[8] * z\n v.y = e[1] * x + e[5] * y + e[9] * z\n v.z = e[2] * x + e[6] * y + e[10] * z\n\n return v\n }\n\n static transformFreeVectorInverse(v, m) {\n // input:\n // vector interpreted as a free vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[1] * y + e[2] * z\n v.y = e[4] * x + e[5] * y + e[6] * z\n v.z = e[8] * x + e[9] * y + e[10] * z\n\n return v\n }\n\n static transformTiedVectorInverse(v, m) {\n // input:\n // vector interpreted as a tied (ordinary) vector\n // THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n const x = v.x,\n y = v.y,\n z = v.z\n const e = m.elements\n\n v.x = e[0] * x + e[1] * y + e[2] * z - e[12]\n v.y = e[4] * x + e[5] * y + e[6] * z - e[13]\n v.z = e[8] * x + e[9] * y + e[10] * z - e[14]\n\n return v\n }\n\n static transformPlaneToLocalSpace(plane, m, resultPlane) {\n resultPlane.normal.copy(plane.normal)\n resultPlane.constant = plane.constant\n\n const referencePoint = ConvexObjectBreaker.transformTiedVectorInverse(plane.coplanarPoint(_v1), m)\n\n ConvexObjectBreaker.transformFreeVectorInverse(resultPlane.normal, m)\n\n // recalculate constant (like in setFromNormalAndCoplanarPoint)\n resultPlane.constant = -referencePoint.dot(resultPlane.normal)\n }\n }\n\n return ConvexObjectBreaker\n})()\n\nexport { ConvexObjectBreaker }\n"],"names":["ConvexObjectBreaker"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const THREE = require("three");
4
- const _translationObject = new THREE.Vector3();
5
- const _quaternionObject = new THREE.Quaternion();
6
- const _scaleObject = new THREE.Vector3();
7
- const _translationWorld = new THREE.Vector3();
8
- const _quaternionWorld = new THREE.Quaternion();
9
- const _scaleWorld = new THREE.Vector3();
4
+ const _translationObject = /* @__PURE__ */ new THREE.Vector3();
5
+ const _quaternionObject = /* @__PURE__ */ new THREE.Quaternion();
6
+ const _scaleObject = /* @__PURE__ */ new THREE.Vector3();
7
+ const _translationWorld = /* @__PURE__ */ new THREE.Vector3();
8
+ const _quaternionWorld = /* @__PURE__ */ new THREE.Quaternion();
9
+ const _scaleWorld = /* @__PURE__ */ new THREE.Vector3();
10
10
  class Gyroscope extends THREE.Object3D {
11
11
  constructor() {
12
12
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"Gyroscope.cjs","sources":["../../src/misc/Gyroscope.js"],"sourcesContent":["import { Object3D, Quaternion, Vector3 } from 'three'\n\nconst _translationObject = new Vector3()\nconst _quaternionObject = new Quaternion()\nconst _scaleObject = new Vector3()\n\nconst _translationWorld = new Vector3()\nconst _quaternionWorld = new Quaternion()\nconst _scaleWorld = new Vector3()\n\nclass Gyroscope extends Object3D {\n constructor() {\n super()\n }\n\n updateMatrixWorld(force) {\n this.matrixAutoUpdate && this.updateMatrix()\n\n // update matrixWorld\n\n if (this.matrixWorldNeedsUpdate || force) {\n if (this.parent !== null) {\n this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix)\n\n this.matrixWorld.decompose(_translationWorld, _quaternionWorld, _scaleWorld)\n this.matrix.decompose(_translationObject, _quaternionObject, _scaleObject)\n\n this.matrixWorld.compose(_translationWorld, _quaternionObject, _scaleWorld)\n } else {\n this.matrixWorld.copy(this.matrix)\n }\n\n this.matrixWorldNeedsUpdate = false\n\n force = true\n }\n\n // update children\n\n for (let i = 0, l = this.children.length; i < l; i++) {\n this.children[i].updateMatrixWorld(force)\n }\n }\n}\n\nexport { Gyroscope }\n"],"names":["Vector3","Quaternion","Object3D"],"mappings":";;;AAEA,MAAM,qBAAqB,IAAIA,MAAAA,QAAS;AACxC,MAAM,oBAAoB,IAAIC,MAAAA,WAAY;AAC1C,MAAM,eAAe,IAAID,MAAAA,QAAS;AAElC,MAAM,oBAAoB,IAAIA,MAAAA,QAAS;AACvC,MAAM,mBAAmB,IAAIC,MAAAA,WAAY;AACzC,MAAM,cAAc,IAAID,MAAAA,QAAS;AAEjC,MAAM,kBAAkBE,MAAAA,SAAS;AAAA,EAC/B,cAAc;AACZ,UAAO;AAAA,EACR;AAAA,EAED,kBAAkB,OAAO;AACvB,SAAK,oBAAoB,KAAK,aAAc;AAI5C,QAAI,KAAK,0BAA0B,OAAO;AACxC,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,YAAY,iBAAiB,KAAK,OAAO,aAAa,KAAK,MAAM;AAEtE,aAAK,YAAY,UAAU,mBAAmB,kBAAkB,WAAW;AAC3E,aAAK,OAAO,UAAU,oBAAoB,mBAAmB,YAAY;AAEzE,aAAK,YAAY,QAAQ,mBAAmB,mBAAmB,WAAW;AAAA,MAClF,OAAa;AACL,aAAK,YAAY,KAAK,KAAK,MAAM;AAAA,MAClC;AAED,WAAK,yBAAyB;AAE9B,cAAQ;AAAA,IACT;AAID,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,IAAI,GAAG,KAAK;AACpD,WAAK,SAAS,CAAC,EAAE,kBAAkB,KAAK;AAAA,IACzC;AAAA,EACF;AACH;;"}
1
+ {"version":3,"file":"Gyroscope.cjs","sources":["../../src/misc/Gyroscope.js"],"sourcesContent":["import { Object3D, Quaternion, Vector3 } from 'three'\n\nconst _translationObject = /* @__PURE__ */ new Vector3()\nconst _quaternionObject = /* @__PURE__ */ new Quaternion()\nconst _scaleObject = /* @__PURE__ */ new Vector3()\n\nconst _translationWorld = /* @__PURE__ */ new Vector3()\nconst _quaternionWorld = /* @__PURE__ */ new Quaternion()\nconst _scaleWorld = /* @__PURE__ */ new Vector3()\n\nclass Gyroscope extends Object3D {\n constructor() {\n super()\n }\n\n updateMatrixWorld(force) {\n this.matrixAutoUpdate && this.updateMatrix()\n\n // update matrixWorld\n\n if (this.matrixWorldNeedsUpdate || force) {\n if (this.parent !== null) {\n this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix)\n\n this.matrixWorld.decompose(_translationWorld, _quaternionWorld, _scaleWorld)\n this.matrix.decompose(_translationObject, _quaternionObject, _scaleObject)\n\n this.matrixWorld.compose(_translationWorld, _quaternionObject, _scaleWorld)\n } else {\n this.matrixWorld.copy(this.matrix)\n }\n\n this.matrixWorldNeedsUpdate = false\n\n force = true\n }\n\n // update children\n\n for (let i = 0, l = this.children.length; i < l; i++) {\n this.children[i].updateMatrixWorld(force)\n }\n }\n}\n\nexport { Gyroscope }\n"],"names":["Vector3","Quaternion","Object3D"],"mappings":";;;AAEA,MAAM,qBAAqC,oBAAIA,MAAAA,QAAS;AACxD,MAAM,oBAAoC,oBAAIC,MAAAA,WAAY;AAC1D,MAAM,eAA+B,oBAAID,MAAAA,QAAS;AAElD,MAAM,oBAAoC,oBAAIA,MAAAA,QAAS;AACvD,MAAM,mBAAmC,oBAAIC,MAAAA,WAAY;AACzD,MAAM,cAA8B,oBAAID,MAAAA,QAAS;AAEjD,MAAM,kBAAkBE,MAAAA,SAAS;AAAA,EAC/B,cAAc;AACZ,UAAO;AAAA,EACR;AAAA,EAED,kBAAkB,OAAO;AACvB,SAAK,oBAAoB,KAAK,aAAc;AAI5C,QAAI,KAAK,0BAA0B,OAAO;AACxC,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,YAAY,iBAAiB,KAAK,OAAO,aAAa,KAAK,MAAM;AAEtE,aAAK,YAAY,UAAU,mBAAmB,kBAAkB,WAAW;AAC3E,aAAK,OAAO,UAAU,oBAAoB,mBAAmB,YAAY;AAEzE,aAAK,YAAY,QAAQ,mBAAmB,mBAAmB,WAAW;AAAA,MAClF,OAAa;AACL,aAAK,YAAY,KAAK,KAAK,MAAM;AAAA,MAClC;AAED,WAAK,yBAAyB;AAE9B,cAAQ;AAAA,IACT;AAID,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,IAAI,GAAG,KAAK;AACpD,WAAK,SAAS,CAAC,EAAE,kBAAkB,KAAK;AAAA,IACzC;AAAA,EACF;AACH;;"}
package/misc/Gyroscope.js CHANGED
@@ -1,10 +1,10 @@
1
- import { Vector3, Quaternion, Object3D } from "three";
2
- const _translationObject = new Vector3();
3
- const _quaternionObject = new Quaternion();
4
- const _scaleObject = new Vector3();
5
- const _translationWorld = new Vector3();
6
- const _quaternionWorld = new Quaternion();
7
- const _scaleWorld = new Vector3();
1
+ import { Object3D, Vector3, Quaternion } from "three";
2
+ const _translationObject = /* @__PURE__ */ new Vector3();
3
+ const _quaternionObject = /* @__PURE__ */ new Quaternion();
4
+ const _scaleObject = /* @__PURE__ */ new Vector3();
5
+ const _translationWorld = /* @__PURE__ */ new Vector3();
6
+ const _quaternionWorld = /* @__PURE__ */ new Quaternion();
7
+ const _scaleWorld = /* @__PURE__ */ new Vector3();
8
8
  class Gyroscope extends Object3D {
9
9
  constructor() {
10
10
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"Gyroscope.js","sources":["../../src/misc/Gyroscope.js"],"sourcesContent":["import { Object3D, Quaternion, Vector3 } from 'three'\n\nconst _translationObject = new Vector3()\nconst _quaternionObject = new Quaternion()\nconst _scaleObject = new Vector3()\n\nconst _translationWorld = new Vector3()\nconst _quaternionWorld = new Quaternion()\nconst _scaleWorld = new Vector3()\n\nclass Gyroscope extends Object3D {\n constructor() {\n super()\n }\n\n updateMatrixWorld(force) {\n this.matrixAutoUpdate && this.updateMatrix()\n\n // update matrixWorld\n\n if (this.matrixWorldNeedsUpdate || force) {\n if (this.parent !== null) {\n this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix)\n\n this.matrixWorld.decompose(_translationWorld, _quaternionWorld, _scaleWorld)\n this.matrix.decompose(_translationObject, _quaternionObject, _scaleObject)\n\n this.matrixWorld.compose(_translationWorld, _quaternionObject, _scaleWorld)\n } else {\n this.matrixWorld.copy(this.matrix)\n }\n\n this.matrixWorldNeedsUpdate = false\n\n force = true\n }\n\n // update children\n\n for (let i = 0, l = this.children.length; i < l; i++) {\n this.children[i].updateMatrixWorld(force)\n }\n }\n}\n\nexport { Gyroscope }\n"],"names":[],"mappings":";AAEA,MAAM,qBAAqB,IAAI,QAAS;AACxC,MAAM,oBAAoB,IAAI,WAAY;AAC1C,MAAM,eAAe,IAAI,QAAS;AAElC,MAAM,oBAAoB,IAAI,QAAS;AACvC,MAAM,mBAAmB,IAAI,WAAY;AACzC,MAAM,cAAc,IAAI,QAAS;AAEjC,MAAM,kBAAkB,SAAS;AAAA,EAC/B,cAAc;AACZ,UAAO;AAAA,EACR;AAAA,EAED,kBAAkB,OAAO;AACvB,SAAK,oBAAoB,KAAK,aAAc;AAI5C,QAAI,KAAK,0BAA0B,OAAO;AACxC,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,YAAY,iBAAiB,KAAK,OAAO,aAAa,KAAK,MAAM;AAEtE,aAAK,YAAY,UAAU,mBAAmB,kBAAkB,WAAW;AAC3E,aAAK,OAAO,UAAU,oBAAoB,mBAAmB,YAAY;AAEzE,aAAK,YAAY,QAAQ,mBAAmB,mBAAmB,WAAW;AAAA,MAClF,OAAa;AACL,aAAK,YAAY,KAAK,KAAK,MAAM;AAAA,MAClC;AAED,WAAK,yBAAyB;AAE9B,cAAQ;AAAA,IACT;AAID,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,IAAI,GAAG,KAAK;AACpD,WAAK,SAAS,CAAC,EAAE,kBAAkB,KAAK;AAAA,IACzC;AAAA,EACF;AACH;"}
1
+ {"version":3,"file":"Gyroscope.js","sources":["../../src/misc/Gyroscope.js"],"sourcesContent":["import { Object3D, Quaternion, Vector3 } from 'three'\n\nconst _translationObject = /* @__PURE__ */ new Vector3()\nconst _quaternionObject = /* @__PURE__ */ new Quaternion()\nconst _scaleObject = /* @__PURE__ */ new Vector3()\n\nconst _translationWorld = /* @__PURE__ */ new Vector3()\nconst _quaternionWorld = /* @__PURE__ */ new Quaternion()\nconst _scaleWorld = /* @__PURE__ */ new Vector3()\n\nclass Gyroscope extends Object3D {\n constructor() {\n super()\n }\n\n updateMatrixWorld(force) {\n this.matrixAutoUpdate && this.updateMatrix()\n\n // update matrixWorld\n\n if (this.matrixWorldNeedsUpdate || force) {\n if (this.parent !== null) {\n this.matrixWorld.multiplyMatrices(this.parent.matrixWorld, this.matrix)\n\n this.matrixWorld.decompose(_translationWorld, _quaternionWorld, _scaleWorld)\n this.matrix.decompose(_translationObject, _quaternionObject, _scaleObject)\n\n this.matrixWorld.compose(_translationWorld, _quaternionObject, _scaleWorld)\n } else {\n this.matrixWorld.copy(this.matrix)\n }\n\n this.matrixWorldNeedsUpdate = false\n\n force = true\n }\n\n // update children\n\n for (let i = 0, l = this.children.length; i < l; i++) {\n this.children[i].updateMatrixWorld(force)\n }\n }\n}\n\nexport { Gyroscope }\n"],"names":[],"mappings":";AAEA,MAAM,qBAAqC,oBAAI,QAAS;AACxD,MAAM,oBAAoC,oBAAI,WAAY;AAC1D,MAAM,eAA+B,oBAAI,QAAS;AAElD,MAAM,oBAAoC,oBAAI,QAAS;AACvD,MAAM,mBAAmC,oBAAI,WAAY;AACzD,MAAM,cAA8B,oBAAI,QAAS;AAEjD,MAAM,kBAAkB,SAAS;AAAA,EAC/B,cAAc;AACZ,UAAO;AAAA,EACR;AAAA,EAED,kBAAkB,OAAO;AACvB,SAAK,oBAAoB,KAAK,aAAc;AAI5C,QAAI,KAAK,0BAA0B,OAAO;AACxC,UAAI,KAAK,WAAW,MAAM;AACxB,aAAK,YAAY,iBAAiB,KAAK,OAAO,aAAa,KAAK,MAAM;AAEtE,aAAK,YAAY,UAAU,mBAAmB,kBAAkB,WAAW;AAC3E,aAAK,OAAO,UAAU,oBAAoB,mBAAmB,YAAY;AAEzE,aAAK,YAAY,QAAQ,mBAAmB,mBAAmB,WAAW;AAAA,MAClF,OAAa;AACL,aAAK,YAAY,KAAK,KAAK,MAAM;AAAA,MAClC;AAED,WAAK,yBAAyB;AAE9B,cAAQ;AAAA,IACT;AAID,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,IAAI,GAAG,KAAK;AACpD,WAAK,SAAS,CAAC,EAAE,kBAAkB,KAAK;AAAA,IACzC;AAAA,EACF;AACH;"}
@@ -171,7 +171,7 @@ class Flow {
171
171
  this.uniforms.pathOffset.value += amount;
172
172
  }
173
173
  }
174
- const matrix = new THREE.Matrix4();
174
+ const matrix = /* @__PURE__ */ new THREE.Matrix4();
175
175
  class InstancedFlow extends Flow {
176
176
  /**
177
177
  *
@@ -1 +1 @@
1
- {"version":3,"file":"CurveModifier.cjs","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":["DataTexture","RGBAFormat","FloatType","RepeatWrapping","NearestFilter","Mesh","InstancedMesh","Matrix4","DynamicDrawUsage"],"mappings":"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"}
1
+ {"version":3,"file":"CurveModifier.cjs","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = /* @__PURE__ */ new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":["DataTexture","RGBAFormat","FloatType","RepeatWrapping","NearestFilter","Mesh","InstancedMesh","Matrix4","DynamicDrawUsage"],"mappings":"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"}
@@ -4,7 +4,7 @@ var __publicField = (obj, key, value) => {
4
4
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  return value;
6
6
  };
7
- import { DataTexture, RGBAFormat, FloatType, RepeatWrapping, NearestFilter, Mesh, InstancedMesh, Matrix4, DynamicDrawUsage } from "three";
7
+ import { DataTexture, RGBAFormat, FloatType, RepeatWrapping, NearestFilter, Mesh, InstancedMesh, DynamicDrawUsage, Matrix4 } from "three";
8
8
  const CHANNELS = 4;
9
9
  const TEXTURE_WIDTH = 1024;
10
10
  const TEXTURE_HEIGHT = 4;
@@ -169,7 +169,7 @@ class Flow {
169
169
  this.uniforms.pathOffset.value += amount;
170
170
  }
171
171
  }
172
- const matrix = new Matrix4();
172
+ const matrix = /* @__PURE__ */ new Matrix4();
173
173
  class InstancedFlow extends Flow {
174
174
  /**
175
175
  *
@@ -1 +1 @@
1
- {"version":3,"file":"CurveModifier.js","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":[],"mappings":";;;;;;;AACA,MAAM,WAAW;AACjB,MAAM,gBAAgB;AACtB,MAAM,iBAAiB;AAwBV,MAAA,oBAAoB,CAAC,iBAAiB,MAAmB;AACpE,QAAM,YAAY,IAAI,aAAa,gBAAgB,iBAAiB,iBAAiB,QAAQ;AACvF,QAAA,cAAc,IAAI,YAAY,WAAW,eAAe,iBAAiB,gBAAgB,YAAY,SAAS;AAEpH,cAAY,QAAQ;AACpB,cAAY,QAAQ;AACpB,cAAY,YAAY;AACxB,cAAY,cAAc;AAEnB,SAAA;AACT;AASO,MAAM,sBAAsB,CACjC,SACA,aACA,SAAS,MACA;AACT,QAAM,iBAAiB,KAAK,MAAM,iBAAiB,iBAAiB,EAAE;AACtE,cAAY,qBAAqB,iBAAiB;AAClD,cAAY,iBAAiB;AACvB,QAAA,SAAS,YAAY,gBAAgB,cAAc;AACzD,QAAM,eAAe,YAAY,oBAAoB,gBAAgB,IAAI;AAEzE,WAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,UAAM,YAAY,KAAK,MAAM,IAAI,aAAa;AAC9C,UAAM,WAAW,IAAI;AAEjB,QAAA,KAAK,OAAO,CAAC;AACD,oBAAA,SAAS,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,iBAAiB,MAAM;AACvF,SAAA,aAAa,SAAS,CAAC;AACZ,oBAAA,SAAS,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,iBAAiB,MAAM;AACvF,SAAA,aAAa,QAAQ,CAAC;AACX,oBAAA,SAAS,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,iBAAiB,MAAM;AACvF,SAAA,aAAa,UAAU,CAAC;AACb,oBAAA,SAAS,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,iBAAiB,MAAM;AAAA,EAC9F;AAEA,UAAQ,cAAc;AACxB;AAEA,MAAM,kBAAkB,CAAC,SAAsB,OAAe,GAAW,GAAW,GAAW,MAAoB;AACjH,QAAM,QAAQ,QAAQ;AAChB,QAAA,EAAE,KAAS,IAAA;AACX,QAAA,IAAI,WAAW,gBAAgB;AACrC,OAAK,QAAQ,WAAW,IAAI,CAAC,IAAI;AACjC,OAAK,QAAQ,WAAW,IAAI,CAAC,IAAI;AACjC,OAAK,QAAQ,WAAW,IAAI,CAAC,IAAI;AACjC,OAAK,QAAQ,WAAW,IAAI,CAAC,IAAI;AACnC;AAqBa,MAAA,cAAc,CAAC,mBAAuD;AAAA,EACjF,cAAc,EAAE,OAAO,cAAc;AAAA,EACrC,YAAY,EAAE,MAAM,KAAK,OAAO,EAAE;AAAA;AAAA,EAClC,aAAa,EAAE,MAAM,KAAK,OAAO,EAAE;AAAA;AAAA,EACnC,aAAa,EAAE,MAAM,KAAK,OAAO,IAAI;AAAA,EACrC,aAAa,EAAE,MAAM,KAAK,OAAO,IAAI;AAAA,EACrC,MAAM,EAAE,MAAM,KAAK,OAAO,EAAE;AAC9B;AAMO,SAAS,aACd,UACA,UACA,iBAAiB,GACX;AACN,MAAI,SAAS;AAAM;AACnB,WAAS,OAAO;AAEP,WAAA,kBAAkB,CAAC,WAAsF;AAChH,QAAK,OAAe;AAAY;AAC9B,WAAe,aAAa;AAEvB,WAAA,OAAO,OAAO,UAAU,QAAQ;AAEjC,UAAA;AAAA;AAAA,MAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAQV,iBAAiB;AAAA,0BACjB,iBAAiB;AAAA;AAAA,IAEvC,OAAO;AAAA,IAGJ,QAAQ,iCAAiC,EAAE,EAG3C,QAAQ,mCAAmC,EAAE,EAG7C,QAAQ,2BAA2B,EAAE,EAGrC;AAAA,QACC;AAAA;AAAA,QACW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAuB2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EAgBvC;AAAA,QACC;AAAA;AAAA,QACW;AAAA;AAAA,MAEb;AAAA;AAEF,WAAO,eAAe;AAAA,EAAA;AAE1B;AAKO,MAAM,KAAgC;AAAA;AAAA;AAAA;AAAA;AAAA,EAY3C,YAAY,MAAa,iBAAiB,GAAG;AAXtC;AACA;AAEA;AACA;AACA;AAOC,UAAA,QAAQ,KAAK;AACb,UAAA,eAAe,kBAAkB,cAAc;AAC/C,UAAA,WAAW,YAAY,YAAY;AAEnC,UAAA,SAAS,CAAC,UAAU;AACpB,UAAA,iBAAiB,QAAQ,iBAAiB,eAAe;AACrD,cAAA,WAAW,MAAM,SAAS,MAAM;AACzB,qBAAA,MAAM,UAAU,UAAU,cAAc;AAAA,MACvD;AAAA,IAAA,CACD;AAEI,SAAA,aAAa,IAAI,MAAM,cAAc;AACrC,SAAA,mBAAmB,IAAI,MAAM,cAAc;AAEhD,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,WAAW;AAAA,EAClB;AAAA,EAEO,YAAuC,OAAe,OAAqB;AAC5E,QAAA,SAAS,KAAK,WAAW;AAAQ,YAAM,MAAM,6BAA6B;AACxE,UAAA,cAAc,MAAM;AACrB,SAAA,SAAS,YAAY,QAAQ;AAC7B,SAAA,iBAAiB,KAAK,IAAI;AAC1B,SAAA,WAAW,KAAK,IAAI;AACL,wBAAA,KAAK,cAAc,OAAO,KAAK;AAAA,EACrD;AAAA,EAEO,eAAe,QAAsB;AACrC,SAAA,SAAS,WAAW,SAAS;AAAA,EACpC;AACF;AACA,MAAM,SAAS,IAAI;AAKZ,MAAM,sBAGH,KAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlD,YAAY,OAAe,YAAoB,UAAqB,UAAqB;AACvF,UAAM,OAAO,IAAI,cAAc,UAAU,UAAU,KAAK;AACnD,SAAA,eAAe,SAAS,gBAAgB;AAC7C,SAAK,gBAAgB;AACrB,UAAM,MAAM,UAAU;AAdjB;AACA;AAeL,SAAK,UAAU,IAAI,MAAM,KAAK,EAAE,KAAK,CAAC;AACtC,SAAK,aAAa,IAAI,MAAM,KAAK,EAAE,KAAK,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,aAAa,OAAqB;AACxC,WAAO,gBAAgB,KAAK,iBAAiB,KAAK,WAAW,KAAK,CAAC,GAAG,KAAK,WAAW,KAAK,GAAG,KAAK,QAAQ,KAAK,CAAC;AAC5G,SAAA,SAAS,YAAY,OAAO,MAAM;AAClC,SAAA,SAAS,eAAe,cAAc;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,yBAAyB,OAAe,QAAsB;AAC9D,SAAA,QAAQ,KAAK,KAAK;AACvB,SAAK,aAAa,KAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,SAAS,OAAe,SAAuB;AACpD,QAAI,MAAM,OAAO;AAAG,YAAM,MAAM,6CAA6C;AACxE,SAAA,WAAW,KAAK,IAAI;AACzB,SAAK,aAAa,KAAK;AAAA,EACzB;AACF;"}
1
+ {"version":3,"file":"CurveModifier.js","sources":["../../src/modifiers/CurveModifier.ts"],"sourcesContent":["// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4\nconst TEXTURE_WIDTH = 1024\nconst TEXTURE_HEIGHT = 4\n\nimport {\n DataTexture,\n RGBAFormat,\n FloatType,\n RepeatWrapping,\n Mesh,\n InstancedMesh,\n NearestFilter,\n DynamicDrawUsage,\n Matrix4,\n Material,\n Curve,\n BufferGeometry,\n} from 'three'\n\nimport type { IUniform } from 'three'\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @param { number } numberOfCurves the number of curves needed to be described by this texture.\n */\nexport const initSplineTexture = (numberOfCurves = 1): DataTexture => {\n const dataArray = new Float32Array(TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS)\n const dataTexture = new DataTexture(dataArray, TEXTURE_WIDTH, TEXTURE_HEIGHT * numberOfCurves, RGBAFormat, FloatType)\n\n dataTexture.wrapS = RepeatWrapping\n dataTexture.wrapT = RepeatWrapping\n dataTexture.magFilter = NearestFilter\n dataTexture.needsUpdate = true\n\n return dataTexture\n}\n\n/**\n * Write the curve description to the data texture\n *\n * @param { DataTexture } texture The DataTexture to write to\n * @param { Curve } splineCurve The curve to describe\n * @param { number } offset Which curve slot to write to\n */\nexport const updateSplineTexture = <TCurve extends Curve<any>>(\n texture: DataTexture,\n splineCurve: TCurve,\n offset = 0,\n): void => {\n const numberOfPoints = Math.floor(TEXTURE_WIDTH * (TEXTURE_HEIGHT / 4))\n splineCurve.arcLengthDivisions = numberOfPoints / 2\n splineCurve.updateArcLengths()\n const points = splineCurve.getSpacedPoints(numberOfPoints)\n const frenetFrames = splineCurve.computeFrenetFrames(numberOfPoints, true)\n\n for (let i = 0; i < numberOfPoints; i++) {\n const rowOffset = Math.floor(i / TEXTURE_WIDTH)\n const rowIndex = i % TEXTURE_WIDTH\n\n let pt = points[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.tangents[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.normals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + TEXTURE_HEIGHT * offset)\n pt = frenetFrames.binormals[i]\n setTextureValue(texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + TEXTURE_HEIGHT * offset)\n }\n\n texture.needsUpdate = true\n}\n\nconst setTextureValue = (texture: DataTexture, index: number, x: number, y: number, z: number, o: number): void => {\n const image = texture.image\n const { data } = image\n const i = CHANNELS * TEXTURE_WIDTH * o // Row Offset\n data[index * CHANNELS + i + 0] = x\n data[index * CHANNELS + i + 1] = y\n data[index * CHANNELS + i + 2] = z\n data[index * CHANNELS + i + 3] = 1\n}\n\nexport interface INumericUniform extends IUniform {\n type: 'f' | 'i'\n value: number\n}\n\nexport type CurveModifierUniforms = {\n spineTexture: IUniform<DataTexture>\n pathOffset: INumericUniform\n pathSegment: INumericUniform\n spineOffset: INumericUniform\n spineLength: INumericUniform\n flow: INumericUniform\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier\n *\n * @param { DataTexture } Texture which holds the curve description\n */\nexport const getUniforms = (splineTexture: DataTexture): CurveModifierUniforms => ({\n spineTexture: { value: splineTexture },\n pathOffset: { type: 'f', value: 0 }, // time of path curve\n pathSegment: { type: 'f', value: 1 }, // fractional length of path\n spineOffset: { type: 'f', value: 161 },\n spineLength: { type: 'f', value: 400 },\n flow: { type: 'i', value: 1 },\n})\n\nexport type ModifiedMaterial<TMaterial extends Material> = TMaterial & {\n __ok: boolean\n}\n\nexport function modifyShader<TMaterial extends Material = Material>(\n material: ModifiedMaterial<TMaterial>,\n uniforms: CurveModifierUniforms,\n numberOfCurves = 1,\n): void {\n if (material.__ok) return\n material.__ok = true\n\n material.onBeforeCompile = (shader: { vertexShader: string; uniforms: { [uniform: string]: IUniform } }): void => {\n if ((shader as any).__modified) return\n ;(shader as any).__modified = true\n\n Object.assign(shader.uniforms, uniforms)\n\n const vertexShader = /* glsl */ `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n // chunk import moved in front of modified shader below\n .replace('#include <beginnormal_vertex>', '')\n\n // vec3 transformedNormal declaration overriden below\n .replace('#include <defaultnormal_vertex>', '')\n\n // vec3 transformed declaration overriden below\n .replace('#include <begin_vertex>', '')\n\n // shader override\n .replace(\n /void\\s*main\\s*\\(\\)\\s*\\{/,\n /* glsl */ `\n void main() {\n #include <beginnormal_vertex>\n\n vec4 worldPos = modelMatrix * vec4(position, 1.);\n\n bool bend = flow > 0;\n float xWeight = bend ? 0. : 1.;\n\n #ifdef USE_INSTANCING\n float pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\n float spineLengthFromInstanceMatrix = instanceMatrix[3][0];\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\n float mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n #else\n float spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\n float mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n #endif\n\n mt = mod(mt, textureStacks);\n float rowOffset = floor(mt);\n\n #ifdef USE_INSTANCING\n rowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n #endif\n\n vec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 a = texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 b = texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\n vec3 c = texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\n mat3 basis = mat3(a, b, c);\n\n vec3 transformed = basis\n * vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n + spinePos;\n\n vec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t`,\n )\n .replace(\n '#include <project_vertex>',\n /* glsl */ `vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`,\n )\n\n shader.vertexShader = vertexShader\n }\n}\n\n/**\n * A helper class for making meshes bend aroudn curves\n */\nexport class Flow<TMesh extends Mesh = Mesh> {\n public curveArray: Curve<any>[]\n public curveLengthArray: number[]\n\n public object3D: TMesh\n public splineTexure: DataTexture\n public uniforms: CurveModifierUniforms\n\n /**\n * @param {Mesh} mesh The mesh to clone and modify to bend around the curve\n * @param {number} numberOfCurves The amount of space that should preallocated for additional curves\n */\n constructor(mesh: TMesh, numberOfCurves = 1) {\n const obj3D = mesh.clone() as TMesh\n const splineTexure = initSplineTexture(numberOfCurves)\n const uniforms = getUniforms(splineTexure)\n\n obj3D.traverse((child) => {\n if (child instanceof Mesh || child instanceof InstancedMesh) {\n child.material = child.material.clone()\n modifyShader(child.material, uniforms, numberOfCurves)\n }\n })\n\n this.curveArray = new Array(numberOfCurves)\n this.curveLengthArray = new Array(numberOfCurves)\n\n this.object3D = obj3D\n this.splineTexure = splineTexure\n this.uniforms = uniforms\n }\n\n public updateCurve<TCurve extends Curve<any>>(index: number, curve: TCurve): void {\n if (index >= this.curveArray.length) throw Error('Index out of range for Flow')\n const curveLength = curve.getLength()\n this.uniforms.spineLength.value = curveLength\n this.curveLengthArray[index] = curveLength\n this.curveArray[index] = curve\n updateSplineTexture(this.splineTexure, curve, index)\n }\n\n public moveAlongCurve(amount: number): void {\n this.uniforms.pathOffset.value += amount\n }\n}\nconst matrix = /* @__PURE__ */ new Matrix4()\n\n/**\n * A helper class for creating instanced versions of flow, where the instances are placed on the curve.\n */\nexport class InstancedFlow<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material = Material\n> extends Flow<InstancedMesh<TGeometry, TMaterial>> {\n public offsets: number[]\n public whichCurve: number[]\n\n /**\n *\n * @param {number} count The number of instanced elements\n * @param {number} curveCount The number of curves to preallocate for\n * @param {Geometry} geometry The geometry to use for the instanced mesh\n * @param {Material} material The material to use for the instanced mesh\n */\n constructor(count: number, curveCount: number, geometry: TGeometry, material: TMaterial) {\n const mesh = new InstancedMesh(geometry, material, count)\n mesh.instanceMatrix.setUsage(DynamicDrawUsage)\n mesh.frustumCulled = false\n super(mesh, curveCount)\n\n this.offsets = new Array(count).fill(0)\n this.whichCurve = new Array(count).fill(0)\n }\n\n /**\n * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n * This writes that information to the matrix and marks it as needing update.\n *\n * @param {number} index of the instanced element to update\n */\n private writeChanges(index: number): void {\n matrix.makeTranslation(this.curveLengthArray[this.whichCurve[index]], this.whichCurve[index], this.offsets[index])\n this.object3D.setMatrixAt(index, matrix)\n this.object3D.instanceMatrix.needsUpdate = true\n }\n\n /**\n * Move an individual element along the curve by a specific amount\n *\n * @param {number} index Which element to update\n * @param {number} offset Move by how much\n */\n public moveIndividualAlongCurve(index: number, offset: number): void {\n this.offsets[index] += offset\n this.writeChanges(index)\n }\n\n /**\n * Select which curve to use for an element\n *\n * @param {number} index the index of the instanced element to update\n * @param {number} curveNo the index of the curve it should use\n */\n public setCurve(index: number, curveNo: number): void {\n if (isNaN(curveNo)) throw Error('curve index being set is Not a Number (NaN)')\n this.whichCurve[index] = curveNo\n this.writeChanges(index)\n }\n}\n"],"names":[],"mappings":"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"}
@@ -8,8 +8,8 @@ var __publicField = (obj, key, value) => {
8
8
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
9
  const THREE = require("three");
10
10
  const BufferGeometryUtils = require("../utils/BufferGeometryUtils.cjs");
11
- const cb = new THREE.Vector3();
12
- const ab = new THREE.Vector3();
11
+ const cb = /* @__PURE__ */ new THREE.Vector3();
12
+ const ab = /* @__PURE__ */ new THREE.Vector3();
13
13
  function pushIfUnique(array, object) {
14
14
  if (array.indexOf(object) === -1)
15
15
  array.push(object);
@@ -1 +1 @@
1
- {"version":3,"file":"SimplifyModifier.cjs","sources":["../../src/modifiers/SimplifyModifier.ts"],"sourcesContent":["import { BufferGeometry, Float32BufferAttribute, Vector3 } from 'three'\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils'\n\nconst cb = new Vector3()\nconst ab = new Vector3()\n\nfunction pushIfUnique<TItem>(array: TItem[], object: TItem): void {\n if (array.indexOf(object) === -1) array.push(object)\n}\n\nfunction removeFromArray<TItem>(array: TItem[], object: TItem): void {\n const k = array.indexOf(object)\n if (k > -1) array.splice(k, 1)\n}\n\nclass Vertex {\n public position: Vector3\n private id: number\n\n public faces: Triangle[]\n public neighbors: Vertex[]\n\n public collapseCost: number\n public collapseNeighbor: null | Vertex\n\n public minCost: number = 0\n public totalCost: number = 0\n public costCount: number = 0\n\n constructor(v: Vector3, id: number) {\n this.position = v\n this.id = id // old index id\n\n this.faces = [] // faces vertex is connected\n this.neighbors = [] // neighbouring vertices aka \"adjacentVertices\"\n\n // these will be computed in computeEdgeCostAtVertex()\n this.collapseCost = 0 // cost of collapsing this vertex, the less the better. aka objdist\n this.collapseNeighbor = null // best candinate for collapsing\n }\n\n public addUniqueNeighbor(vertex: Vertex): void {\n pushIfUnique(this.neighbors, vertex)\n }\n\n public removeIfNonNeighbor(n: Vertex): void {\n const neighbors = this.neighbors\n const faces = this.faces\n\n const offset = neighbors.indexOf(n)\n if (offset === -1) return\n for (let i = 0; i < faces.length; i++) {\n if (faces[i].hasVertex(n)) return\n }\n\n neighbors.splice(offset, 1)\n }\n}\n\n// we use a triangle class to represent structure of face slightly differently\nclass Triangle {\n private a: number\n private b: number\n private c: Number\n\n public v1: Vertex\n public v2: Vertex\n public v3: Vertex\n\n public normal = new Vector3()\n\n constructor(v1: Vertex, v2: Vertex, v3: Vertex, a: number, b: number, c: number) {\n this.a = a\n this.b = b\n this.c = c\n\n this.v1 = v1\n this.v2 = v2\n this.v3 = v3\n\n this.computeNormal()\n\n v1.faces.push(this)\n v1.addUniqueNeighbor(v2)\n v1.addUniqueNeighbor(v3)\n\n v2.faces.push(this)\n v2.addUniqueNeighbor(v1)\n v2.addUniqueNeighbor(v3)\n\n v3.faces.push(this)\n v3.addUniqueNeighbor(v1)\n v3.addUniqueNeighbor(v2)\n }\n\n private computeNormal(): void {\n const vA = this.v1.position\n const vB = this.v2.position\n const vC = this.v3.position\n\n cb.subVectors(vC, vB)\n ab.subVectors(vA, vB)\n cb.cross(ab).normalize()\n\n this.normal.copy(cb)\n }\n\n public hasVertex(v: Vertex): boolean {\n return v === this.v1 || v === this.v2 || v === this.v3\n }\n\n public replaceVertex(oldv: Vertex, newv: Vertex): void {\n if (oldv === this.v1) this.v1 = newv\n else if (oldv === this.v2) this.v2 = newv\n else if (oldv === this.v3) this.v3 = newv\n\n removeFromArray(oldv.faces, this)\n newv.faces.push(this)\n\n oldv.removeIfNonNeighbor(this.v1)\n this.v1.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v2)\n this.v2.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v3)\n this.v3.removeIfNonNeighbor(oldv)\n\n this.v1.addUniqueNeighbor(this.v2)\n this.v1.addUniqueNeighbor(this.v3)\n\n this.v2.addUniqueNeighbor(this.v1)\n this.v2.addUniqueNeighbor(this.v3)\n\n this.v3.addUniqueNeighbor(this.v1)\n this.v3.addUniqueNeighbor(this.v2)\n\n this.computeNormal()\n }\n}\n\n/**\n *\tSimplification Geometry Modifier\n * - based on code and technique\n *\t - by Stan Melax in 1998\n *\t - Progressive Mesh type Polygon Reduction Algorithm\n * - http://www.melax.com/polychop/\n */\n\nclass SimplifyModifier {\n constructor() {}\n\n private computeEdgeCollapseCost = (u: Vertex, v: Vertex): number => {\n // if we collapse edge uv by moving u to v then how\n // much different will the model change, i.e. the \"error\".\n\n const edgelength = v.position.distanceTo(u.position)\n let curvature = 0\n\n const sideFaces = []\n let i,\n il = u.faces.length,\n face,\n sideFace\n\n // find the \"sides\" triangles that are on the edge uv\n for (i = 0; i < il; i++) {\n face = u.faces[i]\n\n if (face.hasVertex(v)) {\n sideFaces.push(face)\n }\n }\n\n // use the triangle facing most away from the sides\n // to determine our curvature term\n for (i = 0; i < il; i++) {\n let minCurvature = 1\n face = u.faces[i]\n\n for (let j = 0; j < sideFaces.length; j++) {\n sideFace = sideFaces[j]\n // use dot product of face normals.\n const dotProd = face.normal.dot(sideFace.normal)\n minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2)\n }\n\n curvature = Math.max(curvature, minCurvature)\n }\n\n // crude approach in attempt to preserve borders\n // though it seems not to be totally correct\n const borders = 0\n if (sideFaces.length < 2) {\n // we add some arbitrary cost for borders,\n // borders += 10;\n curvature = 1\n }\n\n const amt = edgelength * curvature + borders\n\n return amt\n }\n\n private removeVertex(v: Vertex, vertices: Vertex[]): void {\n console.assert(v.faces.length === 0)\n\n while (v.neighbors.length) {\n const n = v.neighbors.pop() as Vertex\n removeFromArray(n.neighbors, v)\n }\n\n removeFromArray(vertices, v)\n }\n\n private computeEdgeCostAtVertex = (v: Vertex): void => {\n // compute the edge collapse cost for all edges that start\n // from vertex v. Since we are only interested in reducing\n // the object by selecting the min cost edge at each step, we\n // only cache the cost of the least cost edge at this vertex\n // (in member variable collapse) as well as the value of the\n // cost (in member variable collapseCost).\n\n if (v.neighbors.length === 0) {\n // collapse if no neighbors.\n v.collapseNeighbor = null\n v.collapseCost = -0.01\n\n return\n }\n\n v.collapseCost = 100000\n v.collapseNeighbor = null\n\n // search all neighboring edges for \"least cost\" edge\n for (let i = 0; i < v.neighbors.length; i++) {\n const collapseCost = this.computeEdgeCollapseCost(v, v.neighbors[i])\n\n if (!v.collapseNeighbor) {\n v.collapseNeighbor = v.neighbors[i]\n v.collapseCost = collapseCost\n v.minCost = collapseCost\n v.totalCost = 0\n v.costCount = 0\n }\n\n v.costCount++\n v.totalCost += collapseCost\n\n if (collapseCost < v.minCost) {\n v.collapseNeighbor = v.neighbors[i]\n v.minCost = collapseCost\n }\n }\n\n // we average the cost of collapsing at this vertex\n v.collapseCost = v.totalCost / v.costCount\n // v.collapseCost = v.minCost;\n }\n\n private removeFace = (f: Triangle, faces: Triangle[]): void => {\n removeFromArray(faces, f)\n\n if (f.v1) removeFromArray(f.v1.faces, f)\n if (f.v2) removeFromArray(f.v2.faces, f)\n if (f.v3) removeFromArray(f.v3.faces, f)\n\n // TODO optimize this!\n const vs = [f.v1, f.v2, f.v3]\n let v1, v2\n\n for (let i = 0; i < 3; i++) {\n v1 = vs[i]\n v2 = vs[(i + 1) % 3]\n\n if (!v1 || !v2) continue\n\n v1.removeIfNonNeighbor(v2)\n v2.removeIfNonNeighbor(v1)\n }\n }\n\n private collapse = (vertices: Vertex[], faces: Triangle[], u: Vertex, v: Vertex): void => {\n // u and v are pointers to vertices of an edge\n\n // Collapse the edge uv by moving vertex u onto v\n\n if (!v) {\n // u is a vertex all by itself so just delete it..\n this.removeVertex(u, vertices)\n return\n }\n\n let i\n const tmpVertices = []\n\n for (i = 0; i < u.neighbors.length; i++) {\n tmpVertices.push(u.neighbors[i])\n }\n\n // delete triangles on edge uv:\n for (i = u.faces.length - 1; i >= 0; i--) {\n if (u.faces[i].hasVertex(v)) {\n this.removeFace(u.faces[i], faces)\n }\n }\n\n // update remaining triangles to have v instead of u\n for (i = u.faces.length - 1; i >= 0; i--) {\n u.faces[i].replaceVertex(u, v)\n }\n\n this.removeVertex(u, vertices)\n\n // recompute the edge collapse costs in neighborhood\n for (i = 0; i < tmpVertices.length; i++) {\n this.computeEdgeCostAtVertex(tmpVertices[i])\n }\n }\n\n private minimumCostEdge = (vertices: Vertex[]): Vertex => {\n // O(n * n) approach. TODO optimize this\n\n let least = vertices[0]\n\n for (let i = 0; i < vertices.length; i++) {\n if (vertices[i].collapseCost < least.collapseCost) {\n least = vertices[i]\n }\n }\n\n return least\n }\n\n public modify = (geometry: BufferGeometry, count: number): BufferGeometry => {\n geometry = geometry.clone()\n const attributes = geometry.attributes\n\n // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n for (let name in attributes) {\n if (name !== 'position') geometry.deleteAttribute(name)\n }\n\n geometry = BufferGeometryUtils.mergeVertices(geometry)\n\n //\n // put data of original geometry in different data structures\n //\n\n const vertices = []\n const faces = []\n\n // add vertices\n\n const positionAttribute = geometry.getAttribute('position')\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const v = new Vector3().fromBufferAttribute(positionAttribute, i)\n\n const vertex = new Vertex(v, i)\n vertices.push(vertex)\n }\n\n // add faces\n\n const geomIndex = geometry.getIndex()\n\n if (geomIndex !== null) {\n for (let i = 0; i < geomIndex.count; i += 3) {\n const a = geomIndex.getX(i)\n const b = geomIndex.getX(i + 1)\n const c = geomIndex.getX(i + 2)\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n } else {\n for (let i = 0; i < positionAttribute.count; i += 3) {\n const a = i\n const b = i + 1\n const c = i + 2\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n }\n\n // compute all edge collapse costs\n\n for (let i = 0, il = vertices.length; i < il; i++) {\n this.computeEdgeCostAtVertex(vertices[i])\n }\n\n let nextVertex\n\n let z = count\n\n while (z--) {\n nextVertex = this.minimumCostEdge(vertices)\n\n if (!nextVertex) {\n console.log('THREE.SimplifyModifier: No next vertex')\n break\n } else {\n this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor as Vertex)\n }\n }\n\n //\n\n const simplifiedGeometry = new BufferGeometry()\n const position = []\n let index = []\n\n //\n\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i].position\n position.push(vertex.x, vertex.y, vertex.z)\n }\n\n //\n\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i]\n\n const a = vertices.indexOf(face.v1)\n const b = vertices.indexOf(face.v2)\n const c = vertices.indexOf(face.v3)\n\n index.push(a, b, c)\n }\n\n //\n\n simplifiedGeometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n simplifiedGeometry.setIndex(index)\n\n return simplifiedGeometry\n }\n}\n\nexport { SimplifyModifier }\n"],"names":["Vector3","BufferGeometryUtils.mergeVertices","BufferGeometry","Float32BufferAttribute"],"mappings":"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"}
1
+ {"version":3,"file":"SimplifyModifier.cjs","sources":["../../src/modifiers/SimplifyModifier.ts"],"sourcesContent":["import { BufferGeometry, Float32BufferAttribute, Vector3 } from 'three'\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils'\n\nconst cb = /* @__PURE__ */ new Vector3()\nconst ab = /* @__PURE__ */ new Vector3()\n\nfunction pushIfUnique<TItem>(array: TItem[], object: TItem): void {\n if (array.indexOf(object) === -1) array.push(object)\n}\n\nfunction removeFromArray<TItem>(array: TItem[], object: TItem): void {\n const k = array.indexOf(object)\n if (k > -1) array.splice(k, 1)\n}\n\nclass Vertex {\n public position: Vector3\n private id: number\n\n public faces: Triangle[]\n public neighbors: Vertex[]\n\n public collapseCost: number\n public collapseNeighbor: null | Vertex\n\n public minCost: number = 0\n public totalCost: number = 0\n public costCount: number = 0\n\n constructor(v: Vector3, id: number) {\n this.position = v\n this.id = id // old index id\n\n this.faces = [] // faces vertex is connected\n this.neighbors = [] // neighbouring vertices aka \"adjacentVertices\"\n\n // these will be computed in computeEdgeCostAtVertex()\n this.collapseCost = 0 // cost of collapsing this vertex, the less the better. aka objdist\n this.collapseNeighbor = null // best candinate for collapsing\n }\n\n public addUniqueNeighbor(vertex: Vertex): void {\n pushIfUnique(this.neighbors, vertex)\n }\n\n public removeIfNonNeighbor(n: Vertex): void {\n const neighbors = this.neighbors\n const faces = this.faces\n\n const offset = neighbors.indexOf(n)\n if (offset === -1) return\n for (let i = 0; i < faces.length; i++) {\n if (faces[i].hasVertex(n)) return\n }\n\n neighbors.splice(offset, 1)\n }\n}\n\n// we use a triangle class to represent structure of face slightly differently\nclass Triangle {\n private a: number\n private b: number\n private c: Number\n\n public v1: Vertex\n public v2: Vertex\n public v3: Vertex\n\n public normal = new Vector3()\n\n constructor(v1: Vertex, v2: Vertex, v3: Vertex, a: number, b: number, c: number) {\n this.a = a\n this.b = b\n this.c = c\n\n this.v1 = v1\n this.v2 = v2\n this.v3 = v3\n\n this.computeNormal()\n\n v1.faces.push(this)\n v1.addUniqueNeighbor(v2)\n v1.addUniqueNeighbor(v3)\n\n v2.faces.push(this)\n v2.addUniqueNeighbor(v1)\n v2.addUniqueNeighbor(v3)\n\n v3.faces.push(this)\n v3.addUniqueNeighbor(v1)\n v3.addUniqueNeighbor(v2)\n }\n\n private computeNormal(): void {\n const vA = this.v1.position\n const vB = this.v2.position\n const vC = this.v3.position\n\n cb.subVectors(vC, vB)\n ab.subVectors(vA, vB)\n cb.cross(ab).normalize()\n\n this.normal.copy(cb)\n }\n\n public hasVertex(v: Vertex): boolean {\n return v === this.v1 || v === this.v2 || v === this.v3\n }\n\n public replaceVertex(oldv: Vertex, newv: Vertex): void {\n if (oldv === this.v1) this.v1 = newv\n else if (oldv === this.v2) this.v2 = newv\n else if (oldv === this.v3) this.v3 = newv\n\n removeFromArray(oldv.faces, this)\n newv.faces.push(this)\n\n oldv.removeIfNonNeighbor(this.v1)\n this.v1.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v2)\n this.v2.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v3)\n this.v3.removeIfNonNeighbor(oldv)\n\n this.v1.addUniqueNeighbor(this.v2)\n this.v1.addUniqueNeighbor(this.v3)\n\n this.v2.addUniqueNeighbor(this.v1)\n this.v2.addUniqueNeighbor(this.v3)\n\n this.v3.addUniqueNeighbor(this.v1)\n this.v3.addUniqueNeighbor(this.v2)\n\n this.computeNormal()\n }\n}\n\n/**\n *\tSimplification Geometry Modifier\n * - based on code and technique\n *\t - by Stan Melax in 1998\n *\t - Progressive Mesh type Polygon Reduction Algorithm\n * - http://www.melax.com/polychop/\n */\n\nclass SimplifyModifier {\n constructor() {}\n\n private computeEdgeCollapseCost = (u: Vertex, v: Vertex): number => {\n // if we collapse edge uv by moving u to v then how\n // much different will the model change, i.e. the \"error\".\n\n const edgelength = v.position.distanceTo(u.position)\n let curvature = 0\n\n const sideFaces = []\n let i,\n il = u.faces.length,\n face,\n sideFace\n\n // find the \"sides\" triangles that are on the edge uv\n for (i = 0; i < il; i++) {\n face = u.faces[i]\n\n if (face.hasVertex(v)) {\n sideFaces.push(face)\n }\n }\n\n // use the triangle facing most away from the sides\n // to determine our curvature term\n for (i = 0; i < il; i++) {\n let minCurvature = 1\n face = u.faces[i]\n\n for (let j = 0; j < sideFaces.length; j++) {\n sideFace = sideFaces[j]\n // use dot product of face normals.\n const dotProd = face.normal.dot(sideFace.normal)\n minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2)\n }\n\n curvature = Math.max(curvature, minCurvature)\n }\n\n // crude approach in attempt to preserve borders\n // though it seems not to be totally correct\n const borders = 0\n if (sideFaces.length < 2) {\n // we add some arbitrary cost for borders,\n // borders += 10;\n curvature = 1\n }\n\n const amt = edgelength * curvature + borders\n\n return amt\n }\n\n private removeVertex(v: Vertex, vertices: Vertex[]): void {\n console.assert(v.faces.length === 0)\n\n while (v.neighbors.length) {\n const n = v.neighbors.pop() as Vertex\n removeFromArray(n.neighbors, v)\n }\n\n removeFromArray(vertices, v)\n }\n\n private computeEdgeCostAtVertex = (v: Vertex): void => {\n // compute the edge collapse cost for all edges that start\n // from vertex v. Since we are only interested in reducing\n // the object by selecting the min cost edge at each step, we\n // only cache the cost of the least cost edge at this vertex\n // (in member variable collapse) as well as the value of the\n // cost (in member variable collapseCost).\n\n if (v.neighbors.length === 0) {\n // collapse if no neighbors.\n v.collapseNeighbor = null\n v.collapseCost = -0.01\n\n return\n }\n\n v.collapseCost = 100000\n v.collapseNeighbor = null\n\n // search all neighboring edges for \"least cost\" edge\n for (let i = 0; i < v.neighbors.length; i++) {\n const collapseCost = this.computeEdgeCollapseCost(v, v.neighbors[i])\n\n if (!v.collapseNeighbor) {\n v.collapseNeighbor = v.neighbors[i]\n v.collapseCost = collapseCost\n v.minCost = collapseCost\n v.totalCost = 0\n v.costCount = 0\n }\n\n v.costCount++\n v.totalCost += collapseCost\n\n if (collapseCost < v.minCost) {\n v.collapseNeighbor = v.neighbors[i]\n v.minCost = collapseCost\n }\n }\n\n // we average the cost of collapsing at this vertex\n v.collapseCost = v.totalCost / v.costCount\n // v.collapseCost = v.minCost;\n }\n\n private removeFace = (f: Triangle, faces: Triangle[]): void => {\n removeFromArray(faces, f)\n\n if (f.v1) removeFromArray(f.v1.faces, f)\n if (f.v2) removeFromArray(f.v2.faces, f)\n if (f.v3) removeFromArray(f.v3.faces, f)\n\n // TODO optimize this!\n const vs = [f.v1, f.v2, f.v3]\n let v1, v2\n\n for (let i = 0; i < 3; i++) {\n v1 = vs[i]\n v2 = vs[(i + 1) % 3]\n\n if (!v1 || !v2) continue\n\n v1.removeIfNonNeighbor(v2)\n v2.removeIfNonNeighbor(v1)\n }\n }\n\n private collapse = (vertices: Vertex[], faces: Triangle[], u: Vertex, v: Vertex): void => {\n // u and v are pointers to vertices of an edge\n\n // Collapse the edge uv by moving vertex u onto v\n\n if (!v) {\n // u is a vertex all by itself so just delete it..\n this.removeVertex(u, vertices)\n return\n }\n\n let i\n const tmpVertices = []\n\n for (i = 0; i < u.neighbors.length; i++) {\n tmpVertices.push(u.neighbors[i])\n }\n\n // delete triangles on edge uv:\n for (i = u.faces.length - 1; i >= 0; i--) {\n if (u.faces[i].hasVertex(v)) {\n this.removeFace(u.faces[i], faces)\n }\n }\n\n // update remaining triangles to have v instead of u\n for (i = u.faces.length - 1; i >= 0; i--) {\n u.faces[i].replaceVertex(u, v)\n }\n\n this.removeVertex(u, vertices)\n\n // recompute the edge collapse costs in neighborhood\n for (i = 0; i < tmpVertices.length; i++) {\n this.computeEdgeCostAtVertex(tmpVertices[i])\n }\n }\n\n private minimumCostEdge = (vertices: Vertex[]): Vertex => {\n // O(n * n) approach. TODO optimize this\n\n let least = vertices[0]\n\n for (let i = 0; i < vertices.length; i++) {\n if (vertices[i].collapseCost < least.collapseCost) {\n least = vertices[i]\n }\n }\n\n return least\n }\n\n public modify = (geometry: BufferGeometry, count: number): BufferGeometry => {\n geometry = geometry.clone()\n const attributes = geometry.attributes\n\n // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n for (let name in attributes) {\n if (name !== 'position') geometry.deleteAttribute(name)\n }\n\n geometry = BufferGeometryUtils.mergeVertices(geometry)\n\n //\n // put data of original geometry in different data structures\n //\n\n const vertices = []\n const faces = []\n\n // add vertices\n\n const positionAttribute = geometry.getAttribute('position')\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const v = new Vector3().fromBufferAttribute(positionAttribute, i)\n\n const vertex = new Vertex(v, i)\n vertices.push(vertex)\n }\n\n // add faces\n\n const geomIndex = geometry.getIndex()\n\n if (geomIndex !== null) {\n for (let i = 0; i < geomIndex.count; i += 3) {\n const a = geomIndex.getX(i)\n const b = geomIndex.getX(i + 1)\n const c = geomIndex.getX(i + 2)\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n } else {\n for (let i = 0; i < positionAttribute.count; i += 3) {\n const a = i\n const b = i + 1\n const c = i + 2\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n }\n\n // compute all edge collapse costs\n\n for (let i = 0, il = vertices.length; i < il; i++) {\n this.computeEdgeCostAtVertex(vertices[i])\n }\n\n let nextVertex\n\n let z = count\n\n while (z--) {\n nextVertex = this.minimumCostEdge(vertices)\n\n if (!nextVertex) {\n console.log('THREE.SimplifyModifier: No next vertex')\n break\n } else {\n this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor as Vertex)\n }\n }\n\n //\n\n const simplifiedGeometry = new BufferGeometry()\n const position = []\n let index = []\n\n //\n\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i].position\n position.push(vertex.x, vertex.y, vertex.z)\n }\n\n //\n\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i]\n\n const a = vertices.indexOf(face.v1)\n const b = vertices.indexOf(face.v2)\n const c = vertices.indexOf(face.v3)\n\n index.push(a, b, c)\n }\n\n //\n\n simplifiedGeometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n simplifiedGeometry.setIndex(index)\n\n return simplifiedGeometry\n }\n}\n\nexport { SimplifyModifier }\n"],"names":["Vector3","BufferGeometryUtils.mergeVertices","BufferGeometry","Float32BufferAttribute"],"mappings":"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"}
@@ -6,8 +6,8 @@ var __publicField = (obj, key, value) => {
6
6
  };
7
7
  import { Vector3, BufferGeometry, Float32BufferAttribute } from "three";
8
8
  import { mergeVertices } from "../utils/BufferGeometryUtils.js";
9
- const cb = new Vector3();
10
- const ab = new Vector3();
9
+ const cb = /* @__PURE__ */ new Vector3();
10
+ const ab = /* @__PURE__ */ new Vector3();
11
11
  function pushIfUnique(array, object) {
12
12
  if (array.indexOf(object) === -1)
13
13
  array.push(object);
@@ -1 +1 @@
1
- {"version":3,"file":"SimplifyModifier.js","sources":["../../src/modifiers/SimplifyModifier.ts"],"sourcesContent":["import { BufferGeometry, Float32BufferAttribute, Vector3 } from 'three'\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils'\n\nconst cb = new Vector3()\nconst ab = new Vector3()\n\nfunction pushIfUnique<TItem>(array: TItem[], object: TItem): void {\n if (array.indexOf(object) === -1) array.push(object)\n}\n\nfunction removeFromArray<TItem>(array: TItem[], object: TItem): void {\n const k = array.indexOf(object)\n if (k > -1) array.splice(k, 1)\n}\n\nclass Vertex {\n public position: Vector3\n private id: number\n\n public faces: Triangle[]\n public neighbors: Vertex[]\n\n public collapseCost: number\n public collapseNeighbor: null | Vertex\n\n public minCost: number = 0\n public totalCost: number = 0\n public costCount: number = 0\n\n constructor(v: Vector3, id: number) {\n this.position = v\n this.id = id // old index id\n\n this.faces = [] // faces vertex is connected\n this.neighbors = [] // neighbouring vertices aka \"adjacentVertices\"\n\n // these will be computed in computeEdgeCostAtVertex()\n this.collapseCost = 0 // cost of collapsing this vertex, the less the better. aka objdist\n this.collapseNeighbor = null // best candinate for collapsing\n }\n\n public addUniqueNeighbor(vertex: Vertex): void {\n pushIfUnique(this.neighbors, vertex)\n }\n\n public removeIfNonNeighbor(n: Vertex): void {\n const neighbors = this.neighbors\n const faces = this.faces\n\n const offset = neighbors.indexOf(n)\n if (offset === -1) return\n for (let i = 0; i < faces.length; i++) {\n if (faces[i].hasVertex(n)) return\n }\n\n neighbors.splice(offset, 1)\n }\n}\n\n// we use a triangle class to represent structure of face slightly differently\nclass Triangle {\n private a: number\n private b: number\n private c: Number\n\n public v1: Vertex\n public v2: Vertex\n public v3: Vertex\n\n public normal = new Vector3()\n\n constructor(v1: Vertex, v2: Vertex, v3: Vertex, a: number, b: number, c: number) {\n this.a = a\n this.b = b\n this.c = c\n\n this.v1 = v1\n this.v2 = v2\n this.v3 = v3\n\n this.computeNormal()\n\n v1.faces.push(this)\n v1.addUniqueNeighbor(v2)\n v1.addUniqueNeighbor(v3)\n\n v2.faces.push(this)\n v2.addUniqueNeighbor(v1)\n v2.addUniqueNeighbor(v3)\n\n v3.faces.push(this)\n v3.addUniqueNeighbor(v1)\n v3.addUniqueNeighbor(v2)\n }\n\n private computeNormal(): void {\n const vA = this.v1.position\n const vB = this.v2.position\n const vC = this.v3.position\n\n cb.subVectors(vC, vB)\n ab.subVectors(vA, vB)\n cb.cross(ab).normalize()\n\n this.normal.copy(cb)\n }\n\n public hasVertex(v: Vertex): boolean {\n return v === this.v1 || v === this.v2 || v === this.v3\n }\n\n public replaceVertex(oldv: Vertex, newv: Vertex): void {\n if (oldv === this.v1) this.v1 = newv\n else if (oldv === this.v2) this.v2 = newv\n else if (oldv === this.v3) this.v3 = newv\n\n removeFromArray(oldv.faces, this)\n newv.faces.push(this)\n\n oldv.removeIfNonNeighbor(this.v1)\n this.v1.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v2)\n this.v2.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v3)\n this.v3.removeIfNonNeighbor(oldv)\n\n this.v1.addUniqueNeighbor(this.v2)\n this.v1.addUniqueNeighbor(this.v3)\n\n this.v2.addUniqueNeighbor(this.v1)\n this.v2.addUniqueNeighbor(this.v3)\n\n this.v3.addUniqueNeighbor(this.v1)\n this.v3.addUniqueNeighbor(this.v2)\n\n this.computeNormal()\n }\n}\n\n/**\n *\tSimplification Geometry Modifier\n * - based on code and technique\n *\t - by Stan Melax in 1998\n *\t - Progressive Mesh type Polygon Reduction Algorithm\n * - http://www.melax.com/polychop/\n */\n\nclass SimplifyModifier {\n constructor() {}\n\n private computeEdgeCollapseCost = (u: Vertex, v: Vertex): number => {\n // if we collapse edge uv by moving u to v then how\n // much different will the model change, i.e. the \"error\".\n\n const edgelength = v.position.distanceTo(u.position)\n let curvature = 0\n\n const sideFaces = []\n let i,\n il = u.faces.length,\n face,\n sideFace\n\n // find the \"sides\" triangles that are on the edge uv\n for (i = 0; i < il; i++) {\n face = u.faces[i]\n\n if (face.hasVertex(v)) {\n sideFaces.push(face)\n }\n }\n\n // use the triangle facing most away from the sides\n // to determine our curvature term\n for (i = 0; i < il; i++) {\n let minCurvature = 1\n face = u.faces[i]\n\n for (let j = 0; j < sideFaces.length; j++) {\n sideFace = sideFaces[j]\n // use dot product of face normals.\n const dotProd = face.normal.dot(sideFace.normal)\n minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2)\n }\n\n curvature = Math.max(curvature, minCurvature)\n }\n\n // crude approach in attempt to preserve borders\n // though it seems not to be totally correct\n const borders = 0\n if (sideFaces.length < 2) {\n // we add some arbitrary cost for borders,\n // borders += 10;\n curvature = 1\n }\n\n const amt = edgelength * curvature + borders\n\n return amt\n }\n\n private removeVertex(v: Vertex, vertices: Vertex[]): void {\n console.assert(v.faces.length === 0)\n\n while (v.neighbors.length) {\n const n = v.neighbors.pop() as Vertex\n removeFromArray(n.neighbors, v)\n }\n\n removeFromArray(vertices, v)\n }\n\n private computeEdgeCostAtVertex = (v: Vertex): void => {\n // compute the edge collapse cost for all edges that start\n // from vertex v. Since we are only interested in reducing\n // the object by selecting the min cost edge at each step, we\n // only cache the cost of the least cost edge at this vertex\n // (in member variable collapse) as well as the value of the\n // cost (in member variable collapseCost).\n\n if (v.neighbors.length === 0) {\n // collapse if no neighbors.\n v.collapseNeighbor = null\n v.collapseCost = -0.01\n\n return\n }\n\n v.collapseCost = 100000\n v.collapseNeighbor = null\n\n // search all neighboring edges for \"least cost\" edge\n for (let i = 0; i < v.neighbors.length; i++) {\n const collapseCost = this.computeEdgeCollapseCost(v, v.neighbors[i])\n\n if (!v.collapseNeighbor) {\n v.collapseNeighbor = v.neighbors[i]\n v.collapseCost = collapseCost\n v.minCost = collapseCost\n v.totalCost = 0\n v.costCount = 0\n }\n\n v.costCount++\n v.totalCost += collapseCost\n\n if (collapseCost < v.minCost) {\n v.collapseNeighbor = v.neighbors[i]\n v.minCost = collapseCost\n }\n }\n\n // we average the cost of collapsing at this vertex\n v.collapseCost = v.totalCost / v.costCount\n // v.collapseCost = v.minCost;\n }\n\n private removeFace = (f: Triangle, faces: Triangle[]): void => {\n removeFromArray(faces, f)\n\n if (f.v1) removeFromArray(f.v1.faces, f)\n if (f.v2) removeFromArray(f.v2.faces, f)\n if (f.v3) removeFromArray(f.v3.faces, f)\n\n // TODO optimize this!\n const vs = [f.v1, f.v2, f.v3]\n let v1, v2\n\n for (let i = 0; i < 3; i++) {\n v1 = vs[i]\n v2 = vs[(i + 1) % 3]\n\n if (!v1 || !v2) continue\n\n v1.removeIfNonNeighbor(v2)\n v2.removeIfNonNeighbor(v1)\n }\n }\n\n private collapse = (vertices: Vertex[], faces: Triangle[], u: Vertex, v: Vertex): void => {\n // u and v are pointers to vertices of an edge\n\n // Collapse the edge uv by moving vertex u onto v\n\n if (!v) {\n // u is a vertex all by itself so just delete it..\n this.removeVertex(u, vertices)\n return\n }\n\n let i\n const tmpVertices = []\n\n for (i = 0; i < u.neighbors.length; i++) {\n tmpVertices.push(u.neighbors[i])\n }\n\n // delete triangles on edge uv:\n for (i = u.faces.length - 1; i >= 0; i--) {\n if (u.faces[i].hasVertex(v)) {\n this.removeFace(u.faces[i], faces)\n }\n }\n\n // update remaining triangles to have v instead of u\n for (i = u.faces.length - 1; i >= 0; i--) {\n u.faces[i].replaceVertex(u, v)\n }\n\n this.removeVertex(u, vertices)\n\n // recompute the edge collapse costs in neighborhood\n for (i = 0; i < tmpVertices.length; i++) {\n this.computeEdgeCostAtVertex(tmpVertices[i])\n }\n }\n\n private minimumCostEdge = (vertices: Vertex[]): Vertex => {\n // O(n * n) approach. TODO optimize this\n\n let least = vertices[0]\n\n for (let i = 0; i < vertices.length; i++) {\n if (vertices[i].collapseCost < least.collapseCost) {\n least = vertices[i]\n }\n }\n\n return least\n }\n\n public modify = (geometry: BufferGeometry, count: number): BufferGeometry => {\n geometry = geometry.clone()\n const attributes = geometry.attributes\n\n // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n for (let name in attributes) {\n if (name !== 'position') geometry.deleteAttribute(name)\n }\n\n geometry = BufferGeometryUtils.mergeVertices(geometry)\n\n //\n // put data of original geometry in different data structures\n //\n\n const vertices = []\n const faces = []\n\n // add vertices\n\n const positionAttribute = geometry.getAttribute('position')\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const v = new Vector3().fromBufferAttribute(positionAttribute, i)\n\n const vertex = new Vertex(v, i)\n vertices.push(vertex)\n }\n\n // add faces\n\n const geomIndex = geometry.getIndex()\n\n if (geomIndex !== null) {\n for (let i = 0; i < geomIndex.count; i += 3) {\n const a = geomIndex.getX(i)\n const b = geomIndex.getX(i + 1)\n const c = geomIndex.getX(i + 2)\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n } else {\n for (let i = 0; i < positionAttribute.count; i += 3) {\n const a = i\n const b = i + 1\n const c = i + 2\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n }\n\n // compute all edge collapse costs\n\n for (let i = 0, il = vertices.length; i < il; i++) {\n this.computeEdgeCostAtVertex(vertices[i])\n }\n\n let nextVertex\n\n let z = count\n\n while (z--) {\n nextVertex = this.minimumCostEdge(vertices)\n\n if (!nextVertex) {\n console.log('THREE.SimplifyModifier: No next vertex')\n break\n } else {\n this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor as Vertex)\n }\n }\n\n //\n\n const simplifiedGeometry = new BufferGeometry()\n const position = []\n let index = []\n\n //\n\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i].position\n position.push(vertex.x, vertex.y, vertex.z)\n }\n\n //\n\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i]\n\n const a = vertices.indexOf(face.v1)\n const b = vertices.indexOf(face.v2)\n const c = vertices.indexOf(face.v3)\n\n index.push(a, b, c)\n }\n\n //\n\n simplifiedGeometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n simplifiedGeometry.setIndex(index)\n\n return simplifiedGeometry\n }\n}\n\nexport { SimplifyModifier }\n"],"names":["BufferGeometryUtils.mergeVertices"],"mappings":"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"}
1
+ {"version":3,"file":"SimplifyModifier.js","sources":["../../src/modifiers/SimplifyModifier.ts"],"sourcesContent":["import { BufferGeometry, Float32BufferAttribute, Vector3 } from 'three'\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils'\n\nconst cb = /* @__PURE__ */ new Vector3()\nconst ab = /* @__PURE__ */ new Vector3()\n\nfunction pushIfUnique<TItem>(array: TItem[], object: TItem): void {\n if (array.indexOf(object) === -1) array.push(object)\n}\n\nfunction removeFromArray<TItem>(array: TItem[], object: TItem): void {\n const k = array.indexOf(object)\n if (k > -1) array.splice(k, 1)\n}\n\nclass Vertex {\n public position: Vector3\n private id: number\n\n public faces: Triangle[]\n public neighbors: Vertex[]\n\n public collapseCost: number\n public collapseNeighbor: null | Vertex\n\n public minCost: number = 0\n public totalCost: number = 0\n public costCount: number = 0\n\n constructor(v: Vector3, id: number) {\n this.position = v\n this.id = id // old index id\n\n this.faces = [] // faces vertex is connected\n this.neighbors = [] // neighbouring vertices aka \"adjacentVertices\"\n\n // these will be computed in computeEdgeCostAtVertex()\n this.collapseCost = 0 // cost of collapsing this vertex, the less the better. aka objdist\n this.collapseNeighbor = null // best candinate for collapsing\n }\n\n public addUniqueNeighbor(vertex: Vertex): void {\n pushIfUnique(this.neighbors, vertex)\n }\n\n public removeIfNonNeighbor(n: Vertex): void {\n const neighbors = this.neighbors\n const faces = this.faces\n\n const offset = neighbors.indexOf(n)\n if (offset === -1) return\n for (let i = 0; i < faces.length; i++) {\n if (faces[i].hasVertex(n)) return\n }\n\n neighbors.splice(offset, 1)\n }\n}\n\n// we use a triangle class to represent structure of face slightly differently\nclass Triangle {\n private a: number\n private b: number\n private c: Number\n\n public v1: Vertex\n public v2: Vertex\n public v3: Vertex\n\n public normal = new Vector3()\n\n constructor(v1: Vertex, v2: Vertex, v3: Vertex, a: number, b: number, c: number) {\n this.a = a\n this.b = b\n this.c = c\n\n this.v1 = v1\n this.v2 = v2\n this.v3 = v3\n\n this.computeNormal()\n\n v1.faces.push(this)\n v1.addUniqueNeighbor(v2)\n v1.addUniqueNeighbor(v3)\n\n v2.faces.push(this)\n v2.addUniqueNeighbor(v1)\n v2.addUniqueNeighbor(v3)\n\n v3.faces.push(this)\n v3.addUniqueNeighbor(v1)\n v3.addUniqueNeighbor(v2)\n }\n\n private computeNormal(): void {\n const vA = this.v1.position\n const vB = this.v2.position\n const vC = this.v3.position\n\n cb.subVectors(vC, vB)\n ab.subVectors(vA, vB)\n cb.cross(ab).normalize()\n\n this.normal.copy(cb)\n }\n\n public hasVertex(v: Vertex): boolean {\n return v === this.v1 || v === this.v2 || v === this.v3\n }\n\n public replaceVertex(oldv: Vertex, newv: Vertex): void {\n if (oldv === this.v1) this.v1 = newv\n else if (oldv === this.v2) this.v2 = newv\n else if (oldv === this.v3) this.v3 = newv\n\n removeFromArray(oldv.faces, this)\n newv.faces.push(this)\n\n oldv.removeIfNonNeighbor(this.v1)\n this.v1.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v2)\n this.v2.removeIfNonNeighbor(oldv)\n\n oldv.removeIfNonNeighbor(this.v3)\n this.v3.removeIfNonNeighbor(oldv)\n\n this.v1.addUniqueNeighbor(this.v2)\n this.v1.addUniqueNeighbor(this.v3)\n\n this.v2.addUniqueNeighbor(this.v1)\n this.v2.addUniqueNeighbor(this.v3)\n\n this.v3.addUniqueNeighbor(this.v1)\n this.v3.addUniqueNeighbor(this.v2)\n\n this.computeNormal()\n }\n}\n\n/**\n *\tSimplification Geometry Modifier\n * - based on code and technique\n *\t - by Stan Melax in 1998\n *\t - Progressive Mesh type Polygon Reduction Algorithm\n * - http://www.melax.com/polychop/\n */\n\nclass SimplifyModifier {\n constructor() {}\n\n private computeEdgeCollapseCost = (u: Vertex, v: Vertex): number => {\n // if we collapse edge uv by moving u to v then how\n // much different will the model change, i.e. the \"error\".\n\n const edgelength = v.position.distanceTo(u.position)\n let curvature = 0\n\n const sideFaces = []\n let i,\n il = u.faces.length,\n face,\n sideFace\n\n // find the \"sides\" triangles that are on the edge uv\n for (i = 0; i < il; i++) {\n face = u.faces[i]\n\n if (face.hasVertex(v)) {\n sideFaces.push(face)\n }\n }\n\n // use the triangle facing most away from the sides\n // to determine our curvature term\n for (i = 0; i < il; i++) {\n let minCurvature = 1\n face = u.faces[i]\n\n for (let j = 0; j < sideFaces.length; j++) {\n sideFace = sideFaces[j]\n // use dot product of face normals.\n const dotProd = face.normal.dot(sideFace.normal)\n minCurvature = Math.min(minCurvature, (1.001 - dotProd) / 2)\n }\n\n curvature = Math.max(curvature, minCurvature)\n }\n\n // crude approach in attempt to preserve borders\n // though it seems not to be totally correct\n const borders = 0\n if (sideFaces.length < 2) {\n // we add some arbitrary cost for borders,\n // borders += 10;\n curvature = 1\n }\n\n const amt = edgelength * curvature + borders\n\n return amt\n }\n\n private removeVertex(v: Vertex, vertices: Vertex[]): void {\n console.assert(v.faces.length === 0)\n\n while (v.neighbors.length) {\n const n = v.neighbors.pop() as Vertex\n removeFromArray(n.neighbors, v)\n }\n\n removeFromArray(vertices, v)\n }\n\n private computeEdgeCostAtVertex = (v: Vertex): void => {\n // compute the edge collapse cost for all edges that start\n // from vertex v. Since we are only interested in reducing\n // the object by selecting the min cost edge at each step, we\n // only cache the cost of the least cost edge at this vertex\n // (in member variable collapse) as well as the value of the\n // cost (in member variable collapseCost).\n\n if (v.neighbors.length === 0) {\n // collapse if no neighbors.\n v.collapseNeighbor = null\n v.collapseCost = -0.01\n\n return\n }\n\n v.collapseCost = 100000\n v.collapseNeighbor = null\n\n // search all neighboring edges for \"least cost\" edge\n for (let i = 0; i < v.neighbors.length; i++) {\n const collapseCost = this.computeEdgeCollapseCost(v, v.neighbors[i])\n\n if (!v.collapseNeighbor) {\n v.collapseNeighbor = v.neighbors[i]\n v.collapseCost = collapseCost\n v.minCost = collapseCost\n v.totalCost = 0\n v.costCount = 0\n }\n\n v.costCount++\n v.totalCost += collapseCost\n\n if (collapseCost < v.minCost) {\n v.collapseNeighbor = v.neighbors[i]\n v.minCost = collapseCost\n }\n }\n\n // we average the cost of collapsing at this vertex\n v.collapseCost = v.totalCost / v.costCount\n // v.collapseCost = v.minCost;\n }\n\n private removeFace = (f: Triangle, faces: Triangle[]): void => {\n removeFromArray(faces, f)\n\n if (f.v1) removeFromArray(f.v1.faces, f)\n if (f.v2) removeFromArray(f.v2.faces, f)\n if (f.v3) removeFromArray(f.v3.faces, f)\n\n // TODO optimize this!\n const vs = [f.v1, f.v2, f.v3]\n let v1, v2\n\n for (let i = 0; i < 3; i++) {\n v1 = vs[i]\n v2 = vs[(i + 1) % 3]\n\n if (!v1 || !v2) continue\n\n v1.removeIfNonNeighbor(v2)\n v2.removeIfNonNeighbor(v1)\n }\n }\n\n private collapse = (vertices: Vertex[], faces: Triangle[], u: Vertex, v: Vertex): void => {\n // u and v are pointers to vertices of an edge\n\n // Collapse the edge uv by moving vertex u onto v\n\n if (!v) {\n // u is a vertex all by itself so just delete it..\n this.removeVertex(u, vertices)\n return\n }\n\n let i\n const tmpVertices = []\n\n for (i = 0; i < u.neighbors.length; i++) {\n tmpVertices.push(u.neighbors[i])\n }\n\n // delete triangles on edge uv:\n for (i = u.faces.length - 1; i >= 0; i--) {\n if (u.faces[i].hasVertex(v)) {\n this.removeFace(u.faces[i], faces)\n }\n }\n\n // update remaining triangles to have v instead of u\n for (i = u.faces.length - 1; i >= 0; i--) {\n u.faces[i].replaceVertex(u, v)\n }\n\n this.removeVertex(u, vertices)\n\n // recompute the edge collapse costs in neighborhood\n for (i = 0; i < tmpVertices.length; i++) {\n this.computeEdgeCostAtVertex(tmpVertices[i])\n }\n }\n\n private minimumCostEdge = (vertices: Vertex[]): Vertex => {\n // O(n * n) approach. TODO optimize this\n\n let least = vertices[0]\n\n for (let i = 0; i < vertices.length; i++) {\n if (vertices[i].collapseCost < least.collapseCost) {\n least = vertices[i]\n }\n }\n\n return least\n }\n\n public modify = (geometry: BufferGeometry, count: number): BufferGeometry => {\n geometry = geometry.clone()\n const attributes = geometry.attributes\n\n // this modifier can only process indexed and non-indexed geomtries with a position attribute\n\n for (let name in attributes) {\n if (name !== 'position') geometry.deleteAttribute(name)\n }\n\n geometry = BufferGeometryUtils.mergeVertices(geometry)\n\n //\n // put data of original geometry in different data structures\n //\n\n const vertices = []\n const faces = []\n\n // add vertices\n\n const positionAttribute = geometry.getAttribute('position')\n\n for (let i = 0; i < positionAttribute.count; i++) {\n const v = new Vector3().fromBufferAttribute(positionAttribute, i)\n\n const vertex = new Vertex(v, i)\n vertices.push(vertex)\n }\n\n // add faces\n\n const geomIndex = geometry.getIndex()\n\n if (geomIndex !== null) {\n for (let i = 0; i < geomIndex.count; i += 3) {\n const a = geomIndex.getX(i)\n const b = geomIndex.getX(i + 1)\n const c = geomIndex.getX(i + 2)\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n } else {\n for (let i = 0; i < positionAttribute.count; i += 3) {\n const a = i\n const b = i + 1\n const c = i + 2\n\n const triangle = new Triangle(vertices[a], vertices[b], vertices[c], a, b, c)\n faces.push(triangle)\n }\n }\n\n // compute all edge collapse costs\n\n for (let i = 0, il = vertices.length; i < il; i++) {\n this.computeEdgeCostAtVertex(vertices[i])\n }\n\n let nextVertex\n\n let z = count\n\n while (z--) {\n nextVertex = this.minimumCostEdge(vertices)\n\n if (!nextVertex) {\n console.log('THREE.SimplifyModifier: No next vertex')\n break\n } else {\n this.collapse(vertices, faces, nextVertex, nextVertex.collapseNeighbor as Vertex)\n }\n }\n\n //\n\n const simplifiedGeometry = new BufferGeometry()\n const position = []\n let index = []\n\n //\n\n for (let i = 0; i < vertices.length; i++) {\n const vertex = vertices[i].position\n position.push(vertex.x, vertex.y, vertex.z)\n }\n\n //\n\n for (let i = 0; i < faces.length; i++) {\n const face = faces[i]\n\n const a = vertices.indexOf(face.v1)\n const b = vertices.indexOf(face.v2)\n const c = vertices.indexOf(face.v3)\n\n index.push(a, b, c)\n }\n\n //\n\n simplifiedGeometry.setAttribute('position', new Float32BufferAttribute(position, 3))\n simplifiedGeometry.setIndex(index)\n\n return simplifiedGeometry\n }\n}\n\nexport { SimplifyModifier }\n"],"names":["BufferGeometryUtils.mergeVertices"],"mappings":"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"}
@@ -8,8 +8,8 @@ var __publicField = (obj, key, value) => {
8
8
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
9
  const THREE = require("three");
10
10
  const ID_ATTR_NAME = "_batch_id_";
11
- const _identityMatrix = new THREE.Matrix4();
12
- const _zeroScaleMatrix = new THREE.Matrix4().set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1);
11
+ const _identityMatrix = /* @__PURE__ */ new THREE.Matrix4();
12
+ const _zeroScaleMatrix = /* @__PURE__ */ (() => new THREE.Matrix4().set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1))();
13
13
  const batchingParsVertex = (
14
14
  /* glsl */
15
15
  `