mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-22 19:18:31 +00:00
animate mvp
This commit is contained in:
parent
83ca8d95be
commit
0caedeb481
46
packages/core/animate.mjs
Normal file
46
packages/core/animate.mjs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import { controls, Pattern, getDrawContext, silence, scheduler } from './index.mjs';
|
||||||
|
const { createParams } = controls;
|
||||||
|
|
||||||
|
Pattern.prototype.animate = function (callback) {
|
||||||
|
window.frame && cancelAnimationFrame(window.frame);
|
||||||
|
const ctx = getDrawContext();
|
||||||
|
const { clientWidth: ww, clientHeight: wh } = ctx.canvas;
|
||||||
|
const render = () => {
|
||||||
|
// const render = (t) => {
|
||||||
|
// t = Math.round(t);
|
||||||
|
// const frame = this.slow(1000).queryArc(t, t);
|
||||||
|
const t = scheduler.now();
|
||||||
|
const frame = this.queryArc(t, t);
|
||||||
|
ctx.fillStyle = '#20001005';
|
||||||
|
ctx.fillRect(0, 0, ww, wh);
|
||||||
|
frame.forEach((f) => {
|
||||||
|
let { x, y, w, h, s, r, a = 0, fill = 'darkseagreen' } = f.value;
|
||||||
|
w *= ww;
|
||||||
|
h *= wh;
|
||||||
|
if (r !== undefined && a !== undefined) {
|
||||||
|
const radians = a * 2 * Math.PI;
|
||||||
|
const [cx, cy] = [(ww - w) / 2, (wh - h) / 2];
|
||||||
|
x = cx + Math.cos(radians) * r * cx;
|
||||||
|
y = cy + Math.sin(radians) * r * cy;
|
||||||
|
} else {
|
||||||
|
x *= ww - w;
|
||||||
|
y *= wh - h;
|
||||||
|
}
|
||||||
|
const val = { ...f.value, x, y, w, h };
|
||||||
|
ctx.fillStyle = fill;
|
||||||
|
if (s === 'rect') {
|
||||||
|
ctx.fillRect(x, y, w, h);
|
||||||
|
} else if (s === 'ellipse') {
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.ellipse(x + w / 2, y + h / 2, w / 2, h / 2, 0, 0, 2 * Math.PI);
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
callback && callback(ctx, val, f);
|
||||||
|
});
|
||||||
|
window.frame = requestAnimationFrame(render);
|
||||||
|
};
|
||||||
|
window.frame = requestAnimationFrame(render);
|
||||||
|
return silence;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const { x, y, w, h, a, r, fill } = createParams('x', 'y', 'w', 'h', 'a', 'r', 'fill');
|
||||||
@ -21,6 +21,7 @@ export * from './repl.mjs';
|
|||||||
export * from './logger.mjs';
|
export * from './logger.mjs';
|
||||||
export * from './time.mjs';
|
export * from './time.mjs';
|
||||||
export * from './draw.mjs';
|
export * from './draw.mjs';
|
||||||
|
export * from './animate.mjs';
|
||||||
export * from './pianoroll.mjs';
|
export * from './pianoroll.mjs';
|
||||||
export * from './ui.mjs';
|
export * from './ui.mjs';
|
||||||
export { default as drawLine } from './drawLine.mjs';
|
export { default as drawLine } from './drawLine.mjs';
|
||||||
|
|||||||
@ -3,6 +3,10 @@ import { evaluate as _evaluate } from './evaluate.mjs';
|
|||||||
import { logger } from './logger.mjs';
|
import { logger } from './logger.mjs';
|
||||||
import { setTime } from './time.mjs';
|
import { setTime } from './time.mjs';
|
||||||
|
|
||||||
|
export let scheduler; // expose scheduler to global scope
|
||||||
|
// this is not optimal as it will only work for one repl at a time
|
||||||
|
// TODO: use pattern.context to expose scheduler
|
||||||
|
|
||||||
export function repl({
|
export function repl({
|
||||||
interval,
|
interval,
|
||||||
defaultOutput,
|
defaultOutput,
|
||||||
@ -14,7 +18,7 @@ export function repl({
|
|||||||
transpiler,
|
transpiler,
|
||||||
onToggle,
|
onToggle,
|
||||||
}) {
|
}) {
|
||||||
const scheduler = new Cyclist({
|
scheduler = new Cyclist({
|
||||||
interval,
|
interval,
|
||||||
onTrigger: async (hap, deadline, duration) => {
|
onTrigger: async (hap, deadline, duration) => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user