@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,229 @@
1
+ # VFX 库集成 — 执行方案 (v1)
2
+
3
+ > 目标:把 `lumber-order` / `lumber-truck` 用到的特效统一进 `fps-vfx-library`(格式见 [`VFX_LIBRARY_PLAN.md`](./VFX_LIBRARY_PLAN.md) 的 `VfxEffectPackage` v1.1);把两个项目各隔离出一个「去特效」版本;用设计好的流程(`@fps/vfx-runtime` + glob 自动发现 + `vfx add`)把特效重新集成回去;做**前后视觉对比测试**,每项目 3 个特效,直到通过再给结论。
4
+ >
5
+ > 本方案基于对照真实代码的实地侦察(特效清单/触发点/去特效改动点/测试手段),所有文件:行引用均来自侦察结果。
6
+
7
+ ---
8
+
9
+ ## 0. 总策略:先在 6 个特效上跑通全链路,再批量铺开
10
+
11
+ 不一上来就迁移全部 23 个特效。**先用每项目 3 个代表性特效把「格式 → 统一进库 → 去特效 → 集成回来 → 前后对比」整条链路跑通**,验证格式与流程没问题后,再规模化迁移其余特效(Phase G)。理由:23 个里 20 个两项目实现不一致、共享基建已分叉(见 §6),全量迁移是高成本的逐个 canonical 裁定;若格式/流程有坑,在 6 个上暴露代价最低。
12
+
13
+ 链路:
14
+ ```
15
+ 原项目(保留, 作 before 基线)
16
+ └─(copy)→ 隔离版 ──去特效(service no-op)──集成库(@fps/vfx-runtime + vfx add + glob)──作 after
17
+
18
+ 原项目 before 截图 ─────────────── 前后同机位对比(固定相机 + 固定 spawn) ─── 隔离版 after 截图
19
+ ```
20
+
21
+ ---
22
+
23
+ ## 1. 关键决策与假设(先确认)
24
+
25
+ | 项 | 决策 | 说明 |
26
+ |---|------|------|
27
+ | 格式 | `VfxEffectPackage` v1.1(已定) | 每特效出 `index.ts` 导出 package;data 用薄包装调 `createDataDrivenEffectPackage`,code 手写 `create()`。见 `VFX_LIBRARY_PLAN.md` §4。 |
28
+ | 隔离版形态 | **git 分支**(已定) | 各项目 repo 建分支 `vfx-library-integration`。before = 基线分支(原特效),after = 集成分支。**顺序采集**(先在基线分支采 before,再切集成分支采 after,复用同端口)。 |
29
+ | before 基线来源 | **基线分支当前实现** | 不需要先去特效才能拿 before——before 就是原特效在基线分支跑出来的样子。 |
30
+ | 去特效方式 | **service 边界 no-op**(非删目录) | 单点改动、可编译、可 `git revert`。见 §7。 |
31
+ | canonical 选择 | 项目独有特效取该项目版;**共享特效 `vehicle-exhaust-smoke` 取 order 版**并在两项目都验 | 见 §6。 |
32
+ | 测试触发 | `game.playEffectPackage(id, params, 固定世界坐标)` + 锁相机 | 见 §8。 |
33
+ | 运行 | 必须 `pnpm dev`(debug 面板 / data 特效只在 DEV 编入) | order:3006 / truck:3007;before/after 顺序跑,复用同端口。 |
34
+
35
+ > 决策已确认(2026-06-26):隔离用 git 分支;6 个测试特效见 §2;先跑 6 个;`vehicle-exhaust-smoke` canonical 取 order 版。
36
+
37
+ ---
38
+
39
+ ## 2. 选定的测试特效(每项目 3 个,共 5 个库包——含 1 个跨项目复用)
40
+
41
+ 刻意覆盖 **code 粒子 / code+mesh+GLB / data manifest / 特殊时机 bespoke / 跨项目复用** 五种情形:
42
+
43
+ ### lumber-order(3)
44
+
45
+ | 特效 id | 类型 | 现状触发(file:line) | 强制触发(简化测试) |
46
+ |---|---|---|---|
47
+ | `vehicle-exhaust-smoke` | code 粒子,**跟随型** | 顾客卡车进队列即播并挂车 `CustomerTruckQueueSystem.ts:309` | 进场后 `playEffectPackage('vehicle-exhaust-smoke', {}, 固定坐标)`,持续粒子,天然稳定 |
48
+ | `lumber-debris-scatter` | **code + mesh + GLB** | worker 砍倒树 `WorkerAutomationSystem.ts:2170`(GLB `ImportMeshAsync` index.ts:459 + Box fallback :496) | dev 钩子 `setInterval(()=>gameInstance.playEffectPackage('lumber-debris-scatter',{},坐标),2000)`——验证 mesh+GLB 装载路径 |
49
+ | `tree_chop_dust_burst` | **data / manifest** | 仅面板预览(debug-only,无游戏触发) | 面板 Play 或 dev 钩子 `playEffectPackage('tree_chop_dust_burst')`——验证 data adapter 管线 |
50
+
51
+ ### lumber-truck(3)
52
+
53
+ | 特效 id | 类型 | 现状触发(file:line) | 强制触发(简化测试) |
54
+ |---|---|---|---|
55
+ | `intro-tree-grow-smoke` | **code,bespoke,特殊时机** | 开场进场动画逐行播 `LumberIntroTreeAnimationSystem.ts:304`(`src/vfx/intro-tree-grow-smoke.ts`,**不在注册表**) | 正是用户说的「特殊时机」典型。集成时**封装成 code VfxEffectPackage**;测试用 dev 钩子进场即在固定锚点播/循环 |
56
+ | `wood_crusher_sawdust` | **data / manifest** | 剥皮机加工 `LumberProductionSystem.ts:2346` | 面板 Play 或 dev 钩子 `playEffectPackage('wood_crusher_sawdust',{},坐标)`——data 管线 |
57
+ | `vehicle-exhaust-smoke` | code 粒子,跟随型 | 卡车进队列挂车 `TruckQueueSystem.ts:437` | 同 order——**与 order 复用同一个库包**,顺带验证「一个库包跨两项目复用」 |
58
+
59
+ **覆盖矩阵**:code 粒子 ✓、code+mesh+GLB ✓、data manifest ✓×2、bespoke 特殊时机 ✓、跨项目复用 ✓(`vehicle-exhaust-smoke` 一个库包两项目用)。
60
+
61
+ > 去重后实际需要进库的**库包 = 5 个**(`vehicle-exhaust-smoke` 共用):exhaust / lumber-debris-scatter / tree_chop_dust_burst / intro-tree-grow-smoke / wood_crusher_sawdust。
62
+
63
+ ---
64
+
65
+ ## 3. 阶段总览
66
+
67
+ | 阶段 | 名称 | 产出 | 验收 |
68
+ |---|---|---|---|
69
+ | P0 | 准备 + 基线截图 | 隔离版目录;原项目 6 特效的 before 截图/多帧 | before 资产齐全、机位/spawn 已固定记录 |
70
+ | P1 | 库核心 + 格式落地 | `@fps/vfx-runtime`(抽自 lumber-order,含已打补丁 adapter + glob `buildRegistry`) | 最小宿主能注册并播放 1 data + 1 code 包 |
71
+ | P2 | 统一 5 个测试库包 | `fps-vfx-library/packages/effects/<id>/`(含 index.ts/资源/参数/`?url` 映射)+ `index.json` | `validate-manifest` 通过;5 包 id 唯一 |
72
+ | P3 | 去特效(隔离版) | 两隔离版 service no-op,可编译可运行无特效 | `pnpm dev` 起得来、跑得动、零特效、无报错 |
73
+ | P4 | 集成库回隔离版 | 隔离版装 `@fps/vfx-runtime` + `vfx add` 6 特效 + glob 自动发现 + 面板挂载 | 面板下拉见到 6 特效、能 Play |
74
+ | P5 | 前后视觉对比测试 | 6 特效 before/after 截图对比 + 结论 | 见 §9 验收标准 |
75
+ | P6 | 迭代到通过 | 修问题直到 §9 全绿 | 给最终结论 |
76
+ | G | (后续)规模化 | 迁移其余特效、reconcile 分叉实现 | 不在本轮闭环 |
77
+
78
+ ---
79
+
80
+ ## 4. P0 — 准备 + 基线截图(关键:before 必须先采)
81
+
82
+ 1. **建隔离分支**(每个项目 repo 各建一个 git 分支 `vfx-library-integration`):
83
+ - `lumber-order-260525`、`lumber-truck` 各 `git checkout -b vfx-library-integration`。
84
+ - before = 基线分支当前 HEAD(原特效);after = 集成分支。
85
+ - 不同时跑两分支:**顺序**采集(基线分支采 before → 切集成分支采 after),复用同端口 3006/3007。
86
+ 2. **固定测试夹具(两边一致)**:每特效定死 ①视口 1280×720(可选 DPR2)②相机位姿(锁定 `cameraPanService` 不漂移 / 或用相机 debug 面板存一个固定 rig)③`spawnTransform` 固定世界坐标(绕开 playerRight/player 锚点漂移)④触发后到「关键帧」的等待方式(code 取确定性峰值帧;data 取多帧序列)。把这套夹具写成一个**可复用的 dev 钩子 + chrome-devtools 脚本**,before/after 共用。
87
+ 3. **采 before**:在**基线分支**(3006/3007,`pnpm dev`)用上述夹具触发并截图:
88
+ - code 特效(exhaust / debris / intro):单关键帧 `before.png`(确定性,后续可做 diff)。
89
+ - data 特效(tree_chop_dust_burst / wood_crusher_sawdust):多帧 `before-f01..f05.png`(非确定性)。
90
+ - 落盘:`benchmark-results/vfx-ab/<project>/<id>/before*.png`(沿用项目已有 `benchmark-results/ab-*` 命名惯例)。
91
+ 4. 记录每特效的夹具参数(相机 rig / spawn 坐标 / 帧时刻)到一个 `fixtures.json`,after 阶段原样复用。
92
+
93
+ > ⚠️ before 必须在任何改动前采;intro-tree-grow-smoke 的 before 走其现有 `playIntroTreeGrowSmoke`,在同一固定锚点触发。
94
+
95
+ ---
96
+
97
+ ## 5. P1 — 库核心 + 格式落地
98
+
99
+ 按 `VFX_LIBRARY_PLAN.md` §4–§7 抽取 `@fps/vfx-runtime`。**重点是吸收 lumber-order 已经打过的补丁,而非照搬旧库**:
100
+
101
+ 1. 从 `lumber-order-260525` 抽:`types.ts`(含 `VfxEffectHandle.ready?`)、`EffectPackageService.ts`、`SceneVfxService.ts`、`rendering.ts`、`manifestRuntimePackage.ts`(→ 改名导出 `createDataDrivenEffectPackage`)、已打补丁的 `adapters/*.v1.js`(读 `emitter.origin`,**非旧库世界原点版**)、通用面板 `runtime-vfx-debug-panel.ts`。
102
+ 2. 写 `buildRegistry`(纯函数,放库里;glob 调用留项目侧,见 `VFX_LIBRARY_PLAN.md` §6.3)。
103
+ 3. reconcile 共享基建分叉:`types.ts` / `manifestRuntimePackage.ts` / `wood-sawdust-effect-factory.ts` 两项目已 diff,选 lumber-truck 较新的运行时特性(`runtimeModules` / `debarker` 锚点)与 lumber-order 的 `VfxParamsFile`/`ready` 合并成单一版本。
104
+ 4. **验收**:最小 Babylon 宿主里注册并播放「1 个 data 包(tree_chop_dust_burst) + 1 个 code 包(vehicle-exhaust-smoke)」,各调一个参数生效、定位正确(data 不落世界原点)。
105
+
106
+ ---
107
+
108
+ ## 6. P2 — 统一 5 个测试库包进 fps-vfx-library
109
+
110
+ **这不是机械复制**(侦察结论:23 特效里 20 个两项目 `index.ts` 实现不一致)。对 5 个测试包逐个定 canonical:
111
+
112
+ | 库包 id(规范化) | canonical 来源 | 类型 | 要点 |
113
+ |---|---|---|---|
114
+ | `vehicle.code.exhaust_smoke` | **lumber-order 版**(已定),**两项目都要 after 验** | code | 跟随逻辑用 `root.getWorldMatrix()`;库包只定位、跟随由宿主 reparent。truck 的 after 会与其旧版略有差异,属复用验证范畴 |
115
+ | `resource.code.lumber_debris_scatter` | lumber-order 版 | code+mesh+GLB | GLB 资源需 `?url` 打包;Box fallback 保留 |
116
+ | `tree.particle.chop_dust_burst` | 现 data 版(两项目同源美术) | data | 薄包装 + `?url` 贴图映射;adapter 读 `emitter.origin` |
117
+ | `tree.code.intro_grow_smoke` | lumber-truck `src/vfx/intro-tree-grow-smoke.ts` | code(bespoke) | **封装**:把独立模块包成 `VfxEffectPackage`(加 `create()`/`debugParams`),纳入 playEffectPackage 通道 |
118
+ | `build.particle.wood_crusher_sawdust` | 现 manifest 版(淘汰 legacy 工厂版 `wood-crusher-sawdust`) | data | 同源双实现去重(见下) |
119
+
120
+ **统一时必须处理的冲突**(侦察发现):
121
+ - `wood_crusher_sawdust`(manifest)与 `wood-crusher-sawdust`(legacy 工厂)内部 manifest id 相同 → **合并,保留 manifest 版**。
122
+ - id 与目录名不一致(如 `run-footstep-dust` 目录 → id `build.particle.run_footstep_dust`)→ 以 id 为准。
123
+ - kebab vs snake 混用 → 规范化 `category.type.snake_name`(本轮 5 个先规范化,其余 Phase G)。
124
+ - 每个 data 包按 `VFX_LIBRARY_PLAN.md` §4.5 配 `?url` 资产映射、替换为已打补丁运行时 js。
125
+
126
+ 产出:5 个 `packages/effects/<id>/` + `generate-index` 出 `index.json` + `validate-manifest`(含 id 跨包唯一)。
127
+
128
+ > 注:旧库现有 6 个 Cocos 数据包与项目特效**无 id 重叠、仅语义相近**,本轮不强行对齐,留 Phase G。
129
+
130
+ ---
131
+
132
+ ## 7. P3 — 去特效(隔离版,service no-op 单点)
133
+
134
+ 目标:隔离版可编译、可运行、完全不播特效、可回滚。**保留 `types.ts` 与 `index.ts` barrel**(被大量 import,删目录会引发大面积编译错误)。
135
+
136
+ ### lumber-order-vfxlib
137
+ - `src/services/EffectPackageService.ts:71` `playEffectPackage(...)` → 首行 `return null`(最深卡点,production+scene+面板全灭)。
138
+ - `src/core/Game.ts:232-235` `initFromConfig()` 不调用;`:262` `warmupRuntimeVfx()` no-op/不调用;`new`/`dispose` 保留无害。
139
+ - 各 System 调用点(`MoneyDropSystem.ts:331`、`UnlockSystem.ts:304`、`CustomerTruckQueueSystem.ts:309`、`WorkerAutomationSystem.ts:566/781/1218/2142/2170/2183`、`PlayerFootstepDustSystem.ts:70`)**全部不动**(靠 no-op 返回 null;API 本就 `| null` 已守卫)。
140
+ - 3 个 VFX debug 面板(`main.ts:524/740/764`)可留(预览走 no-op 不报错)。
141
+
142
+ ### lumber-truck-vfxlib
143
+ - `src/services/SceneVfxService.ts:199` `playEffectPackage(...)` → 首行 `return null`;`:162 initFromConfig`/`:181 prewarm`/`:188 prewarmDelayed` 各自首行早退。
144
+ - `src/core/Game.ts:205-208` 不调用 init/prewarm 三行;`new`/`dispose` 保留。
145
+ - System 调用点(`LumberUpgradeVfxSystem.ts:47`、`TruckQueueSystem.ts:437`、`LumberSceneVisibilitySystem.ts:259/312/436`、`LumberVehicleAnimationSystem.ts:287`、`LumberProductionSystem.ts:2346/3534/3550/3567/3586`、`Lumber3CSystem.ts:1331`)不动。
146
+ - **特例 intro-tree-grow-smoke**:它不走 playEffectPackage,需单独让 `LumberIntroTreeAnimationSystem.ts:304` 的 `playTreeGrowSmoke` no-op(否则去特效不彻底)。
147
+
148
+ **验收**:两隔离版 `pnpm dev`(3016/3017)能进游戏、能玩、**画面无任何特效**、控制台无报错;`git diff` 仅集中在上述 service/Game 文件,可一键回滚。
149
+
150
+ ---
151
+
152
+ ## 8. P4 — 集成库回隔离版
153
+
154
+ 1. 隔离版安装 `@fps/vfx-runtime`(workspace `file:` 链接或 pnpm workspace 引用)。
155
+ 2. **撤掉 P3 的 no-op**?否——P3 是「移除项目自带特效系统」,P4 是「换成库的运行时」。具体:把隔离版的 `src/services/SceneVfxService`/`EffectPackageService` 替换为对 `@fps/vfx-runtime` 的封装(保留 `Game` 期望的 `new(scene)`/`initFromConfig()`/`dispose()` 钩子),`playEffectPackage` 转发到库。
156
+ 3. `vfx add` 把 5 个库包复制进隔离版 `src/assets/vfx/effects/<id>/`(exhaust 两项目都加)。
157
+ 4. 项目侧 `src/assets/vfx/index.ts` 改成 glob 自动发现(`import.meta.glob('./effects/*/index.ts', {eager:true})` + `buildRegistry`),**不手动注册**。
158
+ 5. 面板:沿用各自现有 VFX 面板(已在 DEV 自动挂载),确认下拉能列出 5 特效。
159
+ 6. intro-tree-grow-smoke:把 `LumberIntroTreeAnimationSystem` 的触发改为调 `playEffectPackage('tree.code.intro_grow_smoke', ...)`(从直接 import bespoke 模块切到库包)。
160
+
161
+ **验收**:两隔离版 `pnpm dev`,VFX 面板下拉见到对应特效,点 Play 能在固定锚点播放。
162
+
163
+ ---
164
+
165
+ ## 9. P5 — 前后视觉对比测试
166
+
167
+ ### 工具
168
+ - **chrome-devtools MCP**(`navigate_page` / `evaluate_script` / `resize_page` / `take_screenshot`),比 claude-in-chrome 更适合固定机位可复现截图;与项目已有 `scripts/benchmark-frame-time.mjs`(原生 CDP)一脉相承。
169
+
170
+ ### 流程(每特效)
171
+ 1. `resize_page` 1280×720(可选再做 DPR2)。
172
+ 2. `navigate_page` 到 after(隔离版 3016/3017);轮询 `!!window.gameInstance`(order)/`!!window.game`(truck)就绪。
173
+ 3. 用 P0 记录的 `fixtures.json` **复用完全相同的相机位姿 + spawn 坐标 + 帧时刻**。
174
+ 4. `evaluate_script` 触发:order `window.gameInstance.playEffectPackage(id,params,固定坐标)`;truck `window.playEffectPackage(id,params,固定坐标)`。
175
+ 5. 等到关键帧 → `take_screenshot` → 落 `after*.png`。
176
+
177
+ ### 对比方法(按确定性分流)
178
+ - **code 特效**(exhaust / debris / intro,确定性黄金分割序列):单关键帧 **逐像素 diff**(`before.png` vs `after.png` → `diff.png`),阈值内即视为一致。
179
+ - **data 特效**(tree_chop_dust_burst / wood_crusher_sawdust,Babylon `Math.random` ~24 处,非确定性):**多帧序列 + 人工视觉对比 + 可选 SSIM**(下采样后结构相似度),比对覆盖范围/色调/爆发包络/时长,不做逐像素。
180
+
181
+ ### 产物
182
+ ```
183
+ benchmark-results/vfx-ab/<project>/<id>/
184
+ before.png / after.png / diff.png # code 特效
185
+ before-f0x.png / after-f0x.png # data 特效多帧
186
+ ```
187
+ 最后生成一页对比汇总(并排缩略图 + 判定)。
188
+
189
+ ### 验收标准(全绿才算 OK)
190
+ 1. 两隔离版集成后能 `pnpm dev` 进游戏、无运行时报错。
191
+ 2. 5 个库包都能经面板/`playEffectPackage` 触发,定位正确(data 不落世界原点,§4.5 风险已规避)。
192
+ 3. code 特效 diff 在阈值内(视觉等同);data 特效多帧人工对比「视觉等同/可接受」。
193
+ 4. `vehicle-exhaust-smoke` 在**两个项目**都通过(证明跨项目复用)。
194
+ 5. mesh+GLB(lumber-debris-scatter)、bespoke(intro)两条特殊路径均正常。
195
+
196
+ ---
197
+
198
+ ## 10. P6 — 迭代到通过 + 结论
199
+
200
+ 按 §9 逐项核对;不过的:定位问题(多半落在 §11 风险点)→ 修 `@fps/vfx-runtime` 或库包配置 → 重测该特效。全绿后给结论:哪些特效一致、哪些有可接受差异、根因与修复、流程是否可推广到全量。
201
+
202
+ ---
203
+
204
+ ## 11. 风险与对策(均来自代码侦察)
205
+
206
+ | 风险 | 影响 | 对策 |
207
+ |---|---|---|
208
+ | 旧库 adapter 粒子落世界原点、不建 root | data 特效失位 | 用 lumber-order **已打补丁** adapter(读 `emitter.origin`),P1 就并入 |
209
+ | data 类不导出 setPosition、不跟随 | exhaust 若做成 data 会不跟车 | exhaust 用 **code 类**(本就如此);data 仅一次性定位 |
210
+ | mesh 特效 `fetch()` GLSL + 自建 root | data-mesh 着色器 404/失位 | 着色器 `?url` 打包;本轮 mesh 用 code 版(lumber-debris-scatter)规避 |
211
+ | data 特效贴图靠 `urlForPackagePath` + 旧库是 `gs://` | 贴图 404 | 每包 `index.ts` 用 `?url` 显式映射 packagePath |
212
+ | data 特效 `Math.random` 非确定性 | 逐像素 diff 假阳性 | data 走多帧/SSIM/人工,不做像素 diff |
213
+ | debug-only/data 特效只在 dev 编入 | prod 测不到 | 全程 `pnpm dev` |
214
+ | 23 特效 20 个实现分叉 + 共享基建分叉 | 全量统一成本高 | 本轮只统一 5 个;全量留 Phase G 逐个 reconcile |
215
+ | 相机每帧跟玩家漂移 | 前后机位不一致 | 锁 `cameraPanService` / 存固定 rig + 固定 spawn 坐标 |
216
+ | intro 不走 playEffectPackage | 去特效/集成易漏 | 单独 no-op 其触发 + 集成时封装成库包并改触发 |
217
+
218
+ ---
219
+
220
+ ## 12. 已确认决策(2026-06-26)
221
+
222
+ 1. 隔离版形态:**git 分支**(各项目 repo 建 `vfx-library-integration`)。
223
+ 2. 6 个测试特效(§2):**认可**。
224
+ 3. 分阶段:**先在 6 个特效跑通(P0–P6),其余留 Phase G**。
225
+ 4. `vehicle-exhaust-smoke` canonical:**取 lumber-order 版**(两项目都验 after)。
226
+
227
+ ---
228
+
229
+ *本执行方案配合 [`VFX_LIBRARY_PLAN.md`](./VFX_LIBRARY_PLAN.md)(格式与运行时设计)使用。先验证、再规模化。*