From 66bdddd6865a45a220e972a0f20e997271d3217c Mon Sep 17 00:00:00 2001
From: "Marcel K." <106357974+Ka1serM@users.noreply.github.com>
Date: Thu, 17 Jul 2025 13:10:35 +0200
Subject: [PATCH 1/2] make HDR export optional
---
CUE4Parse | 2 +-
FModel/Settings/UserSettings.cs | 10 +++++++++-
FModel/ViewModels/TabControlViewModel.cs | 2 +-
FModel/Views/SettingsView.xaml | 20 +++++++++++++-------
4 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/CUE4Parse b/CUE4Parse
index e9b676e9..ff2e96ba 160000
--- a/CUE4Parse
+++ b/CUE4Parse
@@ -1 +1 @@
-Subproject commit e9b676e97985f3d452d21e844202b546472d9bff
+Subproject commit ff2e96ba05bd732564bb7db2d995334bf68062e7
diff --git a/FModel/Settings/UserSettings.cs b/FModel/Settings/UserSettings.cs
index 6abd1d1e..b04b2831 100644
--- a/FModel/Settings/UserSettings.cs
+++ b/FModel/Settings/UserSettings.cs
@@ -73,7 +73,8 @@ namespace FModel.Settings
CompressionFormat = Default.CompressionFormat,
Platform = Default.CurrentDir.TexturePlatform,
ExportMorphTargets = Default.SaveMorphTargets,
- ExportMaterials = Default.SaveEmbeddedMaterials
+ ExportMaterials = Default.SaveEmbeddedMaterials,
+ ExportHdrTexturesAsHdr = Default.SaveHdrTexturesAsHdr
};
private bool _showChangelog = true;
@@ -508,5 +509,12 @@ namespace FModel.Settings
get => _saveSkeletonAsMesh;
set => SetProperty(ref _saveSkeletonAsMesh, value);
}
+
+ private bool _saveHdrTexturesAsHdr = true;
+ public bool SaveHdrTexturesAsHdr
+ {
+ get => _saveHdrTexturesAsHdr;
+ set => SetProperty(ref _saveHdrTexturesAsHdr, value);
+ }
}
}
diff --git a/FModel/ViewModels/TabControlViewModel.cs b/FModel/ViewModels/TabControlViewModel.cs
index f9f9eb96..9131169a 100644
--- a/FModel/ViewModels/TabControlViewModel.cs
+++ b/FModel/ViewModels/TabControlViewModel.cs
@@ -105,7 +105,7 @@ public class TabImage : ViewModel
if (PixelFormatUtils.IsHDR(bitmap.PixelFormat) || (UserSettings.Default.TextureExportFormat != ETextureFormat.Jpeg && UserSettings.Default.TextureExportFormat != ETextureFormat.Png))
{
- ImageBuffer = bitmap.Encode(UserSettings.Default.TextureExportFormat, out var ext);
+ ImageBuffer = bitmap.Encode(UserSettings.Default.TextureExportFormat, UserSettings.Default.SaveHdrTexturesAsHdr, out var ext);
ExportName += "." + ext;
}
else
diff --git a/FModel/Views/SettingsView.xaml b/FModel/Views/SettingsView.xaml
index b59ad295..4c85c8fd 100644
--- a/FModel/Views/SettingsView.xaml
+++ b/FModel/Views/SettingsView.xaml
@@ -323,6 +323,7 @@
+
@@ -464,10 +465,15 @@
IsChecked="{Binding SaveSkeletonAsMesh, Source={x:Static local:Settings.UserSettings.Default}, Mode=TwoWay}"
Style="{DynamicResource {x:Static adonisUi:Styles.ToggleSwitch}}" Margin="0 5 0 0"/>
-
+
+
-
-
+
+
+
@@ -476,8 +482,8 @@
-
-
+
@@ -486,8 +492,8 @@
-
-
+
From 75bdfc17973e08c2ec4c2f35c5964b7136f12759 Mon Sep 17 00:00:00 2001
From: Asval
Date: Mon, 21 Jul 2025 18:11:12 +0200
Subject: [PATCH 2/2] automated GetInternalSID using Athena_SeasonTitles
---
CUE4Parse | 2 +-
FModel/Creator/Bases/FN/BaseCommunity.cs | 12 +---
FModel/Creator/Bases/FN/BaseIcon.cs | 47 ++++------------
FModel/ViewModels/CUE4ParseViewModel.cs | 3 +-
FModel/Views/SettingsView.xaml | 70 ++++++++++++------------
5 files changed, 53 insertions(+), 81 deletions(-)
diff --git a/CUE4Parse b/CUE4Parse
index ff2e96ba..b5a3fd7f 160000
--- a/CUE4Parse
+++ b/CUE4Parse
@@ -1 +1 @@
-Subproject commit ff2e96ba05bd732564bb7db2d995334bf68062e7
+Subproject commit b5a3fd7fc4463740e885ea1d17dc9a1697b3b9b9
diff --git a/FModel/Creator/Bases/FN/BaseCommunity.cs b/FModel/Creator/Bases/FN/BaseCommunity.cs
index 2492426d..39c91fa4 100644
--- a/FModel/Creator/Bases/FN/BaseCommunity.cs
+++ b/FModel/Creator/Bases/FN/BaseCommunity.cs
@@ -123,15 +123,9 @@ public class BaseCommunity : BaseIcon
{
if (!bShort) return base.GetCosmeticSeason(seasonNumber);
var s = seasonNumber["Cosmetics.Filter.Season.".Length..];
- (int chapterIdx, int seasonIdx) = GetInternalSID(int.Parse(s));
- return s switch
- {
- "10" => $"C{chapterIdx} SX",
- "27" => $"Fortnite: OG",
- "32" => $"Fortnite: Remix",
- "35" => $"C{chapterIdx} MS1",
- _ => $"C{chapterIdx} S{seasonIdx}"
- };
+ (string chapterIdx, string seasonIdx, bool onlySeason) = GetInternalSID(s);
+ var prefix = int.TryParse(seasonIdx, out _) ? "S" : "";
+ return onlySeason ? $"{prefix}{seasonIdx}" : $"C{chapterIdx} {prefix}{seasonIdx}";
}
private new void DrawBackground(SKCanvas c)
diff --git a/FModel/Creator/Bases/FN/BaseIcon.cs b/FModel/Creator/Bases/FN/BaseIcon.cs
index e131f358..00c1e675 100644
--- a/FModel/Creator/Bases/FN/BaseIcon.cs
+++ b/FModel/Creator/Bases/FN/BaseIcon.cs
@@ -221,55 +221,32 @@ public class BaseIcon : UCreator
return Utils.RemoveHtmlTags(string.Format(format, name));
}
- protected (int, int) GetInternalSID(int number)
+ protected (string, string, bool) GetInternalSID(string number)
{
- static int GetSeasonsInChapter(int chapter) => chapter switch
- {
- 1 => 10,
- 2 => 8,
- 3 => 4,
- 4 => 5,
- 5 => 5,
- _ => 10
- };
+ if (!Utils.TryLoadObject("FortniteGame/Plugins/GameFeatures/BattlePassBase/Content/DataTables/Athena_SeasonTitles.Athena_SeasonTitles", out UDataTable seasonTitles) ||
+ !seasonTitles.TryGetDataTableRow(number, StringComparison.InvariantCulture, out var row) ||
+ !row.TryGetValue(out FText chapterText, "DisplayChapterText") ||
+ !row.TryGetValue(out FText seasonText, "DisplaySeasonText") ||
+ !row.TryGetValue(out FName displayType, "DisplayType"))
+ return (string.Empty, string.Empty, true);
- var chapterIdx = 0;
- var seasonIdx = 0;
- while (number > 0)
- {
- var seasonsInChapter = GetSeasonsInChapter(++chapterIdx);
- if (number > seasonsInChapter)
- number -= seasonsInChapter;
- else
- {
- seasonIdx = number;
- number = 0;
- }
- }
- return (chapterIdx, seasonIdx);
+ var onlySeason = displayType.Text.EndsWith("::OnlySeason") || (chapterText.Text == seasonText.Text && !int.TryParse(seasonText.Text, out _));
+ return (chapterText.Text, seasonText.Text, onlySeason);
}
protected string GetCosmeticSeason(string seasonNumber)
{
var s = seasonNumber["Cosmetics.Filter.Season.".Length..];
- var initial = int.Parse(s);
- (int chapterIdx, int seasonIdx) = GetInternalSID(initial);
+ (string chapterIdx, string seasonIdx, bool onlySeason) = GetInternalSID(s);
var season = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "SeasonTextFormat", "Season {0}");
var introduced = Utils.GetLocalizedResource("Fort.Cosmetics", "CosmeticItemDescription_Season", "\nIntroduced in {0}>.");
- if (s == "10") return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, "X")));
- if (initial <= 10) return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, s)));
+ if (onlySeason) return Utils.RemoveHtmlTags(string.Format(introduced, string.Format(season, seasonIdx)));
var chapter = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "ChapterTextFormat", "Chapter {0}");
var chapterFormat = Utils.GetLocalizedResource("AthenaSeasonItemDefinitionInternal", "ChapterSeasonTextFormat", "{0}, {1}");
var d = string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format(season, seasonIdx));
- return s switch
- {
- "27" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format("Fortnite: OG"))),
- "32" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format("Fortnite: Remix"))),
- "35" => Utils.RemoveHtmlTags(string.Format(introduced, string.Format(chapterFormat, string.Format(chapter, chapterIdx), string.Format("MS1")))),
- _ => Utils.RemoveHtmlTags(string.Format(introduced, d))
- };
+ return Utils.RemoveHtmlTags(string.Format(introduced, d));
}
protected void CheckGameplayTags(FInstancedStruct[] dataList)
diff --git a/FModel/ViewModels/CUE4ParseViewModel.cs b/FModel/ViewModels/CUE4ParseViewModel.cs
index c3279387..8716cd98 100644
--- a/FModel/ViewModels/CUE4ParseViewModel.cs
+++ b/FModel/ViewModels/CUE4ParseViewModel.cs
@@ -30,7 +30,7 @@ using CUE4Parse.UE4.IO;
using CUE4Parse.UE4.Localization;
using CUE4Parse.UE4.Objects.Core.Serialization;
using CUE4Parse.UE4.Objects.Engine;
-using CUE4Parse.UE4.Oodle.Objects;
+using CUE4Parse.UE4.Oodle.Objects;
using CUE4Parse.UE4.Pak;
using CUE4Parse.UE4.Readers;
using CUE4Parse.UE4.Shaders;
@@ -39,6 +39,7 @@ using CUE4Parse.UE4.Wwise;
using CUE4Parse_Conversion;
using CUE4Parse_Conversion.Sounds;
using CUE4Parse.FileProvider.Objects;
+using CUE4Parse.GameTypes.AshEchoes.FileProvider;
using CUE4Parse.UE4.Assets;
using CUE4Parse.UE4.BinaryConfig;
using CUE4Parse.UE4.Objects.UObject;
diff --git a/FModel/Views/SettingsView.xaml b/FModel/Views/SettingsView.xaml
index 4c85c8fd..00a7c1f1 100644
--- a/FModel/Views/SettingsView.xaml
+++ b/FModel/Views/SettingsView.xaml
@@ -465,42 +465,42 @@
IsChecked="{Binding SaveSkeletonAsMesh, Source={x:Static local:Settings.UserSettings.Default}, Mode=TwoWay}"
Style="{DynamicResource {x:Static adonisUi:Styles.ToggleSwitch}}" Margin="0 5 0 0"/>
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Style="{DynamicResource {x:Static adonisUi:Styles.ToggleSwitch}}" Margin="0 5 0 5"/>