Merge "Add SceneCreated signal to stage." into tizen
[platform/core/uifw/dali-core.git] / dali / internal / event / common / stage-impl.h
1 #ifndef __DALI_INTERNAL_STAGE_H__
2 #define __DALI_INTERNAL_STAGE_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/object/ref-object.h>
23 #include <dali/public-api/common/stage.h>
24 #include <dali/public-api/object/base-object.h>
25 #include <dali/integration-api/context-notifier.h>
26 #include <dali/internal/common/owner-pointer.h>
27 #include <dali/internal/event/actors/layer-impl.h>
28 #include <dali/internal/event/common/object-registry-impl.h>
29 #include <dali/internal/event/common/stage-def.h>
30 #include <dali/internal/event/render-tasks/render-task-defaults.h>
31 #include <dali/internal/update/manager/update-manager.h>
32 #include <dali/public-api/common/view-mode.h>
33 #include <dali/public-api/math/vector2.h>
34 #include <dali/public-api/math/vector3.h>
35 #include <dali/public-api/math/vector4.h>
36 #include <dali/public-api/render-tasks/render-task.h>
37
38 #ifdef DYNAMICS_SUPPORT
39 #include <dali/internal/event/dynamics/dynamics-declarations.h>
40 #include <dali/internal/event/dynamics/dynamics-notifier.h>
41 #endif
42
43 namespace Dali
44 {
45
46 struct Vector2;
47
48 namespace Integration
49 {
50 class SystemOverlay;
51 class DynamicsFactory;
52 }
53
54 namespace Internal
55 {
56
57 namespace SceneGraph
58 {
59 class UpdateManager;
60 }
61
62 class AnimationPlaylist;
63 class PropertyNotificationManager;
64 class Layer;
65 class LayerList;
66 class SystemOverlay;
67 class CameraActor;
68 class RenderTaskList;
69
70 /**
71  * Implementation of Stage
72  */
73 class Stage : public BaseObject, public RenderTaskDefaults, public Integration::ContextNotifierInterface
74 {
75 public:
76
77   /**
78    * Create the stage
79    * @param[in] playlist for animations
80    * @param[in] propertyNotificationManager
81    * @param[in] updateManager
82    * @param[in] notificationManager
83    */
84   static StagePtr New( AnimationPlaylist& playlist,
85                        PropertyNotificationManager& propertyNotificationManager,
86                        SceneGraph::UpdateManager& updateManager,
87                        NotificationManager& notificationManager );
88
89   /**
90    * Initialize the stage.
91    */
92   void Initialize();
93
94   /**
95    * Uninitialize the stage.
96    */
97   void Uninitialize();
98
99   /**
100    * @copydoc Dali::Stage::GetCurrent()
101    */
102   static StagePtr GetCurrent();
103
104   /**
105    * @copydoc Dali::Stage::IsInstalled().
106    */
107   static bool IsInstalled();
108
109   /**
110    * @copydoc Dali::Stage::GetObjectRegistry()
111    */
112   ObjectRegistry& GetObjectRegistry();
113
114   /**
115    * Retrieve the root actor (not publically accessible).
116    * @return The root actor.
117    */
118   Layer& GetRootActor();
119
120   /**
121    * Retrieve the UpdateManager associated with this Stage
122    * @return The UpdateManager.
123    */
124   SceneGraph::UpdateManager& GetUpdateManager();
125
126   /**
127    * Helper for actors, to retrieve the current Event buffer index.
128    * @return The buffer index.
129    */
130   BufferIndex GetEventBufferIndex() const
131   {
132     // inlined as its called often from event thread
133     return mUpdateManager.GetEventBufferIndex();
134   }
135
136   /**
137    * Retrieve the interface for accessing update-thread data.
138    * @return The EventToUpdate interface.
139    */
140   EventToUpdate& GetUpdateInterface();
141
142   /**
143    * Returns the animation playlist.
144    * @return reference to the animation playlist.
145    */
146   AnimationPlaylist& GetAnimationPlaylist();
147
148   /**
149    * Returns the property notification manager.
150    * @return reference to the property notification manager.
151    */
152   PropertyNotificationManager& GetPropertyNotificationManager();
153
154   // Root actor accessors
155
156   /**
157    * @copydoc Dali::Stage::Add()
158    */
159   void Add( Actor& actor );
160
161   /**
162    * @copydoc Dali::Stage::Remove()
163    */
164   void Remove( Actor& actor );
165
166   /**
167    * Sets the size of the stage and indirectly, the root actor.
168    * @param [in] width  The new width.
169    * @param [in] height The new height.
170    */
171   void SetSize( float width, float height );
172
173   /**
174    * Returns the size of the Stage in pixels as a Vector.
175    * The x component will be the width of the Stage in pixels
176    * The y component will be the height of the Stage in pixels
177    * @return The size of the Stage as a Vector.
178    */
179   Vector2 GetSize() const;
180
181   /**
182    * @copydoc Dali::Stage::GetRenderTaskList()
183    */
184   RenderTaskList& GetRenderTaskList() const;
185
186   /**
187    * Create a default camera actor
188    */
189   void CreateDefaultCameraActor();
190
191   /**
192    * From RenderTaskDefaults; retrieve the default root actor.
193    * @return The default root actor.
194    */
195   virtual Actor& GetDefaultRootActor();
196
197   /**
198    * From RenderTaskDefaults; retrieve the default camera actor.
199    * @return The default camera actor.
200    */
201   virtual CameraActor& GetDefaultCameraActor();
202
203   // Layers
204
205   /**
206    * @copydoc Dali::Stage::GetLayerCount()
207    */
208   unsigned int GetLayerCount() const;
209
210   /**
211    * @copydoc Dali::Stage::GetLayer()
212    */
213   Dali::Layer GetLayer( unsigned int depth ) const;
214
215   /**
216    * @copydoc Dali::Stage::GetRootLayer()
217    */
218   Dali::Layer GetRootLayer() const;
219
220   /**
221    * Retrieve the ordered list of on-stage layers.
222    * @return The layer-list.
223    */
224   LayerList& GetLayerList();
225
226   // System-level overlay actors
227
228   /**
229    * @copydoc Dali::Integration::Core::GetSystemOverlay()
230    */
231   Integration::SystemOverlay& GetSystemOverlay();
232
233   /**
234    * Retrieve the internal implementation of the SystemOverlay.
235    * @return The implementation, or NULL if this has never been requested from Integration API.
236    */
237   SystemOverlay* GetSystemOverlayInternal();
238
239   // Stereoscopy
240
241   /**
242    * @copydoc Dali::Integration::Core::SetViewMode()
243    */
244   void SetViewMode( ViewMode viewMode );
245
246   /**
247    * @copydoc Dali::Integration::Core::GetViewMode()
248    */
249   ViewMode GetViewMode() const;
250
251   /**
252    * @copydoc Dali::Integration::Core::SetStereoBase()
253    */
254   void SetStereoBase( float stereoBase );
255
256   /**
257    * @copydoc Dali::Integration::Core::GetStereoBase()
258    */
259   float GetStereoBase() const;
260
261   // Keyboard stuff
262
263   /**
264    * As one virtual keyboard per stage, the stage will hold a pointer to the Actor currently
265    * set to receive keyboard input.
266    * @param[in] actor to receive keyboard input
267    */
268   void SetKeyboardFocusActor( Actor* actor );
269
270   /**
271    * Get the actor that is currently set to receive keyboard inputs
272    * @return Pointer to the actor set to receive keyboard inputs.
273    */
274   Actor* GetKeyboardFocusActor() const;
275
276   /**
277    * Removes the given actor from keyboard focus so it will no longer receive key events from keyboard.
278    * @param [in] actor which should be removed from focus.
279    */
280   void RemoveActorFromKeyFocus( Actor* actor );
281
282   // Misc
283
284   /**
285    * @copydoc Dali::Stage::SetBackgroundColor
286    */
287   void SetBackgroundColor(Vector4 color);
288
289   /**
290    * @copydoc Dali::Stage::GetBackgroundColor
291    */
292   Vector4 GetBackgroundColor() const;
293
294   /**
295    * @copydoc Dali::Stage::GetDpi
296    */
297   Vector2 GetDpi() const;
298
299   /**
300    * Sets horizontal and vertical pixels per inch value that is used by the display
301    * @param[in] dpi Horizontal and vertical dpi value
302    */
303   void SetDpi( Vector2 dpi );
304
305 #ifdef DYNAMICS_SUPPORT
306
307   /**
308    * Return the Dynamics Simulation Notifier object
309    * @return The Dynamics Simulation Notifier object
310    */
311   DynamicsNotifier& GetDynamicsNotifier();
312
313   /**
314    * @copydoc Dali::Stage::InitializeDynamics
315    */
316   DynamicsWorldPtr InitializeDynamics(DynamicsWorldConfigPtr config);
317
318   /**
319    * @copydoc Dali::Stage::GetDynamicsWorld
320    */
321   DynamicsWorldPtr GetDynamicsWorld();
322
323   /**
324    * @copydoc Dali::Stage::TerminateDynamics
325    */
326   void TerminateDynamics();
327
328 #endif // DYNAMICS_SUPPORT
329
330   NotificationManager& GetNotificationManager()
331   {
332     return mNotificationManager;
333   }
334
335
336   /**
337    * @copydoc Dali::Stage::KeepRendering()
338    */
339   void KeepRendering( float durationSeconds );
340
341   /**
342    * Used by the EventProcessor to emit key event signals.
343    * @param[in] event The key event.
344    */
345   void EmitKeyEventSignal(const KeyEvent& event);
346
347   /**
348    * Emits the event processing finished signal.
349    *
350    * @see Dali::Stage::SignalEventProcessingFinished()
351    */
352   void EmitEventProcessingFinishedSignal();
353
354   /**
355    * Emits the touched signal.
356    * @param[in] touch The touch event details.
357    */
358   void EmitTouchedSignal( const TouchEvent& touch );
359
360   /**
361    * Emits the scene created.
362    */
363   void EmitSceneCreatedSignal();
364
365   /**
366    * @copydoc Dali::Stage::KeyEventSignal()
367    */
368   Dali::Stage::KeyEventSignalV2& KeyEventSignal();
369
370   /**
371    * @copydoc Dali::Stage::SignalEventProcessingFinished()
372    */
373   Dali::Stage::EventProcessingFinishedSignalV2& EventProcessingFinishedSignal();
374
375   /**
376     * @copydoc Dali::Stage::TouchedSignal()
377     */
378   Dali::Stage::TouchedSignalV2& TouchedSignal();
379
380   /**
381    * @copydoc Dali::Stage::ContextLostSignal()
382    */
383   Dali::Stage::ContextStatusSignal& ContextLostSignal();
384
385   /**
386    * @copydoc Dali::Stage::ContextRegainedSignal()
387    */
388   Dali::Stage::ContextStatusSignal& ContextRegainedSignal();
389
390   /**
391    * @copydoc Dali::Stage::SceneCreatedSignal()
392    */
393   Dali::Stage::SceneCreatedSignalV2& SceneCreatedSignal();
394
395 private: // Implementation of ContextNotificationInterface:
396
397   /**
398    * @copydoc Dali::Integration::NotifyContextLost();
399    */
400   virtual void NotifyContextLost();
401
402   /**
403    * @copydoc Dali::Integration::NotifyContextRegained();
404    */
405   virtual void NotifyContextRegained();
406
407 private:
408
409   /**
410    * Protected constructor; see also Stage::New()
411    */
412   Stage( AnimationPlaylist& playlist,
413          PropertyNotificationManager& propertyNotificationManager,
414          SceneGraph::UpdateManager& updateManager,
415          NotificationManager& notificationManager );
416
417   /**
418    * A reference counted object may only be deleted by calling Unreference()
419    */
420   virtual ~Stage();
421
422 private:
423
424   // For 'Fire and forget' animation support
425   AnimationPlaylist& mAnimationPlaylist;
426
427   PropertyNotificationManager& mPropertyNotificationManager;
428
429   SceneGraph::UpdateManager& mUpdateManager;
430
431   NotificationManager& mNotificationManager;
432
433   // The Actual size of the stage.
434   Vector2 mSize;
435
436   // Cached for public GetBackgroundColor()
437   Vector4 mBackgroundColor;
438
439   LayerPtr mRootLayer;
440
441   // Ordered list of currently on-stage layers
442   OwnerPointer<LayerList> mLayerList;
443
444   IntrusivePtr<CameraActor> mDefaultCamera;
445
446   ViewMode mViewMode;
447   float mStereoBase;
448
449   Vector2 mDpi;
450
451   // The object registry
452   ObjectRegistryPtr mObjectRegistry;
453
454 #ifdef DYNAMICS_SUPPORT
455
456   DynamicsNotifier mDynamicsNotifier;
457
458   // The Dynamics simulation world object
459   Integration::DynamicsFactory* mDynamicsFactory;   // Not owned pointer to DynamicsFactory (PlatformAbstraction will clean up)
460   DynamicsWorldPtr mDynamicsWorld;
461
462 #endif // DYNAMICS_SUPPORT
463
464   // The list of render-tasks
465   IntrusivePtr<RenderTaskList> mRenderTaskList;
466
467   Dali::RenderTask mRightRenderTask;
468   IntrusivePtr<CameraActor> mRightCamera;
469   Dali::RenderTask mLeftRenderTask;
470   IntrusivePtr<CameraActor> mLeftCamera;
471
472   Integration::SystemOverlay* mSystemOverlay; ///< SystemOverlay stage access
473
474   // The key event signal
475   Dali::Stage::KeyEventSignalV2                 mKeyEventSignalV2;
476
477   // The event processing finished signal
478   Dali::Stage::EventProcessingFinishedSignalV2  mEventProcessingFinishedSignalV2;
479
480   // The touched signal
481   Dali::Stage::TouchedSignalV2                  mTouchedSignalV2;
482
483   Dali::Stage::ContextStatusSignal mContextLostSignal;
484   Dali::Stage::ContextStatusSignal mContextRegainedSignal;
485
486   Dali::Stage::SceneCreatedSignalV2 mSceneCreatedSignal;
487 };
488
489 } // namespace Internal
490
491 // Helpers for public-api forwarding methods
492
493 inline Internal::Stage& GetImplementation(Dali::Stage& stage)
494 {
495   DALI_ASSERT_ALWAYS( stage && "Stage handle is empty" );
496
497   BaseObject& handle = stage.GetBaseObject();
498
499   return static_cast<Internal::Stage&>(handle);
500 }
501
502 inline const Internal::Stage& GetImplementation(const Dali::Stage& stage)
503 {
504   DALI_ASSERT_ALWAYS( stage && "Stage handle is empty" );
505
506   const BaseObject& handle = stage.GetBaseObject();
507
508   return static_cast<const Internal::Stage&>(handle);
509 }
510
511 } // namespace Dali
512
513 #endif // __DALI_INTERNAL_STAGE_H__