/*
* Created on 28. March 2007, 10:46
*
*/
package com.mbien.engine.util;
import java.util.ArrayDeque;
import java.util.Deque;
import javax.media.opengl.DefaultGLCapabilitiesChooser;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLCapabilitiesChooser;
import javax.media.opengl.GLContext;
import javax.media.opengl.GLDrawableFactory;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLException;
import javax.media.opengl.GLProfile;
/**
* Implementation of an OpenGL worker.
* @author Michael Bien
*/
public class GLWorkerImpl implements GLWorker {
private final Deque<GLRunnable> work;
private final GLAutoDrawable drawable;
public static GLWorker DEFAULT;
/** Creates a new instance of GLWorker */
public GLWorkerImpl(GLProfile profile) throws GLException {
GLDrawableFactory factory = GLDrawableFactory.getFactory(profile);
GLCapabilitiesChooser chooser = new DefaultGLCapabilitiesChooser();
drawable = factory.createGLPbuffer(new GLCapabilities(profile), chooser, 1, 1, null);
work = new ArrayDeque<GLRunnable>();
init();
}
public GLWorkerImpl(GLAutoDrawable autoDrawable) {
if(autoDrawable == null) {
throw new NullPointerException();
}
drawable = autoDrawable;
work = new ArrayDeque<GLRunnable>();
init();
}
private final void init() {
drawable.addGLEventListener(new Worker());
if(DEFAULT == null)
DEFAULT = this;
}
public static GLWorker getDefault() {
if(DEFAULT == null)
DEFAULT = new GLWorkerImpl(GLProfile.getDefault());
return DEFAULT;
}
public synchronized void work() {
if(work.size() > 0)
drawable.display();
}
public synchronized void work(GLRunnable runnable) {
addWork(runnable);
work();
}
public synchronized void destroy() {
drawable.destroy();
}
public synchronized void addWork(GLRunnable runnable) {
work.add(runnable);
}
private final class Worker implements GLEventListener {
public void init(GLAutoDrawable drawable) {
drawable.getGL().glClearColor(0, 0, 0, 0);
}
public void display(GLAutoDrawable drawable) {
GLContext context = drawable.getContext();
try{
while(work.size() > 0) {
work.pollFirst().run(context);
Thread.yield();
}
}finally{
drawable.getGL().glClear(GL.GL_COLOR_BUFFER_BIT);
// drawable.getGL().glFinish();
}
}
public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
}
public void dispose(GLAutoDrawable arg0) {
}
}
}