import { Meta, StoryObj } from "@storybook/react"; import { Cartesian3, Cartesian2, SphereEmitter, Matrix4, Color, createWorldTerrainAsync, Math as CesiumMath, } from "cesium"; import { useMemo, useRef, useCallback, FC } from "react"; import CameraFlyTo from "../CameraFlyTo"; import { useCesium } from "../core"; import Viewer from "../Viewer"; import ParticleSystem from "./ParticleSystem"; type Story = StoryObj; export default { title: "ParticleSystem", component: ParticleSystem, } as Meta; const pos = new Cartesian3(277096.634865404, 5647834.481964232, 2985563.7039122293); const snowAlpha = 1.0; const snowRadius = 100000.0; const SnowParticle: FC = () => { const scene = useCesium().scene; const snowGravityScratch = useRef(new Cartesian3()); const snowParticleSize = scene ? scene.drawingBufferWidth / 100.0 : 0; const minimumSnowImageSize = useMemo( () => new Cartesian2(snowParticleSize, snowParticleSize), [snowParticleSize], ); const maximumSnowImageSize = useMemo( () => new Cartesian2(snowParticleSize * 2.0, snowParticleSize * 2.0), [snowParticleSize], ); const emitter = useMemo(() => new SphereEmitter(snowRadius), []); const onUpdate = useCallback( (particle: any) => { if (!scene) return; snowGravityScratch.current = Cartesian3.normalize( particle.position, snowGravityScratch.current, ); Cartesian3.multiplyByScalar( snowGravityScratch.current, CesiumMath.randomBetween(-30.0, -300.0), snowGravityScratch.current, ); particle.velocity = Cartesian3.add( particle.velocity, snowGravityScratch.current, particle.velocity, ); const distance = Cartesian3.distance(scene.camera.position, particle.position); if (distance > snowRadius) { particle.endColor.alpha = 0.0; } else { particle.endColor.alpha = snowAlpha / (distance / snowRadius + 0.1); } }, [scene], ); return ( ); }; export const Snow: Story = { render: () => ( ), };