1
Fork 0
keyswirl/layout-lens/src/layout.ts

73 lines
1.5 KiB
TypeScript
Raw Normal View History

2023-10-22 16:10:53 +02:00
import { VisualKey, VisualLayout } from "./types";
import * as V from "./vec2";
export function visualKey(
position: V.Vec2,
size: V.Vec2 = [1, 1],
angle: number = 0,
): VisualKey {
return { position, size, angle };
2023-10-22 16:10:53 +02:00
}
function offsetMany(keys: VisualLayout, offsets: V.Vec2[]): VisualLayout {
return keys.map((key, index) => {
const offset = offsets[index] || [0, 0];
key.position = V.add(key.position, offset);
return key;
});
}
function col(at: V.Vec2): VisualLayout {
2023-10-22 16:10:53 +02:00
return [
visualKey(at),
visualKey(V.add(at, [0, 1])),
visualKey(V.add(at, [0, 2])),
2023-10-22 16:10:53 +02:00
];
}
function radians(deg: number): number {
return (deg / 180) * Math.PI;
}
export function thumbs(
at: V.Vec2,
reverse: boolean,
thumbRotation = reverse ? -15 : 15,
): VisualLayout {
const offset: V.Vec2 = [
Math.cos(radians(thumbRotation)),
Math.sin(radians(thumbRotation)),
2023-10-22 16:10:53 +02:00
];
const result = [
visualKey(at, undefined, thumbRotation),
2023-10-22 16:10:53 +02:00
visualKey(
V.add(at, reverse ? V.neg(offset) : offset),
undefined,
2023-10-22 16:10:53 +02:00
thumbRotation,
),
];
if (reverse) result.reverse();
return result;
}
export function cols(
at: V.Vec2,
cols: V.Vec2[],
offsets: V.Vec2[] = [],
2023-10-22 16:10:53 +02:00
): VisualLayout {
return cols.flatMap((self, index) =>
offsetMany(col(V.add(at, V.add(self, [index, 0]))), offsets),
2023-10-22 16:10:53 +02:00
);
}
export function scaleVisual(visual: VisualKey, amount: number): VisualKey {
return {
angle: visual.angle,
position: V.scale(visual.position, amount),
size: V.scale(visual.size, amount),
};
}