@itwin/frontend-devtools 3.5.0-dev.63 → 3.5.0-dev.66

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 (374) hide show
  1. package/CHANGELOG.md +16 -1
  2. package/README.md +7 -4
  3. package/lib/cjs/ClipboardUtilities.d.ts +8 -8
  4. package/lib/cjs/ClipboardUtilities.js +26 -26
  5. package/lib/cjs/ClipboardUtilities.js.map +1 -1
  6. package/lib/cjs/FrontEndDevTools.d.ts +19 -19
  7. package/lib/cjs/FrontEndDevTools.d.ts.map +1 -1
  8. package/lib/cjs/FrontEndDevTools.js +221 -220
  9. package/lib/cjs/FrontEndDevTools.js.map +1 -1
  10. package/lib/cjs/effects/Convolution.d.ts +68 -68
  11. package/lib/cjs/effects/Convolution.js +165 -165
  12. package/lib/cjs/effects/Convolution.js.map +1 -1
  13. package/lib/cjs/effects/EffectTools.d.ts +33 -33
  14. package/lib/cjs/effects/EffectTools.js +68 -68
  15. package/lib/cjs/effects/EffectTools.js.map +1 -1
  16. package/lib/cjs/effects/Explosion.d.ts +12 -12
  17. package/lib/cjs/effects/Explosion.js +168 -168
  18. package/lib/cjs/effects/Explosion.js.map +1 -1
  19. package/lib/cjs/effects/FlipImage.d.ts +30 -30
  20. package/lib/cjs/effects/FlipImage.js +99 -99
  21. package/lib/cjs/effects/FlipImage.js.map +1 -1
  22. package/lib/cjs/effects/LensDistortion.d.ts +34 -34
  23. package/lib/cjs/effects/LensDistortion.js +109 -109
  24. package/lib/cjs/effects/LensDistortion.js.map +1 -1
  25. package/lib/cjs/effects/Random.d.ts +24 -24
  26. package/lib/cjs/effects/Random.js +49 -49
  27. package/lib/cjs/effects/Random.js.map +1 -1
  28. package/lib/cjs/effects/Saturation.d.ts +30 -30
  29. package/lib/cjs/effects/Saturation.js +85 -85
  30. package/lib/cjs/effects/Saturation.js.map +1 -1
  31. package/lib/cjs/effects/Snow.d.ts +76 -76
  32. package/lib/cjs/effects/Snow.js +187 -187
  33. package/lib/cjs/effects/Snow.js.map +1 -1
  34. package/lib/cjs/effects/Vignette.d.ts +39 -39
  35. package/lib/cjs/effects/Vignette.js +108 -108
  36. package/lib/cjs/effects/Vignette.js.map +1 -1
  37. package/lib/cjs/frontend-devtools.d.ts +82 -82
  38. package/lib/cjs/frontend-devtools.js +98 -98
  39. package/lib/cjs/frontend-devtools.js.map +1 -1
  40. package/lib/cjs/tools/AnimationIntervalTool.d.ts +15 -15
  41. package/lib/cjs/tools/AnimationIntervalTool.js +30 -30
  42. package/lib/cjs/tools/AnimationIntervalTool.js.map +1 -1
  43. package/lib/cjs/tools/ChangeUnitsTool.d.ts +15 -15
  44. package/lib/cjs/tools/ChangeUnitsTool.js +41 -41
  45. package/lib/cjs/tools/ChangeUnitsTool.js.map +1 -1
  46. package/lib/cjs/tools/ClipTools.d.ts +67 -67
  47. package/lib/cjs/tools/ClipTools.js +164 -164
  48. package/lib/cjs/tools/ClipTools.js.map +1 -1
  49. package/lib/cjs/tools/DisplayStyleTools.d.ts +145 -145
  50. package/lib/cjs/tools/DisplayStyleTools.js +370 -370
  51. package/lib/cjs/tools/DisplayStyleTools.js.map +1 -1
  52. package/lib/cjs/tools/EmphasizeElementsTool.d.ts +60 -60
  53. package/lib/cjs/tools/EmphasizeElementsTool.js +154 -154
  54. package/lib/cjs/tools/EmphasizeElementsTool.js.map +1 -1
  55. package/lib/cjs/tools/FrustumDecoration.d.ts +57 -57
  56. package/lib/cjs/tools/FrustumDecoration.js +374 -374
  57. package/lib/cjs/tools/FrustumDecoration.js.map +1 -1
  58. package/lib/cjs/tools/InspectElementTool.d.ts +42 -42
  59. package/lib/cjs/tools/InspectElementTool.js +198 -198
  60. package/lib/cjs/tools/InspectElementTool.js.map +1 -1
  61. package/lib/cjs/tools/MapLayerTool.d.ts +264 -264
  62. package/lib/cjs/tools/MapLayerTool.js +507 -507
  63. package/lib/cjs/tools/MapLayerTool.js.map +1 -1
  64. package/lib/cjs/tools/MeasureTileLoadTime.d.ts +12 -12
  65. package/lib/cjs/tools/MeasureTileLoadTime.js +63 -63
  66. package/lib/cjs/tools/MeasureTileLoadTime.js.map +1 -1
  67. package/lib/cjs/tools/ModelAppearanceTools.d.ts +86 -86
  68. package/lib/cjs/tools/ModelAppearanceTools.js +183 -183
  69. package/lib/cjs/tools/ModelAppearanceTools.js.map +1 -1
  70. package/lib/cjs/tools/PlanProjectionTools.d.ts +40 -40
  71. package/lib/cjs/tools/PlanProjectionTools.js +149 -149
  72. package/lib/cjs/tools/PlanProjectionTools.js.map +1 -1
  73. package/lib/cjs/tools/PlanarMaskTools.d.ts +182 -182
  74. package/lib/cjs/tools/PlanarMaskTools.js +393 -393
  75. package/lib/cjs/tools/PlanarMaskTools.js.map +1 -1
  76. package/lib/cjs/tools/ProjectExtents.d.ts +41 -41
  77. package/lib/cjs/tools/ProjectExtents.js +110 -110
  78. package/lib/cjs/tools/ProjectExtents.js.map +1 -1
  79. package/lib/cjs/tools/RealityModelTools.d.ts +116 -116
  80. package/lib/cjs/tools/RealityModelTools.js +281 -281
  81. package/lib/cjs/tools/RealityModelTools.js.map +1 -1
  82. package/lib/cjs/tools/RealityTransitionTool.d.ts +25 -25
  83. package/lib/cjs/tools/RealityTransitionTool.js +116 -116
  84. package/lib/cjs/tools/RealityTransitionTool.js.map +1 -1
  85. package/lib/cjs/tools/RenderSystemTools.d.ts +38 -38
  86. package/lib/cjs/tools/RenderSystemTools.js +70 -70
  87. package/lib/cjs/tools/RenderSystemTools.js.map +1 -1
  88. package/lib/cjs/tools/RenderTargetTools.d.ts +107 -100
  89. package/lib/cjs/tools/RenderTargetTools.d.ts.map +1 -1
  90. package/lib/cjs/tools/RenderTargetTools.js +174 -166
  91. package/lib/cjs/tools/RenderTargetTools.js.map +1 -1
  92. package/lib/cjs/tools/ReportWebGLCompatibilityTool.d.ts +11 -11
  93. package/lib/cjs/tools/ReportWebGLCompatibilityTool.js +30 -30
  94. package/lib/cjs/tools/ReportWebGLCompatibilityTool.js.map +1 -1
  95. package/lib/cjs/tools/SavedViews.d.ts +46 -46
  96. package/lib/cjs/tools/SavedViews.js +136 -136
  97. package/lib/cjs/tools/SavedViews.js.map +1 -1
  98. package/lib/cjs/tools/ScheduleScriptTools.d.ts +37 -37
  99. package/lib/cjs/tools/ScheduleScriptTools.js +159 -159
  100. package/lib/cjs/tools/ScheduleScriptTools.js.map +1 -1
  101. package/lib/cjs/tools/SelectionTools.d.ts +28 -28
  102. package/lib/cjs/tools/SelectionTools.js +87 -87
  103. package/lib/cjs/tools/SelectionTools.js.map +1 -1
  104. package/lib/cjs/tools/SetGpuMemoryLimitTool.d.ts +15 -15
  105. package/lib/cjs/tools/SetGpuMemoryLimitTool.js +33 -33
  106. package/lib/cjs/tools/SetGpuMemoryLimitTool.js.map +1 -1
  107. package/lib/cjs/tools/SourceAspectIdTools.d.ts +40 -40
  108. package/lib/cjs/tools/SourceAspectIdTools.js +86 -86
  109. package/lib/cjs/tools/SourceAspectIdTools.js.map +1 -1
  110. package/lib/cjs/tools/TileRequestDecoration.d.ts +12 -12
  111. package/lib/cjs/tools/TileRequestDecoration.js +83 -83
  112. package/lib/cjs/tools/TileRequestDecoration.js.map +1 -1
  113. package/lib/cjs/tools/TileTreeBoundsDecoration.d.ts +11 -11
  114. package/lib/cjs/tools/TileTreeBoundsDecoration.js +74 -74
  115. package/lib/cjs/tools/TileTreeBoundsDecoration.js.map +1 -1
  116. package/lib/cjs/tools/ToolTipProvider.d.ts +15 -15
  117. package/lib/cjs/tools/ToolTipProvider.js +66 -66
  118. package/lib/cjs/tools/ToolTipProvider.js.map +1 -1
  119. package/lib/cjs/tools/ViewportTools.d.ts +218 -218
  120. package/lib/cjs/tools/ViewportTools.js +516 -516
  121. package/lib/cjs/tools/ViewportTools.js.map +1 -1
  122. package/lib/cjs/tools/parseArgs.d.ts +23 -23
  123. package/lib/cjs/tools/parseArgs.js +51 -51
  124. package/lib/cjs/tools/parseArgs.js.map +1 -1
  125. package/lib/cjs/tools/parseBoolean.d.ts +8 -8
  126. package/lib/cjs/tools/parseBoolean.js +26 -26
  127. package/lib/cjs/tools/parseBoolean.js.map +1 -1
  128. package/lib/cjs/tools/parseToggle.d.ts +8 -8
  129. package/lib/cjs/tools/parseToggle.js +25 -25
  130. package/lib/cjs/tools/parseToggle.js.map +1 -1
  131. package/lib/cjs/ui/Button.d.ts +29 -29
  132. package/lib/cjs/ui/Button.js +26 -26
  133. package/lib/cjs/ui/Button.js.map +1 -1
  134. package/lib/cjs/ui/CheckBox.d.ts +23 -23
  135. package/lib/cjs/ui/CheckBox.js +27 -27
  136. package/lib/cjs/ui/CheckBox.js.map +1 -1
  137. package/lib/cjs/ui/ColorInput.d.ts +27 -27
  138. package/lib/cjs/ui/ColorInput.js +53 -53
  139. package/lib/cjs/ui/ColorInput.js.map +1 -1
  140. package/lib/cjs/ui/ComboBox.d.ts +28 -28
  141. package/lib/cjs/ui/ComboBox.js +42 -42
  142. package/lib/cjs/ui/ComboBox.js.map +1 -1
  143. package/lib/cjs/ui/DataList.d.ts +27 -27
  144. package/lib/cjs/ui/DataList.js +39 -39
  145. package/lib/cjs/ui/DataList.js.map +1 -1
  146. package/lib/cjs/ui/NestedMenu.d.ts +19 -19
  147. package/lib/cjs/ui/NestedMenu.js +46 -46
  148. package/lib/cjs/ui/NestedMenu.js.map +1 -1
  149. package/lib/cjs/ui/NumericInput.d.ts +35 -35
  150. package/lib/cjs/ui/NumericInput.js +61 -61
  151. package/lib/cjs/ui/NumericInput.js.map +1 -1
  152. package/lib/cjs/ui/RadioBox.d.ts +29 -29
  153. package/lib/cjs/ui/RadioBox.js +76 -76
  154. package/lib/cjs/ui/RadioBox.js.map +1 -1
  155. package/lib/cjs/ui/Slider.d.ts +26 -26
  156. package/lib/cjs/ui/Slider.js +34 -34
  157. package/lib/cjs/ui/Slider.js.map +1 -1
  158. package/lib/cjs/ui/TextBox.d.ts +32 -32
  159. package/lib/cjs/ui/TextBox.js +56 -56
  160. package/lib/cjs/ui/TextBox.js.map +1 -1
  161. package/lib/cjs/widgets/DiagnosticsPanel.d.ts +37 -37
  162. package/lib/cjs/widgets/DiagnosticsPanel.js +81 -81
  163. package/lib/cjs/widgets/DiagnosticsPanel.js.map +1 -1
  164. package/lib/cjs/widgets/FpsTracker.d.ts +19 -19
  165. package/lib/cjs/widgets/FpsTracker.js +56 -56
  166. package/lib/cjs/widgets/FpsTracker.js.map +1 -1
  167. package/lib/cjs/widgets/GpuProfiler.d.ts +16 -16
  168. package/lib/cjs/widgets/GpuProfiler.js +192 -192
  169. package/lib/cjs/widgets/GpuProfiler.js.map +1 -1
  170. package/lib/cjs/widgets/KeyinField.d.ts +61 -61
  171. package/lib/cjs/widgets/KeyinField.js +187 -187
  172. package/lib/cjs/widgets/KeyinField.js.map +1 -1
  173. package/lib/cjs/widgets/MemoryTracker.d.ts +27 -27
  174. package/lib/cjs/widgets/MemoryTracker.js +243 -243
  175. package/lib/cjs/widgets/MemoryTracker.js.map +1 -1
  176. package/lib/cjs/widgets/RenderCommandBreakdown.d.ts +15 -15
  177. package/lib/cjs/widgets/RenderCommandBreakdown.js +68 -68
  178. package/lib/cjs/widgets/RenderCommandBreakdown.js.map +1 -1
  179. package/lib/cjs/widgets/TileMemoryBreakdown.d.ts +30 -30
  180. package/lib/cjs/widgets/TileMemoryBreakdown.js +204 -204
  181. package/lib/cjs/widgets/TileMemoryBreakdown.js.map +1 -1
  182. package/lib/cjs/widgets/TileStatisticsTracker.d.ts +21 -21
  183. package/lib/cjs/widgets/TileStatisticsTracker.js +142 -142
  184. package/lib/cjs/widgets/TileStatisticsTracker.js.map +1 -1
  185. package/lib/cjs/widgets/ToolSettingsTracker.d.ts +9 -9
  186. package/lib/cjs/widgets/ToolSettingsTracker.js +211 -211
  187. package/lib/cjs/widgets/ToolSettingsTracker.js.map +1 -1
  188. package/lib/esm/ClipboardUtilities.d.ts +8 -8
  189. package/lib/esm/ClipboardUtilities.js +22 -22
  190. package/lib/esm/ClipboardUtilities.js.map +1 -1
  191. package/lib/esm/FrontEndDevTools.d.ts +19 -19
  192. package/lib/esm/FrontEndDevTools.d.ts.map +1 -1
  193. package/lib/esm/FrontEndDevTools.js +217 -216
  194. package/lib/esm/FrontEndDevTools.js.map +1 -1
  195. package/lib/esm/effects/Convolution.d.ts +68 -68
  196. package/lib/esm/effects/Convolution.js +155 -155
  197. package/lib/esm/effects/Convolution.js.map +1 -1
  198. package/lib/esm/effects/EffectTools.d.ts +33 -33
  199. package/lib/esm/effects/EffectTools.js +62 -62
  200. package/lib/esm/effects/EffectTools.js.map +1 -1
  201. package/lib/esm/effects/Explosion.d.ts +12 -12
  202. package/lib/esm/effects/Explosion.js +164 -164
  203. package/lib/esm/effects/Explosion.js.map +1 -1
  204. package/lib/esm/effects/FlipImage.d.ts +30 -30
  205. package/lib/esm/effects/FlipImage.js +94 -94
  206. package/lib/esm/effects/FlipImage.js.map +1 -1
  207. package/lib/esm/effects/LensDistortion.d.ts +34 -34
  208. package/lib/esm/effects/LensDistortion.js +104 -104
  209. package/lib/esm/effects/LensDistortion.js.map +1 -1
  210. package/lib/esm/effects/Random.d.ts +24 -24
  211. package/lib/esm/effects/Random.js +41 -41
  212. package/lib/esm/effects/Random.js.map +1 -1
  213. package/lib/esm/effects/Saturation.d.ts +30 -30
  214. package/lib/esm/effects/Saturation.js +80 -80
  215. package/lib/esm/effects/Saturation.js.map +1 -1
  216. package/lib/esm/effects/Snow.d.ts +76 -76
  217. package/lib/esm/effects/Snow.js +182 -182
  218. package/lib/esm/effects/Snow.js.map +1 -1
  219. package/lib/esm/effects/Vignette.d.ts +39 -39
  220. package/lib/esm/effects/Vignette.js +103 -103
  221. package/lib/esm/effects/Vignette.js.map +1 -1
  222. package/lib/esm/frontend-devtools.d.ts +82 -82
  223. package/lib/esm/frontend-devtools.js +86 -86
  224. package/lib/esm/frontend-devtools.js.map +1 -1
  225. package/lib/esm/tools/AnimationIntervalTool.d.ts +15 -15
  226. package/lib/esm/tools/AnimationIntervalTool.js +26 -26
  227. package/lib/esm/tools/AnimationIntervalTool.js.map +1 -1
  228. package/lib/esm/tools/ChangeUnitsTool.d.ts +15 -15
  229. package/lib/esm/tools/ChangeUnitsTool.js +37 -37
  230. package/lib/esm/tools/ChangeUnitsTool.js.map +1 -1
  231. package/lib/esm/tools/ClipTools.d.ts +67 -67
  232. package/lib/esm/tools/ClipTools.js +158 -158
  233. package/lib/esm/tools/ClipTools.js.map +1 -1
  234. package/lib/esm/tools/DisplayStyleTools.d.ts +145 -145
  235. package/lib/esm/tools/DisplayStyleTools.js +356 -356
  236. package/lib/esm/tools/DisplayStyleTools.js.map +1 -1
  237. package/lib/esm/tools/EmphasizeElementsTool.d.ts +60 -60
  238. package/lib/esm/tools/EmphasizeElementsTool.js +145 -145
  239. package/lib/esm/tools/EmphasizeElementsTool.js.map +1 -1
  240. package/lib/esm/tools/FrustumDecoration.d.ts +57 -57
  241. package/lib/esm/tools/FrustumDecoration.js +367 -367
  242. package/lib/esm/tools/FrustumDecoration.js.map +1 -1
  243. package/lib/esm/tools/InspectElementTool.d.ts +42 -42
  244. package/lib/esm/tools/InspectElementTool.js +194 -194
  245. package/lib/esm/tools/InspectElementTool.js.map +1 -1
  246. package/lib/esm/tools/MapLayerTool.d.ts +264 -264
  247. package/lib/esm/tools/MapLayerTool.js +485 -485
  248. package/lib/esm/tools/MapLayerTool.js.map +1 -1
  249. package/lib/esm/tools/MeasureTileLoadTime.d.ts +12 -12
  250. package/lib/esm/tools/MeasureTileLoadTime.js +59 -59
  251. package/lib/esm/tools/MeasureTileLoadTime.js.map +1 -1
  252. package/lib/esm/tools/ModelAppearanceTools.d.ts +86 -86
  253. package/lib/esm/tools/ModelAppearanceTools.js +172 -172
  254. package/lib/esm/tools/ModelAppearanceTools.js.map +1 -1
  255. package/lib/esm/tools/PlanProjectionTools.d.ts +40 -40
  256. package/lib/esm/tools/PlanProjectionTools.js +143 -143
  257. package/lib/esm/tools/PlanProjectionTools.js.map +1 -1
  258. package/lib/esm/tools/PlanarMaskTools.d.ts +182 -182
  259. package/lib/esm/tools/PlanarMaskTools.js +377 -377
  260. package/lib/esm/tools/PlanarMaskTools.js.map +1 -1
  261. package/lib/esm/tools/ProjectExtents.d.ts +41 -41
  262. package/lib/esm/tools/ProjectExtents.js +104 -104
  263. package/lib/esm/tools/ProjectExtents.js.map +1 -1
  264. package/lib/esm/tools/RealityModelTools.d.ts +116 -116
  265. package/lib/esm/tools/RealityModelTools.js +268 -268
  266. package/lib/esm/tools/RealityModelTools.js.map +1 -1
  267. package/lib/esm/tools/RealityTransitionTool.d.ts +25 -25
  268. package/lib/esm/tools/RealityTransitionTool.js +112 -112
  269. package/lib/esm/tools/RealityTransitionTool.js.map +1 -1
  270. package/lib/esm/tools/RenderSystemTools.d.ts +38 -38
  271. package/lib/esm/tools/RenderSystemTools.js +63 -63
  272. package/lib/esm/tools/RenderSystemTools.js.map +1 -1
  273. package/lib/esm/tools/RenderTargetTools.d.ts +107 -100
  274. package/lib/esm/tools/RenderTargetTools.d.ts.map +1 -1
  275. package/lib/esm/tools/RenderTargetTools.js +159 -152
  276. package/lib/esm/tools/RenderTargetTools.js.map +1 -1
  277. package/lib/esm/tools/ReportWebGLCompatibilityTool.d.ts +11 -11
  278. package/lib/esm/tools/ReportWebGLCompatibilityTool.js +26 -26
  279. package/lib/esm/tools/ReportWebGLCompatibilityTool.js.map +1 -1
  280. package/lib/esm/tools/SavedViews.d.ts +46 -46
  281. package/lib/esm/tools/SavedViews.js +128 -128
  282. package/lib/esm/tools/SavedViews.js.map +1 -1
  283. package/lib/esm/tools/ScheduleScriptTools.d.ts +37 -37
  284. package/lib/esm/tools/ScheduleScriptTools.js +153 -153
  285. package/lib/esm/tools/ScheduleScriptTools.js.map +1 -1
  286. package/lib/esm/tools/SelectionTools.d.ts +28 -28
  287. package/lib/esm/tools/SelectionTools.js +82 -82
  288. package/lib/esm/tools/SelectionTools.js.map +1 -1
  289. package/lib/esm/tools/SetGpuMemoryLimitTool.d.ts +15 -15
  290. package/lib/esm/tools/SetGpuMemoryLimitTool.js +29 -29
  291. package/lib/esm/tools/SetGpuMemoryLimitTool.js.map +1 -1
  292. package/lib/esm/tools/SourceAspectIdTools.d.ts +40 -40
  293. package/lib/esm/tools/SourceAspectIdTools.js +80 -80
  294. package/lib/esm/tools/SourceAspectIdTools.js.map +1 -1
  295. package/lib/esm/tools/TileRequestDecoration.d.ts +12 -12
  296. package/lib/esm/tools/TileRequestDecoration.js +79 -79
  297. package/lib/esm/tools/TileRequestDecoration.js.map +1 -1
  298. package/lib/esm/tools/TileTreeBoundsDecoration.d.ts +11 -11
  299. package/lib/esm/tools/TileTreeBoundsDecoration.js +70 -70
  300. package/lib/esm/tools/TileTreeBoundsDecoration.js.map +1 -1
  301. package/lib/esm/tools/ToolTipProvider.d.ts +15 -15
  302. package/lib/esm/tools/ToolTipProvider.js +62 -62
  303. package/lib/esm/tools/ToolTipProvider.js.map +1 -1
  304. package/lib/esm/tools/ViewportTools.d.ts +218 -218
  305. package/lib/esm/tools/ViewportTools.js +492 -492
  306. package/lib/esm/tools/ViewportTools.js.map +1 -1
  307. package/lib/esm/tools/parseArgs.d.ts +23 -23
  308. package/lib/esm/tools/parseArgs.js +47 -47
  309. package/lib/esm/tools/parseArgs.js.map +1 -1
  310. package/lib/esm/tools/parseBoolean.d.ts +8 -8
  311. package/lib/esm/tools/parseBoolean.js +22 -22
  312. package/lib/esm/tools/parseBoolean.js.map +1 -1
  313. package/lib/esm/tools/parseToggle.d.ts +8 -8
  314. package/lib/esm/tools/parseToggle.js +21 -21
  315. package/lib/esm/tools/parseToggle.js.map +1 -1
  316. package/lib/esm/ui/Button.d.ts +29 -29
  317. package/lib/esm/ui/Button.js +22 -22
  318. package/lib/esm/ui/Button.js.map +1 -1
  319. package/lib/esm/ui/CheckBox.d.ts +23 -23
  320. package/lib/esm/ui/CheckBox.js +23 -23
  321. package/lib/esm/ui/CheckBox.js.map +1 -1
  322. package/lib/esm/ui/ColorInput.d.ts +27 -27
  323. package/lib/esm/ui/ColorInput.js +48 -48
  324. package/lib/esm/ui/ColorInput.js.map +1 -1
  325. package/lib/esm/ui/ComboBox.d.ts +28 -28
  326. package/lib/esm/ui/ComboBox.js +38 -38
  327. package/lib/esm/ui/ComboBox.js.map +1 -1
  328. package/lib/esm/ui/DataList.d.ts +27 -27
  329. package/lib/esm/ui/DataList.js +34 -34
  330. package/lib/esm/ui/DataList.js.map +1 -1
  331. package/lib/esm/ui/NestedMenu.d.ts +19 -19
  332. package/lib/esm/ui/NestedMenu.js +42 -42
  333. package/lib/esm/ui/NestedMenu.js.map +1 -1
  334. package/lib/esm/ui/NumericInput.d.ts +35 -35
  335. package/lib/esm/ui/NumericInput.js +56 -56
  336. package/lib/esm/ui/NumericInput.js.map +1 -1
  337. package/lib/esm/ui/RadioBox.d.ts +29 -29
  338. package/lib/esm/ui/RadioBox.js +72 -72
  339. package/lib/esm/ui/RadioBox.js.map +1 -1
  340. package/lib/esm/ui/Slider.d.ts +26 -26
  341. package/lib/esm/ui/Slider.js +30 -30
  342. package/lib/esm/ui/Slider.js.map +1 -1
  343. package/lib/esm/ui/TextBox.d.ts +32 -32
  344. package/lib/esm/ui/TextBox.js +52 -52
  345. package/lib/esm/ui/TextBox.js.map +1 -1
  346. package/lib/esm/widgets/DiagnosticsPanel.d.ts +37 -37
  347. package/lib/esm/widgets/DiagnosticsPanel.js +77 -77
  348. package/lib/esm/widgets/DiagnosticsPanel.js.map +1 -1
  349. package/lib/esm/widgets/FpsTracker.d.ts +19 -19
  350. package/lib/esm/widgets/FpsTracker.js +52 -52
  351. package/lib/esm/widgets/FpsTracker.js.map +1 -1
  352. package/lib/esm/widgets/GpuProfiler.d.ts +16 -16
  353. package/lib/esm/widgets/GpuProfiler.js +188 -188
  354. package/lib/esm/widgets/GpuProfiler.js.map +1 -1
  355. package/lib/esm/widgets/KeyinField.d.ts +61 -61
  356. package/lib/esm/widgets/KeyinField.js +183 -183
  357. package/lib/esm/widgets/KeyinField.js.map +1 -1
  358. package/lib/esm/widgets/MemoryTracker.d.ts +27 -27
  359. package/lib/esm/widgets/MemoryTracker.js +238 -238
  360. package/lib/esm/widgets/MemoryTracker.js.map +1 -1
  361. package/lib/esm/widgets/RenderCommandBreakdown.d.ts +15 -15
  362. package/lib/esm/widgets/RenderCommandBreakdown.js +64 -64
  363. package/lib/esm/widgets/RenderCommandBreakdown.js.map +1 -1
  364. package/lib/esm/widgets/TileMemoryBreakdown.d.ts +30 -30
  365. package/lib/esm/widgets/TileMemoryBreakdown.js +200 -200
  366. package/lib/esm/widgets/TileMemoryBreakdown.js.map +1 -1
  367. package/lib/esm/widgets/TileStatisticsTracker.d.ts +21 -21
  368. package/lib/esm/widgets/TileStatisticsTracker.js +138 -138
  369. package/lib/esm/widgets/TileStatisticsTracker.js.map +1 -1
  370. package/lib/esm/widgets/ToolSettingsTracker.d.ts +9 -9
  371. package/lib/esm/widgets/ToolSettingsTracker.js +207 -207
  372. package/lib/esm/widgets/ToolSettingsTracker.js.map +1 -1
  373. package/lib/public/locales/en/FrontendDevTools.json +484 -481
  374. package/package.json +8 -8
@@ -1,63 +1,63 @@
1
- /*---------------------------------------------------------------------------------------------
2
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
- * See LICENSE.md in the project root for license terms and full copyright notice.
4
- *--------------------------------------------------------------------------------------------*/
5
- /** @packageDocumentation
6
- * @module Effects
7
- */
8
- import { assert } from "@itwin/core-bentley";
9
- import { IModelApp, Tool, } from "@itwin/core-frontend";
10
- /** Adds a screen-space effect to the selected viewport.
11
- * @beta
12
- */
13
- export class AddEffectTool extends Tool {
14
- async run() {
15
- // Avoid conflicts with the names of other registered screen-space effects.
16
- const name = `fdt ${this.effectName}`;
17
- if (!AddEffectTool._registeredEffects.has(name)) {
18
- // Register the effect.
19
- const builder = IModelApp.renderSystem.createScreenSpaceEffectBuilder({
20
- name,
21
- textureCoordFromPosition: this.textureCoordFromPosition,
22
- source: this.source,
23
- });
24
- assert(undefined !== builder);
25
- this.defineEffect(builder);
26
- builder.finish();
27
- AddEffectTool._registeredEffects.add(name);
28
- }
29
- const vp = IModelApp.viewManager.selectedView;
30
- if (vp)
31
- vp.addScreenSpaceEffect(name);
32
- return true;
33
- }
34
- }
35
- AddEffectTool._registeredEffects = new Set();
36
- /** Removes all screen-space effects from the selected viewport.
37
- * @beta
38
- */
39
- export class ClearEffectsTool extends Tool {
40
- static get minArgs() { return 0; }
41
- static get maxArgs() { return 0; }
42
- async run() {
43
- var _a;
44
- (_a = IModelApp.viewManager.selectedView) === null || _a === void 0 ? void 0 : _a.removeScreenSpaceEffects();
45
- return true;
46
- }
47
- }
48
- ClearEffectsTool.toolId = "ClearEffects";
49
- /** Requests that any viewport to which the specified effect has been applied redraw its contents.
50
- * Used by tools like [[VignetteConfig]] to update the view after the effect parameters are modified.
51
- * @beta
52
- */
53
- export function refreshViewportsForEffect(effectName) {
54
- for (const vp of IModelApp.viewManager) {
55
- for (const vpEffectName of vp.screenSpaceEffects) {
56
- if (vpEffectName === effectName) {
57
- vp.requestRedraw();
58
- break;
59
- }
60
- }
61
- }
62
- }
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ /** @packageDocumentation
6
+ * @module Effects
7
+ */
8
+ import { assert } from "@itwin/core-bentley";
9
+ import { IModelApp, Tool, } from "@itwin/core-frontend";
10
+ /** Adds a screen-space effect to the selected viewport.
11
+ * @beta
12
+ */
13
+ export class AddEffectTool extends Tool {
14
+ async run() {
15
+ // Avoid conflicts with the names of other registered screen-space effects.
16
+ const name = `fdt ${this.effectName}`;
17
+ if (!AddEffectTool._registeredEffects.has(name)) {
18
+ // Register the effect.
19
+ const builder = IModelApp.renderSystem.createScreenSpaceEffectBuilder({
20
+ name,
21
+ textureCoordFromPosition: this.textureCoordFromPosition,
22
+ source: this.source,
23
+ });
24
+ assert(undefined !== builder);
25
+ this.defineEffect(builder);
26
+ builder.finish();
27
+ AddEffectTool._registeredEffects.add(name);
28
+ }
29
+ const vp = IModelApp.viewManager.selectedView;
30
+ if (vp)
31
+ vp.addScreenSpaceEffect(name);
32
+ return true;
33
+ }
34
+ }
35
+ AddEffectTool._registeredEffects = new Set();
36
+ /** Removes all screen-space effects from the selected viewport.
37
+ * @beta
38
+ */
39
+ export class ClearEffectsTool extends Tool {
40
+ static get minArgs() { return 0; }
41
+ static get maxArgs() { return 0; }
42
+ async run() {
43
+ var _a;
44
+ (_a = IModelApp.viewManager.selectedView) === null || _a === void 0 ? void 0 : _a.removeScreenSpaceEffects();
45
+ return true;
46
+ }
47
+ }
48
+ ClearEffectsTool.toolId = "ClearEffects";
49
+ /** Requests that any viewport to which the specified effect has been applied redraw its contents.
50
+ * Used by tools like [[VignetteConfig]] to update the view after the effect parameters are modified.
51
+ * @beta
52
+ */
53
+ export function refreshViewportsForEffect(effectName) {
54
+ for (const vp of IModelApp.viewManager) {
55
+ for (const vpEffectName of vp.screenSpaceEffects) {
56
+ if (vpEffectName === effectName) {
57
+ vp.requestRedraw();
58
+ break;
59
+ }
60
+ }
61
+ }
62
+ }
63
63
  //# sourceMappingURL=EffectTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EffectTools.js","sourceRoot":"","sources":["../../../src/effects/EffectTools.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,SAAS,EAAqD,IAAI,GACnE,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,OAAgB,aAAc,SAAQ,IAAI;IAY9B,KAAK,CAAC,GAAG;QACvB,2EAA2E;QAC3E,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/C,uBAAuB;YACvB,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,8BAA8B,CAAC;gBACpE,IAAI;gBACJ,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;gBACvD,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;YAEjB,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SAC5C;QAED,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC;QAC9C,IAAI,EAAE;YACJ,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAEhC,OAAO,IAAI,CAAC;IACd,CAAC;;AAlCuB,gCAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAqCjE;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,IAAI;IAEjC,MAAM,KAAc,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAc,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAElC,KAAK,CAAC,GAAG;;QACvB,MAAA,SAAS,CAAC,WAAW,CAAC,YAAY,0CAAE,wBAAwB,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;;AAPsB,uBAAM,GAAG,cAAc,CAAC;AAUjD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE;QACtC,KAAK,MAAM,YAAY,IAAI,EAAE,CAAC,kBAAkB,EAAE;YAChD,IAAI,YAAY,KAAK,UAAU,EAAE;gBAC/B,EAAE,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM;aACP;SACF;KACF;AACH,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Effects\r\n */\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport {\r\n IModelApp, ScreenSpaceEffectBuilder, ScreenSpaceEffectSource, Tool,\r\n} from \"@itwin/core-frontend\";\r\n\r\n/** Adds a screen-space effect to the selected viewport.\r\n * @beta\r\n */\r\nexport abstract class AddEffectTool extends Tool {\r\n private static readonly _registeredEffects = new Set<string>();\r\n\r\n /** Name of effect as used in keyins like `fdt effect add`. Ideally one word. */\r\n protected abstract get effectName(): string;\r\n /** vertex, fragment, and optional sampleSourcePixel GLSL snippets. */\r\n protected abstract get source(): ScreenSpaceEffectSource;\r\n /** Whether the fragment shader should include built-in `textureCoordFromPosition` function. */\r\n protected abstract get textureCoordFromPosition(): boolean;\r\n /** Add uniforms, varyings, etc. */\r\n protected abstract defineEffect(builder: ScreenSpaceEffectBuilder): void;\r\n\r\n public override async run(): Promise<boolean> {\r\n // Avoid conflicts with the names of other registered screen-space effects.\r\n const name = `fdt ${this.effectName}`;\r\n if (!AddEffectTool._registeredEffects.has(name)) {\r\n // Register the effect.\r\n const builder = IModelApp.renderSystem.createScreenSpaceEffectBuilder({\r\n name,\r\n textureCoordFromPosition: this.textureCoordFromPosition,\r\n source: this.source,\r\n });\r\n\r\n assert(undefined !== builder);\r\n this.defineEffect(builder);\r\n builder.finish();\r\n\r\n AddEffectTool._registeredEffects.add(name);\r\n }\r\n\r\n const vp = IModelApp.viewManager.selectedView;\r\n if (vp)\r\n vp.addScreenSpaceEffect(name);\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/** Removes all screen-space effects from the selected viewport.\r\n * @beta\r\n */\r\nexport class ClearEffectsTool extends Tool {\r\n public static override toolId = \"ClearEffects\";\r\n public static override get minArgs() { return 0; }\r\n public static override get maxArgs() { return 0; }\r\n\r\n public override async run(): Promise<boolean> {\r\n IModelApp.viewManager.selectedView?.removeScreenSpaceEffects();\r\n return true;\r\n }\r\n}\r\n\r\n/** Requests that any viewport to which the specified effect has been applied redraw its contents.\r\n * Used by tools like [[VignetteConfig]] to update the view after the effect parameters are modified.\r\n * @beta\r\n */\r\nexport function refreshViewportsForEffect(effectName: string): void {\r\n for (const vp of IModelApp.viewManager) {\r\n for (const vpEffectName of vp.screenSpaceEffects) {\r\n if (vpEffectName === effectName) {\r\n vp.requestRedraw();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"EffectTools.js","sourceRoot":"","sources":["../../../src/effects/EffectTools.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,SAAS,EAAqD,IAAI,GACnE,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,OAAgB,aAAc,SAAQ,IAAI;IAY9B,KAAK,CAAC,GAAG;QACvB,2EAA2E;QAC3E,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/C,uBAAuB;YACvB,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,CAAC,8BAA8B,CAAC;gBACpE,IAAI;gBACJ,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;gBACvD,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;YAEjB,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SAC5C;QAED,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC;QAC9C,IAAI,EAAE;YACJ,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAEhC,OAAO,IAAI,CAAC;IACd,CAAC;;AAlCuB,gCAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;AAqCjE;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,IAAI;IAEjC,MAAM,KAAc,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3C,MAAM,KAAc,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAElC,KAAK,CAAC,GAAG;;QACvB,MAAA,SAAS,CAAC,WAAW,CAAC,YAAY,0CAAE,wBAAwB,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;;AAPsB,uBAAM,GAAG,cAAc,CAAC;AAUjD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,WAAW,EAAE;QACtC,KAAK,MAAM,YAAY,IAAI,EAAE,CAAC,kBAAkB,EAAE;YAChD,IAAI,YAAY,KAAK,UAAU,EAAE;gBAC/B,EAAE,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM;aACP;SACF;KACF;AACH,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Effects\n */\n\nimport { assert } from \"@itwin/core-bentley\";\nimport {\n IModelApp, ScreenSpaceEffectBuilder, ScreenSpaceEffectSource, Tool,\n} from \"@itwin/core-frontend\";\n\n/** Adds a screen-space effect to the selected viewport.\n * @beta\n */\nexport abstract class AddEffectTool extends Tool {\n private static readonly _registeredEffects = new Set<string>();\n\n /** Name of effect as used in keyins like `fdt effect add`. Ideally one word. */\n protected abstract get effectName(): string;\n /** vertex, fragment, and optional sampleSourcePixel GLSL snippets. */\n protected abstract get source(): ScreenSpaceEffectSource;\n /** Whether the fragment shader should include built-in `textureCoordFromPosition` function. */\n protected abstract get textureCoordFromPosition(): boolean;\n /** Add uniforms, varyings, etc. */\n protected abstract defineEffect(builder: ScreenSpaceEffectBuilder): void;\n\n public override async run(): Promise<boolean> {\n // Avoid conflicts with the names of other registered screen-space effects.\n const name = `fdt ${this.effectName}`;\n if (!AddEffectTool._registeredEffects.has(name)) {\n // Register the effect.\n const builder = IModelApp.renderSystem.createScreenSpaceEffectBuilder({\n name,\n textureCoordFromPosition: this.textureCoordFromPosition,\n source: this.source,\n });\n\n assert(undefined !== builder);\n this.defineEffect(builder);\n builder.finish();\n\n AddEffectTool._registeredEffects.add(name);\n }\n\n const vp = IModelApp.viewManager.selectedView;\n if (vp)\n vp.addScreenSpaceEffect(name);\n\n return true;\n }\n}\n\n/** Removes all screen-space effects from the selected viewport.\n * @beta\n */\nexport class ClearEffectsTool extends Tool {\n public static override toolId = \"ClearEffects\";\n public static override get minArgs() { return 0; }\n public static override get maxArgs() { return 0; }\n\n public override async run(): Promise<boolean> {\n IModelApp.viewManager.selectedView?.removeScreenSpaceEffects();\n return true;\n }\n}\n\n/** Requests that any viewport to which the specified effect has been applied redraw its contents.\n * Used by tools like [[VignetteConfig]] to update the view after the effect parameters are modified.\n * @beta\n */\nexport function refreshViewportsForEffect(effectName: string): void {\n for (const vp of IModelApp.viewManager) {\n for (const vpEffectName of vp.screenSpaceEffects) {\n if (vpEffectName === effectName) {\n vp.requestRedraw();\n break;\n }\n }\n }\n}\n"]}
@@ -1,13 +1,13 @@
1
- /** @packageDocumentation
2
- * @module Effects
3
- */
4
- import { Tool } from "@itwin/core-frontend";
5
- /** This tool applies an explosion particle effect used for testing [ParticleCollectionBuilder]($frontend).
6
- * @beta
7
- */
8
- export declare class ExplosionEffect extends Tool {
9
- static toolId: string;
10
- /** This method runs the tool, applying an explosion particle effect. */
11
- run(): Promise<boolean>;
12
- }
1
+ /** @packageDocumentation
2
+ * @module Effects
3
+ */
4
+ import { Tool } from "@itwin/core-frontend";
5
+ /** This tool applies an explosion particle effect used for testing [ParticleCollectionBuilder]($frontend).
6
+ * @beta
7
+ */
8
+ export declare class ExplosionEffect extends Tool {
9
+ static toolId: string;
10
+ /** This method runs the tool, applying an explosion particle effect. */
11
+ run(): Promise<boolean>;
12
+ }
13
13
  //# sourceMappingURL=Explosion.d.ts.map
@@ -1,165 +1,165 @@
1
- /*---------------------------------------------------------------------------------------------
2
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
- * See LICENSE.md in the project root for license terms and full copyright notice.
4
- *--------------------------------------------------------------------------------------------*/
5
- /** @packageDocumentation
6
- * @module Effects
7
- */
8
- import { Point3d, Range1d, Vector3d } from "@itwin/core-geometry";
9
- import { TextureTransparency } from "@itwin/core-common";
10
- import { GraphicType, imageElementFromUrl, IModelApp, ParticleCollectionBuilder, Tool, } from "@itwin/core-frontend";
11
- import { randomFloat, randomFloatInRange, randomIntegerInRange, randomPositionInRange } from "./Random";
12
- /** Represents one particle in the system. */
13
- class Particle {
14
- constructor(position, velocity, lifetime, size) {
15
- /** Current age in seconds, incremented each frame. */
16
- this.age = 0;
17
- /** Particle transparency in [0..255]. */
18
- this.transparency = 0;
19
- this.position = position;
20
- this.velocity = velocity;
21
- this.lifetime = lifetime;
22
- this.size = size;
23
- }
24
- get x() { return this.position.x; }
25
- get y() { return this.position.y; }
26
- get z() { return this.position.z; }
27
- get isExpired() { return this.age >= this.lifetime; }
28
- }
29
- /** Emits particles in a sphere with its center at the origin.
30
- * Each particle is emitted from the center of the sphere with random velocity toward the surface of the sphere.
31
- */
32
- class ParticleEmitter {
33
- constructor() {
34
- /** Range from which each particle's initial speed in meters per second will be selected. */
35
- this.speedRange = Range1d.createXX(1, 2);
36
- /** Range from which each particle's lifetime in seconds will be selected. */
37
- this.lifetimeRange = Range1d.createXX(5, 10);
38
- /** Range from which each particle's size in meters will be selected. */
39
- this.sizeRange = Range1d.createXX(0.2, 1.0);
40
- /** Range from which the number of particles emitted will be selected. */
41
- this.numParticlesRange = Range1d.createXX(1600, 2200);
42
- }
43
- /** Emit an explosion of particles from the center of the sphere. */
44
- emit() {
45
- const particles = [];
46
- const numParticles = randomIntegerInRange(this.numParticlesRange);
47
- for (let i = 0; i < numParticles; i++) {
48
- const velocity = new Vector3d(randomFloat(-1.0, 1.0), randomFloat(-1.0, 1.0), randomFloat(-1.0, 1.0));
49
- velocity.normalizeInPlace();
50
- velocity.scaleInPlace(randomFloatInRange(this.speedRange));
51
- const lifetime = randomFloatInRange(this.lifetimeRange);
52
- const size = randomFloatInRange(this.sizeRange);
53
- particles.push(new Particle(new Point3d(0, 0, 0), velocity, lifetime, size));
54
- }
55
- return particles;
56
- }
57
- }
58
- class ParticleSystem {
59
- constructor(texture, iModel, numEmissions) {
60
- this._emitter = new ParticleEmitter();
61
- this._particles = [];
62
- this._scratchVector3d = new Vector3d();
63
- /** Acceleration in Z applied to particles, in meters per second squared. */
64
- this.gravity = -3;
65
- this._texture = texture;
66
- this._pickableId = iModel.transientIds.next;
67
- this._numEmissions = numEmissions;
68
- this._lastUpdateTime = Date.now();
69
- this._origin = randomPositionInRange(iModel.projectExtents);
70
- this._dispose = iModel.onClose.addListener(() => this.dispose());
71
- }
72
- dispose() {
73
- if (this._dispose) {
74
- this._dispose();
75
- this._dispose = undefined;
76
- }
77
- IModelApp.viewManager.dropDecorator(this);
78
- this._texture.dispose();
79
- }
80
- update() {
81
- const now = Date.now();
82
- let deltaMillis = now - this._lastUpdateTime;
83
- deltaMillis = Math.min(100, deltaMillis);
84
- this._lastUpdateTime = now;
85
- let numParticles = this._particles.length;
86
- if (numParticles === 0) {
87
- this._numEmissions--;
88
- if (this._numEmissions < 0)
89
- this.dispose();
90
- else
91
- this._particles = this._emitter.emit();
92
- return;
93
- }
94
- const elapsedSeconds = deltaMillis / 1000;
95
- for (let i = 0; i < numParticles; i++) {
96
- const particle = this._particles[i];
97
- this.updateParticle(particle, elapsedSeconds);
98
- if (particle.isExpired) {
99
- this._particles[i] = this._particles[numParticles - 1];
100
- --i;
101
- --numParticles;
102
- }
103
- }
104
- this._particles.length = numParticles;
105
- }
106
- updateParticle(particle, elapsedSeconds) {
107
- const velocity = particle.velocity.clone(this._scratchVector3d);
108
- velocity.scale(elapsedSeconds, velocity);
109
- velocity.z += elapsedSeconds * this.gravity;
110
- particle.position.addInPlace(velocity);
111
- particle.transparency = 255 * (particle.age / particle.lifetime);
112
- particle.age += elapsedSeconds;
113
- }
114
- decorate(context) {
115
- if (!context.viewport.view.isSpatialView())
116
- return;
117
- this.update();
118
- const builder = ParticleCollectionBuilder.create({
119
- viewport: context.viewport,
120
- texture: this._texture,
121
- size: (this._emitter.sizeRange.high - this._emitter.sizeRange.low) / 2,
122
- transparency: 0,
123
- origin: this._origin,
124
- pickableId: this._pickableId,
125
- });
126
- for (const particle of this._particles)
127
- builder.addParticle(particle);
128
- const graphic = builder.finish();
129
- if (graphic) {
130
- context.addDecoration(GraphicType.WorldDecoration, graphic);
131
- context.viewport.onRender.addOnce((vp) => vp.invalidateDecorations());
132
- }
133
- }
134
- testDecorationHit(id) {
135
- return id === this._pickableId;
136
- }
137
- async getDecorationToolTip(_hit) {
138
- return "Explosion effect";
139
- }
140
- static async addDecorator(iModel) {
141
- // Note: The decorator takes ownership of the texture, and disposes of it when the decorator is disposed.
142
- const image = await imageElementFromUrl(`${IModelApp.publicPath}sprites/particle_explosion.png`);
143
- const texture = IModelApp.renderSystem.createTexture({
144
- ownership: "external",
145
- image: { source: image, transparency: TextureTransparency.Mixed },
146
- });
147
- if (texture)
148
- IModelApp.viewManager.addDecorator(new ParticleSystem(texture, iModel, randomIntegerInRange(this.numEmissionsRange)));
149
- }
150
- }
151
- ParticleSystem.numEmissionsRange = Range1d.createXX(1, 5);
152
- /** This tool applies an explosion particle effect used for testing [ParticleCollectionBuilder]($frontend).
153
- * @beta
154
- */
155
- export class ExplosionEffect extends Tool {
156
- /** This method runs the tool, applying an explosion particle effect. */
157
- async run() {
158
- const vp = IModelApp.viewManager.selectedView;
159
- if (vp)
160
- await ParticleSystem.addDecorator(vp.iModel);
161
- return true;
162
- }
163
- }
164
- ExplosionEffect.toolId = "ExplosionEffect";
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ /** @packageDocumentation
6
+ * @module Effects
7
+ */
8
+ import { Point3d, Range1d, Vector3d } from "@itwin/core-geometry";
9
+ import { TextureTransparency } from "@itwin/core-common";
10
+ import { GraphicType, imageElementFromUrl, IModelApp, ParticleCollectionBuilder, Tool, } from "@itwin/core-frontend";
11
+ import { randomFloat, randomFloatInRange, randomIntegerInRange, randomPositionInRange } from "./Random";
12
+ /** Represents one particle in the system. */
13
+ class Particle {
14
+ constructor(position, velocity, lifetime, size) {
15
+ /** Current age in seconds, incremented each frame. */
16
+ this.age = 0;
17
+ /** Particle transparency in [0..255]. */
18
+ this.transparency = 0;
19
+ this.position = position;
20
+ this.velocity = velocity;
21
+ this.lifetime = lifetime;
22
+ this.size = size;
23
+ }
24
+ get x() { return this.position.x; }
25
+ get y() { return this.position.y; }
26
+ get z() { return this.position.z; }
27
+ get isExpired() { return this.age >= this.lifetime; }
28
+ }
29
+ /** Emits particles in a sphere with its center at the origin.
30
+ * Each particle is emitted from the center of the sphere with random velocity toward the surface of the sphere.
31
+ */
32
+ class ParticleEmitter {
33
+ constructor() {
34
+ /** Range from which each particle's initial speed in meters per second will be selected. */
35
+ this.speedRange = Range1d.createXX(1, 2);
36
+ /** Range from which each particle's lifetime in seconds will be selected. */
37
+ this.lifetimeRange = Range1d.createXX(5, 10);
38
+ /** Range from which each particle's size in meters will be selected. */
39
+ this.sizeRange = Range1d.createXX(0.2, 1.0);
40
+ /** Range from which the number of particles emitted will be selected. */
41
+ this.numParticlesRange = Range1d.createXX(1600, 2200);
42
+ }
43
+ /** Emit an explosion of particles from the center of the sphere. */
44
+ emit() {
45
+ const particles = [];
46
+ const numParticles = randomIntegerInRange(this.numParticlesRange);
47
+ for (let i = 0; i < numParticles; i++) {
48
+ const velocity = new Vector3d(randomFloat(-1.0, 1.0), randomFloat(-1.0, 1.0), randomFloat(-1.0, 1.0));
49
+ velocity.normalizeInPlace();
50
+ velocity.scaleInPlace(randomFloatInRange(this.speedRange));
51
+ const lifetime = randomFloatInRange(this.lifetimeRange);
52
+ const size = randomFloatInRange(this.sizeRange);
53
+ particles.push(new Particle(new Point3d(0, 0, 0), velocity, lifetime, size));
54
+ }
55
+ return particles;
56
+ }
57
+ }
58
+ class ParticleSystem {
59
+ constructor(texture, iModel, numEmissions) {
60
+ this._emitter = new ParticleEmitter();
61
+ this._particles = [];
62
+ this._scratchVector3d = new Vector3d();
63
+ /** Acceleration in Z applied to particles, in meters per second squared. */
64
+ this.gravity = -3;
65
+ this._texture = texture;
66
+ this._pickableId = iModel.transientIds.next;
67
+ this._numEmissions = numEmissions;
68
+ this._lastUpdateTime = Date.now();
69
+ this._origin = randomPositionInRange(iModel.projectExtents);
70
+ this._dispose = iModel.onClose.addListener(() => this.dispose());
71
+ }
72
+ dispose() {
73
+ if (this._dispose) {
74
+ this._dispose();
75
+ this._dispose = undefined;
76
+ }
77
+ IModelApp.viewManager.dropDecorator(this);
78
+ this._texture.dispose();
79
+ }
80
+ update() {
81
+ const now = Date.now();
82
+ let deltaMillis = now - this._lastUpdateTime;
83
+ deltaMillis = Math.min(100, deltaMillis);
84
+ this._lastUpdateTime = now;
85
+ let numParticles = this._particles.length;
86
+ if (numParticles === 0) {
87
+ this._numEmissions--;
88
+ if (this._numEmissions < 0)
89
+ this.dispose();
90
+ else
91
+ this._particles = this._emitter.emit();
92
+ return;
93
+ }
94
+ const elapsedSeconds = deltaMillis / 1000;
95
+ for (let i = 0; i < numParticles; i++) {
96
+ const particle = this._particles[i];
97
+ this.updateParticle(particle, elapsedSeconds);
98
+ if (particle.isExpired) {
99
+ this._particles[i] = this._particles[numParticles - 1];
100
+ --i;
101
+ --numParticles;
102
+ }
103
+ }
104
+ this._particles.length = numParticles;
105
+ }
106
+ updateParticle(particle, elapsedSeconds) {
107
+ const velocity = particle.velocity.clone(this._scratchVector3d);
108
+ velocity.scale(elapsedSeconds, velocity);
109
+ velocity.z += elapsedSeconds * this.gravity;
110
+ particle.position.addInPlace(velocity);
111
+ particle.transparency = 255 * (particle.age / particle.lifetime);
112
+ particle.age += elapsedSeconds;
113
+ }
114
+ decorate(context) {
115
+ if (!context.viewport.view.isSpatialView())
116
+ return;
117
+ this.update();
118
+ const builder = ParticleCollectionBuilder.create({
119
+ viewport: context.viewport,
120
+ texture: this._texture,
121
+ size: (this._emitter.sizeRange.high - this._emitter.sizeRange.low) / 2,
122
+ transparency: 0,
123
+ origin: this._origin,
124
+ pickableId: this._pickableId,
125
+ });
126
+ for (const particle of this._particles)
127
+ builder.addParticle(particle);
128
+ const graphic = builder.finish();
129
+ if (graphic) {
130
+ context.addDecoration(GraphicType.WorldDecoration, graphic);
131
+ context.viewport.onRender.addOnce((vp) => vp.invalidateDecorations());
132
+ }
133
+ }
134
+ testDecorationHit(id) {
135
+ return id === this._pickableId;
136
+ }
137
+ async getDecorationToolTip(_hit) {
138
+ return "Explosion effect";
139
+ }
140
+ static async addDecorator(iModel) {
141
+ // Note: The decorator takes ownership of the texture, and disposes of it when the decorator is disposed.
142
+ const image = await imageElementFromUrl(`${IModelApp.publicPath}sprites/particle_explosion.png`);
143
+ const texture = IModelApp.renderSystem.createTexture({
144
+ ownership: "external",
145
+ image: { source: image, transparency: TextureTransparency.Mixed },
146
+ });
147
+ if (texture)
148
+ IModelApp.viewManager.addDecorator(new ParticleSystem(texture, iModel, randomIntegerInRange(this.numEmissionsRange)));
149
+ }
150
+ }
151
+ ParticleSystem.numEmissionsRange = Range1d.createXX(1, 5);
152
+ /** This tool applies an explosion particle effect used for testing [ParticleCollectionBuilder]($frontend).
153
+ * @beta
154
+ */
155
+ export class ExplosionEffect extends Tool {
156
+ /** This method runs the tool, applying an explosion particle effect. */
157
+ async run() {
158
+ const vp = IModelApp.viewManager.selectedView;
159
+ if (vp)
160
+ await ParticleSystem.addDecorator(vp.iModel);
161
+ return true;
162
+ }
163
+ }
164
+ ExplosionEffect.toolId = "ExplosionEffect";
165
165
  //# sourceMappingURL=Explosion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Explosion.js","sourceRoot":"","sources":["../../../src/effects/Explosion.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module Effects\r\n */\r\n\r\nimport { Id64String } from \"@itwin/core-bentley\";\r\nimport { Point3d, Range1d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { RenderTexture, TextureTransparency } from \"@itwin/core-common\";\r\nimport {\r\n DecorateContext, GraphicType, HitDetail, imageElementFromUrl, IModelApp, IModelConnection, ParticleCollectionBuilder, ParticleProps, Tool,\r\n} from \"@itwin/core-frontend\";\r\nimport { randomFloat, randomFloatInRange, randomIntegerInRange, randomPositionInRange } from \"./Random\";\r\n\r\n/** Represents one particle in the system. */\r\nclass Particle implements ParticleProps {\r\n /** Current position in the particle system's local coordinate space. */\r\n public readonly position: Point3d;\r\n /** Current velocity in meters per second. */\r\n public readonly velocity: Vector3d;\r\n /** Current age in seconds, incremented each frame. */\r\n public age = 0;\r\n /** Maximum age in seconds. When `this.age` exceeds `this.lifetime`, the particle expires. */\r\n public readonly lifetime: number;\r\n /** Particle size in meters. */\r\n public size: number;\r\n /** Particle transparency in [0..255]. */\r\n public transparency = 0;\r\n\r\n public get x() { return this.position.x; }\r\n public get y() { return this.position.y; }\r\n public get z() { return this.position.z; }\r\n\r\n public constructor(position: Point3d, velocity: Vector3d, lifetime: number, size: number) {\r\n this.position = position;\r\n this.velocity = velocity;\r\n this.lifetime = lifetime;\r\n this.size = size;\r\n }\r\n\r\n public get isExpired() { return this.age >= this.lifetime; }\r\n}\r\n\r\n/** Emits particles in a sphere with its center at the origin.\r\n * Each particle is emitted from the center of the sphere with random velocity toward the surface of the sphere.\r\n */\r\nclass ParticleEmitter {\r\n /** Range from which each particle's initial speed in meters per second will be selected. */\r\n public readonly speedRange = Range1d.createXX(1, 2);\r\n /** Range from which each particle's lifetime in seconds will be selected. */\r\n public readonly lifetimeRange = Range1d.createXX(5, 10);\r\n /** Range from which each particle's size in meters will be selected. */\r\n public readonly sizeRange = Range1d.createXX(0.2, 1.0);\r\n /** Range from which the number of particles emitted will be selected. */\r\n public numParticlesRange = Range1d.createXX(1600, 2200);\r\n\r\n /** Emit an explosion of particles from the center of the sphere. */\r\n public emit(): Particle[] {\r\n const particles = [];\r\n const numParticles = randomIntegerInRange(this.numParticlesRange);\r\n for (let i = 0; i < numParticles; i++) {\r\n const velocity = new Vector3d(randomFloat(-1.0, 1.0), randomFloat(-1.0, 1.0), randomFloat(-1.0, 1.0));\r\n velocity.normalizeInPlace();\r\n velocity.scaleInPlace(randomFloatInRange(this.speedRange));\r\n\r\n const lifetime = randomFloatInRange(this.lifetimeRange);\r\n const size = randomFloatInRange(this.sizeRange);\r\n particles.push(new Particle(new Point3d(0, 0, 0), velocity, lifetime, size));\r\n }\r\n\r\n return particles;\r\n }\r\n}\r\n\r\nclass ParticleSystem {\r\n private readonly _origin: Point3d;\r\n private readonly _pickableId: Id64String;\r\n private readonly _emitter = new ParticleEmitter();\r\n private _numEmissions: number;\r\n private readonly _texture: RenderTexture;\r\n private _lastUpdateTime: number;\r\n private _particles: Particle[] = [];\r\n private readonly _scratchVector3d = new Vector3d();\r\n private _dispose?: VoidFunction;\r\n /** Acceleration in Z applied to particles, in meters per second squared. */\r\n public gravity = -3;\r\n\r\n public static numEmissionsRange = Range1d.createXX(1, 5);\r\n\r\n public constructor(texture: RenderTexture, iModel: IModelConnection, numEmissions: number) {\r\n this._texture = texture;\r\n this._pickableId = iModel.transientIds.next;\r\n this._numEmissions = numEmissions;\r\n this._lastUpdateTime = Date.now();\r\n\r\n this._origin = randomPositionInRange(iModel.projectExtents);\r\n\r\n this._dispose = iModel.onClose.addListener(() => this.dispose());\r\n }\r\n\r\n public dispose(): void {\r\n if (this._dispose) {\r\n this._dispose();\r\n this._dispose = undefined;\r\n }\r\n\r\n IModelApp.viewManager.dropDecorator(this);\r\n this._texture.dispose();\r\n }\r\n\r\n public update(): void {\r\n const now = Date.now();\r\n let deltaMillis = now - this._lastUpdateTime;\r\n deltaMillis = Math.min(100, deltaMillis);\r\n this._lastUpdateTime = now;\r\n\r\n let numParticles = this._particles.length;\r\n if (numParticles === 0) {\r\n this._numEmissions--;\r\n if (this._numEmissions < 0)\r\n this.dispose();\r\n else\r\n this._particles = this._emitter.emit();\r\n\r\n return;\r\n }\r\n\r\n const elapsedSeconds = deltaMillis / 1000;\r\n for (let i = 0; i < numParticles; i++) {\r\n const particle = this._particles[i];\r\n this.updateParticle(particle, elapsedSeconds);\r\n if (particle.isExpired) {\r\n this._particles[i] = this._particles[numParticles - 1];\r\n --i;\r\n --numParticles;\r\n }\r\n }\r\n\r\n this._particles.length = numParticles;\r\n }\r\n\r\n private updateParticle(particle: Particle, elapsedSeconds: number): void {\r\n const velocity = particle.velocity.clone(this._scratchVector3d);\r\n velocity.scale(elapsedSeconds, velocity);\r\n velocity.z += elapsedSeconds * this.gravity;\r\n particle.position.addInPlace(velocity);\r\n particle.transparency = 255 * (particle.age / particle.lifetime);\r\n\r\n particle.age += elapsedSeconds;\r\n }\r\n\r\n public decorate(context: DecorateContext): void {\r\n if (!context.viewport.view.isSpatialView())\r\n return;\r\n\r\n this.update();\r\n\r\n const builder = ParticleCollectionBuilder.create({\r\n viewport: context.viewport,\r\n texture: this._texture,\r\n size: (this._emitter.sizeRange.high - this._emitter.sizeRange.low) / 2,\r\n transparency: 0,\r\n origin: this._origin,\r\n pickableId: this._pickableId,\r\n });\r\n\r\n for (const particle of this._particles)\r\n builder.addParticle(particle);\r\n\r\n const graphic = builder.finish();\r\n if (graphic) {\r\n context.addDecoration(GraphicType.WorldDecoration, graphic);\r\n context.viewport.onRender.addOnce((vp) => vp.invalidateDecorations());\r\n }\r\n }\r\n\r\n public testDecorationHit(id: Id64String): boolean {\r\n return id === this._pickableId;\r\n }\r\n\r\n public async getDecorationToolTip(_hit: HitDetail): Promise<HTMLElement | string> {\r\n return \"Explosion effect\";\r\n }\r\n\r\n public static async addDecorator(iModel: IModelConnection): Promise<void> {\r\n // Note: The decorator takes ownership of the texture, and disposes of it when the decorator is disposed.\r\n const image = await imageElementFromUrl(`${IModelApp.publicPath}sprites/particle_explosion.png`);\r\n const texture = IModelApp.renderSystem.createTexture({\r\n ownership: \"external\",\r\n image: { source: image, transparency: TextureTransparency.Mixed },\r\n });\r\n if (texture)\r\n IModelApp.viewManager.addDecorator(new ParticleSystem(texture, iModel, randomIntegerInRange(this.numEmissionsRange)));\r\n }\r\n}\r\n\r\n/** This tool applies an explosion particle effect used for testing [ParticleCollectionBuilder]($frontend).\r\n * @beta\r\n */\r\nexport class ExplosionEffect extends Tool {\r\n public static override toolId = \"ExplosionEffect\";\r\n\r\n /** This method runs the tool, applying an explosion particle effect. */\r\n public override async run(): Promise<boolean> {\r\n const vp = IModelApp.viewManager.selectedView;\r\n if (vp)\r\n await ParticleSystem.addDecorator(vp.iModel);\r\n\r\n return true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Explosion.js","sourceRoot":"","sources":["../../../src/effects/Explosion.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Effects\n */\n\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { Point3d, Range1d, Vector3d } from \"@itwin/core-geometry\";\nimport { RenderTexture, TextureTransparency } from \"@itwin/core-common\";\nimport {\n DecorateContext, GraphicType, HitDetail, imageElementFromUrl, IModelApp, IModelConnection, ParticleCollectionBuilder, ParticleProps, Tool,\n} from \"@itwin/core-frontend\";\nimport { randomFloat, randomFloatInRange, randomIntegerInRange, randomPositionInRange } from \"./Random\";\n\n/** Represents one particle in the system. */\nclass Particle implements ParticleProps {\n /** Current position in the particle system's local coordinate space. */\n public readonly position: Point3d;\n /** Current velocity in meters per second. */\n public readonly velocity: Vector3d;\n /** Current age in seconds, incremented each frame. */\n public age = 0;\n /** Maximum age in seconds. When `this.age` exceeds `this.lifetime`, the particle expires. */\n public readonly lifetime: number;\n /** Particle size in meters. */\n public size: number;\n /** Particle transparency in [0..255]. */\n public transparency = 0;\n\n public get x() { return this.position.x; }\n public get y() { return this.position.y; }\n public get z() { return this.position.z; }\n\n public constructor(position: Point3d, velocity: Vector3d, lifetime: number, size: number) {\n this.position = position;\n this.velocity = velocity;\n this.lifetime = lifetime;\n this.size = size;\n }\n\n public get isExpired() { return this.age >= this.lifetime; }\n}\n\n/** Emits particles in a sphere with its center at the origin.\n * Each particle is emitted from the center of the sphere with random velocity toward the surface of the sphere.\n */\nclass ParticleEmitter {\n /** Range from which each particle's initial speed in meters per second will be selected. */\n public readonly speedRange = Range1d.createXX(1, 2);\n /** Range from which each particle's lifetime in seconds will be selected. */\n public readonly lifetimeRange = Range1d.createXX(5, 10);\n /** Range from which each particle's size in meters will be selected. */\n public readonly sizeRange = Range1d.createXX(0.2, 1.0);\n /** Range from which the number of particles emitted will be selected. */\n public numParticlesRange = Range1d.createXX(1600, 2200);\n\n /** Emit an explosion of particles from the center of the sphere. */\n public emit(): Particle[] {\n const particles = [];\n const numParticles = randomIntegerInRange(this.numParticlesRange);\n for (let i = 0; i < numParticles; i++) {\n const velocity = new Vector3d(randomFloat(-1.0, 1.0), randomFloat(-1.0, 1.0), randomFloat(-1.0, 1.0));\n velocity.normalizeInPlace();\n velocity.scaleInPlace(randomFloatInRange(this.speedRange));\n\n const lifetime = randomFloatInRange(this.lifetimeRange);\n const size = randomFloatInRange(this.sizeRange);\n particles.push(new Particle(new Point3d(0, 0, 0), velocity, lifetime, size));\n }\n\n return particles;\n }\n}\n\nclass ParticleSystem {\n private readonly _origin: Point3d;\n private readonly _pickableId: Id64String;\n private readonly _emitter = new ParticleEmitter();\n private _numEmissions: number;\n private readonly _texture: RenderTexture;\n private _lastUpdateTime: number;\n private _particles: Particle[] = [];\n private readonly _scratchVector3d = new Vector3d();\n private _dispose?: VoidFunction;\n /** Acceleration in Z applied to particles, in meters per second squared. */\n public gravity = -3;\n\n public static numEmissionsRange = Range1d.createXX(1, 5);\n\n public constructor(texture: RenderTexture, iModel: IModelConnection, numEmissions: number) {\n this._texture = texture;\n this._pickableId = iModel.transientIds.next;\n this._numEmissions = numEmissions;\n this._lastUpdateTime = Date.now();\n\n this._origin = randomPositionInRange(iModel.projectExtents);\n\n this._dispose = iModel.onClose.addListener(() => this.dispose());\n }\n\n public dispose(): void {\n if (this._dispose) {\n this._dispose();\n this._dispose = undefined;\n }\n\n IModelApp.viewManager.dropDecorator(this);\n this._texture.dispose();\n }\n\n public update(): void {\n const now = Date.now();\n let deltaMillis = now - this._lastUpdateTime;\n deltaMillis = Math.min(100, deltaMillis);\n this._lastUpdateTime = now;\n\n let numParticles = this._particles.length;\n if (numParticles === 0) {\n this._numEmissions--;\n if (this._numEmissions < 0)\n this.dispose();\n else\n this._particles = this._emitter.emit();\n\n return;\n }\n\n const elapsedSeconds = deltaMillis / 1000;\n for (let i = 0; i < numParticles; i++) {\n const particle = this._particles[i];\n this.updateParticle(particle, elapsedSeconds);\n if (particle.isExpired) {\n this._particles[i] = this._particles[numParticles - 1];\n --i;\n --numParticles;\n }\n }\n\n this._particles.length = numParticles;\n }\n\n private updateParticle(particle: Particle, elapsedSeconds: number): void {\n const velocity = particle.velocity.clone(this._scratchVector3d);\n velocity.scale(elapsedSeconds, velocity);\n velocity.z += elapsedSeconds * this.gravity;\n particle.position.addInPlace(velocity);\n particle.transparency = 255 * (particle.age / particle.lifetime);\n\n particle.age += elapsedSeconds;\n }\n\n public decorate(context: DecorateContext): void {\n if (!context.viewport.view.isSpatialView())\n return;\n\n this.update();\n\n const builder = ParticleCollectionBuilder.create({\n viewport: context.viewport,\n texture: this._texture,\n size: (this._emitter.sizeRange.high - this._emitter.sizeRange.low) / 2,\n transparency: 0,\n origin: this._origin,\n pickableId: this._pickableId,\n });\n\n for (const particle of this._particles)\n builder.addParticle(particle);\n\n const graphic = builder.finish();\n if (graphic) {\n context.addDecoration(GraphicType.WorldDecoration, graphic);\n context.viewport.onRender.addOnce((vp) => vp.invalidateDecorations());\n }\n }\n\n public testDecorationHit(id: Id64String): boolean {\n return id === this._pickableId;\n }\n\n public async getDecorationToolTip(_hit: HitDetail): Promise<HTMLElement | string> {\n return \"Explosion effect\";\n }\n\n public static async addDecorator(iModel: IModelConnection): Promise<void> {\n // Note: The decorator takes ownership of the texture, and disposes of it when the decorator is disposed.\n const image = await imageElementFromUrl(`${IModelApp.publicPath}sprites/particle_explosion.png`);\n const texture = IModelApp.renderSystem.createTexture({\n ownership: \"external\",\n image: { source: image, transparency: TextureTransparency.Mixed },\n });\n if (texture)\n IModelApp.viewManager.addDecorator(new ParticleSystem(texture, iModel, randomIntegerInRange(this.numEmissionsRange)));\n }\n}\n\n/** This tool applies an explosion particle effect used for testing [ParticleCollectionBuilder]($frontend).\n * @beta\n */\nexport class ExplosionEffect extends Tool {\n public static override toolId = \"ExplosionEffect\";\n\n /** This method runs the tool, applying an explosion particle effect. */\n public override async run(): Promise<boolean> {\n const vp = IModelApp.viewManager.selectedView;\n if (vp)\n await ParticleSystem.addDecorator(vp.iModel);\n\n return true;\n }\n}\n"]}
@@ -1,31 +1,31 @@
1
- /** @packageDocumentation
2
- * @module Effects
3
- */
4
- import { ScreenSpaceEffectBuilder, Tool } from "@itwin/core-frontend";
5
- import { AddEffectTool } from "./EffectTools";
6
- /** An extremely simple and mostly useless effect intended to demonstrate the basics of creating a screen-space effect.
7
- * It flips the Viewport's image on the x and/or y axis, and/or inverts the color of each pixel.
8
- * @beta
9
- */
10
- export declare class FlipImageEffect extends AddEffectTool {
11
- static toolId: string;
12
- protected get effectName(): string;
13
- protected get textureCoordFromPosition(): boolean;
14
- protected get source(): {
15
- vertex: string;
16
- fragment: string;
17
- sampleSourcePixel: string;
18
- };
19
- protected defineEffect(builder: ScreenSpaceEffectBuilder): void;
20
- }
21
- /** Configure the [[FlipImageEffect]].
22
- * @beta
23
- */
24
- export declare class FlipImageConfig extends Tool {
25
- static toolId: string;
26
- static get minArgs(): number;
27
- static get maxArgs(): number;
28
- run(horizontal?: boolean, vertical?: boolean, color?: boolean): Promise<boolean>;
29
- parseAndRun(...input: string[]): Promise<boolean>;
30
- }
1
+ /** @packageDocumentation
2
+ * @module Effects
3
+ */
4
+ import { ScreenSpaceEffectBuilder, Tool } from "@itwin/core-frontend";
5
+ import { AddEffectTool } from "./EffectTools";
6
+ /** An extremely simple and mostly useless effect intended to demonstrate the basics of creating a screen-space effect.
7
+ * It flips the Viewport's image on the x and/or y axis, and/or inverts the color of each pixel.
8
+ * @beta
9
+ */
10
+ export declare class FlipImageEffect extends AddEffectTool {
11
+ static toolId: string;
12
+ protected get effectName(): string;
13
+ protected get textureCoordFromPosition(): boolean;
14
+ protected get source(): {
15
+ vertex: string;
16
+ fragment: string;
17
+ sampleSourcePixel: string;
18
+ };
19
+ protected defineEffect(builder: ScreenSpaceEffectBuilder): void;
20
+ }
21
+ /** Configure the [[FlipImageEffect]].
22
+ * @beta
23
+ */
24
+ export declare class FlipImageConfig extends Tool {
25
+ static toolId: string;
26
+ static get minArgs(): number;
27
+ static get maxArgs(): number;
28
+ run(horizontal?: boolean, vertical?: boolean, color?: boolean): Promise<boolean>;
29
+ parseAndRun(...input: string[]): Promise<boolean>;
30
+ }
31
31
  //# sourceMappingURL=FlipImage.d.ts.map