Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
109806f
.net 10
NotOfficer Dec 19, 2025
ec15a98
use adonis fork instead of nuget packages
NotOfficer Dec 19, 2025
874078c
adonis fork
NotOfficer Dec 19, 2025
3e4db88
updated workflows to .net 10
NotOfficer Dec 19, 2025
0e54e90
Merge branch 'dev' into dotnet-10
NotOfficer Jan 27, 2026
3ce6877
cue4parse update
NotOfficer Jan 27, 2026
0e7b889
nuget updates
NotOfficer Jan 27, 2026
c1d1df5
use FModel.AdonisUI packages instead of submodule
NotOfficer Feb 1, 2026
dc441c5
Fmod5Sharp update
NotOfficer Feb 1, 2026
d38aab1
Merge branch 'dev' into dotnet-10
NotOfficer Feb 16, 2026
45896c3
Merge branch 'dev' into dotnet-10
4sval Feb 21, 2026
c1a9e3f
bump c4p
4sval Feb 21, 2026
6327f1b
Search for Shipping exe within Engine folder
Krowe-moh Apr 2, 2026
9f298c5
Prevent Export logs on Search menu extracts
Krowe-moh Apr 2, 2026
bb41727
Update SearchView.xaml
Chompster86 Feb 23, 2026
ee3af84
Update TabCommand.cs
Chompster86 Feb 23, 2026
879063c
Update Resources.xaml
Chompster86 Feb 23, 2026
f210601
Clear _waveSource and PlayedFile if last file was removed
ScrubN Dec 31, 2023
749790b
Stop playback if removed file was currently playing file
ScrubN Dec 31, 2023
cbc580c
Add 'X' hotkey for removing selected audio from the playlist
ScrubN Dec 31, 2023
d33dc95
Fixed Both in one
Krowe-moh Apr 4, 2026
d159aa4
Bump CUE4parse
Krowe-moh Apr 4, 2026
d8d8757
Merge remote-tracking branch 'upstream/dev' into ExportingFix
Krowe-moh Apr 8, 2026
bb160e7
Added 50 Entry Limit
Krowe-moh Apr 8, 2026
521fe89
Merge branch '4sval:dev' into ExportingFix
Krowe-moh May 18, 2026
40ebb17
New ItemDefs added recently
Krowe-moh May 18, 2026
b84ee3f
modified stuff in FN creator
Krowe-moh May 23, 2026
3f34725
Merge branch 'dotnet-10' of https://github.com/4sval/FModel into dotn…
NotOfficer Jun 4, 2026
76715cd
Merge branch 'dev' into dotnet-10
NotOfficer Jun 4, 2026
625e5df
nuget updates
NotOfficer Jun 4, 2026
e3c108b
restsharp update
NotOfficer Jun 4, 2026
141672f
minor compression rework
NotOfficer Jun 5, 2026
32a12da
bump c4p
NotOfficer Jun 5, 2026
05693db
yoinked snooper's imgui export modal
4sval Jun 5, 2026
86045e5
status bar button + popup
4sval Jun 7, 2026
ab5f6b0
Merge remote-tracking branch 'origin/dev' into feature/new-exporter
4sval Jun 7, 2026
0ca914f
export session window
4sval Jun 13, 2026
445cae2
overridable export options
4sval Jun 13, 2026
ad6fea1
world export
4sval Jun 14, 2026
a6959cf
Merge pull request #667 from Krowe-moh/ExportingFix
4sval Jun 14, 2026
ada2a94
fixes
4sval Jun 14, 2026
2cb6ef6
world menu items
4sval Jun 14, 2026
3fc2494
c4p bump
4sval Jun 15, 2026
e3747e5
small fixes
4sval Jun 20, 2026
a714bb5
re-use the export options control for the settings
4sval Jun 20, 2026
ba4913c
Merge remote-tracking branch 'Krowe/dev' into feature/new-exporter
4sval Jun 20, 2026
d809798
Grid.IsSharedSizeScope
4sval Jun 20, 2026
a04f8a9
bump c4p
4sval Jun 20, 2026
2ea4fab
List assets explorer view
Masusder Jun 27, 2026
1da370d
Smooth scroll, audio fix
Masusder Jun 27, 2026
e869feb
StreamingLevelFilterWindow
4sval Jun 27, 2026
61df828
Add optional .o.uasset editor-only data merging
Tectfy Jun 28, 2026
4195cbb
Keep it with rest of the bool toggles
Masusder Jun 28, 2026
788dc45
Merge branch 'pr-685' into feature/new-exporter
Masusder Jun 28, 2026
9181ce8
Make editor setting Fortnite-only
Masusder Jun 28, 2026
3942aee
Auto-refresh endpoint on save (#683)
yarik0chka Jun 28, 2026
ee22243
fixes
4sval Jun 28, 2026
924b52c
pre-usd texture format + remove header for now
4sval Jul 3, 2026
54a599f
disable root bone scaling on preview
4sval Jul 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CUE4Parse
Submodule CUE4Parse updated 946 files
2 changes: 1 addition & 1 deletion FModel/App.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
<ResourceDictionary Source="Views/Resources/Controls/ContextMenus/FolderContextMenu.xaml" />

<ResourceDictionary Source="Views/Resources/Resources.xaml" />
<ResourceDictionary Source="Views/Resources/Controls/TiledExplorer/Resources.xaml" />
<ResourceDictionary Source="Views/Resources/Controls/Explorer/Resources.xaml" />
</ResourceDictionary.MergedDictionaries>

<Color x:Key="{x:Static adonisUi:Colors.AccentColor}">#206BD4</Color>
Expand Down
28 changes: 22 additions & 6 deletions FModel/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@
using FModel.Framework;
using FModel.Services;
using FModel.Settings;
using FModel.Views.Snooper;
using Newtonsoft.Json;
using Serilog.Events;
using Serilog.Sinks.SystemConsole.Themes;
using MessageBox = AdonisUI.Controls.MessageBox;
using MessageBoxImage = AdonisUI.Controls.MessageBoxImage;
Expand Down Expand Up @@ -110,25 +112,39 @@ protected override void OnStartup(StartupEventArgs e)
Directory.CreateDirectory(Path.Combine(UserSettings.Default.OutputDirectory, "Logs"));
Directory.CreateDirectory(Path.Combine(UserSettings.Default.OutputDirectory, ".data"));

const string template = "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Enriched}: {Message:lj}{NewLine}{Exception}";
#if DEBUG
var filePath = Path.Combine(UserSettings.Default.OutputDirectory, "Logs", $"FModel-Debug-Log-{DateTime.Now:yyyy-MM-dd}.log");
#else
var filePath = Path.Combine(UserSettings.Default.OutputDirectory, "Logs", $"FModel-Log-{DateTime.Now:yyyy-MM-dd}.log");
#endif
const string template1 = "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] {Enriched}: {Message:lj}{NewLine}{Exception}";
const string template2 = "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u3}] [{ClassName}] {ObjectPath}: {Message:lj}{NewLine}{Exception}";
Log.Logger = new LoggerConfiguration()
#if DEBUG
.Enrich.With<SourceEnricher>()
.MinimumLevel.Verbose()
.WriteTo.Console(outputTemplate: template, theme: AnsiConsoleTheme.Literate)
.WriteTo.File(outputTemplate: template,
path: Path.Combine(UserSettings.Default.OutputDirectory, "Logs", $"FModel-Debug-Log-{DateTime.Now:yyyy-MM-dd}.log"))
#else
.Enrich.With<CallerEnricher>()
.WriteTo.File(outputTemplate: template,
path: Path.Combine(UserSettings.Default.OutputDirectory, "Logs", $"FModel-Log-{DateTime.Now:yyyy-MM-dd}.log"))
#endif
.WriteTo.Logger(lc => lc
.Filter.ByExcluding(IsConversionLibrary)
.WriteTo.Console(outputTemplate: template1, theme: AnsiConsoleTheme.Literate)
.WriteTo.File(outputTemplate: template1, path: filePath))
.WriteTo.Logger(lc => lc
.Filter.ByIncludingOnly(IsConversionLibrary)
.WriteTo.Console(outputTemplate: template2, theme: AnsiConsoleTheme.Literate)
.WriteTo.File(outputTemplate: template2, path: filePath))
.MinimumLevel.Override("CUE4Parse_Conversion", LogEventLevel.Verbose).WriteTo.Sink(ImGuiSink.Instance)
.CreateLogger();

Log.Information("Version {Version} ({CommitId})", Constants.APP_VERSION, Constants.APP_COMMIT_ID);
Log.Information("{OS}", GetOperatingSystemProductName());
Log.Information("{RuntimeVer}", RuntimeInformation.FrameworkDescription);
Log.Information("Culture {SysLang}", CultureInfo.CurrentCulture);

static bool IsConversionLibrary(LogEvent e) =>
e.Properties.TryGetValue("SourceContext", out var sc) &&
sc.ToString().Contains("CUE4Parse_Conversion");
}

private void AppExit(object sender, ExitEventArgs e)
Expand Down
7 changes: 6 additions & 1 deletion FModel/Creator/Bases/FN/BaseIcon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,13 @@ public void ParseForReward(bool isUsingDisplayAsset)
Preview = Utils.GetBitmap(otherPreview);
else if (Object.TryGetValue(out UMaterialInstanceConstant materialInstancePreview, "EventCalloutImage"))
Preview = Utils.GetBitmap(materialInstancePreview);
else if (Object.TryGetValue(out FStructFallback brush, "IconBrush") && brush.TryGetValue(out UTexture2D res, "ResourceObject"))
else if (Object.TryGetValue(out FStructFallback brush, "IconBrush", "BuildingSymbolNormal") && brush.TryGetValue(out UTexture2D res, "ResourceObject"))
Preview = Utils.GetBitmap(res);
else if (Object.TryGetValue(out FStructFallback mission, "MissionIcons", "PopupWidgetData"))
{
if (mission.TryGetValue(out FStructFallback brushsize, "Brush_XL", "Brush_L", "Brush_M", "Brush_S", "Brush_XS", "Brush_XXS", "AvailableIcon", "UnavailableIcon") && brushsize.TryGetValue(out UTexture2D res2, "ResourceObject"))
Preview = Utils.GetBitmap(res2);
}
}

// text
Expand Down
6 changes: 6 additions & 0 deletions FModel/Creator/CreatorPackage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ public bool TryConstructCreator([MaybeNullWhen(false)] out UCreator creator)
case "CosmeticShoesItemDefinition":
case "CosmeticCompanionItemDefinition":
case "CosmeticCompanionReactFXItemDefinition":
case "MagpieEntitlementRewardDefinition":
case "FortDeferredItemGrantDefinition":
case "BattleLabDeviceItemDefinition":
case "PiggybackDanceItemDefinition":
case "MyTownBuildingDefinitionData":
case "AthenaPickaxeItemDefinition":
case "AthenaGadgetItemDefinition":
case "AthenaGliderItemDefinition":
Expand All @@ -64,6 +69,7 @@ public bool TryConstructCreator([MaybeNullWhen(false)] out UCreator creator)
case "FortTokenType":
case "FortAbilityKit":
case "FortWorkerType":
case "FortMissionInfo":
case "RewardGraphToken":
case "JunoKnowledgeBundle":
case "FortBannerTokenType":
Expand Down
7 changes: 7 additions & 0 deletions FModel/Enums.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ public enum EBulkType
Audio = 1 << 5,
Code = 1 << 6,
Raw = 1 << 7,
Worlds = 1 << 8,
}

public enum EAssetCategory : uint
Expand Down Expand Up @@ -171,3 +172,9 @@ public enum EUnluacMode
Decompile,
Disassemble,
}

public enum EExplorerViewMode
{
Grid,
List
}
11 changes: 11 additions & 0 deletions FModel/Extensions/LogEventExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Serilog.Events;

namespace FModel.Extensions;

public static class LogEventExtensions
{
public static string GetContext(this LogEvent log, string propertyName)
{
return log.Properties.TryGetValue(propertyName, out var value) ? value.ToString().Trim('"') : string.Empty;
}
}
6 changes: 6 additions & 0 deletions FModel/FModel.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,9 @@
<None Remove="Resources\bone.frag" />
<None Remove="Resources\bone.vert" />
<None Remove="Resources\collision.vert" />
<None Remove="Resources\fa-brands-400.otf" />
<None Remove="Resources\fa-solid-900.otf" />
<None Remove="Resources\fa-regular-400.otf" />
</ItemGroup>

<ItemGroup>
Expand Down Expand Up @@ -149,6 +152,9 @@
<EmbeddedResource Include="Resources\bone.frag" />
<EmbeddedResource Include="Resources\bone.vert" />
<EmbeddedResource Include="Resources\collision.vert" />
<EmbeddedResource Include="Resources\fa-brands-400.otf" />
<EmbeddedResource Include="Resources\fa-solid-900.otf" />
<EmbeddedResource Include="Resources\fa-regular-400.otf" />
</ItemGroup>

<ItemGroup>
Expand Down
75 changes: 63 additions & 12 deletions FModel/Framework/ImGuiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,18 +66,69 @@ public ImGuiController(int width, int height)
var iniFileNamePtr = Marshal.StringToCoTaskMemUTF8(Path.Combine(UserSettings.Default.OutputDirectory, ".data", "imgui.ini"));
io.NativePtr->IniFilename = (byte*)iniFileNamePtr;
}

// If not found, Fallback to default ImGui Font
var normalPath = @"C:\Windows\Fonts\segoeui.ttf";
var boldPath = @"C:\Windows\Fonts\segoeuib.ttf";
var semiBoldPath = @"C:\Windows\Fonts\seguisb.ttf";

if (File.Exists(normalPath))
FontNormal = io.Fonts.AddFontFromFileTTF(normalPath, 16 * DpiScale);
if (File.Exists(boldPath))
FontBold = io.Fonts.AddFontFromFileTTF(boldPath, 16 * DpiScale);
if (File.Exists(semiBoldPath))
FontSemiBold = io.Fonts.AddFontFromFileTTF(semiBoldPath, 16 * DpiScale);

var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var assemblyName = assembly.GetName().Name;
byte[] LoadFont(string name)
{
using var stream = assembly.GetManifestResourceStream($"{assemblyName}.Resources.{name}")
?? throw new FileNotFoundException($"Embedded font '{name}' not found.");
using var ms = new MemoryStream();
stream.CopyTo(ms);
return ms.ToArray();
}

var faSolid = LoadFont("fa-solid-900.otf");
var faRegular = LoadFont("fa-regular-400.otf");
var faBrands = LoadFont("fa-brands-400.otf");

unsafe
{
// FA5 icons live in E000–F8FF (brands/regular/solid)
var iconRanges = stackalloc ushort[] { 0xe000, 0xf8ff, 0 };

var cfg = ImGuiNative.ImFontConfig_ImFontConfig();
cfg->MergeMode = 1;
cfg->PixelSnapH = 1;
cfg->GlyphMinAdvanceX = 16f;
// FontDataOwnedByAtlas = 0 because we manage the GCHandle lifetime ourselves
cfg->FontDataOwnedByAtlas = 0;

void MergeFontAwesome(byte[] solid, byte[] regular, byte[] brands)
{
fixed (byte* pSolid = solid)
fixed (byte* pRegular = regular)
fixed (byte* pBrands = brands)
{
io.Fonts.AddFontFromMemoryTTF((IntPtr)pSolid, solid.Length, 14, (IntPtr)cfg, (IntPtr)iconRanges);
io.Fonts.AddFontFromMemoryTTF((IntPtr)pRegular, regular.Length, 14, (IntPtr)cfg, (IntPtr)iconRanges);
io.Fonts.AddFontFromMemoryTTF((IntPtr)pBrands, brands.Length, 14, (IntPtr)cfg, (IntPtr)iconRanges);
}
}

// If not found, Fallback to default ImGui Font
var normalPath = @"C:\Windows\Fonts\segoeui.ttf";
var boldPath = @"C:\Windows\Fonts\segoeuib.ttf";
var semiBoldPath = @"C:\Windows\Fonts\seguisb.ttf";

if (File.Exists(normalPath))
{
FontNormal = io.Fonts.AddFontFromFileTTF(normalPath, 16 * DpiScale);
MergeFontAwesome(faSolid, faRegular, faBrands);
}
if (File.Exists(boldPath))
{
FontBold = io.Fonts.AddFontFromFileTTF(boldPath, 16 * DpiScale);
MergeFontAwesome(faSolid, faRegular, faBrands);
}
if (File.Exists(semiBoldPath))
{
FontSemiBold = io.Fonts.AddFontFromFileTTF(semiBoldPath, 16 * DpiScale);
MergeFontAwesome(faSolid, faRegular, faBrands);
}

ImGuiNative.ImFontConfig_destroy(cfg);
}

io.Fonts.AddFontDefault();
io.Fonts.Build(); // Build font atlas
Expand Down
9 changes: 4 additions & 5 deletions FModel/Framework/ViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ public string this[string propertyName]
if (string.IsNullOrEmpty(propertyName))
return Error;

return _validationErrors.ContainsKey(propertyName) ? string.Join(Environment.NewLine, _validationErrors[propertyName]) : string.Empty;
return _validationErrors.TryGetValue(propertyName, out IList<string> validationError) ? string.Join(Environment.NewLine, validationError) : string.Empty;
}
}

[JsonIgnore] public string Error => string.Join(Environment.NewLine, GetAllErrors());
[JsonIgnore] public bool HasErrors => _validationErrors.Any();
[JsonIgnore] public virtual bool HasErrors => _validationErrors.Count != 0;

public IEnumerable GetErrors(string propertyName)
{
Expand All @@ -49,8 +49,7 @@ public void AddValidationError(string propertyName, string errorMessage)

public void ClearValidationErrors(string propertyName)
{
if (_validationErrors.ContainsKey(propertyName))
_validationErrors.Remove(propertyName);
_validationErrors.Remove(propertyName);
}

public event PropertyChangedEventHandler PropertyChanged;
Expand All @@ -72,4 +71,4 @@ protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName]
RaisePropertyChanged(propertyName);
return true;
}
}
}
2 changes: 1 addition & 1 deletion FModel/Helper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public static void OpenWindow<T>(string windowName, Action action) where T : Win
else
{
var w = GetOpenedWindow<T>(windowName);
if (windowName == "Search For Packages") w.WindowState = WindowState.Normal;
if (w.WindowState == WindowState.Minimized) w.WindowState = WindowState.Normal;
w.Focus();
}
}
Expand Down
Loading