Commit 50db7017989e770f9e9d48c525121e4d97cef79f
1 parent
a0c638c5
Show nice 3D instead of boring game
Showing
2 changed files
with
48 additions
and
24 deletions
... | ... | @@ -16,7 +16,6 @@ use geometry::{Camera, DirectLight, Polyeder, Primitives}; |
16 | 16 | use transform::{TMatrix}; |
17 | 17 | |
18 | 18 | use std::fmt::{Display, Formatter, Result}; |
19 | -use std::ptr; | |
20 | 19 | use std::sync::mpsc; |
21 | 20 | use std::time::Instant; |
22 | 21 | use wasm_bindgen::prelude::*; |
... | ... | @@ -35,7 +34,8 @@ pub struct Color(u8, u8, u8, u8); |
35 | 34 | pub struct View3d { width :u16 |
36 | 35 | , height :u16 |
37 | 36 | , size :usize |
38 | - , start :Instant | |
37 | + , degree :i32 | |
38 | + //, start :Instant | |
39 | 39 | , tetrahedron :Polyeder<f64> |
40 | 40 | , cube :Polyeder<f64> |
41 | 41 | , camera :Option<Camera<f64>> |
... | ... | @@ -47,31 +47,40 @@ pub struct View3d { width :u16 |
47 | 47 | #[wasm_bindgen] |
48 | 48 | impl View3d { |
49 | 49 | pub fn new(width :u16, height :u16) -> Self { |
50 | - let size = width as usize * height as usize; | |
50 | + let size = width as usize * height as usize; | |
51 | 51 | let light_vector = Vector(0.0, 0.0, 1.0); |
52 | 52 | |
53 | 53 | let mut view3d = Self { width: width |
54 | 54 | , height: height |
55 | 55 | , size: size |
56 | - , start: Instant::now() | |
56 | + , degree: 0 | |
57 | + //, start: Instant::now() | |
57 | 58 | , tetrahedron: Polyeder::tetrahedron(100.0) |
58 | 59 | , cube: Polyeder::cube(56.25) |
59 | 60 | , camera: None |
60 | 61 | , light: DirectLight::new(light_vector) |
61 | 62 | , zbuf: vec!(0.0; size) |
62 | - , image: vec!(Color(0, 0, 0, 0); size) }; | |
63 | + , image: vec!(Color(0, 0, 0, 0xFF); size) | |
64 | + }; | |
63 | 65 | |
64 | 66 | view3d.camera = Some(Camera::<f64>::new(&view3d, 45)); |
65 | 67 | view3d |
66 | 68 | } |
67 | 69 | |
68 | - pub fn update(mut self) { | |
69 | - let deg = ((self.start.elapsed() / 25).as_millis() % 360) as i32; | |
70 | + pub fn width(&self) -> u16 { | |
71 | + self.width | |
72 | + } | |
73 | + | |
74 | + pub fn height(&self) -> u16 { | |
75 | + self.height | |
76 | + } | |
70 | 77 | |
78 | + pub fn update(&mut self) { | |
79 | + //let deg = ((self.start.elapsed() / 25).as_millis() % 360) as i32; | |
71 | 80 | let t = TMatrix::translate(Vector(0.0, 0.0, 150.0)); |
72 | - let rz = TMatrix::rotate_z(deg); | |
73 | - let rx = TMatrix::rotate_x(-deg*2); | |
74 | - let ry = TMatrix::rotate_y(-deg*2); | |
81 | + let rz = TMatrix::rotate_z(self.degree); | |
82 | + let rx = TMatrix::rotate_x(-self.degree*2); | |
83 | + let ry = TMatrix::rotate_y(-self.degree*2); | |
75 | 84 | |
76 | 85 | let rot1 = TMatrix::combine(vec!(rz, rx, t)); |
77 | 86 | let rot2 = TMatrix::combine(vec!(rz, ry, t)); |
... | ... | @@ -79,6 +88,8 @@ impl View3d { |
79 | 88 | let objects = vec!( (self.tetrahedron.transform(&rot1), 0xFFFF00) |
80 | 89 | , ( self.cube.transform(&rot2), 0x0000FF) ); |
81 | 90 | |
91 | + self.degree = (self.degree + 1) % 360; | |
92 | + | |
82 | 93 | self.clear(); |
83 | 94 | |
84 | 95 | match self.camera { |
... | ... | @@ -86,7 +97,7 @@ impl View3d { |
86 | 97 | Some(camera) => { |
87 | 98 | for (o, color) in objects { |
88 | 99 | for (pg, c) in o.project(&camera, &self.light, color) { |
89 | - (&pg).fill(&mut self, c); | |
100 | + (&pg).fill(self, c); | |
90 | 101 | } |
91 | 102 | } |
92 | 103 | }, |
... | ... | @@ -108,11 +119,8 @@ impl Canvas<f64> for View3d { |
108 | 119 | } |
109 | 120 | |
110 | 121 | fn clear(&mut self) { |
111 | - self.zbuf = vec!(0.0; self.size); | |
112 | - unsafe { | |
113 | - let ptr = self.image.as_mut_ptr(); | |
114 | - ptr::write_bytes(ptr, 0, self.size); | |
115 | - } | |
122 | + self.zbuf = vec!(0.0; self.size); | |
123 | + self.image = vec!(Color(0, 0, 0, 0xFF); self.size); | |
116 | 124 | } |
117 | 125 | |
118 | 126 | fn set_pixel(&mut self, c :Coordinate<f64>, color :u32) { | ... | ... |
... | ... | @@ -4,17 +4,30 @@ import { memory } from "wasm-game-of-life/wasm_game_of_life_bg"; |
4 | 4 | // 3D canvas stuff |
5 | 5 | const view3d = View3d.new(151, 151); |
6 | 6 | |
7 | -const view3d_canvas = document.getElementById("view3d"); | |
8 | -view3d_canvas.width = view3d.width(); | |
9 | -view3d_canvas.width = view3d.height(); | |
10 | - | |
11 | -const view3d_ctx = view3d_canvas.getContext('2d'); | |
7 | +const view3d_canvas = document.getElementById("view3d"); | |
8 | +view3d_canvas.width = view3d.width(); | |
9 | +view3d_canvas.height = view3d.height(); | |
10 | +const view3d_ctx = view3d_canvas.getContext('2d'); | |
12 | 11 | |
13 | 12 | const view3d_renderLoop = () => { |
14 | 13 | view3d.update(); |
14 | + drawView3d(); | |
15 | + | |
15 | 16 | requestAnimationFrame(view3d_renderLoop); |
16 | 17 | } |
17 | 18 | |
19 | +const drawView3d = () => { | |
20 | + const view3d_imagePtr = view3d.image(); | |
21 | + const view3d_image = new ImageData( | |
22 | + new Uint8ClampedArray( memory.buffer | |
23 | + , view3d.image() | |
24 | + , view3d.width() * view3d.height() * 4 ) | |
25 | + , view3d.width() | |
26 | + , view3d.height() ); | |
27 | + | |
28 | + view3d_ctx.putImageData(view3d_image, 0, 0); | |
29 | +} | |
30 | + | |
18 | 31 | // game of life stuff |
19 | 32 | const CELL_SIZE = 5; // px |
20 | 33 | const GRID_COLOR = "#CCCCCC"; |
... | ... | @@ -90,7 +103,10 @@ const drawCells = () => { |
90 | 103 | }; |
91 | 104 | |
92 | 105 | // start everything ... |
93 | -drawGrid(); | |
94 | -drawCells(); | |
95 | -requestAnimationFrame(renderLoop); | |
106 | +//drawGrid(); | |
107 | +//drawCells(); | |
108 | +//requestAnimationFrame(renderLoop); | |
109 | + | |
110 | +view3d.update(); | |
111 | +drawView3d(); | |
96 | 112 | requestAnimationFrame(view3d_renderLoop); | ... | ... |
Please
register
or
login
to post a comment