simplified autoplayer.
This commit is contained in:
47
autoplayer.js
Normal file
47
autoplayer.js
Normal file
@@ -0,0 +1,47 @@
|
||||
// autoplayer.js
|
||||
|
||||
export class AutoPlayer {
|
||||
constructor(diorama, speed = 1.0) {
|
||||
this.frame = diorama.frame;
|
||||
this.speed = speed;
|
||||
|
||||
this.lastFrameTime = performance.now();
|
||||
this.playheadTime = 0;
|
||||
this.isRunning = true;
|
||||
|
||||
this._loop = this.loop.bind(this);
|
||||
requestAnimationFrame(this._loop);
|
||||
}
|
||||
|
||||
getMaxTime() {
|
||||
const evs = this.frame.world.events;
|
||||
return evs.length > 0 ? evs[evs.length - 1].time : 0;
|
||||
}
|
||||
|
||||
loop(time) {
|
||||
if (!this.isRunning) return;
|
||||
|
||||
const dt = (time - this.lastFrameTime) / 1000;
|
||||
this.lastFrameTime = time;
|
||||
const maxTime = this.getMaxTime();
|
||||
|
||||
// Only animate if there are actually forward events in the timeline
|
||||
if (maxTime > 0) {
|
||||
this.playheadTime += dt * 20 * this.speed;
|
||||
|
||||
// Loop wrap-around
|
||||
if (this.playheadTime >= maxTime) {
|
||||
this.playheadTime = this.playheadTime % maxTime;
|
||||
}
|
||||
|
||||
this.frame.seek(this.playheadTime);
|
||||
}
|
||||
|
||||
requestAnimationFrame(this._loop);
|
||||
}
|
||||
|
||||
// Call this if you ever need to destroy the diorama and stop the memory leak
|
||||
stop() {
|
||||
this.isRunning = false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user