@babylonjs/core 7.22.3 → 7.22.5
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.
- package/Animations/animationGroup.js +1 -1
- package/Animations/animationGroup.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +21 -1
- package/Engines/constants.js +21 -1
- package/Engines/constants.js.map +1 -1
- package/Engines/engineFeatures.d.ts +2 -0
- package/Engines/engineFeatures.js.map +1 -1
- package/Engines/nativeEngine.js +1 -0
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.js +1 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.js +2 -0
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.d.ts +12 -0
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js +51 -0
- package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/prePassTextureBlock.d.ts +27 -0
- package/Materials/Node/Blocks/Input/prePassTextureBlock.js +69 -0
- package/Materials/Node/Blocks/Input/prePassTextureBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +12 -0
- package/Materials/Node/nodeMaterial.js +24 -0
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +8 -0
- package/Materials/PBR/pbrBaseMaterial.js +8 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.d.ts +4 -0
- package/Materials/Textures/Procedurals/proceduralTexture.js +19 -5
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/effectRenderer.d.ts +4 -0
- package/Materials/effectRenderer.js +10 -10
- package/Materials/effectRenderer.js.map +1 -1
- package/Materials/materialHelper.functions.js +20 -0
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/prePassConfiguration.js +2 -1
- package/Materials/prePassConfiguration.js.map +1 -1
- package/Materials/standardMaterial.d.ts +8 -0
- package/Materials/standardMaterial.js +8 -0
- package/Materials/standardMaterial.js.map +1 -1
- package/Misc/fileTools.js +1 -1
- package/Misc/fileTools.js.map +1 -1
- package/PostProcesses/postProcessManager.d.ts +2 -0
- package/PostProcesses/postProcessManager.js +3 -0
- package/PostProcesses/postProcessManager.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js +79 -8
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +88 -0
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +240 -0
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.d.ts +88 -0
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js +231 -0
- package/Rendering/IBLShadows/iblShadowsImportanceSamplingRenderer.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +340 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +884 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +67 -0
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +139 -0
- package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +168 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +597 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +151 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +291 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -0
- package/Rendering/depthRenderer.js +44 -23
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/index.d.ts +1 -0
- package/Rendering/index.js +1 -0
- package/Rendering/index.js.map +1 -1
- package/Rendering/outlineRenderer.js +3 -3
- package/Rendering/outlineRenderer.js.map +1 -1
- package/Rendering/prePassRenderer.js +25 -1
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/instancesDeclaration.js +4 -2
- package/Shaders/ShadersInclude/instancesDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/instancesVertex.js +8 -4
- package/Shaders/ShadersInclude/instancesVertex.js.map +1 -1
- package/Shaders/ShadersInclude/prePassDeclaration.js +4 -1
- package/Shaders/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/prePassVertex.js +5 -1
- package/Shaders/ShadersInclude/prePassVertex.js.map +1 -1
- package/Shaders/ShadersInclude/prePassVertexDeclaration.js +4 -1
- package/Shaders/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
- package/Shaders/combineVoxelGrids.fragment.d.ts +5 -0
- package/Shaders/combineVoxelGrids.fragment.js +9 -0
- package/Shaders/combineVoxelGrids.fragment.js.map +1 -0
- package/Shaders/copyTexture3DLayerToTexture.fragment.d.ts +5 -0
- package/Shaders/copyTexture3DLayerToTexture.fragment.js +10 -0
- package/Shaders/copyTexture3DLayerToTexture.fragment.js.map +1 -0
- package/Shaders/default.fragment.js +31 -6
- package/Shaders/default.fragment.js.map +1 -1
- package/Shaders/default.vertex.js +6 -2
- package/Shaders/default.vertex.js.map +1 -1
- package/Shaders/generateVoxelMip.fragment.d.ts +5 -0
- package/Shaders/generateVoxelMip.fragment.js +25 -0
- package/Shaders/generateVoxelMip.fragment.js.map +1 -0
- package/Shaders/geometry.fragment.js +1 -1
- package/Shaders/geometry.fragment.js.map +1 -1
- package/Shaders/iblShadowAccumulation.fragment.d.ts +5 -0
- package/Shaders/iblShadowAccumulation.fragment.js +27 -0
- package/Shaders/iblShadowAccumulation.fragment.js.map +1 -0
- package/Shaders/iblShadowDebug.fragment.d.ts +5 -0
- package/Shaders/iblShadowDebug.fragment.js +18 -0
- package/Shaders/iblShadowDebug.fragment.js.map +1 -0
- package/Shaders/iblShadowGBufferDebug.fragment.d.ts +5 -0
- package/Shaders/iblShadowGBufferDebug.fragment.js +19 -0
- package/Shaders/iblShadowGBufferDebug.fragment.js.map +1 -0
- package/Shaders/iblShadowSpatialBlur.fragment.d.ts +5 -0
- package/Shaders/iblShadowSpatialBlur.fragment.js +21 -0
- package/Shaders/iblShadowSpatialBlur.fragment.js.map +1 -0
- package/Shaders/iblShadowVoxelTracing.fragment.d.ts +5 -0
- package/Shaders/iblShadowVoxelTracing.fragment.js +152 -0
- package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -0
- package/Shaders/iblShadowsCdfx.fragment.d.ts +5 -0
- package/Shaders/iblShadowsCdfx.fragment.js +12 -0
- package/Shaders/iblShadowsCdfx.fragment.js.map +1 -0
- package/Shaders/iblShadowsCdfy.fragment.d.ts +5 -0
- package/Shaders/iblShadowsCdfy.fragment.js +33 -0
- package/Shaders/iblShadowsCdfy.fragment.js.map +1 -0
- package/Shaders/iblShadowsCombine.fragment.d.ts +5 -0
- package/Shaders/iblShadowsCombine.fragment.js +10 -0
- package/Shaders/iblShadowsCombine.fragment.js.map +1 -0
- package/Shaders/iblShadowsIcdfx.fragment.d.ts +5 -0
- package/Shaders/iblShadowsIcdfx.fragment.js +19 -0
- package/Shaders/iblShadowsIcdfx.fragment.js.map +1 -0
- package/Shaders/iblShadowsIcdfy.fragment.d.ts +5 -0
- package/Shaders/iblShadowsIcdfy.fragment.js +19 -0
- package/Shaders/iblShadowsIcdfy.fragment.js.map +1 -0
- package/Shaders/iblShadowsImportanceSamplingDebug.fragment.d.ts +5 -0
- package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js +48 -0
- package/Shaders/iblShadowsImportanceSamplingDebug.fragment.js.map +1 -0
- package/Shaders/pbr.fragment.js +32 -7
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/pbr.vertex.js +3 -1
- package/Shaders/pbr.vertex.js.map +1 -1
- package/Shaders/voxelGrid.fragment.d.ts +5 -0
- package/Shaders/voxelGrid.fragment.js +14 -0
- package/Shaders/voxelGrid.fragment.js.map +1 -0
- package/Shaders/voxelGrid.vertex.d.ts +5 -0
- package/Shaders/voxelGrid.vertex.js +9 -0
- package/Shaders/voxelGrid.vertex.js.map +1 -0
- package/Shaders/voxelGrid2dArrayDebug.fragment.d.ts +5 -0
- package/Shaders/voxelGrid2dArrayDebug.fragment.js +9 -0
- package/Shaders/voxelGrid2dArrayDebug.fragment.js.map +1 -0
- package/Shaders/voxelGrid3dDebug.fragment.d.ts +5 -0
- package/Shaders/voxelGrid3dDebug.fragment.js +22 -0
- package/Shaders/voxelGrid3dDebug.fragment.js.map +1 -0
- package/Shaders/voxelSlabDebug.fragment.d.ts +5 -0
- package/Shaders/voxelSlabDebug.fragment.js +11 -0
- package/Shaders/voxelSlabDebug.fragment.js.map +1 -0
- package/Shaders/voxelSlabDebug.vertex.d.ts +5 -0
- package/Shaders/voxelSlabDebug.vertex.js +9 -0
- package/Shaders/voxelSlabDebug.vertex.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/instancesDeclaration.js +4 -2
- package/ShadersWGSL/ShadersInclude/instancesDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/instancesVertex.js +9 -4
- package/ShadersWGSL/ShadersInclude/instancesVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js +4 -1
- package/ShadersWGSL/ShadersInclude/prePassDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertex.js +5 -1
- package/ShadersWGSL/ShadersInclude/prePassVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js +4 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +42 -16
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/default.vertex.js +5 -2
- package/ShadersWGSL/default.vertex.js.map +1 -1
- package/ShadersWGSL/geometry.fragment.js +1 -1
- package/ShadersWGSL/geometry.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +37 -20
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.vertex.js +1 -1
- package/ShadersWGSL/pbr.vertex.js.map +1 -1
- package/package.json +1 -1
- package/sceneComponent.d.ts +1 -0
- package/sceneComponent.js +1 -0
- package/sceneComponent.js.map +1 -1
package/Misc/fileTools.js
CHANGED
|
@@ -245,7 +245,7 @@ export const LoadImage = (input, onLoad, onError, offlineProvider, mimeType = ""
|
|
|
245
245
|
}
|
|
246
246
|
};
|
|
247
247
|
const cspHandler = (err) => {
|
|
248
|
-
if (err.blockedURI !== img.src) {
|
|
248
|
+
if (err.blockedURI !== img.src || err.disposition === "report") {
|
|
249
249
|
return;
|
|
250
250
|
}
|
|
251
251
|
unloadHandlersList();
|
package/Misc/fileTools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/fileTools.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { WebRequest } from \"./webRequest\";\r\nimport { IsWindowObjectExist } from \"./domManagement\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { IFileRequest } from \"./fileRequest\";\r\nimport { Observable } from \"./observable\";\r\nimport { FilesInputStore } from \"./filesInputStore\";\r\nimport { RetryStrategy } from \"./retryStrategy\";\r\nimport { BaseError, ErrorCodes, RuntimeError } from \"./error\";\r\nimport { DecodeBase64ToBinary, DecodeBase64ToString, EncodeArrayBufferToBase64 } from \"./stringTools\";\r\nimport { _functionContainer } from \"../Engines/Processors/shaderProcessor\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"./logger\";\r\nimport { TimingTools } from \"./timingTools\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\nimport { EngineFunctionContext } from \"core/Engines/abstractEngine.functions\";\r\nimport { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nconst Base64DataUrlRegEx = new RegExp(/^data:([^,]+\\/[^,]+)?;base64,/i);\r\ndeclare const _native: INative;\r\n\r\n/** @ignore */\r\nexport class LoadFileError extends RuntimeError {\r\n public request?: WebRequest;\r\n public file?: File;\r\n\r\n /**\r\n * Creates a new LoadFileError\r\n * @param message defines the message of the error\r\n * @param object defines the optional web request\r\n */\r\n constructor(message: string, object?: WebRequest | File) {\r\n super(message, ErrorCodes.LoadFileError);\r\n\r\n this.name = \"LoadFileError\";\r\n BaseError._setPrototypeOf(this, LoadFileError.prototype);\r\n\r\n if (object instanceof WebRequest) {\r\n this.request = object;\r\n } else {\r\n this.file = object;\r\n }\r\n }\r\n}\r\n\r\n/** @ignore */\r\nexport class RequestFileError extends RuntimeError {\r\n /**\r\n * Creates a new LoadFileError\r\n * @param message defines the message of the error\r\n * @param request defines the optional web request\r\n */\r\n constructor(\r\n message: string,\r\n public request: WebRequest\r\n ) {\r\n super(message, ErrorCodes.RequestFileError);\r\n this.name = \"RequestFileError\";\r\n BaseError._setPrototypeOf(this, RequestFileError.prototype);\r\n }\r\n}\r\n\r\n/** @ignore */\r\nexport class ReadFileError extends RuntimeError {\r\n /**\r\n * Creates a new ReadFileError\r\n * @param message defines the message of the error\r\n * @param file defines the optional file\r\n */\r\n constructor(\r\n message: string,\r\n public file: File\r\n ) {\r\n super(message, ErrorCodes.ReadFileError);\r\n this.name = \"ReadFileError\";\r\n BaseError._setPrototypeOf(this, ReadFileError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Removes unwanted characters from an url\r\n * @param url defines the url to clean\r\n * @returns the cleaned url\r\n */\r\nconst CleanUrl = (url: string): string => {\r\n url = url.replace(/#/gm, \"%23\");\r\n return url;\r\n};\r\n\r\n/**\r\n * @internal\r\n */\r\nexport const FileToolsOptions: {\r\n DefaultRetryStrategy: (url: string, request: WebRequest, retryIndex: number) => number;\r\n BaseUrl: string;\r\n CorsBehavior: string | ((url: string | string[]) => string);\r\n PreprocessUrl: (url: string) => string;\r\n ScriptBaseUrl: string;\r\n ScriptPreprocessUrl: (url: string) => string;\r\n CleanUrl: (url: string) => string;\r\n} = {\r\n /**\r\n * Gets or sets the retry strategy to apply when an error happens while loading an asset.\r\n * When defining this function, return the wait time before trying again or return -1 to\r\n * stop retrying and error out.\r\n */\r\n DefaultRetryStrategy: RetryStrategy.ExponentialBackoff(),\r\n\r\n /**\r\n * Gets or sets the base URL to use to load assets\r\n */\r\n BaseUrl: \"\",\r\n\r\n /**\r\n * Default behaviour for cors in the application.\r\n * It can be a string if the expected behavior is identical in the entire app.\r\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\r\n */\r\n CorsBehavior: \"anonymous\",\r\n\r\n /**\r\n * Gets or sets a function used to pre-process url before using them to load assets\r\n * @param url\r\n * @returns the processed url\r\n */\r\n PreprocessUrl: (url: string) => url,\r\n\r\n /**\r\n * Gets or sets the base URL to use to load scripts\r\n * Used for both JS and WASM\r\n */\r\n ScriptBaseUrl: \"\",\r\n /**\r\n * Gets or sets a function used to pre-process script url before using them to load.\r\n * Used for both JS and WASM\r\n * @param url defines the url to process\r\n * @returns the processed url\r\n */\r\n ScriptPreprocessUrl: (url: string) => url,\r\n\r\n /**\r\n * Gets or sets a function used to clean the url before using it to load assets\r\n * @param url defines the url to clean\r\n * @returns the cleaned url\r\n */\r\n CleanUrl,\r\n};\r\n\r\n/**\r\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\r\n * @param url define the url we are trying\r\n * @param element define the dom element where to configure the cors policy\r\n * @internal\r\n */\r\nexport const SetCorsBehavior = (url: string | string[], element: { crossOrigin: string | null }): void => {\r\n if (url && url.indexOf(\"data:\") === 0) {\r\n return;\r\n }\r\n\r\n if (FileToolsOptions.CorsBehavior) {\r\n if (typeof FileToolsOptions.CorsBehavior === \"string\" || FileToolsOptions.CorsBehavior instanceof String) {\r\n element.crossOrigin = <string>FileToolsOptions.CorsBehavior;\r\n } else {\r\n const result = FileToolsOptions.CorsBehavior(url);\r\n if (result) {\r\n element.crossOrigin = result;\r\n }\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Configuration used to load images\r\n * @see #DKMEZK#2\r\n */\r\nexport const LoadImageConfiguration: {\r\n /**\r\n * Use this callback if you want to provide the required size of an image before loading it.\r\n */\r\n getRequiredSize: Nullable<\r\n (input: string | ArrayBuffer | ArrayBufferView | Blob) => {\r\n width: number;\r\n height: number;\r\n }\r\n >;\r\n} = {\r\n getRequiredSize: null,\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 * @param imageBitmapOptions\r\n * @returns the HTMLImageElement of the loaded image\r\n * @internal\r\n */\r\nexport const LoadImage = (\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable<IOfflineProvider>,\r\n mimeType: string = \"\",\r\n imageBitmapOptions?: ImageBitmapOptions\r\n): Nullable<HTMLImageElement> => {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (typeof HTMLImageElement === \"undefined\" && !engine?._features.forceBitmapOverHTMLImageElement) {\r\n onError(\"LoadImage is only supported in web or BabylonNative environments.\");\r\n return null;\r\n }\r\n\r\n let url: string;\r\n let usingObjectURL = false;\r\n\r\n if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\r\n if (typeof Blob !== \"undefined\" && typeof URL !== \"undefined\") {\r\n url = URL.createObjectURL(new Blob([input], { type: mimeType }));\r\n usingObjectURL = true;\r\n } else {\r\n url = `data:${mimeType};base64,` + EncodeArrayBufferToBase64(input);\r\n }\r\n } else if (input instanceof Blob) {\r\n url = URL.createObjectURL(input);\r\n usingObjectURL = true;\r\n } else {\r\n url = FileToolsOptions.CleanUrl(input);\r\n url = FileToolsOptions.PreprocessUrl(url);\r\n }\r\n\r\n const onErrorHandler = (exception: any) => {\r\n if (onError) {\r\n const inputText = url || input.toString();\r\n onError(`Error while trying to load image: ${inputText.indexOf(\"http\") === 0 || inputText.length <= 128 ? inputText : inputText.slice(0, 128) + \"...\"}`, exception);\r\n }\r\n };\r\n\r\n if (engine?._features.forceBitmapOverHTMLImageElement) {\r\n LoadFile(\r\n url,\r\n (data) => {\r\n engine!\r\n .createImageBitmap(new Blob([data], { type: mimeType }), { premultiplyAlpha: \"none\", ...imageBitmapOptions })\r\n .then((imgBmp) => {\r\n onLoad(imgBmp);\r\n if (usingObjectURL) {\r\n URL.revokeObjectURL(url);\r\n }\r\n })\r\n .catch((reason) => {\r\n if (onError) {\r\n onError(\"Error while trying to load image: \" + input, reason);\r\n }\r\n });\r\n },\r\n undefined,\r\n offlineProvider || undefined,\r\n true,\r\n (request, exception) => {\r\n onErrorHandler(exception);\r\n }\r\n );\r\n\r\n return null;\r\n }\r\n\r\n const img = new Image();\r\n if (LoadImageConfiguration.getRequiredSize) {\r\n const size = LoadImageConfiguration.getRequiredSize(input);\r\n if (size.width) {\r\n img.width = size.width;\r\n }\r\n if (size.height) {\r\n img.height = size.height;\r\n }\r\n }\r\n SetCorsBehavior(url, img);\r\n\r\n const handlersList: { target: any; name: string; handler: any }[] = [];\r\n\r\n const loadHandlersList = () => {\r\n handlersList.forEach((handler) => {\r\n handler.target.addEventListener(handler.name, handler.handler);\r\n });\r\n };\r\n\r\n const unloadHandlersList = () => {\r\n handlersList.forEach((handler) => {\r\n handler.target.removeEventListener(handler.name, handler.handler);\r\n });\r\n handlersList.length = 0;\r\n };\r\n\r\n const loadHandler = () => {\r\n unloadHandlersList();\r\n\r\n onLoad(img);\r\n\r\n // Must revoke the URL after calling onLoad to avoid security exceptions in\r\n // certain scenarios (e.g. when hosted in vscode).\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n };\r\n\r\n const errorHandler = (err: any) => {\r\n unloadHandlersList();\r\n\r\n onErrorHandler(err);\r\n\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n };\r\n\r\n const cspHandler = (err: any) => {\r\n if (err.blockedURI !== img.src) {\r\n return;\r\n }\r\n\r\n unloadHandlersList();\r\n const cspException = new Error(`CSP violation of policy ${err.effectiveDirective} ${err.blockedURI}. Current policy is ${err.originalPolicy}`);\r\n\r\n EngineStore.UseFallbackTexture = false;\r\n onErrorHandler(cspException);\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n img.src = \"\";\r\n };\r\n\r\n handlersList.push({ target: img, name: \"load\", handler: loadHandler });\r\n handlersList.push({ target: img, name: \"error\", handler: errorHandler });\r\n handlersList.push({ target: document, name: \"securitypolicyviolation\", handler: cspHandler });\r\n\r\n loadHandlersList();\r\n\r\n const fromBlob = url.substring(0, 5) === \"blob:\";\r\n const fromData = url.substring(0, 5) === \"data:\";\r\n const noOfflineSupport = () => {\r\n if (fromBlob || fromData || !WebRequest.IsCustomRequestAvailable) {\r\n img.src = url;\r\n } else {\r\n LoadFile(\r\n url,\r\n (data, _, contentType) => {\r\n const type = !mimeType && contentType ? contentType : mimeType;\r\n const blob = new Blob([data], { type });\r\n const url = URL.createObjectURL(blob);\r\n usingObjectURL = true;\r\n img.src = url;\r\n },\r\n undefined,\r\n offlineProvider || undefined,\r\n true,\r\n (_request, exception) => {\r\n onErrorHandler(exception);\r\n }\r\n );\r\n }\r\n };\r\n\r\n const loadFromOfflineSupport = () => {\r\n if (offlineProvider) {\r\n offlineProvider.loadImage(url, img);\r\n }\r\n };\r\n\r\n if (!fromBlob && !fromData && offlineProvider && offlineProvider.enableTexturesOffline) {\r\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\r\n } else {\r\n if (url.indexOf(\"file:\") !== -1) {\r\n const textureName = decodeURIComponent(url.substring(5).toLowerCase());\r\n if (FilesInputStore.FilesToLoad[textureName] && typeof URL !== \"undefined\") {\r\n try {\r\n let blobURL;\r\n try {\r\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\r\n } catch (ex) {\r\n // Chrome doesn't support oneTimeOnly parameter\r\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\r\n }\r\n img.src = blobURL;\r\n usingObjectURL = true;\r\n } catch (e) {\r\n img.src = \"\";\r\n }\r\n return img;\r\n }\r\n }\r\n\r\n noOfflineSupport();\r\n }\r\n\r\n return img;\r\n};\r\n\r\n/**\r\n * Reads a file from a File object\r\n * @param file defines the file to load\r\n * @param onSuccess defines the callback to call when data is loaded\r\n * @param onProgress defines the callback to call during loading process\r\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\r\n * @param onError defines the callback to call when an error occurs\r\n * @returns a file request object\r\n * @internal\r\n */\r\nexport const ReadFile = (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: (ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: ReadFileError) => void\r\n): IFileRequest => {\r\n const reader = new FileReader();\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n abort: () => reader.abort(),\r\n };\r\n\r\n reader.onloadend = () => fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n if (onError) {\r\n reader.onerror = () => {\r\n onError(new ReadFileError(`Unable to read ${file.name}`, file));\r\n };\r\n }\r\n reader.onload = (e) => {\r\n //target doesn't have result from ts 1.3\r\n onSuccess((<any>e.target)[\"result\"]);\r\n };\r\n if (onProgress) {\r\n reader.onprogress = onProgress;\r\n }\r\n if (!useArrayBuffer) {\r\n // Asynchronous read\r\n reader.readAsText(file);\r\n } else {\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n return fileRequest;\r\n};\r\n\r\n/**\r\n * Loads a file from a url, a data url, or a file url\r\n * @param fileOrUrl file, url, data url, or file 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 * @param onOpened\r\n * @returns a file request object\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const LoadFile = (\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string, contentType?: Nullable<string>) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n): IFileRequest => {\r\n if ((fileOrUrl as File).name) {\r\n return ReadFile(\r\n fileOrUrl as File,\r\n onSuccess,\r\n onProgress,\r\n useArrayBuffer,\r\n onError\r\n ? (error: ReadFileError) => {\r\n onError(undefined, error);\r\n }\r\n : undefined\r\n );\r\n }\r\n\r\n const url = fileOrUrl as string;\r\n\r\n // If file and file input are set\r\n if (url.indexOf(\"file:\") !== -1) {\r\n let fileName = decodeURIComponent(url.substring(5).toLowerCase());\r\n if (fileName.indexOf(\"./\") === 0) {\r\n fileName = fileName.substring(2);\r\n }\r\n const file = FilesInputStore.FilesToLoad[fileName];\r\n if (file) {\r\n return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(undefined, new LoadFileError(error.message, error.file)) : undefined);\r\n }\r\n }\r\n\r\n // For a Base64 Data URL\r\n const { match, type } = TestBase64DataUrl(url);\r\n if (match) {\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n abort: () => () => {},\r\n };\r\n\r\n try {\r\n const data = useArrayBuffer ? DecodeBase64UrlToBinary(url) : DecodeBase64UrlToString(url);\r\n onSuccess(data, undefined, type);\r\n } catch (error) {\r\n if (onError) {\r\n onError(undefined, error);\r\n } else {\r\n Logger.Error(error.message || \"Failed to parse the Data URL\");\r\n }\r\n }\r\n\r\n TimingTools.SetImmediate(() => {\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n });\r\n\r\n return fileRequest;\r\n }\r\n\r\n return RequestFile(\r\n url,\r\n (data, request) => {\r\n onSuccess(data, request?.responseURL, request?.getResponseHeader(\"content-type\"));\r\n },\r\n onProgress,\r\n offlineProvider,\r\n useArrayBuffer,\r\n onError\r\n ? (error) => {\r\n onError(error.request, new LoadFileError(error.message, error.request));\r\n }\r\n : undefined,\r\n onOpened\r\n );\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 * @param onOpened callback called when the web request is opened\r\n * @returns a file request object\r\n * @internal\r\n */\r\nexport const RequestFile = (\r\n url: string,\r\n onSuccess?: (data: string | ArrayBuffer, request?: WebRequest) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: RequestFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n): IFileRequest => {\r\n url = FileToolsOptions.CleanUrl(url);\r\n url = FileToolsOptions.PreprocessUrl(url);\r\n\r\n const loadUrl = FileToolsOptions.BaseUrl + url;\r\n\r\n let aborted = false;\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n abort: () => (aborted = true),\r\n };\r\n\r\n const requestFile = () => {\r\n let request: Nullable<WebRequest> = new WebRequest();\r\n let retryHandle: Nullable<ReturnType<typeof setTimeout>> = null;\r\n let onReadyStateChange: Nullable<() => void>;\r\n\r\n const unbindEvents = () => {\r\n if (!request) {\r\n return;\r\n }\r\n\r\n if (onProgress) {\r\n request.removeEventListener(\"progress\", onProgress);\r\n }\r\n if (onReadyStateChange) {\r\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\r\n }\r\n request.removeEventListener(\"loadend\", onLoadEnd!);\r\n };\r\n\r\n let onLoadEnd: Nullable<() => void> = () => {\r\n unbindEvents();\r\n\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n fileRequest.onCompleteObservable.clear();\r\n\r\n onProgress = undefined;\r\n onReadyStateChange = null;\r\n onLoadEnd = null;\r\n onError = undefined;\r\n onOpened = undefined;\r\n onSuccess = undefined;\r\n };\r\n\r\n fileRequest.abort = () => {\r\n aborted = true;\r\n\r\n if (onLoadEnd) {\r\n onLoadEnd();\r\n }\r\n\r\n if (request && request.readyState !== (XMLHttpRequest.DONE || 4)) {\r\n request.abort();\r\n }\r\n\r\n if (retryHandle !== null) {\r\n clearTimeout(retryHandle);\r\n retryHandle = null;\r\n }\r\n\r\n request = null;\r\n };\r\n\r\n const handleError = (error: any) => {\r\n const message = error.message || \"Unknown error\";\r\n if (onError && request) {\r\n onError(new RequestFileError(message, request));\r\n } else {\r\n Logger.Error(message);\r\n }\r\n };\r\n\r\n const retryLoop = (retryIndex: number) => {\r\n if (!request) {\r\n return;\r\n }\r\n request.open(\"GET\", loadUrl);\r\n\r\n if (onOpened) {\r\n try {\r\n onOpened(request);\r\n } catch (e) {\r\n handleError(e);\r\n return;\r\n }\r\n }\r\n\r\n if (useArrayBuffer) {\r\n request.responseType = \"arraybuffer\";\r\n }\r\n\r\n if (onProgress) {\r\n request.addEventListener(\"progress\", onProgress);\r\n }\r\n\r\n if (onLoadEnd) {\r\n request.addEventListener(\"loadend\", onLoadEnd);\r\n }\r\n\r\n onReadyStateChange = () => {\r\n if (aborted || !request) {\r\n return;\r\n }\r\n\r\n // In case of undefined state in some browsers.\r\n if (request.readyState === (XMLHttpRequest.DONE || 4)) {\r\n // Some browsers have issues where onreadystatechange can be called multiple times with the same value.\r\n if (onReadyStateChange) {\r\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\r\n }\r\n\r\n if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!IsWindowObjectExist() || IsFileURL()))) {\r\n try {\r\n if (onSuccess) {\r\n onSuccess(useArrayBuffer ? request.response : request.responseText, request);\r\n }\r\n } catch (e) {\r\n handleError(e);\r\n }\r\n return;\r\n }\r\n\r\n const retryStrategy = FileToolsOptions.DefaultRetryStrategy;\r\n if (retryStrategy) {\r\n const waitTime = retryStrategy(loadUrl, request, retryIndex);\r\n if (waitTime !== -1) {\r\n // Prevent the request from completing for retry.\r\n unbindEvents();\r\n\r\n request = new WebRequest();\r\n retryHandle = setTimeout(() => retryLoop(retryIndex + 1), waitTime);\r\n return;\r\n }\r\n }\r\n\r\n const error = new RequestFileError(\"Error status: \" + request.status + \" \" + request.statusText + \" - Unable to load \" + loadUrl, request);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n request.addEventListener(\"readystatechange\", onReadyStateChange);\r\n\r\n request.send();\r\n };\r\n\r\n retryLoop(0);\r\n };\r\n\r\n // Caching all files\r\n if (offlineProvider && offlineProvider.enableSceneOffline) {\r\n const noOfflineSupport = (request?: any) => {\r\n if (request && request.status > 400) {\r\n if (onError) {\r\n onError(request);\r\n }\r\n } else {\r\n requestFile();\r\n }\r\n };\r\n\r\n const loadFromOfflineSupport = () => {\r\n // TODO: database needs to support aborting and should return a IFileRequest\r\n\r\n if (offlineProvider) {\r\n offlineProvider.loadFile(\r\n FileToolsOptions.BaseUrl + url,\r\n (data) => {\r\n if (!aborted && onSuccess) {\r\n onSuccess(data);\r\n }\r\n\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n },\r\n onProgress\r\n ? (event) => {\r\n if (!aborted && onProgress) {\r\n onProgress(event);\r\n }\r\n }\r\n : undefined,\r\n noOfflineSupport,\r\n useArrayBuffer\r\n );\r\n }\r\n };\r\n\r\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\r\n } else {\r\n requestFile();\r\n }\r\n\r\n return fileRequest;\r\n};\r\n\r\n/**\r\n * Checks if the loaded document was accessed via `file:`-Protocol.\r\n * @returns boolean\r\n * @internal\r\n */\r\nexport const IsFileURL = (): boolean => {\r\n return typeof location !== \"undefined\" && location.protocol === \"file:\";\r\n};\r\n\r\n/**\r\n * Test if the given uri is a valid base64 data url\r\n * @param uri The uri to test\r\n * @returns True if the uri is a base64 data url or false otherwise\r\n * @internal\r\n */\r\nexport const IsBase64DataUrl = (uri: string): boolean => {\r\n return Base64DataUrlRegEx.test(uri);\r\n};\r\n\r\nexport const TestBase64DataUrl = (uri: string): { match: boolean; type: string } => {\r\n const results = Base64DataUrlRegEx.exec(uri);\r\n if (results === null || results.length === 0) {\r\n return { match: false, type: \"\" };\r\n } else {\r\n const type = results[0].replace(\"data:\", \"\").replace(\"base64,\", \"\");\r\n return { match: true, type };\r\n }\r\n};\r\n\r\n/**\r\n * Decode the given base64 uri.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n * @internal\r\n */\r\nexport function DecodeBase64UrlToBinary(uri: string): ArrayBuffer {\r\n return DecodeBase64ToBinary(uri.split(\",\")[1]);\r\n}\r\n\r\n/**\r\n * Decode the given base64 uri into a UTF-8 encoded string.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n * @internal\r\n */\r\nexport const DecodeBase64UrlToString = (uri: string): string => {\r\n return DecodeBase64ToString(uri.split(\",\")[1]);\r\n};\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n AbstractEngine._FileToolsLoadImage = LoadImage;\r\n EngineFunctionContext.loadFile = LoadFile;\r\n _functionContainer.loadFile = LoadFile;\r\n};\r\n\r\ninitSideEffects();\r\n\r\n// deprecated\r\n\r\n/**\r\n * FileTools defined as any.\r\n * This should not be imported or used in future releases or in any module in the framework\r\n * @internal\r\n * @deprecated import the needed function from fileTools.ts\r\n */\r\nexport let FileTools: {\r\n DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer;\r\n DecodeBase64UrlToString: (uri: string) => string;\r\n DefaultRetryStrategy: any;\r\n BaseUrl: any;\r\n CorsBehavior: any;\r\n PreprocessUrl: any;\r\n IsBase64DataUrl: (uri: string) => boolean;\r\n IsFileURL: () => boolean;\r\n LoadFile: (\r\n fileOrUrl: string | File,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string | undefined) => void,\r\n onProgress?: ((ev: ProgressEvent<EventTarget>) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((request?: WebRequest | undefined, exception?: LoadFileError | undefined) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest;\r\n LoadImage: (\r\n input: string | ArrayBuffer | Blob | ArrayBufferView,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string | undefined, exception?: any) => void,\r\n offlineProvider: Nullable<IOfflineProvider>,\r\n mimeType?: string | undefined,\r\n imageBitmapOptions?: ImageBitmapOptions | undefined\r\n ) => Nullable<HTMLImageElement>;\r\n ReadFile: (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: ((ev: ProgressEvent<EventTarget>) => any) | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: ReadFileError) => void) | undefined\r\n ) => IFileRequest;\r\n RequestFile: (\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest | undefined) => void,\r\n onProgress?: ((event: ProgressEvent<EventTarget>) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: RequestFileError) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest;\r\n SetCorsBehavior: (url: string | string[], element: { crossOrigin: string | null }) => void;\r\n};\r\n/**\r\n * @internal\r\n */\r\nexport const _injectLTSFileTools = (\r\n DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer,\r\n DecodeBase64UrlToString: (uri: string) => string,\r\n FileToolsOptions: { DefaultRetryStrategy: any; BaseUrl: any; CorsBehavior: any; PreprocessUrl: any; CleanUrl: any },\r\n IsBase64DataUrl: (uri: string) => boolean,\r\n IsFileURL: () => boolean,\r\n LoadFile: (\r\n fileOrUrl: string | File,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string | undefined) => void,\r\n onProgress?: ((ev: ProgressEvent<EventTarget>) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((request?: WebRequest | undefined, exception?: LoadFileError | undefined) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest,\r\n LoadImage: (\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string | undefined, exception?: any) => void,\r\n offlineProvider: Nullable<IOfflineProvider>,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions | undefined\r\n ) => Nullable<HTMLImageElement>,\r\n ReadFile: (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: ((ev: ProgressEvent<EventTarget>) => any) | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: ReadFileError) => void) | undefined\r\n ) => IFileRequest,\r\n RequestFile: (\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest | undefined) => void,\r\n onProgress?: ((event: ProgressEvent<EventTarget>) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: RequestFileError) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest,\r\n SetCorsBehavior: (url: string | string[], element: { crossOrigin: string | null }) => void\r\n) => {\r\n /**\r\n * Backwards compatibility.\r\n * @internal\r\n * @deprecated\r\n */\r\n FileTools = {\r\n DecodeBase64UrlToBinary,\r\n DecodeBase64UrlToString,\r\n DefaultRetryStrategy: FileToolsOptions.DefaultRetryStrategy,\r\n BaseUrl: FileToolsOptions.BaseUrl,\r\n CorsBehavior: FileToolsOptions.CorsBehavior,\r\n PreprocessUrl: FileToolsOptions.PreprocessUrl,\r\n IsBase64DataUrl,\r\n IsFileURL,\r\n LoadFile,\r\n LoadImage,\r\n ReadFile,\r\n RequestFile,\r\n SetCorsBehavior,\r\n };\r\n\r\n Object.defineProperty(FileTools, \"DefaultRetryStrategy\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.DefaultRetryStrategy;\r\n },\r\n set: function (this: null, value: (url: string, request: WebRequest, retryIndex: number) => number) {\r\n FileToolsOptions.DefaultRetryStrategy = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"BaseUrl\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.BaseUrl;\r\n },\r\n set: function (this: null, value: string) {\r\n FileToolsOptions.BaseUrl = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"PreprocessUrl\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.PreprocessUrl;\r\n },\r\n set: function (this: null, value: (url: string) => string) {\r\n FileToolsOptions.PreprocessUrl = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"CorsBehavior\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.CorsBehavior;\r\n },\r\n set: function (this: null, value: string | ((url: string | string[]) => string)) {\r\n FileToolsOptions.CorsBehavior = value;\r\n },\r\n });\r\n};\r\n\r\n_injectLTSFileTools(DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior);\r\n"]}
|
|
1
|
+
{"version":3,"file":"fileTools.js","sourceRoot":"","sources":["../../../../dev/core/src/Misc/fileTools.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { WebRequest } from \"./webRequest\";\r\nimport { IsWindowObjectExist } from \"./domManagement\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IOfflineProvider } from \"../Offline/IOfflineProvider\";\r\nimport type { IFileRequest } from \"./fileRequest\";\r\nimport { Observable } from \"./observable\";\r\nimport { FilesInputStore } from \"./filesInputStore\";\r\nimport { RetryStrategy } from \"./retryStrategy\";\r\nimport { BaseError, ErrorCodes, RuntimeError } from \"./error\";\r\nimport { DecodeBase64ToBinary, DecodeBase64ToString, EncodeArrayBufferToBase64 } from \"./stringTools\";\r\nimport { _functionContainer } from \"../Engines/Processors/shaderProcessor\";\r\nimport { EngineStore } from \"../Engines/engineStore\";\r\nimport { Logger } from \"./logger\";\r\nimport { TimingTools } from \"./timingTools\";\r\nimport type { INative } from \"../Engines/Native/nativeInterfaces\";\r\nimport { EngineFunctionContext } from \"core/Engines/abstractEngine.functions\";\r\nimport { AbstractEngine } from \"../Engines/abstractEngine\";\r\n\r\nconst Base64DataUrlRegEx = new RegExp(/^data:([^,]+\\/[^,]+)?;base64,/i);\r\ndeclare const _native: INative;\r\n\r\n/** @ignore */\r\nexport class LoadFileError extends RuntimeError {\r\n public request?: WebRequest;\r\n public file?: File;\r\n\r\n /**\r\n * Creates a new LoadFileError\r\n * @param message defines the message of the error\r\n * @param object defines the optional web request\r\n */\r\n constructor(message: string, object?: WebRequest | File) {\r\n super(message, ErrorCodes.LoadFileError);\r\n\r\n this.name = \"LoadFileError\";\r\n BaseError._setPrototypeOf(this, LoadFileError.prototype);\r\n\r\n if (object instanceof WebRequest) {\r\n this.request = object;\r\n } else {\r\n this.file = object;\r\n }\r\n }\r\n}\r\n\r\n/** @ignore */\r\nexport class RequestFileError extends RuntimeError {\r\n /**\r\n * Creates a new LoadFileError\r\n * @param message defines the message of the error\r\n * @param request defines the optional web request\r\n */\r\n constructor(\r\n message: string,\r\n public request: WebRequest\r\n ) {\r\n super(message, ErrorCodes.RequestFileError);\r\n this.name = \"RequestFileError\";\r\n BaseError._setPrototypeOf(this, RequestFileError.prototype);\r\n }\r\n}\r\n\r\n/** @ignore */\r\nexport class ReadFileError extends RuntimeError {\r\n /**\r\n * Creates a new ReadFileError\r\n * @param message defines the message of the error\r\n * @param file defines the optional file\r\n */\r\n constructor(\r\n message: string,\r\n public file: File\r\n ) {\r\n super(message, ErrorCodes.ReadFileError);\r\n this.name = \"ReadFileError\";\r\n BaseError._setPrototypeOf(this, ReadFileError.prototype);\r\n }\r\n}\r\n\r\n/**\r\n * Removes unwanted characters from an url\r\n * @param url defines the url to clean\r\n * @returns the cleaned url\r\n */\r\nconst CleanUrl = (url: string): string => {\r\n url = url.replace(/#/gm, \"%23\");\r\n return url;\r\n};\r\n\r\n/**\r\n * @internal\r\n */\r\nexport const FileToolsOptions: {\r\n DefaultRetryStrategy: (url: string, request: WebRequest, retryIndex: number) => number;\r\n BaseUrl: string;\r\n CorsBehavior: string | ((url: string | string[]) => string);\r\n PreprocessUrl: (url: string) => string;\r\n ScriptBaseUrl: string;\r\n ScriptPreprocessUrl: (url: string) => string;\r\n CleanUrl: (url: string) => string;\r\n} = {\r\n /**\r\n * Gets or sets the retry strategy to apply when an error happens while loading an asset.\r\n * When defining this function, return the wait time before trying again or return -1 to\r\n * stop retrying and error out.\r\n */\r\n DefaultRetryStrategy: RetryStrategy.ExponentialBackoff(),\r\n\r\n /**\r\n * Gets or sets the base URL to use to load assets\r\n */\r\n BaseUrl: \"\",\r\n\r\n /**\r\n * Default behaviour for cors in the application.\r\n * It can be a string if the expected behavior is identical in the entire app.\r\n * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)\r\n */\r\n CorsBehavior: \"anonymous\",\r\n\r\n /**\r\n * Gets or sets a function used to pre-process url before using them to load assets\r\n * @param url\r\n * @returns the processed url\r\n */\r\n PreprocessUrl: (url: string) => url,\r\n\r\n /**\r\n * Gets or sets the base URL to use to load scripts\r\n * Used for both JS and WASM\r\n */\r\n ScriptBaseUrl: \"\",\r\n /**\r\n * Gets or sets a function used to pre-process script url before using them to load.\r\n * Used for both JS and WASM\r\n * @param url defines the url to process\r\n * @returns the processed url\r\n */\r\n ScriptPreprocessUrl: (url: string) => url,\r\n\r\n /**\r\n * Gets or sets a function used to clean the url before using it to load assets\r\n * @param url defines the url to clean\r\n * @returns the cleaned url\r\n */\r\n CleanUrl,\r\n};\r\n\r\n/**\r\n * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.\r\n * @param url define the url we are trying\r\n * @param element define the dom element where to configure the cors policy\r\n * @internal\r\n */\r\nexport const SetCorsBehavior = (url: string | string[], element: { crossOrigin: string | null }): void => {\r\n if (url && url.indexOf(\"data:\") === 0) {\r\n return;\r\n }\r\n\r\n if (FileToolsOptions.CorsBehavior) {\r\n if (typeof FileToolsOptions.CorsBehavior === \"string\" || FileToolsOptions.CorsBehavior instanceof String) {\r\n element.crossOrigin = <string>FileToolsOptions.CorsBehavior;\r\n } else {\r\n const result = FileToolsOptions.CorsBehavior(url);\r\n if (result) {\r\n element.crossOrigin = result;\r\n }\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Configuration used to load images\r\n * @see #DKMEZK#2\r\n */\r\nexport const LoadImageConfiguration: {\r\n /**\r\n * Use this callback if you want to provide the required size of an image before loading it.\r\n */\r\n getRequiredSize: Nullable<\r\n (input: string | ArrayBuffer | ArrayBufferView | Blob) => {\r\n width: number;\r\n height: number;\r\n }\r\n >;\r\n} = {\r\n getRequiredSize: null,\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 * @param imageBitmapOptions\r\n * @returns the HTMLImageElement of the loaded image\r\n * @internal\r\n */\r\nexport const LoadImage = (\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string, exception?: any) => void,\r\n offlineProvider: Nullable<IOfflineProvider>,\r\n mimeType: string = \"\",\r\n imageBitmapOptions?: ImageBitmapOptions\r\n): Nullable<HTMLImageElement> => {\r\n const engine = EngineStore.LastCreatedEngine;\r\n if (typeof HTMLImageElement === \"undefined\" && !engine?._features.forceBitmapOverHTMLImageElement) {\r\n onError(\"LoadImage is only supported in web or BabylonNative environments.\");\r\n return null;\r\n }\r\n\r\n let url: string;\r\n let usingObjectURL = false;\r\n\r\n if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\r\n if (typeof Blob !== \"undefined\" && typeof URL !== \"undefined\") {\r\n url = URL.createObjectURL(new Blob([input], { type: mimeType }));\r\n usingObjectURL = true;\r\n } else {\r\n url = `data:${mimeType};base64,` + EncodeArrayBufferToBase64(input);\r\n }\r\n } else if (input instanceof Blob) {\r\n url = URL.createObjectURL(input);\r\n usingObjectURL = true;\r\n } else {\r\n url = FileToolsOptions.CleanUrl(input);\r\n url = FileToolsOptions.PreprocessUrl(url);\r\n }\r\n\r\n const onErrorHandler = (exception: any) => {\r\n if (onError) {\r\n const inputText = url || input.toString();\r\n onError(`Error while trying to load image: ${inputText.indexOf(\"http\") === 0 || inputText.length <= 128 ? inputText : inputText.slice(0, 128) + \"...\"}`, exception);\r\n }\r\n };\r\n\r\n if (engine?._features.forceBitmapOverHTMLImageElement) {\r\n LoadFile(\r\n url,\r\n (data) => {\r\n engine!\r\n .createImageBitmap(new Blob([data], { type: mimeType }), { premultiplyAlpha: \"none\", ...imageBitmapOptions })\r\n .then((imgBmp) => {\r\n onLoad(imgBmp);\r\n if (usingObjectURL) {\r\n URL.revokeObjectURL(url);\r\n }\r\n })\r\n .catch((reason) => {\r\n if (onError) {\r\n onError(\"Error while trying to load image: \" + input, reason);\r\n }\r\n });\r\n },\r\n undefined,\r\n offlineProvider || undefined,\r\n true,\r\n (request, exception) => {\r\n onErrorHandler(exception);\r\n }\r\n );\r\n\r\n return null;\r\n }\r\n\r\n const img = new Image();\r\n if (LoadImageConfiguration.getRequiredSize) {\r\n const size = LoadImageConfiguration.getRequiredSize(input);\r\n if (size.width) {\r\n img.width = size.width;\r\n }\r\n if (size.height) {\r\n img.height = size.height;\r\n }\r\n }\r\n SetCorsBehavior(url, img);\r\n\r\n const handlersList: { target: any; name: string; handler: any }[] = [];\r\n\r\n const loadHandlersList = () => {\r\n handlersList.forEach((handler) => {\r\n handler.target.addEventListener(handler.name, handler.handler);\r\n });\r\n };\r\n\r\n const unloadHandlersList = () => {\r\n handlersList.forEach((handler) => {\r\n handler.target.removeEventListener(handler.name, handler.handler);\r\n });\r\n handlersList.length = 0;\r\n };\r\n\r\n const loadHandler = () => {\r\n unloadHandlersList();\r\n\r\n onLoad(img);\r\n\r\n // Must revoke the URL after calling onLoad to avoid security exceptions in\r\n // certain scenarios (e.g. when hosted in vscode).\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n };\r\n\r\n const errorHandler = (err: any) => {\r\n unloadHandlersList();\r\n\r\n onErrorHandler(err);\r\n\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n };\r\n\r\n const cspHandler = (err: any) => {\r\n if (err.blockedURI !== img.src || err.disposition === \"report\") {\r\n return;\r\n }\r\n\r\n unloadHandlersList();\r\n const cspException = new Error(`CSP violation of policy ${err.effectiveDirective} ${err.blockedURI}. Current policy is ${err.originalPolicy}`);\r\n\r\n EngineStore.UseFallbackTexture = false;\r\n onErrorHandler(cspException);\r\n if (usingObjectURL && img.src) {\r\n URL.revokeObjectURL(img.src);\r\n }\r\n img.src = \"\";\r\n };\r\n\r\n handlersList.push({ target: img, name: \"load\", handler: loadHandler });\r\n handlersList.push({ target: img, name: \"error\", handler: errorHandler });\r\n handlersList.push({ target: document, name: \"securitypolicyviolation\", handler: cspHandler });\r\n\r\n loadHandlersList();\r\n\r\n const fromBlob = url.substring(0, 5) === \"blob:\";\r\n const fromData = url.substring(0, 5) === \"data:\";\r\n const noOfflineSupport = () => {\r\n if (fromBlob || fromData || !WebRequest.IsCustomRequestAvailable) {\r\n img.src = url;\r\n } else {\r\n LoadFile(\r\n url,\r\n (data, _, contentType) => {\r\n const type = !mimeType && contentType ? contentType : mimeType;\r\n const blob = new Blob([data], { type });\r\n const url = URL.createObjectURL(blob);\r\n usingObjectURL = true;\r\n img.src = url;\r\n },\r\n undefined,\r\n offlineProvider || undefined,\r\n true,\r\n (_request, exception) => {\r\n onErrorHandler(exception);\r\n }\r\n );\r\n }\r\n };\r\n\r\n const loadFromOfflineSupport = () => {\r\n if (offlineProvider) {\r\n offlineProvider.loadImage(url, img);\r\n }\r\n };\r\n\r\n if (!fromBlob && !fromData && offlineProvider && offlineProvider.enableTexturesOffline) {\r\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\r\n } else {\r\n if (url.indexOf(\"file:\") !== -1) {\r\n const textureName = decodeURIComponent(url.substring(5).toLowerCase());\r\n if (FilesInputStore.FilesToLoad[textureName] && typeof URL !== \"undefined\") {\r\n try {\r\n let blobURL;\r\n try {\r\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\r\n } catch (ex) {\r\n // Chrome doesn't support oneTimeOnly parameter\r\n blobURL = URL.createObjectURL(FilesInputStore.FilesToLoad[textureName]);\r\n }\r\n img.src = blobURL;\r\n usingObjectURL = true;\r\n } catch (e) {\r\n img.src = \"\";\r\n }\r\n return img;\r\n }\r\n }\r\n\r\n noOfflineSupport();\r\n }\r\n\r\n return img;\r\n};\r\n\r\n/**\r\n * Reads a file from a File object\r\n * @param file defines the file to load\r\n * @param onSuccess defines the callback to call when data is loaded\r\n * @param onProgress defines the callback to call during loading process\r\n * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer\r\n * @param onError defines the callback to call when an error occurs\r\n * @returns a file request object\r\n * @internal\r\n */\r\nexport const ReadFile = (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: (ev: ProgressEvent) => any,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: ReadFileError) => void\r\n): IFileRequest => {\r\n const reader = new FileReader();\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n abort: () => reader.abort(),\r\n };\r\n\r\n reader.onloadend = () => fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n if (onError) {\r\n reader.onerror = () => {\r\n onError(new ReadFileError(`Unable to read ${file.name}`, file));\r\n };\r\n }\r\n reader.onload = (e) => {\r\n //target doesn't have result from ts 1.3\r\n onSuccess((<any>e.target)[\"result\"]);\r\n };\r\n if (onProgress) {\r\n reader.onprogress = onProgress;\r\n }\r\n if (!useArrayBuffer) {\r\n // Asynchronous read\r\n reader.readAsText(file);\r\n } else {\r\n reader.readAsArrayBuffer(file);\r\n }\r\n\r\n return fileRequest;\r\n};\r\n\r\n/**\r\n * Loads a file from a url, a data url, or a file url\r\n * @param fileOrUrl file, url, data url, or file 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 * @param onOpened\r\n * @returns a file request object\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const LoadFile = (\r\n fileOrUrl: File | string,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string, contentType?: Nullable<string>) => void,\r\n onProgress?: (ev: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (request?: WebRequest, exception?: LoadFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n): IFileRequest => {\r\n if ((fileOrUrl as File).name) {\r\n return ReadFile(\r\n fileOrUrl as File,\r\n onSuccess,\r\n onProgress,\r\n useArrayBuffer,\r\n onError\r\n ? (error: ReadFileError) => {\r\n onError(undefined, error);\r\n }\r\n : undefined\r\n );\r\n }\r\n\r\n const url = fileOrUrl as string;\r\n\r\n // If file and file input are set\r\n if (url.indexOf(\"file:\") !== -1) {\r\n let fileName = decodeURIComponent(url.substring(5).toLowerCase());\r\n if (fileName.indexOf(\"./\") === 0) {\r\n fileName = fileName.substring(2);\r\n }\r\n const file = FilesInputStore.FilesToLoad[fileName];\r\n if (file) {\r\n return ReadFile(file, onSuccess, onProgress, useArrayBuffer, onError ? (error) => onError(undefined, new LoadFileError(error.message, error.file)) : undefined);\r\n }\r\n }\r\n\r\n // For a Base64 Data URL\r\n const { match, type } = TestBase64DataUrl(url);\r\n if (match) {\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n abort: () => () => {},\r\n };\r\n\r\n try {\r\n const data = useArrayBuffer ? DecodeBase64UrlToBinary(url) : DecodeBase64UrlToString(url);\r\n onSuccess(data, undefined, type);\r\n } catch (error) {\r\n if (onError) {\r\n onError(undefined, error);\r\n } else {\r\n Logger.Error(error.message || \"Failed to parse the Data URL\");\r\n }\r\n }\r\n\r\n TimingTools.SetImmediate(() => {\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n });\r\n\r\n return fileRequest;\r\n }\r\n\r\n return RequestFile(\r\n url,\r\n (data, request) => {\r\n onSuccess(data, request?.responseURL, request?.getResponseHeader(\"content-type\"));\r\n },\r\n onProgress,\r\n offlineProvider,\r\n useArrayBuffer,\r\n onError\r\n ? (error) => {\r\n onError(error.request, new LoadFileError(error.message, error.request));\r\n }\r\n : undefined,\r\n onOpened\r\n );\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 * @param onOpened callback called when the web request is opened\r\n * @returns a file request object\r\n * @internal\r\n */\r\nexport const RequestFile = (\r\n url: string,\r\n onSuccess?: (data: string | ArrayBuffer, request?: WebRequest) => void,\r\n onProgress?: (event: ProgressEvent) => void,\r\n offlineProvider?: IOfflineProvider,\r\n useArrayBuffer?: boolean,\r\n onError?: (error: RequestFileError) => void,\r\n onOpened?: (request: WebRequest) => void\r\n): IFileRequest => {\r\n url = FileToolsOptions.CleanUrl(url);\r\n url = FileToolsOptions.PreprocessUrl(url);\r\n\r\n const loadUrl = FileToolsOptions.BaseUrl + url;\r\n\r\n let aborted = false;\r\n const fileRequest: IFileRequest = {\r\n onCompleteObservable: new Observable<IFileRequest>(),\r\n abort: () => (aborted = true),\r\n };\r\n\r\n const requestFile = () => {\r\n let request: Nullable<WebRequest> = new WebRequest();\r\n let retryHandle: Nullable<ReturnType<typeof setTimeout>> = null;\r\n let onReadyStateChange: Nullable<() => void>;\r\n\r\n const unbindEvents = () => {\r\n if (!request) {\r\n return;\r\n }\r\n\r\n if (onProgress) {\r\n request.removeEventListener(\"progress\", onProgress);\r\n }\r\n if (onReadyStateChange) {\r\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\r\n }\r\n request.removeEventListener(\"loadend\", onLoadEnd!);\r\n };\r\n\r\n let onLoadEnd: Nullable<() => void> = () => {\r\n unbindEvents();\r\n\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n fileRequest.onCompleteObservable.clear();\r\n\r\n onProgress = undefined;\r\n onReadyStateChange = null;\r\n onLoadEnd = null;\r\n onError = undefined;\r\n onOpened = undefined;\r\n onSuccess = undefined;\r\n };\r\n\r\n fileRequest.abort = () => {\r\n aborted = true;\r\n\r\n if (onLoadEnd) {\r\n onLoadEnd();\r\n }\r\n\r\n if (request && request.readyState !== (XMLHttpRequest.DONE || 4)) {\r\n request.abort();\r\n }\r\n\r\n if (retryHandle !== null) {\r\n clearTimeout(retryHandle);\r\n retryHandle = null;\r\n }\r\n\r\n request = null;\r\n };\r\n\r\n const handleError = (error: any) => {\r\n const message = error.message || \"Unknown error\";\r\n if (onError && request) {\r\n onError(new RequestFileError(message, request));\r\n } else {\r\n Logger.Error(message);\r\n }\r\n };\r\n\r\n const retryLoop = (retryIndex: number) => {\r\n if (!request) {\r\n return;\r\n }\r\n request.open(\"GET\", loadUrl);\r\n\r\n if (onOpened) {\r\n try {\r\n onOpened(request);\r\n } catch (e) {\r\n handleError(e);\r\n return;\r\n }\r\n }\r\n\r\n if (useArrayBuffer) {\r\n request.responseType = \"arraybuffer\";\r\n }\r\n\r\n if (onProgress) {\r\n request.addEventListener(\"progress\", onProgress);\r\n }\r\n\r\n if (onLoadEnd) {\r\n request.addEventListener(\"loadend\", onLoadEnd);\r\n }\r\n\r\n onReadyStateChange = () => {\r\n if (aborted || !request) {\r\n return;\r\n }\r\n\r\n // In case of undefined state in some browsers.\r\n if (request.readyState === (XMLHttpRequest.DONE || 4)) {\r\n // Some browsers have issues where onreadystatechange can be called multiple times with the same value.\r\n if (onReadyStateChange) {\r\n request.removeEventListener(\"readystatechange\", onReadyStateChange);\r\n }\r\n\r\n if ((request.status >= 200 && request.status < 300) || (request.status === 0 && (!IsWindowObjectExist() || IsFileURL()))) {\r\n try {\r\n if (onSuccess) {\r\n onSuccess(useArrayBuffer ? request.response : request.responseText, request);\r\n }\r\n } catch (e) {\r\n handleError(e);\r\n }\r\n return;\r\n }\r\n\r\n const retryStrategy = FileToolsOptions.DefaultRetryStrategy;\r\n if (retryStrategy) {\r\n const waitTime = retryStrategy(loadUrl, request, retryIndex);\r\n if (waitTime !== -1) {\r\n // Prevent the request from completing for retry.\r\n unbindEvents();\r\n\r\n request = new WebRequest();\r\n retryHandle = setTimeout(() => retryLoop(retryIndex + 1), waitTime);\r\n return;\r\n }\r\n }\r\n\r\n const error = new RequestFileError(\"Error status: \" + request.status + \" \" + request.statusText + \" - Unable to load \" + loadUrl, request);\r\n if (onError) {\r\n onError(error);\r\n }\r\n }\r\n };\r\n\r\n request.addEventListener(\"readystatechange\", onReadyStateChange);\r\n\r\n request.send();\r\n };\r\n\r\n retryLoop(0);\r\n };\r\n\r\n // Caching all files\r\n if (offlineProvider && offlineProvider.enableSceneOffline) {\r\n const noOfflineSupport = (request?: any) => {\r\n if (request && request.status > 400) {\r\n if (onError) {\r\n onError(request);\r\n }\r\n } else {\r\n requestFile();\r\n }\r\n };\r\n\r\n const loadFromOfflineSupport = () => {\r\n // TODO: database needs to support aborting and should return a IFileRequest\r\n\r\n if (offlineProvider) {\r\n offlineProvider.loadFile(\r\n FileToolsOptions.BaseUrl + url,\r\n (data) => {\r\n if (!aborted && onSuccess) {\r\n onSuccess(data);\r\n }\r\n\r\n fileRequest.onCompleteObservable.notifyObservers(fileRequest);\r\n },\r\n onProgress\r\n ? (event) => {\r\n if (!aborted && onProgress) {\r\n onProgress(event);\r\n }\r\n }\r\n : undefined,\r\n noOfflineSupport,\r\n useArrayBuffer\r\n );\r\n }\r\n };\r\n\r\n offlineProvider.open(loadFromOfflineSupport, noOfflineSupport);\r\n } else {\r\n requestFile();\r\n }\r\n\r\n return fileRequest;\r\n};\r\n\r\n/**\r\n * Checks if the loaded document was accessed via `file:`-Protocol.\r\n * @returns boolean\r\n * @internal\r\n */\r\nexport const IsFileURL = (): boolean => {\r\n return typeof location !== \"undefined\" && location.protocol === \"file:\";\r\n};\r\n\r\n/**\r\n * Test if the given uri is a valid base64 data url\r\n * @param uri The uri to test\r\n * @returns True if the uri is a base64 data url or false otherwise\r\n * @internal\r\n */\r\nexport const IsBase64DataUrl = (uri: string): boolean => {\r\n return Base64DataUrlRegEx.test(uri);\r\n};\r\n\r\nexport const TestBase64DataUrl = (uri: string): { match: boolean; type: string } => {\r\n const results = Base64DataUrlRegEx.exec(uri);\r\n if (results === null || results.length === 0) {\r\n return { match: false, type: \"\" };\r\n } else {\r\n const type = results[0].replace(\"data:\", \"\").replace(\"base64,\", \"\");\r\n return { match: true, type };\r\n }\r\n};\r\n\r\n/**\r\n * Decode the given base64 uri.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n * @internal\r\n */\r\nexport function DecodeBase64UrlToBinary(uri: string): ArrayBuffer {\r\n return DecodeBase64ToBinary(uri.split(\",\")[1]);\r\n}\r\n\r\n/**\r\n * Decode the given base64 uri into a UTF-8 encoded string.\r\n * @param uri The uri to decode\r\n * @returns The decoded base64 data.\r\n * @internal\r\n */\r\nexport const DecodeBase64UrlToString = (uri: string): string => {\r\n return DecodeBase64ToString(uri.split(\",\")[1]);\r\n};\r\n\r\n/**\r\n * This will be executed automatically for UMD and es5.\r\n * If esm dev wants the side effects to execute they will have to run it manually\r\n * Once we build native modules those need to be exported.\r\n * @internal\r\n */\r\nconst initSideEffects = () => {\r\n AbstractEngine._FileToolsLoadImage = LoadImage;\r\n EngineFunctionContext.loadFile = LoadFile;\r\n _functionContainer.loadFile = LoadFile;\r\n};\r\n\r\ninitSideEffects();\r\n\r\n// deprecated\r\n\r\n/**\r\n * FileTools defined as any.\r\n * This should not be imported or used in future releases or in any module in the framework\r\n * @internal\r\n * @deprecated import the needed function from fileTools.ts\r\n */\r\nexport let FileTools: {\r\n DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer;\r\n DecodeBase64UrlToString: (uri: string) => string;\r\n DefaultRetryStrategy: any;\r\n BaseUrl: any;\r\n CorsBehavior: any;\r\n PreprocessUrl: any;\r\n IsBase64DataUrl: (uri: string) => boolean;\r\n IsFileURL: () => boolean;\r\n LoadFile: (\r\n fileOrUrl: string | File,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string | undefined) => void,\r\n onProgress?: ((ev: ProgressEvent<EventTarget>) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((request?: WebRequest | undefined, exception?: LoadFileError | undefined) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest;\r\n LoadImage: (\r\n input: string | ArrayBuffer | Blob | ArrayBufferView,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string | undefined, exception?: any) => void,\r\n offlineProvider: Nullable<IOfflineProvider>,\r\n mimeType?: string | undefined,\r\n imageBitmapOptions?: ImageBitmapOptions | undefined\r\n ) => Nullable<HTMLImageElement>;\r\n ReadFile: (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: ((ev: ProgressEvent<EventTarget>) => any) | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: ReadFileError) => void) | undefined\r\n ) => IFileRequest;\r\n RequestFile: (\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest | undefined) => void,\r\n onProgress?: ((event: ProgressEvent<EventTarget>) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: RequestFileError) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest;\r\n SetCorsBehavior: (url: string | string[], element: { crossOrigin: string | null }) => void;\r\n};\r\n/**\r\n * @internal\r\n */\r\nexport const _injectLTSFileTools = (\r\n DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer,\r\n DecodeBase64UrlToString: (uri: string) => string,\r\n FileToolsOptions: { DefaultRetryStrategy: any; BaseUrl: any; CorsBehavior: any; PreprocessUrl: any; CleanUrl: any },\r\n IsBase64DataUrl: (uri: string) => boolean,\r\n IsFileURL: () => boolean,\r\n LoadFile: (\r\n fileOrUrl: string | File,\r\n onSuccess: (data: string | ArrayBuffer, responseURL?: string | undefined) => void,\r\n onProgress?: ((ev: ProgressEvent<EventTarget>) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((request?: WebRequest | undefined, exception?: LoadFileError | undefined) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest,\r\n LoadImage: (\r\n input: string | ArrayBuffer | ArrayBufferView | Blob,\r\n onLoad: (img: HTMLImageElement | ImageBitmap) => void,\r\n onError: (message?: string | undefined, exception?: any) => void,\r\n offlineProvider: Nullable<IOfflineProvider>,\r\n mimeType?: string,\r\n imageBitmapOptions?: ImageBitmapOptions | undefined\r\n ) => Nullable<HTMLImageElement>,\r\n ReadFile: (\r\n file: File,\r\n onSuccess: (data: any) => void,\r\n onProgress?: ((ev: ProgressEvent<EventTarget>) => any) | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: ReadFileError) => void) | undefined\r\n ) => IFileRequest,\r\n RequestFile: (\r\n url: string,\r\n onSuccess: (data: string | ArrayBuffer, request?: WebRequest | undefined) => void,\r\n onProgress?: ((event: ProgressEvent<EventTarget>) => void) | undefined,\r\n offlineProvider?: IOfflineProvider | undefined,\r\n useArrayBuffer?: boolean | undefined,\r\n onError?: ((error: RequestFileError) => void) | undefined,\r\n onOpened?: ((request: WebRequest) => void) | undefined\r\n ) => IFileRequest,\r\n SetCorsBehavior: (url: string | string[], element: { crossOrigin: string | null }) => void\r\n) => {\r\n /**\r\n * Backwards compatibility.\r\n * @internal\r\n * @deprecated\r\n */\r\n FileTools = {\r\n DecodeBase64UrlToBinary,\r\n DecodeBase64UrlToString,\r\n DefaultRetryStrategy: FileToolsOptions.DefaultRetryStrategy,\r\n BaseUrl: FileToolsOptions.BaseUrl,\r\n CorsBehavior: FileToolsOptions.CorsBehavior,\r\n PreprocessUrl: FileToolsOptions.PreprocessUrl,\r\n IsBase64DataUrl,\r\n IsFileURL,\r\n LoadFile,\r\n LoadImage,\r\n ReadFile,\r\n RequestFile,\r\n SetCorsBehavior,\r\n };\r\n\r\n Object.defineProperty(FileTools, \"DefaultRetryStrategy\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.DefaultRetryStrategy;\r\n },\r\n set: function (this: null, value: (url: string, request: WebRequest, retryIndex: number) => number) {\r\n FileToolsOptions.DefaultRetryStrategy = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"BaseUrl\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.BaseUrl;\r\n },\r\n set: function (this: null, value: string) {\r\n FileToolsOptions.BaseUrl = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"PreprocessUrl\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.PreprocessUrl;\r\n },\r\n set: function (this: null, value: (url: string) => string) {\r\n FileToolsOptions.PreprocessUrl = value;\r\n },\r\n });\r\n\r\n Object.defineProperty(FileTools, \"CorsBehavior\", {\r\n get: function (this: null) {\r\n return FileToolsOptions.CorsBehavior;\r\n },\r\n set: function (this: null, value: string | ((url: string | string[]) => string)) {\r\n FileToolsOptions.CorsBehavior = value;\r\n },\r\n });\r\n};\r\n\r\n_injectLTSFileTools(DecodeBase64UrlToBinary, DecodeBase64UrlToString, FileToolsOptions, IsBase64DataUrl, IsFileURL, LoadFile, LoadImage, ReadFile, RequestFile, SetCorsBehavior);\r\n"]}
|
|
@@ -2,6 +2,7 @@ import type { Nullable } from "../types";
|
|
|
2
2
|
import type { InternalTexture } from "../Materials/Textures/internalTexture";
|
|
3
3
|
import type { PostProcess } from "./postProcess";
|
|
4
4
|
import type { RenderTargetWrapper } from "../Engines/renderTargetWrapper";
|
|
5
|
+
import { Observable } from "../Misc/observable";
|
|
5
6
|
import type { Scene } from "../scene";
|
|
6
7
|
/**
|
|
7
8
|
* PostProcessManager is used to manage one or more post processes or post process pipelines
|
|
@@ -18,6 +19,7 @@ export declare class PostProcessManager {
|
|
|
18
19
|
constructor(scene: Scene);
|
|
19
20
|
private _prepareBuffers;
|
|
20
21
|
private _buildIndexBuffer;
|
|
22
|
+
onBeforeRenderObservable: Observable<PostProcessManager>;
|
|
21
23
|
/**
|
|
22
24
|
* Rebuilds the vertex buffers of the manager.
|
|
23
25
|
* @internal
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { VertexBuffer } from "../Buffers/buffer.js";
|
|
2
2
|
|
|
3
|
+
import { Observable } from "../Misc/observable.js";
|
|
3
4
|
/**
|
|
4
5
|
* PostProcessManager is used to manage one or more post processes or post process pipelines
|
|
5
6
|
* See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses
|
|
@@ -11,6 +12,7 @@ export class PostProcessManager {
|
|
|
11
12
|
*/
|
|
12
13
|
constructor(scene) {
|
|
13
14
|
this._vertexBuffers = {};
|
|
15
|
+
this.onBeforeRenderObservable = new Observable();
|
|
14
16
|
this._scene = scene;
|
|
15
17
|
}
|
|
16
18
|
_prepareBuffers() {
|
|
@@ -126,6 +128,7 @@ export class PostProcessManager {
|
|
|
126
128
|
if (!camera) {
|
|
127
129
|
return;
|
|
128
130
|
}
|
|
131
|
+
this.onBeforeRenderObservable.notifyObservers(this);
|
|
129
132
|
postProcesses = postProcesses || camera._postProcesses.filter((pp) => {
|
|
130
133
|
return pp != null;
|
|
131
134
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postProcessManager.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/postProcessManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { PostProcess } from \"./postProcess\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\n\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * PostProcessManager is used to manage one or more post processes or post process pipelines\r\n * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses\r\n */\r\nexport class PostProcessManager {\r\n private _scene: Scene;\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n\r\n /**\r\n * Creates a new instance PostProcess\r\n * @param scene The scene that the post process is associated with.\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n }\r\n\r\n private _prepareBuffers(): void {\r\n if (this._vertexBuffers[VertexBuffer.PositionKind]) {\r\n return;\r\n }\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._scene.getEngine(), vertices, VertexBuffer.PositionKind, false, false, 2);\r\n\r\n this._buildIndexBuffer();\r\n }\r\n\r\n private _buildIndexBuffer(): void {\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = this._scene.getEngine().createIndexBuffer(indices);\r\n }\r\n\r\n /**\r\n * Rebuilds the vertex buffers of the manager.\r\n * @internal\r\n */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (!vb) {\r\n return;\r\n }\r\n vb._rebuild();\r\n this._buildIndexBuffer();\r\n }\r\n\r\n // Methods\r\n /**\r\n * Prepares a frame to be run through a post process.\r\n * @param sourceTexture The input texture to the post processes. (default: null)\r\n * @param postProcesses An array of post processes to be run. (default: null)\r\n * @returns True if the post processes were able to be run.\r\n * @internal\r\n */\r\n public _prepareFrame(sourceTexture: Nullable<InternalTexture> = null, postProcesses: Nullable<PostProcess[]> = null): boolean {\r\n const camera = this._scene.activeCamera;\r\n if (!camera) {\r\n return false;\r\n }\r\n\r\n postProcesses = postProcesses || <Nullable<PostProcess[]>>camera._postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n\r\n if (!postProcesses || postProcesses.length === 0 || !this._scene.postProcessesEnabled) {\r\n return false;\r\n }\r\n\r\n postProcesses[0].activate(camera, sourceTexture, postProcesses !== null && postProcesses !== undefined);\r\n return true;\r\n }\r\n\r\n /**\r\n * Manually render a set of post processes to a texture.\r\n * Please note, the frame buffer won't be unbound after the call in case you have more render to do.\r\n * @param postProcesses An array of post processes to be run.\r\n * @param targetTexture The render target wrapper to render to.\r\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight\r\n * @param faceIndex defines the face to render to if a cubemap is defined as the target\r\n * @param lodLevel defines which lod of the texture to render to\r\n * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously\r\n */\r\n public directRender(\r\n postProcesses: PostProcess[],\r\n targetTexture: Nullable<RenderTargetWrapper> = null,\r\n forceFullscreenViewport = false,\r\n faceIndex = 0,\r\n lodLevel = 0,\r\n doNotBindFrambuffer = false\r\n ): void {\r\n const engine = this._scene.getEngine();\r\n\r\n for (let index = 0; index < postProcesses.length; index++) {\r\n if (index < postProcesses.length - 1) {\r\n postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture?.texture);\r\n } else {\r\n if (targetTexture) {\r\n engine.bindFramebuffer(targetTexture, faceIndex, undefined, undefined, forceFullscreenViewport, lodLevel);\r\n } else if (!doNotBindFrambuffer) {\r\n engine.restoreDefaultFramebuffer();\r\n }\r\n engine._debugInsertMarker?.(`post process ${postProcesses[index].name} output`);\r\n }\r\n\r\n const pp = postProcesses[index];\r\n const effect = pp.apply();\r\n\r\n if (effect) {\r\n pp.onBeforeRenderObservable.notifyObservers(effect);\r\n\r\n // VBOs\r\n this._prepareBuffers();\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n\r\n // Draw order\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n\r\n pp.onAfterRenderObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n // Restore depth buffer\r\n engine.setDepthBuffer(true);\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n /**\r\n * Finalize the result of the output of the postprocesses.\r\n * @param doNotPresent If true the result will not be displayed to the screen.\r\n * @param targetTexture The render target wrapper to render to.\r\n * @param faceIndex The index of the face to bind the target texture to.\r\n * @param postProcesses The array of post processes to render.\r\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false)\r\n * @internal\r\n */\r\n public _finalizeFrame(\r\n doNotPresent?: boolean,\r\n targetTexture?: RenderTargetWrapper,\r\n faceIndex?: number,\r\n postProcesses?: Array<PostProcess>,\r\n forceFullscreenViewport = false\r\n ): void {\r\n const camera = this._scene.activeCamera;\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n postProcesses = postProcesses || <Array<PostProcess>>camera._postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) {\r\n return;\r\n }\r\n const engine = this._scene.getEngine();\r\n\r\n for (let index = 0, len = postProcesses.length; index < len; index++) {\r\n const pp = postProcesses[index];\r\n\r\n if (index < len - 1) {\r\n pp._outputTexture = postProcesses[index + 1].activate(camera, targetTexture?.texture);\r\n } else {\r\n if (targetTexture) {\r\n engine.bindFramebuffer(targetTexture, faceIndex, undefined, undefined, forceFullscreenViewport);\r\n pp._outputTexture = targetTexture;\r\n } else {\r\n engine.restoreDefaultFramebuffer();\r\n pp._outputTexture = null;\r\n }\r\n engine._debugInsertMarker?.(`post process ${postProcesses[index].name} output`);\r\n }\r\n\r\n if (doNotPresent) {\r\n break;\r\n }\r\n\r\n const effect = pp.apply();\r\n\r\n if (effect) {\r\n pp.onBeforeRenderObservable.notifyObservers(effect);\r\n\r\n // VBOs\r\n this._prepareBuffers();\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n\r\n // Draw order\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n\r\n pp.onAfterRenderObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n // Restore states\r\n engine.setDepthBuffer(true);\r\n engine.setDepthWrite(true);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Disposes of the post process manager.\r\n */\r\n public dispose(): void {\r\n const buffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"postProcessManager.js","sourceRoot":"","sources":["../../../../dev/core/src/PostProcesses/postProcessManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport type { InternalTexture } from \"../Materials/Textures/internalTexture\";\r\nimport type { PostProcess } from \"./postProcess\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport type { DataBuffer } from \"../Buffers/dataBuffer\";\r\nimport type { RenderTargetWrapper } from \"../Engines/renderTargetWrapper\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Scene } from \"../scene\";\r\n\r\n/**\r\n * PostProcessManager is used to manage one or more post processes or post process pipelines\r\n * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses\r\n */\r\nexport class PostProcessManager {\r\n private _scene: Scene;\r\n private _indexBuffer: Nullable<DataBuffer>;\r\n private _vertexBuffers: { [key: string]: Nullable<VertexBuffer> } = {};\r\n\r\n /**\r\n * Creates a new instance PostProcess\r\n * @param scene The scene that the post process is associated with.\r\n */\r\n constructor(scene: Scene) {\r\n this._scene = scene;\r\n }\r\n\r\n private _prepareBuffers(): void {\r\n if (this._vertexBuffers[VertexBuffer.PositionKind]) {\r\n return;\r\n }\r\n\r\n // VBO\r\n const vertices = [];\r\n vertices.push(1, 1);\r\n vertices.push(-1, 1);\r\n vertices.push(-1, -1);\r\n vertices.push(1, -1);\r\n\r\n this._vertexBuffers[VertexBuffer.PositionKind] = new VertexBuffer(this._scene.getEngine(), vertices, VertexBuffer.PositionKind, false, false, 2);\r\n\r\n this._buildIndexBuffer();\r\n }\r\n\r\n private _buildIndexBuffer(): void {\r\n // Indices\r\n const indices = [];\r\n indices.push(0);\r\n indices.push(1);\r\n indices.push(2);\r\n\r\n indices.push(0);\r\n indices.push(2);\r\n indices.push(3);\r\n\r\n this._indexBuffer = this._scene.getEngine().createIndexBuffer(indices);\r\n }\r\n\r\n public onBeforeRenderObservable = new Observable<PostProcessManager>();\r\n\r\n /**\r\n * Rebuilds the vertex buffers of the manager.\r\n * @internal\r\n */\r\n public _rebuild(): void {\r\n const vb = this._vertexBuffers[VertexBuffer.PositionKind];\r\n\r\n if (!vb) {\r\n return;\r\n }\r\n vb._rebuild();\r\n this._buildIndexBuffer();\r\n }\r\n\r\n // Methods\r\n /**\r\n * Prepares a frame to be run through a post process.\r\n * @param sourceTexture The input texture to the post processes. (default: null)\r\n * @param postProcesses An array of post processes to be run. (default: null)\r\n * @returns True if the post processes were able to be run.\r\n * @internal\r\n */\r\n public _prepareFrame(sourceTexture: Nullable<InternalTexture> = null, postProcesses: Nullable<PostProcess[]> = null): boolean {\r\n const camera = this._scene.activeCamera;\r\n if (!camera) {\r\n return false;\r\n }\r\n\r\n postProcesses = postProcesses || <Nullable<PostProcess[]>>camera._postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n\r\n if (!postProcesses || postProcesses.length === 0 || !this._scene.postProcessesEnabled) {\r\n return false;\r\n }\r\n\r\n postProcesses[0].activate(camera, sourceTexture, postProcesses !== null && postProcesses !== undefined);\r\n return true;\r\n }\r\n\r\n /**\r\n * Manually render a set of post processes to a texture.\r\n * Please note, the frame buffer won't be unbound after the call in case you have more render to do.\r\n * @param postProcesses An array of post processes to be run.\r\n * @param targetTexture The render target wrapper to render to.\r\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight\r\n * @param faceIndex defines the face to render to if a cubemap is defined as the target\r\n * @param lodLevel defines which lod of the texture to render to\r\n * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously\r\n */\r\n public directRender(\r\n postProcesses: PostProcess[],\r\n targetTexture: Nullable<RenderTargetWrapper> = null,\r\n forceFullscreenViewport = false,\r\n faceIndex = 0,\r\n lodLevel = 0,\r\n doNotBindFrambuffer = false\r\n ): void {\r\n const engine = this._scene.getEngine();\r\n\r\n for (let index = 0; index < postProcesses.length; index++) {\r\n if (index < postProcesses.length - 1) {\r\n postProcesses[index + 1].activate(this._scene.activeCamera, targetTexture?.texture);\r\n } else {\r\n if (targetTexture) {\r\n engine.bindFramebuffer(targetTexture, faceIndex, undefined, undefined, forceFullscreenViewport, lodLevel);\r\n } else if (!doNotBindFrambuffer) {\r\n engine.restoreDefaultFramebuffer();\r\n }\r\n engine._debugInsertMarker?.(`post process ${postProcesses[index].name} output`);\r\n }\r\n\r\n const pp = postProcesses[index];\r\n const effect = pp.apply();\r\n\r\n if (effect) {\r\n pp.onBeforeRenderObservable.notifyObservers(effect);\r\n\r\n // VBOs\r\n this._prepareBuffers();\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n\r\n // Draw order\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n\r\n pp.onAfterRenderObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n // Restore depth buffer\r\n engine.setDepthBuffer(true);\r\n engine.setDepthWrite(true);\r\n }\r\n\r\n /**\r\n * Finalize the result of the output of the postprocesses.\r\n * @param doNotPresent If true the result will not be displayed to the screen.\r\n * @param targetTexture The render target wrapper to render to.\r\n * @param faceIndex The index of the face to bind the target texture to.\r\n * @param postProcesses The array of post processes to render.\r\n * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false)\r\n * @internal\r\n */\r\n public _finalizeFrame(\r\n doNotPresent?: boolean,\r\n targetTexture?: RenderTargetWrapper,\r\n faceIndex?: number,\r\n postProcesses?: Array<PostProcess>,\r\n forceFullscreenViewport = false\r\n ): void {\r\n const camera = this._scene.activeCamera;\r\n\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n this.onBeforeRenderObservable.notifyObservers(this);\r\n\r\n postProcesses = postProcesses || <Array<PostProcess>>camera._postProcesses.filter((pp) => {\r\n return pp != null;\r\n });\r\n if (postProcesses.length === 0 || !this._scene.postProcessesEnabled) {\r\n return;\r\n }\r\n const engine = this._scene.getEngine();\r\n\r\n for (let index = 0, len = postProcesses.length; index < len; index++) {\r\n const pp = postProcesses[index];\r\n\r\n if (index < len - 1) {\r\n pp._outputTexture = postProcesses[index + 1].activate(camera, targetTexture?.texture);\r\n } else {\r\n if (targetTexture) {\r\n engine.bindFramebuffer(targetTexture, faceIndex, undefined, undefined, forceFullscreenViewport);\r\n pp._outputTexture = targetTexture;\r\n } else {\r\n engine.restoreDefaultFramebuffer();\r\n pp._outputTexture = null;\r\n }\r\n engine._debugInsertMarker?.(`post process ${postProcesses[index].name} output`);\r\n }\r\n\r\n if (doNotPresent) {\r\n break;\r\n }\r\n\r\n const effect = pp.apply();\r\n\r\n if (effect) {\r\n pp.onBeforeRenderObservable.notifyObservers(effect);\r\n\r\n // VBOs\r\n this._prepareBuffers();\r\n engine.bindBuffers(this._vertexBuffers, this._indexBuffer, effect);\r\n\r\n // Draw order\r\n engine.drawElementsType(Constants.MATERIAL_TriangleFillMode, 0, 6);\r\n\r\n pp.onAfterRenderObservable.notifyObservers(effect);\r\n }\r\n }\r\n\r\n // Restore states\r\n engine.setDepthBuffer(true);\r\n engine.setDepthWrite(true);\r\n engine.setAlphaMode(Constants.ALPHA_DISABLE);\r\n }\r\n\r\n /**\r\n * Disposes of the post process manager.\r\n */\r\n public dispose(): void {\r\n const buffer = this._vertexBuffers[VertexBuffer.PositionKind];\r\n if (buffer) {\r\n buffer.dispose();\r\n this._vertexBuffers[VertexBuffer.PositionKind] = null;\r\n }\r\n\r\n if (this._indexBuffer) {\r\n this._scene.getEngine()._releaseBuffer(this._indexBuffer);\r\n this._indexBuffer = null;\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -18,7 +18,8 @@ import "../Shaders/volumetricLightScatteringPass.fragment.js";
|
|
|
18
18
|
import { Color4, Color3 } from "../Maths/math.color.js";
|
|
19
19
|
import { Viewport } from "../Maths/math.viewport.js";
|
|
20
20
|
import { RegisterClass } from "../Misc/typeStore.js";
|
|
21
|
-
import { PushAttributesForInstances } from "../Materials/materialHelper.functions.js";
|
|
21
|
+
import { BindBonesParameters, BindMorphTargetParameters, PrepareAttributesForMorphTargetsInfluencers, PushAttributesForInstances } from "../Materials/materialHelper.functions.js";
|
|
22
|
+
import { EffectFallbacks } from "../Materials/effectFallbacks.js";
|
|
22
23
|
/**
|
|
23
24
|
* Inspired by https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-13-volumetric-light-scattering-post-process
|
|
24
25
|
*/
|
|
@@ -144,15 +145,43 @@ export class VolumetricLightScatteringPostProcess extends PostProcess {
|
|
|
144
145
|
}
|
|
145
146
|
}
|
|
146
147
|
// Bones
|
|
147
|
-
|
|
148
|
+
const fallbacks = new EffectFallbacks();
|
|
149
|
+
if (mesh.useBones && mesh.computeBonesUsingShaders && mesh.skeleton) {
|
|
148
150
|
attribs.push(VertexBuffer.MatricesIndicesKind);
|
|
149
151
|
attribs.push(VertexBuffer.MatricesWeightsKind);
|
|
152
|
+
if (mesh.numBoneInfluencers > 4) {
|
|
153
|
+
attribs.push(VertexBuffer.MatricesIndicesExtraKind);
|
|
154
|
+
attribs.push(VertexBuffer.MatricesWeightsExtraKind);
|
|
155
|
+
}
|
|
150
156
|
defines.push("#define NUM_BONE_INFLUENCERS " + mesh.numBoneInfluencers);
|
|
151
|
-
|
|
157
|
+
if (mesh.numBoneInfluencers > 0) {
|
|
158
|
+
fallbacks.addCPUSkinningFallback(0, mesh);
|
|
159
|
+
}
|
|
160
|
+
const skeleton = mesh.skeleton;
|
|
161
|
+
if (skeleton.isUsingTextureForMatrices) {
|
|
162
|
+
defines.push("#define BONETEXTURE");
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
defines.push("#define BonesPerMesh " + (skeleton.bones.length + 1));
|
|
166
|
+
}
|
|
152
167
|
}
|
|
153
168
|
else {
|
|
154
169
|
defines.push("#define NUM_BONE_INFLUENCERS 0");
|
|
155
170
|
}
|
|
171
|
+
// Morph targets
|
|
172
|
+
const morphTargetManager = mesh.morphTargetManager;
|
|
173
|
+
let numMorphInfluencers = 0;
|
|
174
|
+
if (morphTargetManager) {
|
|
175
|
+
numMorphInfluencers = morphTargetManager.numMaxInfluencers || morphTargetManager.numInfluencers;
|
|
176
|
+
if (numMorphInfluencers > 0) {
|
|
177
|
+
defines.push("#define MORPHTARGETS");
|
|
178
|
+
defines.push("#define NUM_MORPH_INFLUENCERS " + numMorphInfluencers);
|
|
179
|
+
if (morphTargetManager.isUsingTextureForTargets) {
|
|
180
|
+
defines.push("#define MORPHTARGETS_TEXTURE");
|
|
181
|
+
}
|
|
182
|
+
PrepareAttributesForMorphTargetsInfluencers(attribs, mesh, numMorphInfluencers);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
156
185
|
// Instances
|
|
157
186
|
if (useInstances) {
|
|
158
187
|
defines.push("#define INSTANCES");
|
|
@@ -161,15 +190,49 @@ export class VolumetricLightScatteringPostProcess extends PostProcess {
|
|
|
161
190
|
defines.push("#define THIN_INSTANCES");
|
|
162
191
|
}
|
|
163
192
|
}
|
|
193
|
+
// Baked vertex animations
|
|
194
|
+
const bvaManager = mesh.bakedVertexAnimationManager;
|
|
195
|
+
if (bvaManager && bvaManager.isEnabled) {
|
|
196
|
+
defines.push("#define BAKED_VERTEX_ANIMATION_TEXTURE");
|
|
197
|
+
if (useInstances) {
|
|
198
|
+
attribs.push("bakedVertexAnimationSettingsInstanced");
|
|
199
|
+
}
|
|
200
|
+
}
|
|
164
201
|
// Get correct effect
|
|
165
202
|
const drawWrapper = subMesh._getDrawWrapper(undefined, true);
|
|
166
203
|
const cachedDefines = drawWrapper.defines;
|
|
167
204
|
const join = defines.join("\n");
|
|
168
205
|
if (cachedDefines !== join) {
|
|
206
|
+
const uniforms = [
|
|
207
|
+
"world",
|
|
208
|
+
"mBones",
|
|
209
|
+
"boneTextureWidth",
|
|
210
|
+
"viewProjection",
|
|
211
|
+
"diffuseMatrix",
|
|
212
|
+
"morphTargetInfluences",
|
|
213
|
+
"morphTargetCount",
|
|
214
|
+
"morphTargetTextureInfo",
|
|
215
|
+
"morphTargetTextureIndices",
|
|
216
|
+
"bakedVertexAnimationSettings",
|
|
217
|
+
"bakedVertexAnimationTextureSizeInverted",
|
|
218
|
+
"bakedVertexAnimationTime",
|
|
219
|
+
"bakedVertexAnimationTexture",
|
|
220
|
+
];
|
|
221
|
+
const samplers = ["diffuseSampler", "morphTargets", "boneSampler", "bakedVertexAnimationTexture"];
|
|
169
222
|
drawWrapper.setEffect(mesh
|
|
170
223
|
.getScene()
|
|
171
224
|
.getEngine()
|
|
172
|
-
.createEffect("volumetricLightScatteringPass",
|
|
225
|
+
.createEffect("volumetricLightScatteringPass", {
|
|
226
|
+
attributes: attribs,
|
|
227
|
+
uniformsNames: uniforms,
|
|
228
|
+
uniformBuffersNames: [],
|
|
229
|
+
samplers: samplers,
|
|
230
|
+
defines: join,
|
|
231
|
+
fallbacks: fallbacks,
|
|
232
|
+
onCompiled: null,
|
|
233
|
+
onError: null,
|
|
234
|
+
indexParameters: { maxSimultaneousMorphTargets: numMorphInfluencers },
|
|
235
|
+
}, mesh.getScene().getEngine()), join);
|
|
173
236
|
}
|
|
174
237
|
return drawWrapper.effect.isReady();
|
|
175
238
|
}
|
|
@@ -273,16 +336,24 @@ export class VolumetricLightScatteringPostProcess extends PostProcess {
|
|
|
273
336
|
else {
|
|
274
337
|
effect.setMatrix("viewProjection", scene.getTransformMatrix());
|
|
275
338
|
// Alpha test
|
|
276
|
-
if (material
|
|
339
|
+
if (material.needAlphaTesting()) {
|
|
277
340
|
const alphaTexture = material.getAlphaTestTexture();
|
|
278
|
-
effect.setTexture("diffuseSampler", alphaTexture);
|
|
279
341
|
if (alphaTexture) {
|
|
342
|
+
effect.setTexture("diffuseSampler", alphaTexture);
|
|
280
343
|
effect.setMatrix("diffuseMatrix", alphaTexture.getTextureMatrix());
|
|
281
344
|
}
|
|
282
345
|
}
|
|
283
346
|
// Bones
|
|
284
|
-
|
|
285
|
-
|
|
347
|
+
BindBonesParameters(renderingMesh, effect);
|
|
348
|
+
// Morph targets
|
|
349
|
+
BindMorphTargetParameters(renderingMesh, effect);
|
|
350
|
+
if (renderingMesh.morphTargetManager && renderingMesh.morphTargetManager.isUsingTextureForTargets) {
|
|
351
|
+
renderingMesh.morphTargetManager._bind(effect);
|
|
352
|
+
}
|
|
353
|
+
// Baked vertex animations
|
|
354
|
+
const bvaManager = subMesh.getMesh().bakedVertexAnimationManager;
|
|
355
|
+
if (bvaManager && bvaManager.isEnabled) {
|
|
356
|
+
bvaManager.bind(effect, hardwareInstancedRendering);
|
|
286
357
|
}
|
|
287
358
|
}
|
|
288
359
|
if (hardwareInstancedRendering && renderingMesh.hasThinInstances) {
|