Files
Yosuga_rk3566/3rdparty/Live2D/Src/Framework/src/Model/CubismMoc.cpp
T
Misaki 7551a85abe first
2026-06-10 00:57:54 +08:00

118 lines
2.9 KiB
C++

/**
* Copyright(c) Live2D Inc. All rights reserved.
*
* Use of this source code is governed by the Live2D Open Software license
* that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
*/
#include "CubismMoc.hpp"
#include "CubismModel.hpp"
namespace Live2D { namespace Cubism { namespace Framework {
CubismMoc* CubismMoc::Create(const csmByte* mocBytes, csmSizeInt size, csmBool shouldCheckMocConsistency)
{
CubismMoc* cubismMoc = NULL;
void* alignedBuffer = CSM_MALLOC_ALLIGNED(size, Core::csmAlignofMoc);
memcpy(alignedBuffer, mocBytes, size);
if (shouldCheckMocConsistency)
{
// .moc3の整合性を確認
csmBool consistency = HasMocConsistency(alignedBuffer, size);
if (!consistency)
{
CSM_FREE_ALLIGNED(alignedBuffer);
// 整合性が確認できなければ処理しない
CubismLogError("Inconsistent MOC3.");
return cubismMoc;
}
}
Core::csmMoc* moc = Core::csmReviveMocInPlace(alignedBuffer, size);
const Core::csmMocVersion version = Core::csmGetMocVersion(alignedBuffer, size);
if (moc)
{
cubismMoc = CSM_NEW CubismMoc(moc);
cubismMoc->_mocVersion = version;
}
return cubismMoc;
}
void CubismMoc::Delete(CubismMoc* moc)
{
CSM_DELETE_SELF(CubismMoc, moc);
}
CubismMoc::CubismMoc(Core::csmMoc* moc)
: _moc(moc)
, _modelCount(0)
, _mocVersion(0)
{ }
CubismMoc::~CubismMoc()
{
CSM_ASSERT(_modelCount == 0);
CSM_FREE_ALLIGNED(_moc);
}
CubismModel* CubismMoc::CreateModel()
{
CubismModel* cubismModel = NULL;
const csmUint32 modelSize = Core::csmGetSizeofModel(_moc);
void* modelMemory = CSM_MALLOC_ALLIGNED(modelSize, Core::csmAlignofModel);
Core::csmModel* model = Core::csmInitializeModelInPlace(_moc, modelMemory, modelSize);
if (model)
{
cubismModel = CSM_NEW CubismModel(model);
cubismModel->Initialize();
++_modelCount;
}
return cubismModel;
}
void CubismMoc::DeleteModel(CubismModel* model)
{
CSM_DELETE_SELF(CubismModel, model);
--_modelCount;
}
Core::csmMocVersion CubismMoc::GetLatestMocVersion()
{
return Core::csmGetLatestMocVersion();
}
Core::csmMocVersion CubismMoc::GetMocVersion()
{
return _mocVersion;
}
csmBool CubismMoc::HasMocConsistency(void* address, const csmUint32 size)
{
csmInt32 isConsistent = Core::csmHasMocConsistency(address, size);
return isConsistent != 0 ? true : false;
}
csmBool CubismMoc::HasMocConsistencyFromUnrevivedMoc(const csmByte* mocBytes, csmSizeInt size)
{
void* alignedBuffer = CSM_MALLOC_ALLIGNED(size, Core::csmAlignofMoc);
memcpy(alignedBuffer, mocBytes, size);
csmBool consistency = CubismMoc::HasMocConsistency(alignedBuffer, size);
CSM_FREE_ALLIGNED(alignedBuffer);
return consistency;
}
}}}