Spaces:
Running
Running
| /** | |
| * @author mrdoob / http://mrdoob.com/ | |
| * @author alteredq / http://alteredqualia.com/ | |
| * @author szimek / https://github.com/szimek/ | |
| */ | |
| import { EventDispatcher } from '../core/EventDispatcher.js'; | |
| import { | |
| MirroredRepeatWrapping, | |
| ClampToEdgeWrapping, | |
| RepeatWrapping, | |
| LinearEncoding, | |
| UnsignedByteType, | |
| RGBAFormat, | |
| LinearMipMapLinearFilter, | |
| LinearFilter, | |
| UVMapping | |
| } from '../constants.js'; | |
| import { _Math } from '../math/Math.js'; | |
| import { Vector2 } from '../math/Vector2.js'; | |
| import { Matrix3 } from '../math/Matrix3.js'; | |
| import { ImageUtils } from '../extras/ImageUtils.js'; | |
| var textureId = 0; | |
| function Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { | |
| Object.defineProperty( this, 'id', { value: textureId ++ } ); | |
| this.uuid = _Math.generateUUID(); | |
| this.name = ''; | |
| this.image = image !== undefined ? image : Texture.DEFAULT_IMAGE; | |
| this.mipmaps = []; | |
| this.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING; | |
| this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping; | |
| this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping; | |
| this.magFilter = magFilter !== undefined ? magFilter : LinearFilter; | |
| this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter; | |
| this.anisotropy = anisotropy !== undefined ? anisotropy : 1; | |
| this.format = format !== undefined ? format : RGBAFormat; | |
| this.type = type !== undefined ? type : UnsignedByteType; | |
| this.offset = new Vector2( 0, 0 ); | |
| this.repeat = new Vector2( 1, 1 ); | |
| this.center = new Vector2( 0, 0 ); | |
| this.rotation = 0; | |
| this.matrixAutoUpdate = true; | |
| this.matrix = new Matrix3(); | |
| this.generateMipmaps = true; | |
| this.premultiplyAlpha = false; | |
| this.flipY = true; | |
| this.unpackAlignment = 4; // valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml) | |
| // Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap. | |
| // | |
| // Also changing the encoding after already used by a Material will not automatically make the Material | |
| // update. You need to explicitly call Material.needsUpdate to trigger it to recompile. | |
| this.encoding = encoding !== undefined ? encoding : LinearEncoding; | |
| this.version = 0; | |
| this.onUpdate = null; | |
| } | |
| Texture.DEFAULT_IMAGE = undefined; | |
| Texture.DEFAULT_MAPPING = UVMapping; | |
| Texture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), { | |
| constructor: Texture, | |
| isTexture: true, | |
| updateMatrix: function () { | |
| this.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y ); | |
| }, | |
| clone: function () { | |
| return new this.constructor().copy( this ); | |
| }, | |
| copy: function ( source ) { | |
| this.name = source.name; | |
| this.image = source.image; | |
| this.mipmaps = source.mipmaps.slice( 0 ); | |
| this.mapping = source.mapping; | |
| 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.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.encoding = source.encoding; | |
| return this; | |
| }, | |
| toJSON: function ( meta ) { | |
| var isRootObject = ( meta === undefined || typeof meta === 'string' ); | |
| if ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) { | |
| return meta.textures[ this.uuid ]; | |
| } | |
| var output = { | |
| metadata: { | |
| version: 4.5, | |
| type: 'Texture', | |
| generator: 'Texture.toJSON' | |
| }, | |
| uuid: this.uuid, | |
| name: this.name, | |
| mapping: this.mapping, | |
| 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, | |
| type: this.type, | |
| encoding: this.encoding, | |
| minFilter: this.minFilter, | |
| magFilter: this.magFilter, | |
| anisotropy: this.anisotropy, | |
| flipY: this.flipY, | |
| premultiplyAlpha: this.premultiplyAlpha, | |
| unpackAlignment: this.unpackAlignment | |
| }; | |
| if ( this.image !== undefined ) { | |
| // TODO: Move to THREE.Image | |
| var image = this.image; | |
| if ( image.uuid === undefined ) { | |
| image.uuid = _Math.generateUUID(); // UGH | |
| } | |
| if ( ! isRootObject && meta.images[ image.uuid ] === undefined ) { | |
| var url; | |
| if ( Array.isArray( image ) ) { | |
| // process array of images e.g. CubeTexture | |
| url = []; | |
| for ( var i = 0, l = image.length; i < l; i ++ ) { | |
| url.push( ImageUtils.getDataURL( image[ i ] ) ); | |
| } | |
| } else { | |
| // process single image | |
| url = ImageUtils.getDataURL( image ); | |
| } | |
| meta.images[ image.uuid ] = { | |
| uuid: image.uuid, | |
| url: url | |
| }; | |
| } | |
| output.image = image.uuid; | |
| } | |
| if ( ! isRootObject ) { | |
| meta.textures[ this.uuid ] = output; | |
| } | |
| return output; | |
| }, | |
| dispose: function () { | |
| this.dispatchEvent( { type: 'dispose' } ); | |
| }, | |
| transformUv: function ( 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; | |
| } | |
| } ); | |
| Object.defineProperty( Texture.prototype, "needsUpdate", { | |
| set: function ( value ) { | |
| if ( value === true ) this.version ++; | |
| } | |
| } ); | |
| export { Texture }; | |