Merge "Do not observe when Reload" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / controls / scene-view / scene-view-impl.h
1 #ifndef DALI_SCENE3D_INTERNAL_SCENE_VIEW_H
2 #define DALI_SCENE3D_INTERNAL_SCENE_VIEW_H
3
4 /*
5  * Copyright (c) 2023 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 // EXTERNAL INCLUDES
22 #include <dali-toolkit/internal/visuals/image/image-visual.h>
23 #include <dali-toolkit/public-api/controls/control-impl.h>
24 #include <dali/integration-api/adaptor-framework/scene-holder.h>
25 #include <dali/public-api/actors/camera-actor.h>
26 #include <dali/public-api/actors/layer.h>
27 #include <dali/public-api/adaptor-framework/window.h>
28 #include <dali/public-api/animation/animation.h>
29 #include <dali/public-api/object/weak-handle.h>
30 #include <dali/public-api/render-tasks/render-task.h>
31 #include <dali/public-api/rendering/frame-buffer.h>
32 #include <dali/public-api/rendering/texture.h>
33
34 // INTERNAL INCLUDES
35 #include <dali-scene3d/internal/common/environment-map-load-task.h>
36 #include <dali-scene3d/internal/common/image-based-light-observer.h>
37 #include <dali-scene3d/public-api/controls/scene-view/scene-view.h>
38
39 namespace Dali
40 {
41 namespace Scene3D
42 {
43 class SceneView;
44
45 namespace Internal
46 {
47 /**
48  * @brief Impl class for SceneView.
49  */
50 class SceneView : public Dali::Toolkit::Internal::Control
51 {
52 public:
53   /**
54    * @brief Creates a new SceneView.
55    *
56    * @return A public handle to the newly allocated SceneView.
57    */
58   static Dali::Scene3D::SceneView New();
59
60   /**
61    * @copydoc SceneView::AddCamera()
62    */
63   void AddCamera(Dali::CameraActor camera);
64
65   /**
66    * @copydoc SceneView::RemoveCamera()
67    */
68   void RemoveCamera(CameraActor camera);
69
70   /**
71    * @copydoc SceneView::GetCameraCount()
72    */
73   uint32_t GetCameraCount() const;
74
75   /**
76    * @copydoc SceneView::GetSelectedCamera()
77    */
78   CameraActor GetSelectedCamera() const;
79
80   /**
81    * @copydoc SceneView::GetCamera()
82    */
83   CameraActor GetCamera(uint32_t index) const;
84
85   /**
86    * @copydoc SceneView::GetCamera()
87    */
88   CameraActor GetCamera(const std::string& name) const;
89
90   /**
91    * @copydoc SceneView::SelectCamera()
92    */
93   void SelectCamera(uint32_t index);
94
95   /**
96    * @copydoc SceneView::SelectCamera()
97    */
98   void SelectCamera(const std::string& name);
99
100   /**
101    * @brief Register an item.
102    *
103    * Some works(e.g, lighting) of SceneView should be propagated to the child 3D items.
104    * SceneView can avoid unnecessary tree traversal to find 3D items by storing only 3D items as a list.
105    *
106    * @param[in] item scene observer to be registered.
107    */
108   void RegisterSceneItem(Scene3D::Internal::ImageBasedLightObserver* item);
109
110   /**
111    * @brief Unregister an item
112    *
113    * @param[in] item scene observer to be unregistered.
114    */
115   void UnregisterSceneItem(Scene3D::Internal::ImageBasedLightObserver* item);
116
117   /**
118    * @copydoc SceneView::SetImageBasedLightSource()
119    */
120   void SetImageBasedLightSource(const std::string& diffuseUrl, const std::string& specularUrl, float scaleFactor);
121
122   /**
123    * @copydoc SceneView::SetImageBasedLightScaleFactor()
124    */
125   void SetImageBasedLightScaleFactor(float scaleFactor);
126
127   /**
128    * @copydoc SceneView::GetImageBasedLightScaleFactor()
129    */
130   float GetImageBasedLightScaleFactor() const;
131
132   /**
133    * @copydoc SceneView::UseFramebuffer()
134    */
135   void UseFramebuffer(bool useFramebuffer);
136
137   /**
138    * @copydoc SceneView::IsUsingFramebuffer()
139    */
140   bool IsUsingFramebuffer() const;
141
142   /**
143    * @copydoc SceneView::SetFramebufferMultiSamplingLevel()
144    */
145   void SetFramebufferMultiSamplingLevel(uint8_t multiSamplingLevel);
146
147   /**
148    * @copydoc SceneView::GetFramebufferMultiSamplingLevel()
149    */
150   uint8_t GetFramebufferMultiSamplingLevel() const;
151
152   /**
153    * @copydoc SceneView::SetSkybox()
154    */
155   void SetSkybox(const std::string& skyboxUrl);
156
157   /**
158    * @copydoc SceneView::SetSkyboxEnvironmentMapType()
159    */
160   void SetSkyboxEnvironmentMapType(Scene3D::EnvironmentMapType skyboxEnvironmentMapType);
161
162   /**
163    * @copydoc SceneView::SetSkyboxIntensity()
164    */
165   void SetSkyboxIntensity(float intensity);
166
167   /**
168    * @copydoc SceneView::GetSkyboxIntensity()
169    */
170   float GetSkyboxIntensity() const;
171
172   /**
173    * @copydoc SceneView::SetSkyboxOrientation()
174    */
175   void SetSkyboxOrientation(const Quaternion& orientation);
176
177   /**
178    * @copydoc SceneView::GetSkyboxOrientation()
179    */
180   Quaternion GetSkyboxOrientation() const;
181
182 protected:
183   /**
184    * @brief Constructs a new SceneView.
185    */
186   SceneView();
187
188   /**
189    * A reference counted object may only be deleted by calling Unreference()
190    */
191   virtual ~SceneView();
192
193 private:
194   /**
195    * @copydoc CustomActorImpl::OnSceneConnection()
196    */
197   void OnSceneConnection(int depth) override;
198
199   /**
200    * @copydoc CustomActorImpl::OnSceneDisconnection()
201    */
202   void OnSceneDisconnection() override;
203
204   /**
205    * @copydoc Toolkit::Control::OnInitialize()
206    */
207   void OnInitialize() override;
208
209   /**
210    * @copydoc Toolkit::Control::OnChildAdd()
211    */
212   void OnChildAdd(Actor& child) override;
213
214   /**
215    * @copydoc Toolkit::Control::OnChildRemove()
216    */
217   void OnChildRemove(Actor& child) override;
218
219   /**
220    * @copydoc Toolkit::Control::GetHeightForWidth()
221    */
222   float GetHeightForWidth(float width) override;
223
224   /**
225    * @copydoc Toolkit::Control::GetWidthForHeight()
226    */
227   float GetWidthForHeight(float height) override;
228
229   /**
230    * @copydoc Toolkit::Control::OnRelayout()
231    */
232   void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
233
234   /**
235    * @copydoc Toolkit::Control::IsResourceReady()
236    */
237   bool IsResourceReady() const override;
238
239   /**
240    * @brief Changes main camera as a input camera
241    *
242    * @param camera CameraActor that will be a main camera of the SceneView
243    */
244   void UpdateCamera(CameraActor camera);
245
246   /**
247    * @brief Updates RenderTask to use selected camera and to make framebuffer
248    */
249   void UpdateRenderTask();
250
251   /**
252    * @brief Callback that will be called when window is resized.
253    */
254   void OnWindowResized(Window window, Window::WindowSize size);
255
256   /**
257    * @brief Updates camera's projection orientation according to the screen orientation.
258    */
259   void RotateCamera();
260
261   /**
262    * @brief UpdateSkybox with skybox url and skybox environment map type.
263    *
264    * @param[in] skyboxUrl image url for skybox.
265    * @param[in] skyboxEnvironmentMapType The environment type of skybox.
266    */
267   void UpdateSkybox(const std::string& skyboxUrl, Scene3D::EnvironmentMapType skyboxEnvironmentMapType);
268
269   /**
270    * @brief Asynchronously skybox loading finished.
271    */
272   void OnSkyboxLoadComplete();
273
274   /**
275    * @brief Asynchronously ibl diffusel image loading finished.
276    */
277   void OnIblDiffuseLoadComplete();
278
279   /**
280    * @brief Asynchronously ibl specular image loading finished.
281    */
282   void OnIblSpecularLoadComplete();
283
284   /**
285    * @brief Asynchronously ibl loading finished.
286    */
287   void OnIblLoadComplete();
288
289   /**
290    * @brief Notify the changes of Ibl textures to the child items.
291    */
292   void NotifyImageBasedLightTextureChange();
293
294 private:
295   Toolkit::Visual::Base mVisual;
296
297   /////////////////////////////////////////////////////////////
298   // FrameBuffer and Rendertask to render child objects as a 3D Scene
299   Dali::WeakHandle<Dali::Window>                           mWindow;
300   Integration::SceneHolder                                 mSceneHolder;
301   CameraActor                                              mDefaultCamera;
302   CameraActor                                              mSelectedCamera;
303   std::vector<CameraActor>                                 mCameras;
304   std::vector<Scene3D::Internal::ImageBasedLightObserver*> mItems;
305   Dali::FrameBuffer                                        mFrameBuffer;
306   Dali::Texture                                            mTexture;
307   Dali::RenderTask                                         mRenderTask;
308   Layer                                                    mRootLayer;
309   int32_t                                                  mWindowOrientation;
310   Dali::Actor                                              mSkybox;
311   Quaternion                                               mSkyboxOrientation;
312   float                                                    mSkyboxIntensity{1.0f};
313   uint8_t                                                  mFrameBufferMultiSamplingLevel{0u};
314
315   // Asynchronous Loading.
316   EnvironmentMapLoadTaskPtr mSkyboxLoadTask;
317   EnvironmentMapLoadTaskPtr mIblDiffuseLoadTask;
318   EnvironmentMapLoadTaskPtr mIblSpecularLoadTask;
319   std::string               mSkyboxUrl;
320   std::string               mDiffuseIblUrl;
321   std::string               mSpecularIblUrl;
322
323   Scene3D::EnvironmentMapType mSkyboxEnvironmentMapType{Scene3D::EnvironmentMapType::AUTO};
324   Dali::Texture               mSkyboxTexture;
325   Dali::Texture               mDiffuseTexture;
326   Dali::Texture               mSpecularTexture;
327   float                       mIblScaleFactor{1.0f};
328   uint32_t                    mSpecularMipmapLevels{1u};
329   bool                        mUseFrameBuffer{false};
330   bool                        mSkyboxResourceReady{true};
331   bool                        mIblDiffuseResourceReady{true};
332   bool                        mIblSpecularResourceReady{true};
333   bool                        mSkyboxDirty{false};
334   bool                        mIblDiffuseDirty{false};
335   bool                        mIblSpecularDirty{false};
336
337   // TODO : Light Source
338 };
339
340 } // namespace Internal
341
342 // Helpers for public-api forwarding methods
343 inline Dali::Scene3D::Internal::SceneView& GetImpl(Dali::Scene3D::SceneView& obj)
344 {
345   DALI_ASSERT_ALWAYS(obj);
346   Dali::RefObject& handle = obj.GetImplementation();
347   return static_cast<Dali::Scene3D::Internal::SceneView&>(handle);
348 }
349
350 inline const Dali::Scene3D::Internal::SceneView& GetImpl(const Dali::Scene3D::SceneView& obj)
351 {
352   DALI_ASSERT_ALWAYS(obj);
353   const Dali::RefObject& handle = obj.GetImplementation();
354   return static_cast<const Dali::Scene3D::Internal::SceneView&>(handle);
355 }
356
357 } // namespace Scene3D
358
359 } // namespace Dali
360
361 #endif // DALI_SCENE3D_INTERNAL_SCENE_VIEW_H