@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,140 @@
|
|
|
1
|
+
import { TransformNode } from "@babylonjs/core/Meshes/transformNode";
|
|
2
|
+
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
|
3
|
+
import { CreateCylinder } from "@babylonjs/core/Meshes/Builders/cylinderBuilder";
|
|
4
|
+
import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial";
|
|
5
|
+
import { Texture } from "@babylonjs/core/Materials/Textures/texture";
|
|
6
|
+
import { Color3 } from "@babylonjs/core/Maths/math.color";
|
|
7
|
+
import { Constants } from "@babylonjs/core/Engines/constants";
|
|
8
|
+
import { L as LIFETIME_DEBUG_PARAMS, a as LIFETIME_DEFAULTS, s as scheduleLifetime } from "../../chunks/space-shared-BXV1hc0k.js";
|
|
9
|
+
const flameSpikeUrl = "data:image/webp;base64,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";
|
|
10
|
+
const flameFlowUrl = "data:image/webp;base64,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";
|
|
11
|
+
const DEFAULT_PARAMS = {
|
|
12
|
+
...LIFETIME_DEFAULTS,
|
|
13
|
+
flameColor: { r: 0.102, g: 0.427, b: 1 },
|
|
14
|
+
// #1a6dff
|
|
15
|
+
flameLen: 1,
|
|
16
|
+
flameWidth: 1,
|
|
17
|
+
flameSpeed: 1,
|
|
18
|
+
flamePulse: 0.025,
|
|
19
|
+
innerW: 1,
|
|
20
|
+
innerLen: 2.9,
|
|
21
|
+
innerOff: 0,
|
|
22
|
+
outerW: 0.87,
|
|
23
|
+
outerLen: 2,
|
|
24
|
+
outerOff: 0.05,
|
|
25
|
+
posX: -0.02,
|
|
26
|
+
posY: 0,
|
|
27
|
+
posZ: -1.72
|
|
28
|
+
};
|
|
29
|
+
const CONE_BASE = [{ dB: 1.2, dT: 1.12 }, { dB: 2.5, dT: 2.3 }];
|
|
30
|
+
function colorVec(c) {
|
|
31
|
+
return new Color3(c.r, c.g, c.b);
|
|
32
|
+
}
|
|
33
|
+
function excludeFromGlow(scene, mesh) {
|
|
34
|
+
for (const layer of scene.effectLayers ?? []) {
|
|
35
|
+
const add = layer.addExcludedMesh;
|
|
36
|
+
if (typeof add === "function") add.call(layer, mesh);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const ufoThreadFlameEffectPackage = {
|
|
40
|
+
id: "ufo-thread-flame",
|
|
41
|
+
nameZh: "UFO丝束尾焰",
|
|
42
|
+
debugAnchor: "player",
|
|
43
|
+
defaultParams: DEFAULT_PARAMS,
|
|
44
|
+
debugParams: [
|
|
45
|
+
...LIFETIME_DEBUG_PARAMS,
|
|
46
|
+
{ key: "flameColor", label: "尾焰颜色", kind: "color" },
|
|
47
|
+
{ key: "flameLen", label: "长度倍率", kind: "scale", min: 0.2, max: 4, step: 0.01 },
|
|
48
|
+
{ key: "flameWidth", label: "宽度倍率", kind: "scale", min: 0.3, max: 3, step: 0.01 },
|
|
49
|
+
{ key: "flameSpeed", label: "自转/流速", kind: "number", min: 0, max: 6, step: 0.05 },
|
|
50
|
+
{ key: "flamePulse", label: "脉冲幅度", kind: "number", min: 0, max: 0.3, step: 5e-3 },
|
|
51
|
+
{ key: "innerW", label: "里圈口径", kind: "number", min: 0.2, max: 4, step: 0.01 },
|
|
52
|
+
{ key: "innerLen", label: "里圈长度", kind: "number", min: 0.3, max: 8, step: 0.05 },
|
|
53
|
+
{ key: "innerOff", label: "里圈轴向偏移", kind: "number", min: -2, max: 2, step: 0.01 },
|
|
54
|
+
{ key: "outerW", label: "外圈口径", kind: "number", min: 0.2, max: 4, step: 0.01 },
|
|
55
|
+
{ key: "outerLen", label: "外圈长度", kind: "number", min: 0.3, max: 8, step: 0.05 },
|
|
56
|
+
{ key: "outerOff", label: "外圈轴向偏移", kind: "number", min: -2, max: 2, step: 0.01 },
|
|
57
|
+
{ key: "posX", label: "挂点X", kind: "number", min: -2, max: 2, step: 0.01 },
|
|
58
|
+
{ key: "posY", label: "挂点Y", kind: "number", min: -2, max: 2, step: 0.01 },
|
|
59
|
+
{ key: "posZ", label: "挂点Z(机尾后)", kind: "number", min: -5, max: 2, step: 0.01 }
|
|
60
|
+
],
|
|
61
|
+
create({ scene, root, position, rotationY, params }) {
|
|
62
|
+
root.position.copyFrom(position);
|
|
63
|
+
root.rotation.y = rotationY;
|
|
64
|
+
const spikeTex = new Texture(flameSpikeUrl, scene);
|
|
65
|
+
spikeTex.hasAlpha = true;
|
|
66
|
+
spikeTex.wrapU = Texture.WRAP_ADDRESSMODE;
|
|
67
|
+
spikeTex.wrapV = Texture.CLAMP_ADDRESSMODE;
|
|
68
|
+
spikeTex.uScale = 1;
|
|
69
|
+
spikeTex.vScale = 1;
|
|
70
|
+
spikeTex.vOffset = 0;
|
|
71
|
+
const flowTex = new Texture(flameFlowUrl, scene);
|
|
72
|
+
flowTex.wrapU = Texture.WRAP_ADDRESSMODE;
|
|
73
|
+
flowTex.wrapV = Texture.WRAP_ADDRESSMODE;
|
|
74
|
+
flowTex.level = 0.62;
|
|
75
|
+
const mat = new StandardMaterial("vfx_ufo_flameMat", scene);
|
|
76
|
+
mat.emissiveTexture = flowTex;
|
|
77
|
+
mat.opacityTexture = spikeTex;
|
|
78
|
+
mat.emissiveColor = colorVec(params.flameColor);
|
|
79
|
+
mat.disableLighting = true;
|
|
80
|
+
mat.backFaceCulling = false;
|
|
81
|
+
mat.disableDepthWrite = true;
|
|
82
|
+
mat.alphaMode = Constants.ALPHA_ADD;
|
|
83
|
+
mat.alpha = 0.78;
|
|
84
|
+
const flameRoot = new TransformNode("vfx_ufo_flameRoot", scene);
|
|
85
|
+
flameRoot.parent = root;
|
|
86
|
+
flameRoot.rotation.x = -Math.PI / 2;
|
|
87
|
+
const cones = [];
|
|
88
|
+
for (const { dB, dT } of CONE_BASE) {
|
|
89
|
+
const c = CreateCylinder("vfx_ufo_flameTube", { diameterBottom: dB, diameterTop: dT, height: 1, tessellation: 36, cap: Mesh.NO_CAP }, scene);
|
|
90
|
+
c.isPickable = false;
|
|
91
|
+
c.parent = flameRoot;
|
|
92
|
+
c.material = mat;
|
|
93
|
+
excludeFromGlow(scene, c);
|
|
94
|
+
cones.push(c);
|
|
95
|
+
}
|
|
96
|
+
function applyShape() {
|
|
97
|
+
cones.forEach((c, i) => {
|
|
98
|
+
const inner = i === 0;
|
|
99
|
+
const len = (inner ? params.innerLen : params.outerLen) * params.flameLen;
|
|
100
|
+
const off = inner ? params.innerOff : params.outerOff;
|
|
101
|
+
const w = inner ? params.innerW : params.outerW;
|
|
102
|
+
c.scaling.y = len;
|
|
103
|
+
c.scaling.x = c.scaling.z = w;
|
|
104
|
+
c.position.y = len / 2 - 0.05 + off;
|
|
105
|
+
});
|
|
106
|
+
flameRoot.position.set(params.posX, params.posY, params.posZ);
|
|
107
|
+
}
|
|
108
|
+
applyShape();
|
|
109
|
+
let t = 0;
|
|
110
|
+
const observer = scene.onBeforeRenderObservable.add(() => {
|
|
111
|
+
const dt = Math.min(scene.getEngine().getDeltaTime() / 1e3, 0.05);
|
|
112
|
+
t += dt;
|
|
113
|
+
cones.forEach((c, i) => {
|
|
114
|
+
c.rotation.y += (i ? -2 : 1.5) * params.flameSpeed * dt;
|
|
115
|
+
});
|
|
116
|
+
flowTex.vOffset -= 1.6 * params.flameSpeed * dt;
|
|
117
|
+
const ps = 1 + Math.sin(t * 14) * params.flamePulse;
|
|
118
|
+
flameRoot.scaling.set(ps * params.flameWidth, 1, ps * params.flameWidth);
|
|
119
|
+
});
|
|
120
|
+
let disposed = false;
|
|
121
|
+
let ltTimer = 0;
|
|
122
|
+
const dispose = () => {
|
|
123
|
+
if (disposed) return;
|
|
124
|
+
disposed = true;
|
|
125
|
+
if (ltTimer) window.clearTimeout(ltTimer);
|
|
126
|
+
scene.onBeforeRenderObservable.remove(observer);
|
|
127
|
+
for (const c of cones) c.dispose();
|
|
128
|
+
flameRoot.dispose();
|
|
129
|
+
mat.dispose();
|
|
130
|
+
spikeTex.dispose();
|
|
131
|
+
flowTex.dispose();
|
|
132
|
+
root.dispose();
|
|
133
|
+
};
|
|
134
|
+
ltTimer = scheduleLifetime(params, dispose);
|
|
135
|
+
return { root, dispose };
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
export {
|
|
139
|
+
ufoThreadFlameEffectPackage
|
|
140
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { VfxColorValue, VfxEffectPackage, VfxParamValues } from '../../types';
|
|
2
|
+
interface VehicleExhaustSmokeParams extends VfxParamValues {
|
|
3
|
+
lifetimeMode: string;
|
|
4
|
+
lifetime: number;
|
|
5
|
+
scale: number;
|
|
6
|
+
initialHeight: number;
|
|
7
|
+
color: VfxColorValue;
|
|
8
|
+
opacity: number;
|
|
9
|
+
particleCount: number;
|
|
10
|
+
particleMaxLifetime: number;
|
|
11
|
+
emitRange: number;
|
|
12
|
+
riseHeight: number;
|
|
13
|
+
smokeSize: number;
|
|
14
|
+
driftSpeed: number;
|
|
15
|
+
directionX: number;
|
|
16
|
+
directionZ: number;
|
|
17
|
+
}
|
|
18
|
+
export declare const vehicleExhaustSmokeEffectPackage: VfxEffectPackage<VehicleExhaustSmokeParams>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { Color4 } from "@babylonjs/core/Maths/math.color";
|
|
2
|
+
import { Vector3 } from "@babylonjs/core/Maths/math.vector";
|
|
3
|
+
import { Sprite } from "@babylonjs/core/Sprites/sprite";
|
|
4
|
+
import { SpriteManager } from "@babylonjs/core/Sprites/spriteManager";
|
|
5
|
+
import { a as configureVfxSpriteManager, V as VFX_RENDERING_GROUP_ID } from "../../chunks/rendering-CV3nhygX.js";
|
|
6
|
+
const id = "vehicle-exhaust-smoke";
|
|
7
|
+
const nameZh = "小车尾气";
|
|
8
|
+
const source = "runtime-generated";
|
|
9
|
+
const assets = [
|
|
10
|
+
"assets/textures/vehicle_exhaust_smoke_atlas.png"
|
|
11
|
+
];
|
|
12
|
+
const manifest = {
|
|
13
|
+
id,
|
|
14
|
+
nameZh,
|
|
15
|
+
source,
|
|
16
|
+
assets
|
|
17
|
+
};
|
|
18
|
+
const SMOKE_TEXTURE_URL = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABgZSURBVHhe7ZqHktw4EgX3/yPOe++999772/Pe/YsOGVLFQthHNnu6QIDky4gMSSNppkCQhQc0XzHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjNvLs2bNumklRk/Wo5hioudtLMwg1Gb01c6DmZhZNR9QFH6XZFzUHs2uSUBd3Fk1f1DU/muaJqIs5qyYXdY2PrtmIunhH0TyGuqZn0yygLtZRNfehruHZNS9QF+csmnXUNbual0ZdkLNpNOpaXdVLoi7EWTWvoa6Pfe5lUIM/u8YP/xZPjRrw1bwq6lpY7SlRA72qV0NdA7vuqVADvLpXQY3dbvMUqIHZ554dNWZ7n4dHDco+98yo8dqneVjUYOzLnhE1TvuYh0MNwmrPhBqfzfEwqOLtumdAjcvmeghU4Tv6i+IPi98sfqn4qeJHiu8rvqP4luIbi294Ib/na/yd+n67eAbUuCawnus3Fd9afGfx/cWPFj9T/HLx28UfFX9Z/H3xL0X1/YY6ParonWTSflX8cfE7xa8UP1v8WJHJfleRyecmqB/+NxffXnxP8YPFTxTV9+/ukVHjGSSNngecpt7OdTT69xY/XGRx+GKRxeIHxZ8XXy3+ufj34r+L/y3+78Wv6uft7tSogjv7t+Ifi78p/rT4veLXi58v8jDzUL+7yEPOw65WBJoDTYJmQdOgedBE1M/r5lFRYxkgc/eBInP5tuJSo+deiEbPPfK1IvcM9w73EPcS99S/ivHw43+K/yz+tah+/q5OiSq0o3RnujTdmq5N96aL083p6nR3ujzd/lb0Z9Vgm/DpItsGvgfbCLYTfG/187t4RNQ4djQa/YeKpLgtjT6iP42e6E9qJD1G9OdB54GPh59GQEPgfvtT8bfFnxVVPbs4JarQTkY3ZrLq6M9kMqlMLpO8Nfpz83ATfaFIevh+kQmuVwRVR7pHQ41hR+8941mK/tHoWUz+UWyjP3/m6/z974pxzvStoqprF6dCFdjBuhur6E+ca6M/cVCtCHyd5kBsjOj/1SLRP1aEPxSJfPWKoOpK9Uio+nfw0TMe7hEa/b3Rn/uB++InRWrgfokaVJ1dnQpVYLJ1N44o9pTozw3C1zgoaqM/HT2iP51+aUVQ9aV5FFTtO5h5xlNH/7bRx1y3iw3JkIRIDSTGevuh6u3qFKjCOlh344j+fGTDRzdEfz7KqaM/D/iW6P/JYhv92ePRYGg0akVQ9aV6BFTdne11xrMl+vPvIvrz//k+fL92+6Hq7uYUqMKSjQcvujFR7NdF4tt3i0T/zxU/Xrwn+vPv+X9EOb4P0Y7vq6J/3BRRg6ozzdlRNXe29xnPWvS/9yNmVX83h6OKSjQevDr6s0JH9P9GkRWBlfxW9GeS2uhPciD6x0sgRH8SxtKKUH/yoOpNcXZUzR3d84wn5rqN/lFDu/2gwajthxpHF4eiCkqWyWByeCB5MHlAI/rz4NbRnwd7KfrTEFT0p4Go6F8//BgrQr39UPWmOTOq3o7ufcbDn9voHzXEJw+3th9qHF0ciioo0frBi1NYIjpRnchOR4/oT6dXKwK/8me+zt9vif50/3pF4Pf1ilBvP1TdKc6MqreTI8546kYf0T+2H/d88qDGk+5QVEGJRjeuo3+cwrJyM7FMcJzCctHXoj+Txg3EjdS+/11Hf26CdkVY2n6oulOcFVVrR0ed8bTRX20/VPSva1Dj6eIwVDFJxoO3Fv3rU9i16E9MI64R22gYREkeXh5iHual6M+v3CCqhnpVUvU/7KyoWjs5+own4yNmNa50h6GKSTKiWBv94wUMOjtRjE5Pt6Xrtg9/Hf3p2rEi0M1ZEejufN/6JLheEfg9X7u1/VD1P+ysqFo7OfqMJ2P7ocaV7jBUMUny4KnoHy9gtNFfRbEt0Z/JZtJVHIwV4db2Q9X/sLOiau3kDGc8T91+xCcPalzpDkMVk2ScwhLZ4gUMVoT2BQwecLq/WhHq6E98I8YR5yL6x0sgKvrz563bD1X/w86KqrWDbZMddcaTsf1Q40t1GKqYJCN21y9g0NHjFPZW9OdmiejPwQ0HOHTzp7z/vRT9owZV/8POiqq1g22TXYrdbaPnYc0+47kV/alhbfuhxpfqMFQxScYpLLG7fQFjS/TnwaxXBD7CYVLjJZC16H/v9kPV/7CzomrtIE12ljMealiK/nUN/Du1/VDjS3UYqpgk1bvXxPhYEVQUi268Fv35nhH9l06C791+qPofdlZUrR1sm+xSo78V/TPOeLZsP7gf6hq4X6IGNb5Uh6GKSfKed6+RieEmiShWR39W7qdEf2qgg9/afqj6H3ZWVK0dbJtsO9e3Gn3mGc9a9N+y/VDjS3UYqpgkeVjVu9dErS3RP05haR71+9+sCDzgS9E/ToJj+1FH/6Xth6r/YWdF1drBW9Gf67/XGU9E/7aGiP5r2w++vxpfqsNQxSRJB936Aga/j25Mx6Zz08GJ7HyPeP97a/RX2496RWhrUPU/7KyoWjt4K/pHo9/jjGephq3bDzW+VIehikmSC8mkcmG5wFujPxPHisBEMqFMLBO8dUVg0u7dfqj6H3ZWVK2dXGv0e57xtPfbUg119KcGGowaV7rDUMUk2kb/iGJtN+brPJhEtoj+RLk6+hPFtkb/pe2HWhFU3SnOiqq1k2uNvo7+zFPPM562hjr639p+qHGlOwxVTKK3oj+Tw9fiFLaO/nT0iP50+nuif2w/+D63alB1pzgrqtZOtnM96oxnqYYt2w81rnSHoYpJlgu9dApbrwhMHHu3NvrXL4EsrQhMVh39Y/sxJPqHs6Jq7WjMdcTuEWc8bQ1L24/2kwc1ni4ORRWU6Nbor17AiFPYe6M/ca7dfqgVQdWb4uyomjvJ9W4bPfOy5xlPXcPW6E8NajzpDkcVlWzbjSOKtdG/fQGD6M/qvrQi0KVjRaB73/PJg6ozzdlRNXd05BlPfb9F9N+y/VDj6OJwVFEdjMlgYngYVfSPd6/b6F8//PWKENE/XgIh+tNE6k8e1PZD1Zfq7KiaOzryjCfut3r7wf+5tf1Q4+jiFKjCko3JoDvHKeyW6E/3r1cEfl+vCPxbVgT+L3EuXgKJ6K+2H6q+NI+AqruzI8544n5rtx/1Jw9q+6Hq7+YUqMI6WEd/Jm3pBYw6+nMTtCsCN0u8BBLRn/RA9OcmGxb98Sio2ju79xkP99u92w9VdzenQhXYyTiF5WFtX8BYiv78yg1CU6A50CTuif6qjnSPhKp/B/c642He+do92w9Vb1enQhXY0aV3r+soVq8I/J6v0anp2Pzbpfe/2+ivfn4Xj4Yaww72PuNR0f/W9kPV2dUpUYV2to7+TDaTruJgG/2ZQCaS9MDEMsFMdJwE0/3Vz+vmEVHj2NFeZzy3on+9/VB17eKUqEJ3sn4BQ8VBFf2JcqwI9UsgrAjq+3f3qKix7CgPfDvXdaO/94yHhz/OmdRHzET/2H6oenZxalTBO0r3jxsiVgQSwZbor77fLh4ZNZ4BMufM9VPPeJBGQEO49RGz+vm7OjWqYLvu0VFjGuRTzniiAfBnvs7f8+/inIn/z/dRP293D4Eq3GrPghrbBK6d8axFf5KC+n5DPRRqAPZlz4Qan831cKhB2OeeETVOm+MhUQOxzz0raqz2MQ+NGtDVPTtqzPZpngI1sKt6FdTY7X2eCjXAq3k11DWw2zwtarBn98qo62HXPT1q0GfVuAnc42VQgz+b5jXU9bEveznURTiL5vWo62Sfe2nUBTmq5jbqul1VU6Eu0FE096Gu4dU0C6iLNavmMdQ1PbtmI+rizaLJRV3js2meiLqYozR9Udf86JpE1AXurdkfNQ9H0+yAuvCPauZBzc/sGmM6oB62WTTG7Ix6EPfSGDMZ6kHN0hhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wZzbNnz9I0k6Mm7VHNsVBz2EszGDUpvTXzoeZpb81OqIs/SjMWNSejNR1QF3o2zX6o6z+bJgF1YWfX9ENd79k1T0BdyKNp8lDX92iaDagLd3TNY6hrelTNAupinU1zH+oankVToS7QWTXbUNfubF4edVGuollGXa+zelnUxbia5vWo63R2L4e6CFfVvIa6PlfxMqjBX13j+wJPjxq0fe6VUdfjqp4WNVj7sldEXYerezrUIK32Sqjx2+eeBjU4u+4VUOO2L3t41KDsNs+MGq/VHhY1GHufZ0WN1WoPixqMvc8zosZp1z0cahD2aZ4NNUa77qFQAxjoV4vfLf6k+OviH4p/Lf6r+J/i/17I7/na34p/LPJv1fcb4llQYxsgc/3P4l+Kvy/+qvjj4reLXyl+tvix4vuL7yq+tai+z64eBlX8zn60+Jnil4tM6o+Kvyz+rsik/6PITfDfIg8/v/67+Pfin4q/Lf68+IPiN4pfLKqfs5tnQI1rR6PRM9d1o/9N8afF7xW/Vvx88RPFDxbfXXx78c3FNxbf8EL1/XdxelTRO/re4oeLnyzy0PLw8hDzMPNQ83DzkPOw1w8/zYCmQHOgSdAsaBo0D5oIzYSmwoqgfu4uHh01ph1s5zoa/Z+Lrxaj0X+zyD3zqSL3EPfSO4pvKdYP/5tefO2dRfXzujo9qugdfFuRbk3X/njxc0W6OdGf7k6cp9vT9ZeiP9sCtgf8W7YL/F+2D3wvvucHivwMfhYrgqqjq0dGjWcH64c/5rqO/muNngec6M8DHw8/jYC5JxW8p/ihovq5XZ0WVewOMklMFpO2FP2ZbCadya8f/npFiOj/s+L3i6SHLxRJE0w0E87E1yuCqqerR0WNpaNbz3hYHGj0LBbR6CP6R6NvV3++zrkACwLnBJwXsFCoOro4LarYzvIwEtMi+hPfiHHEuYj+xDzinor+/FlF/28VaSKfLn6k+L7i0oqg6urmUVFj6eRTz3ho9Leifyw23A/cF9wf3CfcLz8sqnrSnRJVaGcjikX05+CGAxy6OQc6dHcOeOroHzdErAgkgi3Rn44fK0L98PNnvq7q6+bRUGPoZMYZz1KjpyHU0Z+GQUKkgZAYSY40FlVXutOhiuxodGMezDr68xEOk8pHOny0sxb9aQgq+n+9qKK/ioP19kPV2cWjocbQwewznnquo9Hz9/y7OGda+ohZ1ZfqdKgiOxndeC36/6IY0Z/OvxT9+XtWBP49EY4o96ViG/35eWpFaGtQ9aZ7NNQYku11xoNt9K/Pmbhf4pyp/YhZ1ZnmVKgCO8nE0I0jitXRn5X7KdGfpEAH/06Rjh4vgdTRv3346xWh3X6outM9Cqr2DvY842kbPQ1jy0fMqs5Up0EV18G6G0f0j1NYoj8PcB39ecCXon+cBNMo2ujPw7wl+q9tP1T9qR4FVXuye5zxRKOP6N9+xMz3V9sPVW+a06CK62DdjetTWCI70Z8If0/0599F9Of/t9FfnQSrFUF98qDqT/UoqNoT3fOM59ZHzBH96xq431TdKU6BKqyD0Y0j+jNxrNRMJBMap7Bboz+TFu9/kxyW3v9W0Z8atnzyoMaR6uyompPd+4ynjf4sIrc+eVB1pzkcVVQHmRyiGA8mka1+AaOO/nEKuyX687Dy0NJA6ve/t0b/W9sPNY5UZ0fVnOyW6J99xnPvOZOqO83hqKI6SDeOU9g6+scLGHR4Ov090Z8uHtGf7k6Xp9vfiv5RA/9nbfuhxpHq7KiaE93a6Huc8USj37r9UPWnOBxVVLJt9I8XMOroX5/CLnVjJquO/kzmvdG/3n7UnzwsbT/UeNKcHVVzolsbfY8znmj0KvrXNcT2Q9Wf4nBUUcnW0f/WCxhbVoSI/sS5OvoT95ZWhKduP9R40pwdVXOiS42eOdjjjGfL9iM+eVD1pzgcVVSybfRfewFDdWO6dKwI8f433Zyufiv6c4PwtaduP9R40pwdVXOS9zT6Xmc8azWoTx7UOB52OKqoZNvo3757rU5hMbpxRP+nvP/96PZDjSfN2VE1J6kafRv9e5/xrNWgPnlQ43jY4aiikt0S/Xnw6m7M7+sVgX/LisD/Jc7FSyAR/Yn490b/LdsPNZ40Z0fVnGQ8eDHXdaPf84ynrWFt+6HG8bDDUUUlu/QCRh39mYC2G7MiRxSL6E96IPqzkt+K/twoS9sPOvuW7YcaT5qzo2pOMh48rnPd6Pc+41mqgYbRbj/UOB52OKqoZHlY2xcwlqI/vzI5PJA8mDygT4n+NAQV/e/dfqjxpDk7quYkY66j0Y8644kaIvrH9oP/V28/+L5qHA87HFVUsurd6zqK1d2Y3/M1OnV9Csv/paNH9KfTL0V//szX+fst2492RYgaqE+NJ83ZUTUnGde5jv4jzniihrXoH9sPNY6HHY4qKtk2+nOhmXQVxWJFiOjPBDKRrNxMLBPMRDPhTPyt6F9vP5Y+eaCGdkWIGtR40pwdVXOSdZMdecZT13Br+6HG8bDDUUUlS5SK6B+nsG3sjgdPRX8eXB7g+iWQtehPVIyXQO7ZfiA3SNRAo1LjSXN2VM1Jto1+1BkPNWzdfqhxPOxwVFHJ0lHprFtPYW9Ffzp+rAj1w19Hf7p2RP92+8H3X9t+8HdRgxpPmrOjak5SNfoRZzzR6Kmh/uShriE+eVDjeNjhqKI6GC9gcMGXoli9IkT0Zy+nor+Kg7EiMGl19Ffbj4j+dQ3tqqTGkersqJoTvdXo9zjjqaN/bD+I/u32Q9Wf4nBUUR185AWMNvrT/W9Ff+JbG/2pQa0I/MpN0a5Kahypzo6qOdG60Y8646mjf2w/1CcPqv4Uh6OK6uDW6E9SoINziENHj1PYOvq3D38b/eMlELr5I9sPNY5UZ0fVnGhE/5FnPFHDre2Hqj/FKVCFdXAp+tdRrI3+PMxboj/NoY7+7OOY1HgJ5N7th6o/1SOg6k529BlPbD/4HlFDHf35maruNKdAFdbBtehPFGtfwKhXBHUSrFaEiP73fvLQbj9U/akeAVV3siPPeLg32u1HG/2pQdWd5hSowjoZE8LkROxm0tZewIhTWBX9uVkOF/3xKKjaEx15xtNuP2gqavuh6k5xKlSBnWRC2ujPw9q+e81DvTX6x0sgNI/6/W+aizoJrmvYNfrjkVD1JzvqjEdtP+ro3/Xhx6lQBXa0jf508frdaxXF6psiVgQ6NqsH/4f/y/cgwvM9I/rzs7ZEf1VnF4+Eqr+De5/xrH3yEDWoOlOdClVgZ+voz2TeG/2ZMCYuVgTSAysCE7x1RYgaVH3dPBpqDMneavTZZzxLHzHvEv1xSlShnY3oT5yroz9RbGlFIKLRHIhsEf2JcnX0J+rdiv6x/VB1dfOIqHF0cKnRZ0f/LR8xq/pSnRJV6A7SzZdewGgffr5Gp47oTwenk9PRI/rT6bdEf1YOVU9Xj4gaRyfrue5xxrPl7VJVV7rToordwaUXMOKGqFeEiP5MIBPJhDKxTDATHSfBt6K/qqOrR0aNp5PMdY8znqXoH4sN95uqJ92pUQXvaH0K267+a9GfaBcvgdxaEdTP3cUjo8bT0ewzHhID90l9ztRGf1VHF6dHFb2z7cNPImijf7z/TWdv3/9WK4L6Obt5dNSYdjDjjIeGQeOoP2Kuo7/6uV2dHlX0QIlnKvrzMY6K/vXDr77fEM+AGtcOPnLGE9G//oiZBSTOmdTP6+phUMXbp3kW1Nh29N4znqXozzmT+v67eCjUAOx9ng01xgFuif7tR8zq++zq4VCDsPd5RtQ47bqHRQ3GbvOsqLHadQ+NGpBd9+yoMVvtKVADs9oroMZttadBDc6+7JVQ47cvezrUIO1zr4i6Dva5p0UN9upeGXU9ru7pUYO+qsb3Q+1lUIO/muY11PW5mpdDXYSraF6Puk5X8dKoC3JWzTrqmp1dU1AX5myabahrd1ZNg7pIR9fcj7qOZ9OsoC7Y0TSPoa7pWTQbURdvdk0u6hofVfNE1MWcTdMPdb2PpklCXdxRmn1RczC7piPqgvfWjEfNy2yaAaiJeFQzL2q+RmuM2Rn1IO6tMWYC1MPZS2PM5KgH96kaY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxhhjjDHGGGOMMcYYY4wxxtzPK6/8HzCfZarCz0E/AAAAAElFTkSuQmCC";
|
|
19
|
+
const DEFAULT_PARAMS = {
|
|
20
|
+
lifetimeMode: "infinite",
|
|
21
|
+
lifetime: 2.2,
|
|
22
|
+
scale: 1.35,
|
|
23
|
+
initialHeight: 0.55,
|
|
24
|
+
color: { r: 0.34, g: 0.34, b: 0.32 },
|
|
25
|
+
opacity: 0.78,
|
|
26
|
+
particleCount: 82,
|
|
27
|
+
particleMaxLifetime: 1.61,
|
|
28
|
+
emitRange: 0.3,
|
|
29
|
+
riseHeight: 0.72,
|
|
30
|
+
smokeSize: 0.82,
|
|
31
|
+
driftSpeed: 1.4,
|
|
32
|
+
directionX: -1,
|
|
33
|
+
directionZ: 0
|
|
34
|
+
};
|
|
35
|
+
const vehicleExhaustSmokeEffectPackage = {
|
|
36
|
+
id: "vehicle-exhaust-smoke",
|
|
37
|
+
nameZh: "小车尾气",
|
|
38
|
+
manifest,
|
|
39
|
+
defaultParams: DEFAULT_PARAMS,
|
|
40
|
+
debugAnchor: "player",
|
|
41
|
+
debugParams: [
|
|
42
|
+
{
|
|
43
|
+
key: "lifetimeMode",
|
|
44
|
+
label: "生命周期模式",
|
|
45
|
+
kind: "enum",
|
|
46
|
+
options: [
|
|
47
|
+
{ value: "infinite", label: "无限" },
|
|
48
|
+
{ value: "duration", label: "自定义时间" }
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{ key: "lifetime", label: "自定义时长", kind: "lifetime", min: 0.1, max: 30, step: 0.01 },
|
|
52
|
+
{ key: "scale", label: "整体缩放", kind: "scale", min: 0.05, max: 8, step: 0.01 },
|
|
53
|
+
{ key: "initialHeight", label: "初始高度", kind: "number", min: -1, max: 3, step: 0.01 },
|
|
54
|
+
{ key: "color", label: "尾气颜色", kind: "color" },
|
|
55
|
+
{ key: "opacity", label: "透明度", kind: "opacity", min: 0, max: 1, step: 0.01 },
|
|
56
|
+
{ key: "particleCount", label: "粒子数量", kind: "number", min: 1, max: 180, step: 1 },
|
|
57
|
+
{ key: "particleMaxLifetime", label: "单粒最大生命周期", kind: "lifetime", min: 0.08, max: 5, step: 0.01 },
|
|
58
|
+
{ key: "emitRange", label: "排气口宽度", kind: "number", min: 0, max: 2, step: 0.01 },
|
|
59
|
+
{ key: "riseHeight", label: "上浮高度", kind: "number", min: -1, max: 4, step: 0.01 },
|
|
60
|
+
{ key: "smokeSize", label: "烟团大小", kind: "number", min: 0.02, max: 3, step: 0.01 },
|
|
61
|
+
{ key: "driftSpeed", label: "飘散速度", kind: "number", min: 0.05, max: 8, step: 0.01 },
|
|
62
|
+
{ key: "directionX", label: "方向 X", kind: "number", min: -1, max: 1, step: 0.01 },
|
|
63
|
+
{ key: "directionZ", label: "方向 Z", kind: "number", min: -1, max: 1, step: 0.01 }
|
|
64
|
+
],
|
|
65
|
+
create({ scene, root, position, renderingGroupId, params }) {
|
|
66
|
+
const effectScale = Math.max(0.05, params.scale);
|
|
67
|
+
root.position.copyFrom(position).addInPlace(new Vector3(0, params.initialHeight * effectScale, 0));
|
|
68
|
+
const smokeTrail = createExhaustSpriteTrail(scene, root, params, renderingGroupId);
|
|
69
|
+
let disposed = false;
|
|
70
|
+
const durationSeconds = readDurationSeconds(params);
|
|
71
|
+
const disposeTimer = durationSeconds == null ? 0 : window.setTimeout(() => disposeAll(), getDisposeDelaySeconds(params) * 1e3);
|
|
72
|
+
return {
|
|
73
|
+
root,
|
|
74
|
+
dispose() {
|
|
75
|
+
disposeAll();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
function disposeAll() {
|
|
79
|
+
if (disposed) return;
|
|
80
|
+
disposed = true;
|
|
81
|
+
if (disposeTimer) window.clearTimeout(disposeTimer);
|
|
82
|
+
smokeTrail.dispose();
|
|
83
|
+
root.dispose();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
function createExhaustSpriteTrail(scene, root, params, renderingGroupId) {
|
|
88
|
+
const count = Math.max(1, Math.round(params.particleCount));
|
|
89
|
+
const manager = new SpriteManager("vehicle-exhaust-smoke.puffs", SMOKE_TEXTURE_URL, count, { width: 128, height: 128 }, scene);
|
|
90
|
+
configureVfxSpriteManager(manager);
|
|
91
|
+
manager.renderingGroupId = renderingGroupId ?? VFX_RENDERING_GROUP_ID;
|
|
92
|
+
manager.texture.hasAlpha = true;
|
|
93
|
+
manager.fogEnabled = false;
|
|
94
|
+
const effectScale = Math.max(0.05, params.scale);
|
|
95
|
+
const emitRange = Math.max(0, params.emitRange) * effectScale;
|
|
96
|
+
const smokeSize = Math.max(0.01, params.smokeSize) * effectScale;
|
|
97
|
+
const driftSpeed = Math.max(0.01, params.driftSpeed) * effectScale;
|
|
98
|
+
const particleMaxLifetime = Math.max(0.08, params.particleMaxLifetime);
|
|
99
|
+
const durationSeconds = readDurationSeconds(params);
|
|
100
|
+
const puffLifetime = particleMaxLifetime / 1.18;
|
|
101
|
+
const emitInterval = Math.max(0.018, 2.2 / Math.max(1, count));
|
|
102
|
+
const states = [];
|
|
103
|
+
for (let index = 0; index < count; index += 1) {
|
|
104
|
+
const sprite = new Sprite(`vehicle-exhaust-smoke.puff.${index}`, manager);
|
|
105
|
+
sprite.isVisible = false;
|
|
106
|
+
sprite.color = toColor4(params.color, 0);
|
|
107
|
+
states.push({
|
|
108
|
+
sprite,
|
|
109
|
+
velocity: Vector3.Zero(),
|
|
110
|
+
spin: 0,
|
|
111
|
+
width: 0,
|
|
112
|
+
height: 0,
|
|
113
|
+
lifetime: puffLifetime,
|
|
114
|
+
alphaScale: 1,
|
|
115
|
+
age: 0,
|
|
116
|
+
active: false
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
let age = 0;
|
|
120
|
+
let emissionIndex = 0;
|
|
121
|
+
let emitAccumulator = 0;
|
|
122
|
+
let disposed = false;
|
|
123
|
+
const warmStartCount = Math.min(count, Math.max(3, Math.ceil(count * 0.08)));
|
|
124
|
+
for (let index = 0; index < warmStartCount; index += 1) {
|
|
125
|
+
const state = states[index];
|
|
126
|
+
spawnPuff(state, emissionIndex);
|
|
127
|
+
state.age = index / warmStartCount * state.lifetime * 0.52;
|
|
128
|
+
emissionIndex += 1;
|
|
129
|
+
}
|
|
130
|
+
const observer = scene.onBeforeRenderObservable.add(() => {
|
|
131
|
+
if (disposed) return;
|
|
132
|
+
const deltaSeconds = Math.min(0.05, scene.getEngine().getDeltaTime() / 1e3);
|
|
133
|
+
age += deltaSeconds;
|
|
134
|
+
if (durationSeconds == null || age <= durationSeconds) {
|
|
135
|
+
emitAccumulator += deltaSeconds;
|
|
136
|
+
while (emitAccumulator >= emitInterval) {
|
|
137
|
+
emitAccumulator -= emitInterval;
|
|
138
|
+
const state = findAvailableState(states);
|
|
139
|
+
if (!state) break;
|
|
140
|
+
spawnPuff(state, emissionIndex);
|
|
141
|
+
emissionIndex += 1;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const state of states) {
|
|
145
|
+
if (!state.active) continue;
|
|
146
|
+
state.age += deltaSeconds;
|
|
147
|
+
const t = Math.min(1, state.age / state.lifetime);
|
|
148
|
+
const fadeIn = Math.min(1, t / 0.12);
|
|
149
|
+
const fadeOut = Math.max(0, 1 - Math.max(0, t - 0.34) / 0.66);
|
|
150
|
+
const alpha = clamp01(params.opacity) * state.alphaScale * fadeIn * fadeOut;
|
|
151
|
+
state.sprite.position.addInPlace(state.velocity.scale(deltaSeconds));
|
|
152
|
+
state.sprite.angle += state.spin * deltaSeconds;
|
|
153
|
+
const grow = 1 + t * 1.45;
|
|
154
|
+
state.sprite.width = state.width * grow;
|
|
155
|
+
state.sprite.height = state.height * grow;
|
|
156
|
+
state.sprite.color = toColor4(params.color, alpha);
|
|
157
|
+
state.sprite.isVisible = alpha > 0.01 && t < 1;
|
|
158
|
+
if (t >= 1) {
|
|
159
|
+
state.active = false;
|
|
160
|
+
state.sprite.isVisible = false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (durationSeconds != null && age >= durationSeconds + particleMaxLifetime + 0.35) dispose();
|
|
164
|
+
});
|
|
165
|
+
function dispose() {
|
|
166
|
+
if (disposed) return;
|
|
167
|
+
disposed = true;
|
|
168
|
+
scene.onBeforeRenderObservable.remove(observer);
|
|
169
|
+
for (const state of states) state.sprite.dispose();
|
|
170
|
+
manager.dispose();
|
|
171
|
+
}
|
|
172
|
+
return { dispose };
|
|
173
|
+
function spawnPuff(state, seed) {
|
|
174
|
+
const spawnOrigin = root.getAbsolutePosition();
|
|
175
|
+
const direction = readWorldDirection(root, params);
|
|
176
|
+
const side = makeSideVector(direction);
|
|
177
|
+
const jitterSide = (sequence01(seed, 0) - 0.5) * emitRange;
|
|
178
|
+
const jitterForward = (sequence01(seed, 1) - 0.5) * emitRange * 0.45;
|
|
179
|
+
const startHeight = (sequence01(seed, 2) - 0.5) * emitRange * 0.3;
|
|
180
|
+
const baseSize = smokeSize * lerp(0.56, 1.12, sequence01(seed, 3));
|
|
181
|
+
state.sprite.position = spawnOrigin.add(direction.scale(jitterForward)).add(side.scale(jitterSide)).add(new Vector3(0, startHeight, 0));
|
|
182
|
+
state.sprite.width = baseSize;
|
|
183
|
+
state.sprite.height = baseSize * lerp(0.82, 1.18, sequence01(seed, 4));
|
|
184
|
+
state.sprite.angle = sequence01(seed, 5) * Math.PI * 2;
|
|
185
|
+
state.sprite.cellIndex = Math.floor(sequence01(seed, 6) * 4) % 4;
|
|
186
|
+
state.sprite.color = toColor4(params.color, 0);
|
|
187
|
+
state.sprite.isVisible = true;
|
|
188
|
+
state.velocity = direction.scale(driftSpeed * lerp(0.68, 1.18, sequence01(seed, 7))).add(side.scale((sequence01(seed, 8) - 0.5) * driftSpeed * 0.2)).add(new Vector3(0, params.riseHeight * effectScale * lerp(0.16, 0.36, sequence01(seed, 9)), 0));
|
|
189
|
+
state.spin = lerp(-0.9, 0.9, sequence01(seed, 10));
|
|
190
|
+
state.width = state.sprite.width;
|
|
191
|
+
state.height = state.sprite.height;
|
|
192
|
+
state.lifetime = Math.min(particleMaxLifetime, puffLifetime * lerp(0.82, 1.18, sequence01(seed, 11)));
|
|
193
|
+
state.alphaScale = lerp(0.72, 1, sequence01(seed, 12));
|
|
194
|
+
state.age = 0;
|
|
195
|
+
state.active = true;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function findAvailableState(states) {
|
|
199
|
+
return states.find((state) => !state.active) ?? null;
|
|
200
|
+
}
|
|
201
|
+
function readDirection(params) {
|
|
202
|
+
const direction = new Vector3(params.directionX, 0, params.directionZ);
|
|
203
|
+
if (direction.lengthSquared() <= 1e-4) return new Vector3(-1, 0, 0);
|
|
204
|
+
return direction.normalize();
|
|
205
|
+
}
|
|
206
|
+
function readWorldDirection(root, params) {
|
|
207
|
+
const direction = Vector3.TransformNormal(readDirection(params), root.getWorldMatrix());
|
|
208
|
+
direction.y = 0;
|
|
209
|
+
if (direction.lengthSquared() <= 1e-4) return readDirection(params);
|
|
210
|
+
return direction.normalize();
|
|
211
|
+
}
|
|
212
|
+
function readDurationSeconds(params) {
|
|
213
|
+
return params.lifetimeMode === "infinite" ? null : Math.max(0.05, params.lifetime);
|
|
214
|
+
}
|
|
215
|
+
function makeSideVector(direction) {
|
|
216
|
+
const side = new Vector3(-direction.z, 0, direction.x);
|
|
217
|
+
return side.lengthSquared() > 1e-4 ? side.normalize() : new Vector3(0, 0, 1);
|
|
218
|
+
}
|
|
219
|
+
function getDisposeDelaySeconds(params) {
|
|
220
|
+
const lifetime = Math.max(0.05, params.lifetime);
|
|
221
|
+
return lifetime + Math.max(0.08, params.particleMaxLifetime) + 0.45;
|
|
222
|
+
}
|
|
223
|
+
function toColor4(color, alpha) {
|
|
224
|
+
return new Color4(clamp01(color.r), clamp01(color.g), clamp01(color.b), clamp01(alpha));
|
|
225
|
+
}
|
|
226
|
+
function lerp(min, max, t) {
|
|
227
|
+
return min + (max - min) * t;
|
|
228
|
+
}
|
|
229
|
+
function clamp01(value) {
|
|
230
|
+
return Math.min(1, Math.max(0, value));
|
|
231
|
+
}
|
|
232
|
+
function fract(value) {
|
|
233
|
+
return value - Math.floor(value);
|
|
234
|
+
}
|
|
235
|
+
function sequence01(index, axis) {
|
|
236
|
+
if (index === 0) return 0.5;
|
|
237
|
+
const strides = [0.618033988749895, 0.414213562373095, 0.732050807568877, 0.324717957244746, 0.754877666246693, 0.569840290998053];
|
|
238
|
+
return fract(0.5 + index * strides[axis % strides.length] + axis * 0.173205080756888);
|
|
239
|
+
}
|
|
240
|
+
export {
|
|
241
|
+
vehicleExhaustSmokeEffectPackage
|
|
242
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { VfxColorValue, VfxEffectPackage, VfxParamValues } from '../../types';
|
|
2
|
+
interface VehicleUpgradeParams extends VfxParamValues {
|
|
3
|
+
lifetime: number;
|
|
4
|
+
scale: number;
|
|
5
|
+
initialHeight: number;
|
|
6
|
+
color: VfxColorValue;
|
|
7
|
+
opacity: number;
|
|
8
|
+
scaleX: number;
|
|
9
|
+
scaleY: number;
|
|
10
|
+
scaleZ: number;
|
|
11
|
+
centerCount: number;
|
|
12
|
+
outlineCount: number;
|
|
13
|
+
strandWidth: number;
|
|
14
|
+
riseSpeed: number;
|
|
15
|
+
centerSpread: number;
|
|
16
|
+
outlineThickness: number;
|
|
17
|
+
glowOpacity: number;
|
|
18
|
+
}
|
|
19
|
+
export declare const vehicleUpgradeEffectPackage: VfxEffectPackage<VehicleUpgradeParams>;
|
|
20
|
+
export {};
|