X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fbuilder%2Fbuilder-animations.cpp;h=980fc90748839065e5ee712fb709d67e7e3b1f95;hp=82a0669c572c1de1131c37fe0b56705c86f6c3dc;hb=f3da11c2818c6d17706fbb2417f21b602b3190f5;hpb=af74001e7e61033e86323da5ad079ccbc310680a diff --git a/dali-toolkit/internal/builder/builder-animations.cpp b/dali-toolkit/internal/builder/builder-animations.cpp index 82a0669..980fc90 100644 --- a/dali-toolkit/internal/builder/builder-animations.cpp +++ b/dali-toolkit/internal/builder/builder-animations.cpp @@ -1,20 +1,23 @@ -// -// Copyright (c) 2014 Samsung Electronics Co., Ltd. -// -// Licensed under the Flora License, Version 1.0 (the License); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://floralicense.org/license/ -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an AS IS BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ // EXTERNAL INCLUDES +#include +#include #include // INTERNAL INCLUDES @@ -95,7 +98,6 @@ Property::Value GetPropertyValue( const Property::Type& propType, const TreeNode default: { DALI_ASSERT_ALWAYS( !"Property type incorrect" ); - return Property::Value(); } } } @@ -108,20 +110,20 @@ AlphaFunction GetAlphaFunction( const std::string& alphaFunction ) if( 0 == alphaFunctionLut.size() ) { // coding convention is uppercase enums - alphaFunctionLut["DEFAULT"] = Dali::AlphaFunctions::Default; - alphaFunctionLut["LINEAR"] = Dali::AlphaFunctions::Linear; - alphaFunctionLut["REVERSE"] = Dali::AlphaFunctions::Reverse; - alphaFunctionLut["EASE_IN"] = Dali::AlphaFunctions::EaseIn; - alphaFunctionLut["EASE_OUT"] = Dali::AlphaFunctions::EaseOut; - alphaFunctionLut["EASE_IN_OUT"] = Dali::AlphaFunctions::EaseInOut; - alphaFunctionLut["EASE_IN_SINE"] = Dali::AlphaFunctions::EaseInSine; - alphaFunctionLut["EASE_OUT_SINE"] = Dali::AlphaFunctions::EaseOutSine; - alphaFunctionLut["EASE_IN_OUT_SINE"]= Dali::AlphaFunctions::EaseInOutSine; - alphaFunctionLut["BOUNCE"] = Dali::AlphaFunctions::Bounce; - alphaFunctionLut["BOUNCE_BACK"] = Dali::AlphaFunctions::BounceBack; - alphaFunctionLut["EASE_OUT_BACK"] = Dali::AlphaFunctions::EaseOutBack; - alphaFunctionLut["SIN"] = Dali::AlphaFunctions::Sin; - alphaFunctionLut["SIN2X"] = Dali::AlphaFunctions::Sin; + alphaFunctionLut["DEFAULT"] = AlphaFunction(AlphaFunction::DEFAULT); + alphaFunctionLut["LINEAR"] = AlphaFunction(AlphaFunction::LINEAR); + alphaFunctionLut["REVERSE"] = AlphaFunction(AlphaFunction::REVERSE); + alphaFunctionLut["EASE_IN_SQUARE"] = AlphaFunction(AlphaFunction::EASE_IN_SQUARE); + alphaFunctionLut["EASE_OUT_SQUARE"] = AlphaFunction(AlphaFunction::EASE_OUT_SQUARE); + alphaFunctionLut["EASE_IN"] = AlphaFunction(AlphaFunction::EASE_IN); + alphaFunctionLut["EASE_OUT"] = AlphaFunction(AlphaFunction::EASE_OUT); + alphaFunctionLut["EASE_IN_OUT"] = AlphaFunction(AlphaFunction::EASE_IN_OUT); + alphaFunctionLut["EASE_IN_SINE"] = AlphaFunction(AlphaFunction::EASE_IN_SINE); + alphaFunctionLut["EASE_OUT_SINE"] = AlphaFunction(AlphaFunction::EASE_OUT_SINE); + alphaFunctionLut["EASE_IN_OUT_SINE"] = AlphaFunction(AlphaFunction::EASE_IN_OUT_SINE); + alphaFunctionLut["BOUNCE"] = AlphaFunction(AlphaFunction::BOUNCE); + alphaFunctionLut["SIN"] = AlphaFunction(AlphaFunction::SIN); + alphaFunctionLut["EASE_OUT_BACK"] = AlphaFunction(AlphaFunction::EASE_OUT_BACK); } const AlphaFunctionLut::const_iterator iter( alphaFunctionLut.find( alphaFunction ) ); @@ -132,8 +134,8 @@ AlphaFunction GetAlphaFunction( const std::string& alphaFunction ) } else { - DALI_ASSERT_ALWAYS( iter != alphaFunctionLut.end() && "Unknown Anchor Constant" ); - return Dali::AlphaFunctions::Default; + DALI_ASSERT_ALWAYS( iter != alphaFunctionLut.end() && "Unknown Alpha Constant" ); + return Dali::AlphaFunction::DEFAULT; } } @@ -149,7 +151,7 @@ namespace Toolkit namespace Internal { -Animation CreateAnimation( const TreeNode& child, const Replacement& constant, Dali::Actor searchRoot ) +Animation CreateAnimation( const TreeNode& child, const Replacement& constant, Dali::Actor searchRoot, Builder* const builder ) { float durationSum = 0.f; @@ -157,24 +159,20 @@ Animation CreateAnimation( const TreeNode& child, const Replacement& constant, D Animation animation( Animation::New( 0.f ) ); - // duration needs to be set before AnimateTo calls for correct operation when AnimateTo has no "time-period". + // duration needs to be set before AnimateTo calls for correct operation when AnimateTo has no "timePeriod". OptionalFloat duration = constant.IsFloat( IsChild(child, "duration" ) ); if( duration ) { animation.SetDuration( *duration ); } - else - { - animation.SetDuration( durationSum ); - } if( OptionalBoolean looping = constant.IsBoolean( IsChild(child, "loop" ) ) ) { animation.SetLooping( *looping ); } - if( OptionalString endAction = constant.IsString( IsChild(child, "end-action" ) ) ) + if( OptionalString endAction = constant.IsString( IsChild(child, "endAction" ) ) ) { if("BAKE" == *endAction) { @@ -184,17 +182,25 @@ Animation CreateAnimation( const TreeNode& child, const Replacement& constant, D { animation.SetEndAction( Animation::Discard ); } + else if("BAKE_FINAL" == *endAction) + { + animation.SetEndAction( Animation::BakeFinal ); + } } - if( OptionalString endAction = constant.IsString( IsChild(child, "destroy-action" ) ) ) + if( OptionalString endAction = constant.IsString( IsChild(child, "disconnectAction" ) ) ) { if("BAKE" == *endAction) { - animation.SetDestroyAction( Animation::Bake ); + animation.SetDisconnectAction( Animation::Bake ); } else if("DISCARD" == *endAction) { - animation.SetDestroyAction( Animation::Discard ); + animation.SetDisconnectAction( Animation::Discard ); + } + else if("BAKE_FINAL" == *endAction) + { + animation.SetDisconnectAction( Animation::BakeFinal ); } } @@ -209,24 +215,39 @@ Animation CreateAnimation( const TreeNode& child, const Replacement& constant, D OptionalString actorName( constant.IsString( IsChild(pKeyChild.second, "actor" ) ) ); OptionalString property( constant.IsString( IsChild(pKeyChild.second, "property" ) ) ); DALI_ASSERT_ALWAYS( actorName && "Animation must specify actor name" ); - DALI_ASSERT_ALWAYS( property && "Animation must specify a property name" ); - Actor targetActor = searchActor.FindChildByName( *actorName ); - DALI_ASSERT_ALWAYS( targetActor && "Actor must exist for property" ); + Handle targetHandle = searchActor.FindChildByName( *actorName ); + DALI_ASSERT_ALWAYS( targetHandle && "Actor must exist for property" ); - Property::Index idx( targetActor.GetPropertyIndex( *property ) ); - - // A limitation here is that its possible that between binding to the signal and - // the signal call that the ShaderEffect of the targetActor has been changed. - // However this is a unlikely use case especially when using scripts. - if( idx == Property::INVALID_INDEX ) + Property::Value propValue; + Property::Index propIndex = Property::INVALID_INDEX; + if( property ) { - if( ShaderEffect effect = targetActor.GetShaderEffect() ) + propIndex = targetHandle.GetPropertyIndex( *property ); + + // if the property is not found from the (actor) handle, try to downcast it to renderable actor + // to allow animating shader uniforms + if( propIndex == Property::INVALID_INDEX ) { - idx = effect.GetPropertyIndex( *property ); - if(idx != Property::INVALID_INDEX) + ImageActor imageActor = ImageActor::DownCast( targetHandle ); + if( imageActor ) { - targetActor = effect; + // A limitation here is that its possible that between creation of animation + // and running it the ShaderEffect of the actor has been changed. + // However this is a unlikely use case especially when using scripts. + if( ShaderEffect effect = imageActor.GetShaderEffect() ) + { + propIndex = effect.GetPropertyIndex( *property ); + if(propIndex != Property::INVALID_INDEX) + { + targetHandle = effect; + } + else + { + DALI_SCRIPT_WARNING( "Cannot find property on object or ShaderEffect\n" ); + continue; + } + } } else { @@ -234,27 +255,19 @@ Animation CreateAnimation( const TreeNode& child, const Replacement& constant, D continue; } } - else + + if( propIndex == Property::INVALID_INDEX) { - DALI_SCRIPT_WARNING( "Cannot find property on object or ShaderEffect\n" ); + DALI_ASSERT_ALWAYS( propIndex != Property::INVALID_INDEX && "Animation must specify a valid property" ); continue; } } - if( idx == Property::INVALID_INDEX) - { - DALI_ASSERT_ALWAYS( idx != Property::INVALID_INDEX && "Animation must specify a valid property" ); - continue; - } - - Property prop( Property( targetActor, idx ) ); - Property::Value propValue; - // these are the defaults - AlphaFunction alphaFunction( AlphaFunctions::Default ); + AlphaFunction alphaFunction( AlphaFunction::DEFAULT ); TimePeriod timePeriod( 0.f ); - OptionalChild timeChild = IsChild( pKeyChild.second, "time-period" ); + OptionalChild timeChild = IsChild( pKeyChild.second, "timePeriod" ); if( timeChild ) { @@ -263,13 +276,16 @@ Animation CreateAnimation( const TreeNode& child, const Replacement& constant, D durationSum = std::max( durationSum, timePeriod.delaySeconds + timePeriod.durationSeconds ); - if( OptionalString alphaChild = constant.IsString( IsChild(pKeyChild.second, "alpha-function" ) ) ) + if( OptionalString alphaChild = constant.IsString( IsChild(pKeyChild.second, "alphaFunction" ) ) ) { alphaFunction = GetAlphaFunction( *alphaChild ); } - if( OptionalChild keyFrameChild = IsChild(pKeyChild.second, "key-frames") ) + if( OptionalChild keyFrameChild = IsChild(pKeyChild.second, "keyFrames") ) { + DALI_ASSERT_ALWAYS( property && "Animation must specify a property name" ); + Property prop = Property( targetHandle, propIndex ); + KeyFrames keyframes = KeyFrames::New(); const TreeNode::ConstIterator endIter = (*keyFrameChild).CEnd(); @@ -296,8 +312,8 @@ Animation CreateAnimation( const TreeNode& child, const Replacement& constant, D throw; } - AlphaFunction kfAlphaFunction( AlphaFunctions::Default ); - if( OptionalString alphaFuncStr = constant.IsString( IsChild(pKeyChild.second, "alpha-function") ) ) + AlphaFunction kfAlphaFunction( AlphaFunction::DEFAULT ); + if( OptionalString alphaFuncStr = constant.IsString( IsChild(pKeyChild.second, "alphaFunction") ) ) { kfAlphaFunction = GetAlphaFunction( *alphaFuncStr ); } @@ -314,8 +330,45 @@ Animation CreateAnimation( const TreeNode& child, const Replacement& constant, D animation.AnimateBetween( prop, keyframes, alphaFunction ); } } + else if( OptionalString pathChild = IsString(pKeyChild.second, "path") ) + { + //Get path + Path path = builder->GetPath(*pathChild); + if( path ) + { + //Get forward vector if specified + Vector3 forward( 0.0f, 0.0f, 0.0f ); + OptionalVector3 forwardProperty = constant.IsVector3( IsChild(pKeyChild.second, "forward" ) ); + if( forwardProperty ) + { + forward = *forwardProperty; + } + + Actor actor = Actor::DownCast( targetHandle ); + if( actor ) + { + if( timeChild ) + { + animation.Animate( actor, path, forward, alphaFunction, timePeriod ); + } + else + { + animation.Animate( actor, path, forward, alphaFunction ); + } + + } + } + else + { + //Path not found + DALI_SCRIPT_WARNING( "Cannot find animation path '%s'\n", (*pathChild).c_str() ); + } + } else { + DALI_ASSERT_ALWAYS( property && "Animation must specify a property name" ); + + Property prop = Property( targetHandle, propIndex ); try { propValue = GetPropertyValue( prop.object.GetPropertyType(prop.propertyIndex), *IsChild(pKeyChild.second, "value") ); @@ -354,13 +407,18 @@ Animation CreateAnimation( const TreeNode& child, const Replacement& constant, D } } + if( !duration ) + { + animation.SetDuration( durationSum ); + } + return animation; } -Animation CreateAnimation( const TreeNode& child ) +Animation CreateAnimation( const TreeNode& child, Builder* const builder ) { Replacement replacement; - return CreateAnimation( child, replacement, Stage::GetCurrent().GetRootLayer() ); + return CreateAnimation( child, replacement, Stage::GetCurrent().GetRootLayer(), builder ); } } // namespace Internal