Browse Source

Show nice 3D instead of boring game

master
Georg Hopp 6 years ago
parent
commit
50db701798
Signed by: ghopp GPG Key ID: 4C5D226768784538
  1. 36
      tutorial/wasm-game-of-life/src/lib.rs
  2. 26
      tutorial/wasm-game-of-life/www/index.js

36
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<f64>
, cube :Polyeder<f64>
, camera :Option<Camera<f64>>
@ -53,25 +53,34 @@ impl View3d {
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::<f64>::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);
}
}
},
@ -109,10 +120,7 @@ impl Canvas<f64> 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.image = vec!(Color(0, 0, 0, 0xFF); self.size);
}
fn set_pixel(&mut self, c :Coordinate<f64>, color :u32) {

26
tutorial/wasm-game-of-life/www/index.js

@ -6,15 +6,28 @@ const view3d = View3d.new(151, 151);
const view3d_canvas = document.getElementById("view3d");
view3d_canvas.width = view3d.width();
view3d_canvas.width = view3d.height();
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);
Loading…
Cancel
Save