UCLASS(BlueprintType)
class VECTORIZINGANIMATION_API UcvMat : public UObject
{
GENERATED_BODY()
public:
UcvMat(){}
UcvMat(cv::Mat mat) : pic(mat){}
operator cv::Mat()
{
return pic;
}
cv::Mat pic;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Mat")
UTexture2D* Texture;
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Mat")
UMaterialInterface* MasterMaterialRef;
};
I Make my class and make his factory
UCLASS()
class VECTORIZINGANIMATION_API UcvMatFactory : public UFactory
{
GENERATED_UCLASS_BODY()
// UFactory interface
virtual UObject* FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
// End of UFactory interface
};
UcvMatFactory::UcvMatFactory(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
bCreateNew = true;
bEditAfterNew = true;
SupportedClass = UcvMat::StaticClass();
}
UObject* UcvMatFactory::FactoryCreateNew(UClass* Class, UObject* InParent, FName Name, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
{
UcvMat* NewObjectAsset = ConstructObject<UcvMat>(Class, InParent, Name, Flags | RF_Transactional);
return NewObjectAsset;
}
then dynamic loading UTexture2D asset and I want to make UcvMat asset
TArray<UcvMat*> ADataGetterActor::GetWorkCVMat(FString path)
{
TArray<UcvMat*> res;
TArray<UObject*> TextureAssets;
EngineUtils::FindOrLoadAssetsByPath(path, TextureAssets, EngineUtils::ATL_Regular);
for(int32 i = 0; i < TextureAssets.Num(); ++i)
{
UTexture2D* tex = Cast<UTexture2D>(TextureAssets[i]);
if(tex != nullptr)
{
FString name;
tex->GetName(name);
FString PackageName = TEXT("/Game/test/");
PackageName += name;
UPackage* Package = CreatePackage(NULL, *PackageName);
UcvMat* NewAsset = NewNamedObject<UcvMat>(Package, FName("CvMat"), RF_Public);
if(NewAsset != NULL)
{
// Fill in the assets data here
//UcvMat* tmp = NewObject<UcvMat>();
UcvMat* tmp = NewAsset;
name = TEXT("cvMat_") + name;
tmp->Rename(*name);
tmp->Texture = tex;
tmp->UpdateTextureToCvMat();
res.Add(tmp);
FAssetRegistryModule::AssetCreated(NewAsset);
NewAsset->MarkPackageDirty();
NewAsset->PostEditChange();
Package->SetDirtyFlag(true);
FString PackageFileName = FPackageName::LongPackageNameToFilename(PackageName, FPackageName::GetAssetPackageExtension());
UPackage::SavePackage(Package, NewAsset, RF_Public, *PackageFileName, GError, nullptr, true, true, SAVE_NoError);
}
}
}
return res;
}
It save but always only 1kb.
and it save fail.
but when I use editor create cvMat asset and save.
Then it fine, so how could I save asset which created in runtime?