sclass G22ShapeCollectorPanel is Swingable { settable G22Utils g22utils; settable bool qoiAlways; AnalyzedImage completedImage; new MouseInComponentMonitor mouseMonitor; PicturesByMD5 pics; new JMaxSpeedAnimation anim; JCheckBox cbOn = jcheckbox("On", true); JCheckBox cbFreezeOnHover = jcheckbox("Freeze on hover", true); JSpinner colorsSpinner = jListSpinner(dropFirst(firstNCubes(16))); JSpinner blurSpinner = jSpinner(0, 0, 99); JLabel lblStats = rightAlignedLabel(); class AnalyzedImage { new G22DataWrangler wrangler; BufferedImage inputImage() { ret wrangler.inputImage; } simplyCached byte[] qoiData() { ret g22utils.timeFunction("QOI compress", -> toQOI(inputImage())); } simplyCached S qoiMD5() { ret md5(qoiData()); } S saveImage() { pics.put(qoiMD5(), qoiData()); ret qoiMD5(); } } void init { if (pics != null) ret; pics = new PicturesByMD5(g22utils.projectFile("Images")); pics.extension(".qoi"); looselyBindLiveValueToCheckBox(g22utils.liveProjectVar("Freeze on hover"), cbFreezeOnHover); looselyBindLiveValueToSpinner(g22utils.liveProjectVar("colors"), colorsSpinner); looselyBindLiveValueToSpinner(g22utils.liveProjectVar("blur"), blurSpinner); } BufferedImage nextInputImage() { ret shootLeftScreenHalf(); } BufferedImage nextFrame() { if (!isChecked(cbOn) || isChecked(cbFreezeOnHover) && mouseMonitor!) { sleepSeconds(0.1); null; } var inputImage = nextInputImage(); new AnalyzedImage ai; var wrangler = ai.wrangler; wrangler.timings(g22utils.functionTimings()); wrangler.inputImage(inputImage); wrangler.colors(intFromSpinner(colorsSpinner)); wrangler.blur(intFromSpinner(blurSpinner)); wrangler.stepUntilStage(wrangler.regionsStage); g22utils.setTransientProjectVar("Last wrangler", wrangler); L qoiInfo = !qoiAlways ? null : ll( "QOI: " + str_toK(l(ai.qoiData())), "Hash: " + takeFirst(3, ai.qoiMD5()), "Saved: " + yesNo_short(pics.has(ai.qoiMD5()))); setText(lblStats, commaCombine( anim.fps(), nRegions(wrangler.regions), qoiInfo, nImages(pics.imageCount()) + " saved", n2(countConcepts(g22utils.concepts(), G22PointOfInterest), "POI") ); completedImage = ai; ret toBufferedImage(wrangler.posterizedImage); } cachedVisualize { init(); anim.renderFrame(l0 nextFrame); mouseMonitor.init(anim.imageSurface()); ret northAndCenterWithMargins( jCenteredSection(" Visual Controls ", jHigherScrollPane_borderless_center( jcenteredline( cbOn, cbFreezeOnHover, jCenteredSection("Colors", colorsSpinner), jCenteredSection("Blur", blurSpinner) ) )), centerAndSouthWithMargin( jCenteredSection(" What I See ", anim), centerAndEastWithMargin(lblStats, jThreadedButton("Save image", -> { completedImage?.saveImage(); }))) ); } ImageSurface imageSurface() { ret anim.imageSurface(); } }