Commit e5318389212d0e00584b0430c2f8242e81aa62b0
1 parent
42c575a9
First not fully correct filled polygons
Showing
4 changed files
with
23 additions
and
18 deletions
... | ... | @@ -39,6 +39,7 @@ pub trait Canvas<T> { |
39 | 39 | fn clear(&mut self); |
40 | 40 | fn draw(&mut self, c :&dyn Drawable<T>, ofs :Coordinate<T>, color :u32); |
41 | 41 | fn put_text(&self, ofs :Coordinate<T>, s :&str); |
42 | + fn set_pixel(&mut self, c :Coordinate<T>, color :u32); | |
42 | 43 | fn show(&self); |
43 | 44 | } |
44 | 45 | |
... | ... | @@ -46,8 +47,10 @@ pub trait Drawable<T> { |
46 | 47 | fn plot(&self) -> Coordinates<T>; |
47 | 48 | } |
48 | 49 | |
49 | -pub trait Fillable<T> { | |
50 | - fn fill(&self) -> Coordinates<T>; | |
50 | +pub trait Fillable<T> | |
51 | +where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> | |
52 | + + Debug + Copy + From<i32> { | |
53 | + fn fill(&self, canvas :&mut dyn Canvas<T>, color :u32); | |
51 | 54 | } |
52 | 55 | |
53 | 56 | #[derive(Debug, Clone, Copy)] |
... | ... | @@ -440,17 +443,12 @@ where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> |
440 | 443 | impl<T> Fillable<T> for Polygon<T> |
441 | 444 | where T: Add<Output = T> + Sub<Output = T> + Div<Output = T> |
442 | 445 | + Debug + Clone + Copy + From<i32> { |
443 | - fn fill(&self) -> Coordinates<T> { | |
446 | + fn fill(&self, canvas :&mut dyn Canvas<T>, color :u32) { | |
444 | 447 | let scanlines = self.left_vertices().zip(self.right_vertices()); |
445 | 448 | |
446 | - // vertices is an iterator over all vertices making this polygon. | |
447 | - let vertices = scanlines.flat_map(|(l, r)| l.line_iter(&r)); | |
448 | - | |
449 | - // for debug only… | |
450 | - //let vertices :Vec<(Coordinate<T>)> = vertices.collect(); | |
451 | - //println!("== [{}] {:?}", vertices.len(), vertices); | |
452 | - | |
453 | - Coordinates(Vec::<Coordinate<T>>::new()) | |
449 | + for l in scanlines.flat_map(|(l, r)| l.line_iter(&r)) { | |
450 | + canvas.set_pixel(l, color); | |
451 | + } | |
454 | 452 | } |
455 | 453 | } |
456 | 454 | ... | ... |
... | ... | @@ -22,7 +22,7 @@ use std::convert::{From, Into}; |
22 | 22 | use std::ops::{Add,Sub,Neg,Mul,Div}; |
23 | 23 | use std::fmt::Debug; |
24 | 24 | |
25 | -use crate::easel::{Canvas,Coordinate,Coordinates,Polygon,Fillable}; | |
25 | +use crate::easel::{Canvas, Coordinate, Coordinates, Polygon}; | |
26 | 26 | use crate::transform::{TMatrix, Transformable}; |
27 | 27 | use crate::trigonometry::Trig; |
28 | 28 | use crate::vector::Vector; |
... | ... | @@ -361,7 +361,7 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> |
361 | 361 | / (n.mag() * light.dir().mag()), |
362 | 362 | }; |
363 | 363 | |
364 | - // this if represents a first simple backface culling | |
364 | + // this "if" represents a first simple backface culling | |
365 | 365 | // approach. We only return face that face towards us. |
366 | 366 | if lf < 0.into() { |
367 | 367 | r = r * -lf; |
... | ... | @@ -372,8 +372,6 @@ where T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> |
372 | 372 | | (g.round() as u32) << 8 |
373 | 373 | | (b.round() as u32); |
374 | 374 | |
375 | - (&pg).fill(); | |
376 | - | |
377 | 375 | Some((pg, c)) |
378 | 376 | } else { |
379 | 377 | None | ... | ... |
... | ... | @@ -30,14 +30,13 @@ use std::time::{Duration, Instant}; |
30 | 30 | |
31 | 31 | use fractional::continuous::Continuous; |
32 | 32 | use fractional::easel::{ Coordinate, Coordinates, Drawable, Line, Polyline |
33 | - , Polygon}; | |
33 | + , Polygon, Canvas, Fillable }; | |
34 | 34 | use fractional::fractional::{Fractional, from_vector}; |
35 | 35 | use fractional::trigonometry::Trig; |
36 | 36 | use fractional::vector::Vector; |
37 | 37 | use fractional::transform::{TMatrix, Transformable}; |
38 | 38 | |
39 | 39 | use fractional::xcb::{XcbEasel, XcbCanvas}; |
40 | -use fractional::easel::Canvas; | |
41 | 40 | |
42 | 41 | use fractional::geometry::{Camera,DirectLight,Polyeder,Primitives}; |
43 | 42 | |
... | ... | @@ -351,7 +350,9 @@ fn _democanvas<T>( xcb :&XcbEasel |
351 | 350 | |
352 | 351 | for (o, color) in objects { |
353 | 352 | for (pg, c) in o.project(&camera, &light, color) { |
354 | - canvas.draw(&pg, Coordinate(0, 0, 0.into()), c); | |
353 | + //canvas.draw(&pg, Coordinate(0, 0, 0.into()), c); | |
354 | + (&pg).fill(&mut canvas, c); | |
355 | + //println!("\n"); | |
355 | 356 | } |
356 | 357 | } |
357 | 358 | ... | ... |
... | ... | @@ -240,6 +240,14 @@ impl<'a,T> Canvas<T> for XcbCanvas<'a> { |
240 | 240 | self.conn.flush(); |
241 | 241 | } |
242 | 242 | |
243 | + fn set_pixel(&mut self, c :Coordinate<T>, color :u32) { | |
244 | + let Coordinate(x, y, _) = c; | |
245 | + let idx :usize = (y * (self.width as i32) + x) as usize; | |
246 | + | |
247 | + //print!("({}, {})", idx, color); | |
248 | + self.shm[idx] = color; | |
249 | + } | |
250 | + | |
243 | 251 | fn show(&self) { |
244 | 252 | xcb::copy_area( &self.conn, self.pixmap, self.window, self.gc |
245 | 253 | , 0, 0, 0, 0 | ... | ... |
Please
register
or
login
to post a comment