From: Miguel <mig...@us...> - 2005-09-03 15:35:36
|
Update of /cvsroot/jmol/Jmol/src/org/jmol/viewer In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20803/src/org/jmol/viewer Modified Files: Sasurface.java SasurfaceRenderer.java Added Files: SasCache.java Log Message: split out solvent accessible surface point cache --- NEW FILE: SasCache.java --- /* $RCSfile: SasCache.java,v $ * $Author: migueljmol $ * $Date: 2005/09/03 15:35:22 $ * $Revision: 1.1 $ * * Copyright (C) 2005 Miguel, Jmol Development, www.jmol.org * * Contact: mi...@jm... * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. */ package org.jmol.viewer; import javax.vecmath.*; import org.jmol.util.Bmp; class SasCache { final Viewer viewer; SasCache(Viewer viewer, int atomCacheSize, int geodesicVertexCount) { this.viewer = viewer; allocAtomCache(atomCacheSize, geodesicVertexCount); } //////////////////////////////////////////////////////////////// // atom cache support //////////////////////////////////////////////////////////////// int atomCacheSize; int atomScreensLength; Point3i[][] atomCacheScreens; int[] atomCacheAtomIndexes; int atomCacheLruClock; int[] atomCacheLrus; Vector3f[] atomCacheTransformedGeodesicVectors; void allocAtomCache(int atomCacheSize, int geodesicVertexCount) { this.atomCacheSize = atomCacheSize; atomCacheScreens = new Point3i[atomCacheSize][]; atomCacheAtomIndexes = new int[atomCacheSize]; atomCacheLrus = new int[atomCacheSize]; this.atomScreensLength = geodesicVertexCount; for (int i = atomCacheSize; --i >= 0; ) { atomCacheScreens[i] = viewer.allocTempScreens(atomScreensLength); atomCacheAtomIndexes[i] = -1; atomCacheLrus[i] = -1; } atomCacheLruClock = 0; atomCacheTransformedGeodesicVectors = viewer.g3d.getTransformedVertexVectors(); } Point3i[] lookupAtomScreens(Atom atom, int[] vertexMap) { int atomIndex = atom.atomIndex; for (int i = atomCacheSize; --i >= 0; ) { if (atomCacheAtomIndexes[i] == atomIndex) { atomCacheLrus[i] = atomCacheLruClock++; return atomCacheScreens[i]; } } int iOldest = 0; int lruOldest = atomCacheLrus[0]; for (int i = atomCacheSize; --i > 0; ) { // only > 0 if (atomCacheLrus[i] < lruOldest) { lruOldest = atomCacheLrus[i]; iOldest = i; } } Point3i[] screens = atomCacheScreens[iOldest]; calcAtomScreens(atom, vertexMap, screens); atomCacheAtomIndexes[iOldest] = atomIndex; atomCacheLrus[iOldest] = atomCacheLruClock++; return screens; } void touchAtomScreens(Point3i[] screens) { for (int i = atomCacheSize; --i >= 0; ) { if (screens == atomCacheScreens[i]) { atomCacheLrus[i] = atomCacheLruClock++; return; } } throw new NullPointerException(); } void free() { for (int i = atomCacheSize; --i >= 0; ) { atomCacheScreens[i] = null; atomCacheAtomIndexes[i] = -1; atomCacheLrus[i] = -1; } } void calcAtomScreens(Atom atom, int[] vertexMap, Point3i[] screens) { float radius = atom.getVanderwaalsRadiusFloat(); int atomX = atom.getScreenX(); int atomY = atom.getScreenY(); int atomZ = atom.getScreenZ(); float scaledRadius = viewer.scaleToScreen(atomZ, radius); for (int vertex = Bmp.getMaxMappedBit(vertexMap); --vertex >= 0; ) { if (! Bmp.getBit(vertexMap, vertex)) continue; Vector3f tv = atomCacheTransformedGeodesicVectors[vertex]; Point3i screen = screens[vertex]; screen.x = atomX + (int)(scaledRadius * tv.x); screen.y = atomY - (int)(scaledRadius * tv.y); // y inverted on screen! screen.z = atomZ - (int)(scaledRadius * tv.z); // smaller z comes to me } } //////////////////////////////////////////////////////////////// // Torus cache support //////////////////////////////////////////////////////////////// int torusCacheSize; int torusScreensLength; Point3i[][] torusCacheScreens; Sasurface1.Torus[] torusCacheToruses; int torusCacheLruClock; int[] torusCacheLrus; Vector3f[] torusCacheTransformedGeodesicVectors; static final int INNER_TORUS_STEP_COUNT = Sasurface1.INNER_TORUS_STEP_COUNT; static final int OUTER_TORUS_STEP_COUNT = Sasurface1.OUTER_TORUS_STEP_COUNT; static final int MAX_TORUS_POINTS = INNER_TORUS_STEP_COUNT * OUTER_TORUS_STEP_COUNT; final Point3f[] torusPointsT = new Point3f[MAX_TORUS_POINTS]; final Point3i[] torusScreens = new Point3i[MAX_TORUS_POINTS]; void allocTorusCache(int torusCacheSize) { this.torusCacheSize = torusCacheSize; torusCacheScreens = new Point3i[torusCacheSize][]; torusCacheToruses = new Sasurface1.Torus[torusCacheSize]; torusCacheLrus = new int[torusCacheSize]; this.atomScreensLength = MAX_TORUS_POINTS; for (int i = torusCacheSize; --i >= 0; ) { torusCacheScreens[i] = viewer.allocTempScreens(torusScreensLength); torusCacheToruses[i] = null; torusCacheLrus[i] = -1; } torusCacheLruClock = 0; } Point3i[] lookupTorusScreens(Sasurface1.Torus torus) { for (int i = torusCacheSize; --i >= 0; ) { if (torusCacheToruses[i] == torus) { torusCacheLrus[i] = torusCacheLruClock++; return torusCacheScreens[i]; } } int iOldest = 0; int lruOldest = torusCacheLrus[0]; for (int i = torusCacheSize; --i > 0; ) { // only > 0 if (torusCacheLrus[i] < lruOldest) { lruOldest = torusCacheLrus[i]; iOldest = i; } } Point3i[] screens = torusCacheScreens[iOldest]; torus.calcPoints(torusPointsT); torus.calcScreens(torusPointsT, screens); torusCacheToruses[iOldest] = torus; torusCacheLrus[iOldest] = torusCacheLruClock++; return screens; } } Index: Sasurface.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/jmol/viewer/Sasurface.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- Sasurface.java 16 Aug 2005 15:57:12 -0000 1.3 +++ Sasurface.java 3 Sep 2005 15:35:22 -0000 1.4 @@ -30,6 +30,7 @@ class Sasurface extends Shape { + final static int MAX_GEODESIC_RENDERING_LEVEL = 2; int surfaceCount; Sasurface1[] surfaces = new Sasurface1[4]; Index: SasurfaceRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/jmol/viewer/SasurfaceRenderer.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- SasurfaceRenderer.java 22 Aug 2005 15:36:06 -0000 1.6 +++ SasurfaceRenderer.java 3 Sep 2005 15:35:22 -0000 1.7 @@ -43,14 +43,18 @@ int geodesicFaceCount; short[] geodesicFaceVertexes; short[] geodesicFaceNormixes; - ScreensCache screensCache; + SasCache sasCache; + // ScreensCache screensCache; float radiusP; Vector3f[] transformedProbeVertexes; Point3i[] probeScreens; void initRenderer() { - screensCache = new ScreensCache(viewer, 6); + int maxVertexCount = + g3d.getGeodesicVertexCount(Sasurface.MAX_GEODESIC_RENDERING_LEVEL); + sasCache = + new SasCache(viewer, 6, maxVertexCount); } void render() { @@ -78,7 +82,6 @@ int renderingLevel = surface.geodesicRenderingLevel; radiusP = surface.radiusP; geodesicVertexCount = surface.geodesicVertexCount; - screensCache.alloc(geodesicVertexCount); geodesicFaceCount = g3d.getGeodesicFaceCount(renderingLevel); geodesicFaceVertexes = @@ -119,7 +122,6 @@ renderCavity(cavities[i], atoms, colixesConvex, convexVertexMaps); - screensCache.free(); } void allocTransformedProbeVertexes() { @@ -142,7 +144,7 @@ short colix, int[] vertexMap, int[] faceMap) { if (hideConvex) return; - Point3i[] screens = screensCache.lookup(atom, vertexMap); + Point3i[] screens = sasCache.lookupAtomScreens(atom, vertexMap); colix = Graphics3D.inheritColix(colix, atom.colixAtom); if (CONVEX_DOTS) { int[] edgeVertexes = surface.calcEdgeVertexes(vertexMap); @@ -421,12 +423,12 @@ screen = viewer.transformPoint(cavity.pointPK); g3d.fillSphereCentered(Graphics3D.BLUE, 4, screen); } - Point3i[] screensI = screensCache.lookup(atomI, - convexVertexMaps[ixI]); - Point3i[] screensJ = screensCache.lookup(atomJ, - convexVertexMaps[ixJ]); - Point3i[] screensK = screensCache.lookup(atomK, - convexVertexMaps[ixK]); + Point3i[] screensI = + sasCache.lookupAtomScreens(atomI, convexVertexMaps[ixI]); + Point3i[] screensJ = + sasCache.lookupAtomScreens(atomJ, convexVertexMaps[ixJ]); + Point3i[] screensK = + sasCache.lookupAtomScreens(atomK, convexVertexMaps[ixK]); if (CAVITY_DOTS) { g3d.fillSphereCentered(Graphics3D.RED, 8, screensI[vertexI]); g3d.fillSphereCentered(Graphics3D.GREEN, 8, screensJ[vertexJ]); @@ -451,6 +453,7 @@ } } +/* class ScreensCache { final Viewer viewer; @@ -540,3 +543,4 @@ } } } +*/ |