pub struct Donut<const WIDTH: u8 = 80, const HEIGHT: u8 = 22, const VIEWER_DISTANCE: u8 = 5, const BRIGHTNESS_FACTOR: u8 = 8, const J_STEP_VALUE: u8 = 7, const J_STEP_DENOM: u8 = 100, const I_STEP_VALUE: u8 = 2, const I_STEP_DENOM: u8 = 100, const CHAR_BRIGHTNESS_0: char = ' ', const CHAR_BRIGHTNESS_1: char = '.', const CHAR_BRIGHTNESS_2: char = ',', const CHAR_BRIGHTNESS_3: char = '-', const CHAR_BRIGHTNESS_4: char = '~', const CHAR_BRIGHTNESS_5: char = ':', const CHAR_BRIGHTNESS_6: char = ';', const CHAR_BRIGHTNESS_7: char = '=', const CHAR_BRIGHTNESS_8: char = '!', const CHAR_BRIGHTNESS_9: char = '*', const CHAR_BRIGHTNESS_10: char = '#', const CHAR_BRIGHTNESS_11: char = '$', const CHAR_BRIGHTNESS_12: char = '@'> {
pub a_cos: f32,
pub a_sin: f32,
pub b_cos: f32,
pub b_sin: f32,
}Expand description
A configurable “Donut” that can render ASCII frames without std.
The donut is rendered by sampling points on a torus surface using two angles, and projecting those points into 2D screen space. The brightness of each point is determined by the surface’s orientation relative to a light source.
Fields§
§a_cos: f32§a_sin: f32§b_cos: f32§b_sin: f32Implementations§
Source§impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const C0: char, const C1: char, const C2: char, const C3: char, const C4: char, const C5: char, const C6: char, const C7: char, const C8: char, const C9: char, const C10: char, const C11: char, const C12: char> Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12>
impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const C0: char, const C1: char, const C2: char, const C3: char, const C4: char, const C5: char, const C6: char, const C7: char, const C8: char, const C9: char, const C10: char, const C11: char, const C12: char> Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, C0, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12>
Sourcepub const fn new() -> Self
pub const fn new() -> Self
Create a new donut with initial rotation values set to represent 0 (cosine=1, sine=0).
Sourcepub fn rotate(&mut self, da: f32, db: f32)
pub fn rotate(&mut self, da: f32, db: f32)
Increment the rotation angles by da and db.
Rotating the donut creates the animation effect.
Sourcepub fn render_frame_in_place(&self, output: &mut [char], zbuf: &mut [f32])
pub fn render_frame_in_place(&self, output: &mut [char], zbuf: &mut [f32])
Render one ASCII frame in-place:
- output should be (WIDTH*HEIGHT) in length, for storing characters.
- zbuf should also be (WIDTH*HEIGHT) in length, for storing depth.
All these slots will be overwritten with the new frame’s data.
You can then print the output slice as lines of WIDTH characters.
Trait Implementations§
Auto Trait Implementations§
impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> Freeze for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>
impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> RefUnwindSafe for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>
impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> Send for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>
impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> Sync for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>
impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> Unpin for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>
impl<const WIDTH: u8, const HEIGHT: u8, const VIEWER_DISTANCE: u8, const BRIGHTNESS_FACTOR: u8, const J_STEP_VALUE: u8, const J_STEP_DENOM: u8, const I_STEP_VALUE: u8, const I_STEP_DENOM: u8, const CHAR_BRIGHTNESS_0: char, const CHAR_BRIGHTNESS_1: char, const CHAR_BRIGHTNESS_2: char, const CHAR_BRIGHTNESS_3: char, const CHAR_BRIGHTNESS_4: char, const CHAR_BRIGHTNESS_5: char, const CHAR_BRIGHTNESS_6: char, const CHAR_BRIGHTNESS_7: char, const CHAR_BRIGHTNESS_8: char, const CHAR_BRIGHTNESS_9: char, const CHAR_BRIGHTNESS_10: char, const CHAR_BRIGHTNESS_11: char, const CHAR_BRIGHTNESS_12: char> UnwindSafe for Donut<WIDTH, HEIGHT, VIEWER_DISTANCE, BRIGHTNESS_FACTOR, J_STEP_VALUE, J_STEP_DENOM, I_STEP_VALUE, I_STEP_DENOM, CHAR_BRIGHTNESS_0, CHAR_BRIGHTNESS_1, CHAR_BRIGHTNESS_2, CHAR_BRIGHTNESS_3, CHAR_BRIGHTNESS_4, CHAR_BRIGHTNESS_5, CHAR_BRIGHTNESS_6, CHAR_BRIGHTNESS_7, CHAR_BRIGHTNESS_8, CHAR_BRIGHTNESS_9, CHAR_BRIGHTNESS_10, CHAR_BRIGHTNESS_11, CHAR_BRIGHTNESS_12>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more