/** * Texture Superset - The apiTexture properties get moved into the Texture object itself, and then the instance is * created * @param apiTexture * @param graphics GameLib.D3.Graphics * @constructor */ GameLib.D3.Texture = function( graphics, apiTexture ) { this.graphics = graphics; this.graphics.isNotThreeThrow(); if (GameLib.Utils.UndefinedOrNull(apiTexture)) { apiTexture = {}; } if (apiTexture instanceof GameLib.D3.Texture) { return apiTexture; } GameLib.D3.API.Texture.call( this, apiTexture.id, apiTexture.typeId, apiTexture.name, apiTexture.image, apiTexture.wrapS, apiTexture.wrapT, apiTexture.repeat, apiTexture.data, apiTexture.format, apiTexture.mapping, apiTexture.magFilter, apiTexture.minFilter, apiTexture.textureType, apiTexture.anisotropy, apiTexture.offset, apiTexture.generateMipmaps, apiTexture.flipY, apiTexture.mipmaps, apiTexture.unpackAlignment, apiTexture.premultiplyAlpha, apiTexture.encoding, apiTexture.parentEntity ); this.offset = new GameLib.Vector2( this.graphics, this.offset, this ); this.repeat = new GameLib.Vector2( this.graphics, this.repeat, this ); if (this.image instanceof GameLib.D3.API.Image) { this.image = new GameLib.D3.Image( this.graphics, this.image ); } this.instance = this.createInstance(); }; GameLib.D3.Texture.prototype = Object.create(GameLib.D3.API.Texture.prototype); GameLib.D3.Texture.prototype.constructor = GameLib.D3.Texture; /** * Texture Formats * @type {number} */ GameLib.D3.Texture.TYPE_ALPHA_FORMAT = 1019; GameLib.D3.Texture.TYPE_RGB_FORMAT = 1020; GameLib.D3.Texture.TYPE_RGBA_FORMAT = 1021; GameLib.D3.Texture.TYPE_LUMINANCE_FORMAT = 1022; GameLib.D3.Texture.TYPE_LUMINANCE_ALPHA_FORMAT = 1023; GameLib.D3.Texture.TYPE_DEPTH_FORMAT = 1026; /** * Mapping modes * @type {number} */ GameLib.D3.Texture.TYPE_UV_MAPPING = 300; GameLib.D3.Texture.TYPE_CUBE_REFLECTION_MAPPING = 301; GameLib.D3.Texture.TYPE_CUBE_REFRACTION_MAPPING = 302; GameLib.D3.Texture.TYPE_EQUI_RECTANGULAR_REFLECTION_MAPPING = 303; GameLib.D3.Texture.TYPE_EQUI_RECTANGULAR_REFRACTION_MAPPING = 304; GameLib.D3.Texture.TYPE_SPHERICAL_REFLECTION_MAPPING = 305; GameLib.D3.Texture.TYPE_CUBE_UV_REFLECTION_MAPPING = 306; GameLib.D3.Texture.TYPE_CUBE_UV_REFRACTION_MAPPING = 307; /** * Wrapping Modes * @type {number} */ GameLib.D3.Texture.TYPE_REPEAT_WRAPPING = 1000; GameLib.D3.Texture.TYPE_CLAMP_TO_EDGE_WRAPPING = 1001; GameLib.D3.Texture.TYPE_MIRRORED_REPEAT_WRAPPING = 1002; /** * Mipmap Filters * @type {number} */ GameLib.D3.Texture.TYPE_NEAREST_FILTER = 1003; GameLib.D3.Texture.TYPE_NEAREST_MIPMAP_NEAREST_FILTER = 1004; GameLib.D3.Texture.TYPE_NEAREST_MIPMAP_LINEAR_FILTER = 1005; GameLib.D3.Texture.TYPE_LINEAR_FILTER = 1006; GameLib.D3.Texture.TYPE_LINEAR_MIPMAP_NEAREST_FILTER = 1007; GameLib.D3.Texture.TYPE_LINEAR_MIPMAP_LINEAR_FILTER = 1008; /** * Texture Data Types * @type {number} */ GameLib.D3.Texture.TYPE_UNSIGNED_BYTE = 1009; GameLib.D3.Texture.TYPE_BYTE = 1010; GameLib.D3.Texture.TYPE_SHORT = 1011; GameLib.D3.Texture.TYPE_UNSIGNED_SHORT = 1012; GameLib.D3.Texture.TYPE_INT = 1013; GameLib.D3.Texture.TYPE_UNSIGNED_INT = 1014; GameLib.D3.Texture.TYPE_FLOAT = 1015; GameLib.D3.Texture.TYPE_HALF_FLOAT = 1025; /** * Encoding Modes * @type {number} */ GameLib.D3.Texture.TYPE_LINEAR_ENCODING = 3000; // NO ENCODING AT ALL. GameLib.D3.Texture.TYPE_SRGB_ENCODING = 3001; GameLib.D3.Texture.TYPE_GAMMA_ENCODING = 3007; // USES GAMMA_FACTOR, FOR BACKWARDS COMPATIBILITY WITH WEBGLRENDERER.GAMMAINPUT/GAMMAOUTPUT GameLib.D3.Texture.TYPE_RGBE_ENCODING = 3002; // AKA RADIANCE. GameLib.D3.Texture.TYPE_LOG_LUV_ENCODING = 3003; GameLib.D3.Texture.TYPE_RGBM7_ENCODING = 3004; GameLib.D3.Texture.TYPE_RGBM16_ENCODING = 3005; GameLib.D3.Texture.TYPE_RGBD_ENCODING = 3006; // MAXRANGE IS 256. GameLib.D3.Texture.TEXTURE_TYPE_NORMAL = 0x1; GameLib.D3.Texture.TEXTURE_TYPE_CUBE = 0x2; // GameLib.D3.Texture.TEXTURE_TYPE_ALPHA = 'alpha'; // GameLib.D3.Texture.TEXTURE_TYPE_AO = 'ao'; // GameLib.D3.Texture.TEXTURE_TYPE_BUMP = 'bump'; // GameLib.D3.Texture.TEXTURE_TYPE_DIFFUSE = 'diffuse'; // GameLib.D3.Texture.TEXTURE_TYPE_DISPLACEMENT = 'displacement'; // GameLib.D3.Texture.TEXTURE_TYPE_EMISSIVE = 'emissive'; // GameLib.D3.Texture.TEXTURE_TYPE_ENVIRONMENT = 'environment'; // GameLib.D3.Texture.TEXTURE_TYPE_LIGHT = 'light'; // GameLib.D3.Texture.TEXTURE_TYPE_METALNESS = 'metalness'; // GameLib.D3.Texture.TEXTURE_TYPE_NORMAL = 'normal'; // GameLib.D3.Texture.TEXTURE_TYPE_ROUGHNESS = 'roughness'; // GameLib.D3.Texture.TEXTURE_TYPE_SPECULAR = 'specular'; /** * Creates an instance of our texture object * @param update * @returns {*} */ GameLib.D3.Texture.prototype.createInstance = function(update) { if (update) { if (!this.instance) { console.warn('trying to update a non-existent texture instance'); return; } if (GameLib.Utils.UndefinedOrNull(this.image.instance)) { console.warn('trying to update while no image instance'); return; } this.instance.name = this.name; this.instance.flipY = this.flipY; this.instance.encoding = this.encoding; this.instance.offset.x = this.offset.x; this.instance.offset.y = this.offset.y; this.instance.repeat.x = this.repeat.x; this.instance.repeat.y = this.repeat.y; this.instance.mapping = this.mapping; this.instance.format = this.format; this.instance.wrapS = this.wrapS; this.instance.wrapT = this.wrapT; this.publish( GameLib.Event.TEXTURE_LOADED, { texture : this } ); this.instance.needsUpdate = true; } else { if (this.image instanceof GameLib.D3.Image) { if (this.image.instance) { var instance = new THREE.Texture( this.image.instance ); instance.name = this.name; instance.flipY = this.flipY; instance.encoding = this.encoding; instance.offset.x = this.offset.x; instance.offset.y = this.offset.y; instance.repeat.x = this.repeat.x; instance.repeat.y = this.repeat.y; instance.mapping = this.mapping; instance.format = this.format; instance.wrapS = this.wrapS; instance.wrapT = this.wrapT; this.publish( GameLib.Event.TEXTURE_LOADED, { texture : this } ); return instance; } } this.subscribe( GameLib.Event.IMAGE_LOADED, function (data) { /** * Only work with images that belong to this texture */ if (data.imagePath === this.image.path) { if (!(this.image instanceof GameLib.D3.Image)) { if (!data.cubeTexture) { console.warn('The image associated with this texture has not been setup properly - objects linked?'); return; } } var instance = null; if (data.cubeTexture) { instance = data.cubeTexture; if (this.mapping !== GameLib.D3.Texture.TYPE_CUBE_REFLECTION_MAPPING && this.mapping !== GameLib.D3.Texture.TYPE_CUBE_REFRACTION_MAPPING ) { this.mapping = GameLib.D3.Texture.TYPE_CUBE_REFLECTION_MAPPING; } } else { instance = new THREE.Texture( data.imageInstance ); if (this.mapping !== GameLib.D3.Texture.TYPE_UV_MAPPING) { this.mapping = GameLib.D3.Texture.TYPE_UV_MAPPING; } } instance.name = this.name; instance.flipY = this.flipY; instance.encoding = this.encoding; instance.offset.x = this.offset.x; instance.offset.y = this.offset.y; instance.repeat.x = this.repeat.x; instance.repeat.y = this.repeat.y; instance.mapping = this.mapping; instance.format = this.format; instance.wrapS = this.wrapS; instance.wrapT = this.wrapT; this.instance = instance; this.publish( GameLib.Event.TEXTURE_LOADED, { texture : this } ); this.instance.needsUpdate = true; } } ); this.subscribe( GameLib.Event.IMAGE_CHANGE, function (data) { var instance = null; if (this.image === null) { instance = new THREE.Texture(); } else { instance = new THREE.Texture(this.image.instance); // instance.needsUpdate = true; // instance.name = this.name; // instance.flipY = this.flipY; // instance.encoding = this.encoding; // instance.offset.x = this.offset.x; // instance.offset.y = this.offset.y; // instance.repeat.x = this.repeat.x; // instance.repeat.y = this.repeat.y; // this.format = instance.format; } this.instance = instance; this.publish( GameLib.Event.TEXTURE_LOADED, { texture : this } ); } ); return null; } }; /** * Updates the instance with the current state */ GameLib.D3.Texture.prototype.updateInstance = function() { this.createInstance(true); }; /** * Converts a GameLib.D3.Texture to a GameLib.D3.API.Texture * @returns {GameLib.D3.API.Texture} */ GameLib.D3.Texture.prototype.toApiObject = function(save) { if (GameLib.Utils.UndefinedOrNull(save)) { save = false; } var apiImage = null; if (this.image) { if (save) { this.image.save(); } apiImage = this.image.id } var apiTexture = new GameLib.D3.API.Texture( this.id, this.typeId, this.name, apiImage, this.wrapS, this.wrapT, this.repeat.toApiObject(), this.data, this.format, this.mapping, this.magFilter, this.minFilter, this.textureType, this.anisotropy, this.offset.toApiObject(), this.generateMipmaps, this.flipY, this.mipmaps, this.unpackAlignment, this.premultiplyAlpha, this.encoding, GameLib.Utils.IdOrNull(this.parentEntity) ); return apiTexture; }; /** * Converts from an Object texture to a GameLib.D3.Texture * @param graphics GameLib.D3.Graphics * @param objectTexture Object * @constructor */ GameLib.D3.Texture.FromObject = function( graphics, objectTexture ) { var apiTexture = GameLib.D3.API.Texture.FromObject(objectTexture); return new GameLib.D3.Texture( graphics, apiTexture ); };