@zephyr3d/editor 0.3.8 → 0.3.9

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 (137) hide show
  1. package/dist/assets/{index-BZ1L8ggE.js → index-CO6yA4Rj.js} +313 -11
  2. package/dist/assistant/zephyr-types-index.json +13834 -11679
  3. package/dist/index.html +1 -1
  4. package/dist/modules/zephyr3d_backend-webgpu.js +1 -1
  5. package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
  6. package/dist/modules/zephyr3d_device.js +2 -2
  7. package/dist/modules/zephyr3d_device.js.map +1 -1
  8. package/dist/modules/zephyr3d_scene.js +2325 -515
  9. package/dist/modules/zephyr3d_scene.js.map +1 -1
  10. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +1 -1
  11. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
  12. package/dist/vendor/zephyr3d/device/dist/device.js +2 -2
  13. package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
  14. package/dist/vendor/zephyr3d/scene/dist/app/engine.js +3 -1
  15. package/dist/vendor/zephyr3d/scene/dist/app/engine.js.map +1 -1
  16. package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js +1 -0
  17. package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js.map +1 -1
  18. package/dist/vendor/zephyr3d/scene/dist/camera/camera.js +87 -0
  19. package/dist/vendor/zephyr3d/scene/dist/camera/camera.js.map +1 -1
  20. package/dist/vendor/zephyr3d/scene/dist/index.d.ts +158 -4
  21. package/dist/vendor/zephyr3d/scene/dist/index.js +3 -0
  22. package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
  23. package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js +8 -1
  24. package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js.map +1 -1
  25. package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js +6 -0
  26. package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js.map +1 -1
  27. package/dist/vendor/zephyr3d/scene/dist/material/skin.js +263 -0
  28. package/dist/vendor/zephyr3d/scene/dist/material/skin.js.map +1 -0
  29. package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js +3 -0
  30. package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js.map +1 -1
  31. package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js +194 -0
  32. package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js.map +1 -0
  33. package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js +26 -49
  34. package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js.map +1 -1
  35. package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js +1 -0
  36. package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js.map +1 -1
  37. package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js +2 -40
  38. package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js.map +1 -1
  39. package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js +1 -0
  40. package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js.map +1 -1
  41. package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js +1 -0
  42. package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js.map +1 -1
  43. package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js +1 -0
  44. package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js.map +1 -1
  45. package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js +1 -0
  46. package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js.map +1 -1
  47. package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js +1 -0
  48. package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js.map +1 -1
  49. package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js +4 -1
  50. package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js.map +1 -1
  51. package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js +1 -0
  52. package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js.map +1 -1
  53. package/dist/vendor/zephyr3d/scene/dist/render/renderer.js +1 -0
  54. package/dist/vendor/zephyr3d/scene/dist/render/renderer.js.map +1 -1
  55. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js +12 -5
  56. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  57. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +78 -8
  58. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  59. package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js +1 -0
  60. package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js.map +1 -1
  61. package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js +1 -0
  62. package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js.map +1 -1
  63. package/dist/vendor/zephyr3d/scene/dist/scene/environment.js +1 -0
  64. package/dist/vendor/zephyr3d/scene/dist/scene/environment.js.map +1 -1
  65. package/dist/vendor/zephyr3d/scene/dist/scene/light.js +158 -154
  66. package/dist/vendor/zephyr3d/scene/dist/scene/light.js.map +1 -1
  67. package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js +1 -0
  68. package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js.map +1 -1
  69. package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js +1 -0
  70. package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js.map +1 -1
  71. package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js +1 -0
  72. package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js.map +1 -1
  73. package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js +1 -0
  74. package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js.map +1 -1
  75. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
  76. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
  77. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js +1 -0
  78. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js.map +1 -1
  79. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js +1 -0
  80. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  81. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js +1 -0
  82. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  83. package/dist/vendor/zephyr3d/scene/dist/scene/water.js +1 -0
  84. package/dist/vendor/zephyr3d/scene/dist/scene/water.js.map +1 -1
  85. package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js +617 -1
  86. package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js.map +1 -1
  87. package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js +1 -0
  88. package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js.map +1 -1
  89. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js +1 -0
  90. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js.map +1 -1
  91. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js +1 -0
  92. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js.map +1 -1
  93. package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js +182 -0
  94. package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js.map +1 -0
  95. package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js +1 -0
  96. package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js.map +1 -1
  97. package/dist/vendor/zephyr3d/scene/dist/shadow/shadow_impl.js.map +1 -1
  98. package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js +183 -105
  99. package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js.map +1 -1
  100. package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js +1 -0
  101. package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js.map +1 -1
  102. package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js +1 -0
  103. package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js.map +1 -1
  104. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +3 -1
  105. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
  106. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +1 -0
  107. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
  108. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js +1 -0
  109. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js.map +1 -1
  110. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js +122 -0
  111. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
  112. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js +1 -0
  113. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js.map +1 -1
  114. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js +102 -21
  115. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js.map +1 -1
  116. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js +195 -3
  117. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js.map +1 -1
  118. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js +1 -0
  119. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js.map +1 -1
  120. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js +1 -0
  121. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js.map +1 -1
  122. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js +1 -0
  123. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js.map +1 -1
  124. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js +1 -0
  125. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js.map +1 -1
  126. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js +1 -0
  127. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js.map +1 -1
  128. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js +1 -0
  129. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js.map +1 -1
  130. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js +1 -0
  131. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js.map +1 -1
  132. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js +1 -0
  133. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js.map +1 -1
  134. package/dist/vendor/zephyr3d/scene/dist/values.js +1 -0
  135. package/dist/vendor/zephyr3d/scene/dist/values.js.map +1 -1
  136. package/electron/main.cjs +30 -6
  137. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"render_queue.js","sources":["../../src/render/render_queue.ts"],"sourcesContent":["import type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Disposable, objectKeys, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { BatchDrawable, Drawable } from './drawable';\r\nimport type { DirectionalLight, PunctualLight } from '../scene/light';\r\nimport type { RenderPass } from '.';\r\nimport { QUEUE_TRANSPARENT, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Material } from '../material';\r\nimport { ShaderHelper } from '../material';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @public */\r\nexport type CachedBindGroup = {\r\n bindGroup: BindGroup;\r\n buffer: Float32Array;\r\n offset: number;\r\n dirty: boolean;\r\n};\r\n\r\nconst maxBufferSizeInFloats = 65536 / 4;\r\n\r\n/**\r\n * Instance bind group allocator\r\n * @public\r\n */\r\nexport class InstanceBindGroupAllocator {\r\n private static _instanceBindGroupLayout: Nullable<BindGroupLayout> = null;\r\n _bindGroupList: CachedBindGroup[] = [];\r\n private _allocFrameStamp: number;\r\n constructor() {\r\n this._allocFrameStamp = -1;\r\n this._bindGroupList = [];\r\n }\r\n allocateInstanceBindGroup(framestamp: number, sizeInFloats: number) {\r\n // Reset if render frame changed\r\n if (this._allocFrameStamp !== framestamp) {\r\n this._allocFrameStamp = framestamp;\r\n for (const k of this._bindGroupList) {\r\n k.offset = 0;\r\n }\r\n }\r\n for (const k of this._bindGroupList) {\r\n if (k.offset + sizeInFloats <= maxBufferSizeInFloats) {\r\n k.dirty = true;\r\n return k;\r\n }\r\n }\r\n if (!InstanceBindGroupAllocator._instanceBindGroupLayout) {\r\n const buildInfo = new ProgramBuilder(getDevice()).buildRender({\r\n vertex(pb) {\r\n this[ShaderHelper.getInstanceDataUniformName()] = pb.vec4[65536 >> 4]().uniformBuffer(3);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n pb.main(function () {});\r\n }\r\n });\r\n InstanceBindGroupAllocator._instanceBindGroupLayout = buildInfo[2][3];\r\n }\r\n const bindGroup = {\r\n bindGroup: getDevice().createBindGroup(InstanceBindGroupAllocator._instanceBindGroupLayout),\r\n buffer: new Float32Array(maxBufferSizeInFloats),\r\n offset: 0,\r\n dirty: true\r\n };\r\n this._bindGroupList.push(bindGroup);\r\n return bindGroup;\r\n }\r\n}\r\n\r\nconst defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();\r\nconst tmpDrawablePos = new Vector3();\r\n\r\n/**\r\n * Instance data\r\n * @public\r\n */\r\nexport interface InstanceData {\r\n bindGroup: CachedBindGroup;\r\n stride: number;\r\n offset: number;\r\n numInstances: number;\r\n}\r\n\r\n/**\r\n * Render queue item\r\n * @public\r\n */\r\nexport interface RenderQueueItem {\r\n drawable: Drawable;\r\n sortDistance: number;\r\n instanceColor?: Vector4;\r\n instanceData: Nullable<InstanceData>;\r\n}\r\n\r\n/**\r\n * Render item list information\r\n * @public\r\n */\r\nexport interface RenderItemListInfo {\r\n itemList: RenderQueueItem[];\r\n renderBundle?: RenderBundleWrapper;\r\n skinItemList: RenderQueueItem[];\r\n skinRenderBundle?: RenderBundleWrapper;\r\n morphItemList: RenderQueueItem[];\r\n morphRenderBundle?: RenderBundleWrapper;\r\n skinAndMorphItemList: RenderQueueItem[];\r\n skinAndMorphRenderBundle?: RenderBundleWrapper;\r\n instanceItemList: RenderQueueItem[];\r\n instanceRenderBundle?: RenderBundleWrapper;\r\n instanceList: Record<string, BatchDrawable[]>;\r\n materialList: Set<Material>;\r\n renderQueue: RenderQueue;\r\n}\r\n\r\n/**\r\n * Render item list bundle\r\n * @public\r\n */\r\nexport interface RenderItemListBundle {\r\n lit: RenderItemListInfo[];\r\n unlit: RenderItemListInfo[];\r\n}\r\n\r\n/**\r\n * Item list of render queue\r\n * @public\r\n */\r\nexport interface RenderItemList {\r\n opaque: RenderItemListBundle;\r\n transmission: RenderItemListBundle;\r\n transparent: RenderItemListBundle;\r\n transmission_trans: RenderItemListBundle;\r\n}\r\n\r\n/**\r\n * Render queue reference\r\n * @public\r\n */\r\nexport interface RenderQueueRef {\r\n ref: RenderQueue;\r\n}\r\n\r\n/**\r\n * Drawable instance information\r\n * @public\r\n */\r\nexport interface DrawableInstanceInfo {\r\n bindGroup: CachedBindGroup;\r\n offset: number;\r\n}\r\n\r\n/**\r\n * A queue that contains the items to be rendered\r\n * @public\r\n */\r\nexport class RenderQueue extends Disposable {\r\n /** @internal */\r\n private _itemList: Nullable<RenderItemList>;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private _shadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _unshadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _sunLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryDirectionalLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryTransmissionLight: Nullable<PunctualLight>;\r\n /** @internal */\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n /** @internal */\r\n private readonly _ref: RenderQueueRef;\r\n /** @internal */\r\n private readonly _instanceInfo: Map<Drawable, DrawableInstanceInfo>;\r\n /** @internal */\r\n private _needSceneColor: boolean;\r\n private _needSceneDepth: boolean;\r\n private _needSceneColorWithDepth: boolean;\r\n /** @internal */\r\n private _drawTransparent: boolean;\r\n /** @internal */\r\n private readonly _objectColorMaps: Map<number, Drawable>[];\r\n /**\r\n * Creates an instance of a render queue\r\n * @param renderPass - The render pass to which the render queue belongs\r\n */\r\n constructor(renderPass: RenderPass, bindGroupAllocator?: InstanceBindGroupAllocator) {\r\n super();\r\n this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;\r\n this._itemList = null;\r\n this._renderPass = renderPass;\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._ref = { ref: this };\r\n this._instanceInfo = new Map();\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n this._objectColorMaps = [new Map()];\r\n }\r\n /** The sun light */\r\n get sunLight() {\r\n return this._sunLight;\r\n }\r\n set sunLight(light) {\r\n this._sunLight = light;\r\n }\r\n /** Primary directional light used by effects that need a main light direction. */\r\n get primaryDirectionalLight() {\r\n return this._primaryDirectionalLight;\r\n }\r\n set primaryDirectionalLight(light) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n /** Primary punctual light used by thin-transmission effects when there is no main directional light. */\r\n get primaryTransmissionLight() {\r\n return this._primaryTransmissionLight;\r\n }\r\n set primaryTransmissionLight(light) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n /** @internal */\r\n private getTransmissionLightScore(light: PunctualLight) {\r\n if (light.isDirectionLight()) {\r\n return -1;\r\n }\r\n const color = light.diffuseAndIntensity;\r\n const luma = color.x * 0.2126 + color.y * 0.7152 + color.z * 0.0722;\r\n const range = Math.max(1, light.positionAndRange.w);\r\n const typeWeight = light.isSpotLight()\r\n ? 1.2\r\n : light.isPointLight()\r\n ? 1.08\r\n : light.isRectLight()\r\n ? 1.02\r\n : 1;\r\n return Math.max(color.w, 0) * Math.max(luma, 0) * Math.sqrt(range) * typeWeight;\r\n }\r\n /** @internal */\r\n needSceneColor() {\r\n return this._needSceneColor;\r\n }\r\n /** @internal */\r\n needSceneDepth() {\r\n return this._needSceneDepth;\r\n }\r\n /** @internal */\r\n needSceneColorWithDepth() {\r\n return this._needSceneColorWithDepth;\r\n }\r\n /** Whether this render queue has transparent objects to be drawn */\r\n get drawTransparent() {\r\n return this._drawTransparent;\r\n }\r\n /** The render pass to which the render queue belongs */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /**\r\n * Gets the items of the render queue\r\n */\r\n get itemList() {\r\n return this._itemList;\r\n }\r\n /**\r\n * Gets the shadowed lights\r\n */\r\n get shadowedLights() {\r\n return this._shadowedLightList;\r\n }\r\n /**\r\n * Gets the unshadowed lights\r\n */\r\n get unshadowedLights() {\r\n return this._unshadowedLightList;\r\n }\r\n /**\r\n * Gets the indirect reference of this\r\n */\r\n get ref() {\r\n return this._ref;\r\n }\r\n /**\r\n * Gets the instance information for given drawable object\r\n * @param drawable - The drawable object\r\n * @returns The instane information for given drawable object, null if no exists\r\n */\r\n getInstanceInfo(drawable: Drawable) {\r\n return this._instanceInfo.get(drawable);\r\n }\r\n /**\r\n * Gets the maximum batch size of a given device\r\n * @returns The maximum batch size of the device\r\n *\r\n * @internal\r\n */\r\n getMaxBatchSize() {\r\n return getDevice().getDeviceCaps().shaderCaps.maxUniformBufferSize / 64;\r\n }\r\n /**\r\n * Push a punctual light\r\n * @param light - The light to be pushed\r\n */\r\n pushLight(light: PunctualLight) {\r\n if (light.castShadow) {\r\n this._shadowedLightList.push(light);\r\n } else {\r\n this._unshadowedLightList.push(light);\r\n }\r\n if (light.isDirectionLight()) {\r\n if (!this._primaryDirectionalLight || light.intensity > this._primaryDirectionalLight.intensity) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n if (light.sunLight) {\r\n this.sunLight = light;\r\n }\r\n } else if (\r\n !this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(light) > this.getTransmissionLightScore(this._primaryTransmissionLight)\r\n ) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n }\r\n /**\r\n * Push items from another render queue\r\n * @param queue - The render queue to be pushed\r\n */\r\n pushRenderQueue(queue: RenderQueue) {\r\n const newItemLists = queue._itemList;\r\n if (!newItemLists) {\r\n return;\r\n }\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n this._itemList.opaque.lit.push(...newItemLists.opaque.lit);\r\n this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);\r\n this._itemList.transmission.lit.push(...newItemLists.transmission.lit);\r\n this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);\r\n this._itemList.transparent.lit.push(...newItemLists.transparent.lit);\r\n this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);\r\n this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);\r\n this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);\r\n this._needSceneColor ||= queue._needSceneColor;\r\n this._needSceneDepth ||= queue._needSceneDepth;\r\n this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;\r\n this._drawTransparent ||= queue._drawTransparent;\r\n this._sunLight ||= queue._sunLight;\r\n if (\r\n queue._primaryDirectionalLight &&\r\n (!this._primaryDirectionalLight ||\r\n queue._primaryDirectionalLight.intensity > this._primaryDirectionalLight.intensity)\r\n ) {\r\n this._primaryDirectionalLight = queue._primaryDirectionalLight;\r\n }\r\n if (\r\n queue._primaryTransmissionLight &&\r\n (!this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(queue._primaryTransmissionLight) >\r\n this.getTransmissionLightScore(this._primaryTransmissionLight))\r\n ) {\r\n this._primaryTransmissionLight = queue._primaryTransmissionLight;\r\n }\r\n this._objectColorMaps.push(...queue._objectColorMaps);\r\n }\r\n /**\r\n * Push an item to the render queue\r\n * @param camera - The camera for drawing the item\r\n * @param drawable - The object to be drawn\r\n */\r\n push(camera: Camera, drawable: Drawable) {\r\n if (drawable) {\r\n drawable.pushRenderQueueRef(this._ref);\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n const material = drawable.getMaterial();\r\n const trans =\r\n this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP &&\r\n material?.useTransparentShadowCasterForPass?.(this._renderPass.type)\r\n ? false\r\n : drawable.getQueueType() === QUEUE_TRANSPARENT;\r\n const unlit = drawable.isUnlit();\r\n const needDepth = !!drawable.needSceneDepth();\r\n const transmission = !!drawable.needSceneColor() || needDepth;\r\n this._needSceneColor ||= transmission;\r\n this._needSceneDepth ||= drawable.needSceneDepth();\r\n this._needSceneColorWithDepth ||= transmission && needDepth;\r\n this._drawTransparent ||= trans;\r\n if (camera.getPickResultResolveFunc()) {\r\n drawable.getMaterial()!.objectColor = drawable.getObjectColor();\r\n this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);\r\n }\r\n if (drawable.isBatchable()) {\r\n const instanceList = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0].instanceList\r\n : this._itemList.transmission_trans.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.transparent.unlit[0].instanceList\r\n : this._itemList.transparent.lit[0].instanceList\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0].instanceList\r\n : this._itemList.transmission.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.opaque.unlit[0].instanceList\r\n : this._itemList.opaque.lit[0].instanceList;\r\n const hash = drawable.getInstanceId(this._renderPass);\r\n let drawableList = instanceList[hash];\r\n if (!drawableList) {\r\n drawableList = [];\r\n instanceList[hash] = drawableList;\r\n }\r\n drawableList.push(drawable);\r\n } else {\r\n const list = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const skinAnimation = !!drawable.getBoneMatrices();\r\n const morphAnimation = !!drawable.getMorphData();\r\n let queue: RenderQueueItem[];\r\n if (skinAnimation && morphAnimation) {\r\n queue = list.skinAndMorphItemList;\r\n } else if (skinAnimation) {\r\n queue = list.skinItemList;\r\n } else if (morphAnimation) {\r\n queue = list.morphItemList;\r\n } else {\r\n queue = list.itemList;\r\n }\r\n this.binaryInsert(queue, {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: null\r\n });\r\n if (material) {\r\n list.materialList.add(material.coreMaterial);\r\n }\r\n drawable.applyTransformUniforms(this);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n getDrawableByColor(c: Uint8Array<ArrayBuffer>) {\r\n const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];\r\n for (const m of this._objectColorMaps) {\r\n const drawable = m.get(id);\r\n if (drawable) {\r\n return drawable;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Removes all items in the render queue\r\n */\r\n reset() {\r\n if (this._itemList) {\r\n // Release all render bundles\r\n for (const k of objectKeys(this._itemList)) {\r\n const itemListBundle: RenderItemListBundle = this._itemList[k];\r\n for (const l of objectKeys(itemListBundle)) {\r\n const listInfo: RenderItemListInfo[] = itemListBundle[l];\r\n for (const info of listInfo) {\r\n if (info.renderQueue === this) {\r\n if (info.renderBundle) {\r\n info.renderBundle.dispose();\r\n }\r\n if (info.skinRenderBundle) {\r\n info.skinRenderBundle.dispose();\r\n }\r\n if (info.morphRenderBundle) {\r\n info.morphRenderBundle.dispose();\r\n }\r\n if (info.skinAndMorphRenderBundle) {\r\n info.skinAndMorphRenderBundle.dispose();\r\n }\r\n if (info.instanceRenderBundle) {\r\n info.instanceRenderBundle.dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._itemList = null;\r\n }\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n }\r\n /** @internal */\r\n end(camera: Camera, createRenderBundles?: boolean) {\r\n const frameCounter = getDevice().frameInfo.frameCounter;\r\n const itemList = this._itemList!;\r\n if (!this.itemList) {\r\n return this;\r\n }\r\n const lists = [\r\n itemList.opaque.lit,\r\n itemList.opaque.unlit,\r\n itemList.transmission.lit,\r\n itemList.transmission.unlit,\r\n itemList.transparent.lit,\r\n itemList.transparent.unlit,\r\n itemList.transmission_trans.lit,\r\n itemList.transmission_trans.unlit\r\n ];\r\n for (let i = 0; i < lists.length; i++) {\r\n const list = lists[i];\r\n for (const info of list) {\r\n if (info.renderQueue !== this) {\r\n continue;\r\n }\r\n const instanceList = info.instanceList;\r\n for (const x in instanceList) {\r\n const drawables = instanceList[x];\r\n let bindGroup: Nullable<CachedBindGroup> = null;\r\n let item: Nullable<RenderQueueItem> = null;\r\n for (let i = 0; i < drawables.length; i++) {\r\n const drawable = drawables[i];\r\n const instanceUniforms = drawable.getInstanceUniforms();\r\n const instanceUniformsSize = instanceUniforms?.length ?? 0;\r\n const stride = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4 + instanceUniformsSize;\r\n if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {\r\n bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);\r\n item = {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: {\r\n bindGroup,\r\n offset: bindGroup.offset,\r\n numInstances: 0,\r\n stride\r\n }\r\n };\r\n this.binaryInsert(info.instanceItemList, item);\r\n drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);\r\n }\r\n const instanceInfo = { bindGroup, offset: bindGroup.offset };\r\n this._instanceInfo.set(drawable, instanceInfo);\r\n drawable.applyTransformUniforms(this);\r\n drawable.applyMaterialUniforms(instanceInfo);\r\n bindGroup.offset += stride;\r\n item!.instanceData!.numInstances++;\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n info.materialList.add(mat.coreMaterial);\r\n }\r\n }\r\n }\r\n info.instanceList = {};\r\n if (createRenderBundles) {\r\n if (info.itemList.length > 0) {\r\n info.renderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinItemList.length > 0) {\r\n info.skinRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.morphItemList.length > 0) {\r\n info.morphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinAndMorphItemList.length > 0) {\r\n info.skinAndMorphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.instanceItemList.length > 0) {\r\n info.instanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n binaryInsert(itemList: RenderQueueItem[], item: RenderQueueItem) {\r\n let left = 0;\r\n let right = itemList.length - 1;\r\n const newInstanceId = item.drawable.getMaterial()!.instanceId;\r\n while (left <= right) {\r\n const mid = Math.floor((left + right) / 2);\r\n const instanceId = itemList[mid].drawable.getMaterial()!.instanceId;\r\n if (instanceId === newInstanceId) {\r\n itemList.splice(mid + 1, 0, item);\r\n return;\r\n } else if (instanceId < newInstanceId) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1;\r\n }\r\n }\r\n itemList.splice(left, 0, item);\r\n }\r\n /**\r\n * Sorts the items in the render queue for rendering\r\n */\r\n sortTransparentItems(cameraPos: Vector3) {\r\n if (this._itemList) {\r\n this._itemList.transparent.lit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n }\r\n }\r\n /** Disposes the render queue */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.reset();\r\n }\r\n\r\n private drawableDistanceToCamera(drawable: Drawable, cameraPos: Vector3) {\r\n const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);\r\n return Vector3.distanceSq(drawablePos, cameraPos);\r\n }\r\n private newRenderItemListInfo() {\r\n return {\r\n itemList: [],\r\n skinItemList: [],\r\n morphItemList: [],\r\n skinAndMorphItemList: [],\r\n instanceItemList: [],\r\n materialList: new Set(),\r\n instanceList: {},\r\n renderQueue: this\r\n } as RenderItemListInfo;\r\n }\r\n private newRenderItemListBundle() {\r\n return {\r\n lit: [this.newRenderItemListInfo()],\r\n unlit: [this.newRenderItemListInfo()]\r\n };\r\n }\r\n private newRenderItemList() {\r\n return {\r\n opaque: this.newRenderItemListBundle(),\r\n transmission: this.newRenderItemListBundle(),\r\n transparent: this.newRenderItemListBundle(),\r\n transmission_trans: this.newRenderItemListBundle()\r\n };\r\n }\r\n}\r\n"],"names":["maxBufferSizeInFloats","InstanceBindGroupAllocator","_instanceBindGroupLayout","_bindGroupList","_allocFrameStamp","allocateInstanceBindGroup","framestamp","sizeInFloats","k","offset","dirty","buildInfo","ProgramBuilder","getDevice","buildRender","vertex","pb","ShaderHelper","getInstanceDataUniformName","vec4","uniformBuffer","main","fragment","bindGroup","createBindGroup","buffer","Float32Array","push","defaultInstanceBindGroupAlloator","tmpDrawablePos","Vector3","RenderQueue","Disposable","_needSceneDepth","_needSceneColorWithDepth","renderPass","bindGroupAllocator","_bindGroupAllocator","_itemList","_renderPass","_shadowedLightList","_unshadowedLightList","_sunLight","_primaryDirectionalLight","_primaryTransmissionLight","_ref","ref","_instanceInfo","Map","_needSceneColor","_drawTransparent","_objectColorMaps","sunLight","light","primaryDirectionalLight","primaryTransmissionLight","getTransmissionLightScore","isDirectionLight","color","diffuseAndIntensity","luma","x","y","z","range","Math","max","positionAndRange","w","typeWeight","isSpotLight","isPointLight","isRectLight","sqrt","needSceneColor","needSceneDepth","needSceneColorWithDepth","drawTransparent","itemList","shadowedLights","unshadowedLights","getInstanceInfo","drawable","get","getMaxBatchSize","getDeviceCaps","shaderCaps","maxUniformBufferSize","pushLight","castShadow","intensity","pushRenderQueue","queue","newItemLists","newRenderItemList","opaque","lit","unlit","transmission","transparent","transmission_trans","camera","pushRenderQueueRef","material","getMaterial","trans","type","RENDER_PASS_TYPE_SHADOWMAP","useTransparentShadowCasterForPass","getQueueType","QUEUE_TRANSPARENT","isUnlit","needDepth","getPickResultResolveFunc","objectColor","getObjectColor","set","getDrawableId","isBatchable","instanceList","hash","getInstanceId","drawableList","list","skinAnimation","getBoneMatrices","morphAnimation","getMorphData","skinAndMorphItemList","skinItemList","morphItemList","binaryInsert","sortDistance","getSortDistance","instanceData","materialList","add","coreMaterial","applyTransformUniforms","getDrawableByColor","c","id","m","reset","objectKeys","itemListBundle","l","listInfo","info","renderQueue","renderBundle","dispose","skinRenderBundle","morphRenderBundle","skinAndMorphRenderBundle","instanceRenderBundle","end","createRenderBundles","frameCounter","frameInfo","lists","i","length","drawables","item","instanceUniforms","getInstanceUniforms","instanceUniformsSize","stride","MATERIAL_INSTANCE_DATA_OFFSET","numInstances","instanceItemList","applyInstanceOffsetAndStride","instanceInfo","applyMaterialUniforms","mat","RenderBundleWrapper","left","right","newInstanceId","instanceId","mid","floor","splice","sortTransparentItems","cameraPos","sort","a","b","drawableDistanceToCamera","onDispose","drawablePos","getNode","getWorldPosition","distanceSq","newRenderItemListInfo","Set","newRenderItemListBundle"],"mappings":"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"}
1
+ {"version":3,"file":"render_queue.js","sources":["../../src/render/render_queue.ts"],"sourcesContent":["import type { Nullable, Vector4 } from '@zephyr3d/base';\r\nimport { Disposable, objectKeys, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { BatchDrawable, Drawable } from './drawable';\r\nimport type { DirectionalLight, PunctualLight } from '../scene/light';\r\nimport type { RenderPass } from '.';\r\nimport { QUEUE_TRANSPARENT, RENDER_PASS_TYPE_SHADOWMAP } from '../values';\r\nimport type { BindGroup, BindGroupLayout } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Material } from '../material';\r\nimport { ShaderHelper } from '../material';\r\nimport { RenderBundleWrapper } from './renderbundle_wrapper';\r\nimport { getDevice } from '../app/api';\r\n\r\n/** @public */\r\nexport type CachedBindGroup = {\r\n bindGroup: BindGroup;\r\n buffer: Float32Array;\r\n offset: number;\r\n dirty: boolean;\r\n};\r\n\r\nconst maxBufferSizeInFloats = 65536 / 4;\r\n\r\n/**\r\n * Instance bind group allocator\r\n * @public\r\n */\r\nexport class InstanceBindGroupAllocator {\r\n private static _instanceBindGroupLayout: Nullable<BindGroupLayout> = null;\r\n _bindGroupList: CachedBindGroup[] = [];\r\n private _allocFrameStamp: number;\r\n constructor() {\r\n this._allocFrameStamp = -1;\r\n this._bindGroupList = [];\r\n }\r\n allocateInstanceBindGroup(framestamp: number, sizeInFloats: number) {\r\n // Reset if render frame changed\r\n if (this._allocFrameStamp !== framestamp) {\r\n this._allocFrameStamp = framestamp;\r\n for (const k of this._bindGroupList) {\r\n k.offset = 0;\r\n }\r\n }\r\n for (const k of this._bindGroupList) {\r\n if (k.offset + sizeInFloats <= maxBufferSizeInFloats) {\r\n k.dirty = true;\r\n return k;\r\n }\r\n }\r\n if (!InstanceBindGroupAllocator._instanceBindGroupLayout) {\r\n const buildInfo = new ProgramBuilder(getDevice()).buildRender({\r\n vertex(pb) {\r\n this[ShaderHelper.getInstanceDataUniformName()] = pb.vec4[65536 >> 4]().uniformBuffer(3);\r\n pb.main(function () {});\r\n },\r\n fragment(pb) {\r\n pb.main(function () {});\r\n }\r\n });\r\n InstanceBindGroupAllocator._instanceBindGroupLayout = buildInfo[2][3];\r\n }\r\n const bindGroup = {\r\n bindGroup: getDevice().createBindGroup(InstanceBindGroupAllocator._instanceBindGroupLayout),\r\n buffer: new Float32Array(maxBufferSizeInFloats),\r\n offset: 0,\r\n dirty: true\r\n };\r\n this._bindGroupList.push(bindGroup);\r\n return bindGroup;\r\n }\r\n}\r\n\r\nconst defaultInstanceBindGroupAlloator = new InstanceBindGroupAllocator();\r\nconst tmpDrawablePos = new Vector3();\r\n\r\n/**\r\n * Instance data\r\n * @public\r\n */\r\nexport interface InstanceData {\r\n bindGroup: CachedBindGroup;\r\n stride: number;\r\n offset: number;\r\n numInstances: number;\r\n}\r\n\r\n/**\r\n * Render queue item\r\n * @public\r\n */\r\nexport interface RenderQueueItem {\r\n drawable: Drawable;\r\n sortDistance: number;\r\n instanceColor?: Vector4;\r\n instanceData: Nullable<InstanceData>;\r\n}\r\n\r\n/**\r\n * Render item list information\r\n * @public\r\n */\r\nexport interface RenderItemListInfo {\r\n itemList: RenderQueueItem[];\r\n renderBundle?: RenderBundleWrapper;\r\n skinItemList: RenderQueueItem[];\r\n skinRenderBundle?: RenderBundleWrapper;\r\n morphItemList: RenderQueueItem[];\r\n morphRenderBundle?: RenderBundleWrapper;\r\n skinAndMorphItemList: RenderQueueItem[];\r\n skinAndMorphRenderBundle?: RenderBundleWrapper;\r\n instanceItemList: RenderQueueItem[];\r\n instanceRenderBundle?: RenderBundleWrapper;\r\n instanceList: Record<string, BatchDrawable[]>;\r\n materialList: Set<Material>;\r\n renderQueue: RenderQueue;\r\n}\r\n\r\n/**\r\n * Render item list bundle\r\n * @public\r\n */\r\nexport interface RenderItemListBundle {\r\n lit: RenderItemListInfo[];\r\n unlit: RenderItemListInfo[];\r\n}\r\n\r\n/**\r\n * Item list of render queue\r\n * @public\r\n */\r\nexport interface RenderItemList {\r\n opaque: RenderItemListBundle;\r\n transmission: RenderItemListBundle;\r\n transparent: RenderItemListBundle;\r\n transmission_trans: RenderItemListBundle;\r\n}\r\n\r\n/**\r\n * Render queue reference\r\n * @public\r\n */\r\nexport interface RenderQueueRef {\r\n ref: RenderQueue;\r\n}\r\n\r\n/**\r\n * Drawable instance information\r\n * @public\r\n */\r\nexport interface DrawableInstanceInfo {\r\n bindGroup: CachedBindGroup;\r\n offset: number;\r\n}\r\n\r\n/**\r\n * A queue that contains the items to be rendered\r\n * @public\r\n */\r\nexport class RenderQueue extends Disposable {\r\n /** @internal */\r\n private _itemList: Nullable<RenderItemList>;\r\n /** @internal */\r\n private readonly _renderPass: RenderPass;\r\n /** @internal */\r\n private _shadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _unshadowedLightList: PunctualLight[];\r\n /** @internal */\r\n private _sunLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryDirectionalLight: Nullable<DirectionalLight>;\r\n /** @internal */\r\n private _primaryTransmissionLight: Nullable<PunctualLight>;\r\n /** @internal */\r\n private readonly _bindGroupAllocator: InstanceBindGroupAllocator;\r\n /** @internal */\r\n private readonly _ref: RenderQueueRef;\r\n /** @internal */\r\n private readonly _instanceInfo: Map<Drawable, DrawableInstanceInfo>;\r\n /** @internal */\r\n private _needSceneColor: boolean;\r\n private _needSceneDepth: boolean;\r\n private _needSceneColorWithDepth: boolean;\r\n /** @internal */\r\n private _drawTransparent: boolean;\r\n /** @internal */\r\n private readonly _objectColorMaps: Map<number, Drawable>[];\r\n /**\r\n * Creates an instance of a render queue\r\n * @param renderPass - The render pass to which the render queue belongs\r\n */\r\n constructor(renderPass: RenderPass, bindGroupAllocator?: InstanceBindGroupAllocator) {\r\n super();\r\n this._bindGroupAllocator = bindGroupAllocator ?? defaultInstanceBindGroupAlloator;\r\n this._itemList = null;\r\n this._renderPass = renderPass;\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._ref = { ref: this };\r\n this._instanceInfo = new Map();\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n this._objectColorMaps = [new Map()];\r\n }\r\n /** The sun light */\r\n get sunLight() {\r\n return this._sunLight;\r\n }\r\n set sunLight(light) {\r\n this._sunLight = light;\r\n }\r\n /** Primary directional light used by effects that need a main light direction. */\r\n get primaryDirectionalLight() {\r\n return this._primaryDirectionalLight;\r\n }\r\n set primaryDirectionalLight(light) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n /** Primary punctual light used by thin-transmission effects when there is no main directional light. */\r\n get primaryTransmissionLight() {\r\n return this._primaryTransmissionLight;\r\n }\r\n set primaryTransmissionLight(light) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n /** @internal */\r\n private getTransmissionLightScore(light: PunctualLight) {\r\n if (light.isDirectionLight()) {\r\n return -1;\r\n }\r\n const color = light.diffuseAndIntensity;\r\n const luma = color.x * 0.2126 + color.y * 0.7152 + color.z * 0.0722;\r\n const range = Math.max(1, light.positionAndRange.w);\r\n const typeWeight = light.isSpotLight()\r\n ? 1.2\r\n : light.isPointLight()\r\n ? 1.08\r\n : light.isRectLight()\r\n ? 1.02\r\n : 1;\r\n return Math.max(color.w, 0) * Math.max(luma, 0) * Math.sqrt(range) * typeWeight;\r\n }\r\n /** @internal */\r\n needSceneColor() {\r\n return this._needSceneColor;\r\n }\r\n /** @internal */\r\n needSceneDepth() {\r\n return this._needSceneDepth;\r\n }\r\n /** @internal */\r\n needSceneColorWithDepth() {\r\n return this._needSceneColorWithDepth;\r\n }\r\n /** Whether this render queue has transparent objects to be drawn */\r\n get drawTransparent() {\r\n return this._drawTransparent;\r\n }\r\n /** The render pass to which the render queue belongs */\r\n get renderPass() {\r\n return this._renderPass;\r\n }\r\n /**\r\n * Gets the items of the render queue\r\n */\r\n get itemList() {\r\n return this._itemList;\r\n }\r\n /**\r\n * Gets the shadowed lights\r\n */\r\n get shadowedLights() {\r\n return this._shadowedLightList;\r\n }\r\n /**\r\n * Gets the unshadowed lights\r\n */\r\n get unshadowedLights() {\r\n return this._unshadowedLightList;\r\n }\r\n /**\r\n * Gets the indirect reference of this\r\n */\r\n get ref() {\r\n return this._ref;\r\n }\r\n /**\r\n * Gets the instance information for given drawable object\r\n * @param drawable - The drawable object\r\n * @returns The instane information for given drawable object, null if no exists\r\n */\r\n getInstanceInfo(drawable: Drawable) {\r\n return this._instanceInfo.get(drawable);\r\n }\r\n /**\r\n * Gets the maximum batch size of a given device\r\n * @returns The maximum batch size of the device\r\n *\r\n * @internal\r\n */\r\n getMaxBatchSize() {\r\n return getDevice().getDeviceCaps().shaderCaps.maxUniformBufferSize / 64;\r\n }\r\n /**\r\n * Push a punctual light\r\n * @param light - The light to be pushed\r\n */\r\n pushLight(light: PunctualLight) {\r\n if (light.castShadow) {\r\n this._shadowedLightList.push(light);\r\n } else {\r\n this._unshadowedLightList.push(light);\r\n }\r\n if (light.isDirectionLight()) {\r\n if (!this._primaryDirectionalLight || light.intensity > this._primaryDirectionalLight.intensity) {\r\n this._primaryDirectionalLight = light;\r\n }\r\n if (light.sunLight) {\r\n this.sunLight = light;\r\n }\r\n } else if (\r\n !this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(light) > this.getTransmissionLightScore(this._primaryTransmissionLight)\r\n ) {\r\n this._primaryTransmissionLight = light;\r\n }\r\n }\r\n /**\r\n * Push items from another render queue\r\n * @param queue - The render queue to be pushed\r\n */\r\n pushRenderQueue(queue: RenderQueue) {\r\n const newItemLists = queue._itemList;\r\n if (!newItemLists) {\r\n return;\r\n }\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n this._itemList.opaque.lit.push(...newItemLists.opaque.lit);\r\n this._itemList.opaque.unlit.push(...newItemLists.opaque.unlit);\r\n this._itemList.transmission.lit.push(...newItemLists.transmission.lit);\r\n this._itemList.transmission.unlit.push(...newItemLists.transmission.unlit);\r\n this._itemList.transparent.lit.push(...newItemLists.transparent.lit);\r\n this._itemList.transparent.unlit.push(...newItemLists.transparent.unlit);\r\n this._itemList.transmission_trans.lit.push(...newItemLists.transmission_trans.lit);\r\n this._itemList.transmission_trans.unlit.push(...newItemLists.transmission_trans.unlit);\r\n this._needSceneColor ||= queue._needSceneColor;\r\n this._needSceneDepth ||= queue._needSceneDepth;\r\n this._needSceneColorWithDepth ||= queue._needSceneColorWithDepth;\r\n this._drawTransparent ||= queue._drawTransparent;\r\n this._sunLight ||= queue._sunLight;\r\n if (\r\n queue._primaryDirectionalLight &&\r\n (!this._primaryDirectionalLight ||\r\n queue._primaryDirectionalLight.intensity > this._primaryDirectionalLight.intensity)\r\n ) {\r\n this._primaryDirectionalLight = queue._primaryDirectionalLight;\r\n }\r\n if (\r\n queue._primaryTransmissionLight &&\r\n (!this._primaryTransmissionLight ||\r\n this.getTransmissionLightScore(queue._primaryTransmissionLight) >\r\n this.getTransmissionLightScore(this._primaryTransmissionLight))\r\n ) {\r\n this._primaryTransmissionLight = queue._primaryTransmissionLight;\r\n }\r\n this._objectColorMaps.push(...queue._objectColorMaps);\r\n }\r\n /**\r\n * Push an item to the render queue\r\n * @param camera - The camera for drawing the item\r\n * @param drawable - The object to be drawn\r\n */\r\n push(camera: Camera, drawable: Drawable) {\r\n if (drawable) {\r\n drawable.pushRenderQueueRef(this._ref);\r\n if (!this._itemList) {\r\n this._itemList = this.newRenderItemList();\r\n }\r\n const material = drawable.getMaterial();\r\n const trans =\r\n this._renderPass.type === RENDER_PASS_TYPE_SHADOWMAP &&\r\n material?.useTransparentShadowCasterForPass?.(this._renderPass.type)\r\n ? false\r\n : drawable.getQueueType() === QUEUE_TRANSPARENT;\r\n const unlit = drawable.isUnlit();\r\n const needDepth = !!drawable.needSceneDepth();\r\n const transmission = !!drawable.needSceneColor() || needDepth;\r\n this._needSceneColor ||= transmission;\r\n this._needSceneDepth ||= drawable.needSceneDepth();\r\n this._needSceneColorWithDepth ||= transmission && needDepth;\r\n this._drawTransparent ||= trans;\r\n if (camera.getPickResultResolveFunc()) {\r\n drawable.getMaterial()!.objectColor = drawable.getObjectColor();\r\n this._objectColorMaps[0].set(drawable.getDrawableId(), drawable);\r\n }\r\n if (drawable.isBatchable()) {\r\n const instanceList = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0].instanceList\r\n : this._itemList.transmission_trans.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.transparent.unlit[0].instanceList\r\n : this._itemList.transparent.lit[0].instanceList\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0].instanceList\r\n : this._itemList.transmission.lit[0].instanceList\r\n : unlit\r\n ? this._itemList.opaque.unlit[0].instanceList\r\n : this._itemList.opaque.lit[0].instanceList;\r\n const hash = drawable.getInstanceId(this._renderPass);\r\n let drawableList = instanceList[hash];\r\n if (!drawableList) {\r\n drawableList = [];\r\n instanceList[hash] = drawableList;\r\n }\r\n drawableList.push(drawable);\r\n } else {\r\n const list = trans\r\n ? transmission\r\n ? unlit\r\n ? this._itemList.transmission_trans.unlit[0]\r\n : this._itemList.transmission_trans.lit[0]\r\n : unlit\r\n ? this._itemList.transparent.unlit[0]\r\n : this._itemList.transparent.lit[0]\r\n : transmission\r\n ? unlit\r\n ? this._itemList.transmission.unlit[0]\r\n : this._itemList.transmission.lit[0]\r\n : unlit\r\n ? this._itemList.opaque.unlit[0]\r\n : this._itemList.opaque.lit[0];\r\n const skinAnimation = !!drawable.getBoneMatrices();\r\n const morphAnimation = !!drawable.getMorphData();\r\n let queue: RenderQueueItem[];\r\n if (skinAnimation && morphAnimation) {\r\n queue = list.skinAndMorphItemList;\r\n } else if (skinAnimation) {\r\n queue = list.skinItemList;\r\n } else if (morphAnimation) {\r\n queue = list.morphItemList;\r\n } else {\r\n queue = list.itemList;\r\n }\r\n this.binaryInsert(queue, {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: null\r\n });\r\n if (material) {\r\n list.materialList.add(material.coreMaterial);\r\n }\r\n drawable.applyTransformUniforms(this);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n getDrawableByColor(c: Uint8Array<ArrayBuffer>) {\r\n const id = (c[0] << 24) + (c[1] << 16) + (c[2] << 8) + c[3];\r\n for (const m of this._objectColorMaps) {\r\n const drawable = m.get(id);\r\n if (drawable) {\r\n return drawable;\r\n }\r\n }\r\n return null;\r\n }\r\n /**\r\n * Removes all items in the render queue\r\n */\r\n reset() {\r\n if (this._itemList) {\r\n // Release all render bundles\r\n for (const k of objectKeys(this._itemList)) {\r\n const itemListBundle: RenderItemListBundle = this._itemList[k];\r\n for (const l of objectKeys(itemListBundle)) {\r\n const listInfo: RenderItemListInfo[] = itemListBundle[l];\r\n for (const info of listInfo) {\r\n if (info.renderQueue === this) {\r\n if (info.renderBundle) {\r\n info.renderBundle.dispose();\r\n }\r\n if (info.skinRenderBundle) {\r\n info.skinRenderBundle.dispose();\r\n }\r\n if (info.morphRenderBundle) {\r\n info.morphRenderBundle.dispose();\r\n }\r\n if (info.skinAndMorphRenderBundle) {\r\n info.skinAndMorphRenderBundle.dispose();\r\n }\r\n if (info.instanceRenderBundle) {\r\n info.instanceRenderBundle.dispose();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this._itemList = null;\r\n }\r\n this._shadowedLightList = [];\r\n this._unshadowedLightList = [];\r\n this._sunLight = null;\r\n this._primaryDirectionalLight = null;\r\n this._primaryTransmissionLight = null;\r\n this._needSceneColor = false;\r\n this._needSceneDepth = false;\r\n this._needSceneColorWithDepth = false;\r\n this._drawTransparent = false;\r\n }\r\n /** @internal */\r\n end(camera: Camera, createRenderBundles?: boolean) {\r\n const frameCounter = getDevice().frameInfo.frameCounter;\r\n const itemList = this._itemList!;\r\n if (!this.itemList) {\r\n return this;\r\n }\r\n const lists = [\r\n itemList.opaque.lit,\r\n itemList.opaque.unlit,\r\n itemList.transmission.lit,\r\n itemList.transmission.unlit,\r\n itemList.transparent.lit,\r\n itemList.transparent.unlit,\r\n itemList.transmission_trans.lit,\r\n itemList.transmission_trans.unlit\r\n ];\r\n for (let i = 0; i < lists.length; i++) {\r\n const list = lists[i];\r\n for (const info of list) {\r\n if (info.renderQueue !== this) {\r\n continue;\r\n }\r\n const instanceList = info.instanceList;\r\n for (const x in instanceList) {\r\n const drawables = instanceList[x];\r\n let bindGroup: Nullable<CachedBindGroup> = null;\r\n let item: Nullable<RenderQueueItem> = null;\r\n for (let i = 0; i < drawables.length; i++) {\r\n const drawable = drawables[i];\r\n const instanceUniforms = drawable.getInstanceUniforms();\r\n const instanceUniformsSize = instanceUniforms?.length ?? 0;\r\n const stride = ShaderHelper.MATERIAL_INSTANCE_DATA_OFFSET * 4 + instanceUniformsSize;\r\n if (!bindGroup || bindGroup.offset + stride > maxBufferSizeInFloats) {\r\n bindGroup = this._bindGroupAllocator.allocateInstanceBindGroup(frameCounter, stride);\r\n item = {\r\n drawable,\r\n sortDistance: drawable.getSortDistance(camera),\r\n instanceData: {\r\n bindGroup,\r\n offset: bindGroup.offset,\r\n numInstances: 0,\r\n stride\r\n }\r\n };\r\n this.binaryInsert(info.instanceItemList, item);\r\n drawable.applyInstanceOffsetAndStride(this, stride, bindGroup.offset);\r\n }\r\n const instanceInfo = { bindGroup, offset: bindGroup.offset };\r\n this._instanceInfo.set(drawable, instanceInfo);\r\n drawable.applyTransformUniforms(this);\r\n drawable.applyMaterialUniforms(instanceInfo);\r\n bindGroup.offset += stride;\r\n item!.instanceData!.numInstances++;\r\n const mat = drawable.getMaterial();\r\n if (mat) {\r\n info.materialList.add(mat.coreMaterial);\r\n }\r\n }\r\n }\r\n info.instanceList = {};\r\n if (createRenderBundles) {\r\n if (info.itemList.length > 0) {\r\n info.renderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinItemList.length > 0) {\r\n info.skinRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.morphItemList.length > 0) {\r\n info.morphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.skinAndMorphItemList.length > 0) {\r\n info.skinAndMorphRenderBundle = new RenderBundleWrapper();\r\n }\r\n if (info.instanceItemList.length > 0) {\r\n info.instanceRenderBundle = new RenderBundleWrapper();\r\n }\r\n }\r\n }\r\n }\r\n return this;\r\n }\r\n binaryInsert(itemList: RenderQueueItem[], item: RenderQueueItem) {\r\n let left = 0;\r\n let right = itemList.length - 1;\r\n const newInstanceId = item.drawable.getMaterial()!.instanceId;\r\n while (left <= right) {\r\n const mid = Math.floor((left + right) / 2);\r\n const instanceId = itemList[mid].drawable.getMaterial()!.instanceId;\r\n if (instanceId === newInstanceId) {\r\n itemList.splice(mid + 1, 0, item);\r\n return;\r\n } else if (instanceId < newInstanceId) {\r\n left = mid + 1;\r\n } else {\r\n right = mid - 1;\r\n }\r\n }\r\n itemList.splice(left, 0, item);\r\n }\r\n /**\r\n * Sorts the items in the render queue for rendering\r\n */\r\n sortTransparentItems(cameraPos: Vector3) {\r\n if (this._itemList) {\r\n this._itemList.transparent.lit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.lit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].itemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].morphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n this._itemList.transparent.unlit[0].skinAndMorphItemList.sort(\r\n (a, b) =>\r\n this.drawableDistanceToCamera(b.drawable, cameraPos) -\r\n this.drawableDistanceToCamera(a.drawable, cameraPos)\r\n );\r\n }\r\n }\r\n /** Disposes the render queue */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.reset();\r\n }\r\n\r\n private drawableDistanceToCamera(drawable: Drawable, cameraPos: Vector3) {\r\n const drawablePos = drawable.getNode().getWorldPosition(tmpDrawablePos);\r\n return Vector3.distanceSq(drawablePos, cameraPos);\r\n }\r\n private newRenderItemListInfo() {\r\n return {\r\n itemList: [],\r\n skinItemList: [],\r\n morphItemList: [],\r\n skinAndMorphItemList: [],\r\n instanceItemList: [],\r\n materialList: new Set(),\r\n instanceList: {},\r\n renderQueue: this\r\n } as RenderItemListInfo;\r\n }\r\n private newRenderItemListBundle() {\r\n return {\r\n lit: [this.newRenderItemListInfo()],\r\n unlit: [this.newRenderItemListInfo()]\r\n };\r\n }\r\n private newRenderItemList() {\r\n return {\r\n opaque: this.newRenderItemListBundle(),\r\n transmission: this.newRenderItemListBundle(),\r\n transparent: this.newRenderItemListBundle(),\r\n transmission_trans: this.newRenderItemListBundle()\r\n };\r\n }\r\n}\r\n"],"names":["maxBufferSizeInFloats","InstanceBindGroupAllocator","_instanceBindGroupLayout","_bindGroupList","_allocFrameStamp","allocateInstanceBindGroup","framestamp","sizeInFloats","k","offset","dirty","buildInfo","ProgramBuilder","getDevice","buildRender","vertex","pb","ShaderHelper","getInstanceDataUniformName","vec4","uniformBuffer","main","fragment","bindGroup","createBindGroup","buffer","Float32Array","push","defaultInstanceBindGroupAlloator","tmpDrawablePos","Vector3","RenderQueue","Disposable","_needSceneDepth","_needSceneColorWithDepth","renderPass","bindGroupAllocator","_bindGroupAllocator","_itemList","_renderPass","_shadowedLightList","_unshadowedLightList","_sunLight","_primaryDirectionalLight","_primaryTransmissionLight","_ref","ref","_instanceInfo","Map","_needSceneColor","_drawTransparent","_objectColorMaps","sunLight","light","primaryDirectionalLight","primaryTransmissionLight","getTransmissionLightScore","isDirectionLight","color","diffuseAndIntensity","luma","x","y","z","range","Math","max","positionAndRange","w","typeWeight","isSpotLight","isPointLight","isRectLight","sqrt","needSceneColor","needSceneDepth","needSceneColorWithDepth","drawTransparent","itemList","shadowedLights","unshadowedLights","getInstanceInfo","drawable","get","getMaxBatchSize","getDeviceCaps","shaderCaps","maxUniformBufferSize","pushLight","castShadow","intensity","pushRenderQueue","queue","newItemLists","newRenderItemList","opaque","lit","unlit","transmission","transparent","transmission_trans","camera","pushRenderQueueRef","material","getMaterial","trans","type","RENDER_PASS_TYPE_SHADOWMAP","useTransparentShadowCasterForPass","getQueueType","QUEUE_TRANSPARENT","isUnlit","needDepth","getPickResultResolveFunc","objectColor","getObjectColor","set","getDrawableId","isBatchable","instanceList","hash","getInstanceId","drawableList","list","skinAnimation","getBoneMatrices","morphAnimation","getMorphData","skinAndMorphItemList","skinItemList","morphItemList","binaryInsert","sortDistance","getSortDistance","instanceData","materialList","add","coreMaterial","applyTransformUniforms","getDrawableByColor","c","id","m","reset","objectKeys","itemListBundle","l","listInfo","info","renderQueue","renderBundle","dispose","skinRenderBundle","morphRenderBundle","skinAndMorphRenderBundle","instanceRenderBundle","end","createRenderBundles","frameCounter","frameInfo","lists","i","length","drawables","item","instanceUniforms","getInstanceUniforms","instanceUniformsSize","stride","MATERIAL_INSTANCE_DATA_OFFSET","numInstances","instanceItemList","applyInstanceOffsetAndStride","instanceInfo","applyMaterialUniforms","mat","RenderBundleWrapper","left","right","newInstanceId","instanceId","mid","floor","splice","sortTransparentItems","cameraPos","sort","a","b","drawableDistanceToCamera","onDispose","drawablePos","getNode","getWorldPosition","distanceSq","newRenderItemListInfo","Set","newRenderItemListBundle"],"mappings":"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"}
@@ -74,6 +74,7 @@ import { executeForwardPlusGraph } from './rendergraph/forward_plus_builder.js';
74
74
  SSSParamTexture: null,
75
75
  SSSDiffuseTexture: null,
76
76
  SSSTransmissionTexture: null,
77
+ SkinSSSTexture: null,
77
78
  ssrSDFBoxBuffer: null,
78
79
  ssrSDFBoxCount: 0,
79
80
  finalFramebuffer: device.getFramebuffer(),
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import type { TextureFormat } from '@zephyr3d/device';\r\nimport { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSS = camera.SSS;\r\n const glossySurfaceFormat: TextureFormat = halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n SSRRoughnessTexture: SSR\r\n ? device.pool.fetchTemporalTexture2D(true, glossySurfaceFormat, renderWidth, renderHeight)\r\n : null,\r\n SSRNormalTexture: SSR\r\n ? device.pool.fetchTemporalTexture2D(true, glossySurfaceFormat, renderWidth, renderHeight)\r\n : null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSS","glossySurfaceFormat","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","fetchTemporalTexture2D","SSRNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
1
+ {"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import type { TextureFormat } from '@zephyr3d/device';\r\nimport { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSS = camera.SSS;\r\n const glossySurfaceFormat: TextureFormat = halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n SSRRoughnessTexture: SSR\r\n ? device.pool.fetchTemporalTexture2D(true, glossySurfaceFormat, renderWidth, renderHeight)\r\n : null,\r\n SSRNormalTexture: SSR\r\n ? device.pool.fetchTemporalTexture2D(true, glossySurfaceFormat, renderWidth, renderHeight)\r\n : null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SkinSSSTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSS","glossySurfaceFormat","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","fetchTemporalTexture2D","SSRNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
@@ -16,6 +16,13 @@ import { getDevice } from '../../app/api.js';
16
16
  *
17
17
  * @public
18
18
  */ class DevicePoolAllocator {
19
+ _device;
20
+ /**
21
+ * Creates a new instance of the DevicePoolAllocator.
22
+ * @param device - Optional device instance to use for resource allocation. If not provided, the global device will be used.
23
+ */ constructor(device){
24
+ this._device = device ?? null;
25
+ }
19
26
  /**
20
27
  * Allocate a transient texture from the device pool.
21
28
  *
@@ -23,7 +30,7 @@ import { getDevice } from '../../app/api.js';
23
30
  * @param size - Resolved pixel dimensions.
24
31
  * @returns A pooled Texture2D instance.
25
32
  */ allocate(desc, size) {
26
- const device = getDevice();
33
+ const device = this._device ?? getDevice();
27
34
  const mipmapping = (desc.mipLevels ?? 1) > 1;
28
35
  const texture = device.pool.fetchTemporalTexture2D(false, desc.format, size.width, size.height, mipmapping);
29
36
  if (desc.mipLevels && texture.mipLevelCount < desc.mipLevels) {
@@ -37,7 +44,7 @@ import { getDevice } from '../../app/api.js';
37
44
  *
38
45
  * @param texture - The texture to release.
39
46
  */ release(texture) {
40
- const device = getDevice();
47
+ const device = this._device ?? getDevice();
41
48
  device.pool.releaseTexture(texture);
42
49
  }
43
50
  /**
@@ -45,7 +52,7 @@ import { getDevice } from '../../app/api.js';
45
52
  *
46
53
  * @param texture - The texture to retain.
47
54
  */ retain(texture) {
48
- const device = getDevice();
55
+ const device = this._device ?? getDevice();
49
56
  device.pool.retainTexture(texture);
50
57
  }
51
58
  /**
@@ -54,7 +61,7 @@ import { getDevice } from '../../app/api.js';
54
61
  * @param desc - Framebuffer descriptor from the render graph pass.
55
62
  * @returns A pooled FrameBuffer instance.
56
63
  */ allocateFramebuffer(desc) {
57
- const device = getDevice();
64
+ const device = this._device ?? getDevice();
58
65
  const colors = Array.isArray(desc.colorAttachments) ? desc.colorAttachments : desc.colorAttachments ? [
59
66
  desc.colorAttachments
60
67
  ] : [];
@@ -66,7 +73,7 @@ import { getDevice } from '../../app/api.js';
66
73
  *
67
74
  * @param framebuffer - The framebuffer to release.
68
75
  */ releaseFramebuffer(framebuffer) {
69
- const device = getDevice();
76
+ const device = this._device ?? getDevice();
70
77
  device.pool.releaseFrameBuffer(framebuffer);
71
78
  }
72
79
  }
@@ -1 +1 @@
1
- {"version":3,"file":"device_pool_allocator.js","sources":["../../../src/render/rendergraph/device_pool_allocator.ts"],"sourcesContent":["import type { FrameBuffer, Texture2D, TextureFormat } from '@zephyr3d/device';\r\nimport type { RGFramebufferDesc, RGTextureAllocator, RGTextureDesc, RGResolvedSize } from './types';\r\nimport { getDevice } from '../../app/api';\r\n\r\n/**\r\n * Bridges the render graph's {@link RGTextureAllocator} interface to the\r\n * engine's device resource pool (`device.pool`).\r\n *\r\n * Transient textures are fetched from the pool on `allocate()` and\r\n * returned to the pool on `release()`, enabling automatic reuse\r\n * across frames without manual lifecycle management.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const allocator = new DevicePoolAllocator();\r\n * const executor = new RenderGraphExecutor(allocator, width, height);\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class DevicePoolAllocator implements RGTextureAllocator<Texture2D, FrameBuffer> {\r\n /**\r\n * Allocate a transient texture from the device pool.\r\n *\r\n * @param desc - Texture descriptor from the render graph pass.\r\n * @param size - Resolved pixel dimensions.\r\n * @returns A pooled Texture2D instance.\r\n */\r\n allocate(desc: RGTextureDesc, size: RGResolvedSize): Texture2D {\r\n const device = getDevice();\r\n const mipmapping = (desc.mipLevels ?? 1) > 1;\r\n const texture = device.pool.fetchTemporalTexture2D(\r\n false,\r\n desc.format,\r\n size.width,\r\n size.height,\r\n mipmapping\r\n );\r\n if (desc.mipLevels && texture.mipLevelCount < desc.mipLevels) {\r\n device.pool.releaseTexture(texture);\r\n throw new Error(\r\n `DevicePoolAllocator: texture \"${desc.label ?? '<unnamed>'}\" requested ${desc.mipLevels} ` +\r\n `mip levels, but only ${texture.mipLevelCount} were allocated.`\r\n );\r\n }\r\n return texture;\r\n }\r\n\r\n /**\r\n * Release a transient texture back to the device pool.\r\n *\r\n * @param texture - The texture to release.\r\n */\r\n release(texture: Texture2D): void {\r\n const device = getDevice();\r\n device.pool.releaseTexture(texture);\r\n }\r\n\r\n /**\r\n * Retain a pooled texture so it can be owned outside the graph lifetime.\r\n *\r\n * @param texture - The texture to retain.\r\n */\r\n retain(texture: Texture2D): void {\r\n const device = getDevice();\r\n device.pool.retainTexture(texture);\r\n }\r\n\r\n /**\r\n * Allocate a temporary framebuffer from the device pool.\r\n *\r\n * @param desc - Framebuffer descriptor from the render graph pass.\r\n * @returns A pooled FrameBuffer instance.\r\n */\r\n allocateFramebuffer(desc: RGFramebufferDesc): FrameBuffer {\r\n const device = getDevice();\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? (desc.colorAttachments as Array<Texture2D | TextureFormat>)\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments as Texture2D | TextureFormat]\r\n : [];\r\n const depthAttachment = (desc.depthAttachment ?? null) as Texture2D | TextureFormat | null;\r\n return device.pool.fetchTemporalFramebuffer(\r\n false,\r\n desc.width ?? 0,\r\n desc.height ?? 0,\r\n colors,\r\n depthAttachment,\r\n desc.mipmapping ?? false,\r\n desc.sampleCount ?? 1,\r\n desc.ignoreDepthStencil ?? true,\r\n desc.attachmentMipLevel ?? 0,\r\n desc.attachmentCubeface ?? 0,\r\n desc.attachmentLayer ?? 0\r\n );\r\n }\r\n\r\n /**\r\n * Release a temporary framebuffer back to the device pool.\r\n *\r\n * @param framebuffer - The framebuffer to release.\r\n */\r\n releaseFramebuffer(framebuffer: FrameBuffer): void {\r\n const device = getDevice();\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n }\r\n}\r\n"],"names":["DevicePoolAllocator","allocate","desc","size","device","getDevice","mipmapping","mipLevels","texture","pool","fetchTemporalTexture2D","format","width","height","mipLevelCount","releaseTexture","Error","label","release","retain","retainTexture","allocateFramebuffer","colors","Array","isArray","colorAttachments","depthAttachment","fetchTemporalFramebuffer","sampleCount","ignoreDepthStencil","attachmentMipLevel","attachmentCubeface","attachmentLayer","releaseFramebuffer","framebuffer","releaseFrameBuffer"],"mappings":";;AAIA;;;;;;;;;;;;;;;AAeC,IACM,MAAMA,mBAAAA,CAAAA;AACX;;;;;;AAMC,MACDC,QAASC,CAAAA,IAAmB,EAAEC,IAAoB,EAAa;AAC7D,QAAA,MAAMC,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,MAAMC,aAAa,CAACJ,KAAKK,SAAS,IAAI,CAAA,IAAK,CAAA;AAC3C,QAAA,MAAMC,OAAUJ,GAAAA,MAAAA,CAAOK,IAAI,CAACC,sBAAsB,CAChD,KAAA,EACAR,IAAKS,CAAAA,MAAM,EACXR,IAAKS,CAAAA,KAAK,EACVT,IAAAA,CAAKU,MAAM,EACXP,UAAAA,CAAAA;QAEF,IAAIJ,IAAAA,CAAKK,SAAS,IAAIC,OAAAA,CAAQM,aAAa,GAAGZ,IAAAA,CAAKK,SAAS,EAAE;YAC5DH,MAAOK,CAAAA,IAAI,CAACM,cAAc,CAACP,OAAAA,CAAAA;YAC3B,MAAM,IAAIQ,KACR,CAAA,CAAC,8BAA8B,EAAEd,KAAKe,KAAK,IAAI,WAAY,CAAA,YAAY,EAAEf,IAAAA,CAAKK,SAAS,CAAC,CAAC,CAAC,GACxF,CAAC,qBAAqB,EAAEC,OAAQM,CAAAA,aAAa,CAAC,gBAAgB,CAAC,CAAA;AAErE;QACA,OAAON,OAAAA;AACT;AAEA;;;;MAKAU,OAAAA,CAAQV,OAAkB,EAAQ;AAChC,QAAA,MAAMJ,MAASC,GAAAA,SAAAA,EAAAA;QACfD,MAAOK,CAAAA,IAAI,CAACM,cAAc,CAACP,OAAAA,CAAAA;AAC7B;AAEA;;;;MAKAW,MAAAA,CAAOX,OAAkB,EAAQ;AAC/B,QAAA,MAAMJ,MAASC,GAAAA,SAAAA,EAAAA;QACfD,MAAOK,CAAAA,IAAI,CAACW,aAAa,CAACZ,OAAAA,CAAAA;AAC5B;AAEA;;;;;MAMAa,mBAAAA,CAAoBnB,IAAuB,EAAe;AACxD,QAAA,MAAME,MAASC,GAAAA,SAAAA,EAAAA;AACf,QAAA,MAAMiB,MAASC,GAAAA,KAAAA,CAAMC,OAAO,CAACtB,IAAKuB,CAAAA,gBAAgB,CAC7CvB,GAAAA,IAAAA,CAAKuB,gBAAgB,GACtBvB,IAAKuB,CAAAA,gBAAgB,GACnB;AAACvB,YAAAA,IAAAA,CAAKuB;AAA8C,SAAA,GACpD,EAAE;QACR,MAAMC,eAAAA,GAAmBxB,IAAKwB,CAAAA,eAAe,IAAI,IAAA;AACjD,QAAA,OAAOtB,OAAOK,IAAI,CAACkB,wBAAwB,CACzC,OACAzB,IAAKU,CAAAA,KAAK,IAAI,CAAA,EACdV,KAAKW,MAAM,IAAI,GACfS,MACAI,EAAAA,eAAAA,EACAxB,KAAKI,UAAU,IAAI,KACnBJ,EAAAA,IAAAA,CAAK0B,WAAW,IAAI,CAAA,EACpB1B,IAAK2B,CAAAA,kBAAkB,IAAI,IAC3B3B,EAAAA,IAAAA,CAAK4B,kBAAkB,IAAI,GAC3B5B,IAAK6B,CAAAA,kBAAkB,IAAI,CAC3B7B,EAAAA,IAAAA,CAAK8B,eAAe,IAAI,CAAA,CAAA;AAE5B;AAEA;;;;MAKAC,kBAAAA,CAAmBC,WAAwB,EAAQ;AACjD,QAAA,MAAM9B,MAASC,GAAAA,SAAAA,EAAAA;QACfD,MAAOK,CAAAA,IAAI,CAAC0B,kBAAkB,CAACD,WAAAA,CAAAA;AACjC;AACF;;;;"}
1
+ {"version":3,"file":"device_pool_allocator.js","sources":["../../../src/render/rendergraph/device_pool_allocator.ts"],"sourcesContent":["import type { FrameBuffer, Texture2D, TextureFormat, AbstractDevice } from '@zephyr3d/device';\r\nimport type { RGFramebufferDesc, RGTextureAllocator, RGTextureDesc, RGResolvedSize } from './types';\r\nimport { getDevice } from '../../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Bridges the render graph's {@link RGTextureAllocator} interface to the\r\n * engine's device resource pool (`device.pool`).\r\n *\r\n * Transient textures are fetched from the pool on `allocate()` and\r\n * returned to the pool on `release()`, enabling automatic reuse\r\n * across frames without manual lifecycle management.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const allocator = new DevicePoolAllocator();\r\n * const executor = new RenderGraphExecutor(allocator, width, height);\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class DevicePoolAllocator implements RGTextureAllocator<Texture2D, FrameBuffer> {\r\n private _device: Nullable<AbstractDevice>;\r\n /**\r\n * Creates a new instance of the DevicePoolAllocator.\r\n * @param device - Optional device instance to use for resource allocation. If not provided, the global device will be used.\r\n */\r\n constructor(device?: AbstractDevice) {\r\n this._device = device ?? null;\r\n }\r\n /**\r\n * Allocate a transient texture from the device pool.\r\n *\r\n * @param desc - Texture descriptor from the render graph pass.\r\n * @param size - Resolved pixel dimensions.\r\n * @returns A pooled Texture2D instance.\r\n */\r\n allocate(desc: RGTextureDesc, size: RGResolvedSize): Texture2D {\r\n const device = this._device ?? getDevice();\r\n const mipmapping = (desc.mipLevels ?? 1) > 1;\r\n const texture = device.pool.fetchTemporalTexture2D(\r\n false,\r\n desc.format,\r\n size.width,\r\n size.height,\r\n mipmapping\r\n );\r\n if (desc.mipLevels && texture.mipLevelCount < desc.mipLevels) {\r\n device.pool.releaseTexture(texture);\r\n throw new Error(\r\n `DevicePoolAllocator: texture \"${desc.label ?? '<unnamed>'}\" requested ${desc.mipLevels} ` +\r\n `mip levels, but only ${texture.mipLevelCount} were allocated.`\r\n );\r\n }\r\n return texture;\r\n }\r\n\r\n /**\r\n * Release a transient texture back to the device pool.\r\n *\r\n * @param texture - The texture to release.\r\n */\r\n release(texture: Texture2D): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.releaseTexture(texture);\r\n }\r\n\r\n /**\r\n * Retain a pooled texture so it can be owned outside the graph lifetime.\r\n *\r\n * @param texture - The texture to retain.\r\n */\r\n retain(texture: Texture2D): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.retainTexture(texture);\r\n }\r\n\r\n /**\r\n * Allocate a temporary framebuffer from the device pool.\r\n *\r\n * @param desc - Framebuffer descriptor from the render graph pass.\r\n * @returns A pooled FrameBuffer instance.\r\n */\r\n allocateFramebuffer(desc: RGFramebufferDesc): FrameBuffer {\r\n const device = this._device ?? getDevice();\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? (desc.colorAttachments as Array<Texture2D | TextureFormat>)\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments as Texture2D | TextureFormat]\r\n : [];\r\n const depthAttachment = (desc.depthAttachment ?? null) as Texture2D | TextureFormat | null;\r\n return device.pool.fetchTemporalFramebuffer(\r\n false,\r\n desc.width ?? 0,\r\n desc.height ?? 0,\r\n colors,\r\n depthAttachment,\r\n desc.mipmapping ?? false,\r\n desc.sampleCount ?? 1,\r\n desc.ignoreDepthStencil ?? true,\r\n desc.attachmentMipLevel ?? 0,\r\n desc.attachmentCubeface ?? 0,\r\n desc.attachmentLayer ?? 0\r\n );\r\n }\r\n\r\n /**\r\n * Release a temporary framebuffer back to the device pool.\r\n *\r\n * @param framebuffer - The framebuffer to release.\r\n */\r\n releaseFramebuffer(framebuffer: FrameBuffer): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n }\r\n}\r\n"],"names":["DevicePoolAllocator","_device","device","allocate","desc","size","getDevice","mipmapping","mipLevels","texture","pool","fetchTemporalTexture2D","format","width","height","mipLevelCount","releaseTexture","Error","label","release","retain","retainTexture","allocateFramebuffer","colors","Array","isArray","colorAttachments","depthAttachment","fetchTemporalFramebuffer","sampleCount","ignoreDepthStencil","attachmentMipLevel","attachmentCubeface","attachmentLayer","releaseFramebuffer","framebuffer","releaseFrameBuffer"],"mappings":";;AAKA;;;;;;;;;;;;;;;AAeC,IACM,MAAMA,mBAAAA,CAAAA;IACHC,OAAkC;AAC1C;;;MAIA,WAAA,CAAYC,MAAuB,CAAE;QACnC,IAAI,CAACD,OAAO,GAAGC,MAAU,IAAA,IAAA;AAC3B;AACA;;;;;;AAMC,MACDC,QAASC,CAAAA,IAAmB,EAAEC,IAAoB,EAAa;AAC7D,QAAA,MAAMH,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;AAC/B,QAAA,MAAMC,aAAa,CAACH,KAAKI,SAAS,IAAI,CAAA,IAAK,CAAA;AAC3C,QAAA,MAAMC,OAAUP,GAAAA,MAAAA,CAAOQ,IAAI,CAACC,sBAAsB,CAChD,KAAA,EACAP,IAAKQ,CAAAA,MAAM,EACXP,IAAKQ,CAAAA,KAAK,EACVR,IAAAA,CAAKS,MAAM,EACXP,UAAAA,CAAAA;QAEF,IAAIH,IAAAA,CAAKI,SAAS,IAAIC,OAAAA,CAAQM,aAAa,GAAGX,IAAAA,CAAKI,SAAS,EAAE;YAC5DN,MAAOQ,CAAAA,IAAI,CAACM,cAAc,CAACP,OAAAA,CAAAA;YAC3B,MAAM,IAAIQ,KACR,CAAA,CAAC,8BAA8B,EAAEb,KAAKc,KAAK,IAAI,WAAY,CAAA,YAAY,EAAEd,IAAAA,CAAKI,SAAS,CAAC,CAAC,CAAC,GACxF,CAAC,qBAAqB,EAAEC,OAAQM,CAAAA,aAAa,CAAC,gBAAgB,CAAC,CAAA;AAErE;QACA,OAAON,OAAAA;AACT;AAEA;;;;MAKAU,OAAAA,CAAQV,OAAkB,EAAQ;AAChC,QAAA,MAAMP,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;QAC/BJ,MAAOQ,CAAAA,IAAI,CAACM,cAAc,CAACP,OAAAA,CAAAA;AAC7B;AAEA;;;;MAKAW,MAAAA,CAAOX,OAAkB,EAAQ;AAC/B,QAAA,MAAMP,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;QAC/BJ,MAAOQ,CAAAA,IAAI,CAACW,aAAa,CAACZ,OAAAA,CAAAA;AAC5B;AAEA;;;;;MAMAa,mBAAAA,CAAoBlB,IAAuB,EAAe;AACxD,QAAA,MAAMF,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;AAC/B,QAAA,MAAMiB,MAASC,GAAAA,KAAAA,CAAMC,OAAO,CAACrB,IAAKsB,CAAAA,gBAAgB,CAC7CtB,GAAAA,IAAAA,CAAKsB,gBAAgB,GACtBtB,IAAKsB,CAAAA,gBAAgB,GACnB;AAACtB,YAAAA,IAAAA,CAAKsB;AAA8C,SAAA,GACpD,EAAE;QACR,MAAMC,eAAAA,GAAmBvB,IAAKuB,CAAAA,eAAe,IAAI,IAAA;AACjD,QAAA,OAAOzB,OAAOQ,IAAI,CAACkB,wBAAwB,CACzC,OACAxB,IAAKS,CAAAA,KAAK,IAAI,CAAA,EACdT,KAAKU,MAAM,IAAI,GACfS,MACAI,EAAAA,eAAAA,EACAvB,KAAKG,UAAU,IAAI,KACnBH,EAAAA,IAAAA,CAAKyB,WAAW,IAAI,CAAA,EACpBzB,IAAK0B,CAAAA,kBAAkB,IAAI,IAC3B1B,EAAAA,IAAAA,CAAK2B,kBAAkB,IAAI,GAC3B3B,IAAK4B,CAAAA,kBAAkB,IAAI,CAC3B5B,EAAAA,IAAAA,CAAK6B,eAAe,IAAI,CAAA,CAAA;AAE5B;AAEA;;;;MAKAC,kBAAAA,CAAmBC,WAAwB,EAAQ;AACjD,QAAA,MAAMjC,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;QAC/BJ,MAAOQ,CAAAA,IAAI,CAAC0B,kBAAkB,CAACD,WAAAA,CAAAA;AACjC;AACF;;;;"}
@@ -33,7 +33,7 @@ const _clusters = [];
33
33
  const _devicePoolAllocator = new DevicePoolAllocator();
34
34
  let _backDepthColorState = null;
35
35
  let _frontDepthColorState = null;
36
- const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION;
36
+ const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE;
37
37
  function getClusteredLight() {
38
38
  return _clusters.length > 0 ? _clusters.pop() : new ClusteredLight();
39
39
  }
@@ -46,6 +46,9 @@ function getCoreMaterial(material) {
46
46
  function hasSSSMaterialCore(material) {
47
47
  return !!getCoreMaterial(material)?.subsurfaceProfile;
48
48
  }
49
+ function hasSkinSSSMaterialCore(material) {
50
+ return !!getCoreMaterial(material)?.skinSSS;
51
+ }
49
52
  function renderQueueHasActiveSSS(renderQueue) {
50
53
  const itemList = renderQueue.itemList;
51
54
  if (!itemList) {
@@ -64,6 +67,24 @@ function renderQueueHasActiveSSS(renderQueue) {
64
67
  }
65
68
  return false;
66
69
  }
70
+ function renderQueueHasActiveSkinSSS(renderQueue) {
71
+ const itemList = renderQueue.itemList;
72
+ if (!itemList) {
73
+ return false;
74
+ }
75
+ const lists = [
76
+ ...itemList.opaque.lit,
77
+ ...itemList.opaque.unlit
78
+ ];
79
+ for (const list of lists){
80
+ for (const material of list.materialList){
81
+ if (hasSkinSSSMaterialCore(material)) {
82
+ return true;
83
+ }
84
+ }
85
+ }
86
+ return false;
87
+ }
67
88
  function filterActualSSSItemList(items) {
68
89
  return items.filter((item)=>hasSSSMaterialCore(item.drawable.getMaterial?.()));
69
90
  }
@@ -185,6 +206,9 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
185
206
  if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {
186
207
  attachments.push(ctx.SSSTransmissionTexture);
187
208
  }
209
+ if (ctx.materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {
210
+ attachments.push(ctx.SkinSSSTexture);
211
+ }
188
212
  return attachments.length === 1 ? attachments[0] : attachments;
189
213
  }
190
214
  /**
@@ -193,6 +217,7 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
193
217
  */ function deriveForwardPlusOptions(scene, camera, deviceType, renderQueue) {
194
218
  const ssr = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();
195
219
  const sss = camera.SSS && renderQueueHasActiveSSS(renderQueue);
220
+ const skinSSS = camera.skinSSS && renderQueueHasActiveSkinSSS(renderQueue);
196
221
  const needSceneColor = renderQueue.needSceneColor();
197
222
  const needSceneColorWithDepth = renderQueue.needSceneColorWithDepth();
198
223
  return {
@@ -205,7 +230,8 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
205
230
  needSceneColor,
206
231
  needSceneColorWithDepth,
207
232
  needsTransmissionDepthForSSR: !!ssr && needSceneColor && !needSceneColorWithDepth,
208
- sss: !!sss
233
+ sss: !!sss,
234
+ skinSSS: !!skinSSS
209
235
  };
210
236
  }
211
237
  // ─── Forward+ Graph Builder ─────────────────────────────────────────
@@ -229,6 +255,7 @@ function getLightPassColorAttachments(ctx, colorAttachment) {
229
255
  function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
230
256
  const backbuffer = graph.importTexture('backbuffer');
231
257
  ctx.SSS = !!options.sss;
258
+ ctx.SkinSSSTexture = null;
232
259
  // Shared mutable frame state
233
260
  const frame = {
234
261
  ctx,
@@ -348,6 +375,7 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
348
375
  const depthHandle = depthPassResult.depthHandle;
349
376
  const motionVectorHandle = depthPassResult.motionVectorHandle;
350
377
  const renderDepthAttachment = depthPassResult.graphDepthAttachmentHandle ?? depthPassResult.externalDepthAttachment ?? null;
378
+ const useFinalFramebufferAsIntermediate = !!depthPassResult.externalDepthAttachment && depthPassResult.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment();
351
379
  let preLightTransmissionDepthToken;
352
380
  if (options.needsTransmissionDepthForSSR) {
353
381
  preLightTransmissionDepthToken = graph.addPass('TransmissionDepthForSSR', (builder)=>{
@@ -534,7 +562,8 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
534
562
  if (writeSSSDiffuse && writeSSSTransmission && includeSSRSurfaceMRT && getSSSLightingTextureFormat(ctx, 2, includeSSRSurfaceMRT) !== ctx.colorFormat) {
535
563
  writeSSSTransmission = false;
536
564
  }
537
- const sssLightingAttachmentCount = (writeSSSDiffuse ? 1 : 0) + (writeSSSTransmission ? 1 : 0);
565
+ const writeSkinSSS = options.skinSSS;
566
+ const sssLightingAttachmentCount = (writeSSSDiffuse ? 1 : 0) + (writeSSSTransmission ? 1 : 0) + (writeSkinSSS ? 1 : 0);
538
567
  const sssLightingFormat = getSSSLightingTextureFormat(ctx, sssLightingAttachmentCount, includeSSRSurfaceMRT);
539
568
  const sssDiffuseHandle = writeSSSDiffuse ? builder.createTexture({
540
569
  format: sssLightingFormat,
@@ -544,7 +573,10 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
544
573
  format: sssLightingFormat,
545
574
  label: 'sssTransmission'
546
575
  }) : undefined;
547
- const useFinalFramebufferAsIntermediate = !!depthPassResult.externalDepthAttachment && depthPassResult.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment();
576
+ const skinSSSHandle = writeSkinSSS ? builder.createTexture({
577
+ format: sssLightingFormat,
578
+ label: 'skinSSS'
579
+ }) : undefined;
548
580
  const sceneColorFramebufferHandle = useFinalFramebufferAsIntermediate ? undefined : builder.createFramebuffer({
549
581
  label: 'SceneColorFramebuffer',
550
582
  width: ctx.renderWidth,
@@ -575,6 +607,7 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
575
607
  }
576
608
  ctx.SSSDiffuseTexture = sssDiffuseHandle ? rgCtx.getTexture(sssDiffuseHandle) : null;
577
609
  ctx.SSSTransmissionTexture = sssTransmissionHandle ? rgCtx.getTexture(sssTransmissionHandle) : null;
610
+ ctx.SkinSSSTexture = skinSSSHandle ? rgCtx.getTexture(skinSSSHandle) : null;
578
611
  const renderLightPass = ()=>renderMainLightPass(frame, sceneColorTex, sceneColorCopyTex, rgCtx, sceneColorFramebufferHandle, sceneColorCopyFramebufferHandle);
579
612
  if (historyManager && lightHistoryReadBindings.length > 0) {
580
613
  historyManager.beginReadScope(lightHistoryReadBindings.map((binding)=>({
@@ -631,19 +664,24 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
631
664
  builder.read(binding.handle);
632
665
  }
633
666
  const outputBackbuffer = builder.write(backbuffer);
667
+ const taaHistoryColorHandle = useFinalFramebufferAsIntermediate ? outputBackbuffer : sceneColorHandle;
634
668
  builder.setExecute((rgCtx)=>{
669
+ const renderAndCommitComposite = ()=>{
670
+ renderComposite(frame);
671
+ queueTAAHistoryCommit(frame, rgCtx, historyManager, taaHistoryColorHandle, motionVectorHandle);
672
+ };
635
673
  if (historyManager && compositeHistoryReadBindings.length > 0) {
636
674
  historyManager.beginReadScope(compositeHistoryReadBindings.map((binding)=>({
637
675
  name: binding.name,
638
676
  texture: rgCtx.getTexture(binding.handle)
639
677
  })));
640
678
  try {
641
- renderComposite(frame);
679
+ renderAndCommitComposite();
642
680
  } finally{
643
681
  historyManager.endReadScope();
644
682
  }
645
683
  } else {
646
- renderComposite(frame);
684
+ renderAndCommitComposite();
647
685
  }
648
686
  });
649
687
  return outputBackbuffer;
@@ -702,7 +740,7 @@ function renderForwardSSSProfile(frame, profileFramebuffer, profileTexture, para
702
740
  ctx.SSRNormalTexture = normalTexture;
703
741
  ctx.compositor = null;
704
742
  ctx.camera.commandBufferReuse = false;
705
- ctx.materialFlags = ctx.materialFlags & ~(MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_TRANSMISSION) | profileFlags;
743
+ ctx.materialFlags = ctx.materialFlags & ~(MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE) | profileFlags;
706
744
  _scenePass.transmission = false;
707
745
  _scenePass.renderOpaque = true;
708
746
  _scenePass.renderTransparent = false;
@@ -932,7 +970,7 @@ function blitToCurrentColorAttachment(ctx, source) {
932
970
  const device = ctx.device;
933
971
  // Use RenderGraph-allocated scene color texture
934
972
  const depthTex = frame.depthFramebuffer?.getDepthAttachment();
935
- ctx.materialFlags &= ~(MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION);
973
+ ctx.materialFlags &= ~(MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE);
936
974
  if (ctx.SSR) {
937
975
  ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;
938
976
  }
@@ -944,6 +982,9 @@ function blitToCurrentColorAttachment(ctx, source) {
944
982
  ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_TRANSMISSION;
945
983
  }
946
984
  }
985
+ if (ctx.SkinSSSTexture) {
986
+ ctx.materialFlags |= MaterialVaryingFlags.SKIN_SSS_STORE;
987
+ }
947
988
  if (depthTex === ctx.finalFramebuffer?.getDepthAttachment()) {
948
989
  ctx.intermediateFramebuffer = ctx.finalFramebuffer;
949
990
  } else if (sceneColorFramebufferHandle && !hasSurfaceMRT(ctx)) {
@@ -1022,6 +1063,34 @@ function blitToCurrentColorAttachment(ctx, source) {
1022
1063
  /** @internal */ function renderTransmissionDepthPass(frame, rgCtx) {
1023
1064
  renderSceneDepth(frame, frame.depthFramebuffer, rgCtx);
1024
1065
  }
1066
+ function queueTAAHistoryCommit(frame, rgCtx, historyManager, colorHandle, motionVectorHandle) {
1067
+ const { ctx } = frame;
1068
+ if (!historyManager?.frameActive || !ctx.camera.TAA || !frame.options.motionVectors || !motionVectorHandle) {
1069
+ return;
1070
+ }
1071
+ const colorTexture = rgCtx.getTexture(colorHandle);
1072
+ const colorSize = {
1073
+ width: colorTexture.width,
1074
+ height: colorTexture.height
1075
+ };
1076
+ historyManager.queueRetainedCommit(RGHistoryResources.TAA_COLOR, {
1077
+ format: colorTexture.format,
1078
+ sizeMode: 'absolute',
1079
+ width: colorTexture.width,
1080
+ height: colorTexture.height
1081
+ }, colorSize, colorTexture);
1082
+ const motionVectorTexture = rgCtx.getTexture(motionVectorHandle);
1083
+ const motionVectorSize = {
1084
+ width: motionVectorTexture.width,
1085
+ height: motionVectorTexture.height
1086
+ };
1087
+ historyManager.queueRetainedCommit(RGHistoryResources.TAA_MOTION_VECTOR, {
1088
+ format: motionVectorTexture.format,
1089
+ sizeMode: 'absolute',
1090
+ width: motionVectorTexture.width,
1091
+ height: motionVectorTexture.height
1092
+ }, motionVectorSize, motionVectorTexture);
1093
+ }
1025
1094
  /** @internal */ function renderComposite(frame) {
1026
1095
  const { ctx } = frame;
1027
1096
  ctx.compositor?.drawPostEffects(ctx, PostEffectLayer.end, ctx.linearDepthTexture);
@@ -1032,6 +1101,7 @@ function blitToCurrentColorAttachment(ctx, source) {
1032
1101
  ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_DIFFUSE;
1033
1102
  ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_NORMAL;
1034
1103
  ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_TRANSMISSION;
1104
+ ctx.materialFlags &= ~MaterialVaryingFlags.SKIN_SSS_STORE;
1035
1105
  if (ctx.intermediateFramebuffer && ctx.intermediateFramebuffer !== ctx.finalFramebuffer) {
1036
1106
  const blitter = new CopyBlitter();
1037
1107
  blitter.srgbOut = !ctx.finalFramebuffer;