2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <dali-toolkit/internal/visuals/animated-gradient/animated-gradient-visual.h>
21 #include <dali-toolkit/devel-api/visuals/animated-gradient-visual-properties-devel.h>
22 #include <dali-toolkit/public-api/visuals/visual-properties.h>
23 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
24 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
25 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
26 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
27 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
40 // non-animated property
41 const char* const GRADIENT_TYPE_NAME("gradientType");
42 const char* const UNIT_TYPE_NAME("unitType");
43 const char* const SPREAD_TYPE_NAME("spreadType");
45 const char* const START_POSITION_NAME("startPosition");
46 const char* const START_COLOR_NAME("startColor");
47 const char* const END_POSITION_NAME("endPosition");
48 const char* const END_COLOR_NAME("endColor");
49 const char* const ROTATE_CENTER_NAME("rotateCenter");
50 const char* const ROTATE_AMOUNT_NAME("rotateAmount");
51 const char* const OFFSET_NAME("offset");
52 // animation parameter property
53 const char* const START_VALUE_NAME("startValue");
54 const char* const TARGET_VALUE_NAME("targetValue");
55 const char* const DIRECTION_TYPE_NAME("directionType");
56 const char* const DURATION_NAME("duration");
57 const char* const DELAY_NAME("delay");
58 const char* const REPEAT_NAME("repeat");
59 const char* const REPEAT_DELAY_NAME("repeatDelay");
60 const char* const MOTION_TYPE_NAME("motionType");
61 const char* const EASING_TYPE_NAME("easingType");
62 // common shader property
63 const char* const UNIFORM_START_POINT_NAME("start_point");
64 const char* const UNIFORM_START_COLOR_NAME("start_color");
65 const char* const UNIFORM_END_POINT_NAME("end_point");
66 const char* const UNIFORM_END_COLOR_NAME("end_color");
67 const char* const UNIFORM_ROTATE_CENTER_NAME("rotate_center");
68 const char* const UNIFORM_ROTATE_ANGLE_NAME("rotate_angle");
69 const char* const UNIFORM_OFFSET_NAME("gradient_offset");
71 DALI_ENUM_TO_STRING_TABLE_BEGIN( GRADIENT_TYPE )
72 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::GradientType, LINEAR )
73 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::GradientType, RADIAL )
74 DALI_ENUM_TO_STRING_TABLE_END( GRADIENT_TYPE )
76 DALI_ENUM_TO_STRING_TABLE_BEGIN( UNIT_TYPE )
77 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::UnitType, OBJECT_BOUNDING_BOX )
78 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::UnitType, USER_SPACE )
79 DALI_ENUM_TO_STRING_TABLE_END( UNIT_TYPE )
81 DALI_ENUM_TO_STRING_TABLE_BEGIN( SPREAD_TYPE )
82 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::SpreadType, REFLECT )
83 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::SpreadType, REPEAT )
84 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::SpreadType, CLAMP )
85 DALI_ENUM_TO_STRING_TABLE_END( SPREAD_TYPE )
87 DALI_ENUM_TO_STRING_TABLE_BEGIN( DIRECTION_TYPE )
88 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType, FORWARD )
89 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType, BACKWARD )
90 DALI_ENUM_TO_STRING_TABLE_END( DIRECTION_TYPE )
92 DALI_ENUM_TO_STRING_TABLE_BEGIN( MOTION_TYPE )
93 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType, LOOP )
94 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType, MIRROR )
95 DALI_ENUM_TO_STRING_TABLE_END( MOTION_TYPE )
97 DALI_ENUM_TO_STRING_TABLE_BEGIN( EASING_TYPE )
98 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType, LINEAR )
99 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType, IN )
100 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType, OUT )
101 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType, IN_OUT )
102 DALI_ENUM_TO_STRING_TABLE_END( EASING_TYPE )
104 // Default values of each properties
105 const Toolkit::DevelAnimatedGradientVisual::GradientType::Type DEFAULT_GRADIENT_TYPE = Toolkit::DevelAnimatedGradientVisual::GradientType::LINEAR;
106 const Toolkit::DevelAnimatedGradientVisual::UnitType::Type DEFAULT_UNIT_TYPE = Toolkit::DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX;
107 const Toolkit::DevelAnimatedGradientVisual::SpreadType::Type DEFAULT_SPREAD_TYPE = Toolkit::DevelAnimatedGradientVisual::SpreadType::REFLECT;
109 const float DEFAULT_START_POSITION[] = { -0.5f, 0.0f };
110 const float DEFAULT_START_COLOR[] = { 143.0f/255.0f, 170.0f/255.0f, 220.0f/255.0f, 255.0f/255.0f };
111 const float DEFAULT_END_POSITION[] = { 0.5f, 0.0f };
112 const float DEFAULT_END_COLOR[] = { 255.0f/255.0f, 163.0f/255.0f, 163.0f/255.0f, 255.0f/255.0f };
113 const float DEFAULT_ROTATE_CENTER[] = { 0.0f, 0.0f };
114 const float DEFAULT_ROTATE_AMOUNT = 0.0f;
116 const float DEFAULT_ANIMATION_START_VALUE = 0.0f;
117 const float DEFAULT_ANIMATION_TARGET_VALUE = 0.0f;
118 const float DEFAULT_ANIMATION_DURATION = 3.0f;
119 const float DEFAULT_ANIMATION_DELAY = 0.0f;
120 const int DEFAULT_ANIMATION_REPEAT = 0;
121 const float DEFAULT_ANIMATION_REPEAT_DELAY = 0.0f;
123 const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::Type DEFAULT_ANIMATION_DIRECTION_TYPE = Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::FORWARD;
124 const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::Type DEFAULT_ANIMATION_MOTION_TYPE = Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::LOOP;
125 const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::Type DEFAULT_ANIMATION_EASING_TYPE = Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR;
127 const char* const BASIC_VERTEX_SHADER = DALI_COMPOSE_SHADER(
128 attribute mediump vec2 aPosition;
129 uniform mediump mat4 uMvpMatrix;
130 uniform mediump vec3 uSize;
132 uniform mediump vec2 start_point;
133 uniform mediump vec2 end_point;
134 uniform mediump vec2 rotate_center;
135 uniform mediump float rotate_angle;
137 varying mediump vec2 vTexCoord;
138 varying mediump vec2 vStart;
139 varying mediump vec2 vEnd;
141 vec2 rotate(vec2 x, vec2 c, float a)
144 vec2 r = vec2(d.x * cos(a) - d.y * sin(a), d.x * sin(a) + d.y * cos(a));
146 \n #ifdef UNIT_TYPE_BOUNDING_BOX \n return r + c; \n #endif \n /* UnitType::OBJECT_BOUNDING_BOX */
147 \n #ifdef UNIT_TYPE_USER \n return (r + c) / uSize.x; \n #endif \n /* UnitType::USER_SPACE */
150 //Visual size and offset
151 uniform mediump vec2 offset;
152 uniform mediump vec2 size;
153 uniform mediump vec4 offsetSizeMode;
154 uniform mediump vec2 origin;
155 uniform mediump vec2 anchorPoint;
157 vec4 ComputeVertexPosition()
159 vec2 visualSize = mix( uSize.xy*size, size, offsetSizeMode.zw );
160 vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy );
161 return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );
166 vStart = rotate( start_point, rotate_center, rotate_angle );
167 vEnd = rotate( end_point, rotate_center, rotate_angle );
168 gl_Position = uMvpMatrix * ComputeVertexPosition();
170 \n #ifdef UNIT_TYPE_BOUNDING_BOX \n vTexCoord = vec2(aPosition.x, -aPosition.y); \n #endif \n /* UnitType::OBJECT_BOUNDING_BOX */
171 \n #ifdef UNIT_TYPE_USER \n vTexCoord = vec2(aPosition.x, -aPosition.y * uSize.y / uSize.x); \n #endif \n /* UnitType::USER_SPACE */
175 const char* const BASIC_FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
176 precision mediump float;
178 uniform mediump vec4 start_color;
179 uniform mediump vec4 end_color;
180 uniform mediump float gradient_offset;
182 varying mediump vec2 vTexCoord;
183 varying mediump vec2 vStart;
184 varying mediump vec2 vEnd;
186 float get_position(vec2 x, vec2 s, vec2 e)
191 \n #ifdef GRADIENT_TYPE_LINEAR \n return dot(dx,df)/dot(df,df); \n #endif \n /* GradientType::LINEAR */
192 \n #ifdef GRADIENT_TYPE_RADIAL \n return sqrt(dot(dx,dx)/dot(df,df)); \n #endif \n /* GradientType::RADIAL */
194 float recalculate(float r)
196 \n #ifdef SPREAD_TYPE_REFLECT \n return 1.0 - abs(mod(r, 2.0) - 1.0); \n #endif \n /* SpreadType::REFLECT */
197 \n #ifdef SPREAD_TYPE_REPEAT \n return fract(r); \n #endif \n /* SpreadType::REPEAT */
198 \n #ifdef SPREAD_TYPE_CLAMP \n return clamp(r, 0.0, 1.0); \n #endif \n /* SpreadType::CLAMP */
203 float r = get_position( vTexCoord, vStart, vEnd );
204 r = recalculate( r + gradient_offset );
205 vec4 color = mix( start_color, end_color, r );
206 gl_FragColor = color;
210 Property::Value GetStartValue( const Property::Map& map, Property::Index index, const char* const name )
212 // Get start value of animation parameter
213 Property::Value* res = map.Find( index, name );
216 Property::Map* s_map = res->GetMap();
219 res = s_map->Find( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::START, START_VALUE_NAME );
220 DALI_ASSERT_ALWAYS( res && "Start value is not setup in Property::Map" );
225 DALI_ASSERT_ALWAYS( !"Start value is not setup even default" );
230 VisualFactoryCache::ShaderType GetShaderType( Toolkit::DevelAnimatedGradientVisual::GradientType::Type grad, Toolkit::DevelAnimatedGradientVisual::UnitType::Type unit, Toolkit::DevelAnimatedGradientVisual::SpreadType::Type spread )
232 return static_cast<VisualFactoryCache::ShaderType>(
233 VisualFactoryCache::ANIMATED_GRADIENT_SHADER_LINEAR_BOUNDING_REFLECT +
234 static_cast<unsigned int>( grad ) * 6 + // 6 is the number of UnitType * SpreadType
235 static_cast<unsigned int>( unit ) * 3 + // 3 is the number of SpreadType.
236 static_cast<unsigned int>( spread )
240 } // unnamed namespace
242 AnimatedGradientVisualPtr AnimatedGradientVisual::New( VisualFactoryCache& factoryCache, const Property::Map& properties )
244 AnimatedGradientVisualPtr animatedGradientVisualPtr( new AnimatedGradientVisual( factoryCache ) );
245 animatedGradientVisualPtr->SetProperties( properties );
246 return animatedGradientVisualPtr;
249 AnimatedGradientVisual::AnimatedGradientVisual( VisualFactoryCache& factoryCache )
250 : Visual::Base( factoryCache, Visual::FittingMode::FILL )
255 AnimatedGradientVisual::~AnimatedGradientVisual()
260 void AnimatedGradientVisual::SetupDefaultValue()
262 mGradientType = DEFAULT_GRADIENT_TYPE;
263 mUnitType = DEFAULT_UNIT_TYPE;
264 mSpreadType = DEFAULT_SPREAD_TYPE;
266 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::START_POSITION] = Vector2( DEFAULT_START_POSITION );
267 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::START_COLOR] = Vector4( DEFAULT_START_COLOR );
268 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::END_POSITION] = Vector2( DEFAULT_END_POSITION );
269 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::END_COLOR] = Vector4( DEFAULT_END_COLOR );
270 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_CENTER] = Vector2( DEFAULT_ROTATE_CENTER );
271 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT] = DEFAULT_ROTATE_AMOUNT;
272 // Default Offset value is very special. unlimited animation from 0.0f to 2.0f
275 map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::START, 0.0f );
276 map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET, 2.0f );
277 map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT, -1 );
279 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::OFFSET] = map;
283 void AnimatedGradientVisual::DoSetProperties( const Property::Map& propertyMap )
286 Property::Value* gradientTypeValue = propertyMap.Find( Toolkit::DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, GRADIENT_TYPE_NAME );
287 Toolkit::DevelAnimatedGradientVisual::GradientType::Type gradientType = mGradientType;
288 if( gradientTypeValue )
290 Scripting::GetEnumerationProperty( *gradientTypeValue, GRADIENT_TYPE_TABLE, GRADIENT_TYPE_TABLE_COUNT, gradientType );
294 Property::Value* unitTypeValue = propertyMap.Find( Toolkit::DevelAnimatedGradientVisual::Property::UNIT_TYPE, UNIT_TYPE_NAME );
295 Toolkit::DevelAnimatedGradientVisual::UnitType::Type unitType = mUnitType;
298 Scripting::GetEnumerationProperty( *unitTypeValue, UNIT_TYPE_TABLE, UNIT_TYPE_TABLE_COUNT, unitType );
302 Property::Value* spreadTypeValue = propertyMap.Find( Toolkit::DevelAnimatedGradientVisual::Property::SPREAD_TYPE, SPREAD_TYPE_NAME );
303 Toolkit::DevelAnimatedGradientVisual::SpreadType::Type spreadType = mSpreadType;
304 if( spreadTypeValue )
306 Scripting::GetEnumerationProperty( *spreadTypeValue, SPREAD_TYPE_TABLE, SPREAD_TYPE_TABLE_COUNT, spreadType );
309 mGradientType = gradientType;
310 mUnitType = unitType;
311 mSpreadType = spreadType;
313 SetupGradientAnimationData(propertyMap);
316 void AnimatedGradientVisual::SetupGradientAnimationData( const Property::Map& propertyMap )
318 mGradientAnimationDataList.Clear(); // Clear Transition Information. All animation will deleted safely
320 static Property::Map propertyNameMap;
321 static Property::Map propertyUniformNameMap;
322 if( propertyNameMap.Empty() )
324 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::START_POSITION] = START_POSITION_NAME;
325 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::START_COLOR ] = START_COLOR_NAME;
326 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::END_POSITION ] = END_POSITION_NAME;
327 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::END_COLOR ] = END_COLOR_NAME;
328 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_CENTER ] = ROTATE_CENTER_NAME;
329 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT ] = ROTATE_AMOUNT_NAME;
330 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::OFFSET ] = OFFSET_NAME;
332 if( propertyUniformNameMap.Empty() )
334 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::START_POSITION] = UNIFORM_START_POINT_NAME;
335 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::START_COLOR ] = UNIFORM_START_COLOR_NAME;
336 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::END_POSITION ] = UNIFORM_END_POINT_NAME;
337 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::END_COLOR ] = UNIFORM_END_COLOR_NAME;
338 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_CENTER ] = UNIFORM_ROTATE_CENTER_NAME;
339 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT ] = UNIFORM_ROTATE_ANGLE_NAME;
340 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::OFFSET ] = UNIFORM_OFFSET_NAME;
343 Property::Map::SizeType map_index_end = propertyNameMap.Count();
344 for( Property::Map::SizeType map_index = 0; map_index < map_index_end; map_index++ )
346 KeyValuePair property_pair = propertyNameMap.GetKeyValue( map_index );
347 KeyValuePair uniform_pair = propertyUniformNameMap.GetKeyValue( map_index );
348 Property::Index index = property_pair.first.indexKey;
349 const std::string property_name = property_pair.second.Get< std::string >();
350 const std::string uniform_name = uniform_pair.second.Get< std::string >();
353 Property::Value default_value = mValueMap[index];
355 map["target"] = "background";
356 map["property"] = uniform_name;
358 Property::Value *value = propertyMap.Find( index, property_name );
361 value = &default_value;
366 mValueMap[index] = (*value);
372 bool auto_mirror = false;
373 std::string ease_str = "LINEAR";
374 Property::Map *map_value = value->GetMap();
377 auto getValueFromMap = [ &map_value ]( const Property::Index& index, const std::string& name, Property::Value& res ) -> void
379 Property::Value *sub_value = map_value->Find( index, name );
386 Property::Value value_start = DEFAULT_ANIMATION_START_VALUE;
387 Property::Value value_target = DEFAULT_ANIMATION_TARGET_VALUE;
388 Property::Value value_duration = DEFAULT_ANIMATION_DURATION;
389 Property::Value value_delay = DEFAULT_ANIMATION_DELAY;
390 Property::Value value_repeat = DEFAULT_ANIMATION_REPEAT;
391 Property::Value value_repeat_delay = DEFAULT_ANIMATION_REPEAT_DELAY;
393 getValueFromMap( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::START , START_VALUE_NAME , value_start );
394 getValueFromMap( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET , TARGET_VALUE_NAME , value_target );
395 getValueFromMap( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION , DURATION_NAME , value_duration );
396 getValueFromMap( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY , DELAY_NAME , value_delay );
397 getValueFromMap( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT , REPEAT_NAME , value_repeat );
398 getValueFromMap( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY, REPEAT_DELAY_NAME , value_repeat_delay );
400 Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::Type direction_type = DEFAULT_ANIMATION_DIRECTION_TYPE;
401 Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::Type motion_type = DEFAULT_ANIMATION_MOTION_TYPE;
402 Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::Type easing_type = DEFAULT_ANIMATION_EASING_TYPE;
404 Property::Value *direction_sub_value = map_value->Find( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, DIRECTION_TYPE_NAME );
405 if( direction_sub_value )
407 Scripting::GetEnumerationProperty( *direction_sub_value, DIRECTION_TYPE_TABLE, DIRECTION_TYPE_TABLE_COUNT, direction_type );
409 Property::Value *motion_sub_value = map_value->Find( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE, MOTION_TYPE_NAME );
410 if( motion_sub_value )
412 Scripting::GetEnumerationProperty( *motion_sub_value , MOTION_TYPE_TABLE , MOTION_TYPE_TABLE_COUNT , motion_type );
414 Property::Value *easing_sub_value = map_value->Find( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, EASING_TYPE_NAME );
415 if( easing_sub_value )
417 Scripting::GetEnumerationProperty( *easing_sub_value , EASING_TYPE_TABLE , EASING_TYPE_TABLE_COUNT , easing_type );
420 forward = ( direction_type == Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::FORWARD );
421 delay = value_delay.Get< float >();
422 loop_count = value_repeat.Get< int >();
423 auto_mirror = ( motion_type == Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::MIRROR );
425 switch( easing_type )
427 case Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR:
432 case Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN:
434 ease_str = "EASE_IN_SQUARE";
437 case Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::OUT:
439 ease_str = "EASE_OUT_SQUARE";
442 case Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN_OUT:
444 ease_str = "EASE_IN_OUT";
449 map["initialValue"] = forward ? value_start : value_target;
450 map["targetValue"] = forward ? value_target : value_start;
451 if( loop_count != 0 )
453 map["animator"] = Property::Map()
454 .Add( "alphaFunction", ease_str )
455 .Add( "timePeriod", Property::Map()
456 .Add( "delay", value_repeat_delay.Get< float >() )
457 .Add( "duration", value_duration.Get< float >() ) );
462 map["initialValue"] = *value;
463 map["targetValue"] = *value;
466 AnimatedGradientVisual::GradientAnimationData *animData = new AnimatedGradientVisual::GradientAnimationData();
467 animData->transition = Toolkit::TransitionData::New( map );
468 animData->index = index;
469 animData->loop_count = loop_count;
470 animData->delay = delay;
471 animData->forward = forward;
472 animData->auto_mirror = auto_mirror;
473 mGradientAnimationDataList.PushBack( animData );
477 void AnimatedGradientVisual::SetupAnimation()
479 for( auto&& elem : mGradientAnimationDataList )
481 Toolkit::TransitionData& transition = elem->transition;
482 Animation& animation = elem->animation;
483 int loop_count = elem->loop_count;
484 bool auto_mirror = elem->auto_mirror;
485 bool without_animation = ( loop_count == 0 );
487 const Internal::TransitionData& transitionData = Toolkit::GetImplementation( transition );
488 for( auto iter = transitionData.Begin(); iter != transitionData.End(); iter++ )
490 TransitionData::Animator *animator = (*iter);
491 AnimateProperty( animation, *animator );
493 if( animation && !without_animation )
497 animation.SetLooping( true );
499 else if( loop_count > 0 )
501 animation.SetLoopCount( loop_count );
505 animation.SetLoopingMode( Animation::LoopingMode::AUTO_REVERSE );
511 void AnimatedGradientVisual::PlayAnimation()
513 for( auto&& elem : mGradientAnimationDataList )
515 Animation& animation = elem->animation;
518 float delay = elem->delay;
521 animation.PlayAfter( delay );
523 else if( delay < 0.0f )
525 float progress = -delay / animation.GetDuration(); // (duration + repeat_duration)
528 int cur_loop = animation.GetLoopCount();
529 int decrease_loop = floor( progress ) + 1;
530 while( decrease_loop > progress )
534 progress -= decrease_loop;
537 animation.PlayFrom( progress );
541 cur_loop -= decrease_loop;
544 animation.SetLoopCount( cur_loop );
545 animation.PlayFrom( progress );
549 // animation done. make this animation finished safely.
550 animation.SetLoopCount( 1 );
551 animation.PlayFrom( 1.0f );
557 animation.PlayFrom( progress );
568 void AnimatedGradientVisual::StopAnimation()
570 for( auto&& elem : mGradientAnimationDataList )
572 Animation& animation = elem->animation;
580 void AnimatedGradientVisual::OnSetTransform()
582 if( mImpl->mRenderer )
584 mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
588 void AnimatedGradientVisual::DoSetOnStage( Actor& actor )
590 InitializeRenderer();
591 actor.AddRenderer( mImpl->mRenderer );
595 ResourceReady( Toolkit::Visual::ResourceStatus::READY );
598 void AnimatedGradientVisual::DoSetOffStage( Actor& actor )
600 DALI_ASSERT_DEBUG( (bool)mImpl->mRenderer && "There should always be a renderer whilst on stage");
603 actor.RemoveRenderer( mImpl->mRenderer );
604 mImpl->mRenderer.Reset();
607 void AnimatedGradientVisual::DoCreatePropertyMap( Property::Map& map ) const
610 map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::ANIMATED_GRADIENT );
612 //Create non-animated properties
613 map.Insert( Toolkit::DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, static_cast<int>(mGradientType) );
614 map.Insert( Toolkit::DevelAnimatedGradientVisual::Property::UNIT_TYPE , static_cast<int>(mUnitType) );
615 map.Insert( Toolkit::DevelAnimatedGradientVisual::Property::SPREAD_TYPE , static_cast<int>(mSpreadType) );
617 //Create animated properties. Get from transition for more realistic test. Not from animation cause Animation may not setuped
618 for( auto&& elem : mGradientAnimationDataList )
620 Toolkit::TransitionData& transition = elem->transition;
621 Property::Index index = elem->index;
622 int loop_count = elem->loop_count;
623 float delay = elem->delay;
624 bool forward = elem->forward;
625 bool auto_mirror = elem->auto_mirror;
627 const Internal::TransitionData& transitionData = Toolkit::GetImplementation( transition );
628 for( auto iter = transitionData.Begin(); iter != transitionData.End(); iter++ )
630 TransitionData::Animator *animator = (*iter);
631 if( animator->animate )
634 Property::Map animation_map;
635 Property::Value value_start = forward ? animator->initialValue : animator->targetValue;
636 Property::Value value_target = forward ? animator->targetValue : animator->initialValue;
637 Property::Value value_direction;
638 Property::Value value_duration = Property::Value( animator->timePeriodDuration );
639 Property::Value value_delay = Property::Value( delay );
640 Property::Value value_repeat = Property::Value( loop_count );
641 Property::Value value_repeat_delay = Property::Value( animator->timePeriodDelay );
642 Property::Value value_motion_type;
643 Property::Value value_easing_type;
647 value_direction = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::FORWARD );
651 value_direction = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::BACKWARD );
655 value_motion_type = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::MIRROR );
659 value_motion_type = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::LOOP );
661 switch( animator->alphaFunction.GetBuiltinFunction() )
663 case Dali::AlphaFunction::LINEAR:
665 value_easing_type = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR );
668 case Dali::AlphaFunction::EASE_IN_SQUARE:
670 value_easing_type = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN );
673 case Dali::AlphaFunction::EASE_OUT_SQUARE:
675 value_easing_type = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::OUT );
678 case Dali::AlphaFunction::EASE_IN_OUT:
680 value_easing_type = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN_OUT );
685 value_easing_type = Property::Value( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR );
689 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::START , value_start );
690 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET , value_target );
691 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION , value_direction );
692 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION , value_duration );
693 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY , value_delay );
694 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT , value_repeat );
695 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY, value_repeat_delay );
696 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE , value_motion_type );
697 animation_map.Insert( Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE , value_easing_type );
699 map.Insert( index, animation_map );
704 map.Insert( index, animator->targetValue );
710 void AnimatedGradientVisual::DoCreateInstancePropertyMap( Property::Map& map ) const
715 Shader AnimatedGradientVisual::CreateShader()
721 std::string tagSpread;
724 case Toolkit::DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX:
726 tagUnit = "UNIT_TYPE_BOUNDING_BOX";
729 case Toolkit::DevelAnimatedGradientVisual::UnitType::USER_SPACE:
731 tagUnit = "UNIT_TYPE_USER";
735 switch( mGradientType )
737 case Toolkit::DevelAnimatedGradientVisual::GradientType::LINEAR:
739 tagGrad = "GRADIENT_TYPE_LINEAR";
742 case Toolkit::DevelAnimatedGradientVisual::GradientType::RADIAL:
744 tagGrad = "GRADIENT_TYPE_RADIAL";
748 switch( mSpreadType )
750 case Toolkit::DevelAnimatedGradientVisual::SpreadType::REFLECT:
752 tagSpread = "SPREAD_TYPE_REFLECT";
755 case Toolkit::DevelAnimatedGradientVisual::SpreadType::REPEAT:
757 tagSpread = "SPREAD_TYPE_REPEAT";
760 case Toolkit::DevelAnimatedGradientVisual::SpreadType::CLAMP:
762 tagSpread = "SPREAD_TYPE_CLAMP";
770 vert = "#define " + tagUnit + "\n"
771 + BASIC_VERTEX_SHADER;
772 frag = "#define " + tagGrad + "\n"
773 + "#define " + tagSpread + "\n"
774 + BASIC_FRAGMENT_SHADER;
776 shader = Shader::New( vert, frag );
780 void AnimatedGradientVisual::InitializeRenderer()
782 Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY );
783 VisualFactoryCache::ShaderType shaderType = GetShaderType( mGradientType, mUnitType, mSpreadType );
784 Shader shader = mFactoryCache.GetShader( shaderType );
787 shader = CreateShader();
788 mFactoryCache.SaveShader( shaderType, shader );
791 mImpl->mRenderer = Renderer::New( geometry, shader );
793 mImpl->mRenderer.RegisterProperty( UNIFORM_START_POINT_NAME , GetStartValue( mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::START_POSITION, START_POSITION_NAME ) );
794 mImpl->mRenderer.RegisterProperty( UNIFORM_START_COLOR_NAME , GetStartValue( mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::START_COLOR , START_COLOR_NAME ) );
795 mImpl->mRenderer.RegisterProperty( UNIFORM_END_POINT_NAME , GetStartValue( mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::END_POSITION , END_POSITION_NAME ) );
796 mImpl->mRenderer.RegisterProperty( UNIFORM_END_COLOR_NAME , GetStartValue( mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::END_COLOR , END_COLOR_NAME ) );
797 mImpl->mRenderer.RegisterProperty( UNIFORM_ROTATE_CENTER_NAME, GetStartValue( mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_CENTER , ROTATE_CENTER_NAME ) );
798 mImpl->mRenderer.RegisterProperty( UNIFORM_ROTATE_ANGLE_NAME , GetStartValue( mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT , ROTATE_AMOUNT_NAME ) );
799 mImpl->mRenderer.RegisterProperty( UNIFORM_OFFSET_NAME , GetStartValue( mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::OFFSET , OFFSET_NAME ) );
801 //Register transform properties
802 mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
805 }//namespace Internal