aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2022-11-21 22:28:00 +0100
committermetamuffin <metamuffin@disroot.org>2022-11-21 22:28:00 +0100
commit8101a0df569395811417f24795e3a329090c4f00 (patch)
treed48ca4753d496f9ef18d97eca064a6775b278bad
parent83bc23206ad0982fcf2bf6c8e7256190dbe148f0 (diff)
downloadvideo-codec-experiments-8101a0df569395811417f24795e3a329090c4f00.tar
video-codec-experiments-8101a0df569395811417f24795e3a329090c4f00.tar.bz2
video-codec-experiments-8101a0df569395811417f24795e3a329090c4f00.tar.zst
works
-rw-r--r--vgcodec/src/approximate.rs34
-rw-r--r--vgcodec/src/helper.rs14
-rw-r--r--vgcodec/src/main.rs4
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;
}