@fps-games/vfx 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (375) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/EffectPackageService.d.ts +26 -0
  3. package/dist/SceneVfxService.d.ts +27 -0
  4. package/dist/chunks/legacy-particle-runtime-CbJYVxdd.js +75 -0
  5. package/dist/chunks/manifestRuntimePackage-CXQFSTo2.js +356 -0
  6. package/dist/chunks/rendering-CV3nhygX.js +13 -0
  7. package/dist/chunks/space-shared-BXV1hc0k.js +124 -0
  8. package/dist/chunks/wood-sawdust-effect-factory-DlETNaBn.js +129 -0
  9. package/dist/effects/building-upgrade/effect.json.d.ts +9 -0
  10. package/dist/effects/building-upgrade/index.d.ts +20 -0
  11. package/dist/effects/building-upgrade/index.js +337 -0
  12. package/dist/effects/character-entrance/effect.json.d.ts +9 -0
  13. package/dist/effects/character-entrance/index.d.ts +18 -0
  14. package/dist/effects/character-entrance/index.js +271 -0
  15. package/dist/effects/coin-burst/index.d.ts +6 -0
  16. package/dist/effects/coin-burst/index.js +45 -0
  17. package/dist/effects/comet-trail-flame/index.d.ts +11 -0
  18. package/dist/effects/comet-trail-flame/index.js +103 -0
  19. package/dist/effects/conveyor-upgrade/effect.json.d.ts +9 -0
  20. package/dist/effects/conveyor-upgrade/index.d.ts +20 -0
  21. package/dist/effects/conveyor-upgrade/index.js +349 -0
  22. package/dist/effects/debris-smoke/index.d.ts +10 -0
  23. package/dist/effects/debris-smoke/index.js +108 -0
  24. package/dist/effects/door_open_gold_flakes/door_open_gold_flakes.json.d.ts +501 -0
  25. package/dist/effects/door_open_gold_flakes/index.d.ts +1 -0
  26. package/dist/effects/door_open_gold_flakes/index.js +524 -0
  27. package/dist/effects/electric-arc/index.d.ts +8 -0
  28. package/dist/effects/electric-arc/index.js +71 -0
  29. package/dist/effects/energy-shield/index.d.ts +46 -0
  30. package/dist/effects/energy-shield/index.js +365 -0
  31. package/dist/effects/explosion/index.d.ts +11 -0
  32. package/dist/effects/explosion/index.js +129 -0
  33. package/dist/effects/ground-tile-upgrade/effect.json.d.ts +9 -0
  34. package/dist/effects/ground-tile-upgrade/index.d.ts +20 -0
  35. package/dist/effects/ground-tile-upgrade/index.js +357 -0
  36. package/dist/effects/hit-flash/index.d.ts +8 -0
  37. package/dist/effects/hit-flash/index.js +71 -0
  38. package/dist/effects/laser-beam/index.d.ts +1 -0
  39. package/dist/effects/laser-beam/index.js +152 -0
  40. package/dist/effects/laser-beam-factory.d.ts +12 -0
  41. package/dist/effects/lumber-cart-suction/effect.json.d.ts +9 -0
  42. package/dist/effects/lumber-cart-suction/index.d.ts +26 -0
  43. package/dist/effects/lumber-cart-suction/index.js +322 -0
  44. package/dist/effects/lumber-debris-scatter/effect.json.d.ts +231 -0
  45. package/dist/effects/lumber-debris-scatter/index.d.ts +20 -0
  46. package/dist/effects/lumber-debris-scatter/index.js +637 -0
  47. package/dist/effects/lumber_vehicle_gear_spin/index.d.ts +1 -0
  48. package/dist/effects/lumber_vehicle_gear_spin/index.js +363 -0
  49. package/dist/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json.d.ts +341 -0
  50. package/dist/effects/lumber_vehicle_upgrade_aura/index.d.ts +1 -0
  51. package/dist/effects/lumber_vehicle_upgrade_aura/index.js +391 -0
  52. package/dist/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json.d.ts +368 -0
  53. package/dist/effects/lumber_vehicle_wood_chips/index.d.ts +1 -0
  54. package/dist/effects/lumber_vehicle_wood_chips/index.js +360 -0
  55. package/dist/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json.d.ts +338 -0
  56. package/dist/effects/monster-hit/index.d.ts +15 -0
  57. package/dist/effects/monster-hit/index.js +156 -0
  58. package/dist/effects/player-upgrade/effect.json.d.ts +9 -0
  59. package/dist/effects/player-upgrade/index.d.ts +24 -0
  60. package/dist/effects/player-upgrade/index.js +539 -0
  61. package/dist/effects/pulse-laser-volley/index.d.ts +17 -0
  62. package/dist/effects/pulse-laser-volley/index.js +173 -0
  63. package/dist/effects/resource-collect-sparkles/effect.json.d.ts +9 -0
  64. package/dist/effects/resource-collect-sparkles/index.d.ts +21 -0
  65. package/dist/effects/resource-collect-sparkles/index.js +222 -0
  66. package/dist/effects/run-footstep-dust/effect.json.d.ts +186 -0
  67. package/dist/effects/run-footstep-dust/index.d.ts +23 -0
  68. package/dist/effects/run-footstep-dust/index.js +343 -0
  69. package/dist/effects/space-shared.d.ts +44 -0
  70. package/dist/effects/thruster-flame/index.d.ts +15 -0
  71. package/dist/effects/thruster-flame/index.js +301 -0
  72. package/dist/effects/tree-chop-dust/effect.json.d.ts +11 -0
  73. package/dist/effects/tree-chop-dust/index.d.ts +17 -0
  74. package/dist/effects/tree-chop-dust/index.js +165 -0
  75. package/dist/effects/tree-leaf-chop-burst/index.d.ts +19 -0
  76. package/dist/effects/tree-leaf-chop-burst/index.js +219 -0
  77. package/dist/effects/tree_chop_dust_burst/index.d.ts +1 -0
  78. package/dist/effects/tree_chop_dust_burst/index.js +443 -0
  79. package/dist/effects/tree_chop_dust_burst/tree_chop_dust_burst.json.d.ts +415 -0
  80. package/dist/effects/ufo-thread-flame/index.d.ts +21 -0
  81. package/dist/effects/ufo-thread-flame/index.js +140 -0
  82. package/dist/effects/vehicle-exhaust-smoke/effect.json.d.ts +11 -0
  83. package/dist/effects/vehicle-exhaust-smoke/index.d.ts +19 -0
  84. package/dist/effects/vehicle-exhaust-smoke/index.js +242 -0
  85. package/dist/effects/vehicle-upgrade/effect.json.d.ts +9 -0
  86. package/dist/effects/vehicle-upgrade/index.d.ts +20 -0
  87. package/dist/effects/vehicle-upgrade/index.js +349 -0
  88. package/dist/effects/weapon-trail/index.d.ts +26 -0
  89. package/dist/effects/weapon-trail/index.js +351 -0
  90. package/dist/effects/wood-crusher-sawdust/index.d.ts +2 -0
  91. package/dist/effects/wood-crusher-sawdust/index.js +648 -0
  92. package/dist/effects/wood-crusher-sawdust/wood_crusher_sawdust.json.d.ts +595 -0
  93. package/dist/effects/wood-cutter-sawdust/index.d.ts +2 -0
  94. package/dist/effects/wood-cutter-sawdust/index.js +648 -0
  95. package/dist/effects/wood-cutter-sawdust/wood_cutter_sawdust.json.d.ts +595 -0
  96. package/dist/effects/wood-sawdust-effect-factory.d.ts +36 -0
  97. package/dist/effects/wood_crusher_sawdust/index.d.ts +16 -0
  98. package/dist/effects/wood_crusher_sawdust/index.js +634 -0
  99. package/dist/effects/wood_crusher_sawdust/wood_crusher_sawdust.json.d.ts +595 -0
  100. package/dist/effects/wood_cutter_sawdust/index.d.ts +16 -0
  101. package/dist/effects/wood_cutter_sawdust/index.js +634 -0
  102. package/dist/effects/wood_cutter_sawdust/wood_cutter_sawdust.json.d.ts +595 -0
  103. package/dist/effects/wood_peel_material_test/index.d.ts +1 -0
  104. package/dist/effects/wood_peel_material_test/index.js +157 -0
  105. package/dist/effects/wood_peel_material_test/wood_peel_material_test.json.d.ts +139 -0
  106. package/dist/generation.d.ts +7 -0
  107. package/dist/index.d.ts +8 -0
  108. package/dist/index.js +309 -0
  109. package/dist/legacy-particle-runtime.d.ts +30 -0
  110. package/dist/manifestRuntimePackage.d.ts +68 -0
  111. package/dist/registry.d.ts +20 -0
  112. package/dist/rendering.d.ts +5 -0
  113. package/dist/types.d.ts +83 -0
  114. package/docs/AUTHORING_EFFECTS.md +297 -0
  115. package/docs/VFX_LIBRARY_ARCHITECTURE_chatgpt.md +1580 -0
  116. package/docs/VFX_LIBRARY_EXECUTION_PLAN.md +229 -0
  117. package/docs/VFX_LIBRARY_PLAN.md +546 -0
  118. package/docs/vfx-ab/RESULTS.md +35 -0
  119. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/after.png +0 -0
  120. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/before.png +0 -0
  121. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/after.png +0 -0
  122. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/before.png +0 -0
  123. package/docs/vfx-integration_chatgpt.md +462 -0
  124. package/docs/weapon-trail-visualization.html +241 -0
  125. package/index.json +381 -0
  126. package/package.json +51 -0
  127. package/packages/EffectPackageService.ts +240 -0
  128. package/packages/SceneVfxService.ts +96 -0
  129. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/runtime/simpleMeshEffect.v1.js +333 -0
  130. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.frag.glsl +25 -0
  131. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.vert.glsl +11 -0
  132. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/textures/effect_jianbian.png +0 -0
  133. package/packages/build.mesh.yellow_build_upgrade_indicator/effect.json +927 -0
  134. package/packages/build.mesh.yellow_build_upgrade_indicator/media/contact-sheet.png +0 -0
  135. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.gif +0 -0
  136. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.mp4 +0 -0
  137. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.webm +0 -0
  138. package/packages/build.mesh.yellow_build_upgrade_indicator/media/thumbnail.png +0 -0
  139. package/packages/build.mesh.yellow_build_upgrade_indicator/metadata/description.json +197 -0
  140. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-effect.original.json +895 -0
  141. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-normalized-vfx-to-babylon-report.json +241 -0
  142. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-overrides.json +542 -0
  143. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-tuning-report.json +69 -0
  144. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/asset-map.json +125 -0
  145. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/lineage.json +44 -0
  146. package/packages/build.particle.golden_upgrade_starburst/assets/runtime/particleEmitter.v1.js +210 -0
  147. package/packages/build.particle.golden_upgrade_starburst/assets/textures/effect_guangdian.png +0 -0
  148. package/packages/build.particle.golden_upgrade_starburst/effect.json +880 -0
  149. package/packages/build.particle.golden_upgrade_starburst/media/contact-sheet.png +0 -0
  150. package/packages/build.particle.golden_upgrade_starburst/media/preview.gif +0 -0
  151. package/packages/build.particle.golden_upgrade_starburst/media/preview.mp4 +0 -0
  152. package/packages/build.particle.golden_upgrade_starburst/media/preview.webm +0 -0
  153. package/packages/build.particle.golden_upgrade_starburst/media/thumbnail.png +0 -0
  154. package/packages/build.particle.golden_upgrade_starburst/metadata/description.json +161 -0
  155. package/packages/build.particle.golden_upgrade_starburst/provenance/03-effect.original.json +762 -0
  156. package/packages/build.particle.golden_upgrade_starburst/provenance/03-normalized-vfx-to-babylon-report.json +260 -0
  157. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-overrides.json +436 -0
  158. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-tuning-report.json +40 -0
  159. package/packages/build.particle.golden_upgrade_starburst/provenance/asset-map.json +115 -0
  160. package/packages/build.particle.golden_upgrade_starburst/provenance/lineage.json +40 -0
  161. package/packages/build.particle.orange_upgrade_transform_sparks/assets/runtime/particleEmitter.v1.js +210 -0
  162. package/packages/build.particle.orange_upgrade_transform_sparks/assets/textures/b5b27ab1-e740-4398-b407-848fc2b2c897.png +0 -0
  163. package/packages/build.particle.orange_upgrade_transform_sparks/effect.json +887 -0
  164. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.gif +0 -0
  165. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.mp4 +0 -0
  166. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.webm +0 -0
  167. package/packages/build.particle.orange_upgrade_transform_sparks/media/thumbnail.png +0 -0
  168. package/packages/build.particle.orange_upgrade_transform_sparks/metadata/description.json +179 -0
  169. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-effect.original.json +859 -0
  170. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-normalized-vfx-to-babylon-report.json +260 -0
  171. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-overrides.json +478 -0
  172. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-tuning-report.json +40 -0
  173. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/asset-map.json +114 -0
  174. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/lineage.json +41 -0
  175. package/packages/build.particle.wood_chip_dust_burst/assets/runtime/particleEmitter.v1.js +210 -0
  176. package/packages/build.particle.wood_chip_dust_burst/assets/textures/effect_yanwu4.png +0 -0
  177. package/packages/build.particle.wood_chip_dust_burst/assets/textures/suipian3.png +0 -0
  178. package/packages/build.particle.wood_chip_dust_burst/effect.json +1400 -0
  179. package/packages/build.particle.wood_chip_dust_burst/media/contact-sheet.png +0 -0
  180. package/packages/build.particle.wood_chip_dust_burst/media/preview.gif +0 -0
  181. package/packages/build.particle.wood_chip_dust_burst/media/preview.mp4 +0 -0
  182. package/packages/build.particle.wood_chip_dust_burst/media/preview.webm +0 -0
  183. package/packages/build.particle.wood_chip_dust_burst/media/thumbnail.png +0 -0
  184. package/packages/build.particle.wood_chip_dust_burst/metadata/description.json +173 -0
  185. package/packages/build.particle.wood_chip_dust_burst/provenance/03-effect.original.json +1277 -0
  186. package/packages/build.particle.wood_chip_dust_burst/provenance/03-normalized-vfx-to-babylon-report.json +329 -0
  187. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-overrides.json +749 -0
  188. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-tuning-report.json +60 -0
  189. package/packages/build.particle.wood_chip_dust_burst/provenance/asset-map.json +146 -0
  190. package/packages/build.particle.wood_chip_dust_burst/provenance/lineage.json +69 -0
  191. package/packages/effects/building-upgrade/effect.json +6 -0
  192. package/packages/effects/building-upgrade/index.ts +387 -0
  193. package/packages/effects/building-upgrade/vfx-params.json +24 -0
  194. package/packages/effects/character-entrance/effect.json +6 -0
  195. package/packages/effects/character-entrance/index.ts +308 -0
  196. package/packages/effects/character-entrance/vfx-params.json +24 -0
  197. package/packages/effects/coin-burst/index.ts +43 -0
  198. package/packages/effects/coin-burst/vfx-params.json +5 -0
  199. package/packages/effects/comet-trail-flame/assets/textures/trail_5x4.webp +0 -0
  200. package/packages/effects/comet-trail-flame/index.ts +106 -0
  201. package/packages/effects/comet-trail-flame/vfx-params.json +5 -0
  202. package/packages/effects/conveyor-upgrade/effect.json +6 -0
  203. package/packages/effects/conveyor-upgrade/index.ts +401 -0
  204. package/packages/effects/conveyor-upgrade/vfx-params.json +21 -0
  205. package/packages/effects/debris-smoke/assets/models/rock_debris.glb +0 -0
  206. package/packages/effects/debris-smoke/assets/textures/smoke22.webp +0 -0
  207. package/packages/effects/debris-smoke/index.ts +101 -0
  208. package/packages/effects/debris-smoke/vfx-params.json +5 -0
  209. package/packages/effects/door_open_gold_flakes/assets/runtime/goldFlakes.v1.js +397 -0
  210. package/packages/effects/door_open_gold_flakes/door_open_gold_flakes.json +498 -0
  211. package/packages/effects/door_open_gold_flakes/index.ts +11 -0
  212. package/packages/effects/door_open_gold_flakes/vfx-params.json +23 -0
  213. package/packages/effects/electric-arc/assets/textures/spark_4x4.webp +0 -0
  214. package/packages/effects/electric-arc/index.ts +62 -0
  215. package/packages/effects/electric-arc/vfx-params.json +5 -0
  216. package/packages/effects/energy-shield/effect.json +7 -0
  217. package/packages/effects/energy-shield/index.ts +431 -0
  218. package/packages/effects/energy-shield/vfx-params.json +29 -0
  219. package/packages/effects/explosion/assets/textures/baozha29.webp +0 -0
  220. package/packages/effects/explosion/assets/textures/glow01.webp +0 -0
  221. package/packages/effects/explosion/assets/textures/lizi01.webp +0 -0
  222. package/packages/effects/explosion/assets/textures/xulie_lizibaozha02_5x5.webp +0 -0
  223. package/packages/effects/explosion/index.ts +114 -0
  224. package/packages/effects/explosion/vfx-params.json +5 -0
  225. package/packages/effects/ground-tile-upgrade/effect.json +6 -0
  226. package/packages/effects/ground-tile-upgrade/index.ts +410 -0
  227. package/packages/effects/ground-tile-upgrade/vfx-params.json +21 -0
  228. package/packages/effects/hit-flash/index.ts +69 -0
  229. package/packages/effects/hit-flash/vfx-params.json +5 -0
  230. package/packages/effects/laser-beam/assets/textures/laser_glow.webp +0 -0
  231. package/packages/effects/laser-beam/assets/textures/laser_noise.webp +0 -0
  232. package/packages/effects/laser-beam/index.ts +6 -0
  233. package/packages/effects/laser-beam/vfx-params.json +5 -0
  234. package/packages/effects/laser-beam-factory.ts +135 -0
  235. package/packages/effects/lumber-cart-suction/effect.json +6 -0
  236. package/packages/effects/lumber-cart-suction/index.ts +399 -0
  237. package/packages/effects/lumber-cart-suction/vfx-params.json +30 -0
  238. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb +0 -0
  239. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/.active +1 -0
  240. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/1781589063890_upload.glb +0 -0
  241. package/packages/effects/lumber-debris-scatter/assets/runtime/solidParticleScatter.v1.js +236 -0
  242. package/packages/effects/lumber-debris-scatter/effect.json +228 -0
  243. package/packages/effects/lumber-debris-scatter/index.ts +780 -0
  244. package/packages/effects/lumber-debris-scatter/vfx-params.json +19 -0
  245. package/packages/effects/lumber_vehicle_gear_spin/assets/runtime/gearSpin.v1.js +202 -0
  246. package/packages/effects/lumber_vehicle_gear_spin/index.ts +11 -0
  247. package/packages/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json +338 -0
  248. package/packages/effects/lumber_vehicle_gear_spin/vfx-params.json +21 -0
  249. package/packages/effects/lumber_vehicle_upgrade_aura/assets/runtime/upgradeAura.v1.js +353 -0
  250. package/packages/effects/lumber_vehicle_upgrade_aura/index.ts +11 -0
  251. package/packages/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json +365 -0
  252. package/packages/effects/lumber_vehicle_upgrade_aura/vfx-params.json +15 -0
  253. package/packages/effects/lumber_vehicle_wood_chips/assets/runtime/solidParticleScatter.v1.js +310 -0
  254. package/packages/effects/lumber_vehicle_wood_chips/index.ts +11 -0
  255. package/packages/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json +335 -0
  256. package/packages/effects/lumber_vehicle_wood_chips/vfx-params.json +11 -0
  257. package/packages/effects/monster-hit/index.ts +128 -0
  258. package/packages/effects/monster-hit/vfx-params.json +5 -0
  259. package/packages/effects/player-upgrade/effect.json +6 -0
  260. package/packages/effects/player-upgrade/index.ts +635 -0
  261. package/packages/effects/player-upgrade/vfx-params.json +28 -0
  262. package/packages/effects/pulse-laser-volley/assets/textures/bolt_guangshu.webp +0 -0
  263. package/packages/effects/pulse-laser-volley/index.ts +204 -0
  264. package/packages/effects/pulse-laser-volley/vfx-params.json +5 -0
  265. package/packages/effects/resource-collect-sparkles/effect.json +6 -0
  266. package/packages/effects/resource-collect-sparkles/index.ts +254 -0
  267. package/packages/effects/resource-collect-sparkles/vfx-params.json +25 -0
  268. package/packages/effects/run-footstep-dust/assets/runtime/runFootstepDust.v1.js +215 -0
  269. package/packages/effects/run-footstep-dust/effect.json +183 -0
  270. package/packages/effects/run-footstep-dust/index.ts +377 -0
  271. package/packages/effects/run-footstep-dust/vfx-params.json +27 -0
  272. package/packages/effects/space-shared.ts +120 -0
  273. package/packages/effects/thruster-flame/index.ts +305 -0
  274. package/packages/effects/thruster-flame/vfx-params.json +5 -0
  275. package/packages/effects/tree-chop-dust/assets/textures/tree_chop_dust_atlas.png +0 -0
  276. package/packages/effects/tree-chop-dust/effect.json +8 -0
  277. package/packages/effects/tree-chop-dust/index.ts +202 -0
  278. package/packages/effects/tree-chop-dust/vfx-params.json +21 -0
  279. package/packages/effects/tree-leaf-chop-burst/assets/runtime/particleEmitter.v1.js +303 -0
  280. package/packages/effects/tree-leaf-chop-burst/assets/textures/tree_leaf_chop_burst_leaf_atlas.png +0 -0
  281. package/packages/effects/tree-leaf-chop-burst/effect.json +498 -0
  282. package/packages/effects/tree-leaf-chop-burst/index.ts +294 -0
  283. package/packages/effects/tree-leaf-chop-burst/vfx-params.json +27 -0
  284. package/packages/effects/tree_chop_dust_burst/assets/runtime/particleEmitter.v1.js +318 -0
  285. package/packages/effects/tree_chop_dust_burst/assets/textures/tree_chop_dust_burst_dust.png +0 -0
  286. package/packages/effects/tree_chop_dust_burst/index.ts +13 -0
  287. package/packages/effects/tree_chop_dust_burst/tree_chop_dust_burst.json +412 -0
  288. package/packages/effects/tree_chop_dust_burst/vfx-params.json +9 -0
  289. package/packages/effects/ufo-thread-flame/assets/textures/flame_flow.webp +0 -0
  290. package/packages/effects/ufo-thread-flame/assets/textures/flame_spike.webp +0 -0
  291. package/packages/effects/ufo-thread-flame/index.ts +152 -0
  292. package/packages/effects/ufo-thread-flame/vfx-params.json +5 -0
  293. package/packages/effects/vehicle-exhaust-smoke/assets/textures/vehicle_exhaust_smoke_atlas.png +0 -0
  294. package/packages/effects/vehicle-exhaust-smoke/effect.json +8 -0
  295. package/packages/effects/vehicle-exhaust-smoke/index.ts +298 -0
  296. package/packages/effects/vehicle-exhaust-smoke/vfx-params.json +23 -0
  297. package/packages/effects/vehicle-upgrade/effect.json +6 -0
  298. package/packages/effects/vehicle-upgrade/index.ts +401 -0
  299. package/packages/effects/vehicle-upgrade/vfx-params.json +21 -0
  300. package/packages/effects/weapon-trail/assets/textures/trail_wedge.png +0 -0
  301. package/packages/effects/weapon-trail/index.ts +313 -0
  302. package/packages/effects/weapon-trail/vfx-params.json +5 -0
  303. package/packages/effects/wood-crusher-sawdust/assets/runtime/particleEmitter.v1.js +312 -0
  304. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  305. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  306. package/packages/effects/wood-crusher-sawdust/index.ts +43 -0
  307. package/packages/effects/wood-crusher-sawdust/vfx-params.json +24 -0
  308. package/packages/effects/wood-crusher-sawdust/wood_crusher_sawdust.json +592 -0
  309. package/packages/effects/wood-cutter-sawdust/assets/runtime/particleEmitter.v1.js +312 -0
  310. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  311. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  312. package/packages/effects/wood-cutter-sawdust/index.ts +43 -0
  313. package/packages/effects/wood-cutter-sawdust/vfx-params.json +24 -0
  314. package/packages/effects/wood-cutter-sawdust/wood_cutter_sawdust.json +592 -0
  315. package/packages/effects/wood-sawdust-effect-factory.ts +194 -0
  316. package/packages/effects/wood_crusher_sawdust/assets/runtime/particleEmitter.v1.js +318 -0
  317. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  318. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  319. package/packages/effects/wood_crusher_sawdust/index.ts +29 -0
  320. package/packages/effects/wood_crusher_sawdust/vfx-params.json +14 -0
  321. package/packages/effects/wood_crusher_sawdust/wood_crusher_sawdust.json +592 -0
  322. package/packages/effects/wood_cutter_sawdust/assets/runtime/particleEmitter.v1.js +318 -0
  323. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  324. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  325. package/packages/effects/wood_cutter_sawdust/index.ts +29 -0
  326. package/packages/effects/wood_cutter_sawdust/vfx-params.json +14 -0
  327. package/packages/effects/wood_cutter_sawdust/wood_cutter_sawdust.json +592 -0
  328. package/packages/effects/wood_peel_material_test/assets/runtime/woodPeelMaterialTest.v1.js +196 -0
  329. package/packages/effects/wood_peel_material_test/index.ts +11 -0
  330. package/packages/effects/wood_peel_material_test/vfx-params.json +9 -0
  331. package/packages/effects/wood_peel_material_test/wood_peel_material_test.json +136 -0
  332. package/packages/env.particle.forest_edge_fog/assets/runtime/particleEmitter.v1.js +210 -0
  333. package/packages/env.particle.forest_edge_fog/assets/textures/f12a23c4-b924-4322-a260-3d982428f1e8.png +0 -0
  334. package/packages/env.particle.forest_edge_fog/assets/textures/yuan.png +0 -0
  335. package/packages/env.particle.forest_edge_fog/effect.json +854 -0
  336. package/packages/env.particle.forest_edge_fog/media/preview.gif +0 -0
  337. package/packages/env.particle.forest_edge_fog/media/preview.mp4 +0 -0
  338. package/packages/env.particle.forest_edge_fog/media/preview.webm +0 -0
  339. package/packages/env.particle.forest_edge_fog/media/thumbnail.png +0 -0
  340. package/packages/env.particle.forest_edge_fog/metadata/description.json +148 -0
  341. package/packages/env.particle.forest_edge_fog/provenance/03-effect.original.json +827 -0
  342. package/packages/env.particle.forest_edge_fog/provenance/03-normalized-vfx-to-babylon-report.json +196 -0
  343. package/packages/env.particle.forest_edge_fog/provenance/04-preview-overrides.json +432 -0
  344. package/packages/env.particle.forest_edge_fog/provenance/04-preview-tuning-report.json +28 -0
  345. package/packages/env.particle.forest_edge_fog/provenance/asset-map.json +124 -0
  346. package/packages/env.particle.forest_edge_fog/provenance/lineage.json +41 -0
  347. package/packages/generation.ts +14 -0
  348. package/packages/index.ts +14 -0
  349. package/packages/legacy-particle-runtime.ts +113 -0
  350. package/packages/manifestRuntimePackage.ts +519 -0
  351. package/packages/registry.ts +85 -0
  352. package/packages/rendering.ts +13 -0
  353. package/packages/resource.particle.viscous_oil_suction/assets/runtime/top_disk_suction/particleEmitter.v1.js +424 -0
  354. package/packages/resource.particle.viscous_oil_suction/assets/textures/Glow ad.png +0 -0
  355. package/packages/resource.particle.viscous_oil_suction/effect.json +1254 -0
  356. package/packages/resource.particle.viscous_oil_suction/media/preview.gif +0 -0
  357. package/packages/resource.particle.viscous_oil_suction/media/preview.mp4 +0 -0
  358. package/packages/resource.particle.viscous_oil_suction/media/preview.webm +0 -0
  359. package/packages/resource.particle.viscous_oil_suction/media/thumbnail.png +0 -0
  360. package/packages/resource.particle.viscous_oil_suction/metadata/description.json +122 -0
  361. package/packages/resource.particle.viscous_oil_suction/provenance/03-effect.original.json +1051 -0
  362. package/packages/resource.particle.viscous_oil_suction/provenance/03-normalized-vfx-to-babylon-report.json +200 -0
  363. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-overrides.json +581 -0
  364. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-tuning-report.json +28 -0
  365. package/packages/resource.particle.viscous_oil_suction/provenance/asset-map.json +111 -0
  366. package/packages/resource.particle.viscous_oil_suction/provenance/lineage.json +45 -0
  367. package/packages/types.ts +107 -0
  368. package/tooling/check-dist-runtime.mjs +166 -0
  369. package/tooling/generate-index.mjs +55 -0
  370. package/tooling/test-guardrails.mjs +157 -0
  371. package/tooling/validate-boundary.mjs +92 -0
  372. package/tooling/validate-effects.mjs +304 -0
  373. package/tooling/validate.mjs +53 -0
  374. package/tooling/vfx-cli.mjs +232 -0
  375. package/tooling/vfx-package-resolution.mjs +28 -0
@@ -0,0 +1,648 @@
1
+ import { c as createWoodSawdustEffectPackage } from "../../chunks/wood-sawdust-effect-factory-DlETNaBn.js";
2
+ const schemaVersion = "vfx-effect-package/1.0";
3
+ const id = "build.particle.wood_cutter_sawdust";
4
+ const name = {
5
+ zh: "切割机木粉",
6
+ en: "Wood Cutter Sawdust"
7
+ };
8
+ const source = {
9
+ engine: "babylon",
10
+ engineVersion: "8.56.2",
11
+ projectPath: "D:/project/lumber_order",
12
+ rootAsset: "src/assets/vfx/wood_cutter_sawdust",
13
+ sourceId: "lumber_order/wood_cutter_sawdust",
14
+ extractedAt: "2026-06-02T00:00:00.000Z",
15
+ extractorVersion: "manual-lumber-order-vfx/0.1.0",
16
+ canonicalSource: "local",
17
+ legacyId: null,
18
+ previousIds: []
19
+ };
20
+ const assets = {
21
+ textures: [
22
+ {
23
+ kind: "texture",
24
+ id: "wood_cutter_sawdust_dust",
25
+ packagePath: "assets/textures/wood_cutter_sawdust_dust.png",
26
+ sourcePath: "src/assets/vfx/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_dust.png",
27
+ sourceId: "generated-white-pale-sawdust-alpha",
28
+ width: 128,
29
+ height: 128
30
+ },
31
+ {
32
+ kind: "texture",
33
+ id: "wood_cutter_sawdust_chip",
34
+ packagePath: "assets/textures/wood_cutter_sawdust_chip.png",
35
+ sourcePath: "src/assets/vfx/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_chip.png",
36
+ sourceId: "generated-white-short-pale-chip-alpha",
37
+ width: 64,
38
+ height: 64
39
+ }
40
+ ],
41
+ materials: [],
42
+ meshes: [],
43
+ shaders: [],
44
+ sounds: [],
45
+ scripts: [
46
+ {
47
+ kind: "script",
48
+ id: "particle_emitter_v1",
49
+ packagePath: "assets/runtime/particleEmitter.v1.js",
50
+ runtimeId: "particleEmitter/v1",
51
+ engine: "babylon",
52
+ moduleFormat: "esm",
53
+ exports: [
54
+ "createParticleEmitterRuntime",
55
+ "runtimeContract"
56
+ ],
57
+ mimeType: "text/javascript"
58
+ }
59
+ ],
60
+ raw: []
61
+ };
62
+ const emitters = [
63
+ {
64
+ name: "wood_cutter_sawdust_dust",
65
+ sourceNodeName: "wood_cutter_sawdust_dust",
66
+ enabled: true,
67
+ deterministic: false,
68
+ blendMode: "STANDARD",
69
+ particleTexturePath: "assets/textures/wood_cutter_sawdust_dust.png",
70
+ capacity: 110,
71
+ manualEmitCount: 34,
72
+ emitRate: 0,
73
+ effectScale: 0.72,
74
+ minSize: 0.1,
75
+ maxSize: 0.2,
76
+ minLifeTime: 0.34,
77
+ maxLifeTime: 0.62,
78
+ minEmitPower: 0.42,
79
+ maxEmitPower: 0.88,
80
+ updateSpeed: 0.016666666666666666,
81
+ gravity: {
82
+ x: 0,
83
+ y: -0.04,
84
+ z: 0
85
+ },
86
+ shape: {
87
+ sourceType: "Box",
88
+ sourceEnum: 0,
89
+ radius: 1,
90
+ angle: 0,
91
+ type: "Box",
92
+ direction1: {
93
+ x: -0.18,
94
+ y: 0.44,
95
+ z: -0.1
96
+ },
97
+ direction2: {
98
+ x: 0.18,
99
+ y: 0.82,
100
+ z: 0.1
101
+ },
102
+ minEmitBox: {
103
+ x: -0.16,
104
+ y: 0.05,
105
+ z: -0.07
106
+ },
107
+ maxEmitBox: {
108
+ x: 0.16,
109
+ y: 0.17,
110
+ z: 0.07
111
+ },
112
+ radiusRange: 0
113
+ },
114
+ spriteSheet: {
115
+ enabled: false
116
+ },
117
+ alphaKeys: [
118
+ {
119
+ time: 0,
120
+ alpha: 0
121
+ },
122
+ {
123
+ time: 0.08,
124
+ alpha: 0.64
125
+ },
126
+ {
127
+ time: 0.46,
128
+ alpha: 0.34
129
+ },
130
+ {
131
+ time: 1,
132
+ alpha: 0
133
+ }
134
+ ],
135
+ sizeKeys: [
136
+ {
137
+ time: 0,
138
+ size: 0.85
139
+ },
140
+ {
141
+ time: 0.42,
142
+ size: 1.75
143
+ },
144
+ {
145
+ time: 1,
146
+ size: 2.5
147
+ }
148
+ ],
149
+ renderColor: {
150
+ color: {
151
+ r: 0.92,
152
+ g: 0.82,
153
+ b: 0.58,
154
+ a: 0.64
155
+ },
156
+ colorIntensity: 1,
157
+ alphaIntensity: 1
158
+ },
159
+ minInitialRotation: 0,
160
+ maxInitialRotation: 6.283185307179586,
161
+ minAngularSpeed: -0.35,
162
+ maxAngularSpeed: 0.35,
163
+ source: {
164
+ simulationSpace: 1,
165
+ renderMode: 0,
166
+ alignSpace: 2,
167
+ normalizedVfxEmitterId: "wood_cutter_sawdust_dust"
168
+ },
169
+ sourceMap: null,
170
+ runtime: {
171
+ stopAfterSeconds: 0.78,
172
+ disposeOnComplete: true
173
+ }
174
+ },
175
+ {
176
+ name: "wood_cutter_sawdust_chip",
177
+ sourceNodeName: "wood_cutter_sawdust_chip",
178
+ enabled: true,
179
+ deterministic: false,
180
+ blendMode: "STANDARD",
181
+ particleTexturePath: "assets/textures/wood_cutter_sawdust_chip.png",
182
+ capacity: 40,
183
+ manualEmitCount: 10,
184
+ emitRate: 0,
185
+ effectScale: 0.72,
186
+ minSize: 0.045,
187
+ maxSize: 0.068,
188
+ minScaleX: 0.72,
189
+ maxScaleX: 1.1,
190
+ minScaleY: 0.48,
191
+ maxScaleY: 0.68,
192
+ minLifeTime: 0.22,
193
+ maxLifeTime: 0.38,
194
+ minEmitPower: 0.95,
195
+ maxEmitPower: 1.65,
196
+ updateSpeed: 0.016666666666666666,
197
+ gravity: {
198
+ x: 0,
199
+ y: -2.35,
200
+ z: 0
201
+ },
202
+ shape: {
203
+ sourceType: "Box",
204
+ sourceEnum: 0,
205
+ radius: 1,
206
+ angle: 0,
207
+ type: "Box",
208
+ direction1: {
209
+ x: -0.38,
210
+ y: 0.72,
211
+ z: -0.15
212
+ },
213
+ direction2: {
214
+ x: 0.38,
215
+ y: 1.15,
216
+ z: 0.15
217
+ },
218
+ minEmitBox: {
219
+ x: -0.12,
220
+ y: 0.06,
221
+ z: -0.05
222
+ },
223
+ maxEmitBox: {
224
+ x: 0.12,
225
+ y: 0.15,
226
+ z: 0.05
227
+ },
228
+ radiusRange: 0
229
+ },
230
+ spriteSheet: {
231
+ enabled: false
232
+ },
233
+ alphaKeys: [
234
+ {
235
+ time: 0,
236
+ alpha: 0.92
237
+ },
238
+ {
239
+ time: 0.72,
240
+ alpha: 0.78
241
+ },
242
+ {
243
+ time: 1,
244
+ alpha: 0
245
+ }
246
+ ],
247
+ sizeKeys: [
248
+ {
249
+ time: 0,
250
+ size: 1
251
+ },
252
+ {
253
+ time: 1,
254
+ size: 0.55
255
+ }
256
+ ],
257
+ renderColor: {
258
+ color: {
259
+ r: 0.96,
260
+ g: 0.78,
261
+ b: 0.44,
262
+ a: 0.9
263
+ },
264
+ colorIntensity: 1,
265
+ alphaIntensity: 1
266
+ },
267
+ minInitialRotation: 0,
268
+ maxInitialRotation: 6.283185307179586,
269
+ minAngularSpeed: -6,
270
+ maxAngularSpeed: 6,
271
+ source: {
272
+ simulationSpace: 1,
273
+ renderMode: 0,
274
+ alignSpace: 2,
275
+ normalizedVfxEmitterId: "wood_cutter_sawdust_chip"
276
+ },
277
+ sourceMap: null,
278
+ runtime: {
279
+ stopAfterSeconds: 0.62,
280
+ disposeOnComplete: true
281
+ }
282
+ }
283
+ ];
284
+ const runtime = {
285
+ driver: "particle",
286
+ defaultMesh: null,
287
+ defaultOffset: {
288
+ x: 0,
289
+ y: 0,
290
+ z: 0
291
+ },
292
+ start: [
293
+ "Instantiate Babylon runtime for wood_cutter_sawdust"
294
+ ],
295
+ update: [
296
+ "Apply Babylon tunable parameter overrides"
297
+ ],
298
+ stop: [
299
+ "Stop and dispose runtime resources"
300
+ ],
301
+ adapters: [
302
+ {
303
+ id: "particleEmitter/v1",
304
+ engine: "babylon",
305
+ entry: "assets/runtime/particleEmitter.v1.js",
306
+ moduleFormat: "esm",
307
+ exports: [
308
+ "createParticleEmitterRuntime",
309
+ "runtimeContract"
310
+ ]
311
+ }
312
+ ]
313
+ };
314
+ const tunableParams = [
315
+ {
316
+ key: "wood_cutter_sawdust_dust.manualEmitCount",
317
+ labelZh: "粉末数量",
318
+ type: "number",
319
+ "default": 34,
320
+ min: 1,
321
+ max: 140,
322
+ step: 1,
323
+ target: {
324
+ emitter: "wood_cutter_sawdust_dust",
325
+ property: "manualEmitCount",
326
+ operator: "set"
327
+ }
328
+ },
329
+ {
330
+ key: "wood_cutter_sawdust_chip.manualEmitCount",
331
+ labelZh: "浅色碎屑数量",
332
+ type: "number",
333
+ "default": 10,
334
+ min: 0,
335
+ max: 70,
336
+ step: 1,
337
+ target: {
338
+ emitter: "wood_cutter_sawdust_chip",
339
+ property: "manualEmitCount",
340
+ operator: "set"
341
+ }
342
+ },
343
+ {
344
+ key: "wood_cutter_sawdust_dust.renderColor.color",
345
+ labelZh: "粉末颜色",
346
+ type: "color",
347
+ "default": "#ead192",
348
+ target: {
349
+ emitter: "wood_cutter_sawdust_dust",
350
+ property: "renderColor.color",
351
+ operator: "set"
352
+ }
353
+ },
354
+ {
355
+ key: "wood_cutter_sawdust_chip.renderColor.color",
356
+ labelZh: "浅色碎屑颜色",
357
+ type: "color",
358
+ "default": "#f5c770",
359
+ target: {
360
+ emitter: "wood_cutter_sawdust_chip",
361
+ property: "renderColor.color",
362
+ operator: "set"
363
+ }
364
+ },
365
+ {
366
+ key: "wood_cutter_sawdust_dust.sizeScale",
367
+ labelZh: "粉末大小",
368
+ type: "number",
369
+ "default": 1,
370
+ min: 0.2,
371
+ max: 4,
372
+ step: 0.01,
373
+ targets: [
374
+ {
375
+ emitter: "wood_cutter_sawdust_dust",
376
+ property: "minSize",
377
+ operator: "scaleDefault",
378
+ defaultValue: 0.1
379
+ },
380
+ {
381
+ emitter: "wood_cutter_sawdust_dust",
382
+ property: "maxSize",
383
+ operator: "scaleDefault",
384
+ defaultValue: 0.2
385
+ }
386
+ ]
387
+ },
388
+ {
389
+ key: "wood_cutter_sawdust_chip.sizeScale",
390
+ labelZh: "浅色碎屑大小",
391
+ type: "number",
392
+ "default": 1,
393
+ min: 0.2,
394
+ max: 4,
395
+ step: 0.01,
396
+ targets: [
397
+ {
398
+ emitter: "wood_cutter_sawdust_chip",
399
+ property: "minSize",
400
+ operator: "scaleDefault",
401
+ defaultValue: 0.045
402
+ },
403
+ {
404
+ emitter: "wood_cutter_sawdust_chip",
405
+ property: "maxSize",
406
+ operator: "scaleDefault",
407
+ defaultValue: 0.068
408
+ }
409
+ ]
410
+ },
411
+ {
412
+ key: "wood_cutter_sawdust.scale",
413
+ labelZh: "整体缩放",
414
+ type: "number",
415
+ "default": 0.72,
416
+ min: 0.1,
417
+ max: 4,
418
+ step: 0.01,
419
+ targets: [
420
+ {
421
+ emitter: "wood_cutter_sawdust_dust",
422
+ property: "effectScale",
423
+ operator: "set"
424
+ },
425
+ {
426
+ emitter: "wood_cutter_sawdust_chip",
427
+ property: "effectScale",
428
+ operator: "set"
429
+ }
430
+ ]
431
+ },
432
+ {
433
+ key: "wood_cutter_sawdust_dust.maxLifeTime",
434
+ labelZh: "粉末生命周期",
435
+ type: "number",
436
+ "default": 0.62,
437
+ min: 0.08,
438
+ max: 3,
439
+ step: 0.01,
440
+ unit: "s",
441
+ target: {
442
+ emitter: "wood_cutter_sawdust_dust",
443
+ property: "maxLifeTime",
444
+ operator: "set"
445
+ }
446
+ },
447
+ {
448
+ key: "wood_cutter_sawdust_chip.maxLifeTime",
449
+ labelZh: "浅色碎屑生命周期",
450
+ type: "number",
451
+ "default": 0.38,
452
+ min: 0.08,
453
+ max: 2,
454
+ step: 0.01,
455
+ unit: "s",
456
+ target: {
457
+ emitter: "wood_cutter_sawdust_chip",
458
+ property: "maxLifeTime",
459
+ operator: "set"
460
+ }
461
+ },
462
+ {
463
+ key: "wood_cutter_sawdust_dust.maxEmitPower",
464
+ labelZh: "粉末喷散速度",
465
+ type: "number",
466
+ "default": 0.88,
467
+ min: 0,
468
+ max: 4,
469
+ step: 0.01,
470
+ target: {
471
+ emitter: "wood_cutter_sawdust_dust",
472
+ property: "maxEmitPower",
473
+ operator: "set"
474
+ }
475
+ },
476
+ {
477
+ key: "wood_cutter_sawdust_chip.maxEmitPower",
478
+ labelZh: "浅色碎屑飞溅速度",
479
+ type: "number",
480
+ "default": 1.65,
481
+ min: 0,
482
+ max: 8,
483
+ step: 0.01,
484
+ target: {
485
+ emitter: "wood_cutter_sawdust_chip",
486
+ property: "maxEmitPower",
487
+ operator: "set"
488
+ }
489
+ },
490
+ {
491
+ key: "wood_cutter_sawdust_chip.burstSpread",
492
+ labelZh: "浅色碎屑散开幅度",
493
+ type: "number",
494
+ "default": 1,
495
+ min: 0,
496
+ max: 4,
497
+ step: 0.01,
498
+ targets: [
499
+ {
500
+ emitter: "wood_cutter_sawdust_chip",
501
+ property: "shape.direction1",
502
+ operator: "scaleVectorDefault",
503
+ defaultValue: {
504
+ x: -0.38,
505
+ y: 0.72,
506
+ z: -0.15,
507
+ scaleAxes: {
508
+ x: true,
509
+ y: false,
510
+ z: true
511
+ }
512
+ }
513
+ },
514
+ {
515
+ emitter: "wood_cutter_sawdust_chip",
516
+ property: "shape.direction2",
517
+ operator: "scaleVectorDefault",
518
+ defaultValue: {
519
+ x: 0.38,
520
+ y: 1.15,
521
+ z: 0.15,
522
+ scaleAxes: {
523
+ x: true,
524
+ y: false,
525
+ z: true
526
+ }
527
+ }
528
+ }
529
+ ]
530
+ }
531
+ ];
532
+ const babylon = {
533
+ driver: "particle",
534
+ previewConfig: {
535
+ textureUrl: "assets/textures/wood_cutter_sawdust_dust.png",
536
+ emitterCount: 2,
537
+ effectFile: "wood_cutter_sawdust.json",
538
+ normalizedVfx: null
539
+ }
540
+ };
541
+ const review = {
542
+ status: "tweaked",
543
+ artistNotes: [
544
+ "Two-emitter pale sawdust effect for a cutter working on peeled wood.",
545
+ "Default colors are intentionally lighter than the crusher effect.",
546
+ "Chip layer is short and sparse, with a tunable spread for saw-blade sparks of wood dust."
547
+ ],
548
+ approvedBy: null,
549
+ approvedAt: null
550
+ };
551
+ const recording = {
552
+ provider: "local-placeholder",
553
+ recordedAt: "2026-06-02T00:00:00.000Z",
554
+ mimeType: "image/png",
555
+ durationSec: 0.78,
556
+ fps: 0,
557
+ media: {
558
+ previewVideo: null,
559
+ previewWebm: null,
560
+ previewMp4: null,
561
+ previewGif: null,
562
+ thumbnail: "media/thumbnail.png",
563
+ contactSheet: "media/contact-sheet.png",
564
+ gcsUri: null
565
+ }
566
+ };
567
+ const search = {
568
+ tags: [
569
+ "babylon",
570
+ "particle",
571
+ "wood cutter",
572
+ "pale sawdust",
573
+ "peeled wood",
574
+ "casual game",
575
+ "ua game"
576
+ ],
577
+ descriptionEn: "A pale sawdust puff with short light chips for cutting peeled wood on a circular saw.",
578
+ useCases: [
579
+ "wood cutter processing",
580
+ "circular saw feedback",
581
+ "peeled wood cutting feedback"
582
+ ],
583
+ negativeUseCases: [
584
+ "dark bark chips",
585
+ "large wood chunks",
586
+ "tree falling dust",
587
+ "fire",
588
+ "magic"
589
+ ]
590
+ };
591
+ const legacyIds = [];
592
+ const manifest = {
593
+ schemaVersion,
594
+ id,
595
+ name,
596
+ source,
597
+ assets,
598
+ emitters,
599
+ runtime,
600
+ tunableParams,
601
+ babylon,
602
+ review,
603
+ recording,
604
+ search,
605
+ legacyIds
606
+ };
607
+ const runtimeUrl = "data:text/javascript;base64,ZXhwb3J0IGNvbnN0IHJ1bnRpbWVJZCA9ICJwYXJ0aWNsZUVtaXR0ZXIvdjEiOwoKZXhwb3J0IGNvbnN0IHJ1bnRpbWVDb250cmFjdCA9IHsKICBydW50aW1lSWQsCiAga2luZDogInBhcnRpY2xlRW1pdHRlciIsCiAgZW1pdHRlckZpZWxkczogewogICAgY2FwYWNpdHk6ICJNYXhpbXVtIEJhYnlsb24gcGFydGljbGUgY2FwYWNpdHkuIiwKICAgIHBhcnRpY2xlVGV4dHVyZVBhdGg6ICJQYWNrYWdlLXJlbGF0aXZlIHBhcnRpY2xlIHRleHR1cmUgcGF0aCB1c2VkIHRvIGxvYWQgdGhlIEJhYnlsb24gUGFydGljbGVTeXN0ZW0ucGFydGljbGVUZXh0dXJlLiIsCiAgICBibGVuZE1vZGU6ICJCYWJ5bG9uIHBhcnRpY2xlIGJsZW5kIG1vZGUgbGFiZWw6IEFERCwgU1RBTkRBUkQsIE1VTFRJUExZLCBvciBPTkVPTkUuIiwKICAgIHNoYXBlOiAiRW1pdHRlciBzaGFwZSBkZWZpbml0aW9uIGdlbmVyYXRlZCBieSB0aGUgcGFja2FnZSBidWlsZCBzdGFnZS4iLAogICAgc3ByaXRlU2hlZXQ6ICJPcHRpb25hbCBCYWJ5bG9uIHBhcnRpY2xlIHNwcml0ZXNoZWV0IHNldHRpbmdzIGZvciBhdGxhcy1iYXNlZCBwYXJ0aWNsZSB0ZXh0dXJlcy4iLAogICAgZWZmZWN0U2NhbGU6ICJTcGF0aWFsIHNjYWxlIGZvciB0aGUgd2hvbGUgZWZmZWN0OyBzY2FsZXMgZW1pdHRlciB2b2x1bWUsIHBhcnRpY2xlIHNpemUsIHZlbG9jaXR5LCBhbmQgZ3Jhdml0eSB0b2dldGhlci4iLAogICAgcmVuZGVyQ29sb3I6ICJDb252ZXJ0ZWQgcGFydGljbGUgY29sb3IgaW5wdXRzOiBvbmUgYmFzZSBjb2xvciBwbHVzIFJHQi9hbHBoYSBpbnRlbnNpdHkgYmVmb3JlIHdyaXRpbmcgQmFieWxvbiBjb2xvcjEvY29sb3IyL2NvbG9yRGVhZC4iLAogICAgYWxwaGFLZXlzOiAiQ29sb3IgYWxwaGEgZ3JhZGllbnRzIHNhbXBsZWQgb3ZlciBub3JtYWxpemVkIHBhcnRpY2xlIGxpZmV0aW1lLiIsCiAgICBzaXplS2V5czogIlNpemUgZ3JhZGllbnRzIHNhbXBsZWQgb3ZlciBub3JtYWxpemVkIHBhcnRpY2xlIGxpZmV0aW1lLiIsCiAgfSwKICBydW50aW1lQmluZGluZ3M6IHsKICAgICJQYXJ0aWNsZVN5c3RlbS5wYXJ0aWNsZVRleHR1cmUiOiAiVGV4dHVyZSBsb2FkZWQgZnJvbSBlbWl0dGVyLnBhcnRpY2xlVGV4dHVyZVBhdGggdGhyb3VnaCB1cmxGb3JQYWNrYWdlUGF0aC4iLAogICAgIlBhcnRpY2xlU3lzdGVtLmJsZW5kTW9kZSI6ICJNYXBwZWQgZnJvbSBlbWl0dGVyLmJsZW5kTW9kZS4iLAogICAgIlBhcnRpY2xlU3lzdGVtLm1hbnVhbEVtaXRDb3VudCI6ICJlbWl0dGVyLm1hbnVhbEVtaXRDb3VudCB3aGVuIGVtaXRSYXRlIGlzIDAuIiwKICAgICJQYXJ0aWNsZVN5c3RlbS5lbWl0UmF0ZSI6ICJlbWl0dGVyLmVtaXRSYXRlIGZvciBzdXN0YWluZWQgZW1pdHRlcnMuIiwKICAgICJQYXJ0aWNsZVN5c3RlbS5zaGFwZSI6ICJNYXBwZWQgZnJvbSBlbWl0dGVyLnNoYXBlLnR5cGUgYW5kIHNoYXBlIHBhcmFtZXRlcnMsIHRoZW4gc2NhbGVkIGJ5IGVtaXR0ZXIuZWZmZWN0U2NhbGUuIiwKICAgICJQYXJ0aWNsZVN5c3RlbS5zcHJpdGVTaGVldCI6ICJBcHBsaWVkIGZyb20gZW1pdHRlci5zcHJpdGVTaGVldCB3aGVuIGVuYWJsZWQuIiwKICAgICJQYXJ0aWNsZVN5c3RlbS5jb2xvckdyYWRpZW50IjogImVtaXR0ZXIuYWxwaGFLZXlzIGFwcGxpZWQgdG8gdGhlIGZpbmFsIFBhcnRpY2xlU3lzdGVtLmNvbG9yMS4iLAogICAgIlBhcnRpY2xlU3lzdGVtLnNpemVHcmFkaWVudCI6ICJlbWl0dGVyLnNpemVLZXlzIG11bHRpcGxpZWQgYnkgZW1pdHRlci5tYXhTaXplIGFuZCBlbWl0dGVyLmVmZmVjdFNjYWxlLiIsCiAgfSwKfTsKCmNvbnN0IEJBQllMT05fUEFSVElDTEVfVVBEQVRFX1NQRUVEX1VOSVQgPSAwLjAxOwoKZnVuY3Rpb24gbnVtKHZhbHVlLCBmYWxsYmFjayA9IDApIHsKICBjb25zdCBuZXh0ID0gTnVtYmVyKHZhbHVlKTsKICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG5leHQpID8gbmV4dCA6IGZhbGxiYWNrOwp9CgpmdW5jdGlvbiByZWFkQ29sb3IoQkFCWUxPTiwgdmFsdWUsIGZhbGxiYWNrID0gbmV3IEJBQllMT04uQ29sb3I0KDEsIDEsIDEsIDEpKSB7CiAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbGxiYWNrOwogIHJldHVybiBuZXcgQkFCWUxPTi5Db2xvcjQobnVtKHZhbHVlLnIsIGZhbGxiYWNrLnIpLCBudW0odmFsdWUuZywgZmFsbGJhY2suZyksIG51bSh2YWx1ZS5iLCBmYWxsYmFjay5iKSwgbnVtKHZhbHVlLmEsIGZhbGxiYWNrLmEpKTsKfQoKZnVuY3Rpb24gYXBwbHlSZW5kZXJDb2xvckludGVuc2l0eShCQUJZTE9OLCBjb2xvciwgcmVuZGVyQ29sb3IgPSB7fSkgewogIGNvbnN0IGNvbG9ySW50ZW5zaXR5ID0gTWF0aC5tYXgoMCwgbnVtKHJlbmRlckNvbG9yLmNvbG9ySW50ZW5zaXR5LCAxKSk7CiAgY29uc3QgYWxwaGFJbnRlbnNpdHkgPSBNYXRoLm1heCgwLCBudW0ocmVuZGVyQ29sb3IuYWxwaGFJbnRlbnNpdHksIGNvbG9ySW50ZW5zaXR5KSk7CiAgcmV0dXJuIG5ldyBCQUJZTE9OLkNvbG9yNCgKICAgIGNvbG9yLnIgKiBjb2xvckludGVuc2l0eSwKICAgIGNvbG9yLmcgKiBjb2xvckludGVuc2l0eSwKICAgIGNvbG9yLmIgKiBjb2xvckludGVuc2l0eSwKICAgIE1hdGgubWluKDEsIGNvbG9yLmEgKiBhbHBoYUludGVuc2l0eSkKICApOwp9CgpmdW5jdGlvbiBwYXJ0aWNsZUNvbG9ycyhCQUJZTE9OLCBlbWl0dGVyKSB7CiAgY29uc3QgcmVuZGVyQ29sb3IgPSBlbWl0dGVyLnJlbmRlckNvbG9yOwogIGNvbnN0IGJhc2VDb2xvciA9IHJlYWRDb2xvcihCQUJZTE9OLCByZW5kZXJDb2xvcj8uY29sb3IsIG5ldyBCQUJZTE9OLkNvbG9yNCgxLCAxLCAxLCAxKSk7CiAgY29uc3QgY29sb3IxID0gYXBwbHlSZW5kZXJDb2xvckludGVuc2l0eShCQUJZTE9OLCBiYXNlQ29sb3IsIHJlbmRlckNvbG9yKTsKICByZXR1cm4gewogICAgY29sb3IxLAogICAgY29sb3IyOiBjb2xvcjEsCiAgICBjb2xvckRlYWQ6IG5ldyBCQUJZTE9OLkNvbG9yNChjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iLCAwKSwKICB9Owp9CgpmdW5jdGlvbiByZWFkVmVjKEJBQllMT04sIHZhbHVlLCBmYWxsYmFjayA9IG5ldyBCQUJZTE9OLlZlY3RvcjMoMCwgMCwgMCkpIHsKICBpZiAoIXZhbHVlKSByZXR1cm4gZmFsbGJhY2s7CiAgcmV0dXJuIG5ldyBCQUJZTE9OLlZlY3RvcjMobnVtKHZhbHVlLngsIGZhbGxiYWNrLngpLCBudW0odmFsdWUueSwgZmFsbGJhY2sueSksIG51bSh2YWx1ZS56LCBmYWxsYmFjay56KSk7Cn0KCmZ1bmN0aW9uIGJsZW5kTW9kZShCQUJZTE9OLCB2YWx1ZSkgewogIGlmICh2YWx1ZSA9PT0gIlNUQU5EQVJEIikgcmV0dXJuIEJBQllMT04uUGFydGljbGVTeXN0ZW0uQkxFTkRNT0RFX1NUQU5EQVJEOwogIGlmICh2YWx1ZSA9PT0gIk1VTFRJUExZIikgcmV0dXJuIEJBQllMT04uUGFydGljbGVTeXN0ZW0uQkxFTkRNT0RFX01VTFRJUExZOwogIGlmICh2YWx1ZSA9PT0gIk9ORU9ORSIpIHJldHVybiBCQUJZTE9OLlBhcnRpY2xlU3lzdGVtLkJMRU5ETU9ERV9PTkVPTkU7CiAgcmV0dXJuIEJBQllMT04uUGFydGljbGVTeXN0ZW0uQkxFTkRNT0RFX0FERDsKfQoKZnVuY3Rpb24gYmlsbGJvYXJkTW9kZShCQUJZTE9OLCB2YWx1ZSkgewogIGlmICghdmFsdWUgfHwgQkFCWUxPTi5QYXJ0aWNsZVN5c3RlbVt2YWx1ZV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDsKICByZXR1cm4gQkFCWUxPTi5QYXJ0aWNsZVN5c3RlbVt2YWx1ZV07Cn0KCmZ1bmN0aW9uIGVmZmVjdFNjYWxlKGVtaXR0ZXIpIHsKICByZXR1cm4gTWF0aC5tYXgoMC4wMDAxLCBudW0oZW1pdHRlci5lZmZlY3RTY2FsZSwgMSkpOwp9CgpmdW5jdGlvbiBhcHBseVJlbmRlck9yZGVyKHN5c3RlbSwgZW1pdHRlcikgewogIHN5c3RlbS5yZW5kZXJpbmdHcm91cElkID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChudW0oZW1pdHRlci5yZW5kZXJpbmdHcm91cElkLCAyKSkpOwogIHN5c3RlbS5hbHBoYUluZGV4ID0gbnVtKGVtaXR0ZXIuYWxwaGFJbmRleCwgMTAwKTsKICBpZiAoImZvcmNlRGVwdGhXcml0ZSIgaW4gc3lzdGVtKSB7CiAgICBzeXN0ZW0uZm9yY2VEZXB0aFdyaXRlID0gZmFsc2U7CiAgfQp9CgpmdW5jdGlvbiBpc0RldGVybWluaXN0aWMoZW1pdHRlcikgewogIHJldHVybiBlbWl0dGVyPy5kZXRlcm1pbmlzdGljICE9PSBmYWxzZSAmJiBlbWl0dGVyPy5yYW5kb21pemUgIT09IHRydWU7Cn0KCmZ1bmN0aW9uIG1pZHBvaW50KG1pbiwgbWF4KSB7CiAgcmV0dXJuIChtaW4gKyBtYXgpICogMC41Owp9CgpmdW5jdGlvbiBmcmFjdCh2YWx1ZSkgewogIHJldHVybiB2YWx1ZSAtIE1hdGguZmxvb3IodmFsdWUpOwp9CgpmdW5jdGlvbiBzZXF1ZW5jZTAxKGluZGV4LCBheGlzKSB7CiAgaWYgKGluZGV4ID09PSAwKSByZXR1cm4gMC41OwogIGNvbnN0IHN0cmlkZXMgPSBbMC42MTgwMzM5ODg3NDk4OTUsIDAuNDE0MjEzNTYyMzczMDk1LCAwLjczMjA1MDgwNzU2ODg3NywgMC4zMjQ3MTc5NTcyNDQ3NDYsIDAuNzU0ODc3NjY2MjQ2NjkzLCAwLjU2OTg0MDI5MDk5ODA1M107CiAgcmV0dXJuIGZyYWN0KDAuNSArIGluZGV4ICogc3RyaWRlc1theGlzICUgc3RyaWRlcy5sZW5ndGhdICsgYXhpcyAqIDAuMTczMjA1MDgwNzU2ODg4KTsKfQoKZnVuY3Rpb24gbGVycChtaW4sIG1heCwgdCkgewogIHJldHVybiBtaW4gKyAobWF4IC0gbWluKSAqIHQ7Cn0KCmZ1bmN0aW9uIGFwcGx5RGV0ZXJtaW5pc3RpY0JveEVtaXR0ZXIoQkFCWUxPTiwgc3lzdGVtLCBkaXJlY3Rpb24xLCBkaXJlY3Rpb24yLCBib3hNaW4sIGJveE1heCkgewogIHN5c3RlbS5taW5FbWl0Qm94ID0gYm94TWluOwogIHN5c3RlbS5tYXhFbWl0Qm94ID0gYm94TWF4OwogIHN5c3RlbS5kaXJlY3Rpb24xID0gZGlyZWN0aW9uMTsKICBzeXN0ZW0uZGlyZWN0aW9uMiA9IGRpcmVjdGlvbjI7CgogIGxldCBwb3NpdGlvbkluZGV4ID0gMDsKICBsZXQgZGlyZWN0aW9uSW5kZXggPSAwOwoKICBzeXN0ZW0uc3RhcnRQb3NpdGlvbkZ1bmN0aW9uID0gKHdvcmxkTWF0cml4LCBwb3NpdGlvblRvVXBkYXRlLCBfcGFydGljbGUsIGlzTG9jYWwpID0+IHsKICAgIGNvbnN0IGluZGV4ID0gcG9zaXRpb25JbmRleDsKICAgIHBvc2l0aW9uSW5kZXggKz0gMTsKICAgIGNvbnN0IHggPSBsZXJwKGJveE1pbi54LCBib3hNYXgueCwgc2VxdWVuY2UwMShpbmRleCwgMCkpOwogICAgY29uc3QgeSA9IGxlcnAoYm94TWluLnksIGJveE1heC55LCBzZXF1ZW5jZTAxKGluZGV4LCAxKSk7CiAgICBjb25zdCB6ID0gbGVycChib3hNaW4ueiwgYm94TWF4LnosIHNlcXVlbmNlMDEoaW5kZXgsIDIpKTsKICAgIGlmIChpc0xvY2FsKSBwb3NpdGlvblRvVXBkYXRlLnNldCh4LCB5LCB6KTsKICAgIGVsc2UgQkFCWUxPTi5WZWN0b3IzLlRyYW5zZm9ybUNvb3JkaW5hdGVzRnJvbUZsb2F0c1RvUmVmKHgsIHksIHosIHdvcmxkTWF0cml4LCBwb3NpdGlvblRvVXBkYXRlKTsKICB9OwoKICBzeXN0ZW0uc3RhcnREaXJlY3Rpb25GdW5jdGlvbiA9ICh3b3JsZE1hdHJpeCwgZGlyZWN0aW9uVG9VcGRhdGUsIF9wYXJ0aWNsZSwgaXNMb2NhbCkgPT4gewogICAgY29uc3QgaW5kZXggPSBkaXJlY3Rpb25JbmRleDsKICAgIGRpcmVjdGlvbkluZGV4ICs9IDE7CiAgICBjb25zdCB4ID0gbGVycChkaXJlY3Rpb24xLngsIGRpcmVjdGlvbjIueCwgc2VxdWVuY2UwMShpbmRleCwgMykpOwogICAgY29uc3QgeSA9IGxlcnAoZGlyZWN0aW9uMS55LCBkaXJlY3Rpb24yLnksIHNlcXVlbmNlMDEoaW5kZXgsIDQpKTsKICAgIGNvbnN0IHogPSBsZXJwKGRpcmVjdGlvbjEueiwgZGlyZWN0aW9uMi56LCBzZXF1ZW5jZTAxKGluZGV4LCA1KSk7CiAgICBpZiAoaXNMb2NhbCkgZGlyZWN0aW9uVG9VcGRhdGUuc2V0KHgsIHksIHopOwogICAgZWxzZSBCQUJZTE9OLlZlY3RvcjMuVHJhbnNmb3JtTm9ybWFsRnJvbUZsb2F0c1RvUmVmKHgsIHksIHosIHdvcmxkTWF0cml4LCBkaXJlY3Rpb25Ub1VwZGF0ZSk7CiAgfTsKfQoKZnVuY3Rpb24gYXBwbHlDb2Nvc0NvbmVFbWl0RnVuY3Rpb25zKEJBQllMT04sIHN5c3RlbSwgcmFkaXVzLCBhbmdsZSwgcmFkaXVzUmFuZ2UsIHNjYWxlKSB7CiAgY29uc3Qgc2FmZVJhZGl1cyA9IE1hdGgubWF4KDAsIHJhZGl1cyAqIHNjYWxlKTsKICBjb25zdCBpbm5lclNxID0gKHNhZmVSYWRpdXMgKiBNYXRoLm1heCgwLCAxIC0gcmFkaXVzUmFuZ2UpKSAqKiAyOwogIGNvbnN0IG91dGVyU3EgPSBzYWZlUmFkaXVzICogc2FmZVJhZGl1czsKICBjb25zdCBoYWxmQW5nbGUgPSBNYXRoLm1pbihNYXRoLlBJLCBNYXRoLm1heCgwLCBhbmdsZSkpOwogIGNvbnN0IGNvc0FuZ2xlID0gTWF0aC5jb3MoaGFsZkFuZ2xlKTsKCiAgc3lzdGVtLnN0YXJ0UG9zaXRpb25GdW5jdGlvbiA9ICh3b3JsZE1hdHJpeCwgcG9zaXRpb25Ub1VwZGF0ZSwgX3BhcnRpY2xlLCBpc0xvY2FsKSA9PiB7CiAgICBjb25zdCBzID0gTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyOwogICAgY29uc3QgcjIgPSBpbm5lclNxICsgTWF0aC5yYW5kb20oKSAqIChvdXRlclNxIC0gaW5uZXJTcSk7CiAgICBjb25zdCByID0gTWF0aC5zcXJ0KE1hdGgubWF4KDAsIHIyKSk7CiAgICBjb25zdCBseCA9IHIgKiBNYXRoLmNvcyhzKTsKICAgIGNvbnN0IGx6ID0gciAqIE1hdGguc2luKHMpOwogICAgaWYgKGlzTG9jYWwpIHBvc2l0aW9uVG9VcGRhdGUuc2V0KGx4LCAwLCBseik7CiAgICBlbHNlIEJBQllMT04uVmVjdG9yMy5UcmFuc2Zvcm1Db29yZGluYXRlc0Zyb21GbG9hdHNUb1JlZihseCwgMCwgbHosIHdvcmxkTWF0cml4LCBwb3NpdGlvblRvVXBkYXRlKTsKICB9OwoKICBzeXN0ZW0uc3RhcnREaXJlY3Rpb25GdW5jdGlvbiA9ICh3b3JsZE1hdHJpeCwgZGlyZWN0aW9uVG9VcGRhdGUsIF9wYXJ0aWNsZSwgaXNMb2NhbCkgPT4gewogICAgY29uc3QgcGhpID0gTWF0aC5yYW5kb20oKSAqIE1hdGguUEkgKiAyOwogICAgY29uc3QgY29zVGhldGEgPSAxIC0gTWF0aC5yYW5kb20oKSAqICgxIC0gY29zQW5nbGUpOwogICAgY29uc3Qgc2luVGhldGEgPSBNYXRoLnNxcnQoTWF0aC5tYXgoMCwgMSAtIGNvc1RoZXRhICogY29zVGhldGEpKTsKICAgIGNvbnN0IGR4ID0gc2luVGhldGEgKiBNYXRoLmNvcyhwaGkpOwogICAgY29uc3QgZHkgPSBjb3NUaGV0YTsKICAgIGNvbnN0IGR6ID0gc2luVGhldGEgKiBNYXRoLnNpbihwaGkpOwogICAgaWYgKGlzTG9jYWwpIGRpcmVjdGlvblRvVXBkYXRlLnNldChkeCwgZHksIGR6KTsKICAgIGVsc2UgQkFCWUxPTi5WZWN0b3IzLlRyYW5zZm9ybU5vcm1hbEZyb21GbG9hdHNUb1JlZihkeCwgZHksIGR6LCB3b3JsZE1hdHJpeCwgZGlyZWN0aW9uVG9VcGRhdGUpOwogIH07Cn0KCmZ1bmN0aW9uIGFwcGx5RW1pdHRlclNoYXBlKEJBQllMT04sIHN5c3RlbSwgZW1pdHRlcikgewogIGNvbnN0IHNjYWxlID0gZWZmZWN0U2NhbGUoZW1pdHRlcik7CiAgY29uc3Qgc2hhcGUgPSBlbWl0dGVyLnNoYXBlIHx8IHt9OwogIGNvbnN0IHR5cGUgPSBzaGFwZS50eXBlOwogIGNvbnN0IHJhZGl1cyA9IG51bShzaGFwZS5yYWRpdXMsIDEpOwogIGNvbnN0IHJhZGl1c1JhbmdlID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgbnVtKHNoYXBlLnJhZGl1c1JhbmdlLCAxKSkpOwogIGNvbnN0IGFuZ2xlID0gbnVtKHNoYXBlLmFuZ2xlLCBNYXRoLlBJIC8gNCk7CiAgY29uc3QgZGlyZWN0aW9uMSA9IHJlYWRWZWMoQkFCWUxPTiwgc2hhcGUuZGlyZWN0aW9uMSwgbmV3IEJBQllMT04uVmVjdG9yMygwLCAxLCAwKSk7CiAgY29uc3QgZGlyZWN0aW9uMiA9IHJlYWRWZWMoQkFCWUxPTiwgc2hhcGUuZGlyZWN0aW9uMiwgbmV3IEJBQllMT04uVmVjdG9yMygwLCAxLCAwKSk7CiAgY29uc3QgYm94TWluID0gcmVhZFZlYyhCQUJZTE9OLCBzaGFwZS5taW5FbWl0Qm94LCBuZXcgQkFCWUxPTi5WZWN0b3IzKC1yYWRpdXMgKiAwLjUsIC1yYWRpdXMgKiAwLjUsIC1yYWRpdXMgKiAwLjUpKS5zY2FsZShzY2FsZSk7CiAgY29uc3QgYm94TWF4ID0gcmVhZFZlYyhCQUJZTE9OLCBzaGFwZS5tYXhFbWl0Qm94LCBuZXcgQkFCWUxPTi5WZWN0b3IzKHJhZGl1cyAqIDAuNSwgcmFkaXVzICogMC41LCByYWRpdXMgKiAwLjUpKS5zY2FsZShzY2FsZSk7CgogIGlmICh0eXBlID09PSAiQm94IikgewogICAgaWYgKGlzRGV0ZXJtaW5pc3RpYyhlbWl0dGVyKSkgYXBwbHlEZXRlcm1pbmlzdGljQm94RW1pdHRlcihCQUJZTE9OLCBzeXN0ZW0sIGRpcmVjdGlvbjEsIGRpcmVjdGlvbjIsIGJveE1pbiwgYm94TWF4KTsKICAgIGVsc2Ugc3lzdGVtLmNyZWF0ZUJveEVtaXR0ZXIoZGlyZWN0aW9uMSwgZGlyZWN0aW9uMiwgYm94TWluLCBib3hNYXgpOwogIH0gZWxzZSBpZiAodHlwZSA9PT0gIlNwaGVyZURpcmVjdGVkIikgewogICAgc3lzdGVtLmNyZWF0ZURpcmVjdGVkU3BoZXJlRW1pdHRlcihyYWRpdXMgKiBzY2FsZSwgZGlyZWN0aW9uMSwgZGlyZWN0aW9uMik7CiAgfSBlbHNlIGlmICh0eXBlID09PSAiU3BoZXJlIikgewogICAgc3lzdGVtLmNyZWF0ZVNwaGVyZUVtaXR0ZXIocmFkaXVzICogc2NhbGUsIHJhZGl1c1JhbmdlKTsKICB9IGVsc2UgaWYgKHR5cGUgPT09ICJIZW1pc3BoZXJlIikgewogICAgc3lzdGVtLmNyZWF0ZUhlbWlzcGhlcmljRW1pdHRlcihyYWRpdXMgKiBzY2FsZSwgcmFkaXVzUmFuZ2UpOwogIH0gZWxzZSBpZiAodHlwZSA9PT0gIkNvbmUiKSB7CiAgICBjb25zdCBkaXJTcHJlYWQgPSBkaXJlY3Rpb24xLnN1YnRyYWN0KGRpcmVjdGlvbjIpLmxlbmd0aFNxdWFyZWQoKTsKICAgIGlmIChkaXJTcHJlYWQgPCAxZS00KSB7CiAgICAgIHN5c3RlbS5jcmVhdGVDb25lRW1pdHRlcihNYXRoLm1heCgwLjAwMSwgcmFkaXVzICogc2NhbGUpLCBhbmdsZSk7CiAgICAgIGFwcGx5Q29jb3NDb25lRW1pdEZ1bmN0aW9ucyhCQUJZTE9OLCBzeXN0ZW0sIHJhZGl1cywgYW5nbGUsIHJhZGl1c1JhbmdlLCBzY2FsZSk7CiAgICB9IGVsc2UgewogICAgICBzeXN0ZW0uY3JlYXRlRGlyZWN0ZWRDb25lRW1pdHRlcihNYXRoLm1heCgwLjAwMSwgcmFkaXVzICogc2NhbGUpLCBhbmdsZSwgZGlyZWN0aW9uMSwgZGlyZWN0aW9uMik7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBhcHBseVNwcml0ZVNoZWV0KHN5c3RlbSwgZW1pdHRlcikgewogIGNvbnN0IHNwcml0ZVNoZWV0ID0gZW1pdHRlci5zcHJpdGVTaGVldCB8fCB7fTsKICBpZiAoIXNwcml0ZVNoZWV0LmVuYWJsZWQpIHJldHVybjsKICBjb25zdCBkZXRlcm1pbmlzdGljID0gaXNEZXRlcm1pbmlzdGljKGVtaXR0ZXIpOwoKICBzeXN0ZW0uaXNBbmltYXRpb25TaGVldEVuYWJsZWQgPSB0cnVlOwogIHN5c3RlbS5zcHJpdGVDZWxsV2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKG51bShzcHJpdGVTaGVldC5jZWxsV2lkdGgsIDI1NikpKTsKICBzeXN0ZW0uc3ByaXRlQ2VsbEhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQobnVtKHNwcml0ZVNoZWV0LmNlbGxIZWlnaHQsIDI1NikpKTsKICBzeXN0ZW0uc3RhcnRTcHJpdGVDZWxsSUQgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKG51bShzcHJpdGVTaGVldC5zdGFydENlbGxJRCwgMCkpKTsKICBzeXN0ZW0uZW5kU3ByaXRlQ2VsbElEID0gTWF0aC5tYXgoc3lzdGVtLnN0YXJ0U3ByaXRlQ2VsbElELCBNYXRoLnJvdW5kKG51bShzcHJpdGVTaGVldC5lbmRDZWxsSUQsIHN5c3RlbS5zdGFydFNwcml0ZUNlbGxJRCkpKTsKICBzeXN0ZW0uc3ByaXRlQ2VsbENoYW5nZVNwZWVkID0gTWF0aC5tYXgoMCwgbnVtKHNwcml0ZVNoZWV0LmNlbGxDaGFuZ2VTcGVlZCwgMCkpOwogIHN5c3RlbS5zcHJpdGVSYW5kb21TdGFydENlbGwgPSBkZXRlcm1pbmlzdGljID8gc3ByaXRlU2hlZXQucmFuZG9tU3RhcnRDZWxsID09PSB0cnVlICYmIGVtaXR0ZXIucmFuZG9taXplID09PSB0cnVlIDogc3ByaXRlU2hlZXQucmFuZG9tU3RhcnRDZWxsICE9PSBmYWxzZTsKfQoKZnVuY3Rpb24gYWRkR3JhZGllbnRzKEJBQllMT04sIHN5c3RlbSwgZW1pdHRlciwgY29sb3IxKSB7CiAgY29uc3Qgc2NhbGUgPSBlZmZlY3RTY2FsZShlbWl0dGVyKTsKICBmb3IgKGNvbnN0IGtleSBvZiBlbWl0dGVyLmFscGhhS2V5cyB8fCBbXSkgewogICAgY29uc3QgdGltZSA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIG51bShrZXkudGltZSwgMCkpKTsKICAgIGNvbnN0IGFscGhhID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgbnVtKGtleS5hbHBoYSwgMSkpKTsKICAgIHN5c3RlbS5hZGRDb2xvckdyYWRpZW50Py4odGltZSwgbmV3IEJBQllMT04uQ29sb3I0KGNvbG9yMS5yLCBjb2xvcjEuZywgY29sb3IxLmIsIE1hdGgubWluKDEsIGNvbG9yMS5hICogYWxwaGEpKSk7CiAgfQogIGZvciAoY29uc3Qga2V5IG9mIGVtaXR0ZXIuc2l6ZUtleXMgfHwgW10pIHsKICAgIGNvbnN0IHRpbWUgPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBudW0oa2V5LnRpbWUsIDApKSk7CiAgICBjb25zdCBzaXplID0gTWF0aC5tYXgoMC4wMDEsIG51bShrZXkuc2l6ZSwgMSkgKiBudW0oZW1pdHRlci5tYXhTaXplLCAxKSAqIHNjYWxlKTsKICAgIHN5c3RlbS5hZGRTaXplR3JhZGllbnQ/Lih0aW1lLCBzaXplKTsKICB9Cn0KCmZ1bmN0aW9uIHBsYXliYWNrU3BlZWQoZW1pdHRlcikgewogIHJldHVybiBNYXRoLm1heCgwLjAwMSwgbnVtKGVtaXR0ZXIudXBkYXRlU3BlZWQsIEJBQllMT05fUEFSVElDTEVfVVBEQVRFX1NQRUVEX1VOSVQpIC8gQkFCWUxPTl9QQVJUSUNMRV9VUERBVEVfU1BFRURfVU5JVCk7Cn0KCmZ1bmN0aW9uIHJ1bnRpbWVEdXJhdGlvbihlbWl0dGVyKSB7CiAgcmV0dXJuIE1hdGgubWF4KDAuMSwgbnVtKGVtaXR0ZXIucnVudGltZT8uc3RvcEFmdGVyU2Vjb25kcywgMykgLyBwbGF5YmFja1NwZWVkKGVtaXR0ZXIpKTsKfQoKZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVBhcnRpY2xlRW1pdHRlclJ1bnRpbWUoeyBCQUJZTE9OLCBzY2VuZSwgZW1pdHRlciwgaW5kZXggPSAwLCB1cmxGb3JQYWNrYWdlUGF0aCwgc2hvdWxkU3RhcnQgPSBmYWxzZSB9KSB7CiAgaWYgKCFCQUJZTE9OKSB0aHJvdyBuZXcgRXJyb3IoImNyZWF0ZVBhcnRpY2xlRW1pdHRlclJ1bnRpbWUgcmVxdWlyZXMgQkFCWUxPTi4iKTsKICBpZiAoIXNjZW5lKSB0aHJvdyBuZXcgRXJyb3IoImNyZWF0ZVBhcnRpY2xlRW1pdHRlclJ1bnRpbWUgcmVxdWlyZXMgc2NlbmUuIik7CiAgaWYgKCFlbWl0dGVyKSB0aHJvdyBuZXcgRXJyb3IoImNyZWF0ZVBhcnRpY2xlRW1pdHRlclJ1bnRpbWUgcmVxdWlyZXMgZW1pdHRlci4iKTsKCiAgY29uc3Qgc2NhbGUgPSBlZmZlY3RTY2FsZShlbWl0dGVyKTsKICBjb25zdCBkZXRlcm1pbmlzdGljID0gaXNEZXRlcm1pbmlzdGljKGVtaXR0ZXIpOwogIGNvbnN0IGNhcGFjaXR5ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChudW0oZW1pdHRlci5jYXBhY2l0eSwgMTAwKSkpOwogIGNvbnN0IHN5c3RlbSA9IG5ldyBCQUJZTE9OLlBhcnRpY2xlU3lzdGVtKGBwYXJ0aWNsZS1lbWl0dGVyLSR7ZW1pdHRlci5uYW1lIHx8IGluZGV4fWAsIGNhcGFjaXR5LCBzY2VuZSk7CiAgYXBwbHlSZW5kZXJPcmRlcihzeXN0ZW0sIGVtaXR0ZXIpOwogIGNvbnN0IHRleHR1cmVVcmwgPSB1cmxGb3JQYWNrYWdlUGF0aCA/IHVybEZvclBhY2thZ2VQYXRoKGVtaXR0ZXIucGFydGljbGVUZXh0dXJlUGF0aCkgOiBlbWl0dGVyLnBhcnRpY2xlVGV4dHVyZVBhdGg7CiAgc3lzdGVtLnBhcnRpY2xlVGV4dHVyZSA9IG5ldyBCQUJZTE9OLlRleHR1cmUodGV4dHVyZVVybCwgc2NlbmUpOwogIHN5c3RlbS5wYXJ0aWNsZVRleHR1cmUuaGFzQWxwaGEgPSB0cnVlOwogIHN5c3RlbS5lbWl0dGVyID0gcmVhZFZlYyhCQUJZTE9OLCBlbWl0dGVyLm9yaWdpbiwgQkFCWUxPTi5WZWN0b3IzLlplcm8oKSk7CiAgc3lzdGVtLmJsZW5kTW9kZSA9IGJsZW5kTW9kZShCQUJZTE9OLCBlbWl0dGVyLmJsZW5kTW9kZSk7CiAgc3lzdGVtLmlzTG9jYWwgPSBlbWl0dGVyLmlzTG9jYWwgPT09IHRydWU7CiAgY29uc3QgbWluU2l6ZSA9IE1hdGgubWF4KDAuMDAxLCBudW0oZW1pdHRlci5taW5TaXplLCAxKSAqIHNjYWxlKTsKICBjb25zdCBtYXhTaXplID0gTWF0aC5tYXgobWluU2l6ZSwgbnVtKGVtaXR0ZXIubWF4U2l6ZSwgbWluU2l6ZSkgKiBzY2FsZSk7CiAgc3lzdGVtLm1pblNpemUgPSBkZXRlcm1pbmlzdGljID8gbWlkcG9pbnQobWluU2l6ZSwgbWF4U2l6ZSkgOiBtaW5TaXplOwogIHN5c3RlbS5tYXhTaXplID0gZGV0ZXJtaW5pc3RpYyA/IHN5c3RlbS5taW5TaXplIDogbWF4U2l6ZTsKICBjb25zdCBtaW5TY2FsZVggPSBNYXRoLm1heCgwLjAwMSwgbnVtKGVtaXR0ZXIubWluU2NhbGVYLCAxKSk7CiAgY29uc3QgbWF4U2NhbGVYID0gTWF0aC5tYXgobWluU2NhbGVYLCBudW0oZW1pdHRlci5tYXhTY2FsZVgsIG1pblNjYWxlWCkpOwogIHN5c3RlbS5taW5TY2FsZVggPSBkZXRlcm1pbmlzdGljID8gbWlkcG9pbnQobWluU2NhbGVYLCBtYXhTY2FsZVgpIDogbWluU2NhbGVYOwogIHN5c3RlbS5tYXhTY2FsZVggPSBkZXRlcm1pbmlzdGljID8gc3lzdGVtLm1pblNjYWxlWCA6IG1heFNjYWxlWDsKICBjb25zdCBtaW5TY2FsZVkgPSBNYXRoLm1heCgwLjAwMSwgbnVtKGVtaXR0ZXIubWluU2NhbGVZLCAxKSk7CiAgY29uc3QgbWF4U2NhbGVZID0gTWF0aC5tYXgobWluU2NhbGVZLCBudW0oZW1pdHRlci5tYXhTY2FsZVksIG1pblNjYWxlWSkpOwogIHN5c3RlbS5taW5TY2FsZVkgPSBkZXRlcm1pbmlzdGljID8gbWlkcG9pbnQobWluU2NhbGVZLCBtYXhTY2FsZVkpIDogbWluU2NhbGVZOwogIHN5c3RlbS5tYXhTY2FsZVkgPSBkZXRlcm1pbmlzdGljID8gc3lzdGVtLm1pblNjYWxlWSA6IG1heFNjYWxlWTsKICBjb25zdCBtaW5MaWZlVGltZSA9IE1hdGgubWF4KDAuMDIsIG51bShlbWl0dGVyLm1pbkxpZmVUaW1lLCAwLjU1KSk7CiAgY29uc3QgbWF4TGlmZVRpbWUgPSBNYXRoLm1heChtaW5MaWZlVGltZSwgbnVtKGVtaXR0ZXIubWF4TGlmZVRpbWUsIG1pbkxpZmVUaW1lKSk7CiAgc3lzdGVtLm1pbkxpZmVUaW1lID0gZGV0ZXJtaW5pc3RpYyA/IG1pZHBvaW50KG1pbkxpZmVUaW1lLCBtYXhMaWZlVGltZSkgOiBtaW5MaWZlVGltZTsKICBzeXN0ZW0ubWF4TGlmZVRpbWUgPSBkZXRlcm1pbmlzdGljID8gc3lzdGVtLm1pbkxpZmVUaW1lIDogbWF4TGlmZVRpbWU7CiAgY29uc3QgbWluRW1pdFBvd2VyID0gTWF0aC5tYXgoMCwgbnVtKGVtaXR0ZXIubWluRW1pdFBvd2VyLCAxKSAqIHNjYWxlKTsKICBjb25zdCBtYXhFbWl0UG93ZXIgPSBNYXRoLm1heChtaW5FbWl0UG93ZXIsIG51bShlbWl0dGVyLm1heEVtaXRQb3dlciwgbWluRW1pdFBvd2VyKSAqIHNjYWxlKTsKICBzeXN0ZW0ubWluRW1pdFBvd2VyID0gZGV0ZXJtaW5pc3RpYyA/IG1pZHBvaW50KG1pbkVtaXRQb3dlciwgbWF4RW1pdFBvd2VyKSA6IG1pbkVtaXRQb3dlcjsKICBzeXN0ZW0ubWF4RW1pdFBvd2VyID0gZGV0ZXJtaW5pc3RpYyA/IHN5c3RlbS5taW5FbWl0UG93ZXIgOiBtYXhFbWl0UG93ZXI7CiAgc3lzdGVtLnVwZGF0ZVNwZWVkID0gTWF0aC5tYXgoMC4wMDAwMSwgbnVtKGVtaXR0ZXIudXBkYXRlU3BlZWQsIEJBQllMT05fUEFSVElDTEVfVVBEQVRFX1NQRUVEX1VOSVQpKTsKICBzeXN0ZW0uZ3Jhdml0eSA9IHJlYWRWZWMoQkFCWUxPTiwgZW1pdHRlci5ncmF2aXR5LCBuZXcgQkFCWUxPTi5WZWN0b3IzKDAsIC02LCAwKSkuc2NhbGUoc2NhbGUpOwogIHN5c3RlbS5lbWl0UmF0ZSA9IE1hdGgubWF4KDAsIG51bShlbWl0dGVyLmVtaXRSYXRlLCAwKSk7CiAgaWYgKHN5c3RlbS5lbWl0UmF0ZSA8PSAwKSBzeXN0ZW0ubWFudWFsRW1pdENvdW50ID0gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZChudW0oZW1pdHRlci5tYW51YWxFbWl0Q291bnQsIDApKSk7CgogIGNvbnN0IGNvbG9ycyA9IHBhcnRpY2xlQ29sb3JzKEJBQllMT04sIGVtaXR0ZXIpOwogIHN5c3RlbS5jb2xvcjEgPSBjb2xvcnMuY29sb3IxOwogIHN5c3RlbS5jb2xvcjIgPSBjb2xvcnMuY29sb3IyOwogIHN5c3RlbS5jb2xvckRlYWQgPSBjb2xvcnMuY29sb3JEZWFkOwogIGNvbnN0IG1pbkluaXRpYWxSb3RhdGlvbiA9IG51bShlbWl0dGVyLm1pbkluaXRpYWxSb3RhdGlvbiwgMCk7CiAgY29uc3QgbWF4SW5pdGlhbFJvdGF0aW9uID0gTWF0aC5tYXgobWluSW5pdGlhbFJvdGF0aW9uLCBudW0oZW1pdHRlci5tYXhJbml0aWFsUm90YXRpb24sIG1pbkluaXRpYWxSb3RhdGlvbikpOwogIHN5c3RlbS5taW5Jbml0aWFsUm90YXRpb24gPSBkZXRlcm1pbmlzdGljID8gbWlkcG9pbnQobWluSW5pdGlhbFJvdGF0aW9uLCBtYXhJbml0aWFsUm90YXRpb24pIDogbWluSW5pdGlhbFJvdGF0aW9uOwogIHN5c3RlbS5tYXhJbml0aWFsUm90YXRpb24gPSBkZXRlcm1pbmlzdGljID8gc3lzdGVtLm1pbkluaXRpYWxSb3RhdGlvbiA6IG1heEluaXRpYWxSb3RhdGlvbjsKICBjb25zdCBtaW5Bbmd1bGFyU3BlZWQgPSBudW0oZW1pdHRlci5taW5Bbmd1bGFyU3BlZWQsIDApOwogIGNvbnN0IG1heEFuZ3VsYXJTcGVlZCA9IE1hdGgubWF4KG1pbkFuZ3VsYXJTcGVlZCwgbnVtKGVtaXR0ZXIubWF4QW5ndWxhclNwZWVkLCBtaW5Bbmd1bGFyU3BlZWQpKTsKICBzeXN0ZW0ubWluQW5ndWxhclNwZWVkID0gZGV0ZXJtaW5pc3RpYyA/IG1pZHBvaW50KG1pbkFuZ3VsYXJTcGVlZCwgbWF4QW5ndWxhclNwZWVkKSA6IG1pbkFuZ3VsYXJTcGVlZDsKICBzeXN0ZW0ubWF4QW5ndWxhclNwZWVkID0gZGV0ZXJtaW5pc3RpYyA/IHN5c3RlbS5taW5Bbmd1bGFyU3BlZWQgOiBtYXhBbmd1bGFyU3BlZWQ7CgogIGNvbnN0IG5leHRCaWxsYm9hcmRNb2RlID0gYmlsbGJvYXJkTW9kZShCQUJZTE9OLCBlbWl0dGVyLmJpbGxib2FyZE1vZGUpOwogIGlmIChuZXh0QmlsbGJvYXJkTW9kZSAhPT0gdW5kZWZpbmVkKSBzeXN0ZW0uYmlsbGJvYXJkTW9kZSA9IG5leHRCaWxsYm9hcmRNb2RlOwoKICBhcHBseUVtaXR0ZXJTaGFwZShCQUJZTE9OLCBzeXN0ZW0sIGVtaXR0ZXIpOwogIGFwcGx5U3ByaXRlU2hlZXQoc3lzdGVtLCBlbWl0dGVyKTsKICBhZGRHcmFkaWVudHMoQkFCWUxPTiwgc3lzdGVtLCBlbWl0dGVyLCBzeXN0ZW0uY29sb3IxKTsKCiAgY29uc3QgcHJldmlldyA9IHsKICAgIHN0YXJ0OiAoKSA9PiBzeXN0ZW0uc3RhcnQoKSwKICAgIHN0b3A6ICgpID0+IHN5c3RlbS5zdG9wKCksCiAgICBkaXNwb3NlOiAoKSA9PiBzeXN0ZW0uZGlzcG9zZSgpLAogICAgaXNTdGFydGVkOiAoKSA9PiBzeXN0ZW0uaXNTdGFydGVkKCksCiAgICBkdXJhdGlvbjogcnVudGltZUR1cmF0aW9uKGVtaXR0ZXIpLAogICAgc3lzdGVtLAogIH07CiAgaWYgKHNob3VsZFN0YXJ0KSBwcmV2aWV3LnN0YXJ0KCk7CiAgcmV0dXJuIHByZXZpZXc7Cn0K";
608
+ const dustTextureUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAK+SURBVHhe7dFRblQxEETR7H95bGhQkIJGo0MQEOFuV32cn6vnJ7v77fF4VDDGysFYORgrB2PlYKwcjJWDsXIwVg7GysFYORgrB2PlYKwcjJWDsXIwVg7GysFYORgrB2PlYKwcjJWDsXIwVg7GysFYORgrB2PlYKwcjJWDsXIwVg7GysFYORgrB2PlYKwcjJWDsXIwVg7GysFYORgrB2PlYKwcjJWDsegb2nqM9dP70kXfrsRYP2jxz3RmHcbiwl/p3DqM4bRs0dl1GBf6qsU8/+czOrsS4xJazCudE539jP6xEuNwWsjvfMU/Prz+azXGwbSQ/033WotxKC3jBN1tLcahtIwTdLe1GAfSIk7SHVdiHEhLOE33XIdxIC1gAt11FcaBNPxpdO/xGAfSwKfTO8ZhHEgD3kBvGYVxIA13C71nDMZhNNRt9K4RGAfRMDfS20ZgHEKD3ExvPI7xMA3vBnrrcYwHaXC30HuPYzxEQ7uJ3nwc4yEa2k305uMYD9HQbqH3jsB4kIa3nd45BuNhGuJWet8ojENooJvoTeMwDqPhTqd3jMQ4lAY9ke4+FuNgGvg0uvdYjINp4JPozqMxDqfBT6H7jsY4nAY/he47GuMCGv4EuutojAto+BPorqMxLqDhT6C7jsa4gIY/ge46GuMCGv4EuutojMNp8BPoruMxDqfhn6Q7rsE4mBbwSuc+6Pu/oX+vxDiYlvFMZ57pzJ/QP1djHExL+aDvX+nc7+g/12Ac7l8W9Hr2Mzp/HcZLacm/ovNXYryUFi06ey3GS2nZr3TuaoyX0sJf6dzVGC+lhT/TmesxXkyLf6dvIzBWDsbKwVg5GCsHY+VgrByMlYOxcjBWDsbKwVg5GCsHY+VgrByMlYOxcjBWDsbKwVg5GCsHY+VgrByMlYOxcjBWDsbKwVg5GCsHY6V4vH0HJ/7KUz+h13IAAAAASUVORK5CYII=";
609
+ const chipTextureUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADQSURBVHhe5c+xDQJBEARB8s+SSJ4ECoQ067VRTv+fVvN6nieNsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGEsYSxhLGE8cgb/v1P9HbGeEQjFroxYzyiEQvdmDEe0YiFbswYj2jEQjdmjEc0YqEbM8YjGrHQjRnjMY355td7fZsxljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwljCWMJYwdjyvD0XIVOXyU86OAAAAAElFTkSuQmCC";
610
+ const DEFAULT_PARAMS = {
611
+ lifetime: 0.78,
612
+ scale: 1.9,
613
+ initialHeight: 0.35,
614
+ dustCount: 19,
615
+ fragmentCount: 10,
616
+ dustColor: { r: 0.9176470588235294, g: 0.8196078431372549, b: 0.5725490196078431 },
617
+ fragmentColor: { r: 0.9607843137254902, g: 0.7803921568627451, b: 0.4392156862745098 },
618
+ dustSize: 1,
619
+ fragmentSize: 4,
620
+ dustLifetime: 0.62,
621
+ fragmentLifetime: 0.38,
622
+ dustSpeed: 0.88,
623
+ fragmentSpeed: 1.65,
624
+ fragmentSpread: 1
625
+ };
626
+ const woodCutterSawdustEffectPackage = createWoodSawdustEffectPackage({
627
+ id: "wood-cutter-sawdust",
628
+ nameZh: "切割机木粉",
629
+ manifest,
630
+ runtimeUrl,
631
+ assetUrls: {
632
+ "assets/textures/wood_cutter_sawdust_dust.png": dustTextureUrl,
633
+ "assets/textures/wood_cutter_sawdust_chip.png": chipTextureUrl
634
+ },
635
+ sourceEmitters: manifest.emitters,
636
+ dustEmitterName: "wood_cutter_sawdust_dust",
637
+ fragmentEmitterName: "wood_cutter_sawdust_chip",
638
+ fragmentLabel: "浅色碎屑",
639
+ fragmentCountLabel: "浅色碎屑数量",
640
+ fragmentSizeLabel: "浅色碎屑大小",
641
+ fragmentColorLabel: "浅色碎屑颜色",
642
+ fragmentSpeedLabel: "浅色碎屑飞溅速度",
643
+ fragmentSpreadLabel: "浅色碎屑散开幅度",
644
+ defaultParams: DEFAULT_PARAMS
645
+ });
646
+ export {
647
+ woodCutterSawdustEffectPackage
648
+ };