From: Miguel <mic...@us...> - 2004-05-19 23:51:18
|
Update of /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18878/src/org/openscience/jmol/viewer/datamodel Modified Files: AxesRenderer.java BbcageRenderer.java CartoonRenderer.java FrameRenderer.java MeshRenderer.java RibbonsRenderer.java RocketsRenderer.java StrandsRenderer.java TraceRenderer.java UccageRenderer.java Log Message: stopped allocating temp arrays during rendering Index: AxesRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/AxesRenderer.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- AxesRenderer.java 11 Apr 2004 20:57:20 -0000 1.13 +++ AxesRenderer.java 19 May 2004 17:15:25 -0000 1.14 @@ -36,13 +36,18 @@ String[] axisLabels = { "+X", "+Y", "+Z", null, null, null }; + final Point3i[] axisScreens = new Point3i[6]; + { + for (int i = 6; --i >= 0; ) + axisScreens[i] = new Point3i(); + } + final Point3i originScreen = new Point3i(); + void render() { Axes axes = (Axes)shape; short mad = axes.mad; if (mad == 0) return; - final Point3i[] axisScreens = frameRenderer.getTempScreens(7); - final Point3i originScreen = axisScreens[6]; viewer.transformPoint(axes.originPoint, originScreen); for (int i = 6; --i >= 0; ) Index: BbcageRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/BbcageRenderer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- BbcageRenderer.java 11 Apr 2004 20:57:20 -0000 1.3 +++ BbcageRenderer.java 19 May 2004 17:15:25 -0000 1.4 @@ -33,18 +33,23 @@ class BbcageRenderer extends ShapeRenderer { + final Point3i[] screens = new Point3i[8]; + { + for (int i = 8; --i >= 0; ) + screens[i] = new Point3i(); + } + void render() { Bbcage bbcage = (Bbcage)shape; short mad = bbcage.mad; if (mad == 0) return; - render(viewer, g3d, mad, bbcage.colix, frame.bboxVertices, - frameRenderer.getTempScreens(8)); + render(viewer, g3d, mad, bbcage.colix, frame.bboxVertices, screens); } static void render(JmolViewer viewer, Graphics3D g3d, short mad, short colix, - Point3f vertices[], Point3i screens[]) { + Point3f[] vertices, Point3i[] screens) { int zSum = 0; for (int i = 8; --i >= 0; ) { viewer.transformPoint(vertices[i], screens[i]); Index: CartoonRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/CartoonRenderer.java,v retrieving revision 1.32 retrieving revision 1.33 diff -u -r1.32 -r1.33 --- CartoonRenderer.java 19 May 2004 10:23:47 -0000 1.32 +++ CartoonRenderer.java 19 May 2004 17:15:25 -0000 1.33 @@ -34,14 +34,6 @@ class CartoonRenderer extends McpsRenderer { - //FIXME mth 2004 05 19 - get this heap memory allocation out of here - Point3i[] getTempScreens(int minLen) { - Point3i[] screens = new Point3i[minLen]; - for (int i = minLen; --i >= 0; ) - screens[i] = new Point3i(); - return screens; - } - final Point3f pointT = new Point3f(); void calc1Screen(Point3f center, Vector3f vector, @@ -55,7 +47,7 @@ Point3i[] calcScreens(Point3f[] centers, Vector3f[] vectors, short[] mads, float offsetFraction) { int count = centers.length; - Point3i[] screens = getTempScreens(count); + Point3i[] screens = viewer.allocTempScreens(count); if (offsetFraction == 0) { for (int i = count; --i >= 0; ) viewer.transformPoint(centers[i], screens[i]); @@ -85,7 +77,7 @@ void calcScreenLeadMidpoints() { int count = polymerCount + 1; - leadMidpointScreens = frameRenderer.getTempScreens(count); + leadMidpointScreens = viewer.allocTempScreens(count); for (int i = count; --i >= 0; ) { viewer.transformPoint(leadMidpoints[i], leadMidpointScreens[i]); //g3d.fillSphereCentered(Graphics3D.CYAN, 15, leadMidpointScreens[i]); @@ -101,6 +93,8 @@ short[] colixes; Point3i[] leadMidpointScreens; + Point3i[] ribbonTopScreens; + Point3i[] ribbonBottomScreens; void renderMcpschain( Mcps.Mcpschain mcpsChain) { Cartoon.Cchain strandsChain = (Cartoon.Cchain)mcpsChain; @@ -113,7 +107,6 @@ wingVectors = strandsChain.wingVectors; mads = strandsChain.mads; colixes = strandsChain.colixes; - calcScreenLeadMidpoints(); render1Chain(); } } @@ -129,12 +122,11 @@ void render1Chain() { - Point3i[] screensTop; - Point3i[] screensBottom; - screensTop = calcScreens(leadMidpoints, wingVectors, mads, + calcScreenLeadMidpoints(); + ribbonTopScreens = calcScreens(leadMidpoints, wingVectors, mads, isNucleotidePolymer ? 1f / 1000 : 0.5f / 1000); - screensBottom = calcScreens(leadMidpoints, wingVectors, mads, + ribbonBottomScreens = calcScreens(leadMidpoints, wingVectors, mads, isNucleotidePolymer ? 0f : -0.5f / 1000); boolean lastWasSpecial = false; for (int i = polymerCount; --i >= 0; ) @@ -146,23 +138,21 @@ boolean isSpecial = isSpecials[i]; if (isSpecial) { if (lastWasSpecial) - render2StrandSegment(polymerCount, - group, colix, mads, - screensTop, screensBottom, i); + render2StrandSegment(polymerCount, group, colix, mads, i); else - render2StrandArrowhead(polymerCount, - group, colix, mads, - screensTop, screensBottom, i); + render2StrandArrowhead(polymerCount, group, colix, mads, i); } else renderRopeSegment(colix, mads, i); lastWasSpecial = isSpecial; } + viewer.freeTempScreens(ribbonTopScreens); + viewer.freeTempScreens(ribbonBottomScreens); + viewer.freeTempScreens(leadMidpointScreens); } void render2StrandSegment(int polymerCount, Group group, short colix, - short[] mads, Point3i[] screensTop, - Point3i[] screensBottom, int i) { + short[] mads, int i) { int iLast = polymerCount; int iPrev = i - 1; if (iPrev < 0) iPrev = 0; int iNext = i + 1; if (iNext > iLast) iNext = iLast; @@ -172,10 +162,10 @@ //change false -> true to fill in mesh g3d.drawHermite(true, colix, isNucleotidePolymer ? 4 : 7, - screensTop[iPrev], screensTop[i], - screensTop[iNext], screensTop[iNext2], - screensBottom[iPrev], screensBottom[i], - screensBottom[iNext], screensBottom[iNext2] + ribbonTopScreens[iPrev], ribbonTopScreens[i], + ribbonTopScreens[iNext], ribbonTopScreens[iNext2], + ribbonBottomScreens[iPrev], ribbonBottomScreens[i], + ribbonBottomScreens[iNext], ribbonBottomScreens[iNext2] ); } @@ -185,8 +175,7 @@ final Point3i screenArrowBotPrev = new Point3i(); void render2StrandArrowhead(int polymerCount, Group group, short colix, - short[] mads, Point3i[] screensTop, - Point3i[] screensBottom, int i) { + short[] mads, int i) { int iLast = polymerCount; int iPrev = i - 1; if (iPrev < 0) iPrev = 0; int iNext = i + 1; if (iNext > iLast) iNext = iLast; @@ -239,342 +228,4 @@ } - - /* - - Point3i s0 = new Point3i(); - Point3i s1 = new Point3i(); - Point3i s2 = new Point3i(); - Point3i s3 = new Point3i(); - int diameterBeg, diameterMid, diameterEnd; - - Cartoon cartoon; - - void renderMcpschain(Mcps.Mcpschain mcpschain) { - Cartoon.Cchain cchain = (Cartoon.Cchain)mcpschain; - render1Chain(cchain.polymer, cchain.mads, cchain.colixes); - } - - void render1Chain(Polymer polymer, short[] mads, short[] colixes) { - if (! (polymer instanceof AminoPolymer)) - return; - initializeChain((AminoPolymer)polymer); - clearPending(); - for (int i = 0; i < polymerCount; ++i) { - if (mads[i] == 0) - continue; - short colix = colixes[i]; - if (colix == 0) - colix = alphas[i].colixAtom; - Group group = polymerGroups[i]; - if (group.isHelixOrSheet()) { - // System.out.println("renderSpecialSegment[" + i + "]"); - renderSpecialSegment(group, colix, mads[i]); - } else { - // System.out.println("renderRopeSegment[" + i + "]"); - renderRopeSegment(colix, mads, i); - } - } - renderPending(); - } - - int polymerCount; - Group[] polymerGroups; - Point3i[] leadMidpointScreens; - Atom[] alphas; - - void initializeChain(AminoPolymer aminopolymer) { - polymerGroups = aminopolymer.getGroups(); - polymerCount = aminopolymer.getCount(); - calcIsSpecials(); - calcScreenLeadMidpoints(aminopolymer.leadMidpoints); - alphas = getAlphas(); - } - - void calcScreenLeadMidpoints(Point3f[] leadMidpoints) { - int count = polymerCount + 1; - leadMidpointScreens = frameRenderer.getTempScreens(count); - for (int i = count; --i >= 0; ) { - viewer.transformPoint(leadMidpoints[i], leadMidpointScreens[i]); - g3d.fillSphereCentered(Graphics3D.CYAN, 15, leadMidpointScreens[i]); - } - } - - Atom[] getAlphas() { - Atom[] alphas = frameRenderer.getTempAtoms(polymerCount); - for (int i = polymerCount; --i >= 0; ) - alphas[i] = polymerGroups[i].getAlphaCarbonAtom(); - return alphas; - } - - void renderRopeSegment(short colix, short[] mads, int i) { - int iPrev1 = i - 1; if (iPrev1 < 0) iPrev1 = 0; - int iNext1 = i + 1; if (iNext1 > polymerCount) iNext1 = polymerCount; - int iNext2 = i + 2; if (iNext2 > polymerCount) iNext2 = polymerCount; - - int madThis, madBeg, madEnd; - madThis = madBeg = madEnd = mads[i]; - if (! isSpecials[iPrev1]) - madBeg = (mads[iPrev1] + madThis) / 2; - if (! isSpecials[iNext1]) - madEnd = (mads[iNext1] + madThis) / 2; - int diameterBeg = viewer.scaleToScreen(leadMidpointScreens[i].z, madBeg); - int diameterEnd = viewer.scaleToScreen(leadMidpointScreens[iNext1].z, madEnd); - int diameterMid = viewer.scaleToScreen(alphas[i].getScreenZ(), madThis); - g3d.fillHermite(colix, 3, diameterBeg, diameterMid, diameterEnd, - leadMidpointScreens[iPrev1], leadMidpointScreens[i], - leadMidpointScreens[iNext1], leadMidpointScreens[iNext2]); -// System.out.println("render1Segment: iPrev1=" + iPrev1 + -// " i=" + i + " iNext1=" + iNext1 + " iNext2=" + iNext2 + -// " leadMidpointScreens[i]=" + leadMidpointScreens[i] + " colix=" + colix + -// " mads[i]=" + mads[i]); - } - - final Point3i screenA = new Point3i(); - Point3i screenB = new Point3i(); - Point3i screenC = new Point3i(); - - void renderSpecialSegment(Group group, short colix, short mad) { - AminoStructure aminostructure = group.aminostructure; - if (tPending) { - if (aminostructure == aminostructurePending && - mad == madPending && - colix == colixPending && - aminostructure.getIndex(group) == endIndexPending + 1) { - ++endIndexPending; - return; - } - renderPending(); - } - aminostructurePending = aminostructure; - startIndexPending = endIndexPending = aminostructure.getIndex(group); - colixPending = colix; - madPending = mad; - tPending = true; - } - - boolean tPending; - AminoStructure aminostructurePending; - int startIndexPending; - int endIndexPending; - short madPending; - short colixPending; - int[] shadesPending; - - void clearPending() { - tPending = false; - } - - void renderPending() { - if (tPending) { - Point3f[] segments = aminostructurePending.getSegments(); - boolean tEnd = - (endIndexPending == aminostructurePending.getPolymerCount() - 1); - -// -// System.out.println("structurePending.getPolymerCount()=" + -// structurePending.getPolymerCount()); -// System.out.println("segments.length=" + segments.length); -// System.out.println(" startIndexPending=" + startIndexPending + -// " endIndexPending=" + endIndexPending); -// System.out.println("tEnd=" + tEnd); - if (aminostructurePending instanceof Helix) - renderPendingHelix(segments[startIndexPending], - segments[endIndexPending], - segments[endIndexPending + 1], - tEnd); - else - renderPendingSheet(segments[startIndexPending], - segments[endIndexPending], - segments[endIndexPending + 1], - tEnd); - tPending = false; - } - } - - void renderPendingHelix(Point3f pointStart, Point3f pointBeforeEnd, - Point3f pointEnd, boolean tEnd) { - viewer.transformPoint(pointStart, screenA); - viewer.transformPoint(pointEnd, screenB); - if (tEnd) { - viewer.transformPoint(pointBeforeEnd, screenC); - int capDiameter = - viewer.scaleToScreen(screenC.z, madPending + (madPending >> 2)); - g3d.fillCone(colixPending, Graphics3D.ENDCAPS_FLAT, capDiameter, - screenC, screenB); - if (startIndexPending == endIndexPending) - return; - Point3i t = screenB; - screenB = screenC; - screenC = t; - } - int zMid = (screenA.z + screenB.z) / 2; - int diameter = viewer.scaleToScreen(zMid, madPending); - g3d.fillCylinder(colixPending, Graphics3D.ENDCAPS_FLAT, diameter, - screenA, screenB); - } - - void renderPendingSheet(Point3f pointStart, Point3f pointBeforeEnd, - Point3f pointEnd, boolean tEnd) { - shadesPending = g3d.getShades(colixPending); - if (tEnd) { - drawArrowHeadBox(pointBeforeEnd, pointEnd); - drawBox(pointStart, pointBeforeEnd); - } else { - drawBox(pointStart, pointEnd); - } - } - - final Point3f pointTipOffset = new Point3f(); - final Point3f pointArrow2 = new Point3f(); - final Vector3f vectorNormal = new Vector3f(); - - final Vector3f scaledWidthVector = new Vector3f(); - final Vector3f scaledHeightVector = new Vector3f(); - - final static byte arrowHeadFaces[] = - {0, 1, 3, 2, - 0, 4, 5, 2, - 1, 4, 5, 3}; - - void drawArrowHeadBox(Point3f base, Point3f tip) { - Sheet sheet = (Sheet)aminostructurePending; - float scale = madPending / 1000f; - scaledWidthVector.set(sheet.getWidthUnitVector()); - scaledWidthVector.scale(scale * 1.25f); - scaledHeightVector.set(sheet.getHeightUnitVector()); - scaledHeightVector.scale(scale / 3); - pointCorner.add(scaledWidthVector, scaledHeightVector); - pointCorner.scaleAdd(-0.5f, base); - pointTipOffset.set(scaledHeightVector); - pointTipOffset.scaleAdd(-0.5f, tip); - buildArrowHeadBox(pointCorner, scaledWidthVector, - scaledHeightVector, pointTipOffset); - int argb = calcSurfaceArgb(0, 1, 4); - g3d.fillTriangle(colixPending, - screenCorners[0], - screenCorners[1], - screenCorners[4]); - g3d.fillTriangle(colixPending, - screenCorners[2], - screenCorners[3], - screenCorners[5]); - for (int i = 0; i < 12; i += 4) { - int i0 = arrowHeadFaces[i]; - int i1 = arrowHeadFaces[i + 1]; - int i2 = arrowHeadFaces[i + 2]; - int i3 = arrowHeadFaces[i + 3]; - argb = calcSurfaceArgb(i0, i1, i3); - g3d.fillQuadrilateral(colixPending, - screenCorners[i0], - screenCorners[i1], - screenCorners[i2], - screenCorners[i3]); - } -// Sheet sheet = (Sheet)structurePending; -// Vector3f widthUnitVector = sheet.getWidthUnitVector(); -// Vector3f heightUnitVector = sheet.getHeightUnitVector(); -// float widthScale = (madPending + madPending >> 2) / 2 / 1000f; - -// pointArrow1.set(widthUnitVector); -// pointArrow1.scaleAdd(-widthScale, base); -// viewer.transformPoint(pointArrow1, screenA); - -// pointArrow2.set(widthUnitVector); -// pointArrow2.scaleAdd(widthScale, base); -// viewer.transformPoint(pointArrow2, screenB); - -// viewer.transformPoint(tip, screenC); - -// viewer.transformVector(heightUnitVector, vectorNormal); - -// g3d.drawfillTriangle(colixPending, vectorNormal, -// screenA, screenB, screenC); - } - - final Vector3f lengthVector = new Vector3f(); - final Point3f pointCorner = new Point3f(); - - void drawBox(Point3f pointA, Point3f pointB) { - Sheet sheet = (Sheet)aminostructurePending; - float scale = madPending / 1000f; - scaledWidthVector.set(sheet.getWidthUnitVector()); - scaledWidthVector.scale(scale); - scaledHeightVector.set(sheet.getHeightUnitVector()); - scaledHeightVector.scale(scale / 4); - pointCorner.add(scaledWidthVector, scaledHeightVector); - pointCorner.scaleAdd(-0.5f, pointA); - lengthVector.sub(pointB, pointA); - buildBox(pointCorner, scaledWidthVector, - scaledHeightVector, lengthVector); - for (int i = 0; i < 6; ++i) { - int i0 = boxFaces[i * 4]; - int i1 = boxFaces[i * 4 + 1]; - int i2 = boxFaces[i * 4 + 2]; - int i3 = boxFaces[i * 4 + 3]; - int argb = calcSurfaceArgb(i0, i1, i3); - g3d.fillQuadrilateral(colixPending, - screenCorners[i0], - screenCorners[i1], - screenCorners[i2], - screenCorners[i3]); - } - } - - int calcSurfaceArgb(int iA, int iB, int iC) { - return shadesPending[viewer.calcSurfaceIntensity(corners[iA], - corners[iB], - corners[iC])]; - } - - final static byte[] boxFaces = - { - 0, 1, 3, 2, - 0, 2, 6, 4, - 0, 4, 5, 1, - 7, 5, 4, 6, - 7, 6, 2, 3, - 7, 3, 1, 5 }; - - final Point3f[] corners = new Point3f[8]; - final Point3f[] screenCorners = new Point3f[8]; - { - for (int i = 8; --i >= 0; ) { - screenCorners[i] = new Point3f(); - corners[i] = new Point3f(); - } - } - - void buildBox(Point3f pointCorner, Vector3f scaledWidthVector, - Vector3f scaledHeightVector, Vector3f lengthVector) { - for (int i = 8; --i >= 0; ) { - Point3f corner = corners[i]; - corner.set(pointCorner); - if ((i & 1) != 0) - corner.add(scaledWidthVector); - if ((i & 2) != 0) - corner.add(scaledHeightVector); - if ((i & 4) != 0) - corner.add(lengthVector); - viewer.transformPoint(corner, screenCorners[i]); - } - } - - void buildArrowHeadBox(Point3f pointCorner, Vector3f scaledWidthVector, - Vector3f scaledHeightVector, Point3f pointTip) { - for (int i = 4; --i >= 0; ) { - Point3f corner = corners[i]; - corner.set(pointCorner); - if ((i & 1) != 0) - corner.add(scaledWidthVector); - if ((i & 2) != 0) - corner.add(scaledHeightVector); - viewer.transformPoint(corner, screenCorners[i]); - } - corners[4].set(pointTip); - viewer.transformPoint(pointTip, screenCorners[4]); - corners[5].add(pointTip, scaledHeightVector); - viewer.transformPoint(corners[5], screenCorners[5]); - } - */ } Index: FrameRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/FrameRenderer.java,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- FrameRenderer.java 3 May 2004 23:38:19 -0000 1.43 +++ FrameRenderer.java 19 May 2004 17:15:26 -0000 1.44 @@ -116,6 +116,7 @@ g3d.drawString(str, colix, xStrBaseline, yStrBaseline, z); } + /* private Point3i[] tempScreens = new Point3i[32]; { for (int i = tempScreens.length; --i >= 0; ) @@ -132,6 +133,7 @@ } return tempScreens; } + */ private Point3f[] tempPoints = new Point3f[32]; { Index: MeshRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/MeshRenderer.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- MeshRenderer.java 13 May 2004 15:14:46 -0000 1.8 +++ MeshRenderer.java 19 May 2004 17:15:26 -0000 1.9 @@ -37,23 +37,11 @@ Mesh strands; - Point3i[] getTempScreens(int minLen) { - Point3i[] screensT = new Point3i[0];//DC: made local - if (screensT.length < minLen) { - Point3i[] t = new Point3i[minLen]; - System.arraycopy(screensT, 0, t, 0, screensT.length); - for (int i = screensT.length; i < t.length; ++i) - t[i] = new Point3i(); - screensT = t; - } - return screensT; - } - Point3i[] calcScreens(Point3f[] centers, Vector3f[] vectors, - short[] mads, float offsetFraction) { - - Point3f pointT = new Point3f(); //DC: made local - Point3i[] screens = getTempScreens(centers.length); + short[] mads, float offsetFraction) { + + Point3f pointT = new Point3f(); //DC: made local + Point3i[] screens = viewer.allocTempScreens(centers.length); if (offsetFraction == 0) { for (int i = centers.length; --i >= 0; ) viewer.transformPoint(centers[i], screens[i]); @@ -98,28 +86,34 @@ void render1Chain(int polymerCount, Group[] groups, Point3f[] centers, Vector3f[] vectors, short[] mads, short[] colixes) { - Point3i[] screensTop; - Point3i[] screensBottom; - Point3i[] screens; + Point3i[] ribbonTopScreens; + Point3i[] ribbonBottomScreens; int j = strandCount >> 1; float offset = (j * strandSeparation) + baseOffset; - screensTop = calcScreens(centers, vectors, mads, offset); - screensBottom = calcScreens(centers, vectors, mads, -offset); + ribbonTopScreens = calcScreens(centers, vectors, mads, offset); + ribbonBottomScreens = calcScreens(centers, vectors, mads, -offset); render2Strand(polymerCount, groups, mads, colixes, - screensTop, screensBottom); + ribbonTopScreens, ribbonBottomScreens); + viewer.freeTempScreens(ribbonTopScreens); + viewer.freeTempScreens(ribbonBottomScreens); + Point3i[] screens; for (int i = strandCount >> 1; --i >= 0; ) { float f = (i * strandSeparation) + baseOffset; screens = calcScreens(centers, vectors, mads, f); render1Strand(polymerCount, groups, mads, colixes, screens); + viewer.freeTempScreens(screens); screens = calcScreens(centers, vectors, mads, -f); render1Strand(polymerCount, groups, mads, colixes, screens); + viewer.freeTempScreens(screens); } if ((strandCount & 1) != 0) { screens = calcScreens(centers, vectors, mads, 0f); render1Strand(polymerCount, groups, mads, colixes, screens); + viewer.freeTempScreens(screens); } + } @@ -145,18 +139,18 @@ } void render2Strand(int polymerCount, Group[] groups, short[] mads, - short[] colixes, Point3i[] screensTop, - Point3i[] screensBottom) { + short[] colixes, Point3i[] ribbonTopScreens, + Point3i[] ribbonBottomScreens) { for (int i = polymerCount; --i >= 0; ) if (mads[i] > 0) render2StrandSegment(polymerCount, groups[i], colixes[i], mads, - screensTop, screensBottom, i); + ribbonTopScreens, ribbonBottomScreens, i); } void render2StrandSegment(int polymerCount, Group group, short colix, - short[] mads, Point3i[] screensTop, - Point3i[] screensBottom, int i) { + short[] mads, Point3i[] ribbonTopScreens, + Point3i[] ribbonBottomScreens, int i) { int iLast = polymerCount; int iPrev = i - 1; if (iPrev < 0) iPrev = 0; int iNext = i + 1; if (iNext > iLast) iNext = iLast; @@ -167,10 +161,10 @@ //change false -> true to fill in mesh g3d.drawHermite(false, colix, isNucleotidePolymer ? 4 : 7, - screensTop[iPrev], screensTop[i], - screensTop[iNext], screensTop[iNext2], - screensBottom[iPrev], screensBottom[i], - screensBottom[iNext], screensBottom[iNext2] + ribbonTopScreens[iPrev], ribbonTopScreens[i], + ribbonTopScreens[iNext], ribbonTopScreens[iNext2], + ribbonBottomScreens[iPrev], ribbonBottomScreens[i], + ribbonBottomScreens[iNext], ribbonBottomScreens[iNext2] ); } } Index: RibbonsRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/RibbonsRenderer.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- RibbonsRenderer.java 16 May 2004 12:43:21 -0000 1.17 +++ RibbonsRenderer.java 19 May 2004 17:15:26 -0000 1.18 @@ -37,19 +37,12 @@ Ribbons strands; - Point3i[] getTempScreens(int minLen) { - Point3i[] screens = new Point3i[minLen]; - for (int i = minLen; --i >= 0; ) - screens[i] = new Point3i(); - return screens; - } - final Point3f pointT = new Point3f(); Point3i[] calcScreens(Point3f[] centers, Vector3f[] vectors, short[] mads, float offsetFraction) { - Point3i[] screens = getTempScreens(centers.length); + Point3i[] screens = viewer.allocTempScreens(centers.length); if (offsetFraction == 0) { for (int i = centers.length; --i >= 0; ) viewer.transformPoint(centers[i], screens[i]); @@ -84,30 +77,33 @@ void render1Chain(int polymerCount, Group[] groups, Point3f[] centers, Vector3f[] vectors, short[] mads, short[] colixes) { - Point3i[] screensTop; - Point3i[] screensBottom; + Point3i[] ribbonTopScreens; + Point3i[] ribbonBottomScreens; - screensTop = calcScreens(centers, vectors, mads, + ribbonTopScreens = calcScreens(centers, vectors, mads, isNucleotidePolymer ? 1f : 0.5f); - screensBottom = calcScreens(centers, vectors, mads, + ribbonBottomScreens = calcScreens(centers, vectors, mads, isNucleotidePolymer ? 0f : -0.5f); render2Strand(polymerCount, groups, mads, colixes, - screensTop, screensBottom); + ribbonTopScreens, ribbonBottomScreens); + viewer.freeTempScreens(ribbonTopScreens); + viewer.freeTempScreens(ribbonBottomScreens); } void render2Strand(int polymerCount, Group[] groups, short[] mads, short[] colixes, - Point3i[] screensTop, Point3i[] screensBottom) { + Point3i[] ribbonTopScreens, + Point3i[] ribbonBottomScreens) { for (int i = polymerCount; --i >= 0; ) if (mads[i] > 0) render2StrandSegment(polymerCount, groups[i], colixes[i], mads, - screensTop, screensBottom, i); + ribbonTopScreens, ribbonBottomScreens, i); } void render2StrandSegment(int polymerCount, Group group, short colix, - short[] mads, Point3i[] screensTop, - Point3i[] screensBottom, int i) { + short[] mads, Point3i[] ribbonTopScreens, + Point3i[] ribbonBottomScreens, int i) { int iLast = polymerCount; int iPrev = i - 1; if (iPrev < 0) iPrev = 0; int iNext = i + 1; if (iNext > iLast) iNext = iLast; @@ -117,10 +113,10 @@ //change false -> true to fill in mesh g3d.drawHermite(true, colix, isNucleotidePolymer ? 4 : 7, - screensTop[iPrev], screensTop[i], - screensTop[iNext], screensTop[iNext2], - screensBottom[iPrev], screensBottom[i], - screensBottom[iNext], screensBottom[iNext2] + ribbonTopScreens[iPrev], ribbonTopScreens[i], + ribbonTopScreens[iNext], ribbonTopScreens[iNext2], + ribbonBottomScreens[iPrev], ribbonBottomScreens[i], + ribbonBottomScreens[iNext], ribbonBottomScreens[iNext2] ); } } Index: RocketsRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/RocketsRenderer.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RocketsRenderer.java 15 May 2004 09:28:46 -0000 1.1 +++ RocketsRenderer.java 19 May 2004 17:15:26 -0000 1.2 @@ -68,6 +68,7 @@ } } renderPending(); + viewer.freeTempScreens(screens); } int polymerCount; @@ -126,7 +127,7 @@ Point3i[] getScreens() { int count = polymerCount + 1; - Point3i[] screens = frameRenderer.getTempScreens(count); + Point3i[] screens = viewer.allocTempScreens(count); for (int i = count; --i >= 0; ) { viewer.transformPoint(cordMidPoints[i], screens[i]); // g3d.fillSphereCentered(Colix.CYAN, 15, screens[i]); Index: StrandsRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/StrandsRenderer.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- StrandsRenderer.java 13 May 2004 15:14:46 -0000 1.22 +++ StrandsRenderer.java 19 May 2004 17:15:26 -0000 1.23 @@ -39,7 +39,7 @@ Point3i[] calcScreens(Point3f[] centers, Vector3f[] vectors, short[] mads, float offsetFraction) { - Point3i[] screens = frameRenderer.getTempScreens(centers.length); + Point3i[] screens = viewer.allocTempScreens(centers.length); if (offsetFraction == 0) { for (int i = centers.length; --i >= 0; ) viewer.transformPoint(centers[i], screens[i]); @@ -91,12 +91,15 @@ float f = (i * strandSeparation) + baseOffset; screens = calcScreens(centers, vectors, mads, f); render1Strand(polymerCount, groups, mads, colixes, screens); + viewer.freeTempScreens(screens); screens = calcScreens(centers, vectors, mads, -f); render1Strand(polymerCount, groups, mads, colixes, screens); + viewer.freeTempScreens(screens); } if ((strandCount & 1) != 0) { screens = calcScreens(centers, vectors, mads, 0f); render1Strand(polymerCount, groups, mads, colixes, screens); + viewer.freeTempScreens(screens); } } Index: TraceRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/TraceRenderer.java,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- TraceRenderer.java 13 May 2004 15:14:46 -0000 1.29 +++ TraceRenderer.java 19 May 2004 17:15:26 -0000 1.30 @@ -57,6 +57,7 @@ void render1Chain(Polymer polymer, int count, Group[] groups, short[] mads, short[] colixes) { if (count > 0) { + screens = viewer.allocTempScreens(count + 1); calcMidPoints(polymer, count, groups); for (int i = count; --i >= 0; ) { if (mads[i] == 0) @@ -66,11 +67,11 @@ colix = centerAtoms[i].colixAtom; render1Segment(colix, mads, i, count); } + viewer.freeTempScreens(screens); } } void calcMidPoints(Polymer polymer, int count, Group[] groups) { - screens = frameRenderer.getTempScreens(count + 1); centerAtoms = frameRenderer.getTempAtoms(count); Atom atomPrev = centerAtoms[0] = polymer.getLeadAtom(0); setScreen(atomPrev, screens[0]); Index: UccageRenderer.java =================================================================== RCS file: /cvsroot/jmol/Jmol/src/org/openscience/jmol/viewer/datamodel/UccageRenderer.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- UccageRenderer.java 3 May 2004 07:22:22 -0000 1.6 +++ UccageRenderer.java 19 May 2004 17:15:26 -0000 1.7 @@ -42,6 +42,12 @@ fid = g3d.getFontFid("Monospaced", 12); } + final Point3i[] screens = new Point3i[8]; + { + for (int i = 8; --i >= 0; ) + screens[i] = new Point3i(); + } + void render() { Uccage uccage = (Uccage)shape; short mad = uccage.mad; @@ -49,7 +55,7 @@ if (mad == 0 || ! uccage.hasUnitcell) return; BbcageRenderer.render(viewer, g3d, mad, colix, frame.unitcellVertices, - frameRenderer.getTempScreens(8)); + screens); /* render(viewer, g3d, mad, bbox.colix, bbox.bboxVertices, bboxScreens); |