diff options
author | metamuffin <metamuffin@disroot.org> | 2022-11-21 22:28:00 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2022-11-21 22:28:00 +0100 |
commit | 8101a0df569395811417f24795e3a329090c4f00 (patch) | |
tree | d48ca4753d496f9ef18d97eca064a6775b278bad /vgcodec/src | |
parent | 83bc23206ad0982fcf2bf6c8e7256190dbe148f0 (diff) | |
download | video-codec-experiments-8101a0df569395811417f24795e3a329090c4f00.tar video-codec-experiments-8101a0df569395811417f24795e3a329090c4f00.tar.bz2 video-codec-experiments-8101a0df569395811417f24795e3a329090c4f00.tar.zst |
works
Diffstat (limited to 'vgcodec/src')
-rw-r--r-- | vgcodec/src/approximate.rs | 34 | ||||
-rw-r--r-- | vgcodec/src/helper.rs | 14 | ||||
-rw-r--r-- | vgcodec/src/main.rs | 4 |
3 files changed, 37 insertions, 15 deletions
diff --git a/vgcodec/src/approximate.rs b/vgcodec/src/approximate.rs index c4dc629..5bff325 100644 --- a/vgcodec/src/approximate.rs +++ b/vgcodec/src/approximate.rs @@ -4,7 +4,7 @@ use crate::{ export::Exporter, paint::{PaintUniforms, Painter}, }; -use log::{debug, info}; +use log::{debug, info, warn}; use rand::Rng; use std::sync::Arc; use wgpu::{Extent3d, Texture, TextureUsages}; @@ -75,8 +75,9 @@ impl Approximator { .copy_texture(&self.tex_savestate, &self.tex_approx, self.size); } - pub async fn run(&mut self, iters: usize) { + pub async fn run(&mut self, iters: usize, out: &str) -> Vec<PaintUniforms> { let rscale = self.size.width as f32 * 0.1; + let mut objects = vec![]; for i in 0..iters { let mut p = PaintUniforms { x: rand::thread_rng().gen_range(0.0..self.size.width as f32), @@ -97,7 +98,7 @@ impl Approximator { let mut cd = initial_diff; self.save(); - loop { + let ok = loop { let mut q = 0; let mut k = |k: usize| { q += k; @@ -118,22 +119,29 @@ impl Approximator { if k(self.optimize_param(&mut cd, &mut p, "increase ry", |p| p.ry *= 1.5)) { k(self.optimize_param(&mut cd, &mut p, "decrease ry", |p| p.ry /= 1.5)); } - if k(self.optimize_param(&mut cd, &mut p, "move right", |p| p.x += 5.0)) { - k(self.optimize_param(&mut cd, &mut p, "move left", |p| p.x -= 5.0)); + if k(self.optimize_param(&mut cd, &mut p, "move right", |p| p.x += 8.0)) { + k(self.optimize_param(&mut cd, &mut p, "move left", |p| p.x -= 8.0)); } - if k(self.optimize_param(&mut cd, &mut p, "move down", |p| p.y += 5.0)) { - k(self.optimize_param(&mut cd, &mut p, "move up", |p| p.y -= 5.0)); + if k(self.optimize_param(&mut cd, &mut p, "move down", |p| p.y += 8.0)) { + k(self.optimize_param(&mut cd, &mut p, "move up", |p| p.y -= 8.0)); + } + if p.rx < 5.0 || p.ry < 5.0 { + break false; } if q == 0 { - break; + break true; } + }; + if ok { + self.painter.run(p); + info!("{i} (improvement={})", initial_diff - cd); + objects.push(p); + } else { + warn!("object aborted"); } - self.painter.run(p); - - info!("{i} (improvement={})", initial_diff - cd); } - - self.exporter.run(&self.tex_approx, "a/approx.png").await; + self.exporter.run(&self.tex_approx, out).await; + return objects; } pub fn optimize_param<F>( diff --git a/vgcodec/src/helper.rs b/vgcodec/src/helper.rs index 1d029b8..13f9c1a 100644 --- a/vgcodec/src/helper.rs +++ b/vgcodec/src/helper.rs @@ -10,6 +10,18 @@ pub fn write_texture(queue: &Queue, target: &Texture, data: &[u8], size: Extent3 let padded_bytes_per_row_padding = (align - unpadded_bytes_per_row % align) % align; let padded_bytes_per_row = unpadded_bytes_per_row + padded_bytes_per_row_padding; + let mut padded = vec![]; + for y in 0..(size.height as usize) { + for x in 0..(size.width as usize) { + for c in 0..4 { + padded.push(data[c + x * 4 + y * 4 * size.width as usize]) + } + } + for _ in 0..padded_bytes_per_row_padding { + padded.push(0) + } + } + queue.write_texture( wgpu::ImageCopyTexture { texture: &target, @@ -17,7 +29,7 @@ pub fn write_texture(queue: &Queue, target: &Texture, data: &[u8], size: Extent3 origin: wgpu::Origin3d::ZERO, aspect: wgpu::TextureAspect::All, }, - &data, + &padded, wgpu::ImageDataLayout { offset: 0, bytes_per_row: Some(std::num::NonZeroU32::try_from(padded_bytes_per_row).unwrap()), diff --git a/vgcodec/src/main.rs b/vgcodec/src/main.rs index 2be0793..9cae234 100644 --- a/vgcodec/src/main.rs +++ b/vgcodec/src/main.rs @@ -22,6 +22,8 @@ fn main() { struct Args { #[clap(short = 'I', long)] iterations: usize, + #[clap(short = 'o', long)] + outfile: String, infile: String, } @@ -54,5 +56,5 @@ async fn run() { write_texture(queue, &tex_target, &img_raw, size); let mut a = Approximator::new(&app, tex_target, size); - a.run(args.iterations).await; + a.run(args.iterations, &args.outfile).await; } |