diff options
author | Tom Barrett <tom@tombarrett.xyz> | 2020-03-04 08:29:11 -0600 |
---|---|---|
committer | Tom Barrett <tom@tombarrett.xyz> | 2020-03-04 08:29:11 -0600 |
commit | 8b4b79500a7673be388214386b5be239b87efa35 (patch) | |
tree | 8bbd131b3ac17b6bb3b2cb77ff08deaa1bd0dcd7 /src | |
parent | c7d13e2721482772c12b44773777c5902f25848c (diff) |
dynamic sin wave
Diffstat (limited to 'src')
-rw-r--r-- | src/tom.rs | 48 |
1 files changed, 44 insertions, 4 deletions
@@ -1,3 +1,5 @@ +use std::f32::consts::PI; + use luminance::context::GraphicsContext; use luminance::framebuffer::Framebuffer; use luminance::pipeline::PipelineState; @@ -49,26 +51,56 @@ fn gen_border() -> Vec<Vec<Vertex>> { vertices } +fn relative(x: f32, in_min: f32, in_max: f32, out_min: f32, out_max: f32) -> f32 { + (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min +} + +fn gen_sin(start: f32) -> Vec<Vertex> { + let mut vertices: Vec<Vertex> = Vec::new(); + + let end = start + (2.0 * PI); + let mut x = start; + while x < end { + vertices.push(Vertex { + position: VertexPosition::new([relative(x, start, end, -0.9, 0.9), x.sin() * 0.9]), + color: VertexRGB::new(constants::C64_GREEN), + }); + + x += 0.4; + } + + vertices +} + #[derive(Default)] pub struct Tom { - vertices: Vec<Vec<Vertex>>, + border: Vec<Vec<Vertex>>, + wave: Vec<Vertex>, + last_input: f32, tessalations: Vec<Tess>, } impl Tom { pub fn new() -> Tom { - let vertices = gen_border(); + let border = gen_border(); + let wave = gen_sin(0.0); let tessalations = Vec::new(); Tom { - vertices, + border, + wave, + last_input: 0.0, tessalations, } } pub fn update<T: GraphicsContext>(&mut self, mut surface: T) -> T { self.tessalations.clear(); - for vertices in self.vertices.iter() { + + self.last_input += 0.1; + self.wave = gen_sin(self.last_input); + + for vertices in self.border.iter() { self.tessalations.push( TessBuilder::new(&mut surface) .add_vertices(vertices) @@ -78,6 +110,14 @@ impl Tom { ); } + self.tessalations.push( + TessBuilder::new(&mut surface) + .add_vertices(&self.wave) + .set_mode(Mode::LineStrip) + .build() + .unwrap(), + ); + surface } |