#pragma once #include "CToken.hpp" #include "CModel.hpp" #include "optional.hpp" namespace urde { class CModel; class CSkinRules; class CCharLayoutInfo; class CPoseAsTransforms; class CVertexMorphEffect; class IObjectStore; class CSkinnedModel { friend class CBooModel; std::unique_ptr m_modelInst; TLockedToken x4_model; TLockedToken x10_skinRules; TLockedToken x1c_layoutInfo; std::vector> m_vertWorkspace; bool m_modifiedVBO = false; public: enum class EDataOwnership { Zero, One }; CSkinnedModel(TLockedToken model, TLockedToken skinRules, TLockedToken layoutInfo, int shaderIdx, int drawInsts); CSkinnedModel(IObjectStore& store, CAssetId model, CAssetId skinRules, CAssetId layoutInfo, int shaderIdx, int drawInsts); const TLockedToken& GetModel() const {return x4_model;} const std::unique_ptr& GetModelInst() const {return m_modelInst;} const TLockedToken& GetSkinRules() const {return x10_skinRules;} const TLockedToken& GetLayoutInfo() const {return x1c_layoutInfo;} void Calculate(const CPoseAsTransforms& pose, const CModelFlags& drawFlags, const std::experimental::optional& morphEffect, const float* morphMagnitudes); void Draw(const CModelFlags& drawFlags) const; typedef void(*FPointGenerator)(void* item, const std::vector>& vn); static void SetPointGeneratorFunc(void* ctx, FPointGenerator func) { g_PointGenFunc = func; g_PointGenCtx = ctx; } static void ClearPointGeneratorFunc() { g_PointGenFunc = nullptr; } static FPointGenerator g_PointGenFunc; static void* g_PointGenCtx; }; class CMorphableSkinnedModel : public CSkinnedModel { public: CMorphableSkinnedModel(IObjectStore& store, CAssetId model, CAssetId skinRules, CAssetId layoutInfo, int shaderIdx, int drawInsts); }; }