Castor3D 0.16.0
Multiplatform 3D engine
|
#include <RenderNodesPass.hpp>
Public Member Functions | |
C3D_API | ~RenderNodesPass () noexcept override |
Destructor. | |
virtual C3D_API void | update (CpuUpdater &updater) |
Updates the render pass, CPU wise. | |
C3D_API void | getSubmeshShaderSource (PipelineFlags const &flags, ast::ShaderBuilder &builder) const |
Retrieves the geometry shader source matching the given flags. | |
C3D_API void | getPixelShaderSource (PipelineFlags const &flags, ast::ShaderBuilder &builder) const |
Retrieves the pixel shader source matching the given flags. | |
C3D_API void | forceAdjustFlags (PipelineFlags &flags) const |
Adjusts given flags to match the render pass requirements. | |
C3D_API SubmeshComponentCombine | adjustFlags (SubmeshComponentCombine const &submeshCombine) const |
Adjusts given flags to match the render pass requirements. | |
C3D_API PassComponentCombine | adjustFlags (PassComponentCombine const &passCombine) const |
Adjusts given flags to match the render pass requirements. | |
C3D_API ProgramFlags | adjustFlags (ProgramFlags flags) const |
Adjusts given flags to match the render pass requirements. | |
C3D_API SceneFlags | adjustFlags (SceneFlags flags) const |
Adjusts given flags to match the render pass requirements. | |
C3D_API TextureCombine | adjustFlags (TextureCombine const &textureCombine) const |
Filters the given textures flags using this pass needed textures. | |
C3D_API PipelineFlags | createPipelineFlags (PassComponentCombine const &passComponents, SubmeshComponentCombine const &submeshComponents, BlendMode colourBlendMode, BlendMode alphaBlendMode, RenderPassTypeID renderPassTypeId, LightingModelID lightingModelId, BackgroundModelID backgroundModelId, VkCompareOp alphaFunc, VkCompareOp blendAlphaFunc, TextureCombine const &textures, ProgramFlags const &programFlags, SceneFlags const &sceneFlags, VkPrimitiveTopology topology, bool isFrontCulled, uint32_t passLayerIndex, GpuBufferOffsetT< castor::Point4f > const &morphTargets, SubmeshRenderData const *submeshData) const noexcept |
Creates the pipeline flags for given configuration. | |
C3D_API PipelineFlags | createPipelineFlags (Pass const &pass, TextureCombine const &textures, SubmeshComponentCombine const &submeshComponents, ProgramFlags const &programFlags, SceneFlags const &sceneFlags, VkPrimitiveTopology topology, bool isFrontCulled, GpuBufferOffsetT< castor::Point4f > const &morphTargets, SubmeshRenderData const *submeshData) const noexcept |
Creates the pipeline flags for given configuration. | |
C3D_API PipelineAndID | prepareBackPipeline (PipelineFlags const &pipelineFlags, ashes::PipelineVertexInputStateCreateInfoCRefArray const &vertexLayouts, ashes::DescriptorSetLayout const *meshletDescriptorLayout) |
Prepares the pipeline matching the given flags, for back face culling nodes. | |
C3D_API PipelineAndID | prepareFrontPipeline (PipelineFlags const &pipelineFlags, ashes::PipelineVertexInputStateCreateInfoCRefArray const &vertexLayouts, ashes::DescriptorSetLayout const *meshletDescriptorLayout) |
Prepares the pipeline matching the given flags, for front face culling nodes. | |
C3D_API void | cleanupPipelines () |
Cleans up all pipelines from the lists. | |
C3D_API void | initialiseAdditionalDescriptor (RenderPipeline &pipeline, ShadowMapLightTypeArray const &shadowMaps, ShadowBuffer const *shadowBuffer) |
Initialises the additional descriptor set. | |
C3D_API void | setIgnoredNode (SceneNode const &node) |
Sets the node ignored node. | |
C3D_API void | countNodes (RenderInfo &info) const noexcept |
Registers nodes counts to given RenderInfo. | |
C3D_API bool | areValidPassFlags (PassComponentCombine const &passFlags) const noexcept |
virtual C3D_API bool | isPassEnabled () const noexcept |
virtual C3D_API ShaderFlags | getShaderFlags () const noexcept |
virtual C3D_API bool | areDebugTargetsEnabled () const noexcept |
C3D_API bool | isValidPass (Pass const &pass) const noexcept |
C3D_API bool | isValidRenderable (RenderedObject const &object) const noexcept |
C3D_API bool | isValidNode (SceneNode const &node) const noexcept |
C3D_API bool | allowClusteredLighting (ClustersConfig const &config) const noexcept |
C3D_API bool | hasNodes () const noexcept |
C3D_API Scene & | getScene () const noexcept |
C3D_API SceneNode const * | getIgnoredNode () const noexcept |
C3D_API bool | isMeshShading () const noexcept |
C3D_API PipelinesNodesT< SubmeshRenderNode > const & | getSubmeshNodes () const |
C3D_API InstantiatedPipelinesNodesT< SubmeshRenderNode > const & | getInstancedSubmeshNodes () const |
C3D_API PipelinesNodesT< BillboardRenderNode > const & | getBillboardNodes () const |
C3D_API uint32_t | getMaxPipelineId () const |
C3D_API PipelineBufferArray const & | getPassPipelineNodes () const |
C3D_API uint32_t | getPipelineNodesIndex (PipelineBaseHash const &hash, ashes::BufferBase const &buffer) const |
C3D_API uint32_t | getDrawCallsCount () const |
C3D_API RenderCounts const & | getVisibleCounts () const |
ComponentModeFlags | getComponentsMask () const noexcept |
bool | isOrderIndependent () const noexcept |
SceneCuller & | getCuller () const noexcept |
CameraUbo const & | getMatrixUbo () const noexcept |
uint32_t | getPipelinesCount () const noexcept |
bool | isDirty () const noexcept |
bool | forceTwoSided () const noexcept |
RenderFilters | getRenderFilters () const noexcept |
castor::String const & | getTypeName () const noexcept |
RenderPassTypeID | getTypeID () const noexcept |
bool | filtersStatic () const noexcept |
bool | filtersNonStatic () const noexcept |
bool | handleStatic () const noexcept |
DeferredLightingFilter | getDeferredLightingFilter () const noexcept |
ParallaxOcclusionFilter | getParallaxOcclusionFilter () const noexcept |
Public Member Functions inherited from castor::OwnedBy< Engine > | |
Engine * | getOwner () const |
Public Member Functions inherited from castor::NamedBaseT< T > | |
NamedBaseT (T name) noexcept | |
Constructor. | |
T const & | getName () const noexcept |
Retrieves the name. | |
void | rename (T name) noexcept |
Static Public Member Functions | |
static C3D_API ashes::PipelineColorBlendStateCreateInfo | createBlendState (BlendMode colourBlendMode, BlendMode alphaBlendMode, uint32_t attachesCount) |
static C3D_API void | addShadowBindings (SceneFlags const &sceneFlags, ashes::VkDescriptorSetLayoutBindingArray &bindings, VkShaderStageFlags shaderStages, uint32_t &index) |
Adds shadow maps descriptor layout bindings to given list. | |
static C3D_API void | addShadowBindings (ashes::VkDescriptorSetLayoutBindingArray &bindings, VkShaderStageFlags shaderStages, uint32_t &index) |
Adds shadow maps descriptor layout bindings to given list. | |
static C3D_API void | addBackgroundBindings (SceneBackground const &background, ashes::VkDescriptorSetLayoutBindingArray &bindings, VkShaderStageFlags shaderStages, uint32_t &index) |
Adds background descriptor layout bindings to given list. | |
static C3D_API void | addGIBindings (SceneFlags flags, IndirectLightingData const &indirectLighting, ashes::VkDescriptorSetLayoutBindingArray &bindings, VkShaderStageFlags shaderStages, uint32_t &index) |
Adds indirect lighting descriptor layout bindings to given list. | |
static C3D_API void | addClusteredLightingBindings (FrustumClusters const &frustumClusters, ashes::VkDescriptorSetLayoutBindingArray &bindings, VkShaderStageFlags shaderStages, uint32_t &index) |
Adds clusters descriptor layout bindings to given list. | |
static C3D_API void | addShadowDescriptor (RenderSystem const &renderSystem, crg::RunnableGraph &graph, ashes::WriteDescriptorSetArray &descriptorWrites, ShadowMapLightTypeArray const &shadowMaps, ShadowBuffer const &shadowBuffer, uint32_t &index) |
static C3D_API void | addShadowDescriptor (RenderSystem const &renderSystem, crg::RunnableGraph &graph, SceneFlags const &sceneFlags, ashes::WriteDescriptorSetArray &descriptorWrites, ShadowMapLightTypeArray const &shadowMaps, ShadowBuffer const &shadowBuffer, uint32_t &index) |
static C3D_API void | addBackgroundDescriptor (SceneBackground const &background, ashes::WriteDescriptorSetArray &descriptorWrites, crg::ImageViewIdArray const &targetImage, uint32_t &index) |
static C3D_API void | addGIDescriptor (SceneFlags sceneFlags, IndirectLightingData const &indirectLighting, ashes::WriteDescriptorSetArray &descriptorWrites, uint32_t &index) |
static C3D_API void | addClusteredLightingDescriptor (FrustumClusters const &frustumClusters, ashes::WriteDescriptorSetArray &descriptorWrites, uint32_t &index) |
Public Attributes | |
RenderNodesPassChangeSignal | onSortNodes |
Protected Member Functions | |
C3D_API | RenderNodesPass (crg::FramePass const &pass, crg::GraphContext &context, crg::RunnableGraph &graph, RenderDevice const &device, castor::String const &typeName, crg::ImageViewIdArray targetImage, crg::ImageViewIdArray targetDepth, RenderNodesPassDesc const &desc) |
Constructor. | |
virtual C3D_API void | doUpdateUbos (CpuUpdater &updater) |
Updates the render pass, CPU wise. | |
virtual C3D_API void | doFillAdditionalBindings (PipelineFlags const &flags, ashes::VkDescriptorSetLayoutBindingArray &bindings) const =0 |
Fills the render pass specific descriptor layout bindings. | |
virtual C3D_API bool | doIsValidPass (Pass const &pass) const noexcept |
virtual C3D_API bool | doIsValidRenderable (RenderedObject const &object) const noexcept |
virtual C3D_API SubmeshComponentCombine | doAdjustSubmeshComponents (SubmeshComponentCombine submeshCombine) const |
virtual C3D_API ProgramFlags | doAdjustProgramFlags (ProgramFlags flags) const |
virtual C3D_API SceneFlags | doAdjustSceneFlags (SceneFlags flags) const |
C3D_API ShaderProgramRPtr | doGetProgram (PipelineFlags const &flags) |
C3D_API void | doAccept (castor3d::RenderTechniqueVisitor &visitor) |
Visitor acceptance function. | |
C3D_API void | doUpdateFlags (PipelineFlags &flags) const |
C3D_API void | doAddShadowBindings (Scene const &scene, ashes::VkDescriptorSetLayoutBindingArray &bindings, uint32_t &index) const |
C3D_API void | doAddBackgroundBindings (Scene const &scene, ashes::VkDescriptorSetLayoutBindingArray &bindings, uint32_t &index) const |
C3D_API void | doAddClusteredLightingBindings (RenderTarget const &target, ashes::VkDescriptorSetLayoutBindingArray &bindings, uint32_t &index) const |
C3D_API void | doAddShadowDescriptor (Scene const &scene, ashes::WriteDescriptorSetArray &descriptorWrites, ShadowMapLightTypeArray const &shadowMaps, ShadowBuffer const *shadowBuffer, uint32_t &index) const |
C3D_API void | doAddBackgroundDescriptor (Scene const &scene, ashes::WriteDescriptorSetArray &descriptorWrites, crg::ImageViewIdArray const &targetImage, uint32_t &index) const |
C3D_API void | doAddClusteredLightingDescriptor (RenderTarget const &target, ashes::WriteDescriptorSetArray &descriptorWrites, uint32_t &index) const |
RenderQueue & | getRenderQueue () const noexcept |
Protected Member Functions inherited from castor::OwnedBy< Engine > | |
OwnedBy (Engine &owner) | |
Constructor. | |
Protected Attributes | |
RenderDevice const & | m_device |
RenderSystem & | m_renderSystem |
CameraUbo const & | m_cameraUbo |
crg::ImageViewIdArray | m_targetImage |
crg::ImageViewIdArray | m_targetDepth |
castor::String | m_typeName |
RenderPassTypeID | m_typeID {} |
RenderFilters | m_filters { RenderFilter::eNone } |
castor::String | m_category |
castor::Size | m_size |
bool | m_oit { false } |
bool | m_forceTwoSided { false } |
bool | m_safeBand { false } |
bool | m_isDirty { true } |
bool | m_meshShading {} |
SceneUbo const * | m_sceneUbo {} |
uint32_t | m_index { 0u } |
std::optional< bool > | m_handleStatic { std::nullopt } |
ComponentModeFlags | m_componentsMask {} |
bool | m_allowClusteredLighting {} |
DeferredLightingFilter | m_deferredLightingFilter {} |
ParallaxOcclusionFilter | m_parallaxOcclusionFilter {} |
Protected Attributes inherited from castor::NamedBaseT< T > | |
T | m_name |
|
protected |
Constructor.
[in] | pass | The parent frame pass. |
[in] | context | The rendering context. |
[in] | graph | The runnable graph. |
[in] | device | The GPU device. |
[in] | typeName | The pass type name. |
[in] | targetImage | The image this pass renders to. |
[in] | targetDepth | The depth image this pass renders to. |
[in] | desc | The construction data. |
|
overridenoexcept |
Destructor.
|
static |
Adds background descriptor layout bindings to given list.
[in] | background | The background. |
[in,out] | bindings | Receives the bindings. |
[in] | shaderStages | The impacted shader stages. |
[in,out] | index | The current binding index. |
|
static |
|
static |
Adds clusters descriptor layout bindings to given list.
[in] | frustumClusters | The clusters. |
[in,out] | bindings | Receives the bindings. |
[in] | shaderStages | The impacted shader stages. |
[in,out] | index | The current binding index. |
|
static |
|
static |
Adds indirect lighting descriptor layout bindings to given list.
[in] | flags | The scene flags. |
[in] | indirectLighting | The indirect lighting data. |
[in,out] | bindings | Receives the bindings. |
[in] | shaderStages | The impacted shader stages. |
[in,out] | index | The current binding index. |
|
static |
|
static |
Adds shadow maps descriptor layout bindings to given list.
[in,out] | bindings | Receives the bindings. |
[in] | shaderStages | The impacted shader stages. |
[in,out] | index | The current binding index. |
|
static |
Adds shadow maps descriptor layout bindings to given list.
[in] | sceneFlags | Used to define what shadow maps need to be bound. |
[in,out] | bindings | Receives the bindings. |
[in] | shaderStages | The impacted shader stages. |
[in,out] | index | The current binding index. |
|
static |
|
static |
C3D_API PassComponentCombine castor3d::RenderNodesPass::adjustFlags | ( | PassComponentCombine const & | passCombine | ) | const |
Adjusts given flags to match the render pass requirements.
[in] | passCombine | The flags. |
C3D_API ProgramFlags castor3d::RenderNodesPass::adjustFlags | ( | ProgramFlags | flags | ) | const |
Adjusts given flags to match the render pass requirements.
[in] | flags | The flags. |
C3D_API SceneFlags castor3d::RenderNodesPass::adjustFlags | ( | SceneFlags | flags | ) | const |
Adjusts given flags to match the render pass requirements.
[in] | flags | The flags. |
C3D_API SubmeshComponentCombine castor3d::RenderNodesPass::adjustFlags | ( | SubmeshComponentCombine const & | submeshCombine | ) | const |
Adjusts given flags to match the render pass requirements.
[in] | submeshCombine | The flags. |
C3D_API TextureCombine castor3d::RenderNodesPass::adjustFlags | ( | TextureCombine const & | textureCombine | ) | const |
Filters the given textures flags using this pass needed textures.
[in] | textureCombine | The textures flags. |
|
noexcept |
|
virtualnoexcept |
Reimplemented in castor3d::RenderTechniqueNodesPass.
|
noexcept |
name Getters.
Referenced by castor3d::RenderTechniqueNodesPass::areValidPassFlags().
C3D_API void castor3d::RenderNodesPass::cleanupPipelines | ( | ) |
Cleans up all pipelines from the lists.
|
noexcept |
Registers nodes counts to given RenderInfo.
[in,out] | info | Receives the counts. |
Referenced by castor3d::RenderTechniqueNodesPass::countNodes().
|
static |
[in] | colourBlendMode | The colour blend mode. |
[in] | alphaBlendMode | The alpha blend mode. |
[in] | attachesCount | The wanted blend attaches count. |
|
noexcept |
Creates the pipeline flags for given configuration.
[in] | pass | The pass for which the pipeline is created. |
[in] | textures | The textures configuration. |
[in] | submeshComponents | The submesh components combination. |
[in] | programFlags | A combination of ProgramFlag. |
[in] | sceneFlags | Scene related flags. |
[in] | topology | The render topology. |
[in] | isFrontCulled | true for front face culling, false for back face culling. |
[in] | morphTargets | The morph targets buffer. |
[in] | submeshData | The submesh render data, if any. |
|
noexcept |
Creates the pipeline flags for given configuration.
[in] | passComponents | The pass components combination. |
[in] | submeshComponents | The submesh components combination. |
[in] | colourBlendMode | The colour blending mode. |
[in] | alphaBlendMode | The alpha blending mode. |
[in] | renderPassTypeId | The render pass type ID. |
[in] | lightingModelId | The lighting model ID. |
[in] | backgroundModelId | The background model ID. |
[in] | alphaFunc | The alpha comparison function (for opaque nodes). |
[in] | blendAlphaFunc | The alpha comparison function (for transparent nodes). |
[in] | textures | The textures configuration. |
[in] | programFlags | A combination of ProgramFlag. |
[in] | sceneFlags | Scene related flags. |
[in] | topology | The render topology. |
[in] | isFrontCulled | true for front face culling, false for back face culling. |
[in] | passLayerIndex | The material pass layer index. |
[in] | morphTargets | The morph targets buffer. |
[in] | submeshData | The submesh render data, if any. |
|
protected |
Visitor acceptance function.
visitor | The ... visitor. |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protectedvirtual |
Reimplemented in castor3d::RenderTechniqueNodesPass.
|
protectedvirtual |
Reimplemented in castor3d::RenderTechniqueNodesPass.
|
protectedvirtual |
|
protectedpure virtual |
Fills the render pass specific descriptor layout bindings.
[in] | flags | The pipeline flags. |
[in,out] | bindings | Receives the additional bindings. |
|
protected |
|
protectedvirtualnoexcept |
[in] | pass | The material pass. |
true
if the pass is rendered through this nodes pass.
|
protectedvirtualnoexcept |
[in] | object | The rendered object. |
true
if the object is rendered through this nodes pass.
|
protected |
|
protectedvirtual |
Updates the render pass, CPU wise.
[in,out] | updater | The update data. |
|
inlinenoexcept |
|
inlinenoexcept |
C3D_API void castor3d::RenderNodesPass::forceAdjustFlags | ( | PipelineFlags & | flags | ) | const |
Adjusts given flags to match the render pass requirements.
[in] | flags | The flags. |
|
inlinenoexcept |
References m_forceTwoSided.
C3D_API PipelinesNodesT< BillboardRenderNode > const & castor3d::RenderNodesPass::getBillboardNodes | ( | ) | const |
|
inlinenoexcept |
References m_componentsMask.
|
inlinenoexcept |
|
inlinenoexcept |
References m_deferredLightingFilter.
C3D_API uint32_t castor3d::RenderNodesPass::getDrawCallsCount | ( | ) | const |
C3D_API InstantiatedPipelinesNodesT< SubmeshRenderNode > const & castor3d::RenderNodesPass::getInstancedSubmeshNodes | ( | ) | const |
|
inlinenoexcept |
References m_cameraUbo.
C3D_API uint32_t castor3d::RenderNodesPass::getMaxPipelineId | ( | ) | const |
|
inlinenoexcept |
References m_parallaxOcclusionFilter.
C3D_API PipelineBufferArray const & castor3d::RenderNodesPass::getPassPipelineNodes | ( | ) | const |
C3D_API uint32_t castor3d::RenderNodesPass::getPipelineNodesIndex | ( | PipelineBaseHash const & | hash, |
ashes::BufferBase const & | buffer ) const |
|
inlinenoexcept |
C3D_API void castor3d::RenderNodesPass::getPixelShaderSource | ( | PipelineFlags const & | flags, |
ast::ShaderBuilder & | builder ) const |
Retrieves the pixel shader source matching the given flags.
[in] | flags | The pipeline flags. |
[in] | builder | Receives the source. |
|
inlinenoexcept |
References m_filters.
|
inlineprotectednoexcept |
|
virtualnoexcept |
C3D_API PipelinesNodesT< SubmeshRenderNode > const & castor3d::RenderNodesPass::getSubmeshNodes | ( | ) | const |
C3D_API void castor3d::RenderNodesPass::getSubmeshShaderSource | ( | PipelineFlags const & | flags, |
ast::ShaderBuilder & | builder ) const |
Retrieves the geometry shader source matching the given flags.
[in] | flags | The pipeline flags. |
[in] | builder | Receives the source. |
|
inlinenoexcept |
References m_typeID.
|
inlinenoexcept |
References m_typeName.
C3D_API RenderCounts const & castor3d::RenderNodesPass::getVisibleCounts | ( | ) | const |
|
inlinenoexcept |
References m_handleStatic.
Referenced by filtersNonStatic(), and filtersStatic().
|
noexcept |
C3D_API void castor3d::RenderNodesPass::initialiseAdditionalDescriptor | ( | RenderPipeline & | pipeline, |
ShadowMapLightTypeArray const & | shadowMaps, | ||
ShadowBuffer const * | shadowBuffer ) |
Initialises the additional descriptor set.
[in] | pipeline | The render pipeline. |
[in] | shadowMaps | The shadow maps. |
[in] | shadowBuffer | The buffer holding the shadow configuration data. |
|
inlinenoexcept |
References m_isDirty.
|
noexcept |
|
inlinenoexcept |
References m_oit.
|
virtualnoexcept |
Reimplemented in castor3d::VoxelizePass, castor3d::RenderTechniqueNodesPass, and castor3d::ShadowMapPass.
Referenced by castor3d::RenderTechniqueNodesPass::isPassEnabled(), and castor3d::IsRenderPassEnabled::operator()().
|
noexcept |
C3D_API PipelineAndID castor3d::RenderNodesPass::prepareBackPipeline | ( | PipelineFlags const & | pipelineFlags, |
ashes::PipelineVertexInputStateCreateInfoCRefArray const & | vertexLayouts, | ||
ashes::DescriptorSetLayout const * | meshletDescriptorLayout ) |
Prepares the pipeline matching the given flags, for back face culling nodes.
[in] | pipelineFlags | The pipeline flags. |
[in] | vertexLayouts | The vertex buffers layouts. |
[in] | meshletDescriptorLayout | The optional meshlets descriptor layout. |
C3D_API PipelineAndID castor3d::RenderNodesPass::prepareFrontPipeline | ( | PipelineFlags const & | pipelineFlags, |
ashes::PipelineVertexInputStateCreateInfoCRefArray const & | vertexLayouts, | ||
ashes::DescriptorSetLayout const * | meshletDescriptorLayout ) |
Prepares the pipeline matching the given flags, for front face culling nodes.
[in] | pipelineFlags | The pipeline flags. |
[in] | vertexLayouts | The vertex buffers layouts. |
[in] | meshletDescriptorLayout | The optional meshlets descriptor layout. |
Sets the node ignored node.
[in] | node | The node. |
|
virtual |
Updates the render pass, CPU wise.
[in,out] | updater | The update data. |
Reimplemented in castor3d::VoxelizePass, castor3d::RenderTechniqueNodesPass, castor3d::ShadowMapPassDirectional, castor3d::ShadowMapPassPoint, and castor3d::ShadowMapPassSpot.
|
protected |
|
protected |
Referenced by getMatrixUbo().
|
protected |
|
protected |
Referenced by getComponentsMask().
|
protected |
Referenced by getDeferredLightingFilter().
|
protected |
|
protected |
Referenced by getRenderFilters().
|
protected |
Referenced by forceTwoSided().
|
protected |
Referenced by filtersNonStatic(), filtersStatic(), and handleStatic().
|
protected |
|
protected |
Referenced by isDirty().
|
protected |
|
protected |
Referenced by isOrderIndependent().
|
protected |
Referenced by getParallaxOcclusionFilter().
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
Referenced by getTypeID().
|
protected |
Referenced by getTypeName().
|
mutable |