| Clazz.declarePackage ("J.thread"); | |
| Clazz.load (["J.thread.JmolThread"], "J.thread.AnimationThread", ["JU.Logger"], function () { | |
| c$ = Clazz.decorateAsClass (function () { | |
| this.am = null; | |
| this.framePointer1 = 0; | |
| this.framePointer2 = 0; | |
| this.intThread = 0; | |
| this.isFirst = false; | |
| Clazz.instantialize (this, arguments); | |
| }, J.thread, "AnimationThread", J.thread.JmolThread); | |
| Clazz.overrideMethod (c$, "setManager", | |
| function (manager, vwr, params) { | |
| var options = params; | |
| this.framePointer1 = options[0]; | |
| this.framePointer2 = options[1]; | |
| this.intThread = options[2]; | |
| this.am = manager; | |
| this.setViewer (vwr, "AnimationThread"); | |
| vwr.startHoverWatcher (false); | |
| return 0; | |
| }, "~O,JV.Viewer,~O"); | |
| Clazz.defineMethod (c$, "interrupt", | |
| function () { | |
| if (this.stopped) return; | |
| this.stopped = true; | |
| if (JU.Logger.debugging) JU.Logger.debug ("animation thread interrupted!"); | |
| try { | |
| this.am.setAnimationOn (false); | |
| } catch (e) { | |
| if (Clazz.exceptionOf (e, Exception)) { | |
| } else { | |
| throw e; | |
| } | |
| } | |
| Clazz.superCall (this, J.thread.AnimationThread, "interrupt", []); | |
| }); | |
| Clazz.overrideMethod (c$, "run1", | |
| function (mode) { | |
| while (true) { | |
| switch (mode) { | |
| case -1: | |
| if (JU.Logger.debugging) JU.Logger.debug ("animation thread " + this.intThread + " running"); | |
| this.vwr.requestRepaintAndWait ("animationThread"); | |
| this.vwr.startHoverWatcher (false); | |
| this.haveReference = true; | |
| this.isFirst = true; | |
| mode = 0; | |
| break; | |
| case 0: | |
| if (!this.am.animationOn || this.checkInterrupted (this.am.animationThread)) { | |
| mode = -2; | |
| break; | |
| }if (this.am.currentFrameIs (this.framePointer1)) { | |
| this.targetTime += this.am.firstFrameDelayMs; | |
| this.sleepTime = (this.targetTime - (System.currentTimeMillis () - this.startTime)); | |
| if (!this.runSleep (this.sleepTime, 1)) return; | |
| }mode = 1; | |
| break; | |
| case 1: | |
| if (this.am.currentFrameIs (this.framePointer2)) { | |
| this.targetTime += this.am.lastFrameDelayMs; | |
| this.sleepTime = (this.targetTime - (System.currentTimeMillis () - this.startTime)); | |
| if (!this.runSleep (this.sleepTime, 2)) return; | |
| }mode = 2; | |
| break; | |
| case 2: | |
| if (!this.isFirst && this.am.currentIsLast () && !this.am.setAnimationNext ()) { | |
| mode = -2; | |
| break; | |
| }this.isFirst = false; | |
| this.targetTime += Clazz.floatToInt ((1000 / this.am.animationFps) + this.vwr.ms.getFrameDelayMs (this.am.cmi)); | |
| mode = 3; | |
| break; | |
| case 3: | |
| while (this.am.animationOn && !this.checkInterrupted (this.am.animationThread) && !this.vwr.getRefreshing ()) { | |
| if (!this.runSleep (10, 3)) return; | |
| } | |
| if (!this.vwr.tm.spinOn) this.vwr.refresh (1, "animationThread"); | |
| this.sleepTime = (this.targetTime - (System.currentTimeMillis () - this.startTime)); | |
| if (!this.runSleep (this.sleepTime, 0)) return; | |
| mode = 0; | |
| break; | |
| case -2: | |
| if (JU.Logger.debugging) JU.Logger.debug ("animation thread " + this.intThread + " exiting"); | |
| this.am.stopThread (false); | |
| return; | |
| } | |
| } | |
| }, "~N"); | |
| }); | |