/* * Portions Copyright (C) 2005 Sun Microsystems, Inc. * All rights reserved. */ /* * * COPYRIGHT NVIDIA CORPORATION 2003. ALL RIGHTS RESERVED. * BY ACCESSING OR USING THIS SOFTWARE, YOU AGREE TO: * * 1) ACKNOWLEDGE NVIDIA'S EXCLUSIVE OWNERSHIP OF ALL RIGHTS * IN AND TO THE SOFTWARE; * * 2) NOT MAKE OR DISTRIBUTE COPIES OF THE SOFTWARE WITHOUT * INCLUDING THIS NOTICE AND AGREEMENT; * * 3) ACKNOWLEDGE THAT TO THE MAXIMUM EXTENT PERMITTED BY * APPLICABLE LAW, THIS SOFTWARE IS PROVIDED *AS IS* AND * THAT NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, * EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY * SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES * WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS * OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS * INFORMATION, OR ANY OTHER PECUNIARY LOSS), INCLUDING ATTORNEYS' * FEES, RELATING TO THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * */ package demos.jrefract; import com.jogamp.opengl.util.AnimatorBase; import demos.common.Demo; import demos.common.DemoListener; import demos.hwShadowmapsSimple.HWShadowmapsSimple; import demos.infiniteShadowVolumes.InfiniteShadowVolumes; import demos.j2d.FlyingText; import demos.jgears.JGears; import demos.proceduralTexturePhysics.ProceduralTexturePhysics; import demos.vertexBufferObject.VertexBufferObject; import demos.vertexProgRefract.VertexProgRefract; import demos.vertexProgWarp.VertexProgWarp; import demos.xtrans.XTDesktopPane; import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLProfile; import javax.media.opengl.awt.GLJPanel; import com.jogamp.opengl.util.FPSAnimator; import javax.swing.JCheckBox; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; /** Wavelength-dependent refraction demo
It's a chromatic aberration!
sgreen@nvidia.com 4/2001

Currently 3 passes - could do it in 1 with 4 texture units

Cubemap courtesy of Paul Debevec

Ported to Java, Swing and ARB_fragment_program by Kenneth Russell */ public class JRefract { private boolean useRegisterCombiners; private AnimatorBase animator; private JDesktopPane desktop; public static void main(String[] args) { // set argument 'NotFirstUIActionOnProcess' in the JNLP's application-desc tag for example // // NotFirstUIActionOnProcess // boolean firstUIActionOnProcess = 0==args.length || !args[0].equals("NotFirstUIActionOnProcess") ; GLProfile.initSingleton(firstUIActionOnProcess); new JRefract().run(args); } private static final int GEARS = 1; // private static final int HDR = 2; private static final int HWSHADOWS = 3; private static final int INFINITE = 4; private static final int REFRACT = 5; private static final int TEXT = 6; private static final int VBO = 7; private static final int WARP = 8; private static final int WATER = 9; private JInternalFrame addWindow(int which) { // FIXME: workaround for problem in 1.6 where ALL Components, // including Swing components, are Finalizable, requiring two full // GC cycles (and running of finalizers) to reclaim System.gc(); // Try to get finalizers run try { Thread.sleep(1); } catch (InterruptedException e) { } System.gc(); String str = ""; switch (which) { case GEARS: str = "Gears Demo"; break; // case HDR: str = "High Dynamic Range Rendering Demo"; break; case HWSHADOWS: str = "ARB_shadow Shadows"; break; case INFINITE: str = "Infinite Shadow Volumes"; break; case REFRACT: str = "Refraction Using Vertex Programs"; break; case TEXT: str = "Flying Text"; break; case VBO: str = "Very Simple vertex_buffer_object demo"; break; case WATER: str = "Procedural Texture Waves"; break; } final JInternalFrame inner = new JInternalFrame(str); inner.setResizable(true); inner.setClosable(true); inner.setVisible(true); GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL2)); if (which == INFINITE) { caps.setStencilBits(16); } final GLJPanel canvas = (which == GEARS) ? new JGears() : new GLJPanel(caps); final DemoListener demoListener = new DemoListener() { public void shutdownDemo() { removeJPanel(canvas); SwingUtilities.invokeLater(new Runnable() { public void run() { inner.doDefaultCloseAction(); } }); } public void repaint() { canvas.repaint(); } }; Demo demo = null; switch (which) { case GEARS: { // GLEventListener already added break; } /* case HDR: { demo = new HDR(); ((HDR) demo).setup(null); inner.setSize(((HDR) demo).getPreferredWidth(), ((HDR) demo).getPreferredHeight()); break; } */ case HWSHADOWS: { demo = new HWShadowmapsSimple(); break; } case INFINITE: { demo = new InfiniteShadowVolumes(); break; } case REFRACT: { demo = new VertexProgRefract(); break; } case TEXT: { demo = new FlyingText(); break; } case VBO: { demo = new VertexBufferObject(); break; } case WARP: { demo = new VertexProgWarp(); ((VertexProgWarp) demo).setTitleSetter(new VertexProgWarp.TitleSetter() { public void setTitle(final String title) { SwingUtilities.invokeLater(new Runnable() { public void run() { inner.setTitle(title); } }); } }); break; } case WATER: { demo = new ProceduralTexturePhysics(); break; } } if (which != GEARS) { demo.setDemoListener(demoListener); canvas.addGLEventListener(demo); } canvas.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { canvas.requestFocus(); } }); addJPanel(canvas); final Demo fDemo = demo; inner.addInternalFrameListener(new InternalFrameAdapter() { public void internalFrameClosed(InternalFrameEvent e) { if (fDemo != null) { fDemo.shutdownDemo(); } } }); inner.getContentPane().setLayout(new BorderLayout()); /* if (which == REFRACT) { // Testing scrolling canvas.setSize(512, 512); canvas.setPreferredSize(new Dimension(512, 512)); JScrollPane scroller = new JScrollPane(canvas); inner.getContentPane().add(scroller); } else */ if (which == GEARS) { // Provide control over transparency of gears background canvas.setOpaque(false); JPanel gradientPanel = JGears.createGradientPanel(); inner.getContentPane().add(gradientPanel, BorderLayout.CENTER); gradientPanel.add(canvas, BorderLayout.CENTER); final JCheckBox checkBox = new JCheckBox("Transparent", true); checkBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { canvas.setOpaque(!checkBox.isSelected()); } }); inner.getContentPane().add(checkBox, BorderLayout.SOUTH); } else if (which == TEXT) { FlyingText text = (FlyingText) demo; inner.getContentPane().add(text.buildGUI(), BorderLayout.NORTH); inner.getContentPane().add(canvas, BorderLayout.CENTER); } else { inner.getContentPane().add(canvas, BorderLayout.CENTER); } // if (which != HDR) { inner.setSize(512, 512); // } desktop.add(inner); return inner; } public void run(String[] args) { JFrame frame = new JFrame("JOGL and Swing Interoperability"); if ((args.length > 0) && args[0].equals("-xt")) { desktop = new XTDesktopPane(); // FIXME: this is a hack to get the repaint behavior to work correctly ((XTDesktopPane) desktop).setAlwaysRedraw(true); } else { desktop = new JDesktopPane(); } desktop.setSize(1024, 768); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(desktop, BorderLayout.CENTER); JInternalFrame inner2 = new JInternalFrame("Hello, World"); JLabel label = new JLabel("Hello, World!"); label.setFont(new Font("SansSerif", Font.PLAIN, 128)); inner2.getContentPane().add(label); inner2.pack(); inner2.setResizable(true); desktop.add(inner2); inner2.setVisible(true); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("Actions"); JMenuItem item; item = new JMenuItem("Gears"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addWindow(GEARS); } }); menu.add(item); // item = new JMenuItem("High Dynamic Range"); // item.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { // addWindow(HDR); // } // }); // menu.add(item); item = new JMenuItem("Hardware Shadow Maps"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addWindow(HWSHADOWS); } }); menu.add(item); item = new JMenuItem("Infinite Shadow Volumes"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addWindow(INFINITE); } }); menu.add(item); item = new JMenuItem("Refraction"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addWindow(REFRACT); } }); menu.add(item); item = new JMenuItem("Text"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addWindow(TEXT); } }); menu.add(item); item = new JMenuItem("Vertex Buffer Object"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addWindow(VBO); } }); menu.add(item); item = new JMenuItem("Warp"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addWindow(WARP); } }); menu.add(item); item = new JMenuItem("Water"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addWindow(WATER); } }); menu.add(item); item = new JMenuItem("Loop Gears Demo"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startAutoMode(); } }); menu.add(item); item = new JMenuItem("Quit"); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { runExit(); } }); item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK)); menu.add(item); menuBar.add(menu); frame.setJMenuBar(menuBar); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { runExit(); } }); frame.setSize(desktop.getSize()); frame.setVisible(true); animator = new FPSAnimator(60); animator.start(); } private void runExit() { // Note: calling System.exit() synchronously inside the draw, // reshape or init callbacks can lead to deadlocks on certain // platforms (in particular, X11) because the JAWT's locking // routines cause a global AWT lock to be grabbed. Instead run // the exit routine in another thread. new Thread(new Runnable() { public void run() { animator.stop(); System.exit(0); } }).start(); } private synchronized void addJPanel(GLJPanel panel) { animator.add(panel); } private synchronized void removeJPanel(GLJPanel panel) { animator.remove(panel); } private JInternalFrame curFrame; private void startAutoMode() { new Thread(new Runnable() { public void run() { while (true) { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { curFrame = addWindow(GEARS); } }); } catch (Exception e) { e.printStackTrace(); } try { Thread.sleep(2000); } catch (InterruptedException e) { } try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { curFrame.doDefaultCloseAction(); } }); } catch (Exception e) { e.printStackTrace(); } try { Thread.sleep(2000); } catch (InterruptedException e) { } } } }).start(); } }