| Clazz.declarePackage ("J.thread"); | |
| Clazz.load (["J.thread.JmolThread"], "J.thread.SpinThread", ["JU.Logger"], function () { | |
| c$ = Clazz.decorateAsClass (function () { | |
| this.transformManager = null; | |
| this.endDegrees = 0; | |
| this.endPositions = null; | |
| this.dihedralList = null; | |
| this.nDegrees = 0; | |
| this.bsAtoms = null; | |
| this.isNav = false; | |
| this.isGesture = false; | |
| this.myFps = 0; | |
| this.angle = 0; | |
| this.haveNotified = false; | |
| this.index = 0; | |
| this.bsBranches = null; | |
| this.isDone = false; | |
| this.m4 = null; | |
| Clazz.instantialize (this, arguments); | |
| }, J.thread, "SpinThread", J.thread.JmolThread); | |
| Clazz.overrideMethod (c$, "setManager", | |
| function (manager, vwr, params) { | |
| this.transformManager = manager; | |
| this.setViewer (vwr, "SpinThread"); | |
| var options = params; | |
| if (options == null) { | |
| this.isNav = true; | |
| } else { | |
| this.endDegrees = (options[0]).floatValue (); | |
| this.endPositions = options[1]; | |
| this.dihedralList = options[2]; | |
| if (this.dihedralList != null) this.bsBranches = vwr.ms.getBsBranches (this.dihedralList); | |
| this.bsAtoms = options[3]; | |
| this.isGesture = (options[4] != null); | |
| }return 0; | |
| }, "~O,JV.Viewer,~O"); | |
| Clazz.overrideMethod (c$, "run1", | |
| function (mode) { | |
| while (true) switch (mode) { | |
| case -1: | |
| this.myFps = (this.isNav ? this.transformManager.navFps : this.transformManager.spinFps); | |
| this.vwr.g.setB (this.isNav ? "_navigating" : "_spinning", true); | |
| this.haveReference = true; | |
| this.vwr.startHoverWatcher (false); | |
| mode = 0; | |
| break; | |
| case 0: | |
| if (this.isReset || this.checkInterrupted (this.transformManager.spinThread)) { | |
| mode = -2; | |
| break; | |
| }if (this.isNav && this.myFps != this.transformManager.navFps) { | |
| this.myFps = this.transformManager.navFps; | |
| this.index = 0; | |
| this.startTime = System.currentTimeMillis (); | |
| } else if (!this.isNav && this.myFps != this.transformManager.spinFps && this.bsAtoms == null) { | |
| this.myFps = this.transformManager.spinFps; | |
| this.index = 0; | |
| this.startTime = System.currentTimeMillis (); | |
| }if (this.myFps == 0 || !(this.isNav ? this.transformManager.navOn : this.transformManager.spinOn)) { | |
| mode = -2; | |
| break; | |
| }var refreshNeeded = (this.endDegrees >= 1e10 ? true : this.isNav ? this.transformManager.navX != 0 || this.transformManager.navY != 0 || this.transformManager.navZ != 0 : this.transformManager.isSpinInternal && this.transformManager.internalRotationAxis.angle != 0 || this.transformManager.isSpinFixed && this.transformManager.fixedRotationAxis.angle != 0 || !this.transformManager.isSpinFixed && !this.transformManager.isSpinInternal && (this.transformManager.spinX != 0 || this.transformManager.spinY != 0 || this.transformManager.spinZ != 0)); | |
| this.targetTime = Clazz.floatToLong (++this.index * 1000 / this.myFps); | |
| this.currentTime = System.currentTimeMillis () - this.startTime; | |
| this.sleepTime = (this.targetTime - this.currentTime); | |
| if (this.sleepTime < 0) { | |
| if (!this.haveNotified) JU.Logger.info ("spinFPS is set too fast (" + this.myFps + ") -- can't keep up!"); | |
| this.haveNotified = true; | |
| this.startTime -= this.sleepTime; | |
| this.sleepTime = 0; | |
| }var isInMotion = (this.bsAtoms == null && this.vwr.getInMotion (false)); | |
| if (isInMotion) { | |
| if (this.isGesture) { | |
| mode = -2; | |
| break; | |
| }this.sleepTime += 1000; | |
| }if (refreshNeeded && !isInMotion && (this.transformManager.spinOn || this.transformManager.navOn)) this.doTransform (); | |
| mode = 1; | |
| break; | |
| case 1: | |
| while (!this.checkInterrupted (this.transformManager.spinThread) && !this.vwr.getRefreshing ()) if (!this.runSleep (10, 1)) return; | |
| if (this.bsAtoms != null || this.vwr.g.waitForMoveTo && this.endDegrees != 3.4028235E38) this.vwr.requestRepaintAndWait ("spin thread"); | |
| else this.vwr.refresh (1, "SpinThread"); | |
| if (this.endDegrees >= 1e10 ? this.nDegrees / this.endDegrees > 0.99 : !this.isNav && this.endDegrees >= 0 ? this.nDegrees >= this.endDegrees - 0.001 : -this.nDegrees <= this.endDegrees + 0.001) { | |
| this.isDone = true; | |
| this.transformManager.setSpinOff (); | |
| }if (!this.runSleep (this.sleepTime, 0)) return; | |
| mode = 0; | |
| break; | |
| case -2: | |
| if (this.dihedralList != null) { | |
| this.vwr.setDihedrals (this.dihedralList, this.bsBranches, 0); | |
| } else if (this.bsAtoms != null && this.endPositions != null) { | |
| this.vwr.setAtomCoords (this.bsAtoms, 1145047050, this.endPositions); | |
| this.bsAtoms = null; | |
| this.endPositions = null; | |
| }if (!this.isReset) { | |
| this.transformManager.setSpinOff (); | |
| this.vwr.startHoverWatcher (true); | |
| }this.stopped = !this.isDone; | |
| this.resumeEval (); | |
| this.stopped = true; | |
| return; | |
| } | |
| }, "~N"); | |
| Clazz.defineMethod (c$, "doTransform", | |
| function () { | |
| if (this.dihedralList != null) { | |
| var f = 1 / this.myFps / this.endDegrees; | |
| this.vwr.setDihedrals (this.dihedralList, this.bsBranches, f); | |
| this.nDegrees += 1 / this.myFps; | |
| } else if (this.isNav) { | |
| this.transformManager.setNavigationOffsetRelative (); | |
| } else if (this.transformManager.isSpinInternal || this.transformManager.isSpinFixed) { | |
| this.angle = (this.transformManager.isSpinInternal ? this.transformManager.internalRotationAxis : this.transformManager.fixedRotationAxis).angle / this.myFps; | |
| if (this.transformManager.isSpinInternal) { | |
| this.transformManager.rotateAxisAngleRadiansInternal (this.angle, this.bsAtoms, this.m4); | |
| } else { | |
| this.transformManager.rotateAxisAngleRadiansFixed (this.angle, this.bsAtoms); | |
| }this.nDegrees += Math.abs (this.angle * 57.29577951308232); | |
| } else { | |
| if (this.transformManager.spinX != 0) { | |
| this.transformManager.rotateXRadians (this.transformManager.spinX * 0.017453292 / this.myFps, null); | |
| }if (this.transformManager.spinY != 0) { | |
| this.transformManager.rotateYRadians (this.transformManager.spinY * 0.017453292 / this.myFps, null); | |
| }if (this.transformManager.spinZ != 0) { | |
| this.transformManager.rotateZRadians (this.transformManager.spinZ * 0.017453292 / this.myFps); | |
| }}}); | |
| }); | |