private StructInfo GetStructInfo(UStruct unrealStruct, bool isBlueprintType) { StructInfo structInfo; if (structInfos.TryGetValue(unrealStruct, out structInfo)) { return(structInfo); } structInfo = new StructInfo(this, unrealStruct, isBlueprintType); foreach (UFunction function in unrealStruct.GetFields <UFunction>(false, true, true)) { // We need to include interface functions as otherwise some interface functions wont be implemented. // If the interface function already has an implementation skip that function (as otherwise there will be duplicates). if (!structInfo.IsClass || !function.GetOwnerClass().IsChildOf <UInterface>() || structInfo.Class.FindFunctionByName(function.GetFName(), true).GetOwnerClass().IsChildOf <UInterface>()) { structInfo.AddFunction(function, CanExportFunction(function, isBlueprintType)); } } if (isBlueprintType) { UUserDefinedStruct userDefinedStruct = unrealStruct as UUserDefinedStruct; if (userDefinedStruct != null) { Dictionary <UProperty, string> variableNames = GetStructBPVariableNames(userDefinedStruct); foreach (UProperty property in unrealStruct.GetFields <UProperty>(false)) { structInfo.AddProperty(property, variableNames[property], CanExportProperty(property, unrealStruct, isBlueprintType)); } } else { foreach (UProperty property in unrealStruct.GetProperties <UProperty>(false)) { structInfo.AddProperty(property, null, CanExportProperty(property, unrealStruct, isBlueprintType)); } } } else { foreach (UProperty property in unrealStruct.GetFields <UProperty>(false)) { structInfo.AddProperty(property, null, CanExportProperty(property, unrealStruct, isBlueprintType)); } } structInfo.ResolveCollapsedMembers(); structInfo.PostProcess(); structInfos.Add(unrealStruct, structInfo); return(structInfo); }
private StructInfo GetStructInfo(UStruct unrealStruct, bool isBlueprintType) { StructInfo structInfo; if (structInfos.TryGetValue(unrealStruct, out structInfo)) { return(structInfo); } structInfo = new StructInfo(this, unrealStruct, isBlueprintType); foreach (UFunction function in unrealStruct.GetFields <UFunction>(false, true, true)) { structInfo.AddFunction(function, CanExportFunction(function, isBlueprintType)); } if (isBlueprintType) { UUserDefinedStruct userDefinedStruct = unrealStruct as UUserDefinedStruct; if (userDefinedStruct != null) { Dictionary <UProperty, string> variableNames = GetStructBPVariableNames(userDefinedStruct); foreach (UProperty property in unrealStruct.GetFields <UProperty>(false)) { structInfo.AddProperty(property, variableNames[property], CanExportProperty(property, unrealStruct, isBlueprintType)); } } else { foreach (UProperty property in unrealStruct.GetProperties <UProperty>(false)) { structInfo.AddProperty(property, null, CanExportProperty(property, unrealStruct, isBlueprintType)); } } } else { foreach (UProperty property in unrealStruct.GetFields <UProperty>(false)) { structInfo.AddProperty(property, null, CanExportProperty(property, unrealStruct, isBlueprintType)); } } structInfo.ResolveCollapsedMembers(); structInfo.PostProcess(); structInfos.Add(unrealStruct, structInfo); return(structInfo); }
public void GenerateCodeForBlueprints(AssetLoadMode loadMode, bool clearAssetCache, bool skipLevels) { BeginGenerateModules(); string projectPath = FPaths.ProjectFilePath; string projectName = FPaths.GetBaseFilename(projectPath); UnrealModuleInfo module = new UnrealModuleInfo(null, projectName, projectPath); BeginGenerateModule(module); UClass worldClass = GCHelper.Find <UClass>(Classes.UWorld); AssetCache assetCache = new AssetCache(this); if (!clearAssetCache) { assetCache.Load(); } List <string> assetBlacklist = LoadAssetBlacklist(); AssetLogClear(); AssetLogLine("Load assets {0}", DateTime.Now); bool registeredCrashHandler = false; if (Settings.CatchCrashOnAssetLoading) { FCoreDelegates.OnHandleSystemError.Bind(OnAssetLoadingCrash); registeredCrashHandler = true; } using (FARFilter filter = new FARFilter()) { filter.RecursiveClasses = true; filter.ClassNames.Add(UClass.GetClass <UBlueprint>().GetFName()); filter.ClassNames.Add(UClass.GetClass <UBlueprintGeneratedClass>().GetFName()); filter.ClassNames.Add(UClass.GetClass <UUserDefinedStruct>().GetFName()); filter.ClassNames.Add(UClass.GetClass <UUserDefinedEnum>().GetFName()); if (!skipLevels && worldClass != null) { filter.ClassNames.Add(worldClass.GetFName()); } List <FAssetData> assets = FAssetData.Load(filter); SlowTaskSetModuleCount(1); SlowTaskBeginModule("Blueprints", assets.Count); foreach (FAssetData asset in assets) { SlowTaskStep(null); string assetFileName, assetFileNameError; if (!asset.TryGetFilename(out assetFileName, out assetFileNameError)) { FMessage.Log(string.Format("FAssetData.TryGetFilename failed. ObjectPath:'{0}' reason:'{1}'", asset.ObjectPath.ToString(), assetFileNameError)); continue; } bool isEngineAsset = FPaths.IsSameOrSubDirectory(FPaths.EngineContentDir, FPaths.GetPath(assetFileName)); if (loadMode != AssetLoadMode.All) { if ((isEngineAsset && loadMode != AssetLoadMode.Engine) || (!isEngineAsset && loadMode != AssetLoadMode.Game)) { continue; } } if (!assetCache.HasAssetChanged(asset, assetFileName)) { if (Settings.LogAssetLoadingVerbose) { AssetLogLine("'{0}' unchanged", assetFileName); } continue; } // Log that we are loading this asset so we know which assets crash on load AssetLog("'{0}' - ", asset.ObjectPath.ToString()); if (assetBlacklist.Contains(asset.ObjectPath.ToString())) { AssetLogLine("blacklisted"); continue; } loadingAsset = asset.ObjectPath.ToString(); UObject obj = asset.GetAsset(); loadingAsset = null; UClass unrealClass = asset.GetClass(); if (obj == null || unrealClass == null) { AssetLogLine("null"); continue; } AssetLogLine("done"); if (unrealClass.IsChildOf <UBlueprint>()) { UBlueprint blueprint = obj as UBlueprint; if (blueprint != null) { UBlueprintGeneratedClass blueprintGeneratedClass = blueprint.GeneratedClass as UBlueprintGeneratedClass; if (blueprintGeneratedClass != null) { GenerateCodeForStruct(module, blueprintGeneratedClass); } } } else if (unrealClass.IsChildOf <UBlueprintGeneratedClass>()) { UBlueprintGeneratedClass blueprintGeneratedClass = obj as UBlueprintGeneratedClass; if (blueprintGeneratedClass != null) { GenerateCodeForStruct(module, blueprintGeneratedClass); } } else if (unrealClass.IsChildOf <UUserDefinedStruct>()) { UUserDefinedStruct unrealStruct = obj as UUserDefinedStruct; if (unrealStruct != null) { GenerateCodeForStruct(module, unrealStruct); } } else if (unrealClass.IsChildOf <UUserDefinedEnum>()) { UUserDefinedEnum unrealEnum = obj as UUserDefinedEnum; if (unrealEnum != null) { GenerateCodeForEnum(module, unrealEnum); } } else if (unrealClass.IsChildOf(worldClass)) { TArrayUnsafeRef <UObject> levels = new TArrayUnsafeRef <UObject>(Native.Native_UWorld.GetLevels(obj.Address)); foreach (UObject level in levels) { using (TArrayUnsafe <UBlueprint> levelBlueprints = new TArrayUnsafe <UBlueprint>()) { Native.Native_ULevel.GetLevelBlueprints(level.Address, levelBlueprints.Address); foreach (UBlueprint blueprint in levelBlueprints) { UBlueprintGeneratedClass blueprintGeneratedClass = blueprint.GeneratedClass as UBlueprintGeneratedClass; if (blueprintGeneratedClass != null) { //GenerateCodeForStruct(blueprintGeneratedClass); } } } } } } } if (registeredCrashHandler) { FCoreDelegates.OnHandleSystemError.Unbind(OnAssetLoadingCrash); } assetCache.Save(); EndGenerateModule(module); EndGenerateModules(); }