001        package com.croftsoft.core.media.jogl;
002    
003        import java.nio.*;
004    
005        import javax.media.opengl.GL;
006        import javax.media.opengl.glu.GLU;
007    
008        /***********************************************************************
009        * Library of static methods to manipulate JOGL objects.
010        *
011        * @version
012        *   $Id: JoglLib.java,v 1.5 2008/09/26 23:28:14 croft Exp $
013        * @since
014        *   2008-01-27
015        * @author
016        *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
017        ***********************************************************************/
018         
019        public final class  JoglLib
020        ////////////////////////////////////////////////////////////////////////
021        ////////////////////////////////////////////////////////////////////////
022        {
023          
024        public static void  checkError ( final GL  gl )
025        ////////////////////////////////////////////////////////////////////////
026        {
027          final int  errorCode = gl.glGetError ( );
028          
029          if ( errorCode != GL.GL_NO_ERROR )
030          {
031            // TODO:  There could be more than one error.  Include multiple in
032            // the exception message.  See p67, "OpenGL SuperBible", 4th Ed.
033            
034            throw new RuntimeException (
035              new GLU ( ).gluErrorString ( errorCode ) );
036          }
037        }
038        
039        /***********************************************************************
040        * Creates a display list of a colored cube.
041        *
042        * Destroy the display list by calling glDeleteLists() when done.
043        * 
044        * @return
045        * 
046        *   Returns the created display list name.
047        ***********************************************************************/
048        public static int  createCubeDisplayList ( final GL  gl )
049        ////////////////////////////////////////////////////////////////////////
050        {
051          final int  cubeDisplayList = gl.glGenLists ( 1 );
052    
053          gl.glNewList ( cubeDisplayList, GL.GL_COMPILE );
054    
055          final float [ ] [ ]  vertices = {
056            { -1, -1,  1 },   // 0
057            { -1,  1,  1 },   // 1
058            {  1,  1,  1 },   // 2
059            {  1, -1,  1 },   // 3
060            { -1, -1, -1 },   // 4
061            { -1,  1, -1 },   // 5
062            {  1,  1, -1 },   // 6
063            {  1, -1, -1 } }; // 7
064    
065          gl.glColor3f ( 1, 0, 0 );
066    
067          drawPolygon ( gl, vertices, 0, 3, 2, 1 );
068    
069          gl.glColor3f ( 0, 1, 0 );
070    
071          drawPolygon ( gl, vertices, 2, 3, 7, 6 );
072    
073          gl.glColor3f ( 0, 0, 1 );
074    
075          drawPolygon ( gl, vertices, 3, 0, 4, 7 );
076    
077          gl.glColor3f ( 1, 1, 0 );
078    
079          drawPolygon ( gl, vertices, 1, 2, 6, 5 );
080    
081          gl.glColor3f ( 0, 1, 1 );
082    
083          drawPolygon ( gl, vertices, 4, 5, 6, 7 );
084    
085          gl.glColor3f ( 1, 0, 1 );
086    
087          drawPolygon ( gl, vertices, 5, 4, 0, 1 );
088    
089          gl.glEndList ( );
090    
091          return cubeDisplayList;
092        }
093        
094        public static void  drawPolygon (
095          final GL         gl,
096          final float [ ]  vertex3f0,
097          final float [ ]  vertex3f1,
098          final float [ ]  vertex3f2,
099          final float [ ]  vertex3f3 )
100        ////////////////////////////////////////////////////////////////////////
101        {
102          gl.glBegin ( GL.GL_POLYGON );
103          
104          gl.glVertex3f (
105            vertex3f0 [ 0 ],
106            vertex3f0 [ 1 ],
107            vertex3f0 [ 2 ] );
108            
109          gl.glVertex3f (
110            vertex3f1 [ 0 ],
111            vertex3f1 [ 1 ],
112            vertex3f1 [ 2 ] );
113            
114          gl.glVertex3f (
115            vertex3f2 [ 0 ],
116            vertex3f2 [ 1 ],
117            vertex3f2 [ 2 ] );
118    
119          gl.glVertex3f (
120            vertex3f3 [ 0 ],
121            vertex3f3 [ 1 ],
122            vertex3f3 [ 2 ] );
123          
124          gl.glEnd ( );
125        }
126        
127        public static void  drawPolygon (
128          final GL             gl,
129          final float [ ] [ ]  vertices3f,
130          final int            vertexIndex0,
131          final int            vertexIndex1,
132          final int            vertexIndex2,
133          final int            vertexIndex3 )
134        ////////////////////////////////////////////////////////////////////////
135        {
136          drawPolygon (
137            gl,
138            vertices3f [ vertexIndex0 ],
139            vertices3f [ vertexIndex1 ],
140            vertices3f [ vertexIndex2 ],
141            vertices3f [ vertexIndex3 ] );
142        }
143        
144        public static void  printInfo ( final GL  gl )
145        ////////////////////////////////////////////////////////////////////////
146        {
147          // TODO:  Asking for GL_SHADING_LANGUAGE_VERSION causes an error on
148          // early versions of OpenGL.  Need to check OpenGL version first.
149          
150          final String [ ]  stringArray = new String [ ] {
151            "GL_VERSION",
152            "GL_VENDOR",
153            "GL_RENDERER",
154    //      "GL_SHADING_LANGUAGE_VERSION",
155            "GL_EXTENSIONS" };
156          
157          final int [ ]  enumArray = new int [ ] {
158            GL.GL_VERSION,
159            GL.GL_VENDOR,
160            GL.GL_RENDERER,
161    //      GL.GL_SHADING_LANGUAGE_VERSION,
162            GL.GL_EXTENSIONS };
163    
164          for ( int  i = 0; i < stringArray.length; i++ )
165          {
166            System.out.println ( "OpenGL:  " + stringArray [ i ] + " = "
167              + gl.glGetString ( enumArray [ i ] ) );
168          }
169    
170          final DoubleBuffer  doubleBuffer = DoubleBuffer.allocate ( 4 );
171    
172          gl.glGetDoublev ( GL.GL_CURRENT_COLOR, doubleBuffer );
173    
174          System.out.println ( "OpenGL:  GL_CURRENT_COLOR = ["
175            + doubleBuffer.get ( 0 ) + ", "
176            + doubleBuffer.get ( 1 ) + ", "
177            + doubleBuffer.get ( 2 ) + ", "
178            + doubleBuffer.get ( 3 ) + "]" );
179    
180          final int [ ]  intArray = new int [ 1 ];
181    
182          gl.glGetIntegerv ( GL.GL_MAX_LIGHTS, intArray, 0 );
183    
184          System.out.println ( "OpenGL:  GL_MAX_LIGHTS = " + intArray [ 0 ] );
185          
186          checkError ( gl );
187        }
188         
189        ////////////////////////////////////////////////////////////////////////
190        ////////////////////////////////////////////////////////////////////////
191          
192        private  JoglLib ( )
193        ////////////////////////////////////////////////////////////////////////
194        {
195          // empty
196        }
197        
198        ////////////////////////////////////////////////////////////////////////
199        ////////////////////////////////////////////////////////////////////////
200        }