{"version":3,"file":"particlesComputing.mjs","sources":["../../../../../../packages/components/overlays/wind/particlesComputing.ts"],"sourcesContent":["import * as Util from './util'\nimport calculateSpeedFrag from './glsl/calculateSpeed.frag'\nimport updatePositionFrag from './glsl/updatePosition.frag'\nimport postProcessingPositionFrag from './glsl/postProcessingPosition.frag'\nimport CustomPrimitive from './customPrimitive'\n\nclass ParticlesComputing {\n  windTextures: any\n  particlesTextures: any\n  primitives: any\n  data: any\n\n  constructor(context, data, particleSystemOptions, viewerParameters) {\n    this.data = data\n    this.createWindTextures(context, data)\n    this.createParticlesTextures(context, particleSystemOptions, viewerParameters)\n    this.createComputingPrimitives(data, particleSystemOptions, viewerParameters)\n  }\n\n  createWindTextures(context, data) {\n    const windTextureOptions = {\n      context: context,\n      width: data.dimensions.lon,\n      height: data.dimensions.lat * data.dimensions.lev,\n      pixelFormat: Cesium.PixelFormat.LUMINANCE,\n      pixelDatatype: Cesium.PixelDatatype.FLOAT,\n      flipY: false,\n      sampler: new Cesium.Sampler({\n        // the values of texture will not be interpolated\n        minificationFilter: Cesium.TextureMinificationFilter.NEAREST,\n        magnificationFilter: Cesium.TextureMagnificationFilter.NEAREST\n      })\n    }\n\n    this.windTextures = {\n      U: Util.createTexture(windTextureOptions, data.U.array),\n      V: Util.createTexture(windTextureOptions, data.V.array)\n    }\n  }\n\n  createParticlesTextures(context, particleSystemOptions, viewerParameters) {\n    const particlesTextureOptions = {\n      context: context,\n      width: particleSystemOptions.particlesTextureSize,\n      height: particleSystemOptions.particlesTextureSize,\n      pixelFormat: Cesium.PixelFormat.RGBA,\n      pixelDatatype: Cesium.PixelDatatype.FLOAT,\n      flipY: false,\n      sampler: new Cesium.Sampler({\n        // the values of texture will not be interpolated\n        minificationFilter: Cesium.TextureMinificationFilter.NEAREST,\n        magnificationFilter: Cesium.TextureMagnificationFilter.NEAREST\n      })\n    }\n\n    const particlesArray = this.randomizeParticles(particleSystemOptions.maxParticles, viewerParameters)\n    const zeroArray = new Float32Array(4 * particleSystemOptions.maxParticles).fill(0)\n\n    this.particlesTextures = {\n      previousParticlesPosition: Util.createTexture(particlesTextureOptions, particlesArray),\n      currentParticlesPosition: Util.createTexture(particlesTextureOptions, particlesArray),\n      nextParticlesPosition: Util.createTexture(particlesTextureOptions, particlesArray),\n      postProcessingPosition: Util.createTexture(particlesTextureOptions, particlesArray),\n\n      particlesSpeed: Util.createTexture(particlesTextureOptions, zeroArray)\n    }\n  }\n\n  randomizeParticles(maxParticles, viewerParameters) {\n    const array = new Float32Array(4 * maxParticles)\n    for (let i = 0; i < maxParticles; i++) {\n      array[4 * i] = Cesium.Math.randomBetween(viewerParameters.lonRange.x, viewerParameters.lonRange.y)\n      array[4 * i + 1] = Cesium.Math.randomBetween(viewerParameters.latRange.x, viewerParameters.latRange.y)\n      array[4 * i + 2] = Cesium.Math.randomBetween(this.data.lev.min, this.data.lev.max)\n      array[4 * i + 3] = 0.0\n    }\n    return array\n  }\n\n  destroyParticlesTextures() {\n    Object.keys(this.particlesTextures).forEach(key => {\n      this.particlesTextures[key].destroy()\n    })\n  }\n\n  createComputingPrimitives(data, particleSystemOptions, viewerParameters) {\n    const dimension = new Cesium.Cartesian3(data.dimensions.lon, data.dimensions.lat, data.dimensions.lev)\n    const minimum = new Cesium.Cartesian3(data.lon.min, data.lat.min, data.lev.min)\n    const maximum = new Cesium.Cartesian3(data.lon.max, data.lat.max, data.lev.max)\n    const interval = new Cesium.Cartesian3(\n      (maximum.x - minimum.x) / (dimension.x - 1),\n      (maximum.y - minimum.y) / (dimension.y - 1),\n      dimension.z > 1 ? (maximum.z - minimum.z) / (dimension.z - 1) : 1.0\n    )\n    const uSpeedRange = new Cesium.Cartesian2(data.U.min, data.U.max)\n    const vSpeedRange = new Cesium.Cartesian2(data.V.min, data.V.max)\n\n    const that = this\n\n    this.primitives = {\n      calculateSpeed: new CustomPrimitive({\n        commandType: 'Compute',\n        uniformMap: {\n          U: function () {\n            return that.windTextures.U\n          },\n          V: function () {\n            return that.windTextures.V\n          },\n          currentParticlesPosition: function () {\n            return that.particlesTextures.currentParticlesPosition\n          },\n          dimension: function () {\n            return dimension\n          },\n          minimum: function () {\n            return minimum\n          },\n          maximum: function () {\n            return maximum\n          },\n          interval: function () {\n            return interval\n          },\n          uSpeedRange: function () {\n            return uSpeedRange\n          },\n          vSpeedRange: function () {\n            return vSpeedRange\n          },\n          pixelSize: function () {\n            return viewerParameters.pixelSize\n          },\n          speedFactor: function () {\n            return particleSystemOptions.speedFactor\n          }\n        },\n        fragmentShaderSource: new Cesium.ShaderSource({\n          sources: [calculateSpeedFrag]\n        }),\n        outputTexture: this.particlesTextures.particlesSpeed,\n        preExecute: function () {\n          // swap textures before binding\n          const temp = that.particlesTextures.previousParticlesPosition\n          that.particlesTextures.previousParticlesPosition = that.particlesTextures.currentParticlesPosition\n          that.particlesTextures.currentParticlesPosition = that.particlesTextures.postProcessingPosition\n          that.particlesTextures.postProcessingPosition = temp\n\n          // keep the outputTexture up to date\n          that.primitives.calculateSpeed.commandToExecute.outputTexture = that.particlesTextures.particlesSpeed\n        }\n      }),\n\n      updatePosition: new CustomPrimitive({\n        commandType: 'Compute',\n        uniformMap: {\n          currentParticlesPosition: function () {\n            return that.particlesTextures.currentParticlesPosition\n          },\n          particlesSpeed: function () {\n            return that.particlesTextures.particlesSpeed\n          }\n        },\n        fragmentShaderSource: new Cesium.ShaderSource({\n          sources: [updatePositionFrag]\n        }),\n        outputTexture: this.particlesTextures.nextParticlesPosition,\n        preExecute: function () {\n          // keep the outputTexture up to date\n          that.primitives.updatePosition.commandToExecute.outputTexture = that.particlesTextures.nextParticlesPosition\n        }\n      }),\n\n      postProcessingPosition: new CustomPrimitive({\n        commandType: 'Compute',\n        uniformMap: {\n          nextParticlesPosition: function () {\n            return that.particlesTextures.nextParticlesPosition\n          },\n          particlesSpeed: function () {\n            return that.particlesTextures.particlesSpeed\n          },\n          lonRange: function () {\n            return viewerParameters.lonRange\n          },\n          latRange: function () {\n            return viewerParameters.latRange\n          },\n          randomCoefficient: function () {\n            const randomCoefficient = Math.random()\n            return randomCoefficient\n          },\n          dropRate: function () {\n            return particleSystemOptions.dropRate\n          },\n          dropRateBump: function () {\n            return particleSystemOptions.dropRateBump\n          }\n        },\n        fragmentShaderSource: new Cesium.ShaderSource({\n          sources: [postProcessingPositionFrag]\n        }),\n        outputTexture: this.particlesTextures.postProcessingPosition,\n        preExecute: function () {\n          // keep the outputTexture up to date\n          that.primitives.postProcessingPosition.commandToExecute.outputTexture = that.particlesTextures.postProcessingPosition\n        }\n      })\n    }\n  }\n}\nexport default ParticlesComputing\n"],"names":["Util.createTexture","updatePositionFrag","postProcessingPositionFrag"],"mappings":"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"}