Skip to content

⬅️ Back to Table of Contents

📄 Texture.js

📊 Analysis Summary

Metric Count
🔧 Functions 9
🧱 Classes 1
📦 Imports 15
📊 Variables & Constants 6

📚 Table of Contents

🛠️ File Location:

📂 src/textures/Texture.js

📦 Imports

Name Source
EventDispatcher ../core/EventDispatcher.js
MirroredRepeatWrapping ../constants.js
ClampToEdgeWrapping ../constants.js
RepeatWrapping ../constants.js
UnsignedByteType ../constants.js
RGBAFormat ../constants.js
LinearMipmapLinearFilter ../constants.js
LinearFilter ../constants.js
UVMapping ../constants.js
NoColorSpace ../constants.js
generateUUID ../math/MathUtils.js
Vector2 ../math/Vector2.js
Vector3 ../math/Vector3.js
Matrix3 ../math/Matrix3.js
Source ./Source.js

Variables & Constants

Name Type Kind Value Exported
_textureId number let/var 0
_tempVec3 Vector3 let/var new Vector3()
newValue any let/var values[ key ]
currentValue any let/var this[ key ]
isRootObject boolean let/var ( meta === undefined \|\| typeof meta === 'string' )
output { metadata: { version: number; type: ... let/var { metadata: { version: 4.7, type: 'Texture', generator: 'Texture.toJSON' }, u...

Functions

Texture.updateMatrix(): void

JSDoc:

/**
     * Updates the texture transformation matrix from the from the properties {@link Texture#offset},
     * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.
     */

Returns: void

Calls:

  • this.matrix.setUvTransform
Code
updateMatrix() {

        this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );

    }

Texture.addUpdateRange(start: number, count: number): void

JSDoc:

/**
     * Adds a range of data in the data texture to be updated on the GPU.
     *
     * @param {number} start - Position at which to start update.
     * @param {number} count - The number of components to update.
     */

Parameters:

  • start number
  • count number

Returns: void

Calls:

  • this.updateRanges.push
Code
addUpdateRange( start, count ) {

        this.updateRanges.push( { start, count } );

    }

Texture.clearUpdateRanges(): void

JSDoc:

/**
     * Clears the update ranges.
     */

Returns: void

Code
clearUpdateRanges() {

        this.updateRanges.length = 0;

    }

Texture.clone(): Texture

JSDoc:

/**
     * Returns a new texture with copied values from this instance.
     *
     * @return {Texture} A clone of this instance.
     */

Returns: Texture

Calls:

  • new this.constructor().copy
Code
clone() {

        return new this.constructor().copy( this );

    }

Texture.copy(source: Texture): Texture

JSDoc:

/**
     * Copies the values of the given texture to this instance.
     *
     * @param {Texture} source - The texture to copy.
     * @return {Texture} A reference to this instance.
     */

Parameters:

  • source Texture

Returns: Texture

Calls:

  • source.mipmaps.slice
  • this.offset.copy
  • this.repeat.copy
  • this.center.copy
  • this.matrix.copy
  • JSON.parse
  • JSON.stringify
Code
copy( source ) {

        this.name = source.name;

        this.source = source.source;
        this.mipmaps = source.mipmaps.slice( 0 );

        this.mapping = source.mapping;
        this.channel = source.channel;

        this.wrapS = source.wrapS;
        this.wrapT = source.wrapT;

        this.magFilter = source.magFilter;
        this.minFilter = source.minFilter;

        this.anisotropy = source.anisotropy;

        this.format = source.format;
        this.internalFormat = source.internalFormat;
        this.type = source.type;

        this.offset.copy( source.offset );
        this.repeat.copy( source.repeat );
        this.center.copy( source.center );
        this.rotation = source.rotation;

        this.matrixAutoUpdate = source.matrixAutoUpdate;
        this.matrix.copy( source.matrix );

        this.generateMipmaps = source.generateMipmaps;
        this.premultiplyAlpha = source.premultiplyAlpha;
        this.flipY = source.flipY;
        this.unpackAlignment = source.unpackAlignment;
        this.colorSpace = source.colorSpace;

        this.renderTarget = source.renderTarget;
        this.isRenderTargetTexture = source.isRenderTargetTexture;
        this.isArrayTexture = source.isArrayTexture;

        this.userData = JSON.parse( JSON.stringify( source.userData ) );

        this.needsUpdate = true;

        return this;

    }

Texture.setValues(values: any): void

JSDoc:

/**
     * Sets this texture's properties based on `values`.
     * @param {Object} values - A container with texture parameters.
     */

Parameters:

  • values any

Returns: void

Calls:

  • console.warn
  • currentValue.copy
Code
setValues( values ) {

        for ( const key in values ) {

            const newValue = values[ key ];

            if ( newValue === undefined ) {

                console.warn( `THREE.Texture.setValues(): parameter '${ key }' has value of undefined.` );
                continue;

            }

            const currentValue = this[ key ];

            if ( currentValue === undefined ) {

                console.warn( `THREE.Texture.setValues(): property '${ key }' does not exist.` );
                continue;

            }

            if ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {

                currentValue.copy( newValue );

            } else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {

                currentValue.copy( newValue );

            } else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {

                currentValue.copy( newValue );

            } else {

                this[ key ] = newValue;

            }

        }

    }

Texture.toJSON(meta: any): any

JSDoc:

/**
     * Serializes the texture into JSON.
     *
     * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.
     * @return {Object} A JSON object representing the serialized texture.
     * @see {@link ObjectLoader#parse}
     */

Parameters:

  • meta any

Returns: any

Calls:

  • this.source.toJSON
  • Object.keys
Code
toJSON( meta ) {

        const isRootObject = ( meta === undefined || typeof meta === 'string' );

        if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {

            return meta.textures[ this.uuid ];

        }

        const output = {

            metadata: {
                version: 4.7,
                type: 'Texture',
                generator: 'Texture.toJSON'
            },

            uuid: this.uuid,
            name: this.name,

            image: this.source.toJSON( meta ).uuid,

            mapping: this.mapping,
            channel: this.channel,

            repeat: [ this.repeat.x, this.repeat.y ],
            offset: [ this.offset.x, this.offset.y ],
            center: [ this.center.x, this.center.y ],
            rotation: this.rotation,

            wrap: [ this.wrapS, this.wrapT ],

            format: this.format,
            internalFormat: this.internalFormat,
            type: this.type,
            colorSpace: this.colorSpace,

            minFilter: this.minFilter,
            magFilter: this.magFilter,
            anisotropy: this.anisotropy,

            flipY: this.flipY,

            generateMipmaps: this.generateMipmaps,
            premultiplyAlpha: this.premultiplyAlpha,
            unpackAlignment: this.unpackAlignment

        };

        if ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;

        if ( ! isRootObject ) {

            meta.textures[ this.uuid ] = output;

        }

        return output;

    }

Texture.dispose(): void

JSDoc:

/**
     * Frees the GPU-related resources allocated by this instance. Call this
     * method whenever this instance is no longer used in your app.
     *
     * @fires Texture#dispose
     */

Returns: void

Calls:

  • this.dispatchEvent

Internal Comments:

/**
         * Fires when the texture has been disposed of.
         *
         * @event Texture#dispose
         * @type {Object}
         */ (x4)

Code
dispose() {

        /**
         * Fires when the texture has been disposed of.
         *
         * @event Texture#dispose
         * @type {Object}
         */
        this.dispatchEvent( { type: 'dispose' } );

    }

Texture.transformUv(uv: Vector2): Vector2

JSDoc:

/**
     * Transforms the given uv vector with the textures uv transformation matrix.
     *
     * @param {Vector2} uv - The uv vector.
     * @return {Vector2} The transformed uv vector.
     */

Parameters:

  • uv Vector2

Returns: Vector2

Calls:

  • uv.applyMatrix3
  • Math.floor
  • Math.abs
  • Math.ceil
Code
transformUv( uv ) {

        if ( this.mapping !== UVMapping ) return uv;

        uv.applyMatrix3( this.matrix );

        if ( uv.x < 0 || uv.x > 1 ) {

            switch ( this.wrapS ) {

                case RepeatWrapping:

                    uv.x = uv.x - Math.floor( uv.x );
                    break;

                case ClampToEdgeWrapping:

                    uv.x = uv.x < 0 ? 0 : 1;
                    break;

                case MirroredRepeatWrapping:

                    if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {

                        uv.x = Math.ceil( uv.x ) - uv.x;

                    } else {

                        uv.x = uv.x - Math.floor( uv.x );

                    }

                    break;

            }

        }

        if ( uv.y < 0 || uv.y > 1 ) {

            switch ( this.wrapT ) {

                case RepeatWrapping:

                    uv.y = uv.y - Math.floor( uv.y );
                    break;

                case ClampToEdgeWrapping:

                    uv.y = uv.y < 0 ? 0 : 1;
                    break;

                case MirroredRepeatWrapping:

                    if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {

                        uv.y = Math.ceil( uv.y ) - uv.y;

                    } else {

                        uv.y = uv.y - Math.floor( uv.y );

                    }

                    break;

            }

        }

        if ( this.flipY ) {

            uv.y = 1 - uv.y;

        }

        return uv;

    }

Classes

Texture

Class Code
class Texture extends EventDispatcher {

    /**
     * Constructs a new texture.
     *
     * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.
     * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.
     * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.
     * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.
     * @param {number} [magFilter=LinearFilter] - The mag filter value.
     * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.
     * @param {number} [format=RGBAFormat] - The texture format.
     * @param {number} [type=UnsignedByteType] - The texture type.
     * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.
     * @param {string} [colorSpace=NoColorSpace] - The color space.
     */
    constructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {

        super();

        /**
         * This flag can be used for type testing.
         *
         * @type {boolean}
         * @readonly
         * @default true
         */
        this.isTexture = true;

        /**
         * The ID of the texture.
         *
         * @name Texture#id
         * @type {number}
         * @readonly
         */
        Object.defineProperty( this, 'id', { value: _textureId ++ } );

        /**
         * The UUID of the material.
         *
         * @type {string}
         * @readonly
         */
        this.uuid = generateUUID();

        /**
         * The name of the material.
         *
         * @type {string}
         */
        this.name = '';

        /**
         * The data definition of a texture. A reference to the data source can be
         * shared across textures. This is often useful in context of spritesheets
         * where multiple textures render the same data but with different texture
         * transformations.
         *
         * @type {Source}
         */
        this.source = new Source( image );

        /**
         * An array holding user-defined mipmaps.
         *
         * @type {Array<Object>}
         */
        this.mipmaps = [];

        /**
         * How the texture is applied to the object. The value `UVMapping`
         * is the default, where texture or uv coordinates are used to apply the map.
         *
         * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}
         * @default UVMapping
        */
        this.mapping = mapping;

        /**
         * Lets you select the uv attribute to map the texture to. `0` for `uv`,
         * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.
         *
         * @type {number}
         * @default 0
         */
        this.channel = 0;

        /**
         * This defines how the texture is wrapped horizontally and corresponds to
         * *U* in UV mapping.
         *
         * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}
         * @default ClampToEdgeWrapping
         */
        this.wrapS = wrapS;

        /**
         * This defines how the texture is wrapped horizontally and corresponds to
         * *V* in UV mapping.
         *
         * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}
         * @default ClampToEdgeWrapping
         */
        this.wrapT = wrapT;

        /**
         * How the texture is sampled when a texel covers more than one pixel.
         *
         * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}
         * @default LinearFilter
         */
        this.magFilter = magFilter;

        /**
         * How the texture is sampled when a texel covers less than one pixel.
         *
         * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}
         * @default LinearMipmapLinearFilter
         */
        this.minFilter = minFilter;

        /**
         * The number of samples taken along the axis through the pixel that has the
         * highest density of texels. By default, this value is `1`. A higher value
         * gives a less blurry result than a basic mipmap, at the cost of more
         * texture samples being used.
         *
         * @type {number}
         * @default 0
         */
        this.anisotropy = anisotropy;

        /**
         * The format of the texture.
         *
         * @type {number}
         * @default RGBAFormat
         */
        this.format = format;

        /**
         * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and
         * defines how the texture data is going to be stored on the GPU.
         *
         * This property allows to overwrite the default format.
         *
         * @type {?string}
         * @default null
         */
        this.internalFormat = null;

        /**
         * The data type of the texture.
         *
         * @type {number}
         * @default UnsignedByteType
         */
        this.type = type;

        /**
         * How much a single repetition of the texture is offset from the beginning,
         * in each direction U and V. Typical range is `0.0` to `1.0`.
         *
         * @type {Vector2}
         * @default (0,0)
         */
        this.offset = new Vector2( 0, 0 );

        /**
         * How many times the texture is repeated across the surface, in each
         * direction U and V. If repeat is set greater than `1` in either direction,
         * the corresponding wrap parameter should also be set to `RepeatWrapping`
         * or `MirroredRepeatWrapping` to achieve the desired tiling effect.
         *
         * @type {Vector2}
         * @default (1,1)
         */
        this.repeat = new Vector2( 1, 1 );

        /**
         * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds
         * to the center of the texture. Default is `(0, 0)`, the lower left.
         *
         * @type {Vector2}
         * @default (0,0)
         */
        this.center = new Vector2( 0, 0 );

        /**
         * How much the texture is rotated around the center point, in radians.
         * Positive values are counter-clockwise.
         *
         * @type {number}
         * @default 0
         */
        this.rotation = 0;

        /**
         * Whether to update the texture's uv-transformation {@link Texture#matrix}
         * from the properties {@link Texture#offset}, {@link Texture#repeat},
         * {@link Texture#rotation}, and {@link Texture#center}.
         *
         * Set this to `false` if you are specifying the uv-transform matrix directly.
         *
         * @type {boolean}
         * @default true
         */
        this.matrixAutoUpdate = true;

        /**
         * The uv-transformation matrix of the texture.
         *
         * @type {Matrix3}
         */
        this.matrix = new Matrix3();

        /**
         * Whether to generate mipmaps (if possible) for a texture.
         *
         * Set this to `false` if you are creating mipmaps manually.
         *
         * @type {boolean}
         * @default true
         */
        this.generateMipmaps = true;

        /**
         * If set to `true`, the alpha channel, if present, is multiplied into the
         * color channels when the texture is uploaded to the GPU.
         *
         * Note that this property has no effect when using `ImageBitmap`. You need to
         * configure premultiply alpha on bitmap creation instead.
         *
         * @type {boolean}
         * @default false
         */
        this.premultiplyAlpha = false;

        /**
         * If set to `true`, the texture is flipped along the vertical axis when
         * uploaded to the GPU.
         *
         * Note that this property has no effect when using `ImageBitmap`. You need to
         * configure the flip on bitmap creation instead.
         *
         * @type {boolean}
         * @default true
         */
        this.flipY = true;

        /**
         * Specifies the alignment requirements for the start of each pixel row in memory.
         * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),
         * `4` (word-alignment), and `8` (rows start on double-word boundaries).
         *
         * @type {number}
         * @default 4
         */
        this.unpackAlignment = 4;   // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)

        /**
         * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.
         *
         * @type {string}
         * @default NoColorSpace
         */
        this.colorSpace = colorSpace;

        /**
         * An object that can be used to store custom data about the texture. It
         * should not hold references to functions as these will not be cloned.
         *
         * @type {Object}
         */
        this.userData = {};

        /**
         * This can be used to only update a subregion or specific rows of the texture (for example, just the
         * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.
         *
         * @type {Array<Object>}
         */
        this.updateRanges = [];

        /**
         * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.
         *
         * @type {number}
         * @readonly
         * @default 0
         */
        this.version = 0;

        /**
         * A callback function, called when the texture is updated (e.g., when
         * {@link Texture#needsUpdate} has been set to true and then the texture is used).
         *
         * @type {?Function}
         * @default null
         */
        this.onUpdate = null;

        /**
         * An optional back reference to the textures render target.
         *
         * @type {?(RenderTarget|WebGLRenderTarget)}
         * @default null
         */
        this.renderTarget = null;

        /**
         * Indicates whether a texture belongs to a render target or not.
         *
         * @type {boolean}
         * @readonly
         * @default false
         */
        this.isRenderTargetTexture = false;

        /**
         * Indicates if a texture should be handled like a texture array.
         *
         * @type {boolean}
         * @readonly
         * @default false
         */
        this.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;

        /**
         * Indicates whether this texture should be processed by `PMREMGenerator` or not
         * (only relevant for render target textures).
         *
         * @type {number}
         * @readonly
         * @default 0
         */
        this.pmremVersion = 0;

    }

    /**
     * The width of the texture in pixels.
     */
    get width() {

        return this.source.getSize( _tempVec3 ).x;

    }

    /**
     * The height of the texture in pixels.
     */
    get height() {

        return this.source.getSize( _tempVec3 ).y;

    }

    /**
     * The depth of the texture in pixels.
     */
    get depth() {

        return this.source.getSize( _tempVec3 ).z;

    }

    /**
     * The image object holding the texture data.
     *
     * @type {?Object}
     */
    get image() {

        return this.source.data;

    }

    set image( value = null ) {

        this.source.data = value;

    }

    /**
     * Updates the texture transformation matrix from the from the properties {@link Texture#offset},
     * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.
     */
    updateMatrix() {

        this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );

    }

    /**
     * Adds a range of data in the data texture to be updated on the GPU.
     *
     * @param {number} start - Position at which to start update.
     * @param {number} count - The number of components to update.
     */
    addUpdateRange( start, count ) {

        this.updateRanges.push( { start, count } );

    }

    /**
     * Clears the update ranges.
     */
    clearUpdateRanges() {

        this.updateRanges.length = 0;

    }

    /**
     * Returns a new texture with copied values from this instance.
     *
     * @return {Texture} A clone of this instance.
     */
    clone() {

        return new this.constructor().copy( this );

    }

    /**
     * Copies the values of the given texture to this instance.
     *
     * @param {Texture} source - The texture to copy.
     * @return {Texture} A reference to this instance.
     */
    copy( source ) {

        this.name = source.name;

        this.source = source.source;
        this.mipmaps = source.mipmaps.slice( 0 );

        this.mapping = source.mapping;
        this.channel = source.channel;

        this.wrapS = source.wrapS;
        this.wrapT = source.wrapT;

        this.magFilter = source.magFilter;
        this.minFilter = source.minFilter;

        this.anisotropy = source.anisotropy;

        this.format = source.format;
        this.internalFormat = source.internalFormat;
        this.type = source.type;

        this.offset.copy( source.offset );
        this.repeat.copy( source.repeat );
        this.center.copy( source.center );
        this.rotation = source.rotation;

        this.matrixAutoUpdate = source.matrixAutoUpdate;
        this.matrix.copy( source.matrix );

        this.generateMipmaps = source.generateMipmaps;
        this.premultiplyAlpha = source.premultiplyAlpha;
        this.flipY = source.flipY;
        this.unpackAlignment = source.unpackAlignment;
        this.colorSpace = source.colorSpace;

        this.renderTarget = source.renderTarget;
        this.isRenderTargetTexture = source.isRenderTargetTexture;
        this.isArrayTexture = source.isArrayTexture;

        this.userData = JSON.parse( JSON.stringify( source.userData ) );

        this.needsUpdate = true;

        return this;

    }

    /**
     * Sets this texture's properties based on `values`.
     * @param {Object} values - A container with texture parameters.
     */
    setValues( values ) {

        for ( const key in values ) {

            const newValue = values[ key ];

            if ( newValue === undefined ) {

                console.warn( `THREE.Texture.setValues(): parameter '${ key }' has value of undefined.` );
                continue;

            }

            const currentValue = this[ key ];

            if ( currentValue === undefined ) {

                console.warn( `THREE.Texture.setValues(): property '${ key }' does not exist.` );
                continue;

            }

            if ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {

                currentValue.copy( newValue );

            } else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {

                currentValue.copy( newValue );

            } else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {

                currentValue.copy( newValue );

            } else {

                this[ key ] = newValue;

            }

        }

    }

    /**
     * Serializes the texture into JSON.
     *
     * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.
     * @return {Object} A JSON object representing the serialized texture.
     * @see {@link ObjectLoader#parse}
     */
    toJSON( meta ) {

        const isRootObject = ( meta === undefined || typeof meta === 'string' );

        if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {

            return meta.textures[ this.uuid ];

        }

        const output = {

            metadata: {
                version: 4.7,
                type: 'Texture',
                generator: 'Texture.toJSON'
            },

            uuid: this.uuid,
            name: this.name,

            image: this.source.toJSON( meta ).uuid,

            mapping: this.mapping,
            channel: this.channel,

            repeat: [ this.repeat.x, this.repeat.y ],
            offset: [ this.offset.x, this.offset.y ],
            center: [ this.center.x, this.center.y ],
            rotation: this.rotation,

            wrap: [ this.wrapS, this.wrapT ],

            format: this.format,
            internalFormat: this.internalFormat,
            type: this.type,
            colorSpace: this.colorSpace,

            minFilter: this.minFilter,
            magFilter: this.magFilter,
            anisotropy: this.anisotropy,

            flipY: this.flipY,

            generateMipmaps: this.generateMipmaps,
            premultiplyAlpha: this.premultiplyAlpha,
            unpackAlignment: this.unpackAlignment

        };

        if ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;

        if ( ! isRootObject ) {

            meta.textures[ this.uuid ] = output;

        }

        return output;

    }

    /**
     * Frees the GPU-related resources allocated by this instance. Call this
     * method whenever this instance is no longer used in your app.
     *
     * @fires Texture#dispose
     */
    dispose() {

        /**
         * Fires when the texture has been disposed of.
         *
         * @event Texture#dispose
         * @type {Object}
         */
        this.dispatchEvent( { type: 'dispose' } );

    }

    /**
     * Transforms the given uv vector with the textures uv transformation matrix.
     *
     * @param {Vector2} uv - The uv vector.
     * @return {Vector2} The transformed uv vector.
     */
    transformUv( uv ) {

        if ( this.mapping !== UVMapping ) return uv;

        uv.applyMatrix3( this.matrix );

        if ( uv.x < 0 || uv.x > 1 ) {

            switch ( this.wrapS ) {

                case RepeatWrapping:

                    uv.x = uv.x - Math.floor( uv.x );
                    break;

                case ClampToEdgeWrapping:

                    uv.x = uv.x < 0 ? 0 : 1;
                    break;

                case MirroredRepeatWrapping:

                    if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {

                        uv.x = Math.ceil( uv.x ) - uv.x;

                    } else {

                        uv.x = uv.x - Math.floor( uv.x );

                    }

                    break;

            }

        }

        if ( uv.y < 0 || uv.y > 1 ) {

            switch ( this.wrapT ) {

                case RepeatWrapping:

                    uv.y = uv.y - Math.floor( uv.y );
                    break;

                case ClampToEdgeWrapping:

                    uv.y = uv.y < 0 ? 0 : 1;
                    break;

                case MirroredRepeatWrapping:

                    if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {

                        uv.y = Math.ceil( uv.y ) - uv.y;

                    } else {

                        uv.y = uv.y - Math.floor( uv.y );

                    }

                    break;

            }

        }

        if ( this.flipY ) {

            uv.y = 1 - uv.y;

        }

        return uv;

    }

    /**
     * Setting this property to `true` indicates the engine the texture
     * must be updated in the next render. This triggers a texture upload
     * to the GPU and ensures correct texture parameter configuration.
     *
     * @type {boolean}
     * @default false
     * @param {boolean} value
     */
    set needsUpdate( value ) {

        if ( value === true ) {

            this.version ++;
            this.source.needsUpdate = true;

        }

    }

    /**
     * Setting this property to `true` indicates the engine the PMREM
     * must be regenerated.
     *
     * @type {boolean}
     * @default false
     * @param {boolean} value
     */
    set needsPMREMUpdate( value ) {

        if ( value === true ) {

            this.pmremVersion ++;

        }

    }

}

Methods

updateMatrix(): void
Code
updateMatrix() {

        this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );

    }
addUpdateRange(start: number, count: number): void
Code
addUpdateRange( start, count ) {

        this.updateRanges.push( { start, count } );

    }
clearUpdateRanges(): void
Code
clearUpdateRanges() {

        this.updateRanges.length = 0;

    }
clone(): Texture
Code
clone() {

        return new this.constructor().copy( this );

    }
copy(source: Texture): Texture
Code
copy( source ) {

        this.name = source.name;

        this.source = source.source;
        this.mipmaps = source.mipmaps.slice( 0 );

        this.mapping = source.mapping;
        this.channel = source.channel;

        this.wrapS = source.wrapS;
        this.wrapT = source.wrapT;

        this.magFilter = source.magFilter;
        this.minFilter = source.minFilter;

        this.anisotropy = source.anisotropy;

        this.format = source.format;
        this.internalFormat = source.internalFormat;
        this.type = source.type;

        this.offset.copy( source.offset );
        this.repeat.copy( source.repeat );
        this.center.copy( source.center );
        this.rotation = source.rotation;

        this.matrixAutoUpdate = source.matrixAutoUpdate;
        this.matrix.copy( source.matrix );

        this.generateMipmaps = source.generateMipmaps;
        this.premultiplyAlpha = source.premultiplyAlpha;
        this.flipY = source.flipY;
        this.unpackAlignment = source.unpackAlignment;
        this.colorSpace = source.colorSpace;

        this.renderTarget = source.renderTarget;
        this.isRenderTargetTexture = source.isRenderTargetTexture;
        this.isArrayTexture = source.isArrayTexture;

        this.userData = JSON.parse( JSON.stringify( source.userData ) );

        this.needsUpdate = true;

        return this;

    }
setValues(values: any): void
Code
setValues( values ) {

        for ( const key in values ) {

            const newValue = values[ key ];

            if ( newValue === undefined ) {

                console.warn( `THREE.Texture.setValues(): parameter '${ key }' has value of undefined.` );
                continue;

            }

            const currentValue = this[ key ];

            if ( currentValue === undefined ) {

                console.warn( `THREE.Texture.setValues(): property '${ key }' does not exist.` );
                continue;

            }

            if ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {

                currentValue.copy( newValue );

            } else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {

                currentValue.copy( newValue );

            } else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {

                currentValue.copy( newValue );

            } else {

                this[ key ] = newValue;

            }

        }

    }
toJSON(meta: any): any
Code
toJSON( meta ) {

        const isRootObject = ( meta === undefined || typeof meta === 'string' );

        if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {

            return meta.textures[ this.uuid ];

        }

        const output = {

            metadata: {
                version: 4.7,
                type: 'Texture',
                generator: 'Texture.toJSON'
            },

            uuid: this.uuid,
            name: this.name,

            image: this.source.toJSON( meta ).uuid,

            mapping: this.mapping,
            channel: this.channel,

            repeat: [ this.repeat.x, this.repeat.y ],
            offset: [ this.offset.x, this.offset.y ],
            center: [ this.center.x, this.center.y ],
            rotation: this.rotation,

            wrap: [ this.wrapS, this.wrapT ],

            format: this.format,
            internalFormat: this.internalFormat,
            type: this.type,
            colorSpace: this.colorSpace,

            minFilter: this.minFilter,
            magFilter: this.magFilter,
            anisotropy: this.anisotropy,

            flipY: this.flipY,

            generateMipmaps: this.generateMipmaps,
            premultiplyAlpha: this.premultiplyAlpha,
            unpackAlignment: this.unpackAlignment

        };

        if ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;

        if ( ! isRootObject ) {

            meta.textures[ this.uuid ] = output;

        }

        return output;

    }
dispose(): void
Code
dispose() {

        /**
         * Fires when the texture has been disposed of.
         *
         * @event Texture#dispose
         * @type {Object}
         */
        this.dispatchEvent( { type: 'dispose' } );

    }
transformUv(uv: Vector2): Vector2
Code
transformUv( uv ) {

        if ( this.mapping !== UVMapping ) return uv;

        uv.applyMatrix3( this.matrix );

        if ( uv.x < 0 || uv.x > 1 ) {

            switch ( this.wrapS ) {

                case RepeatWrapping:

                    uv.x = uv.x - Math.floor( uv.x );
                    break;

                case ClampToEdgeWrapping:

                    uv.x = uv.x < 0 ? 0 : 1;
                    break;

                case MirroredRepeatWrapping:

                    if ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {

                        uv.x = Math.ceil( uv.x ) - uv.x;

                    } else {

                        uv.x = uv.x - Math.floor( uv.x );

                    }

                    break;

            }

        }

        if ( uv.y < 0 || uv.y > 1 ) {

            switch ( this.wrapT ) {

                case RepeatWrapping:

                    uv.y = uv.y - Math.floor( uv.y );
                    break;

                case ClampToEdgeWrapping:

                    uv.y = uv.y < 0 ? 0 : 1;
                    break;

                case MirroredRepeatWrapping:

                    if ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {

                        uv.y = Math.ceil( uv.y ) - uv.y;

                    } else {

                        uv.y = uv.y - Math.floor( uv.y );

                    }

                    break;

            }

        }

        if ( this.flipY ) {

            uv.y = 1 - uv.y;

        }

        return uv;

    }