Move BuildAnimation to CSkeletalAnimMgr / CObjectEntry

There is no need to have BuildAnimation in CModel when everything is
done in CObjectEntry anyways.
This removes a pointer in every CModel object, which is nice.

Accepted By: vladislavbelov
Differential Revision: https://code.wildfiregames.com/D4454
This was SVN commit r26254.
This commit is contained in:
wraitii
2022-01-26 14:55:19 +00:00
parent fe816ecb1a
commit 83d251406c
6 changed files with 75 additions and 78 deletions
+40 -1
View File
@@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games.
/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -25,8 +25,10 @@
#include "graphics/ColladaManager.h"
#include "graphics/Model.h"
#include "graphics/SkeletonAnim.h"
#include "graphics/SkeletonAnimDef.h"
#include "ps/CLogger.h"
#include "ps/CStr.h"
#include "ps/FileIo.h"
///////////////////////////////////////////////////////////////////////////////
@@ -79,3 +81,40 @@ CSkeletonAnimDef* CSkeletonAnimManager::GetAnimation(const VfsPath& pathname)
// Add to map, NULL if failed to load - we won't try loading it again
return m_Animations.insert_or_assign(name, std::move(def)).first->second.get();
}
/**
* BuildAnimation: load raw animation frame animation from given file, and build a
* animation specific to this model
*/
std::unique_ptr<CSkeletonAnim> CSkeletonAnimManager::BuildAnimation(const VfsPath& pathname, const CStr8& name, const CStr8& ID, int frequency, float speed, float actionpos, float actionpos2, float soundpos)
{
CSkeletonAnimDef* def = GetAnimation(pathname);
if (!def)
return nullptr;
std::unique_ptr<CSkeletonAnim> anim = std::make_unique<CSkeletonAnim>();
anim->m_Name = name;
anim->m_ID = ID;
anim->m_Frequency = frequency;
anim->m_AnimDef = def;
anim->m_Speed = speed;
if (actionpos == -1.f)
anim->m_ActionPos = -1.f;
else
anim->m_ActionPos = actionpos * anim->m_AnimDef->GetDuration();
if (actionpos2 == -1.f)
anim->m_ActionPos2 = -1.f;
else
anim->m_ActionPos2 = actionpos2 * anim->m_AnimDef->GetDuration();
if (soundpos == -1.f)
anim->m_SoundPos = -1.f;
else
anim->m_SoundPos = soundpos * anim->m_AnimDef->GetDuration();
anim->m_ObjectBounds.SetEmpty();
return anim;
}