use modern construct 'override' in the derive class.
[platform/core/uifw/dali-core.git] / dali / internal / event / render-tasks / render-task-impl.h
1 #ifndef DALI_INTERNAL_RENDER_TASK_H
2 #define DALI_INTERNAL_RENDER_TASK_H
3
4 /*
5  * Copyright (c) 2020 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/object/base-object.h>
23 #include <dali/public-api/object/weak-handle.h>
24 #include <dali/public-api/render-tasks/render-task.h>
25 #include <dali/internal/event/common/object-impl.h>
26 #include <dali/internal/event/rendering/frame-buffer-impl.h>
27 #include <dali/internal/event/render-tasks/render-task-list-impl.h>
28 #include <dali/internal/event/events/actor-observer.h>
29
30 namespace Dali
31 {
32
33 namespace Internal
34 {
35
36 class Actor;
37 class CameraActor;
38 class EventThreadServices;
39 class RenderTaskList;
40
41 namespace SceneGraph
42 {
43 class RenderTaskList;
44 class RenderTask;
45 class Camera;
46 }
47
48 using RenderTaskPtr = IntrusivePtr<RenderTask>;
49
50 class RenderTask : public Object
51 {
52 public:
53
54   using ScreenToFrameBufferFunction = Dali::RenderTask::ScreenToFrameBufferFunction;
55
56   /**
57    * Creates a new RenderTask.
58    *
59    * @param[in] sourceActor The source actor.
60    * @param[in] cameraActor The camera actor.
61    * @param[in] renderTaskList The render task list.
62    * @return The created render task
63    */
64   static RenderTaskPtr New( Actor* sourceActor, CameraActor* cameraActor, RenderTaskList& renderTaskList );
65
66   /**
67    * @copydoc Dali::RenderTask::SetSourceActor()
68    */
69   void SetSourceActor( Actor* actor );
70
71   /**
72    * @copydoc Dali::RenderTask::GetSourceActor()
73    */
74   Actor* GetSourceActor() const;
75
76   /**
77    * @copydoc Dali::RenderTask::SetExclusive()
78    */
79   void SetExclusive( bool exclusive );
80
81   /**
82    * @copydoc Dali::RenderTask::IsExclusive()
83    */
84   bool IsExclusive() const;
85
86   /**
87    * @copydoc Dali::RenderTask::SetInputEnabled()
88    */
89   void SetInputEnabled( bool enabled );
90
91   /**
92    * @copydoc Dali::RenderTask::GetInputEnabled()
93    */
94   bool GetInputEnabled() const;
95
96   /**
97    * @copydoc Dali::RenderTask::SetCameraActor()
98    */
99   void SetCameraActor( CameraActor* cameraActor );
100
101   /**
102    * @copydoc Dali::RenderTask::GetCameraActor()
103    */
104   CameraActor* GetCameraActor() const;
105
106   /**
107     * @copydoc Dali::RenderTask::SetFrameBuffer()
108     */
109    void SetFrameBuffer( FrameBufferPtr frameBuffer );
110
111    /**
112     * @copydoc Dali::RenderTask::GetFrameBuffer
113     */
114    FrameBuffer* GetFrameBuffer() const;
115
116   /**
117    * @copydoc Dali::RenderTask::SetScreenToFrameBufferFunction
118    */
119   void SetScreenToFrameBufferFunction( ScreenToFrameBufferFunction conversionFunction );
120
121   /**
122    * @copydoc Dali::RenderTask::GetScreenToFrameBufferFunction
123    */
124   ScreenToFrameBufferFunction GetScreenToFrameBufferFunction() const;
125
126   /**
127    * copydoc Dali::RenderTask::SetScreenToFrameBufferMappingActor
128    */
129   void SetScreenToFrameBufferMappingActor( Dali::Actor& mappingActor );
130
131   /**
132    * copydoc Dali::RenderTask::GetScreenToFrameBufferMAppingActor
133    */
134   Dali::Actor GetScreenToFrameBufferMappingActor() const;
135
136   /**
137    * @copydoc Dali::RenderTask::SetViewportPosition
138    */
139   void SetViewportPosition(const Vector2& value);
140
141   /**
142    * @copydoc Dali::RenderTask::GetCurrentViewportPosition
143    */
144   Vector2 GetCurrentViewportPosition() const;
145
146   /**
147    * @copydoc Dali::RenderTask::SetViewportSize
148    */
149   void SetViewportSize(const Vector2& value);
150
151   /**
152    * @copydoc Dali::RenderTask::GetCurrentViewportSize
153    */
154   Vector2 GetCurrentViewportSize() const;
155
156   /**
157    * @copydoc Dali::RenderTask::SetViewport()
158    */
159   void SetViewport( const Viewport& viewport );
160
161   /**
162    * @param[out] viewPort instance to copy the values into
163    */
164   void GetViewport( Viewport& viewPort ) const;
165
166   /**
167    * @copydoc Dali::RenderTask::SetClearColor()
168    */
169   void SetClearColor( const Vector4& color );
170
171   /**
172    * @copydoc Dali::RenderTask::GetClearColor()
173    */
174   const Vector4& GetClearColor() const;
175
176   /**
177    * Indicate whether GL sync is required for native render target.
178    * @param[in] requiresSync whether GL sync is required.
179    */
180   void SetSyncRequired( bool requiresSync );
181
182   /**
183    * Query whether the sync object is required for native render target.
184    * @return True if the sync object is required, false otherwise.
185    */
186  bool IsSyncRequired() const;
187
188   /**
189    * @copydoc Dali::RenderTask::SetClearEnabled()
190    */
191   void SetClearEnabled( bool enabled );
192
193   /**
194    * @copydoc Dali::RenderTask::GetClearEnabled()
195    */
196   bool GetClearEnabled() const;
197
198   /**
199    * @copydoc Dali::RenderTask::SetCullMode()
200    */
201   void SetCullMode( bool mode );
202
203   /**
204    * @copydoc Dali::RenderTask::GetCullMode()
205    */
206   bool GetCullMode() const;
207
208   /**
209    * @copydoc Dali::RenderTask::SetRefreshRate()
210    */
211   void SetRefreshRate( uint32_t refreshRate );
212
213   /**
214    * @copydoc Dali::RenderTask::GetRefreshRate()
215    */
216   uint32_t GetRefreshRate() const;
217
218   /**
219    * Check if the render-task is hittable. If render task is offscreen, the screen coordinates may be translated.
220    * @param[in,out] screenCoords The screen coordinate, which may be converted (for hit-testing actors which are rendered off-screen).
221    * @return True the render-task can be used for input-handling; otherwise the output parameters are not valid.
222    */
223   bool IsHittable( Vector2& screenCoords ) const;
224
225   /**
226    * Translates screen coordinates to render task coordinates for offscreen render tasks
227    * @param[in,out] screenCoords The screen coordinates, which may be converted (for off-screen).
228    * @return false if the conversion function decides the coordinates are not inside. returns true if there is no conversion function
229    */
230   bool TranslateCoordinates( Vector2& screenCoords ) const;
231
232   /**
233    * @copydoc Dali::RenderTask::WorldToViewport()
234    */
235   bool WorldToViewport(const Vector3 &position, float& viewportX, float& viewportY) const;
236
237   /**
238    * @copydoc Dali::RenderTask::ViewportToLocal()
239    */
240   bool ViewportToLocal(Actor* actor, float viewportX, float viewportY, float &localX, float &localY) const;
241
242 public: // Used by RenderTaskList, which owns the SceneGraph::RenderTasks
243
244   /**
245    * Retrieve the scene-graph RenderTask object.
246    * @return The scene-graph object
247    */
248   const SceneGraph::RenderTask& GetRenderTaskSceneObject() const;
249
250   /**
251    * Retrieve the render task list RenderTask object belongs to.
252    * @return The render task list
253    */
254   RenderTaskList& GetRenderTaskList() const;
255
256 public: // Implementation of Object
257
258   /**
259    * @copydoc Dali::Internal::Object::SetDefaultProperty()
260    */
261   void SetDefaultProperty(Property::Index index, const Property::Value& propertyValue) override;
262
263   /**
264    * @copydoc Dali::Internal::Object::GetDefaultProperty()
265    */
266   Property::Value GetDefaultProperty( Property::Index index ) const override;
267
268   /**
269    * @copydoc Dali::Internal::Object::GetDefaultPropertyCurrentValue()
270    */
271   Property::Value GetDefaultPropertyCurrentValue( Property::Index index ) const override;
272
273   /**
274    * @copydoc Dali::Internal::Object::OnNotifyDefaultPropertyAnimation()
275    */
276   void OnNotifyDefaultPropertyAnimation( Animation& animation, Property::Index index, const Property::Value& value, Animation::Type animationType ) override;
277
278   /**
279    * @copydoc Dali::Internal::Object::GetSceneObjectAnimatableProperty()
280    */
281   const SceneGraph::PropertyBase* GetSceneObjectAnimatableProperty( Property::Index index ) const override;
282
283   /**
284    * @copydoc Dali::Internal::Object::GetSceneObjectInputProperty()
285    */
286   const PropertyInputImpl* GetSceneObjectInputProperty( Property::Index index ) const override;
287
288 public: //signals
289
290   /**
291    * Query whether a Finished signal should be emitted for this render-task.
292    * This should only be called by NotificationManager, before signals are emitted.
293    * @pre The refresh rate must be REFRESH_ONCE.
294    * @post HasFinished() will return false on subsequent calls, until the render-task is processed again.
295    * @return \e true if the refresh once render task has finished. Otherwise it returns \e false.
296    */
297   bool HasFinished();
298
299   /**
300    * Emit the Finished signal
301    */
302   void EmitSignalFinish();
303
304   /**
305    * @copydoc Dali::RenderTask::FinishedSignal()
306    */
307   Dali::RenderTask::RenderTaskSignalType& FinishedSignal();
308
309   /**
310    * Connects a callback function with the object's signals.
311    * @param[in] object The object providing the signal.
312    * @param[in] tracker Used to disconnect the signal.
313    * @param[in] signalName The signal to connect to.
314    * @param[in] functor A newly allocated FunctorDelegate.
315    * @return True if the signal was connected.
316    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
317    */
318   static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
319
320 protected:
321
322   /**
323    * Constructor.
324    *
325    * @param[in] sceneObject The scene graph object
326    * @param[in] renderTaskList The render task list
327    */
328   RenderTask( const SceneGraph::RenderTask* sceneObject, RenderTaskList& renderTaskList );
329
330   /**
331    * A reference counted object may only be deleted by calling Unreference()
332    */
333   ~RenderTask() override;
334
335 private: // not copyable
336
337   RenderTask() = delete;
338   RenderTask( const RenderTask& ) = delete;
339   RenderTask& operator=( const RenderTask& ) = delete;
340
341 private:
342
343   ActorObserver mSourceActor; ///< Source actor
344   ActorObserver mCameraActor; ///< Camera actor
345   WeakHandle<Dali::Actor> mInputMappingActor; /// used to mapping screen to frame buffer coordinate, not kept alive by rendertask
346   RenderTaskList& mRenderTaskList; ///< The render task list
347
348   Vector4 mClearColor;       ///< Optional clear color
349
350   Vector2 mViewportPosition; ///< The cached viewport position
351   Vector2 mViewportSize;     ///< The cached viewport size
352
353   uint32_t mRefreshRate; ///< Determines how often the task is processed.
354
355   uint32_t mRefreshOnceCounter;
356
357   FrameBufferPtr  mFrameBuffer;
358
359
360   Dali::RenderTask::ScreenToFrameBufferFunction mScreenToFrameBufferFunction; ///< Used to convert screen to frame-buffer coordinates
361
362   bool mExclusive     : 1; ///< True if the render-task has exclusive access to the source Nodes.
363   bool mInputEnabled  : 1; ///< True if the render-task should be considered for input handling.
364   bool mClearEnabled  : 1; ///< True if the render-task should be clear the color buffer.
365   bool mCullMode      : 1; ///< True if the render-task's actors should be culled
366   bool mRequiresSync  : 1; ///< True if the GL sync is required to track the render of.
367
368   //Signals
369   Dali::RenderTask::RenderTaskSignalType  mSignalFinished; ///< Signal emmited when the render task has been processed.
370 };
371
372 } // namespace Internal
373
374 // Helpers for public-api forwarding methods
375
376 inline Internal::RenderTask& GetImplementation(Dali::RenderTask& task)
377 {
378   DALI_ASSERT_ALWAYS(task && "RenderTask handle is empty");
379
380   BaseObject& handle = task.GetBaseObject();
381
382   return static_cast<Internal::RenderTask&>(handle);
383 }
384
385 inline const Internal::RenderTask& GetImplementation(const Dali::RenderTask& task)
386 {
387   DALI_ASSERT_ALWAYS(task && "RenderTask handle is empty");
388
389   const BaseObject& handle = task.GetBaseObject();
390
391   return static_cast<const Internal::RenderTask&>(handle);
392 }
393
394 } // namespace Dali
395
396 #endif // DALI_INTERNAL_RENDER_TASK_H