Conversion to Apache 2.0 license
[platform/core/uifw/dali-core.git] / dali / internal / update / nodes / scene-graph-layer.h
1 #ifndef __DALI_INTERNAL_SCENE_GRAPH_LAYER_H__
2 #define __DALI_INTERNAL_SCENE_GRAPH_LAYER_H__
3
4 /*
5  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // INTERNAL INCLUDES
22 #include <dali/public-api/actors/layer.h>
23 #include <dali/internal/common/event-to-update.h>
24 #include <dali/internal/update/nodes/node.h>
25 #include <dali/internal/update/node-attachments/scene-graph-renderable-attachment-declarations.h>
26
27 namespace Dali
28 {
29
30 namespace Internal
31 {
32
33 class RenderableAttachment;
34
35 // value types used by messages
36 template <> struct ParameterType< Dali::Layer::SortFunctionType >
37 : public BasicType< Dali::Layer::SortFunctionType > {};
38
39 namespace SceneGraph
40 {
41
42 /**
43  * Layers have a "depth" relative to all other layers in the scene-graph.
44  * Non-layer child nodes (and their attachments) are considered part of the layer.
45  *
46  * Layers are rendered separately, and the depth buffer is cleared before each layer is rendered.
47  * Objects in higher layers, are rendered after (in front of) objects in lower layers.
48  */
49 class Layer : public Node
50 {
51 public:
52
53   typedef Dali::Layer::SortFunctionType SortFunctionType;
54
55   // Creation methods
56
57   /**
58    * Construct a new Layer.
59    * @return A smart-pointer to a newly allocated Node
60    */
61   static SceneGraph::Layer* New();
62
63   /**
64    * Virtual destructor
65    */
66   virtual ~Layer();
67
68   /**
69    * From Node, to convert a node to a layer.
70    * @return The layer.
71    */
72   virtual Layer* GetLayer()
73   {
74     return this;
75   }
76
77   /**
78    * Sets the sort-function of a layer.
79    * @param [in] function The new sort-function.
80    */
81   void SetSortFunction( Dali::Layer::SortFunctionType function );
82
83   /**
84    * Retrieve the function used to sort semi-transparent geometry in this layer.
85    * @return The sort function.
86    */
87   Dali::Layer::SortFunctionType GetSortFunction() const
88   {
89     return mSortFunction;
90   }
91
92   /**
93    * Sets whether clipping is enabled for a layer.
94    * @param [in] enabled True if clipping is enabled.
95    */
96   void SetClipping( bool enabled );
97
98   /**
99    * Query whether clipping is enabled for a layer.
100    * @return True if clipping is enabled.
101    */
102   bool IsClipping() const
103   {
104     return mIsClipping;
105   }
106
107   /**
108    * Sets the clipping box of a layer, in window coordinates.
109    * The contents of the layer will not be visible outside this box, when clipping is
110    * enabled. The default clipping box is empty (0,0,0,0).
111    * @param [in] box The clipping box
112    */
113   void SetClippingBox( const ClippingBox& box );
114
115   /**
116    * Retrieves the clipping box of a layer, in window coordinates.
117    * @return The clipping box
118    */
119   const ClippingBox& GetClippingBox() const
120   {
121     return mClippingBox;
122   }
123
124   /**
125    * @copydoc Dali::Layer::SetDepthTestDisabled()
126    */
127   void SetDepthTestDisabled( bool disable );
128
129   /**
130    * @copydoc Dali::Layer::IsDepthTestDisabled()
131    */
132   bool IsDepthTestDisabled() const;
133
134   /**
135    * Enables the reuse of the model view matrices of all renderers for this layer
136    * @param[in] updateBufferIndex The current update buffer index.
137    * @param value to set
138    */
139   void SetReuseRenderers( BufferIndex updateBufferIndex, bool value )
140   {
141     mAllChildTransformsClean[ updateBufferIndex ] = value;
142   }
143
144   /**
145    * @return True if all children have been clean for two consequtive frames
146    */
147   bool CanReuseRenderers()
148   {
149     return mAllChildTransformsClean[ 0 ] && mAllChildTransformsClean[ 1 ];
150   }
151
152   /**
153    * @return True if default sort function is used
154    */
155   bool UsesDefaultSortFunction()
156   {
157     return mIsDefaultSortFunction;
158   }
159
160 private:
161
162   /**
163    * Private constructor.
164    * See also Layer::New()
165    */
166   Layer();
167
168   // Undefined
169   Layer(const Layer&);
170
171   // Undefined
172   Layer& operator=(const Layer& rhs);
173
174 public: // For update-algorithms
175
176   RenderableAttachmentContainer stencilRenderables;
177   RenderableAttachmentContainer transparentRenderables;
178   RenderableAttachmentContainer opaqueRenderables;
179   RenderableAttachmentContainer overlayRenderables;
180
181 private:
182
183   SortFunctionType mSortFunction; ///< Used to sort semi-transparent geometry
184
185   ClippingBox mClippingBox;           ///< The clipping box, in window coordinates
186   bool mAllChildTransformsClean[ 2 ]; ///< True if all child nodes transforms are clean,
187                                       /// double buffered as we need two clean frames before we can reuse N-1 for N+1
188                                       /// this allows us to cache render items when layer is "static"
189   bool mIsClipping:1;                 ///< True when clipping is enabled
190   bool mDepthTestDisabled:1;          ///< Whether depth test is disabled.
191   bool mIsDefaultSortFunction:1;      ///< whether the default depth sort function is used
192
193 };
194
195 // Messages for Layer
196
197 /**
198  * Create a message to set the sort-function of a layer
199  * @param[in] layer The layer
200  * @param[in] function The new sort-function.
201  */
202 inline void SetSortFunctionMessage( EventToUpdate& eventToUpdate, const Layer& layer, Dali::Layer::SortFunctionType function )
203 {
204   typedef MessageValue1< Layer, Dali::Layer::SortFunctionType > LocalType;
205
206   // Reserve some memory inside the message queue
207   unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
208
209   // Construct message in the message queue memory; note that delete should not be called on the return value
210   new (slot) LocalType( &layer, &Layer::SetSortFunction, function );
211 }
212
213 /**
214  * Create a message for enabling/disabling layer clipping
215  * @param[in] layer The layer
216  * @param[in] enabled True if clipping is enabled
217  */
218 inline void SetClippingMessage( EventToUpdate& eventToUpdate, const Layer& layer, bool enabled )
219 {
220   typedef MessageValue1< Layer, bool > LocalType;
221
222   // Reserve some memory inside the message queue
223   unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
224
225   // Construct message in the message queue memory; note that delete should not be called on the return value
226   new (slot) LocalType( &layer, &Layer::SetClipping, enabled );
227 }
228
229 /**
230  * Create a message to set the clipping box of a layer
231  * @param[in] layer The layer
232  * @param[in] clippingbox The clipping box
233  */
234 inline void SetClippingBoxMessage( EventToUpdate& eventToUpdate, const Layer& layer, const Dali::ClippingBox& clippingbox )
235 {
236   typedef MessageValue1< Layer, Dali::ClippingBox > LocalType;
237
238   // Reserve some memory inside the message queue
239   unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
240
241   // Construct message in the message queue memory; note that delete should not be called on the return value
242   new (slot) LocalType( &layer, &Layer::SetClippingBox, clippingbox );
243 }
244
245 /**
246  * Create a message for disabling/enabling depth test.
247  *
248  * @see Dali::Layer::SetDepthTestDisabled().
249  *
250  * @param[in] layer The layer
251  * @param[in] disable \e true disables depth test. \e false sets the default behaviour.
252  */
253 inline void SetDepthTestDisabledMessage( EventToUpdate& eventToUpdate, const Layer& layer, bool disable )
254 {
255   typedef MessageValue1< Layer, bool > LocalType;
256
257   // Reserve some memory inside the message queue
258   unsigned int* slot = eventToUpdate.ReserveMessageSlot( sizeof( LocalType ) );
259
260   // Construct message in the message queue memory; note that delete should not be called on the return value
261   new (slot) LocalType( &layer, &Layer::SetDepthTestDisabled, disable );
262 }
263
264 } // namespace SceneGraph
265
266 } // namespace Internal
267
268 } // namespace Dali
269
270 #endif // __DALI_INTERNAL_SCENE_GRAPH_LAYER_H__