x_ite 8.7.9 → 8.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (644) hide show
  1. package/Makefile +3 -0
  2. package/build/bin/version.pl +1 -1
  3. package/dist/assets/components/Annotation.js +248 -169
  4. package/dist/assets/components/Annotation.min.js +1 -1
  5. package/dist/assets/components/CADGeometry.js +296 -233
  6. package/dist/assets/components/CADGeometry.min.js +1 -1
  7. package/dist/assets/components/CubeMapTexturing.js +217 -172
  8. package/dist/assets/components/CubeMapTexturing.min.js +1 -1
  9. package/dist/assets/components/DIS.js +451 -387
  10. package/dist/assets/components/DIS.min.js +1 -1
  11. package/dist/assets/components/EventUtilities.js +309 -208
  12. package/dist/assets/components/EventUtilities.min.js +1 -1
  13. package/dist/assets/components/Geometry2D.js +397 -333
  14. package/dist/assets/components/Geometry2D.min.js +1 -1
  15. package/dist/assets/components/Geospatial.js +705 -575
  16. package/dist/assets/components/Geospatial.min.js +1 -1
  17. package/dist/assets/components/HAnim.js +319 -259
  18. package/dist/assets/components/HAnim.min.js +1 -1
  19. package/dist/assets/components/KeyDeviceSensor.js +134 -99
  20. package/dist/assets/components/KeyDeviceSensor.min.js +1 -1
  21. package/dist/assets/components/Layout.js +305 -240
  22. package/dist/assets/components/Layout.min.js +1 -1
  23. package/dist/assets/components/NURBS.js +781 -620
  24. package/dist/assets/components/NURBS.min.js +1 -1
  25. package/dist/assets/components/ParticleSystems.js +632 -460
  26. package/dist/assets/components/ParticleSystems.min.js +1 -1
  27. package/dist/assets/components/Picking.js +376 -295
  28. package/dist/assets/components/Picking.min.js +1 -1
  29. package/dist/assets/components/RigidBodyPhysics.js +936 -749
  30. package/dist/assets/components/RigidBodyPhysics.min.js +1 -1
  31. package/dist/assets/components/Scripting.js +166 -96
  32. package/dist/assets/components/Scripting.min.js +1 -1
  33. package/dist/assets/components/Text.js +241 -207
  34. package/dist/assets/components/Text.min.js +1 -1
  35. package/dist/assets/components/TextureProjector.js +162 -129
  36. package/dist/assets/components/TextureProjector.min.js +1 -1
  37. package/dist/assets/components/Texturing3D.js +485 -384
  38. package/dist/assets/components/Texturing3D.min.js +1 -1
  39. package/dist/assets/components/VolumeRendering.js +741 -547
  40. package/dist/assets/components/VolumeRendering.min.js +1 -1
  41. package/dist/assets/components/X_ITE.js +66 -54
  42. package/dist/assets/components/X_ITE.min.js +1 -1
  43. package/dist/x_ite.css +1 -1
  44. package/dist/x_ite.js +61527 -59688
  45. package/dist/x_ite.min.js +1 -1
  46. package/dist/x_ite.zip +0 -0
  47. package/docs/_config.yml +2 -2
  48. package/package.json +4 -4
  49. package/src/assets/components/Annotation.js +14 -14
  50. package/src/assets/components/CADGeometry.js +14 -14
  51. package/src/assets/components/CubeMapTexturing.js +11 -11
  52. package/src/assets/components/DIS.js +13 -13
  53. package/src/assets/components/EventUtilities.js +16 -16
  54. package/src/assets/components/Geometry2D.js +15 -15
  55. package/src/assets/components/Geospatial.js +19 -19
  56. package/src/assets/components/HAnim.js +13 -13
  57. package/src/assets/components/KeyDeviceSensor.js +10 -10
  58. package/src/assets/components/Layout.js +13 -13
  59. package/src/assets/components/NURBS.js +24 -24
  60. package/src/assets/components/ParticleSystems.js +19 -19
  61. package/src/assets/components/Picking.js +14 -14
  62. package/src/assets/components/RigidBodyPhysics.js +24 -24
  63. package/src/assets/components/Scripting.js +9 -9
  64. package/src/assets/components/Text.js +10 -10
  65. package/src/assets/components/TextureProjector.js +10 -10
  66. package/src/assets/components/Texturing3D.js +16 -16
  67. package/src/assets/components/VolumeRendering.js +23 -23
  68. package/src/assets/components/X_ITE.js +8 -7
  69. package/src/bookmarks.js +2 -2
  70. package/src/lib/jquery.js +42 -30
  71. package/src/standard/Geospatial/Geodetic.js +8 -9
  72. package/src/standard/Geospatial/UniversalTransverseMercator.js +4 -5
  73. package/src/standard/Math/Algorithm.js +41 -56
  74. package/src/standard/Math/Algorithms/Bezier.js +2 -2
  75. package/src/standard/Math/Algorithms/MergeSort.js +6 -6
  76. package/src/standard/Math/Algorithms/PartialSort.js +5 -5
  77. package/src/standard/Math/Algorithms/QuickSort.js +5 -5
  78. package/src/standard/Math/Geometry/Box2.js +16 -17
  79. package/src/standard/Math/Geometry/Box3.js +18 -19
  80. package/src/standard/Math/Geometry/Camera.js +6 -5
  81. package/src/standard/Math/Geometry/Cylinder3.js +6 -7
  82. package/src/standard/Math/Geometry/Line2.js +20 -18
  83. package/src/standard/Math/Geometry/Line3.js +20 -18
  84. package/src/standard/Math/Geometry/Plane3.js +11 -12
  85. package/src/standard/Math/Geometry/Sphere3.js +6 -7
  86. package/src/standard/Math/Geometry/Spheroid3.js +6 -7
  87. package/src/standard/Math/Geometry/Triangle2.js +4 -3
  88. package/src/standard/Math/Geometry/Triangle3.js +5 -4
  89. package/src/standard/Math/Geometry/ViewVolume.js +6 -7
  90. package/src/standard/Math/Numbers/Color3.js +18 -19
  91. package/src/standard/Math/Numbers/Color4.js +20 -21
  92. package/src/standard/Math/Numbers/Complex.js +28 -29
  93. package/src/standard/Math/Numbers/Matrix2.js +22 -23
  94. package/src/standard/Math/Numbers/Matrix3.js +28 -29
  95. package/src/standard/Math/Numbers/Matrix4.js +29 -30
  96. package/src/standard/Math/Numbers/Quaternion.js +40 -41
  97. package/src/standard/Math/Numbers/Rotation4.js +34 -35
  98. package/src/standard/Math/Numbers/Vector2.js +29 -30
  99. package/src/standard/Math/Numbers/Vector3.js +32 -33
  100. package/src/standard/Math/Numbers/Vector4.js +34 -35
  101. package/src/standard/Math/Utility/BVH.js +14 -15
  102. package/src/standard/Math/Utility/MatrixStack.js +12 -12
  103. package/src/standard/Time/MicroTime.js +4 -3
  104. package/src/standard/Utility/BitSet.js +10 -11
  105. package/src/standard/Utility/DataStorage.js +10 -10
  106. package/src/standard/Utility/MapUtilities.js +2 -1
  107. package/src/standard/Utility/ObjectCache.js +3 -3
  108. package/src/tests.js +10 -0
  109. package/src/x_ite/Base/Events.js +3 -3
  110. package/src/x_ite/Base/FieldArray.js +11 -9
  111. package/src/x_ite/Base/FieldDefinitionArray.js +11 -9
  112. package/src/x_ite/Base/X3DArrayField.js +13 -14
  113. package/src/x_ite/Base/X3DBaseNode.js +218 -178
  114. package/src/x_ite/Base/X3DCast.js +1 -1
  115. package/src/x_ite/Base/X3DChildObject.js +162 -53
  116. package/src/x_ite/Base/X3DConstants.js +74 -60
  117. package/src/x_ite/Base/X3DEventObject.js +6 -12
  118. package/src/x_ite/Base/X3DField.js +45 -42
  119. package/src/x_ite/Base/X3DFieldDefinition.js +9 -7
  120. package/src/x_ite/Base/X3DInfoArray.js +75 -65
  121. package/src/x_ite/Base/X3DObject.js +60 -30
  122. package/src/x_ite/Base/X3DObjectArrayField.js +48 -83
  123. package/src/x_ite/Base/X3DTypedArrayField.js +46 -40
  124. package/src/x_ite/Browser/Core/BrowserOptions.js +55 -57
  125. package/src/x_ite/Browser/Core/BrowserProperties.js +18 -20
  126. package/src/x_ite/Browser/Core/BrowserTimings.js +29 -33
  127. package/src/x_ite/Browser/Core/Context.js +7 -7
  128. package/src/x_ite/Browser/Core/ContextMenu.js +61 -83
  129. package/src/x_ite/Browser/Core/Notification.js +12 -12
  130. package/src/x_ite/Browser/Core/RenderingProperties.js +28 -28
  131. package/src/x_ite/Browser/Core/X3DCoreContext.js +45 -37
  132. package/src/x_ite/Browser/DOMIntegration.js +4 -1
  133. package/src/x_ite/Browser/EnvironmentalEffects/X3DEnvironmentalEffectsContext.js +3 -3
  134. package/src/x_ite/Browser/Followers/X3DArrayChaserTemplate.js +1 -1
  135. package/src/x_ite/Browser/Followers/X3DArrayFollowerTemplate.js +12 -12
  136. package/src/x_ite/Browser/Geometry2D/Arc2DOptions.js +8 -14
  137. package/src/x_ite/Browser/Geometry2D/ArcClose2DOptions.js +8 -14
  138. package/src/x_ite/Browser/Geometry2D/Circle2DOptions.js +13 -17
  139. package/src/x_ite/Browser/Geometry2D/Disk2DOptions.js +15 -19
  140. package/src/x_ite/Browser/Geometry2D/Rectangle2DOptions.js +12 -16
  141. package/src/x_ite/Browser/Geometry2D/X3DGeometry2DContext.js +9 -9
  142. package/src/x_ite/Browser/Geometry3D/BoxOptions.js +12 -16
  143. package/src/x_ite/Browser/Geometry3D/ConeOptions.js +6 -12
  144. package/src/x_ite/Browser/Geometry3D/CylinderOptions.js +6 -12
  145. package/src/x_ite/Browser/Geometry3D/IcoSphereOptions.js +13 -17
  146. package/src/x_ite/Browser/Geometry3D/QuadSphereOptions.js +17 -21
  147. package/src/x_ite/Browser/Geometry3D/X3DGeometry3DContext.js +8 -8
  148. package/src/x_ite/Browser/Geospatial/Geocentric.js +5 -6
  149. package/src/x_ite/Browser/Geospatial/Geospatial.js +10 -10
  150. package/src/x_ite/Browser/Grouping/X3DGroupingContext.js +3 -3
  151. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolator.js +2 -3
  152. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolator1.js +8 -9
  153. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolatorTemplate.js +7 -8
  154. package/src/x_ite/Browser/Interpolation/SquatInterpolator.js +3 -4
  155. package/src/x_ite/Browser/KeyDeviceSensor/X3DKeyDeviceSensorContext.js +8 -8
  156. package/src/x_ite/Browser/Layering/X3DLayeringContext.js +4 -4
  157. package/src/x_ite/Browser/Layout/ScreenText.js +7 -8
  158. package/src/x_ite/Browser/Layout/X3DLayoutContext.js +3 -3
  159. package/src/x_ite/Browser/Legacy.js +32 -12
  160. package/src/x_ite/Browser/Lighting/X3DLightingContext.js +5 -5
  161. package/src/x_ite/Browser/NURBS/NURBS.js +10 -10
  162. package/src/x_ite/Browser/Navigation/ExamineViewer.js +32 -20
  163. package/src/x_ite/Browser/Navigation/FlyViewer.js +22 -10
  164. package/src/x_ite/Browser/Navigation/LookAtViewer.js +29 -17
  165. package/src/x_ite/Browser/Navigation/NoneViewer.js +15 -5
  166. package/src/x_ite/Browser/Navigation/PlaneViewer.js +24 -12
  167. package/src/x_ite/Browser/Navigation/WalkViewer.js +22 -10
  168. package/src/x_ite/Browser/Navigation/X3DFlyViewer.js +17 -18
  169. package/src/x_ite/Browser/Navigation/X3DNavigationContext.js +19 -19
  170. package/src/x_ite/Browser/Navigation/X3DViewer.js +13 -19
  171. package/src/x_ite/Browser/Networking/URLs.js +5 -5
  172. package/src/x_ite/Browser/Networking/X3DNetworkingContext.js +16 -16
  173. package/src/x_ite/Browser/ParticleSystems/X3DParticleSystemsContext.js +3 -3
  174. package/src/x_ite/Browser/Picking/VolumePicker.js +8 -8
  175. package/src/x_ite/Browser/Picking/X3DPickingContext.js +12 -12
  176. package/src/x_ite/Browser/PointingDeviceSensor/PointingDevice.js +24 -20
  177. package/src/x_ite/Browser/PointingDeviceSensor/PointingDeviceSensorContainer.js +6 -6
  178. package/src/x_ite/Browser/PointingDeviceSensor/X3DPointingDeviceSensorContext.js +21 -21
  179. package/src/x_ite/Browser/Rendering/GeometryContext.js +4 -5
  180. package/src/x_ite/Browser/Rendering/X3DRenderingContext.js +18 -18
  181. package/src/x_ite/Browser/Scripting/X3DScriptingContext.js +4 -4
  182. package/src/x_ite/Browser/Shaders/ShaderCompiler.js +4 -4
  183. package/src/x_ite/Browser/Shaders/ShaderSource.js +1 -1
  184. package/src/x_ite/Browser/Shaders/X3DShadersContext.js +13 -13
  185. package/src/x_ite/Browser/Shape/X3DShapeContext.js +12 -12
  186. package/src/x_ite/Browser/Sound/X3DSoundContext.js +0 -2
  187. package/src/x_ite/Browser/Text/PolygonText.js +10 -11
  188. package/src/x_ite/Browser/Text/X3DTextContext.js +6 -6
  189. package/src/x_ite/Browser/Text/X3DTextGeometry.js +18 -19
  190. package/src/x_ite/Browser/Texturing/GifMedia.js +7 -7
  191. package/src/x_ite/Browser/Texturing/X3DTexturingContext.js +24 -24
  192. package/src/x_ite/Browser/Texturing3D/DICOMParser.js +38 -38
  193. package/src/x_ite/Browser/Texturing3D/NRRDParser.js +14 -14
  194. package/src/x_ite/Browser/Time/X3DTimeContext.js +5 -5
  195. package/src/x_ite/Browser/VERSION.js +1 -1
  196. package/src/x_ite/Browser/VolumeRendering/VolumeMaterial.js +39 -22
  197. package/src/x_ite/Browser/VolumeRendering/X3DVolumeRenderingContext.js +6 -6
  198. package/src/x_ite/Browser/X3DBrowser.js +166 -140
  199. package/src/x_ite/Browser/X3DBrowserContext.js +23 -24
  200. package/src/x_ite/Components/Annotation/AnnotationLayer.js +30 -19
  201. package/src/x_ite/Components/Annotation/AnnotationTarget.js +30 -19
  202. package/src/x_ite/Components/Annotation/GroupAnnotation.js +40 -29
  203. package/src/x_ite/Components/Annotation/IconAnnotation.js +38 -27
  204. package/src/x_ite/Components/Annotation/TextAnnotation.js +31 -20
  205. package/src/x_ite/Components/Annotation/URLAnnotation.js +30 -19
  206. package/src/x_ite/Components/Annotation/X3DAnnotationNode.js +16 -3
  207. package/src/x_ite/Components/CADGeometry/CADAssembly.js +32 -21
  208. package/src/x_ite/Components/CADGeometry/CADFace.js +48 -37
  209. package/src/x_ite/Components/CADGeometry/CADLayer.js +30 -21
  210. package/src/x_ite/Components/CADGeometry/CADPart.js +37 -26
  211. package/src/x_ite/Components/CADGeometry/IndexedQuadSet.js +51 -46
  212. package/src/x_ite/Components/CADGeometry/QuadSet.js +48 -43
  213. package/src/x_ite/Components/CADGeometry/X3DProductStructureChildNode.js +13 -2
  214. package/src/x_ite/Components/Core/MetadataBoolean.js +33 -22
  215. package/src/x_ite/Components/Core/MetadataDouble.js +33 -22
  216. package/src/x_ite/Components/Core/MetadataFloat.js +33 -22
  217. package/src/x_ite/Components/Core/MetadataInteger.js +33 -22
  218. package/src/x_ite/Components/Core/MetadataSet.js +33 -22
  219. package/src/x_ite/Components/Core/MetadataString.js +33 -22
  220. package/src/x_ite/Components/Core/WorldInfo.js +34 -23
  221. package/src/x_ite/Components/Core/X3DBindableNode.js +17 -4
  222. package/src/x_ite/Components/Core/X3DChildNode.js +19 -6
  223. package/src/x_ite/Components/Core/X3DInfoNode.js +13 -2
  224. package/src/x_ite/Components/Core/X3DMetadataObject.js +18 -5
  225. package/src/x_ite/Components/Core/X3DNode.js +53 -21
  226. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +68 -77
  227. package/src/x_ite/Components/Core/X3DSensorNode.js +13 -2
  228. package/src/x_ite/Components/Core.js +22 -29
  229. package/src/x_ite/Components/CubeMapTexturing/ComposedCubeMapTexture.js +46 -35
  230. package/src/x_ite/Components/CubeMapTexturing/GeneratedCubeMapTexture.js +39 -28
  231. package/src/x_ite/Components/CubeMapTexturing/ImageCubeMapTexture.js +47 -36
  232. package/src/x_ite/Components/CubeMapTexturing/X3DEnvironmentTextureNode.js +21 -8
  233. package/src/x_ite/Components/DIS/DISEntityManager.js +29 -20
  234. package/src/x_ite/Components/DIS/DISEntityTypeMapping.js +41 -30
  235. package/src/x_ite/Components/DIS/EspduTransform.js +117 -106
  236. package/src/x_ite/Components/DIS/ReceiverPdu.js +60 -49
  237. package/src/x_ite/Components/DIS/SignalPdu.js +60 -49
  238. package/src/x_ite/Components/DIS/TransmitterPdu.js +76 -65
  239. package/src/x_ite/Components/EnvironmentalEffects/Background.js +47 -36
  240. package/src/x_ite/Components/EnvironmentalEffects/Fog.js +42 -31
  241. package/src/x_ite/Components/EnvironmentalEffects/FogCoordinate.js +39 -28
  242. package/src/x_ite/Components/EnvironmentalEffects/LocalFog.js +40 -29
  243. package/src/x_ite/Components/EnvironmentalEffects/TextureBackground.js +48 -37
  244. package/src/x_ite/Components/EnvironmentalEffects/X3DBackgroundNode.js +28 -15
  245. package/src/x_ite/Components/EnvironmentalEffects/X3DFogObject.js +30 -18
  246. package/src/x_ite/Components/EnvironmentalEffects.js +15 -22
  247. package/src/x_ite/Components/EnvironmentalSensor/ProximitySensor.js +45 -34
  248. package/src/x_ite/Components/EnvironmentalSensor/TransformSensor.js +50 -39
  249. package/src/x_ite/Components/EnvironmentalSensor/VisibilitySensor.js +41 -30
  250. package/src/x_ite/Components/EnvironmentalSensor/X3DEnvironmentalSensorNode.js +22 -9
  251. package/src/x_ite/Components/EnvironmentalSensor.js +12 -19
  252. package/src/x_ite/Components/EventUtilities/BooleanFilter.js +38 -27
  253. package/src/x_ite/Components/EventUtilities/BooleanSequencer.js +38 -27
  254. package/src/x_ite/Components/EventUtilities/BooleanToggle.js +33 -22
  255. package/src/x_ite/Components/EventUtilities/BooleanTrigger.js +32 -21
  256. package/src/x_ite/Components/EventUtilities/IntegerSequencer.js +38 -27
  257. package/src/x_ite/Components/EventUtilities/IntegerTrigger.js +33 -22
  258. package/src/x_ite/Components/EventUtilities/TimeTrigger.js +32 -21
  259. package/src/x_ite/Components/EventUtilities/X3DSequencerNode.js +20 -7
  260. package/src/x_ite/Components/EventUtilities/X3DTriggerNode.js +13 -2
  261. package/src/x_ite/Components/Followers/ColorChaser.js +47 -36
  262. package/src/x_ite/Components/Followers/ColorDamper.js +49 -38
  263. package/src/x_ite/Components/Followers/CoordinateChaser.js +33 -22
  264. package/src/x_ite/Components/Followers/CoordinateDamper.js +35 -24
  265. package/src/x_ite/Components/Followers/OrientationChaser.js +43 -32
  266. package/src/x_ite/Components/Followers/OrientationDamper.js +41 -30
  267. package/src/x_ite/Components/Followers/PositionChaser.js +33 -22
  268. package/src/x_ite/Components/Followers/PositionChaser2D.js +33 -22
  269. package/src/x_ite/Components/Followers/PositionDamper.js +35 -24
  270. package/src/x_ite/Components/Followers/PositionDamper2D.js +35 -24
  271. package/src/x_ite/Components/Followers/ScalarChaser.js +47 -36
  272. package/src/x_ite/Components/Followers/ScalarDamper.js +43 -32
  273. package/src/x_ite/Components/Followers/TexCoordChaser2D.js +33 -22
  274. package/src/x_ite/Components/Followers/TexCoordDamper2D.js +35 -24
  275. package/src/x_ite/Components/Followers/X3DChaserNode.js +27 -14
  276. package/src/x_ite/Components/Followers/X3DDamperNode.js +22 -9
  277. package/src/x_ite/Components/Followers/X3DFollowerNode.js +29 -16
  278. package/src/x_ite/Components/Followers.js +25 -32
  279. package/src/x_ite/Components/Geometry2D/Arc2D.js +38 -27
  280. package/src/x_ite/Components/Geometry2D/ArcClose2D.js +39 -28
  281. package/src/x_ite/Components/Geometry2D/Circle2D.js +35 -24
  282. package/src/x_ite/Components/Geometry2D/Disk2D.js +40 -29
  283. package/src/x_ite/Components/Geometry2D/Polyline2D.js +34 -23
  284. package/src/x_ite/Components/Geometry2D/Polypoint2D.js +34 -23
  285. package/src/x_ite/Components/Geometry2D/Rectangle2D.js +34 -23
  286. package/src/x_ite/Components/Geometry2D/TriangleSet2D.js +36 -25
  287. package/src/x_ite/Components/Geometry3D/Box.js +34 -23
  288. package/src/x_ite/Components/Geometry3D/Cone.js +40 -29
  289. package/src/x_ite/Components/Geometry3D/Cylinder.js +41 -30
  290. package/src/x_ite/Components/Geometry3D/ElevationGrid.js +63 -52
  291. package/src/x_ite/Components/Geometry3D/Extrusion.js +49 -38
  292. package/src/x_ite/Components/Geometry3D/IndexedFaceSet.js +98 -95
  293. package/src/x_ite/Components/Geometry3D/Sphere.js +36 -25
  294. package/src/x_ite/Components/Geometry3D.js +15 -22
  295. package/src/x_ite/Components/Geospatial/GeoCoordinate.js +37 -26
  296. package/src/x_ite/Components/Geospatial/GeoElevationGrid.js +63 -52
  297. package/src/x_ite/Components/Geospatial/GeoLOD.js +59 -48
  298. package/src/x_ite/Components/Geospatial/GeoLocation.js +45 -34
  299. package/src/x_ite/Components/Geospatial/GeoMetadata.js +38 -27
  300. package/src/x_ite/Components/Geospatial/GeoOrigin.js +37 -26
  301. package/src/x_ite/Components/Geospatial/GeoPositionInterpolator.js +43 -32
  302. package/src/x_ite/Components/Geospatial/GeoProximitySensor.js +48 -37
  303. package/src/x_ite/Components/Geospatial/GeoTouchSensor.js +45 -34
  304. package/src/x_ite/Components/Geospatial/GeoTransform.js +49 -38
  305. package/src/x_ite/Components/Geospatial/GeoViewpoint.js +56 -45
  306. package/src/x_ite/Components/Geospatial/X3DGeospatialObject.js +30 -17
  307. package/src/x_ite/Components/Grouping/Group.js +29 -20
  308. package/src/x_ite/Components/Grouping/StaticGroup.js +40 -48
  309. package/src/x_ite/Components/Grouping/Switch.js +51 -40
  310. package/src/x_ite/Components/Grouping/Transform.js +34 -25
  311. package/src/x_ite/Components/Grouping/X3DBoundedObject.js +22 -9
  312. package/src/x_ite/Components/Grouping/X3DGroupingNode.js +224 -219
  313. package/src/x_ite/Components/Grouping/X3DTransformMatrix3DNode.js +20 -7
  314. package/src/x_ite/Components/Grouping/X3DTransformNode.js +17 -4
  315. package/src/x_ite/Components/Grouping.js +16 -23
  316. package/src/x_ite/Components/HAnim/HAnimDisplacer.js +27 -18
  317. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +73 -62
  318. package/src/x_ite/Components/HAnim/HAnimJoint.js +61 -50
  319. package/src/x_ite/Components/HAnim/HAnimMotion.js +44 -33
  320. package/src/x_ite/Components/HAnim/HAnimSegment.js +36 -27
  321. package/src/x_ite/Components/HAnim/HAnimSite.js +36 -27
  322. package/src/x_ite/Components/Interpolation/ColorInterpolator.js +38 -27
  323. package/src/x_ite/Components/Interpolation/CoordinateInterpolator.js +38 -27
  324. package/src/x_ite/Components/Interpolation/CoordinateInterpolator2D.js +38 -27
  325. package/src/x_ite/Components/Interpolation/EaseInEaseOut.js +39 -28
  326. package/src/x_ite/Components/Interpolation/NormalInterpolator.js +38 -27
  327. package/src/x_ite/Components/Interpolation/OrientationInterpolator.js +38 -27
  328. package/src/x_ite/Components/Interpolation/PositionInterpolator.js +38 -27
  329. package/src/x_ite/Components/Interpolation/PositionInterpolator2D.js +38 -27
  330. package/src/x_ite/Components/Interpolation/ScalarInterpolator.js +39 -28
  331. package/src/x_ite/Components/Interpolation/SplinePositionInterpolator.js +44 -33
  332. package/src/x_ite/Components/Interpolation/SplinePositionInterpolator2D.js +44 -33
  333. package/src/x_ite/Components/Interpolation/SplineScalarInterpolator.js +44 -33
  334. package/src/x_ite/Components/Interpolation/SquadOrientationInterpolator.js +40 -29
  335. package/src/x_ite/Components/Interpolation/X3DInterpolatorNode.js +21 -8
  336. package/src/x_ite/Components/Interpolation.js +22 -29
  337. package/src/x_ite/Components/KeyDeviceSensor/KeySensor.js +44 -33
  338. package/src/x_ite/Components/KeyDeviceSensor/StringSensor.js +38 -27
  339. package/src/x_ite/Components/KeyDeviceSensor/X3DKeyDeviceSensorNode.js +23 -10
  340. package/src/x_ite/Components/Layering/Layer.js +40 -29
  341. package/src/x_ite/Components/Layering/LayerSet.js +44 -33
  342. package/src/x_ite/Components/Layering/Viewport.js +48 -37
  343. package/src/x_ite/Components/Layering/X3DLayerNode.js +45 -32
  344. package/src/x_ite/Components/Layering/X3DViewportNode.js +13 -2
  345. package/src/x_ite/Components/Layering.js +13 -20
  346. package/src/x_ite/Components/Layout/Layout.js +60 -49
  347. package/src/x_ite/Components/Layout/LayoutGroup.js +48 -37
  348. package/src/x_ite/Components/Layout/LayoutLayer.js +41 -30
  349. package/src/x_ite/Components/Layout/ScreenFontStyle.js +41 -30
  350. package/src/x_ite/Components/Layout/ScreenGroup.js +42 -31
  351. package/src/x_ite/Components/Layout/X3DLayoutNode.js +13 -2
  352. package/src/x_ite/Components/Lighting/DirectionalLight.js +45 -35
  353. package/src/x_ite/Components/Lighting/EnvironmentLight.js +51 -41
  354. package/src/x_ite/Components/Lighting/PointLight.js +53 -43
  355. package/src/x_ite/Components/Lighting/SpotLight.js +62 -52
  356. package/src/x_ite/Components/Lighting/X3DLightNode.js +29 -16
  357. package/src/x_ite/Components/Lighting.js +13 -20
  358. package/src/x_ite/Components/NURBS/Contour2D.js +45 -43
  359. package/src/x_ite/Components/NURBS/ContourPolyline2D.js +34 -23
  360. package/src/x_ite/Components/NURBS/CoordinateDouble.js +23 -14
  361. package/src/x_ite/Components/NURBS/NurbsCurve.js +47 -36
  362. package/src/x_ite/Components/NURBS/NurbsCurve2D.js +44 -33
  363. package/src/x_ite/Components/NURBS/NurbsOrientationInterpolator.js +46 -35
  364. package/src/x_ite/Components/NURBS/NurbsPatchSurface.js +36 -27
  365. package/src/x_ite/Components/NURBS/NurbsPositionInterpolator.js +46 -35
  366. package/src/x_ite/Components/NURBS/NurbsSet.js +52 -50
  367. package/src/x_ite/Components/NURBS/NurbsSurfaceInterpolator.js +44 -33
  368. package/src/x_ite/Components/NURBS/NurbsSweptSurface.js +40 -29
  369. package/src/x_ite/Components/NURBS/NurbsSwungSurface.js +40 -29
  370. package/src/x_ite/Components/NURBS/NurbsTextureCoordinate.js +43 -32
  371. package/src/x_ite/Components/NURBS/NurbsTrimmedSurface.js +59 -57
  372. package/src/x_ite/Components/NURBS/X3DNurbsControlCurveNode.js +13 -2
  373. package/src/x_ite/Components/NURBS/X3DNurbsSurfaceGeometryNode.js +30 -17
  374. package/src/x_ite/Components/NURBS/X3DParametricGeometryNode.js +16 -3
  375. package/src/x_ite/Components/Navigation/Billboard.js +43 -32
  376. package/src/x_ite/Components/Navigation/Collision.js +49 -38
  377. package/src/x_ite/Components/Navigation/LOD.js +54 -43
  378. package/src/x_ite/Components/Navigation/NavigationInfo.js +58 -47
  379. package/src/x_ite/Components/Navigation/OrthoViewpoint.js +69 -58
  380. package/src/x_ite/Components/Navigation/Viewpoint.js +53 -42
  381. package/src/x_ite/Components/Navigation/ViewpointGroup.js +44 -33
  382. package/src/x_ite/Components/Navigation/X3DViewpointNode.js +48 -35
  383. package/src/x_ite/Components/Navigation.js +16 -23
  384. package/src/x_ite/Components/Networking/Anchor.js +51 -40
  385. package/src/x_ite/Components/Networking/Inline.js +54 -43
  386. package/src/x_ite/Components/Networking/LoadSensor.js +49 -38
  387. package/src/x_ite/Components/Networking/X3DNetworkSensorNode.js +13 -2
  388. package/src/x_ite/Components/Networking/X3DUrlObject.js +35 -22
  389. package/src/x_ite/Components/Networking.js +13 -20
  390. package/src/x_ite/Components/ParticleSystems/BoundedPhysicsModel.js +37 -26
  391. package/src/x_ite/Components/ParticleSystems/ConeEmitter.js +44 -33
  392. package/src/x_ite/Components/ParticleSystems/ExplosionEmitter.js +41 -30
  393. package/src/x_ite/Components/ParticleSystems/ForcePhysicsModel.js +34 -23
  394. package/src/x_ite/Components/ParticleSystems/ParticleSystem.js +83 -72
  395. package/src/x_ite/Components/ParticleSystems/PointEmitter.js +41 -30
  396. package/src/x_ite/Components/ParticleSystems/PolylineEmitter.js +42 -31
  397. package/src/x_ite/Components/ParticleSystems/SurfaceEmitter.js +42 -31
  398. package/src/x_ite/Components/ParticleSystems/VolumeEmitter.js +43 -32
  399. package/src/x_ite/Components/ParticleSystems/WindPhysicsModel.js +38 -27
  400. package/src/x_ite/Components/ParticleSystems/X3DParticleEmitterNode.js +33 -20
  401. package/src/x_ite/Components/ParticleSystems/X3DParticlePhysicsModelNode.js +16 -3
  402. package/src/x_ite/Components/Picking/LinePickSensor.js +49 -38
  403. package/src/x_ite/Components/Picking/PickableGroup.js +45 -34
  404. package/src/x_ite/Components/Picking/PointPickSensor.js +46 -35
  405. package/src/x_ite/Components/Picking/PrimitivePickSensor.js +46 -35
  406. package/src/x_ite/Components/Picking/VolumePickSensor.js +45 -34
  407. package/src/x_ite/Components/Picking/X3DPickSensorNode.js +31 -18
  408. package/src/x_ite/Components/Picking/X3DPickableObject.js +20 -7
  409. package/src/x_ite/Components/PointingDeviceSensor/CylinderSensor.js +50 -39
  410. package/src/x_ite/Components/PointingDeviceSensor/PlaneSensor.js +52 -45
  411. package/src/x_ite/Components/PointingDeviceSensor/SphereSensor.js +44 -33
  412. package/src/x_ite/Components/PointingDeviceSensor/TouchSensor.js +30 -21
  413. package/src/x_ite/Components/PointingDeviceSensor/X3DDragSensorNode.js +13 -2
  414. package/src/x_ite/Components/PointingDeviceSensor/X3DPointingDeviceSensorNode.js +22 -11
  415. package/src/x_ite/Components/PointingDeviceSensor/X3DTouchSensorNode.js +16 -3
  416. package/src/x_ite/Components/PointingDeviceSensor.js +15 -22
  417. package/src/x_ite/Components/Rendering/ClipPlane.js +44 -34
  418. package/src/x_ite/Components/Rendering/Color.js +37 -26
  419. package/src/x_ite/Components/Rendering/ColorRGBA.js +37 -26
  420. package/src/x_ite/Components/Rendering/Coordinate.js +23 -14
  421. package/src/x_ite/Components/Rendering/IndexedLineSet.js +52 -41
  422. package/src/x_ite/Components/Rendering/IndexedTriangleFanSet.js +48 -37
  423. package/src/x_ite/Components/Rendering/IndexedTriangleSet.js +44 -33
  424. package/src/x_ite/Components/Rendering/IndexedTriangleStripSet.js +48 -37
  425. package/src/x_ite/Components/Rendering/LineSet.js +45 -34
  426. package/src/x_ite/Components/Rendering/Normal.js +39 -28
  427. package/src/x_ite/Components/Rendering/PointSet.js +45 -34
  428. package/src/x_ite/Components/Rendering/TriangleFanSet.js +47 -36
  429. package/src/x_ite/Components/Rendering/TriangleSet.js +41 -30
  430. package/src/x_ite/Components/Rendering/TriangleStripSet.js +47 -36
  431. package/src/x_ite/Components/Rendering/X3DColorNode.js +17 -4
  432. package/src/x_ite/Components/Rendering/X3DComposedGeometryNode.js +33 -20
  433. package/src/x_ite/Components/Rendering/X3DCoordinateNode.js +23 -10
  434. package/src/x_ite/Components/Rendering/X3DGeometricPropertyNode.js +13 -2
  435. package/src/x_ite/Components/Rendering/X3DGeometryNode.js +96 -80
  436. package/src/x_ite/Components/Rendering/X3DLineGeometryNode.js +21 -8
  437. package/src/x_ite/Components/Rendering/X3DNormalNode.js +13 -2
  438. package/src/x_ite/Components/Rendering/X3DPointGeometryNode.js +20 -7
  439. package/src/x_ite/Components/Rendering.js +29 -36
  440. package/src/x_ite/Components/RigidBodyPhysics/BallJoint.js +43 -32
  441. package/src/x_ite/Components/RigidBodyPhysics/CollidableOffset.js +48 -37
  442. package/src/x_ite/Components/RigidBodyPhysics/CollidableShape.js +52 -41
  443. package/src/x_ite/Components/RigidBodyPhysics/CollisionCollection.js +47 -36
  444. package/src/x_ite/Components/RigidBodyPhysics/CollisionSensor.js +41 -30
  445. package/src/x_ite/Components/RigidBodyPhysics/CollisionSpace.js +44 -33
  446. package/src/x_ite/Components/RigidBodyPhysics/Contact.js +38 -29
  447. package/src/x_ite/Components/RigidBodyPhysics/DoubleAxisHingeJoint.js +60 -49
  448. package/src/x_ite/Components/RigidBodyPhysics/MotorJoint.js +48 -39
  449. package/src/x_ite/Components/RigidBodyPhysics/RigidBody.js +69 -58
  450. package/src/x_ite/Components/RigidBodyPhysics/RigidBodyCollection.js +61 -50
  451. package/src/x_ite/Components/RigidBodyPhysics/SingleAxisHingeJoint.js +49 -38
  452. package/src/x_ite/Components/RigidBodyPhysics/SliderJoint.js +47 -36
  453. package/src/x_ite/Components/RigidBodyPhysics/UniversalJoint.js +36 -27
  454. package/src/x_ite/Components/RigidBodyPhysics/X3DNBodyCollidableNode.js +24 -11
  455. package/src/x_ite/Components/RigidBodyPhysics/X3DNBodyCollisionSpaceNode.js +17 -4
  456. package/src/x_ite/Components/RigidBodyPhysics/X3DRigidJointNode.js +34 -21
  457. package/src/x_ite/Components/Scripting/Script.js +76 -46
  458. package/src/x_ite/Components/Scripting/X3DScriptNode.js +17 -4
  459. package/src/x_ite/Components/Shaders/ComposedShader.js +46 -35
  460. package/src/x_ite/Components/Shaders/FloatVertexAttribute.js +40 -29
  461. package/src/x_ite/Components/Shaders/Matrix3VertexAttribute.js +38 -27
  462. package/src/x_ite/Components/Shaders/Matrix4VertexAttribute.js +38 -27
  463. package/src/x_ite/Components/Shaders/PackagedShader.js +45 -34
  464. package/src/x_ite/Components/Shaders/ProgramShader.js +27 -18
  465. package/src/x_ite/Components/Shaders/ShaderPart.js +47 -36
  466. package/src/x_ite/Components/Shaders/ShaderProgram.js +42 -31
  467. package/src/x_ite/Components/Shaders/X3DProgrammableShaderObject.js +51 -38
  468. package/src/x_ite/Components/Shaders/X3DShaderNode.js +19 -6
  469. package/src/x_ite/Components/Shaders/X3DVertexAttributeNode.js +17 -4
  470. package/src/x_ite/Components/Shaders.js +19 -26
  471. package/src/x_ite/Components/Shape/AcousticProperties.js +28 -19
  472. package/src/x_ite/Components/Shape/Appearance.js +79 -68
  473. package/src/x_ite/Components/Shape/FillProperties.js +44 -33
  474. package/src/x_ite/Components/Shape/LineProperties.js +44 -33
  475. package/src/x_ite/Components/Shape/Material.js +75 -64
  476. package/src/x_ite/Components/Shape/PhysicalMaterial.js +65 -54
  477. package/src/x_ite/Components/Shape/PointProperties.js +43 -32
  478. package/src/x_ite/Components/Shape/Shape.js +48 -37
  479. package/src/x_ite/Components/Shape/TwoSidedMaterial.js +60 -49
  480. package/src/x_ite/Components/Shape/UnlitMaterial.js +44 -33
  481. package/src/x_ite/Components/Shape/X3DAppearanceChildNode.js +13 -2
  482. package/src/x_ite/Components/Shape/X3DAppearanceNode.js +17 -4
  483. package/src/x_ite/Components/Shape/X3DMaterialNode.js +41 -33
  484. package/src/x_ite/Components/Shape/X3DOneSidedMaterialNode.js +29 -16
  485. package/src/x_ite/Components/Shape/X3DShapeNode.js +28 -15
  486. package/src/x_ite/Components/Shape.js +23 -30
  487. package/src/x_ite/Components/Sound/Analyser.js +46 -37
  488. package/src/x_ite/Components/Sound/AudioClip.js +61 -50
  489. package/src/x_ite/Components/Sound/AudioDestination.js +35 -26
  490. package/src/x_ite/Components/Sound/BiquadFilter.js +45 -36
  491. package/src/x_ite/Components/Sound/BufferAudioSource.js +61 -50
  492. package/src/x_ite/Components/Sound/ChannelMerger.js +32 -23
  493. package/src/x_ite/Components/Sound/ChannelSelector.js +33 -24
  494. package/src/x_ite/Components/Sound/ChannelSplitter.js +33 -24
  495. package/src/x_ite/Components/Sound/Convolver.js +43 -34
  496. package/src/x_ite/Components/Sound/Delay.js +43 -34
  497. package/src/x_ite/Components/Sound/DynamicsCompressor.js +47 -38
  498. package/src/x_ite/Components/Sound/Gain.js +41 -32
  499. package/src/x_ite/Components/Sound/ListenerPointSource.js +39 -30
  500. package/src/x_ite/Components/Sound/MicrophoneSource.js +35 -26
  501. package/src/x_ite/Components/Sound/OscillatorSource.js +37 -28
  502. package/src/x_ite/Components/Sound/PeriodicWave.js +27 -18
  503. package/src/x_ite/Components/Sound/Sound.js +51 -40
  504. package/src/x_ite/Components/Sound/SpatialSound.js +42 -33
  505. package/src/x_ite/Components/Sound/StreamAudioDestination.js +35 -26
  506. package/src/x_ite/Components/Sound/StreamAudioSource.js +35 -26
  507. package/src/x_ite/Components/Sound/WaveShaper.js +43 -34
  508. package/src/x_ite/Components/Sound/X3DSoundChannelNode.js +13 -2
  509. package/src/x_ite/Components/Sound/X3DSoundDestinationNode.js +13 -2
  510. package/src/x_ite/Components/Sound/X3DSoundNode.js +13 -2
  511. package/src/x_ite/Components/Sound/X3DSoundProcessingNode.js +17 -4
  512. package/src/x_ite/Components/Sound/X3DSoundSourceNode.js +30 -17
  513. package/src/x_ite/Components/Sound.js +34 -41
  514. package/src/x_ite/Components/Text/FontStyle.js +37 -26
  515. package/src/x_ite/Components/Text/Text.js +50 -39
  516. package/src/x_ite/Components/Text/X3DFontStyleNode.js +32 -18
  517. package/src/x_ite/Components/TextureProjector/TextureProjector.js +49 -39
  518. package/src/x_ite/Components/TextureProjector/TextureProjectorParallel.js +58 -48
  519. package/src/x_ite/Components/TextureProjector/X3DTextureProjectorNode.js +27 -14
  520. package/src/x_ite/Components/Texturing/ImageTexture.js +50 -39
  521. package/src/x_ite/Components/Texturing/MovieTexture.js +67 -56
  522. package/src/x_ite/Components/Texturing/MultiTexture.js +52 -41
  523. package/src/x_ite/Components/Texturing/MultiTextureCoordinate.js +44 -33
  524. package/src/x_ite/Components/Texturing/MultiTextureTransform.js +39 -28
  525. package/src/x_ite/Components/Texturing/PixelTexture.js +42 -31
  526. package/src/x_ite/Components/Texturing/TextureCoordinate.js +41 -30
  527. package/src/x_ite/Components/Texturing/TextureCoordinateGenerator.js +41 -30
  528. package/src/x_ite/Components/Texturing/TextureProperties.js +47 -36
  529. package/src/x_ite/Components/Texturing/TextureTransform.js +39 -28
  530. package/src/x_ite/Components/Texturing/X3DSingleTextureCoordinateNode.js +20 -7
  531. package/src/x_ite/Components/Texturing/X3DSingleTextureNode.js +21 -8
  532. package/src/x_ite/Components/Texturing/X3DSingleTextureTransformNode.js +20 -7
  533. package/src/x_ite/Components/Texturing/X3DTexture2DNode.js +26 -13
  534. package/src/x_ite/Components/Texturing/X3DTextureCoordinateNode.js +13 -2
  535. package/src/x_ite/Components/Texturing/X3DTextureNode.js +17 -4
  536. package/src/x_ite/Components/Texturing/X3DTextureTransformNode.js +13 -2
  537. package/src/x_ite/Components/Texturing.js +25 -32
  538. package/src/x_ite/Components/Texturing3D/ComposedTexture3D.js +44 -33
  539. package/src/x_ite/Components/Texturing3D/ImageTexture3D.js +46 -35
  540. package/src/x_ite/Components/Texturing3D/ImageTextureAtlas.js +54 -43
  541. package/src/x_ite/Components/Texturing3D/PixelTexture3D.js +40 -29
  542. package/src/x_ite/Components/Texturing3D/TextureCoordinate3D.js +41 -30
  543. package/src/x_ite/Components/Texturing3D/TextureCoordinate4D.js +41 -30
  544. package/src/x_ite/Components/Texturing3D/TextureTransform3D.js +39 -28
  545. package/src/x_ite/Components/Texturing3D/TextureTransformMatrix3D.js +36 -25
  546. package/src/x_ite/Components/Texturing3D/X3DTexture3DNode.js +26 -13
  547. package/src/x_ite/Components/Time/TimeSensor.js +55 -44
  548. package/src/x_ite/Components/Time/X3DTimeDependentNode.js +38 -25
  549. package/src/x_ite/Components/Time.js +10 -17
  550. package/src/x_ite/Components/VolumeRendering/BlendedVolumeStyle.js +51 -41
  551. package/src/x_ite/Components/VolumeRendering/BoundaryEnhancementVolumeStyle.js +39 -28
  552. package/src/x_ite/Components/VolumeRendering/CartoonVolumeStyle.js +42 -31
  553. package/src/x_ite/Components/VolumeRendering/ComposedVolumeStyle.js +41 -30
  554. package/src/x_ite/Components/VolumeRendering/EdgeEnhancementVolumeStyle.js +41 -30
  555. package/src/x_ite/Components/VolumeRendering/IsoSurfaceVolumeData.js +50 -39
  556. package/src/x_ite/Components/VolumeRendering/OpacityMapVolumeStyle.js +39 -28
  557. package/src/x_ite/Components/VolumeRendering/ProjectionVolumeStyle.js +38 -27
  558. package/src/x_ite/Components/VolumeRendering/SegmentedVolumeData.js +49 -38
  559. package/src/x_ite/Components/VolumeRendering/ShadedVolumeStyle.js +44 -33
  560. package/src/x_ite/Components/VolumeRendering/SilhouetteEnhancementVolumeStyle.js +42 -31
  561. package/src/x_ite/Components/VolumeRendering/ToneMappedVolumeStyle.js +41 -30
  562. package/src/x_ite/Components/VolumeRendering/VolumeData.js +45 -34
  563. package/src/x_ite/Components/VolumeRendering/X3DComposableVolumeRenderStyleNode.js +13 -2
  564. package/src/x_ite/Components/VolumeRendering/X3DVolumeDataNode.js +25 -12
  565. package/src/x_ite/Components/VolumeRendering/X3DVolumeRenderStyleNode.js +22 -9
  566. package/src/x_ite/Components/X_ITE/BlendMode.js +48 -37
  567. package/src/x_ite/Components.js +38 -14
  568. package/src/x_ite/Configuration/{NodeTypeArray.js → AbstractNodes.js} +2 -20
  569. package/src/x_ite/{Fallback.js → Configuration/AbstractNodesArray.js} +22 -29
  570. package/src/x_ite/Configuration/ComponentInfo.js +14 -10
  571. package/src/x_ite/Configuration/ComponentInfoArray.js +14 -10
  572. package/src/x_ite/Configuration/ConcreteNodes.js +50 -0
  573. package/src/x_ite/Configuration/{SupportedNodes.js → ConcreteNodesArray.js} +28 -35
  574. package/src/x_ite/Configuration/ProfileInfo.js +13 -9
  575. package/src/x_ite/Configuration/ProfileInfoArray.js +14 -13
  576. package/src/x_ite/Configuration/SupportedComponents.js +40 -78
  577. package/src/x_ite/Configuration/SupportedProfiles.js +16 -16
  578. package/src/x_ite/Configuration/UnitInfo.js +14 -10
  579. package/src/x_ite/Configuration/UnitInfoArray.js +10 -21
  580. package/src/x_ite/Execution/BindableList.js +14 -10
  581. package/src/x_ite/Execution/BindableStack.js +14 -10
  582. package/src/x_ite/Execution/ExportedNodesArray.js +11 -9
  583. package/src/x_ite/Execution/ImportedNodesArray.js +11 -9
  584. package/src/x_ite/Execution/NamedNodesArray.js +11 -22
  585. package/src/x_ite/Execution/X3DExecutionContext.js +121 -110
  586. package/src/x_ite/Execution/X3DExportedNode.js +18 -10
  587. package/src/x_ite/Execution/X3DImportedNode.js +35 -22
  588. package/src/x_ite/Execution/X3DScene.js +93 -64
  589. package/src/x_ite/Execution/X3DWorld.js +21 -17
  590. package/src/x_ite/Fields/ArrayFields.js +87 -153
  591. package/src/x_ite/Fields/SFBool.js +21 -25
  592. package/src/x_ite/Fields/SFColor.js +43 -39
  593. package/src/x_ite/Fields/SFColorRGBA.js +39 -35
  594. package/src/x_ite/Fields/SFDouble.js +20 -21
  595. package/src/x_ite/Fields/SFFloat.js +20 -21
  596. package/src/x_ite/Fields/SFImage.js +50 -48
  597. package/src/x_ite/Fields/SFInt32.js +20 -21
  598. package/src/x_ite/Fields/SFMatrix3.js +23 -16
  599. package/src/x_ite/Fields/SFMatrix4.js +24 -17
  600. package/src/x_ite/Fields/SFMatrixPrototypeTemplate.js +31 -31
  601. package/src/x_ite/Fields/SFNode.js +57 -88
  602. package/src/x_ite/Fields/SFNodeCache.js +7 -11
  603. package/src/x_ite/Fields/SFRotation.js +73 -62
  604. package/src/x_ite/Fields/SFString.js +35 -36
  605. package/src/x_ite/Fields/SFTime.js +20 -21
  606. package/src/x_ite/Fields/SFVec2.js +17 -14
  607. package/src/x_ite/Fields/SFVec3.js +20 -17
  608. package/src/x_ite/Fields/SFVec4.js +21 -18
  609. package/src/x_ite/Fields/SFVecPrototypeTemplate.js +36 -36
  610. package/src/x_ite/Fields.js +6 -13
  611. package/src/x_ite/InputOutput/FileLoader.js +37 -41
  612. package/src/x_ite/InputOutput/Generator.js +50 -51
  613. package/src/x_ite/Parser/GLB2Parser.js +12 -13
  614. package/src/x_ite/Parser/GLTF2Parser.js +111 -112
  615. package/src/x_ite/Parser/GoldenGate.js +11 -13
  616. package/src/x_ite/Parser/HTMLSupport.js +15 -5
  617. package/src/x_ite/Parser/JSONParser.js +21 -22
  618. package/src/x_ite/Parser/OBJParser.js +56 -57
  619. package/src/x_ite/Parser/STLAParser.js +22 -23
  620. package/src/x_ite/Parser/STLBParser.js +12 -13
  621. package/src/x_ite/Parser/SVGParser.js +85 -86
  622. package/src/x_ite/Parser/VRMLParser.js +495 -878
  623. package/src/x_ite/Parser/X3DOptimizer.js +7 -7
  624. package/src/x_ite/Parser/X3DParser.js +17 -17
  625. package/src/x_ite/Parser/XMLParser.js +215 -269
  626. package/src/x_ite/Prototype/ExternProtoDeclarationArray.js +11 -9
  627. package/src/x_ite/Prototype/ProtoDeclarationArray.js +11 -9
  628. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +35 -27
  629. package/src/x_ite/Prototype/X3DProtoDeclaration.js +28 -20
  630. package/src/x_ite/Prototype/X3DProtoDeclarationNode.js +18 -10
  631. package/src/x_ite/Rendering/DependentRenderer.js +11 -12
  632. package/src/x_ite/Rendering/MultiSampleFrameBuffer.js +9 -10
  633. package/src/x_ite/Rendering/PointingBuffer.js +6 -7
  634. package/src/x_ite/Rendering/TextureBuffer.js +11 -12
  635. package/src/x_ite/Rendering/VertexArray.js +5 -5
  636. package/src/x_ite/Rendering/X3DRenderObject.js +51 -52
  637. package/src/x_ite/Routing/RouteArray.js +11 -9
  638. package/src/x_ite/Routing/X3DRoute.js +29 -21
  639. package/src/x_ite/Routing/X3DRoutingContext.js +8 -9
  640. package/src/x_ite/X3D.js +27 -26
  641. package/src/x_ite/X3DCanvasElement.js +18 -7
  642. package/src/x_ite.css +2 -1
  643. package/webpack.config.js +2 -2
  644. /package/src/x_ite/{DEBUG.js → DEVELOPMENT.js} +0 -0
@@ -1 +1 @@
1
- /* X_ITE v8.7.9 */(()=>{"use strict";var e={n:t=>{var n=t&&t.__esModule?()=>t.default:()=>t;return e.d(n,{a:n}),n},d:(t,n)=>{for(var i in n)e.o(n,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:n[i]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};const t=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Components");var n=e.n(t);const i=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Fields");var o=e.n(i);const r=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Base/X3DFieldDefinition");var s=e.n(r);const a=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Base/FieldDefinitionArray");var c=e.n(a);const l=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Components/Core/X3DNode");var u=e.n(l);const d=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Namespace");var m=e.n(d);let h=0;const f={POINT:h++,LINE:h++,TRIANGLE:h++,QUAD:h++,SPRITE:h++,GEOMETRY:h++};m().set("x_ite/Browser/ParticleSystems/GeometryTypes",f);const p=f,x=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Base/X3DConstants");var _=e.n(x);const g="\nstruct Line3 {\n vec3 point;\n vec3 direction;\n};\n\n// Line3\n// line3 (const in vec3 point1, const in vec3 point2)\n// {\n// return Line3 (point1, normalize (point2 - point1));\n// }\n\n/* Line intersect triangle */\n\nbool\nintersects (const in Line3 line, const in vec3 a, const in vec3 b, const in vec3 c, out vec3 r)\n{\n // find vectors for two edges sharing vert0\n vec3 edge1 = b - a;\n vec3 edge2 = c - a;\n\n // begin calculating determinant - also used to calculate U parameter\n vec3 pvec = cross (line .direction, edge2);\n\n // if determinant is near zero, ray lies in plane of triangle\n float det = dot (edge1, pvec);\n\n // Non culling intersection\n\n if (det == 0.0)\n return false;\n\n float inv_det = 1.0 / det;\n\n // calculate distance from vert0 to ray point\n vec3 tvec = line .point - a;\n\n // calculate U parameter and test bounds\n float u = dot (tvec, pvec) * inv_det;\n\n if (u < 0.0 || u > 1.0)\n return false;\n\n // prepare to test V parameter\n vec3 qvec = cross (tvec, edge1);\n\n // calculate V parameter and test bounds\n float v = dot (line .direction, qvec) * inv_det;\n\n if (v < 0.0 || u + v > 1.0)\n return false;\n\n r = vec3 (u, v, 1.0 - u - v);\n\n return true;\n}\n";m().set("x_ite/Browser/ParticleSystems/Line3.glsl",g);const y=g,v="\nstruct Plane3\n{\n vec3 normal;\n float distanceFromOrigin;\n};\n\nPlane3\nplane3 (const in vec3 point, const in vec3 normal)\n{\n return Plane3 (normal, dot (normal, point));\n}\n\nfloat\nplane_distance (const in Plane3 plane, const in vec3 point)\n{\n return dot (point, plane .normal) - plane .distanceFromOrigin;\n}\n\n/* Plane intersect line */\nbool\nintersects (const in Plane3 plane, const in Line3 line, out vec3 point)\n{\n // Check if the line is parallel to the plane.\n float theta = dot (line .direction, plane .normal);\n\n // Plane and line are parallel.\n if (theta == 0.0)\n return false;\n\n // Plane and line are not parallel. The intersection point can be calculated now.\n float t = (plane .distanceFromOrigin - dot (plane .normal, line .point)) / theta;\n\n point = line .point + line .direction * t;\n\n return true;\n}\n\n/* Find find the first point that is farther to the plane than value. */\n// int\n// upper_bound (const in vec4 points [ARRAY_SIZE], in int count, const in float value, const in Plane3 plane)\n// {\n// int first = 0;\n// int step = 0;\n\n// while (count > 0)\n// {\n// int index = first;\n\n// step = count >> 1;\n\n// index += step;\n\n// if (value < plane_distance (plane, points [index] .xyz))\n// {\n// count = step;\n// }\n// else\n// {\n// first = ++ index;\n// count -= step + 1;\n// }\n// }\n\n// return first;\n// }\n\n/* CombSort: sort points in distance to a plane. */\nvoid\nsort (inout vec4 points [ARRAY_SIZE], const in int count, const in Plane3 plane)\n{\n const float shrink = 1.0 / 1.3;\n\n int gap = count;\n bool exchanged = true;\n\n while (exchanged)\n {\n gap = int (float (gap) * shrink);\n\n if (gap <= 1)\n {\n exchanged = false;\n gap = 1;\n }\n\n for (int i = 0, l = count - gap; i < l; ++ i)\n {\n int j = gap + i;\n\n if (plane_distance (plane, points [i] .xyz) > plane_distance (plane, points [j] .xyz))\n {\n vec4 tmp1 = points [i];\n points [i] = points [j];\n points [j] = tmp1;\n\n exchanged = true;\n }\n }\n }\n}\n\n\n// /* CombSort: sort points and normals in distance to a plane. */\n// void\n// sort (inout vec4 points [ARRAY_SIZE], inout vec3 normals [ARRAY_SIZE], const in int count, const in Plane3 plane)\n// {\n// const float shrink = 1.0 / 1.3;\n\n// int gap = count;\n// bool exchanged = true;\n\n// while (exchanged)\n// {\n// gap = int (float (gap) * shrink);\n\n// if (gap <= 1)\n// {\n// exchanged = false;\n// gap = 1;\n// }\n\n// for (int i = 0, l = count - gap; i < l; ++ i)\n// {\n// int j = gap + i;\n\n// if (plane_distance (plane, points [i] .xyz) > plane_distance (plane, points [j] .xyz))\n// {\n// vec4 tmp1 = points [i];\n// points [i] = points [j];\n// points [j] = tmp1;\n\n// vec3 tmp2 = normals [i];\n// normals [i] = normals [j];\n// normals [j] = tmp2;\n\n// exchanged = true;\n// }\n// }\n// }\n// }\n\nint\nmin_index (const in vec4 points [ARRAY_SIZE], const in int count, const in float value, const in Plane3 plane)\n{\n int index = -1;\n float dist = 1000000.0;\n\n for (int i = 0; i < count; ++ i)\n {\n float d = plane_distance (plane, points [i] .xyz);\n\n if (d >= value && d < dist)\n {\n dist = d;\n index = i;\n }\n }\n\n return index;\n}\n";m().set("x_ite/Browser/ParticleSystems/Plane3.glsl",v);const T=v,w="\nbool\nintersects (const in vec3 min, const in vec3 max, const in Line3 line)\n{\n vec3 intersection;\n\n // front\n\n if (intersects (plane3 (max, vec3 (0.0, 0.0, 1.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .xy, max .xy), vec4 (min .xy, intersection .xy))))\n return true;\n }\n\n // back\n\n if (intersects (plane3 (min, vec3 (0.0, 0.0, -1.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .xy, max .xy), vec4 (min .xy, intersection .xy))))\n return true;\n }\n\n // top\n\n if (intersects (plane3 (max, vec3 (0.0, 1.0, 0.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .xz, max .xz), vec4 (min .xz, intersection .xz))))\n return true;\n }\n\n // bottom\n\n if (intersects (plane3 (min, vec3 (0.0, -1.0, 0.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .xz, max .xz), vec4 (min .xz, intersection .xz))))\n return true;\n }\n\n // right\n\n if (intersects (plane3 (max, vec3 (1.0, 0.0, 0.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .yz, max .yz), vec4 (min .yz, intersection .yz))))\n return true;\n }\n\n return false;\n}\n";m().set("x_ite/Browser/ParticleSystems/Box3.glsl",w);const R=w,I="\n#define BVH_NODE 0\n#define BVH_TRIANGLE 1\n#define BVH_STACK_SIZE 32\n\nint bvhNodeIndex = 0;\n\nvoid\nsetBVHIndex (const in int index)\n{\n bvhNodeIndex = index;\n}\n\nint\ngetBVHRoot (const in sampler2D volume, const in int hierarchyIndex, const in int rootIndex)\n{\n return int (texelFetch (volume, rootIndex, 0) .x) + hierarchyIndex;\n}\n\nint\ngetBVHType (const in sampler2D volume)\n{\n return int (texelFetch (volume, bvhNodeIndex, 0) .x);\n}\n\nvec3\ngetBVHMin (const in sampler2D volume)\n{\n return texelFetch (volume, bvhNodeIndex + 1, 0) .xyz;\n}\n\nvec3\ngetBVHMax (const in sampler2D volume)\n{\n return texelFetch (volume, bvhNodeIndex + 2, 0) .xyz;\n}\n\nint\ngetBVHLeft (const in sampler2D volume, const in int hierarchyIndex)\n{\n return int (texelFetch (volume, bvhNodeIndex, 0) .y) + hierarchyIndex;\n}\n\nint\ngetBVHRight (const in sampler2D volume, const in int hierarchyIndex)\n{\n return int (texelFetch (volume, bvhNodeIndex, 0) .z) + hierarchyIndex;\n}\n\nint\ngetBVHTriangle (const in sampler2D volume)\n{\n return int (texelFetch (volume, bvhNodeIndex, 0) .y);\n}\n\n/* Ray triangle intersection test */\n\nint\ngetIntersections (const in sampler2D volume, const in int verticesIndex, const in int hierarchyIndex, const in int rootIndex, const in Line3 line, out vec4 points [ARRAY_SIZE])\n{\n int current = getBVHRoot (volume, hierarchyIndex, rootIndex);\n int count = 0;\n int stackIndex = -1;\n int stack [BVH_STACK_SIZE];\n\n while (stackIndex >= 0 || current >= 0)\n {\n if (current >= 0)\n {\n setBVHIndex (current);\n\n if (getBVHType (volume) == BVH_NODE)\n {\n // Node\n\n if (intersects (getBVHMin (volume), getBVHMax (volume), line))\n {\n stack [++ stackIndex] = current;\n\n current = getBVHLeft (volume, hierarchyIndex);\n }\n else\n {\n current = -1;\n }\n }\n else\n {\n // Triangle\n\n int t = getBVHTriangle (volume);\n int v = verticesIndex + t;\n vec3 r = vec3 (0.0);\n\n vec3 a = texelFetch (volume, v, 0) .xyz;\n vec3 b = texelFetch (volume, v + 1, 0) .xyz;\n vec3 c = texelFetch (volume, v + 2, 0) .xyz;\n\n if (intersects (line, a, b, c, r))\n points [count ++] = vec4 (r .z * a + r .x * b + r .y * c, 1.0);\n\n current = -1;\n }\n }\n else\n {\n setBVHIndex (stack [stackIndex --]);\n\n current = getBVHRight (volume, hierarchyIndex);\n }\n }\n\n return count;\n}\n\nint\ngetIntersections (const in sampler2D volume, const in int verticesIndex, const in int normalsIndex, const in int hierarchyIndex, const in int rootIndex, const in Line3 line, out vec4 points [ARRAY_SIZE], out vec3 normals [ARRAY_SIZE])\n{\n int current = getBVHRoot (volume, hierarchyIndex, rootIndex);\n int count = 0;\n int stackIndex = -1;\n int stack [BVH_STACK_SIZE];\n\n while (stackIndex >= 0 || current >= 0)\n {\n if (current >= 0)\n {\n setBVHIndex (current);\n\n if (getBVHType (volume) == BVH_NODE)\n {\n // Node\n\n if (intersects (getBVHMin (volume), getBVHMax (volume), line))\n {\n stack [++ stackIndex] = current;\n\n current = getBVHLeft (volume, hierarchyIndex);\n }\n else\n {\n current = -1;\n }\n }\n else\n {\n // Triangle\n\n int t = getBVHTriangle (volume);\n int v = verticesIndex + t;\n vec3 r = vec3 (0.0);\n\n vec3 a = texelFetch (volume, v, 0) .xyz;\n vec3 b = texelFetch (volume, v + 1, 0) .xyz;\n vec3 c = texelFetch (volume, v + 2, 0) .xyz;\n\n if (intersects (line, a, b, c, r))\n {\n points [count] = vec4 (r .z * a + r .x * b + r .y * c, 1.0);\n\n int n = normalsIndex + t;\n\n vec3 n0 = texelFetch (volume, n, 0) .xyz;\n vec3 n1 = texelFetch (volume, n + 1, 0) .xyz;\n vec3 n2 = texelFetch (volume, n + 2, 0) .xyz;\n\n normals [count] = save_normalize (r .z * n0 + r .x * n1 + r .y * n2);\n\n ++ count;\n }\n\n current = -1;\n }\n }\n else\n {\n setBVHIndex (stack [stackIndex --]);\n\n current = getBVHRight (volume, hierarchyIndex);\n }\n }\n\n return count;\n}\n";m().set("x_ite/Browser/ParticleSystems/BVH.glsl",I);const b=I;function F(e){u().call(this,e),this.addType(_().X3DParticleEmitterNode),this._speed.setUnit("speed"),this._mass.setUnit("mass"),this._surfaceArea.setUnit("area"),this.samplers=[],this.uniforms={},this.functions=[],this.program=null,this.addSampler("forces"),this.addSampler("boundedVolume"),this.addSampler("colorRamp"),this.addSampler("texCoordRamp"),this.addUniform("speed","uniform float speed;"),this.addUniform("variation","uniform float variation;"),this.addFunction(y),this.addFunction(T),this.addFunction(R),this.addFunction(b)}F.prototype=Object.assign(Object.create(u().prototype),{constructor:F,initialize:function(){u().prototype.initialize.call(this);const e=this.getBrowser().getContext();e.getVersion()<2||(this.program=this.createProgram(),this.transformFeedback=e.createTransformFeedback(),this._on.addInterest("set_on__",this),this._speed.addInterest("set_speed__",this),this._variation.addInterest("set_variation__",this),this._mass.addInterest("set_mass__",this),this.set_on__(),this.set_speed__(),this.set_variation__(),this.set_mass__())},isExplosive:function(){return!1},getMass:function(){return this.mass},set_on__:function(){this.on=this._on.getValue()},set_speed__:function(){this.setUniform("uniform1f","speed",this._speed.getValue())},set_variation__:function(){this.setUniform("uniform1f","variation",this._variation.getValue())},set_mass__:function(){this.mass=this._mass.getValue()},getRandomValue:function(e,t){return Math.random()*(t-e)+e},getRandomNormal:function(e){const t=this.getRandomValue(-1,1)*Math.PI,n=this.getRandomValue(-1,1),i=Math.acos(n),o=Math.sin(i);return e.set(Math.sin(t)*o,Math.cos(t)*o,n)},animate:function(e,t){const n=this.getBrowser().getContext(),i=e.inputParticles,o=e.particleStride,r=e.particleOffsets,s=this.program;if(n.useProgram(s),n.uniform1i(s.randomSeed,4294967295*Math.random()),n.uniform1i(s.geometryType,e.geometryType),n.uniform1i(s.createParticles,e.createParticles&&this.on),n.uniform1f(s.particleLifetime,e.particleLifetime),n.uniform1f(s.lifetimeVariation,e.lifetimeVariation),n.uniform1f(s.deltaTime,t),n.uniform2f(s.particleSize,e._particleSize.x,e._particleSize.y),n.uniform1i(s.numForces,e.numForces),e.numForces&&(n.activeTexture(n.TEXTURE0+s.forcesTextureUnit),n.bindTexture(n.TEXTURE_2D,e.forcesTexture)),e.boundedHierarchyRoot<0?n.uniform1i(s.boundedHierarchyRoot,-1):(n.uniform1i(s.boundedVerticesIndex,e.boundedVerticesIndex),n.uniform1i(s.boundedNormalsIndex,e.boundedNormalsIndex),n.uniform1i(s.boundedHierarchyIndex,e.boundedHierarchyIndex),n.uniform1i(s.boundedHierarchyRoot,e.boundedHierarchyRoot),n.activeTexture(n.TEXTURE0+s.boundedVolumeTextureUnit),n.bindTexture(n.TEXTURE_2D,e.boundedTexture)),n.uniform1i(s.numColors,e.numColors),e.numColors&&(n.activeTexture(n.TEXTURE0+s.colorRampTextureUnit),n.bindTexture(n.TEXTURE_2D,e.colorRampTexture)),n.uniform1i(s.numTexCoords,e.numTexCoords),e.numTexCoords&&(n.uniform1i(s.texCoordCount,e.texCoordCount),n.activeTexture(n.TEXTURE0+s.texCoordRampTextureUnit),n.bindTexture(n.TEXTURE_2D,e.texCoordRampTexture)),this.activateTextures(n,s),i.vertexArrayObject.enable(s)){for(const[e,t]of s.inputs)n.bindBuffer(n.ARRAY_BUFFER,i),n.enableVertexAttribArray(t),n.vertexAttribPointer(t,4,n.FLOAT,!1,o,r[e]);n.bindBuffer(n.ARRAY_BUFFER,null)}n.bindTransformFeedback(n.TRANSFORM_FEEDBACK,this.transformFeedback),n.bindBufferBase(n.TRANSFORM_FEEDBACK_BUFFER,0,e.outputParticles),n.enable(n.RASTERIZER_DISCARD),n.beginTransformFeedback(n.POINTS),n.drawArrays(n.POINTS,0,e.numParticles),n.endTransformFeedback(),n.disable(n.RASTERIZER_DISCARD),n.bindTransformFeedback(n.TRANSFORM_FEEDBACK,null)},addSampler:function(e){this.samplers.push(e)},addUniform:function(e,t){this.uniforms[e]=t},setUniform:function(e,t,n,i,o){const r=this.getBrowser().getContext(),s=this.program;r.useProgram(s),r[e](s[t],n,i,o)},addFunction:function(e){this.functions.push(e)},createProgram:function(){const e=this.getBrowser(),t=e.getContext(),n=`#version 300 es\n\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n\n uniform int randomSeed;\n uniform int geometryType;\n uniform bool createParticles;\n uniform float particleLifetime;\n uniform float lifetimeVariation;\n uniform float deltaTime;\n uniform vec2 particleSize;\n\n uniform int numForces;\n uniform sampler2D forces;\n\n uniform int boundedVerticesIndex;\n uniform int boundedNormalsIndex;\n uniform int boundedHierarchyIndex;\n uniform int boundedHierarchyRoot;\n uniform sampler2D boundedVolume;\n\n uniform int numColors;\n uniform sampler2D colorRamp;\n\n uniform int texCoordCount;\n uniform int numTexCoords;\n uniform sampler2D texCoordRamp;\n\n ${Object.values(this.uniforms).join("\n")}\n\n in vec4 input0; // (life, lifetime, elapsedTime, texCoordIndex0)\n in vec4 input2; // (velocity, 0.0)\n in vec4 input6; // position\n\n out vec4 output0; // (life, lifetime, elapsedTime, texCoordIndex0)\n out vec4 output1; // (color)\n out vec4 output2; // (velocity, 0.0)\n\n out vec4 output3; // scale rotation matrix\n out vec4 output4; // scale rotation matrix\n out vec4 output5; // scale rotation matrix\n out vec4 output6; // position\n\n // Constants\n\n ${Object.entries(p).map((([e,t])=>`#define ${e} ${t}`)).join("\n")}\n\n const int ARRAY_SIZE = 32;\n const float M_PI = 3.14159265359;\n\n uniform float NaN;\n\n // Texture\n\n vec4\n texelFetch (const in sampler2D sampler, const in int index, const in int lod)\n {\n int x = textureSize (sampler, lod) .x;\n ivec2 p = ivec2 (index % x, index / x);\n vec4 t = texelFetch (sampler, p, lod);\n\n return t;\n }\n\n // Math\n\n // Save normalize, that will not divide by zero.\n vec3\n save_normalize (const in vec3 vector)\n {\n float l = length (vector);\n\n if (l == 0.0)\n return vec3 (0.0);\n\n return vector / l;\n }\n\n // Quaternion\n\n vec4\n Quaternion (const in vec3 fromVector, const in vec3 toVector)\n {\n vec3 from = save_normalize (fromVector);\n vec3 to = save_normalize (toVector);\n\n float cos_angle = dot (from, to);\n vec3 cross_vec = cross (from, to);\n float cross_len = length (cross_vec);\n\n if (cross_len == 0.0)\n {\n if (cos_angle > 0.0)\n {\n return vec4 (0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n vec3 t = cross (from, vec3 (1.0, 0.0, 0.0));\n\n if (dot (t, t) == 0.0)\n t = cross (from, vec3 (0.0, 1.0, 0.0));\n\n t = save_normalize (t);\n\n return vec4 (t, 0.0);\n }\n }\n else\n {\n float s = sqrt (abs (1.0 - cos_angle) * 0.5);\n\n cross_vec = save_normalize (cross_vec);\n\n return vec4 (cross_vec * s, sqrt (abs (1.0 + cos_angle) * 0.5));\n }\n }\n\n vec3\n multVecQuat (const in vec3 v, const in vec4 q)\n {\n float a = q .w * q .w - q .x * q .x - q .y * q .y - q .z * q .z;\n float b = 2.0 * (v .x * q .x + v .y * q .y + v .z * q .z);\n float c = 2.0 * q .w;\n vec3 r = a * v .xyz + b * q .xyz + c * (q .yzx * v .zxy - q .zxy * v .yzx);\n\n return r;\n }\n\n mat3\n Matrix3 (const in vec4 quaternion)\n {\n float x = quaternion .x;\n float y = quaternion .y;\n float z = quaternion .z;\n float w = quaternion .w;\n float A = y * y;\n float B = z * z;\n float C = x * y;\n float D = z * w;\n float E = z * x;\n float F = y * w;\n float G = x * x;\n float H = y * z;\n float I = x * w;\n\n return mat3 (1.0 - 2.0 * (A + B),\n 2.0 * (C + D),\n 2.0 * (E - F),\n 2.0 * (C - D),\n 1.0 - 2.0 * (B + G),\n 2.0 * (H + I),\n 2.0 * (E + F),\n 2.0 * (H - I),\n 1.0 - 2.0 * (A + G));\n }\n\n /* Random number generation */\n\n uint seed = 1u;\n\n void\n srand (const in int value)\n {\n seed = uint (value);\n }\n\n // Return a uniform distributed random floating point number in the interval [0, 1].\n float\n random ()\n {\n seed = seed * 1103515245u + 12345u;\n\n return float (seed) / 4294967295.0;\n }\n\n float\n getRandomValue (const in float min, const in float max)\n {\n return min + random () * (max - min);\n }\n\n float\n getRandomLifetime ()\n {\n float v = particleLifetime * lifetimeVariation;\n float min_ = max (0.0, particleLifetime - v);\n float max_ = particleLifetime + v;\n\n return getRandomValue (min_, max_);\n }\n\n float\n getRandomSpeed ()\n {\n float v = speed * variation;\n float min_ = max (0.0, speed - v);\n float max_ = speed + v;\n\n return getRandomValue (min_, max_);\n }\n\n vec3\n getRandomNormal ()\n {\n float theta = getRandomValue (-M_PI, M_PI);\n float cphi = getRandomValue (-1.0, 1.0);\n float r = sqrt (1.0 - cphi * cphi); // sin (acos (cphi));\n\n return vec3 (sin (theta) * r, cos (theta) * r, cphi);\n }\n\n vec3\n getRandomNormalWithAngle (const in float angle)\n {\n float theta = getRandomValue (-M_PI, M_PI);\n float cphi = getRandomValue (cos (angle), 1.0);\n float r = sqrt (1.0 - cphi * cphi); // sin (acos (cphi));\n\n return vec3 (sin (theta) * r, cos (theta) * r, cphi);\n }\n\n vec3\n getRandomNormalWithDirectionAndAngle (const in vec3 direction, const in float angle)\n {\n vec4 rotation = Quaternion (vec3 (0.0, 0.0, 1.0), direction);\n vec3 normal = getRandomNormalWithAngle (angle);\n\n return multVecQuat (normal, rotation);\n }\n\n vec3\n getRandomSurfaceNormal (const in vec3 direction)\n {\n float theta = getRandomValue (-M_PI, M_PI);\n float cphi = pow (random (), 1.0 / 3.0);\n float r = sqrt (1.0 - cphi * cphi); // sin (acos (cphi));\n vec3 normal = vec3 (sin (theta) * r, cos (theta) * r, cphi);\n vec4 rotation = Quaternion (vec3 (0.0, 0.0, 1.0), direction);\n\n return multVecQuat (normal, rotation);\n }\n\n vec3\n getRandomSphericalVelocity ()\n {\n vec3 normal = getRandomNormal ();\n float speed = getRandomSpeed ();\n\n return normal * speed;\n }\n\n // Algorithms\n\n int\n upperBound (const in sampler2D sampler, in int count, const in float value)\n {\n int first = 0;\n int step = 0;\n\n while (count > 0)\n {\n int index = first;\n\n step = count >> 1;\n\n index += step;\n\n if (value < texelFetch (sampler, index, 0) .x)\n {\n count = step;\n }\n else\n {\n first = ++ index;\n count -= step + 1;\n }\n }\n\n return first;\n }\n\n void\n interpolate (const in sampler2D sampler, const in int count, const in float fraction, out int index0, out int index1, out float weight)\n {\n // Determine index0, index1 and weight.\n\n if (count == 1 || fraction <= texelFetch (sampler, 0, 0) .x)\n {\n index0 = 0;\n index1 = 0;\n weight = 0.0;\n }\n else if (fraction >= texelFetch (sampler, count - 1, 0) .x)\n {\n index0 = count - 2;\n index1 = count - 1;\n weight = 1.0;\n }\n else\n {\n int index = upperBound (sampler, count, fraction);\n\n if (index < count)\n {\n index1 = index;\n index0 = index - 1;\n\n float key0 = texelFetch (sampler, index0, 0) .x;\n float key1 = texelFetch (sampler, index1, 0) .x;\n\n weight = clamp ((fraction - key0) / (key1 - key0), 0.0, 1.0);\n }\n else\n {\n index0 = 0;\n index1 = 0;\n weight = 0.0;\n }\n }\n }\n\n void\n interpolate (const in sampler2D sampler, const in int count, const in float fraction, out int index0)\n {\n // Determine index0.\n\n if (count == 1 || fraction <= texelFetch (sampler, 0, 0) .x)\n {\n index0 = 0;\n }\n else if (fraction >= texelFetch (sampler, count - 1, 0) .x)\n {\n index0 = count - 2;\n }\n else\n {\n int index = upperBound (sampler, count, fraction);\n\n if (index < count)\n index0 = index - 1;\n else\n index0 = 0;\n }\n }\n\n vec3\n getRandomBarycentricCoord ()\n {\n // Random barycentric coordinates.\n\n float u = random ();\n float v = random ();\n\n if (u + v > 1.0)\n {\n u = 1.0 - u;\n v = 1.0 - v;\n }\n\n float t = 1.0 - u - v;\n\n return vec3 (t, u, v);\n }\n\n void\n getRandomPointOnSurface (const in sampler2D surface, const in int verticesIndex, const in int normalsIndex, out vec4 position, out vec3 normal)\n {\n // Determine index0, index1 and weight.\n\n float lastAreaSoFar = texelFetch (surface, verticesIndex - 1, 0) .x;\n float fraction = random () * lastAreaSoFar;\n\n int index0;\n int index1;\n int index2;\n float weight;\n\n interpolate (surface, verticesIndex, fraction, index0, index1, weight);\n\n // Interpolate and return position.\n\n index0 *= 3;\n index1 = index0 + 1;\n index2 = index0 + 2;\n\n vec4 vertex0 = texelFetch (surface, verticesIndex + index0, 0);\n vec4 vertex1 = texelFetch (surface, verticesIndex + index1, 0);\n vec4 vertex2 = texelFetch (surface, verticesIndex + index2, 0);\n\n vec3 normal0 = texelFetch (surface, normalsIndex + index0, 0) .xyz;\n vec3 normal1 = texelFetch (surface, normalsIndex + index1, 0) .xyz;\n vec3 normal2 = texelFetch (surface, normalsIndex + index2, 0) .xyz;\n\n // Random barycentric coordinates.\n\n vec3 r = getRandomBarycentricCoord ();\n\n // Calculate position and direction.\n\n position = r .z * vertex0 + r .x * vertex1 + r .y * vertex2;\n normal = save_normalize (r .z * normal0 + r .x * normal1 + r .y * normal2);\n }\n\n // Functions\n\n ${this.functions.join("\n")}\n\n // Current values\n\n vec4\n getColor (const in float lifetime, const in float elapsedTime)\n {\n if (numColors > 0)\n {\n // Determine index0, index1 and weight.\n\n float fraction = elapsedTime / lifetime;\n\n int index0;\n int index1;\n float weight;\n\n interpolate (colorRamp, numColors, fraction, index0, index1, weight);\n\n // Interpolate and return color.\n\n vec4 color0 = texelFetch (colorRamp, numColors + index0, 0);\n vec4 color1 = texelFetch (colorRamp, numColors + index1, 0);\n\n return mix (color0, color1, weight);\n }\n else\n {\n return vec4 (1.0);\n }\n }\n\n void\n bounce (const in vec4 fromPosition, inout vec4 toPosition, inout vec3 velocity)\n {\n if (boundedHierarchyRoot < 0)\n return;\n\n Line3 line = Line3 (fromPosition .xyz, save_normalize (velocity));\n\n vec4 points [ARRAY_SIZE];\n vec3 normals [ARRAY_SIZE];\n\n int numIntersections = getIntersections (boundedVolume, boundedVerticesIndex, boundedNormalsIndex, boundedHierarchyIndex, boundedHierarchyRoot, line, points, normals);\n\n if (numIntersections == 0)\n return;\n\n Plane3 plane1 = plane3 (line .point, line .direction);\n\n int index = min_index (points, numIntersections, 0.0, plane1);\n\n if (index == -1)\n return;\n\n Plane3 plane2 = plane3 (points [index] .xyz, normals [index]);\n\n if (sign (plane_distance (plane2, fromPosition .xyz)) == sign (plane_distance (plane2, toPosition .xyz)))\n return;\n\n velocity = reflect (velocity, normals [index]);\n toPosition = vec4 (points [index] .xyz + reflect (points [index] .xyz - fromPosition .xyz, normals [index]), 1.0);\n }\n\n int\n getTexCoordIndex0 (const in float lifetime, const in float elapsedTime)\n {\n if (numTexCoords == 0)\n {\n return -1;\n }\n else\n {\n float fraction = elapsedTime / lifetime;\n int index0 = 0;\n\n interpolate (texCoordRamp, numTexCoords, fraction, index0);\n\n return numTexCoords + index0 * texCoordCount;\n }\n }\n\n void\n main ()\n {\n int life = int (input0 [0]);\n float lifetime = input0 [1];\n float elapsedTime = input0 [2] + deltaTime;\n\n srand ((gl_VertexID + randomSeed) * randomSeed);\n\n if (elapsedTime > lifetime)\n {\n // Create new particle or hide particle.\n\n lifetime = getRandomLifetime ();\n elapsedTime = 0.0;\n\n output0 = vec4 (max (life + 1, 1), lifetime, elapsedTime, getTexCoordIndex0 (lifetime, elapsedTime));\n\n if (createParticles)\n {\n output1 = getColor (lifetime, elapsedTime);\n output2 = vec4 (getRandomVelocity (), 0.0);\n output6 = getRandomPosition ();\n }\n else\n {\n output1 = vec4 (0.0);\n output2 = vec4 (0.0);\n output6 = vec4 (NaN);\n }\n }\n else\n {\n // Animate particle.\n\n vec3 velocity = input2 .xyz;\n vec4 position = input6;\n\n for (int i = 0; i < numForces; ++ i)\n {\n vec4 force = texelFetch (forces, i, 0);\n float turbulence = force .w;\n vec3 normal = getRandomNormalWithDirectionAndAngle (force .xyz, turbulence);\n float speed = length (force .xyz);\n\n velocity += normal * speed;\n }\n\n position .xyz += velocity * deltaTime;\n\n bounce (input6, position, velocity);\n\n output0 = vec4 (life, lifetime, elapsedTime, getTexCoordIndex0 (lifetime, elapsedTime));\n output1 = getColor (lifetime, elapsedTime);\n output2 = vec4 (velocity, 0.0);\n output6 = position;\n }\n\n switch (geometryType)\n {\n case POINT:\n case SPRITE:\n case GEOMETRY:\n {\n output3 = vec4 (1.0, 0.0, 0.0, 0.0);\n output4 = vec4 (0.0, 1.0, 0.0, 0.0);\n output5 = vec4 (0.0, 0.0, 1.0, 0.0);\n break;\n }\n case LINE:\n {\n mat3 r = Matrix3 (Quaternion (vec3 (0.0, 0.0, 1.0), output2 .xyz));\n mat3 s = mat3 (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, particleSize .y);\n mat3 m = r * s;\n\n output3 = vec4 (m [0], 0.0);\n output4 = vec4 (m [1], 0.0);\n output5 = vec4 (m [2], 0.0);\n break;\n }\n default: // QUAD, TRIANGLE\n {\n output3 = vec4 (particleSize .x, 0.0, 0.0, 0.0);\n output4 = vec4 (0.0, particleSize .y, 0.0, 0.0);\n output5 = vec4 (0.0, 0.0, 1.0, 0.0);\n break;\n }\n }\n }\n `,i=t.createShader(t.VERTEX_SHADER);t.shaderSource(i,n),t.compileShader(i);const o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,"#version 300 es\n\n precision highp float;\n\n void\n main () { }\n "),t.compileShader(o);const r=t.createProgram();t.attachShader(r,i),t.attachShader(r,o),t.transformFeedbackVaryings(r,Array.from({length:7},((e,t)=>"output"+t)),t.INTERLEAVED_ATTRIBS),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||console.error("Couldn't initialize particle shader: "+t.getProgramInfoLog(r)),r.inputs=[[0,t.getAttribLocation(r,"input0")],[2,t.getAttribLocation(r,"input2")],[6,t.getAttribLocation(r,"input6")]],r.randomSeed=t.getUniformLocation(r,"randomSeed"),r.geometryType=t.getUniformLocation(r,"geometryType"),r.createParticles=t.getUniformLocation(r,"createParticles"),r.particleLifetime=t.getUniformLocation(r,"particleLifetime"),r.lifetimeVariation=t.getUniformLocation(r,"lifetimeVariation"),r.deltaTime=t.getUniformLocation(r,"deltaTime"),r.particleSize=t.getUniformLocation(r,"particleSize"),r.numForces=t.getUniformLocation(r,"numForces"),r.forces=t.getUniformLocation(r,"forces"),r.boundedVerticesIndex=t.getUniformLocation(r,"boundedVerticesIndex"),r.boundedNormalsIndex=t.getUniformLocation(r,"boundedNormalsIndex"),r.boundedHierarchyIndex=t.getUniformLocation(r,"boundedHierarchyIndex"),r.boundedHierarchyRoot=t.getUniformLocation(r,"boundedHierarchyRoot"),r.boundedVolume=t.getUniformLocation(r,"boundedVolume"),r.numColors=t.getUniformLocation(r,"numColors"),r.colorRamp=t.getUniformLocation(r,"colorRamp"),r.texCoordCount=t.getUniformLocation(r,"texCoordCount"),r.numTexCoords=t.getUniformLocation(r,"numTexCoords"),r.texCoordRamp=t.getUniformLocation(r,"texCoordRamp");for(const e of Object.keys(this.uniforms))r[e]=t.getUniformLocation(r,e);r.NaN=t.getUniformLocation(r,"NaN"),t.useProgram(r);for(const n of this.samplers){const i=t.getUniformLocation(r,n);t.uniform1i(i,r[n+"TextureUnit"]=e.getTexture2DUnit())}return t.uniform1f(r.NaN,NaN),e.resetTextureUnits(),r},activateTextures:function(){},createTexture:function(){const e=this.getBrowser().getContext(),t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,1,1,0,e.RGBA,e.FLOAT,new Float32Array(4)),t},getTexture2DUnit:function(e,t,n){const i=t[n];return void 0===i?t[n]=e.getTexture2DUnit():i}});const E=F;m().set("x_ite/Components/ParticleSystems/X3DParticleEmitterNode",E);const S=E,A=window[Symbol.for("X_ITE.X3D-8.7.9")].require("standard/Math/Numbers/Vector3");var P=e.n(A);function N(e){S.call(this,e),this.addType(_().PointEmitter),this._position.setUnit("length"),this.addUniform("position","uniform vec3 position;"),this.addUniform("direction","uniform vec3 direction;"),this.addFunction("vec3 getRandomVelocity ()\n {\n if (direction == vec3 (0.0))\n return getRandomSphericalVelocity ();\n\n else\n return direction * getRandomSpeed ();\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n return vec4 (position, 1.0);\n }")}N.prototype=Object.assign(Object.create(S.prototype),{constructor:N,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"position",new(o().SFVec3f)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)(0,1,0)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat))]),getTypeName:function(){return"PointEmitter"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"emitter"},getSpecificationRange:function(){return["3.2","Infinity"]},initialize:function(){S.prototype.initialize.call(this),this.getBrowser().getContext().getVersion()<2||(this._position.addInterest("set_position__",this),this._direction.addInterest("set_direction__",this),this.set_position__(),this.set_direction__())},set_position__:function(){const e=this._position.getValue();this.setUniform("uniform3f","position",e.x,e.y,e.z)},set_direction__:function(){const e=new(P())(0,0,0);return function(){e.assign(this._direction.getValue()).normalize(),this.setUniform("uniform3f","direction",e.x,e.y,e.z)}}()});const C=N;m().set("x_ite/Components/ParticleSystems/PointEmitter",C);const D=C,B=Symbol();Symbol();function V(){}V.prototype={getDefaultEmitter:function(){return this[B]=new D(this.getPrivateScene()),this[B].setPrivate(!0),this[B].setup(),this.getDefaultEmitter=function(){return this[B]},Object.defineProperty(this,"getDefaultEmitter",{enumerable:!1}),this[B]}};const O=V;m().set("x_ite/Browser/ParticleSystems/X3DParticleSystemsContext",O);const U=O;function z(e){u().call(this,e),this.addType(_().X3DParticlePhysicsModelNode)}z.prototype=Object.assign(Object.create(u().prototype),{constructor:z,addForce:function(){}});const M=z;m().set("x_ite/Components/ParticleSystems/X3DParticlePhysicsModelNode",M);const X=M,L=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Base/X3DCast");var q=e.n(L);function k(e){X.call(this,e),this.addType(_().BoundedPhysicsModel)}k.prototype=Object.assign(Object.create(X.prototype),{constructor:k,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"enabled",new(o().SFBool)(!0)),new(s())(_().inputOutput,"geometry",new(o().SFNode))]),getTypeName:function(){return"BoundedPhysicsModel"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"physics"},getSpecificationRange:function(){return["3.2","Infinity"]},initialize:function(){X.prototype.initialize.call(this),this._geometry.addInterest("set_geometry__",this),this.set_geometry__()},set_geometry__:function(){this.geometryNode&&this.geometryNode._rebuild.removeInterest("addNodeEvent",this),this.geometryNode=q()(_().X3DGeometryNode,this._geometry),this.geometryNode&&this.geometryNode._rebuild.addInterest("addNodeEvent",this)},addGeometry:function(e,t){if(this.geometryNode&&this._enabled.getValue()){const n=this.geometryNode.getNormals().getValue(),i=this.geometryNode.getVertices().getValue();for(const t of n)e.push(t);for(const e of i)t.push(e)}}});const G=k;m().set("x_ite/Components/ParticleSystems/BoundedPhysicsModel",G);const H=G;function Y(e){S.call(this,e),this.addType(_().ConeEmitter),this._position.setUnit("length"),this._angle.setUnit("angle"),this.addUniform("position","uniform vec3 position;"),this.addUniform("direction","uniform vec3 direction;"),this.addUniform("angle","uniform float angle;"),this.addFunction("vec3 getRandomVelocity ()\n {\n if (direction == vec3 (0.0))\n {\n return getRandomSphericalVelocity ();\n }\n else\n {\n vec3 normal = getRandomNormalWithDirectionAndAngle (direction, angle);\n float speed = getRandomSpeed ();\n\n return normal * speed;\n }\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n return vec4 (position, 1.0);\n }")}Y.prototype=Object.assign(Object.create(S.prototype),{constructor:Y,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"position",new(o().SFVec3f)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)(0,1,0)),new(s())(_().inputOutput,"angle",new(o().SFFloat)(.7854)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat))]),getTypeName:function(){return"ConeEmitter"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"emitter"},getSpecificationRange:function(){return["3.2","Infinity"]},initialize:function(){S.prototype.initialize.call(this),this.getBrowser().getContext().getVersion()<2||(this._position.addInterest("set_position__",this),this._direction.addInterest("set_direction__",this),this._angle.addInterest("set_angle__",this),this.set_position__(),this.set_direction__(),this.set_angle__())},set_position__:function(){const e=this._position.getValue();this.setUniform("uniform3f","position",e.x,e.y,e.z)},set_direction__:function(){const e=this._direction.getValue();this.setUniform("uniform3f","direction",e.x,e.y,e.z)},set_angle__:function(){this.setUniform("uniform1f","angle",this._angle.getValue())}});const j=Y;m().set("x_ite/Components/ParticleSystems/ConeEmitter",j);const W=j;function K(e){S.call(this,e),this.addType(_().ExplosionEmitter),this._position.setUnit("length"),this.addUniform("position","uniform vec3 position;"),this.addFunction("vec3 getRandomVelocity ()\n {\n return getRandomSphericalVelocity ();\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n return vec4 (position, 1.0);\n }")}K.prototype=Object.assign(Object.create(S.prototype),{constructor:K,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"position",new(o().SFVec3f)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat))]),getTypeName:function(){return"ExplosionEmitter"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"emitter"},getSpecificationRange:function(){return["3.2","Infinity"]},initialize:function(){S.prototype.initialize.call(this),this.getBrowser().getContext().getVersion()<2||(this._position.addInterest("set_position__",this),this.set_position__())},isExplosive:function(){return!0},set_position__:function(){const e=this._position.getValue();this.setUniform("uniform3f","position",e.x,e.y,e.z)}});const Z=K;m().set("x_ite/Components/ParticleSystems/ExplosionEmitter",Z);const Q=Z;function $(e){X.call(this,e),this.addType(_().ForcePhysicsModel),this._force.setUnit("force")}$.prototype=Object.assign(Object.create(X.prototype),{constructor:$,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"enabled",new(o().SFBool)(!0)),new(s())(_().inputOutput,"force",new(o().SFVec3f)(0,-9.8,0))]),getTypeName:function(){return"ForcePhysicsModel"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"physics"},getSpecificationRange:function(){return["3.2","Infinity"]},addForce:function(){const e=new(P())(0,0,0);return function(t,n,i,o){return!!this._enabled.getValue()&&(o.set(e.assign(this._force.getValue()).multiply(i),4*t),o[4*t+3]=0,!0)}}()});const J=$;m().set("x_ite/Components/ParticleSystems/ForcePhysicsModel",J);const ee=J,te=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Components/Shape/X3DShapeNode");var ne=e.n(te);const ie=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Browser/Rendering/GeometryContext");var oe=e.n(ie);const re=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Rendering/VertexArray");var se=e.n(re);const ae=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Rendering/TraverseType");var ce=e.n(ae);const le=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Browser/Shape/AlphaMode");var ue=e.n(le);const de=window[Symbol.for("X_ITE.X3D-8.7.9")].require("standard/Math/Numbers/Matrix4");var me=e.n(de);const he=window[Symbol.for("X_ITE.X3D-8.7.9")].require("standard/Math/Numbers/Matrix3");var fe=e.n(he);const pe=window[Symbol.for("X_ITE.X3D-8.7.9")].require("standard/Math/Geometry/Plane3");var xe=e.n(pe);function _e(e,t){this.array=e,t&&(this.compare=t)}_e.prototype={compare:function(e,t){return e<t},sort:function(e,t){t-e>1&&this.quicksort(e,t-1)},quicksort:function(e,t){let n=e,i=t;const{array:o,compare:r}=this,s=o[e+t>>>1];for(;;){for(;r(o[n],s);)++n;for(;r(s,o[i]);)--i;if(!(n<i)){n===i&&(++n,--i);break}{const e=o[n];o[n]=o[i],o[i]=e,n++,i--}}e<i&&this.quicksort(e,i),n<t&&this.quicksort(n,t)}};const ge=_e;m().set("standard/Math/Algorithms/QuickSort",ge);const ye=ge,ve=new(P())(0,0,0),Te=new(P())(0,0,0),we=new(P())(0,0,0),Re={u:0,v:0,t:0},Ie=[new(P())(0,0,1),new(P())(0,0,-1),new(P())(0,1,0),new(P())(0,-1,0),new(P())(1,0,0)];function be(e,t){this.vertices=e.vertices,this.normals=e.normals,this.triangle=t,this.i4=12*t,this.i3=9*t}function Fe(e,t,n,i){this.min=new(P())(0,0,0),this.max=new(P())(0,0,0),this.planes=[],this.intersection=new(P())(0,0,0);const o=e.vertices,r=this.min,s=this.max,a=n+i;let c=12*t[n];r.set(o[c],o[c+1],o[c+2]),s.assign(r);for(let e=n;e<a;++e)c=12*t[e],ve.set(o[c],o[c+1],o[c+2]),Te.set(o[c+4],o[c+5],o[c+6]),we.set(o[c+8],o[c+9],o[c+10]),r.min(ve,Te,we),s.max(ve,Te,we);for(let e=0;e<5;++e)this.planes[e]=new(xe())(e%2?r:s,Ie[e]);if(i>2){e.sorter.compare.axis=this.getLongestAxis(r,s),e.sorter.sort(n,a);var l=i>>>1}else l=1;const u=i-l;this.left=l>1?new Fe(e,t,n,l):new be(e,t[n]),this.right=u>1?new Fe(e,t,n+l,u):new be(e,t[n+l])}function Ee(e,t){const n=e.length/12;switch(this.vertices=e,this.normals=t,n){case 0:this.root=null;break;case 1:this.root=new be(this,0);break;default:{const t=[];for(let e=0;e<n;++e)t.push(e);this.sorter=new ye(t,function(e,t){return function(n,i){return Math.min(e[n+t],e[n+4+t],e[n+8+t])<Math.min(e[i+t],e[i+4+t],e[i+8+t])}}(e,0)),this.root=new Fe(this,t,0,n);break}}}be.prototype={intersectsLine:function(e,t,n){const i=this.vertices,o=this.normals,r=this.i4,s=this.i3;if(ve.x=i[r],ve.y=i[r+1],ve.z=i[r+2],Te.x=i[r+4],Te.y=i[r+5],Te.z=i[r+6],we.x=i[r+8],we.y=i[r+9],we.z=i[r+10],e.intersectsTriangle(ve,Te,we,Re)){const e=Re.u,a=Re.v,c=1-e-a,l=t.size++;l>=t.length&&t.push(new(P())(0,0,0)),t[l].set(c*i[r]+e*i[r+4]+a*i[r+8],c*i[r+1]+e*i[r+5]+a*i[r+9],c*i[r+2]+e*i[r+6]+a*i[r+10]),n&&(l>=n.length&&n.push(new(P())(0,0,0)),n[l].set(c*o[s]+e*o[s+3]+a*o[s+6],c*o[s+1]+e*o[s+4]+a*o[s+7],c*o[s+2]+e*o[s+5]+a*o[s+8]))}},toArray:function(e){const t=e.length/4;return e.push(1,3*this.triangle,0,0),t}},Fe.prototype={intersectsLine:function(e,t,n){this.intersectsBBox(e)&&(this.left.intersectsLine(e,t,n),this.right.intersectsLine(e,t,n))},intersectsBBox:function(e){const t=this.planes,n=this.min,i=this.max,o=n.x,r=i.x,s=n.y,a=i.y,c=n.z,l=i.z,u=this.intersection;return!!(t[0].intersectsLine(e,u)&&u.x>=o&&u.x<=r&&u.y>=s&&u.y<=a)||(!!(t[1].intersectsLine(e,u)&&u.x>=o&&u.x<=r&&u.y>=s&&u.y<=a)||(!!(t[2].intersectsLine(e,u)&&u.x>=o&&u.x<=r&&u.z>=c&&u.z<=l)||(!!(t[3].intersectsLine(e,u)&&u.x>=o&&u.x<=r&&u.z>=c&&u.z<=l)||!!(t[4].intersectsLine(e,u)&&u.y>=s&&u.y<=a&&u.z>=c&&u.z<=l))))},getLongestAxis:function(e,t){const n=t.x-e.x,i=t.y-e.y,o=t.z-e.z;return n<i?i<o?2:1:n<o?2:0},toArray:function(e){const t=this.left.toArray(e),n=this.right.toArray(e),i=this.min,o=this.max,r=e.length/4;return e.push(0,t,n,0,i.x,i.y,i.z,0,o.x,o.y,o.z,0),r}},Ee.prototype={constructor:Ee,intersectsLine:function(e,t,n){return t.size=0,this.root?(this.root.intersectsLine(e,t,n),t.size):0},toArray:function(e){if(this.root){const t=this.root.toArray(e);e.push(t,0,0,0)}return e}};const Se=Ee;m().set("standard/Math/Utility/BVH",Se);const Ae=Se,Pe=new Float32Array([0,0,0,1]),Ne=new Float32Array([0,0,0,1,1,0,0,1,0,0,-.5,1,0,0,.5,1]),Ce=new Float32Array([0,0,0,1,1,0,0,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,0,1,0,0,1,-.5,-.5,0,1,.5,-.5,0,1,.5,.5,0,1,-.5,-.5,0,1,.5,.5,0,1,-.5,.5,0,1]);function De(e){ne().call(this,e),this.addType(_().ParticleSystem),this._particleSize.setUnit("length"),e.getSpecificationVersion()<4&&(this.addAlias("colorRamp",this._color),this.addAlias("texCoordRamp",this._texCoord));const t=this.getBrowser();this.maxParticles=0,this.numParticles=0,this.forcePhysicsModelNodes=[],this.forces=new Float32Array(4),this.boundedPhysicsModelNodes=[],this.boundedNormals=[],this.boundedVertices=[],this.colorRamp=new Float32Array,this.texCoordRamp=new Float32Array,this.geometryContext=new(oe())({textureCoordinateNode:t.getDefaultTextureCoordinate()}),this.creationTime=0,this.pauseTime=0,this.deltaTime=0,this.particleStride=7*Float32Array.BYTES_PER_ELEMENT*4,this.particleOffsets=Array.from({length:7},((e,t)=>4*Float32Array.BYTES_PER_ELEMENT*t)),this.particleOffset=this.particleOffsets[0],this.colorOffset=this.particleOffsets[1],this.matrixOffset=this.particleOffsets[3],this.texCoordOffset=0}De.prototype=Object.assign(Object.create(ne().prototype),{constructor:De,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"enabled",new(o().SFBool)(!0)),new(s())(_().inputOutput,"createParticles",new(o().SFBool)(!0)),new(s())(_().initializeOnly,"geometryType",new(o().SFString)("QUAD")),new(s())(_().inputOutput,"maxParticles",new(o().SFInt32)(200)),new(s())(_().inputOutput,"particleLifetime",new(o().SFFloat)(5)),new(s())(_().inputOutput,"lifetimeVariation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"particleSize",new(o().SFVec2f)(.02,.02)),new(s())(_().initializeOnly,"emitter",new(o().SFNode)),new(s())(_().initializeOnly,"physics",new(o().MFNode)),new(s())(_().initializeOnly,"colorKey",new(o().MFFloat)),new(s())(_().initializeOnly,"color",new(o().SFNode)),new(s())(_().initializeOnly,"texCoordKey",new(o().MFFloat)),new(s())(_().initializeOnly,"texCoord",new(o().SFNode)),new(s())(_().outputOnly,"isActive",new(o().SFBool)),new(s())(_().inputOutput,"visible",new(o().SFBool)(!0)),new(s())(_().inputOutput,"castShadow",new(o().SFBool)(!0)),new(s())(_().inputOutput,"bboxDisplay",new(o().SFBool)),new(s())(_().initializeOnly,"bboxSize",new(o().SFVec3f)(-1,-1,-1)),new(s())(_().initializeOnly,"bboxCenter",new(o().SFVec3f)),new(s())(_().inputOutput,"appearance",new(o().SFNode)),new(s())(_().inputOutput,"geometry",new(o().SFNode))]),getTypeName:function(){return"ParticleSystem"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"children"},getSpecificationRange:function(){return["3.2","Infinity"]},initialize:function(){ne().prototype.initialize.call(this);const e=this.getBrowser(),t=e.getContext();e.getContext().getVersion()<2||(this.getLive().addInterest("set_live__",this),this._enabled.addInterest("set_enabled__",this),this._createParticles.addInterest("set_createParticles__",this),this._geometryType.addInterest("set_geometryType__",this),this._geometryType.addInterest("set_texCoord__",this),this._maxParticles.addInterest("set_enabled__",this),this._particleLifetime.addInterest("set_particleLifetime__",this),this._lifetimeVariation.addInterest("set_lifetimeVariation__",this),this._emitter.addInterest("set_emitter__",this),this._physics.addInterest("set_physics__",this),this._colorKey.addInterest("set_color__",this),this._color.addInterest("set_colorRamp__",this),this._texCoordKey.addInterest("set_texCoord__",this),this._texCoord.addInterest("set_texCoordRamp__",this),this.inputParticles=this.createBuffer(),this.outputParticles=this.createBuffer(),this.inputParticles.vertexArrayObject=new(se())(t),this.outputParticles.vertexArrayObject=new(se())(t),this.forcesTexture=this.createTexture(),this.boundedTexture=this.createTexture(),this.colorRampTexture=this.createTexture(),this.texCoordRampTexture=this.createTexture(),this.geometryBuffer=this.createBuffer(),this.texCoordBuffers=new Array(e.getMaxTextures()).fill(this.geometryBuffer),this.set_emitter__(),this.set_enabled__(),this.set_geometryType__(),this.set_createParticles__(),this.set_particleLifetime__(),this.set_lifetimeVariation__(),this.set_physics__(),this.set_colorRamp__(),this.set_texCoordRamp__())},getShapeKey:function(){return this.numTexCoords?2:1},getGeometryContext:function(){return this.geometryType===p.GEOMETRY?this.getGeometry():this.geometryContext},set_bbox__:function(){this._bboxSize.getValue().equals(this.getDefaultBBoxSize())?this.bbox.set():this.bbox.set(this._bboxSize.getValue(),this._bboxCenter.getValue()),this.bboxSize.assign(this.bbox.size),this.bboxCenter.assign(this.bbox.center)},set_transparent__:function(){if(this.getAppearance().getAlphaMode()===ue().AUTO)if(this.geometryType===p.POINT)this.setTransparent(!0);else this.setTransparent(!!(this.getAppearance().isTransparent()||this.colorRampNode?.isTransparent()||this.geometryType===p.GEOMETRY&&this.geometryNode?.isTransparent()));else this.setTransparent(this.getAppearance().isTransparent())},set_live__:function(){this.getLive().getValue()?this._isActive.getValue()&&this._maxParticles.getValue()&&(this.getBrowser().sensorEvents().addInterest("animateParticles",this),this.pauseTime&&(this.creationTime+=Date.now()/1e3-this.pauseTime,this.pauseTime=0)):this._isActive.getValue()&&this._maxParticles.getValue()&&(this.getBrowser().sensorEvents().removeInterest("animateParticles",this),0===this.pauseTime&&(this.pauseTime=Date.now()/1e3))},set_enabled__:function(){this._enabled.getValue()&&this._maxParticles.getValue()?this._isActive.getValue()||(this.getLive().getValue()?(this.getBrowser().sensorEvents().addInterest("animateParticles",this),this.pauseTime=0):this.pauseTime=Date.now()/1e3,this._isActive=!0,delete this.traverse):this._isActive.getValue()&&(this.getLive().getValue()&&this.getBrowser().sensorEvents().removeInterest("animateParticles",this),this._isActive=!1,this.numParticles=0,this.traverse=Function.prototype),this.set_maxParticles__()},set_createParticles__:function(){this.createParticles=this._createParticles.getValue()},set_geometryType__:function(){const e=this.getBrowser().getContext();switch(this.geometryType=this.getEnum(p,this._geometryType.getValue(),p.QUAD),this.geometryType){case p.POINT:this.geometryContext.geometryType=0,this.geometryContext.hasNormals=!1,this.texCoordCount=0,this.vertexCount=1,this.hasNormals=!1,this.verticesOffset=0,this.primitiveMode=e.POINTS,e.bindBuffer(e.ARRAY_BUFFER,this.geometryBuffer),e.bufferData(e.ARRAY_BUFFER,Pe,e.DYNAMIC_DRAW);break;case p.LINE:this.geometryContext.geometryType=1,this.geometryContext.hasNormals=!1,this.texCoordCount=2,this.vertexCount=2,this.hasNormals=!1,this.texCoordsOffset=0,this.verticesOffset=8*Float32Array.BYTES_PER_ELEMENT,this.primitiveMode=e.LINES,e.bindBuffer(e.ARRAY_BUFFER,this.geometryBuffer),e.bufferData(e.ARRAY_BUFFER,Ne,e.DYNAMIC_DRAW);break;case p.TRIANGLE:case p.QUAD:case p.SPRITE:this.geometryContext.geometryType=2,this.geometryContext.hasNormals=!0,this.texCoordCount=4,this.vertexCount=6,this.hasNormals=!0,this.texCoordsOffset=0,this.normalOffset=24*Float32Array.BYTES_PER_ELEMENT,this.verticesOffset=27*Float32Array.BYTES_PER_ELEMENT,this.primitiveMode=e.TRIANGLES,e.bindBuffer(e.ARRAY_BUFFER,this.geometryBuffer),e.bufferData(e.ARRAY_BUFFER,Ce,e.DYNAMIC_DRAW);break;case p.GEOMETRY:this.texCoordCount=0}this.geometryContext.updateGeometryKey(),this.updateVertexArrays(),this.set_transparent__()},set_maxParticles__:function(){const e=this.numParticles,t=Math.max(0,this._maxParticles.getValue());this.maxParticles=t,this.numParticles=Math.min(e,t),this.emitterNode.isExplosive()||(this.creationTime=Date.now()/1e3),this.resizeBuffers(e),this.updateVertexArrays()},set_particleLifetime__:function(){this.particleLifetime=this._particleLifetime.getValue()},set_lifetimeVariation__:function(){this.lifetimeVariation=this._lifetimeVariation.getValue()},set_emitter__:function(){this.emitterNode=q()(_().X3DParticleEmitterNode,this._emitter),this.emitterNode||(this.emitterNode=this.getBrowser().getDefaultEmitter()),this.createParticles=this._createParticles.getValue()},set_physics__:function(){const e=this._physics.getValue(),t=this.forcePhysicsModelNodes,n=this.boundedPhysicsModelNodes;for(let e=0,t=n.length;e<t;++e)n[e].removeInterest("set_boundedPhysics__",this);t.length=0,n.length=0;for(let i=0,o=e.length;i<o;++i)try{const o=e[i].getValue().getInnerNode(),r=o.getType();for(let e=r.length-1;e>=0;--e){switch(r[e]){case _().ForcePhysicsModel:case _().WindPhysicsModel:t.push(o);break;case _().BoundedPhysicsModel:o.addInterest("set_boundedPhysics__",this),n.push(o);break;default:continue}break}}catch(e){}this.set_boundedPhysics__()},set_boundedPhysics__:function(){const e=this.getBrowser().getContext(),t=this.boundedPhysicsModelNodes,n=this.boundedNormals,i=this.boundedVertices;n.length=0,i.length=0;for(let e=0,o=t.length;e<o;++e)t[e].addGeometry(n,i);const o=new Ae(i,n).toArray([]),r=i.length/4,s=n.length/3,a=o.length/4,c=Math.ceil(Math.sqrt(r+s+a)),l=new Float32Array(c*c*4);this.boundedVerticesIndex=0,this.boundedNormalsIndex=r,this.boundedHierarchyIndex=this.boundedNormalsIndex+s,this.boundedHierarchyRoot=this.boundedHierarchyIndex+a-1,l.set(i);for(let e=4*this.boundedNormalsIndex,t=0,i=n.length;t<i;e+=4,t+=3)l[e+0]=n[t+0],l[e+1]=n[t+1],l[e+2]=n[t+2];l.set(o,4*this.boundedHierarchyIndex),c&&(e.bindTexture(e.TEXTURE_2D,this.boundedTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,c,c,0,e.RGBA,e.FLOAT,l))},set_colorRamp__:function(){this.colorRampNode&&this.colorRampNode.removeInterest("set_color__",this),this.colorRampNode=q()(_().X3DColorNode,this._color),this.colorRampNode&&this.colorRampNode.addInterest("set_color__",this),this.set_color__(),this.set_transparent__()},set_color__:function(){const e=this.getBrowser().getContext(),t=this._colorKey,n=t.length,i=Math.ceil(Math.sqrt(2*n));let o=this.colorRamp;i*i*4>o.length&&(o=this.colorRamp=new Float32Array(i*i*4));for(let e=0;e<n;++e)o[4*e]=t[e];this.colorRampNode?o.set(this.colorRampNode.addColors([],n).slice(0,4*n),4*n):o.fill(1,4*n),i&&(e.bindTexture(e.TEXTURE_2D,this.colorRampTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,i,i,0,e.RGBA,e.FLOAT,o)),this.numColors=n,this.geometryContext.colorMaterial=!(!n||!this.colorRampNode),this.geometryContext.updateGeometryKey(),this.updateVertexArrays()},set_texCoordRamp__:function(){this.texCoordRampNode&&this.texCoordRampNode.removeInterest("set_texCoord__",this),this.texCoordRampNode=q()(_().X3DTextureCoordinateNode,this._texCoord),this.texCoordRampNode&&this.texCoordRampNode.addInterest("set_texCoord__",this),this.set_texCoord__()},set_texCoord__:function(){const e=this.getBrowser().getContext(),t=this._texCoordKey,n=t.length,i=Math.ceil(Math.sqrt(n+n*this.texCoordCount));let o=this.texCoordRamp;i*i*4>o.length?o=this.texCoordRamp=new Float32Array(i*i*4):o.fill(0);for(let e=0;e<n;++e)o[4*e]=t[e];this.texCoordRampNode&&o.set(this.texCoordRampNode.getPoints([]).slice(0,n*this.texCoordCount*4),4*n),i&&(e.bindTexture(e.TEXTURE_2D,this.texCoordRampTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,i,i,0,e.RGBA,e.FLOAT,o)),this.numTexCoords=this.texCoordRampNode?n:0,this.updateVertexArrays()},updateVertexArrays:function(){this.inputParticles.vertexArrayObject.update(),this.outputParticles.vertexArrayObject.update()},createTexture:function(){const e=this.getBrowser().getContext(),t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,1,1,0,e.RGBA,e.FLOAT,new Float32Array(4)),t},createBuffer:function(){const e=this.getBrowser().getContext(),t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Uint32Array,e.DYNAMIC_DRAW),t},resizeBuffers:function(e){const t=this.getBrowser().getContext(),n=this.maxParticles,i=this.particleStride,o=Object.assign(t.createBuffer(),this.outputParticles),r=new Uint8Array(n*i);t.bindBuffer(t.ARRAY_BUFFER,this.inputParticles),t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.bindBuffer(t.COPY_READ_BUFFER,this.outputParticles),t.bindBuffer(t.ARRAY_BUFFER,o),t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.copyBufferSubData(t.COPY_READ_BUFFER,t.ARRAY_BUFFER,0,0,Math.min(n*i,e*i)),t.deleteBuffer(this.outputParticles),this.outputParticles=o},animateParticles:function(){const e=this.getBrowser(),t=e.getContext(),n=this.emitterNode,i=1/Math.max(10,this.getBrowser().getCurrentFrameRate());let o=this.deltaTime=(14*this.deltaTime+i)/15;if(n.isExplosive()){const e=Date.now()/1e3,t=this.particleLifetime+this.particleLifetime*this.lifetimeVariation;e-this.creationTime>t?(this.creationTime=e,this.numParticles=this.maxParticles,this.createParticles=this._createParticles.getValue(),o=Number.POSITIVE_INFINITY):this.createParticles=!1}else if(this.numParticles<this.maxParticles){const e=Date.now()/1e3,t=Math.max(0,Math.floor((e-this.creationTime)*this.maxParticles/this.particleLifetime));t&&(this.creationTime=e),this.numParticles=Math.min(this.maxParticles,this.numParticles+t)}if(n.getMass()){const e=this.forcePhysicsModelNodes;let i=e.length,r=this.forces,s=o/n.getMass();4*i>r.length&&(r=this.forces=new Float32Array(4*i));let a=0;for(let t=0;t<i;++t)a+=!e[t].addForce(t-a,n,s,r);this.numForces=i-=a,i&&(t.bindTexture(t.TEXTURE_2D,this.forcesTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA32F,i,1,0,t.RGBA,t.FLOAT,r))}else this.numForces=0;const r=this.outputParticles;this.outputParticles=this.inputParticles,this.inputParticles=r,n.animate(this,o),e.addBrowserEvent()},updateSprite:function(){const e=new Float32Array(Ce),t=[new(P())(-.5,-.5,0),new(P())(.5,-.5,0),new(P())(.5,.5,0),new(P())(-.5,-.5,0),new(P())(.5,.5,0),new(P())(-.5,.5,0)],n=new(P())(0,0,0),i=new(P())(0,0,0);return function(o,r){for(let t=0;t<3;++t)e[24+t]=r[6+t];i.set(this._particleSize.x,this._particleSize.y,1);for(let o=0;o<6;++o){const s=27+4*o;r.multVecMatrix(n.assign(t[o]).multVec(i)),e[s+0]=n.x,e[s+1]=n.y,e[s+2]=n.z}o.bindBuffer(o.ARRAY_BUFFER,this.geometryBuffer),o.bufferData(o.ARRAY_BUFFER,e,o.DYNAMIC_DRAW)}}(),intersectsBox:function(e,t){},traverse:function(e,t){switch(e){case ce().POINTER:t.addPointingShape(this);break;case ce().PICKING:case ce().COLLISION:break;case ce().SHADOW:this._castShadow.getValue()&&t.addShadowShape(this);break;case ce().DISPLAY:t.addDisplayShape(this)&&this.getAppearance().traverse(e,t)}this.geometryType===p.GEOMETRY&&this.getGeometry()&&this.getGeometry().traverse(e,t)},displaySimple:function(e,t,n){if(this.numParticles)switch(this.geometryType){case p.GEOMETRY:{const t=this.getGeometry();t&&t.displaySimpleParticles(e,n,this);break}case p.SPRITE:this.updateSprite(e,this.getScreenAlignedRotation(t.modelViewMatrix));default:{const t=this.outputParticles;if(t.vertexArrayObject.enable(n)){const i=this.particleStride;n.enableParticleAttribute(e,t,i,this.particleOffset,1),n.enableParticleMatrixAttribute(e,t,i,this.matrixOffset,1),n.enableVertexAttribute(e,this.geometryBuffer,0,this.verticesOffset)}e.drawArraysInstanced(this.primitiveMode,0,this.vertexCount,this.numParticles);break}}},display:function(e,t){switch(this.geometryType){case p.GEOMETRY:if(this.numParticles){const n=this.getGeometry();n&&n.displayParticles(e,t,this)}break;case p.SPRITE:this.updateSprite(e,this.getScreenAlignedRotation(t.modelViewMatrix));case p.QUAD:case p.TRIANGLE:{const n=me().prototype.determinant3.call(t.modelViewMatrix)>0;e.frontFace(n?e.CCW:e.CW),e.enable(e.CULL_FACE),e.cullFace(e.BACK)}default:{const n=this.getBrowser(),i=this.getAppearance(),o=i.getShader(this.geometryContext,t),r=n.getPrimitiveMode(this.primitiveMode);if(this.numParticles){const s=i.getBlendMode();if(s?.enable(e),o.enable(e),o.setUniforms(e,this.geometryContext,t),this.numTexCoords){const t=n.getTexture2DUnit();e.activeTexture(e.TEXTURE0+t),e.bindTexture(e.TEXTURE_2D,this.texCoordRampTexture),e.uniform1i(o.x3d_TexCoordRamp,t)}const a=this.outputParticles;if(a.vertexArrayObject.enable(o)){const t=this.particleStride;o.enableParticleAttribute(e,a,t,this.particleOffset,1),o.enableParticleMatrixAttribute(e,a,t,this.matrixOffset,1),this.geometryContext.colorMaterial&&(o.enableColorAttribute(e,a,t,this.colorOffset),o.colorAttributeDivisor(e,1)),this.texCoordCount&&o.enableTexCoordAttribute(e,this.texCoordBuffers,0,this.texCoordOffset),this.hasNormals&&(o.enableNormalAttribute(e,this.geometryBuffer,0,this.normalOffset),o.normalAttributeDivisor(e,this.maxParticles)),o.enableVertexAttribute(e,this.geometryBuffer,0,this.verticesOffset)}e.drawArraysInstanced(r,0,this.vertexCount,this.numParticles),s?.disable(e)}break}}},getScreenAlignedRotation:function(){const e=new(me()),t=new(P())(0,0,0),n=new(P())(0,0,0),i=new(P())(0,0,0),o=new(fe())(9);return function(r){e.assign(r).inverse(),e.multDirMatrix(t.assign(P().zAxis)),e.multDirMatrix(n.assign(P().yAxis));const s=n.cross(t);i.assign(t).cross(s);const a=t;return s.normalize(),i.normalize(),a.normalize(),o.set(s.x,s.y,s.z,i.x,i.y,i.z,a.x,a.y,a.z),o}}()});const Be=De;m().set("x_ite/Components/ParticleSystems/ParticleSystem",Be);const Ve=Be,Oe=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Components/Rendering/IndexedLineSet");var Ue=e.n(Oe);function ze(e){S.call(this,e),this.addType(_().PolylineEmitter),this.polylinesNode=new(Ue())(e),this.polylinesArray=new Float32Array,this.addSampler("polylines"),this.addUniform("direction","uniform vec3 direction;"),this.addUniform("verticesIndex","uniform int verticesIndex;"),this.addUniform("polylines","uniform sampler2D polylines;"),this.addFunction("vec3 getRandomVelocity ()\n {\n if (direction == vec3 (0.0))\n return getRandomSphericalVelocity ();\n\n else\n return direction * getRandomSpeed ();\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n if (verticesIndex < 0)\n {\n return vec4 (NaN);\n }\n else\n {\n // Determine index0, index1 and weight.\n\n float lastLengthSoFar = texelFetch (polylines, verticesIndex - 1, 0) .x;\n float fraction = random () * lastLengthSoFar;\n\n int index0 = 0;\n int index1 = 0;\n float weight = 0.0;\n\n interpolate (polylines, verticesIndex, fraction, index0, index1, weight);\n\n // Interpolate and return position.\n\n index0 *= 2;\n index1 = index0 + 1;\n\n vec4 vertex0 = texelFetch (polylines, verticesIndex + index0, 0);\n vec4 vertex1 = texelFetch (polylines, verticesIndex + index1, 0);\n\n return mix (vertex0, vertex1, weight);\n }\n }")}ze.prototype=Object.assign(Object.create(S.prototype),{constructor:ze,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)(0,1,0)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat)),new(s())(_().inputOutput,"coordIndex",new(o().MFInt32)(-1)),new(s())(_().inputOutput,"coord",new(o().SFNode))]),getTypeName:function(){return"PolylineEmitter"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"emitter"},getSpecificationRange:function(){return["3.2","Infinity"]},initialize:function(){S.prototype.initialize.call(this);this.getBrowser().getContext().getVersion()<2||(this.polylinesTexture=this.createTexture(),this._direction.addInterest("set_direction__",this),this._coordIndex.addFieldInterest(this.polylinesNode._coordIndex),this._coord.addFieldInterest(this.polylinesNode._coord),this.polylinesNode._coordIndex=this._coordIndex,this.polylinesNode._coord=this._coord,this.polylinesNode._rebuild.addInterest("set_polyline",this),this.polylinesNode.setPrivate(!0),this.polylinesNode.setup(),this.set_direction__(),this.set_polyline())},set_direction__:function(){const e=new(P())(0,0,0);return function(){e.assign(this._direction.getValue()).normalize(),this.setUniform("uniform3f","direction",e.x,e.y,e.z)}}(),set_polyline:function(){const e=new(P())(0,0,0),t=new(P())(0,0,0);return function(){const n=this.getBrowser().getContext(),i=this.polylinesNode.getVertices().getValue(),o=i.length/4,r=o/2+1,s=Math.ceil(Math.sqrt(r+o)),a=r;let c=this.polylinesArray;c.length<s*s*4&&(c=this.polylinesArray=new Float32Array(s*s*4));let l=0;for(let n=0,o=i.length;n<o;n+=8)e.set(i[n],i[n+1],i[n+2]),t.set(i[n+4],i[n+5],i[n+6]),c[n/2+4]=l+=t.subtract(e).magnitude();c.set(i,4*a),this.setUniform("uniform1i","verticesIndex",o?a:-1),s&&(n.bindTexture(n.TEXTURE_2D,this.polylinesTexture),n.texImage2D(n.TEXTURE_2D,0,n.RGBA32F,s,s,0,n.RGBA,n.FLOAT,c))}}(),activateTextures:function(e,t){e.activeTexture(e.TEXTURE0+t.polylinesTextureUnit),e.bindTexture(e.TEXTURE_2D,this.polylinesTexture)}});const Me=ze;m().set("x_ite/Components/ParticleSystems/PolylineEmitter",Me);const Xe=Me,Le=window[Symbol.for("X_ITE.X3D-8.7.9")].require("standard/Math/Geometry/Triangle3");var qe=e.n(Le);function ke(e){S.call(this,e),this.addType(_().SurfaceEmitter),this.surfaceNode=null,this.surfaceArray=new Float32Array,this.addSampler("surface"),this.addUniform("solid","uniform bool solid;"),this.addUniform("verticesIndex","uniform int verticesIndex;"),this.addUniform("normalsIndex","uniform int normalsIndex;"),this.addUniform("surface","uniform sampler2D surface;"),this.addFunction("vec4 position; vec3 getRandomVelocity ()\n {\n if (verticesIndex < 0)\n {\n return vec3 (0.0);\n }\n else\n {\n vec3 normal;\n\n getRandomPointOnSurface (surface, verticesIndex, normalsIndex, position, normal);\n\n if (solid == false && random () > 0.5)\n normal = -normal;\n\n return normal * getRandomSpeed ();\n }\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n return verticesIndex < 0 ? vec4 (NaN) : position;\n }")}ke.prototype=Object.assign(Object.create(S.prototype),{constructor:ke,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat)),new(s())(_().inputOutput,"surface",new(o().SFNode))]),getTypeName:function(){return"SurfaceEmitter"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"emitter"},getSpecificationRange:function(){return["3.2","Infinity"]},initialize:function(){S.prototype.initialize.call(this);this.getBrowser().getContext().getVersion()<2||(this.surfaceTexture=this.createTexture(),this._surface.addInterest("set_surface__",this),this.set_surface__())},set_surface__:function(){this.surfaceNode&&(this.surfaceNode._solid.removeInterest("set_solid__",this),this.surfaceNode._rebuild.removeInterest("set_geometry__",this)),this.surfaceNode=q()(_().X3DGeometryNode,this._surface),this.surfaceNode&&(this.surfaceNode._solid.addInterest("set_solid__",this),this.surfaceNode._rebuild.addInterest("set_geometry__",this)),this.set_solid__(),this.set_geometry__()},set_solid__:function(){this.surfaceNode&&this.setUniform("uniform1i","solid",this.surfaceNode._solid.getValue())},set_geometry__:function(){const e=new(P())(0,0,0),t=new(P())(0,0,0),n=new(P())(0,0,0);return function(){const i=this.getBrowser().getContext();if(this.surfaceNode){const o=this.surfaceNode.getVertices().getValue(),r=this.surfaceNode.getNormals().getValue(),s=o.length/4,a=s/3+1,c=Math.ceil(Math.sqrt(a+s+s)),l=a,u=l+s;let d=this.surfaceArray;d.length<c*c*4&&(d=this.surfaceArray=new Float32Array(c*c*4));let m=0;for(let i=0,r=o.length;i<r;i+=12)e.set(o[i],o[i+1],o[i+2]),t.set(o[i+4],o[i+5],o[i+6]),n.set(o[i+8],o[i+9],o[i+10]),d[i/3+4]=m+=qe().area(e,t,n);d.set(o,4*l);for(let e=4*u,t=0,n=r.length;t<n;e+=4,t+=3)d[e+0]=r[t+0],d[e+1]=r[t+1],d[e+2]=r[t+2];this.setUniform("uniform1i","verticesIndex",s?l:-1),this.setUniform("uniform1i","normalsIndex",s?u:-1),c&&(i.bindTexture(i.TEXTURE_2D,this.surfaceTexture),i.texImage2D(i.TEXTURE_2D,0,i.RGBA32F,c,c,0,i.RGBA,i.FLOAT,d))}else this.setUniform("uniform1i","verticesIndex",-1),this.setUniform("uniform1i","normalsIndex",-1)}}(),activateTextures:function(e,t){e.activeTexture(e.TEXTURE0+t.surfaceTextureUnit),e.bindTexture(e.TEXTURE_2D,this.surfaceTexture)}});const Ge=ke;m().set("x_ite/Components/ParticleSystems/SurfaceEmitter",Ge);const He=Ge,Ye=window[Symbol.for("X_ITE.X3D-8.7.9")].require("x_ite/Components/Geometry3D/IndexedFaceSet");var je=e.n(Ye);function We(e){S.call(this,e),this.addType(_().VolumeEmitter),this.volumeNode=new(je())(e),this.volumeArray=new Float32Array,this.addSampler("volume"),this.addUniform("direction","uniform vec3 direction;"),this.addUniform("verticesIndex","uniform int verticesIndex;"),this.addUniform("normalsIndex","uniform int normalsIndex;"),this.addUniform("hierarchyIndex","uniform int hierarchyIndex;"),this.addUniform("hierarchyRoot","uniform int hierarchyRoot;"),this.addUniform("volume","uniform sampler2D volume;"),this.addFunction("vec3 getRandomVelocity ()\n {\n if (hierarchyRoot < 0)\n {\n return vec3 (0.0);\n }\n else\n {\n if (direction == vec3 (0.0))\n return getRandomSphericalVelocity ();\n\n else\n return direction * getRandomSpeed ();\n }\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n if (hierarchyRoot < 0)\n {\n return vec4 (NaN);\n }\n else\n {\n vec4 point;\n vec3 normal;\n\n getRandomPointOnSurface (volume, verticesIndex, normalsIndex, point, normal);\n\n Line3 line = Line3 (point .xyz, getRandomSurfaceNormal (normal));\n\n vec4 points [ARRAY_SIZE];\n\n int numIntersections = getIntersections (volume, verticesIndex, hierarchyIndex, hierarchyRoot, line, points);\n\n numIntersections -= numIntersections % 2; // We need an even count of intersections.\n\n switch (numIntersections)\n {\n case 0:\n return vec4 (0.0);\n case 2:\n break;\n default:\n sort (points, numIntersections, plane3 (line .point, line .direction));\n break;\n }\n\n int index = int (fract (random ()) * float (numIntersections / 2)) * 2; // Select random intersection.\n\n return mix (points [index], points [index + 1], random ());\n }\n }")}We.prototype=Object.assign(Object.create(S.prototype),{constructor:We,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"internal",new(o().SFBool)(!0)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)(0,1,0)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat)),new(s())(_().inputOutput,"coordIndex",new(o().MFInt32)(-1)),new(s())(_().inputOutput,"coord",new(o().SFNode))]),getTypeName:function(){return"VolumeEmitter"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"emitter"},getSpecificationRange:function(){return["3.2","Infinity"]},initialize:function(){S.prototype.initialize.call(this);this.getBrowser().getContext().getVersion()<2||(this.volumeTexture=this.createTexture(),this._direction.addInterest("set_direction__",this),this._coordIndex.addFieldInterest(this.volumeNode._coordIndex),this._coord.addFieldInterest(this.volumeNode._coord),this.volumeNode._creaseAngle=Math.PI,this.volumeNode._convex=!1,this.volumeNode._coordIndex=this._coordIndex,this.volumeNode._coord=this._coord,this.volumeNode._rebuild.addInterest("set_geometry__",this),this.volumeNode.setPrivate(!0),this.volumeNode.setup(),this.set_direction__(),this.set_geometry__())},set_direction__:function(){const e=new(P())(0,0,0);return function(){e.assign(this._direction.getValue()).normalize(),this.setUniform("uniform3f","direction",e.x,e.y,e.z)}}(),set_geometry__:function(){const e=new(P())(0,0,0),t=new(P())(0,0,0),n=new(P())(0,0,0);return function(){const i=this.getBrowser().getContext(),o=this.volumeNode.getVertices().getValue(),r=this.volumeNode.getNormals().getValue(),s=new Ae(o,r).toArray([]),a=o.length/4,c=r.length/3,l=a/3+1,u=s.length/4,d=Math.ceil(Math.sqrt(l+a+a+u)),m=l,h=m+a,f=h+c;let p=this.volumeArray;p.length<d*d*4&&(p=this.volumeArray=new Float32Array(d*d*4));let x=0;for(let i=0,r=o.length;i<r;i+=12)e.set(o[i],o[i+1],o[i+2]),t.set(o[i+4],o[i+5],o[i+6]),n.set(o[i+8],o[i+9],o[i+10]),p[i/3+4]=x+=qe().area(e,t,n);p.set(o,4*m);for(let e=4*h,t=0,n=r.length;t<n;e+=4,t+=3)p[e+0]=r[t+0],p[e+1]=r[t+1],p[e+2]=r[t+2];p.set(s,4*f),this.setUniform("uniform1i","verticesIndex",m),this.setUniform("uniform1i","normalsIndex",h),this.setUniform("uniform1i","hierarchyIndex",f),this.setUniform("uniform1i","hierarchyRoot",f+u-1),d&&(i.bindTexture(i.TEXTURE_2D,this.volumeTexture),i.texImage2D(i.TEXTURE_2D,0,i.RGBA32F,d,d,0,i.RGBA,i.FLOAT,p))}}(),activateTextures:function(e,t){e.activeTexture(e.TEXTURE0+t.volumeTextureUnit),e.bindTexture(e.TEXTURE_2D,this.volumeTexture)}});const Ke=We;m().set("x_ite/Components/ParticleSystems/VolumeEmitter",Ke);const Ze=Ke,Qe=window[Symbol.for("X_ITE.X3D-8.7.9")].require("standard/Math/Algorithm");var $e=e.n(Qe);function Je(e){X.call(this,e),this.addType(_().WindPhysicsModel),this._speed.setUnit("speed")}Je.prototype=Object.assign(Object.create(X.prototype),{constructor:Je,[Symbol.for("X_ITE.X3DBaseNode.fieldDefinitions")]:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"enabled",new(o().SFBool)(!0)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)),new(s())(_().inputOutput,"speed",new(o().SFFloat)(.1)),new(s())(_().inputOutput,"gustiness",new(o().SFFloat)(.1)),new(s())(_().inputOutput,"turbulence",new(o().SFFloat))]),getTypeName:function(){return"WindPhysicsModel"},getComponentName:function(){return"ParticleSystems"},getContainerField:function(){return"physics"},getSpecificationRange:function(){return["3.2","Infinity"]},getRandomSpeed:function(e){const t=Math.max(0,this._speed.getValue()),n=t*Math.max(0,this._gustiness.getValue());return e.getRandomValue(Math.max(0,t-n),t+n)},addForce:function(){const e=new(P())(0,0,0);return function(t,n,i,o){if(this._enabled.getValue()){const r=n._surfaceArea.getValue(),s=this.getRandomSpeed(n),a=.64615*Math.pow(10,2*Math.log(s));return this._direction.getValue().equals(P().Zero)?n.getRandomNormal(e):e.assign(this._direction.getValue()).normalize(),o.set(e.multiply(r*a*i),4*t),o[4*t+3]=Math.PI*$e().clamp(this._turbulence.getValue(),0,1),!0}return!1}}()});const et=Je;m().set("x_ite/Components/ParticleSystems/WindPhysicsModel",et);const tt=et;n().addComponent({name:"ParticleSystems",types:{BoundedPhysicsModel:H,ConeEmitter:W,ExplosionEmitter:Q,ForcePhysicsModel:ee,ParticleSystem:Ve,PointEmitter:D,PolylineEmitter:Xe,SurfaceEmitter:He,VolumeEmitter:Ze,WindPhysicsModel:tt},abstractTypes:{X3DParticleEmitterNode:S,X3DParticlePhysicsModelNode:X},browserContext:U});const nt=void 0;m().set("assets/components/ParticleSystems",nt)})();
1
+ /* X_ITE v8.8.1 */(()=>{"use strict";var e={355:e=>{e.exports=window[Symbol.for("X_ITE.X3D-8.8.1")].require("lib/jquery")}},t={};function n(i){var o=t[i];if(void 0!==o)return o.exports;var r=t[i]={exports:{}};return e[i](r,r.exports,n),r.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Components");var t=n.n(e);const i=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Fields");var o=n.n(i);const r=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Base/X3DFieldDefinition");var s=n.n(r);const a=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Base/FieldDefinitionArray");var c=n.n(a);const l=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Components/Core/X3DNode");var u=n.n(l);const d=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Namespace");var m=n.n(d);let h=0;const p={POINT:h++,LINE:h++,TRIANGLE:h++,QUAD:h++,SPRITE:h++,GEOMETRY:h++};m().set("x_ite/Browser/ParticleSystems/GeometryTypes",p);const f=p,x=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Base/X3DConstants");var _=n.n(x);const y="\nstruct Line3 {\n vec3 point;\n vec3 direction;\n};\n\n// Line3\n// line3 (const in vec3 point1, const in vec3 point2)\n// {\n// return Line3 (point1, normalize (point2 - point1));\n// }\n\n/* Line intersect triangle */\n\nbool\nintersects (const in Line3 line, const in vec3 a, const in vec3 b, const in vec3 c, out vec3 r)\n{\n // find vectors for two edges sharing vert0\n vec3 edge1 = b - a;\n vec3 edge2 = c - a;\n\n // begin calculating determinant - also used to calculate U parameter\n vec3 pvec = cross (line .direction, edge2);\n\n // if determinant is near zero, ray lies in plane of triangle\n float det = dot (edge1, pvec);\n\n // Non culling intersection\n\n if (det == 0.0)\n return false;\n\n float inv_det = 1.0 / det;\n\n // calculate distance from vert0 to ray point\n vec3 tvec = line .point - a;\n\n // calculate U parameter and test bounds\n float u = dot (tvec, pvec) * inv_det;\n\n if (u < 0.0 || u > 1.0)\n return false;\n\n // prepare to test V parameter\n vec3 qvec = cross (tvec, edge1);\n\n // calculate V parameter and test bounds\n float v = dot (line .direction, qvec) * inv_det;\n\n if (v < 0.0 || u + v > 1.0)\n return false;\n\n r = vec3 (u, v, 1.0 - u - v);\n\n return true;\n}\n";m().set("x_ite/Browser/ParticleSystems/Line3.glsl",y);const g=y,v="\nstruct Plane3\n{\n vec3 normal;\n float distanceFromOrigin;\n};\n\nPlane3\nplane3 (const in vec3 point, const in vec3 normal)\n{\n return Plane3 (normal, dot (normal, point));\n}\n\nfloat\nplane_distance (const in Plane3 plane, const in vec3 point)\n{\n return dot (point, plane .normal) - plane .distanceFromOrigin;\n}\n\n/* Plane intersect line */\nbool\nintersects (const in Plane3 plane, const in Line3 line, out vec3 point)\n{\n // Check if the line is parallel to the plane.\n float theta = dot (line .direction, plane .normal);\n\n // Plane and line are parallel.\n if (theta == 0.0)\n return false;\n\n // Plane and line are not parallel. The intersection point can be calculated now.\n float t = (plane .distanceFromOrigin - dot (plane .normal, line .point)) / theta;\n\n point = line .point + line .direction * t;\n\n return true;\n}\n\n/* Find find the first point that is farther to the plane than value. */\n// int\n// upper_bound (const in vec4 points [ARRAY_SIZE], in int count, const in float value, const in Plane3 plane)\n// {\n// int first = 0;\n// int step = 0;\n\n// while (count > 0)\n// {\n// int index = first;\n\n// step = count >> 1;\n\n// index += step;\n\n// if (value < plane_distance (plane, points [index] .xyz))\n// {\n// count = step;\n// }\n// else\n// {\n// first = ++ index;\n// count -= step + 1;\n// }\n// }\n\n// return first;\n// }\n\n/* CombSort: sort points in distance to a plane. */\nvoid\nsort (inout vec4 points [ARRAY_SIZE], const in int count, const in Plane3 plane)\n{\n const float shrink = 1.0 / 1.3;\n\n int gap = count;\n bool exchanged = true;\n\n while (exchanged)\n {\n gap = int (float (gap) * shrink);\n\n if (gap <= 1)\n {\n exchanged = false;\n gap = 1;\n }\n\n for (int i = 0, l = count - gap; i < l; ++ i)\n {\n int j = gap + i;\n\n if (plane_distance (plane, points [i] .xyz) > plane_distance (plane, points [j] .xyz))\n {\n vec4 tmp1 = points [i];\n points [i] = points [j];\n points [j] = tmp1;\n\n exchanged = true;\n }\n }\n }\n}\n\n\n// /* CombSort: sort points and normals in distance to a plane. */\n// void\n// sort (inout vec4 points [ARRAY_SIZE], inout vec3 normals [ARRAY_SIZE], const in int count, const in Plane3 plane)\n// {\n// const float shrink = 1.0 / 1.3;\n\n// int gap = count;\n// bool exchanged = true;\n\n// while (exchanged)\n// {\n// gap = int (float (gap) * shrink);\n\n// if (gap <= 1)\n// {\n// exchanged = false;\n// gap = 1;\n// }\n\n// for (int i = 0, l = count - gap; i < l; ++ i)\n// {\n// int j = gap + i;\n\n// if (plane_distance (plane, points [i] .xyz) > plane_distance (plane, points [j] .xyz))\n// {\n// vec4 tmp1 = points [i];\n// points [i] = points [j];\n// points [j] = tmp1;\n\n// vec3 tmp2 = normals [i];\n// normals [i] = normals [j];\n// normals [j] = tmp2;\n\n// exchanged = true;\n// }\n// }\n// }\n// }\n\nint\nmin_index (const in vec4 points [ARRAY_SIZE], const in int count, const in float value, const in Plane3 plane)\n{\n int index = -1;\n float dist = 1000000.0;\n\n for (int i = 0; i < count; ++ i)\n {\n float d = plane_distance (plane, points [i] .xyz);\n\n if (d >= value && d < dist)\n {\n dist = d;\n index = i;\n }\n }\n\n return index;\n}\n";m().set("x_ite/Browser/ParticleSystems/Plane3.glsl",v);const b=v,T="\nbool\nintersects (const in vec3 min, const in vec3 max, const in Line3 line)\n{\n vec3 intersection;\n\n // front\n\n if (intersects (plane3 (max, vec3 (0.0, 0.0, 1.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .xy, max .xy), vec4 (min .xy, intersection .xy))))\n return true;\n }\n\n // back\n\n if (intersects (plane3 (min, vec3 (0.0, 0.0, -1.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .xy, max .xy), vec4 (min .xy, intersection .xy))))\n return true;\n }\n\n // top\n\n if (intersects (plane3 (max, vec3 (0.0, 1.0, 0.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .xz, max .xz), vec4 (min .xz, intersection .xz))))\n return true;\n }\n\n // bottom\n\n if (intersects (plane3 (min, vec3 (0.0, -1.0, 0.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .xz, max .xz), vec4 (min .xz, intersection .xz))))\n return true;\n }\n\n // right\n\n if (intersects (plane3 (max, vec3 (1.0, 0.0, 0.0)), line, intersection))\n {\n if (all (greaterThanEqual (vec4 (intersection .yz, max .yz), vec4 (min .yz, intersection .yz))))\n return true;\n }\n\n return false;\n}\n";m().set("x_ite/Browser/ParticleSystems/Box3.glsl",T);const w=T,R="\n#define BVH_NODE 0\n#define BVH_TRIANGLE 1\n#define BVH_STACK_SIZE 32\n\nint bvhNodeIndex = 0;\n\nvoid\nsetBVHIndex (const in int index)\n{\n bvhNodeIndex = index;\n}\n\nint\ngetBVHRoot (const in sampler2D volume, const in int hierarchyIndex, const in int rootIndex)\n{\n return int (texelFetch (volume, rootIndex, 0) .x) + hierarchyIndex;\n}\n\nint\ngetBVHType (const in sampler2D volume)\n{\n return int (texelFetch (volume, bvhNodeIndex, 0) .x);\n}\n\nvec3\ngetBVHMin (const in sampler2D volume)\n{\n return texelFetch (volume, bvhNodeIndex + 1, 0) .xyz;\n}\n\nvec3\ngetBVHMax (const in sampler2D volume)\n{\n return texelFetch (volume, bvhNodeIndex + 2, 0) .xyz;\n}\n\nint\ngetBVHLeft (const in sampler2D volume, const in int hierarchyIndex)\n{\n return int (texelFetch (volume, bvhNodeIndex, 0) .y) + hierarchyIndex;\n}\n\nint\ngetBVHRight (const in sampler2D volume, const in int hierarchyIndex)\n{\n return int (texelFetch (volume, bvhNodeIndex, 0) .z) + hierarchyIndex;\n}\n\nint\ngetBVHTriangle (const in sampler2D volume)\n{\n return int (texelFetch (volume, bvhNodeIndex, 0) .y);\n}\n\n/* Ray triangle intersection test */\n\nint\ngetIntersections (const in sampler2D volume, const in int verticesIndex, const in int hierarchyIndex, const in int rootIndex, const in Line3 line, out vec4 points [ARRAY_SIZE])\n{\n int current = getBVHRoot (volume, hierarchyIndex, rootIndex);\n int count = 0;\n int stackIndex = -1;\n int stack [BVH_STACK_SIZE];\n\n while (stackIndex >= 0 || current >= 0)\n {\n if (current >= 0)\n {\n setBVHIndex (current);\n\n if (getBVHType (volume) == BVH_NODE)\n {\n // Node\n\n if (intersects (getBVHMin (volume), getBVHMax (volume), line))\n {\n stack [++ stackIndex] = current;\n\n current = getBVHLeft (volume, hierarchyIndex);\n }\n else\n {\n current = -1;\n }\n }\n else\n {\n // Triangle\n\n int t = getBVHTriangle (volume);\n int v = verticesIndex + t;\n vec3 r = vec3 (0.0);\n\n vec3 a = texelFetch (volume, v, 0) .xyz;\n vec3 b = texelFetch (volume, v + 1, 0) .xyz;\n vec3 c = texelFetch (volume, v + 2, 0) .xyz;\n\n if (intersects (line, a, b, c, r))\n points [count ++] = vec4 (r .z * a + r .x * b + r .y * c, 1.0);\n\n current = -1;\n }\n }\n else\n {\n setBVHIndex (stack [stackIndex --]);\n\n current = getBVHRight (volume, hierarchyIndex);\n }\n }\n\n return count;\n}\n\nint\ngetIntersections (const in sampler2D volume, const in int verticesIndex, const in int normalsIndex, const in int hierarchyIndex, const in int rootIndex, const in Line3 line, out vec4 points [ARRAY_SIZE], out vec3 normals [ARRAY_SIZE])\n{\n int current = getBVHRoot (volume, hierarchyIndex, rootIndex);\n int count = 0;\n int stackIndex = -1;\n int stack [BVH_STACK_SIZE];\n\n while (stackIndex >= 0 || current >= 0)\n {\n if (current >= 0)\n {\n setBVHIndex (current);\n\n if (getBVHType (volume) == BVH_NODE)\n {\n // Node\n\n if (intersects (getBVHMin (volume), getBVHMax (volume), line))\n {\n stack [++ stackIndex] = current;\n\n current = getBVHLeft (volume, hierarchyIndex);\n }\n else\n {\n current = -1;\n }\n }\n else\n {\n // Triangle\n\n int t = getBVHTriangle (volume);\n int v = verticesIndex + t;\n vec3 r = vec3 (0.0);\n\n vec3 a = texelFetch (volume, v, 0) .xyz;\n vec3 b = texelFetch (volume, v + 1, 0) .xyz;\n vec3 c = texelFetch (volume, v + 2, 0) .xyz;\n\n if (intersects (line, a, b, c, r))\n {\n points [count] = vec4 (r .z * a + r .x * b + r .y * c, 1.0);\n\n int n = normalsIndex + t;\n\n vec3 n0 = texelFetch (volume, n, 0) .xyz;\n vec3 n1 = texelFetch (volume, n + 1, 0) .xyz;\n vec3 n2 = texelFetch (volume, n + 2, 0) .xyz;\n\n normals [count] = save_normalize (r .z * n0 + r .x * n1 + r .y * n2);\n\n ++ count;\n }\n\n current = -1;\n }\n }\n else\n {\n setBVHIndex (stack [stackIndex --]);\n\n current = getBVHRight (volume, hierarchyIndex);\n }\n }\n\n return count;\n}\n";m().set("x_ite/Browser/ParticleSystems/BVH.glsl",R);const I=R;function F(e){u().call(this,e),this.addType(_().X3DParticleEmitterNode),this._speed.setUnit("speed"),this._mass.setUnit("mass"),this._surfaceArea.setUnit("area"),this.samplers=[],this.uniforms={},this.functions=[],this.program=null,this.addSampler("forces"),this.addSampler("boundedVolume"),this.addSampler("colorRamp"),this.addSampler("texCoordRamp"),this.addUniform("speed","uniform float speed;"),this.addUniform("variation","uniform float variation;"),this.addFunction(g),this.addFunction(b),this.addFunction(w),this.addFunction(I)}Object.assign(Object.setPrototypeOf(F.prototype,u().prototype),{initialize(){u().prototype.initialize.call(this);const e=this.getBrowser().getContext();e.getVersion()<2||(this.program=this.createProgram(),this.transformFeedback=e.createTransformFeedback(),this._on.addInterest("set_on__",this),this._speed.addInterest("set_speed__",this),this._variation.addInterest("set_variation__",this),this._mass.addInterest("set_mass__",this),this.set_on__(),this.set_speed__(),this.set_variation__(),this.set_mass__())},isExplosive:()=>!1,getMass(){return this.mass},set_on__(){this.on=this._on.getValue()},set_speed__(){this.setUniform("uniform1f","speed",this._speed.getValue())},set_variation__(){this.setUniform("uniform1f","variation",this._variation.getValue())},set_mass__(){this.mass=this._mass.getValue()},getRandomValue:(e,t)=>Math.random()*(t-e)+e,getRandomNormal(e){const t=this.getRandomValue(-1,1)*Math.PI,n=this.getRandomValue(-1,1),i=Math.acos(n),o=Math.sin(i);return e.set(Math.sin(t)*o,Math.cos(t)*o,n)},animate(e,t){const n=this.getBrowser().getContext(),i=e.inputParticles,o=e.particleStride,r=e.particleOffsets,s=this.program;if(n.useProgram(s),n.uniform1i(s.randomSeed,4294967295*Math.random()),n.uniform1i(s.geometryType,e.geometryType),n.uniform1i(s.createParticles,e.createParticles&&this.on),n.uniform1f(s.particleLifetime,e.particleLifetime),n.uniform1f(s.lifetimeVariation,e.lifetimeVariation),n.uniform1f(s.deltaTime,t),n.uniform2f(s.particleSize,e._particleSize.x,e._particleSize.y),n.uniform1i(s.numForces,e.numForces),e.numForces&&(n.activeTexture(n.TEXTURE0+s.forcesTextureUnit),n.bindTexture(n.TEXTURE_2D,e.forcesTexture)),e.boundedHierarchyRoot<0?n.uniform1i(s.boundedHierarchyRoot,-1):(n.uniform1i(s.boundedVerticesIndex,e.boundedVerticesIndex),n.uniform1i(s.boundedNormalsIndex,e.boundedNormalsIndex),n.uniform1i(s.boundedHierarchyIndex,e.boundedHierarchyIndex),n.uniform1i(s.boundedHierarchyRoot,e.boundedHierarchyRoot),n.activeTexture(n.TEXTURE0+s.boundedVolumeTextureUnit),n.bindTexture(n.TEXTURE_2D,e.boundedTexture)),n.uniform1i(s.numColors,e.numColors),e.numColors&&(n.activeTexture(n.TEXTURE0+s.colorRampTextureUnit),n.bindTexture(n.TEXTURE_2D,e.colorRampTexture)),n.uniform1i(s.numTexCoords,e.numTexCoords),e.numTexCoords&&(n.uniform1i(s.texCoordCount,e.texCoordCount),n.activeTexture(n.TEXTURE0+s.texCoordRampTextureUnit),n.bindTexture(n.TEXTURE_2D,e.texCoordRampTexture)),this.activateTextures(n,s),i.vertexArrayObject.enable(s)){for(const[e,t]of s.inputs)n.bindBuffer(n.ARRAY_BUFFER,i),n.enableVertexAttribArray(t),n.vertexAttribPointer(t,4,n.FLOAT,!1,o,r[e]);n.bindBuffer(n.ARRAY_BUFFER,null)}n.bindTransformFeedback(n.TRANSFORM_FEEDBACK,this.transformFeedback),n.bindBufferBase(n.TRANSFORM_FEEDBACK_BUFFER,0,e.outputParticles),n.enable(n.RASTERIZER_DISCARD),n.beginTransformFeedback(n.POINTS),n.drawArrays(n.POINTS,0,e.numParticles),n.endTransformFeedback(),n.disable(n.RASTERIZER_DISCARD),n.bindTransformFeedback(n.TRANSFORM_FEEDBACK,null)},addSampler(e){this.samplers.push(e)},addUniform(e,t){this.uniforms[e]=t},setUniform(e,t,n,i,o){const r=this.getBrowser().getContext(),s=this.program;r.useProgram(s),r[e](s[t],n,i,o)},addFunction(e){this.functions.push(e)},createProgram(){const e=this.getBrowser(),t=e.getContext(),n=`#version 300 es\n\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n\n uniform int randomSeed;\n uniform int geometryType;\n uniform bool createParticles;\n uniform float particleLifetime;\n uniform float lifetimeVariation;\n uniform float deltaTime;\n uniform vec2 particleSize;\n\n uniform int numForces;\n uniform sampler2D forces;\n\n uniform int boundedVerticesIndex;\n uniform int boundedNormalsIndex;\n uniform int boundedHierarchyIndex;\n uniform int boundedHierarchyRoot;\n uniform sampler2D boundedVolume;\n\n uniform int numColors;\n uniform sampler2D colorRamp;\n\n uniform int texCoordCount;\n uniform int numTexCoords;\n uniform sampler2D texCoordRamp;\n\n ${Object.values(this.uniforms).join("\n")}\n\n in vec4 input0; // (life, lifetime, elapsedTime, texCoordIndex0)\n in vec4 input2; // (velocity, 0.0)\n in vec4 input6; // position\n\n out vec4 output0; // (life, lifetime, elapsedTime, texCoordIndex0)\n out vec4 output1; // (color)\n out vec4 output2; // (velocity, 0.0)\n\n out vec4 output3; // scale rotation matrix\n out vec4 output4; // scale rotation matrix\n out vec4 output5; // scale rotation matrix\n out vec4 output6; // position\n\n // Constants\n\n ${Object.entries(f).map((([e,t])=>`#define ${e} ${t}`)).join("\n")}\n\n const int ARRAY_SIZE = 32;\n const float M_PI = 3.14159265359;\n\n uniform float NaN;\n\n // Texture\n\n vec4\n texelFetch (const in sampler2D sampler, const in int index, const in int lod)\n {\n int x = textureSize (sampler, lod) .x;\n ivec2 p = ivec2 (index % x, index / x);\n vec4 t = texelFetch (sampler, p, lod);\n\n return t;\n }\n\n // Math\n\n // Save normalize, that will not divide by zero.\n vec3\n save_normalize (const in vec3 vector)\n {\n float l = length (vector);\n\n if (l == 0.0)\n return vec3 (0.0);\n\n return vector / l;\n }\n\n // Quaternion\n\n vec4\n Quaternion (const in vec3 fromVector, const in vec3 toVector)\n {\n vec3 from = save_normalize (fromVector);\n vec3 to = save_normalize (toVector);\n\n float cos_angle = dot (from, to);\n vec3 cross_vec = cross (from, to);\n float cross_len = length (cross_vec);\n\n if (cross_len == 0.0)\n {\n if (cos_angle > 0.0)\n {\n return vec4 (0.0, 0.0, 0.0, 1.0);\n }\n else\n {\n vec3 t = cross (from, vec3 (1.0, 0.0, 0.0));\n\n if (dot (t, t) == 0.0)\n t = cross (from, vec3 (0.0, 1.0, 0.0));\n\n t = save_normalize (t);\n\n return vec4 (t, 0.0);\n }\n }\n else\n {\n float s = sqrt (abs (1.0 - cos_angle) * 0.5);\n\n cross_vec = save_normalize (cross_vec);\n\n return vec4 (cross_vec * s, sqrt (abs (1.0 + cos_angle) * 0.5));\n }\n }\n\n vec3\n multVecQuat (const in vec3 v, const in vec4 q)\n {\n float a = q .w * q .w - q .x * q .x - q .y * q .y - q .z * q .z;\n float b = 2.0 * (v .x * q .x + v .y * q .y + v .z * q .z);\n float c = 2.0 * q .w;\n vec3 r = a * v .xyz + b * q .xyz + c * (q .yzx * v .zxy - q .zxy * v .yzx);\n\n return r;\n }\n\n mat3\n Matrix3 (const in vec4 quaternion)\n {\n float x = quaternion .x;\n float y = quaternion .y;\n float z = quaternion .z;\n float w = quaternion .w;\n float A = y * y;\n float B = z * z;\n float C = x * y;\n float D = z * w;\n float E = z * x;\n float F = y * w;\n float G = x * x;\n float H = y * z;\n float I = x * w;\n\n return mat3 (1.0 - 2.0 * (A + B),\n 2.0 * (C + D),\n 2.0 * (E - F),\n 2.0 * (C - D),\n 1.0 - 2.0 * (B + G),\n 2.0 * (H + I),\n 2.0 * (E + F),\n 2.0 * (H - I),\n 1.0 - 2.0 * (A + G));\n }\n\n /* Random number generation */\n\n uint seed = 1u;\n\n void\n srand (const in int value)\n {\n seed = uint (value);\n }\n\n // Return a uniform distributed random floating point number in the interval [0, 1].\n float\n random ()\n {\n seed = seed * 1103515245u + 12345u;\n\n return float (seed) / 4294967295.0;\n }\n\n float\n getRandomValue (const in float min, const in float max)\n {\n return min + random () * (max - min);\n }\n\n float\n getRandomLifetime ()\n {\n float v = particleLifetime * lifetimeVariation;\n float min_ = max (0.0, particleLifetime - v);\n float max_ = particleLifetime + v;\n\n return getRandomValue (min_, max_);\n }\n\n float\n getRandomSpeed ()\n {\n float v = speed * variation;\n float min_ = max (0.0, speed - v);\n float max_ = speed + v;\n\n return getRandomValue (min_, max_);\n }\n\n vec3\n getRandomNormal ()\n {\n float theta = getRandomValue (-M_PI, M_PI);\n float cphi = getRandomValue (-1.0, 1.0);\n float r = sqrt (1.0 - cphi * cphi); // sin (acos (cphi));\n\n return vec3 (sin (theta) * r, cos (theta) * r, cphi);\n }\n\n vec3\n getRandomNormalWithAngle (const in float angle)\n {\n float theta = getRandomValue (-M_PI, M_PI);\n float cphi = getRandomValue (cos (angle), 1.0);\n float r = sqrt (1.0 - cphi * cphi); // sin (acos (cphi));\n\n return vec3 (sin (theta) * r, cos (theta) * r, cphi);\n }\n\n vec3\n getRandomNormalWithDirectionAndAngle (const in vec3 direction, const in float angle)\n {\n vec4 rotation = Quaternion (vec3 (0.0, 0.0, 1.0), direction);\n vec3 normal = getRandomNormalWithAngle (angle);\n\n return multVecQuat (normal, rotation);\n }\n\n vec3\n getRandomSurfaceNormal (const in vec3 direction)\n {\n float theta = getRandomValue (-M_PI, M_PI);\n float cphi = pow (random (), 1.0 / 3.0);\n float r = sqrt (1.0 - cphi * cphi); // sin (acos (cphi));\n vec3 normal = vec3 (sin (theta) * r, cos (theta) * r, cphi);\n vec4 rotation = Quaternion (vec3 (0.0, 0.0, 1.0), direction);\n\n return multVecQuat (normal, rotation);\n }\n\n vec3\n getRandomSphericalVelocity ()\n {\n vec3 normal = getRandomNormal ();\n float speed = getRandomSpeed ();\n\n return normal * speed;\n }\n\n // Algorithms\n\n int\n upperBound (const in sampler2D sampler, in int count, const in float value)\n {\n int first = 0;\n int step = 0;\n\n while (count > 0)\n {\n int index = first;\n\n step = count >> 1;\n\n index += step;\n\n if (value < texelFetch (sampler, index, 0) .x)\n {\n count = step;\n }\n else\n {\n first = ++ index;\n count -= step + 1;\n }\n }\n\n return first;\n }\n\n void\n interpolate (const in sampler2D sampler, const in int count, const in float fraction, out int index0, out int index1, out float weight)\n {\n // Determine index0, index1 and weight.\n\n if (count == 1 || fraction <= texelFetch (sampler, 0, 0) .x)\n {\n index0 = 0;\n index1 = 0;\n weight = 0.0;\n }\n else if (fraction >= texelFetch (sampler, count - 1, 0) .x)\n {\n index0 = count - 2;\n index1 = count - 1;\n weight = 1.0;\n }\n else\n {\n int index = upperBound (sampler, count, fraction);\n\n if (index < count)\n {\n index1 = index;\n index0 = index - 1;\n\n float key0 = texelFetch (sampler, index0, 0) .x;\n float key1 = texelFetch (sampler, index1, 0) .x;\n\n weight = clamp ((fraction - key0) / (key1 - key0), 0.0, 1.0);\n }\n else\n {\n index0 = 0;\n index1 = 0;\n weight = 0.0;\n }\n }\n }\n\n void\n interpolate (const in sampler2D sampler, const in int count, const in float fraction, out int index0)\n {\n // Determine index0.\n\n if (count == 1 || fraction <= texelFetch (sampler, 0, 0) .x)\n {\n index0 = 0;\n }\n else if (fraction >= texelFetch (sampler, count - 1, 0) .x)\n {\n index0 = count - 2;\n }\n else\n {\n int index = upperBound (sampler, count, fraction);\n\n if (index < count)\n index0 = index - 1;\n else\n index0 = 0;\n }\n }\n\n vec3\n getRandomBarycentricCoord ()\n {\n // Random barycentric coordinates.\n\n float u = random ();\n float v = random ();\n\n if (u + v > 1.0)\n {\n u = 1.0 - u;\n v = 1.0 - v;\n }\n\n float t = 1.0 - u - v;\n\n return vec3 (t, u, v);\n }\n\n void\n getRandomPointOnSurface (const in sampler2D surface, const in int verticesIndex, const in int normalsIndex, out vec4 position, out vec3 normal)\n {\n // Determine index0, index1 and weight.\n\n float lastAreaSoFar = texelFetch (surface, verticesIndex - 1, 0) .x;\n float fraction = random () * lastAreaSoFar;\n\n int index0;\n int index1;\n int index2;\n float weight;\n\n interpolate (surface, verticesIndex, fraction, index0, index1, weight);\n\n // Interpolate and return position.\n\n index0 *= 3;\n index1 = index0 + 1;\n index2 = index0 + 2;\n\n vec4 vertex0 = texelFetch (surface, verticesIndex + index0, 0);\n vec4 vertex1 = texelFetch (surface, verticesIndex + index1, 0);\n vec4 vertex2 = texelFetch (surface, verticesIndex + index2, 0);\n\n vec3 normal0 = texelFetch (surface, normalsIndex + index0, 0) .xyz;\n vec3 normal1 = texelFetch (surface, normalsIndex + index1, 0) .xyz;\n vec3 normal2 = texelFetch (surface, normalsIndex + index2, 0) .xyz;\n\n // Random barycentric coordinates.\n\n vec3 r = getRandomBarycentricCoord ();\n\n // Calculate position and direction.\n\n position = r .z * vertex0 + r .x * vertex1 + r .y * vertex2;\n normal = save_normalize (r .z * normal0 + r .x * normal1 + r .y * normal2);\n }\n\n // Functions\n\n ${this.functions.join("\n")}\n\n // Current values\n\n vec4\n getColor (const in float lifetime, const in float elapsedTime)\n {\n if (numColors > 0)\n {\n // Determine index0, index1 and weight.\n\n float fraction = elapsedTime / lifetime;\n\n int index0;\n int index1;\n float weight;\n\n interpolate (colorRamp, numColors, fraction, index0, index1, weight);\n\n // Interpolate and return color.\n\n vec4 color0 = texelFetch (colorRamp, numColors + index0, 0);\n vec4 color1 = texelFetch (colorRamp, numColors + index1, 0);\n\n return mix (color0, color1, weight);\n }\n else\n {\n return vec4 (1.0);\n }\n }\n\n void\n bounce (const in vec4 fromPosition, inout vec4 toPosition, inout vec3 velocity)\n {\n if (boundedHierarchyRoot < 0)\n return;\n\n Line3 line = Line3 (fromPosition .xyz, save_normalize (velocity));\n\n vec4 points [ARRAY_SIZE];\n vec3 normals [ARRAY_SIZE];\n\n int numIntersections = getIntersections (boundedVolume, boundedVerticesIndex, boundedNormalsIndex, boundedHierarchyIndex, boundedHierarchyRoot, line, points, normals);\n\n if (numIntersections == 0)\n return;\n\n Plane3 plane1 = plane3 (line .point, line .direction);\n\n int index = min_index (points, numIntersections, 0.0, plane1);\n\n if (index == -1)\n return;\n\n Plane3 plane2 = plane3 (points [index] .xyz, normals [index]);\n\n if (sign (plane_distance (plane2, fromPosition .xyz)) == sign (plane_distance (plane2, toPosition .xyz)))\n return;\n\n velocity = reflect (velocity, normals [index]);\n toPosition = vec4 (points [index] .xyz + reflect (points [index] .xyz - fromPosition .xyz, normals [index]), 1.0);\n }\n\n int\n getTexCoordIndex0 (const in float lifetime, const in float elapsedTime)\n {\n if (numTexCoords == 0)\n {\n return -1;\n }\n else\n {\n float fraction = elapsedTime / lifetime;\n int index0 = 0;\n\n interpolate (texCoordRamp, numTexCoords, fraction, index0);\n\n return numTexCoords + index0 * texCoordCount;\n }\n }\n\n void\n main ()\n {\n int life = int (input0 [0]);\n float lifetime = input0 [1];\n float elapsedTime = input0 [2] + deltaTime;\n\n srand ((gl_VertexID + randomSeed) * randomSeed);\n\n if (elapsedTime > lifetime)\n {\n // Create new particle or hide particle.\n\n lifetime = getRandomLifetime ();\n elapsedTime = 0.0;\n\n output0 = vec4 (max (life + 1, 1), lifetime, elapsedTime, getTexCoordIndex0 (lifetime, elapsedTime));\n\n if (createParticles)\n {\n output1 = getColor (lifetime, elapsedTime);\n output2 = vec4 (getRandomVelocity (), 0.0);\n output6 = getRandomPosition ();\n }\n else\n {\n output1 = vec4 (0.0);\n output2 = vec4 (0.0);\n output6 = vec4 (NaN);\n }\n }\n else\n {\n // Animate particle.\n\n vec3 velocity = input2 .xyz;\n vec4 position = input6;\n\n for (int i = 0; i < numForces; ++ i)\n {\n vec4 force = texelFetch (forces, i, 0);\n float turbulence = force .w;\n vec3 normal = getRandomNormalWithDirectionAndAngle (force .xyz, turbulence);\n float speed = length (force .xyz);\n\n velocity += normal * speed;\n }\n\n position .xyz += velocity * deltaTime;\n\n bounce (input6, position, velocity);\n\n output0 = vec4 (life, lifetime, elapsedTime, getTexCoordIndex0 (lifetime, elapsedTime));\n output1 = getColor (lifetime, elapsedTime);\n output2 = vec4 (velocity, 0.0);\n output6 = position;\n }\n\n switch (geometryType)\n {\n case POINT:\n case SPRITE:\n case GEOMETRY:\n {\n output3 = vec4 (1.0, 0.0, 0.0, 0.0);\n output4 = vec4 (0.0, 1.0, 0.0, 0.0);\n output5 = vec4 (0.0, 0.0, 1.0, 0.0);\n break;\n }\n case LINE:\n {\n mat3 r = Matrix3 (Quaternion (vec3 (0.0, 0.0, 1.0), output2 .xyz));\n mat3 s = mat3 (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, particleSize .y);\n mat3 m = r * s;\n\n output3 = vec4 (m [0], 0.0);\n output4 = vec4 (m [1], 0.0);\n output5 = vec4 (m [2], 0.0);\n break;\n }\n default: // QUAD, TRIANGLE\n {\n output3 = vec4 (particleSize .x, 0.0, 0.0, 0.0);\n output4 = vec4 (0.0, particleSize .y, 0.0, 0.0);\n output5 = vec4 (0.0, 0.0, 1.0, 0.0);\n break;\n }\n }\n }\n `,i=t.createShader(t.VERTEX_SHADER);t.shaderSource(i,n),t.compileShader(i);const o=t.createShader(t.FRAGMENT_SHADER);t.shaderSource(o,"#version 300 es\n\n precision highp float;\n\n void\n main () { }\n "),t.compileShader(o);const r=t.createProgram();t.attachShader(r,i),t.attachShader(r,o),t.transformFeedbackVaryings(r,Array.from({length:7},((e,t)=>"output"+t)),t.INTERLEAVED_ATTRIBS),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||console.error("Couldn't initialize particle shader: "+t.getProgramInfoLog(r)),r.inputs=[[0,t.getAttribLocation(r,"input0")],[2,t.getAttribLocation(r,"input2")],[6,t.getAttribLocation(r,"input6")]],r.randomSeed=t.getUniformLocation(r,"randomSeed"),r.geometryType=t.getUniformLocation(r,"geometryType"),r.createParticles=t.getUniformLocation(r,"createParticles"),r.particleLifetime=t.getUniformLocation(r,"particleLifetime"),r.lifetimeVariation=t.getUniformLocation(r,"lifetimeVariation"),r.deltaTime=t.getUniformLocation(r,"deltaTime"),r.particleSize=t.getUniformLocation(r,"particleSize"),r.numForces=t.getUniformLocation(r,"numForces"),r.forces=t.getUniformLocation(r,"forces"),r.boundedVerticesIndex=t.getUniformLocation(r,"boundedVerticesIndex"),r.boundedNormalsIndex=t.getUniformLocation(r,"boundedNormalsIndex"),r.boundedHierarchyIndex=t.getUniformLocation(r,"boundedHierarchyIndex"),r.boundedHierarchyRoot=t.getUniformLocation(r,"boundedHierarchyRoot"),r.boundedVolume=t.getUniformLocation(r,"boundedVolume"),r.numColors=t.getUniformLocation(r,"numColors"),r.colorRamp=t.getUniformLocation(r,"colorRamp"),r.texCoordCount=t.getUniformLocation(r,"texCoordCount"),r.numTexCoords=t.getUniformLocation(r,"numTexCoords"),r.texCoordRamp=t.getUniformLocation(r,"texCoordRamp");for(const e of Object.keys(this.uniforms))r[e]=t.getUniformLocation(r,e);r.NaN=t.getUniformLocation(r,"NaN"),t.useProgram(r);for(const n of this.samplers){const i=t.getUniformLocation(r,n);t.uniform1i(i,r[n+"TextureUnit"]=e.getTexture2DUnit())}return t.uniform1f(r.NaN,NaN),e.resetTextureUnits(),r},activateTextures(){},createTexture(){const e=this.getBrowser().getContext(),t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,1,1,0,e.RGBA,e.FLOAT,new Float32Array(4)),t},getTexture2DUnit(e,t,n){const i=t[n];return void 0===i?t[n]=e.getTexture2DUnit():i}}),Object.defineProperties(F,{typeName:{value:"X3DParticleEmitterNode",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0}});const E=F;m().set("x_ite/Components/ParticleSystems/X3DParticleEmitterNode",E);const S=E,A=window[Symbol.for("X_ITE.X3D-8.8.1")].require("standard/Math/Numbers/Vector3");var P=n.n(A);function N(e){S.call(this,e),this.addType(_().PointEmitter),this._position.setUnit("length"),this.addUniform("position","uniform vec3 position;"),this.addUniform("direction","uniform vec3 direction;"),this.addFunction("vec3 getRandomVelocity ()\n {\n if (direction == vec3 (0.0))\n return getRandomSphericalVelocity ();\n\n else\n return direction * getRandomSpeed ();\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n return vec4 (position, 1.0);\n }")}Object.assign(Object.setPrototypeOf(N.prototype,S.prototype),{initialize(){S.prototype.initialize.call(this),this.getBrowser().getContext().getVersion()<2||(this._position.addInterest("set_position__",this),this._direction.addInterest("set_direction__",this),this.set_position__(),this.set_direction__())},set_position__(){const e=this._position.getValue();this.setUniform("uniform3f","position",e.x,e.y,e.z)},set_direction__:function(){const e=new(P())(0,0,0);return function(){e.assign(this._direction.getValue()).normalize(),this.setUniform("uniform3f","direction",e.x,e.y,e.z)}}()}),Object.defineProperties(N,{typeName:{value:"PointEmitter",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"emitter",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"position",new(o().SFVec3f)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)(0,1,0)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat))]),enumerable:!0}});const O=N;m().set("x_ite/Components/ParticleSystems/PointEmitter",O);const C=O,D=Symbol();Symbol();function V(){}Object.assign(V.prototype,{getDefaultEmitter(){return this[D]=new C(this.getPrivateScene()),this[D].setPrivate(!0),this[D].setup(),this.getDefaultEmitter=function(){return this[D]},Object.defineProperty(this,"getDefaultEmitter",{enumerable:!1}),this[D]}});const B=V;m().set("x_ite/Browser/ParticleSystems/X3DParticleSystemsContext",B);const z=B;function U(e){u().call(this,e),this.addType(_().X3DParticlePhysicsModelNode)}Object.assign(Object.setPrototypeOf(U.prototype,u().prototype),{addForce(){}}),Object.defineProperties(U,{typeName:{value:"X3DParticlePhysicsModelNode",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0}});const M=U;m().set("x_ite/Components/ParticleSystems/X3DParticlePhysicsModelNode",M);const L=M,X=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Base/X3DCast");var j=n.n(X);function q(e){L.call(this,e),this.addType(_().BoundedPhysicsModel)}Object.assign(Object.setPrototypeOf(q.prototype,L.prototype),{initialize(){L.prototype.initialize.call(this),this._geometry.addInterest("set_geometry__",this),this.set_geometry__()},set_geometry__(){this.geometryNode&&this.geometryNode._rebuild.removeInterest("addNodeEvent",this),this.geometryNode=j()(_().X3DGeometryNode,this._geometry),this.geometryNode&&this.geometryNode._rebuild.addInterest("addNodeEvent",this)},addGeometry(e,t){if(this.geometryNode&&this._enabled.getValue()){const n=this.geometryNode.getNormals().getValue(),i=this.geometryNode.getVertices().getValue();for(const t of n)e.push(t);for(const e of i)t.push(e)}}}),Object.defineProperties(q,{typeName:{value:"BoundedPhysicsModel",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"physics",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"enabled",new(o().SFBool)(!0)),new(s())(_().inputOutput,"geometry",new(o().SFNode))]),enumerable:!0}});const k=q;m().set("x_ite/Components/ParticleSystems/BoundedPhysicsModel",k);const G=k;function H(e){S.call(this,e),this.addType(_().ConeEmitter),this._position.setUnit("length"),this._angle.setUnit("angle"),this.addUniform("position","uniform vec3 position;"),this.addUniform("direction","uniform vec3 direction;"),this.addUniform("angle","uniform float angle;"),this.addFunction("vec3 getRandomVelocity ()\n {\n if (direction == vec3 (0.0))\n {\n return getRandomSphericalVelocity ();\n }\n else\n {\n vec3 normal = getRandomNormalWithDirectionAndAngle (direction, angle);\n float speed = getRandomSpeed ();\n\n return normal * speed;\n }\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n return vec4 (position, 1.0);\n }")}Object.assign(Object.setPrototypeOf(H.prototype,S.prototype),{initialize(){S.prototype.initialize.call(this),this.getBrowser().getContext().getVersion()<2||(this._position.addInterest("set_position__",this),this._direction.addInterest("set_direction__",this),this._angle.addInterest("set_angle__",this),this.set_position__(),this.set_direction__(),this.set_angle__())},set_position__(){const e=this._position.getValue();this.setUniform("uniform3f","position",e.x,e.y,e.z)},set_direction__(){const e=this._direction.getValue();this.setUniform("uniform3f","direction",e.x,e.y,e.z)},set_angle__(){this.setUniform("uniform1f","angle",this._angle.getValue())}}),Object.defineProperties(H,{typeName:{value:"ConeEmitter",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"emitter",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"position",new(o().SFVec3f)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)(0,1,0)),new(s())(_().inputOutput,"angle",new(o().SFFloat)(.7854)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat))]),enumerable:!0}});const Y=H;m().set("x_ite/Components/ParticleSystems/ConeEmitter",Y);const W=Y;function K(e){S.call(this,e),this.addType(_().ExplosionEmitter),this._position.setUnit("length"),this.addUniform("position","uniform vec3 position;"),this.addFunction("vec3 getRandomVelocity ()\n {\n return getRandomSphericalVelocity ();\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n return vec4 (position, 1.0);\n }")}Object.assign(Object.setPrototypeOf(K.prototype,S.prototype),{initialize(){S.prototype.initialize.call(this),this.getBrowser().getContext().getVersion()<2||(this._position.addInterest("set_position__",this),this.set_position__())},isExplosive:()=>!0,set_position__(){const e=this._position.getValue();this.setUniform("uniform3f","position",e.x,e.y,e.z)}}),Object.defineProperties(K,{typeName:{value:"ExplosionEmitter",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"emitter",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"position",new(o().SFVec3f)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat))]),enumerable:!0}});const Z=K;m().set("x_ite/Components/ParticleSystems/ExplosionEmitter",Z);const Q=Z;function $(e){L.call(this,e),this.addType(_().ForcePhysicsModel),this._force.setUnit("force")}Object.assign(Object.setPrototypeOf($.prototype,L.prototype),{addForce:function(){const e=new(P())(0,0,0);return function(t,n,i,o){return!!this._enabled.getValue()&&(o.set(e.assign(this._force.getValue()).multiply(i),4*t),o[4*t+3]=0,!0)}}()}),Object.defineProperties($,{typeName:{value:"ForcePhysicsModel",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"physics",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"enabled",new(o().SFBool)(!0)),new(s())(_().inputOutput,"force",new(o().SFVec3f)(0,-9.8,0))]),enumerable:!0}});const J=$;m().set("x_ite/Components/ParticleSystems/ForcePhysicsModel",J);const ee=J,te=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Components/Shape/X3DShapeNode");var ne=n.n(te);const ie=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Browser/Rendering/GeometryContext");var oe=n.n(ie);const re=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Rendering/VertexArray");var se=n.n(re);const ae=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Rendering/TraverseType");var ce=n.n(ae);const le=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Browser/Shape/AlphaMode");var ue=n.n(le);const de=window[Symbol.for("X_ITE.X3D-8.8.1")].require("standard/Math/Numbers/Matrix4");var me=n.n(de);const he=window[Symbol.for("X_ITE.X3D-8.8.1")].require("standard/Math/Numbers/Matrix3");var pe=n.n(he);const fe=window[Symbol.for("X_ITE.X3D-8.8.1")].require("standard/Math/Geometry/Plane3");var xe=n.n(fe);function _e(e,t){this.array=e,t&&(this.compare=t)}Object.assign(_e.prototype,{compare:(e,t)=>e<t,sort(e,t){t-e>1&&this.quicksort(e,t-1)},quicksort(e,t){let n=e,i=t;const{array:o,compare:r}=this,s=o[e+t>>>1];for(;;){for(;r(o[n],s);)++n;for(;r(s,o[i]);)--i;if(!(n<i)){n===i&&(++n,--i);break}{const e=o[n];o[n]=o[i],o[i]=e,n++,i--}}e<i&&this.quicksort(e,i),n<t&&this.quicksort(n,t)}});const ye=_e;m().set("standard/Math/Algorithms/QuickSort",ye);const ge=ye,ve=new(P())(0,0,0),be=new(P())(0,0,0),Te=new(P())(0,0,0),we={u:0,v:0,t:0},Re=[new(P())(0,0,1),new(P())(0,0,-1),new(P())(0,1,0),new(P())(0,-1,0),new(P())(1,0,0)];function Ie(e,t){this.vertices=e.vertices,this.normals=e.normals,this.triangle=t,this.i4=12*t,this.i3=9*t}function Fe(e,t,n,i){this.min=new(P())(0,0,0),this.max=new(P())(0,0,0),this.planes=[],this.intersection=new(P())(0,0,0);const o=e.vertices,r=this.min,s=this.max,a=n+i;let c=12*t[n];r.set(o[c],o[c+1],o[c+2]),s.assign(r);for(let e=n;e<a;++e)c=12*t[e],ve.set(o[c],o[c+1],o[c+2]),be.set(o[c+4],o[c+5],o[c+6]),Te.set(o[c+8],o[c+9],o[c+10]),r.min(ve,be,Te),s.max(ve,be,Te);for(let e=0;e<5;++e)this.planes[e]=new(xe())(e%2?r:s,Re[e]);if(i>2){e.sorter.compare.axis=this.getLongestAxis(r,s),e.sorter.sort(n,a);var l=i>>>1}else l=1;const u=i-l;this.left=l>1?new Fe(e,t,n,l):new Ie(e,t[n]),this.right=u>1?new Fe(e,t,n+l,u):new Ie(e,t[n+l])}function Ee(e,t){const n=e.length/12;switch(this.vertices=e,this.normals=t,n){case 0:this.root=null;break;case 1:this.root=new Ie(this,0);break;default:{const t=[];for(let e=0;e<n;++e)t.push(e);this.sorter=new ge(t,function(e,t){return function(n,i){return Math.min(e[n+t],e[n+4+t],e[n+8+t])<Math.min(e[i+t],e[i+4+t],e[i+8+t])}}(e,0)),this.root=new Fe(this,t,0,n);break}}}Object.assign(Ie.prototype,{intersectsLine(e,t,n){const i=this.vertices,o=this.normals,r=this.i4,s=this.i3;if(ve.x=i[r],ve.y=i[r+1],ve.z=i[r+2],be.x=i[r+4],be.y=i[r+5],be.z=i[r+6],Te.x=i[r+8],Te.y=i[r+9],Te.z=i[r+10],e.intersectsTriangle(ve,be,Te,we)){const e=we.u,a=we.v,c=1-e-a,l=t.size++;l>=t.length&&t.push(new(P())(0,0,0)),t[l].set(c*i[r]+e*i[r+4]+a*i[r+8],c*i[r+1]+e*i[r+5]+a*i[r+9],c*i[r+2]+e*i[r+6]+a*i[r+10]),n&&(l>=n.length&&n.push(new(P())(0,0,0)),n[l].set(c*o[s]+e*o[s+3]+a*o[s+6],c*o[s+1]+e*o[s+4]+a*o[s+7],c*o[s+2]+e*o[s+5]+a*o[s+8]))}},toArray(e){const t=e.length/4;return e.push(1,3*this.triangle,0,0),t}}),Object.assign(Fe.prototype,{intersectsLine(e,t,n){this.intersectsBBox(e)&&(this.left.intersectsLine(e,t,n),this.right.intersectsLine(e,t,n))},intersectsBBox(e){const t=this.planes,n=this.min,i=this.max,o=n.x,r=i.x,s=n.y,a=i.y,c=n.z,l=i.z,u=this.intersection;return!!(t[0].intersectsLine(e,u)&&u.x>=o&&u.x<=r&&u.y>=s&&u.y<=a)||(!!(t[1].intersectsLine(e,u)&&u.x>=o&&u.x<=r&&u.y>=s&&u.y<=a)||(!!(t[2].intersectsLine(e,u)&&u.x>=o&&u.x<=r&&u.z>=c&&u.z<=l)||(!!(t[3].intersectsLine(e,u)&&u.x>=o&&u.x<=r&&u.z>=c&&u.z<=l)||!!(t[4].intersectsLine(e,u)&&u.y>=s&&u.y<=a&&u.z>=c&&u.z<=l))))},getLongestAxis(e,t){const n=t.x-e.x,i=t.y-e.y,o=t.z-e.z;return n<i?i<o?2:1:n<o?2:0},toArray(e){const t=this.left.toArray(e),n=this.right.toArray(e),i=this.min,o=this.max,r=e.length/4;return e.push(0,t,n,0,i.x,i.y,i.z,0,o.x,o.y,o.z,0),r}}),Object.assign(Ee.prototype,{intersectsLine(e,t,n){return t.size=0,this.root?(this.root.intersectsLine(e,t,n),t.size):0},toArray(e){if(this.root){const t=this.root.toArray(e);e.push(t,0,0,0)}return e}});const Se=Ee;m().set("standard/Math/Utility/BVH",Se);const Ae=Se;var Pe=n(355);const Ne=new Float32Array([0,0,0,1]),Oe=new Float32Array([0,0,0,1,1,0,0,1,0,0,-.5,1,0,0,.5,1]),Ce=new Float32Array([0,0,0,1,1,0,0,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,0,1,0,0,1,-.5,-.5,0,1,.5,-.5,0,1,.5,.5,0,1,-.5,-.5,0,1,.5,.5,0,1,-.5,.5,0,1]);function De(e){ne().call(this,e),this.addType(_().ParticleSystem),this._particleSize.setUnit("length"),e.getSpecificationVersion()<4&&(this.addAlias("colorRamp",this._color),this.addAlias("texCoordRamp",this._texCoord));const t=this.getBrowser();this.maxParticles=0,this.numParticles=0,this.forcePhysicsModelNodes=[],this.forces=new Float32Array(4),this.boundedPhysicsModelNodes=[],this.boundedNormals=[],this.boundedVertices=[],this.colorRamp=new Float32Array,this.texCoordRamp=new Float32Array,this.geometryContext=new(oe())({textureCoordinateNode:t.getDefaultTextureCoordinate()}),this.creationTime=0,this.pauseTime=0,this.deltaTime=0,this.particleStride=7*Float32Array.BYTES_PER_ELEMENT*4,this.particleOffsets=Array.from({length:7},((e,t)=>4*Float32Array.BYTES_PER_ELEMENT*t)),this.particleOffset=this.particleOffsets[0],this.colorOffset=this.particleOffsets[1],this.matrixOffset=this.particleOffsets[3],this.texCoordOffset=0}Object.assign(Object.setPrototypeOf(De.prototype,ne().prototype),{initialize(){ne().prototype.initialize.call(this);const e=this.getBrowser(),t=e.getContext();e.getContext().getVersion()<2||(this.getLive().addInterest("set_live__",this),this._enabled.addInterest("set_enabled__",this),this._createParticles.addInterest("set_createParticles__",this),this._geometryType.addInterest("set_geometryType__",this),this._geometryType.addInterest("set_texCoord__",this),this._maxParticles.addInterest("set_enabled__",this),this._particleLifetime.addInterest("set_particleLifetime__",this),this._lifetimeVariation.addInterest("set_lifetimeVariation__",this),this._emitter.addInterest("set_emitter__",this),this._physics.addInterest("set_physics__",this),this._colorKey.addInterest("set_color__",this),this._color.addInterest("set_colorRamp__",this),this._texCoordKey.addInterest("set_texCoord__",this),this._texCoord.addInterest("set_texCoordRamp__",this),this.inputParticles=this.createBuffer(),this.outputParticles=this.createBuffer(),this.inputParticles.vertexArrayObject=new(se())(t),this.outputParticles.vertexArrayObject=new(se())(t),this.forcesTexture=this.createTexture(),this.boundedTexture=this.createTexture(),this.colorRampTexture=this.createTexture(),this.texCoordRampTexture=this.createTexture(),this.geometryBuffer=this.createBuffer(),this.texCoordBuffers=new Array(e.getMaxTextures()).fill(this.geometryBuffer),this.set_emitter__(),this.set_enabled__(),this.set_geometryType__(),this.set_createParticles__(),this.set_particleLifetime__(),this.set_lifetimeVariation__(),this.set_physics__(),this.set_colorRamp__(),this.set_texCoordRamp__())},getShapeKey(){return this.numTexCoords?2:1},getGeometryContext(){return this.geometryType===f.GEOMETRY?this.getGeometry():this.geometryContext},set_bbox__(){this._bboxSize.getValue().equals(this.getDefaultBBoxSize())?this.bbox.set():this.bbox.set(this._bboxSize.getValue(),this._bboxCenter.getValue()),this.bboxSize.assign(this.bbox.size),this.bboxCenter.assign(this.bbox.center)},set_transparent__(){if(this.getAppearance().getAlphaMode()===ue().AUTO)if(this.geometryType===f.POINT)this.setTransparent(!0);else this.setTransparent(!!(this.getAppearance().isTransparent()||this.colorRampNode?.isTransparent()||this.geometryType===f.GEOMETRY&&this.geometryNode?.isTransparent()));else this.setTransparent(this.getAppearance().isTransparent())},set_live__(){this.getLive().getValue()?this._isActive.getValue()&&this._maxParticles.getValue()&&(this.getBrowser().sensorEvents().addInterest("animateParticles",this),this.pauseTime&&(this.creationTime+=Date.now()/1e3-this.pauseTime,this.pauseTime=0)):this._isActive.getValue()&&this._maxParticles.getValue()&&(this.getBrowser().sensorEvents().removeInterest("animateParticles",this),0===this.pauseTime&&(this.pauseTime=Date.now()/1e3))},set_enabled__(){this._enabled.getValue()&&this._maxParticles.getValue()?this._isActive.getValue()||(this.getLive().getValue()?(this.getBrowser().sensorEvents().addInterest("animateParticles",this),this.pauseTime=0):this.pauseTime=Date.now()/1e3,this._isActive=!0,delete this.traverse):this._isActive.getValue()&&(this.getLive().getValue()&&this.getBrowser().sensorEvents().removeInterest("animateParticles",this),this._isActive=!1,this.numParticles=0,this.traverse=Function.prototype),this.set_maxParticles__()},set_createParticles__(){this.createParticles=this._createParticles.getValue()},set_geometryType__(){const e=this.getBrowser().getContext();switch(this.geometryType=Pe.enum(f,this._geometryType.getValue(),f.QUAD),this.geometryType){case f.POINT:this.geometryContext.geometryType=0,this.geometryContext.hasNormals=!1,this.texCoordCount=0,this.vertexCount=1,this.hasNormals=!1,this.verticesOffset=0,this.primitiveMode=e.POINTS,e.bindBuffer(e.ARRAY_BUFFER,this.geometryBuffer),e.bufferData(e.ARRAY_BUFFER,Ne,e.DYNAMIC_DRAW);break;case f.LINE:this.geometryContext.geometryType=1,this.geometryContext.hasNormals=!1,this.texCoordCount=2,this.vertexCount=2,this.hasNormals=!1,this.texCoordsOffset=0,this.verticesOffset=8*Float32Array.BYTES_PER_ELEMENT,this.primitiveMode=e.LINES,e.bindBuffer(e.ARRAY_BUFFER,this.geometryBuffer),e.bufferData(e.ARRAY_BUFFER,Oe,e.DYNAMIC_DRAW);break;case f.TRIANGLE:case f.QUAD:case f.SPRITE:this.geometryContext.geometryType=2,this.geometryContext.hasNormals=!0,this.texCoordCount=4,this.vertexCount=6,this.hasNormals=!0,this.texCoordsOffset=0,this.normalOffset=24*Float32Array.BYTES_PER_ELEMENT,this.verticesOffset=27*Float32Array.BYTES_PER_ELEMENT,this.primitiveMode=e.TRIANGLES,e.bindBuffer(e.ARRAY_BUFFER,this.geometryBuffer),e.bufferData(e.ARRAY_BUFFER,Ce,e.DYNAMIC_DRAW);break;case f.GEOMETRY:this.texCoordCount=0}this.geometryContext.updateGeometryKey(),this.updateVertexArrays(),this.set_transparent__()},set_maxParticles__(){const e=this.numParticles,t=Math.max(0,this._maxParticles.getValue());this.maxParticles=t,this.numParticles=Math.min(e,t),this.emitterNode.isExplosive()||(this.creationTime=Date.now()/1e3),this.resizeBuffers(e),this.updateVertexArrays()},set_particleLifetime__(){this.particleLifetime=this._particleLifetime.getValue()},set_lifetimeVariation__(){this.lifetimeVariation=this._lifetimeVariation.getValue()},set_emitter__(){this.emitterNode=j()(_().X3DParticleEmitterNode,this._emitter),this.emitterNode||(this.emitterNode=this.getBrowser().getDefaultEmitter()),this.createParticles=this._createParticles.getValue()},set_physics__(){const e=this._physics.getValue(),t=this.forcePhysicsModelNodes,n=this.boundedPhysicsModelNodes;for(let e=0,t=n.length;e<t;++e)n[e].removeInterest("set_boundedPhysics__",this);t.length=0,n.length=0;for(let i=0,o=e.length;i<o;++i)try{const o=e[i].getValue().getInnerNode(),r=o.getType();for(let e=r.length-1;e>=0;--e){switch(r[e]){case _().ForcePhysicsModel:case _().WindPhysicsModel:t.push(o);break;case _().BoundedPhysicsModel:o.addInterest("set_boundedPhysics__",this),n.push(o);break;default:continue}break}}catch{}this.set_boundedPhysics__()},set_boundedPhysics__(){const e=this.getBrowser().getContext(),t=this.boundedPhysicsModelNodes,n=this.boundedNormals,i=this.boundedVertices;n.length=0,i.length=0;for(let e=0,o=t.length;e<o;++e)t[e].addGeometry(n,i);const o=new Ae(i,n).toArray([]),r=i.length/4,s=n.length/3,a=o.length/4,c=Math.ceil(Math.sqrt(r+s+a)),l=new Float32Array(c*c*4);this.boundedVerticesIndex=0,this.boundedNormalsIndex=r,this.boundedHierarchyIndex=this.boundedNormalsIndex+s,this.boundedHierarchyRoot=this.boundedHierarchyIndex+a-1,l.set(i);for(let e=4*this.boundedNormalsIndex,t=0,i=n.length;t<i;e+=4,t+=3)l[e+0]=n[t+0],l[e+1]=n[t+1],l[e+2]=n[t+2];l.set(o,4*this.boundedHierarchyIndex),c&&(e.bindTexture(e.TEXTURE_2D,this.boundedTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,c,c,0,e.RGBA,e.FLOAT,l))},set_colorRamp__(){this.colorRampNode&&this.colorRampNode.removeInterest("set_color__",this),this.colorRampNode=j()(_().X3DColorNode,this._color),this.colorRampNode&&this.colorRampNode.addInterest("set_color__",this),this.set_color__(),this.set_transparent__()},set_color__(){const e=this.getBrowser().getContext(),t=this._colorKey,n=t.length,i=Math.ceil(Math.sqrt(2*n));let o=this.colorRamp;i*i*4>o.length&&(o=this.colorRamp=new Float32Array(i*i*4));for(let e=0;e<n;++e)o[4*e]=t[e];this.colorRampNode?o.set(this.colorRampNode.addColors([],n).slice(0,4*n),4*n):o.fill(1,4*n),i&&(e.bindTexture(e.TEXTURE_2D,this.colorRampTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,i,i,0,e.RGBA,e.FLOAT,o)),this.numColors=n,this.geometryContext.colorMaterial=!(!n||!this.colorRampNode),this.geometryContext.updateGeometryKey(),this.updateVertexArrays()},set_texCoordRamp__(){this.texCoordRampNode&&this.texCoordRampNode.removeInterest("set_texCoord__",this),this.texCoordRampNode=j()(_().X3DTextureCoordinateNode,this._texCoord),this.texCoordRampNode&&this.texCoordRampNode.addInterest("set_texCoord__",this),this.set_texCoord__()},set_texCoord__(){const e=this.getBrowser().getContext(),t=this._texCoordKey,n=t.length,i=Math.ceil(Math.sqrt(n+n*this.texCoordCount));let o=this.texCoordRamp;i*i*4>o.length?o=this.texCoordRamp=new Float32Array(i*i*4):o.fill(0);for(let e=0;e<n;++e)o[4*e]=t[e];this.texCoordRampNode&&o.set(this.texCoordRampNode.getPoints([]).slice(0,n*this.texCoordCount*4),4*n),i&&(e.bindTexture(e.TEXTURE_2D,this.texCoordRampTexture),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,i,i,0,e.RGBA,e.FLOAT,o)),this.numTexCoords=this.texCoordRampNode?n:0,this.updateVertexArrays()},updateVertexArrays(){this.inputParticles.vertexArrayObject.update(),this.outputParticles.vertexArrayObject.update()},createTexture(){const e=this.getBrowser().getContext(),t=e.createTexture();return e.bindTexture(e.TEXTURE_2D,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,e.RGBA32F,1,1,0,e.RGBA,e.FLOAT,new Float32Array(4)),t},createBuffer(){const e=this.getBrowser().getContext(),t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Uint32Array,e.DYNAMIC_DRAW),t},resizeBuffers(e){const t=this.getBrowser().getContext(),n=this.maxParticles,i=this.particleStride,o=Object.assign(t.createBuffer(),this.outputParticles),r=new Uint8Array(n*i);t.bindBuffer(t.ARRAY_BUFFER,this.inputParticles),t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.bindBuffer(t.COPY_READ_BUFFER,this.outputParticles),t.bindBuffer(t.ARRAY_BUFFER,o),t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.copyBufferSubData(t.COPY_READ_BUFFER,t.ARRAY_BUFFER,0,0,Math.min(n*i,e*i)),t.deleteBuffer(this.outputParticles),this.outputParticles=o},animateParticles(){const e=this.getBrowser(),t=e.getContext(),n=this.emitterNode,i=1/Math.max(10,this.getBrowser().getCurrentFrameRate());let o=this.deltaTime=(14*this.deltaTime+i)/15;if(n.isExplosive()){const e=Date.now()/1e3,t=this.particleLifetime+this.particleLifetime*this.lifetimeVariation;e-this.creationTime>t?(this.creationTime=e,this.numParticles=this.maxParticles,this.createParticles=this._createParticles.getValue(),o=Number.POSITIVE_INFINITY):this.createParticles=!1}else if(this.numParticles<this.maxParticles){const e=Date.now()/1e3,t=Math.max(0,Math.floor((e-this.creationTime)*this.maxParticles/this.particleLifetime));t&&(this.creationTime=e),this.numParticles=Math.min(this.maxParticles,this.numParticles+t)}if(n.getMass()){const e=this.forcePhysicsModelNodes;let i=e.length,r=this.forces,s=o/n.getMass();4*i>r.length&&(r=this.forces=new Float32Array(4*i));let a=0;for(let t=0;t<i;++t)a+=!e[t].addForce(t-a,n,s,r);this.numForces=i-=a,i&&(t.bindTexture(t.TEXTURE_2D,this.forcesTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA32F,i,1,0,t.RGBA,t.FLOAT,r))}else this.numForces=0;const r=this.outputParticles;this.outputParticles=this.inputParticles,this.inputParticles=r,n.animate(this,o),e.addBrowserEvent()},updateSprite:function(){const e=new Float32Array(Ce),t=[new(P())(-.5,-.5,0),new(P())(.5,-.5,0),new(P())(.5,.5,0),new(P())(-.5,-.5,0),new(P())(.5,.5,0),new(P())(-.5,.5,0)],n=new(P())(0,0,0),i=new(P())(0,0,0);return function(o,r){for(let t=0;t<3;++t)e[24+t]=r[6+t];i.set(this._particleSize.x,this._particleSize.y,1);for(let o=0;o<6;++o){const s=27+4*o;r.multVecMatrix(n.assign(t[o]).multVec(i)),e[s+0]=n.x,e[s+1]=n.y,e[s+2]=n.z}o.bindBuffer(o.ARRAY_BUFFER,this.geometryBuffer),o.bufferData(o.ARRAY_BUFFER,e,o.DYNAMIC_DRAW)}}(),intersectsBox(e,t){},traverse(e,t){switch(e){case ce().POINTER:t.addPointingShape(this);break;case ce().PICKING:case ce().COLLISION:break;case ce().SHADOW:this._castShadow.getValue()&&t.addShadowShape(this);break;case ce().DISPLAY:t.addDisplayShape(this)&&this.getAppearance().traverse(e,t)}this.geometryType===f.GEOMETRY&&this.getGeometry()&&this.getGeometry().traverse(e,t)},displaySimple(e,t,n){if(this.numParticles)switch(this.geometryType){case f.GEOMETRY:{const t=this.getGeometry();t&&t.displaySimpleParticles(e,n,this);break}case f.SPRITE:this.updateSprite(e,this.getScreenAlignedRotation(t.modelViewMatrix));default:{const t=this.outputParticles;if(t.vertexArrayObject.enable(n)){const i=this.particleStride;n.enableParticleAttribute(e,t,i,this.particleOffset,1),n.enableParticleMatrixAttribute(e,t,i,this.matrixOffset,1),n.enableVertexAttribute(e,this.geometryBuffer,0,this.verticesOffset)}e.drawArraysInstanced(this.primitiveMode,0,this.vertexCount,this.numParticles);break}}},display(e,t){switch(this.geometryType){case f.GEOMETRY:if(this.numParticles){const n=this.getGeometry();n&&n.displayParticles(e,t,this)}break;case f.SPRITE:this.updateSprite(e,this.getScreenAlignedRotation(t.modelViewMatrix));case f.QUAD:case f.TRIANGLE:{const n=me().prototype.determinant3.call(t.modelViewMatrix)>0;e.frontFace(n?e.CCW:e.CW),e.enable(e.CULL_FACE),e.cullFace(e.BACK)}default:{const n=this.getBrowser(),i=this.getAppearance(),o=i.getShader(this.geometryContext,t),r=n.getPrimitiveMode(this.primitiveMode);if(this.numParticles){const s=i.getBlendMode();if(s?.enable(e),o.enable(e),o.setUniforms(e,this.geometryContext,t),this.numTexCoords){const t=n.getTexture2DUnit();e.activeTexture(e.TEXTURE0+t),e.bindTexture(e.TEXTURE_2D,this.texCoordRampTexture),e.uniform1i(o.x3d_TexCoordRamp,t)}const a=this.outputParticles;if(a.vertexArrayObject.enable(o)){const t=this.particleStride;o.enableParticleAttribute(e,a,t,this.particleOffset,1),o.enableParticleMatrixAttribute(e,a,t,this.matrixOffset,1),this.geometryContext.colorMaterial&&(o.enableColorAttribute(e,a,t,this.colorOffset),o.colorAttributeDivisor(e,1)),this.texCoordCount&&o.enableTexCoordAttribute(e,this.texCoordBuffers,0,this.texCoordOffset),this.hasNormals&&(o.enableNormalAttribute(e,this.geometryBuffer,0,this.normalOffset),o.normalAttributeDivisor(e,this.maxParticles)),o.enableVertexAttribute(e,this.geometryBuffer,0,this.verticesOffset)}e.drawArraysInstanced(r,0,this.vertexCount,this.numParticles),s?.disable(e)}break}}},getScreenAlignedRotation:function(){const e=new(me()),t=new(P())(0,0,0),n=new(P())(0,0,0),i=new(P())(0,0,0),o=new(pe())(9);return function(r){e.assign(r).inverse(),e.multDirMatrix(t.assign(P().zAxis)),e.multDirMatrix(n.assign(P().yAxis));const s=n.cross(t);i.assign(t).cross(s);const a=t;return s.normalize(),i.normalize(),a.normalize(),o.set(s.x,s.y,s.z,i.x,i.y,i.z,a.x,a.y,a.z),o}}()}),Object.defineProperties(De,{typeName:{value:"ParticleSystem",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"children",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"enabled",new(o().SFBool)(!0)),new(s())(_().inputOutput,"createParticles",new(o().SFBool)(!0)),new(s())(_().initializeOnly,"geometryType",new(o().SFString)("QUAD")),new(s())(_().inputOutput,"maxParticles",new(o().SFInt32)(200)),new(s())(_().inputOutput,"particleLifetime",new(o().SFFloat)(5)),new(s())(_().inputOutput,"lifetimeVariation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"particleSize",new(o().SFVec2f)(.02,.02)),new(s())(_().initializeOnly,"emitter",new(o().SFNode)),new(s())(_().initializeOnly,"physics",new(o().MFNode)),new(s())(_().initializeOnly,"colorKey",new(o().MFFloat)),new(s())(_().initializeOnly,"color",new(o().SFNode)),new(s())(_().initializeOnly,"texCoordKey",new(o().MFFloat)),new(s())(_().initializeOnly,"texCoord",new(o().SFNode)),new(s())(_().outputOnly,"isActive",new(o().SFBool)),new(s())(_().inputOutput,"visible",new(o().SFBool)(!0)),new(s())(_().inputOutput,"castShadow",new(o().SFBool)(!0)),new(s())(_().inputOutput,"bboxDisplay",new(o().SFBool)),new(s())(_().initializeOnly,"bboxSize",new(o().SFVec3f)(-1,-1,-1)),new(s())(_().initializeOnly,"bboxCenter",new(o().SFVec3f)),new(s())(_().inputOutput,"appearance",new(o().SFNode)),new(s())(_().inputOutput,"geometry",new(o().SFNode))]),enumerable:!0}});const Ve=De;m().set("x_ite/Components/ParticleSystems/ParticleSystem",Ve);const Be=Ve,ze=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Components/Rendering/IndexedLineSet");var Ue=n.n(ze);function Me(e){S.call(this,e),this.addType(_().PolylineEmitter),this.polylinesNode=new(Ue())(e),this.polylinesArray=new Float32Array,this.addSampler("polylines"),this.addUniform("direction","uniform vec3 direction;"),this.addUniform("verticesIndex","uniform int verticesIndex;"),this.addUniform("polylines","uniform sampler2D polylines;"),this.addFunction("vec3 getRandomVelocity ()\n {\n if (direction == vec3 (0.0))\n return getRandomSphericalVelocity ();\n\n else\n return direction * getRandomSpeed ();\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n if (verticesIndex < 0)\n {\n return vec4 (NaN);\n }\n else\n {\n // Determine index0, index1 and weight.\n\n float lastLengthSoFar = texelFetch (polylines, verticesIndex - 1, 0) .x;\n float fraction = random () * lastLengthSoFar;\n\n int index0 = 0;\n int index1 = 0;\n float weight = 0.0;\n\n interpolate (polylines, verticesIndex, fraction, index0, index1, weight);\n\n // Interpolate and return position.\n\n index0 *= 2;\n index1 = index0 + 1;\n\n vec4 vertex0 = texelFetch (polylines, verticesIndex + index0, 0);\n vec4 vertex1 = texelFetch (polylines, verticesIndex + index1, 0);\n\n return mix (vertex0, vertex1, weight);\n }\n }")}Object.assign(Object.setPrototypeOf(Me.prototype,S.prototype),{initialize(){S.prototype.initialize.call(this);this.getBrowser().getContext().getVersion()<2||(this.polylinesTexture=this.createTexture(),this._direction.addInterest("set_direction__",this),this._coordIndex.addFieldInterest(this.polylinesNode._coordIndex),this._coord.addFieldInterest(this.polylinesNode._coord),this.polylinesNode._coordIndex=this._coordIndex,this.polylinesNode._coord=this._coord,this.polylinesNode._rebuild.addInterest("set_polyline",this),this.polylinesNode.setPrivate(!0),this.polylinesNode.setup(),this.set_direction__(),this.set_polyline())},set_direction__:function(){const e=new(P())(0,0,0);return function(){e.assign(this._direction.getValue()).normalize(),this.setUniform("uniform3f","direction",e.x,e.y,e.z)}}(),set_polyline:function(){const e=new(P())(0,0,0),t=new(P())(0,0,0);return function(){const n=this.getBrowser().getContext(),i=this.polylinesNode.getVertices().getValue(),o=i.length/4,r=o/2+1,s=Math.ceil(Math.sqrt(r+o)),a=r;let c=this.polylinesArray;c.length<s*s*4&&(c=this.polylinesArray=new Float32Array(s*s*4));let l=0;for(let n=0,o=i.length;n<o;n+=8)e.set(i[n],i[n+1],i[n+2]),t.set(i[n+4],i[n+5],i[n+6]),c[n/2+4]=l+=t.subtract(e).magnitude();c.set(i,4*a),this.setUniform("uniform1i","verticesIndex",o?a:-1),s&&(n.bindTexture(n.TEXTURE_2D,this.polylinesTexture),n.texImage2D(n.TEXTURE_2D,0,n.RGBA32F,s,s,0,n.RGBA,n.FLOAT,c))}}(),activateTextures(e,t){e.activeTexture(e.TEXTURE0+t.polylinesTextureUnit),e.bindTexture(e.TEXTURE_2D,this.polylinesTexture)}}),Object.defineProperties(Me,{typeName:{value:"PolylineEmitter",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"emitter",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)(0,1,0)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat)),new(s())(_().inputOutput,"coordIndex",new(o().MFInt32)(-1)),new(s())(_().inputOutput,"coord",new(o().SFNode))]),enumerable:!0}});const Le=Me;m().set("x_ite/Components/ParticleSystems/PolylineEmitter",Le);const Xe=Le,je=window[Symbol.for("X_ITE.X3D-8.8.1")].require("standard/Math/Geometry/Triangle3");var qe=n.n(je);function ke(e){S.call(this,e),this.addType(_().SurfaceEmitter),this.surfaceNode=null,this.surfaceArray=new Float32Array,this.addSampler("surface"),this.addUniform("solid","uniform bool solid;"),this.addUniform("verticesIndex","uniform int verticesIndex;"),this.addUniform("normalsIndex","uniform int normalsIndex;"),this.addUniform("surface","uniform sampler2D surface;"),this.addFunction("vec4 position; vec3 getRandomVelocity ()\n {\n if (verticesIndex < 0)\n {\n return vec3 (0.0);\n }\n else\n {\n vec3 normal;\n\n getRandomPointOnSurface (surface, verticesIndex, normalsIndex, position, normal);\n\n if (solid == false && random () > 0.5)\n normal = -normal;\n\n return normal * getRandomSpeed ();\n }\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n return verticesIndex < 0 ? vec4 (NaN) : position;\n }")}Object.assign(Object.setPrototypeOf(ke.prototype,S.prototype),{initialize(){S.prototype.initialize.call(this);this.getBrowser().getContext().getVersion()<2||(this.surfaceTexture=this.createTexture(),this._surface.addInterest("set_surface__",this),this.set_surface__())},set_surface__(){this.surfaceNode&&(this.surfaceNode._solid.removeInterest("set_solid__",this),this.surfaceNode._rebuild.removeInterest("set_geometry__",this)),this.surfaceNode=j()(_().X3DGeometryNode,this._surface),this.surfaceNode&&(this.surfaceNode._solid.addInterest("set_solid__",this),this.surfaceNode._rebuild.addInterest("set_geometry__",this)),this.set_solid__(),this.set_geometry__()},set_solid__(){this.surfaceNode&&this.setUniform("uniform1i","solid",this.surfaceNode._solid.getValue())},set_geometry__:function(){const e=new(P())(0,0,0),t=new(P())(0,0,0),n=new(P())(0,0,0);return function(){const i=this.getBrowser().getContext();if(this.surfaceNode){const o=this.surfaceNode.getVertices().getValue(),r=this.surfaceNode.getNormals().getValue(),s=o.length/4,a=s/3+1,c=Math.ceil(Math.sqrt(a+s+s)),l=a,u=l+s;let d=this.surfaceArray;d.length<c*c*4&&(d=this.surfaceArray=new Float32Array(c*c*4));let m=0;for(let i=0,r=o.length;i<r;i+=12)e.set(o[i],o[i+1],o[i+2]),t.set(o[i+4],o[i+5],o[i+6]),n.set(o[i+8],o[i+9],o[i+10]),d[i/3+4]=m+=qe().area(e,t,n);d.set(o,4*l);for(let e=4*u,t=0,n=r.length;t<n;e+=4,t+=3)d[e+0]=r[t+0],d[e+1]=r[t+1],d[e+2]=r[t+2];this.setUniform("uniform1i","verticesIndex",s?l:-1),this.setUniform("uniform1i","normalsIndex",s?u:-1),c&&(i.bindTexture(i.TEXTURE_2D,this.surfaceTexture),i.texImage2D(i.TEXTURE_2D,0,i.RGBA32F,c,c,0,i.RGBA,i.FLOAT,d))}else this.setUniform("uniform1i","verticesIndex",-1),this.setUniform("uniform1i","normalsIndex",-1)}}(),activateTextures(e,t){e.activeTexture(e.TEXTURE0+t.surfaceTextureUnit),e.bindTexture(e.TEXTURE_2D,this.surfaceTexture)}}),Object.defineProperties(ke,{typeName:{value:"SurfaceEmitter",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"emitter",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat)),new(s())(_().inputOutput,"surface",new(o().SFNode))]),enumerable:!0}});const Ge=ke;m().set("x_ite/Components/ParticleSystems/SurfaceEmitter",Ge);const He=Ge,Ye=window[Symbol.for("X_ITE.X3D-8.8.1")].require("x_ite/Components/Geometry3D/IndexedFaceSet");var We=n.n(Ye);function Ke(e){S.call(this,e),this.addType(_().VolumeEmitter),this.volumeNode=new(We())(e),this.volumeArray=new Float32Array,this.addSampler("volume"),this.addUniform("direction","uniform vec3 direction;"),this.addUniform("verticesIndex","uniform int verticesIndex;"),this.addUniform("normalsIndex","uniform int normalsIndex;"),this.addUniform("hierarchyIndex","uniform int hierarchyIndex;"),this.addUniform("hierarchyRoot","uniform int hierarchyRoot;"),this.addUniform("volume","uniform sampler2D volume;"),this.addFunction("vec3 getRandomVelocity ()\n {\n if (hierarchyRoot < 0)\n {\n return vec3 (0.0);\n }\n else\n {\n if (direction == vec3 (0.0))\n return getRandomSphericalVelocity ();\n\n else\n return direction * getRandomSpeed ();\n }\n }"),this.addFunction("vec4 getRandomPosition ()\n {\n if (hierarchyRoot < 0)\n {\n return vec4 (NaN);\n }\n else\n {\n vec4 point;\n vec3 normal;\n\n getRandomPointOnSurface (volume, verticesIndex, normalsIndex, point, normal);\n\n Line3 line = Line3 (point .xyz, getRandomSurfaceNormal (normal));\n\n vec4 points [ARRAY_SIZE];\n\n int numIntersections = getIntersections (volume, verticesIndex, hierarchyIndex, hierarchyRoot, line, points);\n\n numIntersections -= numIntersections % 2; // We need an even count of intersections.\n\n switch (numIntersections)\n {\n case 0:\n return vec4 (0.0);\n case 2:\n break;\n default:\n sort (points, numIntersections, plane3 (line .point, line .direction));\n break;\n }\n\n int index = int (fract (random ()) * float (numIntersections / 2)) * 2; // Select random intersection.\n\n return mix (points [index], points [index + 1], random ());\n }\n }")}Object.assign(Object.setPrototypeOf(Ke.prototype,S.prototype),{initialize(){S.prototype.initialize.call(this);this.getBrowser().getContext().getVersion()<2||(this.volumeTexture=this.createTexture(),this._direction.addInterest("set_direction__",this),this._coordIndex.addFieldInterest(this.volumeNode._coordIndex),this._coord.addFieldInterest(this.volumeNode._coord),this.volumeNode._creaseAngle=Math.PI,this.volumeNode._convex=!1,this.volumeNode._coordIndex=this._coordIndex,this.volumeNode._coord=this._coord,this.volumeNode._rebuild.addInterest("set_geometry__",this),this.volumeNode.setPrivate(!0),this.volumeNode.setup(),this.set_direction__(),this.set_geometry__())},set_direction__:function(){const e=new(P())(0,0,0);return function(){e.assign(this._direction.getValue()).normalize(),this.setUniform("uniform3f","direction",e.x,e.y,e.z)}}(),set_geometry__:function(){const e=new(P())(0,0,0),t=new(P())(0,0,0),n=new(P())(0,0,0);return function(){const i=this.getBrowser().getContext(),o=this.volumeNode.getVertices().getValue(),r=this.volumeNode.getNormals().getValue(),s=new Ae(o,r).toArray([]),a=o.length/4,c=r.length/3,l=a/3+1,u=s.length/4,d=Math.ceil(Math.sqrt(l+a+a+u)),m=l,h=m+a,p=h+c;let f=this.volumeArray;f.length<d*d*4&&(f=this.volumeArray=new Float32Array(d*d*4));let x=0;for(let i=0,r=o.length;i<r;i+=12)e.set(o[i],o[i+1],o[i+2]),t.set(o[i+4],o[i+5],o[i+6]),n.set(o[i+8],o[i+9],o[i+10]),f[i/3+4]=x+=qe().area(e,t,n);f.set(o,4*m);for(let e=4*h,t=0,n=r.length;t<n;e+=4,t+=3)f[e+0]=r[t+0],f[e+1]=r[t+1],f[e+2]=r[t+2];f.set(s,4*p),this.setUniform("uniform1i","verticesIndex",m),this.setUniform("uniform1i","normalsIndex",h),this.setUniform("uniform1i","hierarchyIndex",p),this.setUniform("uniform1i","hierarchyRoot",p+u-1),d&&(i.bindTexture(i.TEXTURE_2D,this.volumeTexture),i.texImage2D(i.TEXTURE_2D,0,i.RGBA32F,d,d,0,i.RGBA,i.FLOAT,f))}}(),activateTextures(e,t){e.activeTexture(e.TEXTURE0+t.volumeTextureUnit),e.bindTexture(e.TEXTURE_2D,this.volumeTexture)}}),Object.defineProperties(Ke,{typeName:{value:"VolumeEmitter",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"emitter",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"on",new(o().SFBool)(!0)),new(s())(_().inputOutput,"internal",new(o().SFBool)(!0)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)(0,1,0)),new(s())(_().inputOutput,"speed",new(o().SFFloat)),new(s())(_().inputOutput,"variation",new(o().SFFloat)(.25)),new(s())(_().inputOutput,"mass",new(o().SFFloat)),new(s())(_().inputOutput,"surfaceArea",new(o().SFFloat)),new(s())(_().inputOutput,"coordIndex",new(o().MFInt32)(-1)),new(s())(_().inputOutput,"coord",new(o().SFNode))]),enumerable:!0}});const Ze=Ke;m().set("x_ite/Components/ParticleSystems/VolumeEmitter",Ze);const Qe=Ze,$e=window[Symbol.for("X_ITE.X3D-8.8.1")].require("standard/Math/Algorithm");var Je=n.n($e);function et(e){L.call(this,e),this.addType(_().WindPhysicsModel),this._speed.setUnit("speed")}Object.assign(Object.setPrototypeOf(et.prototype,L.prototype),{getRandomSpeed(e){const t=Math.max(0,this._speed.getValue()),n=t*Math.max(0,this._gustiness.getValue());return e.getRandomValue(Math.max(0,t-n),t+n)},addForce:function(){const e=new(P())(0,0,0);return function(t,n,i,o){if(this._enabled.getValue()){const r=n._surfaceArea.getValue(),s=this.getRandomSpeed(n),a=.64615*Math.pow(10,2*Math.log(s));return this._direction.getValue().equals(P().Zero)?n.getRandomNormal(e):e.assign(this._direction.getValue()).normalize(),o.set(e.multiply(r*a*i),4*t),o[4*t+3]=Math.PI*Je().clamp(this._turbulence.getValue(),0,1),!0}return!1}}()}),Object.defineProperties(et,{typeName:{value:"WindPhysicsModel",enumerable:!0},componentName:{value:"ParticleSystems",enumerable:!0},containerField:{value:"physics",enumerable:!0},specificationRange:{value:Object.freeze(["3.2","Infinity"]),enumerable:!0},fieldDefinitions:{value:new(c())([new(s())(_().inputOutput,"metadata",new(o().SFNode)),new(s())(_().inputOutput,"enabled",new(o().SFBool)(!0)),new(s())(_().inputOutput,"direction",new(o().SFVec3f)),new(s())(_().inputOutput,"speed",new(o().SFFloat)(.1)),new(s())(_().inputOutput,"gustiness",new(o().SFFloat)(.1)),new(s())(_().inputOutput,"turbulence",new(o().SFFloat))]),enumerable:!0}});const tt=et;m().set("x_ite/Components/ParticleSystems/WindPhysicsModel",tt);const nt=tt;t().add({name:"ParticleSystems",concreteNodes:[G,W,Q,ee,Be,C,Xe,He,Qe,nt],abstractNodes:[S,L],browserContext:z});const it=void 0;m().set("assets/components/ParticleSystems",it)})()})();