Class LazilyLoadedTexture

  • All Implemented Interfaces:
    AVList, WWTexture
    Direct Known Subclasses:
    AbstractTacticalSymbol.IconTexture

    public class LazilyLoadedTexture
    extends AVListImpl
    implements WWTexture
    Represents a texture derived from a lazily loaded image source such as an image file or a BufferedImage.

    The interface contains a method, isTextureInitializationFailed() to determine whether the instance failed to convert an image source to a texture. If such a failure occurs, the method returns true and no further attempts are made to create the texture.

    This class performs lazy retrieval and loading of an image source, attempting to retrieve and load the image source only when the bind(DrawContext) or applyInternalTransform(DrawContext) methods are called. If the image source is a BufferedImage the associated Texture object is created and available immediately when bind or applyInternalTransform are called. If the image source is a local file or remote stream (URL), retrieval and loading is performed on a separate thread from the EDT.

    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      protected static class  LazilyLoadedTexture.RequestTask
      Attempts to find this texture's image file locally, and if that fails attempts to find it remotely.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected java.lang.Object fileLock
      Provides a semaphore to synchronize access to the texture file if duplicate request tasks are active.
      protected FileStore fileStore
      Identifies the FileStore of the supporting file cache for this model.
      protected boolean hasMipmapData
      Indicates whether the image read from the image source has mip-map data.
      protected java.lang.Integer height
      The texture height, if the height is known.
      protected java.lang.Object imageSource
      The original image source specified at construction.
      protected java.beans.PropertyChangeListener listener
      The object to notify when an image is eventually loaded in memory.
      protected com.jogamp.opengl.util.texture.TextureCoords texCoords
      The texture's texture coordinates, as determined by JOGL when the texture is created.
      protected com.jogamp.opengl.util.texture.TextureData textureData
      The texture data created as the image source is read.
      protected boolean textureInitializationFailed
      Indicates that texture initialization failed.
      protected boolean useAnisotropy
      The current anisotropy flag.
      protected boolean useMipMaps
      The mip-map flag specified at construction.
      protected java.lang.Integer width
      The texture width, if the width is known.
    • Constructor Summary

      Constructors 
      Constructor Description
      LazilyLoadedTexture​(java.lang.Object imageSource)
      Constructs a texture object for a specified image source.
      LazilyLoadedTexture​(java.lang.Object imageSource, boolean useMipMaps)
      Constructs a texture object for a specified image source.
    • Field Detail

      • imageSource

        protected java.lang.Object imageSource
        The original image source specified at construction.
      • useMipMaps

        protected boolean useMipMaps
        The mip-map flag specified at construction.
      • useAnisotropy

        protected boolean useAnisotropy
        The current anisotropy flag.
      • width

        protected java.lang.Integer width
        The texture width, if the width is known. Otherwise it's -1.
      • height

        protected java.lang.Integer height
        The texture height, if the height is known. Otherwise it's -1.
      • texCoords

        protected com.jogamp.opengl.util.texture.TextureCoords texCoords
        The texture's texture coordinates, as determined by JOGL when the texture is created.
      • textureData

        protected volatile com.jogamp.opengl.util.texture.TextureData textureData
        The texture data created as the image source is read. It's removed - set to null - once the textures is fully created. This intermediate texture data is necessary because the image source is read in a non-EDT thread. This field is volatile in order to synchronize atomic access among threads. This field is not used if the image source is BufferedImage.
      • textureInitializationFailed

        protected boolean textureInitializationFailed
        Indicates that texture initialization failed. This texture should not be used if true.
      • hasMipmapData

        protected boolean hasMipmapData
        Indicates whether the image read from the image source has mip-map data.
      • fileStore

        protected FileStore fileStore
        Identifies the FileStore of the supporting file cache for this model.
      • fileLock

        protected final java.lang.Object fileLock
        Provides a semaphore to synchronize access to the texture file if duplicate request tasks are active.
      • listener

        protected java.beans.PropertyChangeListener listener
        The object to notify when an image is eventually loaded in memory. The current layer at the time the image source is requested is assigned to this field.
    • Constructor Detail

      • LazilyLoadedTexture

        public LazilyLoadedTexture​(java.lang.Object imageSource)
        Constructs a texture object for a specified image source. Requests that mip-maps be used.
        Parameters:
        imageSource - the source of the image, either a file path String or a BufferedImage.
        Throws:
        java.lang.IllegalArgumentException - if the imageSource is null.
      • LazilyLoadedTexture

        public LazilyLoadedTexture​(java.lang.Object imageSource,
                                   boolean useMipMaps)
        Constructs a texture object for a specified image source.
        Parameters:
        imageSource - the source of the image, either a file path String or a BufferedImage.
        useMipMaps - Indicates whether to generate and use mip-maps for the image.
        Throws:
        java.lang.IllegalArgumentException - if the imageSource is null.
    • Method Detail

      • initialize

        protected void initialize​(java.lang.Object imageSource,
                                  boolean useMipMaps,
                                  java.beans.PropertyChangeListener listener)
        Initializes this object's fields during construction.
        Parameters:
        imageSource - the image source.
        useMipMaps - the mip-map flag.
        listener - the change listener.
        Throws:
        java.lang.IllegalArgumentException - if the image source is null.
      • getImageSource

        public java.lang.Object getImageSource()
        Description copied from interface: WWTexture
        Returns the texture's image source.
        Specified by:
        getImageSource in interface WWTexture
        Returns:
        the texture's image source.
      • isBufferedImageSource

        protected boolean isBufferedImageSource()
        Indicates whether the image source is a BufferedImage
        Returns:
        true if the image source is a BufferedImage, otherwise false.
      • getWidth

        public int getWidth()
        Indicates the texture's width, which is the same as the image source's width. The width is known only after the image source has been retrieved from disk or network and read as TextureData. It's value is -1 until then.
        Returns:
        the texture's width if the texture has been retrieved, otherwise -1.
      • getHeight

        public int getHeight()
        Indicates the texture's height, which is the same as the image source's height. The height is known only after the image source has been retrieved from disk or network and read as TextureData. It's value is -1 until then.
        Returns:
        the texture's height if the texture has been retrieved, otherwise -1.
      • getWidth

        public int getWidth​(DrawContext dc)
        Returns the texture's width.

        This method behaves identically to getWidth(). The DrawContext argument is not used.

        Specified by:
        getWidth in interface WWTexture
        Parameters:
        dc - this parameter is not used by this class.
        Returns:
        the texture's width if the texture has been retrieved, otherwise -1.
      • getHeight

        public int getHeight​(DrawContext dc)
        Returns the texture's height

        This method behaves identically to getHeight(). The DrawContext argument is not used.

        Specified by:
        getHeight in interface WWTexture
        Parameters:
        dc - this parameter is not used by this class.
        Returns:
        the texture's height if the texture has been retrieved, otherwise -1.
      • isUseMipMaps

        public boolean isUseMipMaps()
        Indicates whether the texture should use mip-maps. If they are not available in the source image they are created.
        Returns:
        true if mip-maps are used, false if not.
      • getTexCoords

        public com.jogamp.opengl.util.texture.TextureCoords getTexCoords()
        Description copied from interface: WWTexture
        Returns the texture's texture coordinates, which may be other than [0,0],[1,1] if the texture size is not a power of two or the texture must be flipped when rendered.
        Specified by:
        getTexCoords in interface WWTexture
        Returns:
        returns the texture's texture coordinates.
      • isTextureCurrent

        public boolean isTextureCurrent​(DrawContext dc)
        Description copied from interface: WWTexture
        Indicates whether the texture is currently available for use without regenerating it from its image source.
        Specified by:
        isTextureCurrent in interface WWTexture
        Parameters:
        dc - the current draw context
        Returns:
        true if the texture is available and consistent with its image source, otherwise false.
      • isUseAnisotropy

        public boolean isUseAnisotropy()
        Indicates whether texture anisotropy is applied to the texture when rendered.
        Returns:
        useAnisotropy true if anisotropy is to be applied, otherwise false.
      • setUseAnisotropy

        public void setUseAnisotropy​(boolean useAnisotropy)
        Specifies whether texture anisotropy is applied to the texture when rendered.
        Parameters:
        useAnisotropy - true if anisotropy is to be applied, otherwise false.
      • isTextureInitializationFailed

        public boolean isTextureInitializationFailed()
        Indicates whether an attempt was made to retrieve and read the texture but it failed. If this flag is true, this texture should not be used.
        Specified by:
        isTextureInitializationFailed in interface WWTexture
        Returns:
        true if texture retrieval or creation failed, otherwise true, even if the image source has not yet been retrieved.
      • getTexture

        protected com.jogamp.opengl.util.texture.Texture getTexture​(DrawContext dc)
        Returns the Texture associated with this instance.
        Parameters:
        dc - the current draw context.
        Returns:
        this instance's texture, or null if the texture does not currently exist.
      • getTextureData

        protected com.jogamp.opengl.util.texture.TextureData getTextureData()
        Returns this texture's texture data if it has been retrieved but a Texture has not yet been created for it.

        If this object's texture data field is non-null, a new texture is created from the texture data when the tile is next bound or otherwise initialized. This object's texture data field is then set to null.

        Returns:
        the texture data, which may be null indicating that the image source has not been read or that a texture has been created.
      • setTextureData

        protected void setTextureData​(com.jogamp.opengl.util.texture.TextureData textureData)
        Specifies texture data for the tile. If texture data is non-null, a new texture is created from the texture data when the tile is next bound.

        When a texture is created from the texture data, the texture data field is set to null to indicate that the data has been converted to a texture and its resources may be released.

        Parameters:
        textureData - the texture data, which may be null.
      • bind

        public boolean bind​(DrawContext dc)
        Binds this instance's Texture to the GLContext if the texture has been created, otherwise initiates image source retrieval and texture creation in a separate thread.
        Specified by:
        bind in interface WWTexture
        Parameters:
        dc - the current draw context.
        Returns:
        true if the texture was bound, otherwise false.
      • applyInternalTransform

        public void applyInternalTransform​(DrawContext dc)
        Description copied from interface: WWTexture
        Applies any necessary transformations to the texture prior to its being rendered. A common transformation is mapping texture coordinates from a flipped or non-square state to conventionally oriented OpenGL values.
        Specified by:
        applyInternalTransform in interface WWTexture
        Parameters:
        dc - the current draw context.
      • requestTexture

        protected com.jogamp.opengl.util.texture.Texture requestTexture​(DrawContext dc)
        If this instance's image source is a BufferedImage, creates and returns the texture, otherwise creates a task in a separate thread to retrieve it from its local or remote location.
        Parameters:
        dc - the current draw context.
        Returns:
        the new texture, or null if the texture is not yet available.
      • createRequestTask

        protected java.lang.Runnable createRequestTask()
        Returns an object that implements the Runnable interface, and who's run method retrieves and loads this texture's image source.
        Returns:
        a new request task that retrieves and loads this texture's image source.
      • makeBufferedImageTexture

        protected com.jogamp.opengl.util.texture.Texture makeBufferedImageTexture​(DrawContext dc)
        Creates this instance's Texture if the image source is a BufferedImage.
        Parameters:
        dc - the current draw context.
        Returns:
        the newly created texture, or null if the texture was not created.
        Throws:
        java.lang.IllegalStateException - if the image source is null or not a BufferedImage.
      • makeTextureFromTextureData

        protected com.jogamp.opengl.util.texture.Texture makeTextureFromTextureData​(DrawContext dc)
        Creates a Texture from this instance's TextureData if the TextureData exists.
        Parameters:
        dc - the current draw context.
        Returns:
        the newly created texture, or null if this instance has no current TextureData or if texture creation failed.
      • setTextureParameters

        protected void setTextureParameters​(DrawContext dc,
                                            com.jogamp.opengl.util.texture.Texture texture)
        Sets a specified texture's OpenGL Texture parameters.
        Parameters:
        dc - the current draw context.
        texture - the texture whose parameters to set.
      • notifyTextureLoaded

        protected void notifyTextureLoaded()
      • loadTextureData

        protected boolean loadTextureData​(java.net.URL fileUrl)
        Loads the image from disk into memory. If successful, texture data is created and available via getTextureData().
        Parameters:
        fileUrl - the URL of the image file.
        Returns:
        true if the image was successfully loaded, otherwise false.
      • readImage

        protected com.jogamp.opengl.util.texture.TextureData readImage​(java.net.URL fileUrl)
        Reads and returns a TextureData for an image from a specified file URL.
        Parameters:
        fileUrl - the URL of the image file to read.
        Returns:
        a TextureData instance for the image.
      • equals

        public boolean equals​(java.lang.Object o)
        Overrides:
        equals in class java.lang.Object
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class java.lang.Object