Attempt to migrate to a class for handling renders.

It didn't work.
This commit is contained in:
Bradlee Speice 2024-12-02 20:01:29 -05:00
parent 2e8a6d1ce7
commit ac99ee6dd8
2 changed files with 53 additions and 21 deletions

View File

@ -10,6 +10,56 @@ function invertImage(sourceImage: ImageData): ImageData {
return image; return image;
} }
class RenderManager {
private isFinished: boolean = false;
private painter: Iterator<ImageData> = null;
constructor(private readonly setImage: (image: [ImageData]) => void) {
requestAnimationFrame(() => this.animate());
}
setPainter(painter: Iterator<ImageData>) {
console.log("Received next painter");
if (!this) {
console.log(this);
return;
}
this.painter = painter;
}
setFinished() {
console.log("Received finished");
if (!this) {
console.log(this);
return;
}
this.isFinished = true;
}
animate() {
console.log("Received next frame");
if (!this) {
console.log(this);
return;
}
if (this.isFinished) {
return;
}
if (!this.painter) {
requestAnimationFrame(() => this.animate());
}
const nextImage = this.painter.next().value;
if (nextImage) {
console.log("Received next image");
this.setImage([nextImage]);
}
requestAnimationFrame(() => this.animate());
}
}
type InvertibleCanvasProps = { type InvertibleCanvasProps = {
width: number, width: number,
height: number, height: number,
@ -104,28 +154,10 @@ interface CanvasProps {
*/ */
export default function Canvas({width, height, children}: CanvasProps) { export default function Canvas({width, height, children}: CanvasProps) {
const [image, setImage] = useState<[ImageData]>(null); const [image, setImage] = useState<[ImageData]>(null);
const [painterHolder, setPainterHolder] = useState<[Iterator<ImageData>]>(null); const [renderManager, _setRenderManager] = useState<RenderManager>(new RenderManager(setImage));
useEffect(() => { const setPainter = (painter: Iterator<ImageData>) => renderManager.setPainter.bind(renderManager)(painter);
if (!painterHolder) {
return;
}
const painter = painterHolder[0]; useEffect(() => () => { renderManager.setFinished.bind(renderManager)(); }, []);
const nextImage = painter.next().value;
if (nextImage) {
setImage([nextImage]);
setPainterHolder([painter]);
} else {
setPainterHolder(null);
}
}, [painterHolder]);
const [painter, setPainter] = useState<Iterator<ImageData>>(null);
useEffect(() => {
if (painter) {
setPainterHolder([painter]);
}
}, [painter]);
width = width ?? 500; width = width ?? 500;
height = height ?? 500; height = height ?? 500;