2 * Copyright (c) 2021 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/devel-api/visuals/visual-properties-devel.h>
23 #include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
24 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
25 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
26 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
27 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
28 #include <dali-toolkit/public-api/visuals/visual-properties.h>
38 DALI_ENUM_TO_STRING_TABLE_BEGIN(GRADIENT_TYPE)
39 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::GradientType, LINEAR)
40 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::GradientType, RADIAL)
41 DALI_ENUM_TO_STRING_TABLE_END(GRADIENT_TYPE)
43 DALI_ENUM_TO_STRING_TABLE_BEGIN(UNIT_TYPE)
44 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::UnitType, OBJECT_BOUNDING_BOX)
45 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::UnitType, USER_SPACE)
46 DALI_ENUM_TO_STRING_TABLE_END(UNIT_TYPE)
48 DALI_ENUM_TO_STRING_TABLE_BEGIN(SPREAD_TYPE)
49 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::SpreadType, REFLECT)
50 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::SpreadType, REPEAT)
51 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::SpreadType, CLAMP)
52 DALI_ENUM_TO_STRING_TABLE_END(SPREAD_TYPE)
54 DALI_ENUM_TO_STRING_TABLE_BEGIN(DIRECTION_TYPE)
55 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType, FORWARD)
56 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType, BACKWARD)
57 DALI_ENUM_TO_STRING_TABLE_END(DIRECTION_TYPE)
59 DALI_ENUM_TO_STRING_TABLE_BEGIN(MOTION_TYPE)
60 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType, LOOP)
61 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType, MIRROR)
62 DALI_ENUM_TO_STRING_TABLE_END(MOTION_TYPE)
64 DALI_ENUM_TO_STRING_TABLE_BEGIN(EASING_TYPE)
65 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType, LINEAR)
66 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType, IN)
67 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType, OUT)
68 DALI_ENUM_TO_STRING_WITH_SCOPE(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType, IN_OUT)
69 DALI_ENUM_TO_STRING_TABLE_END(EASING_TYPE)
71 // Default values of each properties
72 const Toolkit::DevelAnimatedGradientVisual::GradientType::Type DEFAULT_GRADIENT_TYPE = Toolkit::DevelAnimatedGradientVisual::GradientType::LINEAR;
73 const Toolkit::DevelAnimatedGradientVisual::UnitType::Type DEFAULT_UNIT_TYPE = Toolkit::DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX;
74 const Toolkit::DevelAnimatedGradientVisual::SpreadType::Type DEFAULT_SPREAD_TYPE = Toolkit::DevelAnimatedGradientVisual::SpreadType::REFLECT;
76 const float DEFAULT_START_POSITION[] = {-0.5f, 0.0f};
77 const float DEFAULT_START_COLOR[] = {143.0f / 255.0f, 170.0f / 255.0f, 220.0f / 255.0f, 255.0f / 255.0f};
78 const float DEFAULT_END_POSITION[] = {0.5f, 0.0f};
79 const float DEFAULT_END_COLOR[] = {255.0f / 255.0f, 163.0f / 255.0f, 163.0f / 255.0f, 255.0f / 255.0f};
80 const float DEFAULT_ROTATE_CENTER[] = {0.0f, 0.0f};
81 const float DEFAULT_ROTATE_AMOUNT = 0.0f;
83 const float DEFAULT_ANIMATION_START_VALUE = 0.0f;
84 const float DEFAULT_ANIMATION_TARGET_VALUE = 0.0f;
85 const float DEFAULT_ANIMATION_DURATION = 3.0f;
86 const float DEFAULT_ANIMATION_DELAY = 0.0f;
87 const int DEFAULT_ANIMATION_REPEAT = 0;
88 const float DEFAULT_ANIMATION_REPEAT_DELAY = 0.0f;
90 const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::Type DEFAULT_ANIMATION_DIRECTION_TYPE = Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::FORWARD;
91 const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::Type DEFAULT_ANIMATION_MOTION_TYPE = Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::LOOP;
92 const Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::Type DEFAULT_ANIMATION_EASING_TYPE = Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR;
94 Property::Value GetStartValue(const Property::Map& map, Property::Index index, const char* const name)
96 // Get start value of animation parameter
97 Property::Value* res = map.Find(index, name);
100 Property::Map* s_map = res->GetMap();
103 res = s_map->Find(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::START, START_VALUE_NAME);
104 DALI_ASSERT_ALWAYS(res && "Start value is not setup in Property::Map");
109 DALI_ASSERT_ALWAYS(!"Start value is not setup even default");
114 VisualFactoryCache::ShaderType GetShaderType(Toolkit::DevelAnimatedGradientVisual::GradientType::Type grad, Toolkit::DevelAnimatedGradientVisual::UnitType::Type unit, Toolkit::DevelAnimatedGradientVisual::SpreadType::Type spread)
116 return static_cast<VisualFactoryCache::ShaderType>(
117 VisualFactoryCache::ANIMATED_GRADIENT_SHADER_LINEAR_BOUNDING_REFLECT +
118 static_cast<unsigned int>(grad) * 6 + // 6 is the number of UnitType * SpreadType
119 static_cast<unsigned int>(unit) * 3 + // 3 is the number of SpreadType.
120 static_cast<unsigned int>(spread));
123 } // unnamed namespace
125 AnimatedGradientVisualPtr AnimatedGradientVisual::New(VisualFactoryCache& factoryCache, const Property::Map& properties)
127 AnimatedGradientVisualPtr animatedGradientVisualPtr(new AnimatedGradientVisual(factoryCache));
128 animatedGradientVisualPtr->SetProperties(properties);
129 animatedGradientVisualPtr->Initialize();
130 return animatedGradientVisualPtr;
133 AnimatedGradientVisual::AnimatedGradientVisual(VisualFactoryCache& factoryCache)
134 : Visual::Base(factoryCache, Visual::FittingMode::FILL, static_cast<Toolkit::Visual::Type>(Toolkit::DevelVisual::ANIMATED_GRADIENT))
139 AnimatedGradientVisual::~AnimatedGradientVisual()
143 void AnimatedGradientVisual::SetupDefaultValue()
145 mGradientType = DEFAULT_GRADIENT_TYPE;
146 mUnitType = DEFAULT_UNIT_TYPE;
147 mSpreadType = DEFAULT_SPREAD_TYPE;
149 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::START_POSITION] = Vector2(DEFAULT_START_POSITION);
150 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::START_COLOR] = Vector4(DEFAULT_START_COLOR);
151 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::END_POSITION] = Vector2(DEFAULT_END_POSITION);
152 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::END_COLOR] = Vector4(DEFAULT_END_COLOR);
153 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_CENTER] = Vector2(DEFAULT_ROTATE_CENTER);
154 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT] = DEFAULT_ROTATE_AMOUNT;
155 // Default Offset value is very special. unlimited animation from 0.0f to 2.0f
158 map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::START, 0.0f);
159 map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET, 2.0f);
160 map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT, -1);
162 mValueMap[Toolkit::DevelAnimatedGradientVisual::Property::OFFSET] = map;
166 void AnimatedGradientVisual::DoSetProperties(const Property::Map& propertyMap)
169 Property::Value* gradientTypeValue = propertyMap.Find(Toolkit::DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, GRADIENT_TYPE_NAME);
170 Toolkit::DevelAnimatedGradientVisual::GradientType::Type gradientType = mGradientType;
171 if(gradientTypeValue)
173 Scripting::GetEnumerationProperty(*gradientTypeValue, GRADIENT_TYPE_TABLE, GRADIENT_TYPE_TABLE_COUNT, gradientType);
177 Property::Value* unitTypeValue = propertyMap.Find(Toolkit::DevelAnimatedGradientVisual::Property::UNIT_TYPE, UNIT_TYPE_NAME);
178 Toolkit::DevelAnimatedGradientVisual::UnitType::Type unitType = mUnitType;
181 Scripting::GetEnumerationProperty(*unitTypeValue, UNIT_TYPE_TABLE, UNIT_TYPE_TABLE_COUNT, unitType);
185 Property::Value* spreadTypeValue = propertyMap.Find(Toolkit::DevelAnimatedGradientVisual::Property::SPREAD_TYPE, SPREAD_TYPE_NAME);
186 Toolkit::DevelAnimatedGradientVisual::SpreadType::Type spreadType = mSpreadType;
189 Scripting::GetEnumerationProperty(*spreadTypeValue, SPREAD_TYPE_TABLE, SPREAD_TYPE_TABLE_COUNT, spreadType);
192 mGradientType = gradientType;
193 mUnitType = unitType;
194 mSpreadType = spreadType;
196 SetupGradientAnimationData(propertyMap);
199 void AnimatedGradientVisual::SetupGradientAnimationData(const Property::Map& propertyMap)
201 mGradientAnimationDataList.Clear(); // Clear Transition Information. All animation will deleted safely
203 static Property::Map propertyNameMap;
204 static Property::Map propertyUniformNameMap;
205 if(propertyNameMap.Empty())
207 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::START_POSITION] = START_POSITION_NAME;
208 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::START_COLOR] = START_COLOR_NAME;
209 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::END_POSITION] = END_POSITION_NAME;
210 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::END_COLOR] = END_COLOR_NAME;
211 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_CENTER] = ROTATE_CENTER_NAME;
212 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT] = ROTATE_AMOUNT_NAME;
213 propertyNameMap[Toolkit::DevelAnimatedGradientVisual::Property::OFFSET] = OFFSET_NAME;
215 if(propertyUniformNameMap.Empty())
217 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::START_POSITION] = UNIFORM_START_POINT_NAME;
218 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::START_COLOR] = UNIFORM_START_COLOR_NAME;
219 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::END_POSITION] = UNIFORM_END_POINT_NAME;
220 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::END_COLOR] = UNIFORM_END_COLOR_NAME;
221 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_CENTER] = UNIFORM_ROTATE_CENTER_NAME;
222 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT] = UNIFORM_ROTATE_ANGLE_NAME;
223 propertyUniformNameMap[Toolkit::DevelAnimatedGradientVisual::Property::OFFSET] = UNIFORM_OFFSET_NAME;
226 Property::Map::SizeType map_index_end = propertyNameMap.Count();
227 for(Property::Map::SizeType map_index = 0; map_index < map_index_end; map_index++)
229 KeyValuePair property_pair = propertyNameMap.GetKeyValue(map_index);
230 KeyValuePair uniform_pair = propertyUniformNameMap.GetKeyValue(map_index);
231 Property::Index index = property_pair.first.indexKey;
232 const std::string property_name = property_pair.second.Get<std::string>();
233 const std::string uniform_name = uniform_pair.second.Get<std::string>();
236 Property::Value default_value = mValueMap[index];
238 map["target"] = "background";
239 map["property"] = uniform_name;
241 Property::Value* value = propertyMap.Find(index, property_name);
244 value = &default_value;
249 mValueMap[index] = (*value);
255 bool auto_mirror = false;
256 std::string ease_str = "LINEAR";
257 Property::Map* map_value = value->GetMap();
260 auto getValueFromMap = [&map_value](const Property::Index& index, const std::string& name, Property::Value& res) -> void {
261 Property::Value* sub_value = map_value->Find(index, name);
268 Property::Value value_start = DEFAULT_ANIMATION_START_VALUE;
269 Property::Value value_target = DEFAULT_ANIMATION_TARGET_VALUE;
270 Property::Value value_duration = DEFAULT_ANIMATION_DURATION;
271 Property::Value value_delay = DEFAULT_ANIMATION_DELAY;
272 Property::Value value_repeat = DEFAULT_ANIMATION_REPEAT;
273 Property::Value value_repeat_delay = DEFAULT_ANIMATION_REPEAT_DELAY;
275 getValueFromMap(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::START, START_VALUE_NAME, value_start);
276 getValueFromMap(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET, TARGET_VALUE_NAME, value_target);
277 getValueFromMap(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION, DURATION_NAME, value_duration);
278 getValueFromMap(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY, DELAY_NAME, value_delay);
279 getValueFromMap(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT, REPEAT_NAME, value_repeat);
280 getValueFromMap(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY, REPEAT_DELAY_NAME, value_repeat_delay);
282 Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::Type direction_type = DEFAULT_ANIMATION_DIRECTION_TYPE;
283 Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::Type motion_type = DEFAULT_ANIMATION_MOTION_TYPE;
284 Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::Type easing_type = DEFAULT_ANIMATION_EASING_TYPE;
286 Property::Value* direction_sub_value = map_value->Find(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, DIRECTION_TYPE_NAME);
287 if(direction_sub_value)
289 Scripting::GetEnumerationProperty(*direction_sub_value, DIRECTION_TYPE_TABLE, DIRECTION_TYPE_TABLE_COUNT, direction_type);
291 Property::Value* motion_sub_value = map_value->Find(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE, MOTION_TYPE_NAME);
294 Scripting::GetEnumerationProperty(*motion_sub_value, MOTION_TYPE_TABLE, MOTION_TYPE_TABLE_COUNT, motion_type);
296 Property::Value* easing_sub_value = map_value->Find(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, EASING_TYPE_NAME);
299 Scripting::GetEnumerationProperty(*easing_sub_value, EASING_TYPE_TABLE, EASING_TYPE_TABLE_COUNT, easing_type);
302 forward = (direction_type == Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::FORWARD);
303 delay = value_delay.Get<float>();
304 loop_count = value_repeat.Get<int>();
305 auto_mirror = (motion_type == Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::MIRROR);
309 case Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR:
314 case Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN:
316 ease_str = "EASE_IN_SQUARE";
319 case Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::OUT:
321 ease_str = "EASE_OUT_SQUARE";
324 case Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN_OUT:
326 ease_str = "EASE_IN_OUT";
331 map["initialValue"] = forward ? value_start : value_target;
332 map["targetValue"] = forward ? value_target : value_start;
335 map["animator"] = Property::Map()
336 .Add("alphaFunction", ease_str)
337 .Add("timePeriod", Property::Map().Add("delay", value_repeat_delay.Get<float>()).Add("duration", value_duration.Get<float>()));
342 map["initialValue"] = *value;
343 map["targetValue"] = *value;
346 AnimatedGradientVisual::GradientAnimationData* animData = new AnimatedGradientVisual::GradientAnimationData();
347 animData->transition = Toolkit::TransitionData::New(map);
348 animData->index = index;
349 animData->loop_count = loop_count;
350 animData->delay = delay;
351 animData->forward = forward;
352 animData->auto_mirror = auto_mirror;
353 mGradientAnimationDataList.PushBack(animData);
357 void AnimatedGradientVisual::SetupAnimation()
359 for(auto&& elem : mGradientAnimationDataList)
361 Toolkit::TransitionData& transition = elem->transition;
362 Animation& animation = elem->animation;
363 int loop_count = elem->loop_count;
364 bool auto_mirror = elem->auto_mirror;
365 bool without_animation = (loop_count == 0);
367 const Internal::TransitionData& transitionData = Toolkit::GetImplementation(transition);
368 for(auto iter = transitionData.Begin(); iter != transitionData.End(); iter++)
370 TransitionData::Animator* animator = (*iter);
371 AnimateProperty(animation, *animator);
373 if(animation && !without_animation)
377 animation.SetLooping(true);
379 else if(loop_count > 0)
381 animation.SetLoopCount(loop_count);
385 animation.SetLoopingMode(Animation::LoopingMode::AUTO_REVERSE);
391 void AnimatedGradientVisual::PlayAnimation()
393 for(auto&& elem : mGradientAnimationDataList)
395 Animation& animation = elem->animation;
398 float delay = elem->delay;
401 animation.PlayAfter(delay);
403 else if(delay < 0.0f)
405 float progress = -delay / animation.GetDuration(); // (duration + repeat_duration)
408 int cur_loop = animation.GetLoopCount();
409 int decrease_loop = floor(progress) + 1;
410 while(decrease_loop > progress)
414 progress -= decrease_loop;
417 animation.PlayFrom(progress);
421 cur_loop -= decrease_loop;
424 animation.SetLoopCount(cur_loop);
425 animation.PlayFrom(progress);
429 // animation done. make this animation finished safely.
430 animation.SetLoopCount(1);
431 animation.PlayFrom(1.0f);
437 animation.PlayFrom(progress);
448 void AnimatedGradientVisual::StopAnimation()
450 for(auto&& elem : mGradientAnimationDataList)
452 Animation& animation = elem->animation;
460 void AnimatedGradientVisual::OnSetTransform()
464 mImpl->mTransform.RegisterUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
468 void AnimatedGradientVisual::DoSetOnScene(Actor& actor)
470 actor.AddRenderer(mImpl->mRenderer);
474 ResourceReady(Toolkit::Visual::ResourceStatus::READY);
477 void AnimatedGradientVisual::DoSetOffScene(Actor& actor)
479 DALI_ASSERT_DEBUG((bool)mImpl->mRenderer && "There should always be a renderer whilst on stage");
482 actor.RemoveRenderer(mImpl->mRenderer);
485 void AnimatedGradientVisual::DoCreatePropertyMap(Property::Map& map) const
488 map.Insert(Toolkit::Visual::Property::TYPE, Toolkit::DevelVisual::ANIMATED_GRADIENT);
490 //Create non-animated properties
491 map.Insert(Toolkit::DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, static_cast<int>(mGradientType));
492 map.Insert(Toolkit::DevelAnimatedGradientVisual::Property::UNIT_TYPE, static_cast<int>(mUnitType));
493 map.Insert(Toolkit::DevelAnimatedGradientVisual::Property::SPREAD_TYPE, static_cast<int>(mSpreadType));
495 //Create animated properties. Get from transition for more realistic test. Not from animation cause Animation may not setuped
496 for(auto&& elem : mGradientAnimationDataList)
498 Toolkit::TransitionData& transition = elem->transition;
499 Property::Index index = elem->index;
500 int loop_count = elem->loop_count;
501 float delay = elem->delay;
502 bool forward = elem->forward;
503 bool auto_mirror = elem->auto_mirror;
505 const Internal::TransitionData& transitionData = Toolkit::GetImplementation(transition);
506 for(auto iter = transitionData.Begin(); iter != transitionData.End(); iter++)
508 TransitionData::Animator* animator = (*iter);
509 if(animator->animate)
512 Property::Map animation_map;
513 Property::Value value_start = forward ? animator->initialValue : animator->targetValue;
514 Property::Value value_target = forward ? animator->targetValue : animator->initialValue;
515 Property::Value value_direction;
516 Property::Value value_duration = Property::Value(animator->timePeriodDuration);
517 Property::Value value_delay = Property::Value(delay);
518 Property::Value value_repeat = Property::Value(loop_count);
519 Property::Value value_repeat_delay = Property::Value(animator->timePeriodDelay);
520 Property::Value value_motion_type;
521 Property::Value value_easing_type;
525 value_direction = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::FORWARD);
529 value_direction = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::DirectionType::BACKWARD);
533 value_motion_type = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::MIRROR);
537 value_motion_type = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::MotionType::LOOP);
539 switch(animator->alphaFunction.GetBuiltinFunction())
541 case Dali::AlphaFunction::LINEAR:
543 value_easing_type = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR);
546 case Dali::AlphaFunction::EASE_IN_SQUARE:
548 value_easing_type = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN);
551 case Dali::AlphaFunction::EASE_OUT_SQUARE:
553 value_easing_type = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::OUT);
556 case Dali::AlphaFunction::EASE_IN_OUT:
558 value_easing_type = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN_OUT);
563 value_easing_type = Property::Value(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR);
567 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::START, value_start);
568 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET, value_target);
569 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, value_direction);
570 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION, value_duration);
571 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY, value_delay);
572 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT, value_repeat);
573 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY, value_repeat_delay);
574 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE, value_motion_type);
575 animation_map.Insert(Toolkit::DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, value_easing_type);
577 map.Insert(index, animation_map);
582 map.Insert(index, animator->targetValue);
588 void AnimatedGradientVisual::DoCreateInstancePropertyMap(Property::Map& map) const
592 Shader AnimatedGradientVisual::CreateShader()
598 std::string tagSpread;
601 case Toolkit::DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX:
603 tagUnit = "UNIT_TYPE_BOUNDING_BOX";
606 case Toolkit::DevelAnimatedGradientVisual::UnitType::USER_SPACE:
608 tagUnit = "UNIT_TYPE_USER";
612 switch(mGradientType)
614 case Toolkit::DevelAnimatedGradientVisual::GradientType::LINEAR:
616 tagGrad = "GRADIENT_TYPE_LINEAR";
619 case Toolkit::DevelAnimatedGradientVisual::GradientType::RADIAL:
621 tagGrad = "GRADIENT_TYPE_RADIAL";
627 case Toolkit::DevelAnimatedGradientVisual::SpreadType::REFLECT:
629 tagSpread = "SPREAD_TYPE_REFLECT";
632 case Toolkit::DevelAnimatedGradientVisual::SpreadType::REPEAT:
634 tagSpread = "SPREAD_TYPE_REPEAT";
637 case Toolkit::DevelAnimatedGradientVisual::SpreadType::CLAMP:
639 tagSpread = "SPREAD_TYPE_CLAMP";
647 vert = "#define " + tagUnit + "\n" + SHADER_ANIMATED_GRADIENT_VISUAL_SHADER_VERT.data();
648 frag = "#define " + tagGrad + "\n" + "#define " + tagSpread + "\n" + SHADER_ANIMATED_GRADIENT_VISUAL_SHADER_FRAG.data();
650 shader = Shader::New(vert, frag);
654 void AnimatedGradientVisual::OnInitialize()
656 Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY);
657 VisualFactoryCache::ShaderType shaderType = GetShaderType(mGradientType, mUnitType, mSpreadType);
658 Shader shader = mFactoryCache.GetShader(shaderType);
661 shader = CreateShader();
662 mFactoryCache.SaveShader(shaderType, shader);
665 mImpl->mRenderer = Renderer::New(geometry, shader);
667 mImpl->mRenderer.RegisterProperty(UNIFORM_START_POINT_NAME, GetStartValue(mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::START_POSITION, START_POSITION_NAME));
668 mImpl->mRenderer.RegisterProperty(UNIFORM_START_COLOR_NAME, GetStartValue(mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::START_COLOR, START_COLOR_NAME));
669 mImpl->mRenderer.RegisterProperty(UNIFORM_END_POINT_NAME, GetStartValue(mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::END_POSITION, END_POSITION_NAME));
670 mImpl->mRenderer.RegisterProperty(UNIFORM_END_COLOR_NAME, GetStartValue(mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::END_COLOR, END_COLOR_NAME));
671 mImpl->mRenderer.RegisterProperty(UNIFORM_ROTATE_CENTER_NAME, GetStartValue(mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_CENTER, ROTATE_CENTER_NAME));
672 mImpl->mRenderer.RegisterProperty(UNIFORM_ROTATE_ANGLE_NAME, GetStartValue(mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT, ROTATE_AMOUNT_NAME));
673 mImpl->mRenderer.RegisterProperty(UNIFORM_OFFSET_NAME, GetStartValue(mValueMap, Toolkit::DevelAnimatedGradientVisual::Property::OFFSET, OFFSET_NAME));
675 //Register transform properties
676 mImpl->mTransform.RegisterUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT);
679 } //namespace Internal
681 } //namespace Toolkit