Asynchronous loading of Scene3D resources
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / controls / scene-view / scene-view-impl.h
index e3de91e..4b026d5 100644 (file)
 // EXTERNAL INCLUDES
 #include <dali-toolkit/internal/visuals/image/image-visual.h>
 #include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/public-api/image-loader/async-image-loader.h>
 #include <dali/public-api/actors/camera-actor.h>
 #include <dali/public-api/actors/layer.h>
+#include <dali/public-api/adaptor-framework/window.h>
 #include <dali/public-api/animation/animation.h>
 #include <dali/public-api/object/weak-handle.h>
 #include <dali/public-api/render-tasks/render-task.h>
@@ -30,8 +32,9 @@
 #include <dali/public-api/rendering/texture.h>
 
 // INTERNAL INCLUDES
-#include <dali-scene3d/public-api/controls/model-view/model-view.h>
 #include <dali-scene3d/public-api/controls/scene-view/scene-view.h>
+#include <dali-scene3d/internal/common/environment-map-load-task.h>
+#include <dali-scene3d/internal/common/image-based-light-observer.h>
 
 namespace Dali
 {
@@ -67,22 +70,22 @@ public:
   /**
    * @copydoc SceneView::GetCameraCount()
    */
-  uint32_t GetCameraCount();
+  uint32_t GetCameraCount() const;
 
   /**
    * @copydoc SceneView::GetSelectedCamera()
    */
-  CameraActor GetSelectedCamera();
+  CameraActor GetSelectedCamera() const;
 
   /**
    * @copydoc SceneView::GetCamera()
    */
-  CameraActor GetCamera(uint32_t index);
+  CameraActor GetCamera(uint32_t index) const;
 
   /**
    * @copydoc SceneView::GetCamera()
    */
-  CameraActor GetCamera(const std::string& name);
+  CameraActor GetCamera(const std::string& name) const;
 
   /**
    * @copydoc SceneView::SelectCamera()
@@ -95,25 +98,36 @@ public:
   void SelectCamera(const std::string& name);
 
   /**
-   * @brief Register a ModelView.
-   * Some works like ibl setting should be applied on the only ModelView not the all child actors.
-   * SceneView contains child ModelView list to apply the works effectively.
+   * @brief Register an item.
    *
-   * @param[in] modelView ModelView to be registered.
+   * Some works(e.g, lighting) of SceneView should be propagated to the child 3D items.
+   * SceneView can avoid unnecessary tree traversal to find 3D items by storing only 3D items as a list.
+   *
+   * @param[in] item scene observer to be registered.
    */
-  void RegisterModelView(Scene3D::ModelView modelView);
+  void RegisterSceneItem(Scene3D::Internal::ImageBasedLightObserver* item);
 
   /**
-   * @brief Unregister a ModelView
+   * @brief Unregister an item
    *
-   * @param[in] modelView ModelView to be unregistered.
+   * @param[in] item scene observer to be unregistered.
    */
-  void UnregisterModelView(Scene3D::ModelView modelView);
+  void UnregisterSceneItem(Scene3D::Internal::ImageBasedLightObserver* item);
 
   /**
    * @copydoc SceneView::SetImageBasedLightSource()
    */
-  void SetImageBasedLightSource(const std::string& diffuse, const std::string& specular, float scaleFactor);
+  void SetImageBasedLightSource(const std::string& diffuseUrl, const std::string& specularUrl, float scaleFactor);
+
+  /**
+   * @copydoc SceneView::SetImageBasedLightScaleFactor()
+   */
+  void SetImageBasedLightScaleFactor(float scaleFactor);
+
+  /**
+   * @copydoc SceneView::GetImageBasedLightScaleFactor()
+   */
+  float GetImageBasedLightScaleFactor() const;
 
   /**
    * @copydoc SceneView::UseFramebuffer()
@@ -123,7 +137,32 @@ public:
   /**
    * @copydoc SceneView::IsUsingFramebuffer()
    */
-  bool IsUsingFramebuffer();
+  bool IsUsingFramebuffer() const;
+
+  /**
+   * @copydoc SceneView::SetSkybox()
+   */
+  void SetSkybox(const std::string& skyboxUrl, Scene3D::SceneView::SkyboxType skyboxType);
+
+  /**
+   * @copydoc SceneView::SetSkyboxIntensity()
+   */
+  void SetSkyboxIntensity(float intensity);
+
+  /**
+   * @copydoc SceneView::GetSkyboxIntensity()
+   */
+  float GetSkyboxIntensity() const;
+
+  /**
+   * @copydoc SceneView::SetSkyboxOrientation()
+   */
+  void SetSkyboxOrientation(const Quaternion& orientation);
+
+  /**
+   * @copydoc SceneView::GetSkyboxOrientation()
+   */
+  Quaternion GetSkyboxOrientation() const;
 
 protected:
   /**
@@ -194,26 +233,87 @@ private:
    */
   void UpdateRenderTask();
 
+  /**
+   * @brief Callback that will be called when window is resized.
+   */
+  void OnWindowResized(Window window, Window::WindowSize size);
+
+  /**
+   * @brief Updates camera's projection orientation according to the screen orientation.
+   */
+  void RotateCamera();
+
+  /**
+   * @brief Asynchronously skybox (Equirectangular) loading finished.
+   */
+  void OnSkyboxEquirectangularLoadComplete(uint32_t loadedTaskId, PixelData pixelData);
+
+  /**
+   * @brief Asynchronously skybox loading finished.
+   */
+  void OnSkyboxLoadComplete();
+
+  /**
+   * @brief Asynchronously ibl diffusel image loading finished.
+   */
+  void OnIblDiffuseLoadComplete();
+
+  /**
+   * @brief Asynchronously ibl specular image loading finished.
+   */
+  void OnIblSpecularLoadComplete();
+
+  /**
+   * @brief Asynchronously ibl loading finished.
+   */
+  void OnIblLoadComplete();
+
+  /**
+   * @brief Notify the changes of Ibl textures to the child items.
+   */
+  void NotifyImageBasedLightTextureChange();
+
 private:
   Toolkit::Visual::Base mVisual;
 
   /////////////////////////////////////////////////////////////
   // FrameBuffer and Rendertask to render child objects as a 3D Scene
-  CameraActor                     mDefaultCamera;
-  CameraActor                     mSelectedCamera;
-  std::vector<CameraActor>        mCameras;
-  std::vector<Scene3D::ModelView> mModels;
-  Dali::FrameBuffer               mRenderTarget;
-  Dali::Texture                   mTexture;
-  Dali::RenderTask                mRenderTask;
-
-  Layer mRootLayer;
-
-  Dali::Texture mSpecularTexture;
-  Dali::Texture mDiffuseTexture;
-  float         mIblScaleFactor{1.0f};
-  bool          mUseFrameBuffer{false};
-  bool          mIBLResourceReady{true};
+  Dali::WeakHandle<Dali::Window>                           mWindow;
+  CameraActor                                              mDefaultCamera;
+  CameraActor                                              mSelectedCamera;
+  std::vector<CameraActor>                                 mCameras;
+  std::vector<Scene3D::Internal::ImageBasedLightObserver*> mItems;
+  Dali::FrameBuffer                                        mFrameBuffer;
+  Dali::Texture                                            mTexture;
+  Dali::RenderTask                                         mRenderTask;
+  Layer                                                    mRootLayer;
+  int32_t                                                  mWindowOrientation;
+  Dali::Actor                                              mSkybox;
+  Quaternion                                               mSkyboxOrientation;
+  float                                                    mSkyboxIntensity{1.0f};
+
+  // Asynchronous Loading.
+  EnvironmentMapLoadTaskPtr       mSkyboxLoadTask;
+  EnvironmentMapLoadTaskPtr       mIblDiffuseLoadTask;
+  EnvironmentMapLoadTaskPtr       mIblSpecularLoadTask;
+  std::string                     mSkyboxUrl;
+  std::string                     mDiffuseIblUrl;
+  std::string                     mSpecularIblUrl;
+  Dali::Toolkit::AsyncImageLoader mSkyboxImageLoader;
+  uint32_t                        mSkyboxImageId{0u};
+
+  Scene3D::SceneView::SkyboxType mSkyboxEnvironmentMapType;
+  Dali::Texture                  mSkyboxTexture;
+  Dali::Texture                  mDiffuseTexture;
+  Dali::Texture                  mSpecularTexture;
+  float                          mIblScaleFactor{1.0f};
+  bool                           mUseFrameBuffer{false};
+  bool                           mSkyboxResourceReady{true};
+  bool                           mIblDiffuseResourceReady{true};
+  bool                           mIblSpecularResourceReady{true};
+  bool                           mSkyboxDirty{false};
+  bool                           mIblDiffuseDirty{false};
+  bool                           mIblSpecularDirty{false};
 
   // TODO : Light Source
 };