polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
72 lines (64 loc) • 2.05 kB
text/typescript
import {BaseParamType} from '../_Base';
import {ParamEvent} from '../../poly/ParamEvent';
import {PolyDictionary} from '../../../types/GlobalTypes';
export class EmitController {
_blocked_emit: boolean = false;
_blocked_parent_emit: boolean = false;
_count_by_event_name: PolyDictionary<number> = {};
constructor(protected param: BaseParamType) {}
emitAllowed(): boolean {
if (this._blocked_emit === true) {
return false;
}
if (this.param.scene().loadingController.isLoading()) {
return false;
}
// TODO: should I also prevent nodes from updating
// when they are being called in a loop such as from the Copy SOP?
//node = this.node()
//node? && !node.is_cooking() && this.scene().emit_allowed() # this prevents a camera from updating its param for instance
// although maybe I should send a dirty to the store, and then that store queries the param?
return this.param.scene().dispatchController.emitAllowed();
}
blockEmit() {
this._blocked_emit = true;
if (this.param.is_multiple && this.param.components) {
for (let component of this.param.components) {
component.emitController.blockEmit();
}
}
return true;
}
unblockEmit() {
this._blocked_emit = false;
if (this.param.is_multiple && this.param.components) {
for (let component of this.param.components) {
component.emitController.unblockEmit();
}
}
return true;
}
blockParentEmit() {
this._blocked_parent_emit = true;
return true;
}
unblockParentEmit() {
this._blocked_parent_emit = false;
return true;
}
incrementCount(event_name: ParamEvent) {
this._count_by_event_name[event_name] = this._count_by_event_name[event_name] || 0;
this._count_by_event_name[event_name] += 1;
}
eventsCount(event_name: ParamEvent): number {
return this._count_by_event_name[event_name] || 0;
}
emit(event: ParamEvent) {
if (this.emitAllowed()) {
this.param.emit(event);
if (this.param.parent_param != null && this._blocked_parent_emit !== true) {
this.param.parent_param.emit(event);
}
}
}
}