@fps-games/vfx 0.1.1
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.
- package/CHANGELOG.md +34 -0
- package/dist/EffectPackageService.d.ts +26 -0
- package/dist/SceneVfxService.d.ts +27 -0
- package/dist/chunks/legacy-particle-runtime-CbJYVxdd.js +75 -0
- package/dist/chunks/manifestRuntimePackage-CXQFSTo2.js +356 -0
- package/dist/chunks/rendering-CV3nhygX.js +13 -0
- package/dist/chunks/space-shared-BXV1hc0k.js +124 -0
- package/dist/chunks/wood-sawdust-effect-factory-DlETNaBn.js +129 -0
- package/dist/effects/building-upgrade/effect.json.d.ts +9 -0
- package/dist/effects/building-upgrade/index.d.ts +20 -0
- package/dist/effects/building-upgrade/index.js +337 -0
- package/dist/effects/character-entrance/effect.json.d.ts +9 -0
- package/dist/effects/character-entrance/index.d.ts +18 -0
- package/dist/effects/character-entrance/index.js +271 -0
- package/dist/effects/coin-burst/index.d.ts +6 -0
- package/dist/effects/coin-burst/index.js +45 -0
- package/dist/effects/comet-trail-flame/index.d.ts +11 -0
- package/dist/effects/comet-trail-flame/index.js +103 -0
- package/dist/effects/conveyor-upgrade/effect.json.d.ts +9 -0
- package/dist/effects/conveyor-upgrade/index.d.ts +20 -0
- package/dist/effects/conveyor-upgrade/index.js +349 -0
- package/dist/effects/debris-smoke/index.d.ts +10 -0
- package/dist/effects/debris-smoke/index.js +108 -0
- package/dist/effects/door_open_gold_flakes/door_open_gold_flakes.json.d.ts +501 -0
- package/dist/effects/door_open_gold_flakes/index.d.ts +1 -0
- package/dist/effects/door_open_gold_flakes/index.js +524 -0
- package/dist/effects/electric-arc/index.d.ts +8 -0
- package/dist/effects/electric-arc/index.js +71 -0
- package/dist/effects/energy-shield/index.d.ts +46 -0
- package/dist/effects/energy-shield/index.js +365 -0
- package/dist/effects/explosion/index.d.ts +11 -0
- package/dist/effects/explosion/index.js +129 -0
- package/dist/effects/ground-tile-upgrade/effect.json.d.ts +9 -0
- package/dist/effects/ground-tile-upgrade/index.d.ts +20 -0
- package/dist/effects/ground-tile-upgrade/index.js +357 -0
- package/dist/effects/hit-flash/index.d.ts +8 -0
- package/dist/effects/hit-flash/index.js +71 -0
- package/dist/effects/laser-beam/index.d.ts +1 -0
- package/dist/effects/laser-beam/index.js +152 -0
- package/dist/effects/laser-beam-factory.d.ts +12 -0
- package/dist/effects/lumber-cart-suction/effect.json.d.ts +9 -0
- package/dist/effects/lumber-cart-suction/index.d.ts +26 -0
- package/dist/effects/lumber-cart-suction/index.js +322 -0
- package/dist/effects/lumber-debris-scatter/effect.json.d.ts +231 -0
- package/dist/effects/lumber-debris-scatter/index.d.ts +20 -0
- package/dist/effects/lumber-debris-scatter/index.js +637 -0
- package/dist/effects/lumber_vehicle_gear_spin/index.d.ts +1 -0
- package/dist/effects/lumber_vehicle_gear_spin/index.js +363 -0
- package/dist/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json.d.ts +341 -0
- package/dist/effects/lumber_vehicle_upgrade_aura/index.d.ts +1 -0
- package/dist/effects/lumber_vehicle_upgrade_aura/index.js +391 -0
- package/dist/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json.d.ts +368 -0
- package/dist/effects/lumber_vehicle_wood_chips/index.d.ts +1 -0
- package/dist/effects/lumber_vehicle_wood_chips/index.js +360 -0
- package/dist/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json.d.ts +338 -0
- package/dist/effects/monster-hit/index.d.ts +15 -0
- package/dist/effects/monster-hit/index.js +156 -0
- package/dist/effects/player-upgrade/effect.json.d.ts +9 -0
- package/dist/effects/player-upgrade/index.d.ts +24 -0
- package/dist/effects/player-upgrade/index.js +539 -0
- package/dist/effects/pulse-laser-volley/index.d.ts +17 -0
- package/dist/effects/pulse-laser-volley/index.js +173 -0
- package/dist/effects/resource-collect-sparkles/effect.json.d.ts +9 -0
- package/dist/effects/resource-collect-sparkles/index.d.ts +21 -0
- package/dist/effects/resource-collect-sparkles/index.js +222 -0
- package/dist/effects/run-footstep-dust/effect.json.d.ts +186 -0
- package/dist/effects/run-footstep-dust/index.d.ts +23 -0
- package/dist/effects/run-footstep-dust/index.js +343 -0
- package/dist/effects/space-shared.d.ts +44 -0
- package/dist/effects/thruster-flame/index.d.ts +15 -0
- package/dist/effects/thruster-flame/index.js +301 -0
- package/dist/effects/tree-chop-dust/effect.json.d.ts +11 -0
- package/dist/effects/tree-chop-dust/index.d.ts +17 -0
- package/dist/effects/tree-chop-dust/index.js +165 -0
- package/dist/effects/tree-leaf-chop-burst/index.d.ts +19 -0
- package/dist/effects/tree-leaf-chop-burst/index.js +219 -0
- package/dist/effects/tree_chop_dust_burst/index.d.ts +1 -0
- package/dist/effects/tree_chop_dust_burst/index.js +443 -0
- package/dist/effects/tree_chop_dust_burst/tree_chop_dust_burst.json.d.ts +415 -0
- package/dist/effects/ufo-thread-flame/index.d.ts +21 -0
- package/dist/effects/ufo-thread-flame/index.js +140 -0
- package/dist/effects/vehicle-exhaust-smoke/effect.json.d.ts +11 -0
- package/dist/effects/vehicle-exhaust-smoke/index.d.ts +19 -0
- package/dist/effects/vehicle-exhaust-smoke/index.js +242 -0
- package/dist/effects/vehicle-upgrade/effect.json.d.ts +9 -0
- package/dist/effects/vehicle-upgrade/index.d.ts +20 -0
- package/dist/effects/vehicle-upgrade/index.js +349 -0
- package/dist/effects/weapon-trail/index.d.ts +26 -0
- package/dist/effects/weapon-trail/index.js +351 -0
- package/dist/effects/wood-crusher-sawdust/index.d.ts +2 -0
- package/dist/effects/wood-crusher-sawdust/index.js +648 -0
- package/dist/effects/wood-crusher-sawdust/wood_crusher_sawdust.json.d.ts +595 -0
- package/dist/effects/wood-cutter-sawdust/index.d.ts +2 -0
- package/dist/effects/wood-cutter-sawdust/index.js +648 -0
- package/dist/effects/wood-cutter-sawdust/wood_cutter_sawdust.json.d.ts +595 -0
- package/dist/effects/wood-sawdust-effect-factory.d.ts +36 -0
- package/dist/effects/wood_crusher_sawdust/index.d.ts +16 -0
- package/dist/effects/wood_crusher_sawdust/index.js +634 -0
- package/dist/effects/wood_crusher_sawdust/wood_crusher_sawdust.json.d.ts +595 -0
- package/dist/effects/wood_cutter_sawdust/index.d.ts +16 -0
- package/dist/effects/wood_cutter_sawdust/index.js +634 -0
- package/dist/effects/wood_cutter_sawdust/wood_cutter_sawdust.json.d.ts +595 -0
- package/dist/effects/wood_peel_material_test/index.d.ts +1 -0
- package/dist/effects/wood_peel_material_test/index.js +157 -0
- package/dist/effects/wood_peel_material_test/wood_peel_material_test.json.d.ts +139 -0
- package/dist/generation.d.ts +7 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +309 -0
- package/dist/legacy-particle-runtime.d.ts +30 -0
- package/dist/manifestRuntimePackage.d.ts +68 -0
- package/dist/registry.d.ts +20 -0
- package/dist/rendering.d.ts +5 -0
- package/dist/types.d.ts +83 -0
- package/docs/AUTHORING_EFFECTS.md +297 -0
- package/docs/VFX_LIBRARY_ARCHITECTURE_chatgpt.md +1580 -0
- package/docs/VFX_LIBRARY_EXECUTION_PLAN.md +229 -0
- package/docs/VFX_LIBRARY_PLAN.md +546 -0
- package/docs/vfx-ab/RESULTS.md +35 -0
- package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/after.png +0 -0
- package/docs/vfx-ab/lumber-order/vehicle-exhaust-smoke/before.png +0 -0
- package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/after.png +0 -0
- package/docs/vfx-ab/lumber-truck/vehicle-exhaust-smoke/before.png +0 -0
- package/docs/vfx-integration_chatgpt.md +462 -0
- package/docs/weapon-trail-visualization.html +241 -0
- package/index.json +381 -0
- package/package.json +51 -0
- package/packages/EffectPackageService.ts +240 -0
- package/packages/SceneVfxService.ts +96 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/assets/runtime/simpleMeshEffect.v1.js +333 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.frag.glsl +25 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/assets/shaders/mesh-effect-preview.vert.glsl +11 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/assets/textures/effect_jianbian.png +0 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/effect.json +927 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/media/contact-sheet.png +0 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.gif +0 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.mp4 +0 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/media/preview.webm +0 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/media/thumbnail.png +0 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/metadata/description.json +197 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-effect.original.json +895 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/03-normalized-vfx-to-babylon-report.json +241 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-overrides.json +542 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/04-preview-tuning-report.json +69 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/asset-map.json +125 -0
- package/packages/build.mesh.yellow_build_upgrade_indicator/provenance/lineage.json +44 -0
- package/packages/build.particle.golden_upgrade_starburst/assets/runtime/particleEmitter.v1.js +210 -0
- package/packages/build.particle.golden_upgrade_starburst/assets/textures/effect_guangdian.png +0 -0
- package/packages/build.particle.golden_upgrade_starburst/effect.json +880 -0
- package/packages/build.particle.golden_upgrade_starburst/media/contact-sheet.png +0 -0
- package/packages/build.particle.golden_upgrade_starburst/media/preview.gif +0 -0
- package/packages/build.particle.golden_upgrade_starburst/media/preview.mp4 +0 -0
- package/packages/build.particle.golden_upgrade_starburst/media/preview.webm +0 -0
- package/packages/build.particle.golden_upgrade_starburst/media/thumbnail.png +0 -0
- package/packages/build.particle.golden_upgrade_starburst/metadata/description.json +161 -0
- package/packages/build.particle.golden_upgrade_starburst/provenance/03-effect.original.json +762 -0
- package/packages/build.particle.golden_upgrade_starburst/provenance/03-normalized-vfx-to-babylon-report.json +260 -0
- package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-overrides.json +436 -0
- package/packages/build.particle.golden_upgrade_starburst/provenance/04-preview-tuning-report.json +40 -0
- package/packages/build.particle.golden_upgrade_starburst/provenance/asset-map.json +115 -0
- package/packages/build.particle.golden_upgrade_starburst/provenance/lineage.json +40 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/assets/runtime/particleEmitter.v1.js +210 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/assets/textures/b5b27ab1-e740-4398-b407-848fc2b2c897.png +0 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/effect.json +887 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.gif +0 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.mp4 +0 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/media/preview.webm +0 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/media/thumbnail.png +0 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/metadata/description.json +179 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-effect.original.json +859 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/provenance/03-normalized-vfx-to-babylon-report.json +260 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-overrides.json +478 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/provenance/04-preview-tuning-report.json +40 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/provenance/asset-map.json +114 -0
- package/packages/build.particle.orange_upgrade_transform_sparks/provenance/lineage.json +41 -0
- package/packages/build.particle.wood_chip_dust_burst/assets/runtime/particleEmitter.v1.js +210 -0
- package/packages/build.particle.wood_chip_dust_burst/assets/textures/effect_yanwu4.png +0 -0
- package/packages/build.particle.wood_chip_dust_burst/assets/textures/suipian3.png +0 -0
- package/packages/build.particle.wood_chip_dust_burst/effect.json +1400 -0
- package/packages/build.particle.wood_chip_dust_burst/media/contact-sheet.png +0 -0
- package/packages/build.particle.wood_chip_dust_burst/media/preview.gif +0 -0
- package/packages/build.particle.wood_chip_dust_burst/media/preview.mp4 +0 -0
- package/packages/build.particle.wood_chip_dust_burst/media/preview.webm +0 -0
- package/packages/build.particle.wood_chip_dust_burst/media/thumbnail.png +0 -0
- package/packages/build.particle.wood_chip_dust_burst/metadata/description.json +173 -0
- package/packages/build.particle.wood_chip_dust_burst/provenance/03-effect.original.json +1277 -0
- package/packages/build.particle.wood_chip_dust_burst/provenance/03-normalized-vfx-to-babylon-report.json +329 -0
- package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-overrides.json +749 -0
- package/packages/build.particle.wood_chip_dust_burst/provenance/04-preview-tuning-report.json +60 -0
- package/packages/build.particle.wood_chip_dust_burst/provenance/asset-map.json +146 -0
- package/packages/build.particle.wood_chip_dust_burst/provenance/lineage.json +69 -0
- package/packages/effects/building-upgrade/effect.json +6 -0
- package/packages/effects/building-upgrade/index.ts +387 -0
- package/packages/effects/building-upgrade/vfx-params.json +24 -0
- package/packages/effects/character-entrance/effect.json +6 -0
- package/packages/effects/character-entrance/index.ts +308 -0
- package/packages/effects/character-entrance/vfx-params.json +24 -0
- package/packages/effects/coin-burst/index.ts +43 -0
- package/packages/effects/coin-burst/vfx-params.json +5 -0
- package/packages/effects/comet-trail-flame/assets/textures/trail_5x4.webp +0 -0
- package/packages/effects/comet-trail-flame/index.ts +106 -0
- package/packages/effects/comet-trail-flame/vfx-params.json +5 -0
- package/packages/effects/conveyor-upgrade/effect.json +6 -0
- package/packages/effects/conveyor-upgrade/index.ts +401 -0
- package/packages/effects/conveyor-upgrade/vfx-params.json +21 -0
- package/packages/effects/debris-smoke/assets/models/rock_debris.glb +0 -0
- package/packages/effects/debris-smoke/assets/textures/smoke22.webp +0 -0
- package/packages/effects/debris-smoke/index.ts +101 -0
- package/packages/effects/debris-smoke/vfx-params.json +5 -0
- package/packages/effects/door_open_gold_flakes/assets/runtime/goldFlakes.v1.js +397 -0
- package/packages/effects/door_open_gold_flakes/door_open_gold_flakes.json +498 -0
- package/packages/effects/door_open_gold_flakes/index.ts +11 -0
- package/packages/effects/door_open_gold_flakes/vfx-params.json +23 -0
- package/packages/effects/electric-arc/assets/textures/spark_4x4.webp +0 -0
- package/packages/effects/electric-arc/index.ts +62 -0
- package/packages/effects/electric-arc/vfx-params.json +5 -0
- package/packages/effects/energy-shield/effect.json +7 -0
- package/packages/effects/energy-shield/index.ts +431 -0
- package/packages/effects/energy-shield/vfx-params.json +29 -0
- package/packages/effects/explosion/assets/textures/baozha29.webp +0 -0
- package/packages/effects/explosion/assets/textures/glow01.webp +0 -0
- package/packages/effects/explosion/assets/textures/lizi01.webp +0 -0
- package/packages/effects/explosion/assets/textures/xulie_lizibaozha02_5x5.webp +0 -0
- package/packages/effects/explosion/index.ts +114 -0
- package/packages/effects/explosion/vfx-params.json +5 -0
- package/packages/effects/ground-tile-upgrade/effect.json +6 -0
- package/packages/effects/ground-tile-upgrade/index.ts +410 -0
- package/packages/effects/ground-tile-upgrade/vfx-params.json +21 -0
- package/packages/effects/hit-flash/index.ts +69 -0
- package/packages/effects/hit-flash/vfx-params.json +5 -0
- package/packages/effects/laser-beam/assets/textures/laser_glow.webp +0 -0
- package/packages/effects/laser-beam/assets/textures/laser_noise.webp +0 -0
- package/packages/effects/laser-beam/index.ts +6 -0
- package/packages/effects/laser-beam/vfx-params.json +5 -0
- package/packages/effects/laser-beam-factory.ts +135 -0
- package/packages/effects/lumber-cart-suction/effect.json +6 -0
- package/packages/effects/lumber-cart-suction/index.ts +399 -0
- package/packages/effects/lumber-cart-suction/vfx-params.json +30 -0
- package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb +0 -0
- package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/.active +1 -0
- package/packages/effects/lumber-debris-scatter/assets/models/lumber_prop_model.glb.versions/1781589063890_upload.glb +0 -0
- package/packages/effects/lumber-debris-scatter/assets/runtime/solidParticleScatter.v1.js +236 -0
- package/packages/effects/lumber-debris-scatter/effect.json +228 -0
- package/packages/effects/lumber-debris-scatter/index.ts +780 -0
- package/packages/effects/lumber-debris-scatter/vfx-params.json +19 -0
- package/packages/effects/lumber_vehicle_gear_spin/assets/runtime/gearSpin.v1.js +202 -0
- package/packages/effects/lumber_vehicle_gear_spin/index.ts +11 -0
- package/packages/effects/lumber_vehicle_gear_spin/lumber_vehicle_gear_spin.json +338 -0
- package/packages/effects/lumber_vehicle_gear_spin/vfx-params.json +21 -0
- package/packages/effects/lumber_vehicle_upgrade_aura/assets/runtime/upgradeAura.v1.js +353 -0
- package/packages/effects/lumber_vehicle_upgrade_aura/index.ts +11 -0
- package/packages/effects/lumber_vehicle_upgrade_aura/lumber_vehicle_upgrade_aura.json +365 -0
- package/packages/effects/lumber_vehicle_upgrade_aura/vfx-params.json +15 -0
- package/packages/effects/lumber_vehicle_wood_chips/assets/runtime/solidParticleScatter.v1.js +310 -0
- package/packages/effects/lumber_vehicle_wood_chips/index.ts +11 -0
- package/packages/effects/lumber_vehicle_wood_chips/lumber_vehicle_wood_chips.json +335 -0
- package/packages/effects/lumber_vehicle_wood_chips/vfx-params.json +11 -0
- package/packages/effects/monster-hit/index.ts +128 -0
- package/packages/effects/monster-hit/vfx-params.json +5 -0
- package/packages/effects/player-upgrade/effect.json +6 -0
- package/packages/effects/player-upgrade/index.ts +635 -0
- package/packages/effects/player-upgrade/vfx-params.json +28 -0
- package/packages/effects/pulse-laser-volley/assets/textures/bolt_guangshu.webp +0 -0
- package/packages/effects/pulse-laser-volley/index.ts +204 -0
- package/packages/effects/pulse-laser-volley/vfx-params.json +5 -0
- package/packages/effects/resource-collect-sparkles/effect.json +6 -0
- package/packages/effects/resource-collect-sparkles/index.ts +254 -0
- package/packages/effects/resource-collect-sparkles/vfx-params.json +25 -0
- package/packages/effects/run-footstep-dust/assets/runtime/runFootstepDust.v1.js +215 -0
- package/packages/effects/run-footstep-dust/effect.json +183 -0
- package/packages/effects/run-footstep-dust/index.ts +377 -0
- package/packages/effects/run-footstep-dust/vfx-params.json +27 -0
- package/packages/effects/space-shared.ts +120 -0
- package/packages/effects/thruster-flame/index.ts +305 -0
- package/packages/effects/thruster-flame/vfx-params.json +5 -0
- package/packages/effects/tree-chop-dust/assets/textures/tree_chop_dust_atlas.png +0 -0
- package/packages/effects/tree-chop-dust/effect.json +8 -0
- package/packages/effects/tree-chop-dust/index.ts +202 -0
- package/packages/effects/tree-chop-dust/vfx-params.json +21 -0
- package/packages/effects/tree-leaf-chop-burst/assets/runtime/particleEmitter.v1.js +303 -0
- package/packages/effects/tree-leaf-chop-burst/assets/textures/tree_leaf_chop_burst_leaf_atlas.png +0 -0
- package/packages/effects/tree-leaf-chop-burst/effect.json +498 -0
- package/packages/effects/tree-leaf-chop-burst/index.ts +294 -0
- package/packages/effects/tree-leaf-chop-burst/vfx-params.json +27 -0
- package/packages/effects/tree_chop_dust_burst/assets/runtime/particleEmitter.v1.js +318 -0
- package/packages/effects/tree_chop_dust_burst/assets/textures/tree_chop_dust_burst_dust.png +0 -0
- package/packages/effects/tree_chop_dust_burst/index.ts +13 -0
- package/packages/effects/tree_chop_dust_burst/tree_chop_dust_burst.json +412 -0
- package/packages/effects/tree_chop_dust_burst/vfx-params.json +9 -0
- package/packages/effects/ufo-thread-flame/assets/textures/flame_flow.webp +0 -0
- package/packages/effects/ufo-thread-flame/assets/textures/flame_spike.webp +0 -0
- package/packages/effects/ufo-thread-flame/index.ts +152 -0
- package/packages/effects/ufo-thread-flame/vfx-params.json +5 -0
- package/packages/effects/vehicle-exhaust-smoke/assets/textures/vehicle_exhaust_smoke_atlas.png +0 -0
- package/packages/effects/vehicle-exhaust-smoke/effect.json +8 -0
- package/packages/effects/vehicle-exhaust-smoke/index.ts +298 -0
- package/packages/effects/vehicle-exhaust-smoke/vfx-params.json +23 -0
- package/packages/effects/vehicle-upgrade/effect.json +6 -0
- package/packages/effects/vehicle-upgrade/index.ts +401 -0
- package/packages/effects/vehicle-upgrade/vfx-params.json +21 -0
- package/packages/effects/weapon-trail/assets/textures/trail_wedge.png +0 -0
- package/packages/effects/weapon-trail/index.ts +313 -0
- package/packages/effects/weapon-trail/vfx-params.json +5 -0
- package/packages/effects/wood-crusher-sawdust/assets/runtime/particleEmitter.v1.js +312 -0
- package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
- package/packages/effects/wood-crusher-sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
- package/packages/effects/wood-crusher-sawdust/index.ts +43 -0
- package/packages/effects/wood-crusher-sawdust/vfx-params.json +24 -0
- package/packages/effects/wood-crusher-sawdust/wood_crusher_sawdust.json +592 -0
- package/packages/effects/wood-cutter-sawdust/assets/runtime/particleEmitter.v1.js +312 -0
- package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
- package/packages/effects/wood-cutter-sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
- package/packages/effects/wood-cutter-sawdust/index.ts +43 -0
- package/packages/effects/wood-cutter-sawdust/vfx-params.json +24 -0
- package/packages/effects/wood-cutter-sawdust/wood_cutter_sawdust.json +592 -0
- package/packages/effects/wood-sawdust-effect-factory.ts +194 -0
- package/packages/effects/wood_crusher_sawdust/assets/runtime/particleEmitter.v1.js +318 -0
- package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_dust.png +0 -0
- package/packages/effects/wood_crusher_sawdust/assets/textures/wood_crusher_sawdust_fiber.png +0 -0
- package/packages/effects/wood_crusher_sawdust/index.ts +29 -0
- package/packages/effects/wood_crusher_sawdust/vfx-params.json +14 -0
- package/packages/effects/wood_crusher_sawdust/wood_crusher_sawdust.json +592 -0
- package/packages/effects/wood_cutter_sawdust/assets/runtime/particleEmitter.v1.js +318 -0
- package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_chip.png +0 -0
- package/packages/effects/wood_cutter_sawdust/assets/textures/wood_cutter_sawdust_dust.png +0 -0
- package/packages/effects/wood_cutter_sawdust/index.ts +29 -0
- package/packages/effects/wood_cutter_sawdust/vfx-params.json +14 -0
- package/packages/effects/wood_cutter_sawdust/wood_cutter_sawdust.json +592 -0
- package/packages/effects/wood_peel_material_test/assets/runtime/woodPeelMaterialTest.v1.js +196 -0
- package/packages/effects/wood_peel_material_test/index.ts +11 -0
- package/packages/effects/wood_peel_material_test/vfx-params.json +9 -0
- package/packages/effects/wood_peel_material_test/wood_peel_material_test.json +136 -0
- package/packages/env.particle.forest_edge_fog/assets/runtime/particleEmitter.v1.js +210 -0
- package/packages/env.particle.forest_edge_fog/assets/textures/f12a23c4-b924-4322-a260-3d982428f1e8.png +0 -0
- package/packages/env.particle.forest_edge_fog/assets/textures/yuan.png +0 -0
- package/packages/env.particle.forest_edge_fog/effect.json +854 -0
- package/packages/env.particle.forest_edge_fog/media/preview.gif +0 -0
- package/packages/env.particle.forest_edge_fog/media/preview.mp4 +0 -0
- package/packages/env.particle.forest_edge_fog/media/preview.webm +0 -0
- package/packages/env.particle.forest_edge_fog/media/thumbnail.png +0 -0
- package/packages/env.particle.forest_edge_fog/metadata/description.json +148 -0
- package/packages/env.particle.forest_edge_fog/provenance/03-effect.original.json +827 -0
- package/packages/env.particle.forest_edge_fog/provenance/03-normalized-vfx-to-babylon-report.json +196 -0
- package/packages/env.particle.forest_edge_fog/provenance/04-preview-overrides.json +432 -0
- package/packages/env.particle.forest_edge_fog/provenance/04-preview-tuning-report.json +28 -0
- package/packages/env.particle.forest_edge_fog/provenance/asset-map.json +124 -0
- package/packages/env.particle.forest_edge_fog/provenance/lineage.json +41 -0
- package/packages/generation.ts +14 -0
- package/packages/index.ts +14 -0
- package/packages/legacy-particle-runtime.ts +113 -0
- package/packages/manifestRuntimePackage.ts +519 -0
- package/packages/registry.ts +85 -0
- package/packages/rendering.ts +13 -0
- package/packages/resource.particle.viscous_oil_suction/assets/runtime/top_disk_suction/particleEmitter.v1.js +424 -0
- package/packages/resource.particle.viscous_oil_suction/assets/textures/Glow ad.png +0 -0
- package/packages/resource.particle.viscous_oil_suction/effect.json +1254 -0
- package/packages/resource.particle.viscous_oil_suction/media/preview.gif +0 -0
- package/packages/resource.particle.viscous_oil_suction/media/preview.mp4 +0 -0
- package/packages/resource.particle.viscous_oil_suction/media/preview.webm +0 -0
- package/packages/resource.particle.viscous_oil_suction/media/thumbnail.png +0 -0
- package/packages/resource.particle.viscous_oil_suction/metadata/description.json +122 -0
- package/packages/resource.particle.viscous_oil_suction/provenance/03-effect.original.json +1051 -0
- package/packages/resource.particle.viscous_oil_suction/provenance/03-normalized-vfx-to-babylon-report.json +200 -0
- package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-overrides.json +581 -0
- package/packages/resource.particle.viscous_oil_suction/provenance/04-preview-tuning-report.json +28 -0
- package/packages/resource.particle.viscous_oil_suction/provenance/asset-map.json +111 -0
- package/packages/resource.particle.viscous_oil_suction/provenance/lineage.json +45 -0
- package/packages/types.ts +107 -0
- package/tooling/check-dist-runtime.mjs +166 -0
- package/tooling/generate-index.mjs +55 -0
- package/tooling/test-guardrails.mjs +157 -0
- package/tooling/validate-boundary.mjs +92 -0
- package/tooling/validate-effects.mjs +304 -0
- package/tooling/validate.mjs +53 -0
- package/tooling/vfx-cli.mjs +232 -0
- package/tooling/vfx-package-resolution.mjs +28 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ParticleSystem } from "@babylonjs/core/Particles/particleSystem";
|
|
2
|
+
import { Texture } from "@babylonjs/core/Materials/Textures/texture";
|
|
3
|
+
import { Color4 } from "@babylonjs/core/Maths/math.color";
|
|
4
|
+
import { Vector3 } from "@babylonjs/core/Maths/math.vector";
|
|
5
|
+
const sparkTextureUrl = "data:image/webp;base64,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";
|
|
6
|
+
const DEFAULT_PARAMS = { radius: 1.2, rate: 48, duration: 0.55 };
|
|
7
|
+
const electricArcEffectPackage = {
|
|
8
|
+
id: "electric-arc",
|
|
9
|
+
nameZh: "受击电弧",
|
|
10
|
+
debugAnchor: "playerRight",
|
|
11
|
+
defaultParams: DEFAULT_PARAMS,
|
|
12
|
+
debugParams: [
|
|
13
|
+
{ key: "radius", label: "环绕半径", kind: "scale", min: 0.3, max: 4, step: 0.05 },
|
|
14
|
+
{ key: "rate", label: "电弧密度", kind: "number", min: 0, max: 150, step: 1 },
|
|
15
|
+
{ key: "duration", label: "持续(s)", kind: "lifetime", min: 0.1, max: 3, step: 0.05 }
|
|
16
|
+
],
|
|
17
|
+
create({ scene, root, position, params }) {
|
|
18
|
+
root.position.copyFrom(position);
|
|
19
|
+
const radius = params.radius;
|
|
20
|
+
const e = radius * 0.9;
|
|
21
|
+
const ps = new ParticleSystem("vfx_elec_ps", 80, scene, null, true);
|
|
22
|
+
const tex = new Texture(sparkTextureUrl, scene);
|
|
23
|
+
tex.hasAlpha = true;
|
|
24
|
+
ps.particleTexture = tex;
|
|
25
|
+
ps.spriteCellWidth = 128;
|
|
26
|
+
ps.spriteCellHeight = 128;
|
|
27
|
+
ps.startSpriteCellID = 0;
|
|
28
|
+
ps.endSpriteCellID = 15;
|
|
29
|
+
ps.spriteCellChangeSpeed = 3;
|
|
30
|
+
ps.spriteRandomStartCell = true;
|
|
31
|
+
ps.emitter = position.clone();
|
|
32
|
+
ps.minEmitBox = new Vector3(-e, -e, -e);
|
|
33
|
+
ps.maxEmitBox = new Vector3(e, e, e);
|
|
34
|
+
ps.direction1 = new Vector3(-0.3, -0.3, -0.3);
|
|
35
|
+
ps.direction2 = new Vector3(0.3, 0.3, 0.3);
|
|
36
|
+
ps.minSize = radius * 2.2;
|
|
37
|
+
ps.maxSize = radius * 3.6;
|
|
38
|
+
ps.minLifeTime = 0.16;
|
|
39
|
+
ps.maxLifeTime = 0.38;
|
|
40
|
+
ps.minInitialRotation = -Math.PI;
|
|
41
|
+
ps.maxInitialRotation = Math.PI;
|
|
42
|
+
ps.color1 = new Color4(0.85, 0.95, 1, 1);
|
|
43
|
+
ps.color2 = new Color4(0.5, 0.75, 1, 1);
|
|
44
|
+
ps.colorDead = new Color4(0.2, 0.4, 1, 0);
|
|
45
|
+
ps.blendMode = ParticleSystem.BLENDMODE_ADD;
|
|
46
|
+
ps.minEmitPower = 0;
|
|
47
|
+
ps.maxEmitPower = 0.5;
|
|
48
|
+
ps.emitRate = params.rate;
|
|
49
|
+
ps.start();
|
|
50
|
+
let disposed = false;
|
|
51
|
+
const stopTimer = window.setTimeout(() => {
|
|
52
|
+
ps.emitRate = 0;
|
|
53
|
+
}, params.duration * 1e3);
|
|
54
|
+
const disposeTimer = window.setTimeout(() => disposeAll(), (params.duration + 0.5) * 1e3);
|
|
55
|
+
function disposeAll() {
|
|
56
|
+
if (disposed) return;
|
|
57
|
+
disposed = true;
|
|
58
|
+
window.clearTimeout(stopTimer);
|
|
59
|
+
window.clearTimeout(disposeTimer);
|
|
60
|
+
ps.dispose();
|
|
61
|
+
tex.dispose();
|
|
62
|
+
root.dispose();
|
|
63
|
+
}
|
|
64
|
+
return { root, dispose() {
|
|
65
|
+
disposeAll();
|
|
66
|
+
} };
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
export {
|
|
70
|
+
electricArcEffectPackage
|
|
71
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { GlowLayer } from '@babylonjs/core/Layers/glowLayer';
|
|
2
|
+
import { ShaderMaterial } from '@babylonjs/core/Materials/shaderMaterial';
|
|
3
|
+
import { Vector3 } from '@babylonjs/core/Maths/math.vector';
|
|
4
|
+
import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh';
|
|
5
|
+
import { Mesh } from '@babylonjs/core/Meshes/mesh';
|
|
6
|
+
import { TransformNode } from '@babylonjs/core/Meshes/transformNode';
|
|
7
|
+
import { Scene } from '@babylonjs/core/scene';
|
|
8
|
+
import { VfxColorValue, VfxEffectHandle, VfxEffectPackage, VfxParamValues } from '../../types';
|
|
9
|
+
export interface EnergyShieldParams extends VfxParamValues {
|
|
10
|
+
radius: number;
|
|
11
|
+
verticalScale: number;
|
|
12
|
+
color: VfxColorValue;
|
|
13
|
+
opacity: number;
|
|
14
|
+
fresnelPower: number;
|
|
15
|
+
fresnelStrength: number;
|
|
16
|
+
rimIntensity: number;
|
|
17
|
+
surfaceIntensity: number;
|
|
18
|
+
noiseScale: number;
|
|
19
|
+
noiseEdgeWidth: number;
|
|
20
|
+
noiseEdgeIntensity: number;
|
|
21
|
+
noiseEdgeSmoothness: number;
|
|
22
|
+
flowScale: number;
|
|
23
|
+
flowSpeed: number;
|
|
24
|
+
flowIntensity: number;
|
|
25
|
+
marbleContrast: number;
|
|
26
|
+
bloomIntensity: number;
|
|
27
|
+
bloomKernelSize: number;
|
|
28
|
+
segments: number;
|
|
29
|
+
}
|
|
30
|
+
export interface CreateEnergyShieldOptions {
|
|
31
|
+
root?: TransformNode;
|
|
32
|
+
target?: TransformNode | AbstractMesh;
|
|
33
|
+
position?: Vector3;
|
|
34
|
+
params?: Partial<EnergyShieldParams>;
|
|
35
|
+
renderingGroupId?: number;
|
|
36
|
+
disposeRoot?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface EnergyShieldHandle extends VfxEffectHandle {
|
|
39
|
+
shield: Mesh;
|
|
40
|
+
material: ShaderMaterial;
|
|
41
|
+
glowLayer: GlowLayer | null;
|
|
42
|
+
update(params: Partial<EnergyShieldParams>): void;
|
|
43
|
+
}
|
|
44
|
+
export declare const energyShieldEffectPackage: VfxEffectPackage<EnergyShieldParams>;
|
|
45
|
+
export default energyShieldEffectPackage;
|
|
46
|
+
export declare function createEnergyShield(scene: Scene, options?: CreateEnergyShieldOptions): EnergyShieldHandle;
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { Constants } from "@babylonjs/core/Engines/constants";
|
|
2
|
+
import { GlowLayer } from "@babylonjs/core/Layers/glowLayer";
|
|
3
|
+
import { Effect } from "@babylonjs/core/Materials/effect";
|
|
4
|
+
import { ShaderMaterial } from "@babylonjs/core/Materials/shaderMaterial";
|
|
5
|
+
import { Color3 } from "@babylonjs/core/Maths/math.color";
|
|
6
|
+
import { Vector3 } from "@babylonjs/core/Maths/math.vector";
|
|
7
|
+
import { MeshBuilder } from "@babylonjs/core/Meshes/meshBuilder";
|
|
8
|
+
import { TransformNode } from "@babylonjs/core/Meshes/transformNode";
|
|
9
|
+
import { V as VFX_RENDERING_GROUP_ID } from "../../chunks/rendering-CV3nhygX.js";
|
|
10
|
+
const SHADER_NAME = "vfxEnergyShield";
|
|
11
|
+
const DEFAULT_PARAMS = {
|
|
12
|
+
radius: 3.18,
|
|
13
|
+
verticalScale: 1.02,
|
|
14
|
+
color: { r: 0.34902, g: 0.568627, b: 0.968627 },
|
|
15
|
+
opacity: 0.2,
|
|
16
|
+
fresnelPower: 1.8,
|
|
17
|
+
fresnelStrength: 0.66,
|
|
18
|
+
rimIntensity: 0.4,
|
|
19
|
+
surfaceIntensity: 0.3,
|
|
20
|
+
noiseScale: 1,
|
|
21
|
+
noiseEdgeWidth: 0.1,
|
|
22
|
+
noiseEdgeIntensity: 0.42,
|
|
23
|
+
noiseEdgeSmoothness: 0.5,
|
|
24
|
+
flowScale: 0.36,
|
|
25
|
+
flowSpeed: 0.25,
|
|
26
|
+
flowIntensity: 1.15,
|
|
27
|
+
marbleContrast: 0.67,
|
|
28
|
+
bloomIntensity: 0.45,
|
|
29
|
+
bloomKernelSize: 36,
|
|
30
|
+
segments: 64
|
|
31
|
+
};
|
|
32
|
+
const VERTEX_SHADER = `
|
|
33
|
+
precision highp float;
|
|
34
|
+
|
|
35
|
+
attribute vec3 position;
|
|
36
|
+
attribute vec3 normal;
|
|
37
|
+
|
|
38
|
+
uniform mat4 world;
|
|
39
|
+
uniform mat4 worldViewProjection;
|
|
40
|
+
|
|
41
|
+
varying vec3 vObjPos;
|
|
42
|
+
varying vec3 vWorldPos;
|
|
43
|
+
varying vec3 vNormalW;
|
|
44
|
+
|
|
45
|
+
void main(void) {
|
|
46
|
+
vObjPos = position;
|
|
47
|
+
vec4 worldPos = world * vec4(position, 1.0);
|
|
48
|
+
vWorldPos = worldPos.xyz;
|
|
49
|
+
vNormalW = normalize(mat3(world) * normal);
|
|
50
|
+
gl_Position = worldViewProjection * vec4(position, 1.0);
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
53
|
+
const FRAGMENT_SHADER = `
|
|
54
|
+
precision highp float;
|
|
55
|
+
|
|
56
|
+
uniform float uTime;
|
|
57
|
+
uniform vec3 cameraPosition;
|
|
58
|
+
uniform vec3 uColor;
|
|
59
|
+
uniform float uOpacity;
|
|
60
|
+
uniform float uFresnelPower;
|
|
61
|
+
uniform float uFresnelStrength;
|
|
62
|
+
uniform float uRimIntensity;
|
|
63
|
+
uniform float uSurfaceIntensity;
|
|
64
|
+
uniform float uNoiseScale;
|
|
65
|
+
uniform float uNoiseEdgeWidth;
|
|
66
|
+
uniform float uNoiseEdgeIntensity;
|
|
67
|
+
uniform float uNoiseEdgeSmoothness;
|
|
68
|
+
uniform float uFlowScale;
|
|
69
|
+
uniform float uFlowSpeed;
|
|
70
|
+
uniform float uFlowIntensity;
|
|
71
|
+
uniform float uMarbleContrast;
|
|
72
|
+
|
|
73
|
+
varying vec3 vObjPos;
|
|
74
|
+
varying vec3 vWorldPos;
|
|
75
|
+
varying vec3 vNormalW;
|
|
76
|
+
|
|
77
|
+
vec3 mod289v3(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
|
|
78
|
+
vec4 mod289v4(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
|
|
79
|
+
vec4 permute(vec4 x) { return mod289v4(((x * 34.0) + 1.0) * x); }
|
|
80
|
+
vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }
|
|
81
|
+
|
|
82
|
+
float saturate(float v) { return clamp(v, 0.0, 1.0); }
|
|
83
|
+
|
|
84
|
+
float snoise(vec3 v) {
|
|
85
|
+
const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0);
|
|
86
|
+
const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);
|
|
87
|
+
vec3 i = floor(v + dot(v, C.yyy));
|
|
88
|
+
vec3 x0 = v - i + dot(i, C.xxx);
|
|
89
|
+
vec3 g = step(x0.yzx, x0.xyz);
|
|
90
|
+
vec3 l = 1.0 - g;
|
|
91
|
+
vec3 i1 = min(g.xyz, l.zxy);
|
|
92
|
+
vec3 i2 = max(g.xyz, l.zxy);
|
|
93
|
+
vec3 x1 = x0 - i1 + C.xxx;
|
|
94
|
+
vec3 x2 = x0 - i2 + C.yyy;
|
|
95
|
+
vec3 x3 = x0 - D.yyy;
|
|
96
|
+
i = mod289v3(i);
|
|
97
|
+
vec4 p = permute(permute(permute(
|
|
98
|
+
i.z + vec4(0.0, i1.z, i2.z, 1.0))
|
|
99
|
+
+ i.y + vec4(0.0, i1.y, i2.y, 1.0))
|
|
100
|
+
+ i.x + vec4(0.0, i1.x, i2.x, 1.0));
|
|
101
|
+
float n_ = 0.142857142857;
|
|
102
|
+
vec3 ns = n_ * D.wyz - D.xzx;
|
|
103
|
+
vec4 j = p - 49.0 * floor(p * ns.z * ns.z);
|
|
104
|
+
vec4 x_ = floor(j * ns.z);
|
|
105
|
+
vec4 y_ = floor(j - 7.0 * x_);
|
|
106
|
+
vec4 x = x_ * ns.x + ns.yyyy;
|
|
107
|
+
vec4 y = y_ * ns.x + ns.yyyy;
|
|
108
|
+
vec4 h = 1.0 - abs(x) - abs(y);
|
|
109
|
+
vec4 b0 = vec4(x.xy, y.xy);
|
|
110
|
+
vec4 b1 = vec4(x.zw, y.zw);
|
|
111
|
+
vec4 s0 = floor(b0) * 2.0 + 1.0;
|
|
112
|
+
vec4 s1 = floor(b1) * 2.0 + 1.0;
|
|
113
|
+
vec4 sh = -step(h, vec4(0.0));
|
|
114
|
+
vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;
|
|
115
|
+
vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;
|
|
116
|
+
vec3 p0 = vec3(a0.xy, h.x);
|
|
117
|
+
vec3 p1 = vec3(a0.zw, h.y);
|
|
118
|
+
vec3 p2 = vec3(a1.xy, h.z);
|
|
119
|
+
vec3 p3 = vec3(a1.zw, h.w);
|
|
120
|
+
vec4 norm = taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));
|
|
121
|
+
p0 *= norm.x;
|
|
122
|
+
p1 *= norm.y;
|
|
123
|
+
p2 *= norm.z;
|
|
124
|
+
p3 *= norm.w;
|
|
125
|
+
vec4 m = max(0.6 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);
|
|
126
|
+
m = m * m;
|
|
127
|
+
return 42.0 * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
float fbm(vec3 p) {
|
|
131
|
+
float total = 0.0;
|
|
132
|
+
float amp = 0.55;
|
|
133
|
+
total += snoise(p) * amp;
|
|
134
|
+
p = p * 2.03 + vec3(17.1, 3.7, 9.2);
|
|
135
|
+
amp *= 0.52;
|
|
136
|
+
total += snoise(p) * amp;
|
|
137
|
+
p = p * 2.11 + vec3(4.3, 13.9, 6.4);
|
|
138
|
+
amp *= 0.5;
|
|
139
|
+
total += snoise(p) * amp;
|
|
140
|
+
return total;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
void main(void) {
|
|
144
|
+
vec3 normalW = normalize(vNormalW);
|
|
145
|
+
vec3 viewDir = normalize(cameraPosition - vWorldPos);
|
|
146
|
+
float ndv = saturate(dot(normalW, viewDir));
|
|
147
|
+
float fresnel = pow(1.0 - ndv, max(0.05, uFresnelPower)) * uFresnelStrength;
|
|
148
|
+
|
|
149
|
+
float t = uTime * uFlowSpeed;
|
|
150
|
+
vec3 spherePos = normalize(vObjPos + vec3(0.0001)) * max(0.05, uNoiseScale);
|
|
151
|
+
vec3 flowA = spherePos * uFlowScale + vec3(t, t * 0.62, t * 0.38);
|
|
152
|
+
vec3 flowB = spherePos * (uFlowScale * 1.91) + vec3(-t * 0.46, t * 0.82, -t * 0.27);
|
|
153
|
+
float n1 = fbm(flowA);
|
|
154
|
+
float n2 = fbm(flowB);
|
|
155
|
+
float cloud = saturate((n1 * 0.58 + n2 * 0.42) * 0.5 + 0.5);
|
|
156
|
+
|
|
157
|
+
float veinInput = spherePos.y * 0.92 + n1 * 1.65 + n2 * 0.74 + t * 0.13;
|
|
158
|
+
float ribbon = abs(sin(veinInput * 3.14159265));
|
|
159
|
+
float marble = pow(1.0 - ribbon, max(0.25, uMarbleContrast));
|
|
160
|
+
float nebula = saturate(mix(cloud, marble, 0.58) * uFlowIntensity * 0.34);
|
|
161
|
+
|
|
162
|
+
float edgeWidth = max(0.01, uNoiseEdgeWidth);
|
|
163
|
+
float edgeSoft = max(0.01, uNoiseEdgeSmoothness) * 0.22;
|
|
164
|
+
float noiseEdge = smoothstep(1.0 - edgeWidth - edgeSoft, 1.0 - edgeWidth * 0.22, nebula);
|
|
165
|
+
|
|
166
|
+
vec3 deepBlue = uColor * (0.12 + 0.42 * cloud);
|
|
167
|
+
vec3 marbleBlue = uColor * (0.34 + 0.9 * marble) * uSurfaceIntensity;
|
|
168
|
+
vec3 rimBlue = uColor * fresnel * uRimIntensity;
|
|
169
|
+
vec3 edgeBlue = uColor * noiseEdge * uNoiseEdgeIntensity;
|
|
170
|
+
vec3 color = min((deepBlue + marbleBlue + rimBlue + edgeBlue) * 0.72, vec3(1.12));
|
|
171
|
+
|
|
172
|
+
float alpha = uOpacity * (0.16 + 0.34 * cloud + 0.24 * marble);
|
|
173
|
+
alpha += fresnel * uOpacity * 0.58;
|
|
174
|
+
alpha += noiseEdge * uNoiseEdgeIntensity * 0.05;
|
|
175
|
+
|
|
176
|
+
gl_FragColor = vec4(color, saturate(alpha));
|
|
177
|
+
}
|
|
178
|
+
`;
|
|
179
|
+
const energyShieldEffectPackage = {
|
|
180
|
+
id: "energy-shield",
|
|
181
|
+
nameZh: "半球玻璃罩",
|
|
182
|
+
defaultParams: DEFAULT_PARAMS,
|
|
183
|
+
debugAnchor: "player",
|
|
184
|
+
manifest: {
|
|
185
|
+
id: "energy-shield",
|
|
186
|
+
nameZh: "半球玻璃罩",
|
|
187
|
+
source: "https://github.com/cortiz2894/flow-shield-effect"
|
|
188
|
+
},
|
|
189
|
+
debugParams: [
|
|
190
|
+
{ key: "radius", label: "玻璃罩半径", kind: "scale", min: 0.4, max: 10, step: 0.01 },
|
|
191
|
+
{ key: "verticalScale", label: "纵向缩放", kind: "scale", min: 0.5, max: 1.8, step: 0.01 },
|
|
192
|
+
{ key: "color", label: "主体颜色", kind: "color" },
|
|
193
|
+
{ key: "opacity", label: "透明度", kind: "opacity", min: 0.02, max: 1, step: 0.01 },
|
|
194
|
+
{ key: "fresnelPower", label: "边缘曲线", kind: "number", min: 0.2, max: 6, step: 0.01 },
|
|
195
|
+
{ key: "fresnelStrength", label: "边缘强度", kind: "number", min: 0, max: 6, step: 0.01 },
|
|
196
|
+
{ key: "rimIntensity", label: "轮廓亮度", kind: "number", min: 0, max: 4, step: 0.01 },
|
|
197
|
+
{ key: "surfaceIntensity", label: "表面亮度", kind: "number", min: 0, max: 3, step: 0.01 },
|
|
198
|
+
{ key: "noiseScale", label: "噪声缩放", kind: "number", min: 0.2, max: 5, step: 0.01 },
|
|
199
|
+
{ key: "noiseEdgeWidth", label: "噪声亮边宽度", kind: "number", min: 0.01, max: 0.5, step: 0.01 },
|
|
200
|
+
{ key: "noiseEdgeIntensity", label: "噪声亮边强度", kind: "number", min: 0, max: 4, step: 0.01 },
|
|
201
|
+
{ key: "noiseEdgeSmoothness", label: "噪声亮边柔和度", kind: "number", min: 0.02, max: 1, step: 0.01 },
|
|
202
|
+
{ key: "flowScale", label: "纹路密度", kind: "number", min: 0, max: 3, step: 0.01 },
|
|
203
|
+
{ key: "flowSpeed", label: "流动速度", kind: "number", min: 0, max: 5, step: 0.01 },
|
|
204
|
+
{ key: "flowIntensity", label: "流动强度", kind: "number", min: 0, max: 8, step: 0.01 },
|
|
205
|
+
{ key: "marbleContrast", label: "纹路锐度", kind: "number", min: 0.25, max: 4, step: 0.01 },
|
|
206
|
+
{ key: "bloomIntensity", label: "Bloom 强度", kind: "number", min: 0, max: 4, step: 0.01 },
|
|
207
|
+
{ key: "bloomKernelSize", label: "Bloom 半径", kind: "number", min: 8, max: 128, step: 1 }
|
|
208
|
+
],
|
|
209
|
+
create({ scene, root, position, renderingGroupId, params }) {
|
|
210
|
+
return createEnergyShield(scene, { root, position, renderingGroupId, params });
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
function createEnergyShield(scene, options = {}) {
|
|
214
|
+
registerShaders();
|
|
215
|
+
let params = mergeParams(options.params);
|
|
216
|
+
const root = options.root ?? new TransformNode("vfx_energyShield_root", scene);
|
|
217
|
+
const disposeRoot = options.disposeRoot ?? true;
|
|
218
|
+
if (options.target) {
|
|
219
|
+
root.parent = options.target;
|
|
220
|
+
root.position.set(0, 0, 0);
|
|
221
|
+
} else {
|
|
222
|
+
root.position.copyFrom(options.position ?? Vector3.ZeroReadOnly);
|
|
223
|
+
}
|
|
224
|
+
const shield = MeshBuilder.CreateSphere(
|
|
225
|
+
"vfx_energyShield_hemisphere",
|
|
226
|
+
{
|
|
227
|
+
diameter: 2,
|
|
228
|
+
segments: Math.max(16, Math.round(params.segments)),
|
|
229
|
+
slice: 0.5,
|
|
230
|
+
updatable: false
|
|
231
|
+
},
|
|
232
|
+
scene
|
|
233
|
+
);
|
|
234
|
+
shield.parent = root;
|
|
235
|
+
shield.isPickable = false;
|
|
236
|
+
shield.alwaysSelectAsActiveMesh = true;
|
|
237
|
+
shield.renderingGroupId = options.renderingGroupId ?? VFX_RENDERING_GROUP_ID;
|
|
238
|
+
shield.alphaIndex = 20;
|
|
239
|
+
const material = createShieldMaterial(scene);
|
|
240
|
+
shield.material = material;
|
|
241
|
+
let glowLayer = null;
|
|
242
|
+
if (params.bloomIntensity > 0) {
|
|
243
|
+
glowLayer = new GlowLayer(`vfx_energyShield_glow_${shield.uniqueId}`, scene, {
|
|
244
|
+
blurKernelSize: params.bloomKernelSize,
|
|
245
|
+
mainTextureRatio: 0.35
|
|
246
|
+
});
|
|
247
|
+
glowLayer.intensity = params.bloomIntensity;
|
|
248
|
+
glowLayer.addIncludedOnlyMesh(shield);
|
|
249
|
+
glowLayer.referenceMeshToUseItsOwnMaterial(shield);
|
|
250
|
+
}
|
|
251
|
+
applyParams(material, shield, glowLayer, params);
|
|
252
|
+
let elapsed = 0;
|
|
253
|
+
const observer = scene.onBeforeRenderObservable.add(() => {
|
|
254
|
+
elapsed += Math.min(scene.getEngine().getDeltaTime() / 1e3, 0.05);
|
|
255
|
+
material.setFloat("uTime", elapsed);
|
|
256
|
+
});
|
|
257
|
+
let disposed = false;
|
|
258
|
+
const dispose = () => {
|
|
259
|
+
if (disposed) return;
|
|
260
|
+
disposed = true;
|
|
261
|
+
scene.onBeforeRenderObservable.remove(observer);
|
|
262
|
+
glowLayer?.dispose();
|
|
263
|
+
shield.dispose(false, false);
|
|
264
|
+
material.dispose();
|
|
265
|
+
if (disposeRoot) root.dispose();
|
|
266
|
+
};
|
|
267
|
+
return {
|
|
268
|
+
root,
|
|
269
|
+
shield,
|
|
270
|
+
material,
|
|
271
|
+
glowLayer,
|
|
272
|
+
update(partial) {
|
|
273
|
+
params = mergeParams(partial, params);
|
|
274
|
+
applyParams(material, shield, glowLayer, params);
|
|
275
|
+
if (!glowLayer && params.bloomIntensity > 0) {
|
|
276
|
+
glowLayer = new GlowLayer(`vfx_energyShield_glow_${shield.uniqueId}`, scene, {
|
|
277
|
+
blurKernelSize: params.bloomKernelSize,
|
|
278
|
+
mainTextureRatio: 0.35
|
|
279
|
+
});
|
|
280
|
+
glowLayer.addIncludedOnlyMesh(shield);
|
|
281
|
+
glowLayer.referenceMeshToUseItsOwnMaterial(shield);
|
|
282
|
+
glowLayer.intensity = params.bloomIntensity;
|
|
283
|
+
applyParams(material, shield, glowLayer, params);
|
|
284
|
+
this.glowLayer = glowLayer;
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
dispose
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function createShieldMaterial(scene) {
|
|
291
|
+
const material = new ShaderMaterial(
|
|
292
|
+
"vfx_energyShield_material",
|
|
293
|
+
scene,
|
|
294
|
+
{ vertex: SHADER_NAME, fragment: SHADER_NAME },
|
|
295
|
+
{
|
|
296
|
+
attributes: ["position", "normal"],
|
|
297
|
+
uniforms: [
|
|
298
|
+
"world",
|
|
299
|
+
"worldViewProjection",
|
|
300
|
+
"cameraPosition",
|
|
301
|
+
"uTime",
|
|
302
|
+
"uColor",
|
|
303
|
+
"uOpacity",
|
|
304
|
+
"uFresnelPower",
|
|
305
|
+
"uFresnelStrength",
|
|
306
|
+
"uRimIntensity",
|
|
307
|
+
"uSurfaceIntensity",
|
|
308
|
+
"uNoiseScale",
|
|
309
|
+
"uNoiseEdgeWidth",
|
|
310
|
+
"uNoiseEdgeIntensity",
|
|
311
|
+
"uNoiseEdgeSmoothness",
|
|
312
|
+
"uFlowScale",
|
|
313
|
+
"uFlowSpeed",
|
|
314
|
+
"uFlowIntensity",
|
|
315
|
+
"uMarbleContrast"
|
|
316
|
+
],
|
|
317
|
+
needAlphaBlending: true
|
|
318
|
+
}
|
|
319
|
+
);
|
|
320
|
+
material.alphaMode = Constants.ALPHA_COMBINE;
|
|
321
|
+
material.backFaceCulling = false;
|
|
322
|
+
material.disableDepthWrite = true;
|
|
323
|
+
material.fogEnabled = false;
|
|
324
|
+
return material;
|
|
325
|
+
}
|
|
326
|
+
function applyParams(material, shield, glowLayer, params) {
|
|
327
|
+
shield.scaling.set(params.radius, params.radius * params.verticalScale, params.radius);
|
|
328
|
+
material.setColor3("uColor", toColor3(params.color));
|
|
329
|
+
material.setFloat("uOpacity", params.opacity);
|
|
330
|
+
material.setFloat("uFresnelPower", params.fresnelPower);
|
|
331
|
+
material.setFloat("uFresnelStrength", params.fresnelStrength);
|
|
332
|
+
material.setFloat("uRimIntensity", params.rimIntensity);
|
|
333
|
+
material.setFloat("uSurfaceIntensity", params.surfaceIntensity);
|
|
334
|
+
material.setFloat("uNoiseScale", params.noiseScale);
|
|
335
|
+
material.setFloat("uNoiseEdgeWidth", params.noiseEdgeWidth);
|
|
336
|
+
material.setFloat("uNoiseEdgeIntensity", params.noiseEdgeIntensity);
|
|
337
|
+
material.setFloat("uNoiseEdgeSmoothness", params.noiseEdgeSmoothness);
|
|
338
|
+
material.setFloat("uFlowScale", params.flowScale);
|
|
339
|
+
material.setFloat("uFlowSpeed", params.flowSpeed);
|
|
340
|
+
material.setFloat("uFlowIntensity", params.flowIntensity);
|
|
341
|
+
material.setFloat("uMarbleContrast", params.marbleContrast);
|
|
342
|
+
if (glowLayer) {
|
|
343
|
+
glowLayer.intensity = params.bloomIntensity;
|
|
344
|
+
glowLayer.blurKernelSize = params.bloomKernelSize;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function mergeParams(patch, base = DEFAULT_PARAMS) {
|
|
348
|
+
return {
|
|
349
|
+
...base,
|
|
350
|
+
...patch,
|
|
351
|
+
color: patch?.color ? { ...patch.color } : { ...base.color }
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function toColor3(color) {
|
|
355
|
+
return new Color3(color.r, color.g, color.b);
|
|
356
|
+
}
|
|
357
|
+
function registerShaders() {
|
|
358
|
+
Effect.ShadersStore[`${SHADER_NAME}VertexShader`] = VERTEX_SHADER;
|
|
359
|
+
Effect.ShadersStore[`${SHADER_NAME}FragmentShader`] = FRAGMENT_SHADER;
|
|
360
|
+
}
|
|
361
|
+
export {
|
|
362
|
+
createEnergyShield,
|
|
363
|
+
energyShieldEffectPackage as default,
|
|
364
|
+
energyShieldEffectPackage
|
|
365
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { VfxEffectPackage, VfxParamValues } from '../../types';
|
|
2
|
+
interface ExplosionParams extends VfxParamValues {
|
|
3
|
+
flashRadius: number;
|
|
4
|
+
flashBrightness: number;
|
|
5
|
+
sparksCount: number;
|
|
6
|
+
sparksSize: number;
|
|
7
|
+
embersCount: number;
|
|
8
|
+
embersPower: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const explosionEffectPackage: VfxEffectPackage<ExplosionParams>;
|
|
11
|
+
export {};
|