//(c) Copyright 2014, Scott Vorthmann. package org.vorthmann.zome.render.jogl; import java.awt.event.MouseEvent; import java.util.Collection; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLEventListener; import javax.media.opengl.awt.GLCanvas; import javax.media.opengl.glu.GLU; import javax.vecmath.Matrix4d; import javax.vecmath.Point3d; import com.jogamp.opengl.util.FPSAnimator; import com.vzome.core.render.RenderedManifestation; import com.vzome.core.render.RenderingChanges; import com.vzome.desktop.controller.RenderingViewer; public class JoglRenderingViewer implements RenderingViewer { private final JoglScene scene; private FPSAnimator animator; private final GLU glu = new GLU(); private int width, height; private double near = 100, far = 2000, fov = 45; private double halfEdge = 100; public JoglRenderingViewer( JoglScene scene, GLCanvas canvas ) { this .scene = scene; if ( canvas == null ) return; canvas .addGLEventListener( new GLEventListener() { @Override public void reshape( GLAutoDrawable glautodrawable, int x, int y, int width, int height ) { JoglRenderingViewer.this .width = width; JoglRenderingViewer.this .height = height; JoglRenderingViewer.this .updateView( glautodrawable .getGL() .getGL2() ); } @Override public void init( GLAutoDrawable glautodrawable ) {} @Override public void dispose( GLAutoDrawable glautodrawable ) {} @Override public void display( GLAutoDrawable glautodrawable ) { JoglRenderingViewer.this .updateView( glautodrawable .getGL() .getGL2() ); // GL commands to render the scene here JoglRenderingViewer.this .scene .render( glautodrawable .getGL() .getGL2() ); } }); // Start animator (which should be a field). this .animator = new FPSAnimator( canvas, 60 ); this .animator .start(); } private void updateView( GL2 gl2 ) { gl2 .glMatrixMode( GL2.GL_PROJECTION ); gl2 .glLoadIdentity(); // coordinate system origin at lower left with width and height same as the window if ( this .fov == 0 ) gl2 .glOrtho( - this .halfEdge, this .halfEdge, - this .halfEdge, this .halfEdge, this .near, this .far ); else this .glu .gluPerspective( this .fov, this .width / this .height, this .near, this .far ); glu .gluLookAt( 0, 0, (this .far - this .near) / 2f, 0, 0, 0, 0, 1, 0 ); gl2 .glMatrixMode( GL2.GL_MODELVIEW ); gl2 .glLoadIdentity(); gl2 .glViewport( 0, 0, this .width, this .height ); } @Override public void setEye( int eye ) { // TODO Auto-generated method stub } @Override public void setViewTransformation( Matrix4d trans, int eye ) { // TODO Auto-generated method stub } @Override public void setPerspective( double fov, double aspectRatio, double near, double far ) { this .fov = fov; this .near = near; this .far = far; } @Override public void setOrthographic( double halfEdge, double near, double far ) { this .fov = 0; this .halfEdge = halfEdge / 70; this .near = near; this .far = far; } @Override public RenderedManifestation pickManifestation( MouseEvent e ) { // TODO Auto-generated method stub return null; } @Override public Collection pickCube() { // TODO Auto-generated method stub return null; } @Override public void pickPoint( MouseEvent e, Point3d imagePt, Point3d eyePt ) { // TODO Auto-generated method stub } @Override public RenderingChanges getRenderingChanges() { return this .scene; } @Override public void captureImage( int maxSize, ImageCapture capture ) { // TODO Auto-generated method stub } }