import { debounce } from 'lodash';
import { TIMESPAN_SOON } from './Constant';
var State = /** @class */ (function () {
    function State() {
        var _this = this;
        /** ***************************************************
         *  这是一个特殊设计, 由于动画函数存在链式调用的情况.
         *  比如 动画A->动画B->动画C
         *  动画函数(cAn.trans)
         *  在动画动画开始时将本实例
         *  [isAniming]设置为[true], 而在动画结束时又设置为[false]
         *
         *  恰好, 系统唯一时钟([Clock])会根据本实例的一系列状态进行时钟控制,
         *  在系统配置为允许冻结的情况下, [动画A]结束后将[isAniming]
         *  置为[false], 使得[Clock]自动进入休眠, 进而[停止更新Tween],
         *  进而, [导致动画B不被启动].
         *
         *  为了避免这个尴尬的问题, 遂将[isAniming]访问器做防抖处理
         ******************************************************/
        this._isAniming = false;
        this._setterIsAniming = debounce(function (val) {
            _this._isAniming = val;
        }, TIMESPAN_SOON);
        this._isGroundTransparency = false;
        this._isReplace_Model_ModifyShader = false;
        this._isReplace_Model_CreateAttributesAndProgram = true;
        /** ***************************************************
         * 是否将时钟冻结冻结.
         ******************************************************/
        this.shouldForzen = false;
        /** ***************************************************
         * 冻结是否牢固.
         * 当值为 true 时, 内建时钟发生器完全冻结
         * 当值为 false 是, 内建时钟发生器在有用户主动交互
         *   或动画触发函数被调用时, 暂时解冻
         ******************************************************/
        this.isForzenHard = true;
        /** ***************************************************
         * 是否正处于手动操作模式.
         * 该状态主要用于状态设置和读取.
         ******************************************************/
        this.isOperating = false;
        this.isLoading = false;
    }
    Object.defineProperty(State.prototype, "isAniming", {
        get: function () {
            return this._isAniming;
        },
        set: function (val) {
            this._setterIsAniming(val);
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(State.prototype, "isGroundTransparency", {
        get: function () {
            return this._isGroundTransparency;
        },
        set: function (val) {
            var alpha = 0.5;
            if (typeof val === 'number') {
                alpha = Math.max(0, Math.min(1, val));
            }
            this._isGroundTransparency = !!val;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(State.prototype, "isReplace_Model_ModifyShader", {
        get: function () {
            return this._isReplace_Model_ModifyShader;
        },
        set: function (val) {
            this._isReplace_Model_ModifyShader = val && true;
        },
        enumerable: false,
        configurable: true
    });
    Object.defineProperty(State.prototype, "isReplace_Model_CreateAttributesAndProgram", {
        get: function () {
            return this._isReplace_Model_CreateAttributesAndProgram;
        },
        set: function (val) {
            this._isReplace_Model_CreateAttributesAndProgram = val && true;
        },
        enumerable: false,
        configurable: true
    });
    return State;
}());
export default State;
