Fixed emote synchronization, ...
* Fixed emote synchronization * Still requires identical frame count. Will still cause freeze as it syncs. * Fixed frame effects not working on idle and talk emotes. * Characters are now repositioned after background sliding is over.
This commit is contained in:
		
							parent
							
								
									52fc8d3594
								
							
						
					
					
						commit
						d135bbc511
					
				@ -131,13 +131,17 @@ void AnimationLayer::jumpToFrame(int number)
 | 
				
			|||||||
    return;
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  bool is_processing = m_processing;
 | 
				
			||||||
  if (m_ticker->isActive())
 | 
					  if (m_ticker->isActive())
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    m_ticker->stop();
 | 
					    m_ticker->stop();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  m_frame_number = number;
 | 
					  m_target_frame_number = number;
 | 
				
			||||||
 | 
					  if (is_processing)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
    frameTicker();
 | 
					    frameTicker();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void AnimationLayer::setPlayOnce(bool enabled)
 | 
					void AnimationLayer::setPlayOnce(bool enabled)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -161,7 +165,7 @@ void AnimationLayer::setFlipped(bool enabled)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void AnimationLayer::setTransformationMode(Qt::TransformationMode mode)
 | 
					void AnimationLayer::setTransformationMode(Qt::TransformationMode mode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  m_transformation_mode = mode;
 | 
					  m_transformation_mode_hint = mode;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void AnimationLayer::setMinimumDurationPerFrame(int duration)
 | 
					void AnimationLayer::setMinimumDurationPerFrame(int duration)
 | 
				
			||||||
@ -247,6 +251,11 @@ void AnimationLayer::calculateFrameGeometry()
 | 
				
			|||||||
    // display the frame in its center
 | 
					    // display the frame in its center
 | 
				
			||||||
    int x = (m_scaled_frame_size.width() - widget_size.width()) / 2;
 | 
					    int x = (m_scaled_frame_size.width() - widget_size.width()) / 2;
 | 
				
			||||||
    m_display_rect = QRect(x, 0, widget_size.width(), m_scaled_frame_size.height());
 | 
					    m_display_rect = QRect(x, 0, widget_size.width(), m_scaled_frame_size.height());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (m_transformation_mode_hint == Qt::FastTransformation)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      m_transformation_mode = scale < 1.0 ? Qt::SmoothTransformation : Qt::FastTransformation;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  displayCurrentFrame();
 | 
					  displayCurrentFrame();
 | 
				
			||||||
@ -314,6 +323,8 @@ void AnimationLayer::frameTicker()
 | 
				
			|||||||
      finishPlayback();
 | 
					      finishPlayback();
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (m_pause && !m_first_frame)
 | 
					  if (m_pause && !m_first_frame)
 | 
				
			||||||
@ -340,6 +351,11 @@ void AnimationLayer::frameTicker()
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  m_first_frame = false;
 | 
					  m_first_frame = false;
 | 
				
			||||||
 | 
					  if (m_target_frame_number != -1)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_frame_number = m_target_frame_number;
 | 
				
			||||||
 | 
					    m_target_frame_number = -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  m_current_frame = m_loader->frame(m_frame_number);
 | 
					  m_current_frame = m_loader->frame(m_frame_number);
 | 
				
			||||||
  displayCurrentFrame();
 | 
					  displayCurrentFrame();
 | 
				
			||||||
  Q_EMIT frameNumberChanged(m_frame_number);
 | 
					  Q_EMIT frameNumberChanged(m_frame_number);
 | 
				
			||||||
@ -380,6 +396,7 @@ void CharacterAnimationLayer::loadCharacterEmote(QString character, QString file
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  m_character = character;
 | 
					  m_character = character;
 | 
				
			||||||
  m_emote = fileName;
 | 
					  m_emote = fileName;
 | 
				
			||||||
 | 
					  m_resolved_emote = fileName;
 | 
				
			||||||
  m_emote_type = emoteType;
 | 
					  m_emote_type = emoteType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  QStringList prefixes;
 | 
					  QStringList prefixes;
 | 
				
			||||||
@ -410,19 +427,31 @@ void CharacterAnimationLayer::loadCharacterEmote(QString character, QString file
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  QVector<VPath> path_list;
 | 
					  QVector<VPath> path_list;
 | 
				
			||||||
 | 
					  QVector<QString> prefixed_emote_list;
 | 
				
			||||||
  for (const QString &prefix : qAsConst(prefixes))
 | 
					  for (const QString &prefix : qAsConst(prefixes))
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    path_list << ao_app->get_character_path(character, prefix + m_emote);
 | 
					    path_list << ao_app->get_character_path(character, prefix + m_emote);
 | 
				
			||||||
 | 
					    prefixed_emote_list << prefix + m_emote;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  path_list << ao_app->get_character_path(character, m_emote);
 | 
					  path_list << ao_app->get_character_path(character, m_emote);
 | 
				
			||||||
 | 
					  prefixed_emote_list << m_emote;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (placeholder_fallback)
 | 
					  if (placeholder_fallback)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    path_list << ao_app->get_character_path(character, QStringLiteral("placeholder"));
 | 
					    path_list << ao_app->get_character_path(character, QStringLiteral("placeholder"));
 | 
				
			||||||
 | 
					    prefixed_emote_list << QStringLiteral("placeholder");
 | 
				
			||||||
    path_list << ao_app->get_theme_path("placeholder", ao_app->default_theme);
 | 
					    path_list << ao_app->get_theme_path("placeholder", ao_app->default_theme);
 | 
				
			||||||
 | 
					    prefixed_emote_list << QStringLiteral("placeholder");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  setFileName(ao_app->get_image_path(path_list));
 | 
					  int index = -1;
 | 
				
			||||||
 | 
					  QString file_path = ao_app->get_image_path(path_list, index);
 | 
				
			||||||
 | 
					  if (index != -1)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    m_resolved_emote = prefixed_emote_list[index];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setFileName(file_path);
 | 
				
			||||||
  setPlayOnce(play_once);
 | 
					  setPlayOnce(play_once);
 | 
				
			||||||
  setTransformationMode(ao_app->get_scaling(ao_app->get_emote_property(character, fileName, "scaling")));
 | 
					  setTransformationMode(ao_app->get_scaling(ao_app->get_emote_property(character, fileName, "scaling")));
 | 
				
			||||||
  setStretchToFit(ao_app->get_emote_property(character, fileName, "stretch").startsWith("true"));
 | 
					  setStretchToFit(ao_app->get_emote_property(character, fileName, "stretch").startsWith("true"));
 | 
				
			||||||
@ -519,7 +548,7 @@ void CharacterAnimationLayer::notifyFrameEffect(int frameNumber)
 | 
				
			|||||||
  {
 | 
					  {
 | 
				
			||||||
    for (const FrameEffect &effect : qAsConst(*it))
 | 
					    for (const FrameEffect &effect : qAsConst(*it))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      if (effect.emote_name == m_emote)
 | 
					      if (effect.emote_name == m_resolved_emote)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        switch (effect.type)
 | 
					        switch (effect.type)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
				
			|||||||
@ -90,6 +90,7 @@ private:
 | 
				
			|||||||
  bool m_flipped = false;
 | 
					  bool m_flipped = false;
 | 
				
			||||||
  int m_minimum_duration = 0;
 | 
					  int m_minimum_duration = 0;
 | 
				
			||||||
  int m_maximum_duration = 0;
 | 
					  int m_maximum_duration = 0;
 | 
				
			||||||
 | 
					  Qt::TransformationMode m_transformation_mode_hint = Qt::FastTransformation;
 | 
				
			||||||
  Qt::TransformationMode m_transformation_mode = Qt::FastTransformation;
 | 
					  Qt::TransformationMode m_transformation_mode = Qt::FastTransformation;
 | 
				
			||||||
  AnimationLoader *m_loader = nullptr;
 | 
					  AnimationLoader *m_loader = nullptr;
 | 
				
			||||||
  QSize m_frame_size;
 | 
					  QSize m_frame_size;
 | 
				
			||||||
@ -103,6 +104,7 @@ private:
 | 
				
			|||||||
  QTimer *m_ticker = nullptr;
 | 
					  QTimer *m_ticker = nullptr;
 | 
				
			||||||
  bool m_first_frame = false;
 | 
					  bool m_first_frame = false;
 | 
				
			||||||
  int m_frame_number = 0;
 | 
					  int m_frame_number = 0;
 | 
				
			||||||
 | 
					  int m_target_frame_number = -1;
 | 
				
			||||||
  int m_frame_count = 0;
 | 
					  int m_frame_count = 0;
 | 
				
			||||||
  AnimationFrame m_current_frame;
 | 
					  AnimationFrame m_current_frame;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -170,6 +172,7 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  QString m_character;
 | 
					  QString m_character;
 | 
				
			||||||
  QString m_emote;
 | 
					  QString m_emote;
 | 
				
			||||||
 | 
					  QString m_resolved_emote;
 | 
				
			||||||
  EmoteType m_emote_type = NoEmoteType;
 | 
					  EmoteType m_emote_type = NoEmoteType;
 | 
				
			||||||
  QTimer *m_duration_timer = nullptr;
 | 
					  QTimer *m_duration_timer = nullptr;
 | 
				
			||||||
  int m_duration = 0;
 | 
					  int m_duration = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -120,6 +120,7 @@ public:
 | 
				
			|||||||
  VPath get_evidence_path(QString p_file);
 | 
					  VPath get_evidence_path(QString p_file);
 | 
				
			||||||
  QVector<VPath> get_asset_paths(QString p_element, QString p_theme = QString(), QString p_subtheme = QString(), QString p_default_theme = QString(), QString p_misc = QString(), QString p_character = QString(), QString p_placeholder = QString());
 | 
					  QVector<VPath> get_asset_paths(QString p_element, QString p_theme = QString(), QString p_subtheme = QString(), QString p_default_theme = QString(), QString p_misc = QString(), QString p_character = QString(), QString p_placeholder = QString());
 | 
				
			||||||
  QString get_asset_path(QVector<VPath> pathlist);
 | 
					  QString get_asset_path(QVector<VPath> pathlist);
 | 
				
			||||||
 | 
					  QString get_image_path(QVector<VPath> pathlist, int &index, bool static_image = false);
 | 
				
			||||||
  QString get_image_path(QVector<VPath> pathlist, bool static_image = false);
 | 
					  QString get_image_path(QVector<VPath> pathlist, bool static_image = false);
 | 
				
			||||||
  QString get_sfx_path(QVector<VPath> pathlist);
 | 
					  QString get_sfx_path(QVector<VPath> pathlist);
 | 
				
			||||||
  QString get_config_value(QString p_identifier, QString p_config, QString p_theme = QString(), QString p_subtheme = QString(), QString p_default_theme = QString(), QString p_misc = QString());
 | 
					  QString get_config_value(QString p_identifier, QString p_config, QString p_theme = QString(), QString p_subtheme = QString(), QString p_default_theme = QString(), QString p_misc = QString());
 | 
				
			||||||
 | 
				
			|||||||
@ -3110,6 +3110,7 @@ void Courtroom::post_transition_cleanup()
 | 
				
			|||||||
    layer->stopPlayback();
 | 
					    layer->stopPlayback();
 | 
				
			||||||
    layer->pausePlayback(false);
 | 
					    layer->pausePlayback(false);
 | 
				
			||||||
    layer->setParent(ui_viewport);
 | 
					    layer->setParent(ui_viewport);
 | 
				
			||||||
 | 
					    layer->stackUnder(ui_vp_desk);
 | 
				
			||||||
    layer->setVisible(is_visible);
 | 
					    layer->setVisible(is_visible);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -239,19 +239,27 @@ QString AOApplication::get_asset_path(QVector<VPath> pathlist)
 | 
				
			|||||||
  return QString();
 | 
					  return QString();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QString AOApplication::get_image_path(QVector<VPath> pathlist, bool static_image)
 | 
					QString AOApplication::get_image_path(QVector<VPath> pathlist, int &index, bool static_image)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  for (const VPath &p : pathlist)
 | 
					  for (int i = 0; i < pathlist.size(); i++)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    QString path = get_image_suffix(p, static_image);
 | 
					    QString path = get_image_suffix(pathlist[i], static_image);
 | 
				
			||||||
    if (!path.isEmpty())
 | 
					    if (!path.isEmpty())
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					      index = i;
 | 
				
			||||||
      return path;
 | 
					      return path;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return QString();
 | 
					  return QString();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QString AOApplication::get_image_path(QVector<VPath> pathlist, bool static_image)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int dummy;
 | 
				
			||||||
 | 
					  return get_image_path(pathlist, dummy, static_image);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
QString AOApplication::get_sfx_path(QVector<VPath> pathlist)
 | 
					QString AOApplication::get_sfx_path(QVector<VPath> pathlist)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  for (const VPath &p : pathlist)
 | 
					  for (const VPath &p : pathlist)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user