@fps-games/vfx 0.1.1 → 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 (250) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +41 -0
  3. package/dist/effects/coin-burst/index.js +6 -2
  4. package/dist/effects/comet-trail-flame/index.js +3 -1
  5. package/dist/effects/debris-smoke/index.js +1 -0
  6. package/dist/effects/electric-arc/index.js +1 -0
  7. package/dist/effects/energy-shield/index.js +1 -0
  8. package/dist/effects/explosion/index.js +3 -2
  9. package/dist/effects/hit-flash/index.js +12 -4
  10. package/dist/effects/laser-beam/index.js +14 -2
  11. package/dist/effects/lumber_vehicle_upgrade_aura/index.js +1 -0
  12. package/dist/effects/monster-hit/index.js +2 -1
  13. package/dist/effects/player-upgrade/index.js +5 -3
  14. package/dist/effects/pulse-laser-volley/index.js +14 -4
  15. package/dist/effects/thruster-flame/index.js +3 -1
  16. package/dist/effects/treasure-attention/index.d.ts +54 -0
  17. package/dist/effects/treasure-attention/index.js +535 -0
  18. package/dist/effects/ufo-thread-flame/index.js +1 -0
  19. package/dist/effects/vehicle-upgrade/index.js +4 -1
  20. package/dist/effects/weapon-trail/index.js +8 -3
  21. package/dist/effects/wood_crusher_sawdust/index.d.ts +4 -0
  22. package/dist/effects/wood_cutter_sawdust/index.d.ts +4 -0
  23. package/dist/index.js +85 -17
  24. package/dist/types.d.ts +80 -0
  25. package/index.json +19 -1
  26. package/package.json +9 -4
  27. package/packages/effects/treasure-attention/vfx-params.json +49 -0
  28. package/tooling/vfx-cli.mjs +8 -1
  29. package/docs/AUTHORING_EFFECTS.md +0 -297
  30. package/docs/VFX_LIBRARY_ARCHITECTURE_chatgpt.md +0 -1580
  31. package/docs/VFX_LIBRARY_EXECUTION_PLAN.md +0 -229
  32. package/docs/VFX_LIBRARY_PLAN.md +0 -546
  33. package/docs/vfx-ab/RESULTS.md +0 -35
  34. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/after.png +0 -0
  35. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/before.png +0 -0
  36. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/after.png +0 -0
  37. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/before.png +0 -0
  38. package/docs/vfx-integration_chatgpt.md +0 -462
  39. package/docs/weapon-trail-visualization.html +0 -241
  40. package/packages/EffectPackageService.ts +0 -240
  41. package/packages/SceneVfxService.ts +0 -96
  42. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/runtime/simpleMeshEffect.v1.js +0 -333
  43. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.frag.glsl +0 -25
  44. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.vert.glsl +0 -11
  45. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/textures/effect_jianbian.png +0 -0
  46. package/packages/build.mesh.yellow_build_upgrade_indicator/effect.json +0 -927
  47. package/packages/build.mesh.yellow_build_upgrade_indicator/media/contact-sheet.png +0 -0
  48. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.gif +0 -0
  49. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.mp4 +0 -0
  50. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.webm +0 -0
  51. package/packages/build.mesh.yellow_build_upgrade_indicator/media/thumbnail.png +0 -0
  52. package/packages/build.mesh.yellow_build_upgrade_indicator/metadata/description.json +0 -197
  53. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-effect.original.json +0 -895
  54. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-normalized-vfx-to-babylon-report.json +0 -241
  55. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-overrides.json +0 -542
  56. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-tuning-report.json +0 -69
  57. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/asset-map.json +0 -125
  58. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/lineage.json +0 -44
  59. package/packages/build.particle.golden_upgrade_starburst/assets/runtime/particleEmitter.v1.js +0 -210
  60. package/packages/build.particle.golden_upgrade_starburst/assets/textures/effect_guangdian.png +0 -0
  61. package/packages/build.particle.golden_upgrade_starburst/effect.json +0 -880
  62. package/packages/build.particle.golden_upgrade_starburst/media/contact-sheet.png +0 -0
  63. package/packages/build.particle.golden_upgrade_starburst/media/preview.gif +0 -0
  64. package/packages/build.particle.golden_upgrade_starburst/media/preview.mp4 +0 -0
  65. package/packages/build.particle.golden_upgrade_starburst/media/preview.webm +0 -0
  66. package/packages/build.particle.golden_upgrade_starburst/media/thumbnail.png +0 -0
  67. package/packages/build.particle.golden_upgrade_starburst/metadata/description.json +0 -161
  68. package/packages/build.particle.golden_upgrade_starburst/provenance/03-effect.original.json +0 -762
  69. package/packages/build.particle.golden_upgrade_starburst/provenance/03-normalized-vfx-to-babylon-report.json +0 -260
  70. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-overrides.json +0 -436
  71. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-tuning-report.json +0 -40
  72. package/packages/build.particle.golden_upgrade_starburst/provenance/asset-map.json +0 -115
  73. package/packages/build.particle.golden_upgrade_starburst/provenance/lineage.json +0 -40
  74. package/packages/build.particle.orange_upgrade_transform_sparks/assets/runtime/particleEmitter.v1.js +0 -210
  75. package/packages/build.particle.orange_upgrade_transform_sparks/assets/textures/b5b27ab1-e740-4398-b407-848fc2b2c897.png +0 -0
  76. package/packages/build.particle.orange_upgrade_transform_sparks/effect.json +0 -887
  77. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.gif +0 -0
  78. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.mp4 +0 -0
  79. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.webm +0 -0
  80. package/packages/build.particle.orange_upgrade_transform_sparks/media/thumbnail.png +0 -0
  81. package/packages/build.particle.orange_upgrade_transform_sparks/metadata/description.json +0 -179
  82. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-effect.original.json +0 -859
  83. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-normalized-vfx-to-babylon-report.json +0 -260
  84. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-overrides.json +0 -478
  85. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-tuning-report.json +0 -40
  86. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/asset-map.json +0 -114
  87. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/lineage.json +0 -41
  88. package/packages/build.particle.wood_chip_dust_burst/assets/runtime/particleEmitter.v1.js +0 -210
  89. package/packages/build.particle.wood_chip_dust_burst/assets/textures/effect_yanwu4.png +0 -0
  90. package/packages/build.particle.wood_chip_dust_burst/assets/textures/suipian3.png +0 -0
  91. package/packages/build.particle.wood_chip_dust_burst/effect.json +0 -1400
  92. package/packages/build.particle.wood_chip_dust_burst/media/contact-sheet.png +0 -0
  93. package/packages/build.particle.wood_chip_dust_burst/media/preview.gif +0 -0
  94. package/packages/build.particle.wood_chip_dust_burst/media/preview.mp4 +0 -0
  95. package/packages/build.particle.wood_chip_dust_burst/media/preview.webm +0 -0
  96. package/packages/build.particle.wood_chip_dust_burst/media/thumbnail.png +0 -0
  97. package/packages/build.particle.wood_chip_dust_burst/metadata/description.json +0 -173
  98. package/packages/build.particle.wood_chip_dust_burst/provenance/03-effect.original.json +0 -1277
  99. package/packages/build.particle.wood_chip_dust_burst/provenance/03-normalized-vfx-to-babylon-report.json +0 -329
  100. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-overrides.json +0 -749
  101. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-tuning-report.json +0 -60
  102. package/packages/build.particle.wood_chip_dust_burst/provenance/asset-map.json +0 -146
  103. package/packages/build.particle.wood_chip_dust_burst/provenance/lineage.json +0 -69
  104. package/packages/effects/building-upgrade/effect.json +0 -6
  105. package/packages/effects/building-upgrade/index.ts +0 -387
  106. package/packages/effects/character-entrance/effect.json +0 -6
  107. package/packages/effects/character-entrance/index.ts +0 -308
  108. package/packages/effects/coin-burst/index.ts +0 -43
  109. package/packages/effects/comet-trail-flame/assets/textures/trail_5x4.webp +0 -0
  110. package/packages/effects/comet-trail-flame/index.ts +0 -106
  111. package/packages/effects/conveyor-upgrade/effect.json +0 -6
  112. package/packages/effects/conveyor-upgrade/index.ts +0 -401
  113. package/packages/effects/debris-smoke/assets/models/rock_debris.glb +0 -0
  114. package/packages/effects/debris-smoke/assets/textures/smoke22.webp +0 -0
  115. package/packages/effects/debris-smoke/index.ts +0 -101
  116. package/packages/effects/door_open_gold_flakes/assets/runtime/goldFlakes.v1.js +0 -397
  117. package/packages/effects/door_open_gold_flakes/door_open_gold_flakes.json +0 -498
  118. package/packages/effects/door_open_gold_flakes/index.ts +0 -11
  119. package/packages/effects/electric-arc/assets/textures/spark_4x4.webp +0 -0
  120. package/packages/effects/electric-arc/index.ts +0 -62
  121. package/packages/effects/energy-shield/effect.json +0 -7
  122. package/packages/effects/energy-shield/index.ts +0 -431
  123. package/packages/effects/explosion/assets/textures/baozha29.webp +0 -0
  124. package/packages/effects/explosion/assets/textures/glow01.webp +0 -0
  125. package/packages/effects/explosion/assets/textures/lizi01.webp +0 -0
  126. package/packages/effects/explosion/assets/textures/xulie_lizibaozha02_5x5.webp +0 -0
  127. package/packages/effects/explosion/index.ts +0 -114
  128. package/packages/effects/ground-tile-upgrade/effect.json +0 -6
  129. package/packages/effects/ground-tile-upgrade/index.ts +0 -410
  130. package/packages/effects/hit-flash/index.ts +0 -69
  131. package/packages/effects/laser-beam/assets/textures/laser_glow.webp +0 -0
  132. package/packages/effects/laser-beam/assets/textures/laser_noise.webp +0 -0
  133. package/packages/effects/laser-beam/index.ts +0 -6
  134. package/packages/effects/laser-beam-factory.ts +0 -135
  135. package/packages/effects/lumber-cart-suction/effect.json +0 -6
  136. package/packages/effects/lumber-cart-suction/index.ts +0 -399
  137. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb +0 -0
  138. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/.active +0 -1
  139. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/1781589063890_upload.glb +0 -0
  140. package/packages/effects/lumber-debris-scatter/assets/runtime/solidParticleScatter.v1.js +0 -236
  141. package/packages/effects/lumber-debris-scatter/effect.json +0 -228
  142. package/packages/effects/lumber-debris-scatter/index.ts +0 -780
  143. package/packages/effects/lumber_vehicle_gear_spin/assets/runtime/gearSpin.v1.js +0 -202
  144. package/packages/effects/lumber_vehicle_gear_spin/index.ts +0 -11
  145. package/packages/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json +0 -338
  146. package/packages/effects/lumber_vehicle_upgrade_aura/assets/runtime/upgradeAura.v1.js +0 -353
  147. package/packages/effects/lumber_vehicle_upgrade_aura/index.ts +0 -11
  148. package/packages/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json +0 -365
  149. package/packages/effects/lumber_vehicle_wood_chips/assets/runtime/solidParticleScatter.v1.js +0 -310
  150. package/packages/effects/lumber_vehicle_wood_chips/index.ts +0 -11
  151. package/packages/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json +0 -335
  152. package/packages/effects/monster-hit/index.ts +0 -128
  153. package/packages/effects/player-upgrade/effect.json +0 -6
  154. package/packages/effects/player-upgrade/index.ts +0 -635
  155. package/packages/effects/pulse-laser-volley/assets/textures/bolt_guangshu.webp +0 -0
  156. package/packages/effects/pulse-laser-volley/index.ts +0 -204
  157. package/packages/effects/resource-collect-sparkles/effect.json +0 -6
  158. package/packages/effects/resource-collect-sparkles/index.ts +0 -254
  159. package/packages/effects/run-footstep-dust/assets/runtime/runFootstepDust.v1.js +0 -215
  160. package/packages/effects/run-footstep-dust/effect.json +0 -183
  161. package/packages/effects/run-footstep-dust/index.ts +0 -377
  162. package/packages/effects/space-shared.ts +0 -120
  163. package/packages/effects/thruster-flame/index.ts +0 -305
  164. package/packages/effects/tree-chop-dust/assets/textures/tree_chop_dust_atlas.png +0 -0
  165. package/packages/effects/tree-chop-dust/effect.json +0 -8
  166. package/packages/effects/tree-chop-dust/index.ts +0 -202
  167. package/packages/effects/tree-leaf-chop-burst/assets/runtime/particleEmitter.v1.js +0 -303
  168. package/packages/effects/tree-leaf-chop-burst/assets/textures/tree_leaf_chop_burst_leaf_atlas.png +0 -0
  169. package/packages/effects/tree-leaf-chop-burst/effect.json +0 -498
  170. package/packages/effects/tree-leaf-chop-burst/index.ts +0 -294
  171. package/packages/effects/tree_chop_dust_burst/assets/runtime/particleEmitter.v1.js +0 -318
  172. package/packages/effects/tree_chop_dust_burst/assets/textures/tree_chop_dust_burst_dust.png +0 -0
  173. package/packages/effects/tree_chop_dust_burst/index.ts +0 -13
  174. package/packages/effects/tree_chop_dust_burst/tree_chop_dust_burst.json +0 -412
  175. package/packages/effects/ufo-thread-flame/assets/textures/flame_flow.webp +0 -0
  176. package/packages/effects/ufo-thread-flame/assets/textures/flame_spike.webp +0 -0
  177. package/packages/effects/ufo-thread-flame/index.ts +0 -152
  178. package/packages/effects/vehicle-exhaust-smoke/assets/textures/vehicle_exhaust_smoke_atlas.png +0 -0
  179. package/packages/effects/vehicle-exhaust-smoke/effect.json +0 -8
  180. package/packages/effects/vehicle-exhaust-smoke/index.ts +0 -298
  181. package/packages/effects/vehicle-upgrade/effect.json +0 -6
  182. package/packages/effects/vehicle-upgrade/index.ts +0 -401
  183. package/packages/effects/weapon-trail/assets/textures/trail_wedge.png +0 -0
  184. package/packages/effects/weapon-trail/index.ts +0 -313
  185. package/packages/effects/wood-crusher-sawdust/assets/runtime/particleEmitter.v1.js +0 -312
  186. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  187. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  188. package/packages/effects/wood-crusher-sawdust/index.ts +0 -43
  189. package/packages/effects/wood-crusher-sawdust/wood_crusher_sawdust.json +0 -592
  190. package/packages/effects/wood-cutter-sawdust/assets/runtime/particleEmitter.v1.js +0 -312
  191. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  192. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  193. package/packages/effects/wood-cutter-sawdust/index.ts +0 -43
  194. package/packages/effects/wood-cutter-sawdust/wood_cutter_sawdust.json +0 -592
  195. package/packages/effects/wood-sawdust-effect-factory.ts +0 -194
  196. package/packages/effects/wood_crusher_sawdust/assets/runtime/particleEmitter.v1.js +0 -318
  197. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  198. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  199. package/packages/effects/wood_crusher_sawdust/index.ts +0 -29
  200. package/packages/effects/wood_crusher_sawdust/wood_crusher_sawdust.json +0 -592
  201. package/packages/effects/wood_cutter_sawdust/assets/runtime/particleEmitter.v1.js +0 -318
  202. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  203. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  204. package/packages/effects/wood_cutter_sawdust/index.ts +0 -29
  205. package/packages/effects/wood_cutter_sawdust/wood_cutter_sawdust.json +0 -592
  206. package/packages/effects/wood_peel_material_test/assets/runtime/woodPeelMaterialTest.v1.js +0 -196
  207. package/packages/effects/wood_peel_material_test/index.ts +0 -11
  208. package/packages/effects/wood_peel_material_test/wood_peel_material_test.json +0 -136
  209. package/packages/env.particle.forest_edge_fog/assets/runtime/particleEmitter.v1.js +0 -210
  210. package/packages/env.particle.forest_edge_fog/assets/textures/f12a23c4-b924-4322-a260-3d982428f1e8.png +0 -0
  211. package/packages/env.particle.forest_edge_fog/assets/textures/yuan.png +0 -0
  212. package/packages/env.particle.forest_edge_fog/effect.json +0 -854
  213. package/packages/env.particle.forest_edge_fog/media/preview.gif +0 -0
  214. package/packages/env.particle.forest_edge_fog/media/preview.mp4 +0 -0
  215. package/packages/env.particle.forest_edge_fog/media/preview.webm +0 -0
  216. package/packages/env.particle.forest_edge_fog/media/thumbnail.png +0 -0
  217. package/packages/env.particle.forest_edge_fog/metadata/description.json +0 -148
  218. package/packages/env.particle.forest_edge_fog/provenance/03-effect.original.json +0 -827
  219. package/packages/env.particle.forest_edge_fog/provenance/03-normalized-vfx-to-babylon-report.json +0 -196
  220. package/packages/env.particle.forest_edge_fog/provenance/04-preview-overrides.json +0 -432
  221. package/packages/env.particle.forest_edge_fog/provenance/04-preview-tuning-report.json +0 -28
  222. package/packages/env.particle.forest_edge_fog/provenance/asset-map.json +0 -124
  223. package/packages/env.particle.forest_edge_fog/provenance/lineage.json +0 -41
  224. package/packages/generation.ts +0 -14
  225. package/packages/index.ts +0 -14
  226. package/packages/legacy-particle-runtime.ts +0 -113
  227. package/packages/manifestRuntimePackage.ts +0 -519
  228. package/packages/registry.ts +0 -85
  229. package/packages/rendering.ts +0 -13
  230. package/packages/resource.particle.viscous_oil_suction/assets/runtime/top_disk_suction/particleEmitter.v1.js +0 -424
  231. package/packages/resource.particle.viscous_oil_suction/assets/textures/Glow ad.png +0 -0
  232. package/packages/resource.particle.viscous_oil_suction/effect.json +0 -1254
  233. package/packages/resource.particle.viscous_oil_suction/media/preview.gif +0 -0
  234. package/packages/resource.particle.viscous_oil_suction/media/preview.mp4 +0 -0
  235. package/packages/resource.particle.viscous_oil_suction/media/preview.webm +0 -0
  236. package/packages/resource.particle.viscous_oil_suction/media/thumbnail.png +0 -0
  237. package/packages/resource.particle.viscous_oil_suction/metadata/description.json +0 -122
  238. package/packages/resource.particle.viscous_oil_suction/provenance/03-effect.original.json +0 -1051
  239. package/packages/resource.particle.viscous_oil_suction/provenance/03-normalized-vfx-to-babylon-report.json +0 -200
  240. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-overrides.json +0 -581
  241. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-tuning-report.json +0 -28
  242. package/packages/resource.particle.viscous_oil_suction/provenance/asset-map.json +0 -111
  243. package/packages/resource.particle.viscous_oil_suction/provenance/lineage.json +0 -45
  244. package/packages/types.ts +0 -107
  245. package/tooling/check-dist-runtime.mjs +0 -166
  246. package/tooling/generate-index.mjs +0 -55
  247. package/tooling/test-guardrails.mjs +0 -157
  248. package/tooling/validate-boundary.mjs +0 -92
  249. package/tooling/validate-effects.mjs +0 -304
  250. package/tooling/validate.mjs +0 -53
@@ -1,202 +0,0 @@
1
- export const runtimeId = "gearSpin/v1";
2
-
3
- export const runtimeContract = {
4
- runtimeId,
5
- kind: "gearSpin",
6
- emitterFields: {
7
- origin: "World-space center of the spinning gear wind effect.",
8
- duration: "Total preview lifetime in seconds.",
9
- radius: "Ground-plane radius of the circular wind effect.",
10
- spinSpeed: "Angular spin speed in radians per second.",
11
- windLineCount: "Number of outer wind motion arcs.",
12
- windRingCount: "Number of concentric wind line rings.",
13
- windLineLength: "World-space length of each wind arc.",
14
- color: "Motion line color.",
15
- },
16
- };
17
-
18
- function num(value, fallback = 0) {
19
- const next = Number(value);
20
- return Number.isFinite(next) ? next : fallback;
21
- }
22
-
23
- function readVec(BABYLON, value, fallback = new BABYLON.Vector3(0, 0, 0)) {
24
- if (!value) return fallback.clone ? fallback.clone() : fallback;
25
- return new BABYLON.Vector3(num(value.x, fallback.x), num(value.y, fallback.y), num(value.z, fallback.z));
26
- }
27
-
28
- function readColor3(BABYLON, value, fallback = new BABYLON.Color3(1, 1, 1)) {
29
- if (!value) return fallback;
30
- return new BABYLON.Color3(num(value.r, fallback.r), num(value.g, fallback.g), num(value.b, fallback.b));
31
- }
32
-
33
- function scaleColor(BABYLON, color, intensity) {
34
- const next = color.clone ? color.clone() : new BABYLON.Color3(color.r, color.g, color.b);
35
- return next.scale(Math.max(0, num(intensity, 1)));
36
- }
37
-
38
- function makeMaterial(BABYLON, scene, name, color, alpha, hdrIntensity = 1) {
39
- const material = new BABYLON.StandardMaterial(name, scene);
40
- material.diffuseColor = color;
41
- material.emissiveColor = scaleColor(BABYLON, color, hdrIntensity);
42
- material.alpha = alpha;
43
- material.backFaceCulling = false;
44
- material.disableLighting = true;
45
- material.disableDepthWrite = true;
46
- material.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND;
47
- if (BABYLON.Engine?.ALPHA_ADD !== undefined) {
48
- material.alphaMode = BABYLON.Engine.ALPHA_ADD;
49
- }
50
- return material;
51
- }
52
-
53
- function createWindArc(BABYLON, scene, root, material, index, config) {
54
- const lineCount = Math.max(1, Math.round(num(config.windLineCount, 4)));
55
- const ringIndex = Math.max(0, Math.round(num(config.ringIndex, 0)));
56
- const ringCount = Math.max(1, Math.round(num(config.windRingCount, 3)));
57
- const radius = Math.max(0.05, num(config.radius, 0.64));
58
- const lineLength = Math.max(0.03, num(config.windLineLength, 0.48));
59
- const angularLength = Math.min(Math.PI * 0.85, Math.max(0.05, lineLength / radius));
60
- const ringOffset = (ringIndex - (ringCount - 1) * 0.5) * Math.max(0.01, num(config.lineSpacing, 0.055));
61
- const arcRadius = radius + ringOffset;
62
- const phase = (index / lineCount) * Math.PI * 2 + ringIndex * 0.32;
63
- const y = num(config.y, 0.035);
64
- const steps = 12;
65
- const path = [];
66
-
67
- for (let step = 0; step <= steps; step += 1) {
68
- const t = step / steps;
69
- const angle = phase + t * angularLength;
70
- path.push(new BABYLON.Vector3(
71
- Math.cos(angle) * arcRadius,
72
- y + Math.sin(t * Math.PI) * 0.006,
73
- Math.sin(angle) * arcRadius
74
- ));
75
- }
76
-
77
- const arc = BABYLON.MeshBuilder.CreateTube(
78
- `vfx_gear_spin_wind_arc_${index}`,
79
- {
80
- path,
81
- radius: Math.max(0.004, num(config.lineThickness, 0.018)),
82
- tessellation: 8,
83
- cap: BABYLON.Mesh.CAP_ALL,
84
- },
85
- scene
86
- );
87
- arc.parent = root;
88
- arc.material = material;
89
- arc.metadata = {
90
- phase,
91
- pulseOffset: index * 0.73,
92
- };
93
- return arc;
94
- }
95
-
96
- export async function createGearSpinRuntime({ BABYLON, scene, emitter, shouldStart = false }) {
97
- if (!BABYLON) throw new Error("createGearSpinRuntime requires BABYLON.");
98
- if (!scene) throw new Error("createGearSpinRuntime requires scene.");
99
- if (!emitter) throw new Error("createGearSpinRuntime requires emitter.");
100
-
101
- const origin = readVec(BABYLON, emitter.origin, BABYLON.Vector3.Zero());
102
- const duration = Math.max(0.1, num(emitter.duration, 1.2));
103
- const loop = emitter.loop === true || emitter.loop === "true";
104
- const effectScale = Math.max(0.05, num(emitter.effectScale, 1));
105
- const radius = Math.max(0.05, num(emitter.radius, 0.64) * effectScale);
106
- const color = readColor3(BABYLON, emitter.color, new BABYLON.Color3(1, 1, 1));
107
- const hdrIntensity = Math.max(0, num(emitter.hdrIntensity, 1.4));
108
- const windLineAlpha = Math.max(0, num(emitter.windLineAlpha, 0.68));
109
- const groundOffsetY = Math.max(0.01, num(emitter.groundOffsetY, 0.04) * effectScale);
110
-
111
- const root = new BABYLON.TransformNode(`vfx_gear_spin_${Date.now()}`, scene);
112
-
113
- function setPosition(position) {
114
- const next = readVec(BABYLON, position, origin);
115
- root.position.copyFrom(next);
116
- root.position.y += groundOffsetY;
117
- }
118
-
119
- setPosition(origin);
120
-
121
- const windLineMaterial = makeMaterial(BABYLON, scene, "vfx_gear_spin_wind_line_mat", color, windLineAlpha, hdrIntensity);
122
-
123
- const windLineCount = Math.max(1, Math.round(num(emitter.windLineCount, 4)));
124
- const windRingCount = Math.max(1, Math.round(num(emitter.windRingCount, 3)));
125
- const windArcs = [];
126
- for (let ringIndex = 0; ringIndex < windRingCount; ringIndex += 1) {
127
- for (let lineIndex = 0; lineIndex < windLineCount; lineIndex += 1) {
128
- windArcs.push(createWindArc(BABYLON, scene, root, windLineMaterial, lineIndex, {
129
- ringIndex,
130
- radius,
131
- windLineCount,
132
- windRingCount,
133
- windLineLength: num(emitter.windLineLength, 0.48) * effectScale,
134
- lineThickness: num(emitter.windLineThickness, 0.014) * effectScale,
135
- lineSpacing: num(emitter.windLineSpacing, 0.075) * effectScale,
136
- y: 0.032 * effectScale + ringIndex * 0.002,
137
- }));
138
- }
139
- }
140
-
141
- let startedAt = 0;
142
- let observer = null;
143
- let running = false;
144
- let disposed = false;
145
-
146
- const update = () => {
147
- const elapsed = (performance.now() - startedAt) / 1000;
148
- const t = Math.min(1, elapsed / duration);
149
- const fade = loop ? 1 : Math.sin(t * Math.PI);
150
- const spinSpeed = num(emitter.spinSpeed, 12);
151
- root.rotation.y = elapsed * spinSpeed;
152
- windLineMaterial.alpha = windLineAlpha * fade;
153
- for (const arc of windArcs) {
154
- const pulseOffset = num(arc.metadata?.pulseOffset, 0);
155
- arc.visibility = 0.7 + Math.sin(elapsed * 10 + pulseOffset) * 0.22;
156
- arc.scaling.setAll(0.98 + Math.sin(elapsed * 8 + pulseOffset) * 0.02);
157
- }
158
-
159
- if (!loop && elapsed >= duration) {
160
- stop();
161
- }
162
- };
163
-
164
- function start() {
165
- if (running || disposed) return;
166
- running = true;
167
- startedAt = performance.now();
168
- root.setEnabled(true);
169
- observer = scene.onBeforeRenderObservable.add(update);
170
- }
171
-
172
- function stop() {
173
- if (!running) return;
174
- running = false;
175
- if (observer) {
176
- scene.onBeforeRenderObservable.remove(observer);
177
- observer = null;
178
- }
179
- dispose();
180
- }
181
-
182
- function dispose() {
183
- if (disposed) return;
184
- disposed = true;
185
- for (const arc of windArcs) arc.dispose(false, true);
186
- root.dispose();
187
- windLineMaterial.dispose();
188
- }
189
-
190
- root.setEnabled(false);
191
- const preview = {
192
- start,
193
- stop,
194
- dispose,
195
- isStarted: () => running,
196
- setPosition,
197
- duration,
198
- };
199
-
200
- if (shouldStart) start();
201
- return preview;
202
- }
@@ -1,11 +0,0 @@
1
- import manifest from './lumber_vehicle_gear_spin.json';
2
- import runtimeUrl from './assets/runtime/gearSpin.v1.js?url';
3
- import { createManifestRuntimeEffectPackage } from '../../manifestRuntimePackage';
4
-
5
- export const lumberVehicleGearSpinEffectPackage = createManifestRuntimeEffectPackage({
6
- id: 'lumber_vehicle_gear_spin',
7
- manifest,
8
- assetUrls: {
9
- 'assets/runtime/gearSpin.v1.js': runtimeUrl,
10
- },
11
- });
@@ -1,338 +0,0 @@
1
- {
2
- "schemaVersion": "vfx-effect-package/1.0",
3
- "id": "build.particle.lumber_vehicle_gear_spin",
4
- "name": {
5
- "zh": "伐木车齿轮风圈",
6
- "en": "Lumber Vehicle Gear Spin"
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_gear_spin",
13
- "sourceId": "lumber_order/lumber_vehicle_gear_spin",
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": "gear_spin_v1",
30
- "packagePath": "assets/runtime/gearSpin.v1.js",
31
- "runtimeId": "gearSpin/v1",
32
- "engine": "babylon",
33
- "moduleFormat": "esm",
34
- "exports": [
35
- "createGearSpinRuntime",
36
- "runtimeContract"
37
- ],
38
- "mimeType": "text/javascript"
39
- }
40
- ],
41
- "raw": []
42
- },
43
- "emitters": [
44
- {
45
- "name": "lumber_vehicle_gear_spin_main",
46
- "sourceNodeName": "lumber_vehicle_gear_spin_main",
47
- "enabled": true,
48
- "type": "GearSpin",
49
- "duration": 1.2,
50
- "effectScale": 1,
51
- "radius": 0.82,
52
- "windLineCount": 4,
53
- "windRingCount": 3,
54
- "windLineLength": 0.62,
55
- "windLineThickness": 0.014,
56
- "windLineSpacing": 0.075,
57
- "windLineAlpha": 0.68,
58
- "spinSpeed": 12,
59
- "groundOffsetY": 0.04,
60
- "hdrIntensity": 1.8,
61
- "color": {
62
- "r": 1,
63
- "g": 1,
64
- "b": 1,
65
- "a": 1
66
- },
67
- "runtime": {
68
- "adapter": "gearSpin/v1",
69
- "stopAfterSeconds": 1.2,
70
- "disposeOnComplete": true
71
- }
72
- }
73
- ],
74
- "runtime": {
75
- "driver": "gearSpin",
76
- "defaultMesh": null,
77
- "defaultOffset": {
78
- "x": 0,
79
- "y": 0,
80
- "z": 0
81
- },
82
- "start": [
83
- "Instantiate Babylon runtime for lumber_vehicle_gear_spin"
84
- ],
85
- "update": [
86
- "Apply Babylon tunable parameter overrides"
87
- ],
88
- "stop": [
89
- "Stop and dispose runtime resources"
90
- ],
91
- "adapters": [
92
- {
93
- "id": "gearSpin/v1",
94
- "engine": "babylon",
95
- "entry": "assets/runtime/gearSpin.v1.js",
96
- "moduleFormat": "esm",
97
- "exports": [
98
- "createGearSpinRuntime",
99
- "runtimeContract"
100
- ]
101
- }
102
- ]
103
- },
104
- "tunableParams": [
105
- {
106
- "key": "lumber_vehicle_gear_spin.loop",
107
- "labelZh": "循环播放",
108
- "type": "enum",
109
- "default": "false",
110
- "options": [
111
- {
112
- "value": "false",
113
- "label": "关闭"
114
- },
115
- {
116
- "value": "true",
117
- "label": "开启"
118
- }
119
- ],
120
- "target": {
121
- "emitter": "lumber_vehicle_gear_spin_main",
122
- "property": "loop",
123
- "operator": "set"
124
- }
125
- },
126
- {
127
- "key": "lumber_vehicle_gear_spin.radius",
128
- "labelZh": "风圈半径",
129
- "type": "number",
130
- "default": 0.82,
131
- "min": 0.1,
132
- "max": 2,
133
- "step": 0.01,
134
- "target": {
135
- "emitter": "lumber_vehicle_gear_spin_main",
136
- "property": "radius",
137
- "operator": "set"
138
- }
139
- },
140
- {
141
- "key": "lumber_vehicle_gear_spin.windLineCount",
142
- "labelZh": "风线数量",
143
- "type": "number",
144
- "default": 4,
145
- "min": 1,
146
- "max": 12,
147
- "step": 1,
148
- "target": {
149
- "emitter": "lumber_vehicle_gear_spin_main",
150
- "property": "windLineCount",
151
- "operator": "set"
152
- }
153
- },
154
- {
155
- "key": "lumber_vehicle_gear_spin.windRingCount",
156
- "labelZh": "风线环数",
157
- "type": "number",
158
- "default": 3,
159
- "min": 1,
160
- "max": 6,
161
- "step": 1,
162
- "target": {
163
- "emitter": "lumber_vehicle_gear_spin_main",
164
- "property": "windRingCount",
165
- "operator": "set"
166
- }
167
- },
168
- {
169
- "key": "lumber_vehicle_gear_spin.windLineLength",
170
- "labelZh": "风线长度",
171
- "type": "number",
172
- "default": 0.62,
173
- "min": 0.02,
174
- "max": 1,
175
- "step": 0.01,
176
- "target": {
177
- "emitter": "lumber_vehicle_gear_spin_main",
178
- "property": "windLineLength",
179
- "operator": "set"
180
- }
181
- },
182
- {
183
- "key": "lumber_vehicle_gear_spin.windLineSpacing",
184
- "labelZh": "风线环间距",
185
- "type": "number",
186
- "default": 0.075,
187
- "min": 0.01,
188
- "max": 0.3,
189
- "step": 0.01,
190
- "target": {
191
- "emitter": "lumber_vehicle_gear_spin_main",
192
- "property": "windLineSpacing",
193
- "operator": "set"
194
- }
195
- },
196
- {
197
- "key": "lumber_vehicle_gear_spin.spinSpeed",
198
- "labelZh": "旋转速度",
199
- "type": "number",
200
- "default": 12,
201
- "min": 0,
202
- "max": 40,
203
- "step": 0.01,
204
- "target": {
205
- "emitter": "lumber_vehicle_gear_spin_main",
206
- "property": "spinSpeed",
207
- "operator": "set"
208
- }
209
- },
210
- {
211
- "key": "lumber_vehicle_gear_spin.color",
212
- "labelZh": "风圈颜色",
213
- "type": "color",
214
- "default": "#ffffff",
215
- "target": {
216
- "emitter": "lumber_vehicle_gear_spin_main",
217
- "property": "color",
218
- "operator": "set"
219
- }
220
- },
221
- {
222
- "key": "lumber_vehicle_gear_spin.hdrIntensity",
223
- "labelZh": "HDR强度",
224
- "type": "number",
225
- "default": 1.8,
226
- "min": 0,
227
- "max": 6,
228
- "step": 0.01,
229
- "target": {
230
- "emitter": "lumber_vehicle_gear_spin_main",
231
- "property": "hdrIntensity",
232
- "operator": "set"
233
- }
234
- },
235
- {
236
- "key": "lumber_vehicle_gear_spin.windLineAlpha",
237
- "labelZh": "风线透明度",
238
- "type": "number",
239
- "default": 0.68,
240
- "min": 0,
241
- "max": 1,
242
- "step": 0.01,
243
- "target": {
244
- "emitter": "lumber_vehicle_gear_spin_main",
245
- "property": "windLineAlpha",
246
- "operator": "set"
247
- }
248
- },
249
- {
250
- "key": "lumber_vehicle_gear_spin.effectScale",
251
- "labelZh": "整体缩放",
252
- "type": "number",
253
- "default": 1,
254
- "min": 0.1,
255
- "max": 4,
256
- "step": 0.01,
257
- "target": {
258
- "emitter": "lumber_vehicle_gear_spin_main",
259
- "property": "effectScale",
260
- "operator": "set"
261
- }
262
- },
263
- {
264
- "key": "lumber_vehicle_gear_spin.duration",
265
- "labelZh": "生命周期",
266
- "type": "number",
267
- "default": 1.2,
268
- "min": 0.1,
269
- "max": 5,
270
- "step": 0.01,
271
- "unit": "s",
272
- "target": {
273
- "emitter": "lumber_vehicle_gear_spin_main",
274
- "property": "duration",
275
- "operator": "set"
276
- }
277
- }
278
- ],
279
- "babylon": {
280
- "driver": "gearSpin",
281
- "previewConfig": {
282
- "textureUrl": null,
283
- "emitterCount": 1,
284
- "effectFile": "lumber_vehicle_gear_spin.json",
285
- "normalizedVfx": null
286
- }
287
- },
288
- "review": {
289
- "status": "draft",
290
- "artistNotes": [
291
- "Peripheral white wind motion arcs for a lumber vehicle gear or saw rotation.",
292
- "The effect intentionally avoids rendering the gear or cutting blade itself.",
293
- "All visuals are local geometry with additive translucent materials."
294
- ],
295
- "approvedBy": null,
296
- "approvedAt": null
297
- },
298
- "recording": {
299
- "provider": "local-placeholder",
300
- "recordedAt": "2026-06-02T00:00:00.000Z",
301
- "mimeType": "image/png",
302
- "durationSec": 1.2,
303
- "fps": 0,
304
- "media": {
305
- "previewVideo": null,
306
- "previewWebm": null,
307
- "previewMp4": null,
308
- "previewGif": null,
309
- "thumbnail": "media/thumbnail.png",
310
- "contactSheet": "media/contact-sheet.png",
311
- "gcsUri": null
312
- }
313
- },
314
- "search": {
315
- "tags": [
316
- "babylon",
317
- "gear spin",
318
- "motion ring",
319
- "wind streak",
320
- "lumber vehicle",
321
- "casual game"
322
- ],
323
- "descriptionEn": "A compact circular motion effect with peripheral white wind arcs for spinning lumber vehicle gear teeth.",
324
- "useCases": [
325
- "lumber vehicle gear rotating",
326
- "saw gear motion feedback",
327
- "machine action feedback"
328
- ],
329
- "negativeUseCases": [
330
- "upgrade aura",
331
- "dust burst",
332
- "wood chips",
333
- "fire",
334
- "explosion"
335
- ]
336
- },
337
- "legacyIds": []
338
- }