Revision: 18305 http://sourceforge.net/p/jmol/code/18305 Author: hansonr Date: 2013-06-07 19:15:26 +0000 (Fri, 07 Jun 2013) Log Message: ----------- ___JmolVersion="13.1.17"
TODO: PyMOL uniqueAtomSettings for selected atom settings new feature: set translucent -- default TRUE : translucent objects are fully translucent -- FALSE: translucent object are opaque to other translucent objects Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java trunk/Jmol/src/org/jmol/api/JmolRendererInterface.java trunk/Jmol/src/org/jmol/export/Export3D.java trunk/Jmol/src/org/jmol/exportjs/Export3D.java trunk/Jmol/src/org/jmol/g3d/Graphics3D.java trunk/Jmol/src/org/jmol/rendersurface/IsosurfaceRenderer.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/shape/AtomShape.java trunk/Jmol/src/org/jmol/shapebio/BioShapeCollection.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/adapter/readers/pymol/JmolObject.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -199,7 +199,6 @@ id = JC.SHAPE_BALLS; break; case JC.SHAPE_BALLS: - color = "colorballs"; break; case JC.SHAPE_TRACE: case JC.SHAPE_BACKBONE: @@ -219,6 +218,16 @@ } switch (id) { + case JC.SHAPE_DOTS: + case JC.SHAPE_BALLS: + case JC.SHAPE_STARS: + case JC.SHAPE_ELLIPSOIDS: // not implemented + if (info instanceof Object[]) { + sm.loadShape(id); + sm.setShapePropertyBs(id, "params", info, bsAtoms); + return; + } + break; case JC.SHAPE_MEASURES: if (modelIndex < 0) return; Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -59,7 +59,8 @@ "labels","nb_spheres", "cartoon","ribbon","lines", "mesh","dots","dashes", - "nonbonded"};//',"slice"}; + "nonbonded","cell","cgo","callback","extent", + "slice","angles","dihedrals","ellipsoid","volume"}; final static int REP_STICKS = 0; @@ -74,14 +75,7 @@ final static int REP_DOTS = 9; // dots; also used for objMap final static int REP_DASHES = 10; // for measurements final static int REP_NONBONDED = 11; - final static int REP_MAX = 12; - - // a continuation of PyMOL.REP_xxx - final static int REP_JMOL_TRACE = 12; - final static int REP_JMOL_PUTTY = 13; - final static int REP_JMOL_MAX = 14; - - // ??? + final static int REP_CELL = 12; // for objMesh, objSurface final static int REP_CGO = 13; // for sculpt mode, objAlignment, objCGO final static int REP_CALLBACK = 14; // for objCallback @@ -89,8 +83,17 @@ final static int REP_SLICE = 16; // for objSlice final static int REP_ANGLES = 17; final static int REP_DIHEDRALS = 18; + final static int REP_ELLIPSOID = 19; + final static int REP_VOLUME = 20; + final static int REP_MAX = 21; + // a continuation of PyMOL.REP_xxx + final static int REP_JMOL_TRACE = 21; + final static int REP_JMOL_PUTTY = 22; + final static int REP_JMOL_MAX = 23; + + // ??? // flag 24: @@ -6242,18 +6245,22 @@ public static float getDefaultSetting(int i, int pymolVersion) { switch (i) { - case stick_color: - return -1; case label_size: return 14; + case line_color: + case stick_color: case label_distance_digits: case label_angle_digits: case label_dihedral_digits: + case ellipsoid_color: return -1; case ray_pixel_scale: + case ellipsoid_scale: return 1; default: Logger.info("PyMOL " + pymolVersion + " does not have setting " + i); + //$FALL-THROUGH$ + case ellipsoid_transparency: return 0; } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -1025,6 +1025,9 @@ int flags = intAt(a, 24); //System.out.println(atomCount + " " + group3 + " " + serNo + " " + Integer.toHexString(flags)); boolean bonded = (intAt(a, 25) != 0); + + // repurposing vectorX,Y,Z + int uniqueID = (a.size() > 40 && intAt(a, 40) == 1 ? intAt(a, 32) : -1); atom.vectorX = uniqueID; atom.vectorY = cartoonType; @@ -1034,7 +1037,7 @@ } //if (uniqueID > 0) //pymolScene.setUnique(uniqueID, atom); - pymolScene.setAtomColor(uniqueID, atomColor); + pymolScene.setAtomColor(atomColor); processAtom2(atom, serNo, x, y, z, formalCharge); // set pymolScene bit sets and create labels @@ -1261,13 +1264,15 @@ uniqueIDs[i] = getUniqueID(i); sequenceNumbers[i] = getSequenceNumber(i); radii[i] = getVDW(i); - if (lastAtomChain != atoms[i].chainID || lastAtomSet != atoms[i].atomSetIndex) { + if (lastAtomChain != atoms[i].chainID + || lastAtomSet != atoms[i].atomSetIndex) { newChain[i] = true; lastAtomChain = atoms[i].chainID; lastAtomSet = atoms[i].atomSetIndex; } } - pymolScene.setAtomInfo(uniqueIDs, cartoonTypes, sequenceNumbers, newChain, radii); + pymolScene.setAtomInfo(uniqueIDs, cartoonTypes, sequenceNumbers, + newChain, radii); } // generally useful static methods @@ -1288,9 +1293,11 @@ private static BS getBsReps(JmolList<Object> list) { BS bsReps = new BS(); - for (int i = 0; i < PyMOL.REP_MAX; i++) + int n = Math.min(list.size(), PyMOL.REP_MAX); + for (int i = 0; i < n; i++) { if (intAt(list, i) == 1) bsReps.set(i); + } return bsReps; } Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -34,6 +34,37 @@ * */ class PyMOLScene implements JmolSceneGenerator { + +//accounted for: +// +// dot_color +// ellipsoid_color +// ellipsoid_transparency +// ellipsoid_scale +// label_color +// label_position +// nonbonded_transparency +// sphere_color +// sphere_scale +// sphere_transparency +// +//TODO needed: +// +// cartoon_color +// mesh_color +// ribbon_color +// surface_color +// transparency (surface only) +// +//special (probably) PyMOL-only: +// +// ladder_color +// ladder_mode +// ladder_radius +// ring_color +// ring_mode +// ring_radius +// ring_width private Viewer viewer; private int pymolVersion; @@ -58,29 +89,30 @@ private Map<String, PyMOLGroup> groups; private Map<Integer, JmolList<Object>> objectSettings; - private void clearReaderData(boolean isAll) { + private void clearReaderData() { reader = null; colixes = null; atomColorList = null; objectSettings = null; stateSettings = null; - if (!isAll) + if (haveScenes) return; + settings = null; groups = null; labels = null; + ssMapAtom = null; htSpacefill = null; - ssMapAtom = null; htAtomMap = null; htMeasures = null; htObjectGroups = null; htObjectAtoms = null; htObjectSettings = null; htStateSettings = null; + htHiddenObjects = null; objectInfo = null; - settings = null; occludedObjects = null; - htHiddenObjects = null; - bsHidden = bsNucleic = bsNonbonded = bsLabeled = bsHydrogen = bsNoSurface = bsCartoon = null; + bsHidden = bsNucleic = bsNonbonded = bsLabeled = bsHydrogen = bsNoSurface + = bsCartoon = null; } // private -- needed for processing Scenes @@ -114,6 +146,7 @@ bsUniqueBonds.set(index); } private int bgRgb; + private int dotColor; private int surfaceMode; private int surfaceColor; private int sphereColor; @@ -123,6 +156,7 @@ private float labelSize; private float meshWidth; private float nonbondedSize; + private float nonbondedTranslucency; private float sphereScale; private float sphereTranslucency; private float stickTranslucency; @@ -137,7 +171,7 @@ private String objectNameID; private String objectJmolName; private int objectType; - private BS objectAtoms; + private BS bsAtoms; private boolean objectHidden; // during file loading we have a reader, but after that we must rely on data saved by the server @@ -178,6 +212,7 @@ this.pymolVersion = pymolVersion; this.haveScenes = haveScenes; setVersionSettings(); + settings.trimToSize(); bgRgb = colorSetting(listAt(settings, PyMOL.bg_rgb)); pointAt((JmolList<Object>) listAt(settings, PyMOL.label_position).get(2), 0, labelPosition0); @@ -227,7 +262,9 @@ private void getObjectSettings() { transparency = floatSetting(PyMOL.transparency); + dotColor = (int) floatSetting(PyMOL.dot_color); nonbondedSize = floatSetting(PyMOL.nonbonded_size); + nonbondedTranslucency = floatSetting(PyMOL.nonbonded_transparency); sphereScale = floatSetting(PyMOL.sphere_scale); sphereColor = (int) floatSetting(PyMOL.sphere_color); cartoonTranslucency = floatSetting(PyMOL.cartoon_transparency); @@ -298,7 +335,7 @@ objectJmolName = getJmolName(name); objectNameID = (istate == 0 && objectType != 0 ? getObjectID(name) : objectJmolName + "_" + istate); - objectAtoms = htObjectAtoms.get(name); + bsAtoms = htObjectAtoms.get(name); objectSettings = htObjectSettings.get(name); stateSettings = htStateSettings.get(name+"_" + istate); String groupName = htObjectGroups.get(name); @@ -594,7 +631,7 @@ this.baseAtomIndex = baseAtomIndex; this.mepList = mepList; this.doCache = doCache; - clearReaderData(!haveScenes); + clearReaderData(); finalizeObjects(); if (!haveScenes) { uniqueSettings = null; @@ -777,16 +814,16 @@ int atomCount) { if (atomCount >= 0) { // initial creation, not just going to this scene - objectAtoms = BSUtil.newBitSet2(atomCount0, atomCount); + bsAtoms = BSUtil.newBitSet2(atomCount0, atomCount); JmolObject jo; // from reader - jo = addJmolObject(T.atoms, objectAtoms, null); + jo = addJmolObject(T.atoms, bsAtoms, null); colixes = ArrayUtil.ensureLengthShort(colixes, atomCount); for (int i = atomCount; --i >= atomCount0;) colixes[i] = (short) atomColorList.get(i).intValue(); jo.setColors(colixes, 0); jo.setSize(0); - jo = addJmolObject(JC.SHAPE_STICKS, objectAtoms, null); + jo = addJmolObject(JC.SHAPE_STICKS, bsAtoms, null); jo.setSize(0); } createShapeObject(PyMOL.REP_LINES, reps[PyMOL.REP_LINES]); @@ -827,7 +864,7 @@ createShapeObject(i, reps[i]); continue; } - objectAtoms = null; + bsAtoms = null; } void addLabel(int atomIndex, int uniqueID, int atomColor, @@ -852,9 +889,7 @@ labelPos[i] = floatAt(labelOffset, i); } labels.put(Integer.valueOf(atomIndex), newTextLabel(label, labelPos, - icolor, (int) getUniqueFloatDef(uniqueID, PyMOL.label_font_id, - labelFontId), getUniqueFloatDef(uniqueID, PyMOL.label_size, - labelSize))); + icolor, labelFontId, labelSize)); } float getUniqueFloatDef(int id, int key, float defaultValue) { @@ -1018,7 +1053,8 @@ SB getViewScript(JmolList<Object> view) { SB sb = new SB(); float[] pymolView = getPymolView(view, true); - sb.append(";set zshadePower 1;set traceAlpha " + sb.append(";set translucent " + (globalSetting(PyMOL.transparency_mode) != 2) + + ";set zshadePower 1;set traceAlpha " + (globalSetting(PyMOL.cartoon_round_helices) != 0)); boolean rockets = cartoonRockets; sb.append(";set cartoonRockets " + rockets); @@ -1051,10 +1087,8 @@ .get(5))); } - void setAtomColor(int uniqueID, int atomColor) { - float translucency = getUniqueFloatDef(uniqueID, PyMOL.sphere_transparency, - sphereTranslucency); - atomColorList.addLast(Integer.valueOf(getColix(atomColor, translucency))); + void setAtomColor(int atomColor) { + atomColorList.addLast(Integer.valueOf(getColix(atomColor, 0))); } void setFrameObject(int type, Object info) { @@ -1215,17 +1249,17 @@ private void fixReps(BS[] reps) { htSpacefill.clear(); bsCartoon.clearAll(); - for (int iAtom = objectAtoms.nextSetBit(0); iAtom >= 0; iAtom = objectAtoms + for (int iAtom = bsAtoms.nextSetBit(0); iAtom >= 0; iAtom = bsAtoms .nextSetBit(iAtom + 1)) { float rad = 0; int uniqueID = (reader == null ? uniqueIDs[iAtom] : reader .getUniqueID(iAtom)); if (reps[PyMOL.REP_SPHERES].get(iAtom)) { rad = (reader == null ? radii[iAtom] : reader.getVDW(iAtom)) - * getUniqueFloat(uniqueID, PyMOL.sphere_scale); + * getUniqueFloatDef(uniqueID, PyMOL.sphere_scale, sphereScale); } else if (reps[PyMOL.REP_NBSPHERES].get(iAtom)) { // Penta_vs_mutants calcium - rad = getUniqueFloat(uniqueID, PyMOL.nonbonded_size); + rad = nonbondedSize; } if (rad != 0) { Float r = Float.valueOf(rad); @@ -1291,7 +1325,7 @@ private void cleanSingletons(BS bs) { if (bs.isEmpty()) return; - bs.and(objectAtoms); + bs.and(bsAtoms); BS bsr = new BS(); int n = bs.length(); int pass = 0; @@ -1334,7 +1368,6 @@ */ private void createShapeObject(int shapeID, BS bs) { // add more to implement - float f; if (bs.isEmpty()) return; JmolObject jo = null; @@ -1343,61 +1376,27 @@ bs.and(bsNonbonded); if (bs.isEmpty()) return; - jo = addJmolObject(JC.SHAPE_STARS, bs, null); - jo.rd = new RadiusData(null, nonbondedSize / 2, - RadiusData.EnumType.FACTOR, EnumVdw.AUTO); + setUniqueObjects(JC.SHAPE_STARS, bs, 0, 0, PyMOL.nonbonded_transparency, nonbondedTranslucency, 0, nonbondedSize, 0.5f); break; case PyMOL.REP_NBSPHERES: case PyMOL.REP_SPHERES: - jo = addJmolObject(JC.SHAPE_BALLS, bs, null); - f = sphereColor; - if (f != -1) - jo.argb = PyMOL.getRGB((int) f); - jo.translucency = sphereTranslucency; + setUniqueObjects(JC.SHAPE_BALLS, bs, PyMOL.sphere_color, sphereColor, PyMOL.sphere_transparency, sphereTranslucency, PyMOL.sphere_scale, sphereScale, 1); break; + case PyMOL.REP_ELLIPSOID: + float ellipsoidTranslucency = floatSetting(PyMOL.ellipsoid_transparency); + int ellipsoidColor = (int) floatSetting(PyMOL.ellipsoid_color); + float ellipsoidScale = floatSetting(PyMOL.ellipsoid_scale); + setUniqueObjects(JC.SHAPE_ELLIPSOIDS, bs, PyMOL.ellipsoid_color, ellipsoidColor, PyMOL.ellipsoid_transparency, ellipsoidTranslucency, PyMOL.ellipsoid_scale, ellipsoidScale, 1); + break; case PyMOL.REP_DOTS: - jo = addJmolObject(JC.SHAPE_DOTS, bs, null); - f = sphereScale; - jo.rd = new RadiusData(null, f, RadiusData.EnumType.FACTOR, EnumVdw.AUTO); + setUniqueObjects(JC.SHAPE_DOTS, bs, PyMOL.dot_color, dotColor, 0, 0, PyMOL.sphere_scale, sphereScale, 1); break; - case PyMOL.REP_CARTOON: - createCartoonObject("H", (cartoonRockets ? PyMOL.cartoon_helix_radius - : PyMOL.cartoon_oval_length)); - createCartoonObject("S", PyMOL.cartoon_rect_length); - createCartoonObject("L", PyMOL.cartoon_loop_radius); - createCartoonObject(" ", PyMOL.cartoon_loop_radius); - break; - case PyMOL.REP_MESH: // = 8; - jo = addJmolObject(T.isosurface, bs, null); - jo.setSize(floatSetting(PyMOL.solvent_radius)); - jo.translucency = transparency; - break; - case PyMOL.REP_SURFACE: // = 2; - float withinDistance = floatSetting(PyMOL.surface_carve_cutoff); - jo = addJmolObject(T.isosurface, bs, new Object[] { - booleanSetting(PyMOL.two_sided_lighting) ? "FULLYLIT" : "FRONTLIT", - (surfaceMode == 3 || surfaceMode == 4) ? " only" : "", - bsCarve, Float.valueOf(withinDistance)}); - jo.setSize(floatSetting(PyMOL.solvent_radius) * (solventAccessible ? -1 : 1)); - jo.translucency = transparency; - if (surfaceColor >= 0) - jo.argb = PyMOL.getRGB(surfaceColor); - break; case PyMOL.REP_LABELS: // = 3; bs.and(bsLabeled); if (bs.isEmpty()) return; jo = addJmolObject(JC.SHAPE_LABELS, bs, labels); break; - case PyMOL.REP_JMOL_PUTTY: - createPuttyObject(bs); - break; - case PyMOL.REP_JMOL_TRACE: - createTraceObject(bs); - break; - case PyMOL.REP_RIBBON: // backbone or trace, depending - createRibbonObject(bs); - break; case PyMOL.REP_LINES: jo = addJmolObject(T.wireframe, bs, null); jo.setSize(floatSetting(PyMOL.line_width) / 15); @@ -1413,11 +1412,74 @@ if (col >= 0) jo.argb = PyMOL.getRGB(col); break; + case PyMOL.REP_CARTOON: + createCartoonObject("H", (cartoonRockets ? PyMOL.cartoon_helix_radius + : PyMOL.cartoon_oval_length)); + createCartoonObject("S", PyMOL.cartoon_rect_length); + createCartoonObject("L", PyMOL.cartoon_loop_radius); + createCartoonObject(" ", PyMOL.cartoon_loop_radius); + break; + case PyMOL.REP_JMOL_PUTTY: + createPuttyObject(bs); + break; + case PyMOL.REP_JMOL_TRACE: + createTraceObject(bs); + break; + case PyMOL.REP_RIBBON: // backbone or trace, depending + createRibbonObject(bs); + break; + case PyMOL.REP_SURFACE: // = 2; + // unique translucency here involves creating ghost surfaces + float withinDistance = floatSetting(PyMOL.surface_carve_cutoff); + jo = addJmolObject(T.isosurface, bs, new Object[] { + booleanSetting(PyMOL.two_sided_lighting) ? "FULLYLIT" : "FRONTLIT", + (surfaceMode == 3 || surfaceMode == 4) ? " only" : "", + bsCarve, Float.valueOf(withinDistance)}); + jo.setSize(floatSetting(PyMOL.solvent_radius) * (solventAccessible ? -1 : 1)); + jo.translucency = transparency; + if (surfaceColor >= 0) + jo.argb = PyMOL.getRGB(surfaceColor); + break; + case PyMOL.REP_MESH: // = 8; + jo = addJmolObject(T.isosurface, bs, null); + jo.setSize(floatSetting(PyMOL.solvent_radius)); + jo.translucency = transparency; + break; default: Logger.error("Unprocessed representation type " + shapeID); } } + private void setUniqueObjects(int shape, BS bs, + int setColor, int color, + int setTrans, float trans, + int setSize, float size, float f) { + int n = bs.cardinality(); + short[] colixes = (setColor == 0 ? null : new short[n]); + float[] atrans = (setTrans == 0 ? null : new float[n]); + float[] sizes = new float[n]; + for (int pt=0, i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1), pt++) { + int id = (uniqueIDs == null ? -1 : uniqueIDs[i]); + if (colixes != null) { + int c = (int) getUniqueFloatDef(id, setColor, color); + if (c > 0) + colixes[pt] = getColix(c, 0); + } + if (atrans != null) { + atrans[pt] = getUniqueFloatDef(id, setTrans, trans); + } + sizes[pt] = getUniqueFloatDef(id, setSize, size) * f; + } + addJmolObject(shape, bs, new Object[] {colixes, atrans, sizes}); + +// case PyMOL.REP_DOTS: + // addJmolObject(JC.SHAPE_DOTS, bs, null).rd = new RadiusData(null, + // value1, RadiusData.EnumType.FACTOR, EnumVdw.AUTO); +// case PyMOL.REP_NONBONDED: + // addJmolObject(JC.SHAPE_STARS, bs, null).rd = new RadiusData(null, + // f / 2, RadiusData.EnumType.FACTOR, EnumVdw.AUTO); + } + /** * Create a BALLS JmolObject for each radius. * @@ -1557,24 +1619,6 @@ } } - private float getUniqueFloat(int uniqueID, int i) { - float f; - switch (i) { - case PyMOL.sphere_transparency: - f = sphereTranslucency; - break; - case PyMOL.sphere_scale: - f = sphereScale; - break; - case PyMOL.nonbonded_size: - f = nonbondedSize; - break; - default: - return 0; - } - return getUniqueFloatDef(uniqueID, i, f); - } - BS getSSMapAtom(String ssType) { BS bs = ssMapAtom.get(ssType); if (bs == null) Modified: trunk/Jmol/src/org/jmol/api/JmolRendererInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolRendererInterface.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/api/JmolRendererInterface.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -343,4 +343,6 @@ P3 navigationOffset, float navigationDepthPercent); + public abstract boolean getTranslucentCoverOnly(); + } Modified: trunk/Jmol/src/org/jmol/export/Export3D.java =================================================================== --- trunk/Jmol/src/org/jmol/export/Export3D.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/export/Export3D.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -903,5 +903,9 @@ g3d.renderAllStrings(this); } + public boolean getTranslucentCoverOnly() { + return g3d.getTranslucentCoverOnly(); + } + } Modified: trunk/Jmol/src/org/jmol/exportjs/Export3D.java =================================================================== --- trunk/Jmol/src/org/jmol/exportjs/Export3D.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/exportjs/Export3D.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -900,5 +900,9 @@ // g3d only } + public boolean getTranslucentCoverOnly() { + return g3d.getTranslucentCoverOnly(); + } + } Modified: trunk/Jmol/src/org/jmol/g3d/Graphics3D.java =================================================================== --- trunk/Jmol/src/org/jmol/g3d/Graphics3D.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/g3d/Graphics3D.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -198,11 +198,6 @@ private boolean addAllPixels; private boolean haveTranslucentObjects; - protected boolean translucentCoverOnly = false; - public void setTranslucentCoverOnly(boolean TF) { - translucentCoverOnly = TF; - } - protected int[] pbuf; protected int[] pbufT; protected int[] zbuf; @@ -264,7 +259,7 @@ } @Override - public void beginRendering(Matrix3f rotationMatrix, boolean isImageWrite) { + public void beginRendering(Matrix3f rotationMatrix, boolean translucentMode, boolean isImageWrite) { if (currentlyRendering) endRendering(); if (windowWidth != newWindowWidth || windowHeight != newWindowHeight @@ -285,6 +280,7 @@ isPass2 = false; colixCurrent = 0; haveTranslucentObjects = false; + translucentCoverOnly = !translucentMode; addAllPixels = true; if (pbuf == null) { platform.allocateBuffers(windowWidth, windowHeight, Modified: trunk/Jmol/src/org/jmol/rendersurface/IsosurfaceRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/rendersurface/IsosurfaceRenderer.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/rendersurface/IsosurfaceRenderer.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -166,6 +166,7 @@ mySlabValue = Math.round(pt2f.z + r * (1 - meshSlabValue / 50f)); } } + boolean tcover = g3d.getTranslucentCoverOnly(); g3d.setTranslucentCoverOnly(imesh.frontOnly); thePlane = imesh.jvxlData.jvxlPlane; vertexValues = imesh.vertexValues; @@ -177,7 +178,7 @@ } else { isOK = renderMesh(imesh); } - g3d.setTranslucentCoverOnly(false); + g3d.setTranslucentCoverOnly(tcover); return isOK; } Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/script/T.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -1040,8 +1040,9 @@ public final static int testflag1 = booleanparam | 184; public final static int testflag2 = booleanparam | 186; public final static int testflag3 = booleanparam | 188; - public final static int testflag4 = booleanparam | 190; - public final static int tracealpha = booleanparam | 191; + public final static int testflag4 = booleanparam | 189; + public final static int tracealpha = booleanparam | 190; + public final static int translucent = booleanparam | 191; public final static int twistedsheets = booleanparam | 192; public final static int usearcball = booleanparam | 193; public final static int useminimizationthread = booleanparam | 194; @@ -1274,7 +1275,6 @@ final static int torsion = misc | 350; final static int transform = misc | 352; public final static int translation = misc | 354; - public final static int translucent = misc | 356; public final static int triangles = misc | 358; final static int url = misc | 360 | expression; final static int user = misc | 362; Modified: trunk/Jmol/src/org/jmol/shape/AtomShape.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/AtomShape.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/shape/AtomShape.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -28,6 +28,7 @@ import org.jmol.atomdata.RadiusData; import org.jmol.atomdata.RadiusData.EnumType; import org.jmol.constant.EnumPalette; +import org.jmol.constant.EnumVdw; import org.jmol.modelset.Atom; import org.jmol.modelset.Group; import org.jmol.util.ArrayUtil; @@ -98,8 +99,6 @@ for (int i = i0; i >= 0; i = (isAll ? i - 1 : bsSelected.nextSetBit(i + 1))) { Atom atom = atoms[i]; mads[i] = atom.calculateMad(viewer, rd); - //System.out.println("atomshape - setSize " + i + " " + rd); -// System.out.println("atomSHape " + atom + " mad=" + mads[i]); bsSizeSet.setBitTo(i, isVisible); atom.setShapeVisibility(myVisibilityFlag, isVisible); } @@ -116,20 +115,34 @@ setColixAndPalette(colix, pid, i); return; } - if ("colors" == propertyName) { + if ("params" == propertyName) { isActive = true; Object[] data = (Object[]) value; short[] colixes = (short[]) data[0]; - float translucency = ((Float) data[1]).floatValue(); + float[] atrans = (float[]) data[1]; + float[] sizes = (float[]) data[2]; + RadiusData rd = new RadiusData(null, 0, RadiusData.EnumType.FACTOR, + EnumVdw.AUTO); if (bsColixSet == null) bsColixSet = new BS(); - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { - if (i >= colixes.length) - continue; - short colix = colixes[i]; - if (translucency > 0.01f) - colix = C.getColixTranslucent3(colix, true, translucency); + if (bsSizeSet == null) + bsSizeSet = new BS(); + int i0 = bs.nextSetBit(0); + if (mads == null && i0 >= 0) + mads = new short[atomCount]; + for (int i = i0, pt = 0; i >= 0; i = bs.nextSetBit(i + 1), pt++) { + short colix = (colixes == null ? 0 : colixes[pt]); + if (colix == 0) + colix = C.INHERIT_ALL; + float f = (atrans == null ? 0 : atrans[pt]); + if (f > 0.01f) + colix = C.getColixTranslucent3(colix, true, f); setColixAndPalette(colix, EnumPalette.UNKNOWN.id, i); + rd.value = sizes[pt]; + Atom atom = atoms[i]; + boolean isVisible = ((mads[i] = atom.calculateMad(viewer, rd)) > 0); + bsSizeSet.setBitTo(i, isVisible); + atom.setShapeVisibility(myVisibilityFlag, isVisible); } return; } Modified: trunk/Jmol/src/org/jmol/shapebio/BioShapeCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/shapebio/BioShapeCollection.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/shapebio/BioShapeCollection.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -154,7 +154,7 @@ bioShape.setTranslucent(isTranslucent, bsSelected, translucency); } } - return; + return; } if ("colorPhase" == propertyName) { // cartoons and ribbons only Modified: trunk/Jmol/src/org/jmol/util/GData.java =================================================================== --- trunk/Jmol/src/org/jmol/util/GData.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/util/GData.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -13,6 +13,14 @@ public ApiPlatform apiPlatform; + public boolean translucentCoverOnly = false; + public void setTranslucentCoverOnly(boolean TF) { + translucentCoverOnly = TF; + } + public boolean getTranslucentCoverOnly() { + return translucentCoverOnly; + } + protected int windowWidth, windowHeight; protected int displayMinX, displayMaxX, displayMinY, displayMaxY; protected boolean antialiasThisFrame; @@ -517,9 +525,10 @@ /** * @param stereoRotationMatrix - * @param isImageWrite TODO + * @param translucentMode + * @param isImageWrite */ - public void beginRendering(Matrix3f stereoRotationMatrix, boolean isImageWrite) { + public void beginRendering(Matrix3f stereoRotationMatrix, boolean translucentMode, boolean isImageWrite) { } public void endRendering() { @@ -681,4 +690,5 @@ public void renderAllStrings(Object jmolRenderer) { // only in Graphics3D } + } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-06-07 19:15:26 UTC (rev 18305) @@ -11,6 +11,12 @@ ___JmolVersion="13.1.17" +TODO: PyMOL uniqueAtomSettings for selected atom settings + +new feature: set translucent + -- default TRUE : translucent objects are fully translucent + -- FALSE: translucent object are opaque to other translucent objects + ============================================================================= JmolVersion="13.1.16_a" @@ -19,9 +25,6 @@ -- zoomHeight TRUE -- measurementUnits ANGSTROMS -TODO: PyMOL uniqueAtomSettings should override scene color settings -TODO: PyMOL uniqueAtomSettings for all atom settings - new feature: color BALLS -- distinct from color ATOMS because it doesn't get inherited -- for PyMOL compatability with sphere_color Modified: trunk/Jmol/src/org/jmol/viewer/StateManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateManager.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/viewer/StateManager.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -156,6 +156,7 @@ JC.DEFAULT_BOND_TOLERANCE); viewer.setFloatProperty("minBondDistance", JC.DEFAULT_MIN_BOND_DISTANCE); + viewer.setBooleanProperty("translucent", true); } void setJmolDefaults() { @@ -972,6 +973,7 @@ setB("testFlag3", testFlag3); setB("testFlag4", testFlag4); setB("traceAlpha", traceAlpha); + setB("translucent", translucent); setB("twistedSheets", twistedSheets); setB("useArcBall", useArcBall); setB("useMinimizationThread", useMinimizationThread); @@ -1141,6 +1143,7 @@ boolean rocketBarrels = false; float sheetSmoothing = 1; // 0: traceAlpha on alphas for helix, 1 on midpoints boolean traceAlpha = true; + boolean translucent = true; boolean twistedSheets = false; //misc @@ -1466,7 +1469,7 @@ boolean haveSetStructureList; private String[] userDatabases; - + public void setStructureList(float[] list, EnumStructure type) { haveSetStructureList = true; structureList.put(type, list); Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2013-06-06 22:17:52 UTC (rev 18304) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2013-06-07 19:15:26 UTC (rev 18305) @@ -4173,8 +4173,7 @@ Object image = null; try { - gdata.beginRendering(transformManager.getStereoRotationMatrix(isDouble), - isImageWrite); + beginRendering(isDouble, isImageWrite); render(); gdata.endRendering(); image = gdata.getScreenImage(isImageWrite); @@ -4186,6 +4185,12 @@ return image; } + private void beginRendering(boolean isDouble, boolean isImageWrite) { + gdata.beginRendering(transformManager.getStereoRotationMatrix(isDouble), + global.translucent, + isImageWrite); + } + private boolean antialiasDisplay; public boolean isAntialiased() { @@ -4249,13 +4254,11 @@ boolean mergeImages = (graphic == null && isStereoDouble()); Object imageBuffer; if (transformManager.stereoMode.isBiColor()) { - gdata.beginRendering(transformManager.getStereoRotationMatrix(true), - isImageWrite); + beginRendering(true, isImageWrite); render(); gdata.endRendering(); gdata.snapshotAnaglyphChannelBytes(); - gdata.beginRendering(transformManager.getStereoRotationMatrix(false), - isImageWrite); + beginRendering(false, isImageWrite); render(); gdata.endRendering(); gdata.applyAnaglygh(transformManager.stereoMode, @@ -6459,6 +6462,10 @@ private void setBooleanPropertyTok(String key, int tok, boolean value) { boolean doRepaint = true; switch (tok) { + case T.translucent: + // 13.1.17 false -> translucent objects are opaque among themselves (Pymol transparency_mode 2) + global.translucent = value; + break; case T.cartoonladders: // 13.1.15 global.cartoonLadders = value; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ How ServiceNow helps IT people transform IT departments: 1. A cloud service to automate IT design, transition and operations 2. Dashboards that offer high-level views of enterprise services 3. A single system of record for all IT processes http://p.sf.net/sfu/servicenow-d2d-j _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits