pass float array views
This commit is contained in:
parent
4b5b13452b
commit
e16f136a59
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue