2 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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.
17 #include <dali/public-api/common/dali-common.h>
18 #include <dali/public-api/math/vector2.h>
19 #include <dali/public-api/math/vector3.h>
20 #include <dali/public-api/math/vector4.h>
21 #include <dali/public-api/object/property-input.h>
22 #include <dali/internal/update/common/property-condition-variable-step-functions.h>
36 const int ARGINDEX_STEP_INDEX = 0;
37 const int ARGINDEX_LIST_SIZE = 1;
38 const int ARGINDEX_LIST_START = 2;
42 ConditionFunction VariableStep::GetFunction( Property::Type valueType )
44 ConditionFunction function = NULL;
53 case Property::VECTOR2:
55 function = EvalVector2;
58 case Property::VECTOR3:
60 function = EvalVector3;
63 case Property::VECTOR4:
65 function = EvalVector4;
70 function = EvalDefault;
78 bool VariableStep::Evaluate( const float propertyValue, PropertyNotification::RawArgumentContainer& arg )
80 const int currentIndex = arg[ARGINDEX_STEP_INDEX];
81 const int numSteps = arg[ARGINDEX_LIST_SIZE];
82 const float first = arg[ARGINDEX_LIST_START];
83 const float last = arg[ARGINDEX_LIST_START + (numSteps - 1)];
84 const bool ascending = (last > first) ? true : false;
85 int newIndex = currentIndex;
87 // avoid loop if property currently not within any of the range values
90 if( propertyValue < first )
94 else if( propertyValue >= last )
96 newIndex = numSteps - 1;
101 // increments are in negative direction
102 if( propertyValue > first )
106 else if( propertyValue <= last )
108 newIndex = numSteps - 1;
112 for( i = 0 ; i < numSteps - 1 ; ++i )
114 const float arg1 = arg[ARGINDEX_LIST_START + i];
115 const float arg2 = arg[ARGINDEX_LIST_START + (i + 1)];
118 if( ( propertyValue >= arg1 )
119 && ( propertyValue < arg2 ) )
127 // increments are in negative direction
128 if( ( propertyValue > arg2 )
129 && ( propertyValue <= arg1 ) )
136 if( newIndex != currentIndex )
138 // have changed to new step
139 arg[ARGINDEX_STEP_INDEX] = static_cast<float>(newIndex);
145 bool VariableStep::EvalFloat( const Dali::PropertyInput& value, PropertyNotification::RawArgumentContainer& arg )
147 const float propertyValue = value.GetFloat();
148 return Evaluate( propertyValue, arg );
151 bool VariableStep::EvalVector2( const Dali::PropertyInput& value, PropertyNotification::RawArgumentContainer& arg )
153 const float propertyValue = value.GetVector2().LengthSquared();
154 return Evaluate( propertyValue, arg );
157 bool VariableStep::EvalVector3( const Dali::PropertyInput& value, PropertyNotification::RawArgumentContainer& arg )
159 float propertyValue = value.GetVector3().LengthSquared();
160 return Evaluate( propertyValue, arg );
163 bool VariableStep::EvalVector4( const Dali::PropertyInput& value, PropertyNotification::RawArgumentContainer& arg )
165 const float propertyValue = value.GetVector4().LengthSquared();
166 return Evaluate( propertyValue, arg );
169 bool VariableStep::EvalDefault( const Dali::PropertyInput& value, PropertyNotification::RawArgumentContainer& arg )
174 } // namespace SceneGraph
176 } // namespace Internal