diff --git a/tutorial/wasm-game-of-life/src/lib.rs b/tutorial/wasm-game-of-life/src/lib.rs index 72b206e..63bdda0 100644 --- a/tutorial/wasm-game-of-life/src/lib.rs +++ b/tutorial/wasm-game-of-life/src/lib.rs @@ -16,7 +16,6 @@ use geometry::{Camera, DirectLight, Polyeder, Primitives}; use transform::{TMatrix}; use std::fmt::{Display, Formatter, Result}; -use std::ptr; use std::sync::mpsc; use std::time::Instant; use wasm_bindgen::prelude::*; @@ -35,7 +34,8 @@ pub struct Color(u8, u8, u8, u8); pub struct View3d { width :u16 , height :u16 , size :usize - , start :Instant + , degree :i32 + //, start :Instant , tetrahedron :Polyeder , cube :Polyeder , camera :Option> @@ -47,31 +47,40 @@ pub struct View3d { width :u16 #[wasm_bindgen] impl View3d { pub fn new(width :u16, height :u16) -> Self { - let size = width as usize * height as usize; + let size = width as usize * height as usize; let light_vector = Vector(0.0, 0.0, 1.0); let mut view3d = Self { width: width , height: height , size: size - , start: Instant::now() + , degree: 0 + //, start: Instant::now() , tetrahedron: Polyeder::tetrahedron(100.0) , cube: Polyeder::cube(56.25) , camera: None , light: DirectLight::new(light_vector) , zbuf: vec!(0.0; size) - , image: vec!(Color(0, 0, 0, 0); size) }; + , image: vec!(Color(0, 0, 0, 0xFF); size) + }; view3d.camera = Some(Camera::::new(&view3d, 45)); view3d } - pub fn update(mut self) { - let deg = ((self.start.elapsed() / 25).as_millis() % 360) as i32; + pub fn width(&self) -> u16 { + self.width + } + + pub fn height(&self) -> u16 { + self.height + } + pub fn update(&mut self) { + //let deg = ((self.start.elapsed() / 25).as_millis() % 360) as i32; let t = TMatrix::translate(Vector(0.0, 0.0, 150.0)); - let rz = TMatrix::rotate_z(deg); - let rx = TMatrix::rotate_x(-deg*2); - let ry = TMatrix::rotate_y(-deg*2); + let rz = TMatrix::rotate_z(self.degree); + let rx = TMatrix::rotate_x(-self.degree*2); + let ry = TMatrix::rotate_y(-self.degree*2); let rot1 = TMatrix::combine(vec!(rz, rx, t)); let rot2 = TMatrix::combine(vec!(rz, ry, t)); @@ -79,6 +88,8 @@ impl View3d { let objects = vec!( (self.tetrahedron.transform(&rot1), 0xFFFF00) , ( self.cube.transform(&rot2), 0x0000FF) ); + self.degree = (self.degree + 1) % 360; + self.clear(); match self.camera { @@ -86,7 +97,7 @@ impl View3d { Some(camera) => { for (o, color) in objects { for (pg, c) in o.project(&camera, &self.light, color) { - (&pg).fill(&mut self, c); + (&pg).fill(self, c); } } }, @@ -108,11 +119,8 @@ impl Canvas for View3d { } fn clear(&mut self) { - self.zbuf = vec!(0.0; self.size); - unsafe { - let ptr = self.image.as_mut_ptr(); - ptr::write_bytes(ptr, 0, self.size); - } + self.zbuf = vec!(0.0; self.size); + self.image = vec!(Color(0, 0, 0, 0xFF); self.size); } fn set_pixel(&mut self, c :Coordinate, color :u32) { diff --git a/tutorial/wasm-game-of-life/www/index.js b/tutorial/wasm-game-of-life/www/index.js index ac7c97e..95b30c5 100644 --- a/tutorial/wasm-game-of-life/www/index.js +++ b/tutorial/wasm-game-of-life/www/index.js @@ -4,17 +4,30 @@ import { memory } from "wasm-game-of-life/wasm_game_of_life_bg"; // 3D canvas stuff const view3d = View3d.new(151, 151); -const view3d_canvas = document.getElementById("view3d"); -view3d_canvas.width = view3d.width(); -view3d_canvas.width = view3d.height(); - -const view3d_ctx = view3d_canvas.getContext('2d'); +const view3d_canvas = document.getElementById("view3d"); +view3d_canvas.width = view3d.width(); +view3d_canvas.height = view3d.height(); +const view3d_ctx = view3d_canvas.getContext('2d'); const view3d_renderLoop = () => { view3d.update(); + drawView3d(); + requestAnimationFrame(view3d_renderLoop); } +const drawView3d = () => { + const view3d_imagePtr = view3d.image(); + const view3d_image = new ImageData( + new Uint8ClampedArray( memory.buffer + , view3d.image() + , view3d.width() * view3d.height() * 4 ) + , view3d.width() + , view3d.height() ); + + view3d_ctx.putImageData(view3d_image, 0, 0); +} + // game of life stuff const CELL_SIZE = 5; // px const GRID_COLOR = "#CCCCCC"; @@ -90,7 +103,10 @@ const drawCells = () => { }; // start everything ... -drawGrid(); -drawCells(); -requestAnimationFrame(renderLoop); +//drawGrid(); +//drawCells(); +//requestAnimationFrame(renderLoop); + +view3d.update(); +drawView3d(); requestAnimationFrame(view3d_renderLoop);