/*
* 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();
}
}