Replacing the symbol-use pattern in rendered SVG with groups with their contents set to the innerHTML of the asset SVG symbols. The background rectangle's size is now explicitly the size of the viewBox. Culling more glyphs that aren't visible to the eye (for now, at least).

This commit is contained in:
Rezmason
2025-05-14 05:33:56 -07:00
parent 3fef805c1f
commit 76e0311cfd

View File

@@ -62,7 +62,7 @@ export default ({ artboard, config }) => {
columnPos[0] = pos[0]; columnPos[0] = pos[0];
const columnTimeOffset = randomFloat(columnPos) * 1000; const columnTimeOffset = randomFloat(columnPos) * 1000;
columnPos[0] += 0.1; columnPos[0] += 0.1;
const columnSpeedOffset = randomFloat(columnPos) * 0.5 + 0.5; let columnSpeedOffset = randomFloat(columnPos) * 0.5 + 0.5;
if (config.loops) { if (config.loops) {
columnSpeedOffset = 0.5; columnSpeedOffset = 0.5;
} }
@@ -104,7 +104,7 @@ export default ({ artboard, config }) => {
const xml = xmlParser.parseFromString(glyphSVG.text(), "image/svg+xml"); const xml = xmlParser.parseFromString(glyphSVG.text(), "image/svg+xml");
const defs = xml.querySelector("defs"); const defs = xml.querySelector("defs");
const symbols = [...defs.querySelectorAll("symbol")]; const symbols = [...defs.querySelectorAll("symbol")];
const symbolsByID = new Map(symbols.map(symbol => (["#" + symbol.id, symbol]))); const symbolsByID = new Map(symbols.map(symbol => (["#" + symbol.id, symbol.innerHTML])));
const symbolSize = symbols[0].getAttribute("width") || 64; const symbolSize = symbols[0].getAttribute("width") || 64;
const time = 1 * config.animationSpeed; const time = 1 * config.animationSpeed;
// TODO: effect // TODO: effect
@@ -117,7 +117,8 @@ export default ({ artboard, config }) => {
const pos4 = vec4.create(); const pos4 = vec4.create();
for (const {pos, brightness, isCursor, symbol} of glyphs) { for (const {pos, brightness, isCursor, symbol} of glyphs) {
if (brightness < 0.1) { // TODO: use actual thresholds
if (brightness < 0.6) {
continue; continue;
} }
@@ -179,14 +180,14 @@ export default ({ artboard, config }) => {
const group = []; const group = [];
// group.push(`<rect fill="none" stroke="red" width="64" height="64" />`); // group.push(`<rect fill="none" stroke="red" width="64" height="64" />`);
group.push(`<use fill="${isCursor ? cursorColor : baseColor}" href="${base}"></use>`); group.push(`<g fill="${isCursor ? cursorColor : baseColor}">${symbolsByID.get(base)}</g>`);
const glintBrightness = brightness * 2 - 1; const glintBrightness = brightness * 2 - 1;
const glint = `#sym_${symbol}_glint`; const glint = `#sym_${symbol}_glint`;
if (glintBrightness > 0 && symbolsByID.has(glint)) { if (glintBrightness > 0 && symbolsByID.has(glint)) {
const glintChannel = Math.floor(0xFF * glintBrightness); const glintChannel = Math.floor(0xFF * glintBrightness);
const glintColor = "#" + (glintChannel << 16 | glintChannel << 8).toString(16).padStart(6, "0"); const glintColor = "#" + (glintChannel << 16 | glintChannel << 8).toString(16).padStart(6, "0");
group.push(`<use fill="${glintColor}" href="${glint}"></use>`); group.push(`<g fill="${glintColor}">${symbolsByID.get(glint)}</g>`);
} }
glyphElements.push([depth, `<g transform="${glyphTransform}">${group.join(" ")}</g>`]); glyphElements.push([depth, `<g transform="${glyphTransform}">${group.join(" ")}</g>`]);
@@ -196,8 +197,7 @@ export default ({ artboard, config }) => {
output.innerHTML = [ output.innerHTML = [
`<style>path { mix-blend-mode: screen; }</style>`, `<style>path { mix-blend-mode: screen; }</style>`,
defs.outerHTML, `<rect width="${numColumns}" height="${numColumns}" />`,
`<rect width="100%" height="100%" />`,
glyphElements.map(([depth, tag]) => tag).join("\n") glyphElements.map(([depth, tag]) => tag).join("\n")
].join("\n"); ].join("\n");