@fps-games/vfx 0.3.2 → 0.3.4

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 (234) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +5 -5
  3. package/dist/effects/treasure-attention/index.d.ts +1 -1
  4. package/package.json +6 -5
  5. package/tooling/vfx-cli.mjs +31 -22
  6. package/tooling/vfx-package-resolution.mjs +8 -8
  7. package/docs/AUTHORING_EFFECTS.md +0 -297
  8. package/docs/INTEGRATION.md +0 -194
  9. package/docs/VFX_LIBRARY_ARCHITECTURE_chatgpt.md +0 -1580
  10. package/docs/VFX_LIBRARY_EXECUTION_PLAN.md +0 -229
  11. package/docs/VFX_LIBRARY_PLAN.md +0 -546
  12. package/docs/hit-flash-red-method.md +0 -155
  13. package/docs/treasure_attention_fx_babylonjs_guide.md +0 -901
  14. package/docs/vfx-ab/RESULTS.md +0 -35
  15. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/after.png +0 -0
  16. package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/before.png +0 -0
  17. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/after.png +0 -0
  18. package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/before.png +0 -0
  19. package/docs/vfx-integration_chatgpt.md +0 -462
  20. package/docs/vfx-placement-design.md +0 -164
  21. package/docs/weapon-trail-visualization.html +0 -241
  22. package/packages/EffectPackageService.ts +0 -346
  23. package/packages/SceneVfxService.ts +0 -96
  24. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/runtime/simpleMeshEffect.v1.js +0 -333
  25. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.frag.glsl +0 -25
  26. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.vert.glsl +0 -11
  27. package/packages/build.mesh.yellow_build_upgrade_indicator/assets/textures/effect_jianbian.png +0 -0
  28. package/packages/build.mesh.yellow_build_upgrade_indicator/effect.json +0 -927
  29. package/packages/build.mesh.yellow_build_upgrade_indicator/media/contact-sheet.png +0 -0
  30. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.gif +0 -0
  31. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.mp4 +0 -0
  32. package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.webm +0 -0
  33. package/packages/build.mesh.yellow_build_upgrade_indicator/media/thumbnail.png +0 -0
  34. package/packages/build.mesh.yellow_build_upgrade_indicator/metadata/description.json +0 -197
  35. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-effect.original.json +0 -895
  36. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-normalized-vfx-to-babylon-report.json +0 -241
  37. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-overrides.json +0 -542
  38. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-tuning-report.json +0 -69
  39. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/asset-map.json +0 -125
  40. package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/lineage.json +0 -44
  41. package/packages/build.particle.golden_upgrade_starburst/assets/runtime/particleEmitter.v1.js +0 -210
  42. package/packages/build.particle.golden_upgrade_starburst/assets/textures/effect_guangdian.png +0 -0
  43. package/packages/build.particle.golden_upgrade_starburst/effect.json +0 -880
  44. package/packages/build.particle.golden_upgrade_starburst/media/contact-sheet.png +0 -0
  45. package/packages/build.particle.golden_upgrade_starburst/media/preview.gif +0 -0
  46. package/packages/build.particle.golden_upgrade_starburst/media/preview.mp4 +0 -0
  47. package/packages/build.particle.golden_upgrade_starburst/media/preview.webm +0 -0
  48. package/packages/build.particle.golden_upgrade_starburst/media/thumbnail.png +0 -0
  49. package/packages/build.particle.golden_upgrade_starburst/metadata/description.json +0 -161
  50. package/packages/build.particle.golden_upgrade_starburst/provenance/03-effect.original.json +0 -762
  51. package/packages/build.particle.golden_upgrade_starburst/provenance/03-normalized-vfx-to-babylon-report.json +0 -260
  52. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-overrides.json +0 -436
  53. package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-tuning-report.json +0 -40
  54. package/packages/build.particle.golden_upgrade_starburst/provenance/asset-map.json +0 -115
  55. package/packages/build.particle.golden_upgrade_starburst/provenance/lineage.json +0 -40
  56. package/packages/build.particle.orange_upgrade_transform_sparks/assets/runtime/particleEmitter.v1.js +0 -210
  57. package/packages/build.particle.orange_upgrade_transform_sparks/assets/textures/b5b27ab1-e740-4398-b407-848fc2b2c897.png +0 -0
  58. package/packages/build.particle.orange_upgrade_transform_sparks/effect.json +0 -887
  59. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.gif +0 -0
  60. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.mp4 +0 -0
  61. package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.webm +0 -0
  62. package/packages/build.particle.orange_upgrade_transform_sparks/media/thumbnail.png +0 -0
  63. package/packages/build.particle.orange_upgrade_transform_sparks/metadata/description.json +0 -179
  64. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-effect.original.json +0 -859
  65. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-normalized-vfx-to-babylon-report.json +0 -260
  66. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-overrides.json +0 -478
  67. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-tuning-report.json +0 -40
  68. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/asset-map.json +0 -114
  69. package/packages/build.particle.orange_upgrade_transform_sparks/provenance/lineage.json +0 -41
  70. package/packages/build.particle.wood_chip_dust_burst/assets/runtime/particleEmitter.v1.js +0 -210
  71. package/packages/build.particle.wood_chip_dust_burst/assets/textures/effect_yanwu4.png +0 -0
  72. package/packages/build.particle.wood_chip_dust_burst/assets/textures/suipian3.png +0 -0
  73. package/packages/build.particle.wood_chip_dust_burst/effect.json +0 -1400
  74. package/packages/build.particle.wood_chip_dust_burst/media/contact-sheet.png +0 -0
  75. package/packages/build.particle.wood_chip_dust_burst/media/preview.gif +0 -0
  76. package/packages/build.particle.wood_chip_dust_burst/media/preview.mp4 +0 -0
  77. package/packages/build.particle.wood_chip_dust_burst/media/preview.webm +0 -0
  78. package/packages/build.particle.wood_chip_dust_burst/media/thumbnail.png +0 -0
  79. package/packages/build.particle.wood_chip_dust_burst/metadata/description.json +0 -173
  80. package/packages/build.particle.wood_chip_dust_burst/provenance/03-effect.original.json +0 -1277
  81. package/packages/build.particle.wood_chip_dust_burst/provenance/03-normalized-vfx-to-babylon-report.json +0 -329
  82. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-overrides.json +0 -749
  83. package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-tuning-report.json +0 -60
  84. package/packages/build.particle.wood_chip_dust_burst/provenance/asset-map.json +0 -146
  85. package/packages/build.particle.wood_chip_dust_burst/provenance/lineage.json +0 -69
  86. package/packages/effects/building-upgrade/effect.json +0 -6
  87. package/packages/effects/building-upgrade/index.ts +0 -387
  88. package/packages/effects/character-entrance/effect.json +0 -6
  89. package/packages/effects/character-entrance/index.ts +0 -308
  90. package/packages/effects/coin-burst/index.ts +0 -48
  91. package/packages/effects/comet-trail-flame/assets/textures/trail_5x4.webp +0 -0
  92. package/packages/effects/comet-trail-flame/index.ts +0 -107
  93. package/packages/effects/conveyor-upgrade/effect.json +0 -6
  94. package/packages/effects/conveyor-upgrade/index.ts +0 -401
  95. package/packages/effects/debris-smoke/assets/models/rock_debris.glb +0 -0
  96. package/packages/effects/debris-smoke/assets/textures/smoke22.webp +0 -0
  97. package/packages/effects/debris-smoke/index.ts +0 -102
  98. package/packages/effects/door_open_gold_flakes/assets/runtime/goldFlakes.v1.js +0 -397
  99. package/packages/effects/door_open_gold_flakes/door_open_gold_flakes.json +0 -498
  100. package/packages/effects/door_open_gold_flakes/index.ts +0 -11
  101. package/packages/effects/electric-arc/assets/textures/spark_4x4.webp +0 -0
  102. package/packages/effects/electric-arc/index.ts +0 -63
  103. package/packages/effects/energy-shield/effect.json +0 -7
  104. package/packages/effects/energy-shield/index.ts +0 -432
  105. package/packages/effects/explosion/assets/textures/baozha29.webp +0 -0
  106. package/packages/effects/explosion/assets/textures/glow01.webp +0 -0
  107. package/packages/effects/explosion/assets/textures/lizi01.webp +0 -0
  108. package/packages/effects/explosion/assets/textures/xulie_lizibaozha02_5x5.webp +0 -0
  109. package/packages/effects/explosion/index.ts +0 -115
  110. package/packages/effects/ground-tile-upgrade/effect.json +0 -6
  111. package/packages/effects/ground-tile-upgrade/index.ts +0 -410
  112. package/packages/effects/hit-flash/index.ts +0 -77
  113. package/packages/effects/laser-beam/assets/textures/laser_glow.webp +0 -0
  114. package/packages/effects/laser-beam/assets/textures/laser_noise.webp +0 -0
  115. package/packages/effects/laser-beam/index.ts +0 -6
  116. package/packages/effects/laser-beam-factory.ts +0 -146
  117. package/packages/effects/lumber-cart-suction/effect.json +0 -6
  118. package/packages/effects/lumber-cart-suction/index.ts +0 -399
  119. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb +0 -0
  120. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/.active +0 -1
  121. package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/1781589063890_upload.glb +0 -0
  122. package/packages/effects/lumber-debris-scatter/assets/runtime/solidParticleScatter.v1.js +0 -236
  123. package/packages/effects/lumber-debris-scatter/effect.json +0 -228
  124. package/packages/effects/lumber-debris-scatter/index.ts +0 -780
  125. package/packages/effects/lumber_vehicle_gear_spin/assets/runtime/gearSpin.v1.js +0 -202
  126. package/packages/effects/lumber_vehicle_gear_spin/index.ts +0 -11
  127. package/packages/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json +0 -338
  128. package/packages/effects/lumber_vehicle_upgrade_aura/assets/runtime/upgradeAura.v1.js +0 -353
  129. package/packages/effects/lumber_vehicle_upgrade_aura/index.ts +0 -13
  130. package/packages/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json +0 -365
  131. package/packages/effects/lumber_vehicle_wood_chips/assets/runtime/solidParticleScatter.v1.js +0 -310
  132. package/packages/effects/lumber_vehicle_wood_chips/index.ts +0 -11
  133. package/packages/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json +0 -335
  134. package/packages/effects/monster-hit/index.ts +0 -129
  135. package/packages/effects/player-upgrade/effect.json +0 -6
  136. package/packages/effects/player-upgrade/index.ts +0 -640
  137. package/packages/effects/pulse-laser-volley/assets/textures/bolt_guangshu.webp +0 -0
  138. package/packages/effects/pulse-laser-volley/index.ts +0 -215
  139. package/packages/effects/resource-collect-sparkles/effect.json +0 -6
  140. package/packages/effects/resource-collect-sparkles/index.ts +0 -254
  141. package/packages/effects/run-footstep-dust/assets/runtime/runFootstepDust.v1.js +0 -215
  142. package/packages/effects/run-footstep-dust/effect.json +0 -183
  143. package/packages/effects/run-footstep-dust/index.ts +0 -377
  144. package/packages/effects/space-shared.ts +0 -120
  145. package/packages/effects/thruster-flame/index.ts +0 -306
  146. package/packages/effects/treasure-attention/effect.json +0 -7
  147. package/packages/effects/treasure-attention/index.ts +0 -630
  148. package/packages/effects/tree-chop-dust/assets/textures/tree_chop_dust_atlas.png +0 -0
  149. package/packages/effects/tree-chop-dust/effect.json +0 -8
  150. package/packages/effects/tree-chop-dust/index.ts +0 -202
  151. package/packages/effects/tree-leaf-chop-burst/assets/runtime/particleEmitter.v1.js +0 -303
  152. package/packages/effects/tree-leaf-chop-burst/assets/textures/tree_leaf_chop_burst_leaf_atlas.png +0 -0
  153. package/packages/effects/tree-leaf-chop-burst/effect.json +0 -498
  154. package/packages/effects/tree-leaf-chop-burst/index.ts +0 -294
  155. package/packages/effects/tree_chop_dust_burst/assets/runtime/particleEmitter.v1.js +0 -318
  156. package/packages/effects/tree_chop_dust_burst/assets/textures/tree_chop_dust_burst_dust.png +0 -0
  157. package/packages/effects/tree_chop_dust_burst/index.ts +0 -13
  158. package/packages/effects/tree_chop_dust_burst/tree_chop_dust_burst.json +0 -412
  159. package/packages/effects/ufo-thread-flame/assets/textures/flame_flow.webp +0 -0
  160. package/packages/effects/ufo-thread-flame/assets/textures/flame_spike.webp +0 -0
  161. package/packages/effects/ufo-thread-flame/index.ts +0 -153
  162. package/packages/effects/vehicle-exhaust-smoke/assets/textures/vehicle_exhaust_smoke_atlas.png +0 -0
  163. package/packages/effects/vehicle-exhaust-smoke/effect.json +0 -8
  164. package/packages/effects/vehicle-exhaust-smoke/index.ts +0 -298
  165. package/packages/effects/vehicle-upgrade/effect.json +0 -6
  166. package/packages/effects/vehicle-upgrade/index.ts +0 -404
  167. package/packages/effects/weapon-trail/assets/textures/trail_wedge.png +0 -0
  168. package/packages/effects/weapon-trail/index.ts +0 -317
  169. package/packages/effects/wood-crusher-sawdust/assets/runtime/particleEmitter.v1.js +0 -312
  170. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  171. package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  172. package/packages/effects/wood-crusher-sawdust/index.ts +0 -43
  173. package/packages/effects/wood-crusher-sawdust/wood_crusher_sawdust.json +0 -592
  174. package/packages/effects/wood-cutter-sawdust/assets/runtime/particleEmitter.v1.js +0 -312
  175. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  176. package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  177. package/packages/effects/wood-cutter-sawdust/index.ts +0 -43
  178. package/packages/effects/wood-cutter-sawdust/wood_cutter_sawdust.json +0 -592
  179. package/packages/effects/wood-sawdust-effect-factory.ts +0 -194
  180. package/packages/effects/wood_crusher_sawdust/assets/runtime/particleEmitter.v1.js +0 -318
  181. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
  182. package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
  183. package/packages/effects/wood_crusher_sawdust/index.ts +0 -29
  184. package/packages/effects/wood_crusher_sawdust/wood_crusher_sawdust.json +0 -592
  185. package/packages/effects/wood_cutter_sawdust/assets/runtime/particleEmitter.v1.js +0 -318
  186. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
  187. package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
  188. package/packages/effects/wood_cutter_sawdust/index.ts +0 -29
  189. package/packages/effects/wood_cutter_sawdust/wood_cutter_sawdust.json +0 -592
  190. package/packages/effects/wood_peel_material_test/assets/runtime/woodPeelMaterialTest.v1.js +0 -196
  191. package/packages/effects/wood_peel_material_test/index.ts +0 -11
  192. package/packages/effects/wood_peel_material_test/wood_peel_material_test.json +0 -136
  193. package/packages/env.particle.forest_edge_fog/assets/runtime/particleEmitter.v1.js +0 -210
  194. package/packages/env.particle.forest_edge_fog/assets/textures/f12a23c4-b924-4322-a260-3d982428f1e8.png +0 -0
  195. package/packages/env.particle.forest_edge_fog/assets/textures/yuan.png +0 -0
  196. package/packages/env.particle.forest_edge_fog/effect.json +0 -854
  197. package/packages/env.particle.forest_edge_fog/media/preview.gif +0 -0
  198. package/packages/env.particle.forest_edge_fog/media/preview.mp4 +0 -0
  199. package/packages/env.particle.forest_edge_fog/media/preview.webm +0 -0
  200. package/packages/env.particle.forest_edge_fog/media/thumbnail.png +0 -0
  201. package/packages/env.particle.forest_edge_fog/metadata/description.json +0 -148
  202. package/packages/env.particle.forest_edge_fog/provenance/03-effect.original.json +0 -827
  203. package/packages/env.particle.forest_edge_fog/provenance/03-normalized-vfx-to-babylon-report.json +0 -196
  204. package/packages/env.particle.forest_edge_fog/provenance/04-preview-overrides.json +0 -432
  205. package/packages/env.particle.forest_edge_fog/provenance/04-preview-tuning-report.json +0 -28
  206. package/packages/env.particle.forest_edge_fog/provenance/asset-map.json +0 -124
  207. package/packages/env.particle.forest_edge_fog/provenance/lineage.json +0 -41
  208. package/packages/generation.ts +0 -14
  209. package/packages/index.ts +0 -14
  210. package/packages/legacy-particle-runtime.ts +0 -113
  211. package/packages/manifestRuntimePackage.ts +0 -519
  212. package/packages/registry.ts +0 -85
  213. package/packages/rendering.ts +0 -13
  214. package/packages/resource.particle.viscous_oil_suction/assets/runtime/top_disk_suction/particleEmitter.v1.js +0 -424
  215. package/packages/resource.particle.viscous_oil_suction/assets/textures/Glow ad.png +0 -0
  216. package/packages/resource.particle.viscous_oil_suction/effect.json +0 -1254
  217. package/packages/resource.particle.viscous_oil_suction/media/preview.gif +0 -0
  218. package/packages/resource.particle.viscous_oil_suction/media/preview.mp4 +0 -0
  219. package/packages/resource.particle.viscous_oil_suction/media/preview.webm +0 -0
  220. package/packages/resource.particle.viscous_oil_suction/media/thumbnail.png +0 -0
  221. package/packages/resource.particle.viscous_oil_suction/metadata/description.json +0 -122
  222. package/packages/resource.particle.viscous_oil_suction/provenance/03-effect.original.json +0 -1051
  223. package/packages/resource.particle.viscous_oil_suction/provenance/03-normalized-vfx-to-babylon-report.json +0 -200
  224. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-overrides.json +0 -581
  225. package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-tuning-report.json +0 -28
  226. package/packages/resource.particle.viscous_oil_suction/provenance/asset-map.json +0 -111
  227. package/packages/resource.particle.viscous_oil_suction/provenance/lineage.json +0 -45
  228. package/packages/types.ts +0 -195
  229. package/tooling/check-dist-runtime.mjs +0 -166
  230. package/tooling/generate-index.mjs +0 -55
  231. package/tooling/test-guardrails.mjs +0 -157
  232. package/tooling/validate-boundary.mjs +0 -92
  233. package/tooling/validate-effects.mjs +0 -304
  234. package/tooling/validate.mjs +0 -53
@@ -1,306 +0,0 @@
1
- // 战机 shader 推进焰(移植自 babylon-laser index.html thrusterJet, 特效#14)。
2
- // 程序锥管 + 三段 GLSL(顶点径向舔动 + 片元 fBM 侵蚀/三段色温/马赫环 + 旋涡薄壳)+ 程序噪声纹理。
3
- // 纯自给:无外部贴图/glb。沿 root 局部 +Z 喷出(z=0 喷口、z=length 尾尖)。
4
- import { Mesh } from '@babylonjs/core/Meshes/mesh';
5
- import { VertexData } from '@babylonjs/core/Meshes/mesh.vertexData';
6
- import { ShaderMaterial } from '@babylonjs/core/Materials/shaderMaterial';
7
- import { Effect } from '@babylonjs/core/Materials/effect';
8
- import { RawTexture } from '@babylonjs/core/Materials/Textures/rawTexture';
9
- import { Texture } from '@babylonjs/core/Materials/Textures/texture';
10
- import { Constants } from '@babylonjs/core/Engines/constants';
11
- import { Vector3 } from '@babylonjs/core/Maths/math.vector';
12
- import type { Scene } from '@babylonjs/core/scene';
13
- import type { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh';
14
- import type { VfxColorValue, VfxEffectPackage, VfxParamValues } from '../../types';
15
- import { LIFETIME_DEBUG_PARAMS, LIFETIME_DEFAULTS, scheduleLifetime } from '../space-shared';
16
-
17
- type EngineMode = 'ion' | 'chem' | 'plasma';
18
-
19
- interface ThrusterFlameParams extends VfxParamValues {
20
- lifetimeMode: string; lifetime: number;
21
- throttle: number; // 推力 %(0..100)
22
- flow: number; // 流速 %(0..100)
23
- afterburner: number; // 加力 %(0..100)
24
- mode: EngineMode; // 引擎模式(运动预设:离子/化燃/等离子)
25
- rootColor: VfxColorValue;
26
- tipColor: VfxColorValue;
27
- coreColor: VfxColorValue;
28
- }
29
-
30
- // ── 引擎模式预设(运动/形状;颜色由 *Color 参数控制,默认取 ion) ──────────────────
31
- interface Preset { diamonds: number; diamondCount: number; lenMul: number; widthMul: number; speed: number; wobble: number; intensity: number; }
32
- const PRESETS: Record<EngineMode, Preset> = {
33
- ion: { diamonds: 0.18, diamondCount: 6.0, lenMul: 1.15, widthMul: 0.92, speed: 1.25, wobble: 0.055, intensity: 1.0 },
34
- chem: { diamonds: 0.95, diamondCount: 5.0, lenMul: 0.85, widthMul: 1.12, speed: 1.0, wobble: 0.075, intensity: 1.05 },
35
- plasma: { diamonds: 0.45, diamondCount: 7.0, lenMul: 1.0, widthMul: 1.0, speed: 1.5, wobble: 0.065, intensity: 1.05 },
36
- };
37
-
38
- const FLAME_LEN = 3.3;
39
- const FLAME_R = 0.235;
40
-
41
- const DEFAULT_PARAMS: ThrusterFlameParams = {
42
- ...LIFETIME_DEFAULTS,
43
- throttle: 60, flow: 50, afterburner: 0, mode: 'ion',
44
- rootColor: { r: 0.42, g: 0.80, b: 1.0 },
45
- tipColor: { r: 0.10, g: 0.30, b: 1.0 },
46
- coreColor: { r: 1.0, g: 1.0, b: 1.0 },
47
- };
48
-
49
- // ── GLSL(从 babylon-laser 原样移植,一字未改)──────────────────────────────────
50
- const FLAME_VERTEX = `precision highp float;
51
- attribute vec3 position;
52
- attribute vec2 uv;
53
- uniform mat4 worldViewProjection;
54
- uniform float time;
55
- uniform float uSpeed;
56
- uniform float uWobble;
57
- varying vec2 vUV;
58
- void main(){
59
- vUV = uv;
60
- float v = uv.y;
61
- float ang = uv.x * 6.2831853;
62
- vec3 p = position;
63
- float w = sin(v * 9.0 - time * uSpeed * 9.5 + sin(ang * 3.0 + time * 1.3) * 1.6)
64
- + 0.5 * sin(v * 17.0 - time * uSpeed * 14.5 + ang * 2.0);
65
- float amp = pow(v, 1.6) * uWobble;
66
- p.xy += vec2(cos(ang), sin(ang)) * w * amp;
67
- float sway = pow(v, 2.0) * uWobble * 1.3;
68
- p.x += sin(time * 2.1) * sway;
69
- p.y += cos(time * 1.6) * sway;
70
- p.z *= 1.0 + 0.05 * sin(time * 13.0 + ang) * v;
71
- gl_Position = worldViewProjection * vec4(p, 1.0);
72
- }`;
73
-
74
- const FLAME_FRAGMENT = `precision highp float;
75
- varying vec2 vUV;
76
- uniform sampler2D noiseTex;
77
- uniform float time;
78
- uniform float uSpeed;
79
- uniform float uIntensity;
80
- uniform vec3 uColorCore;
81
- uniform vec3 uColorRoot;
82
- uniform vec3 uColorTip;
83
- uniform float uDiamonds;
84
- uniform float uDiamondCount;
85
- void main(){
86
- float v = vUV.y;
87
- float u = vUV.x;
88
- float n1 = texture2D(noiseTex, vec2(u * 2.0, v * 1.8 - time * uSpeed * 2.8)).r;
89
- float n2 = texture2D(noiseTex, vec2(u * 4.0 + 0.37, v * 3.6 - time * uSpeed * 5.2)).g;
90
- float n = n1 * 0.62 + n2 * 0.38;
91
- float th = mix(0.13, 0.80, pow(v, 1.15));
92
- float body = smoothstep(th, th + 0.22, n);
93
- float tipFade = 1.0 - smoothstep(0.62, 1.0, v);
94
- float rootCore = pow(1.0 - v, 2.2);
95
- float dm = pow(abs(sin(v * uDiamondCount * 3.14159)), 16.0)
96
- * (1.0 - smoothstep(0.45, 0.78, v)) * uDiamonds;
97
- float heat = clamp(rootCore * 1.45 + n * 0.25 + dm * 0.85, 0.0, 1.0);
98
- vec3 col = mix(uColorRoot, uColorTip, smoothstep(0.18, 0.92, v));
99
- col = mix(col, uColorCore, smoothstep(0.65, 1.0, heat));
100
- float a = body * tipFade;
101
- a = max(a, rootCore * 0.92);
102
- float strength = (a + dm * 0.9) * uIntensity;
103
- gl_FragColor = vec4(col * strength, 1.0);
104
- }`;
105
-
106
- const SWIRL_FRAGMENT = `precision highp float;
107
- varying vec2 vUV;
108
- uniform sampler2D noiseTex;
109
- uniform float time;
110
- uniform float uSpeed;
111
- uniform float uIntensity;
112
- uniform vec3 uColorRoot;
113
- void main(){
114
- float v = vUV.y;
115
- float u = vUV.x;
116
- float n = texture2D(noiseTex,
117
- vec2(u * 1.5 + v * 1.4 - time * uSpeed * 2.0, v * 1.2 - time * uSpeed * 3.8)).r;
118
- float streak = smoothstep(0.55, 0.82, n);
119
- float fade = sin(v * 3.14159);
120
- float strength = streak * fade * uIntensity * 0.30;
121
- gl_FragColor = vec4(uColorRoot * strength, 1.0);
122
- }`;
123
-
124
- let shadersRegistered = false;
125
- function registerShaders(): void {
126
- if (shadersRegistered) return;
127
- Effect.ShadersStore['vfxThrusterFlameVertexShader'] = FLAME_VERTEX;
128
- Effect.ShadersStore['vfxThrusterFlameFragmentShader'] = FLAME_FRAGMENT;
129
- Effect.ShadersStore['vfxThrusterSwirlFragmentShader'] = SWIRL_FRAGMENT;
130
- shadersRegistered = true;
131
- }
132
-
133
- // ── 程序噪声纹理(可平铺 fBM,R/G 两套八度)──────────────────────────────────────
134
- function makeNoiseTexture(scene: Scene): RawTexture {
135
- const S = 256;
136
- const data = new Uint8Array(S * S * 4);
137
- type Lat = { vals: Float32Array; g: number };
138
- function lattice(seed: number, g: number): Lat {
139
- const vals = new Float32Array(g * g);
140
- let s = seed;
141
- for (let i = 0; i < vals.length; i++) { s = (s * 16807) % 2147483647; vals[i] = (s - 1) / 2147483646; }
142
- return { vals, g };
143
- }
144
- function sample(L: Lat, x: number, y: number): number {
145
- const g = L.g; const fx = x * g, fy = y * g;
146
- let x0 = Math.floor(fx), y0 = Math.floor(fy);
147
- const tx = fx - x0, ty = fy - y0;
148
- const sx = tx * tx * (3 - 2 * tx), sy = ty * ty * (3 - 2 * ty);
149
- const x1 = (x0 + 1) % g, y1 = (y0 + 1) % g; x0 = ((x0 % g) + g) % g; y0 = ((y0 % g) + g) % g;
150
- const a = L.vals[y0 * g + x0], b = L.vals[y0 * g + x1], c = L.vals[y1 * g + x0], d = L.vals[y1 * g + x1];
151
- return a + (b - a) * sx + (c - a) * sy + (a - b - c + d) * sx * sy;
152
- }
153
- function fbm(layers: Lat[], x: number, y: number): number {
154
- let v = 0, amp = 0.5, tot = 0;
155
- for (const L of layers) { v += sample(L, x, y) * amp; tot += amp; amp *= 0.5; }
156
- return v / tot;
157
- }
158
- const R = [lattice(1234, 4), lattice(5678, 8), lattice(91011, 16), lattice(1213, 32)];
159
- const G = [lattice(4321, 8), lattice(8765, 16), lattice(1110, 32), lattice(3141, 64)];
160
- for (let y = 0; y < S; y++) for (let x = 0; x < S; x++) {
161
- const u = x / S, vv = y / S; const o = (y * S + x) * 4;
162
- data[o] = (fbm(R, u, vv) * 255) | 0;
163
- data[o + 1] = (fbm(G, u, vv) * 255) | 0;
164
- data[o + 2] = 0; data[o + 3] = 255;
165
- }
166
- const tex = new RawTexture(data, S, S, Constants.TEXTUREFORMAT_RGBA, scene, false, false, Texture.BILINEAR_SAMPLINGMODE);
167
- tex.wrapU = tex.wrapV = Texture.WRAP_ADDRESSMODE;
168
- return tex;
169
- }
170
-
171
- // ── 喇叭锥管几何(沿 +Z,z=0 喷口、z=length 尾尖,无端盖)──────────────────────────
172
- function buildFlameMesh(name: string, scene: Scene, length: number, radius: number, rings: number, sides: number): Mesh {
173
- const positions: number[] = [], uvs: number[] = [], indices: number[] = [];
174
- for (let i = 0; i <= rings; i++) {
175
- const t = i / rings;
176
- const bulge = 1 + 0.30 * Math.sin(Math.PI * Math.min(t / 0.55, 1));
177
- const taper = t < 0.25 ? 1 : Math.pow(1 - (t - 0.25) / 0.75, 0.78);
178
- const r = radius * bulge * taper + 0.0005;
179
- for (let j = 0; j <= sides; j++) {
180
- const a = (j / sides) * 2 * Math.PI;
181
- positions.push(Math.cos(a) * r, Math.sin(a) * r, t * length);
182
- uvs.push(j / sides, t);
183
- }
184
- }
185
- for (let i = 0; i < rings; i++) for (let j = 0; j < sides; j++) {
186
- const a = i * (sides + 1) + j, b = a + 1, c = a + sides + 1, d = c + 1;
187
- indices.push(a, c, b, b, c, d);
188
- }
189
- const mesh = new Mesh(name, scene);
190
- const vd = new VertexData(); vd.positions = positions; vd.uvs = uvs; vd.indices = indices;
191
- vd.applyToMesh(mesh);
192
- mesh.alwaysSelectAsActiveMesh = true; // 顶点位移超出包围盒,关视锥剔除
193
- mesh.isPickable = false;
194
- return mesh;
195
- }
196
-
197
- function makeFXMaterial(name: string, scene: Scene, fragment: 'vfxThrusterFlame' | 'vfxThrusterSwirl', noiseTex: RawTexture): ShaderMaterial {
198
- const mat = new ShaderMaterial(name, scene, { vertex: 'vfxThrusterFlame', fragment }, {
199
- attributes: ['position', 'uv'],
200
- uniforms: ['worldViewProjection', 'time', 'uSpeed', 'uWobble', 'uIntensity', 'uColorCore', 'uColorRoot', 'uColorTip', 'uDiamonds', 'uDiamondCount'],
201
- samplers: ['noiseTex'],
202
- needAlphaBlending: true,
203
- });
204
- mat.setTexture('noiseTex', noiseTex);
205
- mat.alphaMode = Constants.ALPHA_ADD;
206
- mat.backFaceCulling = false;
207
- mat.disableDepthWrite = true;
208
- return mat;
209
- }
210
-
211
- function v3(c: VfxColorValue): Vector3 { return new Vector3(c.r, c.g, c.b); }
212
-
213
- // 把网格从场景里任何 GlowLayer 排除(ctx 不带 glow 引用,自查 scene.effectLayers)
214
- function excludeFromGlow(scene: Scene, mesh: AbstractMesh): void {
215
- for (const layer of scene.effectLayers ?? []) {
216
- const add = (layer as unknown as { addExcludedMesh?: (m: AbstractMesh) => void }).addExcludedMesh;
217
- if (typeof add === 'function') add.call(layer, mesh);
218
- }
219
- }
220
-
221
- export const thrusterFlameEffectPackage: VfxEffectPackage<ThrusterFlameParams> = {
222
- id: 'thruster-flame',
223
- nameZh: '战机尾焰',
224
- placement: 'socket',
225
- defaultParams: DEFAULT_PARAMS,
226
- debugAnchor: 'playerRight',
227
- debugParams: [
228
- ...LIFETIME_DEBUG_PARAMS,
229
- { key: 'throttle', label: '推力 %', kind: 'number', min: 0, max: 100, step: 1 },
230
- { key: 'flow', label: '流速 %', kind: 'number', min: 0, max: 100, step: 1 },
231
- { key: 'afterburner', label: '加力 %', kind: 'number', min: 0, max: 100, step: 1 },
232
- { key: 'mode', label: '引擎模式', kind: 'enum', options: [
233
- { value: 'ion', label: '离子(蓝)' }, { value: 'chem', label: '化燃(橙)' }, { value: 'plasma', label: '等离子(紫)' },
234
- ] },
235
- { key: 'rootColor', label: '根部色', kind: 'color' },
236
- { key: 'tipColor', label: '尾端色', kind: 'color' },
237
- { key: 'coreColor', label: '内核色', kind: 'color' },
238
- ],
239
-
240
- create({ scene, root, position, params, renderingGroupId }) {
241
- root.position.copyFrom(position);
242
- registerShaders();
243
- const preset = PRESETS[(params.mode as EngineMode)] ?? PRESETS.ion;
244
- const noiseTex = makeNoiseTexture(scene);
245
-
246
- const outer = buildFlameMesh('vfx_thruster_outer', scene, FLAME_LEN, FLAME_R, 30, 24);
247
- const core = buildFlameMesh('vfx_thruster_core', scene, FLAME_LEN * 0.68, FLAME_R * 0.5, 24, 18);
248
- const swirl = buildFlameMesh('vfx_thruster_swirl', scene, FLAME_LEN * 0.42, FLAME_R * 1.3, 14, 24);
249
- for (const m of [outer, core, swirl]) { m.parent = root; m.renderingGroupId = renderingGroupId ?? 0; excludeFromGlow(scene, m); }
250
-
251
- const outerMat = makeFXMaterial('vfx_thruster_outerMat', scene, 'vfxThrusterFlame', noiseTex);
252
- const coreMat = makeFXMaterial('vfx_thruster_coreMat', scene, 'vfxThrusterFlame', noiseTex);
253
- const swirlMat = makeFXMaterial('vfx_thruster_swirlMat', scene, 'vfxThrusterSwirl', noiseTex);
254
- outer.material = outerMat; core.material = coreMat; swirl.material = swirlMat;
255
-
256
- // 颜色分配(coreMat 整体更靠 core/root;swirl 只用 root)
257
- const coreCol = v3(params.coreColor), rootCol = v3(params.rootColor), tipCol = v3(params.tipColor);
258
- outerMat.setVector3('uColorCore', coreCol); outerMat.setVector3('uColorRoot', rootCol); outerMat.setVector3('uColorTip', tipCol);
259
- coreMat.setVector3('uColorCore', coreCol); coreMat.setVector3('uColorRoot', coreCol); coreMat.setVector3('uColorTip', rootCol);
260
- swirlMat.setVector3('uColorRoot', rootCol);
261
- for (const mat of [outerMat, coreMat, swirlMat]) { mat.setFloat('uDiamondCount', preset.diamondCount); mat.setFloat('uDiamonds', 0); }
262
-
263
- // 缓动状态
264
- let t = 0, throttle = 0, flow = 0, abVis = 0;
265
- const targetThrottle = params.throttle / 100, targetFlow = params.flow / 100, targetAb = params.afterburner / 100;
266
-
267
- const observer = scene.onBeforeRenderObservable.add(() => {
268
- const dt = Math.min(scene.getEngine().getDeltaTime() / 1000, 0.05); t += dt;
269
- const k = 1 - Math.exp(-dt * 5);
270
- throttle += (targetThrottle - throttle) * k;
271
- flow += (targetFlow - flow) * k;
272
- abVis += (targetAb - abVis) * (1 - Math.exp(-dt * 7));
273
- const eff = throttle * (1 + abVis * 0.45);
274
- const flowMul = 0.2 + flow * 4.8;
275
-
276
- const lenS = (0.3 + eff * 1.0) * preset.lenMul;
277
- const widS = (0.8 + eff * 0.32) * preset.widthMul;
278
- const flick = 1 + 0.04 * Math.sin(t * 17.0) + 0.03 * Math.sin(t * 29.3);
279
- outer.scaling.set(widS, widS, lenS * flick);
280
- core.scaling.set(widS, widS, lenS * (1 + abVis * 0.25) * flick);
281
- swirl.scaling.set(widS * 1.05, widS * 1.05, Math.max(lenS * 0.85, 0.25));
282
-
283
- const inten = preset.intensity * (0.12 + eff * 1.05);
284
- const speed = preset.speed * flowMul;
285
- const wob = preset.wobble * (0.7 + eff * 0.6);
286
- for (const mat of [outerMat, coreMat, swirlMat]) {
287
- mat.setFloat('time', t); mat.setFloat('uSpeed', speed); mat.setFloat('uWobble', wob); mat.setFloat('uIntensity', inten);
288
- }
289
- outerMat.setFloat('uDiamonds', preset.diamonds * Math.min(1, eff * 1.2) * (1 + abVis * 0.8));
290
- });
291
-
292
- let disposed = false;
293
- let ltTimer = 0;
294
- const dispose = (): void => {
295
- if (disposed) return; disposed = true;
296
- if (ltTimer) window.clearTimeout(ltTimer);
297
- scene.onBeforeRenderObservable.remove(observer);
298
- outer.dispose(); core.dispose(); swirl.dispose();
299
- outerMat.dispose(); coreMat.dispose(); swirlMat.dispose();
300
- noiseTex.dispose();
301
- root.dispose();
302
- };
303
- ltTimer = scheduleLifetime(params, dispose);
304
- return { root, dispose };
305
- },
306
- };
@@ -1,7 +0,0 @@
1
- {
2
- "id": "treasure-attention",
3
- "nameZh": "宝藏注意力光效",
4
- "search": {
5
- "tags": ["treasure", "attention", "pickup", "gold", "sparkle", "aura", "ring"]
6
- }
7
- }