/** * Copyright (c) 2003-2009, Xith3D Project Group all rights reserved. * * Portions based on the Java3D interface, Copyright by Sun Microsystems. * Many thanks to the developers of Java3D and Sun Microsystems for their * innovation and design. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the 'Xith3D Project Group' nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) A * RISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE */ package org.xith3d.scenegraph; import java.awt.image.BufferedImage; import java.nio.ByteBuffer; import org.jagatoo.loaders.textures.pixelprocessing.PixelProcessor; import org.jagatoo.opengl.enums.TextureImageFormat; /** * {@link TextureImage3D} is the 3D implementation to {@link TextureImage} * (used in 3D texturing, see Texture3D(Coord)Test) * * @author David Yazel */ public class TextureImage3D extends TextureImage { /** * The desired depth. */ private final int depth; /** * The byte buffers for the image data. */ private ByteBuffer dataBuffer = null; /** * gets the depth */ public final int getDepth() { return ( depth ); } /** * {@inheritDoc} */ public final ByteBuffer getDataBuffer() { return ( dataBuffer ); } /** * {@inheritDoc} */ public final int getPixelSize() { return ( getDataBuffer().limit() / ( getWidth() * getHeight() * getDepth() ) ); } public int initImageData() { int imageSize = calculateNeededImageSize(); if ( this.dataBuffer == null ) this.dataBuffer = ByteBuffer.allocateDirect( imageSize * depth ); return ( imageSize ); } /** * Sets the data for the image */ public final void setImageData( byte[][] data ) { int imageSize = initImageData(); for ( int loop = 0; loop < data.length; loop++ ) { dataBuffer.put( data[ loop ], 0, imageSize ); } dataBuffer.flip(); } public void setImageData( BufferedImage[] images ) { initImageData(); PixelProcessor pp = PixelProcessor.selectPixelProcessor( this.getFormat() ); int dataOffset = 0; for ( int i = 0; i < images.length; i++ ) { dataOffset += pp.readImageData( images[ i ], 0, 0, getWidth(), getHeight(), dataBuffer, dataOffset, false ); } } public void setImageData( TextureImage2D[] images ) { initImageData(); byte[] bytes = null; for ( int i = 0; i < images.length; i++ ) { ByteBuffer srcBuffer = images[i].getDataBuffer(); if ( srcBuffer == null ) { if ( bytes == null ) bytes = new byte[ images[i].getDataSize() ]; images[i].getData( bytes ); dataBuffer.put( bytes ); } else { int pos = srcBuffer.position(); srcBuffer.position( 0 ); dataBuffer.put( images[i].getDataBuffer() ); srcBuffer.position( pos ); } } dataBuffer.flip(); } /** * {@inheritDoc} */ @Override protected void duplicateNodeComponent( NodeComponent original, boolean forceDuplicate ) { //super.duplicateNodeComponent( original, forceDuplicate ); throw new UnsupportedOperationException( "Not implemented yet" ); } /** * {@inheritDoc} */ @Override public TextureImage3D cloneNodeComponent( boolean forceDuplicate ) { throw new UnsupportedOperationException( "Not implemented yet" ); } /** * Constructs a new {@link TextureImage3D} object. */ public TextureImage3D( TextureImageFormat format, int width, int height, int depth ) { super( format, width, height, width, height ); this.depth = depth; } /** * Constructs a new {@link TextureImage3D} object. */ public TextureImage3D( TextureImageFormat format, int width, int height, int depth, byte[][] data ) { this( format, width, height, depth ); setImageData( data ); } /** * Constructs a new {@link TextureImage3D} object. */ public TextureImage3D( TextureImageFormat format, int width, int height, int depth, BufferedImage[] image ) { this( format, width, height, depth ); setImageData( image ); } /** * Constructs a new {@link TextureImage3D} object. */ public TextureImage3D( TextureImageFormat format, int width, int height, int depth, TextureImage2D[] image ) { this( format, width, height, depth ); setImageData( image ); } }