@zephyr3d/scene 0.9.15 → 0.9.17

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 (123) hide show
  1. package/dist/app/engine.js +3 -1
  2. package/dist/app/engine.js.map +1 -1
  3. package/dist/asset/assetmanager.js +1 -0
  4. package/dist/asset/assetmanager.js.map +1 -1
  5. package/dist/camera/camera.js +87 -0
  6. package/dist/camera/camera.js.map +1 -1
  7. package/dist/index.d.ts +152 -4
  8. package/dist/index.js +3 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/material/meshmaterial.js +8 -1
  11. package/dist/material/meshmaterial.js.map +1 -1
  12. package/dist/material/shader/helper.js +6 -0
  13. package/dist/material/shader/helper.js.map +1 -1
  14. package/dist/material/skin.js +263 -0
  15. package/dist/material/skin.js.map +1 -0
  16. package/dist/posteffect/compositor.js +3 -0
  17. package/dist/posteffect/compositor.js.map +1 -1
  18. package/dist/posteffect/skinsss.js +194 -0
  19. package/dist/posteffect/skinsss.js.map +1 -0
  20. package/dist/posteffect/ssr.js +26 -49
  21. package/dist/posteffect/ssr.js.map +1 -1
  22. package/dist/posteffect/sss.js +1 -0
  23. package/dist/posteffect/sss.js.map +1 -1
  24. package/dist/posteffect/taa.js +2 -40
  25. package/dist/posteffect/taa.js.map +1 -1
  26. package/dist/render/abuffer_oit.js +1 -0
  27. package/dist/render/abuffer_oit.js.map +1 -1
  28. package/dist/render/drawable_mixin.js +1 -0
  29. package/dist/render/drawable_mixin.js.map +1 -1
  30. package/dist/render/fbm_wavegenerator.js +1 -0
  31. package/dist/render/fbm_wavegenerator.js.map +1 -1
  32. package/dist/render/gerstner_wavegenerator.js +1 -0
  33. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  34. package/dist/render/globalbindgroup_allocator.js +1 -0
  35. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  36. package/dist/render/lightpass.js +4 -1
  37. package/dist/render/lightpass.js.map +1 -1
  38. package/dist/render/render_queue.js +1 -0
  39. package/dist/render/render_queue.js.map +1 -1
  40. package/dist/render/renderer.js +1 -0
  41. package/dist/render/renderer.js.map +1 -1
  42. package/dist/render/rendergraph/device_pool_allocator.js +41 -41
  43. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  44. package/dist/render/rendergraph/forward_plus_builder.js +78 -8
  45. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  46. package/dist/scene/basesprite.js +1 -0
  47. package/dist/scene/basesprite.js.map +1 -1
  48. package/dist/scene/batchgroup.js +1 -0
  49. package/dist/scene/batchgroup.js.map +1 -1
  50. package/dist/scene/environment.js +1 -0
  51. package/dist/scene/environment.js.map +1 -1
  52. package/dist/scene/light.js +158 -154
  53. package/dist/scene/light.js.map +1 -1
  54. package/dist/scene/mesh.js +1 -0
  55. package/dist/scene/mesh.js.map +1 -1
  56. package/dist/scene/msdftext.js +1 -0
  57. package/dist/scene/msdftext.js.map +1 -1
  58. package/dist/scene/msdftextsprite.js +1 -0
  59. package/dist/scene/msdftextsprite.js.map +1 -1
  60. package/dist/scene/particlesys.js +1 -0
  61. package/dist/scene/particlesys.js.map +1 -1
  62. package/dist/scene/scene.js +1 -0
  63. package/dist/scene/scene.js.map +1 -1
  64. package/dist/scene/terrain-cm/grass.js +1 -0
  65. package/dist/scene/terrain-cm/grass.js.map +1 -1
  66. package/dist/scene/terrain-cm/grassmaterial.js +1 -0
  67. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  68. package/dist/scene/terrain-cm/terrain-cm.js +1 -0
  69. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  70. package/dist/scene/water.js +1 -0
  71. package/dist/scene/water.js.map +1 -1
  72. package/dist/shaders/shadow.js +617 -1
  73. package/dist/shaders/shadow.js.map +1 -1
  74. package/dist/shadow/esm.js +1 -0
  75. package/dist/shadow/esm.js.map +1 -1
  76. package/dist/shadow/pcf_opt.js +1 -0
  77. package/dist/shadow/pcf_opt.js.map +1 -1
  78. package/dist/shadow/pcf_pd.js +1 -0
  79. package/dist/shadow/pcf_pd.js.map +1 -1
  80. package/dist/shadow/pcss.js +182 -0
  81. package/dist/shadow/pcss.js.map +1 -0
  82. package/dist/shadow/shader.js +1 -0
  83. package/dist/shadow/shader.js.map +1 -1
  84. package/dist/shadow/shadow_impl.js.map +1 -1
  85. package/dist/shadow/shadowmapper.js +183 -105
  86. package/dist/shadow/shadowmapper.js.map +1 -1
  87. package/dist/shadow/ssm.js +1 -0
  88. package/dist/shadow/ssm.js.map +1 -1
  89. package/dist/shadow/vsm.js +1 -0
  90. package/dist/shadow/vsm.js.map +1 -1
  91. package/dist/utility/serialization/manager.js +3 -1
  92. package/dist/utility/serialization/manager.js.map +1 -1
  93. package/dist/utility/serialization/scene/animation.js +1 -0
  94. package/dist/utility/serialization/scene/animation.js.map +1 -1
  95. package/dist/utility/serialization/scene/batch.js +1 -0
  96. package/dist/utility/serialization/scene/batch.js.map +1 -1
  97. package/dist/utility/serialization/scene/camera.js +122 -0
  98. package/dist/utility/serialization/scene/camera.js.map +1 -1
  99. package/dist/utility/serialization/scene/common.js +1 -0
  100. package/dist/utility/serialization/scene/common.js.map +1 -1
  101. package/dist/utility/serialization/scene/light.js +102 -21
  102. package/dist/utility/serialization/scene/light.js.map +1 -1
  103. package/dist/utility/serialization/scene/material.js +195 -3
  104. package/dist/utility/serialization/scene/material.js.map +1 -1
  105. package/dist/utility/serialization/scene/mesh.js +1 -0
  106. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  107. package/dist/utility/serialization/scene/node.js +1 -0
  108. package/dist/utility/serialization/scene/node.js.map +1 -1
  109. package/dist/utility/serialization/scene/particle.js +1 -0
  110. package/dist/utility/serialization/scene/particle.js.map +1 -1
  111. package/dist/utility/serialization/scene/primitive.js +1 -0
  112. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  113. package/dist/utility/serialization/scene/sprite.js +1 -0
  114. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  115. package/dist/utility/serialization/scene/terrain.js +1 -0
  116. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  117. package/dist/utility/serialization/scene/text.js +1 -0
  118. package/dist/utility/serialization/scene/text.js.map +1 -1
  119. package/dist/utility/serialization/scene/water.js +1 -0
  120. package/dist/utility/serialization/scene/water.js.map +1 -1
  121. package/dist/values.js +1 -0
  122. package/dist/values.js.map +1 -1
  123. package/package.json +2 -2
@@ -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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"}
@@ -1,34 +1,34 @@
1
1
  import { getDevice } from '../../app/api.js';
2
2
 
3
- /**
4
- * Bridges the render graph's {@link RGTextureAllocator} interface to the
5
- * engine's device resource pool (`device.pool`).
6
- *
7
- * Transient textures are fetched from the pool on `allocate()` and
8
- * returned to the pool on `release()`, enabling automatic reuse
9
- * across frames without manual lifecycle management.
10
- *
11
- * Usage:
12
- * ```ts
13
- * const allocator = new DevicePoolAllocator();
14
- * const executor = new RenderGraphExecutor(allocator, width, height);
15
- * ```
16
- *
17
- * @public
3
+ /**
4
+ * Bridges the render graph's {@link RGTextureAllocator} interface to the
5
+ * engine's device resource pool (`device.pool`).
6
+ *
7
+ * Transient textures are fetched from the pool on `allocate()` and
8
+ * returned to the pool on `release()`, enabling automatic reuse
9
+ * across frames without manual lifecycle management.
10
+ *
11
+ * Usage:
12
+ * ```ts
13
+ * const allocator = new DevicePoolAllocator();
14
+ * const executor = new RenderGraphExecutor(allocator, width, height);
15
+ * ```
16
+ *
17
+ * @public
18
18
  */ class DevicePoolAllocator {
19
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.
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
23
  */ constructor(device){
24
24
  this._device = device ?? null;
25
25
  }
26
- /**
27
- * Allocate a transient texture from the device pool.
28
- *
29
- * @param desc - Texture descriptor from the render graph pass.
30
- * @param size - Resolved pixel dimensions.
31
- * @returns A pooled Texture2D instance.
26
+ /**
27
+ * Allocate a transient texture from the device pool.
28
+ *
29
+ * @param desc - Texture descriptor from the render graph pass.
30
+ * @param size - Resolved pixel dimensions.
31
+ * @returns A pooled Texture2D instance.
32
32
  */ allocate(desc, size) {
33
33
  const device = this._device ?? getDevice();
34
34
  const mipmapping = (desc.mipLevels ?? 1) > 1;
@@ -39,27 +39,27 @@ import { getDevice } from '../../app/api.js';
39
39
  }
40
40
  return texture;
41
41
  }
42
- /**
43
- * Release a transient texture back to the device pool.
44
- *
45
- * @param texture - The texture to release.
42
+ /**
43
+ * Release a transient texture back to the device pool.
44
+ *
45
+ * @param texture - The texture to release.
46
46
  */ release(texture) {
47
47
  const device = this._device ?? getDevice();
48
48
  device.pool.releaseTexture(texture);
49
49
  }
50
- /**
51
- * Retain a pooled texture so it can be owned outside the graph lifetime.
52
- *
53
- * @param texture - The texture to retain.
50
+ /**
51
+ * Retain a pooled texture so it can be owned outside the graph lifetime.
52
+ *
53
+ * @param texture - The texture to retain.
54
54
  */ retain(texture) {
55
55
  const device = this._device ?? getDevice();
56
56
  device.pool.retainTexture(texture);
57
57
  }
58
- /**
59
- * Allocate a temporary framebuffer from the device pool.
60
- *
61
- * @param desc - Framebuffer descriptor from the render graph pass.
62
- * @returns A pooled FrameBuffer instance.
58
+ /**
59
+ * Allocate a temporary framebuffer from the device pool.
60
+ *
61
+ * @param desc - Framebuffer descriptor from the render graph pass.
62
+ * @returns A pooled FrameBuffer instance.
63
63
  */ allocateFramebuffer(desc) {
64
64
  const device = this._device ?? getDevice();
65
65
  const colors = Array.isArray(desc.colorAttachments) ? desc.colorAttachments : desc.colorAttachments ? [
@@ -68,10 +68,10 @@ import { getDevice } from '../../app/api.js';
68
68
  const depthAttachment = desc.depthAttachment ?? null;
69
69
  return device.pool.fetchTemporalFramebuffer(false, desc.width ?? 0, desc.height ?? 0, colors, depthAttachment, desc.mipmapping ?? false, desc.sampleCount ?? 1, desc.ignoreDepthStencil ?? true, desc.attachmentMipLevel ?? 0, desc.attachmentCubeface ?? 0, desc.attachmentLayer ?? 0);
70
70
  }
71
- /**
72
- * Release a temporary framebuffer back to the device pool.
73
- *
74
- * @param framebuffer - The framebuffer to release.
71
+ /**
72
+ * Release a temporary framebuffer back to the device pool.
73
+ *
74
+ * @param framebuffer - The framebuffer to release.
75
75
  */ releaseFramebuffer(framebuffer) {
76
76
  const device = this._device ?? getDevice();
77
77
  device.pool.releaseFrameBuffer(framebuffer);
@@ -1 +1 @@
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';\nimport type { RGFramebufferDesc, RGTextureAllocator, RGTextureDesc, RGResolvedSize } from './types';\nimport { getDevice } from '../../app/api';\nimport type { Nullable } from '@zephyr3d/base';\n\n/**\n * Bridges the render graph's {@link RGTextureAllocator} interface to the\n * engine's device resource pool (`device.pool`).\n *\n * Transient textures are fetched from the pool on `allocate()` and\n * returned to the pool on `release()`, enabling automatic reuse\n * across frames without manual lifecycle management.\n *\n * Usage:\n * ```ts\n * const allocator = new DevicePoolAllocator();\n * const executor = new RenderGraphExecutor(allocator, width, height);\n * ```\n *\n * @public\n */\nexport class DevicePoolAllocator implements RGTextureAllocator<Texture2D, FrameBuffer> {\n private _device: Nullable<AbstractDevice>;\n /**\n * Creates a new instance of the DevicePoolAllocator.\n * @param device - Optional device instance to use for resource allocation. If not provided, the global device will be used.\n */\n constructor(device?: AbstractDevice) {\n this._device = device ?? null;\n }\n /**\n * Allocate a transient texture from the device pool.\n *\n * @param desc - Texture descriptor from the render graph pass.\n * @param size - Resolved pixel dimensions.\n * @returns A pooled Texture2D instance.\n */\n allocate(desc: RGTextureDesc, size: RGResolvedSize): Texture2D {\n const device = this._device ?? getDevice();\n const mipmapping = (desc.mipLevels ?? 1) > 1;\n const texture = device.pool.fetchTemporalTexture2D(\n false,\n desc.format,\n size.width,\n size.height,\n mipmapping\n );\n if (desc.mipLevels && texture.mipLevelCount < desc.mipLevels) {\n device.pool.releaseTexture(texture);\n throw new Error(\n `DevicePoolAllocator: texture \"${desc.label ?? '<unnamed>'}\" requested ${desc.mipLevels} ` +\n `mip levels, but only ${texture.mipLevelCount} were allocated.`\n );\n }\n return texture;\n }\n\n /**\n * Release a transient texture back to the device pool.\n *\n * @param texture - The texture to release.\n */\n release(texture: Texture2D): void {\n const device = this._device ?? getDevice();\n device.pool.releaseTexture(texture);\n }\n\n /**\n * Retain a pooled texture so it can be owned outside the graph lifetime.\n *\n * @param texture - The texture to retain.\n */\n retain(texture: Texture2D): void {\n const device = this._device ?? getDevice();\n device.pool.retainTexture(texture);\n }\n\n /**\n * Allocate a temporary framebuffer from the device pool.\n *\n * @param desc - Framebuffer descriptor from the render graph pass.\n * @returns A pooled FrameBuffer instance.\n */\n allocateFramebuffer(desc: RGFramebufferDesc): FrameBuffer {\n const device = this._device ?? getDevice();\n const colors = Array.isArray(desc.colorAttachments)\n ? (desc.colorAttachments as Array<Texture2D | TextureFormat>)\n : desc.colorAttachments\n ? [desc.colorAttachments as Texture2D | TextureFormat]\n : [];\n const depthAttachment = (desc.depthAttachment ?? null) as Texture2D | TextureFormat | null;\n return device.pool.fetchTemporalFramebuffer(\n false,\n desc.width ?? 0,\n desc.height ?? 0,\n colors,\n depthAttachment,\n desc.mipmapping ?? false,\n desc.sampleCount ?? 1,\n desc.ignoreDepthStencil ?? true,\n desc.attachmentMipLevel ?? 0,\n desc.attachmentCubeface ?? 0,\n desc.attachmentLayer ?? 0\n );\n }\n\n /**\n * Release a temporary framebuffer back to the device pool.\n *\n * @param framebuffer - The framebuffer to release.\n */\n releaseFramebuffer(framebuffer: FrameBuffer): void {\n const device = this._device ?? getDevice();\n device.pool.releaseFrameBuffer(framebuffer);\n }\n}\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;;;;"}
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;;;;"}