//jshint esversion:8 let c = document.getElementById("myCanvas"); let ctx = c.getContext("2d"); ctx.canvas.width = window.innerWidth; ctx.canvas.height = window.innerHeight; centerX = ctx.canvas.width / 2; centerY = ctx.canvas.height / 2; let deg_per_sec = 10; let targetFps = 60; let frameDuration = 1000 / targetFps; let rotation = 0; //was = j = angle let paused = true; render_clear(); let drawObj = null; function createInstance(className, args) { const classMap = { PolyTwistColourWidth: PolyTwistColourWidth, FloralPhyllo: FloralPhyllo, Spiral1: Spiral1, FloralAccident: FloralAccident, FloralPhyllo_Accident: FloralPhyllo_Accident, Nodal_expanding: Nodal_expanding, Phyllotaxis: Phyllotaxis, SquareTwist_angle: SquareTwist_angle, EyePrototype: EyePrototype, CircleExpand: CircleExpand, MaryFace: MaryFace, // Add more class constructors here as needed }; if (classMap.hasOwnProperty(className)) { return new classMap[className](...args); } else { throw new Error(`Unknown class name: ${className}`); } } async function updateDrawObj() { deg_per_sec = animationList[currentAnimationIndex].speed; drawObj = createInstance(animationList[currentAnimationIndex].name, animationList[currentAnimationIndex].args); } let animationList = [] animationList.push({ name: "PolyTwistColourWidth", args: [4, 400, 5, 14, -90, 100, "#e0ba10", "#e01044"], speed: 10, duration: 9*8 }) animationList.push({ name: "FloralPhyllo", args: [300, 180, 1000, "#e0ba10", "#e01044"], speed: 5, duration: 60*10 }) animationList.push({ name: "EyePrototype", args: [0, 0, 0, 1, 800, 10, 1, 1, 0, 0, 0, 0, 1, "#e0ba10", "#e01044", "#e0ba10", "blue"], speed: 10, duration: 60 * 3 }) animationList.push({ name: "Spiral1", args: [6, 240, 5, "#e0ba10",], speed: 10, duration: 60*5 }) animationList.push({ name: "PolyTwistColourWidth", args: [8, 400, 5, 65, -90, 100, "black","#e0ba10"], speed: 5, duration: 9*8 }) animationList.push({ name: "FloralPhyllo_Accident", args: [20, 240, "#e01044", "#e0ba10"], speed: 4, duration: 60 }) animationList.push({ name: "Nodal_expanding", args: [5, 120, 56, 6, "#e01044", "#e0ba10", 5], speed: 20, duration: 60 * 5 }) animationList.push({ name: "Spiral1", args: [50, 240, 3, "#e01044"], speed: 8, duration: 60 * 5 }) animationList.push({ name: "Phyllotaxis", args: [13, 1000, 6650, 0, "#e01044", "#e0ba10"], speed: 2, duration: 60 * 5 }) animationList.push({ name: "MaryFace", args: [-110, -140, 18, 160, 195, -30, 18, 160], speed: 10, duration: 3 }) animationList.push({ name: "FloralAccident", args: [20, 240, "#e01044"], speed: 8, duration: 60 }) animationList.push({ name: "Phyllotaxis", args: [13, 500, 200, 1, "#e01044", "#e0ba10"], speed: 15, duration: 60 * 10 }) animationList.push({ name: "SquareTwist_angle", args: [400, 3, "#e0ba10", "#e01044"], speed: 10, duration: 40 }) animationList.push({ name: "Phyllotaxis", args: [13, 0, 600, 2, "#e0ba10", "#e01044"], speed: 15, duration: 60 * 10 }) animationList.push({ name: "EyePrototype", args: [0, 0, 0, 0, 1000, 10, 0, 0, 0, 0, 1, 1, 1, "#e0ba10", "#e01044", "#e0ba10", "black"], speed: 10, duration: 60 * 3 }) animationList.push({ name: "MaryFace", args: [-110, -140, 18, 160, 195, -30, 18, 160], speed: 10, duration: 3 }) animationList.push({ name: "EyePrototype", args: [0, 0, 0, 0, 1000, 15, 1, 0, 1, 0, 0, 1, 1, "#e01044", "#e0ba10", "#e01044", "#e01044"], speed: 10, duration: 60 }) animationList.push({ name: "CircleExpand", args: [21, 150, 1, 1, "#e01044", "#e0ba10"], speed: 10, duration: 60 }) let totalTime = 0; for (let i = 0; i < animationList.length; i++) { totalTime += animationList[i].duration; } console.log("Total time: " + totalTime / 60) let currentAnimationIndex = 0; updateDrawObj(); function render() { setTimeout(() => { requestAnimationFrame(() => { render_clear(); console.log(rotation) if (rotation / deg_per_sec >= animationList[currentAnimationIndex].duration) { currentAnimationIndex += 1; if (currentAnimationIndex === animationList.length) { currentAnimationIndex = 0; } rotation = 0 updateDrawObj(); } if (drawObj) { drawObj.draw(rotation); } if (!paused) { rotation += deg_per_sec / targetFps; } // drawCenter(300) }); render(); }, frameDuration); } document .getElementById("shape-selector") .addEventListener("change", updateDrawObj); let toolbarShowing = true; document.addEventListener("keydown", toggleSettings); manualToggleSettings(); function manualToggleSettings() { console.log("hi") toolbarShowing = !toolbarShowing; let tb = document.getElementById("toolbar"); if (toolbarShowing) { tb.style.display = "flex"; } else { tb.style.display = "none"; } } function toggleSettings(e) { if (e.key == "p") { toolbarShowing = !toolbarShowing; } if (e.code === "Space") { paused = !paused; } if (e.keyCode == '37') { // left arrow if (currentAnimationIndex === 0) { currentAnimationIndex = animationList.length - 1 } else { currentAnimationIndex -= 1 } updateDrawObj(); rotation = 0 } else if (e.keyCode == '39') { // right arrow if (currentAnimationIndex === animationList.length - 1) { currentAnimationIndex = 0 } else { currentAnimationIndex += 1 } updateDrawObj(); rotation = 0 } let tb = document.getElementById("toolbar"); if (toolbarShowing) { tb.style.display = "flex"; } else { tb.style.display = "none"; } } function TogglePause() { let pb = document.getElementById("pauseButton"); paused = !paused; if (paused) { pb.textContent = "Play"; } else { pb.textContent = "Pause"; } } function Reset() { rotation = 0; //was = j = angle currentFrame = 0; } function ForwardFrame() { rotation += deg_per_sec / fps; // was = j = innerRotation, now = rotation currentFrame += 1; // was = i } function BackwardFrame() { rotation -= deg_per_sec / fps; // was = j = innerRotation, now = rotation currentFrame -= 1; // was = i } function ChangeDegPerSec(newValue) { deg_per_sec = newValue; } window.onload = render;