Skip to content

2.4.2#243

Merged
patchzyy merged 26 commits intomainfrom
dev
Mar 25, 2026
Merged

2.4.2#243
patchzyy merged 26 commits intomainfrom
dev

Conversation

@patchzyy
Copy link
Copy Markdown
Member

@patchzyy patchzyy commented Mar 25, 2026

Summary by CodeRabbit

Release Notes - v2.4.2

  • New Features

    • Added native 3D Mii rendering with interactive camera controls
    • Introduced Mii rendering setup popup for resource installation
    • Enhanced Mii list display with improved grid layout
  • Bug Fixes

    • Corrected typo in mod installation prompt ("donwload" → "download")
    • Improved null-safety handling across UI components
    • Fixed error handling in file picker dialogs
  • Improvements

    • Optimized Mii image caching and rendering performance
    • Refined friend list and room details pages
    • Enhanced overall application stability

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 25, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 47958083-1204-4c76-b1d6-e842221ca3d4

📥 Commits

Reviewing files that changed from the base of the PR and between c967554 and 8626cf5.

📒 Files selected for processing (75)
  • .editorconfig
  • Flatpak/io.github.TeamWheelWizard.WheelWizard.metainfo.xml
  • WheelWizard.Test/Features/MiiDbServiceTests.cs
  • WheelWizard.Test/WheelWizard.Test.csproj
  • WheelWizard/Features/MiiImages/Domain/IMiiIMagesApi.cs
  • WheelWizard/Features/MiiImages/Domain/MiiImageSpecifications.cs
  • WheelWizard/Features/MiiImages/Domain/MiiImageVariants.cs
  • WheelWizard/Features/MiiImages/MiiImagesExtensions.cs
  • WheelWizard/Features/MiiImages/MiiImagesSingletonService.cs
  • WheelWizard/Features/MiiRendering/Configuration/MiiRenderingConfiguration.cs
  • WheelWizard/Features/MiiRendering/Configuration/MiiViewMode.cs
  • WheelWizard/Features/MiiRendering/Domain/IMiiRenderingAssetApi.cs
  • WheelWizard/Features/MiiRendering/MiiRenderingExtensions.cs
  • WheelWizard/Features/MiiRendering/Resources/mii_static_body_3ds_female_LE.rmdl
  • WheelWizard/Features/MiiRendering/Resources/mii_static_body_3ds_male_LE.rmdl
  • WheelWizard/Features/MiiRendering/Services/FflNativeInterop.cs
  • WheelWizard/Features/MiiRendering/Services/IMiiNativeRenderer.cs
  • WheelWizard/Features/MiiRendering/Services/IMiiRenderingResourceInstaller.cs
  • WheelWizard/Features/MiiRendering/Services/IMiiRenderingResourceLocator.cs
  • WheelWizard/Features/MiiRendering/Services/ManagedFflResourceArchive.cs
  • WheelWizard/Features/MiiRendering/Services/MiiRenderingResourceInstaller.cs
  • WheelWizard/Features/MiiRendering/Services/MiiRenderingResourceLocator.cs
  • WheelWizard/Features/MiiRendering/Services/NativeMiiRenderer.cs
  • WheelWizard/Features/WiiManagement/GameLicense/Domain/LicenseProfile.cs
  • WheelWizard/Features/WiiManagement/MiiManagement/MiiDbService.cs
  • WheelWizard/Features/WiiManagement/MiiManagement/MiiRepositoryService.cs
  • WheelWizard/Helpers/Humanizer.cs
  • WheelWizard/Resources/Languages/Phrases.Designer.cs
  • WheelWizard/Resources/Languages/Phrases.resx
  • WheelWizard/Services/Endpoints.cs
  • WheelWizard/Services/Installation/ModInstallation.cs
  • WheelWizard/Services/ModManager.cs
  • WheelWizard/Services/PathManager.cs
  • WheelWizard/Services/Storage/FilePickerHelper.cs
  • WheelWizard/Utilities/Mockers/MockingDataFactory.cs
  • WheelWizard/Utilities/RepeatedTasks/RepeatedTaskManager.cs
  • WheelWizard/Views/App.axaml.cs
  • WheelWizard/Views/Behaviors/ToolTipBubbleBehavior.cs
  • WheelWizard/Views/Components/MultiColoredIcon.axaml.cs
  • WheelWizard/Views/Converters/NullToBoolConverter.cs
  • WheelWizard/Views/Pages/FriendsPage.axaml.cs
  • WheelWizard/Views/Pages/MiiListPage.axaml
  • WheelWizard/Views/Pages/MiiListPage.axaml.cs
  • WheelWizard/Views/Pages/RoomDetailsPage.axaml.cs
  • WheelWizard/Views/Pages/RoomsPage.axaml.cs
  • WheelWizard/Views/Pages/Settings/VideoSettings.axaml.cs
  • WheelWizard/Views/Pages/Settings/WhWzSettings.axaml.cs
  • WheelWizard/Views/Pages/UserProfilePage.axaml
  • WheelWizard/Views/Pages/UserProfilePage.axaml.cs
  • WheelWizard/Views/Patterns/FriendsListItem.axaml.cs
  • WheelWizard/Views/Patterns/MiiBlock.axaml
  • WheelWizard/Views/Patterns/MiiBlock.axaml.cs
  • WheelWizard/Views/Patterns/MiiImages/Mii3DRender.axaml
  • WheelWizard/Views/Patterns/MiiImages/Mii3DRender.axaml.cs
  • WheelWizard/Views/Patterns/MiiImages/MiiCarousel.axaml
  • WheelWizard/Views/Patterns/MiiImages/MiiCarousel.axaml.cs
  • WheelWizard/Views/Patterns/MiiImages/MiiImageLoader.axaml.cs
  • WheelWizard/Views/Patterns/MiiImages/MiiImageLoaderWithHover.axaml.cs
  • WheelWizard/Views/Patterns/VrHistoryGraph.axaml.cs
  • WheelWizard/Views/Popups/Base/PopupWindow.axaml.cs
  • WheelWizard/Views/Popups/Generic/MiiRenderingSetupPopup.axaml
  • WheelWizard/Views/Popups/Generic/MiiRenderingSetupPopup.axaml.cs
  • WheelWizard/Views/Popups/Generic/OptionsWindow.axaml.cs
  • WheelWizard/Views/Popups/Generic/ProgressWindow.axaml.cs
  • WheelWizard/Views/Popups/Generic/TextInputWindow.axaml.cs
  • WheelWizard/Views/Popups/Generic/YesNoWindow.axaml.cs
  • WheelWizard/Views/Popups/MiiManagement/MiiCarouselWindow.axaml
  • WheelWizard/Views/Popups/MiiManagement/MiiEditor/EditorGeneral.axaml.cs
  • WheelWizard/Views/Popups/MiiManagement/MiiEditorWindow.axaml
  • WheelWizard/Views/Popups/MiiManagement/MiiEditorWindow.axaml.cs
  • WheelWizard/Views/Popups/MiiManagement/MiiSelectorWindow.axaml.cs
  • WheelWizard/Views/Popups/ModManagement/ModBrowserWindow.axaml.cs
  • WheelWizard/Views/Popups/ModManagement/ModContent.axaml.cs
  • WheelWizard/Views/Popups/PlayerProfileWindow.axaml.cs
  • WheelWizard/WheelWizard.csproj

📝 Walkthrough

Walkthrough

This PR replaces API-based Mii image rendering with a native rendering system featuring local resource management, new UI components, and improved caching. It introduces rendering infrastructure, configuration, and resource installation capabilities, alongside refactored image handling and expanded null-safety improvements across the codebase.

Changes

Cohort / File(s) Summary
Configuration & Resources
WheelWizard/Features/MiiRendering/Configuration/*, WheelWizard/Services/Endpoints.cs
Added MiiRenderingConfiguration, MiiLightingProfile, and MiiLightingProfiles for rendering setup. Updated Endpoints to replace old image API references with Internet Archive URLs for offline resource fetching.
Rendering Domain & Services
WheelWizard/Features/MiiRendering/Domain/IMiiRenderingAssetApi.cs, WheelWizard/Features/MiiRendering/Services/IMiiRenderingResource*.cs, WheelWizard/Features/MiiRendering/Services/IMiiNativeRenderer.cs
Added new rendering service contracts: IMiiRenderingAssetApi for archive downloads, IMiiRenderingResourceLocator and IMiiRenderingResourceInstaller for resource management, and IMiiNativeRenderer for rendering Mii images to bitmaps.
Rendering Implementation
WheelWizard/Features/MiiRendering/Services/FflNativeInterop.cs, WheelWizard/Features/MiiRendering/Services/ManagedFflResourceArchive.cs, WheelWizard/Features/MiiRendering/Services/MiiRenderingResource*.cs, WheelWizard/Features/MiiRendering/MiiRenderingExtensions.cs
Implemented native interop structures (FflNativeInterop), archive loading/parsing (ManagedFflResourceArchive), resource resolution and installation, and DI registration via AddMiiRendering extension.
Mii Image System Updates
WheelWizard/Features/MiiImages/Domain/*, WheelWizard/Features/MiiImages/MiiImagesExtensions.cs, WheelWizard/Features/MiiImages/MiiImagesSingletonService.cs
Removed IMiiIMagesApi interface; enhanced MiiImageSpecifications with camera and render properties (CameraVerticalOffset, CameraZoom, RenderScale) and new ImageSize.tiny enum; added MiiListTile variant; replaced API-based bitmap fetching with native rendering and in-memory cache management in MiiImagesSingletonService.
UI Components - Mii Rendering
WheelWizard/Views/Patterns/MiiImages/Mii3DRender.*, WheelWizard/Views/Patterns/MiiImages/MiiCarousel.*, WheelWizard/Views/Patterns/MiiImages/MiiImageLoader*.cs
Added new Mii3DRender component for interactive 3D Mii rendering with camera controls; removed MiiCarousel component; updated MiiImageLoader and MiiImageLoaderWithHover to support new variant loading and optional preview speedup.
Mii List & Block Components
WheelWizard/Views/Patterns/MiiBlock.*, WheelWizard/Views/Pages/MiiListPage.*
Updated MiiBlock to use MiiListTile variant; refactored MiiListPage to use virtualized list rendering with MiiRows and MiiListEntry models supporting selection, context menus, and grouped display.
Setup & Installation UI
WheelWizard/Views/Popups/Generic/MiiRenderingSetupPopup.*, WheelWizard/Views/App.axaml.cs
Added MiiRenderingSetupPopup for guiding resource downloads during app startup; updated App.OnFrameworkInitializationCompleted to check resource availability and trigger setup if needed before showing main window.
Window & Carousel Replacements
WheelWizard/Views/Popups/MiiManagement/MiiCarouselWindow.axaml, WheelWizard/Views/Popups/MiiManagement/MiiEditorWindow.axaml*, WheelWizard/Views/Pages/UserProfilePage.axaml*
Replaced MiiCarousel with Mii3DRender in carousel and editor windows and user profile page.
Null Safety & Nullable Reference Types
WheelWizard/Services/Storage/FilePickerHelper.cs, WheelWizard/Views/Converters/NullToBoolConverter.cs, WheelWizard/Views/Pages/*, WheelWizard/Views/Popups/**/*, WheelWizard/Utilities/**/*, WheelWizard/Services/**/*
Systematized nullable reference types across event handlers, return values, and parameter checks. Updated method signatures to accept nullable arguments, added null-conditional operators, and improved null coalescing fallbacks. Changed PropertyChanged events to use new keyword for proper inheritance hiding.
Mii Management Services
WheelWizard/Features/WiiManagement/MiiManagement/MiiDbService.cs, WheelWizard/Features/WiiManagement/MiiManagement/MiiRepositoryService.cs
Removed IRandomSystem dependency from MiiDbService; removed unused IFileSystem backing field in MiiRepositoryService.
Metadata & Configuration
Flatpak/io.github.TeamWheelWizard.WheelWizard.metainfo.xml, .editorconfig, WheelWizard/WheelWizard.csproj, WheelWizard/Services/PathManager.cs, WheelWizard/Resources/Languages/Phrases.*
Updated version to 2.4.2; added diagnostic analyzer severity rules; added MiiRenderingFolderPath and MiiRenderingResourceFilePath properties; fixed typos in localized strings; added embedded resources for Mii rendering; suppressed build warning.
Minor Fixes & Cleanup
WheelWizard/Services/Installation/ModInstallation.cs, WheelWizard/Services/ModManager.cs, WheelWizard/Helpers/Humanizer.cs, WheelWizard/Utilities/MockingDataFactory.cs, WheelWizard/Utilities/RepeatedTasks/RepeatedTaskManager.cs, WheelWizard/Views/Behaviors/ToolTipBubbleBehavior.cs, WheelWizard/Views/Components/MultiColoredIcon.axaml.cs, WheelWizard/Views/Pages/VideoSettings.axaml.cs, WheelWizard/Views/Pages/Settings/WhWzSettings.axaml.cs, WheelWizard/Views/Patterns/FriendsListItem.axaml.cs
Improved null handling in null guards, defensive string operations, and fallback values. Fixed unreachable code, removed unused fields, and added compiler warning suppressions. Enhanced UI layout null safety.

Sequence Diagram(s)

sequenceDiagram
    participant App as App Startup
    participant Installer as IMiiRenderingResourceInstaller
    participant Locator as IMiiRenderingResourceLocator
    participant API as IMiiRenderingAssetApi
    participant FileSystem as File System
    participant Popup as MiiRenderingSetupPopup
    
    App->>Installer: GetResolvedResourcePath()
    alt Resource Found & Valid
        Installer-->>App: Success
        App->>App: Continue to MainWindow
    else Resource Missing/Invalid
        Installer-->>App: Failure
        App->>Popup: ShowAndAwaitCompletionAsync()
        Popup->>User: Display Setup Dialog
        User->>Popup: Click Download
        Popup->>Installer: DownloadAndInstallAsync(progress)
        Installer->>API: DownloadArchiveAsync()
        API-->>Installer: HTTP Response Stream
        Installer->>Installer: Validate ZIP Archive
        Installer->>FileSystem: Extract & Validate File
        Installer->>FileSystem: Move to ManagedResourcePath
        Installer-->>Popup: Success with Progress
        Popup-->>App: Complete
        App->>App: Continue to MainWindow
    end
    
    App->>App: Load MainWindow
Loading
sequenceDiagram
    participant UI as Mii3DRender Component
    participant Renderer as IMiiNativeRenderer
    participant Cache as MiiImagesSingletonService
    participant Native as Native FFL Library
    
    User->>UI: Interact (drag/zoom/rotate)
    UI->>UI: Update Camera State
    UI->>UI: Queue Render Request
    UI->>Renderer: RenderAsync(Mii, studioData, specs)
    alt Cached Result Available
        Cache->>Cache: Return Cached Bitmap
        Renderer-->>UI: Bitmap (from cache)
    else Cache Miss or ExpirationSeconds ≤ 0
        Renderer->>Native: Native Render Call
        Native-->>Renderer: Pixel Buffer
        Renderer->>Renderer: Convert to Bitmap
        Renderer->>Cache: Store Result (if cacheable)
        Renderer-->>UI: Bitmap
    end
    UI->>UI: Marshal to WriteableBitmap
    UI->>UI: Present Frame with Animation
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

  • Offline mii rendering #240: Directly related to the same Mii rendering subsystem refactoring; shares changes to rendering services, domain contracts, and architecture for native rendering support.

Poem

🐰 Hop, render, hop! The Miis now draw,
Not from the web, but code's own law.
3D magic, native and swift,
Local resources—a rendering gift.
Carousel to 3DRender, the view's renewed—
Wheel Wizard's polish, brightly hued! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@patchzyy patchzyy merged commit 0fc2cd5 into main Mar 25, 2026
2 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant