@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,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
- }