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