aboutsummaryrefslogtreecommitdiff
path: root/vgcodec/src/approximate.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vgcodec/src/approximate.rs')
-rw-r--r--vgcodec/src/approximate.rs34
1 files changed, 21 insertions, 13 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>(