Adjust text fit condition
[platform/core/uifw/dali-toolkit.git] / dali-scene3d / internal / controls / model-view / model-view-impl.h
1 #ifndef DALI_SCENE3D_INTERNAL_MODEL_VIEW_H
2 #define DALI_SCENE3D_INTERNAL_MODEL_VIEW_H
3
4 /*
5  * Copyright (c) 2022 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/public-api/controls/control-impl.h>
23 #include <dali/public-api/actors/layer.h>
24 #include <dali/public-api/animation/animation.h>
25 #include <dali/public-api/rendering/texture.h>
26 #include <dali/public-api/object/weak-handle.h>
27
28 // INTERNAL INCLUDES
29 #include <dali-scene3d/public-api/controls/model-view/model-view.h>
30 #include <dali-scene3d/public-api/controls/scene-view/scene-view.h>
31
32 namespace Dali
33 {
34 namespace Scene3D
35 {
36 class ModelView;
37
38 namespace Internal
39 {
40 /**
41  * @brief Impl class for ModelView.
42  */
43 class ModelView : public Dali::Toolkit::Internal::Control
44 {
45 public:
46   using AnimationData = std::pair<std::string, Dali::Animation>;
47
48   /**
49    * @brief Creates a new ModelView.
50    *
51    * @return A public handle to the newly allocated ModelView.
52    */
53   static Dali::Scene3D::ModelView New(const std::string& modelPath, const std::string& resourcePath);
54
55   /**
56    * @copydoc ModelView::GetModelRoot()
57    */
58   const Actor GetModelRoot() const;
59
60   /**
61    * @copydoc ModelView::FitModel()
62    */
63   void FitSize(bool fit);
64
65   /**
66    * @copydoc ModelView::FitCenter()
67    */
68   void FitCenter(bool fit);
69
70   /**
71    * @copydoc ModelView::SetImageBasedLightSource()
72    */
73   void SetImageBasedLightSource(const std::string& diffuse, const std::string& specular, float scaleFactor);
74
75   /**
76    * @copydoc ModelView::SetImageBasedLightTexture()
77    */
78   void SetImageBasedLightTexture(Dali::Texture diffuse, Dali::Texture specular, float scaleFactor);
79
80   /**
81    * @copydoc ModelView::SetImageBasedLightScaleFactor()
82    */
83   void SetImageBasedLightScaleFactor(float scaleFactor);
84
85   /**
86    * @copydoc ModelView::GetImageBasedLightScaleFactor()
87    */
88   float GetImageBasedLightScaleFactor() const;
89
90   /**
91    * @copydoc ModelView::GetAnimationCount()
92    */
93   uint32_t GetAnimationCount() const;
94
95   /**
96    * @copydoc ModelView::GetAnimation()
97    */
98   Dali::Animation GetAnimation(uint32_t index) const;
99
100   /**
101    * @copydoc ModelView::GetAnimation()
102    */
103   Dali::Animation GetAnimation(const std::string& name) const;
104
105 protected:
106   /**
107    * @brief Constructs a new ModelView.
108    */
109   ModelView(const std::string& modelPath, const std::string& resourcePath);
110
111   /**
112    * A reference counted object may only be deleted by calling Unreference()
113    */
114   virtual ~ModelView();
115
116 private:
117   /**
118    * @copydoc CustomActorImpl::OnSceneConnection()
119    */
120   void OnSceneConnection(int depth) override;
121
122   /**
123    * @copydoc CustomActorImpl::OnSceneDisconnection()
124    */
125   void OnSceneDisconnection() override;
126
127   /**
128    * @copydoc Toolkit::Control::GetNaturalSize
129    */
130   Vector3 GetNaturalSize() override;
131
132   /**
133    * @copydoc Toolkit::Control::GetHeightForWidth()
134    */
135   float GetHeightForWidth(float width) override;
136
137   /**
138    * @copydoc Toolkit::Control::GetWidthForHeight()
139    */
140   float GetWidthForHeight(float height) override;
141
142   /**
143    * @copydoc Toolkit::Control::OnRelayout()
144    */
145   void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
146
147   /**
148    * @copydoc Toolkit::Control::IsResourceReady()
149    */
150   bool IsResourceReady() const override;
151
152   /**
153    * @brief Loads a model from file
154    */
155   void LoadModel();
156
157   /**
158    * @brief Scales the model to fit the control or to return to original size.
159    */
160   void ScaleModel();
161
162   /**
163    * @brief Changes model anchor point to set the model at center or returns to the original model pivot.
164    */
165   void FitModelPosition();
166
167   /**
168    * @brief Changes IBL information of the input node.
169    */
170   void CollectRenderableActor(Actor actor);
171
172   /**
173    * @brief Changes IBL textures of the input node.
174    */
175   void UpdateImageBasedLightTexture();
176
177   /**
178    * @brief Changes IBL scale factor of the input node.
179    */
180   void UpdateImageBasedLightScaleFactor();
181
182 private:
183   std::string                    mModelPath;
184   std::string                    mResourcePath;
185   Dali::Actor                    mModelRoot;
186   std::vector<AnimationData>     mAnimations;
187   std::vector<WeakHandle<Actor>> mRenderableActors;
188   WeakHandle<Scene3D::SceneView> mParentSceneView;
189
190   Dali::Texture mSpecularTexture;
191   Dali::Texture mDiffuseTexture;
192   Vector3       mNaturalSize;
193   Vector3       mModelPivot;
194   float         mIblScaleFactor;
195   bool          mFitSize;
196   bool          mFitCenter;
197   bool          mModelResourceReady;
198   bool          mIBLResourceReady;
199 };
200
201 } // namespace Internal
202
203 // Helpers for public-api forwarding methods
204 inline Dali::Scene3D::Internal::ModelView& GetImpl(Dali::Scene3D::ModelView& obj)
205 {
206   DALI_ASSERT_ALWAYS(obj);
207   Dali::RefObject& handle = obj.GetImplementation();
208   return static_cast<Dali::Scene3D::Internal::ModelView&>(handle);
209 }
210
211 inline const Dali::Scene3D::Internal::ModelView& GetImpl(const Dali::Scene3D::ModelView& obj)
212 {
213   DALI_ASSERT_ALWAYS(obj);
214   const Dali::RefObject& handle = obj.GetImplementation();
215   return static_cast<const Dali::Scene3D::Internal::ModelView&>(handle);
216 }
217
218 } // namespace Scene3D
219
220 } // namespace Dali
221
222 #endif // DALI_SCENE3D_INTERNAL_MODEL_VIEW_H