animationvideo
Version:
Javascript-Libary for animation and audio syncing
83 lines (73 loc) • 2.04 kB
JavaScript
import Scene from "./Default.mjs";
import Transform from "../func/transform.mjs";
export default class SceneNorm extends Scene {
constructor(...args) {
super(...args);
this.transform = null;
this.transformInvert = null;
this.cam = {
zoom: 1,
x: 0,
y: 0
};
}
_getViewport() {
if (!this.engine) return new Transform();
if (!this.transform) {
this.transform = this._getViewportByCam(this.cam);
this.transformInvert = null;
}
return this.transform;
}
_getViewportByCam(cam) {
const hw = this.engine._output.width / 2;
const hh = this.engine._output.height / 2;
const scale = this.engine._output.ratio > 1 ? hw : hh;
return new Transform()
.translate(hw, hh)
.scale(scale, scale)
.scale(cam.zoom, cam.zoom)
.translate(-cam.x, -cam.y);
}
resize(output) {
this.transform = null;
this.transformInvert = null;
this.additionalModifier = {
alpha: 1,
x: -1,
y: -1,
width: 2,
height: 2,
widthInPixel: output.width,
heightInPixel: output.height,
scaleCanvas: output.width / output.canvas.clientWidth
};
const [x1, y1] = this.transformPoint(0, 0, 1);
const [x2, y2] = this.transformPoint(output.width, output.height, 1);
this.additionalModifier.visibleScreen = {
x: x1,
y: y1,
width: x2 - x1,
height: y2 - y1
};
this.layerManager.forEach(({ layer, element, isFunction, index }) => {
if (!isFunction) {
element.resize(output, this.additionalModifier);
}
});
}
transformPoint(x, y, scale = this.additionalModifier.scaleCanvas) {
if (!this.transformInvert) {
this.transformInvert = this._getViewport()
.clone()
.invert();
}
return this.transformInvert.transformPoint(x * scale, y * scale);
}
draw(output) {
output.context.save();
output.context.setTransform(...this._getViewport().m);
super.draw(output);
output.context.restore();
}
}