x_ite 5.0.2 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/.vscode/settings.json +12 -5
  2. package/.vscode/tasks.json +21 -0
  3. package/Makefile +10 -15
  4. package/README.md +6 -11
  5. package/build/bin/dist.pl +0 -6
  6. package/build/bin/version.pl +1 -4
  7. package/dist/assets/components/annotation.js +2 -2
  8. package/dist/assets/components/annotation.min.js +1 -1
  9. package/dist/assets/components/cad-geometry.js +2 -2
  10. package/dist/assets/components/cad-geometry.min.js +1 -1
  11. package/dist/assets/components/cube-map-texturing.js +6 -19
  12. package/dist/assets/components/cube-map-texturing.min.js +1 -1
  13. package/dist/assets/components/dis.js +2 -2
  14. package/dist/assets/components/dis.min.js +1 -1
  15. package/dist/assets/components/event-utilities.js +3 -3
  16. package/dist/assets/components/event-utilities.min.js +1 -1
  17. package/dist/assets/components/geometry2d.js +4 -4
  18. package/dist/assets/components/geometry2d.min.js +1 -1
  19. package/dist/assets/components/geospatial.js +32 -1685
  20. package/dist/assets/components/geospatial.min.js +1 -1
  21. package/dist/assets/components/h-anim.js +70 -77
  22. package/dist/assets/components/h-anim.min.js +1 -1
  23. package/dist/assets/components/key-device-sensor.js +3 -3
  24. package/dist/assets/components/key-device-sensor.min.js +1 -1
  25. package/dist/assets/components/layout.js +38 -52
  26. package/dist/assets/components/layout.min.js +1 -1
  27. package/dist/assets/components/nurbs.js +277 -194
  28. package/dist/assets/components/nurbs.min.js +1 -1
  29. package/dist/assets/components/particle-systems.js +1918 -1658
  30. package/dist/assets/components/particle-systems.min.js +1 -1
  31. package/dist/assets/components/picking.js +33 -41
  32. package/dist/assets/components/picking.min.js +1 -1
  33. package/dist/assets/components/projective-texture-mapping.js +72 -86
  34. package/dist/assets/components/projective-texture-mapping.min.js +1 -1
  35. package/dist/assets/components/rigid-body-physics.js +36 -57
  36. package/dist/assets/components/rigid-body-physics.min.js +1 -1
  37. package/dist/assets/components/scripting.js +2 -2
  38. package/dist/assets/components/scripting.min.js +1 -1
  39. package/dist/assets/components/texturing-3d.js +26 -75
  40. package/dist/assets/components/texturing-3d.min.js +3 -3
  41. package/dist/assets/components/volume-rendering.js +10 -10
  42. package/dist/assets/components/volume-rendering.min.js +1 -1
  43. package/dist/assets/components/x_ite.js +2 -2
  44. package/dist/assets/components/x_ite.min.js +1 -1
  45. package/dist/assets/linetype/1.png +0 -0
  46. package/dist/assets/linetype/10.png +0 -0
  47. package/dist/assets/linetype/11.png +0 -0
  48. package/dist/assets/linetype/12.png +0 -0
  49. package/dist/assets/linetype/13.png +0 -0
  50. package/dist/assets/linetype/14.png +0 -0
  51. package/dist/assets/linetype/15.png +0 -0
  52. package/dist/assets/linetype/16.png +0 -0
  53. package/dist/assets/linetype/2.png +0 -0
  54. package/dist/assets/linetype/3.png +0 -0
  55. package/dist/assets/linetype/4.png +0 -0
  56. package/dist/assets/linetype/5.png +0 -0
  57. package/dist/assets/linetype/6.png +0 -0
  58. package/dist/assets/linetype/7.png +0 -0
  59. package/dist/assets/linetype/8.png +0 -0
  60. package/dist/assets/linetype/9.png +0 -0
  61. package/dist/assets/shaders/webgl1/Line.fs +0 -21
  62. package/dist/assets/shaders/webgl1/Line.vs +0 -10
  63. package/dist/assets/shaders/webgl1/PBR.vs +1 -1
  64. package/dist/assets/shaders/webgl2/Depth.vs +29 -1
  65. package/dist/assets/shaders/webgl2/Gouraud.vs +31 -3
  66. package/dist/assets/shaders/webgl2/Line.fs +24 -12
  67. package/dist/assets/shaders/webgl2/Line.vs +36 -11
  68. package/dist/assets/shaders/webgl2/LineTransform.fs +4 -0
  69. package/dist/assets/shaders/webgl2/LineTransform.vs +57 -0
  70. package/dist/assets/shaders/webgl2/PBR.vs +35 -7
  71. package/dist/assets/shaders/webgl2/Phong.vs +31 -3
  72. package/dist/assets/shaders/webgl2/Point.vs +29 -1
  73. package/dist/assets/shaders/webgl2/Unlit.vs +31 -3
  74. package/dist/example.html +6 -6
  75. package/dist/x_ite.css +180 -208
  76. package/dist/x_ite.js +16477 -16629
  77. package/dist/x_ite.min.js +17 -17
  78. package/dist/x_ite.zip +0 -0
  79. package/docs/404.md +6 -0
  80. package/docs/Accessing-the-External-Browser.md +20 -14
  81. package/docs/Browser-Support.md +6 -0
  82. package/docs/Custom-Shaders.md +17 -24
  83. package/docs/Features.md +7 -1
  84. package/docs/Gemfile +44 -0
  85. package/docs/Gemfile.lock +122 -0
  86. package/docs/Glossary.md +6 -0
  87. package/docs/How-To-Configure-Your-Web-Server.md +6 -0
  88. package/docs/Supported-Nodes.md +9 -1
  89. package/docs/What's-New.md +31 -0
  90. package/docs/XHTML-DOM-Integration.md +6 -0
  91. package/docs/_config.yml +1 -1
  92. package/docs/assets/css/main.scss +26 -0
  93. package/docs/index.md +38 -46
  94. package/docs/reference/Browser-Services.md +9 -3
  95. package/docs/reference/Constants-Services.md +6 -0
  96. package/docs/reference/ECMAScript-Object-and-Function-Definitions.md +6 -0
  97. package/docs/reference/Field-Services-and-Objects.md +6 -0
  98. package/docs/reference/Prototype-Services.md +6 -0
  99. package/docs/reference/Route-Services.md +6 -0
  100. package/docs/reference/Scene-Services.md +8 -2
  101. package/docs/reference/Script-Node-Authoring-Interface.md +7 -1
  102. package/docs/tutorials/Adding-backgrounds.md +6 -0
  103. package/docs/tutorials/Adding-fog.md +6 -0
  104. package/docs/tutorials/Adding-sound.md +6 -0
  105. package/docs/tutorials/Animating-transforms.md +6 -0
  106. package/docs/tutorials/Basic-Nodes.md +6 -0
  107. package/docs/tutorials/Building-a-X3D-world.md +6 -0
  108. package/docs/tutorials/Building-elevation-grids.md +6 -0
  109. package/docs/tutorials/Building-extruded-shapes.md +6 -0
  110. package/docs/tutorials/Building-primitive-shapes.md +6 -0
  111. package/docs/tutorials/Building-shapes-out-of-points,-lines,-and-faces.md +6 -0
  112. package/docs/tutorials/Controlling-appearance-with-materials.md +6 -0
  113. package/docs/tutorials/Controlling-color-on-coordinate-based-geometry.md +6 -0
  114. package/docs/tutorials/Controlling-detail.md +6 -0
  115. package/docs/tutorials/Controlling-how-textures-are-mapped.md +6 -0
  116. package/docs/tutorials/Controlling-navigation.md +6 -0
  117. package/docs/tutorials/Controlling-shading-on-coordinate-based-geometry.md +6 -0
  118. package/docs/tutorials/Controlling-the-viewpoint.md +6 -0
  119. package/docs/tutorials/Creating-new-node-types.md +6 -0
  120. package/docs/tutorials/Grouping-nodes.md +6 -0
  121. package/docs/tutorials/Hello,-World!.md +6 -0
  122. package/docs/tutorials/Improving-Performance.md +6 -0
  123. package/docs/tutorials/Increasing-Rendering-Speed.md +6 -0
  124. package/docs/tutorials/Introducing-X3D.md +6 -0
  125. package/docs/tutorials/Introducing-animation.md +6 -0
  126. package/docs/tutorials/Introducing-script-use.md +6 -0
  127. package/docs/tutorials/Lighting-your-world.md +6 -0
  128. package/docs/tutorials/Mapping-textures.md +6 -0
  129. package/docs/tutorials/Naming-nodes.md +6 -0
  130. package/docs/tutorials/Providing-information-about-your-world.md +6 -0
  131. package/docs/tutorials/Sensing-the-viewer.md +6 -0
  132. package/docs/tutorials/Sensing-viewer-actions.md +6 -0
  133. package/docs/tutorials/Transforming-Shapes.md +6 -0
  134. package/docs/tutorials/Writing-program-scripts-with-ECMAScript.md +6 -0
  135. package/docs/tutorials/index.md +6 -0
  136. package/package.json +6 -7
  137. package/src/assets/components/geometry2d.js +1 -1
  138. package/src/assets/components/key-device-sensor.js +1 -1
  139. package/src/assets/components/layout.js +1 -1
  140. package/src/assets/components/particle-systems.js +1 -1
  141. package/src/assets/components/volume-rendering.js +1 -1
  142. package/src/assets/linetype/1.png +0 -0
  143. package/src/assets/linetype/10.png +0 -0
  144. package/src/assets/linetype/11.png +0 -0
  145. package/src/assets/linetype/12.png +0 -0
  146. package/src/assets/linetype/13.png +0 -0
  147. package/src/assets/linetype/14.png +0 -0
  148. package/src/assets/linetype/15.png +0 -0
  149. package/src/assets/linetype/16.png +0 -0
  150. package/src/assets/linetype/2.png +0 -0
  151. package/src/assets/linetype/3.png +0 -0
  152. package/src/assets/linetype/4.png +0 -0
  153. package/src/assets/linetype/5.png +0 -0
  154. package/src/assets/linetype/6.png +0 -0
  155. package/src/assets/linetype/7.png +0 -0
  156. package/src/assets/linetype/8.png +0 -0
  157. package/src/assets/linetype/9.png +0 -0
  158. package/src/assets/shaders/Types.glsl +1 -9
  159. package/src/assets/shaders/webgl1/Line.fs +3 -28
  160. package/src/assets/shaders/webgl1/Line.vs +5 -19
  161. package/src/assets/shaders/webgl1/PBR.vs +1 -1
  162. package/src/assets/shaders/webgl1/Point.vs +2 -3
  163. package/src/assets/shaders/webgl2/Depth.vs +4 -1
  164. package/src/assets/shaders/webgl2/Gouraud.vs +5 -3
  165. package/src/assets/shaders/webgl2/Line.fs +11 -17
  166. package/src/assets/shaders/webgl2/Line.vs +16 -20
  167. package/src/assets/shaders/webgl2/LineTransform.fs +6 -0
  168. package/src/assets/shaders/webgl2/LineTransform.vs +77 -0
  169. package/src/assets/shaders/webgl2/PBR.vs +10 -7
  170. package/src/assets/shaders/webgl2/Phong.vs +6 -3
  171. package/src/assets/shaders/webgl2/Point.vs +6 -6
  172. package/src/assets/shaders/webgl2/Unlit.vs +6 -3
  173. package/src/assets/shaders/webgl2/include/Line2.glsl +20 -0
  174. package/src/assets/shaders/webgl2/include/Particle.glsl +36 -0
  175. package/src/example.html +6 -6
  176. package/src/standard/Math/Algorithm.js +12 -28
  177. package/src/standard/Math/Geometry/Plane3.js +0 -2
  178. package/src/standard/Math/Geometry/ViewVolume.js +88 -83
  179. package/src/standard/Math/Numbers/Color3.js +6 -0
  180. package/src/standard/Math/Numbers/Color4.js +7 -0
  181. package/src/standard/Math/Numbers/Complex.js +5 -0
  182. package/src/standard/Math/Numbers/Matrix2.js +20 -2
  183. package/src/standard/Math/Numbers/Matrix3.js +129 -110
  184. package/src/standard/Math/Numbers/Matrix4.js +138 -119
  185. package/src/standard/Math/Numbers/Quaternion.js +7 -0
  186. package/src/standard/Math/Numbers/Rotation4.js +7 -0
  187. package/src/standard/Math/Numbers/Vector2.js +8 -5
  188. package/src/standard/Math/Numbers/Vector3.js +16 -10
  189. package/src/standard/Math/Numbers/Vector4.js +12 -7
  190. package/src/standard/Math/Utility/BVH.js +45 -17
  191. package/src/tests.js +6 -1
  192. package/src/x_ite/Base/X3DBaseNode.js +22 -11
  193. package/src/x_ite/Base/X3DField.js +1 -1
  194. package/src/x_ite/Browser/Core/BrowserOptions.js +2 -2
  195. package/src/x_ite/Browser/Core/BrowserTimings.js +4 -2
  196. package/src/x_ite/Browser/Core/Context.js +185 -0
  197. package/src/x_ite/Browser/Core/ContextMenu.js +299 -193
  198. package/src/x_ite/Browser/Core/Notification.js +1 -0
  199. package/src/x_ite/Browser/Core/X3DCoreContext.js +35 -146
  200. package/src/x_ite/Browser/Layout/ScreenText.js +11 -4
  201. package/src/x_ite/Browser/Layout/X3DLayoutContext.js +4 -15
  202. package/src/x_ite/Browser/Navigation/ExamineViewer.js +12 -19
  203. package/src/x_ite/Browser/Navigation/LookAtViewer.js +0 -3
  204. package/src/x_ite/Browser/Navigation/PlaneViewer.js +0 -3
  205. package/src/x_ite/Browser/Navigation/X3DFlyViewer.js +14 -7
  206. package/src/x_ite/Browser/Navigation/X3DViewer.js +12 -20
  207. package/src/x_ite/Browser/Networking/X3DNetworkingContext.js +11 -7
  208. package/src/x_ite/Browser/ParticleSystems/BVH.glsl +183 -0
  209. package/src/x_ite/Browser/ParticleSystems/Box3.glsl +47 -0
  210. package/src/x_ite/Browser/ParticleSystems/GeometryTypes.js +66 -0
  211. package/src/x_ite/Browser/ParticleSystems/Line3.glsl +55 -0
  212. package/src/x_ite/Browser/ParticleSystems/Plane3.glsl +160 -0
  213. package/src/x_ite/Browser/PointingDeviceSensor/PointingDevice.js +27 -3
  214. package/src/x_ite/Browser/PointingDeviceSensor/X3DPointingDeviceSensorContext.js +37 -37
  215. package/src/x_ite/Browser/Rendering/X3DRenderingContext.js +19 -13
  216. package/src/x_ite/Browser/Shaders/Shader.js +33 -12
  217. package/src/x_ite/Browser/Shaders/ShaderSource.js +6 -0
  218. package/src/x_ite/Browser/Shaders/ShaderTest.js +16 -10
  219. package/src/x_ite/Browser/Shape/X3DShapeContext.js +50 -9
  220. package/src/x_ite/Browser/Text/X3DTextContext.js +4 -13
  221. package/src/x_ite/Browser/Texturing/X3DTexturingContext.js +23 -33
  222. package/src/x_ite/Browser/Texturing3D/DICOMParser.js +2 -2
  223. package/src/x_ite/Browser/Time/X3DTimeContext.js +3 -1
  224. package/src/x_ite/Browser/VERSION.js +1 -1
  225. package/src/x_ite/Browser/X3DBrowser.js +7 -6
  226. package/src/x_ite/Browser/X3DBrowserContext.js +35 -10
  227. package/src/x_ite/Components/Core/X3DNode.js +4 -0
  228. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +0 -2
  229. package/src/x_ite/Components/CubeMapTexturing/ComposedCubeMapTexture.js +3 -4
  230. package/src/x_ite/Components/CubeMapTexturing/GeneratedCubeMapTexture.js +1 -12
  231. package/src/x_ite/Components/CubeMapTexturing/ImageCubeMapTexture.js +0 -1
  232. package/src/x_ite/Components/EnvironmentalEffects/TextureBackground.js +1 -1
  233. package/src/x_ite/Components/EnvironmentalEffects/X3DBackgroundNode.js +76 -77
  234. package/src/x_ite/Components/EnvironmentalEffects/X3DFogObject.js +2 -9
  235. package/src/x_ite/Components/EnvironmentalSensor/ProximitySensor.js +51 -65
  236. package/src/x_ite/Components/EventUtilities/X3DSequencerNode.js +1 -1
  237. package/src/x_ite/Components/Followers/X3DChaserNode.js +18 -32
  238. package/src/x_ite/Components/Followers/X3DDamperNode.js +1 -6
  239. package/src/x_ite/Components/Geometry2D/TriangleSet2D.js +1 -1
  240. package/src/x_ite/Components/Geometry3D/ElevationGrid.js +12 -4
  241. package/src/x_ite/Components/Geometry3D/IndexedFaceSet.js +4 -4
  242. package/src/x_ite/Components/Geospatial/GeoCoordinate.js +10 -27
  243. package/src/x_ite/Components/Geospatial/GeoPositionInterpolator.js +5 -10
  244. package/src/x_ite/Components/Geospatial/GeoTouchSensor.js +9 -16
  245. package/src/x_ite/Components/Geospatial/GeoTransform.js +6 -18
  246. package/src/x_ite/Components/Geospatial/X3DGeospatialObject.js +20 -27
  247. package/src/x_ite/Components/Grouping/X3DGroupingNode.js +8 -8
  248. package/src/x_ite/Components/Grouping/X3DTransformNode.js +0 -4
  249. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +68 -75
  250. package/src/x_ite/Components/Interpolation/OrientationInterpolator.js +4 -11
  251. package/src/x_ite/Components/Interpolation/X3DInterpolatorNode.js +1 -1
  252. package/src/x_ite/Components/Layout/LayoutGroup.js +4 -9
  253. package/src/x_ite/Components/Layout/ScreenFontStyle.js +1 -1
  254. package/src/x_ite/Components/Layout/ScreenGroup.js +18 -23
  255. package/src/x_ite/Components/Lighting/DirectionalLight.js +28 -36
  256. package/src/x_ite/Components/Lighting/PointLight.js +32 -47
  257. package/src/x_ite/Components/Lighting/SpotLight.js +33 -48
  258. package/src/x_ite/Components/Navigation/Billboard.js +49 -56
  259. package/src/x_ite/Components/Navigation/LOD.js +1 -1
  260. package/src/x_ite/Components/Navigation/X3DViewpointNode.js +82 -111
  261. package/src/x_ite/Components/Networking/Anchor.js +10 -4
  262. package/src/x_ite/Components/ParticleSystems/BoundedPhysicsModel.js +6 -6
  263. package/src/x_ite/Components/ParticleSystems/ConeEmitter.js +44 -36
  264. package/src/x_ite/Components/ParticleSystems/ExplosionEmitter.js +26 -17
  265. package/src/x_ite/Components/ParticleSystems/ForcePhysicsModel.js +20 -7
  266. package/src/x_ite/Components/ParticleSystems/ParticleSystem.js +461 -876
  267. package/src/x_ite/Components/ParticleSystems/PointEmitter.js +39 -35
  268. package/src/x_ite/Components/ParticleSystems/PolylineEmitter.js +112 -128
  269. package/src/x_ite/Components/ParticleSystems/SurfaceEmitter.js +105 -112
  270. package/src/x_ite/Components/ParticleSystems/VolumeEmitter.js +138 -176
  271. package/src/x_ite/Components/ParticleSystems/WindPhysicsModel.js +16 -11
  272. package/src/x_ite/Components/ParticleSystems/X3DParticleEmitterNode.js +807 -217
  273. package/src/x_ite/Components/Picking/LinePickSensor.js +31 -39
  274. package/src/x_ite/Components/PointingDeviceSensor/CylinderSensor.js +90 -107
  275. package/src/x_ite/Components/PointingDeviceSensor/PlaneSensor.js +48 -55
  276. package/src/x_ite/Components/PointingDeviceSensor/SphereSensor.js +53 -70
  277. package/src/x_ite/Components/PointingDeviceSensor/TouchSensor.js +8 -15
  278. package/src/x_ite/Components/ProjectiveTextureMapping/TextureProjectorParallel.js +43 -50
  279. package/src/x_ite/Components/ProjectiveTextureMapping/TextureProjectorPerspective.js +32 -39
  280. package/src/x_ite/Components/Rendering/ClipPlane.js +3 -11
  281. package/src/x_ite/Components/Rendering/Color.js +12 -37
  282. package/src/x_ite/Components/Rendering/ColorRGBA.js +13 -38
  283. package/src/x_ite/Components/Rendering/IndexedLineSet.js +12 -4
  284. package/src/x_ite/Components/Rendering/LineSet.js +21 -13
  285. package/src/x_ite/Components/Rendering/PointSet.js +21 -13
  286. package/src/x_ite/Components/Rendering/X3DColorNode.js +13 -0
  287. package/src/x_ite/Components/Rendering/X3DComposedGeometryNode.js +13 -5
  288. package/src/x_ite/Components/Rendering/X3DGeometryNode.js +248 -325
  289. package/src/x_ite/Components/Rendering/X3DLineGeometryNode.js +305 -134
  290. package/src/x_ite/Components/Rendering/X3DPointGeometryNode.js +99 -122
  291. package/src/x_ite/Components/RigidBodyPhysics/DoubleAxisHingeJoint.js +24 -38
  292. package/src/x_ite/Components/RigidBodyPhysics/SingleAxisHingeJoint.js +10 -17
  293. package/src/x_ite/Components/Shaders/ComposedShader.js +35 -75
  294. package/src/x_ite/Components/Shaders/FloatVertexAttribute.js +5 -15
  295. package/src/x_ite/Components/Shaders/Matrix3VertexAttribute.js +7 -24
  296. package/src/x_ite/Components/Shaders/Matrix4VertexAttribute.js +7 -24
  297. package/src/x_ite/Components/Shaders/ShaderPart.js +1 -10
  298. package/src/x_ite/Components/Shaders/X3DProgrammableShaderObject.js +219 -209
  299. package/src/x_ite/Components/Shaders/X3DShaderNode.js +1 -1
  300. package/src/x_ite/Components/Shaders/X3DVertexAttributeNode.js +23 -1
  301. package/src/x_ite/Components/Shape/Appearance.js +12 -0
  302. package/src/x_ite/Components/Shape/FillProperties.js +12 -1
  303. package/src/x_ite/Components/Shape/LineProperties.js +33 -1
  304. package/src/x_ite/Components/Shape/PointProperties.js +23 -1
  305. package/src/x_ite/Components/Shape/Shape.js +27 -34
  306. package/src/x_ite/Components/Sound/Sound.js +30 -40
  307. package/src/x_ite/Components/Text/Text.js +6 -20
  308. package/src/x_ite/Components/Texturing/TextureCoordinate.js +5 -26
  309. package/src/x_ite/Components/Texturing/TextureProperties.js +4 -4
  310. package/src/x_ite/Components/Texturing/X3DSingleTextureCoordinateNode.js +21 -0
  311. package/src/x_ite/Components/Texturing/X3DSingleTextureNode.js +5 -4
  312. package/src/x_ite/Components/Texturing/X3DTexture2DNode.js +24 -33
  313. package/src/x_ite/Components/Texturing3D/TextureCoordinate3D.js +5 -26
  314. package/src/x_ite/Components/Texturing3D/TextureCoordinate4D.js +5 -26
  315. package/src/x_ite/Components/Texturing3D/X3DTexture3DNode.js +12 -19
  316. package/src/x_ite/Components/VolumeRendering/X3DVolumeDataNode.js +7 -7
  317. package/src/x_ite/Components.js +2 -2
  318. package/src/x_ite/Fallback.js +9 -3
  319. package/src/x_ite/Fields/SFColor.js +4 -0
  320. package/src/x_ite/Fields/SFColorRGBA.js +4 -0
  321. package/src/x_ite/Fields/SFMatrixPrototypeTemplate.js +4 -0
  322. package/src/x_ite/Fields/SFRotation.js +4 -0
  323. package/src/x_ite/Fields/SFString.js +4 -0
  324. package/src/x_ite/Fields/SFVecPrototypeTemplate.js +4 -0
  325. package/src/x_ite/Parser/XMLParser.js +1 -1
  326. package/src/x_ite/Rendering/TextureBuffer.js +43 -36
  327. package/src/x_ite/Rendering/VertexArray.js +101 -0
  328. package/src/x_ite/Rendering/X3DRenderObject.js +123 -144
  329. package/src/x_ite/X3D.js +32 -26
  330. package/src/x_ite.config.js +0 -5
  331. package/src/x_ite.css +200 -162
  332. package/src/x_ite.html +26 -10
  333. package/src/x_ite.js +42 -0
  334. package/x_ite.min.html +26 -10
  335. package/dist/assets/hatching/0.png +0 -0
  336. package/dist/assets/linetype/0.png +0 -0
  337. package/src/assets/hatching/0.png +0 -0
  338. package/src/assets/linetype/0.png +0 -0
  339. package/src/spinner.css +0 -67
  340. package/src/x_ite/Browser/Shape/LineStipples.xcf +0 -0
@@ -49,6 +49,7 @@
49
49
 
50
50
  define ([
51
51
  "x_ite/Fields",
52
+ "x_ite/Rendering/VertexArray",
52
53
  "x_ite/Components/Core/X3DNode",
53
54
  "x_ite/Base/X3DConstants",
54
55
  "x_ite/Browser/Core/Shading",
@@ -61,6 +62,7 @@ define ([
61
62
  "standard/Math/Algorithm",
62
63
  ],
63
64
  function (Fields,
65
+ VertexArray,
64
66
  X3DNode,
65
67
  X3DConstants,
66
68
  Shading,
@@ -108,13 +110,12 @@ function (Fields,
108
110
  this .max = new Vector3 (0, 0, 0);
109
111
  this .bbox = new Box3 (this .min, this .max, true);
110
112
  this .solid = true;
111
- this .geometryType = 3;
112
113
  this .primitiveMode = browser .getContext () .TRIANGLES;
114
+ this .geometryType = 3;
113
115
  this .flatShading = undefined;
114
116
  this .colorMaterial = false;
115
117
  this .attribNodes = [ ];
116
- this .attribs = [ ];
117
- this .textureCoordinateNode = browser .getDefaultTextureCoordinate ();
118
+ this .attribArrays = [ ];
118
119
  this .textureCoordinateMapping = new Map ();
119
120
  this .multiTexCoords = [ ];
120
121
  this .texCoords = X3DGeometryNode .createArray ();
@@ -123,12 +124,12 @@ function (Fields,
123
124
  this .normals = X3DGeometryNode .createArray ();
124
125
  this .flatNormals = X3DGeometryNode .createArray ();
125
126
  this .vertices = X3DGeometryNode .createArray ();
127
+ this .fogCoords = false;
126
128
  this .vertexCount = 0;
129
+ this .planes = [ ];
127
130
 
128
- // This methods are configured in transfer.
129
- this .depth = Function .prototype;
130
- this .display = Function .prototype;
131
- this .displayParticles = Function .prototype;
131
+ for (let i = 0; i < 5; ++ i)
132
+ this .planes [i] = new Plane3 (Vector3 .Zero, Vector3 .zAxis);
132
133
  }
133
134
 
134
135
  // Function to select ether Array or MFFloat for color/normal/vertex arrays.
@@ -158,10 +159,10 @@ function (Fields,
158
159
 
159
160
  array .shrinkToFit = function ()
160
161
  {
161
- if (this .length !== this .typedArray .length)
162
- this .typedArray = new Float32Array (this);
163
- else
162
+ if (this .length === this .typedArray .length)
164
163
  this .typedArray .set (this);
164
+ else
165
+ this .typedArray = new Float32Array (this);
165
166
  };
166
167
 
167
168
  return array;
@@ -180,24 +181,25 @@ function (Fields,
180
181
  {
181
182
  X3DNode .prototype .initialize .call (this);
182
183
 
184
+ const
185
+ browser = this .getBrowser (),
186
+ gl = browser .getContext ();
187
+
183
188
  this .isLive () .addInterest ("set_live__", this);
184
189
 
185
190
  this .addInterest ("requestRebuild", this);
186
191
  this ._rebuild .addInterest ("rebuild", this);
187
192
 
188
- const gl = this .getBrowser () .getContext ();
189
-
190
- this .frontFace = gl .CCW;
191
- this .attribBuffers = [ ];
192
- this .texCoordBuffers = [ ];
193
- this .fogDepthBuffer = gl .createBuffer ();
194
- this .colorBuffer = gl .createBuffer ();
195
- this .normalBuffer = gl .createBuffer ();
196
- this .vertexBuffer = gl .createBuffer ();
197
- this .planes = [ ];
198
-
199
- for (let i = 0; i < 5; ++ i)
200
- this .planes [i] = new Plane3 (Vector3 .Zero, Vector3 .zAxis);
193
+ this .frontFace = gl .CCW;
194
+ this .attribBuffers = [ ];
195
+ this .textureCoordinateNode = browser .getDefaultTextureCoordinate ();
196
+ this .texCoordBuffers = Array .from ({length: browser .getMaxTextures ()}, () => gl .createBuffer ());
197
+ this .fogDepthBuffer = gl .createBuffer ();
198
+ this .colorBuffer = gl .createBuffer ();
199
+ this .normalBuffer = gl .createBuffer ();
200
+ this .vertexBuffer = gl .createBuffer ();
201
+ this .vertexArrayObject = new VertexArray ();
202
+ this .shadowArrayObject = new VertexArray ();
201
203
 
202
204
  this .set_live__ ();
203
205
  },
@@ -273,7 +275,7 @@ function (Fields,
273
275
  },
274
276
  getAttribs: function ()
275
277
  {
276
- return this .attribs;
278
+ return this .attribArrays;
277
279
  },
278
280
  setFogDepths: function (value)
279
281
  {
@@ -345,6 +347,14 @@ function (Fields,
345
347
  {
346
348
  return this .vertices;
347
349
  },
350
+ updateVertexArrays: function ()
351
+ {
352
+ this .vertexArrayObject .update ();
353
+ this .shadowArrayObject .update ();
354
+
355
+ this .updateParticlesShadow = true;
356
+ this .updateParticles = true;
357
+ },
348
358
  buildTexCoords: function ()
349
359
  {
350
360
  const texCoords = this .texCoords;
@@ -372,7 +382,7 @@ function (Fields,
372
382
  texCoords .shrinkToFit ();
373
383
  }
374
384
 
375
- return texCoords;
385
+ this .getMultiTexCoords () .push (texCoords);
376
386
  },
377
387
  getTexCoordParams: (function ()
378
388
  {
@@ -481,67 +491,62 @@ function (Fields,
481
491
  v2 = new Vector3 (0, 0, 0),
482
492
  clipPoint = new Vector3 (0, 0, 0);
483
493
 
484
- return function (hitRay, clipPlanes, modelViewMatrix_, intersections)
494
+ return function (hitRay, renderObject, appearanceNode, intersections)
485
495
  {
486
- try
496
+ if (this .intersectsBBox (hitRay))
487
497
  {
488
- if (this .intersectsBBox (hitRay))
489
- {
490
- this .transformLine (hitRay); // Apply screen transformations from screen nodes.
491
- this .transformMatrix (modelViewMatrix .assign (modelViewMatrix_)); // Apply screen transformations from screen nodes.
498
+ this .transformLine (hitRay); // Apply screen transformations from screen nodes.
499
+ this .transformMatrix (modelViewMatrix .assign (renderObject .getModelViewMatrix () .get ())); // Apply screen transformations from screen nodes.
492
500
 
493
- const
494
- texCoords = this .multiTexCoords [0] .getValue (),
495
- normals = this .normals .getValue (),
496
- vertices = this .vertices .getValue ();
501
+ const
502
+ texCoords = this .multiTexCoords [0] .getValue (),
503
+ normals = this .normals .getValue (),
504
+ vertices = this .vertices .getValue (),
505
+ vertexCount = this .vertexCount;
497
506
 
498
- for (let i = 0, length = this .vertexCount; i < length; i += 3)
499
- {
500
- const i4 = i * 4;
507
+ for (let i = 0; i < vertexCount; i += 3)
508
+ {
509
+ const i4 = i * 4;
501
510
 
502
- v0 .x = vertices [i4]; v0 .y = vertices [i4 + 1]; v0 .z = vertices [i4 + 2];
503
- v1 .x = vertices [i4 + 4]; v1 .y = vertices [i4 + 5]; v1 .z = vertices [i4 + 6];
504
- v2 .x = vertices [i4 + 8]; v2 .y = vertices [i4 + 9]; v2 .z = vertices [i4 + 10];
511
+ v0 .x = vertices [i4]; v0 .y = vertices [i4 + 1]; v0 .z = vertices [i4 + 2];
512
+ v1 .x = vertices [i4 + 4]; v1 .y = vertices [i4 + 5]; v1 .z = vertices [i4 + 6];
513
+ v2 .x = vertices [i4 + 8]; v2 .y = vertices [i4 + 9]; v2 .z = vertices [i4 + 10];
505
514
 
506
- if (hitRay .intersectsTriangle (v0, v1, v2, uvt))
507
- {
508
- // Get barycentric coordinates.
515
+ if (hitRay .intersectsTriangle (v0, v1, v2, uvt))
516
+ {
517
+ // Get barycentric coordinates.
509
518
 
510
- const
511
- u = uvt .u,
512
- v = uvt .v,
513
- t = uvt .t;
519
+ const
520
+ u = uvt .u,
521
+ v = uvt .v,
522
+ t = uvt .t;
514
523
 
515
- // Determine vectors for X3DPointingDeviceSensors.
524
+ // Determine vectors for X3DPointingDeviceSensors.
516
525
 
517
- const point = new Vector3 (t * vertices [i4] + u * vertices [i4 + 4] + v * vertices [i4 + 8],
518
- t * vertices [i4 + 1] + u * vertices [i4 + 5] + v * vertices [i4 + 9],
519
- t * vertices [i4 + 2] + u * vertices [i4 + 6] + v * vertices [i4 + 10]);
526
+ const point = new Vector3 (t * vertices [i4] + u * vertices [i4 + 4] + v * vertices [i4 + 8],
527
+ t * vertices [i4 + 1] + u * vertices [i4 + 5] + v * vertices [i4 + 9],
528
+ t * vertices [i4 + 2] + u * vertices [i4 + 6] + v * vertices [i4 + 10]);
520
529
 
521
- if (this .isClipped (modelViewMatrix .multVecMatrix (clipPoint .assign (point)), clipPlanes))
522
- continue;
530
+ if (this .isClipped (modelViewMatrix .multVecMatrix (clipPoint .assign (point)), renderObject .getLocalObjects ()))
531
+ {
532
+ continue;
533
+ }
523
534
 
524
- const texCoord = new Vector2 (t * texCoords [i4] + u * texCoords [i4 + 4] + v * texCoords [i4 + 8],
525
- t * texCoords [i4 + 1] + u * texCoords [i4 + 5] + v * texCoords [i4 + 9]);
535
+ const texCoord = new Vector2 (t * texCoords [i4] + u * texCoords [i4 + 4] + v * texCoords [i4 + 8],
536
+ t * texCoords [i4 + 1] + u * texCoords [i4 + 5] + v * texCoords [i4 + 9]);
526
537
 
527
- const i3 = i * 3;
538
+ const i3 = i * 3;
528
539
 
529
- const normal = new Vector3 (t * normals [i3] + u * normals [i3 + 3] + v * normals [i3 + 6],
530
- t * normals [i3 + 1] + u * normals [i3 + 4] + v * normals [i3 + 7],
531
- t * normals [i3 + 2] + u * normals [i3 + 5] + v * normals [i3 + 8]);
540
+ const normal = new Vector3 (t * normals [i3] + u * normals [i3 + 3] + v * normals [i3 + 6],
541
+ t * normals [i3 + 1] + u * normals [i3 + 4] + v * normals [i3 + 7],
542
+ t * normals [i3 + 2] + u * normals [i3 + 5] + v * normals [i3 + 8]);
532
543
 
533
- intersections .push ({ texCoord: texCoord, normal: normal, point: this .getMatrix () .multVecMatrix (point) });
534
- }
544
+ intersections .push ({ texCoord: texCoord, normal: normal, point: this .getMatrix () .multVecMatrix (point) });
535
545
  }
536
546
  }
537
-
538
- return intersections .length;
539
- }
540
- catch (error)
541
- {
542
- console .log (error);
543
- return false;
544
547
  }
548
+
549
+ return intersections .length;
545
550
  };
546
551
  })(),
547
552
  intersectsBBox: (function ()
@@ -615,50 +620,42 @@ function (Fields,
615
620
 
616
621
  return function (box, clipPlanes, modelViewMatrix)
617
622
  {
618
- try
623
+ if (box .intersectsBox (this .bbox))
619
624
  {
620
- if (box .intersectsBox (this .bbox))
621
- {
622
- box .multRight (invMatrix .assign (this .getMatrix ()) .inverse ());
625
+ box .multRight (invMatrix .assign (this .getMatrix ()) .inverse ());
623
626
 
624
- this .transformMatrix (modelViewMatrix); // Apply screen transformations from screen nodes.
627
+ this .transformMatrix (modelViewMatrix); // Apply screen transformations from screen nodes.
625
628
 
626
- const vertices = this .vertices .getValue ();
629
+ const vertices = this .vertices .getValue ();
627
630
 
628
- for (let i = 0, length = this .vertexCount; i < length; i += 3)
629
- {
630
- const i4 = i * 4;
631
+ for (let i = 0, length = this .vertexCount; i < length; i += 3)
632
+ {
633
+ const i4 = i * 4;
631
634
 
632
- v0 .x = vertices [i4]; v0 .y = vertices [i4 + 1]; v0 .z = vertices [i4 + 2];
633
- v1 .x = vertices [i4 + 4]; v1 .y = vertices [i4 + 5]; v1 .z = vertices [i4 + 6];
634
- v2 .x = vertices [i4 + 8]; v2 .y = vertices [i4 + 9]; v2 .z = vertices [i4 + 10];
635
+ v0 .x = vertices [i4]; v0 .y = vertices [i4 + 1]; v0 .z = vertices [i4 + 2];
636
+ v1 .x = vertices [i4 + 4]; v1 .y = vertices [i4 + 5]; v1 .z = vertices [i4 + 6];
637
+ v2 .x = vertices [i4 + 8]; v2 .y = vertices [i4 + 9]; v2 .z = vertices [i4 + 10];
635
638
 
636
- if (box .intersectsTriangle (v0, v1, v2))
639
+ if (box .intersectsTriangle (v0, v1, v2))
640
+ {
641
+ if (clipPlanes .length)
637
642
  {
638
- if (clipPlanes .length)
639
- {
640
- if (this .isClipped (modelViewMatrix .multVecMatrix (clipPoint .assign (v0)), clipPlanes))
641
- continue;
642
-
643
- if (this .isClipped (modelViewMatrix .multVecMatrix (clipPoint .assign (v1)), clipPlanes))
644
- continue;
643
+ if (this .isClipped (modelViewMatrix .multVecMatrix (clipPoint .assign (v0)), clipPlanes))
644
+ continue;
645
645
 
646
- if (this .isClipped (modelViewMatrix .multVecMatrix (clipPoint .assign (v2)), clipPlanes))
647
- continue;
648
- }
646
+ if (this .isClipped (modelViewMatrix .multVecMatrix (clipPoint .assign (v1)), clipPlanes))
647
+ continue;
649
648
 
650
- return true;
649
+ if (this .isClipped (modelViewMatrix .multVecMatrix (clipPoint .assign (v2)), clipPlanes))
650
+ continue;
651
651
  }
652
+
653
+ return true;
652
654
  }
653
655
  }
654
-
655
- return false;
656
- }
657
- catch (error)
658
- {
659
- console .log (error);
660
- return false;
661
656
  }
657
+
658
+ return false;
662
659
  };
663
660
  })(),
664
661
  set_live__: function ()
@@ -723,7 +720,7 @@ function (Fields,
723
720
  // Transfer normals.
724
721
 
725
722
  gl .bindBuffer (gl .ARRAY_BUFFER, this .normalBuffer);
726
- gl .bufferData (gl .ARRAY_BUFFER, flatShading ? this .flatNormals .getValue () : this .normals .getValue (), gl .STATIC_DRAW);
723
+ gl .bufferData (gl .ARRAY_BUFFER, flatShading ? this .flatNormals .getValue () : this .normals .getValue (), gl .DYNAMIC_DRAW);
727
724
  };
728
725
  })(),
729
726
  requestRebuild: function ()
@@ -741,8 +738,8 @@ function (Fields,
741
738
 
742
739
  // Shrink arrays before transfer to graphics card.
743
740
 
744
- for (const attrib of this .attribs)
745
- attrib .shrinkToFit ();
741
+ for (const attribArray of this .attribArrays)
742
+ attribArray .shrinkToFit ();
746
743
 
747
744
  for (const multiTexCoord of this .multiTexCoords)
748
745
  multiTexCoord .shrinkToFit ();
@@ -786,19 +783,17 @@ function (Fields,
786
783
 
787
784
  // Generate texCoord if needed.
788
785
 
789
- if (this .geometryType > 1)
790
- {
791
- if (this .multiTexCoords .length === 0)
792
- this .multiTexCoords .push (this .buildTexCoords ());
786
+ if (this .multiTexCoords .length === 0)
787
+ this .buildTexCoords ();
793
788
 
794
- const
795
- last = this .multiTexCoords .length - 1,
796
- length = this .getBrowser () .getMaxTextures ();
789
+ if (this .multiTexCoords .length)
790
+ {
791
+ const maxTextures = this .getBrowser () .getMaxTextures ();
797
792
 
798
- for (let i = this .multiTexCoords .length; i < length; ++ i)
799
- this .multiTexCoords [i] = this .multiTexCoords [last];
793
+ for (let i = this .multiTexCoords .length; i < maxTextures; ++ i)
794
+ this .multiTexCoords [i] = this .multiTexCoords .at (-1);
800
795
 
801
- this .multiTexCoords .length = length;
796
+ this .multiTexCoords .length = maxTextures;
802
797
  }
803
798
 
804
799
  // Upload normals or flat normals.
@@ -817,19 +812,19 @@ function (Fields,
817
812
  this .min .set (Number .POSITIVE_INFINITY, Number .POSITIVE_INFINITY, Number .POSITIVE_INFINITY);
818
813
  this .max .set (Number .NEGATIVE_INFINITY, Number .NEGATIVE_INFINITY, Number .NEGATIVE_INFINITY);
819
814
 
820
- // Create attrib arrays.
815
+ // Create attribArray arrays.
821
816
  {
822
- const attribs = this .attribs;
817
+ const attribArrays = this .attribArrays;
823
818
 
824
- for (const attrib of attribs)
825
- attrib .length = 0;
819
+ for (const attribArray of attribArrays)
820
+ attribArray .length = 0;
826
821
 
827
822
  const length = this .attribNodes .length;
828
823
 
829
- for (let a = attribs .length; a < length; ++ a)
830
- attribs [a] = X3DGeometryNode .createArray ();
824
+ for (let a = attribArrays .length; a < length; ++ a)
825
+ attribArrays [a] = X3DGeometryNode .createArray ();
831
826
 
832
- attribs .length = length;
827
+ attribArrays .length = length;
833
828
  }
834
829
 
835
830
  // Buffer
@@ -846,114 +841,111 @@ function (Fields,
846
841
  },
847
842
  transfer: function ()
848
843
  {
849
- const
850
- gl = this .getBrowser () .getContext (),
851
- count = this .vertices .length / 4;
844
+ const gl = this .getBrowser () .getContext ();
852
845
 
853
- // Transfer attribs.
846
+ // Transfer attribArrays.
854
847
 
855
- for (let i = this .attribBuffers .length, length = this .attribs .length; i < length; ++ i)
848
+ for (let i = this .attribBuffers .length, length = this .attribArrays .length; i < length; ++ i)
856
849
  this .attribBuffers .push (gl .createBuffer ());
857
850
 
858
- for (let i = 0, length = this .attribs .length; i < length; ++ i)
851
+ for (let i = 0, length = this .attribArrays .length; i < length; ++ i)
859
852
  {
860
853
  gl .bindBuffer (gl .ARRAY_BUFFER, this .attribBuffers [i]);
861
- gl .bufferData (gl .ARRAY_BUFFER, this .attribs [i] .getValue (), gl .STATIC_DRAW);
854
+ gl .bufferData (gl .ARRAY_BUFFER, this .attribArrays [i] .getValue (), gl .DYNAMIC_DRAW);
862
855
  }
863
856
 
864
857
  // Transfer fog depths.
865
858
 
859
+ const lastFogCoords = this .fogCoords;
860
+
866
861
  gl .bindBuffer (gl .ARRAY_BUFFER, this .fogDepthBuffer);
867
- gl .bufferData (gl .ARRAY_BUFFER, this .fogDepths .getValue (), gl .STATIC_DRAW);
862
+ gl .bufferData (gl .ARRAY_BUFFER, this .fogDepths .getValue (), gl .DYNAMIC_DRAW);
863
+
868
864
  this .fogCoords = !! (this .fogDepths .length);
865
+
866
+ if (this .fogCoords !== lastFogCoords)
867
+ this .updateVertexArrays ();
868
+
869
869
  // Transfer colors.
870
870
 
871
+ const lastColorMaterial = this .colorMaterial;
872
+
871
873
  gl .bindBuffer (gl .ARRAY_BUFFER, this .colorBuffer);
872
- gl .bufferData (gl .ARRAY_BUFFER, this .colors .getValue (), gl .STATIC_DRAW);
874
+ gl .bufferData (gl .ARRAY_BUFFER, this .colors .getValue (), gl .DYNAMIC_DRAW);
875
+
873
876
  this .colorMaterial = !! (this .colors .length);
874
877
 
875
- // Transfer multiTexCoords.
878
+ if (this .colorMaterial !== lastColorMaterial)
879
+ this .updateVertexArrays ();
876
880
 
877
- for (let i = this .texCoordBuffers .length, length = this .multiTexCoords .length; i < length; ++ i)
878
- this .texCoordBuffers .push (gl .createBuffer ());
881
+ // Transfer multiTexCoords.
879
882
 
880
883
  for (let i = 0, length = this .multiTexCoords .length; i < length; ++ i)
881
884
  {
882
885
  gl .bindBuffer (gl .ARRAY_BUFFER, this .texCoordBuffers [i]);
883
- gl .bufferData (gl .ARRAY_BUFFER, this .multiTexCoords [i] .getValue (), gl .STATIC_DRAW);
886
+ gl .bufferData (gl .ARRAY_BUFFER, this .multiTexCoords [i] .getValue (), gl .DYNAMIC_DRAW);
884
887
  }
885
888
 
886
889
  // Transfer vertices.
887
890
 
888
891
  gl .bindBuffer (gl .ARRAY_BUFFER, this .vertexBuffer);
889
- gl .bufferData (gl .ARRAY_BUFFER, this .vertices .getValue (), gl .STATIC_DRAW);
890
- this .vertexCount = count;
892
+ gl .bufferData (gl .ARRAY_BUFFER, this .vertices .getValue (), gl .DYNAMIC_DRAW);
893
+
894
+ this .vertexCount = this .vertices .length / 4;
891
895
 
892
896
  // Setup render functions.
893
897
 
894
898
  if (this .vertexCount)
895
899
  {
896
900
  // Use default render functions.
901
+
897
902
  delete this .depth;
898
903
  delete this .display;
904
+ delete this .displayParticlesDepth;
899
905
  delete this .displayParticles;
900
906
  }
901
907
  else
902
908
  {
903
909
  // Use no render function.
904
- this .depth = Function .prototype;
905
- this .display = Function .prototype;
906
- this .displayParticles = Function .prototype;
910
+
911
+ this .depth = Function .prototype;
912
+ this .display = Function .prototype;
913
+ this .displayParticlesDepth = Function .prototype;
914
+ this .displayParticles = Function .prototype;
907
915
  }
908
- },
916
+ },
909
917
  traverse: function (type, renderObject)
910
918
  { },
911
919
  depth: function (gl, context, shaderNode)
912
920
  {
913
- // Setup vertex attributes.
914
-
915
- // Attribs in depth rendering are not supported.
916
- //for (let i = 0, length = attribNodes .length; i < length; ++ i)
917
- // attribNodes [i] .enable (gl, shaderNode, attribBuffers [i]);
918
-
919
- shaderNode .enableVertexAttribute (gl, this .vertexBuffer);
920
-
921
- //for (let i = 0, length = attribNodes .length; i < length; ++ i)
922
- // attribNodes [i] .disable (gl, shaderNode);
921
+ if (this .shadowArrayObject .enable (gl, shaderNode))
922
+ shaderNode .enableVertexAttribute (gl, this .vertexBuffer, 0, 0);
923
923
 
924
924
  gl .drawArrays (this .primitiveMode, 0, this .vertexCount);
925
925
  },
926
926
  display: function (gl, context)
927
927
  {
928
- try
929
- {
930
- const
931
- appearanceNode = context .shapeNode .getAppearance (),
932
- materialNode = appearanceNode .materialNode,
933
- backMaterialNode = appearanceNode .backMaterialNode,
934
- frontShaderNode = appearanceNode .shaderNode || materialNode .getShader (context .browser, context .shadow);
935
-
936
- if (this .solid || !backMaterialNode || frontShaderNode .wireframe)
937
- {
938
- this .displayGeometry (gl, context, appearanceNode, frontShaderNode, true, true);
939
- }
940
- else
941
- {
942
- const backShaderNode = appearanceNode .shaderNode || backMaterialNode .getShader (context .browser, context .shadow)
928
+ const
929
+ appearanceNode = context .shapeNode .getAppearance (),
930
+ materialNode = appearanceNode .materialNode,
931
+ backMaterialNode = appearanceNode .backMaterialNode,
932
+ frontShaderNode = appearanceNode .shaderNode || materialNode .getShader (context .browser, context .shadow);
943
933
 
944
- this .displayGeometry (gl, context, appearanceNode, backShaderNode, true, false);
945
- this .displayGeometry (gl, context, appearanceNode, frontShaderNode, false, true);
946
- }
934
+ if (this .solid || !backMaterialNode || frontShaderNode .wireframe)
935
+ {
936
+ this .displayGeometry (gl, context, appearanceNode, frontShaderNode, true, true);
947
937
  }
948
- catch (error)
938
+ else
949
939
  {
950
- // Catch error from setLocalUniforms.
951
- console .log (error);
940
+ const backShaderNode = appearanceNode .shaderNode || backMaterialNode .getShader (context .browser, context .shadow)
941
+
942
+ this .displayGeometry (gl, context, appearanceNode, backShaderNode, true, false);
943
+ this .displayGeometry (gl, context, appearanceNode, frontShaderNode, false, true);
952
944
  }
953
945
  },
954
946
  displayGeometry: function (gl, context, appearanceNode, shaderNode, back, front)
955
947
  {
956
- if (shaderNode .getValid ())
948
+ if (shaderNode .isValid ())
957
949
  {
958
950
  const
959
951
  blendModeNode = appearanceNode .blendModeNode,
@@ -968,18 +960,21 @@ function (Fields,
968
960
 
969
961
  // Setup vertex attributes.
970
962
 
971
- for (let i = 0, length = attribNodes .length; i < length; ++ i)
972
- attribNodes [i] .enable (gl, shaderNode, attribBuffers [i]);
963
+ if (this .vertexArrayObject .enable (gl, shaderNode))
964
+ {
965
+ for (let i = 0, length = attribNodes .length; i < length; ++ i)
966
+ attribNodes [i] .enable (gl, shaderNode, attribBuffers [i]);
973
967
 
974
- if (this .fogCoords)
975
- shaderNode .enableFogDepthAttribute (gl, this .fogDepthBuffer);
968
+ if (this .fogCoords)
969
+ shaderNode .enableFogDepthAttribute (gl, this .fogDepthBuffer, 0, 0);
976
970
 
977
- if (this .colorMaterial)
978
- shaderNode .enableColorAttribute (gl, this .colorBuffer);
971
+ if (this .colorMaterial)
972
+ shaderNode .enableColorAttribute (gl, this .colorBuffer, 0, 0);
979
973
 
980
- shaderNode .enableTexCoordAttribute (gl, this .texCoordBuffers);
981
- shaderNode .enableNormalAttribute (gl, this .normalBuffer);
982
- shaderNode .enableVertexAttribute (gl, this .vertexBuffer);
974
+ shaderNode .enableTexCoordAttribute (gl, this .texCoordBuffers, 0, 0);
975
+ shaderNode .enableNormalAttribute (gl, this .normalBuffer, 0, 0);
976
+ shaderNode .enableVertexAttribute (gl, this .vertexBuffer, 0, 0);
977
+ }
983
978
 
984
979
  // Draw depending on wireframe, solid and transparent.
985
980
 
@@ -1038,87 +1033,55 @@ function (Fields,
1038
1033
  }
1039
1034
  }
1040
1035
 
1041
- for (const attribNode of attribNodes)
1042
- attribNode .disable (gl, shaderNode);
1043
-
1044
- if (this .fogCoords)
1045
- shaderNode .disableFogDepthAttribute (gl);
1046
-
1047
- if (this .colorMaterial)
1048
- shaderNode .disableColorAttribute (gl);
1049
-
1050
- shaderNode .disableTexCoordAttribute (gl);
1051
- shaderNode .disableNormalAttribute (gl);
1052
-
1053
1036
  if (blendModeNode)
1054
1037
  blendModeNode .disable (gl);
1055
1038
  }
1056
1039
  },
1057
- displayParticlesDepth: function (gl, context, shaderNode, particles, numParticles)
1040
+ displayParticlesDepth: function (gl, context, shaderNode, particleSystem)
1058
1041
  {
1059
- // Attribs in depth rendering are not supported:
1060
- //for (let i = 0, length = attribNodes .length; i < length; ++ i)
1061
- // attribNodes [i] .enable (gl, shaderNode, attribBuffers [i]);
1042
+ const outputParticles = particleSystem .outputParticles;
1062
1043
 
1063
- shaderNode .enableVertexAttribute (gl, this .vertexBuffer);
1064
-
1065
- // Draw depending on wireframe, solid and transparent.
1066
-
1067
- const
1068
- modelViewMatrix = context .modelViewMatrix,
1069
- x = modelViewMatrix [12],
1070
- y = modelViewMatrix [13],
1071
- z = modelViewMatrix [14];
1072
-
1073
- for (let p = 0; p < numParticles; ++ p)
1044
+ if (this .updateParticlesShadow)
1074
1045
  {
1075
- const particle = particles [p];
1076
-
1077
- modelViewMatrix [12] = x;
1078
- modelViewMatrix [13] = y;
1079
- modelViewMatrix [14] = z;
1046
+ this .updateParticlesShadow = false;
1080
1047
 
1081
- Matrix4 .prototype .translate .call (modelViewMatrix, particle .position);
1048
+ outputParticles .shadowArrayObject .update ();
1049
+ }
1082
1050
 
1083
- shaderNode .setParticle (gl, particle, modelViewMatrix);
1051
+ if (outputParticles .shadowArrayObject .enable (gl, shaderNode))
1052
+ {
1053
+ const particleStride = particleSystem .particleStride;
1084
1054
 
1085
- gl .drawArrays (shaderNode .primitiveMode, 0, this .vertexCount);
1055
+ shaderNode .enableParticleAttribute (gl, outputParticles, particleStride, particleSystem .particleOffset, 1);
1056
+ shaderNode .enableParticleMatrixAttribute (gl, outputParticles, particleStride, particleSystem .matrixOffset, 1);
1057
+ shaderNode .enableVertexAttribute (gl, this .vertexBuffer, 0, 0);
1086
1058
  }
1087
1059
 
1088
- //for (let i = 0, length = attribNodes .length; i < length; ++ i)
1089
- // attribNodes [i] .disable (gl, shaderNode);
1060
+ gl .drawArraysInstanced (shaderNode .primitiveMode, 0, this .vertexCount, particleSystem .numParticles);
1090
1061
  },
1091
- displayParticles: function (gl, context, particles, numParticles)
1062
+ displayParticles: function (gl, context, particleSystem)
1092
1063
  {
1093
- try
1094
- {
1095
- const
1096
- appearanceNode = context .shapeNode .getAppearance (),
1097
- materialNode = appearanceNode .materialNode,
1098
- backMaterialNode = appearanceNode .backMaterialNode,
1099
- frontShaderNode = appearanceNode .shaderNode || materialNode .getShader (context .browser, context .shadow);
1100
-
1101
- if (this .solid || !backMaterialNode || frontShaderNode .wireframe)
1102
- {
1103
- this .displayParticlesGeometry (gl, context, appearanceNode, frontShaderNode, true, true, particles, numParticles);
1104
- }
1105
- else
1106
- {
1107
- const backShaderNode = appearanceNode .shaderNode || backMaterialNode .getShader (context .browser, context .shadow);
1064
+ const
1065
+ appearanceNode = context .shapeNode .getAppearance (),
1066
+ materialNode = appearanceNode .materialNode,
1067
+ backMaterialNode = appearanceNode .backMaterialNode,
1068
+ frontShaderNode = appearanceNode .shaderNode || materialNode .getShader (context .browser, context .shadow);
1108
1069
 
1109
- this .displayParticlesGeometry (gl, context, appearanceNode, backShaderNode, true, false, particles, numParticles);
1110
- this .displayParticlesGeometry (gl, context, appearanceNode, frontShaderNode, false, true, particles, numParticles);
1111
- }
1070
+ if (this .solid || !backMaterialNode || frontShaderNode .wireframe)
1071
+ {
1072
+ this .displayParticlesGeometry (gl, context, appearanceNode, frontShaderNode, true, true, particleSystem);
1112
1073
  }
1113
- catch (error)
1074
+ else
1114
1075
  {
1115
- // Catch error from setLocalUniforms.
1116
- console .log (error);
1076
+ const backShaderNode = appearanceNode .shaderNode || backMaterialNode .getShader (context .browser, context .shadow);
1077
+
1078
+ this .displayParticlesGeometry (gl, context, appearanceNode, backShaderNode, true, false, particleSystem);
1079
+ this .displayParticlesGeometry (gl, context, appearanceNode, frontShaderNode, false, true, particleSystem);
1117
1080
  }
1118
1081
  },
1119
- displayParticlesGeometry: function (gl, context, appearanceNode, shaderNode, back, front, particles, numParticles)
1082
+ displayParticlesGeometry: function (gl, context, appearanceNode, shaderNode, back, front, particleSystem)
1120
1083
  {
1121
- if (shaderNode .getValid ())
1084
+ if (shaderNode .isValid ())
1122
1085
  {
1123
1086
  const
1124
1087
  blendModeNode = appearanceNode .blendModeNode,
@@ -1135,52 +1098,50 @@ function (Fields,
1135
1098
 
1136
1099
  // Setup vertex attributes.
1137
1100
 
1138
- for (let i = 0, length = attribNodes .length; i < length; ++ i)
1139
- attribNodes [i] .enable (gl, shaderNode, attribBuffers [i]);
1101
+ const outputParticles = particleSystem .outputParticles;
1140
1102
 
1141
- if (this .fogCoords)
1142
- shaderNode .enableFogDepthAttribute (gl, this .fogDepthBuffer);
1103
+ if (this .updateParticles)
1104
+ {
1105
+ this .updateParticles = false;
1143
1106
 
1144
- if (this .colorMaterial)
1145
- shaderNode .enableColorAttribute (gl, this .colorBuffer);
1107
+ outputParticles .vertexArrayObject .update ();
1108
+ }
1146
1109
 
1147
- shaderNode .enableTexCoordAttribute (gl, this .texCoordBuffers);
1148
- shaderNode .enableNormalAttribute (gl, this .normalBuffer);
1149
- shaderNode .enableVertexAttribute (gl, this .vertexBuffer);
1110
+ if (outputParticles .vertexArrayObject .enable (gl, shaderNode))
1111
+ {
1112
+ const particleStride = particleSystem .particleStride;
1150
1113
 
1151
- // Draw depending on wireframe, solid and transparent.
1114
+ shaderNode .enableParticleAttribute (gl, outputParticles, particleStride, particleSystem .particleOffset, 1);
1115
+ shaderNode .enableParticleMatrixAttribute (gl, outputParticles, particleStride, particleSystem .matrixOffset, 1);
1152
1116
 
1153
- const
1154
- modelViewMatrix = context .modelViewMatrix,
1155
- x = modelViewMatrix [12],
1156
- y = modelViewMatrix [13],
1157
- z = modelViewMatrix [14];
1117
+ for (let i = 0, length = attribNodes .length; i < length; ++ i)
1118
+ attribNodes [i] .enable (gl, shaderNode, attribBuffers [i]);
1158
1119
 
1159
- if (shaderNode .wireframe)
1160
- {
1161
- // Points and Wireframes.
1120
+ if (this .fogCoords)
1121
+ shaderNode .enableFogDepthAttribute (gl, this .fogDepthBuffer, 0, 0);
1162
1122
 
1163
- for (let p = 0; p < numParticles; ++ p)
1164
- {
1165
- const particle = particles [p];
1123
+ if (this .colorMaterial)
1124
+ shaderNode .enableColorAttribute (gl, this .colorBuffer, 0, 0);
1166
1125
 
1167
- modelViewMatrix [12] = x;
1168
- modelViewMatrix [13] = y;
1169
- modelViewMatrix [14] = z;
1126
+ shaderNode .enableTexCoordAttribute (gl, this .texCoordBuffers, 0, 0);
1127
+ shaderNode .enableNormalAttribute (gl, this .normalBuffer, 0, 0);
1128
+ shaderNode .enableVertexAttribute (gl, this .vertexBuffer, 0, 0);
1129
+ }
1170
1130
 
1171
- Matrix4 .prototype .translate .call (modelViewMatrix, particle .position);
1131
+ // Draw depending on wireframe, solid and transparent.
1172
1132
 
1173
- shaderNode .setParticle (gl, particle, modelViewMatrix);
1133
+ if (shaderNode .wireframe)
1134
+ {
1135
+ // Points and Wireframes.
1174
1136
 
1175
- if (shaderNode .primitiveMode === gl .POINTS)
1176
- {
1177
- gl .drawArrays (shaderNode .primitiveMode, 0, this .vertexCount);
1178
- }
1179
- else
1180
- {
1181
- for (let i = 0, length = this .vertexCount; i < length; i += 3)
1182
- gl .drawArrays (shaderNode .primitiveMode, i, 3);
1183
- }
1137
+ if (shaderNode .primitiveMode === gl .POINTS)
1138
+ {
1139
+ gl .drawArraysInstanced (shaderNode .primitiveMode, 0, this .vertexCount, particleSystem .numParticles);
1140
+ }
1141
+ else
1142
+ {
1143
+ for (let i = 0, length = this .vertexCount; i < length; i += 3)
1144
+ gl .drawArraysInstanced (shaderNode .primitiveMode, i, 3, particleSystem .numParticles);
1184
1145
  }
1185
1146
  }
1186
1147
  else
@@ -1193,31 +1154,18 @@ function (Fields,
1193
1154
  {
1194
1155
  // Render transparent or back or front.
1195
1156
 
1196
- for (let p = 0; p < numParticles; ++ p)
1197
- {
1198
- const particle = particles [p];
1199
-
1200
- modelViewMatrix [12] = x;
1201
- modelViewMatrix [13] = y;
1202
- modelViewMatrix [14] = z;
1203
-
1204
- Matrix4 .prototype .translate .call (modelViewMatrix, particle .position);
1205
-
1206
- shaderNode .setParticle (gl, particle, modelViewMatrix);
1207
-
1208
- gl .enable (gl .CULL_FACE);
1157
+ gl .enable (gl .CULL_FACE);
1209
1158
 
1210
- if (back && !this .solid)
1211
- {
1212
- gl .cullFace (gl .FRONT);
1213
- gl .drawArrays (shaderNode .primitiveMode, 0, this .vertexCount);
1214
- }
1159
+ if (back && !this .solid)
1160
+ {
1161
+ gl .cullFace (gl .FRONT);
1162
+ gl .drawArraysInstanced (shaderNode .primitiveMode, 0, this .vertexCount, particleSystem .numParticles);
1163
+ }
1215
1164
 
1216
- if (front)
1217
- {
1218
- gl .cullFace (gl .BACK);
1219
- gl .drawArrays (shaderNode .primitiveMode, 0, this .vertexCount);
1220
- }
1165
+ if (front)
1166
+ {
1167
+ gl .cullFace (gl .BACK);
1168
+ gl .drawArraysInstanced (shaderNode .primitiveMode, 0, this .vertexCount, particleSystem .numParticles);
1221
1169
  }
1222
1170
  }
1223
1171
  else
@@ -1229,35 +1177,10 @@ function (Fields,
1229
1177
  else
1230
1178
  gl .disable (gl .CULL_FACE);
1231
1179
 
1232
- for (let p = 0; p < numParticles; ++ p)
1233
- {
1234
- const particle = particles [p];
1235
-
1236
- modelViewMatrix [12] = x;
1237
- modelViewMatrix [13] = y;
1238
- modelViewMatrix [14] = z;
1239
-
1240
- Matrix4 .prototype .translate .call (modelViewMatrix, particle .position);
1241
-
1242
- shaderNode .setParticle (gl, particle, modelViewMatrix);
1243
-
1244
- gl .drawArrays (shaderNode .primitiveMode, 0, this .vertexCount);
1245
- }
1180
+ gl .drawArraysInstanced (shaderNode .primitiveMode, 0, this .vertexCount, particleSystem .numParticles);
1246
1181
  }
1247
1182
  }
1248
1183
 
1249
- for (const attribNode of attribNodes)
1250
- attribNode .disable (gl, shaderNode);
1251
-
1252
- if (this .fogCoords)
1253
- shaderNode .disableFogDepthAttribute (gl);
1254
-
1255
- if (this .colorMaterial)
1256
- shaderNode .disableColorAttribute (gl);
1257
-
1258
- shaderNode .disableTexCoordAttribute (gl);
1259
- shaderNode .disableNormalAttribute (gl);
1260
-
1261
1184
  if (blendModeNode)
1262
1185
  blendModeNode .disable (gl);
1263
1186
  }