pass float array views
This commit is contained in:
		
							
								
								
									
										43
									
								
								main.js
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								main.js
									
									
									
									
									
								
							@@ -6,6 +6,10 @@ async function run() {
 | 
				
			|||||||
    const canvas = document.getElementById("glCanvas");
 | 
					    const canvas = document.getElementById("glCanvas");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const gl = canvas.getContext("webgl");
 | 
					    const gl = canvas.getContext("webgl");
 | 
				
			||||||
 | 
					    const float_in_image = gl.getExtension("OES_texture_float");
 | 
				
			||||||
 | 
					    if (!float_in_image) {
 | 
				
			||||||
 | 
					        console.warn("Floats are not supported in images for your device, please warn the author about this incompatability");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (gl === null) {
 | 
					    if (gl === null) {
 | 
				
			||||||
        alert("Unable to initialise WebGL");
 | 
					        alert("Unable to initialise WebGL");
 | 
				
			||||||
@@ -28,7 +32,8 @@ async function run() {
 | 
				
			|||||||
        uniform sampler2D uSampler;
 | 
					        uniform sampler2D uSampler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void main() {
 | 
					        void main() {
 | 
				
			||||||
            gl_FragColor = vec4(texture2D(uSampler, vVertexPosition).a, 0.0, 0.0, 1.0);
 | 
					            mediump float c = texture2D(uSampler, vVertexPosition).a;
 | 
				
			||||||
 | 
					            gl_FragColor = vec4((c + 1.0)/2.0, 0.0, 0.0, 1.0);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    `;
 | 
					    `;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -82,16 +87,15 @@ async function run() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    const width = 40;
 | 
					    const width = 40;
 | 
				
			||||||
    const height = 50;
 | 
					    const height = 50;
 | 
				
			||||||
    let universe = Universe.new(width, height);
 | 
					    const universe = Universe.new(width, height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let t = performance.now();
 | 
					    const t = performance.now();
 | 
				
			||||||
    universe.set_initial(t/1000.0);
 | 
					    universe.set_initial(t/1000.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let drawable = universe.get_drawable();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const field = new Uint8Array(wasm.memory.buffer,
 | 
					    const field = new Float32Array(wasm.memory.buffer,
 | 
				
			||||||
            drawable.get_pointer(),
 | 
					            universe.get_ptr(),
 | 
				
			||||||
            drawable.width()*drawable.height());
 | 
					            width*height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const texture = gl.createTexture();
 | 
					    const texture = gl.createTexture();
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -100,7 +104,7 @@ async function run() {
 | 
				
			|||||||
        const internalFormat = gl.ALPHA;
 | 
					        const internalFormat = gl.ALPHA;
 | 
				
			||||||
        const border = 0;
 | 
					        const border = 0;
 | 
				
			||||||
        const srcFormat = gl.ALPHA;
 | 
					        const srcFormat = gl.ALPHA;
 | 
				
			||||||
        const srcType = gl.UNSIGNED_BYTE;
 | 
					        const srcType = gl.FLOAT;
 | 
				
			||||||
        gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, field);
 | 
					        gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, field);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -113,7 +117,7 @@ async function run() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
 | 
					    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
 | 
				
			||||||
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
 | 
					    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
 | 
				
			||||||
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
 | 
					    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
 | 
				
			||||||
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
 | 
					    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gl.useProgram(programInfo.program);
 | 
					    gl.useProgram(programInfo.program);
 | 
				
			||||||
@@ -133,26 +137,17 @@ async function run() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
 | 
					        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        { // Binding uniforms
 | 
					 | 
				
			||||||
            gl.activeTexture(gl.TEXTURE0);
 | 
					 | 
				
			||||||
            gl.bindTexture(gl.TEXTURE_2D, texture);
 | 
					 | 
				
			||||||
            gl.uniform1i(programInfo.uniformLocation.sampler, 0);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        universe.set_initial(t/1000.0);
 | 
					        universe.set_initial(t/1000.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let drawable = universe.get_drawable();
 | 
					        const field = new Float32Array(wasm.memory.buffer,
 | 
				
			||||||
 | 
					                universe.get_ptr(),
 | 
				
			||||||
        const field = new Uint8Array(wasm.memory.buffer,
 | 
					                width*height);
 | 
				
			||||||
                drawable.get_pointer(),
 | 
					 | 
				
			||||||
                drawable.width()*drawable.height());
 | 
					 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            gl.bindTexture(gl.TEXTURE_2D, texture);
 | 
					 | 
				
			||||||
            const level = 0;
 | 
					            const level = 0;
 | 
				
			||||||
            const internalFormat = gl.ALPHA;
 | 
					            const internalFormat = gl.ALPHA;
 | 
				
			||||||
            const border = 0;
 | 
					            const border = 0;
 | 
				
			||||||
            const srcFormat = gl.ALPHA;
 | 
					            const srcFormat = internalFormat;
 | 
				
			||||||
            const srcType = gl.UNSIGNED_BYTE;
 | 
					            const srcType = gl.FLOAT;
 | 
				
			||||||
            gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, field);
 | 
					            gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, width, height, border, srcFormat, srcType, field);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -160,8 +155,6 @@ async function run() {
 | 
				
			|||||||
        const vertexCount = 4;
 | 
					        const vertexCount = 4;
 | 
				
			||||||
        gl.drawArrays(gl.TRIANGLE_STRIP, offset, vertexCount);
 | 
					        gl.drawArrays(gl.TRIANGLE_STRIP, offset, vertexCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        drawable.free();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        window.requestAnimationFrame(drawMe);
 | 
					        window.requestAnimationFrame(drawMe);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								src/lib.rs
									
									
									
									
									
								
							@@ -16,13 +16,6 @@ pub struct Universe {
 | 
				
			|||||||
    field: Vec<f32>,
 | 
					    field: Vec<f32>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[wasm_bindgen]
 | 
					 | 
				
			||||||
pub struct Drawable {
 | 
					 | 
				
			||||||
    width: u32,
 | 
					 | 
				
			||||||
    height: u32,
 | 
					 | 
				
			||||||
    field: Vec<u8>,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const WAVESPEED: f32 = 1.0;
 | 
					const WAVESPEED: f32 = 1.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn func(x: f32, y: f32, t: f32) -> f32 {
 | 
					fn func(x: f32, y: f32, t: f32) -> f32 {
 | 
				
			||||||
@@ -52,37 +45,7 @@ impl Universe {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn get_drawable(&self) -> Drawable {
 | 
					    pub fn get_ptr(&mut self) -> *mut u8 {
 | 
				
			||||||
        // let fmin = self.field.iter().fold(0.0f32, |acc, x| acc.min(*x));
 | 
					        self.field.as_mut_ptr() as *mut u8
 | 
				
			||||||
        let fmin = -1.0;
 | 
					 | 
				
			||||||
        // let fmax = self.field.iter().fold(0.0f32, |acc, x| acc.max(*x));
 | 
					 | 
				
			||||||
        let fmax = 1.0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let field = self
 | 
					 | 
				
			||||||
            .field
 | 
					 | 
				
			||||||
            .iter()
 | 
					 | 
				
			||||||
            .map(|x| (u8::max_value() as f32 * (x - fmin) / (fmax - fmin)) as u8)
 | 
					 | 
				
			||||||
            .collect::<Vec<_>>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Drawable {
 | 
					 | 
				
			||||||
            width: self.width,
 | 
					 | 
				
			||||||
            height: self.height,
 | 
					 | 
				
			||||||
            field,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[wasm_bindgen]
 | 
					 | 
				
			||||||
impl Drawable {
 | 
					 | 
				
			||||||
    pub fn get_pointer(&mut self) -> *mut u8 {
 | 
					 | 
				
			||||||
        self.field.as_mut_ptr()
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pub fn width(&self) -> u32 {
 | 
					 | 
				
			||||||
        self.width
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pub fn height(&self) -> u32 {
 | 
					 | 
				
			||||||
        self.height
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user