@babylonjs/core 8.6.0 → 8.6.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.
Files changed (119) hide show
  1. package/Collisions/gpuPicker.d.ts +1 -0
  2. package/Collisions/gpuPicker.js +14 -9
  3. package/Collisions/gpuPicker.js.map +1 -1
  4. package/Engines/abstractEngine.js +2 -2
  5. package/Engines/abstractEngine.js.map +1 -1
  6. package/Engines/constants.d.ts +12 -0
  7. package/Engines/constants.js +12 -0
  8. package/Engines/constants.js.map +1 -1
  9. package/Engines/webgpuEngine.js +5 -0
  10. package/Engines/webgpuEngine.js.map +1 -1
  11. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.d.ts +6 -0
  12. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.js +4 -1
  13. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.js.map +1 -1
  14. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.d.ts +5 -0
  15. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +23 -0
  16. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  17. package/Materials/Node/Blocks/PBR/reflectionBlock.js +6 -0
  18. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  19. package/Materials/PBR/pbrBaseMaterial.d.ts +24 -4
  20. package/Materials/PBR/pbrBaseMaterial.js +83 -8
  21. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  22. package/Materials/PBR/pbrMaterial.d.ts +17 -1
  23. package/Materials/PBR/pbrMaterial.js +21 -0
  24. package/Materials/PBR/pbrMaterial.js.map +1 -1
  25. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +5 -0
  26. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
  27. package/Materials/Textures/baseTexture.d.ts +8 -0
  28. package/Materials/Textures/baseTexture.js +7 -0
  29. package/Materials/Textures/baseTexture.js.map +1 -1
  30. package/Materials/materialFlags.d.ts +6 -0
  31. package/Materials/materialFlags.js +14 -0
  32. package/Materials/materialFlags.js.map +1 -1
  33. package/Misc/assetsManager.js +13 -23
  34. package/Misc/assetsManager.js.map +1 -1
  35. package/Misc/minMaxReducer.d.ts +1 -0
  36. package/Misc/minMaxReducer.js +3 -2
  37. package/Misc/minMaxReducer.js.map +1 -1
  38. package/Offline/database.js +25 -6
  39. package/Offline/database.js.map +1 -1
  40. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +1 -1
  41. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  42. package/Rendering/iblCdfGenerator.d.ts +12 -0
  43. package/Rendering/iblCdfGenerator.js +67 -3
  44. package/Rendering/iblCdfGenerator.js.map +1 -1
  45. package/Rendering/iblCdfGeneratorSceneComponent.js +4 -0
  46. package/Rendering/iblCdfGeneratorSceneComponent.js.map +1 -1
  47. package/Rendering/index.d.ts +2 -0
  48. package/Rendering/index.js +2 -0
  49. package/Rendering/index.js.map +1 -1
  50. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +29 -9
  51. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  52. package/Shaders/ShadersInclude/lightFragment.js +4 -3
  53. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  54. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +21 -0
  55. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  56. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +2 -2
  57. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  58. package/Shaders/ShadersInclude/pbrBlockReflection.js +22 -1
  59. package/Shaders/ShadersInclude/pbrBlockReflection.js.map +1 -1
  60. package/Shaders/ShadersInclude/pbrBlockReflectivity.js +11 -2
  61. package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  62. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +1 -1
  63. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  64. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +16 -3
  65. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  66. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +4 -4
  67. package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  68. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +8 -2
  69. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  70. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +2 -1
  71. package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  72. package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
  73. package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  74. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +6 -2
  75. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  76. package/Shaders/hdrIrradianceFiltering.fragment.js +1 -1
  77. package/Shaders/hdrIrradianceFiltering.fragment.js.map +1 -1
  78. package/Shaders/iblDominantDirection.fragment.d.ts +9 -0
  79. package/Shaders/iblDominantDirection.fragment.js +22 -0
  80. package/Shaders/iblDominantDirection.fragment.js.map +1 -0
  81. package/Shaders/pbr.fragment.js +17 -3
  82. package/Shaders/pbr.fragment.js.map +1 -1
  83. package/Shaders/pbr.vertex.js +8 -2
  84. package/Shaders/pbr.vertex.js.map +1 -1
  85. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +28 -8
  86. package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  87. package/ShadersWGSL/ShadersInclude/lightFragment.js +6 -5
  88. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  89. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +21 -0
  90. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  91. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js +2 -2
  92. package/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  93. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js +23 -1
  94. package/ShadersWGSL/ShadersInclude/pbrBlockReflection.js.map +1 -1
  95. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +11 -1
  96. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  97. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +1 -1
  98. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  99. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +19 -3
  100. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  101. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +4 -1
  102. package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
  103. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +2 -1
  104. package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
  105. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
  106. package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  107. package/ShadersWGSL/hdrIrradianceFiltering.fragment.js +1 -1
  108. package/ShadersWGSL/hdrIrradianceFiltering.fragment.js.map +1 -1
  109. package/ShadersWGSL/iblDominantDirection.fragment.d.ts +9 -0
  110. package/ShadersWGSL/iblDominantDirection.fragment.js +22 -0
  111. package/ShadersWGSL/iblDominantDirection.fragment.js.map +1 -0
  112. package/ShadersWGSL/minmaxRedux.fragment.d.ts +5 -0
  113. package/ShadersWGSL/minmaxRedux.fragment.js +32 -0
  114. package/ShadersWGSL/minmaxRedux.fragment.js.map +1 -0
  115. package/ShadersWGSL/pbr.fragment.js +19 -5
  116. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  117. package/ShadersWGSL/pbr.vertex.js +8 -2
  118. package/ShadersWGSL/pbr.vertex.js.map +1 -1
  119. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../../dev/core/src/Offline/database.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { GetTGAHeader } from \"../Misc/tga\";\r\nimport type { IOfflineProvider } from \"./IOfflineProvider\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n// Sets the default offline provider to Babylon.js\r\nAbstractEngine.OfflineProviderFactory = (urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck = false) => {\r\n return new Database(urlToScene, callbackManifestChecked, disableManifestCheck);\r\n};\r\n\r\n/**\r\n * Class used to enable access to IndexedDB\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeCached\r\n */\r\nexport class Database implements IOfflineProvider {\r\n private _currentSceneUrl: string;\r\n private _db: Nullable<IDBDatabase>;\r\n private _enableSceneOffline: boolean;\r\n private _enableTexturesOffline: boolean;\r\n private _manifestVersionFound: number;\r\n private _mustUpdateRessources: boolean;\r\n private _hasReachedQuota: boolean;\r\n private _isSupported: boolean;\r\n\r\n // Handling various flavors of prefixed version of IndexedDB\r\n private _idbFactory = <IDBFactory>(typeof indexedDB !== \"undefined\" ? indexedDB : undefined);\r\n\r\n /** Gets a boolean indicating if the user agent supports blob storage (this value will be updated after creating the first Database object) */\r\n private static _IsUaSupportingBlobStorage = true;\r\n\r\n /**\r\n * Gets a boolean indicating if Database storage is enabled (off by default)\r\n */\r\n static IDBStorageEnabled = false;\r\n\r\n /**\r\n * Gets a boolean indicating if scene must be saved in the database\r\n */\r\n public get enableSceneOffline(): boolean {\r\n return this._enableSceneOffline;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if textures must be saved in the database\r\n */\r\n public get enableTexturesOffline(): boolean {\r\n return this._enableTexturesOffline;\r\n }\r\n\r\n /**\r\n * Creates a new Database\r\n * @param urlToScene defines the url to load the scene\r\n * @param callbackManifestChecked defines the callback to use when manifest is checked\r\n * @param disableManifestCheck defines a boolean indicating that we want to skip the manifest validation (it will be considered validated and up to date)\r\n */\r\n constructor(urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck = false) {\r\n this._currentSceneUrl = Database._ReturnFullUrlLocation(urlToScene);\r\n this._db = null;\r\n this._enableSceneOffline = false;\r\n this._enableTexturesOffline = false;\r\n this._manifestVersionFound = 0;\r\n this._mustUpdateRessources = false;\r\n this._hasReachedQuota = false;\r\n\r\n if (!Database.IDBStorageEnabled) {\r\n callbackManifestChecked(true);\r\n } else {\r\n if (disableManifestCheck) {\r\n this._enableSceneOffline = true;\r\n this._enableTexturesOffline = true;\r\n this._manifestVersionFound = 1;\r\n Tools.SetImmediate(() => {\r\n callbackManifestChecked(true);\r\n });\r\n } else {\r\n this._checkManifestFile(callbackManifestChecked);\r\n }\r\n }\r\n }\r\n\r\n private static _ParseURL = (url: string) => {\r\n const a = document.createElement(\"a\");\r\n a.href = url;\r\n const urlWithoutHash = url.substring(0, url.lastIndexOf(\"#\"));\r\n const fileName = url.substring(urlWithoutHash.lastIndexOf(\"/\") + 1, url.length);\r\n const absLocation = url.substring(0, url.indexOf(fileName, 0));\r\n return absLocation;\r\n };\r\n\r\n private static _ReturnFullUrlLocation = (url: string): string => {\r\n if (url.indexOf(\"http:/\") === -1 && url.indexOf(\"https:/\") === -1 && typeof window !== \"undefined\") {\r\n return Database._ParseURL(window.location.href) + url;\r\n } else {\r\n return url;\r\n }\r\n };\r\n\r\n private _checkManifestFile(callbackManifestChecked: (checked: boolean) => any) {\r\n const noManifestFile = () => {\r\n this._enableSceneOffline = false;\r\n this._enableTexturesOffline = false;\r\n callbackManifestChecked(false);\r\n };\r\n\r\n const createManifestURL = (): string => {\r\n try {\r\n // make sure we have a valid URL.\r\n if (typeof URL === \"function\" && this._currentSceneUrl.indexOf(\"http\") === 0) {\r\n // we don't have the base url, so the URL string must have a protocol\r\n const url = new URL(this._currentSceneUrl);\r\n url.pathname += \".manifest\";\r\n return url.toString();\r\n }\r\n } catch (e) {\r\n // defensive - if this fails for any reason, fall back to the older method\r\n }\r\n\r\n return `${this._currentSceneUrl}.manifest`;\r\n };\r\n\r\n let timeStampUsed = false;\r\n let manifestURL = createManifestURL();\r\n\r\n const xhr = new WebRequest();\r\n\r\n if (navigator.onLine) {\r\n // Adding a timestamp to by-pass browsers' cache\r\n timeStampUsed = true;\r\n manifestURL = manifestURL + (manifestURL.match(/\\?/) == null ? \"?\" : \"&\") + Date.now();\r\n }\r\n xhr.open(\"GET\", manifestURL);\r\n\r\n xhr.addEventListener(\r\n \"load\",\r\n () => {\r\n if (xhr.status === 200 || Database._ValidateXHRData(xhr, 1)) {\r\n try {\r\n const manifestFile = JSON.parse(xhr.response);\r\n this._enableSceneOffline = manifestFile.enableSceneOffline;\r\n this._enableTexturesOffline = manifestFile.enableTexturesOffline && Database._IsUaSupportingBlobStorage;\r\n if (manifestFile.version && !isNaN(parseInt(manifestFile.version))) {\r\n this._manifestVersionFound = manifestFile.version;\r\n }\r\n callbackManifestChecked(true);\r\n } catch (ex) {\r\n noManifestFile();\r\n }\r\n } else {\r\n noManifestFile();\r\n }\r\n },\r\n false\r\n );\r\n\r\n xhr.addEventListener(\r\n \"error\",\r\n () => {\r\n if (timeStampUsed) {\r\n timeStampUsed = false;\r\n // Let's retry without the timeStamp\r\n // It could fail when coupled with HTML5 Offline API\r\n const retryManifestURL = createManifestURL();\r\n xhr.open(\"GET\", retryManifestURL);\r\n xhr.send();\r\n } else {\r\n noManifestFile();\r\n }\r\n },\r\n false\r\n );\r\n\r\n try {\r\n xhr.send();\r\n } catch (ex) {\r\n Logger.Error(\"Error on XHR send request.\");\r\n callbackManifestChecked(false);\r\n }\r\n }\r\n\r\n /**\r\n * Open the database and make it available\r\n * @param successCallback defines the callback to call on success\r\n * @param errorCallback defines the callback to call on error\r\n */\r\n public open(successCallback: () => void, errorCallback: () => void): void {\r\n const handleError = () => {\r\n this._isSupported = false;\r\n if (errorCallback) {\r\n errorCallback();\r\n }\r\n };\r\n\r\n if (!this._idbFactory || !(this._enableSceneOffline || this._enableTexturesOffline)) {\r\n // Your browser doesn't support IndexedDB\r\n this._isSupported = false;\r\n if (errorCallback) {\r\n errorCallback();\r\n }\r\n } else {\r\n // If the DB hasn't been opened or created yet\r\n if (!this._db) {\r\n this._hasReachedQuota = false;\r\n this._isSupported = true;\r\n\r\n const request: IDBOpenDBRequest = this._idbFactory.open(\"babylonjs\", 1);\r\n\r\n // Could occur if user is blocking the quota for the DB and/or doesn't grant access to IndexedDB\r\n request.onerror = () => {\r\n handleError();\r\n };\r\n\r\n // executes when a version change transaction cannot complete due to other active transactions\r\n request.onblocked = () => {\r\n Logger.Error(\"IDB request blocked. Please reload the page.\");\r\n handleError();\r\n };\r\n\r\n // DB has been opened successfully\r\n request.onsuccess = () => {\r\n this._db = request.result;\r\n successCallback();\r\n };\r\n\r\n // Initialization of the DB. Creating Scenes & Textures stores\r\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\r\n this._db = (<any>event.target).result;\r\n if (this._db) {\r\n try {\r\n this._db.createObjectStore(\"scenes\", { keyPath: \"sceneUrl\" });\r\n this._db.createObjectStore(\"versions\", { keyPath: \"sceneUrl\" });\r\n this._db.createObjectStore(\"textures\", { keyPath: \"textureUrl\" });\r\n } catch (ex) {\r\n Logger.Error(\"Error while creating object stores. Exception: \" + ex.message);\r\n handleError();\r\n }\r\n }\r\n };\r\n }\r\n // DB has already been created and opened\r\n else {\r\n if (successCallback) {\r\n successCallback();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Loads an image from the database\r\n * @param url defines the url to load from\r\n * @param image defines the target DOM image\r\n */\r\n public loadImage(url: string, image: HTMLImageElement) {\r\n const completeURL = Database._ReturnFullUrlLocation(url);\r\n\r\n const saveAndLoadImage = () => {\r\n if (!this._hasReachedQuota && this._db !== null) {\r\n // the texture is not yet in the DB, let's try to save it\r\n this._saveImageIntoDB(completeURL, image);\r\n }\r\n // If the texture is not in the DB and we've reached the DB quota limit\r\n // let's load it directly from the web\r\n else {\r\n image.src = url;\r\n }\r\n };\r\n\r\n if (!this._mustUpdateRessources) {\r\n this._loadImageFromDB(completeURL, image, saveAndLoadImage);\r\n }\r\n // First time we're download the images or update requested in the manifest file by a version change\r\n else {\r\n saveAndLoadImage();\r\n }\r\n }\r\n\r\n private _loadImageFromDB(url: string, image: HTMLImageElement, notInDBCallback: () => any) {\r\n if (this._isSupported && this._db !== null) {\r\n let texture: any;\r\n const transaction: IDBTransaction = this._db.transaction([\"textures\"]);\r\n\r\n transaction.onabort = () => {\r\n image.src = url;\r\n };\r\n\r\n transaction.oncomplete = () => {\r\n let blobTextureURL: string;\r\n if (texture && typeof URL === \"function\") {\r\n blobTextureURL = URL.createObjectURL(texture.data);\r\n image.onerror = () => {\r\n Logger.Error(\"Error loading image from blob URL: \" + blobTextureURL + \" switching back to web url: \" + url);\r\n image.src = url;\r\n };\r\n image.src = blobTextureURL;\r\n } else {\r\n notInDBCallback();\r\n }\r\n };\r\n\r\n const getRequest: IDBRequest = transaction.objectStore(\"textures\").get(url);\r\n\r\n getRequest.onsuccess = (event) => {\r\n texture = (<any>event.target).result;\r\n };\r\n getRequest.onerror = () => {\r\n Logger.Error(\"Error loading texture \" + url + \" from DB.\");\r\n image.src = url;\r\n };\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or BabylonJS Database is not open.\");\r\n image.src = url;\r\n }\r\n }\r\n\r\n private _saveImageIntoDB(url: string, image: HTMLImageElement) {\r\n let blob: Blob;\r\n\r\n if (this._isSupported) {\r\n // In case of error (type not supported or quota exceeded), we're at least sending back XHR data to allow texture loading later on\r\n const generateBlobUrl = () => {\r\n let blobTextureURL;\r\n\r\n if (blob && typeof URL === \"function\") {\r\n try {\r\n blobTextureURL = URL.createObjectURL(blob);\r\n } catch (ex) {\r\n // Chrome is raising a type error if we're setting the oneTimeOnly parameter\r\n blobTextureURL = URL.createObjectURL(blob);\r\n }\r\n }\r\n\r\n if (blobTextureURL) {\r\n image.src = blobTextureURL;\r\n }\r\n };\r\n\r\n if (Database._IsUaSupportingBlobStorage) {\r\n // Create XHR\r\n const xhr = new WebRequest();\r\n\r\n xhr.open(\"GET\", url);\r\n xhr.responseType = \"blob\";\r\n\r\n xhr.addEventListener(\r\n \"load\",\r\n () => {\r\n if (xhr.status === 200 && this._db) {\r\n // Blob as response\r\n blob = xhr.response;\r\n\r\n const transaction = this._db.transaction([\"textures\"], \"readwrite\");\r\n\r\n // the transaction could abort because of a QuotaExceededError error\r\n transaction.onabort = (event) => {\r\n try {\r\n //backwards compatibility with ts 1.0, srcElement doesn't have an \"error\" according to ts 1.3\r\n const srcElement = <any>event.target;\r\n const error = srcElement.error;\r\n if (error && error.name === \"QuotaExceededError\") {\r\n this._hasReachedQuota = true;\r\n }\r\n } catch (ex) {}\r\n generateBlobUrl();\r\n };\r\n\r\n transaction.oncomplete = () => {\r\n generateBlobUrl();\r\n };\r\n\r\n const newTexture = { textureUrl: url, data: blob };\r\n\r\n try {\r\n // Put the blob into the dabase\r\n const addRequest = transaction.objectStore(\"textures\").put(newTexture);\r\n addRequest.onsuccess = () => {};\r\n addRequest.onerror = () => {\r\n generateBlobUrl();\r\n };\r\n } catch (ex) {\r\n // \"DataCloneError\" generated by Chrome when you try to inject blob into IndexedDB\r\n if (ex.code === 25) {\r\n Database._IsUaSupportingBlobStorage = false;\r\n this._enableTexturesOffline = false;\r\n }\r\n image.src = url;\r\n }\r\n } else {\r\n image.src = url;\r\n }\r\n },\r\n false\r\n );\r\n\r\n xhr.addEventListener(\r\n \"error\",\r\n () => {\r\n Logger.Error(\"Error in XHR request in BABYLON.Database.\");\r\n image.src = url;\r\n },\r\n false\r\n );\r\n\r\n xhr.send();\r\n } else {\r\n image.src = url;\r\n }\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or Babylon.js database is not open.\");\r\n image.src = url;\r\n }\r\n }\r\n\r\n private _checkVersionFromDB(url: string, versionLoaded: (version: number) => void) {\r\n const updateVersion = () => {\r\n // the version is not yet in the DB or we need to update it\r\n this._saveVersionIntoDB(url, versionLoaded);\r\n };\r\n this._loadVersionFromDB(url, versionLoaded, updateVersion);\r\n }\r\n\r\n private _loadVersionFromDB(url: string, callback: (version: number) => void, updateInDBCallback: () => void) {\r\n if (this._isSupported && this._db) {\r\n let version: any;\r\n try {\r\n const transaction = this._db.transaction([\"versions\"]);\r\n\r\n transaction.oncomplete = () => {\r\n if (version) {\r\n // If the version in the JSON file is different from the version in DB\r\n if (this._manifestVersionFound !== version.data) {\r\n this._mustUpdateRessources = true;\r\n updateInDBCallback();\r\n } else {\r\n callback(version.data);\r\n }\r\n }\r\n // version was not found in DB\r\n else {\r\n this._mustUpdateRessources = true;\r\n updateInDBCallback();\r\n }\r\n };\r\n\r\n transaction.onabort = () => {\r\n callback(-1);\r\n };\r\n\r\n const getRequest = transaction.objectStore(\"versions\").get(url);\r\n\r\n getRequest.onsuccess = (event) => {\r\n version = (<any>event.target).result;\r\n };\r\n getRequest.onerror = () => {\r\n Logger.Error(\"Error loading version for scene \" + url + \" from DB.\");\r\n callback(-1);\r\n };\r\n } catch (ex) {\r\n Logger.Error(\"Error while accessing 'versions' object store (READ OP). Exception: \" + ex.message);\r\n callback(-1);\r\n }\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or Babylon.js database is not open.\");\r\n callback(-1);\r\n }\r\n }\r\n\r\n private _saveVersionIntoDB(url: string, callback: (version: number) => void) {\r\n if (this._isSupported && !this._hasReachedQuota && this._db) {\r\n try {\r\n // Open a transaction to the database\r\n const transaction = this._db.transaction([\"versions\"], \"readwrite\");\r\n\r\n // the transaction could abort because of a QuotaExceededError error\r\n transaction.onabort = (event) => {\r\n try {\r\n //backwards compatibility with ts 1.0, srcElement doesn't have an \"error\" according to ts 1.3\r\n const error = (<any>event.target)[\"error\"];\r\n if (error && error.name === \"QuotaExceededError\") {\r\n this._hasReachedQuota = true;\r\n }\r\n } catch (ex) {}\r\n callback(-1);\r\n };\r\n\r\n transaction.oncomplete = () => {\r\n callback(this._manifestVersionFound);\r\n };\r\n\r\n const newVersion = { sceneUrl: url, data: this._manifestVersionFound };\r\n\r\n // Put the scene into the database\r\n const addRequest = transaction.objectStore(\"versions\").put(newVersion);\r\n addRequest.onsuccess = () => {};\r\n addRequest.onerror = () => {\r\n Logger.Error(\"Error in DB add version request in BABYLON.Database.\");\r\n };\r\n } catch (ex) {\r\n Logger.Error(\"Error while accessing 'versions' object store (WRITE OP). Exception: \" + ex.message);\r\n callback(-1);\r\n }\r\n } else {\r\n callback(-1);\r\n }\r\n }\r\n\r\n /**\r\n * Loads a file from database\r\n * @param url defines the URL to load from\r\n * @param sceneLoaded defines a callback to call on success\r\n * @param progressCallBack defines a callback to call when progress changed\r\n * @param errorCallback defines a callback to call on error\r\n * @param useArrayBuffer defines a boolean to use array buffer instead of text string\r\n */\r\n public loadFile(url: string, sceneLoaded: (data: any) => void, progressCallBack?: (data: any) => void, errorCallback?: () => void, useArrayBuffer?: boolean): void {\r\n const completeUrl = Database._ReturnFullUrlLocation(url);\r\n\r\n const saveAndLoadFile = () => {\r\n // the scene is not yet in the DB, let's try to save it\r\n this._saveFile(completeUrl, sceneLoaded, progressCallBack, useArrayBuffer, errorCallback);\r\n };\r\n\r\n this._checkVersionFromDB(completeUrl, (version) => {\r\n if (version !== -1) {\r\n if (!this._mustUpdateRessources) {\r\n this._loadFile(completeUrl, sceneLoaded, saveAndLoadFile, progressCallBack);\r\n } else {\r\n this._saveFile(completeUrl, sceneLoaded, progressCallBack, useArrayBuffer, errorCallback);\r\n }\r\n } else {\r\n if (errorCallback) {\r\n errorCallback();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _loadFile(url: string, callback: (data?: any) => void, notInDBCallback: () => void, progressCallBack?: (data: any) => void) {\r\n if (this._isSupported && this._db) {\r\n let targetStore: string;\r\n if (url.indexOf(\".babylon\") !== -1) {\r\n targetStore = \"scenes\";\r\n } else {\r\n targetStore = \"textures\";\r\n }\r\n\r\n let file: any;\r\n const transaction = this._db.transaction([targetStore]);\r\n\r\n transaction.oncomplete = () => {\r\n if (file) {\r\n if (progressCallBack) {\r\n const numberToLoad = file.data?.byteLength || 0;\r\n progressCallBack({\r\n total: numberToLoad,\r\n loaded: numberToLoad,\r\n lengthComputable: true,\r\n });\r\n }\r\n callback(file.data);\r\n }\r\n // file was not found in DB\r\n else {\r\n notInDBCallback();\r\n }\r\n };\r\n\r\n transaction.onabort = () => {\r\n notInDBCallback();\r\n };\r\n\r\n const getRequest = transaction.objectStore(targetStore).get(url);\r\n\r\n getRequest.onsuccess = (event) => {\r\n file = (<any>event.target).result;\r\n };\r\n getRequest.onerror = () => {\r\n Logger.Error(\"Error loading file \" + url + \" from DB.\");\r\n notInDBCallback();\r\n };\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or BabylonJS Database is not open.\");\r\n callback();\r\n }\r\n }\r\n\r\n private _saveFile(\r\n url: string,\r\n callback: (data?: any) => void,\r\n progressCallback?: (this: XMLHttpRequestEventTarget, ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n errorCallback?: (data?: any) => void\r\n ) {\r\n if (this._isSupported) {\r\n let targetStore: string;\r\n if (url.indexOf(\".babylon\") !== -1) {\r\n targetStore = \"scenes\";\r\n } else {\r\n targetStore = \"textures\";\r\n }\r\n\r\n // Create XHR\r\n const xhr = new WebRequest();\r\n let fileData: any;\r\n xhr.open(\"GET\", url + (url.match(/\\?/) == null ? \"?\" : \"&\") + Date.now());\r\n\r\n if (useArrayBuffer) {\r\n xhr.responseType = \"arraybuffer\";\r\n }\r\n\r\n if (progressCallback) {\r\n xhr.onprogress = progressCallback;\r\n }\r\n\r\n xhr.addEventListener(\r\n \"load\",\r\n () => {\r\n if (xhr.status === 200 || (xhr.status < 400 && Database._ValidateXHRData(xhr, !useArrayBuffer ? 1 : 6))) {\r\n // Blob as response\r\n fileData = !useArrayBuffer ? xhr.responseText : xhr.response;\r\n\r\n if (!this._hasReachedQuota && this._db) {\r\n // Open a transaction to the database\r\n const transaction = this._db.transaction([targetStore], \"readwrite\");\r\n\r\n // the transaction could abort because of a QuotaExceededError error\r\n transaction.onabort = (event) => {\r\n try {\r\n //backwards compatibility with ts 1.0, srcElement doesn't have an \"error\" according to ts 1.3\r\n const error = (<any>event.target)[\"error\"];\r\n if (error && error.name === \"QuotaExceededError\") {\r\n this._hasReachedQuota = true;\r\n }\r\n } catch (ex) {}\r\n callback(fileData);\r\n };\r\n\r\n transaction.oncomplete = () => {\r\n callback(fileData);\r\n };\r\n\r\n let newFile;\r\n if (targetStore === \"scenes\") {\r\n newFile = { sceneUrl: url, data: fileData, version: this._manifestVersionFound };\r\n } else {\r\n newFile = { textureUrl: url, data: fileData };\r\n }\r\n\r\n try {\r\n // Put the scene into the database\r\n const addRequest = transaction.objectStore(targetStore).put(newFile);\r\n addRequest.onsuccess = () => {};\r\n addRequest.onerror = () => {\r\n Logger.Error(\"Error in DB add file request in BABYLON.Database.\");\r\n };\r\n } catch (ex) {\r\n callback(fileData);\r\n }\r\n } else {\r\n callback(fileData);\r\n }\r\n } else {\r\n if (xhr.status >= 400 && errorCallback) {\r\n errorCallback(xhr);\r\n } else {\r\n callback();\r\n }\r\n }\r\n },\r\n false\r\n );\r\n\r\n xhr.addEventListener(\r\n \"error\",\r\n () => {\r\n Logger.Error(\"error on XHR request.\");\r\n errorCallback && errorCallback();\r\n },\r\n false\r\n );\r\n\r\n xhr.send();\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or Babylon.js database is not open.\");\r\n errorCallback && errorCallback();\r\n }\r\n }\r\n\r\n /**\r\n * Validates if xhr data is correct\r\n * @param xhr defines the request to validate\r\n * @param dataType defines the expected data type\r\n * @returns true if data is correct\r\n */\r\n private static _ValidateXHRData(xhr: WebRequest, dataType = 7): boolean {\r\n // 1 for text (.babylon, manifest and shaders), 2 for TGA, 4 for DDS, 7 for all\r\n\r\n try {\r\n if (dataType & 1) {\r\n if (xhr.responseText && xhr.responseText.length > 0) {\r\n return true;\r\n } else if (dataType === 1) {\r\n return false;\r\n }\r\n }\r\n\r\n if (dataType & 2) {\r\n // Check header width and height since there is no \"TGA\" magic number\r\n const tgaHeader = GetTGAHeader(xhr.response);\r\n\r\n if (tgaHeader.width && tgaHeader.height && tgaHeader.width > 0 && tgaHeader.height > 0) {\r\n return true;\r\n } else if (dataType === 2) {\r\n return false;\r\n }\r\n }\r\n\r\n if (dataType & 4) {\r\n // Check for the \"DDS\" magic number\r\n const ddsHeader = new Uint8Array(xhr.response, 0, 3);\r\n\r\n if (ddsHeader[0] === 68 && ddsHeader[1] === 68 && ddsHeader[2] === 83) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n } catch (e) {\r\n // Global protection\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../../dev/core/src/Offline/database.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Tools } from \"../Misc/tools\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { GetTGAHeader } from \"../Misc/tga\";\r\nimport type { IOfflineProvider } from \"./IOfflineProvider\";\r\nimport { WebRequest } from \"../Misc/webRequest\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n// Sets the default offline provider to Babylon.js\r\nAbstractEngine.OfflineProviderFactory = (urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck = false) => {\r\n return new Database(urlToScene, callbackManifestChecked, disableManifestCheck);\r\n};\r\n\r\n/**\r\n * Class used to enable access to IndexedDB\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeCached\r\n */\r\nexport class Database implements IOfflineProvider {\r\n private _currentSceneUrl: string;\r\n private _db: Nullable<IDBDatabase>;\r\n private _enableSceneOffline: boolean;\r\n private _enableTexturesOffline: boolean;\r\n private _manifestVersionFound: number;\r\n private _mustUpdateRessources: boolean;\r\n private _hasReachedQuota: boolean;\r\n private _isSupported: boolean;\r\n\r\n // Handling various flavors of prefixed version of IndexedDB\r\n private _idbFactory = <IDBFactory>(typeof indexedDB !== \"undefined\" ? indexedDB : undefined);\r\n\r\n /** Gets a boolean indicating if the user agent supports blob storage (this value will be updated after creating the first Database object) */\r\n private static _IsUaSupportingBlobStorage = true;\r\n\r\n /**\r\n * Gets a boolean indicating if Database storage is enabled (off by default)\r\n */\r\n static IDBStorageEnabled = false;\r\n\r\n /**\r\n * Gets a boolean indicating if scene must be saved in the database\r\n */\r\n public get enableSceneOffline(): boolean {\r\n return this._enableSceneOffline;\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating if textures must be saved in the database\r\n */\r\n public get enableTexturesOffline(): boolean {\r\n return this._enableTexturesOffline;\r\n }\r\n\r\n /**\r\n * Creates a new Database\r\n * @param urlToScene defines the url to load the scene\r\n * @param callbackManifestChecked defines the callback to use when manifest is checked\r\n * @param disableManifestCheck defines a boolean indicating that we want to skip the manifest validation (it will be considered validated and up to date)\r\n */\r\n constructor(urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck = false) {\r\n this._currentSceneUrl = Database._ReturnFullUrlLocation(urlToScene);\r\n this._db = null;\r\n this._enableSceneOffline = false;\r\n this._enableTexturesOffline = false;\r\n this._manifestVersionFound = 0;\r\n this._mustUpdateRessources = false;\r\n this._hasReachedQuota = false;\r\n\r\n if (!Database.IDBStorageEnabled) {\r\n callbackManifestChecked(true);\r\n } else {\r\n if (disableManifestCheck) {\r\n this._enableSceneOffline = true;\r\n this._enableTexturesOffline = true;\r\n this._manifestVersionFound = 1;\r\n Tools.SetImmediate(() => {\r\n callbackManifestChecked(true);\r\n });\r\n } else {\r\n this._checkManifestFile(callbackManifestChecked);\r\n }\r\n }\r\n }\r\n\r\n private static _ParseURL = (url: string) => {\r\n const a = document.createElement(\"a\");\r\n a.href = url;\r\n const urlWithoutHash = url.substring(0, url.lastIndexOf(\"#\"));\r\n const fileName = url.substring(urlWithoutHash.lastIndexOf(\"/\") + 1, url.length);\r\n const absLocation = url.substring(0, url.indexOf(fileName, 0));\r\n return absLocation;\r\n };\r\n\r\n private static _ReturnFullUrlLocation = (url: string): string => {\r\n if (url.indexOf(\"http:/\") === -1 && url.indexOf(\"https:/\") === -1 && typeof window !== \"undefined\") {\r\n return Database._ParseURL(window.location.href) + url;\r\n } else {\r\n return url;\r\n }\r\n };\r\n\r\n private _checkManifestFile(callbackManifestChecked: (checked: boolean) => any) {\r\n const noManifestFile = () => {\r\n this._enableSceneOffline = false;\r\n this._enableTexturesOffline = false;\r\n callbackManifestChecked(false);\r\n };\r\n\r\n const createManifestURL = (): string => {\r\n try {\r\n // make sure we have a valid URL.\r\n if (typeof URL === \"function\" && this._currentSceneUrl.indexOf(\"http\") === 0) {\r\n // we don't have the base url, so the URL string must have a protocol\r\n const url = new URL(this._currentSceneUrl);\r\n url.pathname += \".manifest\";\r\n return url.toString();\r\n }\r\n } catch (e) {\r\n // defensive - if this fails for any reason, fall back to the older method\r\n }\r\n\r\n return `${this._currentSceneUrl}.manifest`;\r\n };\r\n\r\n let timeStampUsed = false;\r\n let manifestURL = createManifestURL();\r\n\r\n const xhr = new WebRequest();\r\n\r\n if (navigator.onLine) {\r\n // Adding a timestamp to by-pass browsers' cache\r\n timeStampUsed = true;\r\n manifestURL = manifestURL + (manifestURL.match(/\\?/) == null ? \"?\" : \"&\") + Date.now();\r\n }\r\n xhr.open(\"GET\", manifestURL);\r\n\r\n xhr.addEventListener(\r\n \"load\",\r\n () => {\r\n if (xhr.status === 200 || Database._ValidateXHRData(xhr, 1)) {\r\n try {\r\n const manifestFile = JSON.parse(xhr.response);\r\n this._enableSceneOffline = manifestFile.enableSceneOffline;\r\n this._enableTexturesOffline = manifestFile.enableTexturesOffline && Database._IsUaSupportingBlobStorage;\r\n if (manifestFile.version && !isNaN(parseInt(manifestFile.version))) {\r\n this._manifestVersionFound = manifestFile.version;\r\n }\r\n callbackManifestChecked(true);\r\n } catch (ex) {\r\n noManifestFile();\r\n }\r\n } else {\r\n noManifestFile();\r\n }\r\n },\r\n false\r\n );\r\n\r\n xhr.addEventListener(\r\n \"error\",\r\n () => {\r\n if (timeStampUsed) {\r\n timeStampUsed = false;\r\n // Let's retry without the timeStamp\r\n // It could fail when coupled with HTML5 Offline API\r\n const retryManifestURL = createManifestURL();\r\n xhr.open(\"GET\", retryManifestURL);\r\n xhr.send();\r\n } else {\r\n noManifestFile();\r\n }\r\n },\r\n false\r\n );\r\n\r\n try {\r\n xhr.send();\r\n } catch (ex) {\r\n Logger.Error(\"Error on XHR send request.\");\r\n callbackManifestChecked(false);\r\n }\r\n }\r\n\r\n /**\r\n * Open the database and make it available\r\n * @param successCallback defines the callback to call on success\r\n * @param errorCallback defines the callback to call on error\r\n */\r\n public open(successCallback: () => void, errorCallback: () => void): void {\r\n const handleError = () => {\r\n this._isSupported = false;\r\n if (errorCallback) {\r\n errorCallback();\r\n }\r\n };\r\n\r\n if (!this._idbFactory || !(this._enableSceneOffline || this._enableTexturesOffline)) {\r\n // Your browser doesn't support IndexedDB\r\n this._isSupported = false;\r\n if (errorCallback) {\r\n errorCallback();\r\n }\r\n } else {\r\n // If the DB hasn't been opened or created yet\r\n if (!this._db) {\r\n this._hasReachedQuota = false;\r\n this._isSupported = true;\r\n\r\n const request: IDBOpenDBRequest = this._idbFactory.open(\"babylonjs\", 1);\r\n\r\n // Could occur if user is blocking the quota for the DB and/or doesn't grant access to IndexedDB\r\n request.onerror = () => {\r\n handleError();\r\n };\r\n\r\n // executes when a version change transaction cannot complete due to other active transactions\r\n request.onblocked = () => {\r\n Logger.Error(\"IDB request blocked. Please reload the page.\");\r\n handleError();\r\n };\r\n\r\n // DB has been opened successfully\r\n request.onsuccess = () => {\r\n this._db = request.result;\r\n successCallback();\r\n };\r\n\r\n // Initialization of the DB. Creating Scenes & Textures stores\r\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\r\n this._db = (<any>event.target).result;\r\n if (this._db) {\r\n try {\r\n this._db.createObjectStore(\"scenes\", { keyPath: \"sceneUrl\" });\r\n this._db.createObjectStore(\"versions\", { keyPath: \"sceneUrl\" });\r\n this._db.createObjectStore(\"textures\", { keyPath: \"textureUrl\" });\r\n } catch (ex) {\r\n Logger.Error(\"Error while creating object stores. Exception: \" + ex.message);\r\n handleError();\r\n }\r\n }\r\n };\r\n }\r\n // DB has already been created and opened\r\n else {\r\n if (successCallback) {\r\n successCallback();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Loads an image from the database\r\n * @param url defines the url to load from\r\n * @param image defines the target DOM image\r\n */\r\n public loadImage(url: string, image: HTMLImageElement) {\r\n const completeURL = Database._ReturnFullUrlLocation(url);\r\n\r\n const saveAndLoadImage = () => {\r\n if (!this._hasReachedQuota && this._db !== null) {\r\n // the texture is not yet in the DB, let's try to save it\r\n this._saveImageIntoDB(completeURL, image);\r\n }\r\n // If the texture is not in the DB and we've reached the DB quota limit\r\n // let's load it directly from the web\r\n else {\r\n image.src = url;\r\n }\r\n };\r\n\r\n if (!this._mustUpdateRessources) {\r\n this._loadImageFromDB(completeURL, image, saveAndLoadImage);\r\n }\r\n // First time we're download the images or update requested in the manifest file by a version change\r\n else {\r\n saveAndLoadImage();\r\n }\r\n }\r\n\r\n private _loadImageFromDB(url: string, image: HTMLImageElement, notInDBCallback: () => any) {\r\n if (this._isSupported && this._db !== null) {\r\n let texture: any;\r\n const transaction: IDBTransaction = this._db.transaction([\"textures\"]);\r\n\r\n transaction.onabort = () => {\r\n image.src = url;\r\n };\r\n\r\n transaction.oncomplete = () => {\r\n let blobTextureURL: string;\r\n if (texture && typeof URL === \"function\") {\r\n // check if data is an array buffer and create a Blob if it is\r\n let data = texture.data;\r\n if (texture.data instanceof ArrayBuffer) {\r\n const blob = new Blob([texture.data], { type: \"image/png\" });\r\n data = blob;\r\n }\r\n blobTextureURL = URL.createObjectURL(data);\r\n image.onerror = () => {\r\n Logger.Error(\"Error loading image from blob URL: \" + blobTextureURL + \" switching back to web url: \" + url);\r\n image.src = url;\r\n };\r\n image.src = blobTextureURL;\r\n } else {\r\n notInDBCallback();\r\n }\r\n };\r\n\r\n const getRequest: IDBRequest = transaction.objectStore(\"textures\").get(url);\r\n\r\n getRequest.onsuccess = (event) => {\r\n texture = (<any>event.target).result;\r\n };\r\n getRequest.onerror = () => {\r\n Logger.Error(\"Error loading texture \" + url + \" from DB.\");\r\n image.src = url;\r\n };\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or BabylonJS Database is not open.\");\r\n image.src = url;\r\n }\r\n }\r\n\r\n private _saveImageIntoDB(url: string, image: HTMLImageElement) {\r\n let blob: Blob;\r\n\r\n if (this._isSupported) {\r\n // In case of error (type not supported or quota exceeded), we're at least sending back XHR data to allow texture loading later on\r\n const generateBlobUrl = () => {\r\n let blobTextureURL;\r\n\r\n if (blob && typeof URL === \"function\") {\r\n try {\r\n blobTextureURL = URL.createObjectURL(blob);\r\n } catch (ex) {\r\n // Chrome is raising a type error if we're setting the oneTimeOnly parameter\r\n blobTextureURL = URL.createObjectURL(blob);\r\n }\r\n }\r\n\r\n if (blobTextureURL) {\r\n image.src = blobTextureURL;\r\n }\r\n };\r\n\r\n if (Database._IsUaSupportingBlobStorage) {\r\n // Create XHR\r\n const xhr = new WebRequest();\r\n\r\n xhr.open(\"GET\", url);\r\n xhr.responseType = \"blob\";\r\n\r\n xhr.addEventListener(\r\n \"load\",\r\n () => {\r\n if (xhr.status === 200 && this._db) {\r\n // Blob as response\r\n blob = xhr.response;\r\n\r\n const transaction = this._db.transaction([\"textures\"], \"readwrite\");\r\n\r\n // the transaction could abort because of a QuotaExceededError error\r\n transaction.onabort = (event) => {\r\n try {\r\n //backwards compatibility with ts 1.0, srcElement doesn't have an \"error\" according to ts 1.3\r\n const srcElement = <any>event.target;\r\n const error = srcElement.error;\r\n if (error && error.name === \"QuotaExceededError\") {\r\n this._hasReachedQuota = true;\r\n }\r\n } catch (ex) {}\r\n generateBlobUrl();\r\n };\r\n\r\n transaction.oncomplete = () => {\r\n generateBlobUrl();\r\n };\r\n\r\n const newTexture = { textureUrl: url, data: blob };\r\n\r\n try {\r\n // Put the blob into the dabase\r\n const addRequest = transaction.objectStore(\"textures\").put(newTexture);\r\n addRequest.onsuccess = () => {};\r\n addRequest.onerror = () => {\r\n generateBlobUrl();\r\n };\r\n } catch (ex) {\r\n // \"DataCloneError\" generated by Chrome when you try to inject blob into IndexedDB\r\n if (ex.code === 25) {\r\n Database._IsUaSupportingBlobStorage = false;\r\n this._enableTexturesOffline = false;\r\n }\r\n image.src = url;\r\n }\r\n } else {\r\n image.src = url;\r\n }\r\n },\r\n false\r\n );\r\n\r\n xhr.addEventListener(\r\n \"error\",\r\n () => {\r\n Logger.Error(\"Error in XHR request in BABYLON.Database.\");\r\n image.src = url;\r\n },\r\n false\r\n );\r\n\r\n xhr.send();\r\n } else {\r\n image.src = url;\r\n }\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or Babylon.js database is not open.\");\r\n image.src = url;\r\n }\r\n }\r\n\r\n private _checkVersionFromDB(url: string, versionLoaded: (version: number) => void) {\r\n const updateVersion = () => {\r\n // the version is not yet in the DB or we need to update it\r\n this._saveVersionIntoDB(url, versionLoaded);\r\n };\r\n this._loadVersionFromDB(url, versionLoaded, updateVersion);\r\n }\r\n\r\n private _loadVersionFromDB(url: string, callback: (version: number) => void, updateInDBCallback: () => void) {\r\n if (this._isSupported && this._db) {\r\n let version: any;\r\n try {\r\n const transaction = this._db.transaction([\"versions\"]);\r\n\r\n transaction.oncomplete = () => {\r\n if (version) {\r\n // If the version in the JSON file is different from the version in DB\r\n if (this._manifestVersionFound !== version.data) {\r\n this._mustUpdateRessources = true;\r\n updateInDBCallback();\r\n } else {\r\n callback(version.data);\r\n }\r\n }\r\n // version was not found in DB\r\n else {\r\n this._mustUpdateRessources = true;\r\n updateInDBCallback();\r\n }\r\n };\r\n\r\n transaction.onabort = () => {\r\n callback(-1);\r\n };\r\n\r\n const getRequest = transaction.objectStore(\"versions\").get(url);\r\n\r\n getRequest.onsuccess = (event) => {\r\n version = (<any>event.target).result;\r\n };\r\n getRequest.onerror = () => {\r\n Logger.Error(\"Error loading version for scene \" + url + \" from DB.\");\r\n callback(-1);\r\n };\r\n } catch (ex) {\r\n Logger.Error(\"Error while accessing 'versions' object store (READ OP). Exception: \" + ex.message);\r\n callback(-1);\r\n }\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or Babylon.js database is not open.\");\r\n callback(-1);\r\n }\r\n }\r\n\r\n private _saveVersionIntoDB(url: string, callback: (version: number) => void) {\r\n if (this._isSupported && !this._hasReachedQuota && this._db) {\r\n try {\r\n // Open a transaction to the database\r\n const transaction = this._db.transaction([\"versions\"], \"readwrite\");\r\n\r\n // the transaction could abort because of a QuotaExceededError error\r\n transaction.onabort = (event) => {\r\n try {\r\n //backwards compatibility with ts 1.0, srcElement doesn't have an \"error\" according to ts 1.3\r\n const error = (<any>event.target)[\"error\"];\r\n if (error && error.name === \"QuotaExceededError\") {\r\n this._hasReachedQuota = true;\r\n }\r\n } catch (ex) {}\r\n callback(-1);\r\n };\r\n\r\n transaction.oncomplete = () => {\r\n callback(this._manifestVersionFound);\r\n };\r\n\r\n const newVersion = { sceneUrl: url, data: this._manifestVersionFound };\r\n\r\n // Put the scene into the database\r\n const addRequest = transaction.objectStore(\"versions\").put(newVersion);\r\n addRequest.onsuccess = () => {};\r\n addRequest.onerror = () => {\r\n Logger.Error(\"Error in DB add version request in BABYLON.Database.\");\r\n };\r\n } catch (ex) {\r\n Logger.Error(\"Error while accessing 'versions' object store (WRITE OP). Exception: \" + ex.message);\r\n callback(-1);\r\n }\r\n } else {\r\n callback(-1);\r\n }\r\n }\r\n\r\n /**\r\n * Loads a file from database\r\n * @param url defines the URL to load from\r\n * @param sceneLoaded defines a callback to call on success\r\n * @param progressCallBack defines a callback to call when progress changed\r\n * @param errorCallback defines a callback to call on error\r\n * @param useArrayBuffer defines a boolean to use array buffer instead of text string\r\n */\r\n public loadFile(url: string, sceneLoaded: (data: any) => void, progressCallBack?: (data: any) => void, errorCallback?: () => void, useArrayBuffer?: boolean): void {\r\n const completeUrl = Database._ReturnFullUrlLocation(url);\r\n\r\n const saveAndLoadFile = () => {\r\n // the scene is not yet in the DB, let's try to save it\r\n this._saveFile(completeUrl, sceneLoaded, progressCallBack, useArrayBuffer, errorCallback);\r\n };\r\n\r\n this._checkVersionFromDB(completeUrl, (version) => {\r\n if (version !== -1) {\r\n if (!this._mustUpdateRessources) {\r\n this._loadFile(completeUrl, sceneLoaded, saveAndLoadFile, progressCallBack);\r\n } else {\r\n this._saveFile(completeUrl, sceneLoaded, progressCallBack, useArrayBuffer, errorCallback);\r\n }\r\n } else {\r\n if (errorCallback) {\r\n errorCallback();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _loadFile(url: string, callback: (data?: any) => void, notInDBCallback: () => void, progressCallBack?: (data: any) => void) {\r\n if (this._isSupported && this._db) {\r\n let targetStore: string;\r\n if (url.split(\"?\")[0].endsWith(\".babylon\")) {\r\n targetStore = \"scenes\";\r\n } else {\r\n targetStore = \"textures\";\r\n }\r\n\r\n let file: any;\r\n const transaction = this._db.transaction([targetStore]);\r\n\r\n transaction.oncomplete = () => {\r\n function loadArrayBuffer(arrayBuffer: ArrayBuffer) {\r\n if (progressCallBack) {\r\n const numberToLoad = arrayBuffer.byteLength || 0;\r\n progressCallBack({\r\n total: numberToLoad,\r\n loaded: numberToLoad,\r\n lengthComputable: true,\r\n });\r\n }\r\n callback(arrayBuffer);\r\n }\r\n if (file) {\r\n // check if data is a Blob, and get the array Data from the blob if it is\r\n if (file.data instanceof Blob) {\r\n const reader = new FileReader();\r\n reader.onload = (ev) => {\r\n loadArrayBuffer(ev.target?.result as ArrayBuffer);\r\n };\r\n reader.readAsArrayBuffer(file.data);\r\n } else {\r\n loadArrayBuffer(file.data);\r\n }\r\n }\r\n // file was not found in DB\r\n else {\r\n notInDBCallback();\r\n }\r\n };\r\n\r\n transaction.onabort = () => {\r\n notInDBCallback();\r\n };\r\n\r\n const getRequest = transaction.objectStore(targetStore).get(url);\r\n\r\n getRequest.onsuccess = (event) => {\r\n file = (<any>event.target).result;\r\n };\r\n getRequest.onerror = () => {\r\n Logger.Error(\"Error loading file \" + url + \" from DB.\");\r\n notInDBCallback();\r\n };\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or BabylonJS Database is not open.\");\r\n callback();\r\n }\r\n }\r\n\r\n private _saveFile(\r\n url: string,\r\n callback: (data?: any) => void,\r\n progressCallback?: (this: XMLHttpRequestEventTarget, ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n errorCallback?: (data?: any) => void\r\n ) {\r\n if (this._isSupported) {\r\n let targetStore: string;\r\n if (url.split(\"?\")[0].endsWith(\".babylon\")) {\r\n targetStore = \"scenes\";\r\n } else {\r\n targetStore = \"textures\";\r\n }\r\n\r\n // Create XHR\r\n const xhr = new WebRequest();\r\n let fileData: any;\r\n xhr.open(\"GET\", url + (url.match(/\\?/) == null ? \"?\" : \"&\") + Date.now());\r\n\r\n if (useArrayBuffer) {\r\n xhr.responseType = \"arraybuffer\";\r\n }\r\n\r\n if (progressCallback) {\r\n xhr.onprogress = progressCallback;\r\n }\r\n\r\n xhr.addEventListener(\r\n \"load\",\r\n () => {\r\n if (xhr.status === 200 || (xhr.status < 400 && Database._ValidateXHRData(xhr, !useArrayBuffer ? 1 : 6))) {\r\n // Blob as response\r\n fileData = !useArrayBuffer ? xhr.responseText : xhr.response;\r\n\r\n if (!this._hasReachedQuota && this._db) {\r\n // Open a transaction to the database\r\n const transaction = this._db.transaction([targetStore], \"readwrite\");\r\n\r\n // the transaction could abort because of a QuotaExceededError error\r\n transaction.onabort = (event) => {\r\n try {\r\n //backwards compatibility with ts 1.0, srcElement doesn't have an \"error\" according to ts 1.3\r\n const error = (<any>event.target)[\"error\"];\r\n if (error && error.name === \"QuotaExceededError\") {\r\n this._hasReachedQuota = true;\r\n }\r\n } catch (ex) {}\r\n callback(fileData);\r\n };\r\n\r\n transaction.oncomplete = () => {\r\n callback(fileData);\r\n };\r\n\r\n let newFile;\r\n if (targetStore === \"scenes\") {\r\n newFile = { sceneUrl: url, data: fileData, version: this._manifestVersionFound };\r\n } else {\r\n newFile = { textureUrl: url, data: fileData };\r\n }\r\n\r\n try {\r\n // Put the scene into the database\r\n const addRequest = transaction.objectStore(targetStore).put(newFile);\r\n addRequest.onsuccess = () => {};\r\n addRequest.onerror = () => {\r\n Logger.Error(\"Error in DB add file request in BABYLON.Database.\");\r\n };\r\n } catch (ex) {\r\n callback(fileData);\r\n }\r\n } else {\r\n callback(fileData);\r\n }\r\n } else {\r\n if (xhr.status >= 400 && errorCallback) {\r\n errorCallback(xhr);\r\n } else {\r\n callback();\r\n }\r\n }\r\n },\r\n false\r\n );\r\n\r\n xhr.addEventListener(\r\n \"error\",\r\n () => {\r\n Logger.Error(\"error on XHR request.\");\r\n errorCallback && errorCallback();\r\n },\r\n false\r\n );\r\n\r\n xhr.send();\r\n } else {\r\n Logger.Error(\"Error: IndexedDB not supported by your browser or Babylon.js database is not open.\");\r\n errorCallback && errorCallback();\r\n }\r\n }\r\n\r\n /**\r\n * Validates if xhr data is correct\r\n * @param xhr defines the request to validate\r\n * @param dataType defines the expected data type\r\n * @returns true if data is correct\r\n */\r\n private static _ValidateXHRData(xhr: WebRequest, dataType = 7): boolean {\r\n // 1 for text (.babylon, manifest and shaders), 2 for TGA, 4 for DDS, 7 for all\r\n\r\n try {\r\n if (dataType & 1) {\r\n if (xhr.responseText && xhr.responseText.length > 0) {\r\n return true;\r\n } else if (dataType === 1) {\r\n return false;\r\n }\r\n }\r\n\r\n if (dataType & 2) {\r\n // Check header width and height since there is no \"TGA\" magic number\r\n const tgaHeader = GetTGAHeader(xhr.response);\r\n\r\n if (tgaHeader.width && tgaHeader.height && tgaHeader.width > 0 && tgaHeader.height > 0) {\r\n return true;\r\n } else if (dataType === 2) {\r\n return false;\r\n }\r\n }\r\n\r\n if (dataType & 4) {\r\n // Check for the \"DDS\" magic number\r\n const ddsHeader = new Uint8Array(xhr.response, 0, 3);\r\n\r\n if (ddsHeader[0] === 68 && ddsHeader[1] === 68 && ddsHeader[2] === 83) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n } catch (e) {\r\n // Global protection\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"]}
@@ -162,7 +162,7 @@ export class _IblShadowsAccumulationPass {
162
162
  width: this._engine.getRenderWidth(),
163
163
  height: this._engine.getRenderHeight(),
164
164
  }, "iblShadowAccumulation", this._scene, outputTextureOptions);
165
- this._outputTexture.refreshRate = -1;
165
+ this._outputTexture.refreshRate = 1;
166
166
  this._outputTexture.autoClear = false;
167
167
  this._outputTexture.onGeneratedObservable.addOnce(() => {
168
168
  this.onReadyObservable.notifyObservers();
@@ -1 +1 @@
1
- {"version":3,"file":"iblShadowsAccumulationPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Vector4 } from \"../../Maths/math.vector\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"../../Rendering/geometryBufferRenderer\";\r\nimport { ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { EventState } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/**\r\n * This should not be instantiated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsAccumulationPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n\r\n // First, render the accumulation pass with both position buffers, motion buffer, shadow buffer, and the previous accumulation buffer\r\n private _outputTexture: ProceduralTexture;\r\n private _oldAccumulationCopy: ProceduralTexture;\r\n private _oldPositionCopy: ProceduralTexture;\r\n private _accumulationParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Is the effect enabled\r\n */\r\n public enabled: boolean = true;\r\n\r\n /**\r\n * Returns the output texture of the pass.\r\n * @returns The output texture.\r\n */\r\n public getOutputTexture(): ProceduralTexture {\r\n return this._outputTexture;\r\n }\r\n\r\n /**\r\n * Observable that triggers when the accumulation texture is ready\r\n */\r\n public onReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Gets the debug pass post process\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n\r\n private _debugPassName: string = \"Shadow Accumulation Debug Pass\";\r\n\r\n /**\r\n * Gets the name of the debug pass\r\n * @returns The name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public get remanence(): number {\r\n return this._remanence;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public set remanence(value: number) {\r\n this._remanence = value;\r\n }\r\n private _remanence: number = 0.9;\r\n\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public get reset(): boolean {\r\n return this._reset;\r\n }\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public set reset(value: boolean) {\r\n this._reset = value;\r\n }\r\n private _reset: boolean = true;\r\n\r\n /**\r\n * Tell the pass that the camera is moving. This will cause the accumulation\r\n * rate to change.\r\n */\r\n public set isMoving(value: boolean) {\r\n this._isMoving = value;\r\n }\r\n private _isMoving: boolean = false;\r\n\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n if (!this._debugPassPP) {\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTexture(\"debugSampler\", this._outputTexture);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the accumulation pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The accumulation pass\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n const isWebGPU = this._engine.isWebGPU;\r\n\r\n const outputTextureOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/iblShadowAccumulation.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/iblShadowAccumulation.fragment\")]);\r\n }\r\n },\r\n };\r\n this._outputTexture = new ProceduralTexture(\r\n \"shadowAccumulationPass\",\r\n {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n },\r\n \"iblShadowAccumulation\",\r\n this._scene,\r\n outputTextureOptions\r\n );\r\n this._outputTexture.refreshRate = -1;\r\n this._outputTexture.autoClear = false;\r\n this._outputTexture.onGeneratedObservable.addOnce(() => {\r\n this.onReadyObservable.notifyObservers();\r\n });\r\n\r\n // Need to set all the textures first so that the effect gets created with the proper uniforms.\r\n this._setOutputTextureBindings();\r\n\r\n this._renderWhenGBufferReady = this._render.bind(this);\r\n // Don't start rendering until the first vozelization is done.\r\n this._renderPipeline.onVoxelizationCompleteObservable.addOnce(() => {\r\n this._scene.geometryBufferRenderer!.getGBuffer().onAfterRenderObservable.add(this._renderWhenGBufferReady);\r\n });\r\n\r\n // Create the accumulation texture for the previous frame.\r\n // We'll copy the output of the accumulation pass to this texture at the start of every frame.\r\n const accumulationOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldAccumulationCopy = new ProceduralTexture(\r\n \"oldAccumulationRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n accumulationOptions,\r\n false\r\n );\r\n\r\n this._oldAccumulationCopy.autoClear = false;\r\n this._oldAccumulationCopy.refreshRate = 1;\r\n this._oldAccumulationCopy.onBeforeGenerationObservable.add(this._setAccumulationCopyBindings.bind(this));\r\n this._setAccumulationCopyBindings();\r\n\r\n // Create the local position texture for the previous frame.\r\n // We'll copy the previous local position texture to this texture at the start of every frame.\r\n const localPositionOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldPositionCopy = new ProceduralTexture(\r\n \"oldLocalPositionRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n localPositionOptions,\r\n false\r\n );\r\n this._updatePositionCopy();\r\n this._oldPositionCopy.autoClear = false;\r\n this._oldPositionCopy.refreshRate = 1;\r\n this._oldPositionCopy.onBeforeGenerationObservable.add(this._updatePositionCopy.bind(this));\r\n }\r\n\r\n private _setOutputTextureBindings(): boolean {\r\n const remanence = this._isMoving ? this.remanence : 0.99;\r\n this._accumulationParams.set(remanence, this.reset ? 1.0 : 0.0, this._renderPipeline.voxelGridSize, 0.0);\r\n this._outputTexture.setTexture(\"spatialBlurSampler\", this._renderPipeline._getSpatialBlurTexture());\r\n this._outputTexture.setVector4(\"accumulationParameters\", this._accumulationParams);\r\n this._outputTexture.setTexture(\"oldAccumulationSampler\", this._oldAccumulationCopy ? this._oldAccumulationCopy : this._renderPipeline._dummyTexture2d);\r\n this._outputTexture.setTexture(\"prevPositionSampler\", this._oldPositionCopy ? this._oldPositionCopy : this._renderPipeline._dummyTexture2d);\r\n\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (!geometryBufferRenderer) {\r\n return false;\r\n }\r\n const velocityIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"motionSampler\", geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n const wPositionIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"positionSampler\", geometryBufferRenderer.getGBuffer().textures[wPositionIndex]);\r\n\r\n this.reset = false;\r\n this._isMoving = false;\r\n return true;\r\n }\r\n\r\n private _updatePositionCopy() {\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n const index = geometryBufferRenderer!.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._oldPositionCopy.setTexture(\"textureSampler\", geometryBufferRenderer!.getGBuffer().textures[index]);\r\n }\r\n\r\n private _setAccumulationCopyBindings() {\r\n this._oldAccumulationCopy.setTexture(\"textureSampler\", this._outputTexture);\r\n }\r\n\r\n private _render() {\r\n if (this.enabled && this._outputTexture.isReady() && this._outputTexture.getEffect()?.isReady()) {\r\n if (this._setOutputTextureBindings()) {\r\n this._outputTexture.render();\r\n }\r\n }\r\n }\r\n\r\n private _renderWhenGBufferReady: Nullable<(eventData: number, eventState: EventState) => void> = null;\r\n\r\n /**\r\n * Called by render pipeline when canvas resized.\r\n * @param scaleFactor The factor by which to scale the canvas size.\r\n */\r\n public resize(scaleFactor: number = 1.0) {\r\n const newSize = {\r\n width: Math.max(1.0, Math.floor(this._engine.getRenderWidth() * scaleFactor)),\r\n height: Math.max(1.0, Math.floor(this._engine.getRenderHeight() * scaleFactor)),\r\n };\r\n // Don't resize if the size is the same as the current size.\r\n if (this._outputTexture.getSize().width === newSize.width && this._outputTexture.getSize().height === newSize.height) {\r\n return;\r\n }\r\n this._outputTexture.resize(newSize, false);\r\n this._oldAccumulationCopy.resize(newSize, false);\r\n this._oldPositionCopy.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, false);\r\n this.reset = true;\r\n }\r\n\r\n private _disposeTextures() {\r\n this._oldAccumulationCopy.dispose();\r\n this._oldPositionCopy.dispose();\r\n this._outputTexture.dispose();\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._oldAccumulationCopy &&\r\n this._oldAccumulationCopy.isReady() &&\r\n this._oldPositionCopy &&\r\n this._oldPositionCopy.isReady() &&\r\n this._outputTexture.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n if (this._scene.geometryBufferRenderer && this._renderWhenGBufferReady) {\r\n const gBuffer = this._scene.geometryBufferRenderer.getGBuffer();\r\n gBuffer.onAfterRenderObservable.removeCallback(this._renderWhenGBufferReady);\r\n }\r\n this._disposeTextures();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n this.onReadyObservable.clear();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"iblShadowsAccumulationPass.js","sourceRoot":"","sources":["../../../../../dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts"],"names":[],"mappings":"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","sourcesContent":["import { Constants } from \"../../Engines/constants\";\r\nimport type { AbstractEngine } from \"../../Engines/abstractEngine\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Vector4 } from \"../../Maths/math.vector\";\r\nimport { PostProcess } from \"../../PostProcesses/postProcess\";\r\nimport type { PostProcessOptions } from \"../../PostProcesses/postProcess\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { GeometryBufferRenderer } from \"../../Rendering/geometryBufferRenderer\";\r\nimport { ProceduralTexture } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IProceduralTextureCreationOptions } from \"core/Materials/Textures/Procedurals/proceduralTexture\";\r\nimport type { IblShadowsRenderPipeline } from \"./iblShadowsRenderPipeline\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { EventState } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\n\r\n/**\r\n * This should not be instantiated directly, as it is part of a scene component\r\n * @internal\r\n */\r\nexport class _IblShadowsAccumulationPass {\r\n private _scene: Scene;\r\n private _engine: AbstractEngine;\r\n private _renderPipeline: IblShadowsRenderPipeline;\r\n\r\n // First, render the accumulation pass with both position buffers, motion buffer, shadow buffer, and the previous accumulation buffer\r\n private _outputTexture: ProceduralTexture;\r\n private _oldAccumulationCopy: ProceduralTexture;\r\n private _oldPositionCopy: ProceduralTexture;\r\n private _accumulationParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /** Enable the debug view for this pass */\r\n public debugEnabled: boolean = false;\r\n\r\n /**\r\n * Is the effect enabled\r\n */\r\n public enabled: boolean = true;\r\n\r\n /**\r\n * Returns the output texture of the pass.\r\n * @returns The output texture.\r\n */\r\n public getOutputTexture(): ProceduralTexture {\r\n return this._outputTexture;\r\n }\r\n\r\n /**\r\n * Observable that triggers when the accumulation texture is ready\r\n */\r\n public onReadyObservable: Observable<void> = new Observable<void>();\r\n\r\n /**\r\n * Gets the debug pass post process\r\n * @returns The post process\r\n */\r\n public getDebugPassPP(): PostProcess {\r\n if (!this._debugPassPP) {\r\n this._createDebugPass();\r\n }\r\n return this._debugPassPP;\r\n }\r\n\r\n private _debugPassName: string = \"Shadow Accumulation Debug Pass\";\r\n\r\n /**\r\n * Gets the name of the debug pass\r\n * @returns The name of the debug pass\r\n */\r\n public get debugPassName(): string {\r\n return this._debugPassName;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public get remanence(): number {\r\n return this._remanence;\r\n }\r\n\r\n /**\r\n * A value that controls how much of the previous frame's accumulation to keep.\r\n * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.\r\n */\r\n public set remanence(value: number) {\r\n this._remanence = value;\r\n }\r\n private _remanence: number = 0.9;\r\n\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public get reset(): boolean {\r\n return this._reset;\r\n }\r\n /**\r\n * Reset the accumulation.\r\n */\r\n public set reset(value: boolean) {\r\n this._reset = value;\r\n }\r\n private _reset: boolean = true;\r\n\r\n /**\r\n * Tell the pass that the camera is moving. This will cause the accumulation\r\n * rate to change.\r\n */\r\n public set isMoving(value: boolean) {\r\n this._isMoving = value;\r\n }\r\n private _isMoving: boolean = false;\r\n\r\n private _debugPassPP: PostProcess;\r\n private _debugSizeParams: Vector4 = new Vector4(0.0, 0.0, 0.0, 0.0);\r\n\r\n /**\r\n * Sets params that control the position and scaling of the debug display on the screen.\r\n * @param x Screen X offset of the debug display (0-1)\r\n * @param y Screen Y offset of the debug display (0-1)\r\n * @param widthScale X scale of the debug display (0-1)\r\n * @param heightScale Y scale of the debug display (0-1)\r\n */\r\n public setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number) {\r\n this._debugSizeParams.set(x, y, widthScale, heightScale);\r\n }\r\n\r\n /**\r\n * Creates the debug post process effect for this pass\r\n */\r\n private _createDebugPass() {\r\n if (!this._debugPassPP) {\r\n const isWebGPU = this._engine.isWebGPU;\r\n const debugOptions: PostProcessOptions = {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n textureFormat: Constants.TEXTUREFORMAT_RGBA,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n uniforms: [\"sizeParams\"],\r\n samplers: [\"debugSampler\"],\r\n engine: this._engine,\r\n reusable: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializations: (useWebGPU: boolean, list: Promise<any>[]) => {\r\n if (useWebGPU) {\r\n list.push(import(\"../../ShadersWGSL/iblShadowDebug.fragment\"));\r\n } else {\r\n list.push(import(\"../../Shaders/iblShadowDebug.fragment\"));\r\n }\r\n },\r\n };\r\n this._debugPassPP = new PostProcess(this.debugPassName, \"iblShadowDebug\", debugOptions);\r\n this._debugPassPP.autoClear = false;\r\n this._debugPassPP.onApplyObservable.add((effect) => {\r\n // update the caustic texture with what we just rendered.\r\n effect.setTexture(\"debugSampler\", this._outputTexture);\r\n effect.setVector4(\"sizeParams\", this._debugSizeParams);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates the accumulation pass\r\n * @param scene Scene to attach to\r\n * @param iblShadowsRenderPipeline The IBL shadows render pipeline\r\n * @returns The accumulation pass\r\n */\r\n constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline) {\r\n this._scene = scene;\r\n this._engine = scene.getEngine();\r\n this._renderPipeline = iblShadowsRenderPipeline;\r\n this._createTextures();\r\n }\r\n\r\n private _createTextures() {\r\n const isWebGPU = this._engine.isWebGPU;\r\n\r\n const outputTextureOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/iblShadowAccumulation.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/iblShadowAccumulation.fragment\")]);\r\n }\r\n },\r\n };\r\n this._outputTexture = new ProceduralTexture(\r\n \"shadowAccumulationPass\",\r\n {\r\n width: this._engine.getRenderWidth(),\r\n height: this._engine.getRenderHeight(),\r\n },\r\n \"iblShadowAccumulation\",\r\n this._scene,\r\n outputTextureOptions\r\n );\r\n this._outputTexture.refreshRate = 1;\r\n this._outputTexture.autoClear = false;\r\n this._outputTexture.onGeneratedObservable.addOnce(() => {\r\n this.onReadyObservable.notifyObservers();\r\n });\r\n\r\n // Need to set all the textures first so that the effect gets created with the proper uniforms.\r\n this._setOutputTextureBindings();\r\n\r\n this._renderWhenGBufferReady = this._render.bind(this);\r\n // Don't start rendering until the first vozelization is done.\r\n this._renderPipeline.onVoxelizationCompleteObservable.addOnce(() => {\r\n this._scene.geometryBufferRenderer!.getGBuffer().onAfterRenderObservable.add(this._renderWhenGBufferReady);\r\n });\r\n\r\n // Create the accumulation texture for the previous frame.\r\n // We'll copy the output of the accumulation pass to this texture at the start of every frame.\r\n const accumulationOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldAccumulationCopy = new ProceduralTexture(\r\n \"oldAccumulationRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n accumulationOptions,\r\n false\r\n );\r\n\r\n this._oldAccumulationCopy.autoClear = false;\r\n this._oldAccumulationCopy.refreshRate = 1;\r\n this._oldAccumulationCopy.onBeforeGenerationObservable.add(this._setAccumulationCopyBindings.bind(this));\r\n this._setAccumulationCopyBindings();\r\n\r\n // Create the local position texture for the previous frame.\r\n // We'll copy the previous local position texture to this texture at the start of every frame.\r\n const localPositionOptions: IProceduralTextureCreationOptions = {\r\n type: Constants.TEXTURETYPE_HALF_FLOAT,\r\n format: Constants.TEXTUREFORMAT_RGBA,\r\n samplingMode: Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n generateDepthBuffer: false,\r\n generateMipMaps: false,\r\n shaderLanguage: isWebGPU ? ShaderLanguage.WGSL : ShaderLanguage.GLSL,\r\n extraInitializationsAsync: async () => {\r\n if (isWebGPU) {\r\n await Promise.all([import(\"../../ShadersWGSL/pass.fragment\")]);\r\n } else {\r\n await Promise.all([import(\"../../Shaders/pass.fragment\")]);\r\n }\r\n },\r\n };\r\n\r\n this._oldPositionCopy = new ProceduralTexture(\r\n \"oldLocalPositionRT\",\r\n { width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() },\r\n \"pass\",\r\n this._scene,\r\n localPositionOptions,\r\n false\r\n );\r\n this._updatePositionCopy();\r\n this._oldPositionCopy.autoClear = false;\r\n this._oldPositionCopy.refreshRate = 1;\r\n this._oldPositionCopy.onBeforeGenerationObservable.add(this._updatePositionCopy.bind(this));\r\n }\r\n\r\n private _setOutputTextureBindings(): boolean {\r\n const remanence = this._isMoving ? this.remanence : 0.99;\r\n this._accumulationParams.set(remanence, this.reset ? 1.0 : 0.0, this._renderPipeline.voxelGridSize, 0.0);\r\n this._outputTexture.setTexture(\"spatialBlurSampler\", this._renderPipeline._getSpatialBlurTexture());\r\n this._outputTexture.setVector4(\"accumulationParameters\", this._accumulationParams);\r\n this._outputTexture.setTexture(\"oldAccumulationSampler\", this._oldAccumulationCopy ? this._oldAccumulationCopy : this._renderPipeline._dummyTexture2d);\r\n this._outputTexture.setTexture(\"prevPositionSampler\", this._oldPositionCopy ? this._oldPositionCopy : this._renderPipeline._dummyTexture2d);\r\n\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n if (!geometryBufferRenderer) {\r\n return false;\r\n }\r\n const velocityIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"motionSampler\", geometryBufferRenderer.getGBuffer().textures[velocityIndex]);\r\n const wPositionIndex = geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._outputTexture.setTexture(\"positionSampler\", geometryBufferRenderer.getGBuffer().textures[wPositionIndex]);\r\n\r\n this.reset = false;\r\n this._isMoving = false;\r\n return true;\r\n }\r\n\r\n private _updatePositionCopy() {\r\n const geometryBufferRenderer = this._scene.geometryBufferRenderer;\r\n const index = geometryBufferRenderer!.getTextureIndex(GeometryBufferRenderer.POSITION_TEXTURE_TYPE);\r\n this._oldPositionCopy.setTexture(\"textureSampler\", geometryBufferRenderer!.getGBuffer().textures[index]);\r\n }\r\n\r\n private _setAccumulationCopyBindings() {\r\n this._oldAccumulationCopy.setTexture(\"textureSampler\", this._outputTexture);\r\n }\r\n\r\n private _render() {\r\n if (this.enabled && this._outputTexture.isReady() && this._outputTexture.getEffect()?.isReady()) {\r\n if (this._setOutputTextureBindings()) {\r\n this._outputTexture.render();\r\n }\r\n }\r\n }\r\n\r\n private _renderWhenGBufferReady: Nullable<(eventData: number, eventState: EventState) => void> = null;\r\n\r\n /**\r\n * Called by render pipeline when canvas resized.\r\n * @param scaleFactor The factor by which to scale the canvas size.\r\n */\r\n public resize(scaleFactor: number = 1.0) {\r\n const newSize = {\r\n width: Math.max(1.0, Math.floor(this._engine.getRenderWidth() * scaleFactor)),\r\n height: Math.max(1.0, Math.floor(this._engine.getRenderHeight() * scaleFactor)),\r\n };\r\n // Don't resize if the size is the same as the current size.\r\n if (this._outputTexture.getSize().width === newSize.width && this._outputTexture.getSize().height === newSize.height) {\r\n return;\r\n }\r\n this._outputTexture.resize(newSize, false);\r\n this._oldAccumulationCopy.resize(newSize, false);\r\n this._oldPositionCopy.resize({ width: this._engine.getRenderWidth(), height: this._engine.getRenderHeight() }, false);\r\n this.reset = true;\r\n }\r\n\r\n private _disposeTextures() {\r\n this._oldAccumulationCopy.dispose();\r\n this._oldPositionCopy.dispose();\r\n this._outputTexture.dispose();\r\n }\r\n\r\n /**\r\n * Checks if the pass is ready\r\n * @returns true if the pass is ready\r\n */\r\n public isReady() {\r\n return (\r\n this._oldAccumulationCopy &&\r\n this._oldAccumulationCopy.isReady() &&\r\n this._oldPositionCopy &&\r\n this._oldPositionCopy.isReady() &&\r\n this._outputTexture.isReady() &&\r\n !(this._debugPassPP && !this._debugPassPP.isReady())\r\n );\r\n }\r\n\r\n /**\r\n * Disposes the associated resources\r\n */\r\n public dispose() {\r\n if (this._scene.geometryBufferRenderer && this._renderWhenGBufferReady) {\r\n const gBuffer = this._scene.geometryBufferRenderer.getGBuffer();\r\n gBuffer.onAfterRenderObservable.removeCallback(this._renderWhenGBufferReady);\r\n }\r\n this._disposeTextures();\r\n if (this._debugPassPP) {\r\n this._debugPassPP.dispose();\r\n }\r\n this.onReadyObservable.clear();\r\n }\r\n}\r\n"]}
@@ -2,6 +2,7 @@ import type { AbstractEngine } from "../Engines/abstractEngine.js";
2
2
  import type { Scene } from "../scene.js";
3
3
  import { Texture } from "../Materials/Textures/texture.js";
4
4
  import { PostProcess } from "../PostProcesses/postProcess.js";
5
+ import { Vector3 } from "../Maths/math.vector.js";
5
6
  import type { BaseTexture } from "../Materials/Textures/baseTexture.js";
6
7
  import { Observable } from "../Misc/observable.js";
7
8
  import type { Nullable } from "../types.js";
@@ -15,8 +16,14 @@ export declare class IblCdfGenerator {
15
16
  private _cdfxPT;
16
17
  private _icdfPT;
17
18
  private _scaledLuminancePT;
19
+ private _dominantDirectionPT;
18
20
  private _iblSource;
19
21
  private _dummyTexture;
22
+ private _cachedDominantDirection;
23
+ /**
24
+ * Returns whether the CDF renderer is supported by the current engine
25
+ */
26
+ get isSupported(): boolean;
20
27
  /**
21
28
  * Gets the IBL source texture being used by the CDF renderer
22
29
  */
@@ -81,6 +88,11 @@ export declare class IblCdfGenerator {
81
88
  * @returns Promise that resolves when the CDF maps are rendered.
82
89
  */
83
90
  renderWhenReady(): Promise<void>;
91
+ /**
92
+ * Finds the average direction of the highest intensity areas of the IBL source
93
+ * @returns Async promise that resolves to the dominant direction of the IBL source
94
+ */
95
+ findDominantDirection(): Promise<Vector3>;
84
96
  /**
85
97
  * Disposes the CDF renderer and associated resources
86
98
  */
@@ -2,16 +2,27 @@
2
2
  import { Texture } from "../Materials/Textures/texture.js";
3
3
  import { ProceduralTexture } from "../Materials/Textures/Procedurals/proceduralTexture.js";
4
4
  import { PostProcess } from "../PostProcesses/postProcess.js";
5
- import { Vector4 } from "../Maths/math.vector.js";
5
+ import { Vector3, Vector4 } from "../Maths/math.vector.js";
6
6
  import { RawTexture } from "../Materials/Textures/rawTexture.js";
7
7
  import { Observable } from "../Misc/observable.js";
8
8
  import { Engine } from "../Engines/engine.js";
9
9
  import { _WarnImport } from "../Misc/devTools.js";
10
10
  import { EngineStore } from "../Engines/engineStore.js";
11
+ import { Logger } from "../Misc/logger.js";
11
12
  /**
12
13
  * Build cdf maps to be used for IBL importance sampling.
13
14
  */
14
15
  export class IblCdfGenerator {
16
+ /**
17
+ * Returns whether the CDF renderer is supported by the current engine
18
+ */
19
+ get isSupported() {
20
+ const engine = EngineStore.LastCreatedEngine;
21
+ if (!engine) {
22
+ return false;
23
+ }
24
+ return engine.getCaps().texelFetch;
25
+ }
15
26
  /**
16
27
  * Gets the IBL source texture being used by the CDF renderer
17
28
  */
@@ -97,6 +108,7 @@ export class IblCdfGenerator {
97
108
  * @returns The CDF renderer
98
109
  */
99
110
  constructor(sceneOrEngine) {
111
+ this._cachedDominantDirection = null;
100
112
  /** Enable the debug view for this pass */
101
113
  this.debugEnabled = false;
102
114
  this._debugSizeParams = new Vector4(0.0, 0.0, 1.0, 1.0);
@@ -119,6 +131,10 @@ export class IblCdfGenerator {
119
131
  if (this._scene) {
120
132
  this._engine = this._scene.getEngine();
121
133
  }
134
+ if (!this.isSupported) {
135
+ Logger.Warn("CDF renderer is not supported by the current engine.");
136
+ return;
137
+ }
122
138
  const blackPixels = new Uint16Array([0, 0, 0, 255]);
123
139
  this._dummyTexture = new RawTexture(blackPixels, 1, 1, Engine.TEXTUREFORMAT_RGBA, sceneOrEngine, false, false, undefined, 2);
124
140
  if (this._scene) {
@@ -169,10 +185,10 @@ export class IblCdfGenerator {
169
185
  gammaSpace: false,
170
186
  extraInitializationsAsync: async () => {
171
187
  if (isWebGPU) {
172
- await Promise.all([import("../ShadersWGSL/iblIcdf.fragment.js")]);
188
+ await Promise.all([import("../ShadersWGSL/iblIcdf.fragment.js"), import("../ShadersWGSL/iblDominantDirection.fragment.js")]);
173
189
  }
174
190
  else {
175
- await Promise.all([import("../Shaders/iblIcdf.fragment.js")]);
191
+ await Promise.all([import("../Shaders/iblIcdf.fragment.js"), import("../Shaders/iblDominantDirection.fragment.js")]);
176
192
  }
177
193
  },
178
194
  };
@@ -215,12 +231,18 @@ export class IblCdfGenerator {
215
231
  this._icdfPT.onGeneratedObservable.addOnce(() => {
216
232
  this.onGeneratedObservable.notifyObservers();
217
233
  });
234
+ this._dominantDirectionPT = new ProceduralTexture("iblDominantDirection", { width: 1, height: 1 }, "iblDominantDirection", this._scene, icdfOptions, false, false);
235
+ this._dominantDirectionPT.autoClear = false;
236
+ this._dominantDirectionPT.setTexture("icdfSampler", this._icdfPT);
237
+ this._dominantDirectionPT.refreshRate = 0;
238
+ this._dominantDirectionPT.defines = "#define NUM_SAMPLES 32u\n";
218
239
  }
219
240
  _disposeTextures() {
220
241
  this._cdfyPT?.dispose();
221
242
  this._cdfxPT?.dispose();
222
243
  this._icdfPT?.dispose();
223
244
  this._scaledLuminancePT?.dispose();
245
+ this._dominantDirectionPT?.dispose();
224
246
  }
225
247
  _createDebugPass() {
226
248
  if (this._debugPass) {
@@ -285,6 +307,7 @@ export class IblCdfGenerator {
285
307
  */
286
308
  // eslint-disable-next-line @typescript-eslint/naming-convention
287
309
  renderWhenReady() {
310
+ this._cachedDominantDirection = null;
288
311
  // Once the textures are generated, notify that they are ready to use.
289
312
  this._icdfPT.onGeneratedObservable.addOnce(() => {
290
313
  this.onGeneratedObservable.notifyObservers();
@@ -309,6 +332,47 @@ export class IblCdfGenerator {
309
332
  }
310
333
  });
311
334
  }
335
+ /**
336
+ * Finds the average direction of the highest intensity areas of the IBL source
337
+ * @returns Async promise that resolves to the dominant direction of the IBL source
338
+ */
339
+ findDominantDirection() {
340
+ if (this._cachedDominantDirection) {
341
+ return Promise.resolve(this._cachedDominantDirection);
342
+ }
343
+ return new Promise((resolve) => {
344
+ this._dominantDirectionPT.onGeneratedObservable.addOnce(() => {
345
+ const data = new Float32Array(4);
346
+ this._dominantDirectionPT.readPixels(0, 0, data, true).then(() => {
347
+ const dominantDirection = new Vector3(data[0], data[1], data[2]);
348
+ this._cachedDominantDirection = dominantDirection;
349
+ resolve(dominantDirection);
350
+ });
351
+ });
352
+ if (this.isReady()) {
353
+ if (this._dominantDirectionPT.isReady()) {
354
+ this._dominantDirectionPT.render();
355
+ }
356
+ else {
357
+ this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {
358
+ this._dominantDirectionPT.render();
359
+ });
360
+ }
361
+ }
362
+ else {
363
+ this.onGeneratedObservable.addOnce(() => {
364
+ if (this._dominantDirectionPT.isReady()) {
365
+ this._dominantDirectionPT.render();
366
+ }
367
+ else {
368
+ this._dominantDirectionPT.getEffect().executeWhenCompiled(() => {
369
+ this._dominantDirectionPT.render();
370
+ });
371
+ }
372
+ });
373
+ }
374
+ });
375
+ }
312
376
  /**
313
377
  * Disposes the CDF renderer and associated resources
314
378
  */