Revision: 20951 http://sourceforge.net/p/jmol/code/20951 Author: hansonr Date: 2016-02-06 16:20:31 +0000 (Sat, 06 Feb 2016) Log Message: ----------- Jmol.___JmolVersion="14.4.2_2016.02.06"
bug fix: small MRC map files mistaken for DELPHI files, which start with the 4-byte integer 20. bug fix: MRC/CCP4 surface/map files still sometimes inside out. Modified Paths: -------------- branches/v14_4/Jmol/src/org/jmol/quantum/NciCalculation.java branches/v14_4/Jmol/src/org/jmol/quantum/QuantumCalculation.java branches/v14_4/Jmol/src/org/jmol/render/MeshRenderer.java branches/v14_4/Jmol/src/org/jmol/rendersurface/IsosurfaceRenderer.java branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java branches/v14_4/Jmol/src/org/jmol/script/T.java branches/v14_4/Jmol/src/org/jmol/shape/Mesh.java branches/v14_4/Jmol/src/org/jmol/shape/MeshCollection.java branches/v14_4/Jmol/src/org/jmol/shapesurface/Contact.java branches/v14_4/Jmol/src/org/jmol/shapesurface/MolecularOrbital.java branches/v14_4/Jmol/src/org/jmol/util/MeshSlicer.java branches/v14_4/Jmol/src/org/openscience/jmol/app/surfacetool/SurfaceStatus.java Modified: branches/v14_4/Jmol/src/org/jmol/quantum/NciCalculation.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/quantum/NciCalculation.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/quantum/NciCalculation.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -29,6 +29,7 @@ import org.jmol.java.BS; import org.jmol.jvxl.data.VolumeData; +import org.jmol.modelset.Atom; import org.jmol.util.BSUtil; import org.jmol.util.Escape; import org.jmol.util.Logger; Modified: branches/v14_4/Jmol/src/org/jmol/quantum/QuantumCalculation.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/quantum/QuantumCalculation.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/quantum/QuantumCalculation.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -130,6 +130,8 @@ // all coordinates come in as angstroms, not bohr, and are converted here into bohr + if (atoms == null) + atoms = (Atom[]) xyz; if (points == null) { volume = 1; for (int i = 3; --i >= 0;) { Modified: branches/v14_4/Jmol/src/org/jmol/render/MeshRenderer.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/render/MeshRenderer.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/render/MeshRenderer.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -62,6 +62,7 @@ protected boolean isTranslucent; protected boolean frontOnly; + protected boolean isShell; protected boolean antialias; protected boolean haveBsDisplay; protected boolean selectedPolyOnly; @@ -216,16 +217,18 @@ : selectedPolyOnly ? mesh.bsSlabDisplay : null); renderLow = (!isExport && !vwr.checkMotionRendering(T.mesh)); - frontOnly = renderLow || !tm.slabEnabled && mesh.frontOnly + boolean allowFrontOnly = (!tm.slabEnabled && !mesh.isTwoSided && !selectedPolyOnly - && (meshSlabValue == Integer.MIN_VALUE || meshSlabValue >= 100); + && (meshSlabValue == Integer.MIN_VALUE || meshSlabValue >= 100)); + frontOnly = renderLow || mesh.frontOnly && allowFrontOnly; + isShell = mesh.isShell && allowFrontOnly; screens = vwr.allocTempScreens(vertexCount); if (isPrecision) p3Screens = vwr.allocTempPoints(vertexCount); - if (frontOnly) + if (frontOnly || isShell) transformedVectors = vwr.gdata.getTransformedVertexVectors(); if (transformedVectors == null) - frontOnly = false; + frontOnly = isShell = false; } return true; } @@ -329,6 +332,7 @@ if (isTranslucentInherit) colix = C.copyColixTranslucency(mesh.slabColix, mesh.colix); g3d.setC(colix); + // isShell??? if (generateSet) { if (frontOnly && fill) frontOnly = false; @@ -384,7 +388,7 @@ short nA = normixes[iA]; short nB = normixes[iB]; short nC = normixes[iC]; - check = checkNormals(nA, nB, nC); + check = (frontOnly || isShell ? checkFront(nA, nB, nC) : 7); if (fill && check != 7) continue; switch (polygon.length) { @@ -486,16 +490,14 @@ screenA.y, screenA.z, screenC.x, screenC.y, screenC.z); } - protected int checkNormals(short nA, short nB, short nC) { + protected int checkFront(short nA, short nB, short nC) { int check = 7; - if (frontOnly) { - if (transformedVectors[nA].z < 0) - check ^= 1; - if (transformedVectors[nB].z < 0) - check ^= 2; - if (transformedVectors[nC].z < 0) - check ^= 4; - } + if (transformedVectors[nA].z < 0) + check ^= 1; + if (transformedVectors[nB].z < 0) + check ^= 2; + if (transformedVectors[nC].z < 0) + check ^= 4; return check; } Modified: branches/v14_4/Jmol/src/org/jmol/rendersurface/IsosurfaceRenderer.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/rendersurface/IsosurfaceRenderer.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/rendersurface/IsosurfaceRenderer.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -161,6 +161,7 @@ volumeRender = (imesh.jvxlData.colorDensity && imesh.jvxlData.allowVolumeRender); int thisSlabValue = mySlabValue; frontOnly = mesh.frontOnly || shapeID == JC.SHAPE_LCAOCARTOON; + isShell = mesh.isShell && shapeID != JC.SHAPE_LCAOCARTOON; if (!isNavigationMode) { meshSlabValue = imesh.jvxlData.slabValue; if (meshSlabValue != Integer.MIN_VALUE @@ -178,9 +179,11 @@ } thisSlabValue = Math.round(z0 + (z1 - z0) * (100f - meshSlabValue)/100); frontOnly &= (meshSlabValue >= 100); + isShell &= (meshSlabValue >= 100); } } boolean tCover = vwr.gdata.translucentCoverOnly; + // isShell?? vwr.gdata.translucentCoverOnly = (frontOnly || !vwr.getBoolean(T.translucent)); thePlane = imesh.jvxlData.jvxlPlane; vertexValues = mesh.vvs; @@ -292,7 +295,7 @@ int diam; if (mesh.diameter <= 0) { diam = vwr.getInt(T.dotscale); - frontOnly = false; + frontOnly = isShell = false; } else { diam = vwr.getScreenDim() / (volumeRender ? 50 : 100); } @@ -368,6 +371,7 @@ colix = C.copyColixTranslucency(mesh.slabColix, mesh.colix); g3d.setC(colix); boolean generateSet = isExport; + // isShell??? if (generateSet) { if (frontOnly && fill) frontOnly = false; @@ -418,7 +422,7 @@ short nA = normixes[iA]; short nB = normixes[iB]; short nC = normixes[iC]; - int check = checkNormals(nA, nB, nC); + int check = (frontOnly || isShell ? checkFront(nA, nB, nC) : 7); if (fill && check == 0) continue; short colixA, colixB, colixC; Modified: branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -8879,6 +8879,8 @@ case T.nomesh: case T.fill: case T.nofill: + case T.backshell: + case T.nobackshell: case T.triangles: case T.notriangles: case T.frontonly: Modified: branches/v14_4/Jmol/src/org/jmol/script/T.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/script/T.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/script/T.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -702,6 +702,7 @@ public final static int within = 31 | 0 << 9 | mathfunc; public final static int write = 32 | 0 << 9 | mathfunc | scriptCommand; public final static int _ = 33 | 0 << 9 | mathfunc | mathproperty; // same as getProperty + public final static int pointgroup = 34 | 0 << 9 | mathfunc; // xxx(a) @@ -1109,11 +1110,12 @@ public final static int auto = misc | 28; public final static int axis = misc | 30; public final static int babel = misc | 32; - public final static int babel21 = misc | 34; - public final static int back = misc | 35; - public final static int balls = misc | 36; - public final static int barb = misc | 37; - public final static int backlit = misc | 38; + public final static int babel21 = misc | 33; + public final static int back = misc | 34; + public final static int balls = misc | 35; + public final static int barb = misc | 36; + public final static int backlit = misc | 37; + public final static int backshell = misc | 38; public final static int best = misc | 39; public final static int basepair = misc | 40; public final static int binary = misc | 42; @@ -1227,21 +1229,22 @@ public final static int msms = misc | 210; public final static int name = misc | 211; public final static int nci = misc | 212; - public final static int next = misc | 213; + public final static int next = misc | 213; public final static int nmr = misc | 214; public final static int nocontourlines = misc | 215; public final static int nocross = misc | 216; public final static int nodebug = misc | 217; - public final static int nodots = misc | 218; + public final static int nodots = misc | 218; public final static int noedges = misc | 220; - public final static int nofill = misc | 222; + public final static int nofill = misc | 222; public final static int nohead = misc | 224; public final static int noload = misc | 226; - public final static int nomesh = misc | 228; + public final static int nomesh = misc | 228; public final static int noplane = misc | 230; public final static int normal = misc | 232; - public final static int notfrontonly = misc | 234; - public final static int notriangles = misc | 236; + public final static int nobackshell = misc | 233; + public final static int notfrontonly = misc | 234; + public final static int notriangles = misc | 236; public final static int obj = misc | 238; public final static int object = misc | 240; public final static int offset = misc | 242; @@ -1263,23 +1266,22 @@ public final static int period = misc | 266; public final static int perpendicular = misc | 268; public final static int phase = misc | 270; - public final static int play = misc | 272; - public final static int playrev = misc | 274; + public final static int play = misc | 272; + public final static int playrev = misc | 274; public final static int planarparam = misc | 275; public final static int pocket = misc | 276; - public final static int pointgroup = misc | 278; public final static int pointsperangstrom = misc | 280; public final static int polygon = misc | 282; - public final static int prev = misc | 284; - public final static int probe = misc | 285; - public final static int pymol = misc | 286; + public final static int prev = misc | 284; + public final static int probe = misc | 285; + public final static int pymol = misc | 286; public final static int rad = misc | 287; public final static int radical = misc | 288; - public final static int range = misc | 290; - public final static int rasmol = misc | 292; + public final static int range = misc | 290; + public final static int rasmol = misc | 292; public final static int reference = misc | 294; public final static int remove = misc | 295; - public final static int residue = misc | 296; + public final static int residue = misc | 296; public final static int resolution = misc | 298; public final static int reversecolor = misc | 300; public final static int rewind = misc | 301; @@ -1288,7 +1290,7 @@ public final static int rna3d = misc | 304; public final static int rock = misc | 305; public final static int rotate45 = misc | 306; - public final static int rotation = misc | 308; + public final static int rotation = misc | 308; public final static int rubberband = misc | 310; public final static int sasurface = misc | 311; public final static int saved = misc | 312; @@ -1301,7 +1303,7 @@ public final static int silent = misc | 324; public final static int solid = misc | 326; public final static int spacegroup = misc | 328; - public final static int sphere = misc | 330; + public final static int sphere = misc | 330; public final static int squared = misc | 332; public final static int state = misc | 334; public final static int stdinchi = misc | 335; @@ -1315,17 +1317,17 @@ public final static int top = misc | 348; public final static int torsion = misc | 350; public final static int transform = misc | 352; - public final static int translation = misc | 354; - public final static int triangles = misc | 358; - public final static int url = misc | 360; - public final static int user = misc | 362; - public final static int val = misc | 364; - public final static int validation = misc | 365; - public final static int variable = misc | 366; - public final static int variables = misc | 368; - public final static int vertices = misc | 370; - public final static int spacebeforesquare = misc | 371; - public final static int width = misc | 372; + public final static int translation = misc | 354; + public final static int triangles = misc | 358; + public final static int url = misc | 360; + public final static int user = misc | 362; + public final static int val = misc | 364; + public final static int validation = misc | 365; + public final static int variable = misc | 366; + public final static int variables = misc | 368; + public final static int vertices = misc | 370; + public final static int spacebeforesquare = misc | 371; + public final static int width = misc | 372; // used to be "expression": @@ -1905,6 +1907,7 @@ "babel21", "back", "backlit", + "backshell", "balls", "baseModel", "best", @@ -2050,6 +2053,7 @@ "null", "inherit", "normal", + "noBackshell", "noContourLines", "notFrontOnly", "noTriangles", @@ -2938,6 +2942,7 @@ babel21, // "babel21" back, // "back" backlit, // "backlit" + backshell, // "backshell" balls, // "balls" basemodel, // "baseModel" best, // "best" @@ -3083,6 +3088,7 @@ -1, // "null" -1, // "inherit" normal, // "normal" + nobackshell, // "nobackshell" nocontourlines, // "noContourLines" notfrontonly, // "notFrontOnly" notriangles, // "noTriangles" Modified: branches/v14_4/Jmol/src/org/jmol/shape/Mesh.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/shape/Mesh.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/shape/Mesh.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -99,6 +99,8 @@ public int visibilityFlags; public boolean insideOut; public int checkByteCount; + private boolean normalsInverted; + public void setVisibilityFlags(int n) { visibilityFlags = n;//set to 1 in mps @@ -110,6 +112,7 @@ public boolean fillTriangles = true; public boolean showTriangles = false; //as distinct entitities public boolean frontOnly = false; + public boolean isShell = false; public boolean isTwoSided = true; public boolean havePlanarContours = false; @@ -161,6 +164,7 @@ drawTriangles = false; fillTriangles = true; frontOnly = false; + isShell = false; havePlanarContours = false; haveXyPoints = false; isModelConnected = false; @@ -190,7 +194,7 @@ } protected BS bsTemp; - + public void initialize(int lighting, T3[] vertices, P4 plane) { if (vertices == null) vertices = this.vs; @@ -199,6 +203,8 @@ this.lighting = T.frontlit; if (insideOut) invertNormixes(); + if (isShell && !isTwoSided) + invertNormixes(); setLighting(lighting); } @@ -214,7 +220,7 @@ else for (int i = normixCount; --i >= 0;) normixes[i] = Normix.getNormixV(normals[i], bsTemp); - return normixes; + return normixes; } public V3[] getNormals(T3[] vertices, P4 plane) { @@ -256,6 +262,7 @@ private void invertNormixes() { Normix.setInverseNormixes(); + normalsInverted = !normalsInverted; for (int i = normixCount; --i >= 0;) normixes[i] = Normix.getInverseNormix(normixes[i]); } @@ -357,6 +364,8 @@ if (showTriangles) s.append(" triangles"); s.append(" ").append(T.nameOf(lighting)); + if (isShell && !isTwoSided) + s.append(" shell"); return s.toString(); } @@ -447,30 +456,38 @@ } return bs; } -// -// BS getVisibleGhostBitSet() { -// BS bs = new BS(); -// if (polygonCount == 0 && bsSlabGhost != null) -// BSUtil.copy2(bsSlabGhost, bs); -// else -// for (int i = polygonCount; --i >= 0;) -// if (bsSlabGhost == null || bsSlabGhost.get(i)) { -// int[] vertexIndexes = polygonIndexes[i]; -// if (vertexIndexes == null) -// continue; -// bs.set(vertexIndexes[0]); -// bs.set(vertexIndexes[1]); -// bs.set(vertexIndexes[2]); -// } -// return bs; -// } + // + // BS getVisibleGhostBitSet() { + // BS bs = new BS(); + // if (polygonCount == 0 && bsSlabGhost != null) + // BSUtil.copy2(bsSlabGhost, bs); + // else + // for (int i = polygonCount; --i >= 0;) + // if (bsSlabGhost == null || bsSlabGhost.get(i)) { + // int[] vertexIndexes = polygonIndexes[i]; + // if (vertexIndexes == null) + // continue; + // bs.set(vertexIndexes[0]); + // bs.set(vertexIndexes[1]); + // bs.set(vertexIndexes[2]); + // } + // return bs; + // } + public void setTokenProperty(int tokProp, boolean bProp) { switch (tokProp) { case T.notfrontonly: case T.frontonly: frontOnly = (tokProp == T.frontonly ? bProp : !bProp); return; + case T.nobackshell: + case T.backshell: + if (!isTwoSided && isShell != (tokProp == T.backshell ? bProp : !bProp)) { + isShell = !isShell; + invertNormixes(); + } + return; case T.frontlit: case T.backlit: case T.fullylit: @@ -478,23 +495,23 @@ return; case T.nodots: case T.dots: - showPoints = (tokProp == T.dots ? bProp : !bProp); + showPoints = (tokProp == T.dots ? bProp : !bProp); return; case T.nomesh: case T.mesh: - drawTriangles = (tokProp == T.mesh ? bProp : !bProp); + drawTriangles = (tokProp == T.mesh ? bProp : !bProp); return; case T.nofill: case T.fill: - fillTriangles = (tokProp == T.fill ? bProp : !bProp); + fillTriangles = (tokProp == T.fill ? bProp : !bProp); return; case T.notriangles: case T.triangles: - showTriangles = (tokProp == T.triangles ? bProp : !bProp); + showTriangles = (tokProp == T.triangles ? bProp : !bProp); return; case T.nocontourlines: case T.contourlines: - showContourLines = (tokProp == T.contourlines ? bProp : !bProp); + showContourLines = (tokProp == T.contourlines ? bProp : !bProp); return; } } Modified: branches/v14_4/Jmol/src/org/jmol/shape/MeshCollection.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/shape/MeshCollection.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/shape/MeshCollection.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -273,6 +273,7 @@ case T.fullylit: case T.dots: case T.fill: + case T.backshell: case T.triangles: case T.frontonly: break; @@ -305,6 +306,10 @@ test = false; tok = T.fill; break; + case T.nobackshell: + test = false; + tok = T.backshell; + break; case T.notriangles: test = false; tok = T.triangles; Modified: branches/v14_4/Jmol/src/org/jmol/shapesurface/Contact.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/shapesurface/Contact.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/shapesurface/Contact.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -142,6 +142,7 @@ thisMesh.nSets = 0; thisMesh.info = null; String func = null; + boolean fullyLit = true; switch (displayType) { case T.full: func = "(a>b?a:b)"; @@ -157,7 +158,7 @@ //VolumeData volumeData; switch (displayType) { case T.nci: - colorByType = false; + colorByType = fullyLit = false; bs = BSUtil.copy(bsA); bs.or(bsB); // for now -- TODO -- need to distinguish ligand if (parameters[0] < 0) @@ -170,13 +171,13 @@ break; case T.sasurface: case T.surface: - colorByType = false; + colorByType = fullyLit = false; thisMesh.nSets = 1; newSurface(T.surface, null, bsA, bsB, rd, null, null, colorDensity, null, saProbeRadius); break; case T.cap: - colorByType = false; + colorByType = fullyLit = false; thisMesh.nSets = 1; newSurface(T.slab, null, bsA, bsB, rd, null, null, false, null, 0); sg.initState(); @@ -230,7 +231,7 @@ if (colorDensity) { setPropI("pointSize", Float.valueOf(ptSize), null); } else { - setPropI("token", Integer.valueOf(T.fullylit), null); + setPropI("token", Integer.valueOf(fullyLit ? T.fullylit : T.frontlit), null); } if (thisMesh.slabOptions != null) { thisMesh.slabOptions = null; Modified: branches/v14_4/Jmol/src/org/jmol/shapesurface/MolecularOrbital.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/shapesurface/MolecularOrbital.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/shapesurface/MolecularOrbital.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -70,6 +70,7 @@ private int moMesh = T.mesh; private int moDots = T.nodots; private int moFrontOnly = T.frontonly; + private int moShell = T.nobackshell; private String moTitleFormat; private boolean moDebug; private int myColorPt; @@ -290,6 +291,10 @@ case T.nomesh: moMesh = tok; break; + case T.backshell: + case T.nobackshell: + moShell = tok; + break; case T.frontonly: case T.notfrontonly: moFrontOnly = tok; @@ -517,6 +522,7 @@ setPropI("translucency", moTranslucency, null); setPropI("token", Integer.valueOf(moFill), null); setPropI("token", Integer.valueOf(moMesh), null); + setPropI("token", Integer.valueOf(moShell), null); setPropI("token", Integer.valueOf(moDots), null); setPropI("token", Integer.valueOf(moFrontOnly), null); thisModel.put("mesh", currentMesh); Modified: branches/v14_4/Jmol/src/org/jmol/util/MeshSlicer.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/util/MeshSlicer.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/jmol/util/MeshSlicer.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -71,8 +71,10 @@ m.bsSlabGhost = null; m.slabMeshType = T.none; } - if (slabType == T.none) + if (slabType == T.none) { + return false; + } } Object slabbingObject = slabObject[1]; boolean andCap = ((Boolean) slabObject[2]).booleanValue() Modified: branches/v14_4/Jmol/src/org/openscience/jmol/app/surfacetool/SurfaceStatus.java =================================================================== --- branches/v14_4/Jmol/src/org/openscience/jmol/app/surfacetool/SurfaceStatus.java 2016-02-06 16:19:38 UTC (rev 20950) +++ branches/v14_4/Jmol/src/org/openscience/jmol/app/surfacetool/SurfaceStatus.java 2016-02-06 16:20:31 UTC (rev 20951) @@ -48,6 +48,7 @@ boolean ghostOn; boolean foundDuringLastSync; Slice slice; + private boolean isShell; /** * @param m @@ -67,6 +68,7 @@ meshTranslucency = 0; //ignored for now lighting = m.lighting; frontonly = m.frontOnly; + isShell = m.isShell; beenSliced = false; capOn = false; ghostOn = false; @@ -84,6 +86,7 @@ meshTranslucency = 0; //ignored for now lighting = m.lighting; frontonly = m.frontOnly; + isShell = m.isShell; foundDuringLastSync = true; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140 _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits