/* * Copyright (c) 2002-2008 LWJGL Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions 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 'LWJGL' nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * Portions Copyright (C) 2003-2006 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. ** ** NOTE: The Original Code (as defined below) has been licensed to Sun ** Microsystems, Inc. ("Sun") under the SGI Free Software License B ** (Version 1.1), shown above ("SGI License"). Pursuant to Section ** 3.2(3) of the SGI License, Sun is distributing the Covered Code to ** you under an alternative license ("Alternative License"). This ** Alternative License includes all of the provisions of the SGI License ** except that Section 2.2 and 11 are omitted. Any differences between ** the Alternative License and the SGI License are offered solely by Sun ** and not by SGI. ** ** 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 org.lwjgl.util.glu; /** * <b>GLUtessellatorCallback</b> 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 GLUtessellatorCallback { /** * The <b>begin</b> callback method is invoked like * {@link javax.media.opengl.GL#glBegin glBegin} to indicate the start of a * (triangle) primitive. The method takes a single argument of type int. If * the <b>GLU_TESS_BOUNDARY_ONLY</b> property is set to <b>GL_FALSE</b>, then * the argument is set to either <b>GL_TRIANGLE_FAN</b>, * <b>GL_TRIANGLE_STRIP</b>, or <b>GL_TRIANGLES</b>. If the * <b>GLU_TESS_BOUNDARY_ONLY</b> property is set to <b>GL_TRUE</b>, then the * argument will be set to <b>GL_LINE_LOOP</b>. * * @param type * Specifics the type of begin/end pair being defined. The following * values are valid: <b>GL_TRIANGLE_FAN</b>, <b>GL_TRIANGLE_STRIP</b>, * <b>GL_TRIANGLES</b> or <b>GL_LINE_LOOP</b>. * * @see GLU#gluTessCallback gluTessCallback * @see #end end * @see #begin begin */ void begin(int type); /** * The same as the {@link #begin begin} callback method except that * it takes an additional reference argument. This reference is * identical to the opaque reference provided when {@link * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. * * @param type * Specifics the type of begin/end pair being defined. The following * values are valid: <b>GL_TRIANGLE_FAN</b>, <b>GL_TRIANGLE_STRIP</b>, * <b>GL_TRIANGLES</b> or <b>GL_LINE_LOOP</b>. * @param polygonData * Specifics a reference to user-defined data. * * @see GLU#gluTessCallback gluTessCallback * @see #endData endData * @see #begin begin */ void beginData(int type, Object polygonData); /** * The <b>edgeFlag</b> callback method is similar to * {@link javax.media.opengl.GL#glEdgeFlag glEdgeFlag}. The method takes * a single boolean boundaryEdge that indicates which edges lie on the * polygon boundary. If the boundaryEdge is <b>GL_TRUE</b>, 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 <b>GL_FALSE</b>, 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.<P> * * Since triangle fans and triangle strips do not support edge flags, the * begin callback is not called with <b>GL_TRIANGLE_FAN</b> or * <b>GL_TRIANGLE_STRIP</b> 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 GLU#gluTessCallback gluTessCallback * @see #edgeFlagData edgeFlagData */ void edgeFlag(boolean boundaryEdge); /** * The same as the {@link #edgeFlag edgeFlage} callback method * except that it takes an additional reference argument. This * reference is identical to the opaque reference provided when * {@link 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 GLU#gluTessCallback gluTessCallback * @see #edgeFlag edgeFlag */ void edgeFlagData(boolean boundaryEdge, Object polygonData); /** * The <b>vertex</b> callback method is invoked between the {@link * #begin begin} and {@link #end end} callback methods. It is * similar to {@link javax.media.opengl.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 * GLU#gluTessVertex gluTessVertex}). * * @param vertexData * Specifics a reference to the vertices of the triangles created * byt the tessellatin process. * * @see GLU#gluTessCallback gluTessCallback * @see #vertexData vertexData */ void vertex(Object vertexData); /** * The same as the {@link #vertex vertex} callback method except * that it takes an additional reference argument. This reference is * identical to the opaque reference provided when {@link * 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 GLU#gluTessCallback gluTessCallback * @see #vertex vertex */ void vertexData(Object vertexData, Object polygonData); /** * The end callback serves the same purpose as * {@link javax.media.opengl.GL#glEnd glEnd}. It indicates the end of a * primitive and it takes no arguments. * * @see GLU#gluTessCallback gluTessCallback * @see #begin begin * @see #endData endData */ void end(); /** * The same as the {@link #end end} callback method except that it * takes an additional reference argument. This reference is * identical to the opaque reference provided when {@link * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. * * @param polygonData * Specifics a reference to user-defined data. * * @see GLU#gluTessCallback gluTessCallback * @see #beginData beginData * @see #end end */ void endData(Object polygonData); /** * The <b>combine</b> 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.<P> * * The vertex is defined as a linear combination of up to four existing * vertices, stored in <i>data</i>. The coefficients of the linear combination * are given by <i>weight</i>; these weights always add up to 1. All vertex * pointers are valid even when some of the weights are 0. <i>coords</i> gives * the location of the new vertex.<P> * * The user must allocate another vertex, interpolate parameters using * <i>data</i> and <i>weight</i>, and return the new vertex pointer in * <i>outData</i>. This handle is supplied during rendering callbacks. The * user is responsible for freeing the memory some time after * {@link GLU#gluTessEndPolygon gluTessEndPolygon} is * called.<P> * * For example, if the polygon lies in an arbitrary plane in 3-space, and a * color is associated with each vertex, the <b>GLU_TESS_COMBINE</b> * callback might look like this: * </UL> * <PRE> * 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; * }</PRE> * * @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 GLU#gluTessCallback gluTessCallback * @see #combineData combineData */ void combine(double[] coords, Object[] data, float[] weight, Object[] outData); /** * The same as the {@link #combine combine} callback method except * that it takes an additional reference argument. This reference is * identical to the opaque reference provided when {@link * 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 GLU#gluTessCallback gluTessCallback * @see #combine combine */ void combineData(double[] coords, Object[] data, float[] weight, Object[] outData, Object polygonData); /** * The <b>error</b> 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 <b>GLU_TESS_MISSING_BEGIN_POLYGON</b>, * <b>GLU_TESS_MISSING_END_POLYGON</b>, <b>GLU_TESS_MISSING_BEGIN_CONTOUR</b>, * <b>GLU_TESS_MISSING_END_CONTOUR</b>, <b>GLU_TESS_COORD_TOO_LARGE</b>, * <b>GLU_TESS_NEED_COMBINE_CALLBACK</b> or <b>GLU_OUT_OF_MEMORY</b>. * Character strings describing these errors can be retrieved with the * {@link GLU#gluErrorString gluErrorString} call.<P> * * The GLU library will recover from the first four errors by inserting the * missing call(s). <b>GLU_TESS_COORD_TOO_LARGE</b> indicates that some * vertex coordinate exceeded the predefined constant * <b>GLU_TESS_MAX_COORD</b> 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.) * <b>GLU_TESS_NEED_COMBINE_CALLBACK</b> indicates that the tessellation * detected an intersection between two edges in the input data, and the * <b>GLU_TESS_COMBINE</b> or <b>GLU_TESS_COMBINE_DATA</b> callback was not * provided. No output is generated. <b>GLU_OUT_OF_MEMORY</b> indicates that * there is not enough memory so no output is generated. * * @param errnum * Specifics the error number code. * * @see GLU#gluTessCallback gluTessCallback * @see #errorData errorData */ void error(int errnum); /** * The same as the {@link #error error} callback method except that * it takes an additional reference argument. This reference is * identical to the opaque reference provided when {@link * GLU#gluTessBeginPolygon gluTessBeginPolygon} was called. * * @param errnum * Specifics the error number code. * @param polygonData * Specifics a reference to user-defined data. * * @see GLU#gluTessCallback gluTessCallback * @see #error error */ void errorData(int errnum, Object polygonData); //void mesh(com.sun.opengl.impl.tessellator.GLUmesh mesh); }