mirror of
https://github.com/opentffoundation/opentf.git
synced 2026-01-05 04:00:24 -05:00
Previous to this commit, the Chainable class which is responsible for iterating on the sequence of events in the intro Terraform animation, was using setTimeout and thus could result in very messed up race conditions when triggering physics changes. This commit attaches the .wait timers to the Engine.render loop which should enable everything to stay in sync.
93 lines
1.7 KiB
JavaScript
93 lines
1.7 KiB
JavaScript
(function(){
|
|
|
|
var Chainable = function(engine){
|
|
this.engine = engine;
|
|
this._chain = [];
|
|
this._updateTimer = this._updateTimer.bind(this);
|
|
this._cycle = this._cycle.bind(this);
|
|
};
|
|
|
|
Chainable.prototype._running = false;
|
|
|
|
Chainable.prototype._updateTimer = function(tick){
|
|
this._timer += tick;
|
|
if (this._timer >= this._timerMax) {
|
|
this.resetTimer();
|
|
this._cycle();
|
|
}
|
|
};
|
|
|
|
Chainable.prototype.resetTimer = function(){
|
|
this.engine.updateChainTimer = undefined;
|
|
this._timer = 0;
|
|
this._timerMax = 0;
|
|
return this;
|
|
};
|
|
|
|
Chainable.prototype.start = function(){
|
|
if (this._running || !this._chain.length) {
|
|
return this;
|
|
}
|
|
this._running = true;
|
|
return this._cycle();
|
|
};
|
|
|
|
Chainable.prototype.reset = function(){
|
|
if (!this._running) {
|
|
return this;
|
|
}
|
|
this.resetTimer();
|
|
this._timer = 0;
|
|
this._running = false;
|
|
return this;
|
|
};
|
|
|
|
Chainable.prototype._cycle = function(){
|
|
var current;
|
|
if (!this._chain.length) {
|
|
return this.reset();
|
|
}
|
|
|
|
current = this._chain.shift();
|
|
|
|
if (current.type === 'function') {
|
|
current.func.apply(current.scope, current.args);
|
|
current = null;
|
|
return this._cycle();
|
|
}
|
|
if (current.type === 'wait') {
|
|
this.resetTimer();
|
|
// Convert timer to seconds
|
|
this._timerMax = current.time / 1000;
|
|
this.engine.updateChainTimer = this._updateTimer;
|
|
current = null;
|
|
}
|
|
|
|
return this;
|
|
};
|
|
|
|
Chainable.prototype.then = Chainable.prototype.exec = function(func, scope, args){
|
|
this._chain.push({
|
|
type : 'function',
|
|
|
|
func : func,
|
|
scope : scope || window,
|
|
args : args || []
|
|
});
|
|
|
|
return this.start();
|
|
};
|
|
|
|
Chainable.prototype.wait = function(time){
|
|
this._chain.push({
|
|
type : 'wait',
|
|
time : time
|
|
});
|
|
|
|
return this.start();
|
|
};
|
|
|
|
window.Chainable = Chainable;
|
|
|
|
})();
|