@fps-games/vfx 0.3.2 → 0.3.3

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 (231) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/package.json +5 -4
  3. package/tooling/vfx-cli.mjs +8 -1
  4. package/docs/AUTHORING_EFFECTS.md +0 -297
  5. package/docs/INTEGRATION.md +0 -194
  6. package/docs/VFX_LIBRARY_ARCHITECTURE_chatgpt.md +0 -1580
  7. package/docs/VFX_LIBRARY_EXECUTION_PLAN.md +0 -229
  8. package/docs/VFX_LIBRARY_PLAN.md +0 -546
  9. package/docs/hit-flash-red-method.md +0 -155
  10. package/docs/treasure_attention_fx_babylonjs_guide.md +0 -901
  11. package/docs/vfx-ab/RESULTS.md +0 -35
  12. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/after.png +0 -0
  13. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/before.png +0 -0
  14. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/after.png +0 -0
  15. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/before.png +0 -0
  16. package/docs/vfx-integration_chatgpt.md +0 -462
  17. package/docs/vfx-placement-design.md +0 -164
  18. package/docs/weapon-trail-visualization.html +0 -241
  19. package/packages/EffectPackageService.ts +0 -346
  20. package/packages/SceneVfxService.ts +0 -96
  21. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/runtime/simpleMeshEffect.v1.js +0 -333
  22. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.frag.glsl +0 -25
  23. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.vert.glsl +0 -11
  24. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/textures/effect_jianbian.png +0 -0
  25. package/packages/build.mesh.yellow_build_upgrade_indicator/effect.json +0 -927
  26. package/packages/build.mesh.yellow_build_upgrade_indicator/media/contact-sheet.png +0 -0
  27. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.gif +0 -0
  28. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.mp4 +0 -0
  29. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.webm +0 -0
  30. package/packages/build.mesh.yellow_build_upgrade_indicator/media/thumbnail.png +0 -0
  31. package/packages/build.mesh.yellow_build_upgrade_indicator/metadata/description.json +0 -197
  32. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-effect.original.json +0 -895
  33. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-normalized-vfx-to-babylon-report.json +0 -241
  34. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-overrides.json +0 -542
  35. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-tuning-report.json +0 -69
  36. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/asset-map.json +0 -125
  37. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/lineage.json +0 -44
  38. package/packages/build.particle.golden_upgrade_starburst/assets/runtime/particleEmitter.v1.js +0 -210
  39. package/packages/build.particle.golden_upgrade_starburst/assets/textures/effect_guangdian.png +0 -0
  40. package/packages/build.particle.golden_upgrade_starburst/effect.json +0 -880
  41. package/packages/build.particle.golden_upgrade_starburst/media/contact-sheet.png +0 -0
  42. package/packages/build.particle.golden_upgrade_starburst/media/preview.gif +0 -0
  43. package/packages/build.particle.golden_upgrade_starburst/media/preview.mp4 +0 -0
  44. package/packages/build.particle.golden_upgrade_starburst/media/preview.webm +0 -0
  45. package/packages/build.particle.golden_upgrade_starburst/media/thumbnail.png +0 -0
  46. package/packages/build.particle.golden_upgrade_starburst/metadata/description.json +0 -161
  47. package/packages/build.particle.golden_upgrade_starburst/provenance/03-effect.original.json +0 -762
  48. package/packages/build.particle.golden_upgrade_starburst/provenance/03-normalized-vfx-to-babylon-report.json +0 -260
  49. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-overrides.json +0 -436
  50. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-tuning-report.json +0 -40
  51. package/packages/build.particle.golden_upgrade_starburst/provenance/asset-map.json +0 -115
  52. package/packages/build.particle.golden_upgrade_starburst/provenance/lineage.json +0 -40
  53. package/packages/build.particle.orange_upgrade_transform_sparks/assets/runtime/particleEmitter.v1.js +0 -210
  54. package/packages/build.particle.orange_upgrade_transform_sparks/assets/textures/b5b27ab1-e740-4398-b407-848fc2b2c897.png +0 -0
  55. package/packages/build.particle.orange_upgrade_transform_sparks/effect.json +0 -887
  56. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.gif +0 -0
  57. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.mp4 +0 -0
  58. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.webm +0 -0
  59. package/packages/build.particle.orange_upgrade_transform_sparks/media/thumbnail.png +0 -0
  60. package/packages/build.particle.orange_upgrade_transform_sparks/metadata/description.json +0 -179
  61. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-effect.original.json +0 -859
  62. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-normalized-vfx-to-babylon-report.json +0 -260
  63. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-overrides.json +0 -478
  64. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-tuning-report.json +0 -40
  65. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/asset-map.json +0 -114
  66. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/lineage.json +0 -41
  67. package/packages/build.particle.wood_chip_dust_burst/assets/runtime/particleEmitter.v1.js +0 -210
  68. package/packages/build.particle.wood_chip_dust_burst/assets/textures/effect_yanwu4.png +0 -0
  69. package/packages/build.particle.wood_chip_dust_burst/assets/textures/suipian3.png +0 -0
  70. package/packages/build.particle.wood_chip_dust_burst/effect.json +0 -1400
  71. package/packages/build.particle.wood_chip_dust_burst/media/contact-sheet.png +0 -0
  72. package/packages/build.particle.wood_chip_dust_burst/media/preview.gif +0 -0
  73. package/packages/build.particle.wood_chip_dust_burst/media/preview.mp4 +0 -0
  74. package/packages/build.particle.wood_chip_dust_burst/media/preview.webm +0 -0
  75. package/packages/build.particle.wood_chip_dust_burst/media/thumbnail.png +0 -0
  76. package/packages/build.particle.wood_chip_dust_burst/metadata/description.json +0 -173
  77. package/packages/build.particle.wood_chip_dust_burst/provenance/03-effect.original.json +0 -1277
  78. package/packages/build.particle.wood_chip_dust_burst/provenance/03-normalized-vfx-to-babylon-report.json +0 -329
  79. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-overrides.json +0 -749
  80. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-tuning-report.json +0 -60
  81. package/packages/build.particle.wood_chip_dust_burst/provenance/asset-map.json +0 -146
  82. package/packages/build.particle.wood_chip_dust_burst/provenance/lineage.json +0 -69
  83. package/packages/effects/building-upgrade/effect.json +0 -6
  84. package/packages/effects/building-upgrade/index.ts +0 -387
  85. package/packages/effects/character-entrance/effect.json +0 -6
  86. package/packages/effects/character-entrance/index.ts +0 -308
  87. package/packages/effects/coin-burst/index.ts +0 -48
  88. package/packages/effects/comet-trail-flame/assets/textures/trail_5x4.webp +0 -0
  89. package/packages/effects/comet-trail-flame/index.ts +0 -107
  90. package/packages/effects/conveyor-upgrade/effect.json +0 -6
  91. package/packages/effects/conveyor-upgrade/index.ts +0 -401
  92. package/packages/effects/debris-smoke/assets/models/rock_debris.glb +0 -0
  93. package/packages/effects/debris-smoke/assets/textures/smoke22.webp +0 -0
  94. package/packages/effects/debris-smoke/index.ts +0 -102
  95. package/packages/effects/door_open_gold_flakes/assets/runtime/goldFlakes.v1.js +0 -397
  96. package/packages/effects/door_open_gold_flakes/door_open_gold_flakes.json +0 -498
  97. package/packages/effects/door_open_gold_flakes/index.ts +0 -11
  98. package/packages/effects/electric-arc/assets/textures/spark_4x4.webp +0 -0
  99. package/packages/effects/electric-arc/index.ts +0 -63
  100. package/packages/effects/energy-shield/effect.json +0 -7
  101. package/packages/effects/energy-shield/index.ts +0 -432
  102. package/packages/effects/explosion/assets/textures/baozha29.webp +0 -0
  103. package/packages/effects/explosion/assets/textures/glow01.webp +0 -0
  104. package/packages/effects/explosion/assets/textures/lizi01.webp +0 -0
  105. package/packages/effects/explosion/assets/textures/xulie_lizibaozha02_5x5.webp +0 -0
  106. package/packages/effects/explosion/index.ts +0 -115
  107. package/packages/effects/ground-tile-upgrade/effect.json +0 -6
  108. package/packages/effects/ground-tile-upgrade/index.ts +0 -410
  109. package/packages/effects/hit-flash/index.ts +0 -77
  110. package/packages/effects/laser-beam/assets/textures/laser_glow.webp +0 -0
  111. package/packages/effects/laser-beam/assets/textures/laser_noise.webp +0 -0
  112. package/packages/effects/laser-beam/index.ts +0 -6
  113. package/packages/effects/laser-beam-factory.ts +0 -146
  114. package/packages/effects/lumber-cart-suction/effect.json +0 -6
  115. package/packages/effects/lumber-cart-suction/index.ts +0 -399
  116. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb +0 -0
  117. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/.active +0 -1
  118. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/1781589063890_upload.glb +0 -0
  119. package/packages/effects/lumber-debris-scatter/assets/runtime/solidParticleScatter.v1.js +0 -236
  120. package/packages/effects/lumber-debris-scatter/effect.json +0 -228
  121. package/packages/effects/lumber-debris-scatter/index.ts +0 -780
  122. package/packages/effects/lumber_vehicle_gear_spin/assets/runtime/gearSpin.v1.js +0 -202
  123. package/packages/effects/lumber_vehicle_gear_spin/index.ts +0 -11
  124. package/packages/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json +0 -338
  125. package/packages/effects/lumber_vehicle_upgrade_aura/assets/runtime/upgradeAura.v1.js +0 -353
  126. package/packages/effects/lumber_vehicle_upgrade_aura/index.ts +0 -13
  127. package/packages/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json +0 -365
  128. package/packages/effects/lumber_vehicle_wood_chips/assets/runtime/solidParticleScatter.v1.js +0 -310
  129. package/packages/effects/lumber_vehicle_wood_chips/index.ts +0 -11
  130. package/packages/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json +0 -335
  131. package/packages/effects/monster-hit/index.ts +0 -129
  132. package/packages/effects/player-upgrade/effect.json +0 -6
  133. package/packages/effects/player-upgrade/index.ts +0 -640
  134. package/packages/effects/pulse-laser-volley/assets/textures/bolt_guangshu.webp +0 -0
  135. package/packages/effects/pulse-laser-volley/index.ts +0 -215
  136. package/packages/effects/resource-collect-sparkles/effect.json +0 -6
  137. package/packages/effects/resource-collect-sparkles/index.ts +0 -254
  138. package/packages/effects/run-footstep-dust/assets/runtime/runFootstepDust.v1.js +0 -215
  139. package/packages/effects/run-footstep-dust/effect.json +0 -183
  140. package/packages/effects/run-footstep-dust/index.ts +0 -377
  141. package/packages/effects/space-shared.ts +0 -120
  142. package/packages/effects/thruster-flame/index.ts +0 -306
  143. package/packages/effects/treasure-attention/effect.json +0 -7
  144. package/packages/effects/treasure-attention/index.ts +0 -630
  145. package/packages/effects/tree-chop-dust/assets/textures/tree_chop_dust_atlas.png +0 -0
  146. package/packages/effects/tree-chop-dust/effect.json +0 -8
  147. package/packages/effects/tree-chop-dust/index.ts +0 -202
  148. package/packages/effects/tree-leaf-chop-burst/assets/runtime/particleEmitter.v1.js +0 -303
  149. package/packages/effects/tree-leaf-chop-burst/assets/textures/tree_leaf_chop_burst_leaf_atlas.png +0 -0
  150. package/packages/effects/tree-leaf-chop-burst/effect.json +0 -498
  151. package/packages/effects/tree-leaf-chop-burst/index.ts +0 -294
  152. package/packages/effects/tree_chop_dust_burst/assets/runtime/particleEmitter.v1.js +0 -318
  153. package/packages/effects/tree_chop_dust_burst/assets/textures/tree_chop_dust_burst_dust.png +0 -0
  154. package/packages/effects/tree_chop_dust_burst/index.ts +0 -13
  155. package/packages/effects/tree_chop_dust_burst/tree_chop_dust_burst.json +0 -412
  156. package/packages/effects/ufo-thread-flame/assets/textures/flame_flow.webp +0 -0
  157. package/packages/effects/ufo-thread-flame/assets/textures/flame_spike.webp +0 -0
  158. package/packages/effects/ufo-thread-flame/index.ts +0 -153
  159. package/packages/effects/vehicle-exhaust-smoke/assets/textures/vehicle_exhaust_smoke_atlas.png +0 -0
  160. package/packages/effects/vehicle-exhaust-smoke/effect.json +0 -8
  161. package/packages/effects/vehicle-exhaust-smoke/index.ts +0 -298
  162. package/packages/effects/vehicle-upgrade/effect.json +0 -6
  163. package/packages/effects/vehicle-upgrade/index.ts +0 -404
  164. package/packages/effects/weapon-trail/assets/textures/trail_wedge.png +0 -0
  165. package/packages/effects/weapon-trail/index.ts +0 -317
  166. package/packages/effects/wood-crusher-sawdust/assets/runtime/particleEmitter.v1.js +0 -312
  167. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  168. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  169. package/packages/effects/wood-crusher-sawdust/index.ts +0 -43
  170. package/packages/effects/wood-crusher-sawdust/wood_crusher_sawdust.json +0 -592
  171. package/packages/effects/wood-cutter-sawdust/assets/runtime/particleEmitter.v1.js +0 -312
  172. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  173. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  174. package/packages/effects/wood-cutter-sawdust/index.ts +0 -43
  175. package/packages/effects/wood-cutter-sawdust/wood_cutter_sawdust.json +0 -592
  176. package/packages/effects/wood-sawdust-effect-factory.ts +0 -194
  177. package/packages/effects/wood_crusher_sawdust/assets/runtime/particleEmitter.v1.js +0 -318
  178. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  179. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  180. package/packages/effects/wood_crusher_sawdust/index.ts +0 -29
  181. package/packages/effects/wood_crusher_sawdust/wood_crusher_sawdust.json +0 -592
  182. package/packages/effects/wood_cutter_sawdust/assets/runtime/particleEmitter.v1.js +0 -318
  183. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  184. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  185. package/packages/effects/wood_cutter_sawdust/index.ts +0 -29
  186. package/packages/effects/wood_cutter_sawdust/wood_cutter_sawdust.json +0 -592
  187. package/packages/effects/wood_peel_material_test/assets/runtime/woodPeelMaterialTest.v1.js +0 -196
  188. package/packages/effects/wood_peel_material_test/index.ts +0 -11
  189. package/packages/effects/wood_peel_material_test/wood_peel_material_test.json +0 -136
  190. package/packages/env.particle.forest_edge_fog/assets/runtime/particleEmitter.v1.js +0 -210
  191. package/packages/env.particle.forest_edge_fog/assets/textures/f12a23c4-b924-4322-a260-3d982428f1e8.png +0 -0
  192. package/packages/env.particle.forest_edge_fog/assets/textures/yuan.png +0 -0
  193. package/packages/env.particle.forest_edge_fog/effect.json +0 -854
  194. package/packages/env.particle.forest_edge_fog/media/preview.gif +0 -0
  195. package/packages/env.particle.forest_edge_fog/media/preview.mp4 +0 -0
  196. package/packages/env.particle.forest_edge_fog/media/preview.webm +0 -0
  197. package/packages/env.particle.forest_edge_fog/media/thumbnail.png +0 -0
  198. package/packages/env.particle.forest_edge_fog/metadata/description.json +0 -148
  199. package/packages/env.particle.forest_edge_fog/provenance/03-effect.original.json +0 -827
  200. package/packages/env.particle.forest_edge_fog/provenance/03-normalized-vfx-to-babylon-report.json +0 -196
  201. package/packages/env.particle.forest_edge_fog/provenance/04-preview-overrides.json +0 -432
  202. package/packages/env.particle.forest_edge_fog/provenance/04-preview-tuning-report.json +0 -28
  203. package/packages/env.particle.forest_edge_fog/provenance/asset-map.json +0 -124
  204. package/packages/env.particle.forest_edge_fog/provenance/lineage.json +0 -41
  205. package/packages/generation.ts +0 -14
  206. package/packages/index.ts +0 -14
  207. package/packages/legacy-particle-runtime.ts +0 -113
  208. package/packages/manifestRuntimePackage.ts +0 -519
  209. package/packages/registry.ts +0 -85
  210. package/packages/rendering.ts +0 -13
  211. package/packages/resource.particle.viscous_oil_suction/assets/runtime/top_disk_suction/particleEmitter.v1.js +0 -424
  212. package/packages/resource.particle.viscous_oil_suction/assets/textures/Glow ad.png +0 -0
  213. package/packages/resource.particle.viscous_oil_suction/effect.json +0 -1254
  214. package/packages/resource.particle.viscous_oil_suction/media/preview.gif +0 -0
  215. package/packages/resource.particle.viscous_oil_suction/media/preview.mp4 +0 -0
  216. package/packages/resource.particle.viscous_oil_suction/media/preview.webm +0 -0
  217. package/packages/resource.particle.viscous_oil_suction/media/thumbnail.png +0 -0
  218. package/packages/resource.particle.viscous_oil_suction/metadata/description.json +0 -122
  219. package/packages/resource.particle.viscous_oil_suction/provenance/03-effect.original.json +0 -1051
  220. package/packages/resource.particle.viscous_oil_suction/provenance/03-normalized-vfx-to-babylon-report.json +0 -200
  221. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-overrides.json +0 -581
  222. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-tuning-report.json +0 -28
  223. package/packages/resource.particle.viscous_oil_suction/provenance/asset-map.json +0 -111
  224. package/packages/resource.particle.viscous_oil_suction/provenance/lineage.json +0 -45
  225. package/packages/types.ts +0 -195
  226. package/tooling/check-dist-runtime.mjs +0 -166
  227. package/tooling/generate-index.mjs +0 -55
  228. package/tooling/test-guardrails.mjs +0 -157
  229. package/tooling/validate-boundary.mjs +0 -92
  230. package/tooling/validate-effects.mjs +0 -304
  231. package/tooling/validate.mjs +0 -53
@@ -1,365 +0,0 @@
1
- {
2
- "schemaVersion": "vfx-effect-package/1.0",
3
- "id": "build.particle.lumber_vehicle_upgrade_aura",
4
- "name": {
5
- "zh": "螺旋状升级",
6
- "en": "Lumber Vehicle Upgrade Aura"
7
- },
8
- "source": {
9
- "engine": "babylon",
10
- "engineVersion": "8.56.2",
11
- "projectPath": "D:/project/lumber_order",
12
- "rootAsset": "src/assets/vfx/effects/lumber_vehicle_upgrade_aura",
13
- "sourceId": "lumber_order/lumber_vehicle_upgrade_aura",
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
- "assets": {
21
- "textures": [],
22
- "materials": [],
23
- "meshes": [],
24
- "shaders": [],
25
- "sounds": [],
26
- "scripts": [
27
- {
28
- "kind": "script",
29
- "id": "upgrade_aura_v1",
30
- "packagePath": "assets/runtime/upgradeAura.v1.js",
31
- "runtimeId": "upgradeAura/v1",
32
- "engine": "babylon",
33
- "moduleFormat": "esm",
34
- "exports": [
35
- "createUpgradeAuraRuntime",
36
- "runtimeContract"
37
- ],
38
- "mimeType": "text/javascript"
39
- }
40
- ],
41
- "raw": []
42
- },
43
- "emitters": [
44
- {
45
- "name": "lumber_vehicle_upgrade_aura_main",
46
- "sourceNodeName": "lumber_vehicle_upgrade_aura_main",
47
- "enabled": true,
48
- "type": "UpgradeAura",
49
- "duration": 1.45,
50
- "effectScale": 1,
51
- "spiralTurns": 3.4,
52
- "ringRadius": 0.72,
53
- "ringThickness": 0.035,
54
- "spiralHeight": 1.12,
55
- "ringRiseHeight": 1.45,
56
- "ringAlpha": 0.78,
57
- "spiralGlowAlpha": 0.08,
58
- "bodyRiseHeight": 1.75,
59
- "bodyGlowAlpha": 0.62,
60
- "sparkleCount": 24,
61
- "sparkleLife": 0.62,
62
- "sparkWidth": 0.045,
63
- "sparkHeight": 0.22,
64
- "sparkAlpha": 0.92,
65
- "ringColor": {
66
- "r": 1,
67
- "g": 0.78,
68
- "b": 0.14,
69
- "a": 1
70
- },
71
- "bodyGlowColor": {
72
- "r": 1,
73
- "g": 0.95,
74
- "b": 0.5,
75
- "a": 1
76
- },
77
- "hdrIntensity": 3,
78
- "runtime": {
79
- "adapter": "upgradeAura/v1",
80
- "stopAfterSeconds": 1.45,
81
- "disposeOnComplete": true
82
- }
83
- }
84
- ],
85
- "runtime": {
86
- "driver": "upgradeAura",
87
- "defaultMesh": null,
88
- "defaultOffset": {
89
- "x": 0,
90
- "y": 0,
91
- "z": 0
92
- },
93
- "start": [
94
- "Instantiate Babylon runtime for lumber_vehicle_upgrade_aura"
95
- ],
96
- "update": [
97
- "Apply Babylon tunable parameter overrides"
98
- ],
99
- "stop": [
100
- "Stop and dispose runtime resources"
101
- ],
102
- "adapters": [
103
- {
104
- "id": "upgradeAura/v1",
105
- "engine": "babylon",
106
- "entry": "assets/runtime/upgradeAura.v1.js",
107
- "moduleFormat": "esm",
108
- "exports": [
109
- "createUpgradeAuraRuntime",
110
- "runtimeContract"
111
- ]
112
- }
113
- ]
114
- },
115
- "tunableParams": [
116
- {
117
- "key": "lumber_vehicle_upgrade_aura.spiralTurns",
118
- "labelZh": "螺旋圈数",
119
- "type": "number",
120
- "default": 3.4,
121
- "min": 1,
122
- "max": 7,
123
- "step": 0.1,
124
- "target": {
125
- "emitter": "lumber_vehicle_upgrade_aura_main",
126
- "property": "spiralTurns",
127
- "operator": "set"
128
- }
129
- },
130
- {
131
- "key": "lumber_vehicle_upgrade_aura.sparkleCount",
132
- "labelZh": "上升光点数量",
133
- "type": "number",
134
- "default": 24,
135
- "min": 0,
136
- "max": 80,
137
- "step": 1,
138
- "target": {
139
- "emitter": "lumber_vehicle_upgrade_aura_main",
140
- "property": "sparkleCount",
141
- "operator": "set"
142
- }
143
- },
144
- {
145
- "key": "lumber_vehicle_upgrade_aura.ringColor",
146
- "labelZh": "螺旋颜色",
147
- "type": "color",
148
- "default": "#ffc723",
149
- "target": {
150
- "emitter": "lumber_vehicle_upgrade_aura_main",
151
- "property": "ringColor",
152
- "operator": "set"
153
- }
154
- },
155
- {
156
- "key": "lumber_vehicle_upgrade_aura.bodyGlowColor",
157
- "labelZh": "身体光效颜色",
158
- "type": "color",
159
- "default": "#fff280",
160
- "target": {
161
- "emitter": "lumber_vehicle_upgrade_aura_main",
162
- "property": "bodyGlowColor",
163
- "operator": "set"
164
- }
165
- },
166
- {
167
- "key": "lumber_vehicle_upgrade_aura.hdrIntensity",
168
- "labelZh": "HDR强度",
169
- "type": "number",
170
- "default": 3,
171
- "min": 0,
172
- "max": 8,
173
- "step": 0.01,
174
- "target": {
175
- "emitter": "lumber_vehicle_upgrade_aura_main",
176
- "property": "hdrIntensity",
177
- "operator": "set"
178
- }
179
- },
180
- {
181
- "key": "lumber_vehicle_upgrade_aura.effectScale",
182
- "labelZh": "整体缩放",
183
- "type": "number",
184
- "default": 1,
185
- "min": 0.2,
186
- "max": 4,
187
- "step": 0.01,
188
- "target": {
189
- "emitter": "lumber_vehicle_upgrade_aura_main",
190
- "property": "effectScale",
191
- "operator": "set"
192
- }
193
- },
194
- {
195
- "key": "lumber_vehicle_upgrade_aura.ringRadius",
196
- "labelZh": "螺旋半径",
197
- "type": "number",
198
- "default": 0.72,
199
- "min": 0.1,
200
- "max": 2,
201
- "step": 0.01,
202
- "target": {
203
- "emitter": "lumber_vehicle_upgrade_aura_main",
204
- "property": "ringRadius",
205
- "operator": "set"
206
- }
207
- },
208
- {
209
- "key": "lumber_vehicle_upgrade_aura.ringRiseHeight",
210
- "labelZh": "螺旋上升高度",
211
- "type": "number",
212
- "default": 1.45,
213
- "min": 0.1,
214
- "max": 4,
215
- "step": 0.01,
216
- "target": {
217
- "emitter": "lumber_vehicle_upgrade_aura_main",
218
- "property": "ringRiseHeight",
219
- "operator": "set"
220
- }
221
- },
222
- {
223
- "key": "lumber_vehicle_upgrade_aura.bodyRiseHeight",
224
- "labelZh": "身体光效高度",
225
- "type": "number",
226
- "default": 1.75,
227
- "min": 0.1,
228
- "max": 4,
229
- "step": 0.01,
230
- "target": {
231
- "emitter": "lumber_vehicle_upgrade_aura_main",
232
- "property": "bodyRiseHeight",
233
- "operator": "set"
234
- }
235
- },
236
- {
237
- "key": "lumber_vehicle_upgrade_aura.duration",
238
- "labelZh": "生命周期",
239
- "type": "number",
240
- "default": 1.45,
241
- "min": 0.2,
242
- "max": 5,
243
- "step": 0.01,
244
- "unit": "s",
245
- "target": {
246
- "emitter": "lumber_vehicle_upgrade_aura_main",
247
- "property": "duration",
248
- "operator": "set"
249
- }
250
- },
251
- {
252
- "key": "lumber_vehicle_upgrade_aura.sparkSize",
253
- "labelZh": "上升光点大小",
254
- "type": "number",
255
- "default": 1,
256
- "min": 0.2,
257
- "max": 4,
258
- "step": 0.01,
259
- "targets": [
260
- {
261
- "emitter": "lumber_vehicle_upgrade_aura_main",
262
- "property": "sparkWidth",
263
- "operator": "scaleDefault",
264
- "defaultValue": 0.045
265
- },
266
- {
267
- "emitter": "lumber_vehicle_upgrade_aura_main",
268
- "property": "sparkHeight",
269
- "operator": "scaleDefault",
270
- "defaultValue": 0.22
271
- }
272
- ]
273
- },
274
- {
275
- "key": "lumber_vehicle_upgrade_aura.ringAlpha",
276
- "labelZh": "螺旋透明度",
277
- "type": "number",
278
- "default": 0.78,
279
- "min": 0,
280
- "max": 1,
281
- "step": 0.01,
282
- "target": {
283
- "emitter": "lumber_vehicle_upgrade_aura_main",
284
- "property": "ringAlpha",
285
- "operator": "set"
286
- }
287
- },
288
- {
289
- "key": "lumber_vehicle_upgrade_aura.bodyGlowAlpha",
290
- "labelZh": "身体光效透明度",
291
- "type": "number",
292
- "default": 0.58,
293
- "min": 0,
294
- "max": 1,
295
- "step": 0.01,
296
- "target": {
297
- "emitter": "lumber_vehicle_upgrade_aura_main",
298
- "property": "bodyGlowAlpha",
299
- "operator": "set"
300
- }
301
- }
302
- ],
303
- "babylon": {
304
- "driver": "upgradeAura",
305
- "previewConfig": {
306
- "textureUrl": null,
307
- "emitterCount": 1,
308
- "effectFile": "lumber_vehicle_upgrade_aura.json",
309
- "normalizedVfx": null
310
- }
311
- },
312
- "debug": {
313
- "playAnchor": "player"
314
- },
315
- "review": {
316
- "status": "draft",
317
- "artistNotes": [
318
- "Upgrade effect with horizontal rings rising around the character.",
319
- "Body glow and small upward light streaks are driven by tunable runtime parameters.",
320
- "No texture dependency; all visuals are Babylon glow materials and primitive meshes."
321
- ],
322
- "approvedBy": null,
323
- "approvedAt": null
324
- },
325
- "recording": {
326
- "provider": "local-placeholder",
327
- "recordedAt": "2026-06-02T00:00:00.000Z",
328
- "mimeType": "image/png",
329
- "durationSec": 1.45,
330
- "fps": 0,
331
- "media": {
332
- "previewVideo": null,
333
- "previewWebm": null,
334
- "previewMp4": null,
335
- "previewGif": null,
336
- "thumbnail": "media/thumbnail.png",
337
- "contactSheet": "media/contact-sheet.png",
338
- "gcsUri": null
339
- }
340
- },
341
- "search": {
342
- "tags": [
343
- "babylon",
344
- "upgrade",
345
- "aura",
346
- "rising ring",
347
- "body glow",
348
- "lumber vehicle",
349
- "casual game"
350
- ],
351
- "descriptionEn": "A character upgrade aura with golden rising rings and vertical body light.",
352
- "useCases": [
353
- "lumber vehicle upgrade",
354
- "character upgrade feedback",
355
- "reward feedback"
356
- ],
357
- "negativeUseCases": [
358
- "wood cutting",
359
- "sawdust",
360
- "dust burst",
361
- "fire explosion"
362
- ]
363
- },
364
- "legacyIds": []
365
- }
@@ -1,310 +0,0 @@
1
- export const runtimeId = "solidParticleScatter/v1";
2
-
3
- export const runtimeContract = {
4
- runtimeId,
5
- kind: "solidParticleScatter",
6
- fields: {
7
- count: "Number of lumber pieces emitted per burst.",
8
- scatterMode: "vertical drops pieces downward; radial throws pieces from the emitter center outward.",
9
- outwardAngleDegrees: "Radial scatter fan angle in degrees, used only when scatterMode is radial.",
10
- scatterGravity: "Higher values pull pieces down sooner and reduce hang time.",
11
- rotationStrength: "Deterministic random rotation around each lumber piece center, not around the emitter.",
12
- effectScale: "Overall spatial scale for piece size, travel distance, and spawn height.",
13
- },
14
- };
15
-
16
- function num(value, fallback = 0) {
17
- const next = Number(value);
18
- return Number.isFinite(next) ? next : fallback;
19
- }
20
-
21
- function clamp(value, min, max) {
22
- return Math.min(max, Math.max(min, value));
23
- }
24
-
25
- function fract(value) {
26
- return value - Math.floor(value);
27
- }
28
-
29
- function sequence01(index, axis) {
30
- if (index === 0) return 0.5;
31
- const strides = [0.618033988749895, 0.414213562373095, 0.732050807568877, 0.324717957244746, 0.754877666246693, 0.569840290998053];
32
- return fract(0.5 + index * strides[axis % strides.length] + axis * 0.173205080756888);
33
- }
34
-
35
- function lerp(start, end, t) {
36
- return start + (end - start) * t;
37
- }
38
-
39
- function readVec(BABYLON, value, fallback = new BABYLON.Vector3(0, 0, 0)) {
40
- if (!value) return fallback;
41
- return new BABYLON.Vector3(num(value.x, fallback.x), num(value.y, fallback.y), num(value.z, fallback.z));
42
- }
43
-
44
- function readColor3(BABYLON, value, fallback = new BABYLON.Color3(1, 1, 1)) {
45
- if (!value) return fallback;
46
- return new BABYLON.Color3(num(value.r, fallback.r), num(value.g, fallback.g), num(value.b, fallback.b));
47
- }
48
-
49
- function rotateVecY(BABYLON, vector, rotationY = 0) {
50
- const sin = Math.sin(num(rotationY, 0));
51
- const cos = Math.cos(num(rotationY, 0));
52
- return new BABYLON.Vector3(
53
- vector.x * cos + vector.z * sin,
54
- vector.y,
55
- -vector.x * sin + vector.z * cos
56
- );
57
- }
58
-
59
- function applyRenderOrder(mesh, material, emitter) {
60
- mesh.renderingGroupId = Math.max(0, Math.round(num(emitter.renderingGroupId, 2)));
61
- mesh.alphaIndex = num(emitter.alphaIndex, 100);
62
- material.disableDepthWrite = emitter.disableDepthWrite !== false;
63
- }
64
-
65
- function splitUrl(url) {
66
- const slashIndex = url.lastIndexOf("/");
67
- if (slashIndex < 0) return { rootUrl: "", fileName: url };
68
- return { rootUrl: url.slice(0, slashIndex + 1), fileName: url.slice(slashIndex + 1) };
69
- }
70
-
71
- function createFallbackSourceMesh(BABYLON, scene, name, emitter = {}) {
72
- const primitive = emitter.primitive || {};
73
- if (primitive.type === "splinter") {
74
- return createSplinterSourceMesh(BABYLON, scene, name, emitter);
75
- }
76
-
77
- const source = BABYLON.MeshBuilder.CreateBox(name, {
78
- width: Math.max(0.001, num(primitive.width, 0.16)),
79
- height: Math.max(0.001, num(primitive.height, 0.018)),
80
- depth: Math.max(0.001, num(primitive.depth, 0.045)),
81
- }, scene);
82
- source.isVisible = false;
83
- source.setEnabled(false);
84
- return source;
85
- }
86
-
87
- function createSplinterSourceMesh(BABYLON, scene, name, emitter = {}) {
88
- const primitive = emitter.primitive || {};
89
- const width = Math.max(0.001, num(primitive.width, 0.1));
90
- const height = Math.max(0.001, num(primitive.height, 0.008));
91
- const depth = Math.max(0.001, num(primitive.depth, 0.02));
92
- const mesh = new BABYLON.Mesh(name, scene);
93
- const halfWidth = width * 0.5;
94
- const halfHeight = height * 0.5;
95
- const halfDepth = depth * 0.5;
96
- const positions = [
97
- -halfWidth, -halfHeight, -halfDepth,
98
- -halfWidth, halfHeight, -halfDepth,
99
- halfWidth, 0, -halfDepth,
100
- -halfWidth, -halfHeight, halfDepth,
101
- -halfWidth, halfHeight, halfDepth,
102
- halfWidth, 0, halfDepth,
103
- ];
104
- const indices = [
105
- 0, 1, 2,
106
- 3, 5, 4,
107
- 0, 3, 4,
108
- 0, 4, 1,
109
- 1, 4, 5,
110
- 1, 5, 2,
111
- 2, 5, 3,
112
- 2, 3, 0,
113
- ];
114
- const normals = [];
115
- BABYLON.VertexData.ComputeNormals(positions, indices, normals);
116
- const vertexData = new BABYLON.VertexData();
117
- vertexData.positions = positions;
118
- vertexData.indices = indices;
119
- vertexData.normals = normals;
120
- vertexData.applyToMesh(mesh);
121
- mesh.isVisible = false;
122
- mesh.setEnabled(false);
123
- return mesh;
124
- }
125
-
126
- async function loadSourceMesh(BABYLON, scene, emitter, urlForPackagePath) {
127
- const modelPath = emitter.modelPath;
128
- if (!modelPath || !BABYLON.SceneLoader) {
129
- return createFallbackSourceMesh(BABYLON, scene, `${emitter.name || "lumber_debris_scatter"}Source`, emitter);
130
- }
131
-
132
- try {
133
- const modelUrl = urlForPackagePath ? urlForPackagePath(modelPath) : modelPath;
134
- const { rootUrl, fileName } = splitUrl(modelUrl);
135
- const result = await BABYLON.SceneLoader.ImportMeshAsync("", rootUrl, fileName, scene);
136
- const meshes = result.meshes.filter((mesh) => mesh instanceof BABYLON.Mesh && mesh.getTotalVertices() > 0);
137
- if (!meshes.length) throw new Error(`No mesh was found in ${modelPath}.`);
138
- const source = meshes.length === 1 ? meshes[0] : BABYLON.Mesh.MergeMeshes(meshes, true, true, undefined, false, true);
139
- if (!source) throw new Error(`Unable to merge meshes from ${modelPath}.`);
140
- source.name = `${emitter.name || "lumber_debris_scatter"}ModelSource`;
141
- source.isVisible = false;
142
- source.setEnabled(false);
143
- source.refreshBoundingInfo();
144
- const size = source.getBoundingInfo().boundingBox.extendSize.scale(2);
145
- const maxDimension = Math.max(size.x, size.y, size.z, 0.0001);
146
- source.scaling.scaleInPlace(0.82 / maxDimension);
147
- source.rotationQuaternion = null;
148
- source.refreshBoundingInfo();
149
- return source;
150
- } catch (error) {
151
- console.warn("Unable to load lumber debris model; using box fallback.", error);
152
- return createFallbackSourceMesh(BABYLON, scene, `${emitter.name || "lumber_debris_scatter"}Source`, emitter);
153
- }
154
- }
155
-
156
- function createState(BABYLON, index, count, origin, emitter) {
157
- const effectScale = Math.max(0.01, num(emitter.effectScale, 1));
158
- const resourceScale = Math.max(0.01, num(emitter.resourceScale, 1));
159
- const speedScale = Math.max(0.1, num(emitter.speedScale, 1));
160
- const duration = Math.max(0.08, num(emitter.duration, 0.74)) / speedScale;
161
- const interval = Math.max(0, num(emitter.intervalMs, 18)) / 1000;
162
- const mode = emitter.scatterMode === "vertical" ? "vertical" : "radial";
163
- const spread = Math.max(0, num(emitter.spread, 0.88)) * effectScale;
164
- const gravity = Math.max(0.05, num(emitter.scatterGravity, 1));
165
- const rotationStrength = Math.max(0, num(emitter.rotationStrength, 1));
166
- const outwardAngleRadians = clamp(num(emitter.outwardAngleDegrees, 240), 0, 360) * (Math.PI / 180);
167
- const emissionDirection = rotateVecY(
168
- BABYLON,
169
- readVec(BABYLON, emitter.emissionDirection, new BABYLON.Vector3(1, 0, 0)),
170
- emitter.rotationY
171
- );
172
-
173
- const angleSeed = sequence01(index, 0);
174
- const radiusSeed = Math.sqrt(sequence01(index, 1));
175
- const sideSeed = sequence01(index, 2) < 0.5 ? -1 : 1;
176
- emissionDirection.y = 0;
177
- if (emissionDirection.lengthSquared() < 0.0001) emissionDirection.set(1, 0, 0);
178
- emissionDirection.normalize();
179
-
180
- const baseAngle = Math.atan2(emissionDirection.z, emissionDirection.x);
181
- const radialAngle = mode === "radial" && outwardAngleRadians < Math.PI * 2 - 0.001
182
- ? baseAngle + (angleSeed - 0.5) * outwardAngleRadians
183
- : angleSeed * Math.PI * 2;
184
- const scatterRadius = spread * (0.35 + radiusSeed * 0.65);
185
- const centerJitter = spread * 0.035;
186
- const startAngle = sequence01(index, 12) * Math.PI * 2;
187
- const startRadius = centerJitter * sequence01(index, 13);
188
- const startPos = new BABYLON.Vector3(
189
- origin.x + Math.cos(startAngle) * startRadius,
190
- origin.y + (0.12 + sequence01(index, 3) * 0.08) * effectScale,
191
- origin.z + Math.sin(startAngle) * startRadius
192
- );
193
- const rotationBase = Math.PI * 2 * rotationStrength;
194
- const particleDuration = duration * (0.88 + sequence01(index, 10) * 0.18);
195
- const gravityAccel = (5.4 + gravity * 2.1) * effectScale;
196
- const horizontalSpeed = scatterRadius / particleDuration;
197
- const verticalVelocity = (1.05 + sequence01(index, 14) * 0.72) * effectScale;
198
- const velocity = new BABYLON.Vector3(
199
- Math.cos(radialAngle) * horizontalSpeed,
200
- verticalVelocity,
201
- Math.sin(radialAngle) * horizontalSpeed
202
- );
203
-
204
- return {
205
- active: index < count,
206
- startPos,
207
- velocity,
208
- groundY: origin.y,
209
- startRotation: new BABYLON.Vector3((sequence01(index, 4) - 0.5) * rotationBase, (sequence01(index, 5) - 0.5) * rotationBase, (sequence01(index, 6) - 0.5) * rotationBase),
210
- rotationDelta: new BABYLON.Vector3(sideSeed * (2.6 + sequence01(index, 7) * 2.2) * rotationStrength, (sequence01(index, 8) - 0.5) * 7.2 * rotationStrength, sideSeed * (1.7 + sequence01(index, 9) * 2.8) * rotationStrength),
211
- duration: particleDuration,
212
- elapsed: -index * interval,
213
- gravityAccel,
214
- scale: resourceScale * effectScale * (0.68 + sequence01(index, 11) * 0.24),
215
- };
216
- }
217
-
218
- export async function createSolidParticleScatterRuntime({ BABYLON, scene, emitter, urlForPackagePath, shouldStart = false }) {
219
- if (!BABYLON) throw new Error("createSolidParticleScatterRuntime requires BABYLON.");
220
- if (!scene) throw new Error("createSolidParticleScatterRuntime requires scene.");
221
- if (!emitter) throw new Error("createSolidParticleScatterRuntime requires emitter.");
222
-
223
- const count = Math.max(0, Math.round(num(emitter.count ?? emitter.particleCount, 18)));
224
- const capacity = Math.max(8, Math.round(num(emitter.capacity, count)));
225
- const origin = readVec(BABYLON, emitter.origin, BABYLON.Vector3.Zero());
226
- const sps = new BABYLON.SolidParticleSystem(emitter.name || "lumber_debris_scatter", scene, { updatable: true, isPickable: false });
227
- const source = await loadSourceMesh(BABYLON, scene, emitter, urlForPackagePath);
228
- sps.addShape(source, capacity);
229
- source.dispose();
230
-
231
- const mesh = sps.buildMesh();
232
- mesh.isPickable = false;
233
- mesh.alwaysSelectAsActiveMesh = true;
234
- const material = new BABYLON.StandardMaterial(`${emitter.name || "lumber_debris_scatter"}Material`, scene);
235
- const materialConfig = emitter.material || {};
236
- material.diffuseColor = readColor3(BABYLON, materialConfig.diffuseColor, new BABYLON.Color3(0.52, 0.31, 0.13));
237
- material.emissiveColor = readColor3(BABYLON, materialConfig.emissiveColor, new BABYLON.Color3(0.08, 0.045, 0.02));
238
- material.specularColor = BABYLON.Color3.Black();
239
- mesh.material = material;
240
- applyRenderOrder(mesh, material, emitter);
241
-
242
- const states = Array.from({ length: capacity }, (_, index) => createState(BABYLON, index, count, origin, emitter));
243
- let activeCount = Math.min(count, capacity);
244
- let elapsed = 0;
245
- let started = false;
246
- const disposeAfter = Math.max(...states.map((state) => Math.max(0, -state.elapsed) + state.duration), 0) + 0.35;
247
-
248
- sps.updateParticle = (particle) => {
249
- const state = states[particle.idx];
250
- if (!state?.active || state.elapsed < 0) {
251
- particle.position.set(0, -9999, 0);
252
- particle.scaling.set(0, 0, 0);
253
- return particle;
254
- }
255
- const t = clamp(state.elapsed / state.duration, 0, 1);
256
- const elapsed = clamp(state.elapsed, 0, state.duration);
257
- const y = state.startPos.y + state.velocity.y * elapsed - 0.5 * state.gravityAccel * elapsed * elapsed;
258
- particle.position.set(
259
- state.startPos.x + state.velocity.x * elapsed,
260
- Math.max(state.groundY, y),
261
- state.startPos.z + state.velocity.z * elapsed
262
- );
263
- particle.rotation.set(state.startRotation.x + state.rotationDelta.x * t, state.startRotation.y + state.rotationDelta.y * t, state.startRotation.z + state.rotationDelta.z * t);
264
- particle.scaling.set(state.scale, state.scale, state.scale);
265
- return particle;
266
- };
267
- sps.setParticles();
268
-
269
- let observer = null;
270
- const start = () => {
271
- if (started) return;
272
- started = true;
273
- observer = scene.onBeforeRenderObservable.add(() => {
274
- const deltaTime = scene.getEngine().getDeltaTime() / 1000;
275
- elapsed += deltaTime;
276
- for (const state of states) {
277
- if (!state.active) continue;
278
- state.elapsed += deltaTime;
279
- if (state.elapsed >= state.duration) {
280
- state.active = false;
281
- activeCount = Math.max(0, activeCount - 1);
282
- }
283
- }
284
- sps.setParticles();
285
- if (activeCount <= 0 && elapsed >= disposeAfter) preview.dispose();
286
- });
287
- };
288
-
289
- const preview = {
290
- start,
291
- stop: () => {
292
- if (observer) scene.onBeforeRenderObservable.remove(observer);
293
- observer = null;
294
- started = false;
295
- },
296
- dispose: () => {
297
- if (observer) scene.onBeforeRenderObservable.remove(observer);
298
- observer = null;
299
- sps.dispose();
300
- material.dispose();
301
- },
302
- isStarted: () => started,
303
- duration: disposeAfter,
304
- mesh,
305
- sps,
306
- };
307
-
308
- if (shouldStart) start();
309
- return preview;
310
- }
@@ -1,11 +0,0 @@
1
- import manifest from './lumber_vehicle_wood_chips.json';
2
- import runtimeUrl from './assets/runtime/solidParticleScatter.v1.js?url';
3
- import { createManifestRuntimeEffectPackage } from '../../manifestRuntimePackage';
4
-
5
- export const lumberVehicleWoodChipsEffectPackage = createManifestRuntimeEffectPackage({
6
- id: 'lumber_vehicle_wood_chips',
7
- manifest,
8
- assetUrls: {
9
- 'assets/runtime/solidParticleScatter.v1.js': runtimeUrl,
10
- },
11
- });