| Clazz.declarePackage ("J.thread"); | |
| Clazz.load (["J.thread.JmolThread"], "J.thread.MoveToThread", ["java.lang.Float", "JU.A4", "$.M3", "$.P3", "$.V3"], function () { | |
| c$ = Clazz.decorateAsClass (function () { | |
| this.isMove = false; | |
| this.aaStepCenter = null; | |
| this.aaStepNavCenter = null; | |
| this.aaStep = null; | |
| this.aaTotal = null; | |
| this.matrixStart = null; | |
| this.matrixStartInv = null; | |
| this.matrixStep = null; | |
| this.matrixEnd = null; | |
| this.center = null; | |
| this.navCenter = null; | |
| this.ptMoveToCenter = null; | |
| this.zoom = null; | |
| this.xTrans = null; | |
| this.yTrans = null; | |
| this.xNav = null; | |
| this.yNav = null; | |
| this.navDepth = null; | |
| this.cameraDepth = null; | |
| this.cameraX = null; | |
| this.cameraY = null; | |
| this.rotationRadius = null; | |
| this.pixelScale = null; | |
| this.fps = 0; | |
| this.frameTimeMillis = 0; | |
| this.doEndMove = false; | |
| this.fStep = 0; | |
| this.transformManager = null; | |
| this.floatSecondsTotal = 0; | |
| this.totalSteps = 0; | |
| this.iStep = 0; | |
| this.timePerStep = 0; | |
| this.radiansXStep = 0; | |
| this.radiansYStep = 0; | |
| this.radiansZStep = 0; | |
| this.dRot = null; | |
| this.dTrans = null; | |
| this.dZoom = 0; | |
| this.dSlab = 0; | |
| this.zoomPercent0 = 0; | |
| this.slab = 0; | |
| this.transX = 0; | |
| this.transY = 0; | |
| if (!Clazz.isClassDefined ("J.thread.MoveToThread.Slider")) { | |
| J.thread.MoveToThread.$MoveToThread$Slider$ (); | |
| } | |
| Clazz.instantialize (this, arguments); | |
| }, J.thread, "MoveToThread", J.thread.JmolThread); | |
| Clazz.makeConstructor (c$, | |
| function () { | |
| this.aaStepCenter = new JU.V3 (); | |
| this.aaStepNavCenter = new JU.V3 (); | |
| this.aaStep = new JU.A4 (); | |
| this.aaTotal = new JU.A4 (); | |
| this.matrixStart = new JU.M3 (); | |
| this.matrixStartInv = new JU.M3 (); | |
| this.matrixStep = new JU.M3 (); | |
| this.matrixEnd = new JU.M3 (); | |
| }); | |
| Clazz.overrideMethod (c$, "setManager", | |
| function (manager, vwr, params) { | |
| var options = params; | |
| this.isMove = (Clazz.instanceOf (options[0], JU.V3)); | |
| this.setViewer (vwr, (this.isMove ? "moveThread" : "MoveToThread")); | |
| this.transformManager = manager; | |
| return (this.isMove ? this.setManagerMove (options) : this.setManagerMoveTo (options)); | |
| }, "~O,JV.Viewer,~O"); | |
| Clazz.overrideMethod (c$, "run1", | |
| function (mode) { | |
| if (this.isMove) this.run1Move (mode); | |
| else this.run1MoveTo (mode); | |
| }, "~N"); | |
| Clazz.defineMethod (c$, "interrupt", | |
| function () { | |
| this.doEndMove = false; | |
| Clazz.superCall (this, J.thread.MoveToThread, "interrupt", []); | |
| }); | |
| Clazz.defineMethod (c$, "setManagerMove", | |
| function (options) { | |
| this.dRot = options[0]; | |
| this.dTrans = options[1]; | |
| var f = options[2]; | |
| this.dZoom = f[0]; | |
| this.dSlab = f[1]; | |
| this.floatSecondsTotal = f[2]; | |
| var fps = Clazz.floatToInt (f[3]); | |
| this.slab = this.transformManager.getSlabPercentSetting (); | |
| this.transX = this.transformManager.getTranslationXPercent (); | |
| this.transY = this.transformManager.getTranslationYPercent (); | |
| this.timePerStep = Clazz.doubleToInt (1000 / fps); | |
| this.totalSteps = Clazz.floatToInt (fps * this.floatSecondsTotal); | |
| if (this.totalSteps <= 0) this.totalSteps = 1; | |
| var radiansPerDegreePerStep = (1 / 57.29577951308232 / this.totalSteps); | |
| this.radiansXStep = radiansPerDegreePerStep * this.dRot.x; | |
| this.radiansYStep = radiansPerDegreePerStep * this.dRot.y; | |
| this.radiansZStep = radiansPerDegreePerStep * this.dRot.z; | |
| this.zoomPercent0 = this.transformManager.zmPct; | |
| this.iStep = 0; | |
| return this.totalSteps; | |
| }, "~A"); | |
| Clazz.defineMethod (c$, "setManagerMoveTo", | |
| function (options) { | |
| this.center = options[0]; | |
| this.matrixEnd.setM3 (options[1]); | |
| var f = options[3]; | |
| this.ptMoveToCenter = (this.center == null ? this.transformManager.fixedRotationCenter : this.center); | |
| this.floatSecondsTotal = f[0]; | |
| this.zoom = this.newSlider (this.transformManager.zmPct, f[1]); | |
| this.xTrans = this.newSlider (this.transformManager.getTranslationXPercent (), f[2]); | |
| this.yTrans = this.newSlider (this.transformManager.getTranslationYPercent (), f[3]); | |
| this.rotationRadius = this.newSlider (this.transformManager.modelRadius, (this.center == null || Float.isNaN (f[4]) ? this.transformManager.modelRadius : f[4] <= 0 ? this.vwr.ms.calcRotationRadius (this.vwr.am.cmi, this.center, false) : f[4])); | |
| this.pixelScale = this.newSlider (this.transformManager.scaleDefaultPixelsPerAngstrom, f[5]); | |
| if (f[6] != 0) { | |
| this.navCenter = options[2]; | |
| this.navDepth = this.newSlider (this.transformManager.navigationDepthPercent, f[6]); | |
| this.xNav = this.newSlider (this.transformManager.getNavigationOffsetPercent ('X'), f[7]); | |
| this.yNav = this.newSlider (this.transformManager.getNavigationOffsetPercent ('Y'), f[8]); | |
| }this.cameraDepth = this.newSlider (this.transformManager.getCameraDepth (), f[9]); | |
| this.cameraX = this.newSlider (this.transformManager.camera.x, f[10]); | |
| this.cameraY = this.newSlider (this.transformManager.camera.y, f[11]); | |
| this.transformManager.getRotation (this.matrixStart); | |
| this.matrixStartInv.invertM (this.matrixStart); | |
| this.matrixStep.mul2 (this.matrixEnd, this.matrixStartInv); | |
| this.aaTotal.setM (this.matrixStep); | |
| this.fps = 30; | |
| this.totalSteps = Clazz.floatToInt (this.floatSecondsTotal * this.fps); | |
| this.frameTimeMillis = Clazz.doubleToInt (1000 / this.fps); | |
| this.targetTime = System.currentTimeMillis (); | |
| this.aaStepCenter.sub2 (this.ptMoveToCenter, this.transformManager.fixedRotationCenter); | |
| this.aaStepCenter.scale (1 / this.totalSteps); | |
| if (this.navCenter != null && this.transformManager.mode == 1) { | |
| this.aaStepNavCenter.sub2 (this.navCenter, this.transformManager.navigationCenter); | |
| this.aaStepNavCenter.scale (1 / this.totalSteps); | |
| }this.iStep = 0; | |
| return this.totalSteps; | |
| }, "~A"); | |
| Clazz.defineMethod (c$, "newSlider", | |
| function (start, value) { | |
| return (Float.isNaN (value) || value == 3.4028235E38 ? null : Clazz.innerTypeInstance (J.thread.MoveToThread.Slider, this, null, start, value)); | |
| }, "~N,~N"); | |
| Clazz.defineMethod (c$, "run1Move", | |
| function (mode) { | |
| while (true) switch (mode) { | |
| case -1: | |
| if (this.floatSecondsTotal > 0) this.vwr.setInMotion (true); | |
| mode = 0; | |
| break; | |
| case 0: | |
| if (this.stopped || this.iStep >= this.totalSteps) { | |
| mode = -2; | |
| break; | |
| }this.iStep++; | |
| if (this.dRot.x != 0) this.transformManager.rotateXRadians (this.radiansXStep, null); | |
| if (this.dRot.y != 0) this.transformManager.rotateYRadians (this.radiansYStep, null); | |
| if (this.dRot.z != 0) this.transformManager.rotateZRadians (this.radiansZStep); | |
| if (this.dZoom != 0) this.transformManager.zoomToPercent (this.zoomPercent0 + this.dZoom * this.iStep / this.totalSteps); | |
| if (this.dTrans.x != 0) this.transformManager.translateToPercent ('x', this.transX + this.dTrans.x * this.iStep / this.totalSteps); | |
| if (this.dTrans.y != 0) this.transformManager.translateToPercent ('y', this.transY + this.dTrans.y * this.iStep / this.totalSteps); | |
| if (this.dTrans.z != 0) this.transformManager.translateToPercent ('z', this.dTrans.z * this.iStep / this.totalSteps); | |
| if (this.dSlab != 0) this.transformManager.slabToPercent (Clazz.doubleToInt (Math.floor (this.slab + this.dSlab * this.iStep / this.totalSteps))); | |
| if (this.iStep == this.totalSteps) { | |
| mode = -2; | |
| break; | |
| }var timeSpent = (System.currentTimeMillis () - this.startTime); | |
| var timeAllowed = this.iStep * this.timePerStep; | |
| if (timeSpent < timeAllowed) { | |
| this.vwr.requestRepaintAndWait ("moveThread"); | |
| if (!this.isJS && !this.vwr.isScriptExecuting ()) { | |
| mode = -2; | |
| break; | |
| }timeSpent = (System.currentTimeMillis () - this.startTime); | |
| this.sleepTime = timeAllowed - timeSpent; | |
| if (!this.runSleep (this.sleepTime, 0)) return; | |
| }break; | |
| case -2: | |
| if (this.floatSecondsTotal > 0) this.vwr.setInMotion (false); | |
| this.resumeEval (); | |
| return; | |
| } | |
| }, "~N"); | |
| Clazz.defineMethod (c$, "run1MoveTo", | |
| function (mode) { | |
| while (true) switch (mode) { | |
| case -1: | |
| if (this.totalSteps > 0) this.vwr.setInMotion (true); | |
| mode = 0; | |
| break; | |
| case 0: | |
| if (this.stopped || ++this.iStep >= this.totalSteps) { | |
| mode = -2; | |
| break; | |
| }this.doStepTransform (); | |
| this.doEndMove = true; | |
| this.targetTime += this.frameTimeMillis; | |
| this.currentTime = System.currentTimeMillis (); | |
| var doRender = (this.currentTime < this.targetTime); | |
| if (!doRender && this.isJS) { | |
| this.targetTime = this.currentTime; | |
| doRender = true; | |
| }if (doRender) this.vwr.requestRepaintAndWait ("movetoThread"); | |
| if (this.transformManager.movetoThread == null || !this.transformManager.movetoThread.$name.equals (this.$name) || !this.isJS && this.eval != null && !this.vwr.isScriptExecuting ()) { | |
| this.stopped = true; | |
| break; | |
| }this.currentTime = System.currentTimeMillis (); | |
| var sleepTime = (this.targetTime - this.currentTime); | |
| if (!this.runSleep (sleepTime, 0)) return; | |
| mode = 0; | |
| break; | |
| case -2: | |
| if (this.totalSteps <= 0 || this.doEndMove && !this.stopped) this.doFinalTransform (); | |
| if (this.totalSteps > 0) this.vwr.setInMotion (false); | |
| this.vwr.moveUpdate (this.floatSecondsTotal); | |
| if (this.transformManager.movetoThread != null && !this.stopped) { | |
| this.transformManager.movetoThread = null; | |
| this.vwr.finalizeTransformParameters (); | |
| }this.resumeEval (); | |
| return; | |
| } | |
| }, "~N"); | |
| Clazz.defineMethod (c$, "doStepTransform", | |
| function () { | |
| if (!Float.isNaN (this.matrixEnd.m00)) { | |
| this.transformManager.getRotation (this.matrixStart); | |
| this.matrixStartInv.invertM (this.matrixStart); | |
| this.matrixStep.mul2 (this.matrixEnd, this.matrixStartInv); | |
| this.aaTotal.setM (this.matrixStep); | |
| this.aaStep.setAA (this.aaTotal); | |
| this.aaStep.angle /= (this.totalSteps - this.iStep); | |
| if (this.aaStep.angle == 0) this.matrixStep.setScale (1); | |
| else this.matrixStep.setAA (this.aaStep); | |
| this.matrixStep.mul (this.matrixStart); | |
| }this.fStep = this.iStep / (this.totalSteps - 1); | |
| if (this.center != null) this.transformManager.fixedRotationCenter.add (this.aaStepCenter); | |
| if (this.navCenter != null && this.transformManager.mode == 1) { | |
| var pt = JU.P3.newP (this.transformManager.navigationCenter); | |
| pt.add (this.aaStepNavCenter); | |
| this.transformManager.setNavigatePt (pt); | |
| }this.setValues (this.matrixStep, null, null); | |
| }); | |
| Clazz.defineMethod (c$, "doFinalTransform", | |
| function () { | |
| this.fStep = -1; | |
| this.setValues (this.matrixEnd, this.center, this.navCenter); | |
| }); | |
| Clazz.defineMethod (c$, "setValues", | |
| function (m, center, navCenter) { | |
| this.transformManager.setAll (center, m, navCenter, this.getVal (this.zoom), this.getVal (this.xTrans), this.getVal (this.yTrans), this.getVal (this.rotationRadius), this.getVal (this.pixelScale), this.getVal (this.navDepth), this.getVal (this.xNav), this.getVal (this.yNav), this.getVal (this.cameraDepth), this.getVal (this.cameraX), this.getVal (this.cameraY)); | |
| }, "JU.M3,JU.P3,JU.P3"); | |
| Clazz.defineMethod (c$, "getVal", | |
| function (s) { | |
| return (s == null ? NaN : s.getVal (this.fStep)); | |
| }, "J.thread.MoveToThread.Slider"); | |
| c$.$MoveToThread$Slider$ = function () { | |
| Clazz.pu$h(self.c$); | |
| c$ = Clazz.decorateAsClass (function () { | |
| Clazz.prepareCallback (this, arguments); | |
| this.start = 0; | |
| this.delta = 0; | |
| this.value = 0; | |
| Clazz.instantialize (this, arguments); | |
| }, J.thread.MoveToThread, "Slider"); | |
| Clazz.makeConstructor (c$, | |
| function (a, b) { | |
| this.start = a; | |
| this.value = b; | |
| this.delta = b - a; | |
| }, "~N,~N"); | |
| Clazz.defineMethod (c$, "getVal", | |
| function (a) { | |
| return (a < 0 ? this.value : this.start + a * this.delta); | |
| }, "~N"); | |
| c$ = Clazz.p0p (); | |
| }; | |
| }); | |