Revert "[Tizen] Add KeyEventGeneratedSignal for Get KeyEvent normally"
[platform/core/uifw/dali-core.git] / dali / internal / event / common / scene-impl.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/event/common/scene-impl.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/internal/event/actors/layer-impl.h>
23 #include <dali/internal/event/actors/layer-list.h>
24 #include <dali/internal/event/actors/camera-actor-impl.h>
25 #include <dali/internal/event/common/thread-local-storage.h>
26 #include <dali/internal/event/render-tasks/render-task-list-impl.h>
27 #include <dali/internal/event/render-tasks/render-task-impl.h>
28 #include <dali/internal/event/common/object-registry-impl.h>
29 #include <dali/internal/update/nodes/node.h>
30 #include <dali/internal/update/manager/update-manager.h>
31 #include <dali/public-api/object/type-registry.h>
32 #include <dali/public-api/render-tasks/render-task-list.h>
33 #include <dali/internal/event/rendering/frame-buffer-impl.h>
34 #include <dali/internal/event/size-negotiation/relayout-controller-impl.h>
35
36 using Dali::Internal::SceneGraph::Node;
37
38 namespace Dali
39 {
40
41 namespace Internal
42 {
43
44 namespace
45 {
46
47 const Vector4 DEFAULT_BACKGROUND_COLOR(0.0f, 0.0f, 0.0f, 1.0f); // Default background color
48
49 } //Unnamed namespace
50
51 ScenePtr Scene::New( const Size& size )
52 {
53   ScenePtr scene = new Scene( size );
54
55   // Second-phase construction
56   scene->Initialize();
57
58   return scene;
59 }
60
61 Scene::Scene( const Size& size )
62 : mSurface( nullptr ),
63   mSize( size ),
64   mSurfaceSize( Vector2::ZERO ),
65   mDpi( Vector2::ZERO ),
66   mBackgroundColor( DEFAULT_BACKGROUND_COLOR ),
67   mDepthTreeDirty( false ),
68   mEventProcessor( *this, ThreadLocalStorage::GetInternal()->GetGestureEventProcessor() )
69 {
70 }
71
72 Scene::~Scene()
73 {
74   if( mDefaultCamera )
75   {
76     // its enough to release the handle so the object is released
77     // don't need to remove it from root actor as root actor will delete the object
78     mDefaultCamera.Reset();
79   }
80
81   if( mRootLayer )
82   {
83     // we are closing down so just delete the root, no point emit disconnect
84     // signals or send messages to update
85     mRootLayer.Reset();
86   }
87
88   if( mRenderTaskList )
89   {
90     mRenderTaskList.Reset();
91   }
92
93   // Discard this Scene from the Core
94   Discard();
95 }
96
97 void Scene::Initialize()
98 {
99   ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
100
101   DALI_ASSERT_ALWAYS( tls && "Attempt to create scene before core exists!" );
102
103   tls->AddScene( this );
104
105   SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
106
107   // Create the ordered list of layers
108   mLayerList = LayerList::New( updateManager );
109
110   // The scene owns the default layer
111   mRootLayer = Layer::NewRoot( *mLayerList );
112   mRootLayer->SetName("RootLayer");
113   mRootLayer->SetScene( *this );
114
115   // The root layer needs to have a fixed resize policy (as opposed to the default USE_NATURAL_SIZE).
116   // This stops actors parented to the stage having their relayout requests propagating
117   // up to the root layer, and down through other children unnecessarily.
118   mRootLayer->SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
119
120   // Create the default camera actor first; this is needed by the RenderTaskList
121   // The default camera attributes and position is such that children of the default layer,
122   // can be positioned at (0,0) and be at the top-left of the viewport.
123   mDefaultCamera = CameraActor::New( mSize );
124   mDefaultCamera->SetParentOrigin(ParentOrigin::CENTER);
125   Add(*(mDefaultCamera.Get()));
126
127   // Create the list of render-tasks
128   mRenderTaskList = RenderTaskList::New();
129
130   // Create the default render-task
131   mRenderTaskList->CreateTask( mRootLayer.Get(), mDefaultCamera.Get() );
132 }
133
134 void Scene::Add(Actor& actor)
135 {
136   mRootLayer->Add( actor );
137 }
138
139 void Scene::Remove(Actor& actor)
140 {
141   mRootLayer->Remove( actor );
142 }
143
144 Size Scene::GetSize() const
145 {
146   return mSize;
147 }
148
149 void Scene::SetDpi(Vector2 dpi)
150 {
151   mDpi = dpi;
152 }
153
154 Vector2 Scene::GetDpi() const
155 {
156   return mDpi;
157 }
158
159 RenderTaskList& Scene::GetRenderTaskList() const
160 {
161   return *mRenderTaskList;
162 }
163
164 Dali::Layer Scene::GetRootLayer() const
165 {
166   return Dali::Layer( mRootLayer.Get() );
167 }
168
169 LayerList& Scene::GetLayerList() const
170 {
171   return *mLayerList;
172 }
173
174 uint32_t Scene::GetLayerCount() const
175 {
176   return mLayerList->GetLayerCount();
177 }
178
179 Dali::Layer Scene::GetLayer( uint32_t depth ) const
180 {
181   return Dali::Layer(mLayerList->GetLayer( depth ));
182 }
183
184 CameraActor& Scene::GetDefaultCameraActor()
185 {
186   return *mDefaultCamera;
187 }
188
189 Actor& Scene::GetDefaultRootActor()
190 {
191   return *mRootLayer;
192 }
193
194 void Scene::SetSurface( Integration::RenderSurface& surface )
195 {
196   mSurface = &surface;
197   if ( mSurface )
198   {
199     RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
200
201     mFrameBuffer = Dali::Internal::FrameBuffer::New( surface, Dali::FrameBuffer::Attachment::NONE );
202     defaultRenderTask->SetFrameBuffer( mFrameBuffer );
203
204     SurfaceResized();
205   }
206 }
207
208 void Scene::SurfaceResized()
209 {
210   if( mSurface )
211   {
212     const float fWidth = static_cast<float>( mSurface->GetPositionSize().width );
213     const float fHeight = static_cast<float>( mSurface->GetPositionSize().height );
214
215     if( ( fabsf( mSurfaceSize.width - fWidth ) > Math::MACHINE_EPSILON_1 ) || ( fabsf( mSurfaceSize.height - fHeight ) > Math::MACHINE_EPSILON_1 ) )
216     {
217       Rect<int32_t> newSize( 0, 0, static_cast<int32_t>( mSurface->GetPositionSize().width ), static_cast<int32_t>( mSurface->GetPositionSize().height ) );
218
219       mSurfaceSize.width = fWidth;
220       mSurfaceSize.height = fHeight;
221
222       mSize.width = mSurfaceSize.width;
223       mSize.height = mSurfaceSize.height;
224
225       // Calculates the aspect ratio, near and far clipping planes, field of view and camera Z position.
226       mDefaultCamera->SetPerspectiveProjection( mSurfaceSize );
227
228       mRootLayer->SetSize( mSize.width, mSize.height );
229
230       ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
231       SceneGraph::UpdateManager& updateManager = tls->GetUpdateManager();
232       SetDefaultSurfaceRectMessage( updateManager, newSize ); // truncated
233
234       RenderTaskPtr defaultRenderTask = mRenderTaskList->GetTask( 0u );
235
236       // if single render task to screen then set its viewport parameters
237       if( 1 == mRenderTaskList->GetTaskCount() )
238       {
239         if( !defaultRenderTask->GetTargetFrameBuffer() )
240         {
241           defaultRenderTask->SetViewport( newSize ); // truncated
242         }
243       }
244
245       defaultRenderTask->GetFrameBuffer()->SetSize( static_cast<uint32_t>( newSize.width ), static_cast<uint32_t>( newSize.height ) );
246     }
247   }
248 }
249
250 Integration::RenderSurface* Scene::GetSurface() const
251 {
252   return mSurface;
253 }
254
255 void Scene::Discard()
256 {
257   if( ThreadLocalStorage::Created() )
258   {
259     ThreadLocalStorage* tls = ThreadLocalStorage::GetInternal();
260     tls->RemoveScene( this );
261   }
262 }
263
264 void Scene::RequestRebuildDepthTree()
265 {
266   mDepthTreeDirty = true;
267 }
268
269 void Scene::QueueEvent( const Integration::Event& event )
270 {
271   mEventProcessor.QueueEvent( event );
272 }
273
274 void Scene::ProcessEvents()
275 {
276   mEventProcessor.ProcessEvents();
277 }
278
279 void Scene::RebuildDepthTree()
280 {
281   // If the depth tree needs rebuilding, do it in this frame only.
282   if( mDepthTreeDirty )
283   {
284     ActorPtr actor( mRootLayer.Get() );
285     actor->RebuildDepthTree();
286     mDepthTreeDirty = false;
287   }
288 }
289
290 void Scene::SetBackgroundColor( const Vector4& color )
291 {
292   mBackgroundColor = color;
293
294   if( mSurface )
295   {
296     mRenderTaskList->GetTask( 0u )->GetFrameBuffer()->SetBackgroundColor( color );
297   }
298 }
299
300 Vector4 Scene::GetBackgroundColor() const
301 {
302   return mBackgroundColor;
303 }
304
305 void Scene::EmitKeyEventSignal(const KeyEvent& event)
306 {
307   mKeyEventSignal.Emit( event );
308 }
309
310 void Scene::EmitEventProcessingFinishedSignal()
311 {
312   mEventProcessingFinishedSignal.Emit();
313 }
314
315 void Scene::EmitTouchedSignal( const TouchEvent& touchEvent, const Dali::TouchData& touch )
316 {
317   mTouchedSignal.Emit( touchEvent );
318   mTouchSignal.Emit( touch );
319 }
320
321 void Scene::EmitWheelEventSignal(const WheelEvent& event)
322 {
323   mWheelEventSignal.Emit( event );
324 }
325
326 Integration::Scene::KeyEventSignalType& Scene::KeyEventSignal()
327 {
328   return mKeyEventSignal;
329 }
330
331 Integration::Scene::EventProcessingFinishedSignalType& Scene::EventProcessingFinishedSignal()
332 {
333   return mEventProcessingFinishedSignal;
334 }
335
336 Scene::TouchedSignalType& Scene::TouchedSignal()
337 {
338   return mTouchedSignal;
339 }
340
341 Integration::Scene::TouchSignalType& Scene::TouchSignal()
342 {
343   return mTouchSignal;
344 }
345
346 Integration::Scene::WheelEventSignalType& Scene::WheelEventSignal()
347 {
348   return mWheelEventSignal;
349 }
350
351 } // Internal
352
353 } // Dali