metaforce/Runtime/Graphics/CSkinnedModel.cpp

69 lines
2.9 KiB
C++
Raw Normal View History

#include "Runtime/Graphics/CSkinnedModel.hpp"
#include "Runtime/Character/CSkinRules.hpp"
#include "Runtime/Graphics/CVertexMorphEffect.hpp"
#include <logvisor/logvisor.hpp>
2021-04-10 01:42:06 -07:00
namespace metaforce {
static logvisor::Module Log("metaforce::CSkinnedModel");
2018-12-07 21:30:43 -08:00
CSkinnedModel::CSkinnedModel(TLockedToken<CModel> model, TLockedToken<CSkinRules> skinRules,
2022-01-31 16:06:54 -08:00
TLockedToken<CCharLayoutInfo> layoutInfo, int shaderIdx)
: x4_model(std::move(model)), x10_skinRules(std::move(skinRules)), x1c_layoutInfo(std::move(layoutInfo)) {
if (!x4_model) {
2020-04-11 15:51:39 -07:00
Log.report(logvisor::Fatal, FMT_STRING("bad model token provided to CSkinnedModel"));
}
if (!x10_skinRules) {
2020-04-11 15:51:39 -07:00
Log.report(logvisor::Fatal, FMT_STRING("bad skin token provided to CSkinnedModel"));
}
if (!x1c_layoutInfo) {
2020-04-11 15:51:39 -07:00
Log.report(logvisor::Fatal, FMT_STRING("bad character layout token provided to CSkinnedModel"));
}
2022-01-31 16:06:54 -08:00
m_modelInst = x4_model->MakeNewInstance(shaderIdx);
}
2018-12-07 21:30:43 -08:00
CSkinnedModel::CSkinnedModel(IObjectStore& store, CAssetId model, CAssetId skinRules, CAssetId layoutInfo,
2022-01-31 16:06:54 -08:00
int shaderIdx)
2018-12-07 21:30:43 -08:00
: CSkinnedModel(store.GetObj(SObjectTag{FOURCC('CMDL'), model}), store.GetObj(SObjectTag{FOURCC('CSKR'), skinRules}),
2022-01-31 16:06:54 -08:00
store.GetObj(SObjectTag{FOURCC('CINF'), layoutInfo}), shaderIdx) {}
2016-04-14 20:02:21 -07:00
2018-12-07 21:30:43 -08:00
void CSkinnedModel::Calculate(const CPoseAsTransforms& pose, const CModelFlags& drawFlags,
2021-06-07 12:29:18 -07:00
const std::optional<CVertexMorphEffect>& morphEffect, const float* morphMagnitudes) {
2022-01-31 16:06:54 -08:00
// TODO
// if (morphEffect || g_PointGenFunc) {
// if (boo::ObjToken<boo::IGraphicsBufferD> vertBuf = m_modelInst->UpdateUniformData(drawFlags, nullptr, nullptr)) {
// x10_skinRules->TransformVerticesCPU(m_vertWorkspace, pose, *x4_model);
// if (morphEffect)
// morphEffect->MorphVertices(m_vertWorkspace, morphMagnitudes, x10_skinRules, pose);
// if (g_PointGenFunc)
// g_PointGenFunc(g_PointGenCtx, m_vertWorkspace);
// x4_model->ApplyVerticesCPU(vertBuf, m_vertWorkspace);
// m_modifiedVBO = true;
// }
// } else {
// if (boo::ObjToken<boo::IGraphicsBufferD> vertBuf =
// m_modelInst->UpdateUniformData(drawFlags, x10_skinRules.GetObj(), &pose)) {
// if (m_modifiedVBO) {
// x4_model->RestoreVerticesCPU(vertBuf);
// m_modifiedVBO = false;
// }
// }
// }
2016-08-21 13:39:18 -07:00
}
2018-12-07 21:30:43 -08:00
void CSkinnedModel::Draw(const CModelFlags& drawFlags) const {
2021-04-03 09:48:39 -07:00
OPTICK_EVENT();
2018-12-07 21:30:43 -08:00
if (m_modelInst->TryLockTextures())
m_modelInst->DrawSurfaces(drawFlags);
}
2018-12-07 21:30:43 -08:00
CMorphableSkinnedModel::CMorphableSkinnedModel(IObjectStore& store, CAssetId model, CAssetId skinRules,
2022-01-31 16:06:54 -08:00
CAssetId layoutInfo, int shaderIdx)
: CSkinnedModel(store, model, skinRules, layoutInfo, shaderIdx) {}
2016-04-14 20:02:21 -07:00
2017-03-25 22:53:04 -07:00
CSkinnedModel::FPointGenerator CSkinnedModel::g_PointGenFunc = nullptr;
void* CSkinnedModel::g_PointGenCtx = nullptr;
2021-04-10 01:42:06 -07:00
} // namespace metaforce