/*
* OpenGLCapabilitiesAction.java
*
* Created on 20. Juni 2007, 18:51
*/
package net.java.nboglpack.glcapabilities;
import com.mbien.engine.util.GLRunnable;
import com.mbien.engine.util.GLWorker;
import java.awt.EventQueue;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.beans.Beans;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLContext;
import javax.media.opengl.GLException;
import javax.swing.JDialog;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.actions.CallableSystemAction;
import org.openide.windows.WindowManager;
/**
* Action for starting the GL capabilities viewer.
* @author Michael Bien
*/
public final class OpenGLCapabilitiesAction extends CallableSystemAction {
private GLCapabilitiesPanel capsPanel;
public void performAction() {
// TODO workaround; remove AFAIK
Beans.setDesignTime(false);
JDialog dialog = new JDialog( WindowManager.getDefault().getMainWindow(),
"OpenGL Capabilities", false);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setResizable(false);
dialog.addWindowListener(createWindowObserver());
capsPanel = new GLCapabilitiesPanel();
dialog.setContentPane(capsPanel);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
EventQueue.invokeLater(createGLCapabilitiesQuery());
}
private Runnable createGLCapabilitiesQuery() {
final GLRunnable query = new GLRunnable() {
public void run(GLContext context) {
GL gl = context.getGL();
GLCapabilitiesModel model = capsPanel.getModel();
// overview
model.setGLVersion(gl.glGetString(GL.GL_VERSION));
model.setGLVendor(gl.glGetString(GL.GL_VENDOR));
model.setRenderer(gl.glGetString(GL.GL_RENDERER));
model.setGLSLVersion(gl.glGetString(GL2.GL_SHADING_LANGUAGE_VERSION));
model.setGLImplVersion(Package.getPackage("javax.media.opengl").getImplementationVersion());// NOI18N
// TODO we need a better way to get good buffer size
int[] buffer = new int[2];
gl.glGetIntegerv(GL.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, buffer, 0);
model.setMaxAnisotropy(buffer[0]+"x");
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv(GL.GL_MAX_VIEWPORT_DIMS, buffer, 0);
model.setMaxViewportSize(buffer[0]+"x"+buffer[1]);
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv(GL2.GL_MAX_TEXTURE_UNITS, buffer, 0);
model.setMaxTextureUnits(""+buffer[0]);
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv(GL2.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, buffer, 0);
model.setMaxVertexTextureImageUnits(""+buffer[0]);
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv(GL2.GL_MAX_TEXTURE_IMAGE_UNITS, buffer, 0);
model.setMaxTextureImageUnits(""+buffer[0]);
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv(GL2.GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, buffer, 0);
model.setMaxGeometryTextureImageUnits(""+buffer[0]);
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv(GL.GL_MAX_TEXTURE_SIZE, buffer, 0);
model.setMaxTextureSize(""+buffer[0]);
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv(GL2.GL_MAX_LIGHTS, buffer, 0);
model.setMaxLights(""+buffer[0]);
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv(GL2.GL_MAX_DRAW_BUFFERS, buffer, 0);
model.setMaxDrawBuffers(""+buffer[0]);
// extensions
ArrayList<String> extensions = model.getExtensions();
extensions.clear();
StringTokenizer tokenizer = new StringTokenizer(gl.glGetString(GL.GL_EXTENSIONS));
while(tokenizer.hasMoreTokens())
extensions.add(tokenizer.nextToken());
// capabilities
Field[] fields = gl.getClass().getFields();
List<GLCapabilitiesModel.Capability> capabilities = model.getCapabilities();
capabilities.clear();
for (Field field : fields) {
try {
StringBuilder sb = new StringBuilder();
if(field.getName().startsWith("GL_MAX_")) {// NOI18N
buffer[0] = 0; buffer[1] = 0;
gl.glGetIntegerv((Integer)field.getInt(gl), buffer, 0);
for(int i = 0; i < buffer.length; i++) {
sb.append(buffer[i]);
if(i != buffer.length-1)
sb.append(", ");// NOI18N
}
while(sb.toString().endsWith(", 0"))// NOI18N
sb.delete(sb.length()-3, sb.length());
capabilities.add(new GLCapabilitiesModel.Capability(field.getName(), sb.toString()));
sb.delete(0, sb.length());
}
} catch (IllegalArgumentException ex) {
Exceptions.printStackTrace(ex);
} catch (IllegalAccessException ex) {
Exceptions.printStackTrace(ex);
}
}
EventQueue.invokeLater(new Runnable() {
public void run() {
capsPanel.updateFromModel();
}
});
}
};
return new Runnable(){
public void run() {
new Thread() {
@Override
public void run() {
try{
GLWorker worker = Lookup.getDefault().lookup(GLWorker.class);
worker.work(query);
}catch(GLException ex) {
Exceptions.printStackTrace(ex);
}
}
}.start();
}
};
}
private WindowListener createWindowObserver() {
WindowListener windowListener = new WindowAdapter() {
@Override
public void windowDeactivated(WindowEvent windowEvent) {
close(windowEvent.getWindow());
}
@Override
public void windowClosing(WindowEvent windowEvent) {
close(windowEvent.getWindow());
}
private void close(Window window) {
window.setVisible(false);
window.removeWindowListener(this);
window.dispose();
// TODO workaround; remove AFAIK
Beans.setDesignTime(true);
}
};
return windowListener;
}
public String getName() {
return NbBundle.getMessage(OpenGLCapabilitiesAction.class, "CTL_OpenGLCapabilitiesAction");
}
@Override
protected void initialize() {
super.initialize();
// see org.openide.util.actions.SystemAction.iconResource() javadoc for more details
putValue("noIconInMenu", Boolean.TRUE);
}
public HelpCtx getHelpCtx() {
return HelpCtx.DEFAULT_HELP;
}
@Override
protected boolean asynchronous() {
return false;
}
}