@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 12.9 kB
JavaScript
import{PIXELFORMAT_RGBA32U as t,PIXELFORMAT_RGBA32I as e,PIXELFORMAT_RGBA16U as a,PIXELFORMAT_RGBA16I as _,PIXELFORMAT_RGBA8U as l,PIXELFORMAT_RGBA8I as r,PIXELFORMAT_RG32U as i,PIXELFORMAT_RG32I as s,PIXELFORMAT_RG16U as h,PIXELFORMAT_RG16I as g,PIXELFORMAT_RG8U as m,PIXELFORMAT_RG8I as T,PIXELFORMAT_R32U as o,PIXELFORMAT_R32I as n,PIXELFORMAT_R16U as E,PIXELFORMAT_R16I as I,PIXELFORMAT_R8U as F,PIXELFORMAT_R8I as p,PIXELFORMAT_SRGBA as R,PIXELFORMAT_SRGB as x,PIXELFORMAT_111110F as G,PIXELFORMAT_DEPTHSTENCIL as P,PIXELFORMAT_DEPTH as A,PIXELFORMAT_R32F as d,PIXELFORMAT_RGBA32F as c,PIXELFORMAT_RGB32F as S,PIXELFORMAT_RGBA16F as B,PIXELFORMAT_RGB16F as N,PIXELFORMAT_RG16F as U,PIXELFORMAT_R16F as C,PIXELFORMAT_ATC_RGBA as D,PIXELFORMAT_ATC_RGB as M,PIXELFORMAT_ASTC_4x4 as u,PIXELFORMAT_ETC2_RGBA as b,PIXELFORMAT_ETC2_RGB as y,PIXELFORMAT_PVRTC_4BPP_RGBA_1 as k,PIXELFORMAT_PVRTC_4BPP_RGB_1 as L,PIXELFORMAT_PVRTC_2BPP_RGBA_1 as O,PIXELFORMAT_PVRTC_2BPP_RGB_1 as f,PIXELFORMAT_ETC1 as H,PIXELFORMAT_DXT5 as w,PIXELFORMAT_DXT3 as X,PIXELFORMAT_DXT1 as Y,PIXELFORMAT_RGBA8 as V,PIXELFORMAT_RGB8 as v,PIXELFORMAT_RGBA4 as W,PIXELFORMAT_RGBA5551 as z,PIXELFORMAT_RGB565 as j,PIXELFORMAT_LA8 as q,PIXELFORMAT_L8 as K,PIXELFORMAT_A8 as J}from"../constants.js";function Q(t,e){const a=t.width,_=t.height;if(a>e||_>e){const l=e/Math.max(a,_),r=Math.floor(a*l),i=Math.floor(_*l),s=document.createElement("canvas");s.width=r,s.height=i;return s.getContext("2d").drawImage(t,0,0,a,_,0,0,r,i),s}return t}class Z{constructor(){this._glTexture=null,this._glTarget=void 0,this._glFormat=void 0,this._glInternalFormat=void 0,this._glPixelType=void 0,this._glCreated=void 0,this.dirtyParameterFlags=0}destroy(t){if(this._glTexture){for(let e=0;e<t.textureUnits.length;e++){const a=t.textureUnits[e];for(let t=0;t<a.length;t++)a[t]===this._glTexture&&(a[t]=null)}t.gl.deleteTexture(this._glTexture),this._glTexture=null}}loseContext(){this._glTexture=null}propertyChanged(t){this.dirtyParameterFlags|=t}initialize(Q,Z){const $=Q.gl;switch(this._glTexture=$.createTexture(),this._glTarget=Z._cubemap?$.TEXTURE_CUBE_MAP:Z._volume?$.TEXTURE_3D:Z.array?$.TEXTURE_2D_ARRAY:$.TEXTURE_2D,Z._format){case J:this._glFormat=$.ALPHA,this._glInternalFormat=$.ALPHA,this._glPixelType=$.UNSIGNED_BYTE;break;case K:this._glFormat=$.LUMINANCE,this._glInternalFormat=$.LUMINANCE,this._glPixelType=$.UNSIGNED_BYTE;break;case q:this._glFormat=$.LUMINANCE_ALPHA,this._glInternalFormat=$.LUMINANCE_ALPHA,this._glPixelType=$.UNSIGNED_BYTE;break;case j:this._glFormat=$.RGB,this._glInternalFormat=$.RGB,this._glPixelType=$.UNSIGNED_SHORT_5_6_5;break;case z:this._glFormat=$.RGBA,this._glInternalFormat=$.RGBA,this._glPixelType=$.UNSIGNED_SHORT_5_5_5_1;break;case W:this._glFormat=$.RGBA,this._glInternalFormat=$.RGBA,this._glPixelType=$.UNSIGNED_SHORT_4_4_4_4;break;case v:this._glFormat=$.RGB,this._glInternalFormat=Q.isWebGL2?$.RGB8:$.RGB,this._glPixelType=$.UNSIGNED_BYTE;break;case V:this._glFormat=$.RGBA,this._glInternalFormat=Q.isWebGL2?$.RGBA8:$.RGBA,this._glPixelType=$.UNSIGNED_BYTE;break;case Y:this._glFormat=$.RGB,this._glInternalFormat=Q.extCompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT;break;case X:this._glFormat=$.RGBA,this._glInternalFormat=Q.extCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT;break;case w:this._glFormat=$.RGBA,this._glInternalFormat=Q.extCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT;break;case H:this._glFormat=$.RGB,this._glInternalFormat=Q.extCompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL;break;case f:this._glFormat=$.RGB,this._glInternalFormat=Q.extCompressedTexturePVRTC.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;break;case O:this._glFormat=$.RGBA,this._glInternalFormat=Q.extCompressedTexturePVRTC.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;break;case L:this._glFormat=$.RGB,this._glInternalFormat=Q.extCompressedTexturePVRTC.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;break;case k:this._glFormat=$.RGBA,this._glInternalFormat=Q.extCompressedTexturePVRTC.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;break;case y:this._glFormat=$.RGB,this._glInternalFormat=Q.extCompressedTextureETC.COMPRESSED_RGB8_ETC2;break;case b:this._glFormat=$.RGBA,this._glInternalFormat=Q.extCompressedTextureETC.COMPRESSED_RGBA8_ETC2_EAC;break;case u:this._glFormat=$.RGBA,this._glInternalFormat=Q.extCompressedTextureASTC.COMPRESSED_RGBA_ASTC_4x4_KHR;break;case M:this._glFormat=$.RGB,this._glInternalFormat=Q.extCompressedTextureATC.COMPRESSED_RGB_ATC_WEBGL;break;case D:this._glFormat=$.RGBA,this._glInternalFormat=Q.extCompressedTextureATC.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL;break;case C:Q.isWebGL2?(this._glFormat=$.RED,this._glInternalFormat=$.R16F,this._glPixelType=$.HALF_FLOAT):(this._glFormat=$.LUMINANCE,this._glInternalFormat=$.LUMINANCE,this._glPixelType=Q.extTextureHalfFloat.HALF_FLOAT_OES);break;case U:Q.isWebGL2?(this._glFormat=$.RG,this._glInternalFormat=$.RG16F,this._glPixelType=$.HALF_FLOAT):(this._glFormat=$.RG,this._glInternalFormat=$.RG,this._glPixelType=Q.extTextureHalfFloat.HALF_FLOAT_OES);break;case N:this._glFormat=$.RGB,Q.isWebGL2?(this._glInternalFormat=$.RGB16F,this._glPixelType=$.HALF_FLOAT):(this._glInternalFormat=$.RGB,this._glPixelType=Q.extTextureHalfFloat.HALF_FLOAT_OES);break;case B:this._glFormat=$.RGBA,Q.isWebGL2?(this._glInternalFormat=$.RGBA16F,this._glPixelType=$.HALF_FLOAT):(this._glInternalFormat=$.RGBA,this._glPixelType=Q.extTextureHalfFloat.HALF_FLOAT_OES);break;case S:this._glFormat=$.RGB,Q.isWebGL2?this._glInternalFormat=$.RGB32F:this._glInternalFormat=$.RGB,this._glPixelType=$.FLOAT;break;case c:this._glFormat=$.RGBA,Q.isWebGL2?this._glInternalFormat=$.RGBA32F:this._glInternalFormat=$.RGBA,this._glPixelType=$.FLOAT;break;case d:this._glFormat=$.RED,this._glInternalFormat=$.R32F,this._glPixelType=$.FLOAT;break;case A:Q.isWebGL2?(this._glFormat=$.DEPTH_COMPONENT,this._glInternalFormat=$.DEPTH_COMPONENT32F,this._glPixelType=$.FLOAT):(this._glFormat=$.DEPTH_COMPONENT,this._glInternalFormat=$.DEPTH_COMPONENT,this._glPixelType=$.UNSIGNED_SHORT);break;case P:this._glFormat=$.DEPTH_STENCIL,Q.isWebGL2?(this._glInternalFormat=$.DEPTH24_STENCIL8,this._glPixelType=$.UNSIGNED_INT_24_8):(this._glInternalFormat=$.DEPTH_STENCIL,this._glPixelType=Q.extDepthTexture.UNSIGNED_INT_24_8_WEBGL);break;case G:this._glFormat=$.RGB,this._glInternalFormat=$.R11F_G11F_B10F,this._glPixelType=$.UNSIGNED_INT_10F_11F_11F_REV;break;case x:this._glFormat=$.RGB,this._glInternalFormat=$.SRGB8,this._glPixelType=$.UNSIGNED_BYTE;break;case R:this._glFormat=$.RGBA,this._glInternalFormat=$.SRGB8_ALPHA8,this._glPixelType=$.UNSIGNED_BYTE;break;case p:this._glFormat=$.RED_INTEGER,this._glInternalFormat=$.R8I,this._glPixelType=$.BYTE;break;case F:this._glFormat=$.RED_INTEGER,this._glInternalFormat=$.R8UI,this._glPixelType=$.UNSIGNED_BYTE;break;case I:this._glFormat=$.RED_INTEGER,this._glInternalFormat=$.R16I,this._glPixelType=$.SHORT;break;case E:this._glFormat=$.RED_INTEGER,this._glInternalFormat=$.R16UI,this._glPixelType=$.UNSIGNED_SHORT;break;case n:this._glFormat=$.RED_INTEGER,this._glInternalFormat=$.R32I,this._glPixelType=$.INT;break;case o:this._glFormat=$.RED_INTEGER,this._glInternalFormat=$.R32UI,this._glPixelType=$.UNSIGNED_INT;break;case T:this._glFormat=$.RG_INTEGER,this._glInternalFormat=$.RG8I,this._glPixelType=$.BYTE;break;case m:this._glFormat=$.RG_INTEGER,this._glInternalFormat=$.RG8UI,this._glPixelType=$.UNSIGNED_BYTE;break;case g:this._glFormat=$.RG_INTEGER,this._glInternalFormat=$.RG16I,this._glPixelType=$.SHORT;break;case h:this._glFormat=$.RG_INTEGER,this._glInternalFormat=$.RG16UI,this._glPixelType=$.UNSIGNED_SHORT;break;case s:this._glFormat=$.RG_INTEGER,this._glInternalFormat=$.RG32I,this._glPixelType=$.INT;break;case i:this._glFormat=$.RG_INTEGER,this._glInternalFormat=$.RG32UI,this._glPixelType=$.UNSIGNED_INT;break;case r:this._glFormat=$.RGBA_INTEGER,this._glInternalFormat=$.RGBA8I,this._glPixelType=$.BYTE;break;case l:this._glFormat=$.RGBA_INTEGER,this._glInternalFormat=$.RGBA8UI,this._glPixelType=$.UNSIGNED_BYTE;break;case _:this._glFormat=$.RGBA_INTEGER,this._glInternalFormat=$.RGBA16I,this._glPixelType=$.SHORT;break;case a:this._glFormat=$.RGBA_INTEGER,this._glInternalFormat=$.RGBA16UI,this._glPixelType=$.UNSIGNED_SHORT;break;case e:this._glFormat=$.RGBA_INTEGER,this._glInternalFormat=$.RGBA32I,this._glPixelType=$.INT;break;case t:this._glFormat=$.RGBA_INTEGER,this._glInternalFormat=$.RGBA32UI,this._glPixelType=$.UNSIGNED_INT}this._glCreated=!1}upload(t,e){const a=t.gl;if(!e._needsUpload&&(e._needsMipmapsUpload&&e._mipmapsUploaded||!e.pot))return;let _,l,r=0;const i=e.requiredMipLevels;for(e.array&&a.texStorage3D(a.TEXTURE_2D_ARRAY,i,this._glInternalFormat,e._width,e._height,e._arrayLength);e._levels[r]||0===r;)if(e._needsUpload||0!==r){if(r&&(!e._needsMipmapsUpload||!e._mipmaps))break;if(_=e._levels[r],l=1/Math.pow(2,r),1===r&&!e._compressed&&!e._integerFormat&&e._levels.length<i&&(a.generateMipmap(this._glTarget),e._mipmapsUploaded=!0),e._cubemap){let i;if(t._isBrowserInterface(_[0]))for(i=0;i<6;i++){if(!e._levelsUpdated[0][i])continue;let l=_[i];t._isImageBrowserInterface(l)&&(l.width>t.maxCubeMapSize||l.height>t.maxCubeMapSize)&&(l=Q(l,t.maxCubeMapSize),0===r&&(e._width=l.width,e._height=l.height)),t.setUnpackFlipY(!1),t.setUnpackPremultiplyAlpha(e._premultiplyAlpha),this._glCreated?a.texSubImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+i,r,0,0,this._glFormat,this._glPixelType,l):a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+i,r,this._glInternalFormat,this._glFormat,this._glPixelType,l)}else for(l=1/Math.pow(2,r),i=0;i<6;i++){if(!e._levelsUpdated[0][i])continue;const s=_[i];e._compressed?this._glCreated&&s?a.compressedTexSubImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+i,r,0,0,Math.max(e._width*l,1),Math.max(e._height*l,1),this._glInternalFormat,s):a.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+i,r,this._glInternalFormat,Math.max(e._width*l,1),Math.max(e._height*l,1),0,s):(t.setUnpackFlipY(!1),t.setUnpackPremultiplyAlpha(e._premultiplyAlpha),this._glCreated&&s?a.texSubImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+i,r,0,0,Math.max(e._width*l,1),Math.max(e._height*l,1),this._glFormat,this._glPixelType,s):a.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+i,r,this._glInternalFormat,Math.max(e._width*l,1),Math.max(e._height*l,1),0,this._glFormat,this._glPixelType,s))}}else if(e._volume)e._compressed?a.compressedTexImage3D(a.TEXTURE_3D,r,this._glInternalFormat,Math.max(e._width*l,1),Math.max(e._height*l,1),Math.max(e._depth*l,1),0,_):(t.setUnpackFlipY(!1),t.setUnpackPremultiplyAlpha(e._premultiplyAlpha),a.texImage3D(a.TEXTURE_3D,r,this._glInternalFormat,Math.max(e._width*l,1),Math.max(e._height*l,1),Math.max(e._depth*l,1),0,this._glFormat,this._glPixelType,_));else if(e.array&&"object"==typeof _){if(e._arrayLength===_.length)if(e._compressed)for(let t=0;t<e._arrayLength;t++)a.compressedTexSubImage3D(a.TEXTURE_2D_ARRAY,r,0,0,t,Math.max(Math.floor(e._width*l),1),Math.max(Math.floor(e._height*l),1),1,this._glInternalFormat,_[t]);else for(let t=0;t<e._arrayLength;t++)a.texSubImage3D(a.TEXTURE_2D_ARRAY,r,0,0,t,Math.max(Math.floor(e._width*l),1),Math.max(Math.floor(e._height*l),1),1,this._glFormat,this._glPixelType,_[t])}else{if(t._isBrowserInterface(_)){t._isImageBrowserInterface(_)&&(_.width>t.maxTextureSize||_.height>t.maxTextureSize)&&(_=Q(_,t.maxTextureSize),0===r&&(e._width=_.width,e._height=_.height));const l=_.width||_.videoWidth,i=_.height||_.videoHeight;t.setUnpackFlipY(e._flipY),t.setUnpackPremultiplyAlpha(e._premultiplyAlpha),this._glCreated&&e._width===l&&e._height===i&&!t._isImageVideoInterface(_)?a.texSubImage2D(a.TEXTURE_2D,r,0,0,this._glFormat,this._glPixelType,_):(a.texImage2D(a.TEXTURE_2D,r,this._glInternalFormat,this._glFormat,this._glPixelType,_),0===r&&(e._width=l,e._height=i))}else l=1/Math.pow(2,r),e._compressed?this._glCreated&&_?a.compressedTexSubImage2D(a.TEXTURE_2D,r,0,0,Math.max(Math.floor(e._width*l),1),Math.max(Math.floor(e._height*l),1),this._glInternalFormat,_):a.compressedTexImage2D(a.TEXTURE_2D,r,this._glInternalFormat,Math.max(Math.floor(e._width*l),1),Math.max(Math.floor(e._height*l),1),0,_):(t.setUnpackFlipY(!1),t.setUnpackPremultiplyAlpha(e._premultiplyAlpha),this._glCreated&&_?a.texSubImage2D(a.TEXTURE_2D,r,0,0,Math.max(e._width*l,1),Math.max(e._height*l,1),this._glFormat,this._glPixelType,_):a.texImage2D(a.TEXTURE_2D,r,this._glInternalFormat,Math.max(e._width*l,1),Math.max(e._height*l,1),0,this._glFormat,this._glPixelType,_));e._mipmapsUploaded=0!==r}r++}else r++;if(e._needsUpload)if(e._cubemap)for(let t=0;t<6;t++)e._levelsUpdated[0][t]=!1;else e._levelsUpdated[0]=!1;!e._compressed&&!e._integerFormat&&e._mipmaps&&e._needsMipmapsUpload&&(e.pot||t.isWebGL2)&&1===e._levels.length&&(a.generateMipmap(this._glTarget),e._mipmapsUploaded=!0),e._gpuSize&&e.adjustVramSizeTracking(t._vram,-e._gpuSize),e._gpuSize=e.gpuSize,e.adjustVramSizeTracking(t._vram,e._gpuSize),this._glCreated=!0}}export{Z as WebglTexture};