BlueRoseNote/03-UnrealEngine/卡通渲染相关资料/VRM4U/VRM4U中资源带入逻辑与Assimp的使用.md
2023-06-29 11:55:02 +08:00

83 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 自定义Asset
https://zhuanlan.zhihu.com/p/77812246
- FAssetTypeActions_Base是对已经创建好的资源操作函数的封装。这个资源在内容浏览器中的颜色类型名字显示的缩略图。
- UFactory这个是创建自定义类型文件的入口。以及创建资源的二级菜单。
- UBlueprint: 创建继承类,来实现一个新的视图编辑窗口
- UXXXX : Public Object 这里面存储我们要编辑的数据
VRM中对应类为
- FAssetTypeActions_VrmAssetList、UVrmAssetListThumbnailRenderer
- UVRM4UImporterFactory
- UVrmAssetListObject
## Assimp
资源工厂类中UVRM4UImporterFactory::FactoryCreateBinary
```
{
const UVrmRuntimeSettings* Settings = GetDefault<UVrmRuntimeSettings>();
{
FSoftObjectPath r = Settings->AssetListObject; //(TEXT("/VRM4U/VrmObjectListBP.VrmObjectListBP"));
UObject *u = r.TryLoad();
if (u) {
if (Cast<UBlueprint>(u)) {
c = (UClass*)(Cast<UBlueprint>(u)->GeneratedClass);
}
}
}
if (c == nullptr) {
FSoftObjectPath r(TEXT("/VRM4U/VrmAssetListObjectBP.VrmAssetListObjectBP"));
UObject *u = r.TryLoad();
if (u) {
c = (UClass*)(Cast<UBlueprint>(u)->GeneratedClass);
}
}
if (c == nullptr) {
c = UVrmAssetListObject::StaticClass();
}
m = NewObject<UVrmAssetListObject>((UObject*)GetTransientPackage(), c.Get());
}
UVrmAssetListObject* mret = nullptr;
if (m) {
//auto a = NewObject<UVrmAssetListObject>(MatClass.Object, NAME_None, RF_Transactional);
//MatClass.Object;
//ULoaderBPFunctionLibrary::LoadVRMFile(nullptr, fullFileName);
GWarn->BeginSlowTask( NSLOCTEXT("UnrealEd", "ImportVRM", "Importing VRM"), true );
int ret = true;
auto &g = VRMConverter::Options::Get();
g.SetVrmOption(ImportUI->GenerateOptionData());
ULoaderBPFunctionLibrary::SetImportMode(true, Cast<UPackage>(InParent));
{
ret = ULoaderBPFunctionLibrary::LoadVRMFileLocal(m.Get(), mret, fullFileName);
}
}
```
蓝图函数库中bool ULoaderBPFunctionLibrary::LoadVRMFileFromMemory()。
```
Assimp::Importer mImporter;
const aiScene* mScenePtr = nullptr; // delete by Assimp::Importer::~Importer
mScenePtr = mImporter.ReadFileFromMemory(pFileDataData, dataSize,
aiProcess_Triangulate | aiProcess_MakeLeftHanded | aiProcess_CalcTangentSpace | aiProcess_GenSmoothNormals | aiProcess_OptimizeMeshes,
e.c_str());
if (mScenePtr == nullptr) {
std::string file;
file = utf_16_to_shift_jis(*filepath);
mScenePtr = mImporter.ReadFile(file, aiProcess_Triangulate | aiProcess_MakeLeftHanded | aiProcess_CalcTangentSpace | aiProcess_GenSmoothNormals | aiProcess_OptimizeMeshes);
}
```