From 11a57882861f9811cb1624d76a2b08ffb7d47b9c Mon Sep 17 00:00:00 2001 From: metamuffin Date: Mon, 21 Nov 2022 20:19:18 +0100 Subject: works (not) --- vgcodec/src/approximate.rs | 62 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 15 deletions(-) (limited to 'vgcodec/src/approximate.rs') 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, 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; } } -- cgit v1.2.3-70-g09d2