@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
89 lines (88 loc) • 2.45 kB
JavaScript
"use strict";
import { InputCloneMode } from "../../../../../engine/poly/InputCloneMode";
import { TypeAssert } from "../../../../../engine/poly/Assert";
import { isArray } from "../../../../../core/Type";
export class ClonedStatesController {
constructor(inputs_controller) {
this.inputs_controller = inputs_controller;
this._clone_required_states = [];
this._overridden = false;
}
initInputsClonedState(states) {
if (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) {
return this._clone_required_states[index];
}
clone_required_states() {
return this._clone_required_states;
}
_get_clone_required_state(index) {
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;
}
clone_required_from_state(state) {
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) {
this._overridden = state;
this._update_clone_required_state();
}
overriden() {
return this._overridden;
}
_update_clone_required_state() {
if (this._cloned_states) {
const states = [];
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.inputsCount();
const states = [];
for (let i = 0; i < max_inputs; i++) {
states[i] = this._get_clone_required_state(i);
}
this._clone_required_states = states;
return;
}
}
}