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

2.5 KiB
Raw Blame History

自定义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);
}