2020-01-15 12:07:48 +00:00
|
|
|
#include "Runtime/Character/CAllFormatsAnimSource.hpp"
|
|
|
|
|
|
|
|
#include "Runtime/CSimplePool.hpp"
|
|
|
|
#include "Runtime/Character/CAnimSourceReader.hpp"
|
|
|
|
#include "Runtime/Character/CFBStreamedAnimReader.hpp"
|
|
|
|
|
|
|
|
#include <logvisor/logvisor.hpp>
|
2016-04-11 23:35:37 +00:00
|
|
|
|
2021-04-10 08:42:06 +00:00
|
|
|
namespace metaforce {
|
|
|
|
static logvisor::Module Log("metaforce::CAllFormatsAnimSource");
|
2016-04-11 23:35:37 +00:00
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
void CAnimFormatUnion::SubConstruct(u8* storage, EAnimFormat fmt, CInputStream& in, IObjectStore& store) {
|
|
|
|
switch (fmt) {
|
|
|
|
case EAnimFormat::Uncompressed:
|
|
|
|
new (storage) CAnimSource(in, store);
|
|
|
|
break;
|
|
|
|
case EAnimFormat::BitstreamCompressed:
|
|
|
|
new (storage) CFBStreamedCompression(in, store, false);
|
|
|
|
break;
|
|
|
|
case EAnimFormat::BitstreamCompressed24:
|
|
|
|
new (storage) CFBStreamedCompression(in, store, true);
|
|
|
|
break;
|
|
|
|
default:
|
2020-04-11 22:51:39 +00:00
|
|
|
Log.report(logvisor::Fatal, FMT_STRING("unable to read ANIM format {}"), int(fmt));
|
2018-12-08 05:30:43 +00:00
|
|
|
}
|
2016-04-11 23:35:37 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
CAnimFormatUnion::CAnimFormatUnion(CInputStream& in, IObjectStore& store) {
|
|
|
|
x0_format = EAnimFormat(in.readUint32Big());
|
|
|
|
SubConstruct(x4_storage, x0_format, in, store);
|
2016-04-11 23:35:37 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
CAnimFormatUnion::~CAnimFormatUnion() {
|
|
|
|
switch (x0_format) {
|
|
|
|
case EAnimFormat::Uncompressed:
|
|
|
|
reinterpret_cast<CAnimSource*>(x4_storage)->~CAnimSource();
|
|
|
|
break;
|
|
|
|
case EAnimFormat::BitstreamCompressed:
|
|
|
|
case EAnimFormat::BitstreamCompressed24:
|
|
|
|
reinterpret_cast<CFBStreamedCompression*>(x4_storage)->~CFBStreamedCompression();
|
2019-02-18 05:47:46 +00:00
|
|
|
break;
|
2018-12-08 05:30:43 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2016-04-12 06:15:32 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
std::shared_ptr<IAnimReader> CAllFormatsAnimSource::GetNewReader(const TLockedToken<CAllFormatsAnimSource>& tok,
|
|
|
|
const CCharAnimTime& startTime) {
|
|
|
|
switch (tok->x0_format) {
|
|
|
|
case EAnimFormat::Uncompressed:
|
|
|
|
return std::make_shared<CAnimSourceReader>(tok, startTime);
|
|
|
|
case EAnimFormat::BitstreamCompressed:
|
|
|
|
case EAnimFormat::BitstreamCompressed24:
|
|
|
|
return std::make_shared<CFBStreamedAnimReader>(tok, startTime);
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return {};
|
2016-04-12 06:15:32 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
CAllFormatsAnimSource::CAllFormatsAnimSource(CInputStream& in, IObjectStore& store, const SObjectTag& tag)
|
2016-04-11 23:35:37 +00:00
|
|
|
: CAnimFormatUnion(in, store), x74_tag(tag) {}
|
|
|
|
|
2018-12-08 05:30:43 +00:00
|
|
|
CFactoryFnReturn AnimSourceFactory(const SObjectTag& tag, CInputStream& in, const CVParamTransfer& params,
|
|
|
|
CObjectReference* selfRef) {
|
|
|
|
CSimplePool* sp = params.GetOwnedObj<CSimplePool*>();
|
|
|
|
return TToken<CAllFormatsAnimSource>::GetIObjObjectFor(std::make_unique<CAllFormatsAnimSource>(in, *sp, tag));
|
2016-04-12 06:15:32 +00:00
|
|
|
}
|
|
|
|
|
2021-04-10 08:42:06 +00:00
|
|
|
} // namespace metaforce
|