vue-cesium-jyt
Version:
Vue 3.x components for CesiumJS.
1 lines • 15.7 kB
Source Map (JSON)
{"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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"}