You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#lockdown Nick.Penwarden ========================== MAJOR FEATURES + CHANGES ========================== Change 2716841 on 2015/10/05 by Mike.Beach (WIP) Cleaning up how we setup script assets for replacement on cook (aligning more with the Blueprint conversion tool). #codereview Maciej.Mroz Change 2719089 on 2015/10/07 by Maciej.Mroz ToValidCPPIdentifierChars handles propertly '?' char. #codereview Dan.Oconnor Change 2719361 on 2015/10/07 by Maciej.Mroz Generated native code for AnimBPGC - some preliminary changes. Refactor: UAnimBlueprintGeneratedClass is not accessed directly in runtime. It is accessed via UAnimClassInterface interface. Properties USkeletalMeshComponent::AnimBlueprintGeneratedClass and UInterpTrackFloatAnimBPParam::AnimBlueprintClass were changed into "TSubclassOf<UAnimInstance> AnimClass" The UDynamicClass also can deliver the IAnimClassInterface interface. See UAnimClassData, IAnimClassInterface::GetFromClass and UDynamicClass::AnimClassImplementation. #codereview Lina.Halper, Thomas.Sarkanen Change 2719383 on 2015/10/07 by Maciej.Mroz Debug-only code removed Change 2720528 on 2015/10/07 by Dan.Oconnor Fix for determinsitc cooking of async tasks and load asset nodes #codereview Mike.Beach, Maciej.Mroz Change 2721273 on 2015/10/08 by Maciej.Mroz Blueprint Compiler Cpp Backend - Anim Blueprints can be converted - Various fixes/improvements Change 2721310 on 2015/10/08 by Maciej.Mroz refactor (cl#2719361) - no "auto" keyword Change 2721727 on 2015/10/08 by Mike.Beach (WIP) Setup the cook commandlet so it handles converted assets, replacing them with generated classes. - Refactored the conversion manifest (using a map over an array) - Centralized destination paths into a helper struct (for the manifest) - Generating an Editor module that automatically hooks into the cook process when enabled - Loading and applying native replacments for the cook Change 2723276 on 2015/10/09 by Michael.Schoell Blueprints duplicated for PIE will no longer register as dependencies to other Blueprint. #jira UE-16695 - Editor freezes then crashes while attempting to save during PIE #jira UE-21614 - [CrashReport] Crash while saving during PIE - FKismetEditorUtilities::CompileBlueprint() kismet2.cpp:736 Change 2724345 on 2015/10/11 by Ben.Cosh Blueprint profiler at first pass, this includes the ability to instrument specific blueprints with realtime editor stat display. #UEBP-21 - Profiling data capture and storage #UEBP-13 - Performance capture landing page #Branch UE4 #Proj BlueprintProfiler, BlueprintGraph, EditorStyle, Kismet, UnrealEd, CoreUObject, Engine Change 2724613 on 2015/10/12 by Ben.Cosh Incremental update for blueprint profiler to fix the way some of the reported stats cascade through events and branches and additionally some missed bits of code are refactored/removed. #Branch UE4 #Proj BlueprintProfiler #info Whilst looking into this I spotted the reason why the stats seem so erratic, There appears to be an issue with FText's use of EXPERIMENTAL_TEXT_FAST_DECIMAL_FORMAT which I have reported, but ideally disable this locally until a fix is integrated. Change 2724723 on 2015/10/12 by Maciej.Mroz Constructor of a dynamic class creates CDO. #codereview Robert.Manuszewski Change 2725108 on 2015/10/12 by Mike.Beach [UE-21891] Minor fix to the array shuffle() function; now processes the last entry like all the others. Change 2726358 on 2015/10/13 by Maciej.Mroz UDataTable is properly saved even if its RowStruct is null. https://udn.unrealengine.com/questions/264064/crash-using-hotreload-in-custom-datatable-cdo-clas.html Change 2727395 on 2015/10/13 by Mike.Beach (WIP) Second pass on the Blueprint conversion pipeline; setting it up for more optimal (speedier) performance. * Using stubs for replacements (rather than loading dynamic replacement). * Giving the cook commandlet more control (so a conversion could be ran directly). * Now logging replacements by old object path (to account for UPackage replacement queries). * Fix for [UE-21947], unshelved from CL 2724944 (by Maciej.Mroz). #codereview Maciej.Mroz Change 2727484 on 2015/10/13 by Mike.Beach [UE-22008] Fixing up comment/tooltip typo for UActorComponent::bAutoActivate. Change 2727527 on 2015/10/13 by Mike.Beach Downgrading an inactionable EdGraph warning, while adding more info so we could possibly determine what's happening. Change 2727702 on 2015/10/13 by Dan.Oconnor Fix for crash in UDelegateProperty::GetCPPType when called on a function with no OwnerClass (events) Change 2727968 on 2015/10/14 by Maciej.Mroz Since ConstructorHelpers::FClassFinder is usually static, the loaded class should be in root set, to prevent the pointer stored in ConstructorHelpers::FClassFinder from being obsolete. FindOrLoadClass behaves now like FindOrLoadObject. #codereview Robert.Manuszewski, Nick.Whiting Change 2728139 on 2015/10/14 by Phillip.Kavan
287 lines
9.2 KiB
C++
287 lines
9.2 KiB
C++
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "BlueprintNativeCodeGenPCH.h"
|
|
|
|
#include "AssetRegistryModule.h"
|
|
#include "BlueprintNativeCodeGenManifest.h"
|
|
#include "BlueprintNativeCodeGenModule.h"
|
|
#include "BlueprintNativeCodeGenUtils.h"
|
|
#include "IBlueprintCompilerCppBackendModule.h"
|
|
#include "NativeCodeGenCommandlineParams.h"
|
|
|
|
/*******************************************************************************
|
|
* NativizationCookControllerImpl
|
|
******************************************************************************/
|
|
|
|
namespace NativizationCookControllerImpl
|
|
{
|
|
#if WITH_EDITORONLY_DATA
|
|
static const FString ConvertAssetsCommand = TEXT("NativizeAssets");
|
|
static const FString ConvertedManifestParam = TEXT("NativizedAssetManifest=");
|
|
static const FString GeneratedPluginParam = TEXT("NativizedAssetPlugin=");
|
|
|
|
//--------------------------------------------------------------------------
|
|
static bool IsRunningCookCommandlet()
|
|
{
|
|
// @TODO: figure out how to determine if this is the cook commandlet
|
|
return IsRunningCommandlet();
|
|
}
|
|
#endif // WITH_EDITORONLY_DATA
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* UBlueprintNativeCodeGenConfig
|
|
*******************************************************************************/
|
|
|
|
//------------------------------------------------------------------------------
|
|
UBlueprintNativeCodeGenConfig::UBlueprintNativeCodeGenConfig(FObjectInitializer const& ObjectInitializer)
|
|
: Super(ObjectInitializer)
|
|
{
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* FCookCommandParams
|
|
******************************************************************************/
|
|
|
|
//------------------------------------------------------------------------------
|
|
FCookCommandParams::FCookCommandParams(const FString& Commandline)
|
|
: bRunConversion(false)
|
|
{
|
|
using namespace NativizationCookControllerImpl;
|
|
|
|
#if WITH_EDITORONLY_DATA
|
|
if (IsRunningCookCommandlet())
|
|
{
|
|
IFileManager& FileManager = IFileManager::Get();
|
|
bRunConversion = FParse::Param(*Commandline, *ConvertAssetsCommand);
|
|
|
|
if (FParse::Value(*Commandline, *ConvertedManifestParam, ManifestFilePath))
|
|
{
|
|
bRunConversion |= !FileManager.FileExists(*ManifestFilePath);
|
|
}
|
|
|
|
FString PluginPath;
|
|
if (FParse::Value(*Commandline, *GeneratedPluginParam, PluginPath))
|
|
{
|
|
if (PluginPath.EndsWith(TEXT(".uplugin")))
|
|
{
|
|
PluginName = FPaths::GetBaseFilename(PluginPath);
|
|
PluginPath = FPaths::GetPath(PluginPath);
|
|
}
|
|
OutputPath = PluginPath;
|
|
bRunConversion = true;
|
|
}
|
|
|
|
if (bRunConversion && ManifestFilePath.IsEmpty())
|
|
{
|
|
ManifestFilePath = FPaths::Combine(*FPaths::Combine(*FPaths::GameIntermediateDir(), TEXT("Cook")), TEXT("BlueprintConversionManifest"));
|
|
}
|
|
}
|
|
#endif // WITH_EDITORONLY_DATA
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
TArray<FString> FCookCommandParams::ToConversionParams() const
|
|
{
|
|
TArray<FString> ConversionCmdParams;
|
|
if (!PluginName.IsEmpty())
|
|
{
|
|
ConversionCmdParams.Add(FString::Printf(TEXT("pluginName=%s"), *PluginName));
|
|
}
|
|
if (!OutputPath.IsEmpty())
|
|
{
|
|
ConversionCmdParams.Add(FString::Printf(TEXT("output=\"%s\""), *OutputPath));
|
|
}
|
|
if (!ManifestFilePath.IsEmpty())
|
|
{
|
|
ConversionCmdParams.Add(FString::Printf(TEXT("manifest=\"%s\""), *ManifestFilePath));
|
|
}
|
|
return ConversionCmdParams;
|
|
}
|
|
|
|
/*******************************************************************************
|
|
* FBlueprintNativeCodeGenModule
|
|
******************************************************************************/
|
|
|
|
class FBlueprintNativeCodeGenModule : public IBlueprintNativeCodeGenModule
|
|
{
|
|
public:
|
|
FBlueprintNativeCodeGenModule()
|
|
: Manifest(nullptr)
|
|
{
|
|
FCookCommandParams CookParams(FCommandLine::Get());
|
|
FNativeCodeGenCommandlineParams CommandLineParams(CookParams.ToConversionParams());
|
|
Manifest = new FBlueprintNativeCodeGenManifest(CommandLineParams);
|
|
|
|
IBlueprintCompilerCppBackendModule& BackEndModule = (IBlueprintCompilerCppBackendModule&)IBlueprintCompilerCppBackendModule::Get();
|
|
auto& BackendPCHQuery = BackEndModule.OnPCHFilenameQuery();
|
|
|
|
FBlueprintNativeCodeGenPaths TargetPaths = GetManifest().GetTargetPaths();
|
|
BackendPCHQuery.BindLambda([TargetPaths]()->FString
|
|
{
|
|
return TargetPaths.RuntimePCHFilename();
|
|
});
|
|
|
|
auto& ConversionQueryDelegate = BackEndModule.OnIsTargetedForConversionQuery();
|
|
auto ShouldConvert = [](const UObject* AssetObj)
|
|
{
|
|
if (FScriptCookReplacementCoordinator::Get())
|
|
{
|
|
EReplacementResult ReplacmentResult = FScriptCookReplacementCoordinator::Get()->IsTargetedForReplacement(AssetObj);
|
|
return ReplacmentResult == EReplacementResult::ReplaceCompletely;
|
|
}
|
|
return false;
|
|
};
|
|
ConversionQueryDelegate.BindStatic(ShouldConvert);
|
|
}
|
|
|
|
//~ Begin IBlueprintNativeCodeGenModule interface
|
|
virtual void Convert(UPackage* Package, EReplacementResult ReplacementType) override;
|
|
virtual void SaveManifest(const TCHAR* Filename) override;
|
|
virtual void MergeManifest(const TCHAR* Filename) override;
|
|
virtual void FinalizeManifest() override;
|
|
//~ End IBlueprintNativeCodeGenModule interface
|
|
private:
|
|
FBlueprintNativeCodeGenManifest& GetManifest();
|
|
|
|
FBlueprintNativeCodeGenManifest* Manifest;
|
|
};
|
|
|
|
FBlueprintNativeCodeGenManifest& FBlueprintNativeCodeGenModule::GetManifest()
|
|
{
|
|
check(Manifest);
|
|
return *Manifest;
|
|
}
|
|
|
|
void FBlueprintNativeCodeGenModule::Convert(UPackage* Package, EReplacementResult ReplacementType)
|
|
{
|
|
// Find the struct/enum to convert:
|
|
UStruct* Struct = nullptr;
|
|
UEnum* Enum = nullptr;
|
|
TArray<UObject*> Objects;
|
|
GetObjectsWithOuter(Package, Objects, false);
|
|
for (auto Entry : Objects)
|
|
{
|
|
if (Entry->HasAnyFlags(RF_Transient))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
Struct = Cast<UStruct>(Entry);
|
|
if (Struct)
|
|
{
|
|
break;
|
|
}
|
|
|
|
Enum = Cast<UEnum>(Entry);
|
|
if (Enum)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (Struct == nullptr && Enum == nullptr)
|
|
{
|
|
check(false);
|
|
return;
|
|
}
|
|
|
|
const IAssetRegistry& Registry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>("AssetRegistry").Get();
|
|
auto GenerateWrapperSrcFile = [](const FUnconvertedDependencyRecord& UnconvertedDependency, UClass* Class)
|
|
{
|
|
FString FileContents;
|
|
TUniquePtr<IBlueprintCompilerCppBackend> Backend_CPP(IBlueprintCompilerCppBackendModuleInterface::Get().Create());
|
|
FileContents = Backend_CPP->GenerateWrapperForClass(Class);
|
|
|
|
if (!FileContents.IsEmpty())
|
|
{
|
|
FFileHelper::SaveStringToFile(FileContents, *UnconvertedDependency.GeneratedWrapperPath);
|
|
}
|
|
};
|
|
|
|
if (ReplacementType == EReplacementResult::GenerateStub)
|
|
{
|
|
check(ReplacementType == EReplacementResult::GenerateStub);
|
|
FAssetData AssetInfo = Registry.GetAssetByObjectPath(*Struct->GetPathName());
|
|
GenerateWrapperSrcFile(GetManifest().CreateUnconvertedDependencyRecord(AssetInfo.PackageName, AssetInfo, FName()), CastChecked<UClass>(Struct));
|
|
// The stub we generate still may have dependencies on other modules, so make sure the module dependencies are
|
|
// still recorded so that the .build.cs is generated correctly. Without this you'll get include related errors
|
|
// (or possibly linker errors) in stub headers:
|
|
GetManifest().GatherModuleDependencies(Package);
|
|
}
|
|
else
|
|
{
|
|
check(ReplacementType == EReplacementResult::ReplaceCompletely);
|
|
// convert:
|
|
UField* ForConversion = Enum;
|
|
if (ForConversion == nullptr)
|
|
{
|
|
ForConversion = Struct;
|
|
}
|
|
|
|
FAssetData AssetInfo = Registry.GetAssetByObjectPath(*ForConversion->GetPathName());
|
|
FConvertedAssetRecord& ConversionRecord = GetManifest().CreateConversionRecord(ForConversion->GetFName(), AssetInfo);
|
|
TSharedPtr<FString> HeaderSource(new FString());
|
|
TSharedPtr<FString> CppSource(new FString());
|
|
|
|
FBlueprintNativeCodeGenUtils::GenerateCppCode(ForConversion, HeaderSource, CppSource);
|
|
bool bSuccess = !HeaderSource->IsEmpty() || !CppSource->IsEmpty();
|
|
// Run the cpp first, because we cue off of the presence of a header for a valid conversion record (see
|
|
// FConvertedAssetRecord::IsValid)
|
|
if (!CppSource->IsEmpty())
|
|
{
|
|
if (!FFileHelper::SaveStringToFile(*CppSource, *ConversionRecord.GeneratedCppPath))
|
|
{
|
|
bSuccess &= false;
|
|
ConversionRecord.GeneratedCppPath.Empty();
|
|
}
|
|
CppSource->Empty(CppSource->Len());
|
|
}
|
|
else
|
|
{
|
|
ConversionRecord.GeneratedCppPath.Empty();
|
|
}
|
|
|
|
if (bSuccess && !HeaderSource->IsEmpty())
|
|
{
|
|
if (!FFileHelper::SaveStringToFile(*HeaderSource, *ConversionRecord.GeneratedHeaderPath))
|
|
{
|
|
bSuccess &= false;
|
|
ConversionRecord.GeneratedHeaderPath.Empty();
|
|
}
|
|
HeaderSource->Empty(HeaderSource->Len());
|
|
}
|
|
else
|
|
{
|
|
ConversionRecord.GeneratedHeaderPath.Empty();
|
|
}
|
|
|
|
check(bSuccess);
|
|
if (bSuccess)
|
|
{
|
|
GetManifest().GatherModuleDependencies(Package);
|
|
}
|
|
}
|
|
}
|
|
|
|
void FBlueprintNativeCodeGenModule::SaveManifest(const TCHAR* Filename)
|
|
{
|
|
GetManifest().SaveAs(Filename);
|
|
}
|
|
|
|
void FBlueprintNativeCodeGenModule::MergeManifest(const TCHAR* Filename)
|
|
{
|
|
GetManifest().Merge(Filename);
|
|
}
|
|
|
|
void FBlueprintNativeCodeGenModule::FinalizeManifest()
|
|
{
|
|
GetManifest().Save();
|
|
|
|
FCookCommandParams CookParams(FCommandLine::Get());
|
|
FNativeCodeGenCommandlineParams CommandLineParams(CookParams.ToConversionParams());
|
|
check(FPaths::IsSamePath(CommandLineParams.ManifestFilePath, CommandLineParams.ManifestFilePath));
|
|
check(FBlueprintNativeCodeGenUtils::FinalizePlugin(GetManifest(), CommandLineParams));
|
|
}
|
|
|
|
IMPLEMENT_MODULE(FBlueprintNativeCodeGenModule, BlueprintNativeCodeGen); |