@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,353 +0,0 @@
1
- export const runtimeId = "upgradeAura/v1";
2
-
3
- export const runtimeContract = {
4
- runtimeId,
5
- kind: "upgradeAura",
6
- emitterFields: {
7
- origin: "World-space center of the upgrade aura.",
8
- duration: "Total effect lifetime in seconds.",
9
- spiralTurns: "Number of turns in the continuous rising spiral.",
10
- ringRiseHeight: "World-space travel height of the whole spiral during its lifetime.",
11
- spiralHeight: "Static local height of the spiral shape.",
12
- sparkleCount: "Number of body sparkles emitted during the effect.",
13
- ringColor: "Primary spiral color.",
14
- bodyGlowColor: "Vertical body glow color.",
15
- hdrIntensity: "Shared HDR emissive intensity for the upgrade light.",
16
- },
17
- };
18
-
19
- function num(value, fallback = 0) {
20
- const next = Number(value);
21
- return Number.isFinite(next) ? next : fallback;
22
- }
23
-
24
- function readVec(BABYLON, value, fallback = new BABYLON.Vector3(0, 0, 0)) {
25
- if (!value) return fallback.clone ? fallback.clone() : fallback;
26
- return new BABYLON.Vector3(num(value.x, fallback.x), num(value.y, fallback.y), num(value.z, fallback.z));
27
- }
28
-
29
- function readColor3(BABYLON, value, fallback = new BABYLON.Color3(1, 0.84, 0.22)) {
30
- if (!value) return fallback;
31
- return new BABYLON.Color3(num(value.r, fallback.r), num(value.g, fallback.g), num(value.b, fallback.b));
32
- }
33
-
34
- function scaleColor(BABYLON, color, intensity) {
35
- const next = color.clone ? color.clone() : new BABYLON.Color3(color.r, color.g, color.b);
36
- return next.scale(Math.max(0, num(intensity, 1)));
37
- }
38
-
39
- function sequence01(index, axis) {
40
- const strides = [0.618033988749895, 0.414213562373095, 0.732050807568877, 0.324717957244746];
41
- return (0.5 + index * strides[axis % strides.length] + axis * 0.173205080756888) % 1;
42
- }
43
-
44
- function makeGlowMaterial(BABYLON, scene, name, color, alpha, hdrIntensity = 1) {
45
- const material = new BABYLON.StandardMaterial(name, scene);
46
- material.diffuseColor = color;
47
- material.emissiveColor = scaleColor(BABYLON, color, hdrIntensity);
48
- material.alpha = alpha;
49
- material.backFaceCulling = false;
50
- material.disableLighting = true;
51
- material.disableDepthWrite = true;
52
- material.useAlphaFromDiffuseTexture = false;
53
- material.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND;
54
- if (BABYLON.Engine?.ALPHA_ADD !== undefined) {
55
- material.alphaMode = BABYLON.Engine.ALPHA_ADD;
56
- }
57
- return material;
58
- }
59
-
60
- function createSoftTexture(BABYLON, scene, name, width, height, mode = "vertical") {
61
- const texture = new BABYLON.DynamicTexture(name, { width, height }, scene, false);
62
- texture.hasAlpha = true;
63
- const ctx = texture.getContext();
64
- const image = ctx.createImageData(width, height);
65
- const data = image.data;
66
-
67
- for (let y = 0; y < height; y += 1) {
68
- const v = y / Math.max(1, height - 1);
69
- for (let x = 0; x < width; x += 1) {
70
- const u = x / Math.max(1, width - 1);
71
- const dx = Math.abs(u - 0.5) * 2;
72
- const dy = Math.abs(v - 0.5) * 2;
73
- const horizontal = Math.max(0, 1 - dx);
74
- const vertical = mode === "radial" ? Math.max(0, 1 - dy) : Math.sin(v * Math.PI);
75
- const radial = mode === "radial"
76
- ? Math.max(0, 1 - Math.sqrt(dx * dx + dy * dy))
77
- : horizontal * vertical;
78
- const alpha = Math.pow(radial, mode === "radial" ? 2.2 : 1.8);
79
- const offset = (y * width + x) * 4;
80
- data[offset] = 255;
81
- data[offset + 1] = 255;
82
- data[offset + 2] = 255;
83
- data[offset + 3] = Math.round(alpha * 255);
84
- }
85
- }
86
-
87
- ctx.putImageData(image, 0, 0);
88
- texture.update(false);
89
- return texture;
90
- }
91
-
92
- function makeTexturedGlowMaterial(BABYLON, scene, name, color, alpha, hdrIntensity, texture) {
93
- const material = makeGlowMaterial(BABYLON, scene, name, color, alpha, hdrIntensity);
94
- material.diffuseTexture = texture;
95
- material.emissiveTexture = texture;
96
- material.opacityTexture = texture;
97
- material.useAlphaFromDiffuseTexture = true;
98
- return material;
99
- }
100
-
101
- function createSpiralPath(BABYLON, config, phase = 0) {
102
- const turns = Math.max(1, num(config.spiralTurns, 3.4));
103
- const height = Math.max(0.05, num(config.spiralHeight, 1.12));
104
- const radius = Math.max(0.05, num(config.ringRadius, 0.72));
105
- const steps = Math.max(72, Math.round(turns * 56));
106
- const path = [];
107
-
108
- for (let index = 0; index <= steps; index += 1) {
109
- const t = index / steps;
110
- const angle = phase + t * turns * Math.PI * 2;
111
- const waist = 0.94 + Math.sin(t * Math.PI) * 0.1;
112
- path.push(new BABYLON.Vector3(
113
- Math.cos(angle) * radius * waist,
114
- 0.05 + t * height,
115
- Math.sin(angle) * radius * waist
116
- ));
117
- }
118
-
119
- return path;
120
- }
121
-
122
- function createSpiral(BABYLON, scene, root, material, name, config, phase = 0, radiusScale = 1) {
123
- const spiral = BABYLON.MeshBuilder.CreateTube(
124
- name,
125
- {
126
- path: createSpiralPath(BABYLON, config, phase),
127
- radius: num(config.ringThickness, 0.035) * radiusScale,
128
- tessellation: 14,
129
- cap: BABYLON.Mesh.CAP_ALL,
130
- },
131
- scene
132
- );
133
- spiral.parent = root;
134
- spiral.material = material;
135
- return spiral;
136
- }
137
-
138
- function createSpark(BABYLON, scene, root, material, index, config) {
139
- const spark = BABYLON.MeshBuilder.CreatePlane(
140
- `vfx_upgrade_body_spark_${index}`,
141
- {
142
- width: num(config.sparkWidth, 0.045),
143
- height: num(config.sparkHeight, 0.22),
144
- },
145
- scene
146
- );
147
- spark.parent = root;
148
- spark.material = material;
149
- spark.billboardMode = BABYLON.Mesh.BILLBOARDMODE_ALL;
150
- return spark;
151
- }
152
-
153
- function createBodyGlowPlane(BABYLON, scene, root, material, index, config) {
154
- const plane = BABYLON.MeshBuilder.CreatePlane(
155
- `vfx_upgrade_body_soft_glow_${index}`,
156
- {
157
- width: num(config.width, 0.72),
158
- height: num(config.height, 1.75),
159
- },
160
- scene
161
- );
162
- plane.parent = root;
163
- plane.material = material;
164
- plane.position.y = num(config.height, 1.75) * 0.5;
165
- plane.rotation.y = index * Math.PI / Math.max(1, num(config.count, 3));
166
- return plane;
167
- }
168
-
169
- export async function createUpgradeAuraRuntime({ BABYLON, scene, emitter, shouldStart = false }) {
170
- if (!BABYLON) throw new Error("createUpgradeAuraRuntime requires BABYLON.");
171
- if (!scene) throw new Error("createUpgradeAuraRuntime requires scene.");
172
- if (!emitter) throw new Error("createUpgradeAuraRuntime requires emitter.");
173
-
174
- const origin = readVec(BABYLON, emitter.origin, BABYLON.Vector3.Zero());
175
- const duration = Math.max(0.1, num(emitter.duration, 1.35));
176
- const effectScale = Math.max(0.05, num(emitter.effectScale, 1));
177
- const spiralTurns = Math.max(1, num(emitter.spiralTurns ?? emitter.ringCount, 3.4));
178
- const sparkleCount = Math.max(0, Math.round(num(emitter.sparkleCount, 22)));
179
- const spiralTravelHeight = Math.max(0.02, num(emitter.ringRiseHeight, 1.45) * effectScale);
180
- const spiralHeight = Math.max(0.05, num(emitter.spiralHeight, 1.12) * effectScale);
181
- const bodyRiseHeight = Math.max(0.05, num(emitter.bodyRiseHeight, 1.75) * effectScale);
182
- const sparkleLife = Math.max(0.12, num(emitter.sparkleLife, 0.62));
183
- const ringColor = readColor3(BABYLON, emitter.ringColor, new BABYLON.Color3(1, 0.78, 0.14));
184
- const bodyGlowColor = readColor3(BABYLON, emitter.bodyGlowColor, new BABYLON.Color3(1, 0.95, 0.5));
185
- const hdrIntensity = Math.max(0, num(emitter.hdrIntensity, 3.0));
186
-
187
- const root = new BABYLON.TransformNode(`vfx_upgrade_aura_${Date.now()}`, scene);
188
- root.position.copyFrom(origin);
189
-
190
- const bodyGlowTexture = createSoftTexture(BABYLON, scene, "vfx_upgrade_body_soft_texture", 96, 256, "vertical");
191
- const sparkTexture = createSoftTexture(BABYLON, scene, "vfx_upgrade_spark_soft_texture", 96, 96, "radial");
192
- const ringMaterial = makeGlowMaterial(BABYLON, scene, "vfx_upgrade_ring_mat", ringColor, num(emitter.ringAlpha, 0.78), hdrIntensity);
193
- const spiralCoreMaterial = makeGlowMaterial(BABYLON, scene, "vfx_upgrade_spiral_core_mat", bodyGlowColor, num(emitter.ringAlpha, 0.78), hdrIntensity);
194
- const spiralHaloMaterial = makeGlowMaterial(BABYLON, scene, "vfx_upgrade_spiral_halo_mat", ringColor, num(emitter.spiralGlowAlpha, 0.08), Math.max(1, hdrIntensity * 0.7));
195
- const bodySoftMaterial = makeTexturedGlowMaterial(BABYLON, scene, "vfx_upgrade_body_soft_mat", bodyGlowColor, num(emitter.bodyGlowAlpha, 0.62), hdrIntensity, bodyGlowTexture);
196
- const sparkMaterial = makeTexturedGlowMaterial(BABYLON, scene, "vfx_upgrade_spark_mat", bodyGlowColor, num(emitter.sparkAlpha, 0.92), hdrIntensity, sparkTexture);
197
-
198
- const bodyPlanes = Array.from({ length: 3 }, (_, index) => createBodyGlowPlane(BABYLON, scene, root, bodySoftMaterial, index, {
199
- width: 0.78 * effectScale,
200
- height: bodyRiseHeight,
201
- count: 3,
202
- }));
203
-
204
- const spiralConfig = {
205
- spiralTurns,
206
- ringRadius: num(emitter.ringRadius, 0.78) * effectScale,
207
- ringThickness: num(emitter.ringThickness, 0.035) * effectScale,
208
- spiralHeight,
209
- };
210
- const spiralHalo = createSpiral(
211
- BABYLON,
212
- scene,
213
- root,
214
- spiralHaloMaterial,
215
- "vfx_upgrade_continuous_spiral_halo",
216
- spiralConfig,
217
- 0,
218
- 2.2
219
- );
220
- const spiral = createSpiral(BABYLON, scene, root, ringMaterial, "vfx_upgrade_continuous_spiral", spiralConfig);
221
- const spiralCore = createSpiral(
222
- BABYLON,
223
- scene,
224
- root,
225
- spiralCoreMaterial,
226
- "vfx_upgrade_continuous_spiral_core",
227
- spiralConfig,
228
- 0.07,
229
- 0.48
230
- );
231
-
232
- const sparks = Array.from({ length: sparkleCount }, (_, index) => {
233
- const spark = createSpark(BABYLON, scene, root, sparkMaterial, index, {
234
- sparkWidth: num(emitter.sparkWidth, 0.045) * effectScale,
235
- sparkHeight: num(emitter.sparkHeight, 0.22) * effectScale,
236
- });
237
- spark.metadata = {
238
- angle: sequence01(index, 0) * Math.PI * 2,
239
- radius: (0.12 + sequence01(index, 1) * 0.36) * effectScale,
240
- delay: sequence01(index, 2) * duration * 0.64,
241
- spin: (sequence01(index, 3) < 0.5 ? -1 : 1) * (0.6 + sequence01(index, 4) * 1.1),
242
- };
243
- return spark;
244
- });
245
-
246
- let startedAt = 0;
247
- let observer = null;
248
- let running = false;
249
- let disposed = false;
250
-
251
- const update = () => {
252
- const elapsed = (performance.now() - startedAt) / 1000;
253
- const globalT = Math.min(1, elapsed / duration);
254
- const pulse = Math.sin(globalT * Math.PI);
255
-
256
- ringMaterial.alpha = num(emitter.ringAlpha, 0.78) * pulse;
257
- spiralCoreMaterial.alpha = num(emitter.ringAlpha, 0.78) * 0.42 * pulse;
258
- spiralHaloMaterial.alpha = num(emitter.spiralGlowAlpha, 0.08) * pulse;
259
- bodySoftMaterial.alpha = num(emitter.bodyGlowAlpha, 0.62) * pulse;
260
- spiral.position.y = -0.1 + globalT * spiralTravelHeight;
261
- spiralCore.position.y = spiral.position.y;
262
- spiralHalo.position.y = spiral.position.y;
263
- spiral.rotation.y = elapsed * 2.15;
264
- spiralCore.rotation.y = spiral.rotation.y;
265
- spiralHalo.rotation.y = spiral.rotation.y;
266
- const spiralScale = 0.96 + pulse * 0.1;
267
- spiral.scaling.setAll(spiralScale);
268
- spiralCore.scaling.setAll(spiralScale);
269
- spiralHalo.scaling.setAll(spiralScale);
270
- for (let index = 0; index < bodyPlanes.length; index += 1) {
271
- bodyPlanes[index].rotation.y = index * Math.PI / bodyPlanes.length + elapsed * 0.52;
272
- bodyPlanes[index].scaling.set(0.9 + pulse * 0.18, 1, 1);
273
- }
274
-
275
- for (const spark of sparks) {
276
- const meta = spark.metadata || {};
277
- const localElapsed = elapsed - num(meta.delay, 0);
278
- const local = ((localElapsed % sparkleLife) + sparkleLife) % sparkleLife / sparkleLife;
279
- const angle = num(meta.angle, 0) + elapsed * num(meta.spin, 1);
280
- const radius = num(meta.radius, 0.28);
281
- spark.position.x = Math.cos(angle) * radius;
282
- spark.position.z = Math.sin(angle) * radius;
283
- spark.position.y = 0.1 + local * bodyRiseHeight;
284
- spark.rotation.z = angle;
285
- spark.visibility = Math.max(0, Math.sin(local * Math.PI));
286
- spark.scaling.setAll(0.7 + 0.55 * Math.sin(local * Math.PI));
287
- }
288
-
289
- if (elapsed >= duration) {
290
- stop();
291
- }
292
- };
293
-
294
- function start() {
295
- if (running || disposed) return;
296
- running = true;
297
- startedAt = performance.now();
298
- root.setEnabled(true);
299
- observer = scene.onBeforeRenderObservable.add(update);
300
- }
301
-
302
- function stop() {
303
- if (!running) return;
304
- running = false;
305
- if (observer) {
306
- scene.onBeforeRenderObservable.remove(observer);
307
- observer = null;
308
- }
309
- dispose();
310
- }
311
-
312
- function dispose() {
313
- if (disposed) return;
314
- disposed = true;
315
- for (const spark of sparks) spark.dispose(false, true);
316
- for (const plane of bodyPlanes) plane.dispose(false, true);
317
- spiralHalo.dispose(false, true);
318
- spiral.dispose(false, true);
319
- spiralCore.dispose(false, true);
320
- root.dispose();
321
- ringMaterial.dispose();
322
- spiralCoreMaterial.dispose();
323
- spiralHaloMaterial.dispose();
324
- bodySoftMaterial.dispose();
325
- sparkMaterial.dispose();
326
- bodyGlowTexture.dispose();
327
- sparkTexture.dispose();
328
- }
329
-
330
- function setPosition(position) {
331
- if (disposed || !position) return;
332
- root.position.copyFrom(position);
333
- }
334
-
335
- function setScaling(scaling) {
336
- if (disposed || !scaling) return;
337
- root.scaling.copyFrom(scaling);
338
- }
339
-
340
- root.setEnabled(false);
341
- const preview = {
342
- start,
343
- stop,
344
- dispose,
345
- isStarted: () => running,
346
- setPosition,
347
- setScaling,
348
- duration,
349
- };
350
-
351
- if (shouldStart) start();
352
- return preview;
353
- }
@@ -1,13 +0,0 @@
1
- import manifest from './lumber_vehicle_upgrade_aura.json';
2
- import runtimeUrl from './assets/runtime/upgradeAura.v1.js?url';
3
- import { createManifestRuntimeEffectPackage } from '../../manifestRuntimePackage';
4
-
5
- export const lumberVehicleUpgradeAuraEffectPackage = createManifestRuntimeEffectPackage({
6
- id: 'lumber_vehicle_upgrade_aura',
7
- manifest,
8
- assetUrls: {
9
- 'assets/runtime/upgradeAura.v1.js': runtimeUrl,
10
- },
11
- });
12
- // 升级光环挂载具、随它走
13
- lumberVehicleUpgradeAuraEffectPackage.placement = 'socket';