bool MapFollowAnimation::GetProperty(TObject object, TProperty property, bool targetValue, PropertyValue & value) const { if (property == Animation::Position) { ScreenBase tmp = AnimationSystem::Instance().GetLastScreen(); if (targetValue) { tmp.SetFromParams(m_globalPosition, m_angleInterpolator.GetTargetAngle(), m_isAutoZoom ? m_scaleInterpolator.GetScale() : m_scaleInterpolator.GetTargetScale()); tmp.MatchGandP3d(m_globalPosition, m_endPixelPosition); } else { double const scale = m_scaleInterpolator.GetScale() / m_scaleInterpolator.GetStartScale(); double const angle = m_angleInterpolator.GetAngle() - m_angleInterpolator.GetStartAngle(); m2::PointD offset = m_offsetInterpolator.GetPosition() * scale; offset.Rotate(angle); m2::PointD pos = m_globalPosition + offset; tmp.SetFromParams(m_globalPosition, m_angleInterpolator.GetAngle(), m_scaleInterpolator.GetScale()); tmp.MatchGandP3d(pos, m_endPixelPosition); } value = PropertyValue(tmp.GetOrg()); return true; } if (property == Animation::Angle) { value = PropertyValue(targetValue ? m_angleInterpolator.GetTargetAngle() : m_angleInterpolator.GetAngle()); return true; } if (property == Animation::Scale) { value = PropertyValue((targetValue && !m_isAutoZoom) ? m_scaleInterpolator.GetTargetScale() : m_scaleInterpolator.GetScale()); return true; } ASSERT(false, ("Wrong property:", property)); return false; }
// static void Animation::GetCurrentScreen(TPropertyCache const & properties, ScreenBase const & screen, ScreenBase & currentScreen) { currentScreen = screen; if (!properties.empty()) { double scale = currentScreen.GetScale(); double angle = currentScreen.GetAngle(); m2::PointD pos = currentScreen.GlobalRect().GlobalZero(); PropertyValue value; if (GetCachedProperty(properties, Object::MapPlane, ObjectProperty::Scale, value)) scale = value.m_valueD; if (GetCachedProperty(properties, Object::MapPlane, ObjectProperty::Angle, value)) angle = value.m_valueD; if (GetCachedProperty(properties, Object::MapPlane, ObjectProperty::Position, value)) pos = value.m_valuePointD; currentScreen.SetFromParams(pos, angle, scale); } }