1 #ifndef DALI_INTERNAL_RENDER_ALGORITHMS_H
2 #define DALI_INTERNAL_RENDER_ALGORITHMS_H
5 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/integration-api/core-enumerations.h>
23 #include <dali/internal/common/buffer-index.h>
24 #include <dali/internal/render/common/render-list.h>
35 class RenderInstruction;
43 * @brief The responsibility of the RenderAlgorithms object is to action renders required by a RenderInstruction.
45 class RenderAlgorithms
55 * Process a render-instruction.
56 * @param[in] instruction The render-instruction to process.
57 * @param[in] context The GL context.
58 * @param[in] bufferIndex The current render buffer index (previous update buffer)
59 * @param[in] depthBufferAvailable Whether the depth buffer is available
60 * @param[in] stencilBufferAvailable Whether the stencil buffer is available
62 void ProcessRenderInstruction( const SceneGraph::RenderInstruction& instruction,
64 BufferIndex bufferIndex,
65 Integration::DepthBufferAvailable depthBufferAvailable,
66 Integration::StencilBufferAvailable stencilBufferAvailable,
72 * @brief Calculate a 2D AABB (axis aligned bounding box) in screen space.
73 * The RenderItems dimensions are translated and a Z value of 0 is assumed for this purpose.
74 * No projection is performed, but rotation on Z is supported.
75 * @param[in] item The RenderItem to generate an AABB for
76 * @return The generated AABB in screen space
78 inline Dali::ClippingBox CalculateScreenSpaceAABB( const Dali::Internal::SceneGraph::RenderItem& item );
81 * @brief Perform any scissor clipping related operations based on the current RenderItem.
83 * - Determining if any action is to be taken (so the method can be exited early if not).
84 * - If the node is a clipping node, apply the nodes clip intersected with the current/parent scissor clip.
85 * - If we have gone up the scissor hierarchy, and need to un-apply a scissor clip.
86 * - Disable scissor clipping completely if it is not needed
87 * @param[in] item The current RenderItem (about to be rendered)
88 * @param[in] context The current Context
90 inline void SetupScissorClipping( const Dali::Internal::SceneGraph::RenderItem& item, Context& context, int orientation );
93 * @brief Set up the clipping based on the specified clipping settings.
94 * @param[in] item The current RenderItem (about to be rendered)
95 * @param[in] context The context
96 * @param[in/out] usedStencilBuffer True if the stencil buffer has been used so far within this RenderList. Used by StencilMode::ON.
97 * @param[in/out] lastClippingDepth The stencil depth of the last renderer drawn. Used by the clipping feature.
98 * @param[in/out] lastClippingId The clipping ID of the last renderer drawn. Used by the clipping feature.
99 * @param[in] stencilBufferAvailable Whether the stencil buffer is available
101 inline void SetupClipping( const Dali::Internal::SceneGraph::RenderItem& item,
103 bool& usedStencilBuffer,
104 uint32_t& lastClippingDepth,
105 uint32_t& lastClippingId,
106 Integration::StencilBufferAvailable stencilBufferAvailable,
110 * @brief Process a render-list.
111 * @param[in] renderList The render-list to process.
112 * @param[in] context The GL context.
113 * @param[in] buffer The current render buffer index (previous update buffer)
114 * @param[in] viewMatrix The view matrix from the appropriate camera.
115 * @param[in] projectionMatrix The projection matrix from the appropriate camera.
116 * @param[in] depthBufferAvailable Whether the depth buffer is available
117 * @param[in] stencilBufferAvailable Whether the stencil buffer is available
119 inline void ProcessRenderList( const Dali::Internal::SceneGraph::RenderList& renderList,
121 BufferIndex bufferIndex,
122 const Matrix& viewMatrix,
123 const Matrix& projectionMatrix,
124 Integration::DepthBufferAvailable depthBufferAvailable,
125 Integration::StencilBufferAvailable stencilBufferAvailable,
129 RenderAlgorithms( RenderAlgorithms& rhs );
130 RenderAlgorithms& operator=( const RenderAlgorithms& rhs );
135 using ScissorStackType = std::vector<Dali::ClippingBox>; ///< The container type used to maintain the applied scissor hierarchy
137 ScissorStackType mScissorStack; ///< Contains the currently applied scissor hierarchy (so we can undo clips)
138 Dali::ClippingBox mViewportRectangle; ///< The viewport dimensions, used to translate AABBs to scissor coordinates
139 bool mHasLayerScissor:1; ///< Marks if the currently process render instruction has a layer-based clipping region
142 } // namespace Render
144 } // namespace Internal
148 #endif // DALI_INTERNAL_RENDER_ALGORITHMS_H