/* * 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. */ package org.lwjgl.test.glu.tessellation; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.util.glu.GLUtessellator; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.util.glu.GLU.*; public class TessellationTest { private GLUtessellator tesselator; void init() { // Create a new tessellation object tesselator = gluNewTess(); // Set callback functions TessCallback callback = new TessCallback(); tesselator.gluTessCallback(GLU_TESS_VERTEX, callback); tesselator.gluTessCallback(GLU_TESS_BEGIN, callback); tesselator.gluTessCallback(GLU_TESS_END, callback); tesselator.gluTessCallback(GLU_TESS_COMBINE, callback); } void setWindingRule(int windingRule) { // Set the winding rule tesselator.gluTessProperty(GLU_TESS_WINDING_RULE, windingRule); } void renderContour(double obj_data[][], int num_vertices) { for (int x = 0; x < num_vertices; x++) //loop through the vertices { tesselator.gluTessVertex(obj_data[x], 0, new VertexData(obj_data[x])); //store the vertex } } void beginPolygon() { tesselator.gluTessBeginPolygon(null); } void endPolygon() { tesselator.gluTessEndPolygon(); } void beginContour() { tesselator.gluTessBeginContour(); } void endContour() { tesselator.gluTessEndContour(); } void end() { tesselator.gluDeleteTess(); } private void createDisplay() throws LWJGLException { int width = 300; int height = 300; Display.setDisplayMode(new DisplayMode(width,height)); Display.create(); Display.setVSyncEnabled(true); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glViewport(0,0,width,height); glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, width, height, 0, 1, -1); glMatrixMode(GL_MODELVIEW); } private void loop() { while (true) { render(); Display.update(); Display.sync(100); if (Display.isCloseRequested()) { System.exit(0); } } } private void render() { glTranslatef(150,125,0); glScalef(50,50,1); // first polygon: a star-5 vertices and color information double star[][] = { {0.6f, -0.1f, 0f, 1.0f, 1.0f, 1.0f}, {1.35f, 1.4f, 0f, 1.0f, 1.0f, 1.0f}, {2.1f, -0.1f, 0f, 1.0f, 1.0f, 1.0f}, {0.6f, 0.9f, 0f, 1.0f, 1.0f, 1.0f}, {2.1f, 0.9f, 0f, 1.0f, 1.0f, 1.0f} }; //second polygon: a quad-4 vertices; first contour double quad[][] = { {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f}, {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f}, {0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f} }; //second polygon: a triangle-3 vertices; second contour double tri[][] = {{0.3f, 0.3f, 0.0f, 0.0f, 0.0f, 0.0f}, {0.7f, 0.3f, 0.0f, 0.0f, 0.0f, 0.0f}, {0.5f, 0.7f, 0.0f, 0.0f, 0.0f, 0.0f} }; // render the first polygon: the textured star // set winding rule to positive setWindingRule(GLU_TESS_WINDING_POSITIVE); beginPolygon(); beginContour(); renderContour(star, 5); endContour(); endPolygon(); // render the second polygon: triangle cut out of a quad glTranslatef(-2,0,0); // set winding rule to odd setWindingRule(GLU_TESS_WINDING_ODD); // begin the new polygon beginPolygon(); beginContour(); renderContour(quad, 4); endContour(); beginContour(); renderContour(tri, 3); endContour(); endPolygon(); // delete the tess object end(); } private void start() throws LWJGLException { createDisplay(); init(); loop(); } public static void main(String[] argv) throws LWJGLException { TessellationTest test = new TessellationTest(); test.start(); } }