Bugzilla – Attachment 86 Details for
Bug 245
glutSolidCylinder missing from com.sun.opengl.util.GLUT
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
Log In
[x]
|
Forgot Password
Login:
[x]
new GLUT class with glutSolidCylinder, glutWireCylinder, glutSolidRhombicDodecahedron, and glutWireRhombicDodecahedron
GLUT.java (text/plain), 42.95 KB, created by
Sven Gothel
on 2006-09-02 10:28:00 CEST
(
hide
)
Description:
new GLUT class with glutSolidCylinder, glutWireCylinder, glutSolidRhombicDodecahedron, and glutWireRhombicDodecahedron
Filename:
MIME Type:
Creator:
Sven Gothel
Created:
2006-09-02 10:28:00 CEST
Size:
42.95 KB
patch
obsolete
>/* > * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. > * > * Redistribution and use in source and binary forms, with or without > * modification, are permitted provided that the following conditions are > * met: > * > * - Redistribution of source code must retain the above copyright > * notice, this list of conditions and the following disclaimer. > * > * - Redistribution in binary form must reproduce the above copyright > * notice, this list of conditions and the following disclaimer in the > * documentation and/or other materials provided with the distribution. > * > * Neither the name of Sun Microsystems, Inc. or the names of > * contributors may be used to endorse or promote products derived from > * this software without specific prior written permission. > * > * This software is provided "AS IS," without a warranty of any kind. ALL > * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, > * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A > * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN > * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR > * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR > * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR > * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR > * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE > * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, > * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF > * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. > * > * You acknowledge that this software is not designed or intended for use > * in the design, construction, operation or maintenance of any nuclear > * facility. > * > * Sun gratefully acknowledges that this software was originally authored > * and developed by Kenneth Bradley Russell and Christopher John Kline. > */ > >package com.sun.opengl.util; > >import javax.media.opengl.*; >import javax.media.opengl.glu.*; > >/** Subset of the routines provided by the GLUT interface. Note the > signatures of many of the methods are necessarily different than > the corresponding C version. A GLUT object must only be used from > one particular thread at a time. <P> > > Copyright (c) Mark J. Kilgard, 1994, 1997. <P> > > (c) Copyright 1993, Silicon Graphics, Inc. <P> > > ALL RIGHTS RESERVED <P> > > Permission to use, copy, modify, and distribute this software > for any purpose and without fee is hereby granted, provided > that the above copyright notice appear in all copies and that > both the copyright notice and this permission notice appear in > supporting documentation, and that the name of Silicon > Graphics, Inc. not be used in advertising or publicity > pertaining to distribution of the software without specific, > written prior permission. <P> > > THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU > "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR > OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF > MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO > EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE > ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR > CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER, > INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE, > SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR > NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY > OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, > ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR > PERFORMANCE OF THIS SOFTWARE. <P> > > US Government Users Restricted Rights <P> > > Use, duplication, or disclosure by the Government is subject to > restrictions set forth in FAR 52.227.19(c)(2) or subparagraph > (c)(1)(ii) of the Rights in Technical Data and Computer > Software clause at DFARS 252.227-7013 and/or in similar or > successor clauses in the FAR or the DOD or NASA FAR > Supplement. Unpublished-- rights reserved under the copyright > laws of the United States. Contractor/manufacturer is Silicon > Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA > 94039-7311. <P> > > OpenGL(TM) is a trademark of Silicon Graphics, Inc. <P> >*/ > >public class GLUT { > public static final int STROKE_ROMAN = 0; > public static final int STROKE_MONO_ROMAN = 1; > public static final int BITMAP_9_BY_15 = 2; > public static final int BITMAP_8_BY_13 = 3; > public static final int BITMAP_TIMES_ROMAN_10 = 4; > public static final int BITMAP_TIMES_ROMAN_24 = 5; > public static final int BITMAP_HELVETICA_10 = 6; > public static final int BITMAP_HELVETICA_12 = 7; > public static final int BITMAP_HELVETICA_18 = 8; > > private GLU glu = new GLU(); > > //---------------------------------------------------------------------- > // Shapes > // > > public void glutWireSphere(double radius, int slices, int stacks) { > quadObjInit(glu); > glu.gluQuadricDrawStyle(quadObj, GLU.GLU_LINE); > glu.gluQuadricNormals(quadObj, GLU.GLU_SMOOTH); > /* If we ever changed/used the texture or orientation state > of quadObj, we'd need to change it to the defaults here > with gluQuadricTexture and/or gluQuadricOrientation. */ > glu.gluSphere(quadObj, radius, slices, stacks); > } > > public void glutSolidSphere(double radius, int slices, int stacks) { > quadObjInit(glu); > glu.gluQuadricDrawStyle(quadObj, GLU.GLU_FILL); > glu.gluQuadricNormals(quadObj, GLU.GLU_SMOOTH); > /* If we ever changed/used the texture or orientation state > of quadObj, we'd need to change it to the defaults here > with gluQuadricTexture and/or gluQuadricOrientation. */ > glu.gluSphere(quadObj, radius, slices, stacks); > } > > public void glutWireCone(double base, double height, > int slices, int stacks) { > quadObjInit(glu); > glu.gluQuadricDrawStyle(quadObj, GLU.GLU_LINE); > glu.gluQuadricNormals(quadObj, GLU.GLU_SMOOTH); > /* If we ever changed/used the texture or orientation state > of quadObj, we'd need to change it to the defaults here > with gluQuadricTexture and/or gluQuadricOrientation. */ > glu.gluCylinder(quadObj, base, 0.0, height, slices, stacks); > } > > public void glutSolidCone(double base, double height, > int slices, int stacks) { > quadObjInit(glu); > glu.gluQuadricDrawStyle(quadObj, GLU.GLU_FILL); > glu.gluQuadricNormals(quadObj, GLU.GLU_SMOOTH); > /* If we ever changed/used the texture or orientation state > of quadObj, we'd need to change it to the defaults here > with gluQuadricTexture and/or gluQuadricOrientation. */ > glu.gluCylinder(quadObj, base, 0.0, height, slices, stacks); > } > > public void glutWireCylinder(double radius, double height, int slices, int stacks) { > quadObjInit(glu); > glu.gluQuadricDrawStyle(quadObj, GLU.GLU_LINE); > glu.gluQuadricNormals(quadObj, GLU.GLU_SMOOTH); > /* If we ever changed/used the texture or orientation state > of quadObj, we'd need to change it to the defaults here > with gluQuadricTexture and/or gluQuadricOrientation. */ > glu.gluCylinder(quadObj, radius, radius, height, slices, stacks); > } > > public void glutSolidCylinder(double radius, double height, int slices, int stacks) { > GL gl = glu.getCurrentGL(); > > // Prepare table of points for drawing end caps > double [] x = new double[slices]; > double [] y = new double[slices]; > double angleDelta = Math.PI * 2 / slices; > double angle = 0; > for (int i = 0 ; i < slices ; i ++) { > angle = i * angleDelta; > x[i] = Math.cos(angle) * radius; > y[i] = Math.sin(angle) * radius; > } > > // Draw bottom cap > gl.glBegin(GL.GL_TRIANGLE_FAN); > gl.glNormal3d(0,0,-1); > gl.glVertex3d(0,0,0); > for (int i = 0 ; i < slices ; i ++) { > gl.glVertex3d(x[i], y[i], 0); > } > gl.glVertex3d(x[0], y[0], 0); > gl.glEnd(); > > // Draw top cap > gl.glBegin(GL.GL_TRIANGLE_FAN); > gl.glNormal3d(0,0,1); > gl.glVertex3d(0,0,height); > for (int i = 0 ; i < slices ; i ++) { > gl.glVertex3d(x[i], y[i], height); > } > gl.glVertex3d(x[0], y[0], height); > gl.glEnd(); > > // Draw walls > quadObjInit(glu); > glu.gluQuadricDrawStyle(quadObj, GLU.GLU_FILL); > glu.gluQuadricNormals(quadObj, GLU.GLU_SMOOTH); > /* If we ever changed/used the texture or orientation state > of quadObj, we'd need to change it to the defaults here > with gluQuadricTexture and/or gluQuadricOrientation. */ > glu.gluCylinder(quadObj, radius, radius, height, slices, stacks); > } > > public void glutWireCube(float size) { > drawBox(GLU.getCurrentGL(), size, GL.GL_LINE_LOOP); > } > > public void glutSolidCube(float size) { > drawBox(GLU.getCurrentGL(), size, GL.GL_QUADS); > } > > public void glutWireTorus(double innerRadius, double outerRadius, > int nsides, int rings) { > GL gl = GLU.getCurrentGL(); > gl.glPushAttrib(GL.GL_POLYGON_BIT); > gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE); > doughnut(gl, innerRadius, outerRadius, nsides, rings); > gl.glPopAttrib(); > } > > public void glutSolidTorus(double innerRadius, double outerRadius, > int nsides, int rings) { > doughnut(GLU.getCurrentGL(), innerRadius, outerRadius, nsides, rings); > } > > public void glutWireDodecahedron() { > dodecahedron(GLU.getCurrentGL(), GL.GL_LINE_LOOP); > } > > public void glutSolidDodecahedron() { > dodecahedron(GLU.getCurrentGL(), GL.GL_TRIANGLE_FAN); > } > > public void glutWireOctahedron() { > octahedron(GLU.getCurrentGL(), GL.GL_LINE_LOOP); > } > > public void glutSolidOctahedron() { > octahedron(GLU.getCurrentGL(), GL.GL_TRIANGLES); > } > > public void glutWireIcosahedron() { > icosahedron(GLU.getCurrentGL(), GL.GL_LINE_LOOP); > } > > public void glutSolidIcosahedron() { > icosahedron(GLU.getCurrentGL(), GL.GL_TRIANGLES); > } > > public void glutWireTetrahedron() { > tetrahedron(GLU.getCurrentGL(), GL.GL_LINE_LOOP); > } > > public void glutSolidTetrahedron() { > tetrahedron(GLU.getCurrentGL(), GL.GL_TRIANGLES); > } > >/** > * Renders the teapot as a solid shape of the specified size. The teapot is > * created in a way that replicates the C GLUT implementation. > * > * @param scale > * the factor by which to scale the teapot > */ > public void glutSolidTeapot(double scale) { > glutSolidTeapot(scale, true); > } > > /** > * Renders the teapot as a solid shape of the specified size. The teapot can > * either be created in a way that is backward-compatible with the standard > * C glut library (i.e. broken), or in a more pleasing way (i.e. with > * surfaces whose front-faces point outwards and standing on the z=0 plane, > * instead of the y=-1 plane). Both surface normals and texture coordinates > * for the teapot are generated. The teapot is generated with OpenGL > * evaluators. > * > * @param scale > * the factor by which to scale the teapot > * @param cStyle > * whether to create the teapot in exactly the same way as in the C > * implementation of GLUT > */ > public void glutSolidTeapot(double scale, boolean cStyle) { > teapot(GLU.getCurrentGL(), 14, scale, GL.GL_FILL, cStyle); > } > > /** > * Renders the teapot as a wireframe shape of the specified size. The teapot > * is created in a way that replicates the C GLUT implementation. > * > * @param scale > * the factor by which to scale the teapot > */ > public void glutWireTeapot(double scale) { > glutWireTeapot(scale, true); > } > > /** > * Renders the teapot as a wireframe shape of the specified size. The teapot > * can either be created in a way that is backward-compatible with the > * standard C glut library (i.e. broken), or in a more pleasing way (i.e. > * with surfaces whose front-faces point outwards and standing on the z=0 > * plane, instead of the y=-1 plane). Both surface normals and texture > * coordinates for the teapot are generated. The teapot is generated with > * OpenGL evaluators. > * > * @param scale > * the factor by which to scale the teapot > * @param cStyle > * whether to create the teapot in exactly the same way as in the C > * implementation of GLUT > */ > public void glutWireTeapot(double scale, boolean cStyle) { > teapot(GLU.getCurrentGL(), 10, scale, GL.GL_LINE, cStyle); > } > > //---------------------------------------------------------------------- > // Fonts > // > > public void glutBitmapCharacter(int font, char character) { > GL gl = GLU.getCurrentGL(); > int[] swapbytes = new int[1]; > int[] lsbfirst = new int[1]; > int[] rowlength = new int[1]; > int[] skiprows = new int[1]; > int[] skippixels = new int[1]; > int[] alignment = new int[1]; > beginBitmap(gl, > swapbytes, > lsbfirst, > rowlength, > skiprows, > skippixels, > alignment); > bitmapCharacterImpl(gl, font, character); > endBitmap(gl, > swapbytes, > lsbfirst, > rowlength, > skiprows, > skippixels, > alignment); > } > > public void glutBitmapString (int font, String string) { > GL gl = GLU.getCurrentGL(); > int[] swapbytes = new int[1]; > int[] lsbfirst = new int[1]; > int[] rowlength = new int[1]; > int[] skiprows = new int[1]; > int[] skippixels = new int[1]; > int[] alignment = new int[1]; > beginBitmap(gl, > swapbytes, > lsbfirst, > rowlength, > skiprows, > skippixels, > alignment); > int len = string.length(); > for (int i = 0; i < len; i++) { > bitmapCharacterImpl(gl, font, string.charAt(i)); > } > endBitmap(gl, > swapbytes, > lsbfirst, > rowlength, > skiprows, > skippixels, > alignment); > } > > public int glutBitmapWidth (int font, char character) { > BitmapFontRec fontinfo = getBitmapFont(font); > int c = character & 0xFFFF; > if (c < fontinfo.first || c >= fontinfo.first + fontinfo.num_chars) > return 0; > BitmapCharRec ch = fontinfo.ch[c - fontinfo.first]; > if (ch != null) > return (int) ch.advance; > else > return 0; > } > > public void glutStrokeCharacter(int font, char character) { > GL gl = GLU.getCurrentGL(); > StrokeFontRec fontinfo = getStrokeFont(font); > int c = character & 0xFFFF; > if (c < 0 || c >= fontinfo.num_chars) > return; > StrokeCharRec ch = fontinfo.ch[c]; > if (ch != null) { > for (int i = 0; i < ch.num_strokes; i++) { > StrokeRec stroke = ch.stroke[i]; > gl.glBegin(GL.GL_LINE_STRIP); > for (int j = 0; j < stroke.num_coords; j++) { > CoordRec coord = stroke.coord[j]; > gl.glVertex2f(coord.x, coord.y); > } > gl.glEnd(); > } > gl.glTranslatef(ch.right, 0.0f, 0.0f); > } > } > > public void glutStrokeString(int font, String string) { > GL gl = GLU.getCurrentGL(); > StrokeFontRec fontinfo = getStrokeFont(font); > int len = string.length(); > for (int pos = 0; pos < len; pos++) { > int c = string.charAt(pos) & 0xFFFF; > if (c < 0 || c >= fontinfo.num_chars) > continue; > StrokeCharRec ch = fontinfo.ch[c]; > if (ch != null) { > for (int i = 0; i < ch.num_strokes; i++) { > StrokeRec stroke = ch.stroke[i]; > gl.glBegin(GL.GL_LINE_STRIP); > for (int j = 0; j < stroke.num_coords; j++) { > CoordRec coord = stroke.coord[j]; > gl.glVertex2f(coord.x, coord.y); > } > gl.glEnd(); > } > gl.glTranslatef(ch.right, 0.0f, 0.0f); > } > } > } > > public int glutStrokeWidth (int font, char character) { > return (int) glutStrokeWidthf(font, character); > } > > public float glutStrokeWidthf (int font, char character) { > StrokeFontRec fontinfo = getStrokeFont(font); > int c = character & 0xFFFF; > if (c < 0 || c >= fontinfo.num_chars) > return 0; > StrokeCharRec ch = fontinfo.ch[c]; > if (ch != null) > return ch.right; > else > return 0; > } > > public int glutBitmapLength (int font, String string) { > BitmapFontRec fontinfo = getBitmapFont(font); > int length = 0; > int len = string.length(); > for (int pos = 0; pos < len; pos++) { > int c = string.charAt(pos) & 0xFFFF; > if (c >= fontinfo.first && c < fontinfo.first + fontinfo.num_chars) { > BitmapCharRec ch = fontinfo.ch[c - fontinfo.first]; > if (ch != null) > length += ch.advance; > } > } > return length; > } > > public int glutStrokeLength (int font, String string) { > return (int) glutStrokeLengthf(font, string); > } > > public float glutStrokeLengthf (int font, String string) { > StrokeFontRec fontinfo = getStrokeFont(font); > float length = 0; > int len = string.length(); > for (int i = 0; i < len; i++) { > char c = string.charAt(i); > if (c >= 0 && c < fontinfo.num_chars) { > StrokeCharRec ch = fontinfo.ch[c]; > if (ch != null) > length += ch.right; > } > } > return length; > } > > /** > This function draws a wireframe dodecahedron whose > facets are rhombic and > whose vertices are at unit radius. > No facet lies normal to any coordinate axes. > The polyhedron is centered at the origin. > */ > public void glutWireRhombicDodecahedron() { > GL gl = glu.getCurrentGL(); > for( int i = 0; i < 12; i++ ) > { > gl.glBegin( GL.GL_LINE_LOOP ); > gl.glNormal3dv( rdod_n[ i ],0 ); > gl.glVertex3dv( rdod_r[ rdod_v[ i ][ 0 ] ],0 ); > gl.glVertex3dv( rdod_r[ rdod_v[ i ][ 1 ] ],0 ); > gl.glVertex3dv( rdod_r[ rdod_v[ i ][ 2 ] ],0 ); > gl.glVertex3dv( rdod_r[ rdod_v[ i ][ 3 ] ],0 ); > gl.glEnd( ); > } > } > > /** > This function draws a solid-shaded dodecahedron > whose facets are rhombic and > whose vertices are at unit radius. > No facet lies normal to any coordinate axes. > The polyhedron is centered at the origin. > */ > public void glutSolidRhombicDodecahedron() { > GL gl = glu.getCurrentGL(); > gl.glBegin( GL.GL_QUADS ); > for( int i = 0; i < 12; i++ ) > { > gl.glNormal3dv( rdod_n[ i ],0 ); > gl.glVertex3dv( rdod_r[ rdod_v[ i ][ 0 ] ],0 ); > gl.glVertex3dv( rdod_r[ rdod_v[ i ][ 1 ] ],0 ); > gl.glVertex3dv( rdod_r[ rdod_v[ i ][ 2 ] ],0 ); > gl.glVertex3dv( rdod_r[ rdod_v[ i ][ 3 ] ],0 ); > } > gl.glEnd( ); > } > > //---------------------------------------------------------------------- > // Internals only below this point > // > > //---------------------------------------------------------------------- > // Shape implementation > // > > private GLUquadric quadObj; > private void quadObjInit(GLU glu) { > if (quadObj == null) { > quadObj = glu.gluNewQuadric(); > } > if (quadObj == null) { > throw new GLException("Out of memory"); > } > } > > private static void doughnut(GL gl, double r, double R, int nsides, int rings) { > int i, j; > float theta, phi, theta1; > float cosTheta, sinTheta; > float cosTheta1, sinTheta1; > float ringDelta, sideDelta; > > ringDelta = (float) (2.0 * Math.PI / rings); > sideDelta = (float) (2.0 * Math.PI / nsides); > > theta = 0.0f; > cosTheta = 1.0f; > sinTheta = 0.0f; > for (i = rings - 1; i >= 0; i--) { > theta1 = theta + ringDelta; > cosTheta1 = (float) Math.cos(theta1); > sinTheta1 = (float) Math.sin(theta1); > gl.glBegin(GL.GL_QUAD_STRIP); > phi = 0.0f; > for (j = nsides; j >= 0; j--) { > float cosPhi, sinPhi, dist; > > phi += sideDelta; > cosPhi = (float) Math.cos(phi); > sinPhi = (float) Math.sin(phi); > dist = (float) (R + r * cosPhi); > > gl.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi); > gl.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, (float) r * sinPhi); > gl.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); > gl.glVertex3f(cosTheta * dist, -sinTheta * dist, (float) r * sinPhi); > } > gl.glEnd(); > theta = theta1; > cosTheta = cosTheta1; > sinTheta = sinTheta1; > } > } > > private static float[][] boxVertices; > private static final float[][] boxNormals = { > {-1.0f, 0.0f, 0.0f}, > {0.0f, 1.0f, 0.0f}, > {1.0f, 0.0f, 0.0f}, > {0.0f, -1.0f, 0.0f}, > {0.0f, 0.0f, 1.0f}, > {0.0f, 0.0f, -1.0f} > }; > private static final int[][] boxFaces = { > {0, 1, 2, 3}, > {3, 2, 6, 7}, > {7, 6, 5, 4}, > {4, 5, 1, 0}, > {5, 6, 2, 1}, > {7, 4, 0, 3} > }; > private void drawBox(GL gl, float size, int type) { > if (boxVertices == null) { > float[][] v = new float[8][]; > for (int i = 0; i < 8; i++) { > v[i] = new float[3]; > } > v[0][0] = v[1][0] = v[2][0] = v[3][0] = -0.5f; > v[4][0] = v[5][0] = v[6][0] = v[7][0] = 0.5f; > v[0][1] = v[1][1] = v[4][1] = v[5][1] = -0.5f; > v[2][1] = v[3][1] = v[6][1] = v[7][1] = 0.5f; > v[0][2] = v[3][2] = v[4][2] = v[7][2] = -0.5f; > v[1][2] = v[2][2] = v[5][2] = v[6][2] = 0.5f; > boxVertices = v; > } > float[][] v = boxVertices; > float[][] n = boxNormals; > int[][] faces = boxFaces; > for (int i = 5; i >= 0; i--) { > gl.glBegin(type); > gl.glNormal3fv(n[i], 0); > float[] vt = v[faces[i][0]]; > gl.glVertex3f(vt[0] * size, vt[1] * size, vt[2] * size); > vt = v[faces[i][1]]; > gl.glVertex3f(vt[0] * size, vt[1] * size, vt[2] * size); > vt = v[faces[i][2]]; > gl.glVertex3f(vt[0] * size, vt[1] * size, vt[2] * size); > vt = v[faces[i][3]]; > gl.glVertex3f(vt[0] * size, vt[1] * size, vt[2] * size); > gl.glEnd(); > } > } > > private float[][] dodec; > > private void initDodecahedron() { > dodec = new float[20][]; > for (int i = 0; i < dodec.length; i++) { > dodec[i] = new float[3]; > } > > float alpha, beta; > > alpha = (float) Math.sqrt(2.0f / (3.0f + Math.sqrt(5.0))); > beta = 1.0f + (float) Math.sqrt(6.0 / (3.0 + Math.sqrt(5.0)) - > 2.0 + 2.0 * Math.sqrt(2.0 / (3.0 + Math.sqrt(5.0)))); > dodec[0][0] = -alpha; dodec[0][1] = 0; dodec[0][2] = beta; > dodec[1][0] = alpha; dodec[1][1] = 0; dodec[1][2] = beta; > dodec[2][0] = -1; dodec[2][1] = -1; dodec[2][2] = -1; > dodec[3][0] = -1; dodec[3][1] = -1; dodec[3][2] = 1; > dodec[4][0] = -1; dodec[4][1] = 1; dodec[4][2] = -1; > dodec[5][0] = -1; dodec[5][1] = 1; dodec[5][2] = 1; > dodec[6][0] = 1; dodec[6][1] = -1; dodec[6][2] = -1; > dodec[7][0] = 1; dodec[7][1] = -1; dodec[7][2] = 1; > dodec[8][0] = 1; dodec[8][1] = 1; dodec[8][2] = -1; > dodec[9][0] = 1; dodec[9][1] = 1; dodec[9][2] = 1; > dodec[10][0] = beta; dodec[10][1] = alpha; dodec[10][2] = 0; > dodec[11][0] = beta; dodec[11][1] = -alpha; dodec[11][2] = 0; > dodec[12][0] = -beta; dodec[12][1] = alpha; dodec[12][2] = 0; > dodec[13][0] = -beta; dodec[13][1] = -alpha; dodec[13][2] = 0; > dodec[14][0] = -alpha; dodec[14][1] = 0; dodec[14][2] = -beta; > dodec[15][0] = alpha; dodec[15][1] = 0; dodec[15][2] = -beta; > dodec[16][0] = 0; dodec[16][1] = beta; dodec[16][2] = alpha; > dodec[17][0] = 0; dodec[17][1] = beta; dodec[17][2] = -alpha; > dodec[18][0] = 0; dodec[18][1] = -beta; dodec[18][2] = alpha; > dodec[19][0] = 0; dodec[19][1] = -beta; dodec[19][2] = -alpha; > } > > private static void diff3(float[] a, float[] b, float[] c) { > c[0] = a[0] - b[0]; > c[1] = a[1] - b[1]; > c[2] = a[2] - b[2]; > } > > private static void crossprod(float[] v1, float[] v2, float[] prod) { > float[] p = new float[3]; /* in case prod == v1 or v2 */ > > p[0] = v1[1] * v2[2] - v2[1] * v1[2]; > p[1] = v1[2] * v2[0] - v2[2] * v1[0]; > p[2] = v1[0] * v2[1] - v2[0] * v1[1]; > prod[0] = p[0]; > prod[1] = p[1]; > prod[2] = p[2]; > } > > private static void normalize(float[] v) { > float d; > > d = (float) Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); > if (d == 0.0) { > v[0] = d = 1.0f; > } > d = 1 / d; > v[0] *= d; > v[1] *= d; > v[2] *= d; > } > > private void pentagon(GL gl, int a, int b, int c, int d, int e, int shadeType) { > float[] n0 = new float[3]; > float[] d1 = new float[3]; > float[] d2 = new float[3]; > > diff3(dodec[a], dodec[b], d1); > diff3(dodec[b], dodec[c], d2); > crossprod(d1, d2, n0); > normalize(n0); > > gl.glBegin(shadeType); > gl.glNormal3fv(n0, 0); > gl.glVertex3fv(dodec[a], 0); > gl.glVertex3fv(dodec[b], 0); > gl.glVertex3fv(dodec[c], 0); > gl.glVertex3fv(dodec[d], 0); > gl.glVertex3fv(dodec[e], 0); > gl.glEnd(); > } > > private void dodecahedron(GL gl, int type) { > if (dodec == null) { > initDodecahedron(); > } > pentagon(gl, 0, 1, 9, 16, 5, type); > pentagon(gl, 1, 0, 3, 18, 7, type); > pentagon(gl, 1, 7, 11, 10, 9, type); > pentagon(gl, 11, 7, 18, 19, 6, type); > pentagon(gl, 8, 17, 16, 9, 10, type); > pentagon(gl, 2, 14, 15, 6, 19, type); > pentagon(gl, 2, 13, 12, 4, 14, type); > pentagon(gl, 2, 19, 18, 3, 13, type); > pentagon(gl, 3, 0, 5, 12, 13, type); > pentagon(gl, 6, 15, 8, 10, 11, type); > pentagon(gl, 4, 17, 8, 15, 14, type); > pentagon(gl, 4, 12, 5, 16, 17, type); > } > > private static void recorditem(GL gl, float[] n1, float[] n2, float[] n3, int shadeType) { > float[] q0 = new float[3]; > float[] q1 = new float[3]; > > diff3(n1, n2, q0); > diff3(n2, n3, q1); > crossprod(q0, q1, q1); > normalize(q1); > > gl.glBegin(shadeType); > gl.glNormal3fv(q1, 0); > gl.glVertex3fv(n1, 0); > gl.glVertex3fv(n2, 0); > gl.glVertex3fv(n3, 0); > gl.glEnd(); > } > > private static void subdivide(GL gl, float[] v0, float[] v1, float[] v2, int shadeType) { > int depth; > float[] w0 = new float[3]; > float[] w1 = new float[3]; > float[] w2 = new float[3]; > float l; > int i, j, k, n; > > depth = 1; > for (i = 0; i < depth; i++) { > for (j = 0; i + j < depth; j++) { > k = depth - i - j; > for (n = 0; n < 3; n++) { > w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth; > w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n]) > / depth; > w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n]) > / depth; > } > l = (float) Math.sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]); > w0[0] /= l; > w0[1] /= l; > w0[2] /= l; > l = (float) Math.sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]); > w1[0] /= l; > w1[1] /= l; > w1[2] /= l; > l = (float) Math.sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]); > w2[0] /= l; > w2[1] /= l; > w2[2] /= l; > recorditem(gl, w1, w0, w2, shadeType); > } > } > } > > private static void drawtriangle(GL gl, int i, float[][] data, int[][] ndx, int shadeType) { > float[] x0 = data[ndx[i][0]]; > float[] x1 = data[ndx[i][1]]; > float[] x2 = data[ndx[i][2]]; > subdivide(gl, x0, x1, x2, shadeType); > } > > /* octahedron data: The octahedron produced is centered at the > origin and has radius 1.0 */ > private static final float[][] odata = > { > {1.0f, 0.0f, 0.0f}, > {-1.0f, 0.0f, 0.0f}, > {0.0f, 1.0f, 0.0f}, > {0.0f, -1.0f, 0.0f}, > {0.0f, 0.0f, 1.0f}, > {0.0f, 0.0f, -1.0f} > }; > > private static final int[][] ondex = > { > {0, 4, 2}, > {1, 2, 4}, > {0, 3, 4}, > {1, 4, 3}, > {0, 2, 5}, > {1, 5, 2}, > {0, 5, 3}, > {1, 3, 5} > }; > > private static void octahedron(GL gl, int shadeType) { > int i; > > for (i = 7; i >= 0; i--) { > drawtriangle(gl, i, odata, ondex, shadeType); > } > } > > /* icosahedron data: These numbers are rigged to make an > icosahedron of radius 1.0 */ > > private static final float X = .525731112119133606f; > private static final float Z = .850650808352039932f; > > private static final float[][] idata = > { > {-X, 0, Z}, > {X, 0, Z}, > {-X, 0, -Z}, > {X, 0, -Z}, > {0, Z, X}, > {0, Z, -X}, > {0, -Z, X}, > {0, -Z, -X}, > {Z, X, 0}, > {-Z, X, 0}, > {Z, -X, 0}, > {-Z, -X, 0} > }; > > private static final int[][] index = > { > {0, 4, 1}, > {0, 9, 4}, > {9, 5, 4}, > {4, 5, 8}, > {4, 8, 1}, > {8, 10, 1}, > {8, 3, 10}, > {5, 3, 8}, > {5, 2, 3}, > {2, 7, 3}, > {7, 10, 3}, > {7, 6, 10}, > {7, 11, 6}, > {11, 0, 6}, > {0, 1, 6}, > {6, 1, 10}, > {9, 0, 11}, > {9, 11, 2}, > {9, 2, 5}, > {7, 2, 11}, > }; > > private static void icosahedron(GL gl, int shadeType) { > int i; > > for (i = 19; i >= 0; i--) { > drawtriangle(gl, i, idata, index, shadeType); > } > } > > /* rhombic dodecahedron data: */ > > private static final double rdod_r[][] = > { > { 0.0, 0.0, 1.0 }, > { 0.707106781187, 0.000000000000, 0.5 }, > { 0.000000000000, 0.707106781187, 0.5 }, > { -0.707106781187, 0.000000000000, 0.5 }, > { 0.000000000000, -0.707106781187, 0.5 }, > { 0.707106781187, 0.707106781187, 0.0 }, > { -0.707106781187, 0.707106781187, 0.0 }, > { -0.707106781187, -0.707106781187, 0.0 }, > { 0.707106781187, -0.707106781187, 0.0 }, > { 0.707106781187, 0.000000000000, -0.5 }, > { 0.000000000000, 0.707106781187, -0.5 }, > { -0.707106781187, 0.000000000000, -0.5 }, > { 0.000000000000, -0.707106781187, -0.5 }, > { 0.0, 0.0, -1.0 } > }; > > private static final int rdod_v[][] = > { > { 0, 1, 5, 2 }, > { 0, 2, 6, 3 }, > { 0, 3, 7, 4 }, > { 0, 4, 8, 1 }, > { 5, 10, 6, 2 }, > { 6, 11, 7, 3 }, > { 7, 12, 8, 4 }, > { 8, 9, 5, 1 }, > { 5, 9, 13, 10 }, > { 6, 10, 13, 11 }, > { 7, 11, 13, 12 }, > { 8, 12, 13, 9 } > }; > > private static final double rdod_n[][] = > { > { 0.353553390594, 0.353553390594, 0.5 }, > { -0.353553390594, 0.353553390594, 0.5 }, > { -0.353553390594, -0.353553390594, 0.5 }, > { 0.353553390594, -0.353553390594, 0.5 }, > { 0.000000000000, 1.000000000000, 0.0 }, > { -1.000000000000, 0.000000000000, 0.0 }, > { 0.000000000000, -1.000000000000, 0.0 }, > { 1.000000000000, 0.000000000000, 0.0 }, > { 0.353553390594, 0.353553390594, -0.5 }, > { -0.353553390594, 0.353553390594, -0.5 }, > { -0.353553390594, -0.353553390594, -0.5 }, > { 0.353553390594, -0.353553390594, -0.5 } > }; > > /* tetrahedron data: */ > > private static final float T = 1.73205080756887729f; > > private static final float[][] tdata = > { > {T, T, T}, > {T, -T, -T}, > {-T, T, -T}, > {-T, -T, T} > }; > > private static final int[][] tndex = > { > {0, 1, 3}, > {2, 1, 0}, > {3, 2, 0}, > {1, 2, 3} > }; > > private static final void tetrahedron(GL gl, int shadeType) { > for (int i = 3; i >= 0; i--) > drawtriangle(gl, i, tdata, tndex, shadeType); > } > > // Teapot implementation (a modified port of glut_teapot.c) > // > // Rim, body, lid, and bottom data must be reflected in x and > // y; handle and spout data across the y axis only. > private static final int[][] teapotPatchData = { > /* rim */ > {102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, > /* body */ > {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27}, > {24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40}, > /* lid */ > {96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101, 101, 0, 1, 2, 3,}, > {0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117}, > /* bottom */ > {118, 118, 118, 118, 124, 122, 119, 121, 123, 126, 125, 120, 40, 39, 38, 37}, > /* handle */ > {41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56}, > {53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 28, 65, 66, 67}, > /* spout */ > {68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83}, > {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95} > }; > private static final float[][] teapotCPData = { > {0.2f, 0f, 2.7f}, > {0.2f, -0.112f, 2.7f}, > {0.112f, -0.2f, 2.7f}, > {0f, -0.2f, 2.7f}, > {1.3375f, 0f, 2.53125f}, > {1.3375f, -0.749f, 2.53125f}, > {0.749f, -1.3375f, 2.53125f}, > {0f, -1.3375f, 2.53125f}, > {1.4375f, 0f, 2.53125f}, > {1.4375f, -0.805f, 2.53125f}, > {0.805f, -1.4375f, 2.53125f}, > {0f, -1.4375f, 2.53125f}, > {1.5f, 0f, 2.4f}, > {1.5f, -0.84f, 2.4f}, > {0.84f, -1.5f, 2.4f}, > {0f, -1.5f, 2.4f}, > {1.75f, 0f, 1.875f}, > {1.75f, -0.98f, 1.875f}, > {0.98f, -1.75f, 1.875f}, > {0f, -1.75f, 1.875f}, > {2f, 0f, 1.35f}, > {2f, -1.12f, 1.35f}, > {1.12f, -2f, 1.35f}, > {0f, -2f, 1.35f}, > {2f, 0f, 0.9f}, > {2f, -1.12f, 0.9f}, > {1.12f, -2f, 0.9f}, > {0f, -2f, 0.9f}, > {-2f, 0f, 0.9f}, > {2f, 0f, 0.45f}, > {2f, -1.12f, 0.45f}, > {1.12f, -2f, 0.45f}, > {0f, -2f, 0.45f}, > {1.5f, 0f, 0.225f}, > {1.5f, -0.84f, 0.225f}, > {0.84f, -1.5f, 0.225f}, > {0f, -1.5f, 0.225f}, > {1.5f, 0f, 0.15f}, > {1.5f, -0.84f, 0.15f}, > {0.84f, -1.5f, 0.15f}, > {0f, -1.5f, 0.15f}, > {-1.6f, 0f, 2.025f}, > {-1.6f, -0.3f, 2.025f}, > {-1.5f, -0.3f, 2.25f}, > {-1.5f, 0f, 2.25f}, > {-2.3f, 0f, 2.025f}, > {-2.3f, -0.3f, 2.025f}, > {-2.5f, -0.3f, 2.25f}, > {-2.5f, 0f, 2.25f}, > {-2.7f, 0f, 2.025f}, > {-2.7f, -0.3f, 2.025f}, > {-3f, -0.3f, 2.25f}, > {-3f, 0f, 2.25f}, > {-2.7f, 0f, 1.8f}, > {-2.7f, -0.3f, 1.8f}, > {-3f, -0.3f, 1.8f}, > {-3f, 0f, 1.8f}, > {-2.7f, 0f, 1.575f}, > {-2.7f, -0.3f, 1.575f}, > {-3f, -0.3f, 1.35f}, > {-3f, 0f, 1.35f}, > {-2.5f, 0f, 1.125f}, > {-2.5f, -0.3f, 1.125f}, > {-2.65f, -0.3f, 0.9375f}, > {-2.65f, 0f, 0.9375f}, > {-2f, -0.3f, 0.9f}, > {-1.9f, -0.3f, 0.6f}, > {-1.9f, 0f, 0.6f}, > {1.7f, 0f, 1.425f}, > {1.7f, -0.66f, 1.425f}, > {1.7f, -0.66f, 0.6f}, > {1.7f, 0f, 0.6f}, > {2.6f, 0f, 1.425f}, > {2.6f, -0.66f, 1.425f}, > {3.1f, -0.66f, 0.825f}, > {3.1f, 0f, 0.825f}, > {2.3f, 0f, 2.1f}, > {2.3f, -0.25f, 2.1f}, > {2.4f, -0.25f, 2.025f}, > {2.4f, 0f, 2.025f}, > {2.7f, 0f, 2.4f}, > {2.7f, -0.25f, 2.4f}, > {3.3f, -0.25f, 2.4f}, > {3.3f, 0f, 2.4f}, > {2.8f, 0f, 2.475f}, > {2.8f, -0.25f, 2.475f}, > {3.525f, -0.25f, 2.49375f}, > {3.525f, 0f, 2.49375f}, > {2.9f, 0f, 2.475f}, > {2.9f, -0.15f, 2.475f}, > {3.45f, -0.15f, 2.5125f}, > {3.45f, 0f, 2.5125f}, > {2.8f, 0f, 2.4f}, > {2.8f, -0.15f, 2.4f}, > {3.2f, -0.15f, 2.4f}, > {3.2f, 0f, 2.4f}, > {0f, 0f, 3.15f}, > {0.8f, 0f, 3.15f}, > {0.8f, -0.45f, 3.15f}, > {0.45f, -0.8f, 3.15f}, > {0f, -0.8f, 3.15f}, > {0f, 0f, 2.85f}, > {1.4f, 0f, 2.4f}, > {1.4f, -0.784f, 2.4f}, > {0.784f, -1.4f, 2.4f}, > {0f, -1.4f, 2.4f}, > {0.4f, 0f, 2.55f}, > {0.4f, -0.224f, 2.55f}, > {0.224f, -0.4f, 2.55f}, > {0f, -0.4f, 2.55f}, > {1.3f, 0f, 2.55f}, > {1.3f, -0.728f, 2.55f}, > {0.728f, -1.3f, 2.55f}, > {0f, -1.3f, 2.55f}, > {1.3f, 0f, 2.4f}, > {1.3f, -0.728f, 2.4f}, > {0.728f, -1.3f, 2.4f}, > {0f, -1.3f, 2.4f}, > {0f, 0f, 0f}, > {1.425f, -0.798f, 0f}, > {1.5f, 0f, 0.075f}, > {1.425f, 0f, 0f}, > {0.798f, -1.425f, 0f}, > {0f, -1.5f, 0.075f}, > {0f, -1.425f, 0f}, > {1.5f, -0.84f, 0.075f}, > {0.84f, -1.5f, 0.075f} > }; > // Since GL.glMap2f expects a packed array of floats, we must convert > // from a 3-dimensional array to a 1-dimensional array > private static final float[] teapotTex = { > 0, 0, 1, 0, 0, 1, 1, 1 > }; > > private static void teapot(GL gl, > int grid, > double scale, > int type, > boolean backCompatible) > { > // As mentioned above, GL.glMap2f expects a packed array of floats > float[] p = new float[4*4*3]; > float[] q = new float[4*4*3]; > float[] r = new float[4*4*3]; > float[] s = new float[4*4*3]; > int i, j, k, l; > > gl.glPushAttrib(GL.GL_ENABLE_BIT | GL.GL_EVAL_BIT | GL.GL_POLYGON_BIT); > gl.glEnable(GL.GL_AUTO_NORMAL); > gl.glEnable(GL.GL_NORMALIZE); > gl.glEnable(GL.GL_MAP2_VERTEX_3); > gl.glEnable(GL.GL_MAP2_TEXTURE_COORD_2); > gl.glPushMatrix(); > if (!backCompatible) { > // The time has come to have the teapot no longer be inside out > gl.glFrontFace(GL.GL_CW); > gl.glScaled(0.5*scale, 0.5*scale, 0.5*scale); > } else { > // We want the teapot in it's backward compatible position and > // orientation > gl.glRotatef(270.0f, 1, 0, 0); > gl.glScalef((float)(0.5 * scale), > (float)(0.5 * scale), > (float)(0.5 * scale)); > gl.glTranslatef(0.0f, 0.0f, -1.5f); > } > for (i = 0; i < 10; i++) { > for (j = 0; j < 4; j++) { > for (k = 0; k < 4; k++) { > for (l = 0; l < 3; l++) { > p[(j*4+k)*3+l] = teapotCPData[teapotPatchData[i][j * 4 + k]][l]; > q[(j*4+k)*3+l] = > teapotCPData[teapotPatchData[i][j * 4 + (3 - k)]][l]; > if (l == 1) > q[(j*4+k)*3+l] *= -1.0; > if (i < 6) { > r[(j*4+k)*3+l] = > teapotCPData[teapotPatchData[i][j * 4 + (3 - k)]][l]; > if (l == 0) > r[(j*4+k)*3+l] *= -1.0; > s[(j*4+k)*3+l] = teapotCPData[teapotPatchData[i][j * 4 + k]][l]; > if (l == 0) > s[(j*4+k)*3+l] *= -1.0; > if (l == 1) > s[(j*4+k)*3+l] *= -1.0; > } > } > } > } > gl.glMap2f(GL.GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, teapotTex, 0); > gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, p, 0); > gl.glMapGrid2f(grid, 0.0f, 1.0f, grid, 0.0f, 1.0f); > evaluateTeapotMesh(gl, grid, type, i, !backCompatible); > gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, q, 0); > evaluateTeapotMesh(gl, grid, type, i, !backCompatible); > if (i < 6) { > gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, r, 0); > evaluateTeapotMesh(gl, grid, type, i, !backCompatible); > gl.glMap2f(GL.GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, s, 0); > evaluateTeapotMesh(gl, grid, type, i, !backCompatible); > } > } > gl.glPopMatrix(); > gl.glPopAttrib(); > } > > private static void evaluateTeapotMesh(GL gl, > int grid, > int type, > int partNum, > boolean repairSingularities) > { > if (repairSingularities && (partNum == 5 || partNum == 3)) { > // Instead of using evaluators that give bad results at singularities, > // evaluate by hand > gl.glPolygonMode(GL.GL_FRONT_AND_BACK, type); > for (int nv = 0; nv < grid; nv++) { > if (nv == 0) { > // Draw a small triangle-fan to fill the hole > gl.glDisable(GL.GL_AUTO_NORMAL); > gl.glNormal3f(0, 0, partNum == 3 ? 1 : -1); > gl.glBegin(GL.GL_TRIANGLE_FAN); > { > gl.glEvalCoord2f(0, 0); > // Note that we draw in clock-wise order to match the evaluator > // method > for (int nu = 0; nu <= grid; nu++) > { > gl.glEvalCoord2f(nu / (float)grid, (1f / grid) / (float)grid); > } > } > gl.glEnd(); > gl.glEnable(GL.GL_AUTO_NORMAL); > } > // Draw the rest of the piece as an evaluated quad-strip > gl.glBegin(GL.GL_QUAD_STRIP); > { > // Note that we draw in clock-wise order to match the evaluator method > for (int nu = grid; nu >= 0; nu--) { > gl.glEvalCoord2f(nu / (float)grid, (nv + 1) / (float)grid); > gl.glEvalCoord2f(nu / (float)grid, Math.max(nv, 1f / grid) > / (float)grid); > } > } > gl.glEnd(); > } > } else { > gl.glEvalMesh2(type, 0, grid, 0, grid); > } > } > > //---------------------------------------------------------------------- > // Font implementation > // > > private static void bitmapCharacterImpl(GL gl, int font, char cin) { > BitmapFontRec fontinfo = getBitmapFont(font); > int c = cin & 0xFFFF; > if (c < fontinfo.first || > c >= fontinfo.first + fontinfo.num_chars) > return; > BitmapCharRec ch = fontinfo.ch[c - fontinfo.first]; > if (ch != null) { > gl.glBitmap(ch.width, ch.height, ch.xorig, ch.yorig, > ch.advance, 0, ch.bitmap, 0); > } > } > > private static final BitmapFontRec[] bitmapFonts = new BitmapFontRec[9]; > private static final StrokeFontRec[] strokeFonts = new StrokeFontRec[9]; > > private static BitmapFontRec getBitmapFont(int font) { > BitmapFontRec rec = bitmapFonts[font]; > if (rec == null) { > switch (font) { > case BITMAP_9_BY_15: > rec = GLUTBitmap9x15.glutBitmap9By15; > break; > case BITMAP_8_BY_13: > rec = GLUTBitmap8x13.glutBitmap8By13; > break; > case BITMAP_TIMES_ROMAN_10: > rec = GLUTBitmapTimesRoman10.glutBitmapTimesRoman10; > break; > case BITMAP_TIMES_ROMAN_24: > rec = GLUTBitmapTimesRoman24.glutBitmapTimesRoman24; > break; > case BITMAP_HELVETICA_10: > rec = GLUTBitmapHelvetica10.glutBitmapHelvetica10; > break; > case BITMAP_HELVETICA_12: > rec = GLUTBitmapHelvetica12.glutBitmapHelvetica12; > break; > case BITMAP_HELVETICA_18: > rec = GLUTBitmapHelvetica18.glutBitmapHelvetica18; > break; > default: > throw new GLException("Unknown bitmap font number " + font); > } > bitmapFonts[font] = rec; > } > return rec; > } > > private static StrokeFontRec getStrokeFont(int font) { > StrokeFontRec rec = strokeFonts[font]; > if (rec == null) { > switch (font) { > case STROKE_ROMAN: > rec = GLUTStrokeRoman.glutStrokeRoman; > break; > case STROKE_MONO_ROMAN: > rec = GLUTStrokeMonoRoman.glutStrokeMonoRoman; > break; > default: > throw new GLException("Unknown stroke font number " + font); > } > } > return rec; > } > > private static void beginBitmap(GL gl, > int[] swapbytes, > int[] lsbfirst, > int[] rowlength, > int[] skiprows, > int[] skippixels, > int[] alignment) { > gl.glGetIntegerv(GL.GL_UNPACK_SWAP_BYTES, swapbytes, 0); > gl.glGetIntegerv(GL.GL_UNPACK_LSB_FIRST, lsbfirst, 0); > gl.glGetIntegerv(GL.GL_UNPACK_ROW_LENGTH, rowlength, 0); > gl.glGetIntegerv(GL.GL_UNPACK_SKIP_ROWS, skiprows, 0); > gl.glGetIntegerv(GL.GL_UNPACK_SKIP_PIXELS, skippixels, 0); > gl.glGetIntegerv(GL.GL_UNPACK_ALIGNMENT, alignment, 0); > /* Little endian machines (DEC Alpha for example) could > benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE > instead of GL_FALSE, but this would require changing the > generated bitmaps too. */ > gl.glPixelStorei(GL.GL_UNPACK_SWAP_BYTES, GL.GL_FALSE); > gl.glPixelStorei(GL.GL_UNPACK_LSB_FIRST, GL.GL_FALSE); > gl.glPixelStorei(GL.GL_UNPACK_ROW_LENGTH, 0); > gl.glPixelStorei(GL.GL_UNPACK_SKIP_ROWS, 0); > gl.glPixelStorei(GL.GL_UNPACK_SKIP_PIXELS, 0); > gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1); > } > > private static void endBitmap(GL gl, > int[] swapbytes, > int[] lsbfirst, > int[] rowlength, > int[] skiprows, > int[] skippixels, > int[] alignment) { > /* Restore saved modes. */ > gl.glPixelStorei(GL.GL_UNPACK_SWAP_BYTES, swapbytes[0]); > gl.glPixelStorei(GL.GL_UNPACK_LSB_FIRST, lsbfirst[0]); > gl.glPixelStorei(GL.GL_UNPACK_ROW_LENGTH, rowlength[0]); > gl.glPixelStorei(GL.GL_UNPACK_SKIP_ROWS, skiprows[0]); > gl.glPixelStorei(GL.GL_UNPACK_SKIP_PIXELS, skippixels[0]); > gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, alignment[0]); > } >}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 245
: 86