polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
96 lines (88 loc) • 2.58 kB
text/typescript
import {InputsController} from '../InputsController';
import {InputCloneMode} from '../../../../../engine/poly/InputCloneMode';
import {TypeAssert} from '../../../../../engine/poly/Assert';
import { CoreType } from '../../../../Type';
export class ClonedStatesController {
private _cloned_states: InputCloneMode[] | undefined;
private _cloned_state: InputCloneMode | undefined;
private _clone_required_states: boolean[] = [];
private _overridden: boolean = false;
constructor(protected inputs_controller: InputsController) {}
init_inputs_cloned_state(states: InputCloneMode | InputCloneMode[]) {
if (CoreType.isArray(states)) {
this._cloned_states = states;
} else {
this._cloned_state = states;
}
this._update_clone_required_state();
}
override_cloned_state_allowed() {
if (this._cloned_states) {
for (let state of this._cloned_states) {
if (state == InputCloneMode.FROM_NODE) {
return true;
}
}
}
if (this._cloned_state) {
return this._cloned_state == InputCloneMode.FROM_NODE;
}
return false;
}
clone_required_state(index: number): boolean {
return this._clone_required_states[index];
}
clone_required_states(): boolean | boolean[] {
return this._clone_required_states;
}
private _get_clone_required_state(index: number): boolean {
const states = this._cloned_states;
if (states) {
const state = states[index];
if (state != null) {
return this.clone_required_from_state(state);
}
}
if (this._cloned_state) {
return this.clone_required_from_state(this._cloned_state);
}
return true;
}
private clone_required_from_state(state: InputCloneMode) {
switch (state) {
case InputCloneMode.ALWAYS:
return true;
case InputCloneMode.NEVER:
return false;
case InputCloneMode.FROM_NODE:
return !this._overridden;
}
return TypeAssert.unreachable(state);
}
override_cloned_state(state: boolean) {
this._overridden = state;
this._update_clone_required_state();
}
overriden() {
return this._overridden;
}
private _update_clone_required_state() {
if (this._cloned_states) {
const states: boolean[] = [];
for (let i = 0; i < this._cloned_states.length; i++) {
states[i] = this._get_clone_required_state(i);
}
this._clone_required_states = states;
return;
}
if (this._cloned_state) {
const max_inputs = this.inputs_controller.inputs_count();
const states: boolean[] = [];
for (let i = 0; i < max_inputs; i++) {
states[i] = this._get_clone_required_state(i);
}
this._clone_required_states = states;
return;
}
}
}