diff options
author | Kenneth Russel <[email protected]> | 2009-06-15 23:12:27 +0000 |
---|---|---|
committer | Kenneth Russel <[email protected]> | 2009-06-15 23:12:27 +0000 |
commit | 41cd6c47b23975098cd155517790e018670785e7 (patch) | |
tree | 247333528ad674d427ba96b1e05810f7961d609e /src/demos/misc | |
parent | 935d2596c13371bb745d921dbcb9f05b0c11a010 (diff) |
Copied JOGL_2_SANDBOX r350 on to trunk; JOGL_2_SANDBOX branch is now closed
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/jogl-demos/trunk@352 3298f667-5e0e-4b4a-8ed4-a3559d26a5f4
Diffstat (limited to 'src/demos/misc')
-rwxr-xr-x | src/demos/misc/GLCapsTableDemo.java | 341 | ||||
-rwxr-xr-x | src/demos/misc/Picking.java | 275 | ||||
-rwxr-xr-x | src/demos/misc/TiledRendering.java | 159 | ||||
-rw-r--r-- | src/demos/misc/VersionInfo.java | 58 |
4 files changed, 833 insertions, 0 deletions
diff --git a/src/demos/misc/GLCapsTableDemo.java b/src/demos/misc/GLCapsTableDemo.java new file mode 100755 index 0000000..bc77c0b --- /dev/null +++ b/src/demos/misc/GLCapsTableDemo.java @@ -0,0 +1,341 @@ +package demos.misc; + + +import javax.swing.border.TitledBorder; +import javax.swing.table.TableColumn; + +import demos.gears.Gears; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import javax.media.nativewindow.Capabilities; +import javax.media.opengl.DefaultGLCapabilitiesChooser; +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLCapabilitiesChooser; +import javax.media.opengl.awt.GLCanvas; +import com.sun.opengl.util.FPSAnimator; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTable; + +/******************************************************************************* + * @file GLCapsTableDemo.java + * @desc Demonstrate use of GLCapabilitiesChooser and DefaultGLCapabilities. + * Demo tabulates the available capabilities array and put the data into a + * table. Pressing respawn button displays a canvas created with the + * currently selected index corresponding to the available array. There + * are two canvas to respawn: left or right.<br> + * TODO: if the number of samples > 0, setSampleBuffer(true) and run an + * antialiased renderer?;<br> + * TODO: if pbuffer is available, enable Float, RTT, RTTRec and create a + * pbuffer for eacH?<br> + * TODO: spawn using a diff renderer option(such as ones from demo + * package) <br> + * @version Jan 22, 2006 - GLCapsTableDemo.java created at 7:17:31 PM + * @platform ATI X600SE/XP Tablet SP2/JDK5/Eclipse + * @author Kiet Le + * @legal (c) 2006 Kiet Le. Released under BSD licence. + ******************************************************************************/ +public class GLCapsTableDemo + extends JFrame + implements + GLCapabilitiesChooser +{ + private String[] colNames = + {"Pfd", "H/W", "DblBfr", "Stereo", // index, hwaccel, double, stereo + "CBits", "cR", "cG", "cB", "cA", // color bits + "ABits", "aR", "aG", "aB", "aA", // accum bits + "Z", "S", "AA|AAS", "PBuf(Float|RTT|RTTRec)"}; // depth, stencil, n + // samples, pbuffer + private ArrayList/*<GLCapabilities>*/ available = new ArrayList/*<GLCapabilities>*/(); + private ArrayList/*<Integer>*/ indices = new ArrayList/*<Integer>*/(); + private Object[][] data; + private JTable capsTable; + private int desiredCapIndex; // pfd index + private int selected = desiredCapIndex; + protected JPanel pane, pane2; + private boolean updateLR;// leftright + private DefaultGLCapabilitiesChooser choiceExaminer = // + new DefaultGLCapabilitiesChooser() + { + public int chooseCapabilities(Capabilities _desired, + Capabilities[] _available, + int windowSystemRecommendedChoice) + { + GLCapabilities desired = (GLCapabilities) _desired; + GLCapabilities[] available = (GLCapabilities[]) _available; + if ( available != null ) + for (int i = 0; i < available.length; i++) { + GLCapabilities c = available[i]; + if (c != null) { + GLCapsTableDemo.this.available.add((GLCapabilities) c.clone()); + GLCapsTableDemo.this.indices.add(new Integer(i)); + } + } + desiredCapIndex = super.chooseCapabilities(desired, available, + windowSystemRecommendedChoice); + System.out.println("valid" + desiredCapIndex); + capsTable = GLCapsTableDemo.this + .tabulateTable(GLCapsTableDemo.this.available, GLCapsTableDemo.this.indices); + JScrollPane scroller = // + new JScrollPane(capsTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + GLCapsTableDemo.this.getContentPane().add(scroller); + pane.setBorder(BorderFactory + .createTitledBorder(null, "" + desiredCapIndex, TitledBorder.TRAILING, + TitledBorder.DEFAULT_POSITION)); + pane2.setBorder(BorderFactory + .createTitledBorder(null, "" + desiredCapIndex, TitledBorder.LEADING, + TitledBorder.DEFAULT_POSITION)); + GLCapsTableDemo.this.validate();// so table'll show up + System.out.println("valid"); + return desiredCapIndex; + } + }; + private GraphicsDevice device = GraphicsEnvironment + .getLocalGraphicsEnvironment().getDefaultScreenDevice(); + private JSplitPane canvasPane; + + private GLCanvas canvas; + private GLCanvas canvas2; + private Gears topRenderer = new Gears(), bottomRenderer = new Gears(); + private FPSAnimator animator; + private Dimension defdim = new Dimension(512, 256); + private String visTip = "If no gears are visible, it may be that the " + + "current desktop color resolution doesn't match " + + "the GLCapabilities chosen. Check CBits column."; + + /** + + */ + public GLCapsTableDemo() + { + super(GLCapsTableDemo.class.getName()); + initComponents(); + } + + /** + * (non-Javadoc) + * + * @see javax.media.opengl.GLCapabilitiesChooser#chooseCapabilities(javax.media.nativewindow.Capabilities, + * javax.media.nativewindow.Capabilities[], int) + */ + public int chooseCapabilities(Capabilities desired, + Capabilities[] available, + int windowSystemRecommendedChoice) + { + int row = capsTable.getSelectedRow(); + if ( 0> row || row >= indices.size() ) return windowSystemRecommendedChoice; + int desiredCapIndex = ((Integer) indices.get(row)).intValue(); + if ( updateLR ) + { + pane.setBorder(BorderFactory + .createTitledBorder(null, "" + desiredCapIndex, + TitledBorder.TRAILING, + TitledBorder.DEFAULT_POSITION)); + } + else + { + pane2.setBorder(BorderFactory + .createTitledBorder(null, "" + desiredCapIndex, TitledBorder.LEADING, + TitledBorder.DEFAULT_POSITION)); + } + return desiredCapIndex; + } + + public void run(final String[] args) + { + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + setSize(new Dimension((int) (d.width * 0.75), (int) (d.height * 0.75))); + setLocationRelativeTo(null); + setVisible(true); + validate(); + animator.start(); + }// + + /** + * @param args + */ + public static void main(String[] args) + { + GLCapsTableDemo demo = new GLCapsTableDemo(); + demo.run(args); + } + + private void initComponents() + { + pane = new JPanel(); + pane2 = new JPanel(); + + // Hack: use multisampled capabilities to pick up more detailed information on Windows + GLCapabilities multisampledCaps = new GLCapabilities(null); + multisampledCaps.setSampleBuffers(true); + canvas = new GLCanvas(multisampledCaps, choiceExaminer, null, device); + + // initially start w/ 2 canvas of default caps + // canvas = new GLCanvas(null, choiceExaminer, null, device); + canvas.addGLEventListener(topRenderer); + canvas.setSize(defdim); + // canvas.setPreferredSize(defdim); + // canvas.setMaximumSize(defdim); + animator = new FPSAnimator(canvas, 30); + canvas2 = new GLCanvas(null, null, null, device); + canvas2.addGLEventListener(bottomRenderer); + canvas2.setSize(defdim); + // canvas2.setPreferredSize(defdim); + // canvas2.setMaximumSize(defdim); + animator.add(canvas2); + pane.add(canvas); + pane2.add(canvas2); + canvasPane = new JSplitPane(); + canvasPane.setResizeWeight(0.5);// 50-50 division + canvasPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT); + canvasPane.setLeftComponent(pane); + canvasPane.setRightComponent(pane2); + getContentPane().add(canvasPane, BorderLayout.SOUTH); + getContentPane().add(buildControls(), BorderLayout.NORTH); + } + + private JTable tabulateTable(ArrayList/*<GLCapabilities>*/ capabilities, + ArrayList/*<Integer>*/ indices) + { + capabilities.trimToSize(); + data = new Object[capabilities.size()][colNames.length]; + String t = "T", f = "F"; + for (int pfd = 0; pfd < capabilities.size(); pfd++) + { + data[ pfd ][ 0 ] = indices.get(pfd); + GLCapabilities cap = (GLCapabilities) capabilities.get(pfd); + data[ pfd ][ 1 ] = "" + (cap.getHardwareAccelerated() ? f : f); + data[ pfd ][ 2 ] = "" + (cap.getDoubleBuffered() ? t : f); + data[ pfd ][ 3 ] = "" + (cap.getStereo() ? t : f); + int r = cap.getRedBits(), // + g = cap.getGreenBits(), // + b = cap.getBlueBits(), // + a = cap.getAlphaBits(); + data[ pfd ][ 4 ] = "" + (r + g + b + a); + data[ pfd ][ 5 ] = new Integer(r); + data[ pfd ][ 6 ] = new Integer(g); + data[ pfd ][ 7 ] = new Integer(b); + data[ pfd ][ 8 ] = new Integer(a); + r = cap.getAccumRedBits(); + g = cap.getAccumGreenBits(); + b = cap.getAccumBlueBits(); + a = cap.getAccumAlphaBits(); + data[ pfd ][ 9 ] = "" + (r + g + b + a); + data[ pfd ][ 10 ] = new Integer(r); + data[ pfd ][ 11 ] = new Integer(g); + data[ pfd ][ 12 ] = new Integer(b); + data[ pfd ][ 13 ] = new Integer(a); + // + data[ pfd ][ 14 ] = "" + cap.getDepthBits(); + data[ pfd ][ 15 ] = "" + cap.getStencilBits(); + data[ pfd ][ 16 ] = "" + (cap.getSampleBuffers() ? t : f) + " | " + + cap.getNumSamples(); + // concat p buffer nfo + String pbuf = (cap.getPbufferFloatingPointBuffers() ? "T |" : "F |"); + pbuf += (cap.getPbufferRenderToTexture() ? "T | " : "F | "); + pbuf += (cap.getPbufferRenderToTextureRectangle() ? t : f); + data[ pfd ][ 17 ] = pbuf; + } + JTable table = new JTable(data, colNames) { + public boolean isCellEditable(int rowIndex, int colIndex) { + return false; + } + }; + // table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); + TableColumn column = null; + for (int i = 0; i < colNames.length; i++) + { + column = table.getColumnModel().getColumn(i); + if ( i == (colNames.length - 1) ) + { + column.setPreferredWidth(100); // pbuffer column is bigger + } + else column.setPreferredWidth(7); + } + table.setDoubleBuffered(true); + return table; + } + + private JPanel buildControls() + { + JPanel controls = new JPanel(); + final JButton spawn = new JButton("Respawn Left"); + final JButton spawn2 = new JButton("Respawn Right"); + ActionListener recap = new ActionListener() + { + public void actionPerformed(final ActionEvent act) + { + animator.stop(); + if ( act.getSource() == spawn ) + { + updateLR = true;// left + animator.remove(canvas); + pane.remove(canvas); + canvas = newCanvas(true, true);// get new canvas w/ selected index + pane.add(canvas); + animator.add(canvas); + } + else + { + updateLR = false; + animator.remove(canvas2); + pane2.remove(canvas2); + canvas2 = newCanvas(true, false); + pane2.add(canvas2); + animator.add(canvas2); + } + new Thread() + { + public void run() + { + animator.start(); + } + }.start(); + GLCapsTableDemo.this.validate(); + } + }; + spawn.setToolTipText(visTip); + spawn.addActionListener(recap); + spawn2.addActionListener(recap); + // + controls.add(spawn); + controls.add(spawn2); + return controls; + } + + private GLCanvas newCanvas(boolean mycap, boolean top) + { + GLCanvas surface = null; + if ( !mycap ) surface = new GLCanvas(null, choiceExaminer, null, device); + else surface = new GLCanvas(null, this, null, device); + if ( top ) surface.addGLEventListener(topRenderer); + else surface.addGLEventListener(bottomRenderer); + surface.setSize(defdim);// otherwise, no show; mixin' light-heavy containers + // surface.setMinimumSize(defdim); + return surface; + } + + private void exitRunner() + { + new Thread() + { + public void run() + { + animator.stop(); + } + }; + } +}// diff --git a/src/demos/misc/Picking.java b/src/demos/misc/Picking.java new file mode 100755 index 0000000..fde486c --- /dev/null +++ b/src/demos/misc/Picking.java @@ -0,0 +1,275 @@ +package demos.misc; + +//================================================================================= +// Picking 0.2 (Thomas Bladh) +//================================================================================= +// A simple picking example using java/jogl. This is far from a complete solution +// but it should give you an idea of how to include picking in your assigment +// solutions. +// +// Notes: * Based on example 13-3 (p 542) in the "OpenGL Programming Guide" +// * This version should handle overlapping objects correctly. +//--------------------------------------------------------------------------------- +import java.awt.*; +import java.awt.event.*; +import java.awt.Canvas.*; +import java.nio.*; +import javax.media.opengl.*; +import javax.media.opengl.awt.GLCanvas; +import javax.media.opengl.glu.*; +import com.sun.opengl.util.Animator; +import com.sun.opengl.util.BufferUtil; + +public class Picking +{ + public static void main(String[] args) + { + new Picking(); + } + + Picking() + { + Frame frame = new Frame("Picking Example"); + GLCapabilities capabilities = new GLCapabilities(null); + GLDrawableFactory factory = GLDrawableFactory.getFactory(capabilities.getGLProfile()); + GLCanvas drawable = new GLCanvas(capabilities); + final Renderer renderer = new Renderer(); + drawable.addGLEventListener(renderer); + drawable.addMouseListener(renderer); + drawable.addMouseMotionListener(renderer); + frame.add(drawable); + frame.setSize(400, 400); + final Animator animator = new Animator(drawable); + frame.addWindowListener(new WindowAdapter() + { + public void windowClosing(WindowEvent e) + { + animator.stop(); + System.exit(0); + } + }); + frame.setVisible(true); + animator.start(); + } + + static class Renderer implements GLEventListener, MouseListener, MouseMotionListener + { + static final int NOTHING = 0, UPDATE = 1, SELECT = 2; + int cmd = UPDATE; + int mouse_x, mouse_y; + + private GLU glu = new GLU(); + private GLAutoDrawable gldrawable; + + public void init(GLAutoDrawable drawable) + { + GL2 gl = drawable.getGL().getGL2(); + this.gldrawable = drawable; + gl.glEnable(GL2.GL_CULL_FACE); + gl.glEnable(GL2.GL_DEPTH_TEST); + gl.glEnable(GL2.GL_NORMALIZE); + gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + } + + public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) + { + GL2 gl = drawable.getGL().getGL2(); + float h = (float) height / (float) width; + gl.glViewport(0, 0, width, height); + gl.glMatrixMode(GL2.GL_PROJECTION); + gl.glLoadIdentity(); + glu.gluOrtho2D(0.0f,1.0f,0.0f,1.0f); + } + + public void dispose(GLAutoDrawable drawable) { + } + + public void display(GLAutoDrawable drawable) + { + GL2 gl = drawable.getGL().getGL2(); + switch(cmd) + { + case UPDATE: + drawScene(gl); + break; + case SELECT: + int buffsize = 512; + double x = (double) mouse_x, y = (double) mouse_y; + int[] viewPort = new int[4]; + IntBuffer selectBuffer = BufferUtil.newIntBuffer(buffsize); + int hits = 0; + gl.glGetIntegerv(GL2.GL_VIEWPORT, viewPort, 0); + gl.glSelectBuffer(buffsize, selectBuffer); + gl.glRenderMode(GL2.GL_SELECT); + gl.glInitNames(); + gl.glMatrixMode(GL2.GL_PROJECTION); + gl.glPushMatrix(); + gl.glLoadIdentity(); + glu.gluPickMatrix(x, (double) viewPort[3] - y, 5.0d, 5.0d, viewPort, 0); + glu.gluOrtho2D(0.0d, 1.0d, 0.0d, 1.0d); + drawScene(gl); + gl.glMatrixMode(GL2.GL_PROJECTION); + gl.glPopMatrix(); + gl.glFlush(); + hits = gl.glRenderMode(GL2.GL_RENDER); + processHits(hits, selectBuffer); + cmd = UPDATE; + break; + } + } + + public void processHits(int hits, IntBuffer buffer) + { + System.out.println("---------------------------------"); + System.out.println(" HITS: " + hits); + int offset = 0; + int names; + float z1, z2; + for (int i=0;i<hits;i++) + { + System.out.println("- - - - - - - - - - - -"); + System.out.println(" hit: " + (i + 1)); + names = buffer.get(offset); offset++; + z1 = (float) buffer.get(offset) / 0x7fffffff; offset++; + z2 = (float) buffer.get(offset) / 0x7fffffff; offset++; + System.out.println(" number of names: " + names); + System.out.println(" z1: " + z1); + System.out.println(" z2: " + z2); + System.out.println(" names: "); + + for (int j=0;j<names;j++) + { + System.out.print(" " + buffer.get(offset)); + if (j==(names-1)) + System.out.println("<-"); + else + System.out.println(); + offset++; + } + System.out.println("- - - - - - - - - - - -"); + } + System.out.println("---------------------------------"); + } + + public int viewPortWidth(GL2 gl) + { + int[] viewPort = new int[4]; + gl.glGetIntegerv(GL2.GL_VIEWPORT, viewPort, 0); + return viewPort[2]; + } + + public int viewPortHeight(GL2 gl) + { + int[] viewPort = new int[4]; + gl.glGetIntegerv(GL2.GL_VIEWPORT, viewPort, 0); + return viewPort[3]; + } + + public void drawScene(GL2 gl) + { + gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); + + // Colors + float red[] = {1.0f,0.0f,0.0f,1.0f}; + float green[] = {0.0f,1.0f,0.0f,1.0f}; + float blue[] = {0.0f,0.0f,1.0f,1.0f}; + + // Red rectangle + GLRectangleEntity r1 = new GLRectangleEntity(gl, glu); + r1.x = 0.15f; + r1.y = 0.25f; + r1.z = 0.75f; + r1.w = 0.4f; + r1.h = 0.4f; + r1.c = red; + r1.id = 10; + r1.draw(); + + // Green rectangle + GLRectangleEntity r2 = new GLRectangleEntity(gl, glu); + r2.x = 0.35f; + r2.y = 0.45f; + r2.z = 0.5f; + r2.w = 0.4f; + r2.h = 0.4f; + r2.c = green; + r2.id = 20; + r2.draw(); + + // Blue rectangle + GLRectangleEntity r3 = new GLRectangleEntity(gl, glu); + r3.x = 0.45f; + r3.y = 0.15f; + r3.z = 0.25f; + r3.w = 0.4f; + r3.h = 0.4f; + r3.c = blue; + r3.id = 30; + r3.draw(); + + gl.glFlush(); + } + + public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {} + + public void mousePressed(MouseEvent e) + { + cmd = SELECT; + mouse_x = e.getX(); + mouse_y = e.getY(); + } + + public void mouseEntered(MouseEvent e) {} + public void mouseExited(MouseEvent e) {} + public void mouseReleased(MouseEvent e) {} + public void mouseClicked(MouseEvent e) {} + public void mouseDragged(MouseEvent e) {} + public void mouseMoved(MouseEvent e) {} + + public abstract class GLEntity + { + float x, y, z; + float[] c; + int id = 0; + boolean outline = false; + GL2 gl; + GLU glu; + public GLEntity(GL2 gl, GLU glu) + { + this.gl = gl; + this.glu = glu; + } + public void draw() + { + gl.glPushName(id); + _draw(); + } + public abstract void _draw(); + } + + public class GLRectangleEntity extends GLEntity + { + float w = 0.1f; + float h = 0.1f; + public GLRectangleEntity(GL2 gl, GLU glu) + { + super(gl, glu); + } + public void _draw() + { + if (outline) + gl.glPolygonMode(GL2.GL_FRONT, GL2.GL_LINE); + else + gl.glPolygonMode(GL2.GL_FRONT, GL2.GL_FILL); + + gl.glColor4fv(c, 0); + gl.glBegin(GL2.GL_POLYGON); + gl.glVertex3f(x, y, z); + gl.glVertex3f(x + w, y, z); + gl.glVertex3f(x + w, y + h, z); + gl.glVertex3f(x, y + h, z); + gl.glEnd(); + } + } + } +} diff --git a/src/demos/misc/TiledRendering.java b/src/demos/misc/TiledRendering.java new file mode 100755 index 0000000..a5034fa --- /dev/null +++ b/src/demos/misc/TiledRendering.java @@ -0,0 +1,159 @@ +package demos.misc; + +import com.sun.opengl.util.FileUtil; +import com.sun.opengl.util.TGAWriter; +import com.sun.opengl.util.awt.ImageUtil; +import com.sun.opengl.util.gl2.TileRenderer; +import demos.gears.Gears; +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import java.io.File; +import java.io.IOException; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import javax.imageio.ImageIO; +import javax.media.opengl.GL; +import javax.media.opengl.GL2ES1; +import javax.media.opengl.GL2; +import javax.media.opengl.GLCapabilities; +import javax.media.opengl.GLContext; +import javax.media.opengl.GLDrawableFactory; +import javax.media.opengl.GLPbuffer; + +/** Demonstrates the TileRenderer class by rendering a large version + of the Gears demo to the specified file. */ + +public class TiledRendering { + + public static void main(String[] args) throws IOException { + + if (args.length != 1) { + System.out.println("Usage: java TiledRendering [output file name]"); + System.out.println("Writes output (a large version of the Gears demo) to"); + System.out.println("the specified file, using either ImageIO or the fast TGA writer"); + System.out.println("depending on the file extension."); + System.exit(1); + } + + String filename = args[0]; + File file = new File(filename); + + GLCapabilities caps = new GLCapabilities(null); + caps.setDoubleBuffered(false); + + if (!GLDrawableFactory.getFactory(caps.getGLProfile()).canCreateGLPbuffer()) { + System.out.println("Demo requires pbuffer support"); + System.exit(1); + } + + // Use a pbuffer for rendering + GLPbuffer pbuffer = GLDrawableFactory.getFactory(caps.getGLProfile()).createGLPbuffer(caps, null, + 256, 256, + null); + + // Fix the image size for now + int tileWidth = 256; + int tileHeight = 256; + int imageWidth = tileWidth * 16; + int imageHeight = tileHeight * 12; + + // Figure out the file format + TGAWriter tga = null; + BufferedImage img = null; + Buffer buf = null; + + if (filename.endsWith(".tga")) { + tga = new TGAWriter(); + tga.open(file, + imageWidth, + imageHeight, + false); + buf = tga.getImageData(); + } else { + img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_3BYTE_BGR); + buf = ByteBuffer.wrap(((DataBufferByte) img.getRaster().getDataBuffer()).getData()); + } + + // Initialize the tile rendering library + TileRenderer renderer = new TileRenderer(); + renderer.setTileSize(tileWidth, tileHeight, 0); + renderer.setImageSize(imageWidth, imageHeight); + renderer.setImageBuffer(GL2.GL_BGR, GL.GL_UNSIGNED_BYTE, buf); + renderer.trPerspective(20.0f, (float) imageWidth / (float) imageHeight, 5.0f, 60.0f); + + GLContext context = pbuffer.getContext(); + if (context.makeCurrent() == GLContext.CONTEXT_NOT_CURRENT) { + System.out.println("Error making pbuffer's context current"); + System.exit(1); + } + + GL2 gl = pbuffer.getGL().getGL2(); + gl.glMatrixMode(GL2ES1.GL_MODELVIEW); + gl.glLoadIdentity(); + gl.glTranslatef(0.0f, 0.0f, -40.0f); + // Tile renderer will set up projection matrix + + do { + renderer.beginTile(gl); + drawGears(gl); + } while (renderer.endTile(gl)); + + context.release(); + + // Close things up and/or write image using ImageIO + if (tga != null) { + tga.close(); + } else { + ImageUtil.flipImageVertically(img); + if (!ImageIO.write(img, FileUtil.getFileSuffix(file), file)) { + System.err.println("Error writing file using ImageIO (unsupported file format?)"); + } + } + } + + private static void drawGears(GL2 gl) { + float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f; + float angle = 0.0f; + float pos[] = { 5.0f, 5.0f, 10.0f, 0.0f }; + float red[] = { 0.8f, 0.1f, 0.0f, 1.0f }; + float green[] = { 0.0f, 0.8f, 0.2f, 1.0f }; + float blue[] = { 0.2f, 0.2f, 1.0f, 1.0f }; + + gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); + + gl.glLightfv(GL2ES1.GL_LIGHT0, GL2ES1.GL_POSITION, pos, 0); + gl.glEnable(GL.GL_CULL_FACE); + gl.glEnable(GL2ES1.GL_LIGHTING); + gl.glEnable(GL2ES1.GL_LIGHT0); + gl.glEnable(GL.GL_DEPTH_TEST); + gl.glEnable(GL2ES1.GL_NORMALIZE); + + gl.glPushMatrix(); + gl.glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); + gl.glRotatef(view_roty, 0.0f, 1.0f, 0.0f); + gl.glRotatef(view_rotz, 0.0f, 0.0f, 1.0f); + + gl.glPushMatrix(); + gl.glTranslatef(-3.0f, -2.0f, 0.0f); + gl.glRotatef(angle, 0.0f, 0.0f, 1.0f); + gl.glMaterialfv(GL.GL_FRONT, GL2ES1.GL_AMBIENT_AND_DIFFUSE, red, 0); + Gears.gear(gl, 1.0f, 4.0f, 1.0f, 20, 0.7f); + gl.glPopMatrix(); + + gl.glPushMatrix(); + gl.glTranslatef(3.1f, -2.0f, 0.0f); + gl.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f); + gl.glMaterialfv(GL.GL_FRONT, GL2ES1.GL_AMBIENT_AND_DIFFUSE, green, 0); + Gears.gear(gl, 0.5f, 2.0f, 2.0f, 10, 0.7f); + gl.glPopMatrix(); + + gl.glPushMatrix(); + gl.glTranslatef(-3.1f, 4.2f, 0.0f); + gl.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f); + gl.glMaterialfv(GL.GL_FRONT, GL2ES1.GL_AMBIENT_AND_DIFFUSE, blue, 0); + Gears.gear(gl, 1.3f, 2.0f, 0.5f, 10, 0.7f); + gl.glPopMatrix(); + + gl.glPopMatrix(); + } +} diff --git a/src/demos/misc/VersionInfo.java b/src/demos/misc/VersionInfo.java new file mode 100644 index 0000000..589d899 --- /dev/null +++ b/src/demos/misc/VersionInfo.java @@ -0,0 +1,58 @@ + +package demos.misc; + +/** + * VersionInfo.java <BR> + * author: Travis Bryson <P> + * + * This program returns the version and implementation information for the Java + * Bindings for OpenGL (R) implementation found in the CLASSPATH. This information + * is also found in the manifest for jogl.jar, and this program uses the + * java.lang.Package class to retrieve it programatically. +**/ + +public class VersionInfo { + public VersionInfo() { + ClassLoader classLoader = getClass().getClassLoader(); + pkgInfo(classLoader, "javax.media.opengl", "GL"); + } + + static void pkgInfo(ClassLoader classLoader, + String pkgName, + String className) { + + try { + classLoader.loadClass(pkgName + "." + className); + + Package p = Package.getPackage(pkgName); + if (p == null) { + System.out.println("WARNING: Package.getPackage(" + + pkgName + + ") is null"); + } + else { + System.out.println(p); + System.out.println("Specification Title = " + + p.getSpecificationTitle()); + System.out.println("Specification Vendor = " + + p.getSpecificationVendor()); + System.out.println("Specification Version = " + + p.getSpecificationVersion()); + + System.out.println("Implementation Vendor = " + + p.getImplementationVendor()); + System.out.println("Implementation Version = " + + p.getImplementationVersion()); + } + } + catch (ClassNotFoundException e) { + System.out.println("Unable to load " + pkgName); + } + + System.out.println(); + } + + public static void main(String[] args) { + new VersionInfo(); + } +} |