@xeokit/xeokit-sdk 2.5.2-beta-10 → 2.5.2-beta-13

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 (462) hide show
  1. package/dist/xeokit-sdk.cjs.js +146 -132
  2. package/dist/xeokit-sdk.es.js +146 -132
  3. package/dist/xeokit-sdk.es5.js +84 -84
  4. package/dist/xeokit-sdk.min.cjs.js +1 -1
  5. package/dist/xeokit-sdk.min.es.js +1 -1
  6. package/dist/xeokit-sdk.min.es5.js +1 -1
  7. package/package.json +1 -1
  8. package/src/src/extras/ContextMenu/ContextMenu.js +907 -0
  9. package/src/src/extras/ContextMenu/index.js +1 -0
  10. package/src/src/extras/MarqueePicker/MarqueePicker.js +352 -0
  11. package/src/src/extras/MarqueePicker/MarqueePickerMouseControl.js +174 -0
  12. package/src/src/extras/MarqueePicker/index.js +2 -0
  13. package/src/src/extras/PointerLens/PointerLens.js +312 -0
  14. package/src/src/extras/PointerLens/index.js +1 -0
  15. package/src/src/extras/collision/ObjectsKdTree3.js +149 -0
  16. package/src/src/extras/collision/index.js +1 -0
  17. package/src/src/extras/index.js +4 -0
  18. package/src/src/index.js +3 -0
  19. package/src/src/plugins/AngleMeasurementsPlugin/AngleMeasurement.js +731 -0
  20. package/src/src/plugins/AngleMeasurementsPlugin/AngleMeasurementsControl.js +84 -0
  21. package/src/src/plugins/AngleMeasurementsPlugin/AngleMeasurementsMouseControl.js +435 -0
  22. package/src/src/plugins/AngleMeasurementsPlugin/AngleMeasurementsPlugin.js +406 -0
  23. package/src/src/plugins/AngleMeasurementsPlugin/index.js +3 -0
  24. package/src/src/plugins/AnnotationsPlugin/Annotation.js +368 -0
  25. package/src/src/plugins/AnnotationsPlugin/AnnotationsPlugin.js +583 -0
  26. package/src/src/plugins/AnnotationsPlugin/index.js +1 -0
  27. package/src/src/plugins/AxisGizmoPlugin/AxisGizmoPlugin.js +333 -0
  28. package/src/src/plugins/AxisGizmoPlugin/index.js +1 -0
  29. package/src/src/plugins/BCFViewpointsPlugin/BCFViewpointsPlugin.js +977 -0
  30. package/src/src/plugins/BCFViewpointsPlugin/index.js +1 -0
  31. package/src/src/plugins/CityJSONLoaderPlugin/CityJSONDefaultDataSource.js +29 -0
  32. package/src/src/plugins/CityJSONLoaderPlugin/CityJSONLoaderPlugin.js +751 -0
  33. package/src/src/plugins/CityJSONLoaderPlugin/index.js +1 -0
  34. package/src/src/plugins/DistanceMeasurementsPlugin/DistanceMeasurement.js +963 -0
  35. package/src/src/plugins/DistanceMeasurementsPlugin/DistanceMeasurementsControl.js +84 -0
  36. package/src/src/plugins/DistanceMeasurementsPlugin/DistanceMeasurementsMouseControl.js +399 -0
  37. package/src/src/plugins/DistanceMeasurementsPlugin/DistanceMeasurementsPlugin.js +505 -0
  38. package/src/src/plugins/DistanceMeasurementsPlugin/index.js +3 -0
  39. package/src/src/plugins/FaceAlignedSectionPlanesPlugin/FaceAlignedSectionPlanesControl.js +639 -0
  40. package/src/src/plugins/FaceAlignedSectionPlanesPlugin/FaceAlignedSectionPlanesPlugin.js +436 -0
  41. package/src/src/plugins/FaceAlignedSectionPlanesPlugin/Overview.js +247 -0
  42. package/src/src/plugins/FaceAlignedSectionPlanesPlugin/Plane.js +167 -0
  43. package/src/src/plugins/FaceAlignedSectionPlanesPlugin/index.js +1 -0
  44. package/src/src/plugins/FastNavPlugin/FastNavPlugin.js +429 -0
  45. package/src/src/plugins/FastNavPlugin/index.js +1 -0
  46. package/src/src/plugins/GLTFLoaderPlugin/GLTFDefaultDataSource.js +140 -0
  47. package/src/src/plugins/GLTFLoaderPlugin/GLTFLoaderPlugin.js +421 -0
  48. package/src/src/plugins/GLTFLoaderPlugin/GLTFSceneModelLoader.js +669 -0
  49. package/src/src/plugins/GLTFLoaderPlugin/index.js +2 -0
  50. package/src/src/plugins/LASLoaderPlugin/LASDefaultDataSource.js +58 -0
  51. package/src/src/plugins/LASLoaderPlugin/LASLoaderPlugin.js +563 -0
  52. package/src/src/plugins/LASLoaderPlugin/index.js +1 -0
  53. package/src/src/plugins/LASLoaderPlugin/loadLASHeader.js +183 -0
  54. package/src/src/plugins/NavCubePlugin/CubeTextureCanvas.js +290 -0
  55. package/src/src/plugins/NavCubePlugin/NavCubePlugin.js +753 -0
  56. package/src/src/plugins/NavCubePlugin/index.js +1 -0
  57. package/src/src/plugins/OBJLoaderPlugin/OBJLoaderPlugin.js +145 -0
  58. package/src/src/plugins/OBJLoaderPlugin/OBJSceneGraphLoader.js +777 -0
  59. package/src/src/plugins/OBJLoaderPlugin/index.js +1 -0
  60. package/src/src/plugins/STLLoaderPlugin/STLDefaultDataSource.js +33 -0
  61. package/src/src/plugins/STLLoaderPlugin/STLLoaderPlugin.js +274 -0
  62. package/src/src/plugins/STLLoaderPlugin/STLSceneGraphLoader.js +313 -0
  63. package/src/src/plugins/STLLoaderPlugin/index.js +2 -0
  64. package/src/src/plugins/SectionPlanesPlugin/Control.js +1328 -0
  65. package/src/src/plugins/SectionPlanesPlugin/Overview.js +249 -0
  66. package/src/src/plugins/SectionPlanesPlugin/Plane.js +169 -0
  67. package/src/src/plugins/SectionPlanesPlugin/SectionPlanesPlugin.js +404 -0
  68. package/src/src/plugins/SectionPlanesPlugin/index.js +1 -0
  69. package/src/src/plugins/SkyboxesPlugin/SkyboxesPlugin.js +134 -0
  70. package/src/src/plugins/SkyboxesPlugin/index.js +1 -0
  71. package/src/src/plugins/StoreyViewsPlugin/Storey.js +84 -0
  72. package/src/src/plugins/StoreyViewsPlugin/StoreyMap.js +57 -0
  73. package/src/src/plugins/StoreyViewsPlugin/StoreyViewsPlugin.js +773 -0
  74. package/src/src/plugins/StoreyViewsPlugin/index.js +1 -0
  75. package/src/src/plugins/TreeViewPlugin/RenderService.js +169 -0
  76. package/src/src/plugins/TreeViewPlugin/TreeViewNode.js +101 -0
  77. package/src/src/plugins/TreeViewPlugin/TreeViewPlugin.js +1370 -0
  78. package/src/src/plugins/TreeViewPlugin/index.js +1 -0
  79. package/src/src/plugins/ViewCullPlugin/ViewCullPlugin.js +295 -0
  80. package/src/src/plugins/ViewCullPlugin/index.js +1 -0
  81. package/src/src/plugins/WebIFCLoaderPlugin/WebIFCDefaultDataSource.js +58 -0
  82. package/src/src/plugins/WebIFCLoaderPlugin/WebIFCLoaderPlugin.js +942 -0
  83. package/src/src/plugins/WebIFCLoaderPlugin/index.js +1 -0
  84. package/src/src/plugins/XKTLoaderPlugin/XKTDefaultDataSource.js +95 -0
  85. package/src/src/plugins/XKTLoaderPlugin/XKTLoaderPlugin.js +1194 -0
  86. package/src/src/plugins/XKTLoaderPlugin/index.js +2 -0
  87. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV1.js +169 -0
  88. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV10.js +660 -0
  89. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV11.js +663 -0
  90. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV2.js +230 -0
  91. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV3.js +223 -0
  92. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV4.js +283 -0
  93. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV5.js +246 -0
  94. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV6.js +301 -0
  95. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV7.js +439 -0
  96. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV8.js +563 -0
  97. package/src/src/plugins/XKTLoaderPlugin/parsers/ParserV9.js +518 -0
  98. package/src/src/plugins/XKTLoaderPlugin/parsers/lib/pako.js +2 -0
  99. package/src/src/plugins/XML3DLoaderPlugin/XML3DLoaderPlugin.js +238 -0
  100. package/src/src/plugins/XML3DLoaderPlugin/XML3DSceneGraphLoader.js +1279 -0
  101. package/src/src/plugins/XML3DLoaderPlugin/index.js +1 -0
  102. package/src/src/plugins/XML3DLoaderPlugin/zipjs/.jshintrc +11 -0
  103. package/src/src/plugins/XML3DLoaderPlugin/zipjs/deflate.js +2060 -0
  104. package/src/src/plugins/XML3DLoaderPlugin/zipjs/inflate.js +2155 -0
  105. package/src/src/plugins/XML3DLoaderPlugin/zipjs/mime-types.js +1002 -0
  106. package/src/src/plugins/XML3DLoaderPlugin/zipjs/pako/codecs.js +64 -0
  107. package/src/src/plugins/XML3DLoaderPlugin/zipjs/z-worker.js +153 -0
  108. package/src/src/plugins/XML3DLoaderPlugin/zipjs/zip-ext.js +267 -0
  109. package/src/src/plugins/XML3DLoaderPlugin/zipjs/zip-fs.js +553 -0
  110. package/src/src/plugins/XML3DLoaderPlugin/zipjs/zip.js +991 -0
  111. package/src/src/plugins/XML3DLoaderPlugin/zipjs/zlib-asm/codecs.js +49 -0
  112. package/src/src/plugins/index.js +21 -0
  113. package/src/src/plugins/lib/culling/ObjectCullStates.js +208 -0
  114. package/src/src/plugins/lib/earcut.js +677 -0
  115. package/src/src/plugins/lib/html/Dot.js +179 -0
  116. package/src/src/plugins/lib/html/Label.js +174 -0
  117. package/src/src/plugins/lib/html/Wire.js +220 -0
  118. package/src/src/viewer/Configs.js +127 -0
  119. package/src/src/viewer/Plugin.js +233 -0
  120. package/src/src/viewer/Viewer.js +542 -0
  121. package/src/src/viewer/index.js +5 -0
  122. package/src/src/viewer/localization/LocaleService.js +475 -0
  123. package/src/src/viewer/metadata/IFCObjectDefaultColors.js +163 -0
  124. package/src/src/viewer/metadata/IFCObjectDefaults.js +17 -0
  125. package/src/src/viewer/metadata/MetaModel.js +414 -0
  126. package/src/src/viewer/metadata/MetaObject.js +223 -0
  127. package/src/src/viewer/metadata/MetaScene.js +336 -0
  128. package/src/src/viewer/metadata/Property.js +55 -0
  129. package/src/src/viewer/metadata/PropertySet.js +77 -0
  130. package/src/src/viewer/scene/Bitmap/Bitmap.js +473 -0
  131. package/src/src/viewer/scene/Bitmap/index.js +1 -0
  132. package/src/src/viewer/scene/CameraControl/CameraControl.js +1750 -0
  133. package/src/src/viewer/scene/CameraControl/lib/CameraUpdater.js +312 -0
  134. package/src/src/viewer/scene/CameraControl/lib/controllers/PanController.js +112 -0
  135. package/src/src/viewer/scene/CameraControl/lib/controllers/PickController.js +265 -0
  136. package/src/src/viewer/scene/CameraControl/lib/controllers/PivotController.js +384 -0
  137. package/src/src/viewer/scene/CameraControl/lib/handlers/KeyboardAxisViewHandler.js +122 -0
  138. package/src/src/viewer/scene/CameraControl/lib/handlers/KeyboardPanRotateDollyHandler.js +183 -0
  139. package/src/src/viewer/scene/CameraControl/lib/handlers/MouseMiscHandler.js +68 -0
  140. package/src/src/viewer/scene/CameraControl/lib/handlers/MousePanRotateDollyHandler.js +345 -0
  141. package/src/src/viewer/scene/CameraControl/lib/handlers/MousePickHandler.js +376 -0
  142. package/src/src/viewer/scene/CameraControl/lib/handlers/TouchPanRotateAndDollyHandler.js +288 -0
  143. package/src/src/viewer/scene/CameraControl/lib/handlers/TouchPickHandler.js +235 -0
  144. package/src/src/viewer/scene/Component.js +915 -0
  145. package/src/src/viewer/scene/Entity.js +502 -0
  146. package/src/src/viewer/scene/ImagePlane/ImagePlane.js +570 -0
  147. package/src/src/viewer/scene/ImagePlane/index.js +1 -0
  148. package/src/src/viewer/scene/LineSet/LineSet.js +163 -0
  149. package/src/src/viewer/scene/LineSet/index.js +1 -0
  150. package/src/src/viewer/scene/camera/Camera.js +912 -0
  151. package/src/src/viewer/scene/camera/CameraFlightAnimation.js +669 -0
  152. package/src/src/viewer/scene/camera/CameraPath.js +194 -0
  153. package/src/src/viewer/scene/camera/CameraPathAnimation.js +326 -0
  154. package/src/src/viewer/scene/camera/CustomProjection.js +149 -0
  155. package/src/src/viewer/scene/camera/Frustum.js +316 -0
  156. package/src/src/viewer/scene/camera/Ortho.js +286 -0
  157. package/src/src/viewer/scene/camera/Perspective.js +304 -0
  158. package/src/src/viewer/scene/camera/index.js +2 -0
  159. package/src/src/viewer/scene/canvas/Canvas.js +490 -0
  160. package/src/src/viewer/scene/canvas/Spinner.js +323 -0
  161. package/src/src/viewer/scene/constants/constants.js +371 -0
  162. package/src/src/viewer/scene/core.js +268 -0
  163. package/src/src/viewer/scene/geometry/Geometry.js +33 -0
  164. package/src/src/viewer/scene/geometry/ReadableGeometry.js +682 -0
  165. package/src/src/viewer/scene/geometry/VBOGeometry.js +319 -0
  166. package/src/src/viewer/scene/geometry/builders/buildBoxGeometry.js +238 -0
  167. package/src/src/viewer/scene/geometry/builders/buildBoxLinesGeometry.js +106 -0
  168. package/src/src/viewer/scene/geometry/builders/buildCylinderGeometry.js +271 -0
  169. package/src/src/viewer/scene/geometry/builders/buildGridGeometry.js +102 -0
  170. package/src/src/viewer/scene/geometry/builders/buildPlaneGeometry.js +168 -0
  171. package/src/src/viewer/scene/geometry/builders/buildSphereGeometry.js +161 -0
  172. package/src/src/viewer/scene/geometry/builders/buildTorusGeometry.js +172 -0
  173. package/src/src/viewer/scene/geometry/builders/buildVectorTextGeometry.js +1721 -0
  174. package/src/src/viewer/scene/geometry/builders/index.js +8 -0
  175. package/src/src/viewer/scene/geometry/index.js +4 -0
  176. package/src/src/viewer/scene/geometry/loaders/index.js +2 -0
  177. package/src/src/viewer/scene/geometry/loaders/load3DSGeometry.js +103 -0
  178. package/src/src/viewer/scene/geometry/loaders/loadOBJGeometry.js +130 -0
  179. package/src/src/viewer/scene/index.js +21 -0
  180. package/src/src/viewer/scene/input/Input.js +1333 -0
  181. package/src/src/viewer/scene/libs/k3d.js +1032 -0
  182. package/src/src/viewer/scene/lights/AmbientLight.js +175 -0
  183. package/src/src/viewer/scene/lights/CubeTexture.js +156 -0
  184. package/src/src/viewer/scene/lights/DirLight.js +314 -0
  185. package/src/src/viewer/scene/lights/Light.js +29 -0
  186. package/src/src/viewer/scene/lights/LightMap.js +77 -0
  187. package/src/src/viewer/scene/lights/PointLight.js +395 -0
  188. package/src/src/viewer/scene/lights/ReflectionMap.js +79 -0
  189. package/src/src/viewer/scene/lights/Shadow.js +138 -0
  190. package/src/src/viewer/scene/lights/index.js +5 -0
  191. package/src/src/viewer/scene/marker/Marker.js +383 -0
  192. package/src/src/viewer/scene/marker/SpriteMarker.js +356 -0
  193. package/src/src/viewer/scene/marker/index.js +2 -0
  194. package/src/src/viewer/scene/materials/EdgeMaterial.js +359 -0
  195. package/src/src/viewer/scene/materials/EmphasisMaterial.js +613 -0
  196. package/src/src/viewer/scene/materials/Fresnel.js +222 -0
  197. package/src/src/viewer/scene/materials/LambertMaterial.js +378 -0
  198. package/src/src/viewer/scene/materials/LinesMaterial.js +169 -0
  199. package/src/src/viewer/scene/materials/Material.js +39 -0
  200. package/src/src/viewer/scene/materials/MetallicMaterial.js +820 -0
  201. package/src/src/viewer/scene/materials/PhongMaterial.js +860 -0
  202. package/src/src/viewer/scene/materials/PointsMaterial.js +409 -0
  203. package/src/src/viewer/scene/materials/SpecularMaterial.js +807 -0
  204. package/src/src/viewer/scene/materials/Texture.js +513 -0
  205. package/src/src/viewer/scene/materials/index.js +8 -0
  206. package/src/src/viewer/scene/math/Frustum.js +118 -0
  207. package/src/src/viewer/scene/math/buildEdgeIndices.js +162 -0
  208. package/src/src/viewer/scene/math/geometryCompressionUtils.js +365 -0
  209. package/src/src/viewer/scene/math/index.js +3 -0
  210. package/src/src/viewer/scene/math/math.js +5386 -0
  211. package/src/src/viewer/scene/math/rtcCoords.js +139 -0
  212. package/src/src/viewer/scene/mementos/CameraMemento.js +200 -0
  213. package/src/src/viewer/scene/mementos/ModelMemento.js +263 -0
  214. package/src/src/viewer/scene/mementos/ObjectsMemento.js +259 -0
  215. package/src/src/viewer/scene/mementos/index.js +3 -0
  216. package/src/src/viewer/scene/mesh/Mesh.js +2202 -0
  217. package/src/src/viewer/scene/mesh/draw/DrawRenderer.js +996 -0
  218. package/src/src/viewer/scene/mesh/draw/DrawShaderSource.js +1570 -0
  219. package/src/src/viewer/scene/mesh/emphasis/EmphasisEdgesRenderer.js +259 -0
  220. package/src/src/viewer/scene/mesh/emphasis/EmphasisEdgesShaderSource.js +159 -0
  221. package/src/src/viewer/scene/mesh/emphasis/EmphasisFillRenderer.js +286 -0
  222. package/src/src/viewer/scene/mesh/emphasis/EmphasisFillShaderSource.js +262 -0
  223. package/src/src/viewer/scene/mesh/index.js +1 -0
  224. package/src/src/viewer/scene/mesh/occlusion/OcclusionRenderer.js +217 -0
  225. package/src/src/viewer/scene/mesh/occlusion/OcclusionShaderSource.js +157 -0
  226. package/src/src/viewer/scene/mesh/pick/PickMeshRenderer.js +223 -0
  227. package/src/src/viewer/scene/mesh/pick/PickMeshShaderSource.js +151 -0
  228. package/src/src/viewer/scene/mesh/pick/PickTriangleRenderer.js +200 -0
  229. package/src/src/viewer/scene/mesh/pick/PickTriangleShaderSource.js +124 -0
  230. package/src/src/viewer/scene/mesh/shadow/ShadowRenderer.js +214 -0
  231. package/src/src/viewer/scene/mesh/shadow/ShadowShaderSource.js +98 -0
  232. package/src/src/viewer/scene/metriqs/Metriqs.js +259 -0
  233. package/src/src/viewer/scene/model/ENTITY_FLAGS.js +21 -0
  234. package/src/src/viewer/scene/model/PerformanceModel.js +26 -0
  235. package/src/src/viewer/scene/model/RENDER_PASSES.js +34 -0
  236. package/src/src/viewer/scene/model/SceneModel.js +4018 -0
  237. package/src/src/viewer/scene/model/SceneModelEntity.js +715 -0
  238. package/src/src/viewer/scene/model/SceneModelMesh.js +341 -0
  239. package/src/src/viewer/scene/model/SceneModelTexture.js +38 -0
  240. package/src/src/viewer/scene/model/SceneModelTextureSet.js +59 -0
  241. package/src/src/viewer/scene/model/SceneModelTransform.js +404 -0
  242. package/src/src/viewer/scene/model/VBOSceneModel.js +26 -0
  243. package/src/src/viewer/scene/model/calculateUniquePositions.js +126 -0
  244. package/src/src/viewer/scene/model/compression.js +227 -0
  245. package/src/src/viewer/scene/model/dtx/BindableDataTexture.js +31 -0
  246. package/src/src/viewer/scene/model/dtx/lines/DTXLinesBuffer.js +27 -0
  247. package/src/src/viewer/scene/model/dtx/lines/DTXLinesLayer.js +891 -0
  248. package/src/src/viewer/scene/model/dtx/lines/DTXLinesState.js +46 -0
  249. package/src/src/viewer/scene/model/dtx/lines/DTXLinesTextureFactory.js +411 -0
  250. package/src/src/viewer/scene/model/dtx/lines/dataTextureRamStats.js +49 -0
  251. package/src/src/viewer/scene/model/dtx/lines/rebucketPositions.js +208 -0
  252. package/src/src/viewer/scene/model/dtx/lines/renderers/DTXLinesColorRenderer.js +389 -0
  253. package/src/src/viewer/scene/model/dtx/lines/renderers/DTXLinesRenderers.js +65 -0
  254. package/src/src/viewer/scene/model/dtx/triangles/DTXTrianglesLayer.js +1322 -0
  255. package/src/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesBuffer.js +46 -0
  256. package/src/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesState.js +250 -0
  257. package/src/src/viewer/scene/model/dtx/triangles/lib/DTXTrianglesTextureFactory.js +518 -0
  258. package/src/src/viewer/scene/model/dtx/triangles/lib/dataTextureRamStats.js +54 -0
  259. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesColorRenderer.js +619 -0
  260. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesDepthRenderer.js +464 -0
  261. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesEdgesColorRenderer.js +414 -0
  262. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesEdgesRenderer.js +422 -0
  263. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesNormalsRenderer.js +345 -0
  264. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesOcclusionRenderer.js +436 -0
  265. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickDepthRenderer.js +462 -0
  266. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickMeshRenderer.js +436 -0
  267. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickNormalsFlatRenderer.js +455 -0
  268. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesPickNormalsRenderer.js +440 -0
  269. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesRenderers.js +307 -0
  270. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSilhouetteRenderer.js +465 -0
  271. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapInitRenderer.js +466 -0
  272. package/src/src/viewer/scene/model/dtx/triangles/renderers/DTXTrianglesSnapRenderer.js +427 -0
  273. package/src/src/viewer/scene/model/index.js +5 -0
  274. package/src/src/viewer/scene/model/rebucketPositions.js +354 -0
  275. package/src/src/viewer/scene/model/vbo/ScratchMemory.js +63 -0
  276. package/src/src/viewer/scene/model/vbo/VBORenderer.js +646 -0
  277. package/src/src/viewer/scene/model/vbo/batching/lines/VBOBatchingLinesLayer.js +699 -0
  278. package/src/src/viewer/scene/model/vbo/batching/lines/lib/VBOBatchingLinesBuffer.js +19 -0
  279. package/src/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLineSnapInitRenderer.js +316 -0
  280. package/src/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesColorRenderer.js +114 -0
  281. package/src/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesRenderers.js +99 -0
  282. package/src/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSilhouetteRenderer.js +124 -0
  283. package/src/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapInitRenderer.js +311 -0
  284. package/src/src/viewer/scene/model/vbo/batching/lines/renderers/VBOBatchingLinesSnapRenderer.js +309 -0
  285. package/src/src/viewer/scene/model/vbo/batching/lines/renderers/VBOSceneModelLineBatchingRenderer.js +24 -0
  286. package/src/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsBuffer.js +20 -0
  287. package/src/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsLayer.js +718 -0
  288. package/src/src/viewer/scene/model/vbo/batching/points/VBOBatchingPointsRenderer.js +24 -0
  289. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsColorRenderer.js +168 -0
  290. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsOcclusionRenderer.js +136 -0
  291. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsPickDepthRenderer.js +156 -0
  292. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsPickMeshRenderer.js +148 -0
  293. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsRenderers.js +144 -0
  294. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsShadowRenderer.js +107 -0
  295. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSilhouetteRenderer.js +146 -0
  296. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSnapInitRenderer.js +309 -0
  297. package/src/src/viewer/scene/model/vbo/batching/points/renderers/VBOBatchingPointsSnapRenderer.js +303 -0
  298. package/src/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesBuffer.js +24 -0
  299. package/src/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesLayer.js +1257 -0
  300. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesEdgesColorRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesColorRenderer.js} +6 -2
  301. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesEdgesRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesEmphasisRenderer.js} +6 -4
  302. package/src/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesRenderer.js +12 -0
  303. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesRenderers.js → src/viewer/scene/model/vbo/batching/triangles/renderers/Renderers.js} +45 -45
  304. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesBatchingRenderer.js} +4 -3
  305. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesColorRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorRenderer.js} +2 -2
  306. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesColorTextureRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorTextureRenderer.js} +2 -2
  307. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesDepthRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesDepthRenderer.js} +2 -2
  308. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesFlatColorRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesFlatColorRenderer.js} +2 -2
  309. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesNormalsRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesNormalsRenderer.js} +2 -2
  310. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesOcclusionRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesOcclusionRenderer.js} +2 -2
  311. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesPBRRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPBRRenderer.js} +2 -2
  312. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesPickDepthRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickDepthRenderer.js} +2 -2
  313. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesPickMeshRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickMeshRenderer.js} +2 -2
  314. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesPickNormalsFlatRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsFlatRenderer.js} +2 -2
  315. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesPickNormalsRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsRenderer.js} +2 -2
  316. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesShadowRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesShadowRenderer.js} +2 -2
  317. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesSilhouetteRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSilhouetteRenderer.js} +3 -3
  318. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesSnapInitRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapInitRenderer.js} +1 -1
  319. package/src/{viewer/scene/model/vbo/batching/triangles/renderers/VBOBatchingTrianglesSnapRenderer.js → src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapRenderer.js} +1 -1
  320. package/src/src/viewer/scene/model/vbo/float16.js +760 -0
  321. package/src/src/viewer/scene/model/vbo/instancing/lines/VBOInstancingLinesLayer.js +704 -0
  322. package/src/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesColorRenderer.js +148 -0
  323. package/src/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesRenderer.js +26 -0
  324. package/src/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesRenderers.js +139 -0
  325. package/src/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSilhouetteRenderer.js +127 -0
  326. package/src/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapInitRenderer.js +331 -0
  327. package/src/src/viewer/scene/model/vbo/instancing/lines/renderers/VBOInstancingLinesSnapRenderer.js +316 -0
  328. package/src/src/viewer/scene/model/vbo/instancing/points/VBOInstancingPointsLayer.js +728 -0
  329. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsColorRenderer.js +174 -0
  330. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsDepthRenderer.js +156 -0
  331. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsOcclusionRenderer.js +149 -0
  332. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsPickDepthRenderer.js +170 -0
  333. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsPickMeshRenderer.js +152 -0
  334. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsRenderer.js +26 -0
  335. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsRenderers.js +174 -0
  336. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsShadowRenderer.js +119 -0
  337. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSilhouetteRenderer.js +154 -0
  338. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSnapInitRenderer.js +330 -0
  339. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingPointsSnapRenderer.js +311 -0
  340. package/src/src/viewer/scene/model/vbo/instancing/points/renderers/VBOInstancingTrianglesRenderer.js +150 -0
  341. package/src/src/viewer/scene/model/vbo/instancing/triangles/VBOInstancingTrianglesLayer.js +1190 -0
  342. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesEdgesColorRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesColorRenderer.js} +8 -4
  343. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesEdgesRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesEmphasisRenderer.js} +8 -5
  344. package/src/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesRenderer.js +12 -0
  345. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesRenderers.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/Renderers.js} +45 -45
  346. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesColorRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorRenderer.js} +3 -3
  347. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesColorTextureRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorTextureRenderer.js} +2 -2
  348. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesDepthRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesDepthRenderer.js} +2 -2
  349. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesFlatColorRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatColorRenderer.js} +2 -2
  350. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesFlatNormalsRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatNormalsRenderer.js} +2 -2
  351. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOSceneModelTriangleInstancingRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesInstancingRenderer.js} +1 -1
  352. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesNormalsRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesNormalsRenderer.js} +2 -2
  353. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesOcclusionRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesOcclusionRenderer.js} +2 -2
  354. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesPBRRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPBRRenderer.js} +2 -2
  355. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesPickDepthRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickDepthRenderer.js} +2 -2
  356. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesPickMeshRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickMeshRenderer.js} +2 -2
  357. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesPickNormalsFlatRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsFlatRenderer.js} +2 -2
  358. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesPickNormalsRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsRenderer.js} +2 -2
  359. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesShadowRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesShadowRenderer.js} +2 -2
  360. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesSilhouetteRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSilhouetteRenderer.js} +2 -2
  361. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesSnapInitRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapInitRenderer.js} +1 -1
  362. package/src/{viewer/scene/model/vbo/instancing/triangles/renderers/VBOInstancingTrianglesSnapRenderer.js → src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapRenderer.js} +1 -1
  363. package/src/src/viewer/scene/nodes/Node.js +1383 -0
  364. package/src/src/viewer/scene/nodes/index.js +1 -0
  365. package/src/src/viewer/scene/paths/CubicBezierCurve.js +194 -0
  366. package/src/src/viewer/scene/paths/Curve.js +183 -0
  367. package/src/src/viewer/scene/paths/Path.js +239 -0
  368. package/src/src/viewer/scene/paths/QuadraticBezierCurve.js +161 -0
  369. package/src/src/viewer/scene/paths/SplineCurve.js +133 -0
  370. package/src/src/viewer/scene/paths/index.js +5 -0
  371. package/src/src/viewer/scene/postfx/SAO.js +543 -0
  372. package/src/src/viewer/scene/scene/Scene.js +2802 -0
  373. package/src/src/viewer/scene/sectionPlane/SectionPlane.js +198 -0
  374. package/src/src/viewer/scene/sectionPlane/SectionPlaneCache.js +101 -0
  375. package/src/src/viewer/scene/sectionPlane/index.js +1 -0
  376. package/src/src/viewer/scene/skybox/Skybox.js +123 -0
  377. package/src/src/viewer/scene/skybox/index.js +1 -0
  378. package/src/src/viewer/scene/stats.js +44 -0
  379. package/src/src/viewer/scene/utils/Cache.js +29 -0
  380. package/src/src/viewer/scene/utils/FileLoader.js +161 -0
  381. package/src/src/viewer/scene/utils/Loader.js +55 -0
  382. package/src/src/viewer/scene/utils/LoadingManager.js +86 -0
  383. package/src/src/viewer/scene/utils/Map.js +45 -0
  384. package/src/src/viewer/scene/utils/Queue.js +56 -0
  385. package/src/src/viewer/scene/utils/WorkerPool.js +73 -0
  386. package/src/src/viewer/scene/utils/index.js +6 -0
  387. package/src/src/viewer/scene/utils/textureTranscoders/KTX2TextureTranscoder/KTX2TextureTranscoder.js +650 -0
  388. package/src/src/viewer/scene/utils/textureTranscoders/KTX2TextureTranscoder/index.js +1 -0
  389. package/src/src/viewer/scene/utils/textureTranscoders/TextureTranscoder.js +31 -0
  390. package/src/src/viewer/scene/utils/textureTranscoders/index.js +2 -0
  391. package/src/src/viewer/scene/utils.js +453 -0
  392. package/src/src/viewer/scene/viewport/Viewport.js +212 -0
  393. package/src/src/viewer/scene/webgl/ArrayBuf.js +121 -0
  394. package/src/src/viewer/scene/webgl/Attribute.js +23 -0
  395. package/src/src/viewer/scene/webgl/Drawable.js +270 -0
  396. package/src/src/viewer/scene/webgl/FrameContext.js +313 -0
  397. package/src/src/viewer/scene/webgl/PickResult.js +364 -0
  398. package/src/src/viewer/scene/webgl/Pickable.js +69 -0
  399. package/src/src/viewer/scene/webgl/Program.js +181 -0
  400. package/src/src/viewer/scene/webgl/RenderBuffer.js +378 -0
  401. package/src/src/viewer/scene/webgl/RenderBufferManager.js +34 -0
  402. package/src/src/viewer/scene/webgl/RenderFlags.js +203 -0
  403. package/src/src/viewer/scene/webgl/RenderState.js +40 -0
  404. package/src/src/viewer/scene/webgl/Renderer.js +1781 -0
  405. package/src/src/viewer/scene/webgl/Sampler.js +18 -0
  406. package/src/src/viewer/scene/webgl/Shader.js +49 -0
  407. package/src/src/viewer/scene/webgl/Texture2D.js +442 -0
  408. package/src/src/viewer/scene/webgl/convertConstant.js +244 -0
  409. package/src/src/viewer/scene/webgl/getExtension.js +32 -0
  410. package/src/src/viewer/scene/webgl/occlusion/OcclusionLayer.js +214 -0
  411. package/src/src/viewer/scene/webgl/occlusion/OcclusionTester.js +426 -0
  412. package/src/src/viewer/scene/webgl/sao/SAODepthLimitedBlurRenderer.js +324 -0
  413. package/src/src/viewer/scene/webgl/sao/SAOOcclusionRenderer.js +376 -0
  414. package/src/src/viewer/scene/webgl/webglEnums.js +61 -0
  415. package/src/src/viewer/scene/webglInfo.js +47 -0
  416. package/src/viewer/scene/model/SceneModel.js +1 -1
  417. package/src/viewer/scene/model/vbo/batching/triangles/VBOBatchingTrianglesLayer.js +1 -1
  418. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesColorRenderer.js +131 -0
  419. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesEmphasisRenderer.js +135 -0
  420. package/src/viewer/scene/model/vbo/batching/triangles/renderers/EdgesRenderer.js +12 -0
  421. package/src/viewer/scene/model/vbo/batching/triangles/renderers/Renderers.js +375 -0
  422. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesBatchingRenderer.js +34 -0
  423. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorRenderer.js +238 -0
  424. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesColorTextureRenderer.js +270 -0
  425. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesDepthRenderer.js +126 -0
  426. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesFlatColorRenderer.js +235 -0
  427. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesNormalsRenderer.js +139 -0
  428. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesOcclusionRenderer.js +125 -0
  429. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPBRRenderer.js +561 -0
  430. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickDepthRenderer.js +144 -0
  431. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickMeshRenderer.js +130 -0
  432. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsFlatRenderer.js +121 -0
  433. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesPickNormalsRenderer.js +131 -0
  434. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesShadowRenderer.js +107 -0
  435. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSilhouetteRenderer.js +136 -0
  436. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapInitRenderer.js +311 -0
  437. package/src/viewer/scene/model/vbo/batching/triangles/renderers/TrianglesSnapRenderer.js +308 -0
  438. package/src/viewer/scene/model/vbo/instancing/triangles/VBOInstancingTrianglesLayer.js +1 -1
  439. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesColorRenderer.js +136 -0
  440. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesEmphasisRenderer.js +137 -0
  441. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/EdgesRenderer.js +12 -0
  442. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/Renderers.js +376 -0
  443. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorRenderer.js +253 -0
  444. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesColorTextureRenderer.js +278 -0
  445. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesDepthRenderer.js +126 -0
  446. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatColorRenderer.js +244 -0
  447. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesFlatNormalsRenderer.js +130 -0
  448. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesInstancingRenderer.js +29 -0
  449. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesNormalsRenderer.js +138 -0
  450. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesOcclusionRenderer.js +128 -0
  451. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPBRRenderer.js +561 -0
  452. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickDepthRenderer.js +149 -0
  453. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickMeshRenderer.js +136 -0
  454. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsFlatRenderer.js +130 -0
  455. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesPickNormalsRenderer.js +145 -0
  456. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesShadowRenderer.js +113 -0
  457. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSilhouetteRenderer.js +139 -0
  458. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapInitRenderer.js +342 -0
  459. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/TrianglesSnapRenderer.js +325 -0
  460. package/src/viewer/scene/webgl/Renderer.js +20 -19
  461. package/src/viewer/scene/model/vbo/batching/triangles/renderers/VBOSceneModelTriangleBatchingEdgesRenderer.js +0 -12
  462. package/src/viewer/scene/model/vbo/instancing/triangles/renderers/VBOSceneModelTriangleInstancingEdgesRenderer.js +0 -12
@@ -0,0 +1,1781 @@
1
+ import {FrameContext} from './FrameContext.js';
2
+ import {math} from '../math/math.js';
3
+ import {stats} from '../stats.js';
4
+ import {WEBGL_INFO} from '../webglInfo.js';
5
+ import {Map} from "../utils/Map.js";
6
+ import {PickResult} from "./PickResult.js";
7
+ import {OcclusionTester} from "./occlusion/OcclusionTester.js";
8
+ import {SAOOcclusionRenderer} from "./sao/SAOOcclusionRenderer.js";
9
+ import {createRTCViewMat} from "../math/rtcCoords.js";
10
+ import {SAODepthLimitedBlurRenderer} from "./sao/SAODepthLimitedBlurRenderer.js";
11
+ import {RenderBufferManager} from "./RenderBufferManager.js";
12
+ import {getExtension} from "./getExtension.js";
13
+
14
+ /**
15
+ * @private
16
+ */
17
+ const Renderer = function (scene, options) {
18
+
19
+ options = options || {};
20
+
21
+ const frameCtx = new FrameContext(scene);
22
+ const canvas = scene.canvas.canvas;
23
+ /**
24
+ * @type {WebGL2RenderingContext}
25
+ */
26
+ const gl = scene.canvas.gl;
27
+ const canvasTransparent = (!!options.transparent);
28
+ const alphaDepthMask = options.alphaDepthMask;
29
+
30
+ const pickIDs = new Map({});
31
+
32
+ let drawableTypeInfo = {};
33
+ let drawables = {};
34
+
35
+ let drawableListDirty = true;
36
+ let stateSortDirty = true;
37
+ let imageDirty = true;
38
+ let shadowsDirty = true;
39
+
40
+ let transparentEnabled = true;
41
+ let edgesEnabled = true;
42
+ let saoEnabled = true;
43
+ let pbrEnabled = true;
44
+ let colorTextureEnabled = true;
45
+
46
+ const renderBufferManager = new RenderBufferManager(scene);
47
+
48
+ let snapshotBound = false;
49
+
50
+ const bindOutputFrameBuffer = null;
51
+ const unbindOutputFrameBuffer = null;
52
+
53
+ const saoOcclusionRenderer = new SAOOcclusionRenderer(scene);
54
+ const saoDepthLimitedBlurRenderer = new SAODepthLimitedBlurRenderer(scene);
55
+
56
+ this.scene = scene;
57
+
58
+ this._occlusionTester = null; // Lazy-created in #addMarker()
59
+
60
+ this.capabilities = {
61
+ astcSupported: !!getExtension(gl, 'WEBGL_compressed_texture_astc'),
62
+ etc1Supported: true, // WebGL2
63
+ etc2Supported: !!getExtension(gl, 'WEBGL_compressed_texture_etc'),
64
+ dxtSupported: !!getExtension(gl, 'WEBGL_compressed_texture_s3tc'),
65
+ bptcSupported: !!getExtension(gl, 'EXT_texture_compression_bptc'),
66
+ pvrtcSupported: !!(getExtension(gl, 'WEBGL_compressed_texture_pvrtc') || getExtension(gl, 'WEBKIT_WEBGL_compressed_texture_pvrtc'))
67
+ };
68
+
69
+ this.setTransparentEnabled = function (enabled) {
70
+ transparentEnabled = enabled;
71
+ imageDirty = true;
72
+ };
73
+
74
+ this.setEdgesEnabled = function (enabled) {
75
+ edgesEnabled = enabled;
76
+ imageDirty = true;
77
+ };
78
+
79
+ this.setSAOEnabled = function (enabled) {
80
+ saoEnabled = enabled;
81
+ imageDirty = true;
82
+ };
83
+
84
+ this.setPBREnabled = function (enabled) {
85
+ pbrEnabled = enabled;
86
+ imageDirty = true;
87
+ };
88
+
89
+ this.setColorTextureEnabled = function (enabled) {
90
+ colorTextureEnabled = enabled;
91
+ imageDirty = true;
92
+ };
93
+
94
+ this.needStateSort = function () {
95
+ stateSortDirty = true;
96
+ };
97
+
98
+ this.shadowsDirty = function () {
99
+ shadowsDirty = true;
100
+ };
101
+
102
+ this.imageDirty = function () {
103
+ imageDirty = true;
104
+ };
105
+
106
+ this.webglContextLost = function () {
107
+ };
108
+
109
+ this.webglContextRestored = function (gl) {
110
+
111
+ // renderBufferManager.webglContextRestored(gl);
112
+
113
+ saoOcclusionRenderer.init();
114
+ saoDepthLimitedBlurRenderer.init();
115
+
116
+ imageDirty = true;
117
+ };
118
+
119
+ /**
120
+ * Inserts a drawable into this renderer.
121
+ * @private
122
+ */
123
+ this.addDrawable = function (id, drawable) {
124
+ const type = drawable.type;
125
+ if (!type) {
126
+ console.error("Renderer#addDrawable() : drawable with ID " + id + " has no 'type' - ignoring");
127
+ return;
128
+ }
129
+ let drawableInfo = drawableTypeInfo[type];
130
+ if (!drawableInfo) {
131
+ drawableInfo = {
132
+ type: drawable.type,
133
+ count: 0,
134
+ isStateSortable: drawable.isStateSortable,
135
+ stateSortCompare: drawable.stateSortCompare,
136
+ drawableMap: {},
137
+ drawableListPreCull: [],
138
+ drawableList: []
139
+ };
140
+ drawableTypeInfo[type] = drawableInfo;
141
+ }
142
+ drawableInfo.count++;
143
+ drawableInfo.drawableMap[id] = drawable;
144
+ drawables[id] = drawable;
145
+ drawableListDirty = true;
146
+ };
147
+
148
+ /**
149
+ * Removes a drawable from this renderer.
150
+ * @private
151
+ */
152
+ this.removeDrawable = function (id) {
153
+ const drawable = drawables[id];
154
+ if (!drawable) {
155
+ console.error("Renderer#removeDrawable() : drawable not found with ID " + id + " - ignoring");
156
+ return;
157
+ }
158
+ const type = drawable.type;
159
+ const drawableInfo = drawableTypeInfo[type];
160
+ if (--drawableInfo.count <= 0) {
161
+ delete drawableTypeInfo[type];
162
+ } else {
163
+ delete drawableInfo.drawableMap[id];
164
+ }
165
+ delete drawables[id];
166
+ drawableListDirty = true;
167
+ };
168
+
169
+ /**
170
+ * Gets a unique pick ID for the given Pickable. A Pickable can be a {@link Mesh} or a {@link PerformanceMesh}.
171
+ * @returns {Number} New pick ID.
172
+ */
173
+ this.getPickID = function (entity) {
174
+ return pickIDs.addItem(entity);
175
+ };
176
+
177
+ /**
178
+ * Released a pick ID for reuse.
179
+ * @param {Number} pickID Pick ID to release.
180
+ */
181
+ this.putPickID = function (pickID) {
182
+ pickIDs.removeItem(pickID);
183
+ };
184
+
185
+ /**
186
+ * Clears the canvas.
187
+ * @private
188
+ */
189
+ this.clear = function (params) {
190
+ params = params || {};
191
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
192
+ if (canvasTransparent) {
193
+ gl.clearColor(1, 1, 1, 1);
194
+ } else {
195
+ const backgroundColor = scene.canvas.backgroundColorFromAmbientLight ? this.lights.getAmbientColorAndIntensity() : scene.canvas.backgroundColor;
196
+ gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1.0);
197
+ }
198
+ if (bindOutputFrameBuffer) {
199
+ bindOutputFrameBuffer(params.pass);
200
+ }
201
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
202
+ if (unbindOutputFrameBuffer) {
203
+ unbindOutputFrameBuffer(params.pass);
204
+ }
205
+ };
206
+
207
+ /**
208
+ * Returns true if the next call to render() will draw something
209
+ * @returns {Boolean}
210
+ */
211
+ this.needsRender = function () {
212
+ const needsRender = (imageDirty || drawableListDirty || stateSortDirty);
213
+ return needsRender;
214
+ }
215
+
216
+ /**
217
+ * Renders inserted drawables.
218
+ * @private
219
+ */
220
+ this.render = function (params) {
221
+ params = params || {};
222
+ if (params.force) {
223
+ imageDirty = true;
224
+ }
225
+ updateDrawlist();
226
+ if (imageDirty) {
227
+ draw(params);
228
+ stats.frame.frameCount++;
229
+ imageDirty = false;
230
+ }
231
+ };
232
+
233
+ function updateDrawlist() { // Prepares state-sorted array of drawables from maps of inserted drawables
234
+ if (drawableListDirty) {
235
+ buildDrawableList();
236
+ drawableListDirty = false;
237
+ stateSortDirty = true;
238
+ }
239
+ if (stateSortDirty) {
240
+ sortDrawableList();
241
+ stateSortDirty = false;
242
+ imageDirty = true;
243
+ }
244
+ if (imageDirty) { // Image is usually dirty because the camera moved
245
+ cullDrawableList();
246
+ }
247
+ }
248
+
249
+ function buildDrawableList() {
250
+ for (let type in drawableTypeInfo) {
251
+ if (drawableTypeInfo.hasOwnProperty(type)) {
252
+ const drawableInfo = drawableTypeInfo[type];
253
+ const drawableMap = drawableInfo.drawableMap;
254
+ const drawableListPreCull = drawableInfo.drawableListPreCull;
255
+ let lenDrawableList = 0;
256
+ for (let id in drawableMap) {
257
+ if (drawableMap.hasOwnProperty(id)) {
258
+ drawableListPreCull[lenDrawableList++] = drawableMap[id];
259
+ }
260
+ }
261
+ drawableListPreCull.length = lenDrawableList;
262
+ }
263
+ }
264
+ }
265
+
266
+ function sortDrawableList() {
267
+ for (let type in drawableTypeInfo) {
268
+ if (drawableTypeInfo.hasOwnProperty(type)) {
269
+ const drawableInfo = drawableTypeInfo[type];
270
+ if (drawableInfo.isStateSortable) {
271
+ drawableInfo.drawableListPreCull.sort(drawableInfo.stateSortCompare);
272
+ }
273
+ }
274
+ }
275
+ }
276
+
277
+ function cullDrawableList() {
278
+ for (let type in drawableTypeInfo) {
279
+ if (drawableTypeInfo.hasOwnProperty(type)) {
280
+ const drawableInfo = drawableTypeInfo[type];
281
+ const drawableListPreCull = drawableInfo.drawableListPreCull;
282
+ const drawableList = drawableInfo.drawableList;
283
+ let lenDrawableList = 0;
284
+ for (let i = 0, len = drawableListPreCull.length; i < len; i++) {
285
+ const drawable = drawableListPreCull[i];
286
+ drawable.rebuildRenderFlags();
287
+ if (!drawable.renderFlags.culled) {
288
+ drawableList[lenDrawableList++] = drawable;
289
+ }
290
+ }
291
+ drawableList.length = lenDrawableList;
292
+ }
293
+ }
294
+ }
295
+
296
+ function draw(params) {
297
+
298
+ const sao = scene.sao;
299
+
300
+ if (saoEnabled && sao.possible) {
301
+ drawSAOBuffers(params);
302
+ }
303
+
304
+ drawShadowMaps();
305
+
306
+ drawColor(params);
307
+ }
308
+
309
+ function drawSAOBuffers(params) {
310
+
311
+ const sao = scene.sao;
312
+
313
+ // Render depth buffer
314
+
315
+ const saoDepthRenderBuffer = renderBufferManager.getRenderBuffer("saoDepth", {
316
+ depthTexture: true
317
+ });
318
+
319
+ saoDepthRenderBuffer.bind();
320
+ saoDepthRenderBuffer.clear();
321
+ drawDepth(params);
322
+ saoDepthRenderBuffer.unbind();
323
+
324
+ // Render occlusion buffer
325
+
326
+ const occlusionRenderBuffer1 = renderBufferManager.getRenderBuffer("saoOcclusion");
327
+
328
+ occlusionRenderBuffer1.bind();
329
+ occlusionRenderBuffer1.clear();
330
+ saoOcclusionRenderer.render(saoDepthRenderBuffer);
331
+ occlusionRenderBuffer1.unbind();
332
+
333
+ if (sao.blur) {
334
+
335
+ // Horizontally blur occlusion buffer 1 into occlusion buffer 2
336
+
337
+ const occlusionRenderBuffer2 = renderBufferManager.getRenderBuffer("saoOcclusion2");
338
+
339
+ occlusionRenderBuffer2.bind();
340
+ occlusionRenderBuffer2.clear();
341
+ saoDepthLimitedBlurRenderer.render(saoDepthRenderBuffer, occlusionRenderBuffer1, 0);
342
+ occlusionRenderBuffer2.unbind();
343
+
344
+ // Vertically blur occlusion buffer 2 back into occlusion buffer 1
345
+
346
+ occlusionRenderBuffer1.bind();
347
+ occlusionRenderBuffer1.clear();
348
+ saoDepthLimitedBlurRenderer.render(saoDepthRenderBuffer, occlusionRenderBuffer2, 1);
349
+ occlusionRenderBuffer1.unbind();
350
+ }
351
+ }
352
+
353
+ function drawDepth(params) {
354
+
355
+ frameCtx.reset();
356
+ frameCtx.pass = params.pass;
357
+
358
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
359
+
360
+ gl.clearColor(0, 0, 0, 0);
361
+ gl.enable(gl.DEPTH_TEST);
362
+ gl.frontFace(gl.CCW);
363
+ gl.enable(gl.CULL_FACE);
364
+ gl.depthMask(true);
365
+
366
+ if (params.clear !== false) {
367
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
368
+ }
369
+
370
+ for (let type in drawableTypeInfo) {
371
+ if (drawableTypeInfo.hasOwnProperty(type)) {
372
+
373
+ const drawableInfo = drawableTypeInfo[type];
374
+ const drawableList = drawableInfo.drawableList;
375
+
376
+ for (let i = 0, len = drawableList.length; i < len; i++) {
377
+
378
+ const drawable = drawableList[i];
379
+
380
+ if (drawable.culled === true || drawable.visible === false || !drawable.drawDepth || !drawable.saoEnabled) {
381
+ continue;
382
+ }
383
+
384
+ if (drawable.renderFlags.colorOpaque) {
385
+ drawable.drawDepth(frameCtx);
386
+ }
387
+ }
388
+ }
389
+ }
390
+
391
+ // const numVertexAttribs = WEBGL_INFO.MAX_VERTEX_ATTRIBS; // Fixes https://github.com/xeokit/xeokit-sdk/issues/174
392
+ // for (let ii = 0; ii < numVertexAttribs; ii++) {
393
+ // gl.disableVertexAttribArray(ii);
394
+ // }
395
+
396
+ }
397
+
398
+ function drawShadowMaps() {
399
+
400
+ let lights = scene._lightsState.lights;
401
+
402
+ for (let i = 0, len = lights.length; i < len; i++) {
403
+ const light = lights[i];
404
+ if (!light.castsShadow) {
405
+ continue;
406
+ }
407
+ drawShadowMap(light);
408
+ }
409
+
410
+ // const numVertexAttribs = WEBGL_INFO.MAX_VERTEX_ATTRIBS; // Fixes https://github.com/xeokit/xeokit-sdk/issues/174
411
+ // for (let ii = 0; ii < numVertexAttribs; ii++) {
412
+ // gl.disableVertexAttribArray(ii);
413
+ // }
414
+ //
415
+ shadowsDirty = false;
416
+ }
417
+
418
+ function drawShadowMap(light) {
419
+
420
+ const castsShadow = light.castsShadow;
421
+
422
+ if (!castsShadow) {
423
+ return;
424
+ }
425
+
426
+ const shadowRenderBuf = light.getShadowRenderBuf();
427
+
428
+ if (!shadowRenderBuf) {
429
+ return;
430
+ }
431
+
432
+ shadowRenderBuf.bind();
433
+
434
+ frameCtx.reset();
435
+
436
+ frameCtx.backfaces = true;
437
+ frameCtx.frontface = true;
438
+ frameCtx.shadowViewMatrix = light.getShadowViewMatrix();
439
+ frameCtx.shadowProjMatrix = light.getShadowProjMatrix();
440
+
441
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
442
+
443
+ gl.clearColor(0, 0, 0, 1);
444
+ gl.enable(gl.DEPTH_TEST);
445
+ gl.disable(gl.BLEND);
446
+
447
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
448
+
449
+ for (let type in drawableTypeInfo) {
450
+
451
+ if (drawableTypeInfo.hasOwnProperty(type)) {
452
+
453
+ const drawableInfo = drawableTypeInfo[type];
454
+ const drawableList = drawableInfo.drawableList;
455
+
456
+ for (let i = 0, len = drawableList.length; i < len; i++) {
457
+
458
+ const drawable = drawableList[i];
459
+
460
+ if (drawable.visible === false || !drawable.castsShadow || !drawable.drawShadow) {
461
+ continue;
462
+ }
463
+
464
+ if (drawable.renderFlags.colorOpaque) { // Transparent objects don't cast shadows (yet)
465
+ drawable.drawShadow(frameCtx);
466
+ }
467
+ }
468
+ }
469
+ }
470
+
471
+ shadowRenderBuf.unbind();
472
+ }
473
+
474
+ function drawColor(params) {
475
+
476
+ const normalDrawSAOBin = [];
477
+ const normalEdgesOpaqueBin = [];
478
+ const normalFillTransparentBin = [];
479
+ const normalEdgesTransparentBin = [];
480
+
481
+ const xrayedFillOpaqueBin = [];
482
+ const xrayEdgesOpaqueBin = [];
483
+ const xrayedFillTransparentBin = [];
484
+ const xrayEdgesTransparentBin = [];
485
+
486
+ const highlightedFillOpaqueBin = [];
487
+ const highlightedEdgesOpaqueBin = [];
488
+ const highlightedFillTransparentBin = [];
489
+ const highlightedEdgesTransparentBin = [];
490
+
491
+ const selectedFillOpaqueBin = [];
492
+ const selectedEdgesOpaqueBin = [];
493
+ const selectedFillTransparentBin = [];
494
+ const selectedEdgesTransparentBin = [];
495
+
496
+
497
+ const ambientColorAndIntensity = scene._lightsState.getAmbientColorAndIntensity();
498
+
499
+ frameCtx.reset();
500
+ frameCtx.pass = params.pass;
501
+ frameCtx.withSAO = false;
502
+ frameCtx.pbrEnabled = pbrEnabled && !!scene.pbrEnabled;
503
+ frameCtx.colorTextureEnabled = colorTextureEnabled && !!scene.colorTextureEnabled;
504
+
505
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
506
+
507
+ if (canvasTransparent) {
508
+ gl.clearColor(0, 0, 0, 0);
509
+ } else {
510
+ const backgroundColor = scene.canvas.backgroundColorFromAmbientLight ? ambientColorAndIntensity : scene.canvas.backgroundColor;
511
+ gl.clearColor(backgroundColor[0], backgroundColor[1], backgroundColor[2], 1.0);
512
+ }
513
+
514
+ gl.enable(gl.DEPTH_TEST);
515
+ gl.frontFace(gl.CCW);
516
+ gl.enable(gl.CULL_FACE);
517
+ gl.depthMask(true);
518
+ gl.lineWidth(1);
519
+
520
+ frameCtx.lineWidth = 1;
521
+
522
+ const saoPossible = scene.sao.possible;
523
+
524
+ if (saoEnabled && saoPossible) {
525
+ const occlusionRenderBuffer1 = renderBufferManager.getRenderBuffer("saoOcclusion");
526
+ frameCtx.occlusionTexture = occlusionRenderBuffer1 ? occlusionRenderBuffer1.getTexture() : null;
527
+ } else {
528
+ frameCtx.occlusionTexture = null;
529
+
530
+ }
531
+
532
+ let i;
533
+ let len;
534
+ let drawable;
535
+
536
+ const startTime = Date.now();
537
+
538
+ if (bindOutputFrameBuffer) {
539
+ bindOutputFrameBuffer(params.pass);
540
+ }
541
+
542
+ if (params.clear !== false) {
543
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
544
+ }
545
+
546
+ let normalDrawSAOBinLen = 0;
547
+ let normalEdgesOpaqueBinLen = 0;
548
+ let normalFillTransparentBinLen = 0;
549
+ let normalEdgesTransparentBinLen = 0;
550
+
551
+ let xrayedFillOpaqueBinLen = 0;
552
+ let xrayEdgesOpaqueBinLen = 0;
553
+ let xrayedFillTransparentBinLen = 0;
554
+ let xrayEdgesTransparentBinLen = 0;
555
+
556
+ let highlightedFillOpaqueBinLen = 0;
557
+ let highlightedEdgesOpaqueBinLen = 0;
558
+ let highlightedFillTransparentBinLen = 0;
559
+ let highlightedEdgesTransparentBinLen = 0;
560
+
561
+ let selectedFillOpaqueBinLen = 0;
562
+ let selectedEdgesOpaqueBinLen = 0;
563
+ let selectedFillTransparentBinLen = 0;
564
+ let selectedEdgesTransparentBinLen = 0;
565
+
566
+ //------------------------------------------------------------------------------------------------------
567
+ // Render normal opaque solids, defer others to bins to render after
568
+ //------------------------------------------------------------------------------------------------------
569
+
570
+ for (let type in drawableTypeInfo) {
571
+ if (drawableTypeInfo.hasOwnProperty(type)) {
572
+
573
+ const drawableInfo = drawableTypeInfo[type];
574
+ const drawableList = drawableInfo.drawableList;
575
+
576
+ for (i = 0, len = drawableList.length; i < len; i++) {
577
+
578
+ drawable = drawableList[i];
579
+
580
+ if (drawable.culled === true || drawable.visible === false) {
581
+ continue;
582
+ }
583
+
584
+ const renderFlags = drawable.renderFlags;
585
+
586
+ if (renderFlags.colorOpaque) {
587
+ if (saoEnabled && saoPossible && drawable.saoEnabled) {
588
+ normalDrawSAOBin[normalDrawSAOBinLen++] = drawable;
589
+ } else {
590
+ drawable.drawColorOpaque(frameCtx);
591
+ }
592
+ }
593
+
594
+ if (transparentEnabled) {
595
+ if (renderFlags.colorTransparent) {
596
+ normalFillTransparentBin[normalFillTransparentBinLen++] = drawable;
597
+ }
598
+ }
599
+
600
+ if (renderFlags.xrayedSilhouetteTransparent) {
601
+ xrayedFillTransparentBin[xrayedFillTransparentBinLen++] = drawable;
602
+ }
603
+
604
+ if (renderFlags.xrayedSilhouetteOpaque) {
605
+ xrayedFillOpaqueBin[xrayedFillOpaqueBinLen++] = drawable;
606
+ }
607
+
608
+ if (renderFlags.highlightedSilhouetteTransparent) {
609
+ highlightedFillTransparentBin[highlightedFillTransparentBinLen++] = drawable;
610
+ }
611
+
612
+ if (renderFlags.highlightedSilhouetteOpaque) {
613
+ highlightedFillOpaqueBin[highlightedFillOpaqueBinLen++] = drawable;
614
+ }
615
+
616
+ if (renderFlags.selectedSilhouetteTransparent) {
617
+ selectedFillTransparentBin[selectedFillTransparentBinLen++] = drawable;
618
+ }
619
+
620
+ if (renderFlags.selectedSilhouetteOpaque) {
621
+ selectedFillOpaqueBin[selectedFillOpaqueBinLen++] = drawable;
622
+ }
623
+
624
+ if (drawable.edges && edgesEnabled) {
625
+ if (renderFlags.edgesOpaque) {
626
+ normalEdgesOpaqueBin[normalEdgesOpaqueBinLen++] = drawable;
627
+ }
628
+
629
+ if (renderFlags.edgesTransparent) {
630
+ normalEdgesTransparentBin[normalEdgesTransparentBinLen++] = drawable;
631
+ }
632
+
633
+ if (renderFlags.selectedEdgesTransparent) {
634
+ selectedEdgesTransparentBin[selectedEdgesTransparentBinLen++] = drawable;
635
+ }
636
+
637
+ if (renderFlags.selectedEdgesOpaque) {
638
+ selectedEdgesOpaqueBin[selectedEdgesOpaqueBinLen++] = drawable;
639
+ }
640
+
641
+ if (renderFlags.xrayedEdgesTransparent) {
642
+ xrayEdgesTransparentBin[xrayEdgesTransparentBinLen++] = drawable;
643
+ }
644
+
645
+ if (renderFlags.xrayedEdgesOpaque) {
646
+ xrayEdgesOpaqueBin[xrayEdgesOpaqueBinLen++] = drawable;
647
+ }
648
+
649
+ if (renderFlags.highlightedEdgesTransparent) {
650
+ highlightedEdgesTransparentBin[highlightedEdgesTransparentBinLen++] = drawable;
651
+ }
652
+
653
+ if (renderFlags.highlightedEdgesOpaque) {
654
+ highlightedEdgesOpaqueBin[highlightedEdgesOpaqueBinLen++] = drawable;
655
+ }
656
+ }
657
+ }
658
+ }
659
+ }
660
+
661
+ //------------------------------------------------------------------------------------------------------
662
+ // Render deferred bins
663
+ //------------------------------------------------------------------------------------------------------
664
+
665
+ // Opaque color with SAO
666
+
667
+ if (normalDrawSAOBinLen > 0) {
668
+ frameCtx.withSAO = true;
669
+ for (i = 0; i < normalDrawSAOBinLen; i++) {
670
+ normalDrawSAOBin[i].drawColorOpaque(frameCtx);
671
+ }
672
+ }
673
+
674
+ // Opaque edges
675
+
676
+ if (normalEdgesOpaqueBinLen > 0) {
677
+ for (i = 0; i < normalEdgesOpaqueBinLen; i++) {
678
+ normalEdgesOpaqueBin[i].drawEdgesColorOpaque(frameCtx);
679
+ }
680
+ }
681
+
682
+ // Opaque X-ray fill
683
+
684
+ if (xrayedFillOpaqueBinLen > 0) {
685
+ for (i = 0; i < xrayedFillOpaqueBinLen; i++) {
686
+ xrayedFillOpaqueBin[i].drawSilhouetteXRayed(frameCtx);
687
+ }
688
+ }
689
+
690
+ // Opaque X-ray edges
691
+
692
+ if (xrayEdgesOpaqueBinLen > 0) {
693
+ for (i = 0; i < xrayEdgesOpaqueBinLen; i++) {
694
+ xrayEdgesOpaqueBin[i].drawEdgesXRayed(frameCtx);
695
+ }
696
+ }
697
+
698
+ // Transparent
699
+
700
+ if (xrayedFillTransparentBinLen > 0 || xrayEdgesTransparentBinLen > 0 || normalFillTransparentBinLen > 0 || normalEdgesTransparentBinLen > 0) {
701
+ gl.enable(gl.CULL_FACE);
702
+ gl.enable(gl.BLEND);
703
+ if (canvasTransparent) {
704
+ gl.blendEquation(gl.FUNC_ADD);
705
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
706
+ } else {
707
+ gl.blendEquation(gl.FUNC_ADD);
708
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
709
+ }
710
+ frameCtx.backfaces = false;
711
+ if (!alphaDepthMask) {
712
+ gl.depthMask(false);
713
+ }
714
+
715
+ // Transparent color edges
716
+
717
+ if (normalFillTransparentBinLen > 0 || normalEdgesTransparentBinLen > 0) {
718
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
719
+ }
720
+ if (normalEdgesTransparentBinLen > 0) {
721
+ for (i = 0; i < normalEdgesTransparentBinLen; i++) {
722
+ drawable = normalEdgesTransparentBin[i];
723
+ drawable.drawEdgesColorTransparent(frameCtx);
724
+ }
725
+ }
726
+
727
+ // Transparent color fill
728
+
729
+ if (normalFillTransparentBinLen > 0) {
730
+ for (i = 0; i < normalFillTransparentBinLen; i++) {
731
+ drawable = normalFillTransparentBin[i];
732
+ drawable.drawColorTransparent(frameCtx);
733
+ }
734
+ }
735
+
736
+ // Transparent X-ray edges
737
+
738
+ if (xrayEdgesTransparentBinLen > 0) {
739
+ for (i = 0; i < xrayEdgesTransparentBinLen; i++) {
740
+ xrayEdgesTransparentBin[i].drawEdgesXRayed(frameCtx);
741
+ }
742
+ }
743
+
744
+ // Transparent X-ray fill
745
+
746
+ if (xrayedFillTransparentBinLen > 0) {
747
+ for (i = 0; i < xrayedFillTransparentBinLen; i++) {
748
+ xrayedFillTransparentBin[i].drawSilhouetteXRayed(frameCtx);
749
+ }
750
+ }
751
+
752
+ gl.disable(gl.BLEND);
753
+ if (!alphaDepthMask) {
754
+ gl.depthMask(true);
755
+ }
756
+ }
757
+
758
+ // Opaque highlight
759
+
760
+ if (highlightedFillOpaqueBinLen > 0 || highlightedEdgesOpaqueBinLen > 0) {
761
+ frameCtx.lastProgramId = null;
762
+ if (scene.highlightMaterial.glowThrough) {
763
+ gl.clear(gl.DEPTH_BUFFER_BIT);
764
+ }
765
+
766
+ // Opaque highlighted edges
767
+
768
+ if (highlightedEdgesOpaqueBinLen > 0) {
769
+ for (i = 0; i < highlightedEdgesOpaqueBinLen; i++) {
770
+ highlightedEdgesOpaqueBin[i].drawEdgesHighlighted(frameCtx);
771
+ }
772
+ }
773
+
774
+ // Opaque highlighted fill
775
+
776
+ if (highlightedFillOpaqueBinLen > 0) {
777
+ for (i = 0; i < highlightedFillOpaqueBinLen; i++) {
778
+ highlightedFillOpaqueBin[i].drawSilhouetteHighlighted(frameCtx);
779
+ }
780
+ }
781
+ }
782
+
783
+ // Highlighted transparent
784
+
785
+ if (highlightedFillTransparentBinLen > 0 || highlightedEdgesTransparentBinLen > 0 || highlightedFillOpaqueBinLen > 0) {
786
+ frameCtx.lastProgramId = null;
787
+ if (scene.selectedMaterial.glowThrough) {
788
+ gl.clear(gl.DEPTH_BUFFER_BIT);
789
+ }
790
+ gl.enable(gl.BLEND);
791
+ if (canvasTransparent) {
792
+ gl.blendEquation(gl.FUNC_ADD);
793
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
794
+ } else {
795
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
796
+ }
797
+ gl.enable(gl.CULL_FACE);
798
+
799
+ // Highlighted transparent edges
800
+
801
+ if (highlightedEdgesTransparentBinLen > 0) {
802
+ for (i = 0; i < highlightedEdgesTransparentBinLen; i++) {
803
+ highlightedEdgesTransparentBin[i].drawEdgesHighlighted(frameCtx);
804
+ }
805
+ }
806
+
807
+ // Highlighted transparent fill
808
+
809
+ if (highlightedFillTransparentBinLen > 0) {
810
+ for (i = 0; i < highlightedFillTransparentBinLen; i++) {
811
+ highlightedFillTransparentBin[i].drawSilhouetteHighlighted(frameCtx);
812
+ }
813
+ }
814
+ gl.disable(gl.BLEND);
815
+ }
816
+
817
+ // Selected opaque
818
+
819
+ if (selectedFillOpaqueBinLen > 0 || selectedEdgesOpaqueBinLen > 0) {
820
+ frameCtx.lastProgramId = null;
821
+ if (scene.selectedMaterial.glowThrough) {
822
+ gl.clear(gl.DEPTH_BUFFER_BIT);
823
+ }
824
+
825
+ // Selected opaque fill
826
+
827
+ if (selectedEdgesOpaqueBinLen > 0) {
828
+ for (i = 0; i < selectedEdgesOpaqueBinLen; i++) {
829
+ selectedEdgesOpaqueBin[i].drawEdgesSelected(frameCtx);
830
+ }
831
+ }
832
+
833
+ // Selected opaque edges
834
+
835
+ if (selectedFillOpaqueBinLen > 0) {
836
+ for (i = 0; i < selectedFillOpaqueBinLen; i++) {
837
+ selectedFillOpaqueBin[i].drawSilhouetteSelected(frameCtx);
838
+ }
839
+ }
840
+ }
841
+
842
+ // Selected transparent
843
+
844
+ if (selectedFillTransparentBinLen > 0 || selectedEdgesTransparentBinLen > 0) {
845
+ frameCtx.lastProgramId = null;
846
+ if (scene.selectedMaterial.glowThrough) {
847
+ gl.clear(gl.DEPTH_BUFFER_BIT);
848
+ }
849
+ gl.enable(gl.CULL_FACE);
850
+ gl.enable(gl.BLEND);
851
+ if (canvasTransparent) {
852
+ gl.blendEquation(gl.FUNC_ADD);
853
+ gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
854
+ } else {
855
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
856
+ }
857
+
858
+ // Selected transparent edges
859
+
860
+ if (selectedEdgesTransparentBinLen > 0) {
861
+ for (i = 0; i < selectedEdgesTransparentBinLen; i++) {
862
+ selectedEdgesTransparentBin[i].drawEdgesSelected(frameCtx);
863
+ }
864
+ }
865
+
866
+ // Selected transparent fill
867
+
868
+ if (selectedFillTransparentBinLen > 0) {
869
+ for (i = 0; i < selectedFillTransparentBinLen; i++) {
870
+ selectedFillTransparentBin[i].drawSilhouetteSelected(frameCtx);
871
+ }
872
+ }
873
+ gl.disable(gl.BLEND);
874
+ }
875
+
876
+ const endTime = Date.now();
877
+ const frameStats = stats.frame;
878
+
879
+ frameStats.renderTime = (endTime - startTime) / 1000.0;
880
+ frameStats.drawElements = frameCtx.drawElements;
881
+ frameStats.drawArrays = frameCtx.drawArrays;
882
+ frameStats.useProgram = frameCtx.useProgram;
883
+ frameStats.bindTexture = frameCtx.bindTexture;
884
+ frameStats.bindArray = frameCtx.bindArray;
885
+
886
+ const numTextureUnits = WEBGL_INFO.MAX_TEXTURE_IMAGE_UNITS;
887
+ for (let ii = 0; ii < numTextureUnits; ii++) {
888
+ gl.activeTexture(gl.TEXTURE0 + ii);
889
+ }
890
+ gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);
891
+ gl.bindTexture(gl.TEXTURE_2D, null);
892
+
893
+ const numVertexAttribs = WEBGL_INFO.MAX_VERTEX_ATTRIBS; // Fixes https://github.com/xeokit/xeokit-sdk/issues/174
894
+ for (let ii = 0; ii < numVertexAttribs; ii++) {
895
+ gl.disableVertexAttribArray(ii);
896
+ }
897
+
898
+ if (unbindOutputFrameBuffer) {
899
+ unbindOutputFrameBuffer(params.pass);
900
+ }
901
+ }
902
+
903
+ /**
904
+ * Picks an Entity.
905
+ * @private
906
+ */
907
+ this.pick = (function () {
908
+
909
+ const tempVec3a = math.vec3();
910
+ const tempMat4a = math.mat4();
911
+ const tempMat4b = math.mat4();
912
+
913
+ const randomVec3 = math.vec3();
914
+ const up = math.vec3([0, 1, 0]);
915
+ const _pickResult = new PickResult();
916
+
917
+ const nearAndFar = math.vec2();
918
+
919
+ const canvasPos = math.vec3();
920
+
921
+ const worldRayOrigin = math.vec3();
922
+ const worldRayDir = math.vec3();
923
+ const worldSurfacePos = math.vec3();
924
+ const worldSurfaceNormal = math.vec3();
925
+
926
+ return function (params, pickResult = _pickResult) {
927
+
928
+ pickResult.reset();
929
+
930
+ updateDrawlist();
931
+
932
+ let look;
933
+ let pickViewMatrix = null;
934
+ let pickProjMatrix = null;
935
+
936
+ pickResult.pickSurface = params.pickSurface;
937
+
938
+ if (params.canvasPos) {
939
+
940
+ canvasPos[0] = params.canvasPos[0];
941
+ canvasPos[1] = params.canvasPos[1];
942
+
943
+ pickViewMatrix = scene.camera.viewMatrix;
944
+ pickProjMatrix = scene.camera.projMatrix;
945
+
946
+ pickResult.canvasPos = params.canvasPos;
947
+
948
+ } else {
949
+
950
+ // Picking with arbitrary World-space ray
951
+ // Align camera along ray and fire ray through center of canvas
952
+
953
+ if (params.matrix) {
954
+
955
+ pickViewMatrix = params.matrix;
956
+ pickProjMatrix = scene.camera.projMatrix;
957
+
958
+ } else {
959
+
960
+ worldRayOrigin.set(params.origin || [0, 0, 0]);
961
+ worldRayDir.set(params.direction || [0, 0, 1]);
962
+
963
+ look = math.addVec3(worldRayOrigin, worldRayDir, tempVec3a);
964
+
965
+ randomVec3[0] = Math.random();
966
+ randomVec3[1] = Math.random();
967
+ randomVec3[2] = Math.random();
968
+
969
+ math.normalizeVec3(randomVec3);
970
+ math.cross3Vec3(worldRayDir, randomVec3, up);
971
+
972
+ pickViewMatrix = math.lookAtMat4v(worldRayOrigin, look, up, tempMat4b);
973
+ // pickProjMatrix = scene.camera.projMatrix;
974
+ pickProjMatrix = scene.camera.ortho.matrix;
975
+
976
+ pickResult.origin = worldRayOrigin;
977
+ pickResult.direction = worldRayDir;
978
+ }
979
+
980
+ canvasPos[0] = canvas.clientWidth * 0.5;
981
+ canvasPos[1] = canvas.clientHeight * 0.5;
982
+ }
983
+
984
+ for (let type in drawableTypeInfo) {
985
+ if (drawableTypeInfo.hasOwnProperty(type)) {
986
+ const drawableList = drawableTypeInfo[type].drawableList;
987
+ for (let i = 0, len = drawableList.length; i < len; i++) {
988
+ const drawable = drawableList[i];
989
+ if (drawable.setPickMatrices) { // Eg. SceneModel, which needs pre-loading into texture
990
+ drawable.setPickMatrices(pickViewMatrix, pickProjMatrix);
991
+ }
992
+ }
993
+ }
994
+ }
995
+
996
+ const pickBuffer = renderBufferManager.getRenderBuffer("pick", {size: [1, 1]});
997
+
998
+ pickBuffer.bind();
999
+
1000
+ const pickable = gpuPickPickable(pickBuffer, canvasPos, pickViewMatrix, pickProjMatrix, params, pickResult);
1001
+
1002
+ if (!pickable) {
1003
+ pickBuffer.unbind();
1004
+ return null;
1005
+ }
1006
+
1007
+ const pickedEntity = (pickable.delegatePickedEntity) ? pickable.delegatePickedEntity() : pickable;
1008
+
1009
+ if (!pickedEntity) {
1010
+ pickBuffer.unbind();
1011
+ return null;
1012
+ }
1013
+
1014
+ if (params.pickSurface) {
1015
+
1016
+ // GPU-based ray-picking
1017
+
1018
+ if (pickable.canPickTriangle && pickable.canPickTriangle()) {
1019
+
1020
+ gpuPickTriangle(pickBuffer, pickable, canvasPos, pickViewMatrix, pickProjMatrix, pickResult);
1021
+
1022
+ pickable.pickTriangleSurface(pickViewMatrix, pickProjMatrix, pickResult);
1023
+
1024
+ pickResult.pickSurfacePrecision = false;
1025
+
1026
+ } else {
1027
+
1028
+ if (pickable.canPickWorldPos && pickable.canPickWorldPos()) {
1029
+
1030
+ nearAndFar[0] = scene.camera.project.near;
1031
+ nearAndFar[1] = scene.camera.project.far;
1032
+
1033
+ gpuPickWorldPos(pickBuffer, pickable, canvasPos, pickViewMatrix, pickProjMatrix, nearAndFar, pickResult);
1034
+
1035
+ if (params.pickSurfaceNormal !== false) {
1036
+ gpuPickWorldNormal(pickBuffer, pickable, canvasPos, pickViewMatrix, pickProjMatrix, pickResult);
1037
+ }
1038
+
1039
+ pickResult.pickSurfacePrecision = false;
1040
+ }
1041
+ }
1042
+ }
1043
+ pickBuffer.unbind();
1044
+ pickResult.entity = pickedEntity;
1045
+ return pickResult;
1046
+ };
1047
+ })();
1048
+
1049
+ function gpuPickPickable(pickBuffer, canvasPos, pickViewMatrix, pickProjMatrix, params, pickResult) {
1050
+
1051
+ const resolutionScale = scene.canvas.resolutionScale;
1052
+
1053
+ frameCtx.reset();
1054
+ frameCtx.backfaces = true;
1055
+ frameCtx.frontface = true; // "ccw"
1056
+ frameCtx.pickOrigin = pickResult.origin;
1057
+ frameCtx.pickViewMatrix = pickViewMatrix;
1058
+ frameCtx.pickProjMatrix = pickProjMatrix;
1059
+ frameCtx.pickInvisible = !!params.pickInvisible;
1060
+ frameCtx.pickClipPos = [
1061
+ getClipPosX(canvasPos[0] * resolutionScale, gl.drawingBufferWidth),
1062
+ getClipPosY(canvasPos[1] * resolutionScale, gl.drawingBufferHeight),
1063
+ ];
1064
+
1065
+ gl.viewport(0, 0, 1, 1);
1066
+ gl.depthMask(true);
1067
+ gl.enable(gl.DEPTH_TEST);
1068
+ gl.disable(gl.CULL_FACE);
1069
+ gl.disable(gl.BLEND);
1070
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
1071
+
1072
+ const includeEntityIds = params.includeEntityIds;
1073
+ const excludeEntityIds = params.excludeEntityIds;
1074
+
1075
+ for (let type in drawableTypeInfo) {
1076
+ if (drawableTypeInfo.hasOwnProperty(type)) {
1077
+
1078
+ const drawableInfo = drawableTypeInfo[type];
1079
+ const drawableList = drawableInfo.drawableList;
1080
+
1081
+ for (let i = 0, len = drawableList.length; i < len; i++) {
1082
+
1083
+ const drawable = drawableList[i];
1084
+
1085
+ if (!drawable.drawPickMesh || (params.pickInvisible !== true && drawable.visible === false) || drawable.pickable === false) {
1086
+ continue;
1087
+ }
1088
+ if (includeEntityIds && !includeEntityIds[drawable.id]) { // TODO: push this logic into drawable
1089
+ continue;
1090
+ }
1091
+ if (excludeEntityIds && excludeEntityIds[drawable.id]) {
1092
+ continue;
1093
+ }
1094
+
1095
+ drawable.drawPickMesh(frameCtx);
1096
+ }
1097
+ }
1098
+ }
1099
+ const pix = pickBuffer.read(0, 0);
1100
+ const pickID = pix[0] + (pix[1] << 8) + (pix[2] << 16) + (pix[3] << 24);
1101
+
1102
+ if (pickID < 0) {
1103
+ return;
1104
+ }
1105
+
1106
+ const pickable = pickIDs.items[pickID];
1107
+
1108
+ return pickable;
1109
+ }
1110
+
1111
+ function gpuPickTriangle(pickBuffer, pickable, canvasPos, pickViewMatrix, pickProjMatrix, pickResult) {
1112
+
1113
+ if (!pickable.drawPickTriangles) {
1114
+ return;
1115
+ }
1116
+
1117
+ const resolutionScale = scene.canvas.resolutionScale;
1118
+
1119
+ frameCtx.reset();
1120
+ frameCtx.backfaces = true;
1121
+ frameCtx.frontface = true; // "ccw"
1122
+ frameCtx.pickOrigin = pickResult.origin;
1123
+ frameCtx.pickViewMatrix = pickViewMatrix; // Can be null
1124
+ frameCtx.pickProjMatrix = pickProjMatrix; // Can be null
1125
+ // frameCtx.pickInvisible = !!params.pickInvisible;
1126
+ frameCtx.pickClipPos = [
1127
+ getClipPosX(canvasPos[0] * resolutionScale, gl.drawingBufferWidth),
1128
+ getClipPosY(canvasPos[1] * resolutionScale, gl.drawingBufferHeight),
1129
+ ];
1130
+
1131
+ gl.viewport(0, 0, 1, 1);
1132
+
1133
+ gl.clearColor(0, 0, 0, 0);
1134
+ gl.enable(gl.DEPTH_TEST);
1135
+ gl.disable(gl.CULL_FACE);
1136
+ gl.disable(gl.BLEND);
1137
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
1138
+
1139
+ pickable.drawPickTriangles(frameCtx);
1140
+
1141
+ const pix = pickBuffer.read(0, 0);
1142
+
1143
+ let primIndex = pix[0] + (pix[1] * 256) + (pix[2] * 256 * 256) + (pix[3] * 256 * 256 * 256);
1144
+
1145
+ primIndex *= 3; // Convert from triangle number to first vertex in indices
1146
+
1147
+ pickResult.primIndex = primIndex;
1148
+ }
1149
+
1150
+ const gpuPickWorldPos = (function () {
1151
+
1152
+ const tempVec4a = math.vec4();
1153
+ const tempVec4b = math.vec4();
1154
+ const tempVec4c = math.vec4();
1155
+ const tempVec4d = math.vec4();
1156
+ const tempVec4e = math.vec4();
1157
+ const tempMat4a = math.mat4();
1158
+ const tempMat4b = math.mat4();
1159
+ const tempMat4c = math.mat4();
1160
+
1161
+ return function (pickBuffer, pickable, canvasPos, pickViewMatrix, pickProjMatrix, nearAndFar, pickResult) {
1162
+
1163
+ const resolutionScale = scene.canvas.resolutionScale;
1164
+
1165
+ frameCtx.reset();
1166
+ frameCtx.backfaces = true;
1167
+ frameCtx.frontface = true; // "ccw"
1168
+ frameCtx.pickOrigin = pickResult.origin;
1169
+ frameCtx.pickViewMatrix = pickViewMatrix;
1170
+ frameCtx.pickProjMatrix = pickProjMatrix;
1171
+ frameCtx.pickZNear = nearAndFar[0];
1172
+ frameCtx.pickZFar = nearAndFar[1];
1173
+ frameCtx.pickElementsCount = pickable.pickElementsCount;
1174
+ frameCtx.pickElementsOffset = pickable.pickElementsOffset;
1175
+ frameCtx.pickClipPos = [
1176
+ getClipPosX(canvasPos[0] * resolutionScale, gl.drawingBufferWidth),
1177
+ getClipPosY(canvasPos[1] * resolutionScale, gl.drawingBufferHeight),
1178
+ ];
1179
+
1180
+ gl.viewport(0, 0, 1, 1);
1181
+
1182
+ gl.clearColor(0, 0, 0, 0);
1183
+ gl.depthMask(true);
1184
+ gl.enable(gl.DEPTH_TEST);
1185
+ gl.disable(gl.CULL_FACE);
1186
+ gl.disable(gl.BLEND);
1187
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
1188
+
1189
+ pickable.drawPickDepths(frameCtx); // Draw color-encoded fragment screen-space depths
1190
+
1191
+ const pix = pickBuffer.read(0, 0);
1192
+
1193
+ const screenZ = unpackDepth(pix); // Get screen-space Z at the given canvas coords
1194
+
1195
+ // Calculate clip space coordinates, which will be in range of x=[-1..1] and y=[-1..1], with y=(+1) at top
1196
+ const x = (canvasPos[0] - canvas.clientWidth / 2) / (canvas.clientWidth / 2);
1197
+ const y = -(canvasPos[1] - canvas.clientHeight / 2) / (canvas.clientHeight / 2);
1198
+
1199
+ const origin = pickable.origin;
1200
+ let pvMat;
1201
+
1202
+ if (origin) {
1203
+ const rtcPickViewMat = createRTCViewMat(pickViewMatrix, origin, tempMat4a);
1204
+ pvMat = math.mulMat4(pickProjMatrix, rtcPickViewMat, tempMat4b);
1205
+
1206
+ } else {
1207
+ pvMat = math.mulMat4(pickProjMatrix, pickViewMatrix, tempMat4b);
1208
+ }
1209
+
1210
+ const pvMatInverse = math.inverseMat4(pvMat, tempMat4c);
1211
+
1212
+ tempVec4a[0] = x;
1213
+ tempVec4a[1] = y;
1214
+ tempVec4a[2] = -1;
1215
+ tempVec4a[3] = 1;
1216
+
1217
+ let world1 = math.transformVec4(pvMatInverse, tempVec4a);
1218
+ world1 = math.mulVec4Scalar(world1, 1 / world1[3]);
1219
+
1220
+ tempVec4b[0] = x;
1221
+ tempVec4b[1] = y;
1222
+ tempVec4b[2] = 1;
1223
+ tempVec4b[3] = 1;
1224
+
1225
+ let world2 = math.transformVec4(pvMatInverse, tempVec4b);
1226
+ world2 = math.mulVec4Scalar(world2, 1 / world2[3]);
1227
+
1228
+ const dir = math.subVec3(world2, world1, tempVec4c);
1229
+ const worldPos = math.addVec3(world1, math.mulVec4Scalar(dir, screenZ, tempVec4d), tempVec4e);
1230
+
1231
+ if (origin) {
1232
+ math.addVec3(worldPos, origin);
1233
+ }
1234
+
1235
+ pickResult.worldPos = worldPos;
1236
+ }
1237
+ })();
1238
+
1239
+ function drawSnapInit(frameCtx) {
1240
+ frameCtx.snapPickLayerParams = [];
1241
+ frameCtx.snapPickLayerNumber = 0;
1242
+ for (let type in drawableTypeInfo) {
1243
+ const drawableInfo = drawableTypeInfo[type];
1244
+ const drawableList = drawableInfo.drawableList;
1245
+ for (let i = 0, len = drawableList.length; i < len; i++) {
1246
+ const drawable = drawableList[i];
1247
+ if (drawable.drawSnapInit) {
1248
+ if (!drawable.culled && drawable.visible && drawable.pickable) {
1249
+ drawable.drawSnapInit(frameCtx);
1250
+ }
1251
+ }
1252
+ }
1253
+ }
1254
+ return frameCtx.snapPickLayerParams;
1255
+ }
1256
+
1257
+ function drawSnap(frameCtx) {
1258
+ frameCtx.snapPickLayerParams = frameCtx.snapPickLayerParams || [];
1259
+ frameCtx.snapPickLayerNumber = frameCtx.snapPickLayerParams.length;
1260
+ for (let type in drawableTypeInfo) {
1261
+ const drawableInfo = drawableTypeInfo[type];
1262
+ const drawableList = drawableInfo.drawableList;
1263
+ for (let i = 0, len = drawableList.length; i < len; i++) {
1264
+ const drawable = drawableList[i];
1265
+ if (drawable.drawSnap) {
1266
+ if (!drawable.culled && drawable.visible && drawable.pickable) {
1267
+ drawable.drawSnap(frameCtx);
1268
+ }
1269
+ }
1270
+ }
1271
+ }
1272
+ return frameCtx.snapPickLayerParams;
1273
+ }
1274
+
1275
+ function getClipPosX(pos, size) {
1276
+ return 2 * (pos / size) - 1;
1277
+ }
1278
+
1279
+ function getClipPosY(pos, size) {
1280
+ return 1 - 2 * (pos / size);
1281
+ }
1282
+
1283
+ /**
1284
+ * @param {[number, number]} canvasPos
1285
+ * @param {number} [snapRadiusInPixels=30]
1286
+ * @param {boolean} [snapToVertex=true]
1287
+ * @param {boolean} [snapToEdge=true]
1288
+ * @param pickResult
1289
+ * @returns {PickResult}
1290
+ */
1291
+ this.snapPick = (function () {
1292
+
1293
+ const _pickResult = new PickResult();
1294
+
1295
+ return function (canvasPos, snapRadiusInPixels, snapToVertex, snapToEdge, pickResult = _pickResult) {
1296
+
1297
+ if (!snapToVertex && !snapToEdge) {
1298
+ return this.pick({canvasPos, pickSurface: true});
1299
+ }
1300
+
1301
+ const resolutionScale = scene.canvas.resolutionScale;
1302
+
1303
+ frameCtx.reset();
1304
+ frameCtx.backfaces = true;
1305
+ frameCtx.frontface = true; // "ccw"
1306
+ frameCtx.pickZNear = scene.camera.project.near;
1307
+ frameCtx.pickZFar = scene.camera.project.far;
1308
+
1309
+ snapRadiusInPixels = snapRadiusInPixels || 30;
1310
+
1311
+ const vertexPickBuffer = renderBufferManager.getRenderBuffer("uniquePickColors-aabs", {
1312
+ depthTexture: true,
1313
+ size: [
1314
+ 2 * snapRadiusInPixels + 1,
1315
+ 2 * snapRadiusInPixels + 1,
1316
+ ]
1317
+ });
1318
+
1319
+ frameCtx.snapVectorA = [
1320
+ getClipPosX(canvasPos[0] * resolutionScale, gl.drawingBufferWidth),
1321
+ getClipPosY(canvasPos[1] * resolutionScale, gl.drawingBufferHeight),
1322
+ ];
1323
+
1324
+ frameCtx.snapInvVectorAB = [
1325
+ gl.drawingBufferWidth / (2 * snapRadiusInPixels),
1326
+ gl.drawingBufferHeight / (2 * snapRadiusInPixels),
1327
+ ];
1328
+
1329
+ // Bind and clear the snap render target
1330
+
1331
+ vertexPickBuffer.bind(gl.RGBA32I, gl.RGBA32I, gl.RGBA8UI);
1332
+ gl.viewport(0, 0, vertexPickBuffer.size[0], vertexPickBuffer.size[1]);
1333
+ gl.enable(gl.DEPTH_TEST);
1334
+ gl.frontFace(gl.CCW);
1335
+ gl.disable(gl.CULL_FACE);
1336
+ gl.depthMask(true);
1337
+ gl.disable(gl.BLEND);
1338
+ gl.depthFunc(gl.LEQUAL);
1339
+ gl.clear(gl.DEPTH_BUFFER_BIT);
1340
+ gl.clearBufferiv(gl.COLOR, 0, new Int32Array([0, 0, 0, 0]));
1341
+ gl.clearBufferiv(gl.COLOR, 1, new Int32Array([0, 0, 0, 0]));
1342
+ gl.clearBufferuiv(gl.COLOR, 2, new Uint32Array([0, 0, 0, 0]));
1343
+
1344
+ //////////////////////////////////
1345
+ // Set view and proj mats for VBO renderers
1346
+ ///////////////////////////////////////
1347
+
1348
+ const pickViewMatrix = scene.camera.viewMatrix;
1349
+ const pickProjMatrix = scene.camera.projMatrix;
1350
+
1351
+ for (let type in drawableTypeInfo) {
1352
+ if (drawableTypeInfo.hasOwnProperty(type)) {
1353
+ const drawableList = drawableTypeInfo[type].drawableList;
1354
+ for (let i = 0, len = drawableList.length; i < len; i++) {
1355
+ const drawable = drawableList[i];
1356
+ if (drawable.setPickMatrices) { // Eg. SceneModel, which needs pre-loading into texture
1357
+ drawable.setPickMatrices(pickViewMatrix, pickProjMatrix);
1358
+ }
1359
+ }
1360
+ }
1361
+ }
1362
+
1363
+ // a) init z-buffer
1364
+ gl.drawBuffers([gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.COLOR_ATTACHMENT2]);
1365
+ const layerParamsSurface = drawSnapInit(frameCtx);
1366
+
1367
+ // b) snap-pick
1368
+ const layerParamsSnap = []
1369
+ frameCtx.snapPickLayerParams = layerParamsSnap;
1370
+
1371
+ gl.depthMask(false);
1372
+ gl.drawBuffers([gl.COLOR_ATTACHMENT0]);
1373
+
1374
+ if (snapToVertex && snapToEdge) {
1375
+ frameCtx.snapMode = "edge";
1376
+ drawSnap(frameCtx);
1377
+
1378
+ frameCtx.snapMode = "vertex";
1379
+ frameCtx.snapPickLayerNumber++;
1380
+
1381
+ drawSnap(frameCtx);
1382
+ } else {
1383
+ frameCtx.snapMode = snapToVertex ? "vertex" : "edge";
1384
+
1385
+ drawSnap(frameCtx);
1386
+ }
1387
+
1388
+ gl.depthMask(true);
1389
+
1390
+ // Read and decode the snapped coordinates
1391
+
1392
+ const snapPickResultArray = vertexPickBuffer.readArray(gl.RGBA_INTEGER, gl.INT, Int32Array, 4);
1393
+ const snapPickNormalResultArray = vertexPickBuffer.readArray(gl.RGBA_INTEGER, gl.INT, Int32Array, 4, 1);
1394
+ const snapPickIdResultArray = vertexPickBuffer.readArray(gl.RGBA_INTEGER, gl.UNSIGNED_INT, Uint32Array, 4, 2);
1395
+
1396
+ vertexPickBuffer.unbind();
1397
+
1398
+ // result 1) regular hi-precision world position
1399
+
1400
+ let worldPos = null;
1401
+ let worldNormal = null;
1402
+ let pickable = null;
1403
+
1404
+ const middleX = snapRadiusInPixels;
1405
+ const middleY = snapRadiusInPixels;
1406
+ const middleIndex = (middleX * 4) + (middleY * vertexPickBuffer.size[0] * 4);
1407
+ const pickResultMiddleXY = snapPickResultArray.slice(middleIndex, middleIndex + 4);
1408
+ const pickNormalResultMiddleXY = snapPickNormalResultArray.slice(middleIndex, middleIndex + 4);
1409
+ const pickPickableResultMiddleXY = snapPickIdResultArray.slice(middleIndex, middleIndex + 4);
1410
+
1411
+ if (pickResultMiddleXY[3] !== 0) {
1412
+ const pickedLayerParmasSurface = layerParamsSurface[Math.abs(pickResultMiddleXY[3]) % layerParamsSurface.length];
1413
+ const origin = pickedLayerParmasSurface.origin;
1414
+ const scale = pickedLayerParmasSurface.coordinateScale;
1415
+ worldPos = [
1416
+ pickResultMiddleXY[0] * scale[0] + origin[0],
1417
+ pickResultMiddleXY[1] * scale[1] + origin[1],
1418
+ pickResultMiddleXY[2] * scale[2] + origin[2],
1419
+ ];
1420
+ worldNormal = math.normalizeVec3([
1421
+ pickNormalResultMiddleXY[0] / math.MAX_INT,
1422
+ pickNormalResultMiddleXY[1] / math.MAX_INT,
1423
+ pickNormalResultMiddleXY[2] / math.MAX_INT,
1424
+ ]);
1425
+
1426
+ const pickID =
1427
+ pickPickableResultMiddleXY[0]
1428
+ + (pickPickableResultMiddleXY[1] << 8)
1429
+ + (pickPickableResultMiddleXY[2] << 16)
1430
+ + (pickPickableResultMiddleXY[3] << 24);
1431
+
1432
+ pickable = pickIDs.items[pickID];
1433
+ }
1434
+
1435
+ // result 2) hi-precision snapped (to vertex/edge) world position
1436
+
1437
+ let snapPickResult = [];
1438
+
1439
+ for (let i = 0; i < snapPickResultArray.length; i += 4) {
1440
+ if (snapPickResultArray[i + 3] > 0) {
1441
+ const pixelNumber = Math.floor(i / 4);
1442
+ const w = vertexPickBuffer.size[0];
1443
+ const x = pixelNumber % w - Math.floor(w / 2);
1444
+ const y = Math.floor(pixelNumber / w) - Math.floor(w / 2);
1445
+ const dist = (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)));
1446
+ snapPickResult.push({
1447
+ x,
1448
+ y,
1449
+ dist,
1450
+ isVertex: snapToVertex && snapToEdge ? snapPickResultArray[i + 3] > layerParamsSnap.length / 2 : snapToVertex,
1451
+ result: [
1452
+ snapPickResultArray[i + 0],
1453
+ snapPickResultArray[i + 1],
1454
+ snapPickResultArray[i + 2],
1455
+ snapPickResultArray[i + 3],
1456
+ ],
1457
+ normal: [
1458
+ snapPickNormalResultArray[i + 0],
1459
+ snapPickNormalResultArray[i + 1],
1460
+ snapPickNormalResultArray[i + 2],
1461
+ snapPickNormalResultArray[i + 3],
1462
+ ],
1463
+ id: [
1464
+ snapPickIdResultArray[i + 0],
1465
+ snapPickIdResultArray[i + 1],
1466
+ snapPickIdResultArray[i + 2],
1467
+ snapPickIdResultArray[i + 3],
1468
+ ]
1469
+ });
1470
+ }
1471
+ }
1472
+
1473
+ let snappedWorldPos = null;
1474
+ let snappedWorldNormal = null;
1475
+ let snappedPickable = null;
1476
+ let snapType = null;
1477
+
1478
+ if (snapPickResult.length > 0) {
1479
+ // vertex snap first, then edge snap
1480
+ snapPickResult.sort((a, b) => {
1481
+ if (a.isVertex !== b.isVertex) {
1482
+ return a.isVertex ? -1 : 1;
1483
+ } else {
1484
+ return a.dist - b.dist;
1485
+ }
1486
+ });
1487
+
1488
+ snapType = snapPickResult[0].isVertex ? "vertex" : "edge";
1489
+ const snapPick = snapPickResult[0].result;
1490
+ const snapPickNormal = snapPickResult[0].normal;
1491
+ const snapPickId = snapPickResult[0].id;
1492
+
1493
+ const pickedLayerParmas = layerParamsSnap[snapPick[3]];
1494
+
1495
+ const origin = pickedLayerParmas.origin;
1496
+ const scale = pickedLayerParmas.coordinateScale;
1497
+
1498
+ snappedWorldNormal = math.normalizeVec3([
1499
+ snapPickNormal[0] / math.MAX_INT,
1500
+ snapPickNormal[1] / math.MAX_INT,
1501
+ snapPickNormal[2] / math.MAX_INT,
1502
+ ]);
1503
+
1504
+ snappedWorldPos = [
1505
+ snapPick[0] * scale[0] + origin[0],
1506
+ snapPick[1] * scale[1] + origin[1],
1507
+ snapPick[2] * scale[2] + origin[2],
1508
+ ];
1509
+
1510
+ snappedPickable = pickIDs.items[
1511
+ snapPickId[0]
1512
+ + (snapPickId[1] << 8)
1513
+ + (snapPickId[2] << 16)
1514
+ + (snapPickId[3] << 24)
1515
+ ];
1516
+ }
1517
+
1518
+ if (null === worldPos && null == snappedWorldPos) { // If neither regular pick or snap pick, return null
1519
+ return null;
1520
+ }
1521
+
1522
+ let snappedCanvasPos = null;
1523
+
1524
+ if (null !== snappedWorldPos) {
1525
+ snappedCanvasPos = scene.camera.projectWorldPos(snappedWorldPos);
1526
+ }
1527
+
1528
+ const snappedEntity = (snappedPickable && snappedPickable.delegatePickedEntity) ? snappedPickable.delegatePickedEntity() : snappedPickable;
1529
+
1530
+ pickResult.reset();
1531
+ pickResult.snappedToEdge = (snapType === "edge");
1532
+ pickResult.snappedToVertex = (snapType === "vertex");
1533
+ pickResult.worldPos = snappedWorldPos;
1534
+ pickResult.worldNormal = snappedWorldNormal;
1535
+ pickResult.entity = snappedEntity;
1536
+ pickResult.canvasPos = canvasPos;
1537
+ pickResult.snappedCanvasPos = snappedCanvasPos || canvasPos;
1538
+
1539
+ return pickResult;
1540
+ };
1541
+ })();
1542
+
1543
+ function unpackDepth(depthZ) {
1544
+ const vec = [depthZ[0] / 256.0, depthZ[1] / 256.0, depthZ[2] / 256.0, depthZ[3] / 256.0];
1545
+ const bitShift = [1.0 / (256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0];
1546
+ return math.dotVec4(vec, bitShift);
1547
+ }
1548
+
1549
+ function gpuPickWorldNormal(pickBuffer, pickable, canvasPos, pickViewMatrix, pickProjMatrix, pickResult) {
1550
+
1551
+ const resolutionScale = scene.canvas.resolutionScale;
1552
+
1553
+ frameCtx.reset();
1554
+ frameCtx.backfaces = true;
1555
+ frameCtx.frontface = true; // "ccw"
1556
+ frameCtx.pickOrigin = pickResult.origin;
1557
+ frameCtx.pickViewMatrix = pickViewMatrix;
1558
+ frameCtx.pickProjMatrix = pickProjMatrix;
1559
+ frameCtx.pickClipPos = [
1560
+ getClipPosX(canvasPos[0] * resolutionScale, gl.drawingBufferWidth),
1561
+ getClipPosY(canvasPos[1] * resolutionScale, gl.drawingBufferHeight),
1562
+ ];
1563
+
1564
+ const pickNormalBuffer = renderBufferManager.getRenderBuffer("pick-normal", {size: [3, 3]});
1565
+
1566
+ pickNormalBuffer.bind(gl.RGBA32I);
1567
+
1568
+ gl.viewport(0, 0, pickNormalBuffer.size[0], pickNormalBuffer.size[1]);
1569
+
1570
+ gl.enable(gl.DEPTH_TEST);
1571
+ gl.disable(gl.CULL_FACE);
1572
+ gl.disable(gl.BLEND);
1573
+ gl.clear(gl.DEPTH_BUFFER_BIT);
1574
+ gl.clearBufferiv(gl.COLOR, 0, new Int32Array([0, 0, 0, 0]));
1575
+
1576
+ pickable.drawPickNormals(frameCtx); // Draw color-encoded fragment World-space normals
1577
+
1578
+ const pix = pickNormalBuffer.read(1, 1, gl.RGBA_INTEGER, gl.INT, Int32Array, 4);
1579
+
1580
+ pickNormalBuffer.unbind();
1581
+
1582
+ const worldNormal = [
1583
+ pix[0] / math.MAX_INT,
1584
+ pix[1] / math.MAX_INT,
1585
+ pix[2] / math.MAX_INT,
1586
+ ];
1587
+
1588
+ math.normalizeVec3(worldNormal);
1589
+
1590
+ pickResult.worldNormal = worldNormal;
1591
+ }
1592
+
1593
+ /**
1594
+ * Adds a {@link Marker} for occlusion testing.
1595
+ * @param marker
1596
+ */
1597
+ this.addMarker = function (marker) {
1598
+ this._occlusionTester = this._occlusionTester || new OcclusionTester(scene, renderBufferManager);
1599
+ this._occlusionTester.addMarker(marker);
1600
+ scene.occlusionTestCountdown = 0;
1601
+ };
1602
+
1603
+ /**
1604
+ * Notifies that a {@link Marker#worldPos} has updated.
1605
+ * @param marker
1606
+ */
1607
+ this.markerWorldPosUpdated = function (marker) {
1608
+ this._occlusionTester.markerWorldPosUpdated(marker);
1609
+ };
1610
+
1611
+ /**
1612
+ * Removes a {@link Marker} from occlusion testing.
1613
+ * @param marker
1614
+ */
1615
+ this.removeMarker = function (marker) {
1616
+ this._occlusionTester.removeMarker(marker);
1617
+ };
1618
+
1619
+ /**
1620
+ * Performs an occlusion test for all added {@link Marker}s, updating
1621
+ * their {@link Marker#visible} properties accordingly.
1622
+ */
1623
+ this.doOcclusionTest = function () {
1624
+
1625
+ if (this._occlusionTester && this._occlusionTester.needOcclusionTest) {
1626
+
1627
+ updateDrawlist();
1628
+
1629
+ this._occlusionTester.bindRenderBuf();
1630
+
1631
+ frameCtx.reset();
1632
+ frameCtx.backfaces = true;
1633
+ frameCtx.frontface = true; // "ccw"
1634
+
1635
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
1636
+ gl.clearColor(0, 0, 0, 0);
1637
+ gl.enable(gl.DEPTH_TEST);
1638
+ gl.disable(gl.CULL_FACE);
1639
+ gl.disable(gl.BLEND);
1640
+ gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
1641
+
1642
+ for (let type in drawableTypeInfo) {
1643
+ if (drawableTypeInfo.hasOwnProperty(type)) {
1644
+ const drawableInfo = drawableTypeInfo[type];
1645
+ const drawableList = drawableInfo.drawableList;
1646
+ for (let i = 0, len = drawableList.length; i < len; i++) {
1647
+ const drawable = drawableList[i];
1648
+ if (!drawable.drawOcclusion || drawable.culled === true || drawable.visible === false || drawable.pickable === false) { // TODO: Option to exclude transparent?
1649
+ continue;
1650
+ }
1651
+
1652
+ drawable.drawOcclusion(frameCtx);
1653
+ }
1654
+ }
1655
+ }
1656
+
1657
+ this._occlusionTester.drawMarkers(frameCtx);
1658
+ this._occlusionTester.doOcclusionTest(); // Updates Marker "visible" properties
1659
+ this._occlusionTester.unbindRenderBuf();
1660
+ }
1661
+ };
1662
+
1663
+ /**
1664
+ * Read pixels from the renderer's current output. Performs a force-render first.
1665
+ * @param pixels
1666
+ * @param colors
1667
+ * @param len
1668
+ * @param opaqueOnly
1669
+ * @private
1670
+ */
1671
+ this.readPixels = function (pixels, colors, len, opaqueOnly) {
1672
+ const snapshotBuffer = renderBufferManager.getRenderBuffer("snapshot");
1673
+ snapshotBuffer.bind();
1674
+ snapshotBuffer.clear();
1675
+ this.render({force: true, opaqueOnly: opaqueOnly});
1676
+ let color;
1677
+ let i;
1678
+ let j;
1679
+ let k;
1680
+ for (i = 0; i < len; i++) {
1681
+ j = i * 2;
1682
+ k = i * 4;
1683
+ color = snapshotBuffer.read(pixels[j], pixels[j + 1]);
1684
+ colors[k] = color[0];
1685
+ colors[k + 1] = color[1];
1686
+ colors[k + 2] = color[2];
1687
+ colors[k + 3] = color[3];
1688
+ }
1689
+ snapshotBuffer.unbind();
1690
+ imageDirty = true;
1691
+ };
1692
+
1693
+ /**
1694
+ * Enter snapshot mode.
1695
+ *
1696
+ * Switches rendering to a hidden snapshot canvas.
1697
+ *
1698
+ * Exit snapshot mode using endSnapshot().
1699
+ */
1700
+ this.beginSnapshot = function (params = {}) {
1701
+ const snapshotBuffer = renderBufferManager.getRenderBuffer("snapshot");
1702
+ if (params.width && params.height) {
1703
+ snapshotBuffer.setSize([params.width, params.height]);
1704
+ }
1705
+ snapshotBuffer.bind();
1706
+ snapshotBuffer.clear();
1707
+ snapshotBound = true;
1708
+ };
1709
+
1710
+ /**
1711
+ * When in snapshot mode, renders a frame of the current Scene state to the snapshot canvas.
1712
+ */
1713
+ this.renderSnapshot = function () {
1714
+ if (!snapshotBound) {
1715
+ return;
1716
+ }
1717
+ const snapshotBuffer = renderBufferManager.getRenderBuffer("snapshot");
1718
+ snapshotBuffer.clear();
1719
+ this.render({force: true, opaqueOnly: false});
1720
+ imageDirty = true;
1721
+ };
1722
+
1723
+ /**
1724
+ * When in snapshot mode, gets an image of the snapshot canvas.
1725
+ *
1726
+ * @private
1727
+ * @returns {String} The image data URI.
1728
+ */
1729
+ this.readSnapshot = function (params) {
1730
+ const snapshotBuffer = renderBufferManager.getRenderBuffer("snapshot");
1731
+ return snapshotBuffer.readImage(params);
1732
+ };
1733
+
1734
+ /**
1735
+ * Returns an HTMLCanvas containing an image of the snapshot canvas.
1736
+ *
1737
+ * - The HTMLCanvas has a CanvasRenderingContext2D.
1738
+ * - Expects the caller to draw more things on the HTMLCanvas (annotations etc).
1739
+ *
1740
+ * @returns {HTMLCanvasElement}
1741
+ */
1742
+ this.readSnapshotAsCanvas = function () {
1743
+ const snapshotBuffer = renderBufferManager.getRenderBuffer("snapshot");
1744
+ return snapshotBuffer.readImageAsCanvas();
1745
+ };
1746
+
1747
+ /**
1748
+ * Exists snapshot mode.
1749
+ *
1750
+ * Switches rendering back to the main canvas.
1751
+ */
1752
+ this.endSnapshot = function () {
1753
+ if (!snapshotBound) {
1754
+ return;
1755
+ }
1756
+ const snapshotBuffer = renderBufferManager.getRenderBuffer("snapshot");
1757
+ snapshotBuffer.unbind();
1758
+ snapshotBound = false;
1759
+ };
1760
+
1761
+ /**
1762
+ * Destroys this renderer.
1763
+ * @private
1764
+ */
1765
+ this.destroy = function () {
1766
+
1767
+ drawableTypeInfo = {};
1768
+ drawables = {};
1769
+
1770
+ renderBufferManager.destroy();
1771
+
1772
+ saoOcclusionRenderer.destroy();
1773
+ saoDepthLimitedBlurRenderer.destroy();
1774
+
1775
+ if (this._occlusionTester) {
1776
+ this._occlusionTester.destroy();
1777
+ }
1778
+ };
1779
+ };
1780
+
1781
+ export {Renderer};