summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java82
-rw-r--r--src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java91
-rw-r--r--src/gleem/CameraParameters.java17
3 files changed, 92 insertions, 98 deletions
diff --git a/src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java b/src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java
index 74ecbdd..e600dbd 100644
--- a/src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java
+++ b/src/demos/hwShadowmapsSimple/HWShadowmapsSimple.java
@@ -62,6 +62,7 @@ public class HWShadowmapsSimple {
private GLCanvas canvas;
private GLPbuffer pbuffer;
+ private Animator animator;
private GLUT glut;
@@ -145,6 +146,8 @@ public class HWShadowmapsSimple {
canvas.addGLEventListener(new Listener());
canvas.setNoAutoRedrawMode(true);
+ animator = new Animator(canvas);
+
Frame frame = new Frame("ARB_shadow Shadows");
frame.setLayout(new BorderLayout());
canvas.setSize(512, 512);
@@ -155,40 +158,11 @@ public class HWShadowmapsSimple {
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
- quit = true;
+ runExit();
}
});
- try {
- while (!quit) {
- if (viewer != null) {
- viewer.update();
-
- // Grab these values once per render to avoid multithreading
- // issues with their values being changed by manipulation from
- // the AWT thread during the render
- CameraParameters params = viewer.getCameraParameters();
-
- cameraPerspective.set(params.getProjectionMatrix());
- cameraInverseTransform.set(params.getModelviewMatrix());
- cameraTransform.set(cameraInverseTransform);
- cameraTransform.invertRigid();
- spotlightTransform.set(spotlight.getTransform());
- spotlightInverseTransform.set(spotlightTransform);
- spotlightInverseTransform.invertRigid();
- objectTransform.set(object.getTransform());
- }
-
- if (displayMode == RENDER_SCENE_FROM_CAMERA_VIEW_SHADOWED || !fullyInitialized) {
- if (pbuffer != null) {
- pbuffer.display();
- }
- }
- canvas.display();
- }
- } finally {
- System.exit(0);
- }
+ animator.start();
}
//----------------------------------------------------------------------
@@ -212,7 +186,6 @@ public class HWShadowmapsSimple {
checkExtension(gl, "GL_ARB_pixel_format");
} catch (GLException e) {
e.printStackTrace();
- quit = true;
throw(e);
}
@@ -319,8 +292,26 @@ public class HWShadowmapsSimple {
}
public void display(GLDrawable drawable) {
- if (quit) {
- return;
+ viewer.update();
+
+ // Grab these values once per render to avoid multithreading
+ // issues with their values being changed by manipulation from
+ // the AWT thread during the render
+ CameraParameters params = viewer.getCameraParameters();
+
+ cameraPerspective.set(params.getProjectionMatrix());
+ cameraInverseTransform.set(params.getModelviewMatrix());
+ cameraTransform.set(cameraInverseTransform);
+ cameraTransform.invertRigid();
+ spotlightTransform.set(spotlight.getTransform());
+ spotlightInverseTransform.set(spotlightTransform);
+ spotlightInverseTransform.invertRigid();
+ objectTransform.set(object.getTransform());
+
+ if (displayMode == RENDER_SCENE_FROM_CAMERA_VIEW_SHADOWED || !fullyInitialized) {
+ if (pbuffer != null) {
+ pbuffer.display();
+ }
}
if (!fullyInitialized) {
@@ -355,8 +346,6 @@ public class HWShadowmapsSimple {
gl.glLoadIdentity();
}
- CameraParameters params = viewer.getCameraParameters();
-
switch (displayMode) {
case RENDER_SCENE_FROM_CAMERA_VIEW: render_scene_from_camera_view(gl, glu, drawable, params); break;
case RENDER_SCENE_FROM_CAMERA_VIEW_SHADOWED: render_scene_from_camera_view_shadowed(gl, glu, drawable, params); break;
@@ -382,15 +371,10 @@ public class HWShadowmapsSimple {
}
private void dispatchKey(char k) {
- if ((k == (char) 27) || (k == 'q')) {
- quit = true;
- return;
- }
-
switch (k) {
case 27:
case 'q':
- quit = true;
+ runExit();
break;
case 'v':
@@ -847,4 +831,18 @@ public class HWShadowmapsSimple {
return m;
}
+
+ 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. Run the
+ // exit routine in another thread.
+ new Thread(new Runnable() {
+ public void run() {
+ animator.stop();
+ System.exit(0);
+ }
+ }).start();
+ }
}
diff --git a/src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java b/src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java
index f34940c..03ef552 100644
--- a/src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java
+++ b/src/demos/proceduralTexturePhysics/ProceduralTexturePhysics.java
@@ -57,8 +57,6 @@ import gleem.linalg.*;
*/
public class ProceduralTexturePhysics {
- private static volatile boolean quit;
-
private volatile boolean drawing;
private volatile int mousePosX;
private volatile int mousePosY;
@@ -66,6 +64,7 @@ public class ProceduralTexturePhysics {
private Dimension dim = new Dimension();
private GLCanvas canvas;
private Water water;
+ private Animator animator;
private volatile ExaminerViewer viewer;
private boolean[] b = new boolean[256];
private boolean doViewAll = true;
@@ -85,6 +84,8 @@ public class ProceduralTexturePhysics {
canvas.addGLEventListener(new Listener());
canvas.setNoAutoRedrawMode(true);
+ animator = new Animator(canvas);
+
Frame frame = new Frame("Procedural Texture Waves");
frame.setLayout(new BorderLayout());
canvas.setSize(512, 512);
@@ -95,47 +96,17 @@ public class ProceduralTexturePhysics {
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
- quit = true;
+ runExit();
}
});
- try {
- water = new Water();
- water.initialize("demos/data/images/nvfixed.tga",
- "demos/data/images/nvspin.tga",
- "demos/data/images/droplet.tga",
- "demos/data/cubemaps/CloudyHills_{0}.tga",
- canvas);
- } catch (GLException e) {
- JOptionPane.showMessageDialog(null, e.toString(), "Unavailable extension", JOptionPane.ERROR_MESSAGE);
- }
-
- try {
- while (!quit) {
- if (viewer != null) {
- try {
- if (drawing) {
- canvas.getSize(dim);
- water.addDroplet(new Water.Droplet( 2 * (mousePosX / (float) dim.width - 0.5f),
- -2 * (mousePosY / (float) dim.height - 0.5f),
- 0.08f));
- }
- water.tick();
- canvas.display();
- } catch (GLException e) {
- // Have seen spurious exceptions getting thrown during SwapBuffers.
- // Not sure why at this time; disabling of repaint() should prevent
- // AWT thread from getting involved. Continue animating anyway.
- e.printStackTrace();
- }
- } else {
- // Make the pbuffer get created
- canvas.display();
- }
- }
- } finally {
- System.exit(0);
- }
+ water = new Water();
+ water.initialize("demos/data/images/nvfixed.tga",
+ "demos/data/images/nvspin.tga",
+ "demos/data/images/droplet.tga",
+ "demos/data/cubemaps/CloudyHills_{0}.tga",
+ canvas);
+ animator.start();
}
//----------------------------------------------------------------------
@@ -167,7 +138,6 @@ public class ProceduralTexturePhysics {
checkExtension(gl, "GL_ARB_pixel_format");
} catch (GLException e) {
e.printStackTrace();
- quit = true;
throw(e);
}
@@ -220,14 +190,6 @@ public class ProceduralTexturePhysics {
}
public void display(GLDrawable drawable) {
- if (water == null) {
- return;
- }
-
- if (quit) {
- return;
- }
-
if (!firstRender) {
if (++frameCount == 30) {
timer.stop();
@@ -255,6 +217,14 @@ public class ProceduralTexturePhysics {
ManipManager.getManipManager().updateCameraParameters(drawable, viewer.getCameraParameters());
ManipManager.getManipManager().render(drawable, gl);
+ if (drawing) {
+ canvas.getSize(dim);
+ water.addDroplet(new Water.Droplet( 2 * (mousePosX / (float) dim.width - 0.5f),
+ -2 * (mousePosY / (float) dim.height - 0.5f),
+ 0.08f));
+ }
+ water.tick();
+
CameraParameters params = viewer.getCameraParameters();
water.draw(gl, params.getOrientation().inverse());
}
@@ -272,22 +242,17 @@ public class ProceduralTexturePhysics {
if (!gl.isExtensionAvailable(extensionName)) {
String message = "Unable to initialize " + extensionName + " OpenGL extension";
JOptionPane.showMessageDialog(null, message, "Unavailable extension", JOptionPane.ERROR_MESSAGE);
- throw new GLException(message);
+ runExit();
}
}
private void dispatchKey(char k) {
setFlag(k, !getFlag(k));
- if ((k == (char) 27) || (k == 'q')) {
- quit = true;
- return;
- }
-
switch (k) {
case 27:
case 'q':
- quit = true;
+ runExit();
break;
case 'w':
water.enableWireframe(getFlag('w'));
@@ -389,4 +354,18 @@ public class ProceduralTexturePhysics {
}
}
}
+
+ 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. Run the
+ // exit routine in another thread.
+ new Thread(new Runnable() {
+ public void run() {
+ animator.stop();
+ System.exit(0);
+ }
+ }).start();
+ }
}
diff --git a/src/gleem/CameraParameters.java b/src/gleem/CameraParameters.java
index 658820d..c406cda 100644
--- a/src/gleem/CameraParameters.java
+++ b/src/gleem/CameraParameters.java
@@ -61,6 +61,8 @@ public class CameraParameters {
Vec3f forwardDirection,
Vec3f upDirection,
Rotf orientation,
+ Mat4f modelviewMatrix,
+ Mat4f projectionMatrix,
float vertFOV,
float imagePlaneAspectRatio,
int xSize,
@@ -69,6 +71,8 @@ public class CameraParameters {
setForwardDirection(forwardDirection);
setUpDirection(upDirection);
setOrientation(orientation);
+ setModelviewMatrix(modelviewMatrix);
+ setProjectionMatrix(projectionMatrix);
setVertFOV(vertFOV);
setImagePlaneAspectRatio(imagePlaneAspectRatio);
setXSize(xSize);
@@ -79,12 +83,25 @@ public class CameraParameters {
setPosition(params.getPosition());
setForwardDirection(params.getForwardDirection());
setUpDirection(params.getUpDirection());
+ setOrientation(params.getOrientation());
+ setModelviewMatrix(params.getModelviewMatrix());
+ setProjectionMatrix(params.getProjectionMatrix());
setVertFOV(params.getVertFOV());
setImagePlaneAspectRatio(params.getImagePlaneAspectRatio());
setXSize(params.getXSize());
setYSize(params.getYSize());
}
+ public Object clone() {
+ CameraParameters params = new CameraParameters();
+ params.set(this);
+ return params;
+ }
+
+ public CameraParameters copy() {
+ return (CameraParameters) clone();
+ }
+
/** Sets 3-space origin of camera */
public void setPosition(Vec3f position) { this.position.set(position); }
/** Gets 3-space origin of camera */