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.rs62
1 files changed, 47 insertions, 15 deletions
diff --git a/vgcodec/src/approximate.rs b/vgcodec/src/approximate.rs
index 0192973..fc2b4ba 100644
--- a/vgcodec/src/approximate.rs
+++ b/vgcodec/src/approximate.rs
@@ -2,7 +2,8 @@ use std::sync::Arc;
use image::EncodableLayout;
use log::info;
-use wgpu::{Extent3d, ImageCopyTexture, Origin3d, Texture, TextureUsages};
+use rand::Rng;
+use wgpu::{Extent3d, Texture, TextureUsages};
use crate::{
app::App,
@@ -12,6 +13,7 @@ use crate::{
paint::{PaintUniforms, Painter},
};
+#[allow(unused)]
pub struct Approximator {
app: Arc<App>,
size: Extent3d,
@@ -78,17 +80,44 @@ impl Approximator {
}
pub async fn run(&mut self) {
- let mut current_diff = self.differ.run().await;
- let mut params = PaintUniforms {
- x: 128.0,
- y: 128.0,
- r: 0.5,
- g: 0.5,
- b: 0.5,
- radius: 64.0,
- };
+ for _ in 0..10 {
+ let mut p = PaintUniforms {
+ x: rand::thread_rng().gen_range(0.0..256.0),
+ y: rand::thread_rng().gen_range(0.0..256.0),
+ r: rand::thread_rng().gen_range(0.0..1.0),
+ g: rand::thread_rng().gen_range(0.0..1.0),
+ b: rand::thread_rng().gen_range(0.0..1.0),
+ radius: rand::thread_rng().gen_range(5.0..10.0),
+ };
- self.optimize_param(&mut current_diff, &mut params, "", |p| p.b += 0.1);
+ // Find initial diff
+ self.save();
+ self.painter.run(p);
+ let mut cd = pollster::block_on(self.differ.run());
+ info!("initial diff={cd}");
+ self.restore();
+
+ self.save();
+ loop {
+ let mut q = 0;
+ q += self.optimize_param(&mut cd, &mut p, "more red", |p| p.r += 0.1);
+ q += self.optimize_param(&mut cd, &mut p, "less red", |p| p.r -= 0.1);
+ q += self.optimize_param(&mut cd, &mut p, "more green", |p| p.g += 0.1);
+ q += self.optimize_param(&mut cd, &mut p, "less green", |p| p.g -= 0.1);
+ q += self.optimize_param(&mut cd, &mut p, "more blue", |p| p.b += 0.1);
+ q += self.optimize_param(&mut cd, &mut p, "less blue", |p| p.b -= 0.1);
+ q += self.optimize_param(&mut cd, &mut p, "increase radius", |p| p.radius *= 1.5);
+ q += self.optimize_param(&mut cd, &mut p, "decrease radius", |p| p.radius *= 1.5);
+ q += self.optimize_param(&mut cd, &mut p, "move right", |p| p.x += 5.0);
+ q += self.optimize_param(&mut cd, &mut p, "move left", |p| p.x -= 5.0);
+ q += self.optimize_param(&mut cd, &mut p, "move down", |p| p.y += 5.0);
+ q += self.optimize_param(&mut cd, &mut p, "move up", |p| p.y -= 5.0);
+ if q == 0 {
+ break;
+ }
+ }
+ self.painter.run(p);
+ }
self.exporter.run(&self.tex_approx, "a/approx.png").await;
}
@@ -99,20 +128,23 @@ impl Approximator {
params: &mut PaintUniforms,
label: &'static str,
f: F,
- ) where
+ ) -> usize
+ where
F: Fn(&mut PaintUniforms) -> (),
{
let mut p = params.clone();
+ let mut i = 0;
loop {
- self.save();
- info!("apply '{label:?}'");
f(&mut p);
self.painter.run(p);
let diff = pollster::block_on(self.differ.run());
+ // pollster::block_on(self.exporter.run(&self.tex_approx, &format!("a/snap.png")));
self.restore();
if diff >= *current_diff {
- break;
+ break i;
}
+ info!("applied {label:?} (before={current_diff} after={diff})");
+ i += 1;
*current_diff = diff;
}
}