@babylonjs/core 4.2.1 → 4.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"thinEngine.js","sourceRoot":"","sources":["../../../sourceES6/core/Engines/thinEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import { EngineStore } from './engineStore';\r\nimport { IInternalTextureLoader } from '../Materials/Textures/internalTextureLoader';\r\nimport { Effect, IEffectCreationOptions } from '../Materials/effect';\r\nimport { _DevTools } from '../Misc/devTools';\r\nimport { IShaderProcessor } from './Processors/iShaderProcessor';\r\nimport { UniformBuffer } from '../Materials/uniformBuffer';\r\nimport { Nullable, DataArray, IndicesArray } from '../types';\r\nimport { EngineCapabilities } from './engineCapabilities';\r\nimport { Observable } from '../Misc/observable';\r\nimport { DepthCullingState } from '../States/depthCullingState';\r\nimport { StencilState } from '../States/stencilState';\r\nimport { AlphaState } from '../States/alphaCullingState';\r\n\r\nimport { InternalTexture, InternalTextureSource } from '../Materials/Textures/internalTexture';\r\nimport { IViewportLike, IColor4Like } from '../Maths/math.like';\r\nimport { DataBuffer } from '../Meshes/dataBuffer';\r\nimport { IFileRequest } from '../Misc/fileRequest';\r\nimport { Logger } from '../Misc/logger';\r\nimport { DomManagement } from '../Misc/domManagement';\r\nimport { WebGLShaderProcessor } from './WebGL/webGLShaderProcessors';\r\nimport { WebGL2ShaderProcessor } from './WebGL/webGL2ShaderProcessors';\r\nimport { WebGLDataBuffer } from '../Meshes/WebGL/webGLDataBuffer';\r\nimport { IPipelineContext } from './IPipelineContext';\r\nimport { WebGLPipelineContext } from './WebGL/webGLPipelineContext';\r\nimport { VertexBuffer } from '../Meshes/buffer';\r\nimport { InstancingAttributeInfo } from './instancingAttributeInfo';\r\nimport { ThinTexture } from '../Materials/Textures/thinTexture';\r\nimport { IOfflineProvider } from '../Offline/IOfflineProvider';\r\nimport { IEffectFallbacks } from '../Materials/iEffectFallbacks';\r\nimport { IWebRequest } from '../Misc/interfaces/iWebRequest';\r\nimport { CanvasGenerator } from '../Misc/canvasGenerator';\r\nimport { PerformanceConfigurator } from './performanceConfigurator';\r\n\r\ndeclare type WebRequest = import(\"../Misc/webRequest\").WebRequest;\r\ndeclare type LoadFileError = import(\"../Misc/fileTools\").LoadFileError;\r\ndeclare type Observer<T> = import(\"../Misc/observable\").Observer<T>;\r\ndeclare type VideoTexture = import(\"../Materials/Textures/videoTexture\").VideoTexture;\r\ndeclare type RenderTargetTexture = import(\"../Materials/Textures/renderTargetTexture\").RenderTargetTexture;\r\ndeclare type Texture = import(\"../Materials/Textures/texture\").Texture;\r\n\r\n/**\r\n * Defines the interface used by objects working like Scene\r\n * @hidden\r\n */\r\nexport interface ISceneLike {\r\n _addPendingData(data: any): void;\r\n _removePendingData(data: any): void;\r\n offlineProvider: IOfflineProvider;\r\n}\r\n\r\n/**\r\n * Keeps track of all the buffer info used in engine.\r\n */\r\nclass BufferPointer {\r\n public active: boolean;\r\n public index: number;\r\n public size: number;\r\n public type: number;\r\n public normalized: boolean;\r\n public stride: number;\r\n public offset: number;\r\n public buffer: WebGLBuffer;\r\n}\r\n\r\n/**\r\n * Information about the current host\r\n */\r\nexport interface HostInformation {\r\n /**\r\n * Defines if the current host is a mobile\r\n */\r\n isMobile: boolean;\r\n}\r\n\r\n/** Interface defining initialization parameters for Engine class */\r\nexport interface EngineOptions extends WebGLContextAttributes {\r\n /**\r\n * Defines if the engine should no exceed a specified device ratio\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio\r\n */\r\n limitDeviceRatio?: number;\r\n /**\r\n * Defines if webvr should be enabled automatically\r\n * @see https://doc.babylonjs.com/how_to/webvr_camera\r\n */\r\n autoEnableWebVR?: boolean;\r\n /**\r\n * Defines if webgl2 should be turned off even if supported\r\n * @see https://doc.babylonjs.com/features/webgl2\r\n */\r\n disableWebGL2Support?: boolean;\r\n /**\r\n * Defines if webaudio should be initialized as well\r\n * @see https://doc.babylonjs.com/how_to/playing_sounds_and_music\r\n */\r\n audioEngine?: boolean;\r\n /**\r\n * Defines if animations should run using a deterministic lock step\r\n * @see https://doc.babylonjs.com/babylon101/animations#deterministic-lockstep\r\n */\r\n deterministicLockstep?: boolean;\r\n /** Defines the maximum steps to use with deterministic lock step mode */\r\n lockstepMaxSteps?: number;\r\n /** Defines the seconds between each deterministic lock step */\r\n timeStep?: number;\r\n /**\r\n * Defines that engine should ignore context lost events\r\n * If this event happens when this parameter is true, you will have to reload the page to restore rendering\r\n */\r\n\r\n doNotHandleContextLost?: boolean;\r\n /**\r\n * Defines that engine should ignore modifying touch action attribute and style\r\n * If not handle, you might need to set it up on your side for expected touch devices behavior.\r\n */\r\n doNotHandleTouchAction?: boolean;\r\n /**\r\n * Defines that engine should compile shaders with high precision floats (if supported). True by default\r\n */\r\n useHighPrecisionFloats?: boolean;\r\n /**\r\n * Make the canvas XR Compatible for XR sessions\r\n */\r\n xrCompatible?: boolean;\r\n\r\n /**\r\n * Make the matrix computations to be performed in 64 bits instead of 32 bits. False by default\r\n */\r\n useHighPrecisionMatrix?: boolean;\r\n\r\n /**\r\n * Will prevent the system from falling back to software implementation if a hardware device cannot be created\r\n */\r\n failIfMajorPerformanceCaveat?: boolean;\r\n}\r\n\r\n/**\r\n * The base engine class (root of all engines)\r\n */\r\nexport class ThinEngine {\r\n /** Use this array to turn off some WebGL2 features on known buggy browsers version */\r\n public static ExceptionList = [\r\n { key: \"Chrome\\/63\\.0\", capture: \"63\\\\.0\\\\.3239\\\\.(\\\\d+)\", captureConstraint: 108, targets: [\"uniformBuffer\"] },\r\n { key: \"Firefox\\/58\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Firefox\\/59\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Chrome\\/72.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Chrome\\/73.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Chrome\\/74.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome\\/71\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome\\/72\", capture: null, captureConstraint: null, targets: [\"vao\"] }\r\n ];\r\n\r\n /** @hidden */\r\n public static _TextureLoaders: IInternalTextureLoader[] = [];\r\n\r\n /**\r\n * Returns the current npm package of the sdk\r\n */\r\n // Not mixed with Version for tooling purpose.\r\n public static get NpmPackage(): string {\r\n return \"babylonjs@4.2.1\";\r\n }\r\n\r\n /**\r\n * Returns the current version of the framework\r\n */\r\n public static get Version(): string {\r\n return \"4.2.1\";\r\n }\r\n\r\n /**\r\n * Returns a string describing the current engine\r\n */\r\n public get description(): string {\r\n let description = \"WebGL\" + this.webGLVersion;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n description += \" - Parallel shader compilation\";\r\n }\r\n\r\n return description;\r\n }\r\n\r\n // Updatable statics so stick with vars here\r\n\r\n /**\r\n * Gets or sets the epsilon value used by collision engine\r\n */\r\n public static CollisionsEpsilon = 0.001;\r\n\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static get ShadersRepository(): string {\r\n return Effect.ShadersRepository;\r\n }\r\n public static set ShadersRepository(value: string) {\r\n Effect.ShadersRepository = value;\r\n }\r\n\r\n // Public members\r\n\r\n /** @hidden */\r\n public _shaderProcessor: IShaderProcessor;\r\n\r\n /**\r\n * Gets or sets a boolean that indicates if textures must be forced to power of 2 size even if not required\r\n */\r\n public forcePOTTextures = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the engine is currently rendering in fullscreen mode\r\n */\r\n public isFullscreen = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if back faces must be culled (true by default)\r\n */\r\n public cullBackFaces = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the engine must keep rendering even if the window is not in foregroun\r\n */\r\n public renderEvenInBackground = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that cache can be kept between frames\r\n */\r\n public preventCacheWipeBetweenFrames = false;\r\n\r\n /** Gets or sets a boolean indicating if the engine should validate programs after compilation */\r\n public validateShaderPrograms = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near.\r\n * This can provide greater z depth for distant objects.\r\n */\r\n public useReverseDepthBuffer = false;\r\n // Uniform buffers list\r\n\r\n /**\r\n * Gets or sets a boolean indicating that uniform buffers must be disabled even if they are supported\r\n */\r\n public disableUniformBuffers = false;\r\n\r\n /** @hidden */\r\n public _uniformBuffers = new Array<UniformBuffer>();\r\n\r\n /**\r\n * Gets a boolean indicating that the engine supports uniform buffers\r\n * @see https://doc.babylonjs.com/features/webgl2#uniform-buffer-objets\r\n */\r\n public get supportsUniformBuffers(): boolean {\r\n return this.webGLVersion > 1 && !this.disableUniformBuffers;\r\n }\r\n\r\n // Private Members\r\n\r\n /** @hidden */\r\n public _gl: WebGLRenderingContext;\r\n /** @hidden */\r\n public _webGLVersion = 1.0;\r\n protected _renderingCanvas: Nullable<HTMLCanvasElement>;\r\n protected _windowIsBackground = false;\r\n protected _creationOptions: EngineOptions;\r\n\r\n protected _highPrecisionShadersAllowed = true;\r\n /** @hidden */\r\n public get _shouldUseHighPrecisionShader(): boolean {\r\n return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that only power of 2 textures are supported\r\n * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them\r\n */\r\n public get needPOTTextures(): boolean {\r\n return this._webGLVersion < 2 || this.forcePOTTextures;\r\n }\r\n\r\n /** @hidden */\r\n public _badOS = false;\r\n\r\n /** @hidden */\r\n public _badDesktopOS = false;\r\n\r\n private _hardwareScalingLevel: number;\r\n /** @hidden */\r\n public _caps: EngineCapabilities;\r\n private _isStencilEnable: boolean;\r\n\r\n private _glVersion: string;\r\n private _glRenderer: string;\r\n private _glVendor: string;\r\n\r\n /** @hidden */\r\n public _videoTextureSupported: boolean;\r\n\r\n protected _renderingQueueLaunched = false;\r\n protected _activeRenderLoops = new Array<() => void>();\r\n\r\n // Lost context\r\n /**\r\n * Observable signaled when a context lost event is raised\r\n */\r\n public onContextLostObservable = new Observable<ThinEngine>();\r\n /**\r\n * Observable signaled when a context restored event is raised\r\n */\r\n public onContextRestoredObservable = new Observable<ThinEngine>();\r\n private _onContextLost: (evt: Event) => void;\r\n private _onContextRestored: (evt: Event) => void;\r\n protected _contextWasLost = false;\r\n\r\n /** @hidden */\r\n public _doNotHandleContextLost = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events\r\n * @see https://doc.babylonjs.com/how_to/optimizing_your_scene#handling-webgl-context-lost\r\n */\r\n public get doNotHandleContextLost(): boolean {\r\n return this._doNotHandleContextLost;\r\n }\r\n\r\n public set doNotHandleContextLost(value: boolean) {\r\n this._doNotHandleContextLost = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that vertex array object must be disabled even if they are supported\r\n */\r\n public disableVertexArrayObjects = false;\r\n\r\n // States\r\n /** @hidden */\r\n protected _colorWrite = true;\r\n /** @hidden */\r\n protected _colorWriteChanged = true;\r\n /** @hidden */\r\n protected _depthCullingState = new DepthCullingState();\r\n /** @hidden */\r\n protected _stencilState = new StencilState();\r\n /** @hidden */\r\n public _alphaState = new AlphaState();\r\n /** @hidden */\r\n public _alphaMode = 1;\r\n /** @hidden */\r\n public _alphaEquation = 0;\r\n\r\n // Cache\r\n /** @hidden */\r\n public _internalTexturesCache = new Array<InternalTexture>();\r\n /** @hidden */\r\n protected _activeChannel = 0;\r\n private _currentTextureChannel = -1;\r\n /** @hidden */\r\n protected _boundTexturesCache: { [key: string]: Nullable<InternalTexture> } = {};\r\n /** @hidden */\r\n protected _currentEffect: Nullable<Effect>;\r\n /** @hidden */\r\n protected _currentProgram: Nullable<WebGLProgram>;\r\n private _compiledEffects: { [key: string]: Effect } = {};\r\n private _vertexAttribArraysEnabled: boolean[] = [];\r\n /** @hidden */\r\n protected _cachedViewport: Nullable<IViewportLike>;\r\n private _cachedVertexArrayObject: Nullable<WebGLVertexArrayObject>;\r\n /** @hidden */\r\n protected _cachedVertexBuffers: any;\r\n /** @hidden */\r\n protected _cachedIndexBuffer: Nullable<DataBuffer>;\r\n /** @hidden */\r\n protected _cachedEffectForVertexBuffers: Nullable<Effect>;\r\n /** @hidden */\r\n public _currentRenderTarget: Nullable<InternalTexture>;\r\n private _uintIndicesCurrentlySet = false;\r\n protected _currentBoundBuffer = new Array<Nullable<WebGLBuffer>>();\r\n /** @hidden */\r\n public _currentFramebuffer: Nullable<WebGLFramebuffer> = null;\r\n /** @hidden */\r\n public _dummyFramebuffer: Nullable<WebGLFramebuffer> = null;\r\n private _currentBufferPointers = new Array<BufferPointer>();\r\n private _currentInstanceLocations = new Array<number>();\r\n private _currentInstanceBuffers = new Array<DataBuffer>();\r\n private _textureUnits: Int32Array;\r\n\r\n /** @hidden */\r\n public _workingCanvas: Nullable<HTMLCanvasElement | OffscreenCanvas>;\r\n /** @hidden */\r\n public _workingContext: Nullable<CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D>;\r\n\r\n /** @hidden */\r\n public _boundRenderFunction: any;\r\n\r\n private _vaoRecordInProgress = false;\r\n private _mustWipeVertexAttributes = false;\r\n\r\n private _emptyTexture: Nullable<InternalTexture>;\r\n private _emptyCubeTexture: Nullable<InternalTexture>;\r\n private _emptyTexture3D: Nullable<InternalTexture>;\r\n private _emptyTexture2DArray: Nullable<InternalTexture>;\r\n\r\n /** @hidden */\r\n public _frameHandler: number;\r\n\r\n private _nextFreeTextureSlots = new Array<number>();\r\n private _maxSimultaneousTextures = 0;\r\n\r\n private _activeRequests = new Array<IFileRequest>();\r\n\r\n /** @hidden */\r\n public _transformTextureUrl: Nullable<(url: string) => string> = null;\r\n\r\n /**\r\n * Gets information about the current host\r\n */\r\n public hostInformation: HostInformation = {\r\n isMobile: false\r\n };\r\n\r\n protected get _supportsHardwareTextureRescaling() {\r\n return false;\r\n }\r\n\r\n private _framebufferDimensionsObject: Nullable<{framebufferWidth: number, framebufferHeight: number}>;\r\n\r\n /**\r\n * sets the object from which width and height will be taken from when getting render width and height\r\n * Will fallback to the gl object\r\n * @param dimensions the framebuffer width and height that will be used.\r\n */\r\n public set framebufferDimensionsObject(dimensions: Nullable<{framebufferWidth: number, framebufferHeight: number}>) {\r\n this._framebufferDimensionsObject = dimensions;\r\n }\r\n\r\n /**\r\n * Gets the current viewport\r\n */\r\n public get currentViewport(): Nullable<IViewportLike> {\r\n return this._cachedViewport;\r\n }\r\n\r\n /**\r\n * Gets the default empty texture\r\n */\r\n public get emptyTexture(): InternalTexture {\r\n if (!this._emptyTexture) {\r\n this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, 5, false, false, 1);\r\n }\r\n\r\n return this._emptyTexture;\r\n }\r\n\r\n /**\r\n * Gets the default empty 3D texture\r\n */\r\n public get emptyTexture3D(): InternalTexture {\r\n if (!this._emptyTexture3D) {\r\n this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, 5, false, false, 1);\r\n }\r\n\r\n return this._emptyTexture3D;\r\n }\r\n\r\n /**\r\n * Gets the default empty 2D array texture\r\n */\r\n public get emptyTexture2DArray(): InternalTexture {\r\n if (!this._emptyTexture2DArray) {\r\n this._emptyTexture2DArray = this.createRawTexture2DArray(new Uint8Array(4), 1, 1, 1, 5, false, false, 1);\r\n }\r\n\r\n return this._emptyTexture2DArray;\r\n }\r\n\r\n /**\r\n * Gets the default empty cube texture\r\n */\r\n public get emptyCubeTexture(): InternalTexture {\r\n if (!this._emptyCubeTexture) {\r\n var faceData = new Uint8Array(4);\r\n var cubeData = [faceData, faceData, faceData, faceData, faceData, faceData];\r\n this._emptyCubeTexture = this.createRawCubeTexture(cubeData, 1, 5, 0, false, false, 1);\r\n }\r\n\r\n return this._emptyCubeTexture;\r\n }\r\n\r\n /**\r\n * Defines whether the engine has been created with the premultipliedAlpha option on or not.\r\n */\r\n public readonly premultipliedAlpha: boolean = true;\r\n\r\n /**\r\n * Observable event triggered before each texture is initialized\r\n */\r\n public onBeforeTextureInitObservable = new Observable<Texture>();\r\n\r\n /**\r\n * Creates a new engine\r\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which alreay used the WebGL context\r\n * @param antialias defines enable antialiasing (default: false)\r\n * @param options defines further options to be sent to the getContext() function\r\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n constructor(canvasOrContext: Nullable<HTMLCanvasElement | OffscreenCanvas | WebGLRenderingContext | WebGL2RenderingContext>, antialias?: boolean, options?: EngineOptions, adaptToDeviceRatio: boolean = false) {\r\n\r\n let canvas: Nullable<HTMLCanvasElement> = null;\r\n\r\n if (!canvasOrContext) {\r\n return;\r\n }\r\n\r\n options = options || {};\r\n\r\n PerformanceConfigurator.SetMatrixPrecision(!!options.useHighPrecisionMatrix);\r\n\r\n if ((canvasOrContext as any).getContext) {\r\n canvas = <HTMLCanvasElement>canvasOrContext;\r\n this._renderingCanvas = canvas;\r\n\r\n if (antialias != null) {\r\n options.antialias = antialias;\r\n }\r\n\r\n if (options.deterministicLockstep === undefined) {\r\n options.deterministicLockstep = false;\r\n }\r\n\r\n if (options.lockstepMaxSteps === undefined) {\r\n options.lockstepMaxSteps = 4;\r\n }\r\n\r\n if (options.timeStep === undefined) {\r\n options.timeStep = 1 / 60;\r\n }\r\n\r\n if (options.preserveDrawingBuffer === undefined) {\r\n options.preserveDrawingBuffer = false;\r\n }\r\n\r\n if (options.audioEngine === undefined) {\r\n options.audioEngine = true;\r\n }\r\n\r\n if (options.stencil === undefined) {\r\n options.stencil = true;\r\n }\r\n\r\n if (options.premultipliedAlpha === false) {\r\n this.premultipliedAlpha = false;\r\n }\r\n\r\n if (options.xrCompatible === undefined) {\r\n options.xrCompatible = true;\r\n }\r\n\r\n this._doNotHandleContextLost = options.doNotHandleContextLost ? true : false;\r\n\r\n // Exceptions\r\n if (navigator && navigator.userAgent) {\r\n let ua = navigator.userAgent;\r\n\r\n this.hostInformation.isMobile = ua.indexOf(\"Mobile\") !== -1;\r\n\r\n for (var exception of ThinEngine.ExceptionList) {\r\n let key = exception.key;\r\n let targets = exception.targets;\r\n let check = new RegExp(key);\r\n\r\n if (check.test(ua)) {\r\n if (exception.capture && exception.captureConstraint) {\r\n let capture = exception.capture;\r\n let constraint = exception.captureConstraint;\r\n\r\n let regex = new RegExp(capture);\r\n let matches = regex.exec(ua);\r\n\r\n if (matches && matches.length > 0) {\r\n let capturedValue = parseInt(matches[matches.length - 1]);\r\n if (capturedValue >= constraint) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n for (var target of targets) {\r\n switch (target) {\r\n case \"uniformBuffer\":\r\n this.disableUniformBuffers = true;\r\n break;\r\n case \"vao\":\r\n this.disableVertexArrayObjects = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Context lost\r\n if (!this._doNotHandleContextLost) {\r\n this._onContextLost = (evt: Event) => {\r\n evt.preventDefault();\r\n this._contextWasLost = true;\r\n Logger.Warn(\"WebGL context lost.\");\r\n\r\n this.onContextLostObservable.notifyObservers(this);\r\n };\r\n\r\n this._onContextRestored = () => {\r\n // Adding a timeout to avoid race condition at browser level\r\n setTimeout(() => {\r\n // Rebuild gl context\r\n this._initGLContext();\r\n // Rebuild effects\r\n this._rebuildEffects();\r\n // Rebuild textures\r\n this._rebuildInternalTextures();\r\n // Rebuild buffers\r\n this._rebuildBuffers();\r\n // Cache\r\n this.wipeCaches(true);\r\n Logger.Warn(\"WebGL context successfully restored.\");\r\n this.onContextRestoredObservable.notifyObservers(this);\r\n this._contextWasLost = false;\r\n }, 0);\r\n };\r\n\r\n canvas.addEventListener(\"webglcontextlost\", this._onContextLost, false);\r\n canvas.addEventListener(\"webglcontextrestored\", this._onContextRestored, false);\r\n\r\n options.powerPreference = \"high-performance\";\r\n }\r\n\r\n // GL\r\n if (!options.disableWebGL2Support) {\r\n try {\r\n this._gl = <any>(canvas.getContext(\"webgl2\", options) || canvas.getContext(\"experimental-webgl2\", options));\r\n if (this._gl) {\r\n this._webGLVersion = 2.0;\r\n\r\n // Prevent weird browsers to lie (yeah that happens!)\r\n if (!this._gl.deleteQuery) {\r\n this._webGLVersion = 1.0;\r\n }\r\n }\r\n } catch (e) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n if (!this._gl) {\r\n if (!canvas) {\r\n throw new Error(\"The provided canvas is null or undefined.\");\r\n }\r\n try {\r\n this._gl = <WebGLRenderingContext>(canvas.getContext(\"webgl\", options) || canvas.getContext(\"experimental-webgl\", options));\r\n } catch (e) {\r\n throw new Error(\"WebGL not supported\");\r\n }\r\n }\r\n\r\n if (!this._gl) {\r\n throw new Error(\"WebGL not supported\");\r\n }\r\n } else {\r\n this._gl = <WebGLRenderingContext>canvasOrContext;\r\n this._renderingCanvas = this._gl.canvas as HTMLCanvasElement;\r\n\r\n if (this._gl.renderbufferStorageMultisample) {\r\n this._webGLVersion = 2.0;\r\n }\r\n\r\n const attributes = this._gl.getContextAttributes();\r\n if (attributes) {\r\n options.stencil = attributes.stencil;\r\n }\r\n }\r\n\r\n // Ensures a consistent color space unpacking of textures cross browser.\r\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE);\r\n\r\n if (options.useHighPrecisionFloats !== undefined) {\r\n this._highPrecisionShadersAllowed = options.useHighPrecisionFloats;\r\n }\r\n\r\n // Viewport\r\n const devicePixelRatio = DomManagement.IsWindowObjectExist() ? (window.devicePixelRatio || 1.0) : 1.0;\r\n\r\n var limitDeviceRatio = options.limitDeviceRatio || devicePixelRatio;\r\n this._hardwareScalingLevel = adaptToDeviceRatio ? 1.0 / Math.min(limitDeviceRatio, devicePixelRatio) : 1.0;\r\n this.resize();\r\n\r\n this._isStencilEnable = options.stencil ? true : false;\r\n this._initGLContext();\r\n\r\n // Prepare buffer pointers\r\n for (var i = 0; i < this._caps.maxVertexAttribs; i++) {\r\n this._currentBufferPointers[i] = new BufferPointer();\r\n }\r\n\r\n // Shader processor\r\n if (this.webGLVersion > 1) {\r\n this._shaderProcessor = new WebGL2ShaderProcessor();\r\n } else {\r\n this._shaderProcessor = new WebGLShaderProcessor();\r\n }\r\n\r\n // Detect if we are running on a faulty buggy OS.\r\n this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent);\r\n\r\n // Starting with iOS 14, we can trust the browser\r\n // let matches = navigator.userAgent.match(/Version\\/(\\d+)/);\r\n\r\n // if (matches && matches.length === 2) {\r\n // if (parseInt(matches[1]) >= 14) {\r\n // this._badOS = false;\r\n // }\r\n // }\r\n\r\n // Detect if we are running on a faulty buggy desktop OS.\r\n this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\n this._creationOptions = options;\r\n console.log(`Babylon.js v${ThinEngine.Version} - ${this.description}`);\r\n }\r\n\r\n private _rebuildInternalTextures(): void {\r\n let currentState = this._internalTexturesCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (var internalTexture of currentState) {\r\n internalTexture._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildEffects(): void {\r\n for (var key in this._compiledEffects) {\r\n let effect = <Effect>this._compiledEffects[key];\r\n\r\n effect._prepareEffect();\r\n }\r\n\r\n Effect.ResetCache();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if all created effects are ready\r\n * @returns true if all effects are ready\r\n */\r\n public areAllEffectsReady(): boolean {\r\n for (var key in this._compiledEffects) {\r\n let effect = <Effect>this._compiledEffects[key];\r\n\r\n if (!effect.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n protected _rebuildBuffers(): void {\r\n // Uniforms\r\n for (var uniformBuffer of this._uniformBuffers) {\r\n uniformBuffer._rebuild();\r\n }\r\n }\r\n\r\n protected _initGLContext(): void {\r\n // Caps\r\n this._caps = {\r\n maxTexturesImageUnits: this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS),\r\n maxCombinedTexturesImageUnits: this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\r\n maxVertexTextureImageUnits: this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\r\n maxTextureSize: this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),\r\n maxSamples: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_SAMPLES) : 1,\r\n maxCubemapTextureSize: this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE),\r\n maxRenderTextureSize: this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE),\r\n maxVertexAttribs: this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS),\r\n maxVaryingVectors: this._gl.getParameter(this._gl.MAX_VARYING_VECTORS),\r\n maxFragmentUniformVectors: this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS),\r\n maxVertexUniformVectors: this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS),\r\n parallelShaderCompile: this._gl.getExtension('KHR_parallel_shader_compile'),\r\n standardDerivatives: this._webGLVersion > 1 || (this._gl.getExtension('OES_standard_derivatives') !== null),\r\n maxAnisotropy: 1,\r\n astc: this._gl.getExtension('WEBGL_compressed_texture_astc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_astc'),\r\n bptc: this._gl.getExtension('EXT_texture_compression_bptc') || this._gl.getExtension('WEBKIT_EXT_texture_compression_bptc'),\r\n s3tc: this._gl.getExtension('WEBGL_compressed_texture_s3tc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc'),\r\n pvrtc: this._gl.getExtension('WEBGL_compressed_texture_pvrtc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'),\r\n etc1: this._gl.getExtension('WEBGL_compressed_texture_etc1') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc1'),\r\n etc2: this._gl.getExtension('WEBGL_compressed_texture_etc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc') ||\r\n this._gl.getExtension('WEBGL_compressed_texture_es3_0'), // also a requirement of OpenGL ES 3\r\n textureAnisotropicFilterExtension: this._gl.getExtension('EXT_texture_filter_anisotropic') || this._gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') || this._gl.getExtension('MOZ_EXT_texture_filter_anisotropic'),\r\n uintIndices: this._webGLVersion > 1 || this._gl.getExtension('OES_element_index_uint') !== null,\r\n fragmentDepthSupported: this._webGLVersion > 1 || this._gl.getExtension('EXT_frag_depth') !== null,\r\n highPrecisionShaderSupported: false,\r\n timerQuery: this._gl.getExtension('EXT_disjoint_timer_query_webgl2') || this._gl.getExtension(\"EXT_disjoint_timer_query\"),\r\n canUseTimestampForTimerQuery: false,\r\n drawBuffersExtension: false,\r\n maxMSAASamples: 1,\r\n colorBufferFloat: this._webGLVersion > 1 && this._gl.getExtension('EXT_color_buffer_float'),\r\n textureFloat: (this._webGLVersion > 1 || this._gl.getExtension('OES_texture_float')) ? true : false,\r\n textureHalfFloat: (this._webGLVersion > 1 || this._gl.getExtension('OES_texture_half_float')) ? true : false,\r\n textureHalfFloatRender: false,\r\n textureFloatLinearFiltering: false,\r\n textureFloatRender: false,\r\n textureHalfFloatLinearFiltering: false,\r\n vertexArrayObject: false,\r\n instancedArrays: false,\r\n textureLOD: (this._webGLVersion > 1 || this._gl.getExtension('EXT_shader_texture_lod')) ? true : false,\r\n blendMinMax: false,\r\n multiview: this._gl.getExtension('OVR_multiview2'),\r\n oculusMultiview: this._gl.getExtension('OCULUS_multiview'),\r\n depthTextureExtension: false\r\n };\r\n\r\n // Infos\r\n this._glVersion = this._gl.getParameter(this._gl.VERSION);\r\n\r\n var rendererInfo: any = this._gl.getExtension(\"WEBGL_debug_renderer_info\");\r\n if (rendererInfo != null) {\r\n this._glRenderer = this._gl.getParameter(rendererInfo.UNMASKED_RENDERER_WEBGL);\r\n this._glVendor = this._gl.getParameter(rendererInfo.UNMASKED_VENDOR_WEBGL);\r\n }\r\n\r\n if (!this._glVendor) {\r\n this._glVendor = \"Unknown vendor\";\r\n }\r\n\r\n if (!this._glRenderer) {\r\n this._glRenderer = \"Unknown renderer\";\r\n }\r\n\r\n // Constants\r\n if (this._gl.HALF_FLOAT_OES !== 0x8D61) {\r\n this._gl.HALF_FLOAT_OES = 0x8D61; // Half floating-point type (16-bit).\r\n }\r\n if (this._gl.RGBA16F !== 0x881A) {\r\n this._gl.RGBA16F = 0x881A; // RGBA 16-bit floating-point color-renderable internal sized format.\r\n }\r\n if (this._gl.RGBA32F !== 0x8814) {\r\n this._gl.RGBA32F = 0x8814; // RGBA 32-bit floating-point color-renderable internal sized format.\r\n }\r\n if (this._gl.DEPTH24_STENCIL8 !== 35056) {\r\n this._gl.DEPTH24_STENCIL8 = 35056;\r\n }\r\n\r\n // Extensions\r\n if (this._caps.timerQuery) {\r\n if (this._webGLVersion === 1) {\r\n this._gl.getQuery = (<any>this._caps.timerQuery).getQueryEXT.bind(this._caps.timerQuery);\r\n }\r\n this._caps.canUseTimestampForTimerQuery = this._gl.getQuery(this._caps.timerQuery.TIMESTAMP_EXT, this._caps.timerQuery.QUERY_COUNTER_BITS_EXT) > 0;\r\n }\r\n\r\n this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0;\r\n this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension('OES_texture_float_linear') ? true : false;\r\n this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer() ? true : false;\r\n this._caps.textureHalfFloatLinearFiltering = (this._webGLVersion > 1 || (this._caps.textureHalfFloat && this._gl.getExtension('OES_texture_half_float_linear'))) ? true : false;\r\n\r\n // Checks if some of the format renders first to allow the use of webgl inspector.\r\n if (this._webGLVersion > 1) {\r\n if (this._gl.HALF_FLOAT_OES !== 0x140B) {\r\n this._gl.HALF_FLOAT_OES = 0x140B;\r\n }\r\n }\r\n this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer();\r\n // Draw buffers\r\n if (this._webGLVersion > 1) {\r\n this._caps.drawBuffersExtension = true;\r\n this._caps.maxMSAASamples = this._gl.getParameter(this._gl.MAX_SAMPLES);\r\n } else {\r\n var drawBuffersExtension = this._gl.getExtension('WEBGL_draw_buffers');\r\n\r\n if (drawBuffersExtension !== null) {\r\n this._caps.drawBuffersExtension = true;\r\n this._gl.drawBuffers = drawBuffersExtension.drawBuffersWEBGL.bind(drawBuffersExtension);\r\n this._gl.DRAW_FRAMEBUFFER = this._gl.FRAMEBUFFER;\r\n\r\n for (var i = 0; i < 16; i++) {\r\n (<any>this._gl)[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"] = (<any>drawBuffersExtension)[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"];\r\n }\r\n }\r\n }\r\n\r\n // Depth Texture\r\n if (this._webGLVersion > 1) {\r\n this._caps.depthTextureExtension = true;\r\n } else {\r\n var depthTextureExtension = this._gl.getExtension('WEBGL_depth_texture');\r\n\r\n if (depthTextureExtension != null) {\r\n this._caps.depthTextureExtension = true;\r\n this._gl.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL;\r\n }\r\n }\r\n\r\n // Vertex array object\r\n if (this.disableVertexArrayObjects) {\r\n this._caps.vertexArrayObject = false;\r\n } else if (this._webGLVersion > 1) {\r\n this._caps.vertexArrayObject = true;\r\n } else {\r\n var vertexArrayObjectExtension = this._gl.getExtension('OES_vertex_array_object');\r\n\r\n if (vertexArrayObjectExtension != null) {\r\n this._caps.vertexArrayObject = true;\r\n this._gl.createVertexArray = vertexArrayObjectExtension.createVertexArrayOES.bind(vertexArrayObjectExtension);\r\n this._gl.bindVertexArray = vertexArrayObjectExtension.bindVertexArrayOES.bind(vertexArrayObjectExtension);\r\n this._gl.deleteVertexArray = vertexArrayObjectExtension.deleteVertexArrayOES.bind(vertexArrayObjectExtension);\r\n }\r\n }\r\n\r\n // Instances count\r\n if (this._webGLVersion > 1) {\r\n this._caps.instancedArrays = true;\r\n } else {\r\n var instanceExtension = <ANGLE_instanced_arrays>this._gl.getExtension('ANGLE_instanced_arrays');\r\n\r\n if (instanceExtension != null) {\r\n this._caps.instancedArrays = true;\r\n this._gl.drawArraysInstanced = instanceExtension.drawArraysInstancedANGLE.bind(instanceExtension);\r\n this._gl.drawElementsInstanced = instanceExtension.drawElementsInstancedANGLE.bind(instanceExtension);\r\n this._gl.vertexAttribDivisor = instanceExtension.vertexAttribDivisorANGLE.bind(instanceExtension);\r\n } else {\r\n this._caps.instancedArrays = false;\r\n }\r\n }\r\n\r\n if (this._gl.getShaderPrecisionFormat) {\r\n var vertex_highp = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT);\r\n var fragment_highp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);\r\n\r\n if (vertex_highp && fragment_highp) {\r\n this._caps.highPrecisionShaderSupported = vertex_highp.precision !== 0 && fragment_highp.precision !== 0;\r\n }\r\n }\r\n\r\n if (this._webGLVersion > 1) {\r\n this._caps.blendMinMax = true;\r\n }\r\n else {\r\n const blendMinMaxExtension = this._gl.getExtension('EXT_blend_minmax');\r\n if (blendMinMaxExtension != null) {\r\n this._caps.blendMinMax = true;\r\n this._gl.MAX = blendMinMaxExtension.MAX_EXT;\r\n this._gl.MIN = blendMinMaxExtension.MIN_EXT;\r\n }\r\n }\r\n\r\n // Depth buffer\r\n this._depthCullingState.depthTest = true;\r\n this._depthCullingState.depthFunc = this._gl.LEQUAL;\r\n this._depthCullingState.depthMask = true;\r\n\r\n // Texture maps\r\n this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits;\r\n for (let slot = 0; slot < this._maxSimultaneousTextures; slot++) {\r\n this._nextFreeTextureSlots.push(slot);\r\n }\r\n }\r\n\r\n /**\r\n * Gets version of the current webGL context\r\n */\r\n public get webGLVersion(): number {\r\n return this._webGLVersion;\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"Engine\" string\r\n */\r\n public getClassName(): string {\r\n return \"ThinEngine\";\r\n }\r\n\r\n /**\r\n * Returns true if the stencil buffer has been enabled through the creation option of the context.\r\n */\r\n public get isStencilEnable(): boolean {\r\n return this._isStencilEnable;\r\n }\r\n\r\n /** @hidden */\r\n public _prepareWorkingCanvas(): void {\r\n if (this._workingCanvas) {\r\n return;\r\n }\r\n\r\n this._workingCanvas = CanvasGenerator.CreateCanvas(1, 1);\r\n let context = this._workingCanvas.getContext(\"2d\");\r\n\r\n if (context) {\r\n this._workingContext = context;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the texture cache to empty state\r\n */\r\n public resetTextureCache() {\r\n for (var key in this._boundTexturesCache) {\r\n if (!this._boundTexturesCache.hasOwnProperty(key)) {\r\n continue;\r\n }\r\n this._boundTexturesCache[key] = null;\r\n }\r\n\r\n this._currentTextureChannel = -1;\r\n }\r\n\r\n /**\r\n * Gets an object containing information about the current webGL context\r\n * @returns an object containing the vender, the renderer and the version of the current webGL context\r\n */\r\n public getGlInfo() {\r\n return {\r\n vendor: this._glVendor,\r\n renderer: this._glRenderer,\r\n version: this._glVersion\r\n };\r\n }\r\n\r\n /**\r\n * Defines the hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @param level defines the level to use\r\n */\r\n public setHardwareScalingLevel(level: number): void {\r\n this._hardwareScalingLevel = level;\r\n this.resize();\r\n }\r\n\r\n /**\r\n * Gets the current hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @returns a number indicating the current hardware scaling level\r\n */\r\n public getHardwareScalingLevel(): number {\r\n return this._hardwareScalingLevel;\r\n }\r\n\r\n /**\r\n * Gets the list of loaded textures\r\n * @returns an array containing all loaded textures\r\n */\r\n public getLoadedTexturesCache(): InternalTexture[] {\r\n return this._internalTexturesCache;\r\n }\r\n\r\n /**\r\n * Gets the object containing all engine capabilities\r\n * @returns the EngineCapabilities object\r\n */\r\n public getCaps(): EngineCapabilities {\r\n return this._caps;\r\n }\r\n\r\n /**\r\n * stop executing a render loop function and remove it from the execution array\r\n * @param renderFunction defines the function to be removed. If not provided all functions will be removed.\r\n */\r\n public stopRenderLoop(renderFunction?: () => void): void {\r\n if (!renderFunction) {\r\n this._activeRenderLoops = [];\r\n return;\r\n }\r\n\r\n var index = this._activeRenderLoops.indexOf(renderFunction);\r\n\r\n if (index >= 0) {\r\n this._activeRenderLoops.splice(index, 1);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _renderLoop(): void {\r\n if (!this._contextWasLost) {\r\n var shouldRender = true;\r\n if (!this.renderEvenInBackground && this._windowIsBackground) {\r\n shouldRender = false;\r\n }\r\n\r\n if (shouldRender) {\r\n // Start new frame\r\n this.beginFrame();\r\n\r\n for (var index = 0; index < this._activeRenderLoops.length; index++) {\r\n var renderFunction = this._activeRenderLoops[index];\r\n\r\n renderFunction();\r\n }\r\n\r\n // Present\r\n this.endFrame();\r\n }\r\n }\r\n\r\n if (this._activeRenderLoops.length > 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n } else {\r\n this._renderingQueueLaunched = false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the HTML canvas attached with the current webGL context\r\n * @returns a HTML canvas\r\n */\r\n public getRenderingCanvas(): Nullable<HTMLCanvasElement> {\r\n return this._renderingCanvas;\r\n }\r\n\r\n /**\r\n * Gets host window\r\n * @returns the host window object\r\n */\r\n public getHostWindow(): Nullable<Window> {\r\n if (!DomManagement.IsWindowObjectExist()) {\r\n return null;\r\n }\r\n\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView) {\r\n return this._renderingCanvas.ownerDocument.defaultView;\r\n }\r\n\r\n return window;\r\n }\r\n\r\n /**\r\n * Gets the current render width\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render width\r\n */\r\n public getRenderWidth(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.width;\r\n }\r\n\r\n return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferWidth : this._gl.drawingBufferWidth;\r\n }\r\n\r\n /**\r\n * Gets the current render height\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render height\r\n */\r\n public getRenderHeight(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.height;\r\n }\r\n\r\n return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferHeight : this._gl.drawingBufferHeight;\r\n }\r\n\r\n /**\r\n * Can be used to override the current requestAnimationFrame requester.\r\n * @hidden\r\n */\r\n protected _queueNewFrame(bindedRenderFunction: any, requester?: any): number {\r\n return ThinEngine.QueueNewFrame(bindedRenderFunction, requester);\r\n }\r\n\r\n /**\r\n * Register and execute a render loop. The engine can have more than one render function\r\n * @param renderFunction defines the function to continuously execute\r\n */\r\n public runRenderLoop(renderFunction: () => void): void {\r\n if (this._activeRenderLoops.indexOf(renderFunction) !== -1) {\r\n return;\r\n }\r\n\r\n this._activeRenderLoops.push(renderFunction);\r\n\r\n if (!this._renderingQueueLaunched) {\r\n this._renderingQueueLaunched = true;\r\n this._boundRenderFunction = this._renderLoop.bind(this);\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current render buffer or the current render target (if any is set up)\r\n * @param color defines the color to use\r\n * @param backBuffer defines if the back buffer must be cleared\r\n * @param depth defines if the depth buffer must be cleared\r\n * @param stencil defines if the stencil buffer must be cleared\r\n */\r\n public clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil: boolean = false): void {\r\n this.applyStates();\r\n\r\n var mode = 0;\r\n if (backBuffer && color) {\r\n this._gl.clearColor(color.r, color.g, color.b, color.a !== undefined ? color.a : 1.0);\r\n mode |= this._gl.COLOR_BUFFER_BIT;\r\n }\r\n\r\n if (depth) {\r\n if (this.useReverseDepthBuffer) {\r\n this._depthCullingState.depthFunc = this._gl.GREATER;\r\n this._gl.clearDepth(0.0);\r\n } else {\r\n this._gl.clearDepth(1.0);\r\n }\r\n mode |= this._gl.DEPTH_BUFFER_BIT;\r\n }\r\n if (stencil) {\r\n this._gl.clearStencil(0);\r\n mode |= this._gl.STENCIL_BUFFER_BIT;\r\n }\r\n this._gl.clear(mode);\r\n }\r\n\r\n private _viewportCached = { x: 0, y: 0, z: 0, w: 0 };\r\n\r\n /** @hidden */\r\n public _viewport(x: number, y: number, width: number, height: number): void {\r\n if (x !== this._viewportCached.x ||\r\n y !== this._viewportCached.y ||\r\n width !== this._viewportCached.z ||\r\n height !== this._viewportCached.w) {\r\n this._viewportCached.x = x;\r\n this._viewportCached.y = y;\r\n this._viewportCached.z = width;\r\n this._viewportCached.w = height;\r\n\r\n this._gl.viewport(x, y, width, height);\r\n }\r\n }\r\n\r\n /**\r\n * Set the WebGL's viewport\r\n * @param viewport defines the viewport element to be used\r\n * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used\r\n * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used\r\n */\r\n public setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n var width = requiredWidth || this.getRenderWidth();\r\n var height = requiredHeight || this.getRenderHeight();\r\n var x = viewport.x || 0;\r\n var y = viewport.y || 0;\r\n\r\n this._cachedViewport = viewport;\r\n\r\n this._viewport(x * width, y * height, width * viewport.width, height * viewport.height);\r\n }\r\n\r\n /**\r\n * Begin a new frame\r\n */\r\n public beginFrame(): void {\r\n }\r\n\r\n /**\r\n * Enf the current frame\r\n */\r\n public endFrame(): void {\r\n // Force a flush in case we are using a bad OS.\r\n if (this._badOS) {\r\n this.flushFramebuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Resize the view according to the canvas' size\r\n */\r\n public resize(): void {\r\n let width: number;\r\n let height: number;\r\n\r\n if (DomManagement.IsWindowObjectExist()) {\r\n width = this._renderingCanvas ? (this._renderingCanvas.clientWidth || this._renderingCanvas.width) : window.innerWidth;\r\n height = this._renderingCanvas ? (this._renderingCanvas.clientHeight || this._renderingCanvas.height) : window.innerHeight;\r\n } else {\r\n width = this._renderingCanvas ? this._renderingCanvas.width : 100;\r\n height = this._renderingCanvas ? this._renderingCanvas.height : 100;\r\n }\r\n\r\n this.setSize(width / this._hardwareScalingLevel, height / this._hardwareScalingLevel);\r\n }\r\n\r\n /**\r\n * Force a specific size of the canvas\r\n * @param width defines the new canvas' width\r\n * @param height defines the new canvas' height\r\n * @returns true if the size was changed\r\n */\r\n public setSize(width: number, height: number): boolean {\r\n if (!this._renderingCanvas) {\r\n return false;\r\n }\r\n\r\n width = width | 0;\r\n height = height | 0;\r\n\r\n if (this._renderingCanvas.width === width && this._renderingCanvas.height === height) {\r\n return false;\r\n }\r\n\r\n this._renderingCanvas.width = width;\r\n this._renderingCanvas.height = height;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the frame buffer to the specified texture.\r\n * @param texture The texture to render to or null for the default canvas\r\n * @param faceIndex The face of the texture to render to in case of cube texture\r\n * @param requiredWidth The width of the target to render to\r\n * @param requiredHeight The height of the target to render to\r\n * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true\r\n * @param lodLevel defines the lod level to bind to the frame buffer\r\n * @param layer defines the 2d array index to bind to frame buffer to\r\n */\r\n public bindFramebuffer(texture: InternalTexture, faceIndex: number = 0, requiredWidth?: number, requiredHeight?: number, forceFullscreenViewport?: boolean, lodLevel = 0, layer = 0): void {\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n }\r\n this._currentRenderTarget = texture;\r\n this._bindUnboundFramebuffer(texture._MSAAFramebuffer ? texture._MSAAFramebuffer : texture._framebuffer);\r\n\r\n const gl = this._gl;\r\n if (texture.is2DArray) {\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, texture._webGLTexture, lodLevel, layer);\r\n }\r\n else if (texture.isCube) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, texture._webGLTexture, lodLevel);\r\n }\r\n\r\n const depthStencilTexture = texture._depthStencilTexture;\r\n if (depthStencilTexture) {\r\n const attachment = (depthStencilTexture._generateStencilBuffer) ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\r\n if (texture.is2DArray) {\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, depthStencilTexture._webGLTexture, lodLevel, layer);\r\n }\r\n else if (texture.isCube) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, depthStencilTexture._webGLTexture, lodLevel);\r\n }\r\n else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, depthStencilTexture._webGLTexture, lodLevel);\r\n }\r\n }\r\n\r\n if (this._cachedViewport && !forceFullscreenViewport) {\r\n this.setViewport(this._cachedViewport, requiredWidth, requiredHeight);\r\n } else {\r\n if (!requiredWidth) {\r\n requiredWidth = texture.width;\r\n if (lodLevel) {\r\n requiredWidth = requiredWidth / Math.pow(2, lodLevel);\r\n }\r\n }\r\n if (!requiredHeight) {\r\n requiredHeight = texture.height;\r\n if (lodLevel) {\r\n requiredHeight = requiredHeight / Math.pow(2, lodLevel);\r\n }\r\n }\r\n\r\n this._viewport(0, 0, requiredWidth, requiredHeight);\r\n }\r\n\r\n this.wipeCaches();\r\n }\r\n\r\n /** @hidden */\r\n public _bindUnboundFramebuffer(framebuffer: Nullable<WebGLFramebuffer>) {\r\n if (this._currentFramebuffer !== framebuffer) {\r\n this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\r\n this._currentFramebuffer = framebuffer;\r\n }\r\n }\r\n\r\n /**\r\n * Unbind the current render target texture from the webGL context\r\n * @param texture defines the render target texture to unbind\r\n * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated\r\n * @param onBeforeUnbind defines a function which will be called before the effective unbind\r\n */\r\n public unBindFramebuffer(texture: InternalTexture, disableGenerateMipMaps = false, onBeforeUnbind?: () => void): void {\r\n this._currentRenderTarget = null;\r\n\r\n // If MSAA, we need to bitblt back to main texture\r\n var gl = this._gl;\r\n if (texture._MSAAFramebuffer) {\r\n if (texture._textureArray) {\r\n // This texture is part of a MRT texture, we need to treat all attachments\r\n this.unBindMultiColorAttachmentFramebuffer(texture._textureArray!, disableGenerateMipMaps, onBeforeUnbind);\r\n return;\r\n }\r\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, texture._MSAAFramebuffer);\r\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, texture._framebuffer);\r\n gl.blitFramebuffer(0, 0, texture.width, texture.height,\r\n 0, 0, texture.width, texture.height,\r\n gl.COLOR_BUFFER_BIT, gl.NEAREST);\r\n }\r\n\r\n if (texture.generateMipMaps && !disableGenerateMipMaps && !texture.isCube) {\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n gl.generateMipmap(gl.TEXTURE_2D);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, null);\r\n }\r\n\r\n if (onBeforeUnbind) {\r\n if (texture._MSAAFramebuffer) {\r\n // Bind the correct framebuffer\r\n this._bindUnboundFramebuffer(texture._framebuffer);\r\n }\r\n onBeforeUnbind();\r\n }\r\n\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n\r\n /**\r\n * Force a webGL flush (ie. a flush of all waiting webGL commands)\r\n */\r\n public flushFramebuffer(): void {\r\n this._gl.flush();\r\n }\r\n\r\n /**\r\n * Unbind the current render target and bind the default framebuffer\r\n */\r\n public restoreDefaultFramebuffer(): void {\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n } else {\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n if (this._cachedViewport) {\r\n this.setViewport(this._cachedViewport);\r\n }\r\n\r\n this.wipeCaches();\r\n }\r\n\r\n // VBOs\r\n\r\n /** @hidden */\r\n protected _resetVertexBufferBinding(): void {\r\n this.bindArrayBuffer(null);\r\n this._cachedVertexBuffers = null;\r\n }\r\n\r\n /**\r\n * Creates a vertex buffer\r\n * @param data the data for the vertex buffer\r\n * @returns the new WebGL static buffer\r\n */\r\n public createVertexBuffer(data: DataArray): DataBuffer {\r\n return this._createVertexBuffer(data, this._gl.STATIC_DRAW);\r\n }\r\n\r\n private _createVertexBuffer(data: DataArray, usage: number): DataBuffer {\r\n var vbo = this._gl.createBuffer();\r\n\r\n if (!vbo) {\r\n throw new Error(\"Unable to create vertex buffer\");\r\n }\r\n\r\n let dataBuffer = new WebGLDataBuffer(vbo);\r\n this.bindArrayBuffer(dataBuffer);\r\n\r\n if (data instanceof Array) {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(data), this._gl.STATIC_DRAW);\r\n } else {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, <ArrayBuffer>data, this._gl.STATIC_DRAW);\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n\r\n dataBuffer.references = 1;\r\n return dataBuffer;\r\n }\r\n\r\n /**\r\n * Creates a dynamic vertex buffer\r\n * @param data the data for the dynamic vertex buffer\r\n * @returns the new WebGL dynamic buffer\r\n */\r\n public createDynamicVertexBuffer(data: DataArray): DataBuffer {\r\n return this._createVertexBuffer(data, this._gl.DYNAMIC_DRAW);\r\n }\r\n\r\n protected _resetIndexBufferBinding(): void {\r\n this.bindIndexBuffer(null);\r\n this._cachedIndexBuffer = null;\r\n }\r\n\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the content of the index buffer\r\n * @param updatable defines if the index buffer must be updatable\r\n * @returns a new webGL buffer\r\n */\r\n public createIndexBuffer(indices: IndicesArray, updatable?: boolean): DataBuffer {\r\n var vbo = this._gl.createBuffer();\r\n let dataBuffer = new WebGLDataBuffer(vbo!);\r\n\r\n if (!vbo) {\r\n throw new Error(\"Unable to create index buffer\");\r\n }\r\n\r\n this.bindIndexBuffer(dataBuffer);\r\n\r\n const data = this._normalizeIndexData(indices);\r\n this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, data, updatable ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW);\r\n this._resetIndexBufferBinding();\r\n dataBuffer.references = 1;\r\n dataBuffer.is32Bits = (data.BYTES_PER_ELEMENT === 4);\r\n return dataBuffer;\r\n }\r\n\r\n protected _normalizeIndexData(indices: IndicesArray): Uint16Array | Uint32Array {\r\n if (indices instanceof Uint16Array) {\r\n return indices;\r\n }\r\n\r\n // Check 32 bit support\r\n if (this._caps.uintIndices) {\r\n if (indices instanceof Uint32Array) {\r\n return indices;\r\n } else {\r\n // number[] or Int32Array, check if 32 bit is necessary\r\n for (var index = 0; index < indices.length; index++) {\r\n if (indices[index] >= 65535) {\r\n return new Uint32Array(indices);\r\n }\r\n }\r\n\r\n return new Uint16Array(indices);\r\n }\r\n }\r\n\r\n // No 32 bit support, force conversion to 16 bit (values greater 16 bit are lost)\r\n return new Uint16Array(indices);\r\n }\r\n\r\n /**\r\n * Bind a webGL buffer to the webGL context\r\n * @param buffer defines the buffer to bind\r\n */\r\n public bindArrayBuffer(buffer: Nullable<DataBuffer>): void {\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n this.bindBuffer(buffer, this._gl.ARRAY_BUFFER);\r\n }\r\n\r\n /**\r\n * Bind a specific block at a given index in a specific shader program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param blockName defines the block name\r\n * @param index defines the index where to bind the block\r\n */\r\n public bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n let program = (pipelineContext as WebGLPipelineContext).program!;\r\n\r\n var uniformLocation = this._gl.getUniformBlockIndex(program, blockName);\r\n\r\n this._gl.uniformBlockBinding(program, uniformLocation, index);\r\n }\r\n\r\n protected bindIndexBuffer(buffer: Nullable<DataBuffer>): void {\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n this.bindBuffer(buffer, this._gl.ELEMENT_ARRAY_BUFFER);\r\n }\r\n\r\n private bindBuffer(buffer: Nullable<DataBuffer>, target: number): void {\r\n if (this._vaoRecordInProgress || this._currentBoundBuffer[target] !== buffer) {\r\n this._gl.bindBuffer(target, buffer ? buffer.underlyingResource : null);\r\n this._currentBoundBuffer[target] = buffer;\r\n }\r\n }\r\n\r\n /**\r\n * update the bound buffer with the given data\r\n * @param data defines the data to update\r\n */\r\n public updateArrayBuffer(data: Float32Array): void {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n\r\n private _vertexAttribPointer(buffer: DataBuffer, indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void {\r\n var pointer = this._currentBufferPointers[indx];\r\n if (!pointer) {\r\n return;\r\n }\r\n\r\n var changed = false;\r\n if (!pointer.active) {\r\n changed = true;\r\n pointer.active = true;\r\n pointer.index = indx;\r\n pointer.size = size;\r\n pointer.type = type;\r\n pointer.normalized = normalized;\r\n pointer.stride = stride;\r\n pointer.offset = offset;\r\n pointer.buffer = buffer;\r\n } else {\r\n if (pointer.buffer !== buffer) { pointer.buffer = buffer; changed = true; }\r\n if (pointer.size !== size) { pointer.size = size; changed = true; }\r\n if (pointer.type !== type) { pointer.type = type; changed = true; }\r\n if (pointer.normalized !== normalized) { pointer.normalized = normalized; changed = true; }\r\n if (pointer.stride !== stride) { pointer.stride = stride; changed = true; }\r\n if (pointer.offset !== offset) { pointer.offset = offset; changed = true; }\r\n }\r\n\r\n if (changed || this._vaoRecordInProgress) {\r\n this.bindArrayBuffer(buffer);\r\n this._gl.vertexAttribPointer(indx, size, type, normalized, stride, offset);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _bindIndexBufferWithCache(indexBuffer: Nullable<DataBuffer>): void {\r\n if (indexBuffer == null) {\r\n return;\r\n }\r\n if (this._cachedIndexBuffer !== indexBuffer) {\r\n this._cachedIndexBuffer = indexBuffer;\r\n this.bindIndexBuffer(indexBuffer);\r\n this._uintIndicesCurrentlySet = indexBuffer.is32Bits;\r\n }\r\n }\r\n\r\n private _bindVertexBuffersAttributes(vertexBuffers: { [key: string]: Nullable<VertexBuffer> }, effect: Effect): void {\r\n var attributes = effect.getAttributesNames();\r\n\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n\r\n this.unbindAllAttributes();\r\n\r\n for (var index = 0; index < attributes.length; index++) {\r\n var order = effect.getAttributeLocation(index);\r\n\r\n if (order >= 0) {\r\n var vertexBuffer = vertexBuffers[attributes[index]];\r\n\r\n if (!vertexBuffer) {\r\n continue;\r\n }\r\n\r\n this._gl.enableVertexAttribArray(order);\r\n if (!this._vaoRecordInProgress) {\r\n this._vertexAttribArraysEnabled[order] = true;\r\n }\r\n\r\n var buffer = vertexBuffer.getBuffer();\r\n if (buffer) {\r\n this._vertexAttribPointer(buffer, order, vertexBuffer.getSize(), vertexBuffer.type, vertexBuffer.normalized, vertexBuffer.byteStride, vertexBuffer.byteOffset);\r\n\r\n if (vertexBuffer.getIsInstanced()) {\r\n this._gl.vertexAttribDivisor(order, vertexBuffer.getInstanceDivisor());\r\n if (!this._vaoRecordInProgress) {\r\n this._currentInstanceLocations.push(order);\r\n this._currentInstanceBuffers.push(buffer);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Records a vertex array object\r\n * @see https://doc.babylonjs.com/features/webgl2#vertex-array-objects\r\n * @param vertexBuffers defines the list of vertex buffers to store\r\n * @param indexBuffer defines the index buffer to store\r\n * @param effect defines the effect to store\r\n * @returns the new vertex array object\r\n */\r\n public recordVertexArrayObject(vertexBuffers: { [key: string]: VertexBuffer; }, indexBuffer: Nullable<DataBuffer>, effect: Effect): WebGLVertexArrayObject {\r\n var vao = this._gl.createVertexArray();\r\n\r\n this._vaoRecordInProgress = true;\r\n\r\n this._gl.bindVertexArray(vao);\r\n\r\n this._mustWipeVertexAttributes = true;\r\n this._bindVertexBuffersAttributes(vertexBuffers, effect);\r\n\r\n this.bindIndexBuffer(indexBuffer);\r\n\r\n this._vaoRecordInProgress = false;\r\n this._gl.bindVertexArray(null);\r\n\r\n return vao;\r\n }\r\n\r\n /**\r\n * Bind a specific vertex array object\r\n * @see https://doc.babylonjs.com/features/webgl2#vertex-array-objects\r\n * @param vertexArrayObject defines the vertex array object to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n */\r\n public bindVertexArrayObject(vertexArrayObject: WebGLVertexArrayObject, indexBuffer: Nullable<DataBuffer>): void {\r\n if (this._cachedVertexArrayObject !== vertexArrayObject) {\r\n this._cachedVertexArrayObject = vertexArrayObject;\r\n\r\n this._gl.bindVertexArray(vertexArrayObject);\r\n this._cachedVertexBuffers = null;\r\n this._cachedIndexBuffer = null;\r\n\r\n this._uintIndicesCurrentlySet = indexBuffer != null && indexBuffer.is32Bits;\r\n this._mustWipeVertexAttributes = true;\r\n }\r\n }\r\n\r\n /**\r\n * Bind webGl buffers directly to the webGL context\r\n * @param vertexBuffer defines the vertex buffer to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param vertexDeclaration defines the vertex declaration to use with the vertex buffer\r\n * @param vertexStrideSize defines the vertex stride of the vertex buffer\r\n * @param effect defines the effect associated with the vertex buffer\r\n */\r\n public bindBuffersDirectly(vertexBuffer: DataBuffer, indexBuffer: DataBuffer, vertexDeclaration: number[], vertexStrideSize: number, effect: Effect): void {\r\n if (this._cachedVertexBuffers !== vertexBuffer || this._cachedEffectForVertexBuffers !== effect) {\r\n this._cachedVertexBuffers = vertexBuffer;\r\n this._cachedEffectForVertexBuffers = effect;\r\n\r\n let attributesCount = effect.getAttributesCount();\r\n\r\n this._unbindVertexArrayObject();\r\n this.unbindAllAttributes();\r\n\r\n var offset = 0;\r\n for (var index = 0; index < attributesCount; index++) {\r\n\r\n if (index < vertexDeclaration.length) {\r\n\r\n var order = effect.getAttributeLocation(index);\r\n\r\n if (order >= 0) {\r\n this._gl.enableVertexAttribArray(order);\r\n this._vertexAttribArraysEnabled[order] = true;\r\n this._vertexAttribPointer(vertexBuffer, order, vertexDeclaration[index], this._gl.FLOAT, false, vertexStrideSize, offset);\r\n }\r\n\r\n offset += vertexDeclaration[index] * 4;\r\n }\r\n }\r\n }\r\n\r\n this._bindIndexBufferWithCache(indexBuffer);\r\n }\r\n\r\n private _unbindVertexArrayObject(): void {\r\n if (!this._cachedVertexArrayObject) {\r\n return;\r\n }\r\n\r\n this._cachedVertexArrayObject = null;\r\n this._gl.bindVertexArray(null);\r\n }\r\n\r\n /**\r\n * Bind a list of vertex buffers to the webGL context\r\n * @param vertexBuffers defines the list of vertex buffers to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param effect defines the effect associated with the vertex buffers\r\n */\r\n public bindBuffers(vertexBuffers: { [key: string]: Nullable<VertexBuffer> }, indexBuffer: Nullable<DataBuffer>, effect: Effect): void {\r\n if (this._cachedVertexBuffers !== vertexBuffers || this._cachedEffectForVertexBuffers !== effect) {\r\n this._cachedVertexBuffers = vertexBuffers;\r\n this._cachedEffectForVertexBuffers = effect;\r\n\r\n this._bindVertexBuffersAttributes(vertexBuffers, effect);\r\n }\r\n\r\n this._bindIndexBufferWithCache(indexBuffer);\r\n }\r\n\r\n /**\r\n * Unbind all instance attributes\r\n */\r\n public unbindInstanceAttributes() {\r\n var boundBuffer;\r\n for (var i = 0, ul = this._currentInstanceLocations.length; i < ul; i++) {\r\n var instancesBuffer = this._currentInstanceBuffers[i];\r\n if (boundBuffer != instancesBuffer && instancesBuffer.references) {\r\n boundBuffer = instancesBuffer;\r\n this.bindArrayBuffer(instancesBuffer);\r\n }\r\n var offsetLocation = this._currentInstanceLocations[i];\r\n this._gl.vertexAttribDivisor(offsetLocation, 0);\r\n }\r\n this._currentInstanceBuffers.length = 0;\r\n this._currentInstanceLocations.length = 0;\r\n }\r\n\r\n /**\r\n * Release and free the memory of a vertex array object\r\n * @param vao defines the vertex array object to delete\r\n */\r\n public releaseVertexArrayObject(vao: WebGLVertexArrayObject) {\r\n this._gl.deleteVertexArray(vao);\r\n }\r\n\r\n /** @hidden */\r\n public _releaseBuffer(buffer: DataBuffer): boolean {\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deleteBuffer(buffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected _deleteBuffer(buffer: DataBuffer): void {\r\n this._gl.deleteBuffer(buffer.underlyingResource);\r\n }\r\n\r\n /**\r\n * Update the content of a webGL buffer used with instanciation and bind it to the webGL context\r\n * @param instancesBuffer defines the webGL buffer to update and bind\r\n * @param data defines the data to store in the buffer\r\n * @param offsetLocations defines the offsets or attributes information used to determine where data must be stored in the buffer\r\n */\r\n public updateAndBindInstancesBuffer(instancesBuffer: DataBuffer, data: Float32Array, offsetLocations: number[] | InstancingAttributeInfo[]): void {\r\n this.bindArrayBuffer(instancesBuffer);\r\n if (data) {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n\r\n if ((<any>offsetLocations[0]).index !== undefined) {\r\n this.bindInstancesBuffer(instancesBuffer, offsetLocations as any, true);\r\n } else {\r\n for (let index = 0; index < 4; index++) {\r\n let offsetLocation = <number>offsetLocations[index];\r\n\r\n if (!this._vertexAttribArraysEnabled[offsetLocation]) {\r\n this._gl.enableVertexAttribArray(offsetLocation);\r\n this._vertexAttribArraysEnabled[offsetLocation] = true;\r\n }\r\n\r\n this._vertexAttribPointer(instancesBuffer, offsetLocation, 4, this._gl.FLOAT, false, 64, index * 16);\r\n this._gl.vertexAttribDivisor(offsetLocation, 1);\r\n this._currentInstanceLocations.push(offsetLocation);\r\n this._currentInstanceBuffers.push(instancesBuffer);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Bind the content of a webGL buffer used with instantiation\r\n * @param instancesBuffer defines the webGL buffer to bind\r\n * @param attributesInfo defines the offsets or attributes information used to determine where data must be stored in the buffer\r\n * @param computeStride defines Whether to compute the strides from the info or use the default 0\r\n */\r\n public bindInstancesBuffer(instancesBuffer: DataBuffer, attributesInfo: InstancingAttributeInfo[], computeStride = true): void {\r\n this.bindArrayBuffer(instancesBuffer);\r\n\r\n let stride = 0;\r\n if (computeStride) {\r\n for (let i = 0; i < attributesInfo.length; i++) {\r\n let ai = attributesInfo[i];\r\n stride += ai.attributeSize * 4;\r\n }\r\n }\r\n\r\n for (let i = 0; i < attributesInfo.length; i++) {\r\n let ai = attributesInfo[i];\r\n if (ai.index === undefined) {\r\n ai.index = this._currentEffect!.getAttributeLocationByName(ai.attributeName);\r\n }\r\n\r\n if (ai.index < 0) {\r\n continue;\r\n }\r\n\r\n if (!this._vertexAttribArraysEnabled[ai.index]) {\r\n this._gl.enableVertexAttribArray(ai.index);\r\n this._vertexAttribArraysEnabled[ai.index] = true;\r\n }\r\n\r\n this._vertexAttribPointer(instancesBuffer, ai.index, ai.attributeSize, ai.attributeType || this._gl.FLOAT, ai.normalized || false, stride, ai.offset);\r\n this._gl.vertexAttribDivisor(ai.index, ai.divisor === undefined ? 1 : ai.divisor);\r\n this._currentInstanceLocations.push(ai.index);\r\n this._currentInstanceBuffers.push(instancesBuffer);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the instance attribute corresponding to the name in parameter\r\n * @param name defines the name of the attribute to disable\r\n */\r\n public disableInstanceAttributeByName(name: string) {\r\n if (!this._currentEffect) {\r\n return;\r\n }\r\n\r\n const attributeLocation = this._currentEffect.getAttributeLocationByName(name);\r\n this.disableInstanceAttribute(attributeLocation);\r\n }\r\n\r\n /**\r\n * Disable the instance attribute corresponding to the location in parameter\r\n * @param attributeLocation defines the attribute location of the attribute to disable\r\n */\r\n public disableInstanceAttribute(attributeLocation: number) {\r\n let shouldClean = false;\r\n let index: number;\r\n while ((index = this._currentInstanceLocations.indexOf(attributeLocation)) !== -1) {\r\n this._currentInstanceLocations.splice(index, 1);\r\n this._currentInstanceBuffers.splice(index, 1);\r\n\r\n shouldClean = true;\r\n index = this._currentInstanceLocations.indexOf(attributeLocation);\r\n }\r\n\r\n if (shouldClean) {\r\n this._gl.vertexAttribDivisor(attributeLocation, 0);\r\n this.disableAttributeByIndex(attributeLocation);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the attribute corresponding to the location in parameter\r\n * @param attributeLocation defines the attribute location of the attribute to disable\r\n */\r\n public disableAttributeByIndex(attributeLocation: number) {\r\n this._gl.disableVertexAttribArray(attributeLocation);\r\n this._vertexAttribArraysEnabled[attributeLocation] = false;\r\n this._currentBufferPointers[attributeLocation].active = false;\r\n }\r\n\r\n /**\r\n * Send a draw order\r\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public draw(useTriangles: boolean, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n this.drawElementsType(useTriangles ? 0 : 1, indexStart, indexCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of points\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public drawPointClouds(verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n this.drawArraysType(2, verticesStart, verticesCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public drawUnIndexed(useTriangles: boolean, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n this.drawArraysType(useTriangles ? 0 : 1, verticesStart, verticesCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of indexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public drawElementsType(fillMode: number, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n // Apply states\r\n this.applyStates();\r\n\r\n this._reportDrawCall();\r\n\r\n // Render\r\n\r\n const drawMode = this._drawMode(fillMode);\r\n var indexFormat = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT;\r\n var mult = this._uintIndicesCurrentlySet ? 4 : 2;\r\n if (instancesCount) {\r\n this._gl.drawElementsInstanced(drawMode, indexCount, indexFormat, indexStart * mult, instancesCount);\r\n } else {\r\n this._gl.drawElements(drawMode, indexCount, indexFormat, indexStart * mult);\r\n }\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public drawArraysType(fillMode: number, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n // Apply states\r\n this.applyStates();\r\n\r\n this._reportDrawCall();\r\n\r\n const drawMode = this._drawMode(fillMode);\r\n if (instancesCount) {\r\n this._gl.drawArraysInstanced(drawMode, verticesStart, verticesCount, instancesCount);\r\n } else {\r\n this._gl.drawArrays(drawMode, verticesStart, verticesCount);\r\n }\r\n }\r\n\r\n private _drawMode(fillMode: number): number {\r\n switch (fillMode) {\r\n // Triangle views\r\n case 0:\r\n return this._gl.TRIANGLES;\r\n case 2:\r\n return this._gl.POINTS;\r\n case 1:\r\n return this._gl.LINES;\r\n // Draw modes\r\n case 3:\r\n return this._gl.POINTS;\r\n case 4:\r\n return this._gl.LINES;\r\n case 5:\r\n return this._gl.LINE_LOOP;\r\n case 6:\r\n return this._gl.LINE_STRIP;\r\n case 7:\r\n return this._gl.TRIANGLE_STRIP;\r\n case 8:\r\n return this._gl.TRIANGLE_FAN;\r\n default:\r\n return this._gl.TRIANGLES;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n protected _reportDrawCall() {\r\n // Will be implemented by children\r\n }\r\n\r\n // Shaders\r\n\r\n /** @hidden */\r\n public _releaseEffect(effect: Effect): void {\r\n if (this._compiledEffects[effect._key]) {\r\n delete this._compiledEffects[effect._key];\r\n\r\n this._deletePipelineContext(effect.getPipelineContext() as WebGLPipelineContext);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _deletePipelineContext(pipelineContext: IPipelineContext): void {\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (webGLPipelineContext && webGLPipelineContext.program) {\r\n webGLPipelineContext.program.__SPECTOR_rebuildProgram = null;\r\n\r\n this._gl.deleteProgram(webGLPipelineContext.program);\r\n }\r\n }\r\n\r\n /**\r\n * Create a new effect (used to store vertex/fragment shaders)\r\n * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx)\r\n * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object\r\n * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader conmpilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights)\r\n * @returns the new Effect\r\n */\r\n public createEffect(baseName: any, attributesNamesOrOptions: string[] | IEffectCreationOptions, uniformsNamesOrEngine: string[] | ThinEngine, samplers?: string[], defines?: string,\r\n fallbacks?: IEffectFallbacks,\r\n onCompiled?: Nullable<(effect: Effect) => void>, onError?: Nullable<(effect: Effect, errors: string) => void>, indexParameters?: any): Effect {\r\n var vertex = baseName.vertexElement || baseName.vertex || baseName.vertexToken || baseName.vertexSource || baseName;\r\n var fragment = baseName.fragmentElement || baseName.fragment || baseName.fragmentToken || baseName.fragmentSource || baseName;\r\n\r\n var name = vertex + \"+\" + fragment + \"@\" + (defines ? defines : (<IEffectCreationOptions>attributesNamesOrOptions).defines);\r\n if (this._compiledEffects[name]) {\r\n var compiledEffect = <Effect>this._compiledEffects[name];\r\n if (onCompiled && compiledEffect.isReady()) {\r\n onCompiled(compiledEffect);\r\n }\r\n\r\n return compiledEffect;\r\n }\r\n var effect = new Effect(baseName, attributesNamesOrOptions, uniformsNamesOrEngine, samplers, this, defines, fallbacks, onCompiled, onError, indexParameters);\r\n effect._key = name;\r\n this._compiledEffects[name] = effect;\r\n\r\n return effect;\r\n }\r\n\r\n protected static _ConcatenateShader(source: string, defines: Nullable<string>, shaderVersion: string = \"\"): string {\r\n return shaderVersion + (defines ? defines + \"\\n\" : \"\") + source;\r\n }\r\n\r\n private _compileShader(source: string, type: string, defines: Nullable<string>, shaderVersion: string): WebGLShader {\r\n return this._compileRawShader(ThinEngine._ConcatenateShader(source, defines, shaderVersion), type);\r\n }\r\n\r\n private _compileRawShader(source: string, type: string): WebGLShader {\r\n var gl = this._gl;\r\n var shader = gl.createShader(type === \"vertex\" ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER);\r\n\r\n if (!shader) {\r\n throw new Error(\"Something went wrong while compile the shader.\");\r\n }\r\n\r\n gl.shaderSource(shader, source);\r\n gl.compileShader(shader);\r\n\r\n return shader;\r\n }\r\n\r\n /** @hidden */\r\n public _getShaderSource(shader: WebGLShader): Nullable<string> {\r\n return this._gl.getShaderSource(shader);\r\n }\r\n\r\n /**\r\n * Directly creates a webGL program\r\n * @param pipelineContext defines the pipeline context to attach to\r\n * @param vertexCode defines the vertex shader code to use\r\n * @param fragmentCode defines the fragment shader code to use\r\n * @param context defines the webGL context to use (if not set, the current one will be used)\r\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\r\n * @returns the new webGL program\r\n */\r\n public createRawShaderProgram(pipelineContext: IPipelineContext, vertexCode: string, fragmentCode: string, context?: WebGLRenderingContext, transformFeedbackVaryings: Nullable<string[]> = null): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n var vertexShader = this._compileRawShader(vertexCode, \"vertex\");\r\n var fragmentShader = this._compileRawShader(fragmentCode, \"fragment\");\r\n\r\n return this._createShaderProgram(pipelineContext as WebGLPipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings);\r\n }\r\n\r\n /**\r\n * Creates a webGL program\r\n * @param pipelineContext defines the pipeline context to attach to\r\n * @param vertexCode defines the vertex shader code to use\r\n * @param fragmentCode defines the fragment shader code to use\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param context defines the webGL context to use (if not set, the current one will be used)\r\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\r\n * @returns the new webGL program\r\n */\r\n public createShaderProgram(pipelineContext: IPipelineContext, vertexCode: string, fragmentCode: string, defines: Nullable<string>, context?: WebGLRenderingContext, transformFeedbackVaryings: Nullable<string[]> = null): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n var shaderVersion = (this._webGLVersion > 1) ? \"#version 300 es\\n#define WEBGL2 \\n\" : \"\";\r\n var vertexShader = this._compileShader(vertexCode, \"vertex\", defines, shaderVersion);\r\n var fragmentShader = this._compileShader(fragmentCode, \"fragment\", defines, shaderVersion);\r\n\r\n return this._createShaderProgram(pipelineContext as WebGLPipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings);\r\n }\r\n\r\n /**\r\n * Creates a new pipeline context\r\n * @returns the new pipeline\r\n */\r\n public createPipelineContext(): IPipelineContext {\r\n var pipelineContext = new WebGLPipelineContext();\r\n pipelineContext.engine = this;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n pipelineContext.isParallelCompiled = true;\r\n }\r\n\r\n return pipelineContext;\r\n }\r\n\r\n protected _createShaderProgram(pipelineContext: WebGLPipelineContext, vertexShader: WebGLShader, fragmentShader: WebGLShader, context: WebGLRenderingContext, transformFeedbackVaryings: Nullable<string[]> = null): WebGLProgram {\r\n var shaderProgram = context.createProgram();\r\n pipelineContext.program = shaderProgram;\r\n\r\n if (!shaderProgram) {\r\n throw new Error(\"Unable to create program\");\r\n }\r\n\r\n context.attachShader(shaderProgram, vertexShader);\r\n context.attachShader(shaderProgram, fragmentShader);\r\n\r\n context.linkProgram(shaderProgram);\r\n\r\n pipelineContext.context = context;\r\n pipelineContext.vertexShader = vertexShader;\r\n pipelineContext.fragmentShader = fragmentShader;\r\n\r\n if (!pipelineContext.isParallelCompiled) {\r\n this._finalizePipelineContext(pipelineContext);\r\n }\r\n\r\n return shaderProgram;\r\n }\r\n\r\n protected _finalizePipelineContext(pipelineContext: WebGLPipelineContext) {\r\n const context = pipelineContext.context!;\r\n const vertexShader = pipelineContext.vertexShader!;\r\n const fragmentShader = pipelineContext.fragmentShader!;\r\n const program = pipelineContext.program!;\r\n\r\n var linked = context.getProgramParameter(program, context.LINK_STATUS);\r\n if (!linked) { // Get more info\r\n // Vertex\r\n if (!this._gl.getShaderParameter(vertexShader, this._gl.COMPILE_STATUS)) {\r\n const log = this._gl.getShaderInfoLog(vertexShader);\r\n if (log) {\r\n pipelineContext.vertexCompilationError = log;\r\n throw new Error(\"VERTEX SHADER \" + log);\r\n }\r\n }\r\n\r\n // Fragment\r\n if (!this._gl.getShaderParameter(fragmentShader, this._gl.COMPILE_STATUS)) {\r\n const log = this._gl.getShaderInfoLog(fragmentShader);\r\n if (log) {\r\n pipelineContext.fragmentCompilationError = log;\r\n throw new Error(\"FRAGMENT SHADER \" + log);\r\n }\r\n }\r\n\r\n var error = context.getProgramInfoLog(program);\r\n if (error) {\r\n pipelineContext.programLinkError = error;\r\n throw new Error(error);\r\n }\r\n }\r\n\r\n if (this.validateShaderPrograms) {\r\n context.validateProgram(program);\r\n var validated = context.getProgramParameter(program, context.VALIDATE_STATUS);\r\n\r\n if (!validated) {\r\n var error = context.getProgramInfoLog(program);\r\n if (error) {\r\n pipelineContext.programValidationError = error;\r\n throw new Error(error);\r\n }\r\n }\r\n }\r\n\r\n context.deleteShader(vertexShader);\r\n context.deleteShader(fragmentShader);\r\n\r\n pipelineContext.vertexShader = undefined;\r\n pipelineContext.fragmentShader = undefined;\r\n\r\n if (pipelineContext.onCompiled) {\r\n pipelineContext.onCompiled();\r\n pipelineContext.onCompiled = undefined;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _preparePipelineContext(pipelineContext: IPipelineContext, vertexSourceCode: string, fragmentSourceCode: string, createAsRaw: boolean,\r\n rebuildRebind: any,\r\n defines: Nullable<string>,\r\n transformFeedbackVaryings: Nullable<string[]>) {\r\n let webGLRenderingState = pipelineContext as WebGLPipelineContext;\r\n\r\n if (createAsRaw) {\r\n webGLRenderingState.program = this.createRawShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, undefined, transformFeedbackVaryings);\r\n }\r\n else {\r\n webGLRenderingState.program = this.createShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, defines, undefined, transformFeedbackVaryings);\r\n }\r\n webGLRenderingState.program.__SPECTOR_rebuildProgram = rebuildRebind;\r\n }\r\n\r\n /** @hidden */\r\n public _isRenderingStateCompiled(pipelineContext: IPipelineContext): boolean {\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (this._gl.getProgramParameter(webGLPipelineContext.program!, this._caps.parallelShaderCompile!.COMPLETION_STATUS_KHR)) {\r\n this._finalizePipelineContext(webGLPipelineContext);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** @hidden */\r\n public _executeWhenRenderingStateIsCompiled(pipelineContext: IPipelineContext, action: () => void) {\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n if (!webGLPipelineContext.isParallelCompiled) {\r\n action();\r\n return;\r\n }\r\n\r\n let oldHandler = webGLPipelineContext.onCompiled;\r\n\r\n if (oldHandler) {\r\n webGLPipelineContext.onCompiled = () => {\r\n oldHandler!();\r\n action();\r\n };\r\n } else {\r\n webGLPipelineContext.onCompiled = action;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of webGL uniform locations associated with a specific program based on a list of uniform names\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param uniformsNames defines the list of uniform names\r\n * @returns an array of webGL uniform locations\r\n */\r\n public getUniforms(pipelineContext: IPipelineContext, uniformsNames: string[]): Nullable<WebGLUniformLocation>[] {\r\n var results = new Array<Nullable<WebGLUniformLocation>>();\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n for (var index = 0; index < uniformsNames.length; index++) {\r\n results.push(this._gl.getUniformLocation(webGLPipelineContext.program!, uniformsNames[index]));\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Gets the lsit of active attributes for a given webGL program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param attributesNames defines the list of attribute names to get\r\n * @returns an array of indices indicating the offset of each attribute\r\n */\r\n public getAttributes(pipelineContext: IPipelineContext, attributesNames: string[]): number[] {\r\n var results = [];\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n for (var index = 0; index < attributesNames.length; index++) {\r\n try {\r\n results.push(this._gl.getAttribLocation(webGLPipelineContext.program!, attributesNames[index]));\r\n } catch (e) {\r\n results.push(-1);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Activates an effect, mkaing it the current one (ie. the one used for rendering)\r\n * @param effect defines the effect to activate\r\n */\r\n public enableEffect(effect: Nullable<Effect>): void {\r\n if (!effect || effect === this._currentEffect) {\r\n return;\r\n }\r\n\r\n // Use program\r\n this.bindSamplers(effect);\r\n\r\n this._currentEffect = effect;\r\n\r\n if (effect.onBind) {\r\n effect.onBind(effect);\r\n }\r\n if (effect._onBindObservable) {\r\n effect._onBindObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (int)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the int number to store\r\n * @returns true if the value was set\r\n */\r\n public setInt(uniform: Nullable<WebGLUniformLocation>, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1i(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray(uniform: Nullable<WebGLUniformLocation>, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1iv(uniform, array);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray2(uniform: Nullable<WebGLUniformLocation>, array: Int32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray3(uniform: Nullable<WebGLUniformLocation>, array: Int32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray4(uniform: Nullable<WebGLUniformLocation>, array: Int32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray(uniform: Nullable<WebGLUniformLocation>, array: number[] | Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray2(uniform: Nullable<WebGLUniformLocation>, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2fv(uniform, <any>array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray3(uniform: Nullable<WebGLUniformLocation>, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3fv(uniform, <any>array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray4(uniform: Nullable<WebGLUniformLocation>, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4fv(uniform, <any>array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of float32 (stored as matrices)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrices defines the array of float32 to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrices(uniform: Nullable<WebGLUniformLocation>, matrices: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix4fv(uniform, false, matrices);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a matrix (3x3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrix defines the Float32Array representing the 3x3 matrix to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrix3x3(uniform: Nullable<WebGLUniformLocation>, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix3fv(uniform, false, matrix);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a matrix (2x2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrix defines the Float32Array representing the 2x2 matrix to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrix2x2(uniform: Nullable<WebGLUniformLocation>, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix2fv(uniform, false, matrix);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (float)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the float number to store\r\n * @returns true if the value was transfered\r\n */\r\n public setFloat(uniform: Nullable<WebGLUniformLocation>, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1f(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec2\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat2(uniform: Nullable<WebGLUniformLocation>, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2f(uniform, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec3\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat3(uniform: Nullable<WebGLUniformLocation>, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3f(uniform, x, y, z);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec4\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @param w defines the 4th component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat4(uniform: Nullable<WebGLUniformLocation>, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4f(uniform, x, y, z, w);\r\n\r\n return true;\r\n }\r\n\r\n // States\r\n\r\n /**\r\n * Apply all cached states (depth, culling, stencil and alpha)\r\n */\r\n public applyStates() {\r\n this._depthCullingState.apply(this._gl);\r\n this._stencilState.apply(this._gl);\r\n this._alphaState.apply(this._gl);\r\n\r\n if (this._colorWriteChanged) {\r\n this._colorWriteChanged = false;\r\n const enable = this._colorWrite;\r\n this._gl.colorMask(enable, enable, enable, enable);\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable color writing\r\n * @param enable defines the state to set\r\n */\r\n public setColorWrite(enable: boolean): void {\r\n if (enable !== this._colorWrite) {\r\n this._colorWriteChanged = true;\r\n this._colorWrite = enable;\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if color writing is enabled\r\n * @returns the current color writing state\r\n */\r\n public getColorWrite(): boolean {\r\n return this._colorWrite;\r\n }\r\n\r\n /**\r\n * Gets the depth culling state manager\r\n */\r\n public get depthCullingState(): DepthCullingState {\r\n return this._depthCullingState;\r\n }\r\n\r\n /**\r\n * Gets the alpha state manager\r\n */\r\n public get alphaState(): AlphaState {\r\n return this._alphaState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state manager\r\n */\r\n public get stencilState(): StencilState {\r\n return this._stencilState;\r\n }\r\n\r\n // Textures\r\n\r\n /**\r\n * Clears the list of texture accessible through engine.\r\n * This can help preventing texture load conflict due to name collision.\r\n */\r\n public clearInternalTexturesCache() {\r\n this._internalTexturesCache = [];\r\n }\r\n\r\n /**\r\n * Force the entire cache to be cleared\r\n * You should not have to use this function unless your engine needs to share the webGL context with another engine\r\n * @param bruteForce defines a boolean to force clearing ALL caches (including stencil, detoh and alpha states)\r\n */\r\n public wipeCaches(bruteForce?: boolean): void {\r\n if (this.preventCacheWipeBetweenFrames && !bruteForce) {\r\n return;\r\n }\r\n this._currentEffect = null;\r\n this._viewportCached.x = 0;\r\n this._viewportCached.y = 0;\r\n this._viewportCached.z = 0;\r\n this._viewportCached.w = 0;\r\n\r\n // Done before in case we clean the attributes\r\n this._unbindVertexArrayObject();\r\n\r\n if (bruteForce) {\r\n this._currentProgram = null;\r\n this.resetTextureCache();\r\n\r\n this._stencilState.reset();\r\n\r\n this._depthCullingState.reset();\r\n this._depthCullingState.depthFunc = this._gl.LEQUAL;\r\n\r\n this._alphaState.reset();\r\n this._alphaMode = 1;\r\n this._alphaEquation = 0;\r\n\r\n this._colorWrite = true;\r\n this._colorWriteChanged = true;\r\n\r\n this._unpackFlipYCached = null;\r\n\r\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE);\r\n this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\r\n\r\n this._mustWipeVertexAttributes = true;\r\n this.unbindAllAttributes();\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n this._cachedIndexBuffer = null;\r\n this._cachedEffectForVertexBuffers = null;\r\n this.bindIndexBuffer(null);\r\n }\r\n\r\n /** @hidden */\r\n public _getSamplingParameters(samplingMode: number, generateMipMaps: boolean): { min: number; mag: number } {\r\n var gl = this._gl;\r\n var magFilter = gl.NEAREST;\r\n var minFilter = gl.NEAREST;\r\n\r\n switch (samplingMode) {\r\n case 11:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case 3:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case 8:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case 4:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case 5:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case 6:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case 7:\r\n magFilter = gl.NEAREST;\r\n minFilter = gl.LINEAR;\r\n break;\r\n case 1:\r\n magFilter = gl.NEAREST;\r\n minFilter = gl.NEAREST;\r\n break;\r\n case 9:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case 10:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case 2:\r\n magFilter = gl.LINEAR;\r\n minFilter = gl.LINEAR;\r\n break;\r\n case 12:\r\n magFilter = gl.LINEAR;\r\n minFilter = gl.NEAREST;\r\n break;\r\n }\r\n\r\n return {\r\n min: minFilter,\r\n mag: magFilter\r\n };\r\n }\r\n\r\n /** @hidden */\r\n public _createTexture(): WebGLTexture {\r\n let texture = this._gl.createTexture();\r\n\r\n if (!texture) {\r\n throw new Error(\"Unable to create texture\");\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Usually called from Texture.ts.\r\n * Passed information to create a WebGLTexture\r\n * @param url defines a value which contains one of the following:\r\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\r\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\r\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\r\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\r\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\r\n * @param scene needed for loading to the correct scene\r\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param onLoad optional callback to be called upon successful completion\r\n * @param onError optional callback to be called upon failure\r\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\r\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\r\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param mimeType defines an optional mime type\r\n * @param loaderOptions options to be passed to the loader\r\n * @returns a InternalTexture for assignment back into BABYLON.Texture\r\n */\r\n public createTexture(url: Nullable<string>, noMipmap: boolean, invertY: boolean, scene: Nullable<ISceneLike>, samplingMode: number = 3,\r\n onLoad: Nullable<() => void> = null, onError: Nullable<(message: string, exception: any) => void> = null,\r\n buffer: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap> = null, fallback: Nullable<InternalTexture> = null, format: Nullable<number> = null,\r\n forcedExtension: Nullable<string> = null, mimeType?: string, loaderOptions?: any): InternalTexture {\r\n url = url || \"\";\r\n const fromData = url.substr(0, 5) === \"data:\";\r\n const fromBlob = url.substr(0, 5) === \"blob:\";\r\n const isBase64 = fromData && url.indexOf(\";base64,\") !== -1;\r\n\r\n let texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url);\r\n\r\n const originalUrl = url;\r\n if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) {\r\n url = this._transformTextureUrl(url);\r\n }\r\n\r\n if (originalUrl !== url) {\r\n texture._originalUrl = originalUrl;\r\n }\r\n\r\n // establish the file extension, if possible\r\n const lastDot = url.lastIndexOf('.');\r\n let extension = forcedExtension ? forcedExtension : (lastDot > -1 ? url.substring(lastDot).toLowerCase() : \"\");\r\n let loader: Nullable<IInternalTextureLoader> = null;\r\n\r\n // Remove query string\r\n let queryStringIndex = extension.indexOf(\"?\");\r\n\r\n if (queryStringIndex > -1) {\r\n extension = extension.split(\"?\")[0];\r\n }\r\n\r\n for (const availableLoader of ThinEngine._TextureLoaders) {\r\n if (availableLoader.canLoad(extension, mimeType)) {\r\n loader = availableLoader;\r\n break;\r\n }\r\n }\r\n\r\n if (scene) {\r\n scene._addPendingData(texture);\r\n }\r\n texture.url = url;\r\n texture.generateMipMaps = !noMipmap;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n\r\n if (!this._doNotHandleContextLost) {\r\n // Keep a link to the buffer only if we plan to handle context lost\r\n texture._buffer = buffer;\r\n }\r\n\r\n let onLoadObserver: Nullable<Observer<InternalTexture>> = null;\r\n if (onLoad && !fallback) {\r\n onLoadObserver = texture.onLoadedObservable.add(onLoad);\r\n }\r\n\r\n if (!fallback) { this._internalTexturesCache.push(texture); }\r\n\r\n const onInternalError = (message?: string, exception?: any) => {\r\n if (scene) {\r\n scene._removePendingData(texture);\r\n }\r\n\r\n if (url === originalUrl) {\r\n if (onLoadObserver) {\r\n texture.onLoadedObservable.remove(onLoadObserver);\r\n }\r\n\r\n if (EngineStore.UseFallbackTexture) {\r\n this.createTexture(EngineStore.FallbackTexture, noMipmap, texture.invertY, scene, samplingMode, null, onError, buffer, texture);\r\n }\r\n\r\n if (onError) {\r\n onError((message || \"Unknown error\") + (EngineStore.UseFallbackTexture ? \" - Fallback texture was used\" : \"\"), exception);\r\n }\r\n }\r\n else {\r\n // fall back to the original url if the transformed url fails to load\r\n Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`);\r\n this.createTexture(originalUrl, noMipmap, texture.invertY, scene, samplingMode, onLoad, onError, buffer, texture, format, forcedExtension, mimeType, loaderOptions);\r\n }\r\n };\r\n\r\n // processing for non-image formats\r\n if (loader) {\r\n const callback = (data: ArrayBufferView) => {\r\n loader!.loadData(data, texture, (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed) => {\r\n if (loadFailed) {\r\n onInternalError(\"TextureLoader failed to load data\");\r\n } else {\r\n this._prepareWebGLTexture(texture, scene, width, height, texture.invertY, !loadMipmap, isCompressed, () => {\r\n done();\r\n return false;\r\n }, samplingMode);\r\n }\r\n }, loaderOptions);\r\n };\r\n\r\n if (!buffer) {\r\n this._loadFile(url, (data) => callback(new Uint8Array(data as ArrayBuffer)), undefined, scene ? scene.offlineProvider : undefined, true, (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url, exception));\r\n });\r\n } else {\r\n if (buffer instanceof ArrayBuffer) {\r\n callback(new Uint8Array(buffer));\r\n }\r\n else if (ArrayBuffer.isView(buffer)) {\r\n callback(buffer);\r\n }\r\n else {\r\n if (onError) {\r\n onError(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\", null);\r\n }\r\n }\r\n }\r\n } else {\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n if (fromBlob && !this._doNotHandleContextLost) {\r\n // We need to store the image if we need to rebuild the texture\r\n // in case of a webgl context lost\r\n texture._buffer = img;\r\n }\r\n\r\n this._prepareWebGLTexture(texture, scene, img.width, img.height, texture.invertY, noMipmap, false, (potWidth, potHeight, continuationCallback) => {\r\n let gl = this._gl;\r\n var isPot = (img.width === potWidth && img.height === potHeight);\r\n let internalFormat = format ? this._getInternalFormat(format) : ((extension === \".jpg\") ? gl.RGB : gl.RGBA);\r\n\r\n if (isPot) {\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, internalFormat, gl.UNSIGNED_BYTE, img);\r\n return false;\r\n }\r\n\r\n let maxTextureSize = this._caps.maxTextureSize;\r\n\r\n if (img.width > maxTextureSize || img.height > maxTextureSize || !this._supportsHardwareTextureRescaling) {\r\n this._prepareWorkingCanvas();\r\n if (!this._workingCanvas || !this._workingContext) {\r\n return false;\r\n }\r\n\r\n this._workingCanvas.width = potWidth;\r\n this._workingCanvas.height = potHeight;\r\n\r\n this._workingContext.drawImage(img, 0, 0, img.width, img.height, 0, 0, potWidth, potHeight);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, internalFormat, gl.UNSIGNED_BYTE, this._workingCanvas);\r\n\r\n texture.width = potWidth;\r\n texture.height = potHeight;\r\n\r\n return false;\r\n } else {\r\n // Using shaders when possible to rescale because canvas.drawImage is lossy\r\n let source = new InternalTexture(this, InternalTextureSource.Temp);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, source, true);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, internalFormat, gl.UNSIGNED_BYTE, img);\r\n\r\n this._rescaleTexture(source, texture, scene, internalFormat, () => {\r\n this._releaseTexture(source);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n\r\n continuationCallback();\r\n });\r\n }\r\n\r\n return true;\r\n }, samplingMode);\r\n };\r\n\r\n if (!fromData || isBase64) {\r\n if (buffer && ((<HTMLImageElement>buffer).decoding || (<ImageBitmap>buffer).close)) {\r\n onload(<HTMLImageElement>buffer);\r\n } else {\r\n ThinEngine._FileToolsLoadImage(url, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);\r\n }\r\n }\r\n else if (typeof buffer === \"string\" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) {\r\n ThinEngine._FileToolsLoadImage(buffer, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);\r\n }\r\n else if (buffer) {\r\n onload(buffer);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @returns the HTMLImageElement of the loaded image\r\n * @hidden\r\n */\r\n public static _FileToolsLoadImage(input: string | ArrayBuffer | ArrayBufferView | Blob, onLoad: (img: HTMLImageElement | ImageBitmap) => void, onError: (message?: string, exception?: any) => void, offlineProvider: Nullable<IOfflineProvider>, mimeType?: string): Nullable<HTMLImageElement> {\r\n throw _DevTools.WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _rescaleTexture(source: InternalTexture, destination: InternalTexture, scene: Nullable<any>, internalFormat: number, onComplete: () => void): void {\r\n }\r\n\r\n /**\r\n * Creates a raw texture\r\n * @param data defines the data to store in the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param format defines the format of the data\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @param compression defines the compression used (null by default)\r\n * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_INT by default)\r\n * @returns the raw texture inside an InternalTexture\r\n */\r\n public createRawTexture(data: Nullable<ArrayBufferView>, width: number, height: number, format: number, generateMipMaps: boolean, invertY: boolean, samplingMode: number, compression: Nullable<string> = null, type: number = 0): InternalTexture {\r\n throw _DevTools.WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n /**\r\n * Creates a new raw cube texture\r\n * @param data defines the array of data to use to create each face\r\n * @param size defines the size of the textures\r\n * @param format defines the format of the data\r\n * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_INT)\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compression used (null by default)\r\n * @returns the cube texture as an InternalTexture\r\n */\r\n public createRawCubeTexture(data: Nullable<ArrayBufferView[]>, size: number, format: number, type: number,\r\n generateMipMaps: boolean, invertY: boolean, samplingMode: number,\r\n compression: Nullable<string> = null): InternalTexture {\r\n throw _DevTools.WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n /**\r\n * Creates a new raw 3D texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the depth of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @returns a new raw 3D texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture3D(data: Nullable<ArrayBufferView>, width: number, height: number, depth: number, format: number, generateMipMaps: boolean, invertY: boolean, samplingMode: number, compression: Nullable<string> = null, textureType = 0): InternalTexture {\r\n throw _DevTools.WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n /**\r\n * Creates a new raw 2D array texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the number of layers of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @returns a new raw 2D array texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture2DArray(data: Nullable<ArrayBufferView>, width: number, height: number, depth: number, format: number, generateMipMaps: boolean, invertY: boolean, samplingMode: number, compression: Nullable<string> = null, textureType = 0): InternalTexture {\r\n throw _DevTools.WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n private _unpackFlipYCached: Nullable<boolean> = null;\r\n\r\n /**\r\n * In case you are sharing the context with other applications, it might\r\n * be interested to not cache the unpack flip y state to ensure a consistent\r\n * value would be set.\r\n */\r\n public enableUnpackFlipYCached = true;\r\n\r\n /** @hidden */\r\n public _unpackFlipY(value: boolean): void {\r\n if (this._unpackFlipYCached !== value) {\r\n this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, value ? 1 : 0);\r\n\r\n if (this.enableUnpackFlipYCached) {\r\n this._unpackFlipYCached = value;\r\n }\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _getUnpackAlignement(): number {\r\n return this._gl.getParameter(this._gl.UNPACK_ALIGNMENT);\r\n }\r\n\r\n private _getTextureTarget(texture: InternalTexture): number {\r\n if (texture.isCube) {\r\n return this._gl.TEXTURE_CUBE_MAP;\r\n } else if (texture.is3D) {\r\n return this._gl.TEXTURE_3D;\r\n } else if (texture.is2DArray || texture.isMultiview) {\r\n return this._gl.TEXTURE_2D_ARRAY;\r\n }\r\n return this._gl.TEXTURE_2D;\r\n }\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param samplingMode defines the required sampling mode\r\n * @param texture defines the texture to update\r\n * @param generateMipMaps defines whether to generate mipmaps for the texture\r\n */\r\n public updateTextureSamplingMode(samplingMode: number, texture: InternalTexture, generateMipMaps: boolean = false): void {\r\n const target = this._getTextureTarget(texture);\r\n var filters = this._getSamplingParameters(samplingMode, texture.generateMipMaps || generateMipMaps);\r\n\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_MAG_FILTER, filters.mag, texture);\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_MIN_FILTER, filters.min);\r\n\r\n if (generateMipMaps) {\r\n texture.generateMipMaps = true;\r\n this._gl.generateMipmap(target);\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n\r\n texture.samplingMode = samplingMode;\r\n }\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param texture defines the texture to update\r\n * @param wrapU defines the texture wrap mode of the u coordinates\r\n * @param wrapV defines the texture wrap mode of the v coordinates\r\n * @param wrapR defines the texture wrap mode of the r coordinates\r\n */\r\n public updateTextureWrappingMode(texture: InternalTexture, wrapU: Nullable<number>, wrapV: Nullable<number> = null, wrapR: Nullable<number> = null): void {\r\n const target = this._getTextureTarget(texture);\r\n\r\n if (wrapU !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(wrapU), texture);\r\n texture._cachedWrapU = wrapU;\r\n }\r\n if (wrapV !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(wrapV), texture);\r\n texture._cachedWrapV = wrapV;\r\n }\r\n if ((texture.is2DArray || texture.is3D) && (wrapR !== null)) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(wrapR), texture);\r\n texture._cachedWrapR = wrapR;\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n /** @hidden */\r\n public _setupDepthStencilTexture(internalTexture: InternalTexture, size: number | { width: number, height: number, layers?: number }, generateStencil: boolean, bilinearFiltering: boolean, comparisonFunction: number): void {\r\n const width = (<{ width: number, height: number, layers?: number }>size).width || <number>size;\r\n const height = (<{ width: number, height: number, layers?: number }>size).height || <number>size;\r\n const layers = (<{ width: number, height: number, layers?: number }>size).layers || 0;\r\n\r\n internalTexture.baseWidth = width;\r\n internalTexture.baseHeight = height;\r\n internalTexture.width = width;\r\n internalTexture.height = height;\r\n internalTexture.is2DArray = layers > 0;\r\n internalTexture.depth = layers;\r\n internalTexture.isReady = true;\r\n internalTexture.samples = 1;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture._generateDepthBuffer = true;\r\n internalTexture._generateStencilBuffer = generateStencil;\r\n internalTexture.samplingMode = bilinearFiltering ? 2 : 1;\r\n internalTexture.type = 0;\r\n internalTexture._comparisonFunction = comparisonFunction;\r\n\r\n const gl = this._gl;\r\n const target = this._getTextureTarget(internalTexture);\r\n const samplingParameters = this._getSamplingParameters(internalTexture.samplingMode, false);\r\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, samplingParameters.mag);\r\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, samplingParameters.min);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n if (comparisonFunction === 0) {\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, 515);\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.NONE);\r\n }\r\n else {\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, comparisonFunction);\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _uploadCompressedDataToTextureDirectly(texture: InternalTexture, internalFormat: number, width: number, height: number, data: ArrayBufferView, faceIndex: number = 0, lod: number = 0) {\r\n var gl = this._gl;\r\n\r\n var target = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n this._gl.compressedTexImage2D(target, lod, internalFormat, width, height, 0, <DataView>data);\r\n }\r\n\r\n /** @hidden */\r\n public _uploadDataToTextureDirectly(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0, babylonInternalFormat?: number, useTextureWidthAndHeight = false): void {\r\n var gl = this._gl;\r\n\r\n var textureType = this._getWebGLTextureType(texture.type);\r\n var format = this._getInternalFormat(texture.format);\r\n var internalFormat = babylonInternalFormat === undefined ? this._getRGBABufferInternalSizedFormat(texture.type, texture.format) : this._getInternalFormat(babylonInternalFormat);\r\n\r\n this._unpackFlipY(texture.invertY);\r\n\r\n var target = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n const lodMaxWidth = Math.round(Math.log(texture.width) * Math.LOG2E);\r\n const lodMaxHeight = Math.round(Math.log(texture.height) * Math.LOG2E);\r\n const width = useTextureWidthAndHeight ? texture.width : Math.pow(2, Math.max(lodMaxWidth - lod, 0));\r\n const height = useTextureWidthAndHeight ? texture.height : Math.pow(2, Math.max(lodMaxHeight - lod, 0));\r\n\r\n gl.texImage2D(target, lod, internalFormat, width, height, 0, format, textureType, imageData);\r\n }\r\n\r\n /**\r\n * Update a portion of an internal texture\r\n * @param texture defines the texture to update\r\n * @param imageData defines the data to store into the texture\r\n * @param xOffset defines the x coordinates of the update rectangle\r\n * @param yOffset defines the y coordinates of the update rectangle\r\n * @param width defines the width of the update rectangle\r\n * @param height defines the height of the update rectangle\r\n * @param faceIndex defines the face index if texture is a cube (0 by default)\r\n * @param lod defines the lod level to update (0 by default)\r\n */\r\n public updateTextureData(texture: InternalTexture, imageData: ArrayBufferView, xOffset: number, yOffset: number, width: number, height: number, faceIndex: number = 0, lod: number = 0): void {\r\n var gl = this._gl;\r\n\r\n var textureType = this._getWebGLTextureType(texture.type);\r\n var format = this._getInternalFormat(texture.format);\r\n\r\n this._unpackFlipY(texture.invertY);\r\n\r\n var target = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n gl.texSubImage2D(target, lod, xOffset, yOffset, width, height, format, textureType, imageData);\r\n }\r\n\r\n /** @hidden */\r\n public _uploadArrayBufferViewToTexture(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0): void {\r\n var gl = this._gl;\r\n var bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;\r\n\r\n this._bindTextureDirectly(bindTarget, texture, true);\r\n\r\n this._uploadDataToTextureDirectly(texture, imageData, faceIndex, lod);\r\n\r\n this._bindTextureDirectly(bindTarget, null, true);\r\n }\r\n\r\n protected _prepareWebGLTextureContinuation(texture: InternalTexture, scene: Nullable<ISceneLike>, noMipmap: boolean, isCompressed: boolean, samplingMode: number): void {\r\n var gl = this._gl;\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n var filters = this._getSamplingParameters(samplingMode, !noMipmap);\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filters.mag);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filters.min);\r\n\r\n if (!noMipmap && !isCompressed) {\r\n gl.generateMipmap(gl.TEXTURE_2D);\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_2D, null);\r\n\r\n // this.resetTextureCache();\r\n if (scene) {\r\n scene._removePendingData(texture);\r\n }\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n }\r\n\r\n private _prepareWebGLTexture(texture: InternalTexture, scene: Nullable<ISceneLike>, width: number, height: number, invertY: boolean, noMipmap: boolean, isCompressed: boolean,\r\n processFunction: (width: number, height: number, continuationCallback: () => void) => boolean, samplingMode: number = 3): void {\r\n var maxTextureSize = this.getCaps().maxTextureSize;\r\n var potWidth = Math.min(maxTextureSize, this.needPOTTextures ? ThinEngine.GetExponentOfTwo(width, maxTextureSize) : width);\r\n var potHeight = Math.min(maxTextureSize, this.needPOTTextures ? ThinEngine.GetExponentOfTwo(height, maxTextureSize) : height);\r\n\r\n var gl = this._gl;\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n if (!texture._webGLTexture) {\r\n // this.resetTextureCache();\r\n if (scene) {\r\n scene._removePendingData(texture);\r\n }\r\n\r\n return;\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n this._unpackFlipY(invertY === undefined ? true : (invertY ? true : false));\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = potWidth;\r\n texture.height = potHeight;\r\n texture.isReady = true;\r\n\r\n if (processFunction(potWidth, potHeight, () => {\r\n this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode);\r\n })) {\r\n // Returning as texture needs extra async steps\r\n return;\r\n }\r\n\r\n this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode);\r\n }\r\n\r\n /** @hidden */\r\n public _setupFramebufferDepthAttachments(generateStencilBuffer: boolean, generateDepthBuffer: boolean, width: number, height: number, samples = 1): Nullable<WebGLRenderbuffer> {\r\n var gl = this._gl;\r\n\r\n // Create the depth/stencil buffer\r\n if (generateStencilBuffer && generateDepthBuffer) {\r\n return this._getDepthStencilBuffer(width, height, samples, gl.DEPTH_STENCIL, gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT);\r\n }\r\n if (generateDepthBuffer) {\r\n let depthFormat = gl.DEPTH_COMPONENT16;\r\n if (this._webGLVersion > 1) {\r\n depthFormat = gl.DEPTH_COMPONENT32F;\r\n }\r\n\r\n return this._getDepthStencilBuffer(width, height, samples, depthFormat, depthFormat, gl.DEPTH_ATTACHMENT);\r\n }\r\n if (generateStencilBuffer) {\r\n return this._getDepthStencilBuffer(width, height, samples, gl.STENCIL_INDEX8, gl.STENCIL_INDEX8, gl.STENCIL_ATTACHMENT);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _getDepthStencilBuffer = (width: number, height: number, samples: number, internalFormat: number, msInternalFormat: number, attachment: number) => {\r\n var gl = this._gl;\r\n const depthStencilBuffer = gl.createRenderbuffer();\r\n\r\n gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);\r\n\r\n if (samples > 1 && gl.renderbufferStorageMultisample) {\r\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, msInternalFormat, width, height);\r\n } else {\r\n gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height);\r\n }\r\n\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthStencilBuffer);\r\n\r\n gl.bindRenderbuffer(gl.RENDERBUFFER, null);\r\n\r\n return depthStencilBuffer;\r\n }\r\n\r\n /** @hidden */\r\n public _releaseFramebufferObjects(texture: InternalTexture): void {\r\n var gl = this._gl;\r\n\r\n if (texture._framebuffer) {\r\n gl.deleteFramebuffer(texture._framebuffer);\r\n texture._framebuffer = null;\r\n }\r\n\r\n if (texture._depthStencilBuffer) {\r\n gl.deleteRenderbuffer(texture._depthStencilBuffer);\r\n texture._depthStencilBuffer = null;\r\n }\r\n\r\n if (texture._MSAAFramebuffer) {\r\n gl.deleteFramebuffer(texture._MSAAFramebuffer);\r\n texture._MSAAFramebuffer = null;\r\n }\r\n\r\n if (texture._MSAARenderBuffer) {\r\n gl.deleteRenderbuffer(texture._MSAARenderBuffer);\r\n texture._MSAARenderBuffer = null;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _releaseTexture(texture: InternalTexture): void {\r\n this._releaseFramebufferObjects(texture);\r\n\r\n this._deleteTexture(texture._webGLTexture);\r\n\r\n // Unbind channels\r\n this.unbindAllTextures();\r\n\r\n var index = this._internalTexturesCache.indexOf(texture);\r\n if (index !== -1) {\r\n this._internalTexturesCache.splice(index, 1);\r\n }\r\n\r\n // Integrated fixed lod samplers.\r\n if (texture._lodTextureHigh) {\r\n texture._lodTextureHigh.dispose();\r\n }\r\n if (texture._lodTextureMid) {\r\n texture._lodTextureMid.dispose();\r\n }\r\n if (texture._lodTextureLow) {\r\n texture._lodTextureLow.dispose();\r\n }\r\n\r\n // Integrated irradiance map.\r\n if (texture._irradianceTexture) {\r\n texture._irradianceTexture.dispose();\r\n }\r\n }\r\n\r\n protected _deleteTexture(texture: Nullable<WebGLTexture>): void {\r\n this._gl.deleteTexture(texture);\r\n }\r\n\r\n protected _setProgram(program: WebGLProgram): void {\r\n if (this._currentProgram !== program) {\r\n this._gl.useProgram(program);\r\n this._currentProgram = program;\r\n }\r\n }\r\n\r\n protected _boundUniforms: { [key: number]: WebGLUniformLocation } = {};\r\n\r\n /**\r\n * Binds an effect to the webGL context\r\n * @param effect defines the effect to bind\r\n */\r\n public bindSamplers(effect: Effect): void {\r\n let webGLPipelineContext = effect.getPipelineContext() as WebGLPipelineContext;\r\n this._setProgram(webGLPipelineContext.program!);\r\n var samplers = effect.getSamplers();\r\n for (var index = 0; index < samplers.length; index++) {\r\n var uniform = effect.getUniform(samplers[index]);\r\n\r\n if (uniform) {\r\n this._boundUniforms[index] = uniform;\r\n }\r\n }\r\n this._currentEffect = null;\r\n }\r\n\r\n private _activateCurrentTexture() {\r\n if (this._currentTextureChannel !== this._activeChannel) {\r\n this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel);\r\n this._currentTextureChannel = this._activeChannel;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _bindTextureDirectly(target: number, texture: Nullable<InternalTexture>, forTextureDataUpdate = false, force = false): boolean {\r\n var wasPreviouslyBound = false;\r\n let isTextureForRendering = texture && texture._associatedChannel > -1;\r\n if (forTextureDataUpdate && isTextureForRendering) {\r\n this._activeChannel = texture!._associatedChannel;\r\n }\r\n\r\n let currentTextureBound = this._boundTexturesCache[this._activeChannel];\r\n\r\n if (currentTextureBound !== texture || force) {\r\n this._activateCurrentTexture();\r\n\r\n if (texture && texture.isMultiview) {\r\n this._gl.bindTexture(target, texture ? texture._colorTextureArray : null);\r\n } else {\r\n this._gl.bindTexture(target, texture ? texture._webGLTexture : null);\r\n }\r\n\r\n this._boundTexturesCache[this._activeChannel] = texture;\r\n\r\n if (texture) {\r\n texture._associatedChannel = this._activeChannel;\r\n }\r\n } else if (forTextureDataUpdate) {\r\n wasPreviouslyBound = true;\r\n this._activateCurrentTexture();\r\n }\r\n\r\n if (isTextureForRendering && !forTextureDataUpdate) {\r\n this._bindSamplerUniformToChannel(texture!._associatedChannel, this._activeChannel);\r\n }\r\n\r\n return wasPreviouslyBound;\r\n }\r\n\r\n /** @hidden */\r\n public _bindTexture(channel: number, texture: Nullable<InternalTexture>): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (texture) {\r\n texture._associatedChannel = channel;\r\n }\r\n\r\n this._activeChannel = channel;\r\n const target = texture ? this._getTextureTarget(texture) : this._gl.TEXTURE_2D;\r\n this._bindTextureDirectly(target, texture);\r\n }\r\n\r\n /**\r\n * Unbind all textures from the webGL context\r\n */\r\n public unbindAllTextures(): void {\r\n for (var channel = 0; channel < this._maxSimultaneousTextures; channel++) {\r\n this._activeChannel = channel;\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n if (this.webGLVersion > 1) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_3D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a texture to the according uniform.\r\n * @param channel The texture channel\r\n * @param uniform The uniform to set\r\n * @param texture The texture to apply\r\n */\r\n public setTexture(channel: number, uniform: Nullable<WebGLUniformLocation>, texture: Nullable<ThinTexture>): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (uniform) {\r\n this._boundUniforms[channel] = uniform;\r\n }\r\n\r\n this._setTexture(channel, texture);\r\n }\r\n\r\n private _bindSamplerUniformToChannel(sourceSlot: number, destination: number) {\r\n let uniform = this._boundUniforms[sourceSlot];\r\n if (!uniform || uniform._currentState === destination) {\r\n return;\r\n }\r\n this._gl.uniform1i(uniform, destination);\r\n uniform._currentState = destination;\r\n }\r\n\r\n private _getTextureWrapMode(mode: number): number {\r\n switch (mode) {\r\n case 1:\r\n return this._gl.REPEAT;\r\n case 0:\r\n return this._gl.CLAMP_TO_EDGE;\r\n case 2:\r\n return this._gl.MIRRORED_REPEAT;\r\n }\r\n return this._gl.REPEAT;\r\n }\r\n\r\n protected _setTexture(channel: number, texture: Nullable<ThinTexture>, isPartOfTextureArray = false, depthStencilTexture = false): boolean {\r\n // Not ready?\r\n if (!texture) {\r\n if (this._boundTexturesCache[channel] != null) {\r\n this._activeChannel = channel;\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n if (this.webGLVersion > 1) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_3D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null);\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n // Video\r\n if ((<VideoTexture>texture).video) {\r\n this._activeChannel = channel;\r\n (<VideoTexture>texture).update();\r\n } else if (texture.delayLoadState === 4) { // Delay loading\r\n texture.delayLoad();\r\n return false;\r\n }\r\n\r\n let internalTexture: InternalTexture;\r\n if (depthStencilTexture) {\r\n internalTexture = (<RenderTargetTexture>texture).depthStencilTexture!;\r\n }\r\n else if (texture.isReady()) {\r\n internalTexture = <InternalTexture>texture.getInternalTexture();\r\n }\r\n else if (texture.isCube) {\r\n internalTexture = this.emptyCubeTexture;\r\n }\r\n else if (texture.is3D) {\r\n internalTexture = this.emptyTexture3D;\r\n }\r\n else if (texture.is2DArray) {\r\n internalTexture = this.emptyTexture2DArray;\r\n }\r\n else {\r\n internalTexture = this.emptyTexture;\r\n }\r\n\r\n if (!isPartOfTextureArray && internalTexture) {\r\n internalTexture._associatedChannel = channel;\r\n }\r\n\r\n let needToBind = true;\r\n if (this._boundTexturesCache[channel] === internalTexture) {\r\n if (!isPartOfTextureArray) {\r\n this._bindSamplerUniformToChannel(internalTexture._associatedChannel, channel);\r\n }\r\n\r\n needToBind = false;\r\n }\r\n\r\n this._activeChannel = channel;\r\n const target = this._getTextureTarget(internalTexture);\r\n if (needToBind) {\r\n this._bindTextureDirectly(target, internalTexture, isPartOfTextureArray);\r\n }\r\n\r\n if (internalTexture && !internalTexture.isMultiview) {\r\n // CUBIC_MODE and SKYBOX_MODE both require CLAMP_TO_EDGE. All other modes use REPEAT.\r\n if (internalTexture.isCube && internalTexture._cachedCoordinatesMode !== texture.coordinatesMode) {\r\n internalTexture._cachedCoordinatesMode = texture.coordinatesMode;\r\n\r\n var textureWrapMode = (texture.coordinatesMode !== 3 && texture.coordinatesMode !== 5) ? 1 : 0;\r\n texture.wrapU = textureWrapMode;\r\n texture.wrapV = textureWrapMode;\r\n }\r\n\r\n if (internalTexture._cachedWrapU !== texture.wrapU) {\r\n internalTexture._cachedWrapU = texture.wrapU;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(texture.wrapU), internalTexture);\r\n }\r\n\r\n if (internalTexture._cachedWrapV !== texture.wrapV) {\r\n internalTexture._cachedWrapV = texture.wrapV;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(texture.wrapV), internalTexture);\r\n }\r\n\r\n if (internalTexture.is3D && internalTexture._cachedWrapR !== texture.wrapR) {\r\n internalTexture._cachedWrapR = texture.wrapR;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(texture.wrapR), internalTexture);\r\n }\r\n\r\n this._setAnisotropicLevel(target, internalTexture, texture.anisotropicFilteringLevel);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sets an array of texture to the webGL context\r\n * @param channel defines the channel where the texture array must be set\r\n * @param uniform defines the associated uniform location\r\n * @param textures defines the array of textures to bind\r\n */\r\n public setTextureArray(channel: number, uniform: Nullable<WebGLUniformLocation>, textures: ThinTexture[]): void {\r\n if (channel === undefined || !uniform) {\r\n return;\r\n }\r\n\r\n if (!this._textureUnits || this._textureUnits.length !== textures.length) {\r\n this._textureUnits = new Int32Array(textures.length);\r\n }\r\n for (let i = 0; i < textures.length; i++) {\r\n let texture = textures[i].getInternalTexture();\r\n\r\n if (texture) {\r\n this._textureUnits[i] = channel + i;\r\n texture._associatedChannel = channel + i;\r\n } else {\r\n this._textureUnits[i] = -1;\r\n }\r\n }\r\n this._gl.uniform1iv(uniform, this._textureUnits);\r\n\r\n for (var index = 0; index < textures.length; index++) {\r\n this._setTexture(this._textureUnits[index], textures[index], true);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _setAnisotropicLevel(target: number, internalTexture: InternalTexture, anisotropicFilteringLevel: number) {\r\n var anisotropicFilterExtension = this._caps.textureAnisotropicFilterExtension;\r\n if (internalTexture.samplingMode !== 11\r\n && internalTexture.samplingMode !== 3\r\n && internalTexture.samplingMode !== 2) {\r\n anisotropicFilteringLevel = 1; // Forcing the anisotropic to 1 because else webgl will force filters to linear\r\n }\r\n\r\n if (anisotropicFilterExtension && internalTexture._cachedAnisotropicFilteringLevel !== anisotropicFilteringLevel) {\r\n this._setTextureParameterFloat(target, anisotropicFilterExtension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(anisotropicFilteringLevel, this._caps.maxAnisotropy), internalTexture);\r\n internalTexture._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel;\r\n }\r\n }\r\n\r\n private _setTextureParameterFloat(target: number, parameter: number, value: number, texture: InternalTexture): void {\r\n this._bindTextureDirectly(target, texture, true, true);\r\n this._gl.texParameterf(target, parameter, value);\r\n }\r\n\r\n private _setTextureParameterInteger(target: number, parameter: number, value: number, texture?: InternalTexture) {\r\n if (texture) {\r\n this._bindTextureDirectly(target, texture, true, true);\r\n }\r\n this._gl.texParameteri(target, parameter, value);\r\n }\r\n\r\n /**\r\n * Unbind all vertex attributes from the webGL context\r\n */\r\n public unbindAllAttributes() {\r\n if (this._mustWipeVertexAttributes) {\r\n this._mustWipeVertexAttributes = false;\r\n\r\n for (var i = 0; i < this._caps.maxVertexAttribs; i++) {\r\n this.disableAttributeByIndex(i);\r\n }\r\n return;\r\n }\r\n\r\n for (var i = 0, ul = this._vertexAttribArraysEnabled.length; i < ul; i++) {\r\n if (i >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[i]) {\r\n continue;\r\n }\r\n\r\n this.disableAttributeByIndex(i);\r\n }\r\n }\r\n\r\n /**\r\n * Force the engine to release all cached effects. This means that next effect compilation will have to be done completely even if a similar effect was already compiled\r\n */\r\n public releaseEffects() {\r\n for (var name in this._compiledEffects) {\r\n let webGLPipelineContext = this._compiledEffects[name].getPipelineContext() as WebGLPipelineContext;\r\n this._deletePipelineContext(webGLPipelineContext);\r\n }\r\n\r\n this._compiledEffects = {};\r\n }\r\n\r\n /**\r\n * Dispose and release all associated resources\r\n */\r\n public dispose(): void {\r\n this.stopRenderLoop();\r\n\r\n // Clear observables\r\n if (this.onBeforeTextureInitObservable) {\r\n this.onBeforeTextureInitObservable.clear();\r\n }\r\n\r\n // Empty texture\r\n if (this._emptyTexture) {\r\n this._releaseTexture(this._emptyTexture);\r\n this._emptyTexture = null;\r\n }\r\n if (this._emptyCubeTexture) {\r\n this._releaseTexture(this._emptyCubeTexture);\r\n this._emptyCubeTexture = null;\r\n }\r\n\r\n if (this._dummyFramebuffer) {\r\n this._gl.deleteFramebuffer(this._dummyFramebuffer);\r\n }\r\n\r\n // Release effects\r\n this.releaseEffects();\r\n\r\n // Unbind\r\n this.unbindAllAttributes();\r\n this._boundUniforms = [];\r\n\r\n // Events\r\n if (DomManagement.IsWindowObjectExist()) {\r\n if (this._renderingCanvas) {\r\n if (!this._doNotHandleContextLost) {\r\n this._renderingCanvas.removeEventListener(\"webglcontextlost\", this._onContextLost);\r\n this._renderingCanvas.removeEventListener(\"webglcontextrestored\", this._onContextRestored);\r\n }\r\n }\r\n }\r\n\r\n this._workingCanvas = null;\r\n this._workingContext = null;\r\n this._currentBufferPointers = [];\r\n this._renderingCanvas = null;\r\n this._currentProgram = null;\r\n this._boundRenderFunction = null;\r\n\r\n Effect.ResetCache();\r\n\r\n // Abort active requests\r\n for (let request of this._activeRequests) {\r\n request.abort();\r\n }\r\n }\r\n\r\n /**\r\n * Attach a new callback raised when context lost event is fired\r\n * @param callback defines the callback to call\r\n */\r\n public attachContextLostEvent(callback: ((event: WebGLContextEvent) => void)): void {\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.addEventListener(\"webglcontextlost\", <any>callback, false);\r\n }\r\n }\r\n\r\n /**\r\n * Attach a new callback raised when context restored event is fired\r\n * @param callback defines the callback to call\r\n */\r\n public attachContextRestoredEvent(callback: ((event: WebGLContextEvent) => void)): void {\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.addEventListener(\"webglcontextrestored\", <any>callback, false);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current error code of the webGL context\r\n * @returns the error code\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError\r\n */\r\n public getError(): number {\r\n return this._gl.getError();\r\n }\r\n\r\n private _canRenderToFloatFramebuffer(): boolean {\r\n if (this._webGLVersion > 1) {\r\n return this._caps.colorBufferFloat;\r\n }\r\n return this._canRenderToFramebuffer(1);\r\n }\r\n\r\n private _canRenderToHalfFloatFramebuffer(): boolean {\r\n if (this._webGLVersion > 1) {\r\n return this._caps.colorBufferFloat;\r\n }\r\n return this._canRenderToFramebuffer(2);\r\n }\r\n\r\n // Thank you : http://stackoverflow.com/questions/28827511/webgl-ios-render-to-floating-point-texture\r\n private _canRenderToFramebuffer(type: number): boolean {\r\n let gl = this._gl;\r\n\r\n //clear existing errors\r\n while (gl.getError() !== gl.NO_ERROR) { }\r\n\r\n let successful = true;\r\n\r\n let texture = gl.createTexture();\r\n gl.bindTexture(gl.TEXTURE_2D, texture);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(type), 1, 1, 0, gl.RGBA, this._getWebGLTextureType(type), null);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\r\n\r\n let fb = gl.createFramebuffer();\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\r\n let status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\r\n\r\n successful = successful && (status === gl.FRAMEBUFFER_COMPLETE);\r\n successful = successful && (gl.getError() === gl.NO_ERROR);\r\n\r\n //try render by clearing frame buffer's color buffer\r\n if (successful) {\r\n gl.clear(gl.COLOR_BUFFER_BIT);\r\n successful = successful && (gl.getError() === gl.NO_ERROR);\r\n }\r\n\r\n //try reading from frame to ensure render occurs (just creating the FBO is not sufficient to determine if rendering is supported)\r\n if (successful) {\r\n //in practice it's sufficient to just read from the backbuffer rather than handle potentially issues reading from the texture\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n let readFormat = gl.RGBA;\r\n let readType = gl.UNSIGNED_BYTE;\r\n let buffer = new Uint8Array(4);\r\n gl.readPixels(0, 0, 1, 1, readFormat, readType, buffer);\r\n successful = successful && (gl.getError() === gl.NO_ERROR);\r\n }\r\n\r\n //clean up\r\n gl.deleteTexture(texture);\r\n gl.deleteFramebuffer(fb);\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n\r\n //clear accumulated errors\r\n while (!successful && (gl.getError() !== gl.NO_ERROR)) { }\r\n\r\n return successful;\r\n }\r\n\r\n /** @hidden */\r\n public _getWebGLTextureType(type: number): number {\r\n if (this._webGLVersion === 1) {\r\n switch (type) {\r\n case 1:\r\n return this._gl.FLOAT;\r\n case 2:\r\n return this._gl.HALF_FLOAT_OES;\r\n case 0:\r\n return this._gl.UNSIGNED_BYTE;\r\n case 8:\r\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\r\n case 9:\r\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\r\n case 10:\r\n return this._gl.UNSIGNED_SHORT_5_6_5;\r\n }\r\n return this._gl.UNSIGNED_BYTE;\r\n }\r\n\r\n switch (type) {\r\n case 3:\r\n return this._gl.BYTE;\r\n case 0:\r\n return this._gl.UNSIGNED_BYTE;\r\n case 4:\r\n return this._gl.SHORT;\r\n case 5:\r\n return this._gl.UNSIGNED_SHORT;\r\n case 6:\r\n return this._gl.INT;\r\n case 7: // Refers to UNSIGNED_INT\r\n return this._gl.UNSIGNED_INT;\r\n case 1:\r\n return this._gl.FLOAT;\r\n case 2:\r\n return this._gl.HALF_FLOAT;\r\n case 8:\r\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\r\n case 9:\r\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\r\n case 10:\r\n return this._gl.UNSIGNED_SHORT_5_6_5;\r\n case 11:\r\n return this._gl.UNSIGNED_INT_2_10_10_10_REV;\r\n case 12:\r\n return this._gl.UNSIGNED_INT_24_8;\r\n case 13:\r\n return this._gl.UNSIGNED_INT_10F_11F_11F_REV;\r\n case 14:\r\n return this._gl.UNSIGNED_INT_5_9_9_9_REV;\r\n case 15:\r\n return this._gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\r\n }\r\n\r\n return this._gl.UNSIGNED_BYTE;\r\n }\r\n\r\n /** @hidden */\r\n public _getInternalFormat(format: number): number {\r\n var internalFormat = this._gl.RGBA;\r\n\r\n switch (format) {\r\n case 0:\r\n internalFormat = this._gl.ALPHA;\r\n break;\r\n case 1:\r\n internalFormat = this._gl.LUMINANCE;\r\n break;\r\n case 2:\r\n internalFormat = this._gl.LUMINANCE_ALPHA;\r\n break;\r\n case 6:\r\n internalFormat = this._gl.RED;\r\n break;\r\n case 7:\r\n internalFormat = this._gl.RG;\r\n break;\r\n case 4:\r\n internalFormat = this._gl.RGB;\r\n break;\r\n case 5:\r\n internalFormat = this._gl.RGBA;\r\n break;\r\n }\r\n\r\n if (this._webGLVersion > 1) {\r\n switch (format) {\r\n case 8:\r\n internalFormat = this._gl.RED_INTEGER;\r\n break;\r\n case 9:\r\n internalFormat = this._gl.RG_INTEGER;\r\n break;\r\n case 10:\r\n internalFormat = this._gl.RGB_INTEGER;\r\n break;\r\n case 11:\r\n internalFormat = this._gl.RGBA_INTEGER;\r\n break;\r\n }\r\n }\r\n\r\n return internalFormat;\r\n }\r\n\r\n /** @hidden */\r\n public _getRGBABufferInternalSizedFormat(type: number, format?: number): number {\r\n if (this._webGLVersion === 1) {\r\n if (format !== undefined) {\r\n switch (format) {\r\n case 0:\r\n return this._gl.ALPHA;\r\n case 1:\r\n return this._gl.LUMINANCE;\r\n case 2:\r\n return this._gl.LUMINANCE_ALPHA;\r\n case 4:\r\n return this._gl.RGB;\r\n }\r\n }\r\n return this._gl.RGBA;\r\n }\r\n\r\n switch (type) {\r\n case 3:\r\n switch (format) {\r\n case 6:\r\n return this._gl.R8_SNORM;\r\n case 7:\r\n return this._gl.RG8_SNORM;\r\n case 4:\r\n return this._gl.RGB8_SNORM;\r\n case 8:\r\n return this._gl.R8I;\r\n case 9:\r\n return this._gl.RG8I;\r\n case 10:\r\n return this._gl.RGB8I;\r\n case 11:\r\n return this._gl.RGBA8I;\r\n default:\r\n return this._gl.RGBA8_SNORM;\r\n }\r\n case 0:\r\n switch (format) {\r\n case 6:\r\n return this._gl.R8;\r\n case 7:\r\n return this._gl.RG8;\r\n case 4:\r\n return this._gl.RGB8; // By default. Other possibilities are RGB565, SRGB8.\r\n case 5:\r\n return this._gl.RGBA8; // By default. Other possibilities are RGB5_A1, RGBA4, SRGB8_ALPHA8.\r\n case 8:\r\n return this._gl.R8UI;\r\n case 9:\r\n return this._gl.RG8UI;\r\n case 10:\r\n return this._gl.RGB8UI;\r\n case 11:\r\n return this._gl.RGBA8UI;\r\n case 0:\r\n return this._gl.ALPHA;\r\n case 1:\r\n return this._gl.LUMINANCE;\r\n case 2:\r\n return this._gl.LUMINANCE_ALPHA;\r\n default:\r\n return this._gl.RGBA8;\r\n }\r\n case 4:\r\n switch (format) {\r\n case 8:\r\n return this._gl.R16I;\r\n case 9:\r\n return this._gl.RG16I;\r\n case 10:\r\n return this._gl.RGB16I;\r\n case 11:\r\n return this._gl.RGBA16I;\r\n default:\r\n return this._gl.RGBA16I;\r\n }\r\n case 5:\r\n switch (format) {\r\n case 8:\r\n return this._gl.R16UI;\r\n case 9:\r\n return this._gl.RG16UI;\r\n case 10:\r\n return this._gl.RGB16UI;\r\n case 11:\r\n return this._gl.RGBA16UI;\r\n default:\r\n return this._gl.RGBA16UI;\r\n }\r\n case 6:\r\n switch (format) {\r\n case 8:\r\n return this._gl.R32I;\r\n case 9:\r\n return this._gl.RG32I;\r\n case 10:\r\n return this._gl.RGB32I;\r\n case 11:\r\n return this._gl.RGBA32I;\r\n default:\r\n return this._gl.RGBA32I;\r\n }\r\n case 7: // Refers to UNSIGNED_INT\r\n switch (format) {\r\n case 8:\r\n return this._gl.R32UI;\r\n case 9:\r\n return this._gl.RG32UI;\r\n case 10:\r\n return this._gl.RGB32UI;\r\n case 11:\r\n return this._gl.RGBA32UI;\r\n default:\r\n return this._gl.RGBA32UI;\r\n }\r\n case 1:\r\n switch (format) {\r\n case 6:\r\n return this._gl.R32F; // By default. Other possibility is R16F.\r\n case 7:\r\n return this._gl.RG32F; // By default. Other possibility is RG16F.\r\n case 4:\r\n return this._gl.RGB32F; // By default. Other possibilities are RGB16F, R11F_G11F_B10F, RGB9_E5.\r\n case 5:\r\n return this._gl.RGBA32F; // By default. Other possibility is RGBA16F.\r\n default:\r\n return this._gl.RGBA32F;\r\n }\r\n case 2:\r\n switch (format) {\r\n case 6:\r\n return this._gl.R16F;\r\n case 7:\r\n return this._gl.RG16F;\r\n case 4:\r\n return this._gl.RGB16F; // By default. Other possibilities are R11F_G11F_B10F, RGB9_E5.\r\n case 5:\r\n return this._gl.RGBA16F;\r\n default:\r\n return this._gl.RGBA16F;\r\n }\r\n case 10:\r\n return this._gl.RGB565;\r\n case 13:\r\n return this._gl.R11F_G11F_B10F;\r\n case 14:\r\n return this._gl.RGB9_E5;\r\n case 8:\r\n return this._gl.RGBA4;\r\n case 9:\r\n return this._gl.RGB5_A1;\r\n case 11:\r\n switch (format) {\r\n case 5:\r\n return this._gl.RGB10_A2; // By default. Other possibility is RGB5_A1.\r\n case 11:\r\n return this._gl.RGB10_A2UI;\r\n default:\r\n return this._gl.RGB10_A2;\r\n }\r\n }\r\n\r\n return this._gl.RGBA8;\r\n }\r\n\r\n /** @hidden */\r\n public _getRGBAMultiSampleBufferFormat(type: number): number {\r\n if (type === 1) {\r\n return this._gl.RGBA32F;\r\n }\r\n else if (type === 2) {\r\n return this._gl.RGBA16F;\r\n }\r\n\r\n return this._gl.RGBA8;\r\n }\r\n\r\n /** @hidden */\r\n public _loadFile(url: string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (data: any) => void,\r\n offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: IWebRequest, exception?: any) => void): IFileRequest {\r\n let request = ThinEngine._FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @hidden\r\n */\r\n public static _FileToolsLoadFile(url: string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (ev: ProgressEvent) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void): IFileRequest {\r\n throw _DevTools.WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * Reads pixels from the current frame buffer. Please note that this function can be slow\r\n * @param x defines the x coordinate of the rectangle where pixels must be read\r\n * @param y defines the y coordinate of the rectangle where pixels must be read\r\n * @param width defines the width of the rectangle where pixels must be read\r\n * @param height defines the height of the rectangle where pixels must be read\r\n * @param hasAlpha defines whether the output should have alpha or not (defaults to true)\r\n * @returns a Uint8Array containing RGBA colors\r\n */\r\n public readPixels(x: number, y: number, width: number, height: number, hasAlpha = true): Uint8Array {\r\n const numChannels = hasAlpha ? 4 : 3;\r\n const format = hasAlpha ? this._gl.RGBA : this._gl.RGB;\r\n const data = new Uint8Array(height * width * numChannels);\r\n this._gl.readPixels(x, y, width, height, format, this._gl.UNSIGNED_BYTE, data);\r\n return data;\r\n }\r\n\r\n // Statics\r\n\r\n private static _IsSupported: Nullable<boolean> = null;\r\n private static _HasMajorPerformanceCaveat : Nullable<boolean> = null;\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instanciated (ie. if a webGL context can be found)\r\n */\r\n public static get IsSupported(): boolean {\r\n return this.isSupported(); // Backward compat\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instanciated (ie. if a webGL context can be found)\r\n * @returns true if the engine can be created\r\n * @ignorenaming\r\n */\r\n public static isSupported(): boolean {\r\n if (this._HasMajorPerformanceCaveat !== null) {\r\n return !this._HasMajorPerformanceCaveat; // We know it is performant so WebGL is supported\r\n }\r\n\r\n if (this._IsSupported === null) {\r\n try {\r\n var tempcanvas = CanvasGenerator.CreateCanvas(1, 1);\r\n var gl = tempcanvas.getContext(\"webgl\") || (tempcanvas as any).getContext(\"experimental-webgl\");\r\n\r\n this._IsSupported = gl != null && !!window.WebGLRenderingContext;\r\n } catch (e) {\r\n this._IsSupported = false;\r\n }\r\n }\r\n\r\n return this._IsSupported;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instanciated on a performant device (ie. if a webGL context can be found and it does not use a slow implementation)\r\n */\r\n public static get HasMajorPerformanceCaveat(): boolean {\r\n if (this._HasMajorPerformanceCaveat === null) {\r\n try {\r\n var tempcanvas = CanvasGenerator.CreateCanvas(1, 1);\r\n var gl = tempcanvas.getContext(\"webgl\", { failIfMajorPerformanceCaveat: true }) || (tempcanvas as any).getContext(\"experimental-webgl\", { failIfMajorPerformanceCaveat: true });\r\n\r\n this._HasMajorPerformanceCaveat = !gl;\r\n } catch (e) {\r\n this._HasMajorPerformanceCaveat = false;\r\n }\r\n }\r\n\r\n return this._HasMajorPerformanceCaveat;\r\n }\r\n\r\n /**\r\n * Find the next highest power of two.\r\n * @param x Number to start search from.\r\n * @return Next highest power of two.\r\n */\r\n public static CeilingPOT(x: number): number {\r\n x--;\r\n x |= x >> 1;\r\n x |= x >> 2;\r\n x |= x >> 4;\r\n x |= x >> 8;\r\n x |= x >> 16;\r\n x++;\r\n return x;\r\n }\r\n\r\n /**\r\n * Find the next lowest power of two.\r\n * @param x Number to start search from.\r\n * @return Next lowest power of two.\r\n */\r\n public static FloorPOT(x: number): number {\r\n x = x | (x >> 1);\r\n x = x | (x >> 2);\r\n x = x | (x >> 4);\r\n x = x | (x >> 8);\r\n x = x | (x >> 16);\r\n return x - (x >> 1);\r\n }\r\n\r\n /**\r\n * Find the nearest power of two.\r\n * @param x Number to start search from.\r\n * @return Next nearest power of two.\r\n */\r\n public static NearestPOT(x: number): number {\r\n var c = ThinEngine.CeilingPOT(x);\r\n var f = ThinEngine.FloorPOT(x);\r\n return (c - x) > (x - f) ? f : c;\r\n }\r\n\r\n /**\r\n * Get the closest exponent of two\r\n * @param value defines the value to approximate\r\n * @param max defines the maximum value to return\r\n * @param mode defines how to define the closest value\r\n * @returns closest exponent of two of the given value\r\n */\r\n public static GetExponentOfTwo(value: number, max: number, mode = 2): number {\r\n let pot;\r\n\r\n switch (mode) {\r\n case 1:\r\n pot = ThinEngine.FloorPOT(value);\r\n break;\r\n case 2:\r\n pot = ThinEngine.NearestPOT(value);\r\n break;\r\n case 3:\r\n default:\r\n pot = ThinEngine.CeilingPOT(value);\r\n break;\r\n }\r\n\r\n return Math.min(pot, max);\r\n }\r\n\r\n /**\r\n * Queue a new function into the requested animation frame pool (ie. this function will be executed byt the browser for the next frame)\r\n * @param func - the function to be called\r\n * @param requester - the object that will request the next frame. Falls back to window.\r\n * @returns frame number\r\n */\r\n public static QueueNewFrame(func: () => void, requester?: any): number {\r\n if (!DomManagement.IsWindowObjectExist()) {\r\n if (typeof requestAnimationFrame !== \"undefined\") {\r\n return requestAnimationFrame(func);\r\n }\r\n\r\n return setTimeout(func, 16);\r\n }\r\n\r\n if (!requester) {\r\n requester = window;\r\n }\r\n\r\n if (requester.requestPostAnimationFrame) {\r\n return requester.requestPostAnimationFrame(func);\r\n }\r\n else if (requester.requestAnimationFrame) {\r\n return requester.requestAnimationFrame(func);\r\n }\r\n else if (requester.msRequestAnimationFrame) {\r\n return requester.msRequestAnimationFrame(func);\r\n }\r\n else if (requester.webkitRequestAnimationFrame) {\r\n return requester.webkitRequestAnimationFrame(func);\r\n }\r\n else if (requester.mozRequestAnimationFrame) {\r\n return requester.mozRequestAnimationFrame(func);\r\n }\r\n else if (requester.oRequestAnimationFrame) {\r\n return requester.oRequestAnimationFrame(func);\r\n }\r\n else {\r\n return window.setTimeout(func, 16);\r\n }\r\n }\r\n\r\n /**\r\n * Gets host document\r\n * @returns the host document object\r\n */\r\n public getHostDocument(): Nullable<Document> {\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument) {\r\n return this._renderingCanvas.ownerDocument;\r\n }\r\n\r\n return document;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"thinEngine.js","sourceRoot":"","sources":["../../../sourceES6/core/Engines/thinEngine.ts"],"names":[],"mappings":"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","sourcesContent":["import { EngineStore } from './engineStore';\r\nimport { IInternalTextureLoader } from '../Materials/Textures/internalTextureLoader';\r\nimport { Effect, IEffectCreationOptions } from '../Materials/effect';\r\nimport { _DevTools } from '../Misc/devTools';\r\nimport { IShaderProcessor } from './Processors/iShaderProcessor';\r\nimport { UniformBuffer } from '../Materials/uniformBuffer';\r\nimport { Nullable, DataArray, IndicesArray } from '../types';\r\nimport { EngineCapabilities } from './engineCapabilities';\r\nimport { Observable } from '../Misc/observable';\r\nimport { DepthCullingState } from '../States/depthCullingState';\r\nimport { StencilState } from '../States/stencilState';\r\nimport { AlphaState } from '../States/alphaCullingState';\r\n\r\nimport { InternalTexture, InternalTextureSource } from '../Materials/Textures/internalTexture';\r\nimport { IViewportLike, IColor4Like } from '../Maths/math.like';\r\nimport { DataBuffer } from '../Meshes/dataBuffer';\r\nimport { IFileRequest } from '../Misc/fileRequest';\r\nimport { Logger } from '../Misc/logger';\r\nimport { DomManagement } from '../Misc/domManagement';\r\nimport { WebGLShaderProcessor } from './WebGL/webGLShaderProcessors';\r\nimport { WebGL2ShaderProcessor } from './WebGL/webGL2ShaderProcessors';\r\nimport { WebGLDataBuffer } from '../Meshes/WebGL/webGLDataBuffer';\r\nimport { IPipelineContext } from './IPipelineContext';\r\nimport { WebGLPipelineContext } from './WebGL/webGLPipelineContext';\r\nimport { VertexBuffer } from '../Meshes/buffer';\r\nimport { InstancingAttributeInfo } from './instancingAttributeInfo';\r\nimport { ThinTexture } from '../Materials/Textures/thinTexture';\r\nimport { IOfflineProvider } from '../Offline/IOfflineProvider';\r\nimport { IEffectFallbacks } from '../Materials/iEffectFallbacks';\r\nimport { IWebRequest } from '../Misc/interfaces/iWebRequest';\r\nimport { CanvasGenerator } from '../Misc/canvasGenerator';\r\nimport { PerformanceConfigurator } from './performanceConfigurator';\r\n\r\ndeclare type WebRequest = import(\"../Misc/webRequest\").WebRequest;\r\ndeclare type LoadFileError = import(\"../Misc/fileTools\").LoadFileError;\r\ndeclare type Observer<T> = import(\"../Misc/observable\").Observer<T>;\r\ndeclare type VideoTexture = import(\"../Materials/Textures/videoTexture\").VideoTexture;\r\ndeclare type RenderTargetTexture = import(\"../Materials/Textures/renderTargetTexture\").RenderTargetTexture;\r\ndeclare type Texture = import(\"../Materials/Textures/texture\").Texture;\r\n\r\n/**\r\n * Defines the interface used by objects working like Scene\r\n * @hidden\r\n */\r\nexport interface ISceneLike {\r\n _addPendingData(data: any): void;\r\n _removePendingData(data: any): void;\r\n offlineProvider: IOfflineProvider;\r\n}\r\n\r\n/**\r\n * Keeps track of all the buffer info used in engine.\r\n */\r\nclass BufferPointer {\r\n public active: boolean;\r\n public index: number;\r\n public size: number;\r\n public type: number;\r\n public normalized: boolean;\r\n public stride: number;\r\n public offset: number;\r\n public buffer: WebGLBuffer;\r\n}\r\n\r\n/**\r\n * Information about the current host\r\n */\r\nexport interface HostInformation {\r\n /**\r\n * Defines if the current host is a mobile\r\n */\r\n isMobile: boolean;\r\n}\r\n\r\n/** Interface defining initialization parameters for Engine class */\r\nexport interface EngineOptions extends WebGLContextAttributes {\r\n /**\r\n * Defines if the engine should no exceed a specified device ratio\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio\r\n */\r\n limitDeviceRatio?: number;\r\n /**\r\n * Defines if webvr should be enabled automatically\r\n * @see https://doc.babylonjs.com/how_to/webvr_camera\r\n */\r\n autoEnableWebVR?: boolean;\r\n /**\r\n * Defines if webgl2 should be turned off even if supported\r\n * @see https://doc.babylonjs.com/features/webgl2\r\n */\r\n disableWebGL2Support?: boolean;\r\n /**\r\n * Defines if webaudio should be initialized as well\r\n * @see https://doc.babylonjs.com/how_to/playing_sounds_and_music\r\n */\r\n audioEngine?: boolean;\r\n /**\r\n * Defines if animations should run using a deterministic lock step\r\n * @see https://doc.babylonjs.com/babylon101/animations#deterministic-lockstep\r\n */\r\n deterministicLockstep?: boolean;\r\n /** Defines the maximum steps to use with deterministic lock step mode */\r\n lockstepMaxSteps?: number;\r\n /** Defines the seconds between each deterministic lock step */\r\n timeStep?: number;\r\n /**\r\n * Defines that engine should ignore context lost events\r\n * If this event happens when this parameter is true, you will have to reload the page to restore rendering\r\n */\r\n\r\n doNotHandleContextLost?: boolean;\r\n /**\r\n * Defines that engine should ignore modifying touch action attribute and style\r\n * If not handle, you might need to set it up on your side for expected touch devices behavior.\r\n */\r\n doNotHandleTouchAction?: boolean;\r\n /**\r\n * Defines that engine should compile shaders with high precision floats (if supported). True by default\r\n */\r\n useHighPrecisionFloats?: boolean;\r\n /**\r\n * Make the canvas XR Compatible for XR sessions\r\n */\r\n xrCompatible?: boolean;\r\n\r\n /**\r\n * Make the matrix computations to be performed in 64 bits instead of 32 bits. False by default\r\n */\r\n useHighPrecisionMatrix?: boolean;\r\n\r\n /**\r\n * Will prevent the system from falling back to software implementation if a hardware device cannot be created\r\n */\r\n failIfMajorPerformanceCaveat?: boolean;\r\n}\r\n\r\n/**\r\n * The base engine class (root of all engines)\r\n */\r\nexport class ThinEngine {\r\n /** Use this array to turn off some WebGL2 features on known buggy browsers version */\r\n public static ExceptionList = [\r\n { key: \"Chrome\\/63\\.0\", capture: \"63\\\\.0\\\\.3239\\\\.(\\\\d+)\", captureConstraint: 108, targets: [\"uniformBuffer\"] },\r\n { key: \"Firefox\\/58\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Firefox\\/59\", capture: null, captureConstraint: null, targets: [\"uniformBuffer\"] },\r\n { key: \"Chrome\\/72.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Chrome\\/73.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Chrome\\/74.+?Mobile\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome\\/71\", capture: null, captureConstraint: null, targets: [\"vao\"] },\r\n { key: \"Mac OS.+Chrome\\/72\", capture: null, captureConstraint: null, targets: [\"vao\"] }\r\n ];\r\n\r\n /** @hidden */\r\n public static _TextureLoaders: IInternalTextureLoader[] = [];\r\n\r\n /**\r\n * Returns the current npm package of the sdk\r\n */\r\n // Not mixed with Version for tooling purpose.\r\n public static get NpmPackage(): string {\r\n return \"babylonjs@4.2.2\";\r\n }\r\n\r\n /**\r\n * Returns the current version of the framework\r\n */\r\n public static get Version(): string {\r\n return \"4.2.2\";\r\n }\r\n\r\n /**\r\n * Returns a string describing the current engine\r\n */\r\n public get description(): string {\r\n let description = \"WebGL\" + this.webGLVersion;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n description += \" - Parallel shader compilation\";\r\n }\r\n\r\n return description;\r\n }\r\n\r\n // Updatable statics so stick with vars here\r\n\r\n /**\r\n * Gets or sets the epsilon value used by collision engine\r\n */\r\n public static CollisionsEpsilon = 0.001;\r\n\r\n /**\r\n * Gets or sets the relative url used to load shaders if using the engine in non-minified mode\r\n */\r\n public static get ShadersRepository(): string {\r\n return Effect.ShadersRepository;\r\n }\r\n public static set ShadersRepository(value: string) {\r\n Effect.ShadersRepository = value;\r\n }\r\n\r\n // Public members\r\n\r\n /** @hidden */\r\n public _shaderProcessor: IShaderProcessor;\r\n\r\n /**\r\n * Gets or sets a boolean that indicates if textures must be forced to power of 2 size even if not required\r\n */\r\n public forcePOTTextures = false;\r\n\r\n /**\r\n * Gets a boolean indicating if the engine is currently rendering in fullscreen mode\r\n */\r\n public isFullscreen = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if back faces must be culled (true by default)\r\n */\r\n public cullBackFaces = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if the engine must keep rendering even if the window is not in foregroun\r\n */\r\n public renderEvenInBackground = true;\r\n\r\n /**\r\n * Gets or sets a boolean indicating that cache can be kept between frames\r\n */\r\n public preventCacheWipeBetweenFrames = false;\r\n\r\n /** Gets or sets a boolean indicating if the engine should validate programs after compilation */\r\n public validateShaderPrograms = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if depth buffer should be reverse, going from far to near.\r\n * This can provide greater z depth for distant objects.\r\n */\r\n public useReverseDepthBuffer = false;\r\n // Uniform buffers list\r\n\r\n /**\r\n * Gets or sets a boolean indicating that uniform buffers must be disabled even if they are supported\r\n */\r\n public disableUniformBuffers = false;\r\n\r\n /** @hidden */\r\n public _uniformBuffers = new Array<UniformBuffer>();\r\n\r\n /**\r\n * Gets a boolean indicating that the engine supports uniform buffers\r\n * @see https://doc.babylonjs.com/features/webgl2#uniform-buffer-objets\r\n */\r\n public get supportsUniformBuffers(): boolean {\r\n return this.webGLVersion > 1 && !this.disableUniformBuffers;\r\n }\r\n\r\n // Private Members\r\n\r\n /** @hidden */\r\n public _gl: WebGLRenderingContext;\r\n /** @hidden */\r\n public _webGLVersion = 1.0;\r\n protected _renderingCanvas: Nullable<HTMLCanvasElement>;\r\n protected _windowIsBackground = false;\r\n protected _creationOptions: EngineOptions;\r\n\r\n protected _highPrecisionShadersAllowed = true;\r\n /** @hidden */\r\n public get _shouldUseHighPrecisionShader(): boolean {\r\n return !!(this._caps.highPrecisionShaderSupported && this._highPrecisionShadersAllowed);\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that only power of 2 textures are supported\r\n * Please note that you can still use non power of 2 textures but in this case the engine will forcefully convert them\r\n */\r\n public get needPOTTextures(): boolean {\r\n return this._webGLVersion < 2 || this.forcePOTTextures;\r\n }\r\n\r\n /** @hidden */\r\n public _badOS = false;\r\n\r\n /** @hidden */\r\n public _badDesktopOS = false;\r\n\r\n private _hardwareScalingLevel: number;\r\n /** @hidden */\r\n public _caps: EngineCapabilities;\r\n private _isStencilEnable: boolean;\r\n\r\n private _glVersion: string;\r\n private _glRenderer: string;\r\n private _glVendor: string;\r\n\r\n /** @hidden */\r\n public _videoTextureSupported: boolean;\r\n\r\n protected _renderingQueueLaunched = false;\r\n protected _activeRenderLoops = new Array<() => void>();\r\n\r\n // Lost context\r\n /**\r\n * Observable signaled when a context lost event is raised\r\n */\r\n public onContextLostObservable = new Observable<ThinEngine>();\r\n /**\r\n * Observable signaled when a context restored event is raised\r\n */\r\n public onContextRestoredObservable = new Observable<ThinEngine>();\r\n private _onContextLost: (evt: Event) => void;\r\n private _onContextRestored: (evt: Event) => void;\r\n protected _contextWasLost = false;\r\n\r\n /** @hidden */\r\n public _doNotHandleContextLost = false;\r\n\r\n /**\r\n * Gets or sets a boolean indicating if resources should be retained to be able to handle context lost events\r\n * @see https://doc.babylonjs.com/how_to/optimizing_your_scene#handling-webgl-context-lost\r\n */\r\n public get doNotHandleContextLost(): boolean {\r\n return this._doNotHandleContextLost;\r\n }\r\n\r\n public set doNotHandleContextLost(value: boolean) {\r\n this._doNotHandleContextLost = value;\r\n }\r\n\r\n /**\r\n * Gets or sets a boolean indicating that vertex array object must be disabled even if they are supported\r\n */\r\n public disableVertexArrayObjects = false;\r\n\r\n // States\r\n /** @hidden */\r\n protected _colorWrite = true;\r\n /** @hidden */\r\n protected _colorWriteChanged = true;\r\n /** @hidden */\r\n protected _depthCullingState = new DepthCullingState();\r\n /** @hidden */\r\n protected _stencilState = new StencilState();\r\n /** @hidden */\r\n public _alphaState = new AlphaState();\r\n /** @hidden */\r\n public _alphaMode = 1;\r\n /** @hidden */\r\n public _alphaEquation = 0;\r\n\r\n // Cache\r\n /** @hidden */\r\n public _internalTexturesCache = new Array<InternalTexture>();\r\n /** @hidden */\r\n protected _activeChannel = 0;\r\n private _currentTextureChannel = -1;\r\n /** @hidden */\r\n protected _boundTexturesCache: { [key: string]: Nullable<InternalTexture> } = {};\r\n /** @hidden */\r\n protected _currentEffect: Nullable<Effect>;\r\n /** @hidden */\r\n protected _currentProgram: Nullable<WebGLProgram>;\r\n private _compiledEffects: { [key: string]: Effect } = {};\r\n private _vertexAttribArraysEnabled: boolean[] = [];\r\n /** @hidden */\r\n protected _cachedViewport: Nullable<IViewportLike>;\r\n private _cachedVertexArrayObject: Nullable<WebGLVertexArrayObject>;\r\n /** @hidden */\r\n protected _cachedVertexBuffers: any;\r\n /** @hidden */\r\n protected _cachedIndexBuffer: Nullable<DataBuffer>;\r\n /** @hidden */\r\n protected _cachedEffectForVertexBuffers: Nullable<Effect>;\r\n /** @hidden */\r\n public _currentRenderTarget: Nullable<InternalTexture>;\r\n private _uintIndicesCurrentlySet = false;\r\n protected _currentBoundBuffer = new Array<Nullable<WebGLBuffer>>();\r\n /** @hidden */\r\n public _currentFramebuffer: Nullable<WebGLFramebuffer> = null;\r\n /** @hidden */\r\n public _dummyFramebuffer: Nullable<WebGLFramebuffer> = null;\r\n private _currentBufferPointers = new Array<BufferPointer>();\r\n private _currentInstanceLocations = new Array<number>();\r\n private _currentInstanceBuffers = new Array<DataBuffer>();\r\n private _textureUnits: Int32Array;\r\n\r\n /** @hidden */\r\n public _workingCanvas: Nullable<HTMLCanvasElement | OffscreenCanvas>;\r\n /** @hidden */\r\n public _workingContext: Nullable<CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D>;\r\n\r\n /** @hidden */\r\n public _boundRenderFunction: any;\r\n\r\n private _vaoRecordInProgress = false;\r\n private _mustWipeVertexAttributes = false;\r\n\r\n private _emptyTexture: Nullable<InternalTexture>;\r\n private _emptyCubeTexture: Nullable<InternalTexture>;\r\n private _emptyTexture3D: Nullable<InternalTexture>;\r\n private _emptyTexture2DArray: Nullable<InternalTexture>;\r\n\r\n /** @hidden */\r\n public _frameHandler: number;\r\n\r\n private _nextFreeTextureSlots = new Array<number>();\r\n private _maxSimultaneousTextures = 0;\r\n\r\n private _activeRequests = new Array<IFileRequest>();\r\n\r\n /** @hidden */\r\n public _transformTextureUrl: Nullable<(url: string) => string> = null;\r\n\r\n /**\r\n * Gets information about the current host\r\n */\r\n public hostInformation: HostInformation = {\r\n isMobile: false\r\n };\r\n\r\n protected get _supportsHardwareTextureRescaling() {\r\n return false;\r\n }\r\n\r\n private _framebufferDimensionsObject: Nullable<{framebufferWidth: number, framebufferHeight: number}>;\r\n\r\n /**\r\n * sets the object from which width and height will be taken from when getting render width and height\r\n * Will fallback to the gl object\r\n * @param dimensions the framebuffer width and height that will be used.\r\n */\r\n public set framebufferDimensionsObject(dimensions: Nullable<{framebufferWidth: number, framebufferHeight: number}>) {\r\n this._framebufferDimensionsObject = dimensions;\r\n }\r\n\r\n /**\r\n * Gets the current viewport\r\n */\r\n public get currentViewport(): Nullable<IViewportLike> {\r\n return this._cachedViewport;\r\n }\r\n\r\n /**\r\n * Gets the default empty texture\r\n */\r\n public get emptyTexture(): InternalTexture {\r\n if (!this._emptyTexture) {\r\n this._emptyTexture = this.createRawTexture(new Uint8Array(4), 1, 1, 5, false, false, 1);\r\n }\r\n\r\n return this._emptyTexture;\r\n }\r\n\r\n /**\r\n * Gets the default empty 3D texture\r\n */\r\n public get emptyTexture3D(): InternalTexture {\r\n if (!this._emptyTexture3D) {\r\n this._emptyTexture3D = this.createRawTexture3D(new Uint8Array(4), 1, 1, 1, 5, false, false, 1);\r\n }\r\n\r\n return this._emptyTexture3D;\r\n }\r\n\r\n /**\r\n * Gets the default empty 2D array texture\r\n */\r\n public get emptyTexture2DArray(): InternalTexture {\r\n if (!this._emptyTexture2DArray) {\r\n this._emptyTexture2DArray = this.createRawTexture2DArray(new Uint8Array(4), 1, 1, 1, 5, false, false, 1);\r\n }\r\n\r\n return this._emptyTexture2DArray;\r\n }\r\n\r\n /**\r\n * Gets the default empty cube texture\r\n */\r\n public get emptyCubeTexture(): InternalTexture {\r\n if (!this._emptyCubeTexture) {\r\n var faceData = new Uint8Array(4);\r\n var cubeData = [faceData, faceData, faceData, faceData, faceData, faceData];\r\n this._emptyCubeTexture = this.createRawCubeTexture(cubeData, 1, 5, 0, false, false, 1);\r\n }\r\n\r\n return this._emptyCubeTexture;\r\n }\r\n\r\n /**\r\n * Defines whether the engine has been created with the premultipliedAlpha option on or not.\r\n */\r\n public readonly premultipliedAlpha: boolean = true;\r\n\r\n /**\r\n * Observable event triggered before each texture is initialized\r\n */\r\n public onBeforeTextureInitObservable = new Observable<Texture>();\r\n\r\n /**\r\n * Creates a new engine\r\n * @param canvasOrContext defines the canvas or WebGL context to use for rendering. If you provide a WebGL context, Babylon.js will not hook events on the canvas (like pointers, keyboards, etc...) so no event observables will be available. This is mostly used when Babylon.js is used as a plugin on a system which alreay used the WebGL context\r\n * @param antialias defines enable antialiasing (default: false)\r\n * @param options defines further options to be sent to the getContext() function\r\n * @param adaptToDeviceRatio defines whether to adapt to the device's viewport characteristics (default: false)\r\n */\r\n constructor(canvasOrContext: Nullable<HTMLCanvasElement | OffscreenCanvas | WebGLRenderingContext | WebGL2RenderingContext>, antialias?: boolean, options?: EngineOptions, adaptToDeviceRatio: boolean = false) {\r\n\r\n let canvas: Nullable<HTMLCanvasElement> = null;\r\n\r\n if (!canvasOrContext) {\r\n return;\r\n }\r\n\r\n options = options || {};\r\n\r\n PerformanceConfigurator.SetMatrixPrecision(!!options.useHighPrecisionMatrix);\r\n\r\n if ((canvasOrContext as any).getContext) {\r\n canvas = <HTMLCanvasElement>canvasOrContext;\r\n this._renderingCanvas = canvas;\r\n\r\n if (antialias != null) {\r\n options.antialias = antialias;\r\n }\r\n\r\n if (options.deterministicLockstep === undefined) {\r\n options.deterministicLockstep = false;\r\n }\r\n\r\n if (options.lockstepMaxSteps === undefined) {\r\n options.lockstepMaxSteps = 4;\r\n }\r\n\r\n if (options.timeStep === undefined) {\r\n options.timeStep = 1 / 60;\r\n }\r\n\r\n if (options.preserveDrawingBuffer === undefined) {\r\n options.preserveDrawingBuffer = false;\r\n }\r\n\r\n if (options.audioEngine === undefined) {\r\n options.audioEngine = true;\r\n }\r\n\r\n if (options.stencil === undefined) {\r\n options.stencil = true;\r\n }\r\n\r\n if (options.premultipliedAlpha === false) {\r\n this.premultipliedAlpha = false;\r\n }\r\n\r\n if (options.xrCompatible === undefined) {\r\n options.xrCompatible = true;\r\n }\r\n\r\n this._doNotHandleContextLost = options.doNotHandleContextLost ? true : false;\r\n\r\n // Exceptions\r\n if (navigator && navigator.userAgent) {\r\n let ua = navigator.userAgent;\r\n\r\n this.hostInformation.isMobile = ua.indexOf(\"Mobile\") !== -1;\r\n\r\n for (var exception of ThinEngine.ExceptionList) {\r\n let key = exception.key;\r\n let targets = exception.targets;\r\n let check = new RegExp(key);\r\n\r\n if (check.test(ua)) {\r\n if (exception.capture && exception.captureConstraint) {\r\n let capture = exception.capture;\r\n let constraint = exception.captureConstraint;\r\n\r\n let regex = new RegExp(capture);\r\n let matches = regex.exec(ua);\r\n\r\n if (matches && matches.length > 0) {\r\n let capturedValue = parseInt(matches[matches.length - 1]);\r\n if (capturedValue >= constraint) {\r\n continue;\r\n }\r\n }\r\n }\r\n\r\n for (var target of targets) {\r\n switch (target) {\r\n case \"uniformBuffer\":\r\n this.disableUniformBuffers = true;\r\n break;\r\n case \"vao\":\r\n this.disableVertexArrayObjects = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Context lost\r\n if (!this._doNotHandleContextLost) {\r\n this._onContextLost = (evt: Event) => {\r\n evt.preventDefault();\r\n this._contextWasLost = true;\r\n Logger.Warn(\"WebGL context lost.\");\r\n\r\n this.onContextLostObservable.notifyObservers(this);\r\n };\r\n\r\n this._onContextRestored = () => {\r\n // Adding a timeout to avoid race condition at browser level\r\n setTimeout(() => {\r\n // Rebuild gl context\r\n this._initGLContext();\r\n // Rebuild effects\r\n this._rebuildEffects();\r\n // Rebuild textures\r\n this._rebuildInternalTextures();\r\n // Rebuild buffers\r\n this._rebuildBuffers();\r\n // Cache\r\n this.wipeCaches(true);\r\n Logger.Warn(\"WebGL context successfully restored.\");\r\n this.onContextRestoredObservable.notifyObservers(this);\r\n this._contextWasLost = false;\r\n }, 0);\r\n };\r\n\r\n canvas.addEventListener(\"webglcontextlost\", this._onContextLost, false);\r\n canvas.addEventListener(\"webglcontextrestored\", this._onContextRestored, false);\r\n\r\n options.powerPreference = \"high-performance\";\r\n }\r\n\r\n // GL\r\n if (!options.disableWebGL2Support) {\r\n try {\r\n this._gl = <any>(canvas.getContext(\"webgl2\", options) || canvas.getContext(\"experimental-webgl2\", options));\r\n if (this._gl) {\r\n this._webGLVersion = 2.0;\r\n\r\n // Prevent weird browsers to lie (yeah that happens!)\r\n if (!this._gl.deleteQuery) {\r\n this._webGLVersion = 1.0;\r\n }\r\n }\r\n } catch (e) {\r\n // Do nothing\r\n }\r\n }\r\n\r\n if (!this._gl) {\r\n if (!canvas) {\r\n throw new Error(\"The provided canvas is null or undefined.\");\r\n }\r\n try {\r\n this._gl = <WebGLRenderingContext>(canvas.getContext(\"webgl\", options) || canvas.getContext(\"experimental-webgl\", options));\r\n } catch (e) {\r\n throw new Error(\"WebGL not supported\");\r\n }\r\n }\r\n\r\n if (!this._gl) {\r\n throw new Error(\"WebGL not supported\");\r\n }\r\n } else {\r\n this._gl = <WebGLRenderingContext>canvasOrContext;\r\n this._renderingCanvas = this._gl.canvas as HTMLCanvasElement;\r\n\r\n if (this._gl.renderbufferStorageMultisample) {\r\n this._webGLVersion = 2.0;\r\n }\r\n\r\n const attributes = this._gl.getContextAttributes();\r\n if (attributes) {\r\n options.stencil = attributes.stencil;\r\n }\r\n }\r\n\r\n // Ensures a consistent color space unpacking of textures cross browser.\r\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE);\r\n\r\n if (options.useHighPrecisionFloats !== undefined) {\r\n this._highPrecisionShadersAllowed = options.useHighPrecisionFloats;\r\n }\r\n\r\n // Viewport\r\n const devicePixelRatio = DomManagement.IsWindowObjectExist() ? (window.devicePixelRatio || 1.0) : 1.0;\r\n\r\n var limitDeviceRatio = options.limitDeviceRatio || devicePixelRatio;\r\n this._hardwareScalingLevel = adaptToDeviceRatio ? 1.0 / Math.min(limitDeviceRatio, devicePixelRatio) : 1.0;\r\n this.resize();\r\n\r\n this._isStencilEnable = options.stencil ? true : false;\r\n this._initGLContext();\r\n\r\n // Prepare buffer pointers\r\n for (var i = 0; i < this._caps.maxVertexAttribs; i++) {\r\n this._currentBufferPointers[i] = new BufferPointer();\r\n }\r\n\r\n // Shader processor\r\n if (this.webGLVersion > 1) {\r\n this._shaderProcessor = new WebGL2ShaderProcessor();\r\n } else {\r\n this._shaderProcessor = new WebGLShaderProcessor();\r\n }\r\n\r\n // Detect if we are running on a faulty buggy OS.\r\n this._badOS = /iPad/i.test(navigator.userAgent) || /iPhone/i.test(navigator.userAgent);\r\n\r\n // Starting with iOS 14, we can trust the browser\r\n // let matches = navigator.userAgent.match(/Version\\/(\\d+)/);\r\n\r\n // if (matches && matches.length === 2) {\r\n // if (parseInt(matches[1]) >= 14) {\r\n // this._badOS = false;\r\n // }\r\n // }\r\n\r\n // Detect if we are running on a faulty buggy desktop OS.\r\n this._badDesktopOS = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\n this._creationOptions = options;\r\n console.log(`Babylon.js v${ThinEngine.Version} - ${this.description}`);\r\n }\r\n\r\n private _rebuildInternalTextures(): void {\r\n let currentState = this._internalTexturesCache.slice(); // Do a copy because the rebuild will add proxies\r\n\r\n for (var internalTexture of currentState) {\r\n internalTexture._rebuild();\r\n }\r\n }\r\n\r\n private _rebuildEffects(): void {\r\n for (var key in this._compiledEffects) {\r\n let effect = <Effect>this._compiledEffects[key];\r\n\r\n effect._prepareEffect();\r\n }\r\n\r\n Effect.ResetCache();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if all created effects are ready\r\n * @returns true if all effects are ready\r\n */\r\n public areAllEffectsReady(): boolean {\r\n for (var key in this._compiledEffects) {\r\n let effect = <Effect>this._compiledEffects[key];\r\n\r\n if (!effect.isReady()) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n protected _rebuildBuffers(): void {\r\n // Uniforms\r\n for (var uniformBuffer of this._uniformBuffers) {\r\n uniformBuffer._rebuild();\r\n }\r\n }\r\n\r\n protected _initGLContext(): void {\r\n // Caps\r\n this._caps = {\r\n maxTexturesImageUnits: this._gl.getParameter(this._gl.MAX_TEXTURE_IMAGE_UNITS),\r\n maxCombinedTexturesImageUnits: this._gl.getParameter(this._gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),\r\n maxVertexTextureImageUnits: this._gl.getParameter(this._gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS),\r\n maxTextureSize: this._gl.getParameter(this._gl.MAX_TEXTURE_SIZE),\r\n maxSamples: this._webGLVersion > 1 ? this._gl.getParameter(this._gl.MAX_SAMPLES) : 1,\r\n maxCubemapTextureSize: this._gl.getParameter(this._gl.MAX_CUBE_MAP_TEXTURE_SIZE),\r\n maxRenderTextureSize: this._gl.getParameter(this._gl.MAX_RENDERBUFFER_SIZE),\r\n maxVertexAttribs: this._gl.getParameter(this._gl.MAX_VERTEX_ATTRIBS),\r\n maxVaryingVectors: this._gl.getParameter(this._gl.MAX_VARYING_VECTORS),\r\n maxFragmentUniformVectors: this._gl.getParameter(this._gl.MAX_FRAGMENT_UNIFORM_VECTORS),\r\n maxVertexUniformVectors: this._gl.getParameter(this._gl.MAX_VERTEX_UNIFORM_VECTORS),\r\n parallelShaderCompile: this._gl.getExtension('KHR_parallel_shader_compile'),\r\n standardDerivatives: this._webGLVersion > 1 || (this._gl.getExtension('OES_standard_derivatives') !== null),\r\n maxAnisotropy: 1,\r\n astc: this._gl.getExtension('WEBGL_compressed_texture_astc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_astc'),\r\n bptc: this._gl.getExtension('EXT_texture_compression_bptc') || this._gl.getExtension('WEBKIT_EXT_texture_compression_bptc'),\r\n s3tc: this._gl.getExtension('WEBGL_compressed_texture_s3tc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc'),\r\n pvrtc: this._gl.getExtension('WEBGL_compressed_texture_pvrtc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc'),\r\n etc1: this._gl.getExtension('WEBGL_compressed_texture_etc1') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc1'),\r\n etc2: this._gl.getExtension('WEBGL_compressed_texture_etc') || this._gl.getExtension('WEBKIT_WEBGL_compressed_texture_etc') ||\r\n this._gl.getExtension('WEBGL_compressed_texture_es3_0'), // also a requirement of OpenGL ES 3\r\n textureAnisotropicFilterExtension: this._gl.getExtension('EXT_texture_filter_anisotropic') || this._gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic') || this._gl.getExtension('MOZ_EXT_texture_filter_anisotropic'),\r\n uintIndices: this._webGLVersion > 1 || this._gl.getExtension('OES_element_index_uint') !== null,\r\n fragmentDepthSupported: this._webGLVersion > 1 || this._gl.getExtension('EXT_frag_depth') !== null,\r\n highPrecisionShaderSupported: false,\r\n timerQuery: this._gl.getExtension('EXT_disjoint_timer_query_webgl2') || this._gl.getExtension(\"EXT_disjoint_timer_query\"),\r\n canUseTimestampForTimerQuery: false,\r\n drawBuffersExtension: false,\r\n maxMSAASamples: 1,\r\n colorBufferFloat: this._webGLVersion > 1 && this._gl.getExtension('EXT_color_buffer_float'),\r\n textureFloat: (this._webGLVersion > 1 || this._gl.getExtension('OES_texture_float')) ? true : false,\r\n textureHalfFloat: (this._webGLVersion > 1 || this._gl.getExtension('OES_texture_half_float')) ? true : false,\r\n textureHalfFloatRender: false,\r\n textureFloatLinearFiltering: false,\r\n textureFloatRender: false,\r\n textureHalfFloatLinearFiltering: false,\r\n vertexArrayObject: false,\r\n instancedArrays: false,\r\n textureLOD: (this._webGLVersion > 1 || this._gl.getExtension('EXT_shader_texture_lod')) ? true : false,\r\n blendMinMax: false,\r\n multiview: this._gl.getExtension('OVR_multiview2'),\r\n oculusMultiview: this._gl.getExtension('OCULUS_multiview'),\r\n depthTextureExtension: false\r\n };\r\n\r\n // Infos\r\n this._glVersion = this._gl.getParameter(this._gl.VERSION);\r\n\r\n var rendererInfo: any = this._gl.getExtension(\"WEBGL_debug_renderer_info\");\r\n if (rendererInfo != null) {\r\n this._glRenderer = this._gl.getParameter(rendererInfo.UNMASKED_RENDERER_WEBGL);\r\n this._glVendor = this._gl.getParameter(rendererInfo.UNMASKED_VENDOR_WEBGL);\r\n }\r\n\r\n if (!this._glVendor) {\r\n this._glVendor = \"Unknown vendor\";\r\n }\r\n\r\n if (!this._glRenderer) {\r\n this._glRenderer = \"Unknown renderer\";\r\n }\r\n\r\n // Constants\r\n if (this._gl.HALF_FLOAT_OES !== 0x8D61) {\r\n this._gl.HALF_FLOAT_OES = 0x8D61; // Half floating-point type (16-bit).\r\n }\r\n if (this._gl.RGBA16F !== 0x881A) {\r\n this._gl.RGBA16F = 0x881A; // RGBA 16-bit floating-point color-renderable internal sized format.\r\n }\r\n if (this._gl.RGBA32F !== 0x8814) {\r\n this._gl.RGBA32F = 0x8814; // RGBA 32-bit floating-point color-renderable internal sized format.\r\n }\r\n if (this._gl.DEPTH24_STENCIL8 !== 35056) {\r\n this._gl.DEPTH24_STENCIL8 = 35056;\r\n }\r\n\r\n // Extensions\r\n if (this._caps.timerQuery) {\r\n if (this._webGLVersion === 1) {\r\n this._gl.getQuery = (<any>this._caps.timerQuery).getQueryEXT.bind(this._caps.timerQuery);\r\n }\r\n this._caps.canUseTimestampForTimerQuery = this._gl.getQuery(this._caps.timerQuery.TIMESTAMP_EXT, this._caps.timerQuery.QUERY_COUNTER_BITS_EXT) > 0;\r\n }\r\n\r\n this._caps.maxAnisotropy = this._caps.textureAnisotropicFilterExtension ? this._gl.getParameter(this._caps.textureAnisotropicFilterExtension.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0;\r\n this._caps.textureFloatLinearFiltering = this._caps.textureFloat && this._gl.getExtension('OES_texture_float_linear') ? true : false;\r\n this._caps.textureFloatRender = this._caps.textureFloat && this._canRenderToFloatFramebuffer() ? true : false;\r\n this._caps.textureHalfFloatLinearFiltering = (this._webGLVersion > 1 || (this._caps.textureHalfFloat && this._gl.getExtension('OES_texture_half_float_linear'))) ? true : false;\r\n\r\n // Checks if some of the format renders first to allow the use of webgl inspector.\r\n if (this._webGLVersion > 1) {\r\n if (this._gl.HALF_FLOAT_OES !== 0x140B) {\r\n this._gl.HALF_FLOAT_OES = 0x140B;\r\n }\r\n }\r\n this._caps.textureHalfFloatRender = this._caps.textureHalfFloat && this._canRenderToHalfFloatFramebuffer();\r\n // Draw buffers\r\n if (this._webGLVersion > 1) {\r\n this._caps.drawBuffersExtension = true;\r\n this._caps.maxMSAASamples = this._gl.getParameter(this._gl.MAX_SAMPLES);\r\n } else {\r\n var drawBuffersExtension = this._gl.getExtension('WEBGL_draw_buffers');\r\n\r\n if (drawBuffersExtension !== null) {\r\n this._caps.drawBuffersExtension = true;\r\n this._gl.drawBuffers = drawBuffersExtension.drawBuffersWEBGL.bind(drawBuffersExtension);\r\n this._gl.DRAW_FRAMEBUFFER = this._gl.FRAMEBUFFER;\r\n\r\n for (var i = 0; i < 16; i++) {\r\n (<any>this._gl)[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"] = (<any>drawBuffersExtension)[\"COLOR_ATTACHMENT\" + i + \"_WEBGL\"];\r\n }\r\n }\r\n }\r\n\r\n // Depth Texture\r\n if (this._webGLVersion > 1) {\r\n this._caps.depthTextureExtension = true;\r\n } else {\r\n var depthTextureExtension = this._gl.getExtension('WEBGL_depth_texture');\r\n\r\n if (depthTextureExtension != null) {\r\n this._caps.depthTextureExtension = true;\r\n this._gl.UNSIGNED_INT_24_8 = depthTextureExtension.UNSIGNED_INT_24_8_WEBGL;\r\n }\r\n }\r\n\r\n // Vertex array object\r\n if (this.disableVertexArrayObjects) {\r\n this._caps.vertexArrayObject = false;\r\n } else if (this._webGLVersion > 1) {\r\n this._caps.vertexArrayObject = true;\r\n } else {\r\n var vertexArrayObjectExtension = this._gl.getExtension('OES_vertex_array_object');\r\n\r\n if (vertexArrayObjectExtension != null) {\r\n this._caps.vertexArrayObject = true;\r\n this._gl.createVertexArray = vertexArrayObjectExtension.createVertexArrayOES.bind(vertexArrayObjectExtension);\r\n this._gl.bindVertexArray = vertexArrayObjectExtension.bindVertexArrayOES.bind(vertexArrayObjectExtension);\r\n this._gl.deleteVertexArray = vertexArrayObjectExtension.deleteVertexArrayOES.bind(vertexArrayObjectExtension);\r\n }\r\n }\r\n\r\n // Instances count\r\n if (this._webGLVersion > 1) {\r\n this._caps.instancedArrays = true;\r\n } else {\r\n var instanceExtension = <ANGLE_instanced_arrays>this._gl.getExtension('ANGLE_instanced_arrays');\r\n\r\n if (instanceExtension != null) {\r\n this._caps.instancedArrays = true;\r\n this._gl.drawArraysInstanced = instanceExtension.drawArraysInstancedANGLE.bind(instanceExtension);\r\n this._gl.drawElementsInstanced = instanceExtension.drawElementsInstancedANGLE.bind(instanceExtension);\r\n this._gl.vertexAttribDivisor = instanceExtension.vertexAttribDivisorANGLE.bind(instanceExtension);\r\n } else {\r\n this._caps.instancedArrays = false;\r\n }\r\n }\r\n\r\n if (this._gl.getShaderPrecisionFormat) {\r\n var vertex_highp = this._gl.getShaderPrecisionFormat(this._gl.VERTEX_SHADER, this._gl.HIGH_FLOAT);\r\n var fragment_highp = this._gl.getShaderPrecisionFormat(this._gl.FRAGMENT_SHADER, this._gl.HIGH_FLOAT);\r\n\r\n if (vertex_highp && fragment_highp) {\r\n this._caps.highPrecisionShaderSupported = vertex_highp.precision !== 0 && fragment_highp.precision !== 0;\r\n }\r\n }\r\n\r\n if (this._webGLVersion > 1) {\r\n this._caps.blendMinMax = true;\r\n }\r\n else {\r\n const blendMinMaxExtension = this._gl.getExtension('EXT_blend_minmax');\r\n if (blendMinMaxExtension != null) {\r\n this._caps.blendMinMax = true;\r\n this._gl.MAX = blendMinMaxExtension.MAX_EXT;\r\n this._gl.MIN = blendMinMaxExtension.MIN_EXT;\r\n }\r\n }\r\n\r\n // Depth buffer\r\n this._depthCullingState.depthTest = true;\r\n this._depthCullingState.depthFunc = this._gl.LEQUAL;\r\n this._depthCullingState.depthMask = true;\r\n\r\n // Texture maps\r\n this._maxSimultaneousTextures = this._caps.maxCombinedTexturesImageUnits;\r\n for (let slot = 0; slot < this._maxSimultaneousTextures; slot++) {\r\n this._nextFreeTextureSlots.push(slot);\r\n }\r\n }\r\n\r\n /**\r\n * Gets version of the current webGL context\r\n */\r\n public get webGLVersion(): number {\r\n return this._webGLVersion;\r\n }\r\n\r\n /**\r\n * Gets a string identifying the name of the class\r\n * @returns \"Engine\" string\r\n */\r\n public getClassName(): string {\r\n return \"ThinEngine\";\r\n }\r\n\r\n /**\r\n * Returns true if the stencil buffer has been enabled through the creation option of the context.\r\n */\r\n public get isStencilEnable(): boolean {\r\n return this._isStencilEnable;\r\n }\r\n\r\n /** @hidden */\r\n public _prepareWorkingCanvas(): void {\r\n if (this._workingCanvas) {\r\n return;\r\n }\r\n\r\n this._workingCanvas = CanvasGenerator.CreateCanvas(1, 1);\r\n let context = this._workingCanvas.getContext(\"2d\");\r\n\r\n if (context) {\r\n this._workingContext = context;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the texture cache to empty state\r\n */\r\n public resetTextureCache() {\r\n for (var key in this._boundTexturesCache) {\r\n if (!this._boundTexturesCache.hasOwnProperty(key)) {\r\n continue;\r\n }\r\n this._boundTexturesCache[key] = null;\r\n }\r\n\r\n this._currentTextureChannel = -1;\r\n }\r\n\r\n /**\r\n * Gets an object containing information about the current webGL context\r\n * @returns an object containing the vender, the renderer and the version of the current webGL context\r\n */\r\n public getGlInfo() {\r\n return {\r\n vendor: this._glVendor,\r\n renderer: this._glRenderer,\r\n version: this._glVersion\r\n };\r\n }\r\n\r\n /**\r\n * Defines the hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @param level defines the level to use\r\n */\r\n public setHardwareScalingLevel(level: number): void {\r\n this._hardwareScalingLevel = level;\r\n this.resize();\r\n }\r\n\r\n /**\r\n * Gets the current hardware scaling level.\r\n * By default the hardware scaling level is computed from the window device ratio.\r\n * if level = 1 then the engine will render at the exact resolution of the canvas. If level = 0.5 then the engine will render at twice the size of the canvas.\r\n * @returns a number indicating the current hardware scaling level\r\n */\r\n public getHardwareScalingLevel(): number {\r\n return this._hardwareScalingLevel;\r\n }\r\n\r\n /**\r\n * Gets the list of loaded textures\r\n * @returns an array containing all loaded textures\r\n */\r\n public getLoadedTexturesCache(): InternalTexture[] {\r\n return this._internalTexturesCache;\r\n }\r\n\r\n /**\r\n * Gets the object containing all engine capabilities\r\n * @returns the EngineCapabilities object\r\n */\r\n public getCaps(): EngineCapabilities {\r\n return this._caps;\r\n }\r\n\r\n /**\r\n * stop executing a render loop function and remove it from the execution array\r\n * @param renderFunction defines the function to be removed. If not provided all functions will be removed.\r\n */\r\n public stopRenderLoop(renderFunction?: () => void): void {\r\n if (!renderFunction) {\r\n this._activeRenderLoops = [];\r\n return;\r\n }\r\n\r\n var index = this._activeRenderLoops.indexOf(renderFunction);\r\n\r\n if (index >= 0) {\r\n this._activeRenderLoops.splice(index, 1);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _renderLoop(): void {\r\n if (!this._contextWasLost) {\r\n var shouldRender = true;\r\n if (!this.renderEvenInBackground && this._windowIsBackground) {\r\n shouldRender = false;\r\n }\r\n\r\n if (shouldRender) {\r\n // Start new frame\r\n this.beginFrame();\r\n\r\n for (var index = 0; index < this._activeRenderLoops.length; index++) {\r\n var renderFunction = this._activeRenderLoops[index];\r\n\r\n renderFunction();\r\n }\r\n\r\n // Present\r\n this.endFrame();\r\n }\r\n }\r\n\r\n if (this._activeRenderLoops.length > 0) {\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n } else {\r\n this._renderingQueueLaunched = false;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the HTML canvas attached with the current webGL context\r\n * @returns a HTML canvas\r\n */\r\n public getRenderingCanvas(): Nullable<HTMLCanvasElement> {\r\n return this._renderingCanvas;\r\n }\r\n\r\n /**\r\n * Gets host window\r\n * @returns the host window object\r\n */\r\n public getHostWindow(): Nullable<Window> {\r\n if (!DomManagement.IsWindowObjectExist()) {\r\n return null;\r\n }\r\n\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument && this._renderingCanvas.ownerDocument.defaultView) {\r\n return this._renderingCanvas.ownerDocument.defaultView;\r\n }\r\n\r\n return window;\r\n }\r\n\r\n /**\r\n * Gets the current render width\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render width\r\n */\r\n public getRenderWidth(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.width;\r\n }\r\n\r\n return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferWidth : this._gl.drawingBufferWidth;\r\n }\r\n\r\n /**\r\n * Gets the current render height\r\n * @param useScreen defines if screen size must be used (or the current render target if any)\r\n * @returns a number defining the current render height\r\n */\r\n public getRenderHeight(useScreen = false): number {\r\n if (!useScreen && this._currentRenderTarget) {\r\n return this._currentRenderTarget.height;\r\n }\r\n\r\n return this._framebufferDimensionsObject ? this._framebufferDimensionsObject.framebufferHeight : this._gl.drawingBufferHeight;\r\n }\r\n\r\n /**\r\n * Can be used to override the current requestAnimationFrame requester.\r\n * @hidden\r\n */\r\n protected _queueNewFrame(bindedRenderFunction: any, requester?: any): number {\r\n return ThinEngine.QueueNewFrame(bindedRenderFunction, requester);\r\n }\r\n\r\n /**\r\n * Register and execute a render loop. The engine can have more than one render function\r\n * @param renderFunction defines the function to continuously execute\r\n */\r\n public runRenderLoop(renderFunction: () => void): void {\r\n if (this._activeRenderLoops.indexOf(renderFunction) !== -1) {\r\n return;\r\n }\r\n\r\n this._activeRenderLoops.push(renderFunction);\r\n\r\n if (!this._renderingQueueLaunched) {\r\n this._renderingQueueLaunched = true;\r\n this._boundRenderFunction = this._renderLoop.bind(this);\r\n this._frameHandler = this._queueNewFrame(this._boundRenderFunction, this.getHostWindow());\r\n }\r\n }\r\n\r\n /**\r\n * Clear the current render buffer or the current render target (if any is set up)\r\n * @param color defines the color to use\r\n * @param backBuffer defines if the back buffer must be cleared\r\n * @param depth defines if the depth buffer must be cleared\r\n * @param stencil defines if the stencil buffer must be cleared\r\n */\r\n public clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil: boolean = false): void {\r\n this.applyStates();\r\n\r\n var mode = 0;\r\n if (backBuffer && color) {\r\n this._gl.clearColor(color.r, color.g, color.b, color.a !== undefined ? color.a : 1.0);\r\n mode |= this._gl.COLOR_BUFFER_BIT;\r\n }\r\n\r\n if (depth) {\r\n if (this.useReverseDepthBuffer) {\r\n this._depthCullingState.depthFunc = this._gl.GREATER;\r\n this._gl.clearDepth(0.0);\r\n } else {\r\n this._gl.clearDepth(1.0);\r\n }\r\n mode |= this._gl.DEPTH_BUFFER_BIT;\r\n }\r\n if (stencil) {\r\n this._gl.clearStencil(0);\r\n mode |= this._gl.STENCIL_BUFFER_BIT;\r\n }\r\n this._gl.clear(mode);\r\n }\r\n\r\n private _viewportCached = { x: 0, y: 0, z: 0, w: 0 };\r\n\r\n /** @hidden */\r\n public _viewport(x: number, y: number, width: number, height: number): void {\r\n if (x !== this._viewportCached.x ||\r\n y !== this._viewportCached.y ||\r\n width !== this._viewportCached.z ||\r\n height !== this._viewportCached.w) {\r\n this._viewportCached.x = x;\r\n this._viewportCached.y = y;\r\n this._viewportCached.z = width;\r\n this._viewportCached.w = height;\r\n\r\n this._gl.viewport(x, y, width, height);\r\n }\r\n }\r\n\r\n /**\r\n * Set the WebGL's viewport\r\n * @param viewport defines the viewport element to be used\r\n * @param requiredWidth defines the width required for rendering. If not provided the rendering canvas' width is used\r\n * @param requiredHeight defines the height required for rendering. If not provided the rendering canvas' height is used\r\n */\r\n public setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void {\r\n var width = requiredWidth || this.getRenderWidth();\r\n var height = requiredHeight || this.getRenderHeight();\r\n var x = viewport.x || 0;\r\n var y = viewport.y || 0;\r\n\r\n this._cachedViewport = viewport;\r\n\r\n this._viewport(x * width, y * height, width * viewport.width, height * viewport.height);\r\n }\r\n\r\n /**\r\n * Begin a new frame\r\n */\r\n public beginFrame(): void {\r\n }\r\n\r\n /**\r\n * Enf the current frame\r\n */\r\n public endFrame(): void {\r\n // Force a flush in case we are using a bad OS.\r\n if (this._badOS) {\r\n this.flushFramebuffer();\r\n }\r\n }\r\n\r\n /**\r\n * Resize the view according to the canvas' size\r\n */\r\n public resize(): void {\r\n let width: number;\r\n let height: number;\r\n\r\n if (DomManagement.IsWindowObjectExist()) {\r\n width = this._renderingCanvas ? (this._renderingCanvas.clientWidth || this._renderingCanvas.width) : window.innerWidth;\r\n height = this._renderingCanvas ? (this._renderingCanvas.clientHeight || this._renderingCanvas.height) : window.innerHeight;\r\n } else {\r\n width = this._renderingCanvas ? this._renderingCanvas.width : 100;\r\n height = this._renderingCanvas ? this._renderingCanvas.height : 100;\r\n }\r\n\r\n this.setSize(width / this._hardwareScalingLevel, height / this._hardwareScalingLevel);\r\n }\r\n\r\n /**\r\n * Force a specific size of the canvas\r\n * @param width defines the new canvas' width\r\n * @param height defines the new canvas' height\r\n * @returns true if the size was changed\r\n */\r\n public setSize(width: number, height: number): boolean {\r\n if (!this._renderingCanvas) {\r\n return false;\r\n }\r\n\r\n width = width | 0;\r\n height = height | 0;\r\n\r\n if (this._renderingCanvas.width === width && this._renderingCanvas.height === height) {\r\n return false;\r\n }\r\n\r\n this._renderingCanvas.width = width;\r\n this._renderingCanvas.height = height;\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Binds the frame buffer to the specified texture.\r\n * @param texture The texture to render to or null for the default canvas\r\n * @param faceIndex The face of the texture to render to in case of cube texture\r\n * @param requiredWidth The width of the target to render to\r\n * @param requiredHeight The height of the target to render to\r\n * @param forceFullscreenViewport Forces the viewport to be the entire texture/screen if true\r\n * @param lodLevel defines the lod level to bind to the frame buffer\r\n * @param layer defines the 2d array index to bind to frame buffer to\r\n */\r\n public bindFramebuffer(texture: InternalTexture, faceIndex: number = 0, requiredWidth?: number, requiredHeight?: number, forceFullscreenViewport?: boolean, lodLevel = 0, layer = 0): void {\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n }\r\n this._currentRenderTarget = texture;\r\n this._bindUnboundFramebuffer(texture._MSAAFramebuffer ? texture._MSAAFramebuffer : texture._framebuffer);\r\n\r\n const gl = this._gl;\r\n if (texture.is2DArray) {\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, texture._webGLTexture, lodLevel, layer);\r\n }\r\n else if (texture.isCube) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, texture._webGLTexture, lodLevel);\r\n }\r\n\r\n const depthStencilTexture = texture._depthStencilTexture;\r\n if (depthStencilTexture) {\r\n const attachment = (depthStencilTexture._generateStencilBuffer) ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\r\n if (texture.is2DArray) {\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, depthStencilTexture._webGLTexture, lodLevel, layer);\r\n }\r\n else if (texture.isCube) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, depthStencilTexture._webGLTexture, lodLevel);\r\n }\r\n else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, depthStencilTexture._webGLTexture, lodLevel);\r\n }\r\n }\r\n\r\n if (this._cachedViewport && !forceFullscreenViewport) {\r\n this.setViewport(this._cachedViewport, requiredWidth, requiredHeight);\r\n } else {\r\n if (!requiredWidth) {\r\n requiredWidth = texture.width;\r\n if (lodLevel) {\r\n requiredWidth = requiredWidth / Math.pow(2, lodLevel);\r\n }\r\n }\r\n if (!requiredHeight) {\r\n requiredHeight = texture.height;\r\n if (lodLevel) {\r\n requiredHeight = requiredHeight / Math.pow(2, lodLevel);\r\n }\r\n }\r\n\r\n this._viewport(0, 0, requiredWidth, requiredHeight);\r\n }\r\n\r\n this.wipeCaches();\r\n }\r\n\r\n /** @hidden */\r\n public _bindUnboundFramebuffer(framebuffer: Nullable<WebGLFramebuffer>) {\r\n if (this._currentFramebuffer !== framebuffer) {\r\n this._gl.bindFramebuffer(this._gl.FRAMEBUFFER, framebuffer);\r\n this._currentFramebuffer = framebuffer;\r\n }\r\n }\r\n\r\n /**\r\n * Unbind the current render target texture from the webGL context\r\n * @param texture defines the render target texture to unbind\r\n * @param disableGenerateMipMaps defines a boolean indicating that mipmaps must not be generated\r\n * @param onBeforeUnbind defines a function which will be called before the effective unbind\r\n */\r\n public unBindFramebuffer(texture: InternalTexture, disableGenerateMipMaps = false, onBeforeUnbind?: () => void): void {\r\n this._currentRenderTarget = null;\r\n\r\n // If MSAA, we need to bitblt back to main texture\r\n var gl = this._gl;\r\n if (texture._MSAAFramebuffer) {\r\n if (texture._textureArray) {\r\n // This texture is part of a MRT texture, we need to treat all attachments\r\n this.unBindMultiColorAttachmentFramebuffer(texture._textureArray!, disableGenerateMipMaps, onBeforeUnbind);\r\n return;\r\n }\r\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, texture._MSAAFramebuffer);\r\n gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, texture._framebuffer);\r\n gl.blitFramebuffer(0, 0, texture.width, texture.height,\r\n 0, 0, texture.width, texture.height,\r\n gl.COLOR_BUFFER_BIT, gl.NEAREST);\r\n }\r\n\r\n if (texture.generateMipMaps && !disableGenerateMipMaps && !texture.isCube) {\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n gl.generateMipmap(gl.TEXTURE_2D);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, null);\r\n }\r\n\r\n if (onBeforeUnbind) {\r\n if (texture._MSAAFramebuffer) {\r\n // Bind the correct framebuffer\r\n this._bindUnboundFramebuffer(texture._framebuffer);\r\n }\r\n onBeforeUnbind();\r\n }\r\n\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n\r\n /**\r\n * Force a webGL flush (ie. a flush of all waiting webGL commands)\r\n */\r\n public flushFramebuffer(): void {\r\n this._gl.flush();\r\n }\r\n\r\n /**\r\n * Unbind the current render target and bind the default framebuffer\r\n */\r\n public restoreDefaultFramebuffer(): void {\r\n if (this._currentRenderTarget) {\r\n this.unBindFramebuffer(this._currentRenderTarget);\r\n } else {\r\n this._bindUnboundFramebuffer(null);\r\n }\r\n if (this._cachedViewport) {\r\n this.setViewport(this._cachedViewport);\r\n }\r\n\r\n this.wipeCaches();\r\n }\r\n\r\n // VBOs\r\n\r\n /** @hidden */\r\n protected _resetVertexBufferBinding(): void {\r\n this.bindArrayBuffer(null);\r\n this._cachedVertexBuffers = null;\r\n }\r\n\r\n /**\r\n * Creates a vertex buffer\r\n * @param data the data for the vertex buffer\r\n * @returns the new WebGL static buffer\r\n */\r\n public createVertexBuffer(data: DataArray): DataBuffer {\r\n return this._createVertexBuffer(data, this._gl.STATIC_DRAW);\r\n }\r\n\r\n private _createVertexBuffer(data: DataArray, usage: number): DataBuffer {\r\n var vbo = this._gl.createBuffer();\r\n\r\n if (!vbo) {\r\n throw new Error(\"Unable to create vertex buffer\");\r\n }\r\n\r\n let dataBuffer = new WebGLDataBuffer(vbo);\r\n this.bindArrayBuffer(dataBuffer);\r\n\r\n if (data instanceof Array) {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, new Float32Array(data), this._gl.STATIC_DRAW);\r\n } else {\r\n this._gl.bufferData(this._gl.ARRAY_BUFFER, <ArrayBuffer>data, this._gl.STATIC_DRAW);\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n\r\n dataBuffer.references = 1;\r\n return dataBuffer;\r\n }\r\n\r\n /**\r\n * Creates a dynamic vertex buffer\r\n * @param data the data for the dynamic vertex buffer\r\n * @returns the new WebGL dynamic buffer\r\n */\r\n public createDynamicVertexBuffer(data: DataArray): DataBuffer {\r\n return this._createVertexBuffer(data, this._gl.DYNAMIC_DRAW);\r\n }\r\n\r\n protected _resetIndexBufferBinding(): void {\r\n this.bindIndexBuffer(null);\r\n this._cachedIndexBuffer = null;\r\n }\r\n\r\n /**\r\n * Creates a new index buffer\r\n * @param indices defines the content of the index buffer\r\n * @param updatable defines if the index buffer must be updatable\r\n * @returns a new webGL buffer\r\n */\r\n public createIndexBuffer(indices: IndicesArray, updatable?: boolean): DataBuffer {\r\n var vbo = this._gl.createBuffer();\r\n let dataBuffer = new WebGLDataBuffer(vbo!);\r\n\r\n if (!vbo) {\r\n throw new Error(\"Unable to create index buffer\");\r\n }\r\n\r\n this.bindIndexBuffer(dataBuffer);\r\n\r\n const data = this._normalizeIndexData(indices);\r\n this._gl.bufferData(this._gl.ELEMENT_ARRAY_BUFFER, data, updatable ? this._gl.DYNAMIC_DRAW : this._gl.STATIC_DRAW);\r\n this._resetIndexBufferBinding();\r\n dataBuffer.references = 1;\r\n dataBuffer.is32Bits = (data.BYTES_PER_ELEMENT === 4);\r\n return dataBuffer;\r\n }\r\n\r\n protected _normalizeIndexData(indices: IndicesArray): Uint16Array | Uint32Array {\r\n if (indices instanceof Uint16Array) {\r\n return indices;\r\n }\r\n\r\n // Check 32 bit support\r\n if (this._caps.uintIndices) {\r\n if (indices instanceof Uint32Array) {\r\n return indices;\r\n } else {\r\n // number[] or Int32Array, check if 32 bit is necessary\r\n for (var index = 0; index < indices.length; index++) {\r\n if (indices[index] >= 65535) {\r\n return new Uint32Array(indices);\r\n }\r\n }\r\n\r\n return new Uint16Array(indices);\r\n }\r\n }\r\n\r\n // No 32 bit support, force conversion to 16 bit (values greater 16 bit are lost)\r\n return new Uint16Array(indices);\r\n }\r\n\r\n /**\r\n * Bind a webGL buffer to the webGL context\r\n * @param buffer defines the buffer to bind\r\n */\r\n public bindArrayBuffer(buffer: Nullable<DataBuffer>): void {\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n this.bindBuffer(buffer, this._gl.ARRAY_BUFFER);\r\n }\r\n\r\n /**\r\n * Bind a specific block at a given index in a specific shader program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param blockName defines the block name\r\n * @param index defines the index where to bind the block\r\n */\r\n public bindUniformBlock(pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n let program = (pipelineContext as WebGLPipelineContext).program!;\r\n\r\n var uniformLocation = this._gl.getUniformBlockIndex(program, blockName);\r\n\r\n this._gl.uniformBlockBinding(program, uniformLocation, index);\r\n }\r\n\r\n protected bindIndexBuffer(buffer: Nullable<DataBuffer>): void {\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n this.bindBuffer(buffer, this._gl.ELEMENT_ARRAY_BUFFER);\r\n }\r\n\r\n private bindBuffer(buffer: Nullable<DataBuffer>, target: number): void {\r\n if (this._vaoRecordInProgress || this._currentBoundBuffer[target] !== buffer) {\r\n this._gl.bindBuffer(target, buffer ? buffer.underlyingResource : null);\r\n this._currentBoundBuffer[target] = buffer;\r\n }\r\n }\r\n\r\n /**\r\n * update the bound buffer with the given data\r\n * @param data defines the data to update\r\n */\r\n public updateArrayBuffer(data: Float32Array): void {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n\r\n private _vertexAttribPointer(buffer: DataBuffer, indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void {\r\n var pointer = this._currentBufferPointers[indx];\r\n if (!pointer) {\r\n return;\r\n }\r\n\r\n var changed = false;\r\n if (!pointer.active) {\r\n changed = true;\r\n pointer.active = true;\r\n pointer.index = indx;\r\n pointer.size = size;\r\n pointer.type = type;\r\n pointer.normalized = normalized;\r\n pointer.stride = stride;\r\n pointer.offset = offset;\r\n pointer.buffer = buffer;\r\n } else {\r\n if (pointer.buffer !== buffer) { pointer.buffer = buffer; changed = true; }\r\n if (pointer.size !== size) { pointer.size = size; changed = true; }\r\n if (pointer.type !== type) { pointer.type = type; changed = true; }\r\n if (pointer.normalized !== normalized) { pointer.normalized = normalized; changed = true; }\r\n if (pointer.stride !== stride) { pointer.stride = stride; changed = true; }\r\n if (pointer.offset !== offset) { pointer.offset = offset; changed = true; }\r\n }\r\n\r\n if (changed || this._vaoRecordInProgress) {\r\n this.bindArrayBuffer(buffer);\r\n this._gl.vertexAttribPointer(indx, size, type, normalized, stride, offset);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _bindIndexBufferWithCache(indexBuffer: Nullable<DataBuffer>): void {\r\n if (indexBuffer == null) {\r\n return;\r\n }\r\n if (this._cachedIndexBuffer !== indexBuffer) {\r\n this._cachedIndexBuffer = indexBuffer;\r\n this.bindIndexBuffer(indexBuffer);\r\n this._uintIndicesCurrentlySet = indexBuffer.is32Bits;\r\n }\r\n }\r\n\r\n private _bindVertexBuffersAttributes(vertexBuffers: { [key: string]: Nullable<VertexBuffer> }, effect: Effect): void {\r\n var attributes = effect.getAttributesNames();\r\n\r\n if (!this._vaoRecordInProgress) {\r\n this._unbindVertexArrayObject();\r\n }\r\n\r\n this.unbindAllAttributes();\r\n\r\n for (var index = 0; index < attributes.length; index++) {\r\n var order = effect.getAttributeLocation(index);\r\n\r\n if (order >= 0) {\r\n var vertexBuffer = vertexBuffers[attributes[index]];\r\n\r\n if (!vertexBuffer) {\r\n continue;\r\n }\r\n\r\n this._gl.enableVertexAttribArray(order);\r\n if (!this._vaoRecordInProgress) {\r\n this._vertexAttribArraysEnabled[order] = true;\r\n }\r\n\r\n var buffer = vertexBuffer.getBuffer();\r\n if (buffer) {\r\n this._vertexAttribPointer(buffer, order, vertexBuffer.getSize(), vertexBuffer.type, vertexBuffer.normalized, vertexBuffer.byteStride, vertexBuffer.byteOffset);\r\n\r\n if (vertexBuffer.getIsInstanced()) {\r\n this._gl.vertexAttribDivisor(order, vertexBuffer.getInstanceDivisor());\r\n if (!this._vaoRecordInProgress) {\r\n this._currentInstanceLocations.push(order);\r\n this._currentInstanceBuffers.push(buffer);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Records a vertex array object\r\n * @see https://doc.babylonjs.com/features/webgl2#vertex-array-objects\r\n * @param vertexBuffers defines the list of vertex buffers to store\r\n * @param indexBuffer defines the index buffer to store\r\n * @param effect defines the effect to store\r\n * @returns the new vertex array object\r\n */\r\n public recordVertexArrayObject(vertexBuffers: { [key: string]: VertexBuffer; }, indexBuffer: Nullable<DataBuffer>, effect: Effect): WebGLVertexArrayObject {\r\n var vao = this._gl.createVertexArray();\r\n\r\n this._vaoRecordInProgress = true;\r\n\r\n this._gl.bindVertexArray(vao);\r\n\r\n this._mustWipeVertexAttributes = true;\r\n this._bindVertexBuffersAttributes(vertexBuffers, effect);\r\n\r\n this.bindIndexBuffer(indexBuffer);\r\n\r\n this._vaoRecordInProgress = false;\r\n this._gl.bindVertexArray(null);\r\n\r\n return vao;\r\n }\r\n\r\n /**\r\n * Bind a specific vertex array object\r\n * @see https://doc.babylonjs.com/features/webgl2#vertex-array-objects\r\n * @param vertexArrayObject defines the vertex array object to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n */\r\n public bindVertexArrayObject(vertexArrayObject: WebGLVertexArrayObject, indexBuffer: Nullable<DataBuffer>): void {\r\n if (this._cachedVertexArrayObject !== vertexArrayObject) {\r\n this._cachedVertexArrayObject = vertexArrayObject;\r\n\r\n this._gl.bindVertexArray(vertexArrayObject);\r\n this._cachedVertexBuffers = null;\r\n this._cachedIndexBuffer = null;\r\n\r\n this._uintIndicesCurrentlySet = indexBuffer != null && indexBuffer.is32Bits;\r\n this._mustWipeVertexAttributes = true;\r\n }\r\n }\r\n\r\n /**\r\n * Bind webGl buffers directly to the webGL context\r\n * @param vertexBuffer defines the vertex buffer to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param vertexDeclaration defines the vertex declaration to use with the vertex buffer\r\n * @param vertexStrideSize defines the vertex stride of the vertex buffer\r\n * @param effect defines the effect associated with the vertex buffer\r\n */\r\n public bindBuffersDirectly(vertexBuffer: DataBuffer, indexBuffer: DataBuffer, vertexDeclaration: number[], vertexStrideSize: number, effect: Effect): void {\r\n if (this._cachedVertexBuffers !== vertexBuffer || this._cachedEffectForVertexBuffers !== effect) {\r\n this._cachedVertexBuffers = vertexBuffer;\r\n this._cachedEffectForVertexBuffers = effect;\r\n\r\n let attributesCount = effect.getAttributesCount();\r\n\r\n this._unbindVertexArrayObject();\r\n this.unbindAllAttributes();\r\n\r\n var offset = 0;\r\n for (var index = 0; index < attributesCount; index++) {\r\n\r\n if (index < vertexDeclaration.length) {\r\n\r\n var order = effect.getAttributeLocation(index);\r\n\r\n if (order >= 0) {\r\n this._gl.enableVertexAttribArray(order);\r\n this._vertexAttribArraysEnabled[order] = true;\r\n this._vertexAttribPointer(vertexBuffer, order, vertexDeclaration[index], this._gl.FLOAT, false, vertexStrideSize, offset);\r\n }\r\n\r\n offset += vertexDeclaration[index] * 4;\r\n }\r\n }\r\n }\r\n\r\n this._bindIndexBufferWithCache(indexBuffer);\r\n }\r\n\r\n private _unbindVertexArrayObject(): void {\r\n if (!this._cachedVertexArrayObject) {\r\n return;\r\n }\r\n\r\n this._cachedVertexArrayObject = null;\r\n this._gl.bindVertexArray(null);\r\n }\r\n\r\n /**\r\n * Bind a list of vertex buffers to the webGL context\r\n * @param vertexBuffers defines the list of vertex buffers to bind\r\n * @param indexBuffer defines the index buffer to bind\r\n * @param effect defines the effect associated with the vertex buffers\r\n */\r\n public bindBuffers(vertexBuffers: { [key: string]: Nullable<VertexBuffer> }, indexBuffer: Nullable<DataBuffer>, effect: Effect): void {\r\n if (this._cachedVertexBuffers !== vertexBuffers || this._cachedEffectForVertexBuffers !== effect) {\r\n this._cachedVertexBuffers = vertexBuffers;\r\n this._cachedEffectForVertexBuffers = effect;\r\n\r\n this._bindVertexBuffersAttributes(vertexBuffers, effect);\r\n }\r\n\r\n this._bindIndexBufferWithCache(indexBuffer);\r\n }\r\n\r\n /**\r\n * Unbind all instance attributes\r\n */\r\n public unbindInstanceAttributes() {\r\n var boundBuffer;\r\n for (var i = 0, ul = this._currentInstanceLocations.length; i < ul; i++) {\r\n var instancesBuffer = this._currentInstanceBuffers[i];\r\n if (boundBuffer != instancesBuffer && instancesBuffer.references) {\r\n boundBuffer = instancesBuffer;\r\n this.bindArrayBuffer(instancesBuffer);\r\n }\r\n var offsetLocation = this._currentInstanceLocations[i];\r\n this._gl.vertexAttribDivisor(offsetLocation, 0);\r\n }\r\n this._currentInstanceBuffers.length = 0;\r\n this._currentInstanceLocations.length = 0;\r\n }\r\n\r\n /**\r\n * Release and free the memory of a vertex array object\r\n * @param vao defines the vertex array object to delete\r\n */\r\n public releaseVertexArrayObject(vao: WebGLVertexArrayObject) {\r\n this._gl.deleteVertexArray(vao);\r\n }\r\n\r\n /** @hidden */\r\n public _releaseBuffer(buffer: DataBuffer): boolean {\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deleteBuffer(buffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n protected _deleteBuffer(buffer: DataBuffer): void {\r\n this._gl.deleteBuffer(buffer.underlyingResource);\r\n }\r\n\r\n /**\r\n * Update the content of a webGL buffer used with instanciation and bind it to the webGL context\r\n * @param instancesBuffer defines the webGL buffer to update and bind\r\n * @param data defines the data to store in the buffer\r\n * @param offsetLocations defines the offsets or attributes information used to determine where data must be stored in the buffer\r\n */\r\n public updateAndBindInstancesBuffer(instancesBuffer: DataBuffer, data: Float32Array, offsetLocations: number[] | InstancingAttributeInfo[]): void {\r\n this.bindArrayBuffer(instancesBuffer);\r\n if (data) {\r\n this._gl.bufferSubData(this._gl.ARRAY_BUFFER, 0, data);\r\n }\r\n\r\n if ((<any>offsetLocations[0]).index !== undefined) {\r\n this.bindInstancesBuffer(instancesBuffer, offsetLocations as any, true);\r\n } else {\r\n for (let index = 0; index < 4; index++) {\r\n let offsetLocation = <number>offsetLocations[index];\r\n\r\n if (!this._vertexAttribArraysEnabled[offsetLocation]) {\r\n this._gl.enableVertexAttribArray(offsetLocation);\r\n this._vertexAttribArraysEnabled[offsetLocation] = true;\r\n }\r\n\r\n this._vertexAttribPointer(instancesBuffer, offsetLocation, 4, this._gl.FLOAT, false, 64, index * 16);\r\n this._gl.vertexAttribDivisor(offsetLocation, 1);\r\n this._currentInstanceLocations.push(offsetLocation);\r\n this._currentInstanceBuffers.push(instancesBuffer);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Bind the content of a webGL buffer used with instantiation\r\n * @param instancesBuffer defines the webGL buffer to bind\r\n * @param attributesInfo defines the offsets or attributes information used to determine where data must be stored in the buffer\r\n * @param computeStride defines Whether to compute the strides from the info or use the default 0\r\n */\r\n public bindInstancesBuffer(instancesBuffer: DataBuffer, attributesInfo: InstancingAttributeInfo[], computeStride = true): void {\r\n this.bindArrayBuffer(instancesBuffer);\r\n\r\n let stride = 0;\r\n if (computeStride) {\r\n for (let i = 0; i < attributesInfo.length; i++) {\r\n let ai = attributesInfo[i];\r\n stride += ai.attributeSize * 4;\r\n }\r\n }\r\n\r\n for (let i = 0; i < attributesInfo.length; i++) {\r\n let ai = attributesInfo[i];\r\n if (ai.index === undefined) {\r\n ai.index = this._currentEffect!.getAttributeLocationByName(ai.attributeName);\r\n }\r\n\r\n if (ai.index < 0) {\r\n continue;\r\n }\r\n\r\n if (!this._vertexAttribArraysEnabled[ai.index]) {\r\n this._gl.enableVertexAttribArray(ai.index);\r\n this._vertexAttribArraysEnabled[ai.index] = true;\r\n }\r\n\r\n this._vertexAttribPointer(instancesBuffer, ai.index, ai.attributeSize, ai.attributeType || this._gl.FLOAT, ai.normalized || false, stride, ai.offset);\r\n this._gl.vertexAttribDivisor(ai.index, ai.divisor === undefined ? 1 : ai.divisor);\r\n this._currentInstanceLocations.push(ai.index);\r\n this._currentInstanceBuffers.push(instancesBuffer);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the instance attribute corresponding to the name in parameter\r\n * @param name defines the name of the attribute to disable\r\n */\r\n public disableInstanceAttributeByName(name: string) {\r\n if (!this._currentEffect) {\r\n return;\r\n }\r\n\r\n const attributeLocation = this._currentEffect.getAttributeLocationByName(name);\r\n this.disableInstanceAttribute(attributeLocation);\r\n }\r\n\r\n /**\r\n * Disable the instance attribute corresponding to the location in parameter\r\n * @param attributeLocation defines the attribute location of the attribute to disable\r\n */\r\n public disableInstanceAttribute(attributeLocation: number) {\r\n let shouldClean = false;\r\n let index: number;\r\n while ((index = this._currentInstanceLocations.indexOf(attributeLocation)) !== -1) {\r\n this._currentInstanceLocations.splice(index, 1);\r\n this._currentInstanceBuffers.splice(index, 1);\r\n\r\n shouldClean = true;\r\n index = this._currentInstanceLocations.indexOf(attributeLocation);\r\n }\r\n\r\n if (shouldClean) {\r\n this._gl.vertexAttribDivisor(attributeLocation, 0);\r\n this.disableAttributeByIndex(attributeLocation);\r\n }\r\n }\r\n\r\n /**\r\n * Disable the attribute corresponding to the location in parameter\r\n * @param attributeLocation defines the attribute location of the attribute to disable\r\n */\r\n public disableAttributeByIndex(attributeLocation: number) {\r\n this._gl.disableVertexAttribArray(attributeLocation);\r\n this._vertexAttribArraysEnabled[attributeLocation] = false;\r\n this._currentBufferPointers[attributeLocation].active = false;\r\n }\r\n\r\n /**\r\n * Send a draw order\r\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public draw(useTriangles: boolean, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n this.drawElementsType(useTriangles ? 0 : 1, indexStart, indexCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of points\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public drawPointClouds(verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n this.drawArraysType(2, verticesStart, verticesCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param useTriangles defines if triangles must be used to draw (else wireframe will be used)\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public drawUnIndexed(useTriangles: boolean, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n this.drawArraysType(useTriangles ? 0 : 1, verticesStart, verticesCount, instancesCount);\r\n }\r\n\r\n /**\r\n * Draw a list of indexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param indexStart defines the starting index\r\n * @param indexCount defines the number of index to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public drawElementsType(fillMode: number, indexStart: number, indexCount: number, instancesCount?: number): void {\r\n // Apply states\r\n this.applyStates();\r\n\r\n this._reportDrawCall();\r\n\r\n // Render\r\n\r\n const drawMode = this._drawMode(fillMode);\r\n var indexFormat = this._uintIndicesCurrentlySet ? this._gl.UNSIGNED_INT : this._gl.UNSIGNED_SHORT;\r\n var mult = this._uintIndicesCurrentlySet ? 4 : 2;\r\n if (instancesCount) {\r\n this._gl.drawElementsInstanced(drawMode, indexCount, indexFormat, indexStart * mult, instancesCount);\r\n } else {\r\n this._gl.drawElements(drawMode, indexCount, indexFormat, indexStart * mult);\r\n }\r\n }\r\n\r\n /**\r\n * Draw a list of unindexed primitives\r\n * @param fillMode defines the primitive to use\r\n * @param verticesStart defines the index of first vertex to draw\r\n * @param verticesCount defines the count of vertices to draw\r\n * @param instancesCount defines the number of instances to draw (if instanciation is enabled)\r\n */\r\n public drawArraysType(fillMode: number, verticesStart: number, verticesCount: number, instancesCount?: number): void {\r\n // Apply states\r\n this.applyStates();\r\n\r\n this._reportDrawCall();\r\n\r\n const drawMode = this._drawMode(fillMode);\r\n if (instancesCount) {\r\n this._gl.drawArraysInstanced(drawMode, verticesStart, verticesCount, instancesCount);\r\n } else {\r\n this._gl.drawArrays(drawMode, verticesStart, verticesCount);\r\n }\r\n }\r\n\r\n private _drawMode(fillMode: number): number {\r\n switch (fillMode) {\r\n // Triangle views\r\n case 0:\r\n return this._gl.TRIANGLES;\r\n case 2:\r\n return this._gl.POINTS;\r\n case 1:\r\n return this._gl.LINES;\r\n // Draw modes\r\n case 3:\r\n return this._gl.POINTS;\r\n case 4:\r\n return this._gl.LINES;\r\n case 5:\r\n return this._gl.LINE_LOOP;\r\n case 6:\r\n return this._gl.LINE_STRIP;\r\n case 7:\r\n return this._gl.TRIANGLE_STRIP;\r\n case 8:\r\n return this._gl.TRIANGLE_FAN;\r\n default:\r\n return this._gl.TRIANGLES;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n protected _reportDrawCall() {\r\n // Will be implemented by children\r\n }\r\n\r\n // Shaders\r\n\r\n /** @hidden */\r\n public _releaseEffect(effect: Effect): void {\r\n if (this._compiledEffects[effect._key]) {\r\n delete this._compiledEffects[effect._key];\r\n\r\n this._deletePipelineContext(effect.getPipelineContext() as WebGLPipelineContext);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _deletePipelineContext(pipelineContext: IPipelineContext): void {\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (webGLPipelineContext && webGLPipelineContext.program) {\r\n webGLPipelineContext.program.__SPECTOR_rebuildProgram = null;\r\n\r\n this._gl.deleteProgram(webGLPipelineContext.program);\r\n }\r\n }\r\n\r\n /**\r\n * Create a new effect (used to store vertex/fragment shaders)\r\n * @param baseName defines the base name of the effect (The name of file without .fragment.fx or .vertex.fx)\r\n * @param attributesNamesOrOptions defines either a list of attribute names or an IEffectCreationOptions object\r\n * @param uniformsNamesOrEngine defines either a list of uniform names or the engine to use\r\n * @param samplers defines an array of string used to represent textures\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param fallbacks defines the list of potential fallbacks to use if shader conmpilation fails\r\n * @param onCompiled defines a function to call when the effect creation is successful\r\n * @param onError defines a function to call when the effect creation has failed\r\n * @param indexParameters defines an object containing the index values to use to compile shaders (like the maximum number of simultaneous lights)\r\n * @returns the new Effect\r\n */\r\n public createEffect(baseName: any, attributesNamesOrOptions: string[] | IEffectCreationOptions, uniformsNamesOrEngine: string[] | ThinEngine, samplers?: string[], defines?: string,\r\n fallbacks?: IEffectFallbacks,\r\n onCompiled?: Nullable<(effect: Effect) => void>, onError?: Nullable<(effect: Effect, errors: string) => void>, indexParameters?: any): Effect {\r\n var vertex = baseName.vertexElement || baseName.vertex || baseName.vertexToken || baseName.vertexSource || baseName;\r\n var fragment = baseName.fragmentElement || baseName.fragment || baseName.fragmentToken || baseName.fragmentSource || baseName;\r\n\r\n var name = vertex + \"+\" + fragment + \"@\" + (defines ? defines : (<IEffectCreationOptions>attributesNamesOrOptions).defines);\r\n if (this._compiledEffects[name]) {\r\n var compiledEffect = <Effect>this._compiledEffects[name];\r\n if (onCompiled && compiledEffect.isReady()) {\r\n onCompiled(compiledEffect);\r\n }\r\n\r\n return compiledEffect;\r\n }\r\n var effect = new Effect(baseName, attributesNamesOrOptions, uniformsNamesOrEngine, samplers, this, defines, fallbacks, onCompiled, onError, indexParameters);\r\n effect._key = name;\r\n this._compiledEffects[name] = effect;\r\n\r\n return effect;\r\n }\r\n\r\n protected static _ConcatenateShader(source: string, defines: Nullable<string>, shaderVersion: string = \"\"): string {\r\n return shaderVersion + (defines ? defines + \"\\n\" : \"\") + source;\r\n }\r\n\r\n private _compileShader(source: string, type: string, defines: Nullable<string>, shaderVersion: string): WebGLShader {\r\n return this._compileRawShader(ThinEngine._ConcatenateShader(source, defines, shaderVersion), type);\r\n }\r\n\r\n private _compileRawShader(source: string, type: string): WebGLShader {\r\n var gl = this._gl;\r\n var shader = gl.createShader(type === \"vertex\" ? gl.VERTEX_SHADER : gl.FRAGMENT_SHADER);\r\n\r\n if (!shader) {\r\n throw new Error(\"Something went wrong while compile the shader.\");\r\n }\r\n\r\n gl.shaderSource(shader, source);\r\n gl.compileShader(shader);\r\n\r\n return shader;\r\n }\r\n\r\n /** @hidden */\r\n public _getShaderSource(shader: WebGLShader): Nullable<string> {\r\n return this._gl.getShaderSource(shader);\r\n }\r\n\r\n /**\r\n * Directly creates a webGL program\r\n * @param pipelineContext defines the pipeline context to attach to\r\n * @param vertexCode defines the vertex shader code to use\r\n * @param fragmentCode defines the fragment shader code to use\r\n * @param context defines the webGL context to use (if not set, the current one will be used)\r\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\r\n * @returns the new webGL program\r\n */\r\n public createRawShaderProgram(pipelineContext: IPipelineContext, vertexCode: string, fragmentCode: string, context?: WebGLRenderingContext, transformFeedbackVaryings: Nullable<string[]> = null): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n var vertexShader = this._compileRawShader(vertexCode, \"vertex\");\r\n var fragmentShader = this._compileRawShader(fragmentCode, \"fragment\");\r\n\r\n return this._createShaderProgram(pipelineContext as WebGLPipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings);\r\n }\r\n\r\n /**\r\n * Creates a webGL program\r\n * @param pipelineContext defines the pipeline context to attach to\r\n * @param vertexCode defines the vertex shader code to use\r\n * @param fragmentCode defines the fragment shader code to use\r\n * @param defines defines the string containing the defines to use to compile the shaders\r\n * @param context defines the webGL context to use (if not set, the current one will be used)\r\n * @param transformFeedbackVaryings defines the list of transform feedback varyings to use\r\n * @returns the new webGL program\r\n */\r\n public createShaderProgram(pipelineContext: IPipelineContext, vertexCode: string, fragmentCode: string, defines: Nullable<string>, context?: WebGLRenderingContext, transformFeedbackVaryings: Nullable<string[]> = null): WebGLProgram {\r\n context = context || this._gl;\r\n\r\n var shaderVersion = (this._webGLVersion > 1) ? \"#version 300 es\\n#define WEBGL2 \\n\" : \"\";\r\n var vertexShader = this._compileShader(vertexCode, \"vertex\", defines, shaderVersion);\r\n var fragmentShader = this._compileShader(fragmentCode, \"fragment\", defines, shaderVersion);\r\n\r\n return this._createShaderProgram(pipelineContext as WebGLPipelineContext, vertexShader, fragmentShader, context, transformFeedbackVaryings);\r\n }\r\n\r\n /**\r\n * Creates a new pipeline context\r\n * @returns the new pipeline\r\n */\r\n public createPipelineContext(): IPipelineContext {\r\n var pipelineContext = new WebGLPipelineContext();\r\n pipelineContext.engine = this;\r\n\r\n if (this._caps.parallelShaderCompile) {\r\n pipelineContext.isParallelCompiled = true;\r\n }\r\n\r\n return pipelineContext;\r\n }\r\n\r\n protected _createShaderProgram(pipelineContext: WebGLPipelineContext, vertexShader: WebGLShader, fragmentShader: WebGLShader, context: WebGLRenderingContext, transformFeedbackVaryings: Nullable<string[]> = null): WebGLProgram {\r\n var shaderProgram = context.createProgram();\r\n pipelineContext.program = shaderProgram;\r\n\r\n if (!shaderProgram) {\r\n throw new Error(\"Unable to create program\");\r\n }\r\n\r\n context.attachShader(shaderProgram, vertexShader);\r\n context.attachShader(shaderProgram, fragmentShader);\r\n\r\n context.linkProgram(shaderProgram);\r\n\r\n pipelineContext.context = context;\r\n pipelineContext.vertexShader = vertexShader;\r\n pipelineContext.fragmentShader = fragmentShader;\r\n\r\n if (!pipelineContext.isParallelCompiled) {\r\n this._finalizePipelineContext(pipelineContext);\r\n }\r\n\r\n return shaderProgram;\r\n }\r\n\r\n protected _finalizePipelineContext(pipelineContext: WebGLPipelineContext) {\r\n const context = pipelineContext.context!;\r\n const vertexShader = pipelineContext.vertexShader!;\r\n const fragmentShader = pipelineContext.fragmentShader!;\r\n const program = pipelineContext.program!;\r\n\r\n var linked = context.getProgramParameter(program, context.LINK_STATUS);\r\n if (!linked) { // Get more info\r\n // Vertex\r\n if (!this._gl.getShaderParameter(vertexShader, this._gl.COMPILE_STATUS)) {\r\n const log = this._gl.getShaderInfoLog(vertexShader);\r\n if (log) {\r\n pipelineContext.vertexCompilationError = log;\r\n throw new Error(\"VERTEX SHADER \" + log);\r\n }\r\n }\r\n\r\n // Fragment\r\n if (!this._gl.getShaderParameter(fragmentShader, this._gl.COMPILE_STATUS)) {\r\n const log = this._gl.getShaderInfoLog(fragmentShader);\r\n if (log) {\r\n pipelineContext.fragmentCompilationError = log;\r\n throw new Error(\"FRAGMENT SHADER \" + log);\r\n }\r\n }\r\n\r\n var error = context.getProgramInfoLog(program);\r\n if (error) {\r\n pipelineContext.programLinkError = error;\r\n throw new Error(error);\r\n }\r\n }\r\n\r\n if (this.validateShaderPrograms) {\r\n context.validateProgram(program);\r\n var validated = context.getProgramParameter(program, context.VALIDATE_STATUS);\r\n\r\n if (!validated) {\r\n var error = context.getProgramInfoLog(program);\r\n if (error) {\r\n pipelineContext.programValidationError = error;\r\n throw new Error(error);\r\n }\r\n }\r\n }\r\n\r\n context.deleteShader(vertexShader);\r\n context.deleteShader(fragmentShader);\r\n\r\n pipelineContext.vertexShader = undefined;\r\n pipelineContext.fragmentShader = undefined;\r\n\r\n if (pipelineContext.onCompiled) {\r\n pipelineContext.onCompiled();\r\n pipelineContext.onCompiled = undefined;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _preparePipelineContext(pipelineContext: IPipelineContext, vertexSourceCode: string, fragmentSourceCode: string, createAsRaw: boolean,\r\n rebuildRebind: any,\r\n defines: Nullable<string>,\r\n transformFeedbackVaryings: Nullable<string[]>) {\r\n let webGLRenderingState = pipelineContext as WebGLPipelineContext;\r\n\r\n if (createAsRaw) {\r\n webGLRenderingState.program = this.createRawShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, undefined, transformFeedbackVaryings);\r\n }\r\n else {\r\n webGLRenderingState.program = this.createShaderProgram(webGLRenderingState, vertexSourceCode, fragmentSourceCode, defines, undefined, transformFeedbackVaryings);\r\n }\r\n webGLRenderingState.program.__SPECTOR_rebuildProgram = rebuildRebind;\r\n }\r\n\r\n /** @hidden */\r\n public _isRenderingStateCompiled(pipelineContext: IPipelineContext): boolean {\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n if (this._gl.getProgramParameter(webGLPipelineContext.program!, this._caps.parallelShaderCompile!.COMPLETION_STATUS_KHR)) {\r\n this._finalizePipelineContext(webGLPipelineContext);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /** @hidden */\r\n public _executeWhenRenderingStateIsCompiled(pipelineContext: IPipelineContext, action: () => void) {\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n if (!webGLPipelineContext.isParallelCompiled) {\r\n action();\r\n return;\r\n }\r\n\r\n let oldHandler = webGLPipelineContext.onCompiled;\r\n\r\n if (oldHandler) {\r\n webGLPipelineContext.onCompiled = () => {\r\n oldHandler!();\r\n action();\r\n };\r\n } else {\r\n webGLPipelineContext.onCompiled = action;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the list of webGL uniform locations associated with a specific program based on a list of uniform names\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param uniformsNames defines the list of uniform names\r\n * @returns an array of webGL uniform locations\r\n */\r\n public getUniforms(pipelineContext: IPipelineContext, uniformsNames: string[]): Nullable<WebGLUniformLocation>[] {\r\n var results = new Array<Nullable<WebGLUniformLocation>>();\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n for (var index = 0; index < uniformsNames.length; index++) {\r\n results.push(this._gl.getUniformLocation(webGLPipelineContext.program!, uniformsNames[index]));\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Gets the lsit of active attributes for a given webGL program\r\n * @param pipelineContext defines the pipeline context to use\r\n * @param attributesNames defines the list of attribute names to get\r\n * @returns an array of indices indicating the offset of each attribute\r\n */\r\n public getAttributes(pipelineContext: IPipelineContext, attributesNames: string[]): number[] {\r\n var results = [];\r\n let webGLPipelineContext = pipelineContext as WebGLPipelineContext;\r\n\r\n for (var index = 0; index < attributesNames.length; index++) {\r\n try {\r\n results.push(this._gl.getAttribLocation(webGLPipelineContext.program!, attributesNames[index]));\r\n } catch (e) {\r\n results.push(-1);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * Activates an effect, mkaing it the current one (ie. the one used for rendering)\r\n * @param effect defines the effect to activate\r\n */\r\n public enableEffect(effect: Nullable<Effect>): void {\r\n if (!effect || effect === this._currentEffect) {\r\n return;\r\n }\r\n\r\n // Use program\r\n this.bindSamplers(effect);\r\n\r\n this._currentEffect = effect;\r\n\r\n if (effect.onBind) {\r\n effect.onBind(effect);\r\n }\r\n if (effect._onBindObservable) {\r\n effect._onBindObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (int)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the int number to store\r\n * @returns true if the value was set\r\n */\r\n public setInt(uniform: Nullable<WebGLUniformLocation>, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1i(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray(uniform: Nullable<WebGLUniformLocation>, array: Int32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1iv(uniform, array);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray2(uniform: Nullable<WebGLUniformLocation>, array: Int32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray3(uniform: Nullable<WebGLUniformLocation>, array: Int32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of int32 (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of int32 to store\r\n * @returns true if the value was set\r\n */\r\n public setIntArray4(uniform: Nullable<WebGLUniformLocation>, array: Int32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4iv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray(uniform: Nullable<WebGLUniformLocation>, array: number[] | Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1fv(uniform, array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray2(uniform: Nullable<WebGLUniformLocation>, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 2 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2fv(uniform, <any>array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray3(uniform: Nullable<WebGLUniformLocation>, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 3 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3fv(uniform, <any>array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of number (stored as vec4)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param array defines the array of number to store\r\n * @returns true if the value was set\r\n */\r\n public setArray4(uniform: Nullable<WebGLUniformLocation>, array: number[] | Float32Array): boolean {\r\n if (!uniform || array.length % 4 !== 0) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4fv(uniform, <any>array);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to an array of float32 (stored as matrices)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrices defines the array of float32 to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrices(uniform: Nullable<WebGLUniformLocation>, matrices: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix4fv(uniform, false, matrices);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a matrix (3x3)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrix defines the Float32Array representing the 3x3 matrix to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrix3x3(uniform: Nullable<WebGLUniformLocation>, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix3fv(uniform, false, matrix);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a matrix (2x2)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param matrix defines the Float32Array representing the 2x2 matrix to store\r\n * @returns true if the value was set\r\n */\r\n public setMatrix2x2(uniform: Nullable<WebGLUniformLocation>, matrix: Float32Array): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniformMatrix2fv(uniform, false, matrix);\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a number (float)\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param value defines the float number to store\r\n * @returns true if the value was transfered\r\n */\r\n public setFloat(uniform: Nullable<WebGLUniformLocation>, value: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform1f(uniform, value);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec2\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat2(uniform: Nullable<WebGLUniformLocation>, x: number, y: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform2f(uniform, x, y);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec3\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat3(uniform: Nullable<WebGLUniformLocation>, x: number, y: number, z: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform3f(uniform, x, y, z);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Set the value of an uniform to a vec4\r\n * @param uniform defines the webGL uniform location where to store the value\r\n * @param x defines the 1st component of the value\r\n * @param y defines the 2nd component of the value\r\n * @param z defines the 3rd component of the value\r\n * @param w defines the 4th component of the value\r\n * @returns true if the value was set\r\n */\r\n public setFloat4(uniform: Nullable<WebGLUniformLocation>, x: number, y: number, z: number, w: number): boolean {\r\n if (!uniform) {\r\n return false;\r\n }\r\n\r\n this._gl.uniform4f(uniform, x, y, z, w);\r\n\r\n return true;\r\n }\r\n\r\n // States\r\n\r\n /**\r\n * Apply all cached states (depth, culling, stencil and alpha)\r\n */\r\n public applyStates() {\r\n this._depthCullingState.apply(this._gl);\r\n this._stencilState.apply(this._gl);\r\n this._alphaState.apply(this._gl);\r\n\r\n if (this._colorWriteChanged) {\r\n this._colorWriteChanged = false;\r\n const enable = this._colorWrite;\r\n this._gl.colorMask(enable, enable, enable, enable);\r\n }\r\n }\r\n\r\n /**\r\n * Enable or disable color writing\r\n * @param enable defines the state to set\r\n */\r\n public setColorWrite(enable: boolean): void {\r\n if (enable !== this._colorWrite) {\r\n this._colorWriteChanged = true;\r\n this._colorWrite = enable;\r\n }\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if color writing is enabled\r\n * @returns the current color writing state\r\n */\r\n public getColorWrite(): boolean {\r\n return this._colorWrite;\r\n }\r\n\r\n /**\r\n * Gets the depth culling state manager\r\n */\r\n public get depthCullingState(): DepthCullingState {\r\n return this._depthCullingState;\r\n }\r\n\r\n /**\r\n * Gets the alpha state manager\r\n */\r\n public get alphaState(): AlphaState {\r\n return this._alphaState;\r\n }\r\n\r\n /**\r\n * Gets the stencil state manager\r\n */\r\n public get stencilState(): StencilState {\r\n return this._stencilState;\r\n }\r\n\r\n // Textures\r\n\r\n /**\r\n * Clears the list of texture accessible through engine.\r\n * This can help preventing texture load conflict due to name collision.\r\n */\r\n public clearInternalTexturesCache() {\r\n this._internalTexturesCache = [];\r\n }\r\n\r\n /**\r\n * Force the entire cache to be cleared\r\n * You should not have to use this function unless your engine needs to share the webGL context with another engine\r\n * @param bruteForce defines a boolean to force clearing ALL caches (including stencil, detoh and alpha states)\r\n */\r\n public wipeCaches(bruteForce?: boolean): void {\r\n if (this.preventCacheWipeBetweenFrames && !bruteForce) {\r\n return;\r\n }\r\n this._currentEffect = null;\r\n this._viewportCached.x = 0;\r\n this._viewportCached.y = 0;\r\n this._viewportCached.z = 0;\r\n this._viewportCached.w = 0;\r\n\r\n // Done before in case we clean the attributes\r\n this._unbindVertexArrayObject();\r\n\r\n if (bruteForce) {\r\n this._currentProgram = null;\r\n this.resetTextureCache();\r\n\r\n this._stencilState.reset();\r\n\r\n this._depthCullingState.reset();\r\n this._depthCullingState.depthFunc = this._gl.LEQUAL;\r\n\r\n this._alphaState.reset();\r\n this._alphaMode = 1;\r\n this._alphaEquation = 0;\r\n\r\n this._colorWrite = true;\r\n this._colorWriteChanged = true;\r\n\r\n this._unpackFlipYCached = null;\r\n\r\n this._gl.pixelStorei(this._gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, this._gl.NONE);\r\n this._gl.pixelStorei(this._gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, 0);\r\n\r\n this._mustWipeVertexAttributes = true;\r\n this.unbindAllAttributes();\r\n }\r\n\r\n this._resetVertexBufferBinding();\r\n this._cachedIndexBuffer = null;\r\n this._cachedEffectForVertexBuffers = null;\r\n this.bindIndexBuffer(null);\r\n }\r\n\r\n /** @hidden */\r\n public _getSamplingParameters(samplingMode: number, generateMipMaps: boolean): { min: number; mag: number } {\r\n var gl = this._gl;\r\n var magFilter = gl.NEAREST;\r\n var minFilter = gl.NEAREST;\r\n\r\n switch (samplingMode) {\r\n case 11:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case 3:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case 8:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case 4:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case 5:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case 6:\r\n magFilter = gl.NEAREST;\r\n if (generateMipMaps) {\r\n minFilter = gl.LINEAR_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.LINEAR;\r\n }\r\n break;\r\n case 7:\r\n magFilter = gl.NEAREST;\r\n minFilter = gl.LINEAR;\r\n break;\r\n case 1:\r\n magFilter = gl.NEAREST;\r\n minFilter = gl.NEAREST;\r\n break;\r\n case 9:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_NEAREST;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case 10:\r\n magFilter = gl.LINEAR;\r\n if (generateMipMaps) {\r\n minFilter = gl.NEAREST_MIPMAP_LINEAR;\r\n } else {\r\n minFilter = gl.NEAREST;\r\n }\r\n break;\r\n case 2:\r\n magFilter = gl.LINEAR;\r\n minFilter = gl.LINEAR;\r\n break;\r\n case 12:\r\n magFilter = gl.LINEAR;\r\n minFilter = gl.NEAREST;\r\n break;\r\n }\r\n\r\n return {\r\n min: minFilter,\r\n mag: magFilter\r\n };\r\n }\r\n\r\n /** @hidden */\r\n public _createTexture(): WebGLTexture {\r\n let texture = this._gl.createTexture();\r\n\r\n if (!texture) {\r\n throw new Error(\"Unable to create texture\");\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Usually called from Texture.ts.\r\n * Passed information to create a WebGLTexture\r\n * @param url defines a value which contains one of the following:\r\n * * A conventional http URL, e.g. 'http://...' or 'file://...'\r\n * * A base64 string of in-line texture data, e.g. 'data:image/jpg;base64,/...'\r\n * * An indicator that data being passed using the buffer parameter, e.g. 'data:mytexture.jpg'\r\n * @param noMipmap defines a boolean indicating that no mipmaps shall be generated. Ignored for compressed textures. They must be in the file\r\n * @param invertY when true, image is flipped when loaded. You probably want true. Certain compressed textures may invert this if their default is inverted (eg. ktx)\r\n * @param scene needed for loading to the correct scene\r\n * @param samplingMode mode with should be used sample / access the texture (Default: Texture.TRILINEAR_SAMPLINGMODE)\r\n * @param onLoad optional callback to be called upon successful completion\r\n * @param onError optional callback to be called upon failure\r\n * @param buffer a source of a file previously fetched as either a base64 string, an ArrayBuffer (compressed or image format), HTMLImageElement (image format), or a Blob\r\n * @param fallback an internal argument in case the function must be called again, due to etc1 not having alpha capabilities\r\n * @param format internal format. Default: RGB when extension is '.jpg' else RGBA. Ignored for compressed textures\r\n * @param forcedExtension defines the extension to use to pick the right loader\r\n * @param mimeType defines an optional mime type\r\n * @param loaderOptions options to be passed to the loader\r\n * @returns a InternalTexture for assignment back into BABYLON.Texture\r\n */\r\n public createTexture(url: Nullable<string>, noMipmap: boolean, invertY: boolean, scene: Nullable<ISceneLike>, samplingMode: number = 3,\r\n onLoad: Nullable<() => void> = null, onError: Nullable<(message: string, exception: any) => void> = null,\r\n buffer: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap> = null, fallback: Nullable<InternalTexture> = null, format: Nullable<number> = null,\r\n forcedExtension: Nullable<string> = null, mimeType?: string, loaderOptions?: any): InternalTexture {\r\n url = url || \"\";\r\n const fromData = url.substr(0, 5) === \"data:\";\r\n const fromBlob = url.substr(0, 5) === \"blob:\";\r\n const isBase64 = fromData && url.indexOf(\";base64,\") !== -1;\r\n\r\n let texture = fallback ? fallback : new InternalTexture(this, InternalTextureSource.Url);\r\n\r\n const originalUrl = url;\r\n if (this._transformTextureUrl && !isBase64 && !fallback && !buffer) {\r\n url = this._transformTextureUrl(url);\r\n }\r\n\r\n if (originalUrl !== url) {\r\n texture._originalUrl = originalUrl;\r\n }\r\n\r\n // establish the file extension, if possible\r\n const lastDot = url.lastIndexOf('.');\r\n let extension = forcedExtension ? forcedExtension : (lastDot > -1 ? url.substring(lastDot).toLowerCase() : \"\");\r\n let loader: Nullable<IInternalTextureLoader> = null;\r\n\r\n // Remove query string\r\n let queryStringIndex = extension.indexOf(\"?\");\r\n\r\n if (queryStringIndex > -1) {\r\n extension = extension.split(\"?\")[0];\r\n }\r\n\r\n for (const availableLoader of ThinEngine._TextureLoaders) {\r\n if (availableLoader.canLoad(extension, mimeType)) {\r\n loader = availableLoader;\r\n break;\r\n }\r\n }\r\n\r\n if (scene) {\r\n scene._addPendingData(texture);\r\n }\r\n texture.url = url;\r\n texture.generateMipMaps = !noMipmap;\r\n texture.samplingMode = samplingMode;\r\n texture.invertY = invertY;\r\n\r\n if (!this._doNotHandleContextLost) {\r\n // Keep a link to the buffer only if we plan to handle context lost\r\n texture._buffer = buffer;\r\n }\r\n\r\n let onLoadObserver: Nullable<Observer<InternalTexture>> = null;\r\n if (onLoad && !fallback) {\r\n onLoadObserver = texture.onLoadedObservable.add(onLoad);\r\n }\r\n\r\n if (!fallback) { this._internalTexturesCache.push(texture); }\r\n\r\n const onInternalError = (message?: string, exception?: any) => {\r\n if (scene) {\r\n scene._removePendingData(texture);\r\n }\r\n\r\n if (url === originalUrl) {\r\n if (onLoadObserver) {\r\n texture.onLoadedObservable.remove(onLoadObserver);\r\n }\r\n\r\n if (EngineStore.UseFallbackTexture) {\r\n this.createTexture(EngineStore.FallbackTexture, noMipmap, texture.invertY, scene, samplingMode, null, onError, buffer, texture);\r\n }\r\n\r\n if (onError) {\r\n onError((message || \"Unknown error\") + (EngineStore.UseFallbackTexture ? \" - Fallback texture was used\" : \"\"), exception);\r\n }\r\n }\r\n else {\r\n // fall back to the original url if the transformed url fails to load\r\n Logger.Warn(`Failed to load ${url}, falling back to ${originalUrl}`);\r\n this.createTexture(originalUrl, noMipmap, texture.invertY, scene, samplingMode, onLoad, onError, buffer, texture, format, forcedExtension, mimeType, loaderOptions);\r\n }\r\n };\r\n\r\n // processing for non-image formats\r\n if (loader) {\r\n const callback = (data: ArrayBufferView) => {\r\n loader!.loadData(data, texture, (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed) => {\r\n if (loadFailed) {\r\n onInternalError(\"TextureLoader failed to load data\");\r\n } else {\r\n this._prepareWebGLTexture(texture, scene, width, height, texture.invertY, !loadMipmap, isCompressed, () => {\r\n done();\r\n return false;\r\n }, samplingMode);\r\n }\r\n }, loaderOptions);\r\n };\r\n\r\n if (!buffer) {\r\n this._loadFile(url, (data) => callback(new Uint8Array(data as ArrayBuffer)), undefined, scene ? scene.offlineProvider : undefined, true, (request?: IWebRequest, exception?: any) => {\r\n onInternalError(\"Unable to load \" + (request ? request.responseURL : url, exception));\r\n });\r\n } else {\r\n if (buffer instanceof ArrayBuffer) {\r\n callback(new Uint8Array(buffer));\r\n }\r\n else if (ArrayBuffer.isView(buffer)) {\r\n callback(buffer);\r\n }\r\n else {\r\n if (onError) {\r\n onError(\"Unable to load: only ArrayBuffer or ArrayBufferView is supported\", null);\r\n }\r\n }\r\n }\r\n } else {\r\n const onload = (img: HTMLImageElement | ImageBitmap) => {\r\n if (fromBlob && !this._doNotHandleContextLost) {\r\n // We need to store the image if we need to rebuild the texture\r\n // in case of a webgl context lost\r\n texture._buffer = img;\r\n }\r\n\r\n this._prepareWebGLTexture(texture, scene, img.width, img.height, texture.invertY, noMipmap, false, (potWidth, potHeight, continuationCallback) => {\r\n let gl = this._gl;\r\n var isPot = (img.width === potWidth && img.height === potHeight);\r\n let internalFormat = format ? this._getInternalFormat(format) : ((extension === \".jpg\") ? gl.RGB : gl.RGBA);\r\n\r\n if (isPot) {\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, internalFormat, gl.UNSIGNED_BYTE, img);\r\n return false;\r\n }\r\n\r\n let maxTextureSize = this._caps.maxTextureSize;\r\n\r\n if (img.width > maxTextureSize || img.height > maxTextureSize || !this._supportsHardwareTextureRescaling) {\r\n this._prepareWorkingCanvas();\r\n if (!this._workingCanvas || !this._workingContext) {\r\n return false;\r\n }\r\n\r\n this._workingCanvas.width = potWidth;\r\n this._workingCanvas.height = potHeight;\r\n\r\n this._workingContext.drawImage(img, 0, 0, img.width, img.height, 0, 0, potWidth, potHeight);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, internalFormat, gl.UNSIGNED_BYTE, this._workingCanvas);\r\n\r\n texture.width = potWidth;\r\n texture.height = potHeight;\r\n\r\n return false;\r\n } else {\r\n // Using shaders when possible to rescale because canvas.drawImage is lossy\r\n let source = new InternalTexture(this, InternalTextureSource.Temp);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, source, true);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, internalFormat, gl.UNSIGNED_BYTE, img);\r\n\r\n this._rescaleTexture(source, texture, scene, internalFormat, () => {\r\n this._releaseTexture(source);\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n\r\n continuationCallback();\r\n });\r\n }\r\n\r\n return true;\r\n }, samplingMode);\r\n };\r\n\r\n if (!fromData || isBase64) {\r\n if (buffer && ((<HTMLImageElement>buffer).decoding || (<ImageBitmap>buffer).close)) {\r\n onload(<HTMLImageElement>buffer);\r\n } else {\r\n ThinEngine._FileToolsLoadImage(url, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);\r\n }\r\n }\r\n else if (typeof buffer === \"string\" || buffer instanceof ArrayBuffer || ArrayBuffer.isView(buffer) || buffer instanceof Blob) {\r\n ThinEngine._FileToolsLoadImage(buffer, onload, onInternalError, scene ? scene.offlineProvider : null, mimeType);\r\n }\r\n else if (buffer) {\r\n onload(buffer);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n /**\r\n * Loads an image as an HTMLImageElement.\r\n * @param input url string, ArrayBuffer, or Blob to load\r\n * @param onLoad callback called when the image successfully loads\r\n * @param onError callback called when the image fails to load\r\n * @param offlineProvider offline provider for caching\r\n * @param mimeType optional mime type\r\n * @returns the HTMLImageElement of the loaded image\r\n * @hidden\r\n */\r\n public static _FileToolsLoadImage(input: string | ArrayBuffer | ArrayBufferView | Blob, onLoad: (img: HTMLImageElement | ImageBitmap) => void, onError: (message?: string, exception?: any) => void, offlineProvider: Nullable<IOfflineProvider>, mimeType?: string): Nullable<HTMLImageElement> {\r\n throw _DevTools.WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * @hidden\r\n */\r\n public _rescaleTexture(source: InternalTexture, destination: InternalTexture, scene: Nullable<any>, internalFormat: number, onComplete: () => void): void {\r\n }\r\n\r\n /**\r\n * Creates a raw texture\r\n * @param data defines the data to store in the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param format defines the format of the data\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (Texture.NEAREST_SAMPLINGMODE by default)\r\n * @param compression defines the compression used (null by default)\r\n * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_INT by default)\r\n * @returns the raw texture inside an InternalTexture\r\n */\r\n public createRawTexture(data: Nullable<ArrayBufferView>, width: number, height: number, format: number, generateMipMaps: boolean, invertY: boolean, samplingMode: number, compression: Nullable<string> = null, type: number = 0): InternalTexture {\r\n throw _DevTools.WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n /**\r\n * Creates a new raw cube texture\r\n * @param data defines the array of data to use to create each face\r\n * @param size defines the size of the textures\r\n * @param format defines the format of the data\r\n * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_INT)\r\n * @param generateMipMaps defines if the engine should generate the mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compression used (null by default)\r\n * @returns the cube texture as an InternalTexture\r\n */\r\n public createRawCubeTexture(data: Nullable<ArrayBufferView[]>, size: number, format: number, type: number,\r\n generateMipMaps: boolean, invertY: boolean, samplingMode: number,\r\n compression: Nullable<string> = null): InternalTexture {\r\n throw _DevTools.WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n /**\r\n * Creates a new raw 3D texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the depth of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @returns a new raw 3D texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture3D(data: Nullable<ArrayBufferView>, width: number, height: number, depth: number, format: number, generateMipMaps: boolean, invertY: boolean, samplingMode: number, compression: Nullable<string> = null, textureType = 0): InternalTexture {\r\n throw _DevTools.WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n /**\r\n * Creates a new raw 2D array texture\r\n * @param data defines the data used to create the texture\r\n * @param width defines the width of the texture\r\n * @param height defines the height of the texture\r\n * @param depth defines the number of layers of the texture\r\n * @param format defines the format of the texture\r\n * @param generateMipMaps defines if the engine must generate mip levels\r\n * @param invertY defines if data must be stored with Y axis inverted\r\n * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)\r\n * @param compression defines the compressed used (can be null)\r\n * @param textureType defines the compressed used (can be null)\r\n * @returns a new raw 2D array texture (stored in an InternalTexture)\r\n */\r\n public createRawTexture2DArray(data: Nullable<ArrayBufferView>, width: number, height: number, depth: number, format: number, generateMipMaps: boolean, invertY: boolean, samplingMode: number, compression: Nullable<string> = null, textureType = 0): InternalTexture {\r\n throw _DevTools.WarnImport(\"Engine.RawTexture\");\r\n }\r\n\r\n private _unpackFlipYCached: Nullable<boolean> = null;\r\n\r\n /**\r\n * In case you are sharing the context with other applications, it might\r\n * be interested to not cache the unpack flip y state to ensure a consistent\r\n * value would be set.\r\n */\r\n public enableUnpackFlipYCached = true;\r\n\r\n /** @hidden */\r\n public _unpackFlipY(value: boolean): void {\r\n if (this._unpackFlipYCached !== value) {\r\n this._gl.pixelStorei(this._gl.UNPACK_FLIP_Y_WEBGL, value ? 1 : 0);\r\n\r\n if (this.enableUnpackFlipYCached) {\r\n this._unpackFlipYCached = value;\r\n }\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _getUnpackAlignement(): number {\r\n return this._gl.getParameter(this._gl.UNPACK_ALIGNMENT);\r\n }\r\n\r\n private _getTextureTarget(texture: InternalTexture): number {\r\n if (texture.isCube) {\r\n return this._gl.TEXTURE_CUBE_MAP;\r\n } else if (texture.is3D) {\r\n return this._gl.TEXTURE_3D;\r\n } else if (texture.is2DArray || texture.isMultiview) {\r\n return this._gl.TEXTURE_2D_ARRAY;\r\n }\r\n return this._gl.TEXTURE_2D;\r\n }\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param samplingMode defines the required sampling mode\r\n * @param texture defines the texture to update\r\n * @param generateMipMaps defines whether to generate mipmaps for the texture\r\n */\r\n public updateTextureSamplingMode(samplingMode: number, texture: InternalTexture, generateMipMaps: boolean = false): void {\r\n const target = this._getTextureTarget(texture);\r\n var filters = this._getSamplingParameters(samplingMode, texture.generateMipMaps || generateMipMaps);\r\n\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_MAG_FILTER, filters.mag, texture);\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_MIN_FILTER, filters.min);\r\n\r\n if (generateMipMaps) {\r\n texture.generateMipMaps = true;\r\n this._gl.generateMipmap(target);\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n\r\n texture.samplingMode = samplingMode;\r\n }\r\n\r\n /**\r\n * Update the sampling mode of a given texture\r\n * @param texture defines the texture to update\r\n * @param wrapU defines the texture wrap mode of the u coordinates\r\n * @param wrapV defines the texture wrap mode of the v coordinates\r\n * @param wrapR defines the texture wrap mode of the r coordinates\r\n */\r\n public updateTextureWrappingMode(texture: InternalTexture, wrapU: Nullable<number>, wrapV: Nullable<number> = null, wrapR: Nullable<number> = null): void {\r\n const target = this._getTextureTarget(texture);\r\n\r\n if (wrapU !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(wrapU), texture);\r\n texture._cachedWrapU = wrapU;\r\n }\r\n if (wrapV !== null) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(wrapV), texture);\r\n texture._cachedWrapV = wrapV;\r\n }\r\n if ((texture.is2DArray || texture.is3D) && (wrapR !== null)) {\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(wrapR), texture);\r\n texture._cachedWrapR = wrapR;\r\n }\r\n\r\n this._bindTextureDirectly(target, null);\r\n }\r\n\r\n /** @hidden */\r\n public _setupDepthStencilTexture(internalTexture: InternalTexture, size: number | { width: number, height: number, layers?: number }, generateStencil: boolean, bilinearFiltering: boolean, comparisonFunction: number): void {\r\n const width = (<{ width: number, height: number, layers?: number }>size).width || <number>size;\r\n const height = (<{ width: number, height: number, layers?: number }>size).height || <number>size;\r\n const layers = (<{ width: number, height: number, layers?: number }>size).layers || 0;\r\n\r\n internalTexture.baseWidth = width;\r\n internalTexture.baseHeight = height;\r\n internalTexture.width = width;\r\n internalTexture.height = height;\r\n internalTexture.is2DArray = layers > 0;\r\n internalTexture.depth = layers;\r\n internalTexture.isReady = true;\r\n internalTexture.samples = 1;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture._generateDepthBuffer = true;\r\n internalTexture._generateStencilBuffer = generateStencil;\r\n internalTexture.samplingMode = bilinearFiltering ? 2 : 1;\r\n internalTexture.type = 0;\r\n internalTexture._comparisonFunction = comparisonFunction;\r\n\r\n const gl = this._gl;\r\n const target = this._getTextureTarget(internalTexture);\r\n const samplingParameters = this._getSamplingParameters(internalTexture.samplingMode, false);\r\n gl.texParameteri(target, gl.TEXTURE_MAG_FILTER, samplingParameters.mag);\r\n gl.texParameteri(target, gl.TEXTURE_MIN_FILTER, samplingParameters.min);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\r\n gl.texParameteri(target, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\r\n\r\n if (comparisonFunction === 0) {\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, 515);\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.NONE);\r\n }\r\n else {\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_FUNC, comparisonFunction);\r\n gl.texParameteri(target, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _uploadCompressedDataToTextureDirectly(texture: InternalTexture, internalFormat: number, width: number, height: number, data: ArrayBufferView, faceIndex: number = 0, lod: number = 0) {\r\n var gl = this._gl;\r\n\r\n var target = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n this._gl.compressedTexImage2D(target, lod, internalFormat, width, height, 0, <DataView>data);\r\n }\r\n\r\n /** @hidden */\r\n public _uploadDataToTextureDirectly(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0, babylonInternalFormat?: number, useTextureWidthAndHeight = false): void {\r\n var gl = this._gl;\r\n\r\n var textureType = this._getWebGLTextureType(texture.type);\r\n var format = this._getInternalFormat(texture.format);\r\n var internalFormat = babylonInternalFormat === undefined ? this._getRGBABufferInternalSizedFormat(texture.type, texture.format) : this._getInternalFormat(babylonInternalFormat);\r\n\r\n this._unpackFlipY(texture.invertY);\r\n\r\n var target = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n const lodMaxWidth = Math.round(Math.log(texture.width) * Math.LOG2E);\r\n const lodMaxHeight = Math.round(Math.log(texture.height) * Math.LOG2E);\r\n const width = useTextureWidthAndHeight ? texture.width : Math.pow(2, Math.max(lodMaxWidth - lod, 0));\r\n const height = useTextureWidthAndHeight ? texture.height : Math.pow(2, Math.max(lodMaxHeight - lod, 0));\r\n\r\n gl.texImage2D(target, lod, internalFormat, width, height, 0, format, textureType, imageData);\r\n }\r\n\r\n /**\r\n * Update a portion of an internal texture\r\n * @param texture defines the texture to update\r\n * @param imageData defines the data to store into the texture\r\n * @param xOffset defines the x coordinates of the update rectangle\r\n * @param yOffset defines the y coordinates of the update rectangle\r\n * @param width defines the width of the update rectangle\r\n * @param height defines the height of the update rectangle\r\n * @param faceIndex defines the face index if texture is a cube (0 by default)\r\n * @param lod defines the lod level to update (0 by default)\r\n */\r\n public updateTextureData(texture: InternalTexture, imageData: ArrayBufferView, xOffset: number, yOffset: number, width: number, height: number, faceIndex: number = 0, lod: number = 0): void {\r\n var gl = this._gl;\r\n\r\n var textureType = this._getWebGLTextureType(texture.type);\r\n var format = this._getInternalFormat(texture.format);\r\n\r\n this._unpackFlipY(texture.invertY);\r\n\r\n var target = gl.TEXTURE_2D;\r\n if (texture.isCube) {\r\n target = gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex;\r\n }\r\n\r\n gl.texSubImage2D(target, lod, xOffset, yOffset, width, height, format, textureType, imageData);\r\n }\r\n\r\n /** @hidden */\r\n public _uploadArrayBufferViewToTexture(texture: InternalTexture, imageData: ArrayBufferView, faceIndex: number = 0, lod: number = 0): void {\r\n var gl = this._gl;\r\n var bindTarget = texture.isCube ? gl.TEXTURE_CUBE_MAP : gl.TEXTURE_2D;\r\n\r\n this._bindTextureDirectly(bindTarget, texture, true);\r\n\r\n this._uploadDataToTextureDirectly(texture, imageData, faceIndex, lod);\r\n\r\n this._bindTextureDirectly(bindTarget, null, true);\r\n }\r\n\r\n protected _prepareWebGLTextureContinuation(texture: InternalTexture, scene: Nullable<ISceneLike>, noMipmap: boolean, isCompressed: boolean, samplingMode: number): void {\r\n var gl = this._gl;\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n var filters = this._getSamplingParameters(samplingMode, !noMipmap);\r\n\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filters.mag);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filters.min);\r\n\r\n if (!noMipmap && !isCompressed) {\r\n gl.generateMipmap(gl.TEXTURE_2D);\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_2D, null);\r\n\r\n // this.resetTextureCache();\r\n if (scene) {\r\n scene._removePendingData(texture);\r\n }\r\n\r\n texture.onLoadedObservable.notifyObservers(texture);\r\n texture.onLoadedObservable.clear();\r\n }\r\n\r\n private _prepareWebGLTexture(texture: InternalTexture, scene: Nullable<ISceneLike>, width: number, height: number, invertY: boolean, noMipmap: boolean, isCompressed: boolean,\r\n processFunction: (width: number, height: number, continuationCallback: () => void) => boolean, samplingMode: number = 3): void {\r\n var maxTextureSize = this.getCaps().maxTextureSize;\r\n var potWidth = Math.min(maxTextureSize, this.needPOTTextures ? ThinEngine.GetExponentOfTwo(width, maxTextureSize) : width);\r\n var potHeight = Math.min(maxTextureSize, this.needPOTTextures ? ThinEngine.GetExponentOfTwo(height, maxTextureSize) : height);\r\n\r\n var gl = this._gl;\r\n if (!gl) {\r\n return;\r\n }\r\n\r\n if (!texture._webGLTexture) {\r\n // this.resetTextureCache();\r\n if (scene) {\r\n scene._removePendingData(texture);\r\n }\r\n\r\n return;\r\n }\r\n\r\n this._bindTextureDirectly(gl.TEXTURE_2D, texture, true);\r\n this._unpackFlipY(invertY === undefined ? true : (invertY ? true : false));\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = potWidth;\r\n texture.height = potHeight;\r\n texture.isReady = true;\r\n\r\n if (processFunction(potWidth, potHeight, () => {\r\n this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode);\r\n })) {\r\n // Returning as texture needs extra async steps\r\n return;\r\n }\r\n\r\n this._prepareWebGLTextureContinuation(texture, scene, noMipmap, isCompressed, samplingMode);\r\n }\r\n\r\n /** @hidden */\r\n public _setupFramebufferDepthAttachments(generateStencilBuffer: boolean, generateDepthBuffer: boolean, width: number, height: number, samples = 1): Nullable<WebGLRenderbuffer> {\r\n var gl = this._gl;\r\n\r\n // Create the depth/stencil buffer\r\n if (generateStencilBuffer && generateDepthBuffer) {\r\n return this._getDepthStencilBuffer(width, height, samples, gl.DEPTH_STENCIL, gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT);\r\n }\r\n if (generateDepthBuffer) {\r\n let depthFormat = gl.DEPTH_COMPONENT16;\r\n if (this._webGLVersion > 1) {\r\n depthFormat = gl.DEPTH_COMPONENT32F;\r\n }\r\n\r\n return this._getDepthStencilBuffer(width, height, samples, depthFormat, depthFormat, gl.DEPTH_ATTACHMENT);\r\n }\r\n if (generateStencilBuffer) {\r\n return this._getDepthStencilBuffer(width, height, samples, gl.STENCIL_INDEX8, gl.STENCIL_INDEX8, gl.STENCIL_ATTACHMENT);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _getDepthStencilBuffer = (width: number, height: number, samples: number, internalFormat: number, msInternalFormat: number, attachment: number) => {\r\n var gl = this._gl;\r\n const depthStencilBuffer = gl.createRenderbuffer();\r\n\r\n gl.bindRenderbuffer(gl.RENDERBUFFER, depthStencilBuffer);\r\n\r\n if (samples > 1 && gl.renderbufferStorageMultisample) {\r\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, samples, msInternalFormat, width, height);\r\n } else {\r\n gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height);\r\n }\r\n\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthStencilBuffer);\r\n\r\n gl.bindRenderbuffer(gl.RENDERBUFFER, null);\r\n\r\n return depthStencilBuffer;\r\n }\r\n\r\n /** @hidden */\r\n public _releaseFramebufferObjects(texture: InternalTexture): void {\r\n var gl = this._gl;\r\n\r\n if (texture._framebuffer) {\r\n gl.deleteFramebuffer(texture._framebuffer);\r\n texture._framebuffer = null;\r\n }\r\n\r\n if (texture._depthStencilBuffer) {\r\n gl.deleteRenderbuffer(texture._depthStencilBuffer);\r\n texture._depthStencilBuffer = null;\r\n }\r\n\r\n if (texture._MSAAFramebuffer) {\r\n gl.deleteFramebuffer(texture._MSAAFramebuffer);\r\n texture._MSAAFramebuffer = null;\r\n }\r\n\r\n if (texture._MSAARenderBuffer) {\r\n gl.deleteRenderbuffer(texture._MSAARenderBuffer);\r\n texture._MSAARenderBuffer = null;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _releaseTexture(texture: InternalTexture): void {\r\n this._releaseFramebufferObjects(texture);\r\n\r\n this._deleteTexture(texture._webGLTexture);\r\n\r\n // Unbind channels\r\n this.unbindAllTextures();\r\n\r\n var index = this._internalTexturesCache.indexOf(texture);\r\n if (index !== -1) {\r\n this._internalTexturesCache.splice(index, 1);\r\n }\r\n\r\n // Integrated fixed lod samplers.\r\n if (texture._lodTextureHigh) {\r\n texture._lodTextureHigh.dispose();\r\n }\r\n if (texture._lodTextureMid) {\r\n texture._lodTextureMid.dispose();\r\n }\r\n if (texture._lodTextureLow) {\r\n texture._lodTextureLow.dispose();\r\n }\r\n\r\n // Integrated irradiance map.\r\n if (texture._irradianceTexture) {\r\n texture._irradianceTexture.dispose();\r\n }\r\n }\r\n\r\n protected _deleteTexture(texture: Nullable<WebGLTexture>): void {\r\n this._gl.deleteTexture(texture);\r\n }\r\n\r\n protected _setProgram(program: WebGLProgram): void {\r\n if (this._currentProgram !== program) {\r\n this._gl.useProgram(program);\r\n this._currentProgram = program;\r\n }\r\n }\r\n\r\n protected _boundUniforms: { [key: number]: WebGLUniformLocation } = {};\r\n\r\n /**\r\n * Binds an effect to the webGL context\r\n * @param effect defines the effect to bind\r\n */\r\n public bindSamplers(effect: Effect): void {\r\n let webGLPipelineContext = effect.getPipelineContext() as WebGLPipelineContext;\r\n this._setProgram(webGLPipelineContext.program!);\r\n var samplers = effect.getSamplers();\r\n for (var index = 0; index < samplers.length; index++) {\r\n var uniform = effect.getUniform(samplers[index]);\r\n\r\n if (uniform) {\r\n this._boundUniforms[index] = uniform;\r\n }\r\n }\r\n this._currentEffect = null;\r\n }\r\n\r\n private _activateCurrentTexture() {\r\n if (this._currentTextureChannel !== this._activeChannel) {\r\n this._gl.activeTexture(this._gl.TEXTURE0 + this._activeChannel);\r\n this._currentTextureChannel = this._activeChannel;\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _bindTextureDirectly(target: number, texture: Nullable<InternalTexture>, forTextureDataUpdate = false, force = false): boolean {\r\n var wasPreviouslyBound = false;\r\n let isTextureForRendering = texture && texture._associatedChannel > -1;\r\n if (forTextureDataUpdate && isTextureForRendering) {\r\n this._activeChannel = texture!._associatedChannel;\r\n }\r\n\r\n let currentTextureBound = this._boundTexturesCache[this._activeChannel];\r\n\r\n if (currentTextureBound !== texture || force) {\r\n this._activateCurrentTexture();\r\n\r\n if (texture && texture.isMultiview) {\r\n this._gl.bindTexture(target, texture ? texture._colorTextureArray : null);\r\n } else {\r\n this._gl.bindTexture(target, texture ? texture._webGLTexture : null);\r\n }\r\n\r\n this._boundTexturesCache[this._activeChannel] = texture;\r\n\r\n if (texture) {\r\n texture._associatedChannel = this._activeChannel;\r\n }\r\n } else if (forTextureDataUpdate) {\r\n wasPreviouslyBound = true;\r\n this._activateCurrentTexture();\r\n }\r\n\r\n if (isTextureForRendering && !forTextureDataUpdate) {\r\n this._bindSamplerUniformToChannel(texture!._associatedChannel, this._activeChannel);\r\n }\r\n\r\n return wasPreviouslyBound;\r\n }\r\n\r\n /** @hidden */\r\n public _bindTexture(channel: number, texture: Nullable<InternalTexture>): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (texture) {\r\n texture._associatedChannel = channel;\r\n }\r\n\r\n this._activeChannel = channel;\r\n const target = texture ? this._getTextureTarget(texture) : this._gl.TEXTURE_2D;\r\n this._bindTextureDirectly(target, texture);\r\n }\r\n\r\n /**\r\n * Unbind all textures from the webGL context\r\n */\r\n public unbindAllTextures(): void {\r\n for (var channel = 0; channel < this._maxSimultaneousTextures; channel++) {\r\n this._activeChannel = channel;\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n if (this.webGLVersion > 1) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_3D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sets a texture to the according uniform.\r\n * @param channel The texture channel\r\n * @param uniform The uniform to set\r\n * @param texture The texture to apply\r\n */\r\n public setTexture(channel: number, uniform: Nullable<WebGLUniformLocation>, texture: Nullable<ThinTexture>): void {\r\n if (channel === undefined) {\r\n return;\r\n }\r\n\r\n if (uniform) {\r\n this._boundUniforms[channel] = uniform;\r\n }\r\n\r\n this._setTexture(channel, texture);\r\n }\r\n\r\n private _bindSamplerUniformToChannel(sourceSlot: number, destination: number) {\r\n let uniform = this._boundUniforms[sourceSlot];\r\n if (!uniform || uniform._currentState === destination) {\r\n return;\r\n }\r\n this._gl.uniform1i(uniform, destination);\r\n uniform._currentState = destination;\r\n }\r\n\r\n private _getTextureWrapMode(mode: number): number {\r\n switch (mode) {\r\n case 1:\r\n return this._gl.REPEAT;\r\n case 0:\r\n return this._gl.CLAMP_TO_EDGE;\r\n case 2:\r\n return this._gl.MIRRORED_REPEAT;\r\n }\r\n return this._gl.REPEAT;\r\n }\r\n\r\n protected _setTexture(channel: number, texture: Nullable<ThinTexture>, isPartOfTextureArray = false, depthStencilTexture = false): boolean {\r\n // Not ready?\r\n if (!texture) {\r\n if (this._boundTexturesCache[channel] != null) {\r\n this._activeChannel = channel;\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_CUBE_MAP, null);\r\n if (this.webGLVersion > 1) {\r\n this._bindTextureDirectly(this._gl.TEXTURE_3D, null);\r\n this._bindTextureDirectly(this._gl.TEXTURE_2D_ARRAY, null);\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n // Video\r\n if ((<VideoTexture>texture).video) {\r\n this._activeChannel = channel;\r\n (<VideoTexture>texture).update();\r\n } else if (texture.delayLoadState === 4) { // Delay loading\r\n texture.delayLoad();\r\n return false;\r\n }\r\n\r\n let internalTexture: InternalTexture;\r\n if (depthStencilTexture) {\r\n internalTexture = (<RenderTargetTexture>texture).depthStencilTexture!;\r\n }\r\n else if (texture.isReady()) {\r\n internalTexture = <InternalTexture>texture.getInternalTexture();\r\n }\r\n else if (texture.isCube) {\r\n internalTexture = this.emptyCubeTexture;\r\n }\r\n else if (texture.is3D) {\r\n internalTexture = this.emptyTexture3D;\r\n }\r\n else if (texture.is2DArray) {\r\n internalTexture = this.emptyTexture2DArray;\r\n }\r\n else {\r\n internalTexture = this.emptyTexture;\r\n }\r\n\r\n if (!isPartOfTextureArray && internalTexture) {\r\n internalTexture._associatedChannel = channel;\r\n }\r\n\r\n let needToBind = true;\r\n if (this._boundTexturesCache[channel] === internalTexture) {\r\n if (!isPartOfTextureArray) {\r\n this._bindSamplerUniformToChannel(internalTexture._associatedChannel, channel);\r\n }\r\n\r\n needToBind = false;\r\n }\r\n\r\n this._activeChannel = channel;\r\n const target = this._getTextureTarget(internalTexture);\r\n if (needToBind) {\r\n this._bindTextureDirectly(target, internalTexture, isPartOfTextureArray);\r\n }\r\n\r\n if (internalTexture && !internalTexture.isMultiview) {\r\n // CUBIC_MODE and SKYBOX_MODE both require CLAMP_TO_EDGE. All other modes use REPEAT.\r\n if (internalTexture.isCube && internalTexture._cachedCoordinatesMode !== texture.coordinatesMode) {\r\n internalTexture._cachedCoordinatesMode = texture.coordinatesMode;\r\n\r\n var textureWrapMode = (texture.coordinatesMode !== 3 && texture.coordinatesMode !== 5) ? 1 : 0;\r\n texture.wrapU = textureWrapMode;\r\n texture.wrapV = textureWrapMode;\r\n }\r\n\r\n if (internalTexture._cachedWrapU !== texture.wrapU) {\r\n internalTexture._cachedWrapU = texture.wrapU;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_S, this._getTextureWrapMode(texture.wrapU), internalTexture);\r\n }\r\n\r\n if (internalTexture._cachedWrapV !== texture.wrapV) {\r\n internalTexture._cachedWrapV = texture.wrapV;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_T, this._getTextureWrapMode(texture.wrapV), internalTexture);\r\n }\r\n\r\n if (internalTexture.is3D && internalTexture._cachedWrapR !== texture.wrapR) {\r\n internalTexture._cachedWrapR = texture.wrapR;\r\n this._setTextureParameterInteger(target, this._gl.TEXTURE_WRAP_R, this._getTextureWrapMode(texture.wrapR), internalTexture);\r\n }\r\n\r\n this._setAnisotropicLevel(target, internalTexture, texture.anisotropicFilteringLevel);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sets an array of texture to the webGL context\r\n * @param channel defines the channel where the texture array must be set\r\n * @param uniform defines the associated uniform location\r\n * @param textures defines the array of textures to bind\r\n */\r\n public setTextureArray(channel: number, uniform: Nullable<WebGLUniformLocation>, textures: ThinTexture[]): void {\r\n if (channel === undefined || !uniform) {\r\n return;\r\n }\r\n\r\n if (!this._textureUnits || this._textureUnits.length !== textures.length) {\r\n this._textureUnits = new Int32Array(textures.length);\r\n }\r\n for (let i = 0; i < textures.length; i++) {\r\n let texture = textures[i].getInternalTexture();\r\n\r\n if (texture) {\r\n this._textureUnits[i] = channel + i;\r\n texture._associatedChannel = channel + i;\r\n } else {\r\n this._textureUnits[i] = -1;\r\n }\r\n }\r\n this._gl.uniform1iv(uniform, this._textureUnits);\r\n\r\n for (var index = 0; index < textures.length; index++) {\r\n this._setTexture(this._textureUnits[index], textures[index], true);\r\n }\r\n }\r\n\r\n /** @hidden */\r\n public _setAnisotropicLevel(target: number, internalTexture: InternalTexture, anisotropicFilteringLevel: number) {\r\n var anisotropicFilterExtension = this._caps.textureAnisotropicFilterExtension;\r\n if (internalTexture.samplingMode !== 11\r\n && internalTexture.samplingMode !== 3\r\n && internalTexture.samplingMode !== 2) {\r\n anisotropicFilteringLevel = 1; // Forcing the anisotropic to 1 because else webgl will force filters to linear\r\n }\r\n\r\n if (anisotropicFilterExtension && internalTexture._cachedAnisotropicFilteringLevel !== anisotropicFilteringLevel) {\r\n this._setTextureParameterFloat(target, anisotropicFilterExtension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(anisotropicFilteringLevel, this._caps.maxAnisotropy), internalTexture);\r\n internalTexture._cachedAnisotropicFilteringLevel = anisotropicFilteringLevel;\r\n }\r\n }\r\n\r\n private _setTextureParameterFloat(target: number, parameter: number, value: number, texture: InternalTexture): void {\r\n this._bindTextureDirectly(target, texture, true, true);\r\n this._gl.texParameterf(target, parameter, value);\r\n }\r\n\r\n private _setTextureParameterInteger(target: number, parameter: number, value: number, texture?: InternalTexture) {\r\n if (texture) {\r\n this._bindTextureDirectly(target, texture, true, true);\r\n }\r\n this._gl.texParameteri(target, parameter, value);\r\n }\r\n\r\n /**\r\n * Unbind all vertex attributes from the webGL context\r\n */\r\n public unbindAllAttributes() {\r\n if (this._mustWipeVertexAttributes) {\r\n this._mustWipeVertexAttributes = false;\r\n\r\n for (var i = 0; i < this._caps.maxVertexAttribs; i++) {\r\n this.disableAttributeByIndex(i);\r\n }\r\n return;\r\n }\r\n\r\n for (var i = 0, ul = this._vertexAttribArraysEnabled.length; i < ul; i++) {\r\n if (i >= this._caps.maxVertexAttribs || !this._vertexAttribArraysEnabled[i]) {\r\n continue;\r\n }\r\n\r\n this.disableAttributeByIndex(i);\r\n }\r\n }\r\n\r\n /**\r\n * Force the engine to release all cached effects. This means that next effect compilation will have to be done completely even if a similar effect was already compiled\r\n */\r\n public releaseEffects() {\r\n for (var name in this._compiledEffects) {\r\n let webGLPipelineContext = this._compiledEffects[name].getPipelineContext() as WebGLPipelineContext;\r\n this._deletePipelineContext(webGLPipelineContext);\r\n }\r\n\r\n this._compiledEffects = {};\r\n }\r\n\r\n /**\r\n * Dispose and release all associated resources\r\n */\r\n public dispose(): void {\r\n this.stopRenderLoop();\r\n\r\n // Clear observables\r\n if (this.onBeforeTextureInitObservable) {\r\n this.onBeforeTextureInitObservable.clear();\r\n }\r\n\r\n // Empty texture\r\n if (this._emptyTexture) {\r\n this._releaseTexture(this._emptyTexture);\r\n this._emptyTexture = null;\r\n }\r\n if (this._emptyCubeTexture) {\r\n this._releaseTexture(this._emptyCubeTexture);\r\n this._emptyCubeTexture = null;\r\n }\r\n\r\n if (this._dummyFramebuffer) {\r\n this._gl.deleteFramebuffer(this._dummyFramebuffer);\r\n }\r\n\r\n // Release effects\r\n this.releaseEffects();\r\n\r\n // Unbind\r\n this.unbindAllAttributes();\r\n this._boundUniforms = [];\r\n\r\n // Events\r\n if (DomManagement.IsWindowObjectExist()) {\r\n if (this._renderingCanvas) {\r\n if (!this._doNotHandleContextLost) {\r\n this._renderingCanvas.removeEventListener(\"webglcontextlost\", this._onContextLost);\r\n this._renderingCanvas.removeEventListener(\"webglcontextrestored\", this._onContextRestored);\r\n }\r\n }\r\n }\r\n\r\n this._workingCanvas = null;\r\n this._workingContext = null;\r\n this._currentBufferPointers = [];\r\n this._renderingCanvas = null;\r\n this._currentProgram = null;\r\n this._boundRenderFunction = null;\r\n\r\n Effect.ResetCache();\r\n\r\n // Abort active requests\r\n for (let request of this._activeRequests) {\r\n request.abort();\r\n }\r\n }\r\n\r\n /**\r\n * Attach a new callback raised when context lost event is fired\r\n * @param callback defines the callback to call\r\n */\r\n public attachContextLostEvent(callback: ((event: WebGLContextEvent) => void)): void {\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.addEventListener(\"webglcontextlost\", <any>callback, false);\r\n }\r\n }\r\n\r\n /**\r\n * Attach a new callback raised when context restored event is fired\r\n * @param callback defines the callback to call\r\n */\r\n public attachContextRestoredEvent(callback: ((event: WebGLContextEvent) => void)): void {\r\n if (this._renderingCanvas) {\r\n this._renderingCanvas.addEventListener(\"webglcontextrestored\", <any>callback, false);\r\n }\r\n }\r\n\r\n /**\r\n * Get the current error code of the webGL context\r\n * @returns the error code\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getError\r\n */\r\n public getError(): number {\r\n return this._gl.getError();\r\n }\r\n\r\n private _canRenderToFloatFramebuffer(): boolean {\r\n if (this._webGLVersion > 1) {\r\n return this._caps.colorBufferFloat;\r\n }\r\n return this._canRenderToFramebuffer(1);\r\n }\r\n\r\n private _canRenderToHalfFloatFramebuffer(): boolean {\r\n if (this._webGLVersion > 1) {\r\n return this._caps.colorBufferFloat;\r\n }\r\n return this._canRenderToFramebuffer(2);\r\n }\r\n\r\n // Thank you : http://stackoverflow.com/questions/28827511/webgl-ios-render-to-floating-point-texture\r\n private _canRenderToFramebuffer(type: number): boolean {\r\n let gl = this._gl;\r\n\r\n //clear existing errors\r\n while (gl.getError() !== gl.NO_ERROR) { }\r\n\r\n let successful = true;\r\n\r\n let texture = gl.createTexture();\r\n gl.bindTexture(gl.TEXTURE_2D, texture);\r\n gl.texImage2D(gl.TEXTURE_2D, 0, this._getRGBABufferInternalSizedFormat(type), 1, 1, 0, gl.RGBA, this._getWebGLTextureType(type), null);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\r\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\r\n\r\n let fb = gl.createFramebuffer();\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, fb);\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\r\n let status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\r\n\r\n successful = successful && (status === gl.FRAMEBUFFER_COMPLETE);\r\n successful = successful && (gl.getError() === gl.NO_ERROR);\r\n\r\n //try render by clearing frame buffer's color buffer\r\n if (successful) {\r\n gl.clear(gl.COLOR_BUFFER_BIT);\r\n successful = successful && (gl.getError() === gl.NO_ERROR);\r\n }\r\n\r\n //try reading from frame to ensure render occurs (just creating the FBO is not sufficient to determine if rendering is supported)\r\n if (successful) {\r\n //in practice it's sufficient to just read from the backbuffer rather than handle potentially issues reading from the texture\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n let readFormat = gl.RGBA;\r\n let readType = gl.UNSIGNED_BYTE;\r\n let buffer = new Uint8Array(4);\r\n gl.readPixels(0, 0, 1, 1, readFormat, readType, buffer);\r\n successful = successful && (gl.getError() === gl.NO_ERROR);\r\n }\r\n\r\n //clean up\r\n gl.deleteTexture(texture);\r\n gl.deleteFramebuffer(fb);\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\r\n\r\n //clear accumulated errors\r\n while (!successful && (gl.getError() !== gl.NO_ERROR)) { }\r\n\r\n return successful;\r\n }\r\n\r\n /** @hidden */\r\n public _getWebGLTextureType(type: number): number {\r\n if (this._webGLVersion === 1) {\r\n switch (type) {\r\n case 1:\r\n return this._gl.FLOAT;\r\n case 2:\r\n return this._gl.HALF_FLOAT_OES;\r\n case 0:\r\n return this._gl.UNSIGNED_BYTE;\r\n case 8:\r\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\r\n case 9:\r\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\r\n case 10:\r\n return this._gl.UNSIGNED_SHORT_5_6_5;\r\n }\r\n return this._gl.UNSIGNED_BYTE;\r\n }\r\n\r\n switch (type) {\r\n case 3:\r\n return this._gl.BYTE;\r\n case 0:\r\n return this._gl.UNSIGNED_BYTE;\r\n case 4:\r\n return this._gl.SHORT;\r\n case 5:\r\n return this._gl.UNSIGNED_SHORT;\r\n case 6:\r\n return this._gl.INT;\r\n case 7: // Refers to UNSIGNED_INT\r\n return this._gl.UNSIGNED_INT;\r\n case 1:\r\n return this._gl.FLOAT;\r\n case 2:\r\n return this._gl.HALF_FLOAT;\r\n case 8:\r\n return this._gl.UNSIGNED_SHORT_4_4_4_4;\r\n case 9:\r\n return this._gl.UNSIGNED_SHORT_5_5_5_1;\r\n case 10:\r\n return this._gl.UNSIGNED_SHORT_5_6_5;\r\n case 11:\r\n return this._gl.UNSIGNED_INT_2_10_10_10_REV;\r\n case 12:\r\n return this._gl.UNSIGNED_INT_24_8;\r\n case 13:\r\n return this._gl.UNSIGNED_INT_10F_11F_11F_REV;\r\n case 14:\r\n return this._gl.UNSIGNED_INT_5_9_9_9_REV;\r\n case 15:\r\n return this._gl.FLOAT_32_UNSIGNED_INT_24_8_REV;\r\n }\r\n\r\n return this._gl.UNSIGNED_BYTE;\r\n }\r\n\r\n /** @hidden */\r\n public _getInternalFormat(format: number): number {\r\n var internalFormat = this._gl.RGBA;\r\n\r\n switch (format) {\r\n case 0:\r\n internalFormat = this._gl.ALPHA;\r\n break;\r\n case 1:\r\n internalFormat = this._gl.LUMINANCE;\r\n break;\r\n case 2:\r\n internalFormat = this._gl.LUMINANCE_ALPHA;\r\n break;\r\n case 6:\r\n internalFormat = this._gl.RED;\r\n break;\r\n case 7:\r\n internalFormat = this._gl.RG;\r\n break;\r\n case 4:\r\n internalFormat = this._gl.RGB;\r\n break;\r\n case 5:\r\n internalFormat = this._gl.RGBA;\r\n break;\r\n }\r\n\r\n if (this._webGLVersion > 1) {\r\n switch (format) {\r\n case 8:\r\n internalFormat = this._gl.RED_INTEGER;\r\n break;\r\n case 9:\r\n internalFormat = this._gl.RG_INTEGER;\r\n break;\r\n case 10:\r\n internalFormat = this._gl.RGB_INTEGER;\r\n break;\r\n case 11:\r\n internalFormat = this._gl.RGBA_INTEGER;\r\n break;\r\n }\r\n }\r\n\r\n return internalFormat;\r\n }\r\n\r\n /** @hidden */\r\n public _getRGBABufferInternalSizedFormat(type: number, format?: number): number {\r\n if (this._webGLVersion === 1) {\r\n if (format !== undefined) {\r\n switch (format) {\r\n case 0:\r\n return this._gl.ALPHA;\r\n case 1:\r\n return this._gl.LUMINANCE;\r\n case 2:\r\n return this._gl.LUMINANCE_ALPHA;\r\n case 4:\r\n return this._gl.RGB;\r\n }\r\n }\r\n return this._gl.RGBA;\r\n }\r\n\r\n switch (type) {\r\n case 3:\r\n switch (format) {\r\n case 6:\r\n return this._gl.R8_SNORM;\r\n case 7:\r\n return this._gl.RG8_SNORM;\r\n case 4:\r\n return this._gl.RGB8_SNORM;\r\n case 8:\r\n return this._gl.R8I;\r\n case 9:\r\n return this._gl.RG8I;\r\n case 10:\r\n return this._gl.RGB8I;\r\n case 11:\r\n return this._gl.RGBA8I;\r\n default:\r\n return this._gl.RGBA8_SNORM;\r\n }\r\n case 0:\r\n switch (format) {\r\n case 6:\r\n return this._gl.R8;\r\n case 7:\r\n return this._gl.RG8;\r\n case 4:\r\n return this._gl.RGB8; // By default. Other possibilities are RGB565, SRGB8.\r\n case 5:\r\n return this._gl.RGBA8; // By default. Other possibilities are RGB5_A1, RGBA4, SRGB8_ALPHA8.\r\n case 8:\r\n return this._gl.R8UI;\r\n case 9:\r\n return this._gl.RG8UI;\r\n case 10:\r\n return this._gl.RGB8UI;\r\n case 11:\r\n return this._gl.RGBA8UI;\r\n case 0:\r\n return this._gl.ALPHA;\r\n case 1:\r\n return this._gl.LUMINANCE;\r\n case 2:\r\n return this._gl.LUMINANCE_ALPHA;\r\n default:\r\n return this._gl.RGBA8;\r\n }\r\n case 4:\r\n switch (format) {\r\n case 8:\r\n return this._gl.R16I;\r\n case 9:\r\n return this._gl.RG16I;\r\n case 10:\r\n return this._gl.RGB16I;\r\n case 11:\r\n return this._gl.RGBA16I;\r\n default:\r\n return this._gl.RGBA16I;\r\n }\r\n case 5:\r\n switch (format) {\r\n case 8:\r\n return this._gl.R16UI;\r\n case 9:\r\n return this._gl.RG16UI;\r\n case 10:\r\n return this._gl.RGB16UI;\r\n case 11:\r\n return this._gl.RGBA16UI;\r\n default:\r\n return this._gl.RGBA16UI;\r\n }\r\n case 6:\r\n switch (format) {\r\n case 8:\r\n return this._gl.R32I;\r\n case 9:\r\n return this._gl.RG32I;\r\n case 10:\r\n return this._gl.RGB32I;\r\n case 11:\r\n return this._gl.RGBA32I;\r\n default:\r\n return this._gl.RGBA32I;\r\n }\r\n case 7: // Refers to UNSIGNED_INT\r\n switch (format) {\r\n case 8:\r\n return this._gl.R32UI;\r\n case 9:\r\n return this._gl.RG32UI;\r\n case 10:\r\n return this._gl.RGB32UI;\r\n case 11:\r\n return this._gl.RGBA32UI;\r\n default:\r\n return this._gl.RGBA32UI;\r\n }\r\n case 1:\r\n switch (format) {\r\n case 6:\r\n return this._gl.R32F; // By default. Other possibility is R16F.\r\n case 7:\r\n return this._gl.RG32F; // By default. Other possibility is RG16F.\r\n case 4:\r\n return this._gl.RGB32F; // By default. Other possibilities are RGB16F, R11F_G11F_B10F, RGB9_E5.\r\n case 5:\r\n return this._gl.RGBA32F; // By default. Other possibility is RGBA16F.\r\n default:\r\n return this._gl.RGBA32F;\r\n }\r\n case 2:\r\n switch (format) {\r\n case 6:\r\n return this._gl.R16F;\r\n case 7:\r\n return this._gl.RG16F;\r\n case 4:\r\n return this._gl.RGB16F; // By default. Other possibilities are R11F_G11F_B10F, RGB9_E5.\r\n case 5:\r\n return this._gl.RGBA16F;\r\n default:\r\n return this._gl.RGBA16F;\r\n }\r\n case 10:\r\n return this._gl.RGB565;\r\n case 13:\r\n return this._gl.R11F_G11F_B10F;\r\n case 14:\r\n return this._gl.RGB9_E5;\r\n case 8:\r\n return this._gl.RGBA4;\r\n case 9:\r\n return this._gl.RGB5_A1;\r\n case 11:\r\n switch (format) {\r\n case 5:\r\n return this._gl.RGB10_A2; // By default. Other possibility is RGB5_A1.\r\n case 11:\r\n return this._gl.RGB10_A2UI;\r\n default:\r\n return this._gl.RGB10_A2;\r\n }\r\n }\r\n\r\n return this._gl.RGBA8;\r\n }\r\n\r\n /** @hidden */\r\n public _getRGBAMultiSampleBufferFormat(type: number): number {\r\n if (type === 1) {\r\n return this._gl.RGBA32F;\r\n }\r\n else if (type === 2) {\r\n return this._gl.RGBA16F;\r\n }\r\n\r\n return this._gl.RGBA8;\r\n }\r\n\r\n /** @hidden */\r\n public _loadFile(url: string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (data: any) => void,\r\n offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: IWebRequest, exception?: any) => void): IFileRequest {\r\n let request = ThinEngine._FileToolsLoadFile(url, onSuccess, onProgress, offlineProvider, useArrayBuffer, onError);\r\n this._activeRequests.push(request);\r\n request.onCompleteObservable.add((request) => {\r\n this._activeRequests.splice(this._activeRequests.indexOf(request), 1);\r\n });\r\n return request;\r\n }\r\n\r\n /**\r\n * Loads a file from a url\r\n * @param url url to load\r\n * @param onSuccess callback called when the file successfully loads\r\n * @param onProgress callback called while file is loading (if the server supports this mode)\r\n * @param offlineProvider defines the offline provider for caching\r\n * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer\r\n * @param onError callback called when the file fails to load\r\n * @returns a file request object\r\n * @hidden\r\n */\r\n public static _FileToolsLoadFile(url: string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (ev: ProgressEvent) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void): IFileRequest {\r\n throw _DevTools.WarnImport(\"FileTools\");\r\n }\r\n\r\n /**\r\n * Reads pixels from the current frame buffer. Please note that this function can be slow\r\n * @param x defines the x coordinate of the rectangle where pixels must be read\r\n * @param y defines the y coordinate of the rectangle where pixels must be read\r\n * @param width defines the width of the rectangle where pixels must be read\r\n * @param height defines the height of the rectangle where pixels must be read\r\n * @param hasAlpha defines whether the output should have alpha or not (defaults to true)\r\n * @returns a Uint8Array containing RGBA colors\r\n */\r\n public readPixels(x: number, y: number, width: number, height: number, hasAlpha = true): Uint8Array {\r\n const numChannels = hasAlpha ? 4 : 3;\r\n const format = hasAlpha ? this._gl.RGBA : this._gl.RGB;\r\n const data = new Uint8Array(height * width * numChannels);\r\n this._gl.readPixels(x, y, width, height, format, this._gl.UNSIGNED_BYTE, data);\r\n return data;\r\n }\r\n\r\n // Statics\r\n\r\n private static _IsSupported: Nullable<boolean> = null;\r\n private static _HasMajorPerformanceCaveat : Nullable<boolean> = null;\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instanciated (ie. if a webGL context can be found)\r\n */\r\n public static get IsSupported(): boolean {\r\n return this.isSupported(); // Backward compat\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instanciated (ie. if a webGL context can be found)\r\n * @returns true if the engine can be created\r\n * @ignorenaming\r\n */\r\n public static isSupported(): boolean {\r\n if (this._HasMajorPerformanceCaveat !== null) {\r\n return !this._HasMajorPerformanceCaveat; // We know it is performant so WebGL is supported\r\n }\r\n\r\n if (this._IsSupported === null) {\r\n try {\r\n var tempcanvas = CanvasGenerator.CreateCanvas(1, 1);\r\n var gl = tempcanvas.getContext(\"webgl\") || (tempcanvas as any).getContext(\"experimental-webgl\");\r\n\r\n this._IsSupported = gl != null && !!window.WebGLRenderingContext;\r\n } catch (e) {\r\n this._IsSupported = false;\r\n }\r\n }\r\n\r\n return this._IsSupported;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if the engine can be instanciated on a performant device (ie. if a webGL context can be found and it does not use a slow implementation)\r\n */\r\n public static get HasMajorPerformanceCaveat(): boolean {\r\n if (this._HasMajorPerformanceCaveat === null) {\r\n try {\r\n var tempcanvas = CanvasGenerator.CreateCanvas(1, 1);\r\n var gl = tempcanvas.getContext(\"webgl\", { failIfMajorPerformanceCaveat: true }) || (tempcanvas as any).getContext(\"experimental-webgl\", { failIfMajorPerformanceCaveat: true });\r\n\r\n this._HasMajorPerformanceCaveat = !gl;\r\n } catch (e) {\r\n this._HasMajorPerformanceCaveat = false;\r\n }\r\n }\r\n\r\n return this._HasMajorPerformanceCaveat;\r\n }\r\n\r\n /**\r\n * Find the next highest power of two.\r\n * @param x Number to start search from.\r\n * @return Next highest power of two.\r\n */\r\n public static CeilingPOT(x: number): number {\r\n x--;\r\n x |= x >> 1;\r\n x |= x >> 2;\r\n x |= x >> 4;\r\n x |= x >> 8;\r\n x |= x >> 16;\r\n x++;\r\n return x;\r\n }\r\n\r\n /**\r\n * Find the next lowest power of two.\r\n * @param x Number to start search from.\r\n * @return Next lowest power of two.\r\n */\r\n public static FloorPOT(x: number): number {\r\n x = x | (x >> 1);\r\n x = x | (x >> 2);\r\n x = x | (x >> 4);\r\n x = x | (x >> 8);\r\n x = x | (x >> 16);\r\n return x - (x >> 1);\r\n }\r\n\r\n /**\r\n * Find the nearest power of two.\r\n * @param x Number to start search from.\r\n * @return Next nearest power of two.\r\n */\r\n public static NearestPOT(x: number): number {\r\n var c = ThinEngine.CeilingPOT(x);\r\n var f = ThinEngine.FloorPOT(x);\r\n return (c - x) > (x - f) ? f : c;\r\n }\r\n\r\n /**\r\n * Get the closest exponent of two\r\n * @param value defines the value to approximate\r\n * @param max defines the maximum value to return\r\n * @param mode defines how to define the closest value\r\n * @returns closest exponent of two of the given value\r\n */\r\n public static GetExponentOfTwo(value: number, max: number, mode = 2): number {\r\n let pot;\r\n\r\n switch (mode) {\r\n case 1:\r\n pot = ThinEngine.FloorPOT(value);\r\n break;\r\n case 2:\r\n pot = ThinEngine.NearestPOT(value);\r\n break;\r\n case 3:\r\n default:\r\n pot = ThinEngine.CeilingPOT(value);\r\n break;\r\n }\r\n\r\n return Math.min(pot, max);\r\n }\r\n\r\n /**\r\n * Queue a new function into the requested animation frame pool (ie. this function will be executed byt the browser for the next frame)\r\n * @param func - the function to be called\r\n * @param requester - the object that will request the next frame. Falls back to window.\r\n * @returns frame number\r\n */\r\n public static QueueNewFrame(func: () => void, requester?: any): number {\r\n if (!DomManagement.IsWindowObjectExist()) {\r\n if (typeof requestAnimationFrame !== \"undefined\") {\r\n return requestAnimationFrame(func);\r\n }\r\n\r\n return setTimeout(func, 16);\r\n }\r\n\r\n if (!requester) {\r\n requester = window;\r\n }\r\n\r\n if (requester.requestPostAnimationFrame) {\r\n return requester.requestPostAnimationFrame(func);\r\n }\r\n else if (requester.requestAnimationFrame) {\r\n return requester.requestAnimationFrame(func);\r\n }\r\n else if (requester.msRequestAnimationFrame) {\r\n return requester.msRequestAnimationFrame(func);\r\n }\r\n else if (requester.webkitRequestAnimationFrame) {\r\n return requester.webkitRequestAnimationFrame(func);\r\n }\r\n else if (requester.mozRequestAnimationFrame) {\r\n return requester.mozRequestAnimationFrame(func);\r\n }\r\n else if (requester.oRequestAnimationFrame) {\r\n return requester.oRequestAnimationFrame(func);\r\n }\r\n else {\r\n return window.setTimeout(func, 16);\r\n }\r\n }\r\n\r\n /**\r\n * Gets host document\r\n * @returns the host document object\r\n */\r\n public getHostDocument(): Nullable<Document> {\r\n if (this._renderingCanvas && this._renderingCanvas.ownerDocument) {\r\n return this._renderingCanvas.ownerDocument;\r\n }\r\n\r\n return document;\r\n }\r\n}\r\n"]}