This folder contains samples of the intermediate outputs in creating particle dispersion animations. PARTICLE.DAT is the raw output from running HYSPLIT for a one hour emission that is modelled over a 19 hour duration. The particles are emitted from 30.251140,-93.278930 over a height of 0-25m. plume_sulphur_202411270600_202411280600.bin.gz is the current format of the resulting binary file which we use to visualize the particles. While it is too large for a public website, we are exploring several options for a more succinct format. The file combines the 1 hour emission files for 5 sources over 24 total hours of emission. The binary is made up of 32 bit float least significant byte first in the following format: x0, y0, z0, epoch0, x1, y1, z1, epoch1, packedColor x and y are in web mercator space 0,0 is NW 255,255 is SE The shaders to visualize the binary file are below. The shaders fade particles once they travel above breathing height: WebGLVectorTile2Shaders.particleAltFadeVertexShader = ` attribute vec4 a_coord_0; attribute float a_elev_0; attribute float a_epoch_0; attribute vec4 a_coord_1; attribute float a_elev_1; attribute float a_epoch_1; attribute float a_color; uniform mat4 u_map_matrix; uniform float u_epoch; uniform float u_size; uniform float u_max_elev; varying vec4 v_color; vec4 unpackColor(float f) { vec4 color; color.b = floor(f / 256.0 / 256.0); color.g = floor((f - color.b * 256.0 * 256.0) / 256.0); color.r = floor(f - color.b * 256.0 * 256.0 - color.g * 256.0); color.a = 255.; return color / 256.0; } void main() { vec4 position; v_color = unpackColor(a_color); if (a_epoch_0 >= u_epoch || a_epoch_1 < u_epoch) { position = vec4(-1.,-1.,-1.,-1.); } else { float t = (u_epoch - a_epoch_0)/(a_epoch_1 - a_epoch_0); float min_elev = u_max_elev * 0.4; float current_elev = (a_elev_1 - a_elev_0) * t + a_elev_0; position = u_map_matrix * ((a_coord_1 - a_coord_0) * t + a_coord_0); v_color.a = min(max((u_max_elev-current_elev)/(u_max_elev-min_elev), 0.), 1.); } gl_Position = position; gl_PointSize = u_size; } `; WebGLVectorTile2Shaders.particleAltFadeFragmentShader = ` /*precision mediump float;*/ varying vec4 v_color; void main() { gl_FragColor = v_color; } `;