private static boolean useJavaMipmapCode = true; static { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { String val = System.getProperty("jogl.glu.nojava"); if (val != null && !val.toLowerCase().equals("false")) { useJavaMipmapCode = false; } return null; } }); } /** * Instantiates a new OpenGL Utility Library object. A GLU object may * be instantiated at any point in the application and is not * inherently tied to any particular OpenGL context; however, the GLU * object may only be used when an OpenGL context is current on the * current thread. Attempts to call most of the methods in the GLU * library when no OpenGL context is current will cause an exception * to be thrown. * *

* * The returned GLU object is not guaranteed to be thread-safe and * should only be used from one thread at a time. Multiple GLU objects * may be instantiated to be used from different threads * simultaneously. */ public GLUgl2() { this.project = new ProjectDouble(); } //---------------------------------------------------------------------- // Utility routines // public static final GL2 getCurrentGL2() throws GLException { GLContext curContext = GLContext.getCurrent(); if (curContext == null) { throw new GLException("No OpenGL context current on this thread"); } return curContext.getGL().getGL2(); } public final String gluErrorString(int errorCode) { return Error.gluErrorString(errorCode); } /* extName is an extension name. * extString is a string of extensions separated by blank(s). There may or * may not be leading or trailing blank(s) in extString. * This works in cases of extensions being prefixes of another like * GL_EXT_texture and GL_EXT_texture3D. * Returns true if extName is found otherwise it returns false. */ public final boolean gluCheckExtension(java.lang.String extName, java.lang.String extString) { return Registry.gluCheckExtension(extName, extString); } public final String gluGetString(int name) { return Registry.gluGetString(name); } /** * Returns true if the specified GLU core- or extension-function can be * successfully used through this GLU instance. By "successfully" we mean * that the function is both callable on the machine running the * program and available on the current display.

* * A GLU function is callable if it is a GLU core- or extension-function * that is supported by the underlying GLU implementation. The function is * available if the OpenGL implementation on the display meets the * requirements of the GLU function being called (because GLU functions utilize * OpenGL functions).

* * Whether or not a GLU function is callable is determined as follows: *

* * Whether or not a GLU function is available is determined as follows: * * * NOTE:The availability of a function may change at runtime in * response to changes in the display environment. For example, when a window * is dragged from one display to another on a multi-display system, or when * the properties of the display device are modified (e.g., changing the color * depth of the display). Any application that is concerned with handling * these situations correctly should confirm availability after a display * change before calling a questionable OpenGL function. To detect a change in * the display device, please see {@link * GLEventListener#displayChanged(GLAutoDrawable,boolean,boolean)}. * * @param gluFunctionName the name of the OpenGL function (e.g., use * "gluNurbsCallbackDataEXT" to check if the * gluNurbsCallbackDataEXT(GLUnurbs, GLvoid) extension is available). */ public final boolean isFunctionAvailable(String gluFunctionName) { if (useJavaMipmapCode) { // All GLU functions are available in Java port return true; } return (gluProcAddressTable.getAddressFor(gluFunctionName) != 0); } //---------------------------------------------------------------------- // Tessellation routines // /***************************************************************************** * gluNewTess creates and returns a new tessellation object. This * object must be referred to when calling tesselation methods. A return * value of null means that there was not enough memeory to allocate the * object. * * @return A new tessellation object. * * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluDeleteTess gluDeleteTess * @see #gluTessCallback gluTessCallback ****************************************************************************/ public final GLUtessellator gluNewTess() { return GLUtessellatorImpl.gluNewTess(); } /***************************************************************************** * gluDeleteTess destroys the indicated tessellation object (which was * created with {@link #gluNewTess gluNewTess}). * * @param tessellator * Specifies the tessellation object to destroy. * * @see #gluBeginPolygon gluBeginPolygon * @see #gluNewTess gluNewTess * @see #gluTessCallback gluTessCallback ****************************************************************************/ public final void gluDeleteTess(GLUtessellator tessellator) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluDeleteTess(); } /***************************************************************************** * gluTessProperty is used to control properites stored in a * tessellation object. These properties affect the way that the polygons are * interpreted and rendered. The legal value for which are as * follows:

* * GLU_TESS_WINDING_RULE *

*
GLU_TESS_BOUNDARY_ONLY * *
GLU_TESS_TOLERANCE * * * @param tessellator * Specifies the tessellation object created with * {@link #gluNewTess gluNewTess} * @param which * Specifies the property to be set. Valid values are * GLU_TESS_WINDING_RULE, GLU_TESS_BOUNDARDY_ONLY, * GLU_TESS_TOLERANCE. * @param value * Specifices the value of the indicated property. * * @see #gluGetTessProperty gluGetTessProperty * @see #gluNewTess gluNewTess ****************************************************************************/ public final void gluTessProperty(GLUtessellator tessellator, int which, double value) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluTessProperty(which, value); } /***************************************************************************** * gluGetTessProperty retrieves properties stored in a tessellation * object. These properties affect the way that tessellation objects are * interpreted and rendered. See the * {@link #gluTessProperty gluTessProperty} reference * page for information about the properties and what they do. * * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * @param which * Specifies the property whose value is to be fetched. Valid values * are GLU_TESS_WINDING_RULE, GLU_TESS_BOUNDARY_ONLY, * and GLU_TESS_TOLERANCES. * @param value * Specifices an array into which the value of the named property is * written. * * @see #gluNewTess gluNewTess * @see #gluTessProperty gluTessProperty ****************************************************************************/ public final void gluGetTessProperty(GLUtessellator tessellator, int which, double[] value, int value_offset) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluGetTessProperty(which, value, value_offset); } /***************************************************************************** * gluTessNormal describes a normal for a polygon that the program is * defining. All input data will be projected onto a plane perpendicular to * the one of the three coordinate axes before tessellation and all output * triangles will be oriented CCW with repsect to the normal (CW orientation * can be obtained by reversing the sign of the supplied normal). For * example, if you know that all polygons lie in the x-y plane, call * gluTessNormal(tess, 0.0, 0.0, 0.0) before rendering any polygons.

* * If the supplied normal is (0.0, 0.0, 0.0)(the initial value), the normal * is determined as follows. The direction of the normal, up to its sign, is * found by fitting a plane to the vertices, without regard to how the * vertices are connected. It is expected that the input data lies * approximately in the plane; otherwise, projection perpendicular to one of * the three coordinate axes may substantially change the geometry. The sign * of the normal is chosen so that the sum of the signed areas of all input * contours is nonnegative (where a CCW contour has positive area).

* * The supplied normal persists until it is changed by another call to * gluTessNormal. * * @param tessellator * Specifies the tessellation object (created by * {@link #gluNewTess gluNewTess}). * @param x * Specifies the first component of the normal. * @param y * Specifies the second component of the normal. * @param z * Specifies the third component of the normal. * * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluTessEndPolygon gluTessEndPolygon ****************************************************************************/ public final void gluTessNormal(GLUtessellator tessellator, double x, double y, double z) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluTessNormal(x, y, z); } /***************************************************************************** * gluTessCallback is used to indicate a callback to be used by a * tessellation object. If the specified callback is already defined, then it * is replaced. If aCallback is null, then the existing callback * becomes undefined.

* * These callbacks are used by the tessellation object to describe how a * polygon specified by the user is broken into triangles. Note that there are * two versions of each callback: one with user-specified polygon data and one * without. If both versions of a particular callback are specified, then the * callback with user-specified polygon data will be used. Note that the * polygonData parameter used by some of the methods is a copy of the * reference that was specified when * {@link #gluTessBeginPolygon gluTessBeginPolygon} * was called. The legal callbacks are as follows:

* * GLU_TESS_BEGIN *

* *
 *         void begin(int type);

* * GLU_TESS_BEGIN_DATA *

* *
 *         void beginData(int type, Object polygonData);
* * GLU_TESS_EDGE_FLAG * * *
 *         void edgeFlag(boolean boundaryEdge);
* * GLU_TESS_EDGE_FLAG_DATA * * *
 *         void edgeFlagData(boolean boundaryEdge, Object polygonData);
* * GLU_TESS_VERTEX * * *
 *         void vertex(Object vertexData);
* * GLU_TESS_VERTEX_DATA * * *
 *         void vertexData(Object vertexData, Object polygonData);
* * GLU_TESS_END * * *
 *         void end();
* * GLU_TESS_END_DATA * * *
 *         void endData(Object polygonData);
* * GLU_TESS_COMBINE * * *
 *         void combine(double[] coords, Object[] data,
 *                      float[] weight, Object[] outData);
* * *
 *         void myCombine(double[] coords, Object[] data,
 *                        float[] weight, Object[] outData)
 *         {
 *            MyVertex newVertex = new MyVertex();
 *
 *            newVertex.x = coords[0];
 *            newVertex.y = coords[1];
 *            newVertex.z = coords[2];
 *            newVertex.r = weight[0]*data[0].r +
 *                          weight[1]*data[1].r +
 *                          weight[2]*data[2].r +
 *                          weight[3]*data[3].r;
 *            newVertex.g = weight[0]*data[0].g +
 *                          weight[1]*data[1].g +
 *                          weight[2]*data[2].g +
 *                          weight[3]*data[3].g;
 *            newVertex.b = weight[0]*data[0].b +
 *                          weight[1]*data[1].b +
 *                          weight[2]*data[2].b +
 *                          weight[3]*data[3].b;
 *            newVertex.a = weight[0]*data[0].a +
 *                          weight[1]*data[1].a +
 *                          weight[2]*data[2].a +
 *                          weight[3]*data[3].a;
 *            outData = newVertex;
 *         }
* * * * GLU_TESS_COMBINE_DATA * * *
 *         void combineData(double[] coords, Object[] data,
                            float[] weight, Object[] outData,
                            Object polygonData);
* * GLU_TESS_ERROR * * *
 *         void error(int errnum);
* * * * GLU_TESS_ERROR_DATA * * *
 *         void errorData(int errnum, Object polygonData);
* * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * @param which * Specifies the callback being defined. The following values are * valid: GLU_TESS_BEGIN, GLU_TESS_BEGIN_DATA, * GLU_TESS_EDGE_FLAG, GLU_TESS_EDGE_FLAG_DATA, * GLU_TESS_VERTEX, GLU_TESS_VERTEX_DATA, * GLU_TESS_END, GLU_TESS_END_DATA, * GLU_TESS_COMBINE, GLU_TESS_COMBINE_DATA, * GLU_TESS_ERROR, and GLU_TESS_ERROR_DATA. * @param aCallback * Specifies the callback object to be called. * * @see javax.media.opengl.GL#glBegin glBegin * @see javax.media.opengl.GL#glEdgeFlag glEdgeFlag * @see javax.media.opengl.GL#glVertex3f glVertex3f * @see #gluNewTess gluNewTess * @see #gluErrorString gluErrorString * @see #gluTessVertex gluTessVertex * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluTessBeginContour gluTessBeginContour * @see #gluTessProperty gluTessProperty * @see #gluTessNormal gluTessNormal ****************************************************************************/ public final void gluTessCallback(GLUtessellator tessellator, int which, GLUtessellatorCallback aCallback) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluTessCallback(which, aCallback); } /***************************************************************************** * gluTessVertex describes a vertex on a polygon that the program * defines. Successive gluTessVertex calls describe a closed contour. * For example, to describe a quadrilateral gluTessVertex should be * called four times. gluTessVertex can only be called between * {@link #gluTessBeginContour gluTessBeginContour} and * {@link #gluTessBeginContour gluTessEndContour}.

* * data normally references to a structure containing the vertex * location, as well as other per-vertex attributes such as color and normal. * This reference is passed back to the user through the * GLU_TESS_VERTEX or GLU_TESS_VERTEX_DATA callback after * tessellation (see the {@link #gluTessCallback * gluTessCallback} reference page). * * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * @param coords * Specifies the coordinates of the vertex. * @param data * Specifies an opaque reference passed back to the program with the * vertex callback (as specified by * {@link #gluTessCallback gluTessCallback}). * * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluNewTess gluNewTess * @see #gluTessBeginContour gluTessBeginContour * @see #gluTessCallback gluTessCallback * @see #gluTessProperty gluTessProperty * @see #gluTessNormal gluTessNormal * @see #gluTessEndPolygon gluTessEndPolygon ****************************************************************************/ public final void gluTessVertex(GLUtessellator tessellator, double[] coords, int coords_offset, Object data) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluTessVertex(coords, coords_offset, data); } /***************************************************************************** * gluTessBeginPolygon and * {@link #gluTessEndPolygon gluTessEndPolygon} delimit * the definition of a convex, concave or self-intersecting polygon. Within * each gluTessBeginPolygon/ * {@link #gluTessEndPolygon gluTessEndPolygon} pair, * there must be one or more calls to * {@link #gluTessBeginContour gluTessBeginContour}/ * {@link #gluTessEndContour gluTessEndContour}. Within * each contour, there are zero or more calls to * {@link #gluTessVertex gluTessVertex}. The vertices * specify a closed contour (the last vertex of each contour is automatically * linked to the first). See the {@link #gluTessVertex * gluTessVertex}, {@link #gluTessBeginContour * gluTessBeginContour}, and {@link #gluTessEndContour * gluTessEndContour} reference pages for more details.

* * data is a reference to a user-defined data structure. If the * appropriate callback(s) are specified (see * {@link #gluTessCallback gluTessCallback}), then this * reference is returned to the callback method(s). Thus, it is a convenient * way to store per-polygon information.

* * Once {@link #gluTessEndPolygon gluTessEndPolygon} is * called, the polygon is tessellated, and the resulting triangles are * described through callbacks. See * {@link #gluTessCallback gluTessCallback} for * descriptions of the callback methods. * * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * @param data * Specifies a reference to user polygon data. * * @see #gluNewTess gluNewTess * @see #gluTessBeginContour gluTessBeginContour * @see #gluTessVertex gluTessVertex * @see #gluTessCallback gluTessCallback * @see #gluTessProperty gluTessProperty * @see #gluTessNormal gluTessNormal * @see #gluTessEndPolygon gluTessEndPolygon ****************************************************************************/ public final void gluTessBeginPolygon(GLUtessellator tessellator, Object data) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluTessBeginPolygon(data); } /***************************************************************************** * gluTessBeginContour and * {@link #gluTessEndContour gluTessEndContour} delimit * the definition of a polygon contour. Within each * gluTessBeginContour/ * {@link #gluTessEndContour gluTessEndContour} pair, * there can be zero or more calls to * {@link #gluTessVertex gluTessVertex}. The vertices * specify a closed contour (the last vertex of each contour is automatically * linked to the first). See the {@link #gluTessVertex * gluTessVertex} reference page for more details. gluTessBeginContour * can only be called between * {@link #gluTessBeginPolygon gluTessBeginPolygon} and * {@link #gluTessEndPolygon gluTessEndPolygon}. * * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * * @see #gluNewTess gluNewTess * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluTessVertex gluTessVertex * @see #gluTessCallback gluTessCallback * @see #gluTessProperty gluTessProperty * @see #gluTessNormal gluTessNormal * @see #gluTessEndPolygon gluTessEndPolygon ****************************************************************************/ public final void gluTessBeginContour(GLUtessellator tessellator) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluTessBeginContour(); } /***************************************************************************** * gluTessEndContour and * {@link #gluTessBeginContour gluTessBeginContour} * delimit the definition of a polygon contour. Within each * {@link #gluTessBeginContour gluTessBeginContour}/ * gluTessEndContour pair, there can be zero or more calls to * {@link #gluTessVertex gluTessVertex}. The vertices * specify a closed contour (the last vertex of each contour is automatically * linked to the first). See the {@link #gluTessVertex * gluTessVertex} reference page for more details. * {@link #gluTessBeginContour gluTessBeginContour} can * only be called between {@link #gluTessBeginPolygon * gluTessBeginPolygon} and * {@link #gluTessEndPolygon gluTessEndPolygon}. * * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * * @see #gluNewTess gluNewTess * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluTessVertex gluTessVertex * @see #gluTessCallback gluTessCallback * @see #gluTessProperty gluTessProperty * @see #gluTessNormal gluTessNormal * @see #gluTessEndPolygon gluTessEndPolygon ****************************************************************************/ public final void gluTessEndContour(GLUtessellator tessellator) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluTessEndContour(); } /***************************************************************************** * gluTessEndPolygon and * {@link #gluTessBeginPolygon gluTessBeginPolygon} * delimit the definition of a convex, concave or self-intersecting polygon. * Within each {@link #gluTessBeginPolygon * gluTessBeginPolygon}/gluTessEndPolygon pair, there must be one or * more calls to {@link #gluTessBeginContour * gluTessBeginContour}/{@link #gluTessEndContour * gluTessEndContour}. Within each contour, there are zero or more calls to * {@link #gluTessVertex gluTessVertex}. The vertices * specify a closed contour (the last vertex of each contour is automatically * linked to the first). See the {@link #gluTessVertex * gluTessVertex}, {@link #gluTessBeginContour * gluTessBeginContour} and {@link #gluTessEndContour * gluTessEndContour} reference pages for more details.

* * Once gluTessEndPolygon is called, the polygon is tessellated, and * the resulting triangles are described through callbacks. See * {@link #gluTessCallback gluTessCallback} for * descriptions of the callback functions. * * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * * @see #gluNewTess gluNewTess * @see #gluTessBeginContour gluTessBeginContour * @see #gluTessVertex gluTessVertex * @see #gluTessCallback gluTessCallback * @see #gluTessProperty gluTessProperty * @see #gluTessNormal gluTessNormal * @see #gluTessBeginPolygon gluTessBeginPolygon ****************************************************************************/ public final void gluTessEndPolygon(GLUtessellator tessellator) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluTessEndPolygon(); } /***************************************************************************** * gluBeginPolygon and {@link #gluEndPolygon gluEndPolygon} * delimit the definition of a nonconvex polygon. To define such a * polygon, first call gluBeginPolygon. Then define the * contours of the polygon by calling {@link #gluTessVertex * gluTessVertex} for each vertex and {@link #gluNextContour * gluNextContour} to start each new contour. Finally, call {@link * #gluEndPolygon gluEndPolygon} to signal the end of the * definition. See the {@link #gluTessVertex gluTessVertex} and {@link * #gluNextContour gluNextContour} reference pages for more * details.

* * Once {@link #gluEndPolygon gluEndPolygon} is called, * the polygon is tessellated, and the resulting triangles are described * through callbacks. See {@link #gluTessCallback * gluTessCallback} for descriptions of the callback methods. * * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * * @see #gluNewTess gluNewTess * @see #gluNextContour gluNextContour * @see #gluTessCallback gluTessCallback * @see #gluTessVertex gluTessVertex * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluTessBeginContour gluTessBeginContour ****************************************************************************/ public final void gluBeginPolygon(GLUtessellator tessellator) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluBeginPolygon(); } /***************************************************************************** * gluNextContour is used to describe polygons with multiple * contours. After you describe the first contour through a series of * {@link #gluTessVertex gluTessVertex} calls, a * gluNextContour call indicates that the previous contour is complete * and that the next contour is about to begin. Perform another series of * {@link #gluTessVertex gluTessVertex} calls to * describe the new contour. Repeat this process until all contours have been * described.

* * The type parameter defines what type of contour follows. The following * values are valid.

* * GLU_EXTERIOR *

* GLU_INTERIOR * * GLU_UNKNOWN * * GLU_CCW, GLU_CW *

* * To define the type of the first contour, you can call gluNextContour * before describing the first contour. If you do not call * gluNextContour before the first contour, the first contour is marked * GLU_EXTERIOR.

* *

* * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * @param type * The type of the contour being defined. * * @see #gluNewTess gluNewTess * @see #gluTessBeginContour gluTessBeginContour * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluTessCallback gluTessCallback * @see #gluTessEndContour gluTessEndContour * @see #gluTessVertex gluTessVertex ****************************************************************************/ public final void gluNextContour(GLUtessellator tessellator, int type) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluNextContour(type); } /***************************************************************************** * gluEndPolygon and {@link #gluBeginPolygon * gluBeginPolygon} delimit the definition of a nonconvex polygon. To define * such a polygon, first call {@link #gluBeginPolygon * gluBeginPolygon}. Then define the contours of the polygon by calling * {@link #gluTessVertex gluTessVertex} for each vertex * and {@link #gluNextContour gluNextContour} to start * each new contour. Finally, call gluEndPolygon to signal the end of * the definition. See the {@link #gluTessVertex * gluTessVertex} and {@link #gluNextContour * gluNextContour} reference pages for more details.

* * Once gluEndPolygon is called, the polygon is tessellated, and the * resulting triangles are described through callbacks. See * {@link #gluTessCallback gluTessCallback} for * descriptions of the callback methods. * * @param tessellator * Specifies the tessellation object (created with * {@link #gluNewTess gluNewTess}). * * @see #gluNewTess gluNewTess * @see #gluNextContour gluNextContour * @see #gluTessCallback gluTessCallback * @see #gluTessVertex gluTessVertex * @see #gluTessBeginPolygon gluTessBeginPolygon * @see #gluTessBeginContour gluTessBeginContour ****************************************************************************/ public final void gluEndPolygon(GLUtessellator tessellator) { GLUtessellatorImpl tess = (GLUtessellatorImpl) tessellator; tess.gluEndPolygon(); } //---------------------------------------------------------------------- // Quadric functionality // /** Interface to C language function:
void gluCylinder(GLUquadric * quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks); */ public final void gluCylinder(GLUquadric quad, double base, double top, double height, int slices, int stacks) { ((GLUquadricImpl) quad).drawCylinder(getCurrentGL2(), (float) base, (float) top, (float) height, slices, stacks); } /** Interface to C language function:
void gluDeleteQuadric(GLUquadric * quad); */ public final void gluDeleteQuadric(GLUquadric quad) { } /** Interface to C language function:
void gluDisk(GLUquadric * quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops); */ public final void gluDisk(GLUquadric quad, double inner, double outer, int slices, int loops) { ((GLUquadricImpl) quad).drawDisk(getCurrentGL2(), (float) inner, (float) outer, slices, loops); } /** Interface to C language function:
GLUquadric * gluNewQuadric(void); */ public final GLUquadric gluNewQuadric() { return new GLUquadricImpl(); } /** Interface to C language function:
void gluPartialDisk(GLUquadric * quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops, GLdouble start, GLdouble sweep); */ public final void gluPartialDisk(GLUquadric quad, double inner, double outer, int slices, int loops, double start, double sweep) { ((GLUquadricImpl) quad).drawPartialDisk(getCurrentGL2(), (float) inner, (float) outer, slices, loops, (float) start, (float) sweep); } /** Interface to C language function:
void gluQuadricDrawStyle(GLUquadric * quad, GLenum draw); */ public final void gluQuadricDrawStyle(GLUquadric quad, int draw) { ((GLUquadricImpl) quad).setDrawStyle(draw); } /** Interface to C language function:
void gluQuadricNormals(GLUquadric * quad, GLenum normal); */ public final void gluQuadricNormals(GLUquadric quad, int normal) { ((GLUquadricImpl) quad).setNormals(normal); } /** Interface to C language function:
void gluQuadricOrientation(GLUquadric * quad, GLenum orientation); */ public final void gluQuadricOrientation(GLUquadric quad, int orientation) { ((GLUquadricImpl) quad).setOrientation(orientation); } /** Interface to C language function:
void gluQuadricTexture(GLUquadric * quad, GLboolean texture); */ public final void gluQuadricTexture(GLUquadric quad, boolean texture) { ((GLUquadricImpl) quad).setTextureFlag(texture); } /** Interface to C language function:
void gluSphere(GLUquadric * quad, GLdouble radius, GLint slices, GLint stacks); */ public final void gluSphere(GLUquadric quad, double radius, int slices, int stacks) { ((GLUquadricImpl) quad).drawSphere(getCurrentGL2(), (float) radius, slices, stacks); } //---------------------------------------------------------------------- // Projection routines // private ProjectDouble project; public final void gluOrtho2D(double left, double right, double bottom, double top) { project.gluOrtho2D(getCurrentGL2(), left, right, bottom, top); } public final void gluPerspective(double fovy, double aspect, double zNear, double zFar) { project.gluPerspective(getCurrentGL2(), fovy, aspect, zNear, zFar); } public final void gluLookAt(double eyeX, double eyeY, double eyeZ, double centerX, double centerY, double centerZ, double upX, double upY, double upZ) { project.gluLookAt(getCurrentGL2(), eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ); } /** Interface to C language function:
GLint gluProject(GLdouble objX, GLdouble objY, GLdouble objZ, const GLdouble * model, const GLdouble * proj, const GLint * view, GLdouble * winX, GLdouble * winY, GLdouble * winZ); *

Accepts the outgoing window coordinates as a single array. */ public final boolean gluProject(double objX, double objY, double objZ, double[] model, int model_offset, double[] proj, int proj_offset, int[] view, int view_offset, double[] winPos, int winPos_offset) { return project.gluProject(objX, objY, objZ, model, model_offset, proj, proj_offset, view, view_offset, winPos, winPos_offset); } /** Interface to C language function:
GLint gluProject(GLdouble objX, GLdouble objY, GLdouble objZ, const GLdouble * model, const GLdouble * proj, const GLint * view, GLdouble * winX, GLdouble * winY, GLdouble * winZ); *

Accepts the outgoing window coordinates as a single buffer. */ public final boolean gluProject(double objX, double objY, double objZ, DoubleBuffer model, DoubleBuffer proj, IntBuffer view, DoubleBuffer winPos) { return project.gluProject(objX, objY, objZ, model, proj, view, winPos); } /** Interface to C language function:
GLint gluUnProject(GLdouble winX, GLdouble winY, GLdouble winZ, const GLdouble * model, const GLdouble * proj, const GLint * view, GLdouble * objX, GLdouble * objY, GLdouble * objZ); *

Accepts the outgoing object coordinates (a 3-vector) as a single array. */ public final boolean gluUnProject(double winX, double winY, double winZ, double[] model, int model_offset, double[] proj, int proj_offset, int[] view, int view_offset, double[] objPos, int objPos_offset) { return project.gluUnProject(winX, winY, winZ, model, model_offset, proj, proj_offset, view, view_offset, objPos, objPos_offset); } /** Interface to C language function:
GLint gluUnProject(GLdouble winX, GLdouble winY, GLdouble winZ, const GLdouble * model, const GLdouble * proj, const GLint * view, GLdouble * objX, GLdouble * objY, GLdouble * objZ); *

Accepts the outgoing object coordinates (a 3-vector) as a single buffer. */ public final boolean gluUnProject(double winX, double winY, double winZ, DoubleBuffer model, DoubleBuffer proj, IntBuffer view, DoubleBuffer objPos) { return project.gluUnProject(winX, winY, winZ, model, proj, view, objPos); } /** Interface to C language function:
GLint gluUnProject4(GLdouble winX, GLdouble winY, GLdouble winZ, GLdouble clipW, const GLdouble * model, const GLdouble * proj, const GLint * view, GLdouble nearVal, GLdouble farVal, GLdouble * objX, GLdouble * objY, GLdouble * objZ, GLdouble * objW); *

Accepts the outgoing object coordinates (a 4-vector) as a single array. */ public final boolean gluUnProject4(double winX, double winY, double winZ, double clipW, double[] model, int model_offset, double[] proj, int proj_offset, int[] view, int view_offset, double nearVal, double farVal, double[] objPos, int objPos_offset) { return project.gluUnProject4(winX, winY, winZ, clipW, model, model_offset, proj, proj_offset, view, view_offset, nearVal, farVal, objPos, objPos_offset); } /** Interface to C language function:
GLint gluUnProject4(GLdouble winX, GLdouble winY, GLdouble winZ, GLdouble clipW, const GLdouble * model, const GLdouble * proj, const GLint * view, GLdouble nearVal, GLdouble farVal, GLdouble * objX, GLdouble * objY, GLdouble * objZ, GLdouble * objW); *

Accepts the outgoing object coordinates (a 4-vector) as a single buffer. */ public final boolean gluUnProject4(double winX, double winY, double winZ, double clipW, DoubleBuffer model, DoubleBuffer proj, IntBuffer view, double nearVal, double farVal, DoubleBuffer objPos) { return project.gluUnProject4(winX, winY, winZ, clipW, model, proj, view, nearVal, farVal, objPos); } public final void gluPickMatrix(double x, double y, double delX, double delY, int[] viewport, int viewport_offset) { project.gluPickMatrix(getCurrentGL2(), x, y, delX, delY, viewport, viewport_offset); } public final void gluPickMatrix(double x, double y, double delX, double delY, IntBuffer viewport) { project.gluPickMatrix(getCurrentGL2(), x, y, delX, delY, viewport); } //---------------------------------------------------------------------- // Mipmap and image scaling functionality private final ByteBuffer copyToByteBuffer(Buffer buf) { if (buf instanceof ByteBuffer) { if (buf.position() == 0) { return (ByteBuffer) buf; } return BufferUtil.copyByteBuffer((ByteBuffer) buf); } else if (buf instanceof ShortBuffer) { return BufferUtil.copyShortBufferAsByteBuffer((ShortBuffer) buf); } else if (buf instanceof IntBuffer) { return BufferUtil.copyIntBufferAsByteBuffer((IntBuffer) buf); } else if (buf instanceof FloatBuffer) { return BufferUtil.copyFloatBufferAsByteBuffer((FloatBuffer) buf); } else { throw new IllegalArgumentException("Unsupported buffer type (must be one of byte, short, int, or float)"); } } private final int gluScaleImageJava( int format, int widthin, int heightin, int typein, Buffer datain, int widthout, int heightout, int typeout, Buffer dataout ) { ByteBuffer in = null; ByteBuffer out = null; in = copyToByteBuffer(datain); if( dataout instanceof ByteBuffer ) { out = (ByteBuffer)dataout; } else if( dataout instanceof ShortBuffer ) { out = BufferUtil.newByteBuffer(dataout.remaining() * BufferUtil.SIZEOF_SHORT); } else if ( dataout instanceof IntBuffer ) { out = BufferUtil.newByteBuffer(dataout.remaining() * BufferUtil.SIZEOF_INT); } else if ( dataout instanceof FloatBuffer ) { out = BufferUtil.newByteBuffer(dataout.remaining() * BufferUtil.SIZEOF_FLOAT); } else { throw new IllegalArgumentException("Unsupported destination buffer type (must be byte, short, int, or float)"); } int errno = Mipmap.gluScaleImage( getCurrentGL2(), format, widthin, heightin, typein, in, widthout, heightout, typeout, out ); if( errno == 0 ) { out.rewind(); if (out != dataout) { if( dataout instanceof ShortBuffer ) { ((ShortBuffer) dataout).put(out.asShortBuffer()); } else if( dataout instanceof IntBuffer ) { ((IntBuffer) dataout).put(out.asIntBuffer()); } else if( dataout instanceof FloatBuffer ) { ((FloatBuffer) dataout).put(out.asFloatBuffer()); } else { throw new RuntimeException("Should not reach here"); } } } return( errno ); } private final int gluBuild1DMipmapLevelsJava( int target, int internalFormat, int width, int format, int type, int userLevel, int baseLevel, int maxLevel, Buffer data ) { ByteBuffer buffer = copyToByteBuffer(data); return( Mipmap.gluBuild1DMipmapLevels( getCurrentGL2(), target, internalFormat, width, format, type, userLevel, baseLevel, maxLevel, buffer ) ); } private final int gluBuild1DMipmapsJava( int target, int internalFormat, int width, int format, int type, Buffer data ) { ByteBuffer buffer = copyToByteBuffer(data); return( Mipmap.gluBuild1DMipmaps( getCurrentGL2(), target, internalFormat, width, format, type, buffer ) ); } private final int gluBuild2DMipmapLevelsJava( int target, int internalFormat, int width, int height, int format, int type, int userLevel, int baseLevel, int maxLevel, Buffer data ) { // While the code below handles other data types, it doesn't handle non-ByteBuffers data = copyToByteBuffer(data); return( Mipmap.gluBuild2DMipmapLevels( getCurrentGL2(), target, internalFormat, width, height, format, type, userLevel, baseLevel, maxLevel, data ) ); } private final int gluBuild2DMipmapsJava( int target, int internalFormat, int width, int height, int format, int type, Buffer data ) { // While the code below handles other data types, it doesn't handle non-ByteBuffers data = copyToByteBuffer(data); return( Mipmap.gluBuild2DMipmaps( getCurrentGL2(), target, internalFormat, width, height, format, type, data) ); } private final int gluBuild3DMipmapLevelsJava( int target, int internalFormat, int width, int height, int depth, int format, int type, int userLevel, int baseLevel, int maxLevel, Buffer data) { ByteBuffer buffer = copyToByteBuffer(data); return( Mipmap.gluBuild3DMipmapLevels( getCurrentGL2(), target, internalFormat, width, height, depth, format, type, userLevel, baseLevel, maxLevel, buffer) ); } private final int gluBuild3DMipmapsJava( int target, int internalFormat, int width, int height, int depth, int format, int type, Buffer data ) { ByteBuffer buffer = copyToByteBuffer(data); return( Mipmap.gluBuild3DMipmaps( getCurrentGL2(), target, internalFormat, width, height, depth, format, type, buffer ) ); } //---------------------------------------------------------------------- // Wrappers for mipmap and image scaling entry points which dispatch either // to the Java or C versions. // /** Interface to C language function:
GLint gluBuild1DMipmapLevels(GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void * data); */ public final int gluBuild1DMipmapLevels(int target, int internalFormat, int width, int format, int type, int level, int base, int max, java.nio.Buffer data) { if (useJavaMipmapCode) { return gluBuild1DMipmapLevelsJava(target, internalFormat, width, format, type, level, base, max, data); } else { return gluBuild1DMipmapLevelsC(target, internalFormat, width, format, type, level, base, max, data); } } /** Interface to C language function:
GLint gluBuild1DMipmaps(GLenum target, GLint internalFormat, GLsizei width, GLenum format, GLenum type, const void * data); */ public final int gluBuild1DMipmaps(int target, int internalFormat, int width, int format, int type, java.nio.Buffer data) { if (useJavaMipmapCode) { return gluBuild1DMipmapsJava(target, internalFormat, width, format, type, data); } else { return gluBuild1DMipmapsC(target, internalFormat, width, format, type, data); } } /** Interface to C language function:
GLint gluBuild2DMipmapLevels(GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void * data); */ public final int gluBuild2DMipmapLevels(int target, int internalFormat, int width, int height, int format, int type, int level, int base, int max, java.nio.Buffer data) { if (useJavaMipmapCode) { return gluBuild2DMipmapLevelsJava(target, internalFormat, width, height, format, type, level, base, max, data); } else { return gluBuild2DMipmapLevelsC(target, internalFormat, width, height, format, type, level, base, max, data); } } /** Interface to C language function:
GLint gluBuild2DMipmaps(GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * data); */ public final int gluBuild2DMipmaps(int target, int internalFormat, int width, int height, int format, int type, java.nio.Buffer data) { if (useJavaMipmapCode) { return gluBuild2DMipmapsJava(target, internalFormat, width, height, format, type, data); } else { return gluBuild2DMipmapsC(target, internalFormat, width, height, format, type, data); } } /** Interface to C language function:
GLint gluBuild3DMipmapLevels(GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint level, GLint base, GLint max, const void * data); */ public final int gluBuild3DMipmapLevels(int target, int internalFormat, int width, int height, int depth, int format, int type, int level, int base, int max, java.nio.Buffer data) { if (useJavaMipmapCode) { return gluBuild3DMipmapLevelsJava(target, internalFormat, width, height, depth, format, type, level, base, max, data); } else { return gluBuild3DMipmapLevelsC(target, internalFormat, width, height, depth, format, type, level, base, max, data); } } /** Interface to C language function:
GLint gluBuild3DMipmaps(GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * data); */ public final int gluBuild3DMipmaps(int target, int internalFormat, int width, int height, int depth, int format, int type, java.nio.Buffer data) { if (useJavaMipmapCode) { return gluBuild3DMipmapsJava(target, internalFormat, width, height, depth, format, type, data); } else { return gluBuild3DMipmapsC(target, internalFormat, width, height, depth, format, type, data); } } /** Interface to C language function:
GLint gluScaleImage(GLenum format, GLsizei wIn, GLsizei hIn, GLenum typeIn, const void * dataIn, GLsizei wOut, GLsizei hOut, GLenum typeOut, GLvoid * dataOut); */ public final int gluScaleImage(int format, int wIn, int hIn, int typeIn, java.nio.Buffer dataIn, int wOut, int hOut, int typeOut, java.nio.Buffer dataOut) { if (useJavaMipmapCode) { return gluScaleImageJava(format, wIn, hIn, typeIn, dataIn, wOut, hOut, typeOut, dataOut); } else { return gluScaleImageC(format, wIn, hIn, typeIn, dataIn, wOut, hOut, typeOut, dataOut); } } //---------------------------------------------------------------------- // NURBS functionality // /** * Sets a property on a NURBS object. (NOTE: this function is not currently implemented.) * * @param r * GLUnurbs object holding NURBS to which a property should be * set * @param property * property id * @param value * property value */ public final void gluNurbsProperty(GLUnurbs r, int property, float value) { // TODO glunurbsproperty float nurbsValue; switch (property) { default: // System.out.println("TODO gluwnurbs.glunurbsproperty"); break; } } /** * Creates a new GLUnurbs object. * * @return GLUnurbs object */ public final GLUnurbs gluNewNurbsRenderer() { // DONE return new GLUgl2nurbsImpl(); } /** * Begins a curve definition. * * @param r * GLUnurbs object to specify curve to */ public final void gluBeginCurve(GLUnurbs r) { // DONE ((GLUgl2nurbsImpl) r).bgncurve(); } /** * Begins a surface definition. * * @param r * GLUnurbs object to specify surface to */ public final void gluBeginSurface(GLUnurbs r) { // DONE ((GLUgl2nurbsImpl) r).bgnsurface(); } /** * Ends a surface. * * @param r * GLUnurbs object holding surface */ public final void gluEndSurface(GLUnurbs r) { // DONE ((GLUgl2nurbsImpl) r).endsurface(); } /** * Makes a NURBS surface. * * @param r * GLUnurbs object holding the surface * @param sknot_count * number of knots in s direction * @param sknot * knots in s direction * @param tknot_count * number of knots in t direction * @param tknot * knots in t direction * @param s_stride * number of control points coordinates in s direction * @param t_stride * number of control points coordinates in t direction * @param ctlarray * control points * @param sorder * order of surface in s direction * @param torder * order of surface in t direction * @param type * surface type */ public final void gluNurbsSurface(GLUnurbs r, int sknot_count, float[] sknot, int tknot_count, float[] tknot, int s_stride, int t_stride, float[] ctlarray, int sorder, int torder, int type) { // DONE ((GLUgl2nurbsImpl) r).nurbssurface(sknot_count, sknot, tknot_count, tknot, s_stride, t_stride, ctlarray, sorder, torder, type); } /** * Make a NURBS curve. * * @param r * GLUnurbs object holding the curve * @param nknots * number of knots * @param knot * knot vector * @param stride * number of control point coordinates * @param ctlarray * control points * @param order * order of the curve * @param type * curve type */ public final void gluNurbsCurve(GLUnurbs r, int nknots, float[] knot, int stride, float[] ctlarray, int order, int type) { int realType; switch (type) { // TODO GLU_MAP1_TRIM_2 etc. default: realType = type; break; } ((GLUgl2nurbsImpl) r).nurbscurve(nknots, knot, stride, ctlarray, order, realType); } /** * Ends a curve definition. * * @param r * GLUnurbs object holding the curve */ public final void gluEndCurve(GLUnurbs r) { //DONE ((GLUgl2nurbsImpl) r).endcurve(); } //---------------------------------------------------------------------- // GLUProcAddressTable handling // private static GLUgl2ProcAddressTable gluProcAddressTable; private static volatile boolean gluLibraryLoaded; private static final GLUgl2ProcAddressTable getGLUProcAddressTable() { if (!gluLibraryLoaded) { loadGLULibrary(); } if (gluProcAddressTable == null) { GLUgl2ProcAddressTable tmp = new GLUgl2ProcAddressTable(); ProcAddressHelper.resetProcAddressTable(tmp, GLDrawableFactoryImpl.getFactoryImpl(false)); gluProcAddressTable = tmp; } return gluProcAddressTable; } private static final synchronized void loadGLULibrary() { if (!gluLibraryLoaded) { GLDrawableFactoryImpl.getFactoryImpl(false).loadGLULibrary(); gluLibraryLoaded = true; } }