diff options
author | Julien Gouesse <[email protected]> | 2015-11-19 20:45:53 +0100 |
---|---|---|
committer | Julien Gouesse <[email protected]> | 2015-11-19 20:45:53 +0100 |
commit | a18c3b0789bfc24b49dbaf41c2390159bc683afc (patch) | |
tree | b5236ff2570178de356eab569225108948eb4d30 /src/javax/media/j3d/J3DBuffer.java | |
parent | 264608060948a634b53a13ee96ed07527eb07340 (diff) | |
parent | 7a2e20caac9db6f789a7b3fab344b9758af45335 (diff) |
Gets Harvey's changes
Diffstat (limited to 'src/javax/media/j3d/J3DBuffer.java')
-rw-r--r-- | src/javax/media/j3d/J3DBuffer.java | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/src/javax/media/j3d/J3DBuffer.java b/src/javax/media/j3d/J3DBuffer.java new file mode 100644 index 0000000..2cacf8a --- /dev/null +++ b/src/javax/media/j3d/J3DBuffer.java @@ -0,0 +1,220 @@ +/* + * Copyright 2001-2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package javax.media.j3d; + +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.CharBuffer; +import java.nio.DoubleBuffer; +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.nio.LongBuffer; +import java.nio.ShortBuffer; + +/** + * Java 3D wrapper class for java.nio.Buffer objects. + * When used to wrap a non-null NIO buffer object, this class will + * create a read-only view of the wrapped NIO buffer, and will call + * <code>rewind</code> on the read-only view, so that elements 0 + * through <code>buffer.limit()-1</code> will be available internally. + * + * @see GeometryArray#setCoordRefBuffer(J3DBuffer) + * @see GeometryArray#setColorRefBuffer(J3DBuffer) + * @see GeometryArray#setNormalRefBuffer(J3DBuffer) + * @see GeometryArray#setTexCoordRefBuffer(int,J3DBuffer) + * @see GeometryArray#setVertexAttrRefBuffer(int,J3DBuffer) + * @see GeometryArray#setInterleavedVertexBuffer(J3DBuffer) + * @see CompressedGeometry#CompressedGeometry(CompressedGeometryHeader,J3DBuffer) + * + * @since Java 3D 1.3 + */ + +public class J3DBuffer { + +enum Type { + NULL, + UNKNOWN, + BYTE, + CHAR, + SHORT, + INT, + LONG, + FLOAT, + DOUBLE, +} + + private Buffer originalBuffer = null; + private Buffer readonlyBuffer = null; + Type bufferType = Type.NULL; + + /** + * Constructs a J3DBuffer object and initializes it with + * a null NIO buffer object. The NIO buffer object + * must be set to a non-null value before using this J3DBuffer + * object in a Java 3D node component. + * + * @exception UnsupportedOperationException if the JVM does not + * support native access to direct NIO buffers + */ + public J3DBuffer() { + this(null); + } + + + /** + * Constructs a J3DBuffer object and initializes it with + * the specified NIO buffer object. + * + * @param buffer the NIO buffer wrapped by this J3DBuffer + * + * @exception UnsupportedOperationException if the JVM does not + * support native access to direct NIO buffers + * + * @exception IllegalArgumentException if the specified buffer is + * not a direct buffer, or if the byte order of the specified + * buffer does not match the native byte order of the underlying + * platform. + */ + public J3DBuffer(Buffer buffer) { + setBuffer(buffer); + } + + + /** + * Sets the NIO buffer object in this J3DBuffer to + * the specified object. + * + * @param buffer the NIO buffer wrapped by this J3DBuffer + * + * @exception IllegalArgumentException if the specified buffer is + * not a direct buffer, or if the byte order of the specified + * buffer does not match the native byte order of the underlying + * platform. + */ + public void setBuffer(Buffer buffer) { + Type bType = Type.NULL; + boolean direct = false; + ByteOrder order = ByteOrder.BIG_ENDIAN; + + if (buffer == null) { + bType = Type.NULL; + } + else if (buffer instanceof ByteBuffer) { + bType = Type.BYTE; + direct = ((ByteBuffer)buffer).isDirect(); + order = ((ByteBuffer)buffer).order(); + } + else if (buffer instanceof CharBuffer) { + bType = Type.CHAR; + direct = ((CharBuffer)buffer).isDirect(); + order = ((CharBuffer)buffer).order(); + } + else if (buffer instanceof ShortBuffer) { + bType = Type.SHORT; + direct = ((ShortBuffer)buffer).isDirect(); + order = ((ShortBuffer)buffer).order(); + } + else if (buffer instanceof IntBuffer) { + bType = Type.INT; + direct = ((IntBuffer)buffer).isDirect(); + order = ((IntBuffer)buffer).order(); + } + else if (buffer instanceof LongBuffer) { + bType = Type.LONG; + direct = ((LongBuffer)buffer).isDirect(); + order = ((LongBuffer)buffer).order(); + } + else if (buffer instanceof FloatBuffer) { + bType = Type.FLOAT; + direct = ((FloatBuffer)buffer).isDirect(); + order = ((FloatBuffer)buffer).order(); + } + else if (buffer instanceof DoubleBuffer) { + bType = Type.DOUBLE; + direct = ((DoubleBuffer)buffer).isDirect(); + order = ((DoubleBuffer)buffer).order(); + } + else { + bType = Type.UNKNOWN; + } + + // Verify that the buffer is direct and has the correct byte order + if (buffer != null) { + if (!direct) { + throw new IllegalArgumentException(J3dI18N.getString("J3DBuffer1")); + } + + if (order != ByteOrder.nativeOrder()) { + throw new IllegalArgumentException(J3dI18N.getString("J3DBuffer2")); + } + } + + bufferType = bType; + originalBuffer = buffer; + + // Make a read-only view of the buffer if the type is one + // of the internally supported types: byte, float, or double + switch (bufferType) { + case BYTE: + ByteBuffer byteBuffer = ((ByteBuffer)buffer).asReadOnlyBuffer(); + byteBuffer.rewind(); + readonlyBuffer = byteBuffer; + break; + case FLOAT: + FloatBuffer floatBuffer = ((FloatBuffer)buffer).asReadOnlyBuffer(); + floatBuffer.rewind(); + readonlyBuffer = floatBuffer; + break; + case DOUBLE: + DoubleBuffer doubleBuffer = ((DoubleBuffer)buffer).asReadOnlyBuffer(); + doubleBuffer.rewind(); + readonlyBuffer = doubleBuffer; + break; + default: + readonlyBuffer = null; + } + } + + + /** + * Retrieves the NIO buffer object from this J3DBuffer. + * + * @return the current NIO buffer wrapped by this J3DBuffer + */ + public Buffer getBuffer() { + return originalBuffer; + } + +/** + * Gets the readonly view of the nio buffer we wrapped with J3DBuffer + * @return + */ +Buffer getROBuffer() { + return readonlyBuffer; +} +} |