diff options
author | Vincent Cantin <[email protected]> | 2013-04-08 22:20:34 +0800 |
---|---|---|
committer | Vincent Cantin <[email protected]> | 2013-04-08 22:20:34 +0800 |
commit | 55beb1682a37b30a9d5d7df09a25ed91afab0583 (patch) | |
tree | 5d3142ee6ee2170b9f22a9ffce06d2d9340be938 | |
parent | 67e1c2b6ebc984c67f1c26bc3b769e1d46f6cb56 (diff) | |
parent | c4d2aeb67df31a889ea68c622f9cb2c5997f9cd9 (diff) |
Merge commit 'c4d2aeb67df31a889ea68c622f9cb2c5997f9cd9'
4 files changed, 156 insertions, 68 deletions
diff --git a/ardor3d-jogl/src/main/java/com/ardor3d/framework/jogl/CapsUtil.java b/ardor3d-jogl/src/main/java/com/ardor3d/framework/jogl/CapsUtil.java index 8d4eca8..b74bea0 100644 --- a/ardor3d-jogl/src/main/java/com/ardor3d/framework/jogl/CapsUtil.java +++ b/ardor3d-jogl/src/main/java/com/ardor3d/framework/jogl/CapsUtil.java @@ -18,6 +18,19 @@ import com.ardor3d.util.Ardor3dException; public class CapsUtil { + public static GLProfile getProfile() { + // tries to get the most capable profile, programmable or fixed, desktop or embedded, forward or backward + // compatible + GLProfile profile = GLProfile.getMaximum(true); + final boolean isForwardCompatible = (!profile.isGL4() && profile.isGL3() && !profile.isGL3bc()) + || (profile.isGL4() && !profile.isGL4bc()); + if (isForwardCompatible) { + // Ardor3D doesn't support forward compatible yet + profile = GLProfile.getMaxFixedFunc(true); + } + return profile; + } + public static GLCapabilities getCapsForSettings(final DisplaySettings settings) { return getCapsForSettings(settings, true, false, false, false); } @@ -36,7 +49,7 @@ public class CapsUtil { throw new Ardor3dException("Invalid pixel depth: " + settings.getColorDepth()); } - final GLCapabilities caps = new GLCapabilities(GLProfile.getMaximum(true)); + final GLCapabilities caps = new GLCapabilities(getProfile()); caps.setHardwareAccelerated(true); caps.setDoubleBuffered(true); caps.setAlphaBits(settings.getAlphaBits()); diff --git a/ardor3d-jogl/src/main/java/com/ardor3d/framework/jogl/JoglCanvasRenderer.java b/ardor3d-jogl/src/main/java/com/ardor3d/framework/jogl/JoglCanvasRenderer.java index 7137ab6..da235c7 100644 --- a/ardor3d-jogl/src/main/java/com/ardor3d/framework/jogl/JoglCanvasRenderer.java +++ b/ardor3d-jogl/src/main/java/com/ardor3d/framework/jogl/JoglCanvasRenderer.java @@ -23,7 +23,6 @@ import javax.media.opengl.GL; import javax.media.opengl.GLContext; import javax.media.opengl.GLDrawableFactory; import javax.media.opengl.GLException; -import javax.media.opengl.GLProfile; import com.ardor3d.annotation.MainThread; import com.ardor3d.framework.CanvasRenderer; @@ -129,7 +128,7 @@ public class JoglCanvasRenderer implements CanvasRenderer { public void init(final DisplaySettings settings, final boolean doSwap) { _doSwap = doSwap; if (_context == null) { - _context = GLDrawableFactory.getFactory(GLProfile.getMaximum(true)).createExternalGLContext(); + _context = GLDrawableFactory.getFactory(CapsUtil.getProfile()).createExternalGLContext(); } makeCurrentContext(); diff --git a/ardor3d-jogl/src/main/java/com/ardor3d/image/util/jogl/JoglImageLoader.java b/ardor3d-jogl/src/main/java/com/ardor3d/image/util/jogl/JoglImageLoader.java index 33b6118..3446a27 100644 --- a/ardor3d-jogl/src/main/java/com/ardor3d/image/util/jogl/JoglImageLoader.java +++ b/ardor3d-jogl/src/main/java/com/ardor3d/image/util/jogl/JoglImageLoader.java @@ -14,17 +14,18 @@ import java.io.IOException; import java.io.InputStream; import java.nio.Buffer; import java.nio.ByteBuffer; +import java.nio.CharBuffer; import java.nio.DoubleBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.LongBuffer; import java.nio.ShortBuffer; -import javax.media.opengl.GLProfile; - +import com.ardor3d.framework.jogl.CapsUtil; import com.ardor3d.image.Image; import com.ardor3d.image.PixelDataType; import com.ardor3d.image.util.ImageLoader; +import com.ardor3d.image.util.ImageLoaderUtil; import com.ardor3d.scene.state.jogl.util.JoglTextureUtil; import com.ardor3d.util.geom.BufferUtils; import com.jogamp.common.nio.Buffers; @@ -33,96 +34,170 @@ import com.jogamp.opengl.util.texture.TextureIO; public class JoglImageLoader implements ImageLoader { - // private static final Logger logger = Logger.getLogger(JoglImageLoader.class.getName()); - private static boolean createOnHeap = false; - private static final String[] supportedFormats = new String[] { TextureIO.DDS, TextureIO.GIF, TextureIO.JPG, - TextureIO.JPG, TextureIO.PAM, TextureIO.PNG, TextureIO.PNG, TextureIO.PPM, TextureIO.SGI, TextureIO.TGA, - TextureIO.TIFF }; + private enum TYPE { + BYTE, SHORT, CHAR, INT, FLOAT, LONG, DOUBLE + }; + + private static final String[] supportedFormats = new String[] { "." + TextureIO.DDS.toUpperCase(), + "." + TextureIO.GIF.toUpperCase(), "." + TextureIO.JPG.toUpperCase(), "." + TextureIO.PAM.toUpperCase(), + "." + TextureIO.PNG.toUpperCase(), "." + TextureIO.PPM.toUpperCase(), "." + TextureIO.SGI.toUpperCase(), + "." + TextureIO.TGA.toUpperCase(), "." + TextureIO.TIFF.toUpperCase() }; public static String[] getSupportedFormats() { return supportedFormats; } - public static void registerLoader() {} + public static void registerLoader() { + ImageLoaderUtil.registerHandler(new JoglImageLoader(), supportedFormats); + } public JoglImageLoader() {} @Override public Image load(final InputStream is, final boolean flipped) throws IOException { - final TextureData textureData = TextureIO.newTextureData(GLProfile.getMaximum(true), is, true, null); + final TextureData textureData = TextureIO.newTextureData(CapsUtil.getProfile(), is, true, null); final Buffer textureDataBuffer = textureData.getBuffer(); final Image ardorImage = new Image(); - - int dataSize = textureDataBuffer.capacity(); - if (textureDataBuffer instanceof ShortBuffer) { - dataSize *= Buffers.SIZEOF_SHORT; + final TYPE bufferDataType; + if (textureDataBuffer instanceof ByteBuffer) { + bufferDataType = TYPE.BYTE; } else { - if (textureDataBuffer instanceof IntBuffer) { - dataSize *= Buffers.SIZEOF_INT; + if (textureDataBuffer instanceof ShortBuffer) { + bufferDataType = TYPE.SHORT; } else { - if (textureDataBuffer instanceof LongBuffer) { - dataSize *= Buffers.SIZEOF_LONG; + if (textureDataBuffer instanceof CharBuffer) { + bufferDataType = TYPE.CHAR; } else { - if (textureDataBuffer instanceof FloatBuffer) { - dataSize *= Buffers.SIZEOF_FLOAT; + if (textureDataBuffer instanceof IntBuffer) { + bufferDataType = TYPE.INT; } else { - if (textureDataBuffer instanceof DoubleBuffer) { - dataSize *= Buffers.SIZEOF_DOUBLE; + if (textureDataBuffer instanceof FloatBuffer) { + bufferDataType = TYPE.FLOAT; + } else { + if (textureDataBuffer instanceof LongBuffer) { + bufferDataType = TYPE.LONG; + } else { + if (textureDataBuffer instanceof DoubleBuffer) { + bufferDataType = TYPE.DOUBLE; + } else { + bufferDataType = null; + } + } } } } } } - final ByteBuffer scratch = createOnHeap ? BufferUtils.createByteBufferOnHeap(dataSize) : Buffers - .newDirectByteBuffer(dataSize); - if (textureDataBuffer instanceof ShortBuffer) { - final ShortBuffer shortTextureDataBuffer = (ShortBuffer) textureDataBuffer; - while (textureDataBuffer.hasRemaining()) { - scratch.putShort(shortTextureDataBuffer.get()); - } + if (bufferDataType == null) { + throw new UnsupportedOperationException("Unknown buffer type " + textureDataBuffer.getClass().getName()); } else { - if (textureDataBuffer instanceof IntBuffer) { - final IntBuffer intTextureDataBuffer = (IntBuffer) textureDataBuffer; - while (textureDataBuffer.hasRemaining()) { - scratch.putInt(intTextureDataBuffer.get()); + final int pixelComponentSize; + switch (bufferDataType) { + case BYTE: + pixelComponentSize = Buffers.SIZEOF_BYTE; + break; + case SHORT: + pixelComponentSize = Buffers.SIZEOF_SHORT; + break; + case CHAR: + pixelComponentSize = Buffers.SIZEOF_CHAR; + break; + case INT: + pixelComponentSize = Buffers.SIZEOF_INT; + break; + case FLOAT: + pixelComponentSize = Buffers.SIZEOF_FLOAT; + break; + case LONG: + pixelComponentSize = Buffers.SIZEOF_LONG; + break; + case DOUBLE: + pixelComponentSize = Buffers.SIZEOF_DOUBLE; + break; + default: + // it should never happen + pixelComponentSize = 0; + } + final int dataSize = textureDataBuffer.capacity() * pixelComponentSize; + final ByteBuffer scratch = createOnHeap ? BufferUtils.createByteBufferOnHeap(dataSize) : Buffers + .newDirectByteBuffer(dataSize); + if (flipped) { + final int bytesPerPixel = dataSize / (textureData.getWidth() * textureData.getHeight()); + while (scratch.hasRemaining()) { + final int srcPixelIndex = scratch.position() / bytesPerPixel; + final int srcPixelComponentOffset = scratch.position() - (srcPixelIndex * bytesPerPixel); + // final int srcElementIndex = srcPixelIndex * bytesPerPixel + srcPixelComponentOffset; + final int srcColumnIndex = srcPixelIndex % textureData.getWidth(); + final int scrRowIndex = (srcPixelIndex - srcColumnIndex) / textureData.getHeight(); + final int dstColumnIndex = srcColumnIndex; + final int dstRowIndex = (textureData.getHeight() - 1) - scrRowIndex; + final int dstPixelIndex = dstRowIndex * textureData.getWidth() + dstColumnIndex; + final int dstPixelComponentOffset = srcPixelComponentOffset; + final int dstElementIndex = dstPixelIndex * bytesPerPixel + dstPixelComponentOffset; + switch (bufferDataType) { + case BYTE: + scratch.put(((ByteBuffer) textureDataBuffer).get(dstElementIndex)); + break; + case SHORT: + scratch.putShort(((ShortBuffer) textureDataBuffer).get(dstElementIndex)); + break; + case CHAR: + scratch.putChar(((CharBuffer) textureDataBuffer).get(dstElementIndex)); + break; + case INT: + scratch.putInt(((IntBuffer) textureDataBuffer).get(dstElementIndex)); + break; + case FLOAT: + scratch.putFloat(((FloatBuffer) textureDataBuffer).get(dstElementIndex)); + break; + case LONG: + scratch.putLong(((LongBuffer) textureDataBuffer).get(dstElementIndex)); + break; + case DOUBLE: + scratch.putDouble(((DoubleBuffer) textureDataBuffer).get(dstElementIndex)); + break; + default: + // it should never happen + } } + } else { - if (textureDataBuffer instanceof LongBuffer) { - final LongBuffer longTextureDataBuffer = (LongBuffer) textureDataBuffer; - while (textureDataBuffer.hasRemaining()) { - scratch.putLong(longTextureDataBuffer.get()); - } - } else { - if (textureDataBuffer instanceof FloatBuffer) { - final FloatBuffer floatTextureDataBuffer = (FloatBuffer) textureDataBuffer; - while (textureDataBuffer.hasRemaining()) { - scratch.putFloat(floatTextureDataBuffer.get()); - } - } else { - if (textureDataBuffer instanceof DoubleBuffer) { - final DoubleBuffer doubleTextureDataBuffer = (DoubleBuffer) textureDataBuffer; - while (textureDataBuffer.hasRemaining()) { - scratch.putDouble(doubleTextureDataBuffer.get()); - } - } else { - if (textureDataBuffer instanceof ByteBuffer) { - scratch.put((ByteBuffer) textureDataBuffer); - } - } - } + switch (bufferDataType) { + case BYTE: + scratch.put((ByteBuffer) textureDataBuffer); + break; + case SHORT: + scratch.asShortBuffer().put((ShortBuffer) textureDataBuffer); + break; + case CHAR: + scratch.asCharBuffer().put((CharBuffer) textureDataBuffer); + break; + case INT: + scratch.asIntBuffer().put((IntBuffer) textureDataBuffer); + break; + case FLOAT: + scratch.asFloatBuffer().put((FloatBuffer) textureDataBuffer); + case LONG: + scratch.asLongBuffer().put((LongBuffer) textureDataBuffer); + break; + case DOUBLE: + scratch.asDoubleBuffer().put((DoubleBuffer) textureDataBuffer); + break; + default: + // it should never happen } } + scratch.rewind(); + textureDataBuffer.rewind(); + ardorImage.setWidth(textureData.getWidth()); + ardorImage.setHeight(textureData.getHeight()); + ardorImage.setData(scratch); + ardorImage.setDataFormat(JoglTextureUtil.getImageDataFormat(textureData.getPixelFormat())); + // ardorImage.setDataType(JoglTextureUtil.getPixelDataType(textureData.getPixelType())); + ardorImage.setDataType(PixelDataType.UnsignedByte); + return ardorImage; } - scratch.rewind(); - textureDataBuffer.rewind(); - ardorImage.setWidth(textureData.getWidth()); - ardorImage.setHeight(textureData.getHeight()); - ardorImage.setData(scratch); - ardorImage.setDataFormat(JoglTextureUtil.getImageDataFormat(textureData.getPixelFormat())); - // ardorImage.setDataType(JoglTextureUtil.getPixelDataType(textureData.getPixelType())); - ardorImage.setDataType(PixelDataType.UnsignedByte); - return ardorImage; } } diff --git a/ardor3d-jogl/src/main/java/com/ardor3d/renderer/jogl/JoglPbufferTextureRenderer.java b/ardor3d-jogl/src/main/java/com/ardor3d/renderer/jogl/JoglPbufferTextureRenderer.java index 8cce557..cbdb2a3 100644 --- a/ardor3d-jogl/src/main/java/com/ardor3d/renderer/jogl/JoglPbufferTextureRenderer.java +++ b/ardor3d-jogl/src/main/java/com/ardor3d/renderer/jogl/JoglPbufferTextureRenderer.java @@ -24,6 +24,7 @@ import javax.media.opengl.GLProfile; import com.ardor3d.framework.DisplaySettings; import com.ardor3d.framework.Scene; +import com.ardor3d.framework.jogl.CapsUtil; import com.ardor3d.image.Texture; import com.ardor3d.image.Texture.Type; import com.ardor3d.renderer.AbstractPbufferTextureRenderer; @@ -262,7 +263,7 @@ public class JoglPbufferTextureRenderer extends AbstractPbufferTextureRenderer { } // Make our GLPbuffer... - final GLProfile profile = GLProfile.getMaximum(true); + final GLProfile profile = CapsUtil.getProfile(); final GLDrawableFactory fac = GLDrawableFactory.getFactory(profile); final GLCapabilities caps = new GLCapabilities(profile); caps.setHardwareAccelerated(true); |