/* * Portions Copyright (C) 2003 Sun Microsystems, Inc. * All rights reserved. */ /* ** License Applicability. Except to the extent portions of this file are ** made subject to an alternative license as permitted in the SGI Free ** Software License B, Version 1.1 (the "License"), the contents of this ** file are subject only to the provisions of the License. You may not use ** this file except in compliance with the License. You may obtain a copy ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: ** ** http://oss.sgi.com/projects/FreeB ** ** Note that, as provided in the License, the Software is distributed on an ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. ** ** Original Code. The Original Code is: OpenGL Sample Implementation, ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. ** Copyright in any portions created by third parties is as indicated ** elsewhere herein. All Rights Reserved. ** ** Additional Notice Provisions: The application programming interfaces ** established by SGI in conjunction with the Original Code are The ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X ** Window System(R) (Version 1.3), released October 19, 1998. This software ** was created using the OpenGL(R) version 1.2.1 Sample Implementation ** published by SGI, but has not been independently verified as being ** compliant with the OpenGL(R) version 1.2.1 Specification. ** ** Author: Eric Veach, July 1994 ** Java Port: Pepijn Van Eeckhoudt, July 2003 ** Java Port: Nathan Parker Burg, August 2003 */ package net.java.games.jogl; /** * GLUtesselatorCallback interface provides methods that the user will * override to define the callbacks for a tessellation object. * * @author Eric Veach, July 1994 * @author Java Port: Pepijn Van Eeckhoudt, July 2003 * @author Java Port: Nathan Parker Burg, August 2003 */ public interface GLUtesselatorCallback { /** * The begin callback method is invoked like * {@link net.java.games.jogl.GL#glBegin glBegin} to indicate the start of a * (triangle) primitive. The method takes a single argument of type int. If * the GLU_TESS_BOUNDARY_ONLY property is set to GL_FALSE, then * the argument is set to either GL_TRIANGLE_FAN, * GL_TRIANGLE_STRIP, or GL_TRIANGLES. If the * GLU_TESS_BOUNDARY_ONLY property is set to GL_TRUE, then the * argument will be set to GL_LINE_LOOP. * * @param type * Specifics the type of begin/end pair being defined. The following * values are valid: GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, * GL_TRIANGLES or GL_LINE_LOOP. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#end end * @see net.java.games.jogl.GLUtesselatorCallback#begin begin */ public void begin(int type); /** * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#begin * begin} callback method except that it takes an additional reference * argument. This reference is identical to the opaque reference provided when * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was * called. * * @param type * Specifics the type of begin/end pair being defined. The following * values are valid: GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, * GL_TRIANGLES or GL_LINE_LOOP. * @param polygonData * Specifics a reference to user-defined data. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#endData endData * @see net.java.games.jogl.GLUtesselatorCallback#begin begin */ public void beginData(int type, Object polygonData); /** * The edgeFlag callback method is similar to * {@link net.java.games.jogl.GL#glEdgeFlag glEdgeFlag}. The method takes * a single boolean boundaryEdge that indicates which edges lie on the * polygon boundary. If the boundaryEdge is GL_TRUE, then each vertex * that follows begins an edge that lies on the polygon boundary, that is, * an edge that separates an interior region from an exterior one. If the * boundaryEdge is GL_FALSE, then each vertex that follows begins an * edge that lies in the polygon interior. The edge flag callback (if * defined) is invoked before the first vertex callback.

* * Since triangle fans and triangle strips do not support edge flags, the * begin callback is not called with GL_TRIANGLE_FAN or * GL_TRIANGLE_STRIP if a non-null edge flag callback is provided. * (If the callback is initialized to null, there is no impact on * performance). Instead, the fans and strips are converted to independent * triangles. * * @param boundaryEdge * Specifics which edges lie on the polygon boundary. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#edgeFlagData edgeFlagData */ public void edgeFlag(boolean boundaryEdge); /** * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#edgeFlag * edgeFlage} callback method except that it takes an additional reference * argument. This reference is identical to the opaque reference provided when * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was * called. * * @param boundaryEdge * Specifics which edges lie on the polygon boundary. * @param polygonData * Specifics a reference to user-defined data. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#edgeFlag edgeFlag */ public void edgeFlagData(boolean boundaryEdge, Object polygonData); /** * The vertex callback method is invoked between the * {@link net.java.games.jogl.GLUtesselatorCallback#begin begin} and * {@link net.java.games.jogl.GLUtesselatorCallback#end end} callback methods. * It is similar to {@link net.java.games.jogl.GL#glVertex3f glVertex3f}, and it * defines the vertices of the triangles created by the tessellation process. * The method takes a reference as its only argument. This reference is * identical to the opaque reference provided by the user when the vertex was * described (see {@link net.java.games.jogl.GLU#gluTessVertex * gluTessVertex}). * * @param vertexData * Specifics a reference to the vertices of the triangles created * byt the tessellatin process. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#vertexData vertexData */ public void vertex(Object vertexData); /** * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#vertex * vertex} callback method except that it takes an additional reference * argument. This reference is identical to the opaque reference provided when * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was * called. * * @param vertexData * Specifics a reference to the vertices of the triangles created * byt the tessellatin process. * @param polygonData * Specifics a reference to user-defined data. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#vertex vertex */ public void vertexData(Object vertexData, Object polygonData); /** * The end callback serves the same purpose as * {@link net.java.games.jogl.GL#glEnd glEnd}. It indicates the end of a * primitive and it takes no arguments. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#begin begin * @see net.java.games.jogl.GLUtesselatorCallback#endData endData */ public void end(); /** * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#end end} * callback method except that it takes an additional reference argument. This * reference is identical to the opaque reference provided when * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was * called. * * @param polygonData * Specifics a reference to user-defined data. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#beginData beginData * @see net.java.games.jogl.GLUtesselatorCallback#end end */ public void endData(Object polygonData); /** * The combine callback method is called to create a new vertex when * the tessellation detects an intersection, or wishes to merge features. The * method takes four arguments: an array of three elements each of type * double, an array of four references, an array of four elements each of * type float, and a reference to a reference.

* * The vertex is defined as a linear combination of up to four existing * vertices, stored in data. The coefficients of the linear combination * are given by weight; these weights always add up to 1. All vertex * pointers are valid even when some of the weights are 0. coords gives * the location of the new vertex.

* * The user must allocate another vertex, interpolate parameters using * data and weight, and return the new vertex pointer in * outData. This handle is supplied during rendering callbacks. The * user is responsible for freeing the memory some time after * {@link net.java.games.jogl.GLU#gluTessEndPolygon gluTessEndPolygon} is * called.

* * For example, if the polygon lies in an arbitrary plane in 3-space, and a * color is associated with each vertex, the GLU_TESS_COMBINE * callback might look like this: * *

   *         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;
   *         }
* * @param coords * Specifics the location of the new vertex. * @param data * Specifics the vertices used to create the new vertex. * @param weight * Specifics the weights used to create the new vertex. * @param outData * Reference user the put the coodinates of the new vertex. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#combineData combineData */ public void combine(double[] coords, Object[] data, float[] weight, Object[] outData); /** * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#combine * combine} callback method except that it takes an additional reference * argument. This reference is identical to the opaque reference provided when * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was * called. * * @param coords * Specifics the location of the new vertex. * @param data * Specifics the vertices used to create the new vertex. * @param weight * Specifics the weights used to create the new vertex. * @param outData * Reference user the put the coodinates of the new vertex. * @param polygonData * Specifics a reference to user-defined data. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#combine combine */ public void combineData(double[] coords, Object[] data, float[] weight, Object[] outData, Object polygonData); /** * The error callback method is called when an error is encountered. * The one argument is of type int; it indicates the specific error that * occurred and will be set to one of GLU_TESS_MISSING_BEGIN_POLYGON, * GLU_TESS_MISSING_END_POLYGON, GLU_TESS_MISSING_BEGIN_CONTOUR, * GLU_TESS_MISSING_END_CONTOUR, GLU_TESS_COORD_TOO_LARGE, * GLU_TESS_NEED_COMBINE_CALLBACK or GLU_OUT_OF_MEMORY. * Character strings describing these errors can be retrieved with the * {@link net.java.games.jogl.GLU#gluErrorString gluErrorString} call.

* * The GLU library will recover from the first four errors by inserting the * missing call(s). GLU_TESS_COORD_TOO_LARGE indicates that some * vertex coordinate exceeded the predefined constant * GLU_TESS_MAX_COORD in absolute value, and that the value has been * clamped. (Coordinate values must be small enough so that two can be * multiplied together without overflow.) * GLU_TESS_NEED_COMBINE_CALLBACK indicates that the tessellation * detected an intersection between two edges in the input data, and the * GLU_TESS_COMBINE or GLU_TESS_COMBINE_DATA callback was not * provided. No output is generated. GLU_OUT_OF_MEMORY indicates that * there is not enough memory so no output is generated. * * @param errnum * Specifics the error number code. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#errorData errorData */ public void error(int errnum); /** * The same as the {@link net.java.games.jogl.GLUtesselatorCallback#error * error} callback method except that it takes an additional reference * argument. This reference is identical to the opaque reference provided when * {@link net.java.games.jogl.GLU#gluTessBeginPolygon gluTessBeginPolygon} was * called. * * @param errnum * Specifics the error number code. * @param polygonData * Specifics a reference to user-defined data. * * @see net.java.games.jogl.GLU#gluTessCallback gluTessCallback * @see net.java.games.jogl.GLUtesselatorCallback#error error */ public void errorData(int errnum, Object polygonData); //void mesh(net.java.games.jogl.impl.tesselator.GLUmesh mesh); }