Added some other basic inputs to see how continuous changes of various values affect the component render

This commit is contained in:
Rezmason
2025-05-15 03:06:19 -07:00
parent 45059c4e29
commit 24e939008e
2 changed files with 56 additions and 21 deletions

View File

@@ -105,13 +105,15 @@ import makeConfig from "./utils/config";
/** @param {MatrixProps} props */ /** @param {MatrixProps} props */
export const Matrix = memo((props) => { export const Matrix = memo((props) => {
const { style, className, ...rest } = props; const { style, className, ...rawConfigProps } = props;
const elProps = { style, className }; const elProps = { style, className };
const matrix = useRef(null); const matrix = useRef(null);
const [rCanvas, setCanvas] = useState(null); const [rCanvas, setCanvas] = useState(null);
const [rRenderer, setRenderer] = useState(null); const [rRenderer, setRenderer] = useState(null);
const [rRain, setRain] = useState(null); const [rRain, setRain] = useState(null);
const configProps = Object.fromEntries(Object.entries(rawConfigProps).filter(([_, value]) => value != null));
const supportsWebGPU = () => { const supportsWebGPU = () => {
return ( return (
window.GPUQueue != null && window.GPUQueue != null &&
@@ -137,7 +139,7 @@ export const Matrix = memo((props) => {
}; };
useEffect(() => { useEffect(() => {
const useWebGPU = supportsWebGPU() && ["webgpu"].includes(rest.renderer?.toLowerCase()); const useWebGPU = supportsWebGPU() && ["webgpu"].includes(configProps.renderer?.toLowerCase());
const isWebGPU = rRenderer?.type === "webgpu"; const isWebGPU = rRenderer?.type === "webgpu";
if (rRenderer != null && useWebGPU === isWebGPU) { if (rRenderer != null && useWebGPU === isWebGPU) {
@@ -168,7 +170,7 @@ export const Matrix = memo((props) => {
return; return;
} }
const refresh = async () => { const refresh = async () => {
await rRenderer.formulate(rRain, makeConfig({ ...rest })); await rRenderer.formulate(rRain, makeConfig(configProps));
}; };
refresh(); refresh();
}, [props, rRain]); }, [props, rRain]);

View File

@@ -6,24 +6,24 @@ import { Matrix } from "./Matrix";
const root = createRoot(document.getElementById("root")); const root = createRoot(document.getElementById("root"));
let idx = 1; let idx = 1;
const versions = [ const versions = [
"classic",
"3d", "3d",
"trinity", "resurrections",
"bugs", "operator",
"megacity", "megacity",
"nightmare", "nightmare",
"paradise", "paradise",
"resurrections", "trinity",
"operator", "bugs",
"throwback", "morpheus",
"updated",
"1999",
"2003",
"2021",
]; ];
const App = () => { const App = () => {
const [version, setVersion] = React.useState(versions[0]); const [version, setVersion] = useState(versions[0]);
const [numColumns, setNumColumns] = React.useState(10); const [numColumns, setNumColumns] = useState(80);
const [rendererType, setRendererType] = React.useState(null); const [cursorColor, setCursorColor] = useState(null);
const [backgroundColor, setBackgroundColor] = useState("0,0,0");
const [rendererType, setRendererType] = useState(null);
const [density, setDensity] = useState(2);
const [destroyed, setDestroyed] = useState(false); const [destroyed, setDestroyed] = useState(false);
const onButtonClick = () => { const onButtonClick = () => {
setVersion((s) => { setVersion((s) => {
@@ -32,11 +32,8 @@ const App = () => {
console.log(newVersion); console.log(newVersion);
return newVersion; return newVersion;
}); });
setNumColumns(() => { setCursorColor(null);
const newColumns = 10 + Math.floor(Math.random() * 50); setBackgroundColor(null);
console.log(newColumns);
return newColumns;
});
}; };
const onRendererButtonClick = () => { const onRendererButtonClick = () => {
setRendererType(() => (rendererType === "webgpu" ? "regl" : "webgpu")); setRendererType(() => (rendererType === "webgpu" ? "regl" : "webgpu"));
@@ -48,15 +45,51 @@ const App = () => {
return ( return (
<div> <div>
<h1>Rain</h1> <h1>Rain</h1>
<button onClick={onButtonClick}>Change properties</button> <button onClick={onButtonClick}>Version: "{version}"</button>
<button onClick={onRendererButtonClick}>Renderer: {rendererType ?? "default (regl)"}</button> <button onClick={onRendererButtonClick}>Renderer: {rendererType ?? "default (regl)"}</button>
<button onClick={onDestroyButtonClick}>Destroy</button> <button onClick={onDestroyButtonClick}>Destroy</button>
<label htmlFor="cursor-color">Cursor color: </label>
<input
name="cursor-color"
type="color"
onChange={(e) => {
const values = e.target.value
.match(/[\da-fA-F]{2}/g)
.map((s) => parseInt(s, 16) / 0xff)
.join(",");
setCursorColor(values);
}}
/>
<label htmlFor="background-color">Background color: </label>
<input
name="background-color"
type="color"
onChange={(e) => {
const values = e.target.value
.match(/[\da-fA-F]{2}/g)
.map((s) => parseInt(s, 16) / 0xff)
.join(",");
setBackgroundColor(values);
}}
/>
<label htmlFor="num-columns"># of columns:</label>
<input
name="num-columns"
type="range"
min="10"
max="160"
step="1"
onInput={(e) => setNumColumns(parseInt(e.target.value))}
/>
{!destroyed && ( {!destroyed && (
<Matrix <Matrix
style={{ width: "80vw", height: "45vh" }} style={{ width: "80vw", height: "45vh" }}
version={version} version={version}
numColumns={numColumns} numColumns={numColumns}
renderer={rendererType} renderer={rendererType}
cursorColor={cursorColor}
backgroundColor={backgroundColor}
density={2.0} density={2.0}
/> />
)} )}