Revision: 18577
          http://sourceforge.net/p/jmol/code/18577
Author:   hansonr
Date:     2013-08-16 15:01:49 +0000 (Fri, 16 Aug 2013)
Log Message:
-----------
___JmolVersion="13.3.4_dev_2013.08.16"

NEW FEATURE: set platformSpeed [0 to 10]  (includes wireframeRotation along 
with cartoons and surfaces)

Modified Paths:
--------------
    trunk/Jmol/src/org/jmol/g3d/Graphics3D.java
    trunk/Jmol/src/org/jmol/render/BallsRenderer.java
    trunk/Jmol/src/org/jmol/render/MeshRenderer.java
    trunk/Jmol/src/org/jmol/render/SticksRenderer.java
    trunk/Jmol/src/org/jmol/renderbio/BioShapeRenderer.java
    trunk/Jmol/src/org/jmol/renderbio/MeshRibbonRenderer.java
    trunk/Jmol/src/org/jmol/renderbio/RibbonsRenderer.java
    trunk/Jmol/src/org/jmol/renderspecial/EllipsoidsRenderer.java
    trunk/Jmol/src/org/jmol/renderspecial/GeoSurfaceRenderer.java
    trunk/Jmol/src/org/jmol/script/T.java
    trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java
    trunk/Jmol/src/org/jmol/util/GData.java
    trunk/Jmol/src/org/jmol/viewer/Jmol.properties
    trunk/Jmol/src/org/jmol/viewer/StateManager.java
    trunk/Jmol/src/org/jmol/viewer/Viewer.java

Modified: trunk/Jmol/src/org/jmol/g3d/Graphics3D.java
===================================================================
--- trunk/Jmol/src/org/jmol/g3d/Graphics3D.java 2013-08-15 15:23:51 UTC (rev 
18576)
+++ trunk/Jmol/src/org/jmol/g3d/Graphics3D.java 2013-08-16 15:01:49 UTC (rev 
18577)
@@ -203,6 +203,7 @@
   protected int[] zbuf;
   protected int[] zbufT;
   protected int translucencyMask;
+  private boolean renderLow;
 
   //int clipX;
   //int clipY;
@@ -259,9 +260,10 @@
   }
   
   @Override
-  public void beginRendering(Matrix3f rotationMatrix, boolean translucentMode, 
boolean isImageWrite) {
+  public void beginRendering(Matrix3f rotationMatrix, boolean translucentMode, 
boolean isImageWrite, boolean renderLow) {
     if (currentlyRendering)
       endRendering();
+    this.renderLow = renderLow;
     if (windowWidth != newWindowWidth || windowHeight != newWindowHeight
         || newAntialiasing != isFullSceneAntialiasingEnabled) {
       windowWidth = newWindowWidth;
@@ -611,7 +613,9 @@
     int mask = colix & C.TRANSLUCENT_MASK;
     if (mask == C.TRANSPARENT)
       return false;
-    boolean isTranslucent = mask != 0;
+    if (renderLow)
+      mask = 0;
+    boolean isTranslucent = (mask != 0);
     isScreened = isTranslucent && mask == C.TRANSLUCENT_SCREENED;
     if (!checkTranslucent(isTranslucent && !isScreened))
       return false;

Modified: trunk/Jmol/src/org/jmol/render/BallsRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/render/BallsRenderer.java   2013-08-15 15:23:51 UTC 
(rev 18576)
+++ trunk/Jmol/src/org/jmol/render/BallsRenderer.java   2013-08-16 15:01:49 UTC 
(rev 18577)
@@ -37,7 +37,7 @@
   @Override
   protected boolean render() {
     boolean needTranslucent = false;
-    if (!viewer.getBoolean(T.wireframerotation) || !viewer.getInMotion(true)) {
+    if (isExport || viewer.checkMotionRendering(T.balls)) {
       Atom[] atoms = modelSet.atoms;
       short[] colixes = ((Balls) shape).colixes;
       BS bsOK = viewer.getRenderableBitSet();

Modified: trunk/Jmol/src/org/jmol/render/MeshRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/render/MeshRenderer.java    2013-08-15 15:23:51 UTC 
(rev 18576)
+++ trunk/Jmol/src/org/jmol/render/MeshRenderer.java    2013-08-16 15:01:49 UTC 
(rev 18577)
@@ -135,7 +135,7 @@
   protected boolean volumeRender;
   protected BS bsPolygons;
   protected boolean isTranslucentInherit;
-  protected boolean wireframeOnly;  
+  protected boolean renderLow;  
   
   private boolean setVariables() {
     if (mesh.visibilityFlags == 0)
@@ -171,8 +171,8 @@
       bsPolygons = (isGhostPass ? mesh.bsSlabGhost
           : selectedPolyOnly ? mesh.bsSlabDisplay : null);
       
-      wireframeOnly = (!isExport && viewer.getBoolean(T.wireframerotation) && 
viewer.getInMotion(true));
-      frontOnly = wireframeOnly || !viewer.getSlabEnabled() && mesh.frontOnly
+      renderLow = (!isExport && !viewer.checkMotionRendering(T.mesh));
+      frontOnly = renderLow || !viewer.getSlabEnabled() && mesh.frontOnly
           && !mesh.isTwoSided && !selectedPolyOnly;
       screens = viewer.allocTempScreens(vertexCount);
       if (frontOnly)
@@ -215,11 +215,11 @@
   protected void render2b(boolean generateSet) {
     if (!g3d.setColix(isGhostPass ? mesh.slabColix : colix))
       return;
-    if (mesh.showPoints || mesh.polygonCount == 0)
+    if (renderLow || mesh.showPoints || mesh.polygonCount == 0)
       renderPoints(); 
-    if (wireframeOnly || (isGhostPass ? mesh.slabMeshType == T.mesh : 
mesh.drawTriangles))
+    if (!renderLow && (isGhostPass ? mesh.slabMeshType == T.mesh : 
mesh.drawTriangles))
       renderTriangles(false, mesh.showTriangles, false);
-    if (!wireframeOnly && (isGhostPass ? mesh.slabMeshType == T.fill : 
mesh.fillTriangles))
+    if (!renderLow && (isGhostPass ? mesh.slabMeshType == T.fill : 
mesh.fillTriangles))
       renderTriangles(true, mesh.showTriangles, generateSet);
   }
 
@@ -242,7 +242,13 @@
           if (bsPoints.get(pt))
             continue;
           bsPoints.set(pt);
-          g3d.fillSphereI(4, screens[pt]);
+
+          if (renderLow) {
+            P3i s = screens[pt];
+            g3d.drawPixel(s.x, s.y, s.z);
+          } else {
+            g3d.fillSphereI(4, screens[pt]);
+          }
         }
       }
       return;
@@ -365,7 +371,7 @@
   protected void drawTriangle(P3i screenA, short colixA, P3i screenB,
                               short colixB, P3i screenC, short colixC,
                               int check, int diam) {
-    if (wireframeOnly || !antialias && diam == 1) {
+    if (!antialias && diam == 1) {
       g3d.drawTriangle3C(screenA, colixA, screenB, colixB, screenC, colixC,
           check);
       return;

Modified: trunk/Jmol/src/org/jmol/render/SticksRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/render/SticksRenderer.java  2013-08-15 15:23:51 UTC 
(rev 18576)
+++ trunk/Jmol/src/org/jmol/render/SticksRenderer.java  2013-08-16 15:01:49 UTC 
(rev 18577)
@@ -60,7 +60,7 @@
   private int dx, dy;
   private int mag2d;
   private int bondOrder;
-  private boolean renderWireframe;
+  private boolean wireframeOnly;
   private boolean isAntialiased;
   private boolean slabbing;
   private boolean slabByAtom;
@@ -95,8 +95,7 @@
         && modeMultipleBond != JC.MULTIBOND_NEVER
         && viewer.getBoolean(T.showmultiplebonds));
 
-    renderWireframe = viewer.getInMotion(true)
-        && viewer.getBoolean(T.wireframerotation);
+    wireframeOnly = !viewer.checkMotionRendering(T.bonds);
     ssbondsBackbone = viewer.getBoolean(T.ssbondsbackbone);
     hbondsBackbone = viewer.getBoolean(T.hbondsbackbone);
     bondsBackbone = hbondsBackbone | ssbondsBackbone;
@@ -250,7 +249,7 @@
     dx = xB - xA;
     dy = yB - yA;
     width = (int) viewer.scaleToScreen((zA + zB) / 2, mad);
-    if (renderWireframe && width > 0)
+    if (wireframeOnly && width > 0)
       width = 1;
     if (!isCartesianExport) {
       asLineOnly = (width <= 1);

Modified: trunk/Jmol/src/org/jmol/renderbio/BioShapeRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/renderbio/BioShapeRenderer.java     2013-08-15 
15:23:51 UTC (rev 18576)
+++ trunk/Jmol/src/org/jmol/renderbio/BioShapeRenderer.java     2013-08-16 
15:01:49 UTC (rev 18577)
@@ -108,7 +108,7 @@
     isPass2 = g3d.isPass2();
     invalidateMesh = false;
     needTranslucent = false;
-    boolean TF = (!isExport && viewer.getBoolean(T.wireframerotation) && 
viewer.getInMotion(true));
+    boolean TF = (!isExport && !viewer.checkMotionRendering(T.cartoon));
     
     if (TF != wireframeOnly)
       invalidateMesh = true;

Modified: trunk/Jmol/src/org/jmol/renderbio/MeshRibbonRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/renderbio/MeshRibbonRenderer.java   2013-08-15 
15:23:51 UTC (rev 18576)
+++ trunk/Jmol/src/org/jmol/renderbio/MeshRibbonRenderer.java   2013-08-16 
15:01:49 UTC (rev 18577)
@@ -30,7 +30,10 @@
 
   @Override
   protected void renderBioShape(BioShape bioShape) {
-    renderMeshRibbon();
+    if (wireframeOnly)
+      renderStrands();
+    else
+      renderMeshRibbon();
   }
 
   protected void renderMeshRibbon() {

Modified: trunk/Jmol/src/org/jmol/renderbio/RibbonsRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/renderbio/RibbonsRenderer.java      2013-08-15 
15:23:51 UTC (rev 18576)
+++ trunk/Jmol/src/org/jmol/renderbio/RibbonsRenderer.java      2013-08-16 
15:01:49 UTC (rev 18577)
@@ -33,12 +33,9 @@
   protected void renderBioShape(BioShape bioShape) {
     if (wingVectors == null)
       return;
-    if (wireframeOnly) {
-      // renderMeshRibbon();
-      strandCount = 1; 
+    if (wireframeOnly)
       renderStrands();
-      return;
-    }
-    render2Strand(true, isNucleic ? 1f : 0.5f, isNucleic ? 0f : 0.5f);
+    else
+      render2Strand(true, isNucleic ? 1f : 0.5f, isNucleic ? 0f : 0.5f);
   }
 }

Modified: trunk/Jmol/src/org/jmol/renderspecial/EllipsoidsRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/renderspecial/EllipsoidsRenderer.java       
2013-08-15 15:23:51 UTC (rev 18576)
+++ trunk/Jmol/src/org/jmol/renderspecial/EllipsoidsRenderer.java       
2013-08-16 15:01:49 UTC (rev 18577)
@@ -130,7 +130,7 @@
     bGlobals[OPT_BALL] = viewer.getBooleanProperty("ellipsoidBall");
     bGlobals[OPT_DOTS] = viewer.getBooleanProperty("ellipsoidDots");
     bGlobals[OPT_FILL] = viewer.getBooleanProperty("ellipsoidFill");
-    bGlobals[OPT_WIREFRAME] = (viewer.getBoolean(T.wireframerotation) && 
viewer.getInMotion(true));
+    bGlobals[OPT_WIREFRAME] = !isExport && 
!viewer.checkMotionRendering(T.ellipsoid);
     diameter0 = Math.round (((Float) 
viewer.getParameter("ellipsoidAxisDiameter"))
         .floatValue() * 1000);    
     Matrix4f m4 = viewer.getMatrixtransform();

Modified: trunk/Jmol/src/org/jmol/renderspecial/GeoSurfaceRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/renderspecial/GeoSurfaceRenderer.java       
2013-08-15 15:23:51 UTC (rev 18576)
+++ trunk/Jmol/src/org/jmol/renderspecial/GeoSurfaceRenderer.java       
2013-08-16 15:01:49 UTC (rev 18577)
@@ -24,6 +24,7 @@
 
 package org.jmol.renderspecial;
 
+import org.jmol.script.T;
 import org.jmol.shapespecial.GeoSurface;
 import org.jmol.util.BS;
 import org.jmol.util.C;
@@ -45,7 +46,7 @@
   @Override
   protected boolean render() {
     GeoSurface gs = (GeoSurface) shape;
-    iShowSolid = !(viewer.getInMotion(true) && gs.ec.getDotsConvexMax() > 100);
+    iShowSolid = !(!viewer.checkMotionRendering(T.geosurface) && 
gs.ec.getDotsConvexMax() > 100);
     if (!iShowSolid)
       return false;
     if (!g3d.setColix(C.BLACK))

Modified: trunk/Jmol/src/org/jmol/script/T.java
===================================================================
--- trunk/Jmol/src/org/jmol/script/T.java       2013-08-15 15:23:51 UTC (rev 
18576)
+++ trunk/Jmol/src/org/jmol/script/T.java       2013-08-16 15:01:49 UTC (rev 
18577)
@@ -903,7 +903,8 @@
   public final static int percentvdwatom                 = intparam | 26;
   public final static int perspectivemodel               = intparam | 27;
   public final static int phongexponent                  = intparam | 28;
-  public final static int pickingspinrate                = intparam | 30;
+  public final static int pickingspinrate                = intparam | 29;
+  public final static int platformspeed                  = intparam | 30;
   public final static int propertyatomnumberfield        = intparam | 31;
   public final static int propertyatomnumbercolumncount  = intparam | 32;
   public final static int propertydatacolumncount        = intparam | 34;
@@ -2223,6 +2224,7 @@
       "picking",                                  T.t(picking),
       "pickingStyle",                             T.t(pickingstyle),
       "pickLabel",                                T.t(picklabel),
+      "platformSpeed",                            T.t(platformspeed),
       "propertyColorScheme",                      T.t(propertycolorscheme),
       "quaternionFrame",                          T.t(quaternionframe),
       "smilesUrlFormat",                          T.t(smilesurlformat),

Modified: trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java
===================================================================
--- trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java        2013-08-15 
15:23:51 UTC (rev 18576)
+++ trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java        2013-08-16 
15:01:49 UTC (rev 18577)
@@ -149,7 +149,8 @@
     currentMesh = thisMesh = isomeshes[index] = (m == null ? new 
IsosurfaceMesh(
         thisID, colix, index) : (IsosurfaceMesh) m);
     currentMesh.index = index;
-    sg.setJvxlData(jvxlData = thisMesh.jvxlData);
+    if (sg != null)
+      sg.setJvxlData(jvxlData = thisMesh.jvxlData);
   }
 
   @Override

Modified: trunk/Jmol/src/org/jmol/util/GData.java
===================================================================
--- trunk/Jmol/src/org/jmol/util/GData.java     2013-08-15 15:23:51 UTC (rev 
18576)
+++ trunk/Jmol/src/org/jmol/util/GData.java     2013-08-16 15:01:49 UTC (rev 
18577)
@@ -527,8 +527,9 @@
    * @param stereoRotationMatrix  
    * @param translucentMode
    * @param isImageWrite 
+   * @param renderLow TODO
    */
-  public void beginRendering(Matrix3f stereoRotationMatrix, boolean 
translucentMode, boolean isImageWrite) {
+  public void beginRendering(Matrix3f stereoRotationMatrix, boolean 
translucentMode, boolean isImageWrite, boolean renderLow) {
   }
 
   public void endRendering() {

Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/Jmol.properties      2013-08-15 15:23:51 UTC 
(rev 18576)
+++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties      2013-08-16 15:01:49 UTC 
(rev 18577)
@@ -11,8 +11,9 @@
 #  The quotes above look odd for a parameter file, but they are 
 #  important for the JavaScript version of Jmol.
 
-___JmolVersion="13.3.4_dev_2013.08.15"
+___JmolVersion="13.3.4_dev_2013.08.16"
 
+NEW FEATURE: set platformSpeed [0 to 10]  (includes wireframeRotation along 
with cartoons and surfaces)
 bug fix: binding names not included in SHOW MOUSE
 bug fix: "single" touch can fire double-click
 bug fix: {x}.tensor() command fails when no atom tensors

Modified: trunk/Jmol/src/org/jmol/viewer/StateManager.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/StateManager.java    2013-08-15 15:23:51 UTC 
(rev 18576)
+++ trunk/Jmol/src/org/jmol/viewer/StateManager.java    2013-08-16 15:01:49 UTC 
(rev 18577)
@@ -562,7 +562,8 @@
         + ";legacyautobonding;legacyhaddition"
         + ";loglevel;logfile;loggestures;logcommands;measurestylechime"
         + 
";loadformat;loadligandformat;smilesurlformat;pubchemformat;nihresolverformat;edsurlformat;edsurlcutoff;multiprocessor;navigationmode;"
-        + 
";pathforallfiles;perspectivedepth;phongexponent;perspectivemodel;preservestate;refreshing;repaintwaitms;rotationradius"
+        + 
";pathforallfiles;perspectivedepth;phongexponent;perspectivemodel;platformspeed"
+        + ";preservestate;refreshing;repaintwaitms;rotationradius"
         + 
";showaxes;showaxis1;showaxis2;showaxis3;showboundbox;showfrank;showtiming;showunitcell"
         + 
";slabenabled;slab;slabrange;depth;zshade;zshadepower;specular;specularexponent;specularpercent;celshading;specularpower;stateversion"
         + ";statusreporting;stereo;stereostate;vibrationperiod"
@@ -678,10 +679,12 @@
         allowKeyStrokes = g.allowKeyStrokes;
         legacyAutoBonding = g.legacyAutoBonding;
         legacyHAddition = g.legacyHAddition;
+        platformSpeed = g.platformSpeed;
         useScriptQueue = g.useScriptQueue;
         useArcBall = g.useArcBall;
         databases = g.databases;
         showTiming = g.showTiming;
+        wireframeRotation = g.wireframeRotation;
       }
       if (databases == null) {
         databases = new Hashtable<String, String>();
@@ -1106,6 +1109,7 @@
     boolean isosurfaceKey = false;
     boolean isosurfacePropertySmoothing = true;
     int isosurfacePropertySmoothingPower = 7;
+    int platformSpeed = 10; // 1 (slow) to 10 (fast)
     public int repaintWaitMs = 1000;
     boolean showHiddenSelectionHalos = false;
     boolean showKeyStrokes = true;

Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/Viewer.java  2013-08-15 15:23:51 UTC (rev 
18576)
+++ trunk/Jmol/src/org/jmol/viewer/Viewer.java  2013-08-16 15:01:49 UTC (rev 
18577)
@@ -3980,6 +3980,7 @@
   public void setInMotion(boolean inMotion) {
     if (this.inMotion ^ inMotion) {
       this.inMotion = inMotion;
+      resizeImage(0, 0, false, false, true); // for antialiasdisplay
       if (inMotion) {
         startHoverWatcher(false);
         ++motionEventNumber;
@@ -4164,7 +4165,8 @@
       return;
     if (!isExport && !isImageWrite)
       setShapeProperty(JC.SHAPE_LABELS, "clearBoxes", null);
-    antialiasDisplay = (isReset ? global.antialiasDisplay : isImageWrite
+    antialiasDisplay = (isReset ? global.antialiasDisplay  
+        && checkMotionRendering(T.antialiasdisplay) : isImageWrite
         && !isExport ? global.antialiasImages : false);
     imageFontScaling = (isReset || width <= 0 ? 1
         : (global.zoomLarge == (height > width) ? height : width)
@@ -4325,8 +4327,7 @@
 
   private void beginRendering(boolean isDouble, boolean isImageWrite) {
     gdata.beginRendering(transformManager.getStereoRotationMatrix(isDouble),
-        global.translucent, 
-        isImageWrite);
+        global.translucent, isImageWrite, 
!checkMotionRendering(T.translucent));
   }
 
   private boolean antialiasDisplay;
@@ -5748,6 +5749,8 @@
       return global.percentVdwAtom;
     case T.pickingspinrate:
       return global.pickingSpinRate;
+    case T.platformspeed:
+      return global.platformSpeed;
     case T.ribbonaspectratio:
       return global.ribbonAspectRatio;
     case T.showscript:
@@ -5918,8 +5921,6 @@
       return global.vectorSymmetry;
     case T.waitformoveto:
       return global.waitForMoveTo;
-    case T.wireframerotation:
-      return global.wireframeRotation;
     case T.zerobasedxyzrasmol:
       return global.zeroBasedXyzRasmol;
     }
@@ -6431,6 +6432,10 @@
 
   private void setIntPropertyTok(String key, int tok, int value) {
     switch (tok) {
+    case T.platformspeed:
+      // 13.4.4
+      global.platformSpeed = Math.min(Math.max(value, 0), 10); // 0 could mean 
"adjust as needed"
+      break;
     case T.meshscale:
       // 12.3.29
       global.meshScale = value;
@@ -6862,13 +6867,9 @@
       break;
     case T.antialiasdisplay:
       // 11.3.36
-      setAntialias(0, value);
-      break;
     case T.antialiastranslucent:
-      setAntialias(1, value);
-      break;
     case T.antialiasimages:
-      setAntialias(2, value);
+      setAntialias(tok, value);
       break;
     case T.smartaromatic:
       // 11.3.29
@@ -7671,21 +7672,20 @@
     setShapeSizeRD(JC.SHAPE_BALLS, rd, getModelUndeletedAtomsBitSet(-1));
   }
 
-  private void setAntialias(int mode, boolean TF) {
+  private void setAntialias(int tok, boolean TF) {
 
-    switch (mode) {
-    case 0: // display
+    switch (tok) {
+    case T.antialiasdisplay:
       global.antialiasDisplay = TF;
       break;
-    case 1: // translucent
+    case T.antialiastranslucent:
       global.antialiasTranslucent = TF;
       break;
-    case 2: // images
+    case T.antialiasimages:
       global.antialiasImages = TF;
       return;
     }
     resizeImage(0, 0, false, false, true);
-    // requestRepaintAndWait();
   }
 
   // //////////////////////////////////////////////////////////////
@@ -10277,15 +10277,36 @@
     case 0: // off
       setTimeout("_SET_IN_MOTION_", 0, null);
       break;
-    case 1: // start timer
-      if (getBoolean(T.wireframerotation) && !inMotion)
+    case 1: // start 1-second timer (by default)
+      if (!inMotion)
         setTimeout("_SET_IN_MOTION_", global.hoverDelayMs * 2, "!setInMotion");
       break;
-    case 2: // trigger
+    case 2: // trigger, from a timeout thread
       setInMotion(true);
       refresh(3, "timeoutThread set in motion");
       break;
     }
   }
 
+  public boolean checkMotionRendering(int tok) {
+    if (!getInMotion(true))
+      return true;
+    if (global.wireframeRotation)
+      return false;
+    switch (tok) {
+    case T.balls:
+    case T.bonds:
+    case T.ellipsoid:
+      return global.platformSpeed >= 3;
+    case T.cartoon:
+    case T.geosurface:
+      return global.platformSpeed >= 5;
+    case T.mesh:
+    case T.translucent:
+    case T.antialiasdisplay:
+      return global.platformSpeed >= 8;
+    }
+    return false;
+  }
+
 }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead. 
Download for free and get started troubleshooting in minutes. 
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
Jmol-commits mailing list
Jmol-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-commits

Reply via email to