2021SC@SDUSC
目录
上一节我们分析了Parser的相关代码,这一节就来看与资源导入相关的另一类工具——Loader。
Loaders
1.ModelLoader
首先是ModelLoader,它的作用是处理模型的创建和销毁,我们来看具体的代码
class ModelLoader
{
public:
ModelLoader() = delete;
/**
* Create a model
* @param p_filepath
* @param p_parserFlags
*/
static Model* Create(const std::string& p_filepath, Parsers::EModelParserFlags p_parserFlags = Parsers::EModelParserFlags::NONE);
/**
* Reload a model from file
* @param p_model
* @param p_filePath
* @param p_parserFlags
*/
static void Reload(Model& p_model, const std::string& p_filePath, Parsers::EModelParserFlags p_parserFlags = Parsers::EModelParserFlags::NONE);
/**
* Disabled constructor
* @param p_modelInstance
*/
static bool Destroy(Model*& p_modelInstance);
private:
static Parsers::AssimpParser __ASSIMP;
};
可以看到这个类中除了不可用的构造函数外,还包含了一个创建函数、一个重载函数以及一个销毁函数,同时引入了一个AssimpParser对象。
1.1Create
在create函数中,我们会用到model类的内容,相关的内容会在下一节讲解。
从该函数中我们看到它只需要2个参数,一个是模型文件的路径,一个是我们上一节讲过的EModelParserFlags枚举值。最开始我们创建一个Model对象的指针,并用传入文件路径参数做初始化,这个指针将会方便我们指向对应模型参数。
OvRendering::Resources::Model* OvRendering::Resources::Loaders::ModelLoader::Create(const std::string& p_filepath, Parsers::EModelParserFlags p_parserFlags)
{
Model* result = new Model(p_filepath);
if (__ASSIMP.LoadModel(p_filepath, result->m_meshes, result->m_materialNames, p_parserFlags))
{
result->ComputeBoundingSphere();
return result;
}
delete result;
return nullptr;
}
接下来使用AssimpParser对象的LoaderModel函数加载模型信息,这里会用到model对象的参数,如果模型加载成功将会返回true,就证明当前的model对象是可用的,我们就可以用它计算当前模型的碰撞盒信息,然后将其指针返回;如果模型加载失败,就意味没有模型导入,将会返回空指针。
1.2Reload
reload函数用于重载一个模型信息,说实话这一步的作用有点迷,我们需要从外界传入一个model对象的引用,然后利用create函数创建一个newModel,并将newModel的网格信息(m_meshes)、材质信息(m_materialNames)与碰撞球信息&#x