Update toolkit with ResourceImage/Image split
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / transition-effects / cube-transition-effect-impl.h
1 #ifndef __DALI_TOOLKIT_INTERNAL_CUBE_TRANSITION_EFFECT_H__
2 #define __DALI_TOOLKIT_INTERNAL_CUBE_TRANSITION_EFFECT_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 // EXTERNAL INCLUDES
22 #include <dali/public-api/animation/animation.h>
23 #include <dali/public-api/images/bitmap-image.h>
24 #include <dali/public-api/images/frame-buffer-image.h>
25 #include <dali/public-api/object/base-object.h>
26 #include <dali/public-api/render-tasks/render-task.h>
27 #include <dali/public-api/shader-effects/shader-effect.h>
28 #include <dali/public-api/images/resource-image.h>
29
30 // INTERNAL INCLUDES
31 #include <dali-toolkit/public-api/transition-effects/cube-transition-effect.h>
32
33 namespace Dali
34 {
35
36 namespace Toolkit
37 {
38
39 class CubeTransitionEffect;
40
41 namespace Internal
42 {
43
44 /**
45  * Create a image with size of viewAreaSize
46  * with the effect image as its center part and (0,0,0,1) at other parts
47  */
48 class FullAreaImageCreator : public ShaderEffect
49 {
50
51 public:
52
53   /**
54    * Create an uninitialized FullAreaImageCreator
55    * this can be initialized with FullAreaImageCreator::New()
56    */
57   FullAreaImageCreator(){}
58
59   /**
60    * @brief Destructor
61    *
62    * This is non-virtual since derived Handle types must not contain data or virtual methods.
63    */
64   ~FullAreaImageCreator(){}
65
66   /**
67    * Create an initialized FullAreaImageCreator.
68    * @return A handle to a newly allocated Dali resource.
69    */
70   static FullAreaImageCreator New()
71   {
72     std::string vertexShader(
73       "uniform mediump vec4 uRegion; \n"
74        "void main() \n"
75       "{\n"
76       "  gl_Position = uProjection * uModelView * vec4(aPosition, 1.0);\n"
77       "  vTexCoord.s = (aTexCoord.s - uRegion.s) / uRegion.p;"
78       "  vTexCoord.t = ( 1.0 - aTexCoord.t - uRegion.t) / uRegion.q;"
79       "}\n"
80     );
81
82     std::string fragmentShader(
83       "uniform mediump vec4 uRegion; \n"
84       "void main() \n"
85       "{\n"
86       "  if( vTexCoord.s > 0.0 && vTexCoord.s < 1.0 && vTexCoord.t > 0.0 && vTexCoord.t < 1.0) \n"
87       "  { \n"
88       "    gl_FragColor = texture2D( sEffect, vTexCoord ) * uColor ; \n"
89       "  } \n"
90       "  else \n"
91       "  { \n"
92       "    gl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 ); \n"
93       "  } \n"
94       "}\n"
95     );
96
97     ShaderEffect shaderEffectCustom = ShaderEffect::New(vertexShader, fragmentShader);
98     FullAreaImageCreator handle( shaderEffectCustom );
99
100     return handle;
101   }
102
103   /**
104    * Set up the position and size of the effect texture
105    * @param[in] viewArea the size of full-area image to create
106    * @param[in] size the size of effect texture
107    */
108   void SetRegionSize( const Vector2& viewArea, const Vector2& size )
109   {
110     Vector2 sizeRatio( std::min(1.f, size.x / viewArea.x), std::min(1.f, size.y / viewArea.y) );
111     Vector4 region( (1.f-sizeRatio.x)*0.5f,
112                     (1.f-sizeRatio.y)*0.5f,
113                     sizeRatio.x,
114                     sizeRatio.y  );
115     SetUniform( "uRegion", region );
116   }
117
118 private:
119
120   FullAreaImageCreator( ShaderEffect handle )
121   : ShaderEffect( handle )
122   {}
123
124 };
125
126
127
128 /**
129  * CubeTransitionEffect implementation class
130  */
131 class CubeTransitionEffect : public Dali::BaseObject, public ConnectionTracker
132 {
133
134 public:
135
136   /**
137    * Destructor
138    */
139   ~CubeTransitionEffect();
140
141   /**
142    * @copydoc Toolkit::CubeTransitionEffect::SetTransitionDuration
143    */
144   void SetTransitionDuration( float duration );
145
146   /**
147    * @copydoc Toolkit::CubeTransitionEffect::GetTransitionDuration
148    */
149   float GetTransitionDuration() const;
150
151   /**
152    * @copydoc Toolkit::CubeTransitionEffect::SetCubeDisplacement
153    */
154   void SetCubeDisplacement( float displacement );
155
156   /**
157    * @copydoc Toolkit::CubeTransitionEffect::GetCubeDisplacement
158    */
159   float GetCubeDisplacement() const;
160
161   /**
162    * @copydoc Toolkit::CubeTransitionEffect::GetRoot
163    */
164   Actor GetRoot();
165
166   /**
167    * @copydoc Toolkit::CubeTransitionEffect::IsTransiting
168    */
169   bool IsTransiting();
170
171   /**
172    * @copydoc Toolkit::CubeTransitionEffect::SetFirstImage
173    */
174   void SetCurrentImage(ImageActor imageActor);
175
176   /**
177    * @copydoc Toolkit::CubeTransitionEffect::SetTargetImage
178    */
179   void SetTargetImage(ImageActor imageActor);
180
181   /**
182    * @copydoc Toolkit::CubeTransitionEffect::StartTransition(bool)
183    */
184   void StartTransition( bool toNextImage = true );
185
186   /**
187    * @copydoc Toolkit::CubeTransitionEffect::StartTransition(Vector2, Vector2)
188    */
189   void StartTransition( Vector2 panPosition, Vector2 panDisplacement );
190
191   /**
192    * @copydoc Toolkit::CubeTransitionEffect::PauseTransition()
193    */
194   void PauseTransition();
195
196   /**
197    * @copydoc Toolkit::CubeTransitionEffect::ResumeTransition()
198    */
199   void ResumeTransition();
200
201   /**
202    * @copydoc Toolkit::CubeTransitionEffect::StopTransition()
203    */
204   void StopTransition();
205
206 public: //Signal
207
208   /**
209    * @copydoc Toolkit::CubeTransitionEffect::TransitionCompletedSignal()
210    */
211   Toolkit::CubeTransitionEffect::TransitionCompletedSignalType& TransitionCompletedSignal();
212
213 protected:
214
215   /**
216    * Construct a new CubeTransitionEffect object
217    * Called in the constructor of subclasses
218    * @param[in] numRows How many rows of cubes
219    * @param[in] numColumns How many columns of cubes
220    * @param[in] viewAreaSize The size of view area for this transition effect
221    */
222   CubeTransitionEffect( unsigned int numRows, unsigned int numColumns, Size viewAreaSize );
223
224   /**
225    * Initialization steps: creating a layer, two groups of tiles,
226    * and one group of actors (cubes) serving as parents of every two tiles (one from each image).
227    */
228   void Initialize();
229
230 private:
231
232   /**
233    * Create an image actor to serve as a face of the cube
234    * @param[in] image The image to display.
235    * @param[in] color The color to set to the actor
236    * @return The tile actor created
237    */
238   ImageActor CreateTile( Image image, const Vector4& color );
239
240   /**
241    * Set Image content to tiles
242    * As only when the image ready, can we get correct image attributes
243    * so inside this function, the process needs to be passed to callBack of image resource loading succeed.
244    * @param[in] imageActor The imageActor whose image content will be set to the tiles
245    */
246   void SetImage(ImageActor imageActor);
247
248   /**
249    * Callback function of image resource loading succeed
250    * Set image and pixelArea to tiles
251    * @param[in] image The image content of the imageActor for transition
252    */
253   void OnImageLoaded(ResourceImage image);
254
255   /**
256    * Set sub-image to each tile.
257    * @param[in] image The image content of the imageActor for transition
258    */
259   void PrepareTiles( Image image );
260
261   /**
262    * Callback function of transition animation finished
263    * Hide transition layer, show current imageActor, and set isAnimating flag to false
264    * @param[in] source The cube transition animation
265    */
266   void OnTransitionFinished(Animation& source);
267
268   /**
269    * This method is called after the CubeTransitionEffect has been initialized.  Derived classes should do
270    * any second phase initialization by overriding this method.
271    */
272   virtual void OnInitialize() { }
273
274   /**
275    * This method is called after the a new transition is activated.
276    * Derived classes should do any specialized transition process by overriding this method.
277    * @param[in] panPosition The press down position of panGesture
278    * @param[in] panDisplacement The displacement vector of panGesture
279    */
280   virtual void OnStartTransition( Vector2 panPosition, Vector2 panDisplacement ) {}
281
282   /**
283    * This method is called when the transition is forced stop in the middle of animation.
284    * Derived classed should set the rotation status of the cubes to the same as the final state when the animation is finished completely.
285    * So that the next transition would be started correctly.
286    */
287   virtual void OnStopTransition() {}
288
289
290 protected:
291
292   unsigned int               mNumRows;
293   unsigned int               mNumColumns;
294   Size                       mViewAreaSize;
295   ActorContainer             mBoxes;
296   std::vector< ImageActor >  mTiles[2];
297   int                        mRotateIndex;
298   Size                       mTileSize;
299   Actor                      mRoot;
300
301   ImageActor                 mCurrentImage;
302   unsigned int               mContainerIndex;           //have the value 0 or 1, refer to mTiles[0] or mTiles[1]
303
304   bool                       mChangeTurningDirection;
305   bool                       mIsToNextImage;            //if true, cubes rotate counter-clockwise; else clockwise
306   bool                       mIsImageLoading;
307
308   float                      mAnimationDuration;
309   Animation                  mAnimation;
310   bool                       mIsAnimating;
311   bool                       mIsPaused;
312
313   float                      mCubeDisplacement;
314
315   bool                       mFirstTransition;
316
317   RenderTask                 mOffScreenTask;
318   FrameBufferImage           mOffScreenBuffer[2];
319   ImageActor                 mEmptyImage;
320   FullAreaImageCreator       mFullImageCreator;
321   unsigned int               mBufferIndex;
322
323   static const Vector4       FULL_BRIGHTNESS;
324   static const Vector4       HALF_BRIGHTNESS;
325
326 private:
327
328   Toolkit::CubeTransitionEffect::TransitionCompletedSignalType mTransitionCompletedSignal;
329
330 };
331
332 } // namespace Internal
333
334 // Helpers for public-api forwarding methods
335
336 inline Internal::CubeTransitionEffect& GetImpl(Dali::Toolkit::CubeTransitionEffect& obj)
337 {
338   DALI_ASSERT_ALWAYS(obj);
339
340   Dali::BaseObject& handle = obj.GetBaseObject();
341
342   return static_cast<Internal::CubeTransitionEffect&>(handle);
343 }
344
345 inline const Internal::CubeTransitionEffect& GetImpl(const Dali::Toolkit::CubeTransitionEffect& obj)
346 {
347   DALI_ASSERT_ALWAYS(obj);
348
349   const Dali::BaseObject& handle = obj.GetBaseObject();
350
351   return static_cast<const Internal::CubeTransitionEffect&>(handle);
352 }
353
354 } // namespace Toolkit
355
356 } // namespace Dali
357
358 #endif /* __DALI_TOOLKIT_INTERNAL_CUBE_TRANSITION_EFFECT_H__ */