From 7a2e20caac9db6f789a7b3fab344b9758af45335 Mon Sep 17 00:00:00 2001
From: Harvey Harrison
+ * Each Texture object has the following properties:
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * j0 = trunc(v - 0.5)
+ * i1 = i0 + 1
+ * j1 = j0 + 1
+ * a = frac(u - 0.5)
+ * b = frac(v - 0.5)
+ * T' = (1-a)*(1-b)*Ti0j0 + + * a*(1-b)*Ti1j0 + + * (1-a)*b*Ti0j1 + + * a*b*Ti1j1
+ *
+ *
+ *
+ *
+ *
i1 = trunc(u - 0.5) | + *i2 = i1 + 1 | + *i3 = i2 + 1 | + *i0 = i1 - 1 | + *
j1 = trunc(v - 0.5) | + *j3 = j2 + 1 | + *j2 = j1 + 1 | + *j0 = j1 - 1 | + *
a = frac(u - 0.5) | + *|||
b = frac(v - 0.5) | + *
+ * T' = f(1+a) * f(1+b) * Ti0j0 +
+ * f(a) * f(1+b) * Ti1j0 +
+ * f(1-a) * f(1+b) * Ti2j0 +
+ * f(2-a) * f(1+b) * Ti3j0 +
+ * f(1+a) * f(b) * Ti0j1 +
+ * f(a) * f(b) * Ti1j1 +
+ * f(1-a) * f(b) * Ti2j1 +
+ * f(2-a) * f(b) * Ti3j1 +
+ * f(1+a) * f(1-b) * Ti0j2 +
+ * f(a) * f(1-b) * Ti1j2 +
+ * f(1-a) * f(1-b) * Ti2j2 +
+ * f(2-a) * f(1-b) * Ti3j2 +
+ * f(1+a) * f(2-b) * Ti0j3 +
+ * f(a) * f(2-b) * Ti1j3 +
+ * f(1-a) * f(2-b) * Ti2j3 +
+ * f(2-a) * f(2-b) * Ti3j3
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * + * + *
+ * Note that as of Java 3D 1.5, the texture width and height are no longer + * required to be an exact power of two. However, not all graphics devices + * supports non-power-of-two textures. If non-power-of-two texture mapping is + * unsupported on a particular Canvas3D, textures with a width or height that + * are not an exact power of two are ignored for that canvas. + * + * @see Canvas3D#queryProperties + */ +public abstract class Texture extends NodeComponent { + /** + * Specifies that this Texture object allows reading its + * enable flag. + */ + public static final int + ALLOW_ENABLE_READ = CapabilityBits.TEXTURE_ALLOW_ENABLE_READ; + + /** + * Specifies that this Texture object allows writing its + * enable flag. + */ + public static final int + ALLOW_ENABLE_WRITE = CapabilityBits.TEXTURE_ALLOW_ENABLE_WRITE; + + /** + * Specifies that this Texture object allows reading its + * boundary mode information. + */ + public static final int + ALLOW_BOUNDARY_MODE_READ = CapabilityBits.TEXTURE_ALLOW_BOUNDARY_MODE_READ; + + /** + * Specifies that this Texture object allows reading its + * filter information. + */ + public static final int + ALLOW_FILTER_READ = CapabilityBits.TEXTURE_ALLOW_FILTER_READ; + + /** + * Specifies that this Texture object allows reading its + * image component information. + */ + public static final int + ALLOW_IMAGE_READ = CapabilityBits.TEXTURE_ALLOW_IMAGE_READ; + + /** + * Specifies that this Texture object allows writing its + * image component information. + * + * @since Java 3D 1.2 + */ + public static final int + ALLOW_IMAGE_WRITE = CapabilityBits.TEXTURE_ALLOW_IMAGE_WRITE; + + /** + * Specifies that this Texture object allows reading its + * format information. + * + * @since Java 3D 1.2 + */ + public static final int + ALLOW_FORMAT_READ = CapabilityBits.TEXTURE_ALLOW_FORMAT_READ; + + /** + * Specifies that this Texture object allows reading its + * size information (e.g., width, height, number of mipmap levels, + * boundary width). + * + * @since Java 3D 1.2 + */ + public static final int + ALLOW_SIZE_READ = CapabilityBits.TEXTURE_ALLOW_SIZE_READ; + + /** + * Specifies that this Texture object allows reading its + * mipmap mode information. + */ + public static final int + ALLOW_MIPMAP_MODE_READ = CapabilityBits.TEXTURE_ALLOW_MIPMAP_MODE_READ; + + /** + * Specifies that this Texture object allows reading its + * boundary color information. + */ + public static final int + ALLOW_BOUNDARY_COLOR_READ = CapabilityBits.TEXTURE_ALLOW_BOUNDARY_COLOR_READ; + + /** + * Specifies that this Texture object allows reading its LOD range + * information (e.g., base level, maximum level, minimum lod, + * maximum lod, lod offset) + * + * @since Java 3D 1.3 + */ + public static final int + ALLOW_LOD_RANGE_READ = CapabilityBits.TEXTURE_ALLOW_LOD_RANGE_READ; + + /** + * Specifies that this Texture object allows writing its LOD range + * information (e.g., base level, maximum level, minimum lod, + * maximum lod, lod offset) + * + * @since Java 3D 1.3 + */ + public static final int + ALLOW_LOD_RANGE_WRITE = CapabilityBits.TEXTURE_ALLOW_LOD_RANGE_WRITE; + + + /** + * Specifies that this Texture object allows reading its anistropic + * filter information (e.g., anisotropic mode, anisotropic filter) + * + * @since Java 3D 1.3 + */ + public static final int + ALLOW_ANISOTROPIC_FILTER_READ = CapabilityBits.TEXTURE_ALLOW_ANISOTROPIC_FILTER_READ; + + /** + * Specifies that this Texture object allows reading its sharpen + * texture function information. + * + * @since Java 3D 1.3 + */ + public static final int + ALLOW_SHARPEN_TEXTURE_READ = CapabilityBits.TEXTURE_ALLOW_SHARPEN_TEXTURE_READ; + + /** + * Specifies that this Texture object allows reading its filter4 + * function information. + * + * @since Java 3D 1.3 + */ + public static final int + ALLOW_FILTER4_READ = CapabilityBits.TEXTURE_ALLOW_FILTER4_READ; + + + /** + * Uses the fastest available method for processing geometry. + * This value can be used as a parameter to setMinFilter and + * setMagFilter. + * @see #setMinFilter + * @see #setMagFilter + */ + public static final int FASTEST = 0; + /** + * Uses the nicest available method for processing geometry. + * This value can be used as a parameter to setMinFilter and + * setMagFilter. + * @see #setMinFilter + * @see #setMagFilter + */ + public static final int NICEST = 1; + + /** + * Select the nearest texel in level 0 texture map. + * Maps to NEAREST. + * @see #setMinFilter + * @see #setMagFilter + */ + public static final int BASE_LEVEL_POINT = 2; + + /** + * Performs bilinear interpolation on the four nearest texels + * in level 0 texture map. + * Maps to LINEAR. + * @see #setMinFilter + * @see #setMagFilter + */ + public static final int BASE_LEVEL_LINEAR = 3; + + /** + * Selects the nearest texel in the nearest mipmap. + * Maps to NEAREST_MIPMAP_NEAREST. + * @see #setMinFilter + */ + public static final int MULTI_LEVEL_POINT = 4; + + /** + * Performs tri-linear interpolation of texels between four + * texels each from two nearest mipmap levels. + * Maps to LINEAR_MIPMAP_LINEAR, but an implementation can + * fall back to LINEAR_MIPMAP_NEAREST or NEAREST_MIPMAP_LINEAR. + * @see #setMinFilter + */ + public static final int MULTI_LEVEL_LINEAR = 5; + + // NOTE: values 6, 7, and 8 are reserved for the LINEAR_DETAIL* + // filter modes in Texture2D + + /** + * Sharpens the resulting image by extrapolating + * from the base level plus one image to the base level image of this + * texture object. + * + * @since Java 3D 1.3 + * @see #setMagFilter + */ + public static final int LINEAR_SHARPEN = 9; + + /** + * Performs linear sharpen filter for the rgb + * components only. The alpha component is computed using + * BASE_LEVEL_LINEAR filter. + * + * @since Java 3D 1.3 + * @see #setMagFilter + */ + public static final int LINEAR_SHARPEN_RGB = 10; + + /** + * Performs linear sharpen filter for the alpha + * component only. The rgb components are computed using + * BASE_LEVEL_LINEAR filter. + * + * @since Java 3D 1.3 + * @see #setMagFilter + */ + public static final int LINEAR_SHARPEN_ALPHA = 11; + + /** + * Applies an application-supplied weight function + * on the nearest 4x4 texels in the base level texture image. + * + * @since Java 3D 1.3 + * @see #setMinFilter + * @see #setMagFilter + */ + public static final int FILTER4 = 12; + + // Texture boundary mode parameter values + /** + * Clamps texture coordinates to be in the range [0, 1]. + * Texture boundary texels or the constant boundary color if boundary + * width is 0 will be used for U,V values that fall + * outside this range. + */ + public static final int CLAMP = 2; + /** + * Repeats the texture by wrapping texture coordinates that are outside + * the range [0,1]. Only the fractional portion of the texture + * coordinates is used; the integer portion is discarded. + */ + public static final int WRAP = 3; + /** + * Clamps texture coordinates such that filtering + * will not sample a texture boundary texel. Texels at the edge of the + * texture will be used instead. + * + * @since Java 3D 1.3 + */ + public static final int CLAMP_TO_EDGE = 4; + /** + * Clamps texture coordinates such that filtering + * will sample only texture boundary texels. If the texture does not + * have a boundary, that is the boundary width is equal to 0, then the + * constant boundary color will be used.
+ * + * @since Java 3D 1.3 + */ + public static final int CLAMP_TO_BOUNDARY = 5; + + + /** + * Indicates that Texture object only has one level. If multiple + * levels are needed, they will be implicitly computed. + */ + public static final int BASE_LEVEL = 1; + + /** + * Indicates that this Texture object has multiple images, one for + * each mipmap level. In this mode, there are + *log2(max(width,height))+1
+ * separate images.
+ */
+ public static final int MULTI_LEVEL_MIPMAP = 2;
+
+ // Texture format parameter values
+
+ /**
+ * Specifies Texture contains only Intensity values.
+ */
+ public static final int INTENSITY = 1;
+
+ /**
+ * Specifies Texture contains only luminance values.
+ */
+ public static final int LUMINANCE = 2;
+
+ /**
+ * Specifies Texture contains only Alpha values.
+ */
+ public static final int ALPHA = 3;
+
+ /**
+ * Specifies Texture contains Luminance and Alpha values.
+ */
+ public static final int LUMINANCE_ALPHA = 4;
+
+ /**
+ * Specifies Texture contains Red, Green and Blue color values.
+ */
+ public static final int RGB = 5;
+
+ /**
+ * Specifies Texture contains Red, Green, Blue color values
+ * and Alpha value.
+ */
+ public static final int RGBA = 6;
+
+ /**
+ * No anisotropic filter.
+ *
+ * @since Java 3D 1.3
+ * @see #setAnisotropicFilterMode
+ */
+ public static final int ANISOTROPIC_NONE = 0;
+
+ /**
+ * Uses the degree of anisotropy in both the minification and
+ * magnification filters.
+ *
+ * @since Java 3D 1.3
+ * @see #setAnisotropicFilterMode
+ */
+ public static final int ANISOTROPIC_SINGLE_VALUE = 1;
+
+ // Array for setting default read capabilities
+ private static final int[] readCapabilities = {
+ ALLOW_ANISOTROPIC_FILTER_READ,
+ ALLOW_BOUNDARY_COLOR_READ,
+ ALLOW_BOUNDARY_MODE_READ,
+ ALLOW_ENABLE_READ,
+ ALLOW_FILTER4_READ,
+ ALLOW_FILTER_READ,
+ ALLOW_FORMAT_READ,
+ ALLOW_IMAGE_READ,
+ ALLOW_LOD_RANGE_READ,
+ ALLOW_MIPMAP_MODE_READ,
+ ALLOW_SHARPEN_TEXTURE_READ,
+ ALLOW_SIZE_READ
+ };
+
+ /**
+ * Constructs a Texture object with default parameters.
+ * The default values are as follows:
+ * log2(max(width,height))
+ * Note that the default constructor creates a texture object with
+ * a width and height of 0 and is, therefore, not useful.
+ */
+ public Texture() {
+ // Just use default values
+ // set default read capabilities
+ setDefaultReadCapabilities(readCapabilities);
+ }
+
+ /**
+ * Constructs an empty Texture object with specified mipMapMode,
+ * format, width and height. Defaults are used for all other
+ * parameters. If mipMapMode
is set to
+ * BASE_LEVEL
, then the image at level 0 must be set
+ * by the application (using either the setImage
or
+ * setImages
method). If mipMapMode
is
+ * set to MULTI_LEVEL_MIPMAP
, then images for levels
+ * Base Level through Maximum Level must be set.
+ * Note that a texture with a non-power-of-two width or height will
+ * only be rendered on a graphics device that supports non-power-of-two
+ * textures.
+ *
+ * @param mipMapMode type of mipmap for this Texture: one of
+ * BASE_LEVEL, MULTI_LEVEL_MIPMAP
+ * @param format data format of Textures saved in this object.
+ * One of INTENSITY, LUMINANCE, ALPHA, LUMINANCE_ALPHA, RGB, RGBA
+ * @param width width of image at level 0.
+ * @param height height of image at level 0.
+ * @exception IllegalArgumentException if width or height are not greater
+ * than 0, or if an invalid format or mipMapMode is specified.
+ */
+ public Texture(int mipMapMode,
+ int format,
+ int width,
+ int height) {
+
+ // set default read capabilities
+ setDefaultReadCapabilities(readCapabilities);
+
+ if ((mipMapMode != BASE_LEVEL) && (mipMapMode != MULTI_LEVEL_MIPMAP))
+ throw new IllegalArgumentException(J3dI18N.getString("Texture0"));
+
+ if ((format != INTENSITY) && (format != LUMINANCE) &&
+ (format != ALPHA) && (format != LUMINANCE_ALPHA) &&
+ (format != RGB) && (format != RGBA)) {
+ throw new IllegalArgumentException(J3dI18N.getString("Texture1"));
+ }
+
+ if (width < 1) {
+ throw new IllegalArgumentException(J3dI18N.getString("Texture46"));
+ }
+
+ if (height < 1) {
+ throw new IllegalArgumentException(J3dI18N.getString("Texture47"));
+ }
+
+ int widthLevels;
+ int heightLevels;
+
+ widthLevels = getLevelsNPOT(width);
+ heightLevels = getLevelsNPOT(height);
+
+ ((TextureRetained)this.retained).initialize(format, width, widthLevels,
+ height, heightLevels, mipMapMode, 0);
+ }
+
+ /**
+ * Constructs an empty Texture object with specified mipMapMode,
+ * format, width, height, and boundaryWidth.
+ * Defaults are used for all other
+ * parameters. If mipMapMode
is set to
+ * BASE_LEVEL
, then the image at level 0 must be set
+ * by the application (using either the setImage
or
+ * setImages
method). If mipMapMode
is
+ * set to MULTI_LEVEL_MIPMAP
, then images for levels
+ * Base Level through Maximum Level must be set.
+ * Note that a texture with a non-power-of-two width or height will
+ * only be rendered on a graphics device that supports non-power-of-two
+ * textures.
+ *
+ * @param mipMapMode type of mipmap for this Texture: one of
+ * BASE_LEVEL, MULTI_LEVEL_MIPMAP
+ * @param format data format of Textures saved in this object.
+ * One of INTENSITY, LUMINANCE, ALPHA, LUMINANCE_ALPHA, RGB, RGBA
+ * @param width width of image at level 0. This
+ * does not include the width of the boundary.
+ * @param height height of image at level 0. This
+ * does not include the width of the boundary.
+ * @param boundaryWidth width of the boundary, which must be 0 or 1.
+ * @exception IllegalArgumentException if width or height are not greater
+ * than 0, if an invalid format or mipMapMode is specified, or
+ * if the boundaryWidth is < 0 or > 1
+ *
+ * @since Java 3D 1.3
+ */
+ public Texture(int mipMapMode,
+ int format,
+ int width,
+ int height,
+ int boundaryWidth) {
+
+ // set default read capabilities
+ setDefaultReadCapabilities(readCapabilities);
+
+ if ((mipMapMode != BASE_LEVEL) && (mipMapMode != MULTI_LEVEL_MIPMAP))
+ throw new IllegalArgumentException(J3dI18N.getString("Texture0"));
+
+ if ((format != INTENSITY) && (format != LUMINANCE) &&
+ (format != ALPHA) && (format != LUMINANCE_ALPHA) &&
+ (format != RGB) && (format != RGBA)) {
+ throw new IllegalArgumentException(J3dI18N.getString("Texture1"));
+ }
+
+ if (width < 1) {
+ throw new IllegalArgumentException(J3dI18N.getString("Texture46"));
+ }
+
+ if (height < 1) {
+ throw new IllegalArgumentException(J3dI18N.getString("Texture47"));
+ }
+
+ int widthLevels;
+ int heightLevels;
+
+ widthLevels = getLevelsNPOT(width);
+ heightLevels = getLevelsNPOT(height);
+
+ if (boundaryWidth < 0 || boundaryWidth > 1)
+ throw new IllegalArgumentException(J3dI18N.getString("Texture30"));
+
+ ((TextureRetained)this.retained).initialize(format, width, widthLevels,
+ height, heightLevels, mipMapMode, boundaryWidth);
+ }
+
+ /**
+ * Sets the boundary mode for the S coordinate in this texture object.
+ * @param boundaryModeS the boundary mode for the S coordinate.
+ * One of: CLAMP, WRAP, CLAMP_TO_EDGE, or CLAMP_TO_BOUNDARY.
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ * @exception IllegalArgumentException if boundaryModeS
+ * is a value other than CLAMP
, WRAP
,
+ * CLAMP_TO_EDGE
, or CLAMP_TO_BOUNDARY
.
+ */
+ public void setBoundaryModeS(int boundaryModeS) {
+ checkForLiveOrCompiled();
+ switch (boundaryModeS) {
+ case Texture.CLAMP:
+ case Texture.WRAP:
+ case Texture.CLAMP_TO_EDGE:
+ case Texture.CLAMP_TO_BOUNDARY:
+ break;
+ default:
+ throw new IllegalArgumentException(J3dI18N.getString("Texture31"));
+ }
+ ((TextureRetained)this.retained).initBoundaryModeS(boundaryModeS);
+ }
+
+ /**
+ * Retrieves the boundary mode for the S coordinate.
+ * @return the current boundary mode for the S coordinate.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public int getBoundaryModeS() {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ALLOW_BOUNDARY_MODE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture4"));
+ return ((TextureRetained)this.retained).getBoundaryModeS();
+ }
+
+ /**
+ * Sets the boundary mode for the T coordinate in this texture object.
+ * @param boundaryModeT the boundary mode for the T coordinate.
+ * One of: CLAMP, WRAP, CLAMP_TO_EDGE, or CLAMP_TO_BOUNDARY.
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ * @exception IllegalArgumentException if boundaryModeT
+ * is a value other than CLAMP
, WRAP
,
+ * CLAMP_TO_EDGE
, or CLAMP_TO_BOUNDARY
.
+ */
+ public void setBoundaryModeT(int boundaryModeT) {
+ checkForLiveOrCompiled();
+ switch (boundaryModeT) {
+ case Texture.CLAMP:
+ case Texture.WRAP:
+ case Texture.CLAMP_TO_EDGE:
+ case Texture.CLAMP_TO_BOUNDARY:
+ break;
+ default:
+ throw new IllegalArgumentException(J3dI18N.getString("Texture31"));
+ }
+ ((TextureRetained)this.retained).initBoundaryModeT(boundaryModeT);
+ }
+
+ /**
+ * Retrieves the boundary mode for the T coordinate.
+ * @return the current boundary mode for the T coordinate.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public int getBoundaryModeT() {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ALLOW_BOUNDARY_MODE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture4"));
+ return ((TextureRetained)this.retained).getBoundaryModeT();
+ }
+
+ /**
+ * Sets the minification filter function. This
+ * function is used when the pixel being rendered maps to an area
+ * greater than one texel.
+ * @param minFilter the minification filter. One of:
+ * FASTEST, NICEST, BASE_LEVEL_POINT, BASE_LEVEL_LINEAR,
+ * MULTI_LEVEL_POINT, MULTI_LEVEL_LINEAR, or FILTER4
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ * @exception IllegalArgumentException if minFilter
+ * is a value other than FASTEST
, NICEST
,
+ * BASE_LEVEL_POINT
, BASE_LEVEL_LINEAR
,
+ * MULTI_LEVEL_POINT
, MULTI_LEVEL_LINEAR
, or
+ * FILTER4
.
+ *
+ * @see Canvas3D#queryProperties
+ */
+ public void setMinFilter(int minFilter) {
+ checkForLiveOrCompiled();
+
+ switch (minFilter) {
+ case FASTEST:
+ case NICEST:
+ case BASE_LEVEL_POINT:
+ case BASE_LEVEL_LINEAR:
+ case MULTI_LEVEL_POINT:
+ case MULTI_LEVEL_LINEAR:
+ case FILTER4:
+ break;
+ default:
+ throw new IllegalArgumentException(J3dI18N.getString("Texture28"));
+ }
+
+ ((TextureRetained)this.retained).initMinFilter(minFilter);
+ }
+
+ /**
+ * Retrieves the minification filter.
+ * @return the current minification filter function.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public int getMinFilter() {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ALLOW_FILTER_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture6"));
+ return ((TextureRetained)this.retained).getMinFilter();
+ }
+
+ /**
+ * Sets the magnification filter function. This
+ * function is used when the pixel being rendered maps to an area
+ * less than or equal to one texel.
+ * @param magFilter the magnification filter, one of:
+ * FASTEST, NICEST, BASE_LEVEL_POINT, BASE_LEVEL_LINEAR,
+ * LINEAR_SHARPEN, LINEAR_SHARPEN_RGB, LINEAR_SHARPEN_ALPHA, or FILTER4.
+ *
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ * @exception IllegalArgumentException if magFilter
+ * is a value other than FASTEST
, NICEST
,
+ * BASE_LEVEL_POINT
, BASE_LEVEL_LINEAR
,
+ * LINEAR_SHARPEN
, LINEAR_SHARPEN_RGB
,
+ * LINEAR_SHARPEN_ALPHA
, or
+ * FILTER4
.
+ *
+ * @see Canvas3D#queryProperties
+ */
+ public void setMagFilter(int magFilter) {
+ checkForLiveOrCompiled();
+
+ switch (magFilter) {
+ case FASTEST:
+ case NICEST:
+ case BASE_LEVEL_POINT:
+ case BASE_LEVEL_LINEAR:
+ case LINEAR_SHARPEN:
+ case LINEAR_SHARPEN_RGB:
+ case LINEAR_SHARPEN_ALPHA:
+ case FILTER4:
+ break;
+ default:
+ throw new IllegalArgumentException(J3dI18N.getString("Texture29"));
+ }
+
+ ((TextureRetained)this.retained).initMagFilter(magFilter);
+ }
+
+ /**
+ * Retrieves the magnification filter.
+ * @return the current magnification filter function.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public int getMagFilter() {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ALLOW_FILTER_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture6"));
+ return ((TextureRetained)this.retained).getMagFilter();
+ }
+
+ /**
+ * Sets the image for a specified mipmap level. Note that the image size
+ * must be the correct size for the specified mipmap level. The image size
+ * of the base level image, that is level 0, must be the same size
+ * in each dimension (width, height, depth) as this
+ * texture, excluding the border, if any.
+ * Each successive mipmap level must be 1/2 the size of the previous level,
+ * such that size[n] = floor(size[n-1]/2)
, exluding
+ * the border.
+ *
+ * @param level mipmap level to set: 0 is the base level
+ * @param image ImageComponent object containing the texture image
+ * for the specified mipmap level
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalArgumentException if an ImageComponent3D is
+ * used in a Texture2D object or if an ImageComponent2D is used in a
+ * Texture3D object.
+ *
+ * @exception IllegalArgumentException if the image being set at this
+ * level is not the correct size for this level.
+ *
+ * @exception IllegalSharingException if this Texture is live and
+ * the specified image is being used by a Canvas3D as an off-screen buffer.
+ *
+ * @exception IllegalSharingException if this Texture is
+ * being used by an immediate mode context and
+ * the specified image is being used by a Canvas3D as an off-screen buffer.
+ */
+ public void setImage(int level, ImageComponent image) {
+ if (isLiveOrCompiled()) {
+ if(!this.getCapability(ALLOW_IMAGE_WRITE))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture15"));
+ }
+
+ // Do illegal sharing check
+ validateImageIllegalSharing(image);
+
+ if (isLive())
+ ((TextureRetained)this.retained).setImage(level, image);
+ else
+ ((TextureRetained)this.retained).initImage(level, image);
+ }
+
+ /**
+ * Retrieves the image for a specified mipmap level.
+ * @param level mipmap level to get: 0 is the base level
+ * @return the ImageComponent object containing the texture image at
+ * the specified mipmap level.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public ImageComponent getImage(int level) {
+ if (isLiveOrCompiled()) {
+ if(!this.getCapability(ALLOW_IMAGE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture9"));
+ }
+
+ return ((TextureRetained)this.retained).getImage(level);
+ }
+
+ /**
+ * Sets the array of images for all mipmap levels. Note that the image size
+ * of the base level image, images[0]
, must be the same size
+ * in each dimension (width, height, depth) as this
+ * texture, excluding the border, if any.
+ * Each successive mipmap level must be 1/2 the size of the previous level,
+ * such that size[n] = floor(size[n-1]/2)
, exluding
+ * the border.
+ *
+ * @param images array of ImageComponent objects
+ * containing the texture images for all mipmap levels
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @exception IllegalArgumentException if an ImageComponent3D is
+ * used in a Texture2D object or if an ImageComponent2D is used in a
+ * Texture3D object.
+ *
+ * @exception IllegalArgumentException if images.length
is
+ * not equal to the total number of mipmap levels.
+ *
+ * @exception IllegalArgumentException if the size of each dimension
+ * of the image at a given level in the
+ * images
array is not the correct size.
+ *
+ * @exception IllegalSharingException if this Texture is live and
+ * any of the specified images are being used by a Canvas3D as an
+ * off-screen buffer.
+ *
+ * @exception IllegalSharingException if this Texture is
+ * being used by an immediate mode context and
+ * any of the specified images are being used by a Canvas3D as an
+ * off-screen buffer.
+ *
+ * @since Java 3D 1.2
+ */
+ public void setImages(ImageComponent[] images) {
+ if (isLiveOrCompiled()) {
+ if(!this.getCapability(ALLOW_IMAGE_WRITE))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture15"));
+ }
+
+ // Do illegal sharing check
+ for(int i=0; iMULTI_LEVEL_MIPMAP
; otherwise it returns 1.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.2
+ */
+ public int numMipMapLevels() {
+ if (isLiveOrCompiled()) {
+ if(!this.getCapability(ALLOW_SIZE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture18"));
+ }
+ return ((TextureRetained)this.retained).numMipMapLevels();
+ }
+
+ /**
+ * Sets mipmap mode for texture mapping for this texture object.
+ * @param mipMapMode the new mipmap mode for this object. One of:
+ * BASE_LEVEL or MULTI_LEVEL_MIPMAP.
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ * @exception IllegalArgumentException if mipMapMode
+ * is a value other than BASE_LEVEL
or
+ * MULTI_LEVEL_MIPMAP
.
+ */
+ public void setMipMapMode(int mipMapMode) {
+ checkForLiveOrCompiled();
+ ((TextureRetained)this.retained).initMipMapMode(mipMapMode);
+ }
+
+ /**
+ * Retrieves current mipmap mode.
+ * @return current mipmap mode of this texture object.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public int getMipMapMode() {
+ if (isLiveOrCompiled())
+ if(!this.getCapability(ALLOW_MIPMAP_MODE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture10"));
+ return ((TextureRetained)this.retained).getMipMapMode();
+ }
+
+ /**
+ * Enables or disables texture mapping for this
+ * appearance component object.
+ * @param state true or false to enable or disable texture mapping
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public void setEnable(boolean state) {
+ if (isLiveOrCompiled()) {
+ if(!this.getCapability(ALLOW_ENABLE_WRITE))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture11"));
+ }
+ if (isLive())
+ ((TextureRetained)this.retained).setEnable(state);
+ else
+ ((TextureRetained)this.retained).initEnable(state);
+
+ }
+
+ /**
+ * Retrieves the state of the texture enable flag.
+ * @return true if texture mapping is enabled,
+ * false if texture mapping is disabled
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public boolean getEnable() {
+ if (isLiveOrCompiled()) {
+ if(!this.getCapability(ALLOW_ENABLE_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture12"));
+ }
+ return ((TextureRetained)this.retained).getEnable();
+ }
+
+ // Internal j3d usage method
+ // Returns n if num is 2**n
+ // Returns -1 if num is 0 or negative or if
+ // num is NOT power of 2.
+ // NOTE: ********** Assumes 32 bit integer******************
+ static int getPowerOf2(int num) {
+
+ int i, tmp;
+ // Can only handle positive numbers, return error.
+ if (num < 1) return -1;
+
+ for (i=0, tmp = num; i < 32;i++) {
+ // Check if leftmost bit is 1
+ if ((tmp & 0x80000000) != 0) {
+ //Check if any other bit is 1
+ if ((tmp & 0x7fffffff) == 0)
+ return 31-i;//valid power of 2 integer
+ else
+ return -1;//invalid non-power-of-2 integer
+ }
+ tmp <<= 1;
+ }
+ //Can't reach here because we have already checked for 0
+ return -1;
+ }
+
+ // returns number of levels using NPOT rules for mipmap generation
+ // which say that each level should be floor(size/2) of previous level
+ static int getLevelsNPOT(int num) {
+ int tmp, levels = 0;
+ tmp = num;
+ while (tmp > 1) {
+ tmp = tmp / 2;
+ levels++;
+ }
+ return levels;
+ }
+
+ /**
+ * Sets the texture boundary color for this texture object. The
+ * texture boundary color is used when boundaryModeS or boundaryModeT
+ * is set to CLAMP or CLAMP_TO_BOUNDARY and if texture boundary is not
+ * specified.
+ * @param boundaryColor the new texture boundary color.
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ */
+ public void setBoundaryColor(Color4f boundaryColor) {
+ checkForLiveOrCompiled();
+ ((TextureRetained)this.retained).initBoundaryColor(boundaryColor);
+ }
+
+ /**
+ * Sets the texture boundary color for this texture object. The
+ * texture boundary color is used when boundaryModeS or boundaryModeT
+ * is set to CLAMP or CLAMP_TO_BOUNDARY and if texture boundary is not
+ * specified.
+ * @param r the red component of the color.
+ * @param g the green component of the color.
+ * @param b the blue component of the color.
+ * @param a the alpha component of the color.
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ */
+ public void setBoundaryColor(float r, float g, float b, float a) {
+ checkForLiveOrCompiled();
+ ((TextureRetained)this.retained).initBoundaryColor(r, g, b, a);
+ }
+
+ /**
+ * Retrieves the texture boundary color for this texture object.
+ * @param boundaryColor the vector that will receive the
+ * current texture boundary color.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ */
+ public void getBoundaryColor(Color4f boundaryColor) {
+ if (isLiveOrCompiled()) {
+ if(!this.getCapability(ALLOW_BOUNDARY_COLOR_READ))
+ throw new CapabilityNotSetException(J3dI18N.getString("Texture13"));
+ }
+ ((TextureRetained)this.retained).getBoundaryColor(boundaryColor);
+ }
+
+ /**
+ * Specifies the base level for this texture object.
+ * @param baseLevel index of the lowest defined mipmap level.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ * @exception IllegalArgumentException if specified baseLevel < 0, or
+ * if baseLevel > maximumLevel
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setBaseLevel(int baseLevel) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_WRITE)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture32"));
+ }
+ }
+
+ if (isLive()) {
+ ((TextureRetained)this.retained).setBaseLevel(baseLevel);
+ } else {
+ ((TextureRetained)this.retained).initBaseLevel(baseLevel);
+ }
+ }
+
+ /**
+ * Retrieves the base level for this texture object.
+ * @return base level for this texture object.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public int getBaseLevel() {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture34"));
+ }
+ }
+ return ((TextureRetained)this.retained).getBaseLevel();
+ }
+
+ /**
+ * Specifies the maximum level for this texture object.
+ * @param maximumLevel index of the highest defined mipmap level.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ * @exception IllegalArgumentException if specified
+ * maximumLevel < baseLevel, or
+ * if maximumLevel > log2(max(width,height))
+ * @exception IllegalArgumentException if mipMipMapMode is equal to BASE_LEVEL
+ * and maximumLevel is not equal to zero.
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setMaximumLevel(int maximumLevel) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_WRITE)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture33"));
+ }
+ }
+
+ if (isLive()) {
+ ((TextureRetained)this.retained).setMaximumLevel(maximumLevel);
+ } else {
+ ((TextureRetained)this.retained).initMaximumLevel(maximumLevel);
+ }
+ }
+
+ /**
+ * Retrieves the maximum level for this texture object.
+ * @return maximum level for this texture object.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public int getMaximumLevel() {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture35"));
+ }
+ }
+ return ((TextureRetained)this.retained).getMaximumLevel();
+ }
+
+ /**
+ * Specifies the minimum level-of-detail for this texture object.
+ * @param minimumLod the minimum level-of-detail.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ * @exception IllegalArgumentException if specified lod > maximum lod
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setMinimumLOD(float minimumLod) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_WRITE)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture38"));
+ }
+ }
+
+ if (isLive()) {
+ ((TextureRetained)this.retained).setMinimumLOD(minimumLod);
+ } else {
+ ((TextureRetained)this.retained).initMinimumLOD(minimumLod);
+ }
+ }
+
+ /**
+ * Retrieves the minimum level-of-detail for this texture object.
+ * @return the minimum level-of-detail
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public float getMinimumLOD() {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture40"));
+ }
+ }
+ return ((TextureRetained)this.retained).getMinimumLOD();
+ }
+
+ /**
+ * Specifies the maximum level-of-detail for this texture object.
+ * @param maximumLod the maximum level-of-detail.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ * @exception IllegalArgumentException if specified lod < minimum lod
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setMaximumLOD(float maximumLod) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_WRITE)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture39"));
+ }
+ }
+
+ if (isLive()) {
+ ((TextureRetained)this.retained).setMaximumLOD(maximumLod);
+ } else {
+ ((TextureRetained)this.retained).initMaximumLOD(maximumLod);
+ }
+ }
+
+ /**
+ * Retrieves the maximum level-of-detail for this texture object.
+ * @return the maximum level-of-detail
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public float getMaximumLOD() {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture41"));
+ }
+ }
+ return ((TextureRetained)this.retained).getMaximumLOD();
+ }
+
+ /**
+ * Specifies the LOD offset for this texture object.
+ * @param s the s component of the LOD offset
+ * @param t the t component of the LOD offset
+ * @param r the r component of the LOD offset
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setLodOffset(float s, float t, float r) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_WRITE)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture44"));
+ }
+ }
+
+ if (isLive()) {
+ ((TextureRetained)this.retained).setLodOffset(s, t, r);
+ } else {
+ ((TextureRetained)this.retained).initLodOffset(s, t, r);
+ }
+ }
+
+ /**
+ * Specifies the LOD offset for this texture object.
+ * @param offset the LOD offset
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setLodOffset(Tuple3f offset) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_WRITE)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture44"));
+ }
+ }
+
+ if (isLive()) {
+ ((TextureRetained)this.retained).setLodOffset(
+ offset.x, offset.y, offset.z);
+ } else {
+ ((TextureRetained)this.retained).initLodOffset(
+ offset.x, offset.y, offset.z);
+ }
+ }
+
+ /**
+ * Retrieves the LOD offset for this texture object.
+ * @param offset the vector that will receive the
+ * current LOD offset.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public void getLodOffset(Tuple3f offset) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_LOD_RANGE_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture45"));
+ }
+ }
+ ((TextureRetained)this.retained).getLodOffset(offset);
+ }
+
+ /**
+ * Specifies the anisotropic filter mode for this texture object.
+ * @param mode the anisotropic filter mode. One of
+ * ANISOTROPIC_NONE or ANISOTROPIC_SINGLE_VALUE.
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ * @exception IllegalArgumentException if
+ * mode
is a value other than
+ * ANISOTROPIC_NONE
or ANISOTROPIC_SINGLE_VALUE
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setAnisotropicFilterMode(int mode) {
+ checkForLiveOrCompiled();
+ if ((mode != ANISOTROPIC_NONE) &&
+ (mode != ANISOTROPIC_SINGLE_VALUE)) {
+ throw new IllegalArgumentException(
+ J3dI18N.getString("Texture25"));
+ }
+ ((TextureRetained)this.retained).initAnisotropicFilterMode(mode);
+ }
+
+ /**
+ * Retrieves the anisotropic filter mode for this texture object.
+ * @return the currrent anisotropic filter mode of this texture object.
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public int getAnisotropicFilterMode() {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_ANISOTROPIC_FILTER_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture26"));
+ }
+ }
+ return ((TextureRetained)this.retained).getAnisotropicFilterMode();
+ }
+
+ /**
+ * Specifies the degree of anisotropy to be
+ * used when the anisotropic filter mode specifies
+ * ANISOTROPIC_SINGLE_VALUE.
+ * @param degree degree of anisotropy
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ * @exception IllegalArgumentException if
+ * degree
< 1.0 or
+ * degree
> the maximum degree of anisotropy.
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setAnisotropicFilterDegree(float degree) {
+ checkForLiveOrCompiled();
+ if (degree < 1.0) {
+ throw new IllegalArgumentException(
+ J3dI18N.getString("Texture27"));
+ }
+ ((TextureRetained)this.retained).initAnisotropicFilterDegree(degree);
+ }
+
+ /**
+ * Retrieves the anisotropic filter degree for this texture object.
+ * @return the current degree of anisotropy of this texture object
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public float getAnisotropicFilterDegree() {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_ANISOTROPIC_FILTER_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture26"));
+ }
+ }
+ return ((TextureRetained)this.retained).getAnisotropicFilterDegree();
+ }
+
+ /**
+ * sets the sharpen texture LOD function for this texture object.
+ * @param lod array containing the level-of-detail values.
+ * @param pts array containing the function values for the corresponding
+ * level-of-detail values.
+ *
+ * @exception IllegalStateException if the length of lod
+ * does not match the length of pts
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setSharpenTextureFunc(float[] lod, float[] pts) {
+ checkForLiveOrCompiled();
+ if (((lod != null) && (pts != null) && (lod.length == pts.length)) ||
+ ((lod == null) && (pts == null))) {
+ ((TextureRetained)this.retained).initSharpenTextureFunc(lod, pts);
+ } else {
+ throw new IllegalStateException(
+ J3dI18N.getString("Texture22"));
+ }
+ }
+
+ /**
+ * sets the sharpen texture LOD function for this texture object.
+ * The Point2f x,y values are defined as follows: x is the lod value,
+ * y is the corresponding function value.
+ *
+ * @param pts array of Point2f containing the lod as well as the
+ * corresponding function value.
+ *
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setSharpenTextureFunc(Point2f[] pts) {
+ checkForLiveOrCompiled();
+ ((TextureRetained)this.retained).initSharpenTextureFunc(pts);
+ }
+
+ /**
+ * Gets the number of points in the sharpen texture LOD function for this
+ * texture object.
+ *
+ * @return the number of points in the sharpen texture LOD function.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public int getSharpenTextureFuncPointsCount() {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_SHARPEN_TEXTURE_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture21"));
+ }
+ }
+ return ((TextureRetained)this.retained).getSharpenTextureFuncPointsCount();
+ }
+
+ /**
+ * Copies the array of sharpen texture LOD function points into the
+ * specified arrays. The arrays must be large enough to hold all the
+ * points.
+ *
+ * @param lod the array to receive the level-of-detail values.
+ * @param pts the array to receive the function values for the
+ * corresponding level-of-detail values.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public void getSharpenTextureFunc(float[] lod, float[] pts) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_SHARPEN_TEXTURE_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture21"));
+ }
+ }
+ ((TextureRetained)this.retained).getSharpenTextureFunc(
+ lod, pts);
+ }
+
+ /**
+ * Copies the array of sharpen texture LOD function points including
+ * the lod values and the corresponding function values into the
+ * specified array. The array must be large enough to hold all the points.
+ * The individual array elements must be allocated by the caller as well.
+ *
+ * @param pts the array to receive the sharpen texture LOD function points
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public void getSharpenTextureFunc(Point2f[] pts) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_SHARPEN_TEXTURE_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture21"));
+ }
+ }
+ ((TextureRetained)this.retained).getSharpenTextureFunc(pts);
+ }
+
+ /**
+ * sets the filter4 function for this texture object.
+ * @param weights array containing samples of the filter4 function.
+ *
+ * @exception IllegalArgumentException if the length of
+ * weight
< 4
+ * @exception RestrictedAccessException if the method is called
+ * when this object is part of live or compiled scene graph.
+ *
+ * @since Java 3D 1.3
+ * @see Canvas3D#queryProperties
+ */
+ public void setFilter4Func(float[] weights) {
+ checkForLiveOrCompiled();
+ if ((weights == null) || (weights.length < 4)) {
+ throw new IllegalArgumentException(
+ J3dI18N.getString("Texture24"));
+ } else {
+ ((TextureRetained)this.retained).initFilter4Func(weights);
+ }
+ }
+
+ /**
+ * Retrieves the number of filter4 function values for this
+ * texture object.
+ *
+ * @return the number of filter4 function values
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public int getFilter4FuncPointsCount() {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_FILTER4_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture23"));
+ }
+ }
+ return (((TextureRetained)this.retained).getFilter4FuncPointsCount());
+ }
+
+ /**
+ * Copies the array of filter4 function values into the specified
+ * array. The array must be large enough to hold all the values.
+ *
+ * @param weights the array to receive the function values.
+ *
+ * @exception CapabilityNotSetException if appropriate capability is
+ * not set and this object is part of live or compiled scene graph
+ *
+ * @since Java 3D 1.3
+ */
+ public void getFilter4Func(float[] weights) {
+ if (isLiveOrCompiled()) {
+ if (!this.getCapability(ALLOW_FILTER4_READ)) {
+ throw new CapabilityNotSetException(
+ J3dI18N.getString("Texture23"));
+ }
+ }
+ ((TextureRetained)this.retained).getFilter4Func(weights);
+ }
+
+
+ /**
+ * Copies all node information from originalNodeComponent
+ * into the current node. This method is called from the
+ * duplicateNode
method. This routine does
+ * the actual duplication of all "local data" (any data defined in
+ * this object).
+ *
+ * @param originalNodeComponent the original node to duplicate.
+ * @param forceDuplicate when set to true
, causes the
+ * duplicateOnCloneTree
flag to be ignored. When
+ * false
, the value of each node's
+ * duplicateOnCloneTree
variable determines whether
+ * NodeComponent data is duplicated or copied.
+ *
+ * @see Node#cloneTree
+ * @see NodeComponent#setDuplicateOnCloneTree
+ */
+ @Override
+ void duplicateAttributes(NodeComponent originalNodeComponent,
+ boolean forceDuplicate) {
+
+ super.duplicateAttributes(originalNodeComponent, forceDuplicate);
+
+ Hashtable hashtable = originalNodeComponent.nodeHashtable;
+
+ TextureRetained tex = (TextureRetained) originalNodeComponent.retained;
+ TextureRetained rt = (TextureRetained) retained;
+
+ rt.initBoundaryModeS(tex.getBoundaryModeS());
+ rt.initBoundaryModeT(tex.getBoundaryModeT());
+ rt.initMinFilter(tex.getMinFilter());
+ rt.initMagFilter(tex.getMagFilter());
+ rt.initMipMapMode(tex.getMipMapMode());
+ rt.initEnable(tex.getEnable());
+ rt.initAnisotropicFilterMode(tex.getAnisotropicFilterMode());
+ rt.initAnisotropicFilterDegree(tex.getAnisotropicFilterDegree());
+ rt.initSharpenTextureFunc(tex.getSharpenTextureFunc());
+ rt.initFilter4Func(tex.getFilter4Func());
+
+ rt.initBaseLevel(tex.getBaseLevel());
+ rt.initMaximumLevel(tex.getMaximumLevel());
+ rt.initMinimumLOD(tex.getMinimumLOD());
+ rt.initMaximumLOD(tex.getMaximumLOD());
+
+ Point3f offset = new Point3f();
+ tex.getLodOffset(offset);
+ rt.initLodOffset(offset.x, offset.y, offset.z);
+
+ Color4f c = new Color4f();
+ tex.getBoundaryColor(c);
+ rt.initBoundaryColor(c);
+
+ // No API available to get the current level
+ for (int i=tex.maxLevels-1; i>=0; i-- ) {
+ ImageComponent image = (ImageComponent)
+ getNodeComponent(tex.getImage(i),
+ forceDuplicate,
+ hashtable);
+ if (image != null) {
+ rt.initImage(i, image);
+ }
+ }
+ // XXXX: clone new v1.2 attributes?
+ // NOTE: This sppears to have already been done
+ }
+
+ /**
+ * This function is called from getNodeComponent() to see if any of
+ * the sub-NodeComponents duplicateOnCloneTree flag is true.
+ * If it is the case, current NodeComponent needs to
+ * duplicate also even though current duplicateOnCloneTree flag is false.
+ * This should be overwrite by NodeComponent which contains sub-NodeComponent.
+ */
+ @Override
+ boolean duplicateChild() {
+ if (getDuplicateOnCloneTree())
+ return true;
+
+ int level = ((TextureRetained) this.retained).maxLevels;
+ TextureRetained rt = (TextureRetained) retained;
+
+ for (int i=0; i < level; i++) {
+ ImageComponent img = rt.getImage(i);
+ if ((img != null) && img.getDuplicateOnCloneTree())
+ return true;
+ }
+ return false;
+ }
+
+}
--
cgit v1.2.3