From 880653d31a8f1ff8384fdbc75b84934bceecfdb8 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sat, 18 Nov 2000 06:43:49 +0000 Subject: Initial revision --- gl4java/awt/GLImageCanvas.java | 402 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 402 insertions(+) create mode 100755 gl4java/awt/GLImageCanvas.java (limited to 'gl4java/awt/GLImageCanvas.java') diff --git a/gl4java/awt/GLImageCanvas.java b/gl4java/awt/GLImageCanvas.java new file mode 100755 index 0000000..113d589 --- /dev/null +++ b/gl4java/awt/GLImageCanvas.java @@ -0,0 +1,402 @@ +/** + * @(#) GLImageCanvas.java + */ + + +package gl4java.awt; + +import gl4java.*; +import gl4java.utils.*; +import gl4java.utils.textures.*; + +import java.awt.*; +import java.net.*; + +/** + * This Class provides a simple universal + * Image/Texture OpenGL Canvas ! + * + * A special demo/application for this class can be found + * in "demos/MiscDemos/GLImageViewerCanvas.java" ! + * + * @see TextureLoader + * @author Sven Goethel + * + */ +public class GLImageCanvas extends GLCanvas +{ + int texName[] = {0}; + TextureLoader txtLoader = null; + boolean newText = false; + boolean keepAspect = true; + boolean zoomImg = true; + + TextureGrabber textGrab4Snapshot = null; + String textGrab4SnapshotFName = null; + URL textGrab4SnapshotURL = null; + String textGrab4SnapshotURI = null; + + public GLImageCanvas(int w, int h) + { + super(w, h); + } + + public void setKeepAspectRatio(boolean v) + { keepAspect=v; } + + public boolean getKeepAspectRatio() + { return keepAspect; } + + public void setZoomAble(boolean v) + { zoomImg = v; } + + public boolean getZoomAble() + { return zoomImg; } + + public TextureLoader getTextureLoader() + { return txtLoader; } + + public void setOriginalSize() + { + if(txtLoader!=null && txtLoader.isOk()) + { + internalSetSize( txtLoader.getImageWidth(), + txtLoader.getImageHeight() ); + } + } + + /** + * Creates a snapshot (save texture/image) of the current + * GL-Context ! + * + * The snapshot itself is created delayed, + * so no return value is avaiable. + * Because this is a non critical path, I hope its enough ! + * + * @param tg The TextureGrabber + * @param fname The filename + * @see TextureGrabber + */ + public void snapshot(TextureGrabber tg, String fname) + { + textGrab4Snapshot=tg; + textGrab4SnapshotFName=fname; + repaint(); + } + + /** + * Creates a snapshot (save texture/image) of the current + * GL-Context ! + * + * The snapshot itself is created delayed, + * so no return value is avaiable. + * Because this is a non critical path, I hope its enough ! + * + * @param tg The TextureGrabber + * @param base The base URL + * @param uri The additional uri for the base URL + * @see TextureGrabber + */ + public void snapshot(TextureGrabber tg, URL base, String uri) + { + textGrab4Snapshot=tg; + textGrab4SnapshotURL = base; + textGrab4SnapshotURI = uri; + repaint(); + } + + public Dimension getPreferredSize() { + return getMinimumSize(); + } + + public Dimension getMinimumSize() { + return getSize(); + } + + protected void internalSetSize(int w, int h) + { + setSize( w, h ); + invalidate(); + + Window holder = Tool.getWindow(this); + + if(holder!=null) + { + holder.invalidate(); + holder.pack(); + holder.repaint(); + } + } + + public void preInit() + { + // createOwnWindow = true; + } + + public void init() + { + gl.glEnable(GL_TEXTURE_2D); + + gl.glGenTextures(1,texName); + gl.glBindTexture(GL_TEXTURE_2D,texName[0]); + + gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); + gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); + gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); + gl.glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + gl.glShadeModel (GL_SMOOTH); + + gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f); + + reshape(getSize().width, getSize().height); + } + + /** + * Loads an Image of the appropiate type, + * and renders and resizes the complete window ! + * + * @param fname The filename + * @param type The type of file, e.g. TextureLoader is used ! + * The following types are currently allowed: + * "png" for PngTextureLoader, + * "ppm" for PPMAsciiTextureLoader, + * "tga" for PPMAsciiTextureLoader, + * "any" for AWTTextureLoader ! + */ + public boolean loadTexture(String fname, String type) + { + return loadTexture(fname, null, null, type); + } + + /** + * Loads an Image of the appropiate type, + * and renders and resizes the complete window ! + * + * @param base The base URL + * @param uri The additional uri for the base URL + * @param type The type of file, e.g. TextureLoader is used ! + * The following types are currently allowed: + * "png" for PngTextureLoader, + * "ppm" for PPMAsciiTextureLoader, + * "tga" for PPMAsciiTextureLoader, + * "any" for AWTTextureLoader ! + */ + public boolean loadTexture(URL base, String uri, String type) + { + return loadTexture(null, base, uri, type); + } + + protected boolean loadTexture(String fname, + URL base, String uri, String type) + { + boolean ok = true; + + if( glj.gljMakeCurrent() == false ) + { + System.out.println("problem in use() method"); + return false; + } + + // texture laden + if(type.equals("png")) + txtLoader = new PngTextureLoader(gl, glu); + else if(type.equals("ppm")) + txtLoader = new PPMAsciiTextureLoader(gl, glu); + else if(type.equals("tga")) + txtLoader = new TGATextureLoader(gl, glu); + else if(type.equals("any")) + txtLoader = new AWTTextureLoader(this, gl, glu); + else { + System.out.println("Imagetype: "+type+" is currently not supported !"); + ok = false; + } + + if(ok) + { + try { + if(fname!=null) + txtLoader.readTexture(fname); + else + txtLoader.readTexture(base, uri); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + if(ok && txtLoader.isOk()) + { + gl.glEnable(GL_TEXTURE_2D); + + txtLoader.texImage2DNonScaled(true); + + gl.glDisable(GL_TEXTURE_2D); + System.out.println("texture succesfully loaded !"); + System.out.println("texture: "+txtLoader); + } + glj.gljCheckGL(); + glj.gljFree(); + if(ok) { + internalSetSize( txtLoader.getImageWidth(), + txtLoader.getImageHeight() ); + } + return ok; + } + + public void display() + { + int i; + + /* Standard GL4Java Init */ + if( glj.gljMakeCurrent() == false ) + { + System.out.println("problem in use() method"); + return; + } + + SetCamera(); + + // just render it + gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + DrawObj(false); + + if(textGrab4Snapshot!=null) + { + textGrab4Snapshot.grabPixels(GL_BACK, + 0, 0, cvsGetWidth(), cvsGetHeight()); + if(textGrab4SnapshotFName!=null) + textGrab4Snapshot.write2File(textGrab4SnapshotFName); + else + textGrab4Snapshot.write2File(textGrab4SnapshotURL, + textGrab4SnapshotURI); + textGrab4Snapshot =null; + textGrab4SnapshotFName=null; + textGrab4SnapshotURL =null; + textGrab4SnapshotURI =null; + } + + /* For your animation dutys ;-) */ + glj.gljSwap(); + glj.gljCheckGL(); + glj.gljFree(); + } + + /** + * to prevent a deadlock in recursive + * reshape .. internalSetSize .. pack .. resize -> reshape ! + */ + private int reshape_resize_sema = 1; + + public void reshape(int w, int h) + { + if(reshape_resize_sema>0 && + keepAspect && txtLoader!=null && txtLoader.isOk()) + { + reshape_resize_sema--; + + int rw=w; int rh=h; + if(zoomImg) + { + double iaspect = (double)txtLoader.getImageWidth()/ + (double)txtLoader.getImageHeight(); + if(rw