@babylonjs/core 6.4.1 → 6.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/Animations/animation.d.ts +4 -0
  2. package/Animations/animation.js +13 -1
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/runtimeAnimation.js +9 -1
  5. package/Animations/runtimeAnimation.js.map +1 -1
  6. package/Audio/sound.js +3 -1
  7. package/Audio/sound.js.map +1 -1
  8. package/Bones/boneLookController.d.ts +5 -0
  9. package/Bones/boneLookController.js +17 -3
  10. package/Bones/boneLookController.js.map +1 -1
  11. package/Engines/Processors/iShaderProcessor.d.ts +1 -0
  12. package/Engines/Processors/iShaderProcessor.js.map +1 -1
  13. package/Engines/Processors/shaderCodeNode.js +3 -2
  14. package/Engines/Processors/shaderCodeNode.js.map +1 -1
  15. package/Engines/Processors/shaderProcessor.d.ts +1 -0
  16. package/Engines/Processors/shaderProcessor.js +45 -44
  17. package/Engines/Processors/shaderProcessor.js.map +1 -1
  18. package/Engines/WebGL/webGL2ShaderProcessors.d.ts +1 -0
  19. package/Engines/WebGL/webGL2ShaderProcessors.js +4 -0
  20. package/Engines/WebGL/webGL2ShaderProcessors.js.map +1 -1
  21. package/Engines/WebGPU/webgpuDrawContext.js +1 -1
  22. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  23. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.d.ts +1 -0
  24. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +16 -7
  25. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  26. package/Engines/engine.js +4 -4
  27. package/Engines/engine.js.map +1 -1
  28. package/Engines/thinEngine.js +2 -2
  29. package/Engines/thinEngine.js.map +1 -1
  30. package/Layers/layer.d.ts +5 -0
  31. package/Layers/layer.js +16 -6
  32. package/Layers/layer.js.map +1 -1
  33. package/Lights/Shadows/cascadedShadowGenerator.js +14 -2
  34. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  35. package/Lights/Shadows/shadowGenerator.js +1 -0
  36. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  37. package/Materials/Node/Blocks/PBR/anisotropyBlock.d.ts +4 -0
  38. package/Materials/Node/Blocks/PBR/anisotropyBlock.js +10 -0
  39. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  40. package/Materials/Node/Blocks/curveBlock.d.ts +97 -0
  41. package/Materials/Node/Blocks/curveBlock.js +287 -0
  42. package/Materials/Node/Blocks/curveBlock.js.map +1 -0
  43. package/Materials/Node/Blocks/index.d.ts +1 -0
  44. package/Materials/Node/Blocks/index.js +1 -0
  45. package/Materials/Node/Blocks/index.js.map +1 -1
  46. package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +26 -0
  47. package/Materials/PBR/pbrAnisotropicConfiguration.js +47 -0
  48. package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
  49. package/Materials/Textures/multiRenderTarget.js +1 -2
  50. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  51. package/Materials/Textures/renderTargetTexture.d.ts +6 -1
  52. package/Materials/Textures/renderTargetTexture.js +5 -3
  53. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  54. package/Materials/materialDefines.js +1 -0
  55. package/Materials/materialDefines.js.map +1 -1
  56. package/Meshes/Builders/textBuilder.d.ts +2 -1
  57. package/Meshes/Builders/textBuilder.js +14 -2
  58. package/Meshes/Builders/textBuilder.js.map +1 -1
  59. package/Meshes/WebGPU/webgpuDataBuffer.d.ts +1 -1
  60. package/Meshes/WebGPU/webgpuDataBuffer.js +2 -1
  61. package/Meshes/WebGPU/webgpuDataBuffer.js.map +1 -1
  62. package/Meshes/mesh.js +10 -8
  63. package/Meshes/mesh.js.map +1 -1
  64. package/Meshes/transformNode.js +4 -0
  65. package/Meshes/transformNode.js.map +1 -1
  66. package/Misc/assetsManager.d.ts +78 -0
  67. package/Misc/assetsManager.js +60 -1
  68. package/Misc/assetsManager.js.map +1 -1
  69. package/Misc/filesInput.d.ts +1 -1
  70. package/Misc/filesInput.js +5 -5
  71. package/Misc/filesInput.js.map +1 -1
  72. package/Physics/v2/Plugins/havokPlugin.js +2 -2
  73. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  74. package/Physics/v2/physicsAggregate.d.ts +1 -0
  75. package/Physics/v2/physicsAggregate.js +6 -5
  76. package/Physics/v2/physicsAggregate.js.map +1 -1
  77. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.d.ts +10 -1
  78. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +77 -10
  79. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  80. package/Rendering/depthRenderer.js +1 -0
  81. package/Rendering/depthRenderer.js.map +1 -1
  82. package/Rendering/prePassRenderer.d.ts +4 -0
  83. package/Rendering/prePassRenderer.js +14 -1
  84. package/Rendering/prePassRenderer.js.map +1 -1
  85. package/Shaders/ShadersInclude/pbrBlockAnisotropic.js +6 -3
  86. package/Shaders/ShadersInclude/pbrBlockAnisotropic.js.map +1 -1
  87. package/Shaders/ShadersInclude/pbrHelperFunctions.js +4 -1
  88. package/Shaders/ShadersInclude/pbrHelperFunctions.js.map +1 -1
  89. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +4 -1
  90. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  91. package/Shaders/glowMapGeneration.fragment.js +1 -1
  92. package/Shaders/glowMapGeneration.fragment.js.map +1 -1
  93. package/Shaders/pbr.fragment.js +1 -1
  94. package/Shaders/pbr.fragment.js.map +1 -1
  95. package/Shaders/screenSpaceReflection2.fragment.d.ts +1 -0
  96. package/Shaders/screenSpaceReflection2.fragment.js +16 -10
  97. package/Shaders/screenSpaceReflection2.fragment.js.map +1 -1
  98. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.d.ts +2 -0
  99. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js +13 -2
  100. package/Shaders/screenSpaceReflection2BlurCombiner.fragment.js.map +1 -1
  101. package/package.json +1 -1
  102. package/scene.js +24 -13
  103. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"webGL2ShaderProcessors.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/WebGL/webGL2ShaderProcessors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,gBAAgB;AAChB,MAAM,OAAO,qBAAqB;IAAlC;QACW,mBAAc,GAAG,cAAc,CAAC,IAAI,CAAC;IAoChD,CAAC;IAlCU,kBAAkB,CAAC,SAAiB;QACvC,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,gBAAgB,CAAC,OAAe,EAAE,UAAmB;QACxD,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAEM,aAAa,CAAC,IAAY,EAAE,OAAiB,EAAE,UAAmB;QACrE,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC,0CAA0C,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/F,oBAAoB;QACpB,MAAM,KAAK,GAAG,gJAAgJ,CAAC;QAC/J,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE/B,uBAAuB;QACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE;YACZ,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;YAC5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;YAC9D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;YACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,8CAA8C,CAAC,GAAG,YAAY,CAAC,CAAC;SAC7I;aAAM;YACH,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,IAAI,qBAAqB,EAAE;gBACvB,OAAO,sEAAsE,GAAG,IAAI,CAAC;aACxF;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { IShaderProcessor } from \"../Processors/iShaderProcessor\";\r\n\r\n/** @internal */\r\nexport class WebGL2ShaderProcessor implements IShaderProcessor {\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n public attributeProcessor(attribute: string) {\r\n return attribute.replace(\"attribute\", \"in\");\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean) {\r\n return varying.replace(\"varying\", isFragment ? \"in\" : \"out\");\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webGL2ShaderProcessors.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/WebGL/webGL2ShaderProcessors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEhD,gBAAgB;AAChB,MAAM,OAAO,qBAAqB;IAAlC;QACW,mBAAc,GAAG,cAAc,CAAC,IAAI,CAAC;IAwChD,CAAC;IAtCU,kBAAkB,CAAC,SAAiB;QACvC,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAEM,YAAY,CAAC,OAAe,EAAE,WAAoB;QACrD,OAAO,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAEM,gBAAgB,CAAC,OAAe,EAAE,UAAmB;QACxD,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAEM,aAAa,CAAC,IAAY,EAAE,OAAiB,EAAE,UAAmB;QACrE,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC,0CAA0C,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/F,oBAAoB;QACpB,MAAM,KAAK,GAAG,gJAAgJ,CAAC;QAC/J,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE/B,uBAAuB;QACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,UAAU,EAAE;YACZ,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;YAC5D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;YAC9D,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YACrD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC;YACxD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,8CAA8C,CAAC,GAAG,YAAY,CAAC,CAAC;SAC7I;aAAM;YACH,MAAM,qBAAqB,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1E,IAAI,qBAAqB,EAAE;gBACvB,OAAO,sEAAsE,GAAG,IAAI,CAAC;aACxF;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\nimport type { IShaderProcessor } from \"../Processors/iShaderProcessor\";\r\n\r\nconst varyingRegex = /(flat\\s)?\\s*varying\\s*.*/;\r\n\r\n/** @internal */\r\nexport class WebGL2ShaderProcessor implements IShaderProcessor {\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n\r\n public attributeProcessor(attribute: string) {\r\n return attribute.replace(\"attribute\", \"in\");\r\n }\r\n\r\n public varyingCheck(varying: string, _isFragment: boolean) {\r\n return varyingRegex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean) {\r\n return varying.replace(\"varying\", isFragment ? \"in\" : \"out\");\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n"]}
@@ -23,7 +23,7 @@ export class WebGPUDrawContext {
23
23
  this._indirectDrawData = undefined;
24
24
  }
25
25
  else {
26
- this.indirectDrawBuffer = this._bufferManager.createRawBuffer(40, WebGPUConstants.BufferUsage.CopyDst | WebGPUConstants.BufferUsage.Indirect);
26
+ this.indirectDrawBuffer = this._bufferManager.createRawBuffer(20, WebGPUConstants.BufferUsage.CopyDst | WebGPUConstants.BufferUsage.Indirect | WebGPUConstants.BufferUsage.Storage);
27
27
  this._indirectDrawData = new Uint32Array(5);
28
28
  this._indirectDrawData[3] = 0;
29
29
  this._indirectDrawData[4] = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuDrawContext.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/WebGPU/webgpuDrawContext.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { IDrawContext } from \"../IDrawContext\";\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUDrawContext implements IDrawContext {\r\n private static _Counter = 0;\r\n\r\n public fastBundle?: GPURenderBundle; // used only when compatibilityMode==false (fast mode)\r\n public bindGroups?: GPUBindGroup[]; // cache of the bind groups. Will be reused for the next draw if isDirty==false (and materialContext.isDirty==false)\r\n\r\n public uniqueId: number;\r\n\r\n public buffers: { [name: string]: Nullable<WebGPUDataBuffer> };\r\n\r\n public indirectDrawBuffer?: GPUBuffer;\r\n\r\n private _materialContextUpdateId: number;\r\n private _bufferManager: WebGPUBufferManager;\r\n private _useInstancing: boolean;\r\n private _indirectDrawData?: Uint32Array;\r\n private _currentInstanceCount: number;\r\n private _isDirty: boolean;\r\n\r\n public isDirty(materialContextUpdateId: number): boolean {\r\n return this._isDirty || this._materialContextUpdateId !== materialContextUpdateId;\r\n }\r\n\r\n public resetIsDirty(materialContextUpdateId: number): void {\r\n this._isDirty = false;\r\n this._materialContextUpdateId = materialContextUpdateId;\r\n }\r\n\r\n public get useInstancing() {\r\n return this._useInstancing;\r\n }\r\n\r\n public set useInstancing(use: boolean) {\r\n if (this._useInstancing === use) {\r\n return;\r\n }\r\n\r\n if (!use) {\r\n if (this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n }\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n } else {\r\n this.indirectDrawBuffer = this._bufferManager.createRawBuffer(40, WebGPUConstants.BufferUsage.CopyDst | WebGPUConstants.BufferUsage.Indirect);\r\n this._indirectDrawData = new Uint32Array(5);\r\n this._indirectDrawData[3] = 0;\r\n this._indirectDrawData[4] = 0;\r\n }\r\n\r\n this._useInstancing = use;\r\n this._currentInstanceCount = -1;\r\n }\r\n\r\n constructor(bufferManager: WebGPUBufferManager) {\r\n this._bufferManager = bufferManager;\r\n this.uniqueId = WebGPUDrawContext._Counter++;\r\n this._useInstancing = false;\r\n this._currentInstanceCount = 0;\r\n this.reset();\r\n }\r\n\r\n public reset(): void {\r\n this.buffers = {};\r\n this._isDirty = true;\r\n this._materialContextUpdateId = 0;\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n }\r\n\r\n public setBuffer(name: string, buffer: Nullable<WebGPUDataBuffer>): void {\r\n this._isDirty ||= buffer?.uniqueId !== this.buffers[name]?.uniqueId;\r\n\r\n this.buffers[name] = buffer;\r\n }\r\n\r\n public setIndirectData(indexOrVertexCount: number, instanceCount: number, firstIndexOrVertex: number): void {\r\n if (instanceCount === this._currentInstanceCount || !this.indirectDrawBuffer || !this._indirectDrawData) {\r\n // The current buffer is already up to date so do nothing\r\n // Note that we only check for instanceCount and not indexOrVertexCount nor firstIndexOrVertex because those values\r\n // are supposed to not change during the lifetime of a draw context\r\n return;\r\n }\r\n this._currentInstanceCount = instanceCount;\r\n\r\n this._indirectDrawData![0] = indexOrVertexCount;\r\n this._indirectDrawData![1] = instanceCount;\r\n this._indirectDrawData![2] = firstIndexOrVertex;\r\n\r\n this._bufferManager.setRawData(this.indirectDrawBuffer, 0, this._indirectDrawData, 0, 20);\r\n }\r\n\r\n public dispose(): void {\r\n if (this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n }\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n this.buffers = undefined as any;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuDrawContext.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/WebGPU/webgpuDrawContext.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { IDrawContext } from \"../IDrawContext\";\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUDrawContext implements IDrawContext {\r\n private static _Counter = 0;\r\n\r\n public fastBundle?: GPURenderBundle; // used only when compatibilityMode==false (fast mode)\r\n public bindGroups?: GPUBindGroup[]; // cache of the bind groups. Will be reused for the next draw if isDirty==false (and materialContext.isDirty==false)\r\n\r\n public uniqueId: number;\r\n\r\n public buffers: { [name: string]: Nullable<WebGPUDataBuffer> };\r\n\r\n public indirectDrawBuffer?: GPUBuffer;\r\n\r\n private _materialContextUpdateId: number;\r\n private _bufferManager: WebGPUBufferManager;\r\n private _useInstancing: boolean;\r\n private _indirectDrawData?: Uint32Array;\r\n private _currentInstanceCount: number;\r\n private _isDirty: boolean;\r\n\r\n public isDirty(materialContextUpdateId: number): boolean {\r\n return this._isDirty || this._materialContextUpdateId !== materialContextUpdateId;\r\n }\r\n\r\n public resetIsDirty(materialContextUpdateId: number): void {\r\n this._isDirty = false;\r\n this._materialContextUpdateId = materialContextUpdateId;\r\n }\r\n\r\n public get useInstancing() {\r\n return this._useInstancing;\r\n }\r\n\r\n public set useInstancing(use: boolean) {\r\n if (this._useInstancing === use) {\r\n return;\r\n }\r\n\r\n if (!use) {\r\n if (this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n }\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n } else {\r\n this.indirectDrawBuffer = this._bufferManager.createRawBuffer(\r\n 20,\r\n WebGPUConstants.BufferUsage.CopyDst | WebGPUConstants.BufferUsage.Indirect | WebGPUConstants.BufferUsage.Storage\r\n );\r\n this._indirectDrawData = new Uint32Array(5);\r\n this._indirectDrawData[3] = 0;\r\n this._indirectDrawData[4] = 0;\r\n }\r\n\r\n this._useInstancing = use;\r\n this._currentInstanceCount = -1;\r\n }\r\n\r\n constructor(bufferManager: WebGPUBufferManager) {\r\n this._bufferManager = bufferManager;\r\n this.uniqueId = WebGPUDrawContext._Counter++;\r\n this._useInstancing = false;\r\n this._currentInstanceCount = 0;\r\n this.reset();\r\n }\r\n\r\n public reset(): void {\r\n this.buffers = {};\r\n this._isDirty = true;\r\n this._materialContextUpdateId = 0;\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n }\r\n\r\n public setBuffer(name: string, buffer: Nullable<WebGPUDataBuffer>): void {\r\n this._isDirty ||= buffer?.uniqueId !== this.buffers[name]?.uniqueId;\r\n\r\n this.buffers[name] = buffer;\r\n }\r\n\r\n public setIndirectData(indexOrVertexCount: number, instanceCount: number, firstIndexOrVertex: number): void {\r\n if (instanceCount === this._currentInstanceCount || !this.indirectDrawBuffer || !this._indirectDrawData) {\r\n // The current buffer is already up to date so do nothing\r\n // Note that we only check for instanceCount and not indexOrVertexCount nor firstIndexOrVertex because those values\r\n // are supposed to not change during the lifetime of a draw context\r\n return;\r\n }\r\n this._currentInstanceCount = instanceCount;\r\n\r\n this._indirectDrawData![0] = indexOrVertexCount;\r\n this._indirectDrawData![1] = instanceCount;\r\n this._indirectDrawData![2] = firstIndexOrVertex;\r\n\r\n this._bufferManager.setRawData(this.indirectDrawBuffer, 0, this._indirectDrawData, 0, 20);\r\n }\r\n\r\n public dispose(): void {\r\n if (this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n }\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n this.buffers = undefined as any;\r\n }\r\n}\r\n"]}
@@ -23,6 +23,7 @@ export declare class WebGPUShaderProcessorGLSL extends WebGPUShaderProcessor {
23
23
  }): [string, string, number];
24
24
  initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void;
25
25
  preProcessShaderCode(code: string, isFragment: boolean): string;
26
+ varyingCheck(varying: string, isFragment: boolean): boolean;
26
27
  varyingProcessor(varying: string, isFragment: boolean, preProcessors: {
27
28
  [key: string]: string;
28
29
  }): string;
@@ -53,16 +53,25 @@ export class WebGPUShaderProcessorGLSL extends WebGPUShaderProcessor {
53
53
  }
54
54
  return alreadyInjected ? code : ubDeclaration + code;
55
55
  }
56
+ varyingCheck(varying, isFragment) {
57
+ const outRegex = /(flat\s)?\s*out/;
58
+ const inRegex = /(flat\s)?\s*in/;
59
+ const varyingRegex = /(flat\s)?\s*varying/;
60
+ const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;
61
+ return regex.test(varying);
62
+ }
56
63
  varyingProcessor(varying, isFragment, preProcessors) {
64
+ var _a;
57
65
  this._preProcessors = preProcessors;
58
- const outRegex = /\s*out\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/gm;
59
- const inRegex = /\s*in\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/gm;
60
- const varyingRegex = /\s*varying\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/gm;
66
+ const outRegex = /\s*(flat)?\s*out\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/gm;
67
+ const inRegex = /\s*(flat)?\s*in\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/gm;
68
+ const varyingRegex = /\s*(flat)?\s*varying\s+(?:(?:highp)?|(?:lowp)?)\s*(\S+)\s+(\S+)\s*;/gm;
61
69
  const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;
62
70
  const match = regex.exec(varying);
63
71
  if (match !== null) {
64
- const varyingType = match[1];
65
- const name = match[2];
72
+ const interpolationQualifier = (_a = match[1]) !== null && _a !== void 0 ? _a : "";
73
+ const varyingType = match[2];
74
+ const name = match[3];
66
75
  let location;
67
76
  if (isFragment) {
68
77
  location = this._webgpuProcessingContext.availableVaryings[name];
@@ -74,9 +83,9 @@ export class WebGPUShaderProcessorGLSL extends WebGPUShaderProcessor {
74
83
  else {
75
84
  location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);
76
85
  this._webgpuProcessingContext.availableVaryings[name] = location;
77
- this._missingVaryings[location] = `layout(location = ${location}) in ${varyingType} ${name};`;
86
+ this._missingVaryings[location] = `layout(location = ${location}) ${interpolationQualifier} in ${varyingType} ${name};`;
78
87
  }
79
- varying = varying.replace(match[0], location === undefined ? "" : `layout(location = ${location}) ${isFragment ? "in" : "out"} ${varyingType} ${name};`);
88
+ varying = varying.replace(match[0], location === undefined ? "" : `layout(location = ${location}) ${interpolationQualifier} ${isFragment ? "in" : "out"} ${varyingType} ${name};`);
80
89
  }
81
90
  return varying;
82
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuShaderProcessorsGLSL.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/WebGPU/webgpuShaderProcessorsGLSL.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\nimport type { WebGPUBufferDescription } from \"./webgpuShaderProcessingContext\";\r\nimport { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\n/** @internal */\r\nexport class WebGPUShaderProcessorGLSL extends WebGPUShaderProcessor {\r\n protected _missingVaryings: Array<string> = [];\r\n protected _textureArrayProcessing: Array<string> = [];\r\n protected _preProcessors: { [key: string]: string };\r\n protected _vertexIsGLES3: boolean = false;\r\n protected _fragmentIsGLES3: boolean = false;\r\n\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n public parseGLES3 = true;\r\n public attributeKeywordName: string | undefined;\r\n public varyingVertexKeywordName: string | undefined;\r\n public varyingFragmentKeywordName: string | undefined;\r\n\r\n protected _getArraySize(name: string, type: string, preProcessors: { [key: string]: string }): [string, string, number] {\r\n let length = 0;\r\n const startArray = name.indexOf(\"[\");\r\n const endArray = name.indexOf(\"]\");\r\n if (startArray > 0 && endArray > 0) {\r\n const lengthInString = name.substring(startArray + 1, endArray);\r\n length = +lengthInString;\r\n if (isNaN(length)) {\r\n length = +preProcessors[lengthInString.trim()];\r\n }\r\n name = name.substr(0, startArray);\r\n }\r\n return [name, type, length];\r\n }\r\n\r\n public initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void {\r\n this._webgpuProcessingContext = processingContext as WebGPUShaderProcessingContext;\r\n\r\n this._missingVaryings.length = 0;\r\n this._textureArrayProcessing.length = 0;\r\n this.attributeKeywordName = undefined;\r\n this.varyingVertexKeywordName = undefined;\r\n this.varyingFragmentKeywordName = undefined;\r\n }\r\n\r\n public preProcessShaderCode(code: string, isFragment: boolean): string {\r\n const ubDeclaration = `// Internals UBO\\r\\nuniform ${WebGPUShaderProcessor.InternalsUBOName} {\\nfloat yFactor_;\\nfloat textureOutputHeight_;\\n};\\n`;\r\n const alreadyInjected = code.indexOf(\"// Internals UBO\") !== -1;\r\n\r\n if (isFragment) {\r\n this._fragmentIsGLES3 = code.indexOf(\"#version 3\") !== -1;\r\n if (this._fragmentIsGLES3) {\r\n this.varyingFragmentKeywordName = \"in\";\r\n }\r\n return alreadyInjected ? code : ubDeclaration + \"##INJECTCODE##\\n\" + code;\r\n }\r\n\r\n this._vertexIsGLES3 = code.indexOf(\"#version 3\") !== -1;\r\n if (this._vertexIsGLES3) {\r\n this.attributeKeywordName = \"in\";\r\n this.varyingVertexKeywordName = \"out\";\r\n }\r\n return alreadyInjected ? code : ubDeclaration + code;\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean, preProcessors: { [key: string]: string }) {\r\n this._preProcessors = preProcessors;\r\n\r\n const outRegex = /\\s*out\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const inRegex = /\\s*in\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const varyingRegex = /\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;\r\n const match = regex.exec(varying);\r\n if (match !== null) {\r\n const varyingType = match[1];\r\n const name = match[2];\r\n let location: number;\r\n if (isFragment) {\r\n location = this._webgpuProcessingContext.availableVaryings[name];\r\n this._missingVaryings[location] = \"\";\r\n if (location === undefined) {\r\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\r\n }\r\n } else {\r\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\r\n this._webgpuProcessingContext.availableVaryings[name] = location;\r\n this._missingVaryings[location] = `layout(location = ${location}) in ${varyingType} ${name};`;\r\n }\r\n\r\n varying = varying.replace(match[0], location === undefined ? \"\" : `layout(location = ${location}) ${isFragment ? \"in\" : \"out\"} ${varyingType} ${name};`);\r\n }\r\n return varying;\r\n }\r\n\r\n public attributeProcessor(attribute: string, preProcessors: { [key: string]: string }) {\r\n this._preProcessors = preProcessors;\r\n\r\n const inRegex = /\\s*in\\s+(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const regex = this._vertexIsGLES3 ? inRegex : attribRegex;\r\n const match = regex.exec(attribute);\r\n if (match !== null) {\r\n const attributeType = match[1];\r\n const name = match[2];\r\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\r\n\r\n this._webgpuProcessingContext.availableAttributes[name] = location;\r\n this._webgpuProcessingContext.orderedAttributes[location] = name;\r\n\r\n attribute = attribute.replace(match[0], `layout(location = ${location}) in ${attributeType} ${name};`);\r\n }\r\n return attribute;\r\n }\r\n\r\n public uniformProcessor(uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n this._preProcessors = preProcessors;\r\n\r\n const uniformRegex = /\\s*uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const match = uniformRegex.exec(uniform);\r\n if (match !== null) {\r\n let uniformType = match[1];\r\n let name = match[2];\r\n\r\n if (uniformType.indexOf(\"sampler\") === 0 || uniformType.indexOf(\"sampler\") === 1) {\r\n let arraySize = 0; // 0 means the texture is not declared as an array\r\n\r\n [name, uniformType, arraySize] = this._getArraySize(name, uniformType, preProcessors);\r\n\r\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\r\n if (!textureInfo) {\r\n textureInfo = {\r\n autoBindSampler: true,\r\n isTextureArray: arraySize > 0,\r\n isStorageTexture: false,\r\n textures: [],\r\n sampleType: WebGPUConstants.TextureSampleType.Float,\r\n };\r\n for (let i = 0; i < (arraySize || 1); ++i) {\r\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\r\n }\r\n }\r\n\r\n const samplerType = WebGPUShaderProcessor._SamplerTypeByWebGLSamplerType[uniformType] ?? \"sampler\";\r\n const isComparisonSampler = !!WebGPUShaderProcessor._IsComparisonSamplerByWebGPUSamplerType[samplerType];\r\n const samplerBindingType = isComparisonSampler ? WebGPUConstants.SamplerBindingType.Comparison : WebGPUConstants.SamplerBindingType.Filtering;\r\n const samplerName = name + WebGPUShaderProcessor.AutoSamplerSuffix;\r\n\r\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[samplerName];\r\n if (!samplerInfo) {\r\n samplerInfo = {\r\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\r\n type: samplerBindingType,\r\n };\r\n }\r\n\r\n const componentType = uniformType.charAt(0) === \"u\" ? \"u\" : uniformType.charAt(0) === \"i\" ? \"i\" : \"\";\r\n\r\n if (componentType) {\r\n uniformType = uniformType.substr(1);\r\n }\r\n\r\n const sampleType = isComparisonSampler\r\n ? WebGPUConstants.TextureSampleType.Depth\r\n : componentType === \"u\"\r\n ? WebGPUConstants.TextureSampleType.Uint\r\n : componentType === \"i\"\r\n ? WebGPUConstants.TextureSampleType.Sint\r\n : WebGPUConstants.TextureSampleType.Float;\r\n\r\n textureInfo.sampleType = sampleType;\r\n\r\n const isTextureArray = arraySize > 0;\r\n const samplerGroupIndex = samplerInfo.binding.groupIndex;\r\n const samplerBindingIndex = samplerInfo.binding.bindingIndex;\r\n const samplerFunction = WebGPUShaderProcessor._SamplerFunctionByWebGLSamplerType[uniformType];\r\n const textureType = WebGPUShaderProcessor._TextureTypeByWebGLSamplerType[uniformType];\r\n const textureDimension = WebGPUShaderProcessor._GpuTextureViewDimensionByWebGPUTextureType[textureType];\r\n\r\n // Manage textures and samplers.\r\n if (!isTextureArray) {\r\n arraySize = 1;\r\n uniform = `layout(set = ${samplerGroupIndex}, binding = ${samplerBindingIndex}) uniform ${componentType}${samplerType} ${samplerName};\r\n layout(set = ${textureInfo.textures[0].groupIndex}, binding = ${textureInfo.textures[0].bindingIndex}) uniform ${textureType} ${name}Texture;\r\n #define ${name} ${componentType}${samplerFunction}(${name}Texture, ${samplerName})`;\r\n } else {\r\n const layouts = [];\r\n layouts.push(`layout(set = ${samplerGroupIndex}, binding = ${samplerBindingIndex}) uniform ${componentType}${samplerType} ${samplerName};`);\r\n uniform = `\\r\\n`;\r\n for (let i = 0; i < arraySize; ++i) {\r\n const textureSetIndex = textureInfo.textures[i].groupIndex;\r\n const textureBindingIndex = textureInfo.textures[i].bindingIndex;\r\n\r\n layouts.push(`layout(set = ${textureSetIndex}, binding = ${textureBindingIndex}) uniform ${textureType} ${name}Texture${i};`);\r\n\r\n uniform += `${i > 0 ? \"\\r\\n\" : \"\"}#define ${name}${i} ${componentType}${samplerFunction}(${name}Texture${i}, ${samplerName})`;\r\n }\r\n uniform = layouts.join(\"\\r\\n\") + uniform;\r\n this._textureArrayProcessing.push(name);\r\n }\r\n\r\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\r\n this._webgpuProcessingContext.availableSamplers[samplerName] = samplerInfo;\r\n\r\n this._addSamplerBindingDescription(samplerName, samplerInfo, !isFragment);\r\n\r\n for (let i = 0; i < arraySize; ++i) {\r\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, null, !isFragment);\r\n }\r\n } else {\r\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\r\n uniform = \"\";\r\n }\r\n }\r\n return uniform;\r\n }\r\n\r\n public uniformBufferProcessor(uniformBuffer: string, isFragment: boolean): string {\r\n const uboRegex = /uniform\\s+(\\w+)/gm;\r\n\r\n const match = uboRegex.exec(uniformBuffer);\r\n if (match !== null) {\r\n const name = match[1];\r\n\r\n let uniformBufferInfo = this._webgpuProcessingContext.availableBuffers[name];\r\n if (!uniformBufferInfo) {\r\n const knownUBO = WebGPUShaderProcessingContext.KnownUBOs[name];\r\n\r\n let binding;\r\n if (knownUBO && knownUBO.binding.groupIndex !== -1) {\r\n binding = knownUBO.binding;\r\n } else {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n\r\n uniformBufferInfo = { binding };\r\n this._webgpuProcessingContext.availableBuffers[name] = uniformBufferInfo;\r\n }\r\n\r\n this._addBufferBindingDescription(name, uniformBufferInfo, WebGPUConstants.BufferBindingType.Uniform, !isFragment);\r\n\r\n uniformBuffer = uniformBuffer.replace(\"uniform\", `layout(set = ${uniformBufferInfo.binding.groupIndex}, binding = ${uniformBufferInfo.binding.bindingIndex}) uniform`);\r\n }\r\n return uniformBuffer;\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>, engine: ThinEngine) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n const hasFragCoord = code.indexOf(\"gl_FragCoord\") >= 0;\r\n const fragCoordCode = `\r\n glFragCoord_ = gl_FragCoord;\r\n if (yFactor_ == 1.) {\r\n glFragCoord_.y = textureOutputHeight_ - glFragCoord_.y;\r\n }\r\n `;\r\n\r\n const injectCode = hasFragCoord ? \"vec4 glFragCoord_;\\n\" : \"\";\r\n\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/gl_FragCoord/g, \"glFragCoord_\");\r\n if (!this._fragmentIsGLES3) {\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const match = /^\\s*out\\s+\\S+\\s+\\S+\\s*;/gm.exec(code);\r\n if (match !== null) {\r\n code = code.substring(0, match.index) + \"layout(location = 0) \" + code.substring(match.index);\r\n }\r\n }\r\n code = code.replace(/dFdy/g, \"(-yFactor_)*dFdy\"); // will also handle dFdyCoarse and dFdyFine\r\n code = code.replace(\"##INJECTCODE##\", injectCode);\r\n\r\n if (hasFragCoord) {\r\n code = this._injectStartingAndEndingCode(code, \"void main\", fragCoordCode);\r\n }\r\n } else {\r\n code = code.replace(/gl_InstanceID/g, \"gl_InstanceIndex\");\r\n code = code.replace(/gl_VertexID/g, \"gl_VertexIndex\");\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n // Flip Y + convert z range from [-1,1] to [0,1]\r\n if (!isFragment) {\r\n const lastClosingCurly = code.lastIndexOf(\"}\");\r\n code = code.substring(0, lastClosingCurly);\r\n code += \"gl_Position.y *= yFactor_;\\n\";\r\n if (!engine.isNDCHalfZRange) {\r\n code += \"gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\\n\";\r\n }\r\n code += \"}\";\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _applyTextureArrayProcessing(code: string, name: string): string {\r\n // Replaces the occurrences of name[XX] by nameXX\r\n const regex = new RegExp(name + \"\\\\s*\\\\[(.+)?\\\\]\", \"gm\");\r\n let match = regex.exec(code);\r\n\r\n while (match !== null) {\r\n const index = match[1];\r\n let iindex = +index;\r\n if (this._preProcessors && isNaN(iindex)) {\r\n iindex = +this._preProcessors[index.trim()];\r\n }\r\n code = code.replace(match[0], name + iindex);\r\n match = regex.exec(code);\r\n }\r\n\r\n return code;\r\n }\r\n\r\n protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string {\r\n let ubo = `layout(set = ${uniformBufferDescription.binding.groupIndex}, binding = ${uniformBufferDescription.binding.bindingIndex}) uniform ${name} {\\n `;\r\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\r\n if (leftOverUniform.length > 0) {\r\n ubo += ` ${leftOverUniform.type} ${leftOverUniform.name}[${leftOverUniform.length}];\\n`;\r\n } else {\r\n ubo += ` ${leftOverUniform.type} ${leftOverUniform.name};\\n`;\r\n }\r\n }\r\n ubo += \"};\\n\\n\";\r\n\r\n return ubo;\r\n }\r\n\r\n public finalizeShaders(vertexCode: string, fragmentCode: string): { vertexCode: string; fragmentCode: string } {\r\n // make replacements for texture names in the texture array case\r\n for (let i = 0; i < this._textureArrayProcessing.length; ++i) {\r\n const name = this._textureArrayProcessing[i];\r\n vertexCode = this._applyTextureArrayProcessing(vertexCode, name);\r\n fragmentCode = this._applyTextureArrayProcessing(fragmentCode, name);\r\n }\r\n\r\n // inject the missing varying in the fragment shader\r\n for (let i = 0; i < this._missingVaryings.length; ++i) {\r\n const decl = this._missingVaryings[i];\r\n if (decl && decl.length > 0) {\r\n fragmentCode = decl + \"\\n\" + fragmentCode;\r\n }\r\n }\r\n\r\n // Builds the leftover UBOs.\r\n const leftOverUBO = this._buildLeftOverUBO();\r\n\r\n vertexCode = leftOverUBO + vertexCode;\r\n fragmentCode = leftOverUBO + fragmentCode;\r\n\r\n this._collectBindingNames();\r\n this._preCreateBindGroupEntries();\r\n\r\n this._preProcessors = null as any;\r\n\r\n return { vertexCode, fragmentCode };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuShaderProcessorsGLSL.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Engines/WebGPU/webgpuShaderProcessorsGLSL.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\nimport type { WebGPUBufferDescription } from \"./webgpuShaderProcessingContext\";\r\nimport { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\n/** @internal */\r\nexport class WebGPUShaderProcessorGLSL extends WebGPUShaderProcessor {\r\n protected _missingVaryings: Array<string> = [];\r\n protected _textureArrayProcessing: Array<string> = [];\r\n protected _preProcessors: { [key: string]: string };\r\n protected _vertexIsGLES3: boolean = false;\r\n protected _fragmentIsGLES3: boolean = false;\r\n\r\n public shaderLanguage = ShaderLanguage.GLSL;\r\n public parseGLES3 = true;\r\n public attributeKeywordName: string | undefined;\r\n public varyingVertexKeywordName: string | undefined;\r\n public varyingFragmentKeywordName: string | undefined;\r\n\r\n protected _getArraySize(name: string, type: string, preProcessors: { [key: string]: string }): [string, string, number] {\r\n let length = 0;\r\n const startArray = name.indexOf(\"[\");\r\n const endArray = name.indexOf(\"]\");\r\n if (startArray > 0 && endArray > 0) {\r\n const lengthInString = name.substring(startArray + 1, endArray);\r\n length = +lengthInString;\r\n if (isNaN(length)) {\r\n length = +preProcessors[lengthInString.trim()];\r\n }\r\n name = name.substr(0, startArray);\r\n }\r\n return [name, type, length];\r\n }\r\n\r\n public initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void {\r\n this._webgpuProcessingContext = processingContext as WebGPUShaderProcessingContext;\r\n\r\n this._missingVaryings.length = 0;\r\n this._textureArrayProcessing.length = 0;\r\n this.attributeKeywordName = undefined;\r\n this.varyingVertexKeywordName = undefined;\r\n this.varyingFragmentKeywordName = undefined;\r\n }\r\n\r\n public preProcessShaderCode(code: string, isFragment: boolean): string {\r\n const ubDeclaration = `// Internals UBO\\r\\nuniform ${WebGPUShaderProcessor.InternalsUBOName} {\\nfloat yFactor_;\\nfloat textureOutputHeight_;\\n};\\n`;\r\n const alreadyInjected = code.indexOf(\"// Internals UBO\") !== -1;\r\n\r\n if (isFragment) {\r\n this._fragmentIsGLES3 = code.indexOf(\"#version 3\") !== -1;\r\n if (this._fragmentIsGLES3) {\r\n this.varyingFragmentKeywordName = \"in\";\r\n }\r\n return alreadyInjected ? code : ubDeclaration + \"##INJECTCODE##\\n\" + code;\r\n }\r\n\r\n this._vertexIsGLES3 = code.indexOf(\"#version 3\") !== -1;\r\n if (this._vertexIsGLES3) {\r\n this.attributeKeywordName = \"in\";\r\n this.varyingVertexKeywordName = \"out\";\r\n }\r\n return alreadyInjected ? code : ubDeclaration + code;\r\n }\r\n\r\n public varyingCheck(varying: string, isFragment: boolean) {\r\n const outRegex = /(flat\\s)?\\s*out/;\r\n const inRegex = /(flat\\s)?\\s*in/;\r\n const varyingRegex = /(flat\\s)?\\s*varying/;\r\n\r\n const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;\r\n\r\n return regex.test(varying);\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean, preProcessors: { [key: string]: string }) {\r\n this._preProcessors = preProcessors;\r\n\r\n const outRegex = /\\s*(flat)?\\s*out\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const inRegex = /\\s*(flat)?\\s*in\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const varyingRegex = /\\s*(flat)?\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const regex = isFragment && this._fragmentIsGLES3 ? inRegex : !isFragment && this._vertexIsGLES3 ? outRegex : varyingRegex;\r\n const match = regex.exec(varying);\r\n if (match !== null) {\r\n const interpolationQualifier = match[1] ?? \"\";\r\n const varyingType = match[2];\r\n const name = match[3];\r\n let location: number;\r\n if (isFragment) {\r\n location = this._webgpuProcessingContext.availableVaryings[name];\r\n this._missingVaryings[location] = \"\";\r\n if (location === undefined) {\r\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\r\n }\r\n } else {\r\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\r\n this._webgpuProcessingContext.availableVaryings[name] = location;\r\n this._missingVaryings[location] = `layout(location = ${location}) ${interpolationQualifier} in ${varyingType} ${name};`;\r\n }\r\n\r\n varying = varying.replace(\r\n match[0],\r\n location === undefined ? \"\" : `layout(location = ${location}) ${interpolationQualifier} ${isFragment ? \"in\" : \"out\"} ${varyingType} ${name};`\r\n );\r\n }\r\n return varying;\r\n }\r\n\r\n public attributeProcessor(attribute: string, preProcessors: { [key: string]: string }) {\r\n this._preProcessors = preProcessors;\r\n\r\n const inRegex = /\\s*in\\s+(\\S+)\\s+(\\S+)\\s*;/gm;\r\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const regex = this._vertexIsGLES3 ? inRegex : attribRegex;\r\n const match = regex.exec(attribute);\r\n if (match !== null) {\r\n const attributeType = match[1];\r\n const name = match[2];\r\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\r\n\r\n this._webgpuProcessingContext.availableAttributes[name] = location;\r\n this._webgpuProcessingContext.orderedAttributes[location] = name;\r\n\r\n attribute = attribute.replace(match[0], `layout(location = ${location}) in ${attributeType} ${name};`);\r\n }\r\n return attribute;\r\n }\r\n\r\n public uniformProcessor(uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n this._preProcessors = preProcessors;\r\n\r\n const uniformRegex = /\\s*uniform\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s+(\\S+)\\s*;/gm;\r\n\r\n const match = uniformRegex.exec(uniform);\r\n if (match !== null) {\r\n let uniformType = match[1];\r\n let name = match[2];\r\n\r\n if (uniformType.indexOf(\"sampler\") === 0 || uniformType.indexOf(\"sampler\") === 1) {\r\n let arraySize = 0; // 0 means the texture is not declared as an array\r\n\r\n [name, uniformType, arraySize] = this._getArraySize(name, uniformType, preProcessors);\r\n\r\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\r\n if (!textureInfo) {\r\n textureInfo = {\r\n autoBindSampler: true,\r\n isTextureArray: arraySize > 0,\r\n isStorageTexture: false,\r\n textures: [],\r\n sampleType: WebGPUConstants.TextureSampleType.Float,\r\n };\r\n for (let i = 0; i < (arraySize || 1); ++i) {\r\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\r\n }\r\n }\r\n\r\n const samplerType = WebGPUShaderProcessor._SamplerTypeByWebGLSamplerType[uniformType] ?? \"sampler\";\r\n const isComparisonSampler = !!WebGPUShaderProcessor._IsComparisonSamplerByWebGPUSamplerType[samplerType];\r\n const samplerBindingType = isComparisonSampler ? WebGPUConstants.SamplerBindingType.Comparison : WebGPUConstants.SamplerBindingType.Filtering;\r\n const samplerName = name + WebGPUShaderProcessor.AutoSamplerSuffix;\r\n\r\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[samplerName];\r\n if (!samplerInfo) {\r\n samplerInfo = {\r\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\r\n type: samplerBindingType,\r\n };\r\n }\r\n\r\n const componentType = uniformType.charAt(0) === \"u\" ? \"u\" : uniformType.charAt(0) === \"i\" ? \"i\" : \"\";\r\n\r\n if (componentType) {\r\n uniformType = uniformType.substr(1);\r\n }\r\n\r\n const sampleType = isComparisonSampler\r\n ? WebGPUConstants.TextureSampleType.Depth\r\n : componentType === \"u\"\r\n ? WebGPUConstants.TextureSampleType.Uint\r\n : componentType === \"i\"\r\n ? WebGPUConstants.TextureSampleType.Sint\r\n : WebGPUConstants.TextureSampleType.Float;\r\n\r\n textureInfo.sampleType = sampleType;\r\n\r\n const isTextureArray = arraySize > 0;\r\n const samplerGroupIndex = samplerInfo.binding.groupIndex;\r\n const samplerBindingIndex = samplerInfo.binding.bindingIndex;\r\n const samplerFunction = WebGPUShaderProcessor._SamplerFunctionByWebGLSamplerType[uniformType];\r\n const textureType = WebGPUShaderProcessor._TextureTypeByWebGLSamplerType[uniformType];\r\n const textureDimension = WebGPUShaderProcessor._GpuTextureViewDimensionByWebGPUTextureType[textureType];\r\n\r\n // Manage textures and samplers.\r\n if (!isTextureArray) {\r\n arraySize = 1;\r\n uniform = `layout(set = ${samplerGroupIndex}, binding = ${samplerBindingIndex}) uniform ${componentType}${samplerType} ${samplerName};\r\n layout(set = ${textureInfo.textures[0].groupIndex}, binding = ${textureInfo.textures[0].bindingIndex}) uniform ${textureType} ${name}Texture;\r\n #define ${name} ${componentType}${samplerFunction}(${name}Texture, ${samplerName})`;\r\n } else {\r\n const layouts = [];\r\n layouts.push(`layout(set = ${samplerGroupIndex}, binding = ${samplerBindingIndex}) uniform ${componentType}${samplerType} ${samplerName};`);\r\n uniform = `\\r\\n`;\r\n for (let i = 0; i < arraySize; ++i) {\r\n const textureSetIndex = textureInfo.textures[i].groupIndex;\r\n const textureBindingIndex = textureInfo.textures[i].bindingIndex;\r\n\r\n layouts.push(`layout(set = ${textureSetIndex}, binding = ${textureBindingIndex}) uniform ${textureType} ${name}Texture${i};`);\r\n\r\n uniform += `${i > 0 ? \"\\r\\n\" : \"\"}#define ${name}${i} ${componentType}${samplerFunction}(${name}Texture${i}, ${samplerName})`;\r\n }\r\n uniform = layouts.join(\"\\r\\n\") + uniform;\r\n this._textureArrayProcessing.push(name);\r\n }\r\n\r\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\r\n this._webgpuProcessingContext.availableSamplers[samplerName] = samplerInfo;\r\n\r\n this._addSamplerBindingDescription(samplerName, samplerInfo, !isFragment);\r\n\r\n for (let i = 0; i < arraySize; ++i) {\r\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, null, !isFragment);\r\n }\r\n } else {\r\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\r\n uniform = \"\";\r\n }\r\n }\r\n return uniform;\r\n }\r\n\r\n public uniformBufferProcessor(uniformBuffer: string, isFragment: boolean): string {\r\n const uboRegex = /uniform\\s+(\\w+)/gm;\r\n\r\n const match = uboRegex.exec(uniformBuffer);\r\n if (match !== null) {\r\n const name = match[1];\r\n\r\n let uniformBufferInfo = this._webgpuProcessingContext.availableBuffers[name];\r\n if (!uniformBufferInfo) {\r\n const knownUBO = WebGPUShaderProcessingContext.KnownUBOs[name];\r\n\r\n let binding;\r\n if (knownUBO && knownUBO.binding.groupIndex !== -1) {\r\n binding = knownUBO.binding;\r\n } else {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n\r\n uniformBufferInfo = { binding };\r\n this._webgpuProcessingContext.availableBuffers[name] = uniformBufferInfo;\r\n }\r\n\r\n this._addBufferBindingDescription(name, uniformBufferInfo, WebGPUConstants.BufferBindingType.Uniform, !isFragment);\r\n\r\n uniformBuffer = uniformBuffer.replace(\"uniform\", `layout(set = ${uniformBufferInfo.binding.groupIndex}, binding = ${uniformBufferInfo.binding.bindingIndex}) uniform`);\r\n }\r\n return uniformBuffer;\r\n }\r\n\r\n public postProcessor(code: string, defines: string[], isFragment: boolean, processingContext: Nullable<ShaderProcessingContext>, engine: ThinEngine) {\r\n const hasDrawBuffersExtension = code.search(/#extension.+GL_EXT_draw_buffers.+require/) !== -1;\r\n\r\n // Remove extensions\r\n const regex = /#extension.+(GL_OVR_multiview2|GL_OES_standard_derivatives|GL_EXT_shader_texture_lod|GL_EXT_frag_depth|GL_EXT_draw_buffers).+(enable|require)/g;\r\n code = code.replace(regex, \"\");\r\n\r\n // Replace instructions\r\n code = code.replace(/texture2D\\s*\\(/g, \"texture(\");\r\n if (isFragment) {\r\n const hasFragCoord = code.indexOf(\"gl_FragCoord\") >= 0;\r\n const fragCoordCode = `\r\n glFragCoord_ = gl_FragCoord;\r\n if (yFactor_ == 1.) {\r\n glFragCoord_.y = textureOutputHeight_ - glFragCoord_.y;\r\n }\r\n `;\r\n\r\n const injectCode = hasFragCoord ? \"vec4 glFragCoord_;\\n\" : \"\";\r\n\r\n code = code.replace(/texture2DLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCubeLodEXT\\s*\\(/g, \"textureLod(\");\r\n code = code.replace(/textureCube\\s*\\(/g, \"texture(\");\r\n code = code.replace(/gl_FragDepthEXT/g, \"gl_FragDepth\");\r\n code = code.replace(/gl_FragColor/g, \"glFragColor\");\r\n code = code.replace(/gl_FragData/g, \"glFragData\");\r\n code = code.replace(/gl_FragCoord/g, \"glFragCoord_\");\r\n if (!this._fragmentIsGLES3) {\r\n code = code.replace(/void\\s+?main\\s*\\(/g, (hasDrawBuffersExtension ? \"\" : \"layout(location = 0) out vec4 glFragColor;\\n\") + \"void main(\");\r\n } else {\r\n const match = /^\\s*out\\s+\\S+\\s+\\S+\\s*;/gm.exec(code);\r\n if (match !== null) {\r\n code = code.substring(0, match.index) + \"layout(location = 0) \" + code.substring(match.index);\r\n }\r\n }\r\n code = code.replace(/dFdy/g, \"(-yFactor_)*dFdy\"); // will also handle dFdyCoarse and dFdyFine\r\n code = code.replace(\"##INJECTCODE##\", injectCode);\r\n\r\n if (hasFragCoord) {\r\n code = this._injectStartingAndEndingCode(code, \"void main\", fragCoordCode);\r\n }\r\n } else {\r\n code = code.replace(/gl_InstanceID/g, \"gl_InstanceIndex\");\r\n code = code.replace(/gl_VertexID/g, \"gl_VertexIndex\");\r\n const hasMultiviewExtension = defines.indexOf(\"#define MULTIVIEW\") !== -1;\r\n if (hasMultiviewExtension) {\r\n return \"#extension GL_OVR_multiview2 : require\\nlayout (num_views = 2) in;\\n\" + code;\r\n }\r\n }\r\n\r\n // Flip Y + convert z range from [-1,1] to [0,1]\r\n if (!isFragment) {\r\n const lastClosingCurly = code.lastIndexOf(\"}\");\r\n code = code.substring(0, lastClosingCurly);\r\n code += \"gl_Position.y *= yFactor_;\\n\";\r\n if (!engine.isNDCHalfZRange) {\r\n code += \"gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\\n\";\r\n }\r\n code += \"}\";\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _applyTextureArrayProcessing(code: string, name: string): string {\r\n // Replaces the occurrences of name[XX] by nameXX\r\n const regex = new RegExp(name + \"\\\\s*\\\\[(.+)?\\\\]\", \"gm\");\r\n let match = regex.exec(code);\r\n\r\n while (match !== null) {\r\n const index = match[1];\r\n let iindex = +index;\r\n if (this._preProcessors && isNaN(iindex)) {\r\n iindex = +this._preProcessors[index.trim()];\r\n }\r\n code = code.replace(match[0], name + iindex);\r\n match = regex.exec(code);\r\n }\r\n\r\n return code;\r\n }\r\n\r\n protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string {\r\n let ubo = `layout(set = ${uniformBufferDescription.binding.groupIndex}, binding = ${uniformBufferDescription.binding.bindingIndex}) uniform ${name} {\\n `;\r\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\r\n if (leftOverUniform.length > 0) {\r\n ubo += ` ${leftOverUniform.type} ${leftOverUniform.name}[${leftOverUniform.length}];\\n`;\r\n } else {\r\n ubo += ` ${leftOverUniform.type} ${leftOverUniform.name};\\n`;\r\n }\r\n }\r\n ubo += \"};\\n\\n\";\r\n\r\n return ubo;\r\n }\r\n\r\n public finalizeShaders(vertexCode: string, fragmentCode: string): { vertexCode: string; fragmentCode: string } {\r\n // make replacements for texture names in the texture array case\r\n for (let i = 0; i < this._textureArrayProcessing.length; ++i) {\r\n const name = this._textureArrayProcessing[i];\r\n vertexCode = this._applyTextureArrayProcessing(vertexCode, name);\r\n fragmentCode = this._applyTextureArrayProcessing(fragmentCode, name);\r\n }\r\n\r\n // inject the missing varying in the fragment shader\r\n for (let i = 0; i < this._missingVaryings.length; ++i) {\r\n const decl = this._missingVaryings[i];\r\n if (decl && decl.length > 0) {\r\n fragmentCode = decl + \"\\n\" + fragmentCode;\r\n }\r\n }\r\n\r\n // Builds the leftover UBOs.\r\n const leftOverUBO = this._buildLeftOverUBO();\r\n\r\n vertexCode = leftOverUBO + vertexCode;\r\n fragmentCode = leftOverUBO + fragmentCode;\r\n\r\n this._collectBindingNames();\r\n this._preCreateBindGroupEntries();\r\n\r\n this._preProcessors = null as any;\r\n\r\n return { vertexCode, fragmentCode };\r\n }\r\n}\r\n"]}
package/Engines/engine.js CHANGED
@@ -801,12 +801,12 @@ export class Engine extends ThinEngine {
801
801
  var _a;
802
802
  let postProcessInput = null;
803
803
  if (postProcess) {
804
- if (postProcess._textures.data[postProcess._currentRenderTextureInd]) {
805
- postProcessInput = postProcess._textures.data[postProcess._currentRenderTextureInd];
806
- }
807
- else if (postProcess._forcedOutputTexture) {
804
+ if (postProcess._forcedOutputTexture) {
808
805
  postProcessInput = postProcess._forcedOutputTexture;
809
806
  }
807
+ else if (postProcess._textures.data[postProcess._currentRenderTextureInd]) {
808
+ postProcessInput = postProcess._textures.data[postProcess._currentRenderTextureInd];
809
+ }
810
810
  }
811
811
  this._bindTexture(channel, (_a = postProcessInput === null || postProcessInput === void 0 ? void 0 : postProcessInput.texture) !== null && _a !== void 0 ? _a : null, name);
812
812
  }