convex-pixel
Version:
The library for creating pseudo 3d interactive scenes based on webgl
64 lines • 2.73 kB
JavaScript
import * as PIXI from "pixi.js";
import { Rect, Vector4D } from "../utils/geom";
export var EventTypes;
(function (EventTypes) {
EventTypes["CHANGE"] = "change";
})(EventTypes || (EventTypes = {}));
/**
* Sinchronization p3d objects in dom space
*/
export class DomSynchronizer extends PIXI.utils.EventEmitter {
constructor(appContext) {
super();
this.appContext = appContext;
this._postrenderHandler = () => {
const map = {};
for (const obj of DomSynchronizer._syncronizedObjects) {
if (!map[obj.groupId]) {
map[obj.groupId] = [];
}
map[obj.groupId].push(obj);
}
const dementions = {};
// tslint:disable-next-line: forin
for (const id in map) {
if (!dementions[id]) {
dementions[id] = { width: 0, height: 0, x: 0, y: 0, id };
}
const demention = dementions[id];
const len = map[id].length;
const bound = Rect.new();
for (const obj of map[id]) {
const abs = obj.object.container ? obj.object.container.getGlobalPosition() : obj.object.getGlobalPosition();
const bounds = obj.object.getBounds();
const helper = Vector4D.new(abs.x, abs.y, abs.x + bounds.width, abs.y + bounds.height);
bound.set(Math.min(bound.x || helper.x, helper.x), Math.min(bound.y || helper.y, helper.y), Math.max(bound.width || helper.z, helper.z), Math.max(bound.height || helper.t, helper.t));
// unlink for best perfomance
helper.free();
// abs.free();
}
demention.x = bound.x;
demention.y = bound.y;
demention.width = bound.width - bound.x;
demention.height = bound.height - bound.y;
// unlink for best perfomance
bound.free();
}
this.emit(EventTypes.CHANGE, dementions);
};
DomSynchronizer._instance = this;
appContext.pixi.renderer.addListener("prerender", this._postrenderHandler);
}
static add(syncEntity) {
DomSynchronizer._instance.add(syncEntity);
}
init(...params) { }
destroy(...params) { }
add(syncEntity) {
if (DomSynchronizer._syncronizedObjects.indexOf(syncEntity) === -1) {
DomSynchronizer._syncronizedObjects.push(syncEntity);
}
}
}
DomSynchronizer._syncronizedObjects = new Array();
//# sourceMappingURL=dom-synchronizer.js.map