+void PropertyMetadata::AdjustPropertyValueBy( const Property::Value& relativePropertyValue )
+{
+ switch ( GetType() )
+ {
+ case Property::NONE:
+ case Property::RECTANGLE:
+ case Property::STRING:
+ case Property::ARRAY:
+ case Property::MAP:
+ case Property::EXTENTS:
+ case Property::MATRIX:
+ case Property::MATRIX3:
+ {
+ // Not animated
+ break;
+ }
+
+ case Property::BOOLEAN:
+ {
+ bool currentValue = false;
+ bool relativeValue = false;
+ if( value.Get( currentValue ) && relativePropertyValue.Get( relativeValue ) )
+ {
+ value = currentValue || relativeValue;
+ }
+ break;
+ }
+
+ case Property::INTEGER:
+ {
+ AdjustProperty< int >( value, relativePropertyValue );
+ break;
+ }
+
+ case Property::FLOAT:
+ {
+ AdjustProperty< float >( value, relativePropertyValue );
+ break;
+ }
+
+ case Property::ROTATION:
+ {
+ Quaternion currentValue;
+ Quaternion relativeValue;
+ if( value.Get( currentValue ) && relativePropertyValue.Get( relativeValue ) )
+ {
+ value = currentValue * relativeValue;
+ }
+ break;
+ }
+
+ case Property::VECTOR2:
+ {
+ if( componentIndex == Property::INVALID_COMPONENT_INDEX )
+ {
+ AdjustProperty< Vector2 >( value, relativePropertyValue );
+ }
+ else
+ {
+ Vector2 vector2Value;
+ value.Get( vector2Value );
+
+ if( componentIndex == 0 )
+ {
+ vector2Value.x += relativePropertyValue.Get< float >();
+ }
+ else if( componentIndex == 1 )
+ {
+ vector2Value.y += relativePropertyValue.Get< float >();
+ }
+
+ value = vector2Value;
+ }
+
+ break;
+ }
+
+ case Property::VECTOR3:
+ {
+ if( componentIndex == Property::INVALID_COMPONENT_INDEX )
+ {
+ AdjustProperty< Vector3 >( value, relativePropertyValue );
+ }
+ else
+ {
+ Vector3 vector3Value;
+ value.Get( vector3Value );
+
+ if( componentIndex == 0 )
+ {
+ vector3Value.x += relativePropertyValue.Get< float >();
+ }
+ else if( componentIndex == 1 )
+ {
+ vector3Value.y += relativePropertyValue.Get< float >();
+ }
+ else if( componentIndex == 2 )
+ {
+ vector3Value.z += relativePropertyValue.Get< float >();
+ }
+
+ value = vector3Value;
+ }
+ break;
+ }
+
+ case Property::VECTOR4:
+ {
+ if( componentIndex == Property::INVALID_COMPONENT_INDEX )
+ {
+ AdjustProperty< Vector4 >( value, relativePropertyValue );
+ }
+ else
+ {
+ Vector4 vector4Value;
+ value.Get( vector4Value );
+
+ if( componentIndex == 0 )
+ {
+ vector4Value.x += relativePropertyValue.Get< float >();
+ }
+ else if( componentIndex == 1 )
+ {
+ vector4Value.y += relativePropertyValue.Get< float >();
+ }
+ else if( componentIndex == 2 )
+ {
+ vector4Value.z += relativePropertyValue.Get< float >();
+ }
+ else if( componentIndex == 3 )
+ {
+ vector4Value.w += relativePropertyValue.Get< float >();
+ }
+
+ value = vector4Value;
+ }
+ break;
+ }
+ }
+}
+