import { __extends } from "tslib";
import { EventEmitter } from 'events';
var Clock = /** @class */ (function (_super) {
    __extends(Clock, _super);
    function Clock(inst) {
        var _this = _super.call(this) || this;
        _this.loop = function (t) {
            if (t === void 0) { t = 0; }
            /** ******************************************
             *  这里是三维组件内部理论上的唯一动画函数调用
             *  系统性的, 称此模块为时钟发生器.
             *  设计上, 不允许其他地方再自行建立时钟. 所有时钟
             * 需求均通过订阅本模块的事件触发. 以便于实现统一的
             * 时钟控制. 例如
             *    a. 业务系统驱动控制三维组件的渲染开关.
             *    b. 交互式控制渲染速率(帧率)上限
             *
             *
             *  牢固冻结时, 用户事件不响应, 且不自主更新.
             *
             *  非牢固冻结, 响应用户事件, 但不自主更新.
             *********************************************/
            var cSta = _this._instance.getInstanceStateControl();
            var state = cSta.state;
            cSta.state.isOperating;
            if (state.shouldForzen === false) {
                /** *************
                 *  非冻结
                 ****************/
                _this.emit('tick', t);
            }
            else if (state.shouldForzen === true && state.isForzenHard === true) {
                /** *************
                 *  冻结, 且牢固模式
                 ****************/
                // do nothing.
            }
            else if (state.shouldForzen === true &&
                state.isForzenHard === false &&
                state.isOperating == true) {
                /** **************************
                 *  冻结, 不牢固, 且操作中
                 *****************************/
                _this.emit('tick', t);
            }
            else if (state.shouldForzen === true &&
                state.isForzenHard === false &&
                state.isAniming == true) {
                /** **************************
                 *  冻结, 不牢固, 且动画中
                 *****************************/
                _this.emit('tick', t);
            }
            requestAnimationFrame(_this.loop);
        };
        _this._instance = inst;
        _this.loop();
        return _this;
    }
    return Clock;
}(EventEmitter));
export default Clock;
