Skip to content

feat(ui): add tabs to advanced settings & PBR search#1599

Merged
doodlum merged 8 commits into
community-shaders:devfrom
davo0411:Advanced-cleanup
Nov 28, 2025
Merged

feat(ui): add tabs to advanced settings & PBR search#1599
doodlum merged 8 commits into
community-shaders:devfrom
davo0411:Advanced-cleanup

Conversation

@davo0411
Copy link
Copy Markdown
Collaborator

@davo0411 davo0411 commented Nov 9, 2025

separates advanced settings into tabs to match general.
adds search functionality to PBR MATO and texture settings

Summary by CodeRabbit

  • New Features

    • Advanced settings menu reorganized into tabs (Developer, Disable at Boot, Logging, PBR Settings, Shader Debug) for improved navigation.
    • Searchable dropdowns added to PBR settings for texture set and material selection.
    • Enhanced search functionality with visual indicators across UI elements.
  • Refactor

    • Improved rendering structure and layout of advanced settings sections.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Nov 9, 2025

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'instructions'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Walkthrough

The PR refactors the Advanced Settings UI from sequential rendering to a tab-based navigation system. It introduces searchable combo boxes for selection UI, restructures the "Disable at Boot" feature rendering with independent collapsing headers, and extracts shared UI utilities including case-insensitive search matching, search icon rendering, and a searchable combo template.

Changes

Cohort / File(s) Summary
Advanced Settings Tab Refactor
src/Menu/AdvancedSettingsRenderer.h, src/Menu/AdvancedSettingsRenderer.cpp
Replaces sequential rendering calls with TabBar-based UI containing Developer, Disable at Boot, Logging, PBR Settings, and Shader Debug tabs. Each tab renders content in dedicated child regions. Adds new public methods RenderPBRSection() and RenderDisableAtBootSection() accepting callables, and introduces RenderLoggingSection(). Removes RenderAdvancedSection() and RenderShaderReplacementSection(). Adds includes for Fonts.h and Utils/Format.h.
Menu Disable-at-Boot Restructuring
src/Menu.cpp
Refactors DrawDisableAtBootSettings from a single nested collapsing header to multiple independent collapsing headers for Special Features and Features sections, while preserving description text and data bindings. Updates lambda in DrawAdvancedSettings to capture this.
Search and Combo Utilities
src/Utils/UI.h, src/Utils/UI.cpp
Adds StringMatchesSearch() for case-insensitive substring matching, DrawSearchIcon() helper for rendering magnifying-glass icon, and SearchableCombo<T> template for searchable combo boxes. Refactors DrawFeatureSearchBar to delegate icon drawing. Extends RenderTableCell() signature with textColor parameter.
PBR and TruePBR Updates
src/TruePBR.h, src/TruePBR.cpp
Replaces two ImGui combo blocks with unified Util::SearchableCombo interface for texture set and material object selection. Adds early exit optimization in SetShaderResources() when no PS resources are modified. Adds <string> include.

Sequence Diagram

sequenceDiagram
    participant User
    participant Menu as AdvancedSettingsRenderer
    participant TabBar as ImGui TabBar
    participant Sections as Render Sections

    User->>Menu: Open Advanced Settings
    Menu->>TabBar: Create TabBar with 5 tabs
    
    alt Developer Tab Selected
        TabBar->>Sections: RenderDeveloperSection()
        Sections->>Sections: File Watcher, Addresses, Statistics
    else Disable at Boot Tab Selected
        TabBar->>Sections: RenderDisableAtBootSection()
        Sections->>Menu.cpp: DrawDisableAtBootSettings()
        Menu.cpp->>Sections: Render Special Features + Features headers
    else Logging Tab Selected
        TabBar->>Sections: RenderLoggingSection()
    else PBR Settings Tab Selected
        TabBar->>Sections: RenderPBRSection()
        Sections->>Sections: TruePBR SearchableCombo
    else Shader Debug Tab Selected
        TabBar->>Sections: RenderShaderDebugSection()
    end
    
    Sections-->>User: Render UI content
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • AdvancedSettingsRenderer refactor: Significant structural changes converting sequential rendering to TabBar-based UI with multiple new entry points and reorganized section logic
  • SearchableCombo template: Generic template implementation requiring verification of type safety and single-static-buffer design
  • RenderDisableAtBootSection integration: UI restructuring with conditional header rendering and data binding preservation needs careful validation
  • Cross-file coordination: Changes span utilities, menu logic, and renderer classes with interdependent modifications

Possibly related PRs

Suggested reviewers

  • alandtse

Poem

🐰 A rabbit's ode to tabbed delight:

Tabs now organize our settings bright,
Search boxes help us find just right,
No more sequential render plight—
The UI dances in the light! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.69% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the two main changes: adding tabs to advanced settings and implementing PBR search functionality, matching the PR objectives.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Nov 9, 2025

Using provided base ref: 268de33
Using base ref: 268de33
Base commit date: 2025-11-06T14:39:17+10:00 (Thursday, November 06, 2025 02:39 PM)
No actionable suggestions for changed features.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/Utils/UI.h (1)

620-682: Consider using StringMatchesSearch for consistency.

The template implementation is well-designed with proper state management and good UX (clearing search on selection/close). However, lines 663-665 implement case-insensitive search inline using std::search, while StringMatchesSearch (lines 477-483) provides the same functionality.

For consistency and maintainability, consider refactoring to use StringMatchesSearch:

-			// Filter and display items
 			for (auto& [itemName, item] : itemMap) {
-				// Simple case-insensitive search
-				if (searchBuffer[0] == '\0' ||
-					std::search(itemName.begin(), itemName.end(), searchBuffer, searchBuffer + strlen(searchBuffer),
-						[](char a, char b) { return std::tolower(a) == std::tolower(b); }) != itemName.end()) {
+				// Filter using StringMatchesSearch for consistency
+				if (StringMatchesSearch(itemName, std::string(searchBuffer))) {
 
 					if (ImGui::Selectable(itemName.c_str(), itemName == selectedName)) {

This eliminates code duplication and ensures consistent search behavior across the codebase.

src/Menu.cpp (1)

510-510: Remove unused lambda capture.

The [this] capture is unnecessary since globals::truePBR is accessed via the globals namespace rather than through the this pointer. Consider removing the capture for cleaner code:

-		[this]() { globals::truePBR->DrawSettings(); },
+		[]() { globals::truePBR->DrawSettings(); },

This doesn't affect functionality but improves code clarity.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 268de33 and e1317c6.

📒 Files selected for processing (7)
  • src/Menu.cpp (2 hunks)
  • src/Menu/AdvancedSettingsRenderer.cpp (2 hunks)
  • src/Menu/AdvancedSettingsRenderer.h (2 hunks)
  • src/TruePBR.cpp (3 hunks)
  • src/TruePBR.h (1 hunks)
  • src/Utils/UI.cpp (1 hunks)
  • src/Utils/UI.h (2 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{cpp,cxx,cc,c,h,hpp,hxx,hlsl,hlsli,fx,fxh,py}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Do not include TODO/FIXME placeholders; provide complete, working solutions

Files:

  • src/TruePBR.h
  • src/TruePBR.cpp
  • src/Utils/UI.cpp
  • src/Menu/AdvancedSettingsRenderer.cpp
  • src/Utils/UI.h
  • src/Menu/AdvancedSettingsRenderer.h
  • src/Menu.cpp
src/**/*.{cpp,cxx,cc,h,hpp,hxx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{cpp,cxx,cc,h,hpp,hxx}: Ensure SE/AE/VR runtime compatibility; use runtime detection patterns (e.g., REL::RelocateMember())
Include robust error handling and resource management with graceful degradation in the plugin code

Files:

  • src/TruePBR.h
  • src/TruePBR.cpp
  • src/Utils/UI.cpp
  • src/Menu/AdvancedSettingsRenderer.cpp
  • src/Utils/UI.h
  • src/Menu/AdvancedSettingsRenderer.h
  • src/Menu.cpp
🧠 Learnings (4)
📓 Common learnings
Learnt from: alandtse
Repo: doodlum/skyrim-community-shaders PR: 0
File: :0-0
Timestamp: 2025-06-24T07:17:36.604Z
Learning: When reviewing PRs, always clarify the scope if there are multiple related features or dependencies. WeatherPicker was a separate PR that was already merged, while this PR focuses specifically on WetnessEffects climate preset system enhancements.
📚 Learning: 2025-08-17T18:37:35.839Z
Learnt from: CR
Repo: doodlum/skyrim-community-shaders PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-17T18:37:35.839Z
Learning: Applies to src/**/*.{cpp,cxx,cc,h,hpp,hxx} : Ensure SE/AE/VR runtime compatibility; use runtime detection patterns (e.g., REL::RelocateMember())

Applied to files:

  • src/TruePBR.h
📚 Learning: 2025-08-17T18:37:35.839Z
Learnt from: CR
Repo: doodlum/skyrim-community-shaders PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-17T18:37:35.839Z
Learning: Applies to features/**/*.{cpp,cxx,cc,h,hpp,hxx} : Register new features in the globals::features namespace

Applied to files:

  • src/Menu/AdvancedSettingsRenderer.cpp
📚 Learning: 2025-08-17T18:37:35.839Z
Learnt from: CR
Repo: doodlum/skyrim-community-shaders PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-17T18:37:35.839Z
Learning: Applies to features/**/*.{cpp,cxx,cc,h,hpp,hxx} : Feature classes must inherit from Feature (src/Feature.h) and implement DrawSettings(), LoadSettings(), and SaveSettings()

Applied to files:

  • src/Menu/AdvancedSettingsRenderer.cpp
🧬 Code graph analysis (4)
src/Menu/AdvancedSettingsRenderer.cpp (3)
src/Menu/FeatureListRenderer.cpp (2)
  • BeginTabItemWithFont (41-44)
  • BeginTabItemWithFont (41-41)
src/Utils/UI.h (1)
  • HoverTooltipWrapper (56-65)
src/Utils/UI.cpp (2)
  • HoverTooltipWrapper (35-42)
  • HoverTooltipWrapper (44-50)
src/Utils/UI.h (1)
src/Utils/UI.cpp (2)
  • StringMatchesSearch (739-752)
  • StringMatchesSearch (739-739)
src/Menu/AdvancedSettingsRenderer.h (1)
src/Menu/AdvancedSettingsRenderer.cpp (4)
  • RenderPBRSection (251-254)
  • RenderPBRSection (251-251)
  • RenderDisableAtBootSection (256-259)
  • RenderDisableAtBootSection (256-256)
src/Menu.cpp (1)
src/Feature.cpp (2)
  • GetFeatureList (200-261)
  • GetFeatureList (200-200)
🪛 Clang (14.0.6)
src/TruePBR.h

[error] 3-3: 'string' file not found

(clang-diagnostic-error)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build plugin and addons
🔇 Additional comments (12)
src/TruePBR.h (1)

3-4: LGTM: Required header for std::string usage.

The inclusion of <string> is necessary for the GetShortName() method on Line 23 that returns std::string. The static analysis error from Clang is likely a false positive related to the build environment configuration.

src/Menu/AdvancedSettingsRenderer.cpp (4)

23-73: LGTM: Well-structured tabbed interface.

The tabbed UI organization is a clear UX improvement:

  • All BeginTabBar/EndTabBar and BeginChild/EndChild pairs are properly matched
  • Consistent use of MenuFonts::BeginTabItemWithFont with Subheading font role across all tabs
  • Developer Tools tab appropriately gated behind developer mode check
  • Clean separation of concerns with each tab containing its own child region

251-259: LGTM: Clean delegation pattern.

The wrapper methods provide clean entry points for the tabbed UI while maintaining the existing callback-based design. The simple pass-through implementation is appropriate for this architectural pattern.


76-206: LGTM: Content preserved with improved organization.

The advanced section content has been successfully migrated to the new tabbed structure without functional changes. All controls, tooltips, and logic remain intact.


208-249: LGTM: Shader replacement logic preserved.

The shader replacement section has been successfully migrated to the tabbed UI without any functional changes. All shader type toggles and developer mode options remain intact.

src/TruePBR.cpp (2)

111-113: LGTM: Improved UX with searchable selection.

The replacement of direct ImGui::Combo with Util::SearchableCombo provides better user experience for selecting PBR texture sets and material objects, especially when dealing with large lists. The selection handling correctly updates the corresponding pointer to the selected item.

Also applies to: 198-200


1389-1396: LGTM: Efficient early exit optimization.

The early exit when no PS resources have been modified (mask == 0) is a good optimization that avoids unnecessary processing. The use of the [[likely]] attribute is appropriate here, as most frames will not have modified resources, making this the common path.

src/Menu/AdvancedSettingsRenderer.h (2)

4-4: LGTM: Required header addition.

The #include <string> is appropriate for supporting std::string usage in the codebase, particularly with the SearchableCombo and StringMatchesSearch utilities introduced in this PR.


19-20: LGTM: Well-designed private helpers.

The new private methods provide clean entry points for rendering PBR and Disable at Boot sections within the tabbed UI structure. The callback-based design maintains flexibility while keeping the implementation details encapsulated.

src/Utils/UI.h (1)

477-483: LGTM: Generic search utility.

The StringMatchesSearch function provides a reusable case-insensitive substring search that complements the existing FeatureMatchesSearch. Clear documentation and appropriate return type.

src/Menu.cpp (1)

519-564: LGTM: Improved organization with independent sections.

The restructuring enhances UX by:

  • Making the description always visible (no longer hidden under a collapsing header)
  • Separating Special Features and Features into independent collapsible sections
  • Sorting both sections alphabetically for easier navigation
  • Using DefaultOpen flag to keep sections expanded by default

The underlying logic for toggling disabled features is preserved correctly. This aligns well with the tabbed Advanced Settings UI introduced in AdvancedSettingsRenderer.cpp.

src/Utils/UI.cpp (1)

739-752: Running a broader search to confirm no other occurrences exist:

No duplicate definition issue found — implementation is correct.

The regex search of src/Utils/UI.cpp returned only one definition of StringMatchesSearch at line 739. Since a multiple definition error occurs when two or more definitions for the same function exist across source files, and this function exists in a single .cpp file (one translation unit), no duplicate definition is possible. The implementation correctly performs case-insensitive substring matching using std::transform and std::string::find().

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Nov 9, 2025

✅ A pre-release build is available for this PR:
Download

davo0411 and others added 2 commits November 16, 2025 19:39
Automated formatting by clang-format, prettier, and other hooks.
See https://pre-commit.ci for details.
@davo0411 davo0411 changed the title feat(ui): add tabs to advanced settings and PBR search feat(ui): add tabs to advanced settings &PBR search Nov 16, 2025
@davo0411 davo0411 changed the title feat(ui): add tabs to advanced settings &PBR search feat(ui): add tabs to advanced settings & PBR search Nov 16, 2025
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/Utils/UI.h (1)

829-863: RenderTableCell’s textColor extension is consistent and backward compatible

The new textColor parameter with an alpha-based sentinel (w > 0.0f) is applied and popped correctly, and defaults preserve existing behavior for all existing call sites. Integration in ShowInteractiveTable (row-level text coloring) looks clean and keeps highlighting and tooltip behavior intact.

If you find yourself using semantic colors frequently, consider a thin wrapper or enum-based helper around textColor to avoid repeating raw ImVec4 construction at call sites.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e1317c6 and c29c8c9.

📒 Files selected for processing (3)
  • src/Menu/AdvancedSettingsRenderer.cpp (3 hunks)
  • src/Utils/UI.cpp (1 hunks)
  • src/Utils/UI.h (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/Menu/AdvancedSettingsRenderer.cpp
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{cpp,cxx,cc,c,h,hpp,hxx,hlsl,hlsli,fx,fxh,py}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Do not include TODO/FIXME placeholders; provide complete, working solutions

Files:

  • src/Utils/UI.h
  • src/Utils/UI.cpp
src/**/*.{cpp,cxx,cc,h,hpp,hxx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{cpp,cxx,cc,h,hpp,hxx}: Ensure SE/AE/VR runtime compatibility; use runtime detection patterns (e.g., REL::RelocateMember())
Include robust error handling and resource management with graceful degradation in the plugin code

Files:

  • src/Utils/UI.h
  • src/Utils/UI.cpp
🧠 Learnings (1)
📓 Common learnings
Learnt from: alandtse
Repo: doodlum/skyrim-community-shaders PR: 0
File: :0-0
Timestamp: 2025-06-24T07:17:36.604Z
Learning: When reviewing PRs, always clarify the scope if there are multiple related features or dependencies. WeatherPicker was a separate PR that was already merged, while this PR focuses specifically on WetnessEffects climate preset system enhancements.
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build plugin and addons
🔇 Additional comments (2)
src/Utils/UI.h (1)

611-618: StringMatchesSearch API looks good and aligns with intended usage

The declaration here is clear, const-correct, and matches the implementation in UI.cpp. Centralizing case-insensitive matching behind this helper is a good direction, especially as more UI elements gain search/filter behavior.

src/Utils/UI.cpp (1)

776-789: Unable to locate referenced file and functions for verification

The file src/Utils/UI.cpp and the functions referenced in this review comment (StringMatchesSearch and RenderTextWithHighlights) could not be found in the repository. The repository structure may differ from what the review comment assumes, or these files may not be present in the current branch.

Without access to the actual code, I cannot verify:

  • Whether the function uses ::tolower directly on char
  • Whether <cctype> is included
  • Whether the safer unsigned char pattern exists elsewhere in the file
  • Whether the proposed changes are necessary or correct

Please confirm that the file paths and line numbers are accurate for this repository, or provide additional context about the codebase structure.

Comment thread src/Utils/UI.h
Comment on lines +754 to +815
/**
* @brief Renders a searchable combo box with case-insensitive filtering
*
* Provides a reusable ImGui combo box with built-in search functionality.
* When opened, automatically focuses a search input that filters items as you type.
* The search is case-insensitive and clears automatically on selection or close.
*
* @tparam T The value type stored in the map
* @param label The label for the combo box
* @param selectedName Reference to the currently selected item's name (will be updated on selection)
* @param itemMap The map of items to display (key = item name, value = item data)
* @return true if a new item was selected, false otherwise
*
* @note Uses a static search buffer, so only one SearchableCombo should be open at a time
*
* @example
* @code
* std::unordered_map<std::string, MyData> myItems;
* std::string selectedName;
* MyData* selectedItem = nullptr;
*
* if (Util::SearchableCombo("Choose Item", selectedName, myItems)) {
* selectedItem = &myItems[selectedName];
* }
* @endcode
*/
template <typename T>
bool SearchableCombo(const char* label, std::string& selectedName, std::unordered_map<std::string, T>& itemMap)
{
bool valueChanged = false;
static std::unordered_map<std::string, char[256]> searchBuffers;

std::string comboId = std::string(label);
auto& searchBuffer = searchBuffers[comboId];

if (ImGui::BeginCombo(label, selectedName.c_str())) {
ImGui::InputText("##search", searchBuffer, IM_ARRAYSIZE(searchBuffer));

ImGui::Separator();

// Filter and display items
for (auto& [itemName, item] : itemMap) {
// Simple case-insensitive search
if (searchBuffer[0] == '\0' ||
std::search(itemName.begin(), itemName.end(), searchBuffer, searchBuffer + strlen(searchBuffer),
[](char a, char b) { return std::tolower(a) == std::tolower(b); }) != itemName.end()) {
if (ImGui::Selectable(itemName.c_str(), itemName == selectedName)) {
selectedName = itemName;
valueChanged = true;
searchBuffer[0] = '\0'; // Clear search on selection
}
}
}

ImGui::EndCombo();
} else {
// Reset search when combo is closed
searchBuffer[0] = '\0';
}

return valueChanged;
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Fix SearchableCombo’s static buffer type and reuse StringMatchesSearch

Two issues here:

  1. static std::unordered_map<std::string, char[256]> searchBuffers; uses an array type as the map’s value. Arrays are not assignable/movable, which makes them an ill fit for standard containers and can fail to compile on stricter toolchains.
  2. The case-insensitive search logic duplicates what Util::StringMatchesSearch is supposed to provide, and again uses std::tolower on char, which risks UB for non-ASCII input.

You can address both by switching to std::array<char, 256> for the buffers and delegating matching to StringMatchesSearch. The header should also include the necessary STL headers so it’s self-contained.

Suggested changes:

Add required includes near the top of UI.h:

-#include <algorithm>
-#include <cfloat>  // For FLT_MAX
-#include <functional>
-#include <imgui.h>
-#include <string>
-#include <vector>
-#include <windows.h>  // For WPARAM and virtual key constants
+#include <algorithm>
+#include <cfloat>  // For FLT_MAX
+#include <functional>
+#include <imgui.h>
+#include <string>
+#include <vector>
+#include <array>
+#include <unordered_map>
+#include <windows.h>  // For WPARAM and virtual key constants

Update SearchableCombo to use std::array and StringMatchesSearch:

 template <typename T>
 bool SearchableCombo(const char* label, std::string& selectedName, std::unordered_map<std::string, T>& itemMap)
 {
-    bool valueChanged = false;
-    static std::unordered_map<std::string, char[256]> searchBuffers;
-
-    std::string comboId = std::string(label);
-    auto& searchBuffer = searchBuffers[comboId];
+    bool valueChanged = false;
+    // Per-combo persistent search buffer
+    static std::unordered_map<std::string, std::array<char, 256>> searchBuffers;
+
+    std::string comboId(label);
+    auto& searchBuffer = searchBuffers[comboId];

     if (ImGui::BeginCombo(label, selectedName.c_str())) {
-        ImGui::InputText("##search", searchBuffer, IM_ARRAYSIZE(searchBuffer));
+        ImGui::InputText("##search", searchBuffer.data(), static_cast<int>(searchBuffer.size()));

         ImGui::Separator();

         // Filter and display items
         for (auto& [itemName, item] : itemMap) {
-            // Simple case-insensitive search
-            if (searchBuffer[0] == '\0' ||
-                std::search(itemName.begin(), itemName.end(), searchBuffer, searchBuffer + strlen(searchBuffer),
-                    [](char a, char b) { return std::tolower(a) == std::tolower(b); }) != itemName.end()) {
+            const char* query = searchBuffer.data();
+            // Case-insensitive search using shared helper
+            if (query[0] == '\0' || Util::StringMatchesSearch(itemName, query)) {
                 if (ImGui::Selectable(itemName.c_str(), itemName == selectedName)) {
                     selectedName = itemName;
                     valueChanged = true;
                     searchBuffer[0] = '\0';  // Clear search on selection
                 }
             }
         }

         ImGui::EndCombo();
     } else {
         // Reset search when combo is closed
         searchBuffer[0] = '\0';
     }

     return valueChanged;
 }

This keeps the behavior and per-label buffering but removes the container/array correctness problem and centralizes your case-insensitive logic in one tested utility.


I'll verify the issues and proposed fixes by inspecting the codebase. Let me gather the necessary information.

</script>

🏁 Script executed:

#!/bin/bash
# 1. Check the current state of SearchableCombo in UI.h (lines 754-815)
echo "=== Checking SearchableCombo implementation ===" 
sed -n '754,815p' src/Utils/UI.h

echo -e "\n=== Checking includes at top of UI.h ===" 
head -50 src/Utils/UI.h | grep -E "^#include"

echo -e "\n=== Searching for StringMatchesSearch definition ===" 
rg -n "StringMatchesSearch" src/Utils/ -A 5 -B 2

echo -e "\n=== Checking for SearchableCombo usages ===" 
rg -n "SearchableCombo" --type=cpp --type=h -g "!UI.h"

echo -e "\n=== Verifying std::array compatibility with ImGui::InputText ===" 
rg -n "InputText.*array\|InputText.*\.data\|InputText.*\.size" src/ --type=cpp --type=h -B 2 -A 2

Length of output: 631


Let me locate the files first by searching the repository structure:

</script>

🏁 Script executed:

#!/bin/bash
# Find UI.h and related files
echo "=== Searching for UI.h files ===" 
fd "UI\.h" 

echo -e "\n=== Searching for files containing StringMatchesSearch ===" 
fd -e h -e hpp -e cpp | xargs rg -l "StringMatchesSearch" 2>/dev/null | head -20

echo -e "\n=== Searching for files containing SearchableCombo ===" 
fd -e h -e hpp -e cpp | xargs rg -l "SearchableCombo" 2>/dev/null

echo -e "\n=== Repository structure (top-level directories) ===" 
ls -la

Length of output: 552


Let me explore the repository structure more thoroughly:

</script>

🏁 Script executed:

#!/bin/bash
echo "=== Git status ===" 
git status

echo -e "\n=== Git branch info ===" 
git branch -a
git log --oneline -5

echo -e "\n=== All tracked files with UI or SearchableCombo ===" 
git ls-files | grep -i ui | head -20

echo -e "\n=== Directory tree of features/ ===" 
find features -type f -name "*.h" -o -name "*.cpp" | head -20

echo -e "\n=== All header and source files in repo ===" 
find . -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.cpp" -o -name "*.cc" \) | head -30

Length of output: 783


Now let me access the UI.h file using git:

</script>

🏁 Script executed:

#!/bin/bash
echo "=== Getting UI.h lines 754-815 ===" 
git show HEAD:src/Utils/UI.h | sed -n '754,815p'

echo -e "\n=== Checking top includes of UI.h ===" 
git show HEAD:src/Utils/UI.h | head -50 | grep -E "^#include"

echo -e "\n=== Searching for StringMatchesSearch in UI.h ===" 
git show HEAD:src/Utils/UI.h | grep -n "StringMatchesSearch" -A 10 -B 2

echo -e "\n=== Searching for StringMatchesSearch anywhere in src/ ===" 
git ls-files src/ | while read f; do git show HEAD:"$f" | grep -l "StringMatchesSearch" 2>/dev/null; done | head -10

echo -e "\n=== Checking for other SearchableCombo usages ===" 
git ls-files | xargs -I {} git show HEAD:{} 2>/dev/null | grep -n "SearchableCombo" | grep -v "^src/Utils/UI.h" | head -20

Length of output: 3346


Let me find the StringMatchesSearch implementation and verify the proposed fixes:

</script>

🏁 Script executed:

#!/bin/bash
echo "=== StringMatchesSearch implementation ===" 
git show HEAD:src/Utils/UI.cpp | grep -n "StringMatchesSearch" -A 15 | head -30

echo -e "\n=== Looking for ImGui::InputText usage examples in codebase ===" 
git show HEAD:src/Utils/UI.cpp | grep -n "InputText" -B 2 -A 2 | head -40

echo -e "\n=== Checking if std::array is already used in UI.h ===" 
git show HEAD:src/Utils/UI.h | grep -n "std::array" | head -10

echo -e "\n=== Checking if unordered_map is used in UI.h ===" 
git show HEAD:src/Utils/UI.h | grep -n "std::unordered_map\|#include.*unordered_map"

Length of output: 1282


Update SearchableCombo to use std::array and StringMatchesSearch

Both issues are confirmed:

  1. The static buffer uses std::unordered_map<std::string, char[256]>, where raw arrays cannot be stored in standard containers as they're not move/copy assignable, causing potential compilation failures on strict toolchains.

  2. The manual case-insensitive search logic duplicates functionality and uses std::tolower on individual char values, which risks undefined behavior for non-ASCII input. The codebase already has StringMatchesSearch (UI.cpp line 776-789) which performs safe case-insensitive substring matching using std::transform with ::tolower on complete strings.

All proposed fixes are valid. The includes <array> and <unordered_map> are missing from UI.h. The suggested updates correctly:

  • Replace char[256] with std::array<char, 256> for proper container compatibility
  • Use .data() and .size() for ImGui::InputText integration
  • Delegate matching to the existing StringMatchesSearch utility

Apply the suggested changes as provided in the review comment.

davo0411 and others added 2 commits November 16, 2025 20:50
Automated formatting by clang-format, prettier, and other hooks.
See https://pre-commit.ci for details.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/Utils/UI.h (1)

762-823: Fix SearchableCombo's static buffer type and reuse StringMatchesSearch

The issues flagged in the previous review remain unaddressed:

  1. Line 792: char[256] as a map value is not move/copy-assignable, which breaks standard container semantics and may fail compilation on stricter toolchains. Use std::array<char, 256> instead.

  2. Lines 805-807: The manual case-insensitive search duplicates StringMatchesSearch logic and uses std::tolower on individual char values, risking undefined behavior for non-ASCII input. Delegate to StringMatchesSearch instead.

  3. Missing includes: <array> and <unordered_map> are not included at the top of this header, making it non-self-contained.

Apply the previously suggested fix:

Add required includes near the top of UI.h:

 #include <algorithm>
 #include <cfloat>  // For FLT_MAX
 #include <functional>
 #include <imgui.h>
 #include <string>
 #include <vector>
+#include <array>
+#include <unordered_map>
 #include <windows.h>  // For WPARAM and virtual key constants

Update SearchableCombo (lines 789-823):

 template <typename T>
 bool SearchableCombo(const char* label, std::string& selectedName, std::unordered_map<std::string, T>& itemMap)
 {
     bool valueChanged = false;
-    static std::unordered_map<std::string, char[256]> searchBuffers;
+    static std::unordered_map<std::string, std::array<char, 256>> searchBuffers;
 
-    std::string comboId = std::string(label);
+    std::string comboId(label);
     auto& searchBuffer = searchBuffers[comboId];
 
     if (ImGui::BeginCombo(label, selectedName.c_str())) {
-        ImGui::InputText("##search", searchBuffer, IM_ARRAYSIZE(searchBuffer));
+        ImGui::InputText("##search", searchBuffer.data(), static_cast<int>(searchBuffer.size()));
 
         ImGui::Separator();
 
         // Filter and display items
         for (auto& [itemName, item] : itemMap) {
-            // Simple case-insensitive search
-            if (searchBuffer[0] == '\0' ||
-                std::search(itemName.begin(), itemName.end(), searchBuffer, searchBuffer + strlen(searchBuffer),
-                    [](char a, char b) { return std::tolower(a) == std::tolower(b); }) != itemName.end()) {
+            const char* query = searchBuffer.data();
+            if (query[0] == '\0' || Util::StringMatchesSearch(itemName, query)) {
                 if (ImGui::Selectable(itemName.c_str(), itemName == selectedName)) {
                     selectedName = itemName;
                     valueChanged = true;
                     searchBuffer[0] = '\0';  // Clear search on selection
                 }
             }
         }
 
         ImGui::EndCombo();
     } else {
         // Reset search when combo is closed
         searchBuffer[0] = '\0';
     }
 
     return valueChanged;
 }
🧹 Nitpick comments (2)
src/Menu/AdvancedSettingsRenderer.cpp (1)

297-301: Consider instance-level state for table filters.

The static filter/sort state variables are shared across all invocations. This works fine for a single menu instance but would cause state conflicts if multiple independent shader tables were rendered concurrently.

For future-proofing, consider moving this state into a member variable or passing it as a parameter from the caller.

src/Utils/UI.h (1)

837-837: Minor formatting: extra blank line.

The blank line between the doc comment and RenderTableCell definition is unnecessary and inconsistent with the rest of the file.

Remove line 837 for consistency.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c29c8c9 and 0b2a4e3.

📒 Files selected for processing (5)
  • src/Menu/AdvancedSettingsRenderer.cpp (7 hunks)
  • src/Menu/AdvancedSettingsRenderer.h (2 hunks)
  • src/ShaderCache.h (1 hunks)
  • src/Utils/UI.cpp (2 hunks)
  • src/Utils/UI.h (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/Menu/AdvancedSettingsRenderer.h
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{cpp,cxx,cc,c,h,hpp,hxx,hlsl,hlsli,fx,fxh,py}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Do not include TODO/FIXME placeholders; provide complete, working solutions

Files:

  • src/Utils/UI.cpp
  • src/Utils/UI.h
  • src/ShaderCache.h
  • src/Menu/AdvancedSettingsRenderer.cpp
src/**/*.{cpp,cxx,cc,h,hpp,hxx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{cpp,cxx,cc,h,hpp,hxx}: Ensure SE/AE/VR runtime compatibility; use runtime detection patterns (e.g., REL::RelocateMember())
Include robust error handling and resource management with graceful degradation in the plugin code

Files:

  • src/Utils/UI.cpp
  • src/Utils/UI.h
  • src/ShaderCache.h
  • src/Menu/AdvancedSettingsRenderer.cpp
🧠 Learnings (2)
📓 Common learnings
Learnt from: alandtse
Repo: doodlum/skyrim-community-shaders PR: 0
File: :0-0
Timestamp: 2025-06-24T07:17:36.604Z
Learning: When reviewing PRs, always clarify the scope if there are multiple related features or dependencies. WeatherPicker was a separate PR that was already merged, while this PR focuses specifically on WetnessEffects climate preset system enhancements.
📚 Learning: 2025-08-17T18:37:35.839Z
Learnt from: CR
Repo: doodlum/skyrim-community-shaders PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-17T18:37:35.839Z
Learning: Applies to features/**/*.{cpp,cxx,cc,h,hpp,hxx} : Feature classes must inherit from Feature (src/Feature.h) and implement DrawSettings(), LoadSettings(), and SaveSettings()

Applied to files:

  • src/Utils/UI.h
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build plugin and addons
🔇 Additional comments (8)
src/ShaderCache.h (1)

425-425: LGTM!

The new public API methods are well-formed. ToggleShaderBlocking provides programmatic control over shader blocking, and GetDiskCacheShaderPath appropriately returns the cache path with const-correctness.

Also applies to: 428-428

src/Menu/AdvancedSettingsRenderer.cpp (3)

11-11: LGTM!

The new includes support the tabbed UI structure (Fonts.h for BeginTabItemWithFont) and formatting utilities (Utils/Format.h).

Also applies to: 18-18


21-74: Well-structured tabbed UI.

The TabBar implementation properly isolates each settings category into dedicated tabs with correct nesting of BeginTabItemWithFont, BeginChild, content rendering, and cleanup calls.


76-140: Well-organized section extraction.

The newly extracted rendering functions (RenderLoggingSection, RenderShaderDebugSection, RenderPBRSection, RenderDisableAtBootSection, RenderDeveloperSection) properly encapsulate their respective UI concerns with correct ImGui patterns, tooltip usage, and state handling.

Also applies to: 142-208, 446-454, 456-502

src/Utils/UI.cpp (3)

776-789: LGTM!

The StringMatchesSearch implementation correctly performs case-insensitive substring matching using std::transform with ::tolower on complete strings, avoiding undefined behavior.


791-811: LGTM!

The DrawSearchIcon function correctly renders a theme-aware magnifying glass icon using ImDrawList primitives with proper alpha blending.


813-859: Good refactoring.

Delegating icon drawing to the new DrawSearchIcon helper eliminates duplication and ensures consistent icon rendering across search bars.

src/Utils/UI.h (1)

611-625: LGTM!

The new utility function declarations (StringMatchesSearch and DrawSearchIcon) are well-documented and match their implementations in UI.cpp.

Comment on lines +247 to +252
if (ImGui::SmallButton("Copy Info##BlockedShader")) {
std::string diskPathStr;
diskPathStr.resize(shader.diskPath.size());
std::transform(shader.diskPath.begin(), shader.diskPath.end(), diskPathStr.begin(),
[](wchar_t c) { return static_cast<char>(c); });
diskPathStr.reserve(shader.diskPath.size());
for (wchar_t wc : shader.diskPath) {
diskPathStr += static_cast<char>(wc);
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Unsafe wide-to-narrow string conversion.

The static_cast<char>(wc) conversion truncates wchar_t to 8 bits, corrupting non-ASCII characters in shader cache paths. Users with international characters in their paths (e.g., accented usernames) will see mojibake in the clipboard.

Use a proper UTF-8 conversion. Since diskPath is a std::wstring representing a filesystem path, you can leverage std::filesystem::path:

-					std::string diskPathStr;
-					diskPathStr.reserve(shader.diskPath.size());
-					for (wchar_t wc : shader.diskPath) {
-						diskPathStr += static_cast<char>(wc);
-					}
+					std::string diskPathStr = std::filesystem::path(shader.diskPath).string();

Apply the same fix at both occurrences (lines 247–252 and 347–350).

Also applies to: 347-350

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Utils/UI.h (1)

2-8: Add missing <unordered_map> include to prevent compilation failure.

The SearchableCombo template (line 792) uses std::unordered_map but the required header is not included. This will cause compilation errors when the template is instantiated.

Add the missing include:

 #include <algorithm>
 #include <cfloat>  // For FLT_MAX
 #include <functional>
 #include <imgui.h>
 #include <string>
+#include <unordered_map>
 #include <vector>
 #include <windows.h>  // For WPARAM and virtual key constants

Note: If you apply the suggested std::array fix from the previous review comment, you'll also need to add #include <array>.

♻️ Duplicate comments (1)
src/Utils/UI.h (1)

762-827: Apply the fixes from the previous review comment.

The issues identified in the previous review comment are still present in this code:

  1. Line 792: char[256] as a map value type is not move/copy assignable, causing potential compilation failures on strict toolchains.
  2. Lines 809-811: Manual case-insensitive search using std::tolower on individual char values risks undefined behavior for non-ASCII input and duplicates the logic that StringMatchesSearch already provides.

Please apply the comprehensive fixes suggested in the previous review comment, which addresses both issues by:

  • Switching to std::array<char, 256> for proper container compatibility
  • Delegating search matching to the existing StringMatchesSearch utility function
🧹 Nitpick comments (1)
src/Utils/UI.h (1)

841-841: The inline keyword is redundant but harmless.

Functions defined in headers are already implicitly inline, so the explicit inline keyword on line 841 is redundant. However, it does make the intent explicit and doesn't cause any issues, so this is purely stylistic.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0b2a4e3 and a212cde.

📒 Files selected for processing (1)
  • src/Utils/UI.h (3 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{cpp,cxx,cc,c,h,hpp,hxx,hlsl,hlsli,fx,fxh,py}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Do not include TODO/FIXME placeholders; provide complete, working solutions

Files:

  • src/Utils/UI.h
src/**/*.{cpp,cxx,cc,h,hpp,hxx}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{cpp,cxx,cc,h,hpp,hxx}: Ensure SE/AE/VR runtime compatibility; use runtime detection patterns (e.g., REL::RelocateMember())
Include robust error handling and resource management with graceful degradation in the plugin code

Files:

  • src/Utils/UI.h
🧠 Learnings (2)
📓 Common learnings
Learnt from: alandtse
Repo: doodlum/skyrim-community-shaders PR: 0
File: :0-0
Timestamp: 2025-06-24T07:17:36.604Z
Learning: When reviewing PRs, always clarify the scope if there are multiple related features or dependencies. WeatherPicker was a separate PR that was already merged, while this PR focuses specifically on WetnessEffects climate preset system enhancements.
📚 Learning: 2025-08-17T18:37:35.839Z
Learnt from: CR
Repo: doodlum/skyrim-community-shaders PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-08-17T18:37:35.839Z
Learning: Applies to features/**/*.{cpp,cxx,cc,h,hpp,hxx} : Feature classes must inherit from Feature (src/Feature.h) and implement DrawSettings(), LoadSettings(), and SaveSettings()

Applied to files:

  • src/Utils/UI.h
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build plugin and addons
🔇 Additional comments (2)
src/Utils/UI.h (2)

611-617: LGTM!

The StringMatchesSearch utility function is well-documented and provides a centralized, reusable solution for case-insensitive search matching throughout the UI code.


619-625: LGTM!

The DrawSearchIcon function provides a reusable visual indicator for search inputs, promoting UI consistency across the codebase.

@alandtse
Copy link
Copy Markdown
Collaborator

Please address ai comments and also confirm you've actually tested functionality didn't break with your menu changes.

@doodlum doodlum merged commit 4612c18 into community-shaders:dev Nov 28, 2025
15 checks passed
jiayev pushed a commit to jiayev/skyrim-community-shaders that referenced this pull request Dec 4, 2025
…rs#1599)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
davo0411 added a commit to davo0411/skyrim-community-shaders that referenced this pull request Dec 8, 2025
* build(deps): remove orphaned Intel XeSS dependency (community-shaders#1611)

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix(ui): enter key now behaves properly when first time popup is open (community-shaders#1615)

* feat(ui): add tabs to advanced settings & PBR search (community-shaders#1599)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* build: add HLSL intellisense (community-shaders#1614)

* refactor(UI): move light limit visualization into debug (community-shaders#1619)

* refactor(ui): add settings for shader block hotkeys (community-shaders#1624)

Co-authored-by: Bruce <44987693+brucenguyen@users.noreply.github.com>

* fix(ui): anchor reset settings button position  (community-shaders#1621)

Co-authored-by: Giovanni Correia <Gistix@users.noreply.github.com>

* fix(hair): use indirect normal for deferred marschner hair (community-shaders#1626)

* build: fix Package-AIO-Manual for fresh pulls (community-shaders#1625)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(snow): use world space vectors (community-shaders#1618)

---------

Co-authored-by: Alan Tse <alandtse@users.noreply.github.com>
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Co-authored-by: soda <130315225+soda3000@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Giovanni Correia <Gistix@users.noreply.github.com>
Co-authored-by: Bruce <44987693+brucenguyen@users.noreply.github.com>
Co-authored-by: Midona <106106405+midona-rhel@users.noreply.github.com>
Co-authored-by: jiayev <l936249247@hotmail.com>
Pentalimbed pushed a commit to Pentalimbed/skyrim-community-shaders that referenced this pull request Dec 16, 2025
* chore(ui): update discord banner (community-shaders#1493)

* fix: use proper filename settingsuser.json (community-shaders#1491)

* chore(upscaling): increase fsr sharpness

* chore: rename d3d12interop to d3d12SwapChainActive (community-shaders#1494)

* feat(llf): remove particle lights (community-shaders#1495)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* feat(llf): move llf to core (community-shaders#1496)

* fix: remove water clamp (community-shaders#1497)

* fix(upscaling): more upscaling fixes (community-shaders#1498)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix: fix some internal errors when debugging (community-shaders#1500)

* fix(ui): fix save settings conflicts & welcome screen (community-shaders#1501)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(ui): add constraints for discord banner size (community-shaders#1463)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: doodlum <15017472+doodlum@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(VR): fix exiting menu using controllers (community-shaders#1502)

* build: fix warnings (community-shaders#1505)

* feat(UI): allow tooltips for disabled elements (community-shaders#1503)

* feat(upscaling): add downscale percentages (community-shaders#1506)

* perf(ssgi): optimize  (community-shaders#1499)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* feat(ui): font size and perf overlay improvements (community-shaders#1511)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* chore: remove unused hooks (community-shaders#1510)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix: adjust IsInterior to consider kNoSky or kFixedDimensions flags (community-shaders#1512)

* fix(hair): correct hair indirect normal, marschner by default (community-shaders#1515)

Co-authored-by: doodlum <15017472+doodlum@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* chore: mostly revert ISHDR to 1.3.6 (community-shaders#1516)

* chore(upscaling): simplify interop and upscale methods (community-shaders#1514)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(hair): typo in code (community-shaders#1517)

* feat(ibl): lerp sky ibl using skylighting (community-shaders#1519)

* fix(sss): burley artifacts with effect blend (community-shaders#1518)

* fix(upscaling): fix screenshots when upscaling enabled (community-shaders#1520)

* fix(upscaling): fix mipbias sometimes being wrong (community-shaders#1521)

* fix: fix compile error if snow shader on (community-shaders#1522)

* chore(upscaling): revert fsr to typical settings (community-shaders#1523)

* fix: fix minor ui issues (community-shaders#1524)

* chore(grass collision): simpler grass collision (community-shaders#1525)

* fix: update skylighting and version

* fix(pbr): fix inconsistencies (community-shaders#1526)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: jiayev <l936249247@hotmail.com>

* feat(upscaling): sharpening slider (community-shaders#1527)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* chore: bump versions

* fix(ibl): add ibl to reflection normalization (community-shaders#1528)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(hair): remove pbr lighting mult for hair (community-shaders#1531)

* chore(upscaling): add back upscale multiplier (community-shaders#1532)

* fix(upscaling): fix minor upscaling issues (community-shaders#1536)

* chore: gamma space normalisation (community-shaders#1535)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* feat(grass collision): implement with texture and history (community-shaders#1539)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* chore(grass collision): less aggressive (community-shaders#1546)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(skylighting): fix cell id casting (community-shaders#1544)

* chore(emat): auto detect terrain parallax (community-shaders#1545)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* chore: update versions

* feat(VR): enable upscaling (community-shaders#1507)

* fix(terrain shadows): fix brightened lods (community-shaders#1547)

* chore(upscaling): reduce ghosting near camera (community-shaders#1548)

* fix: fix grass not animating (community-shaders#1549)

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(grass collision): fix non-standard timescales (community-shaders#1550)

* build: deploy only updated files (community-shaders#1556)

* feat: add Clear Shader Cache to Advanced (community-shaders#1555)

* chore(featureissues): default collapse testing menu (community-shaders#1554)

* fix(VR): use only supported shaders from cache (community-shaders#1553)

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* build: use gersemi cmake formatter (community-shaders#1557)

* fix(terrain): vanilla diffuse in pbr terrain cell too bright due to wrong color space (community-shaders#1558)

* docs: add new feature development template guide (community-shaders#1529)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* docs(UI): remove duplicate GPL license statement (community-shaders#1561)

* feat: add renderdoc for debugging (community-shaders#1560)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: alandtse <7086117+alandtse@users.noreply.github.com>
Co-authored-by: Alan Tse <alandtse@gmail.com>

* fix(ui): welcome popup size issues (community-shaders#1573)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* chore(grass collision): minor tweaks (community-shaders#1568)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(terrain helper): fix conflicting bit (community-shaders#1566)

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* feat(UI): separate theme settings, UI refactor, font support (community-shaders#1571)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* chore: bump versions

* build: fix zipping aio (community-shaders#1579)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(grass collision): clamp maximum depth of grass (community-shaders#1578)

* feat(UI): enhance shader blocking (community-shaders#1564)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: alandtse <7086117+alandtse@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Alan Tse <alandtse@gmail.com>

* fix: remove duplicate buffer setup (community-shaders#1586)

* feat: update shader compile elapsed time every second (community-shaders#1587)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* build: add cmake install commands (community-shaders#1372)

* feat(perf-overlay): add size controls (community-shaders#1591)

* fix(perf-overlay): fix infinite draw calls table height (community-shaders#1590)

* refactor(perf-overlay): remove collapsible headers (community-shaders#1572)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(perf-overlay): removed ImGuiTableFlags_ScrollX/Y for scroll bar issues (community-shaders#1594)

* build: fix shader copying to relative paths (community-shaders#1603)

* fix(ibl): apply ibl to cubemap normalisation for non deferred (community-shaders#1604)

* fix(grass): use correct light direction (community-shaders#1602)

* fix(welcome-popup): adjust font size & window spacing (community-shaders#1592)

* feat(lod): add gamma sliders (community-shaders#1588)

* build: correct CodeRabbit schema syntax (community-shaders#1608)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: alandtse <7086117+alandtse@users.noreply.github.com>

* build: add compile-time validation of GPU buffers (community-shaders#1427)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: alandtse <7086117+alandtse@users.noreply.github.com>

* ci: run shader validation on CMake and CI config changes (community-shaders#1606)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: alandtse <7086117+alandtse@users.noreply.github.com>

* feat: procedural sun

* limb darkening

* another darkening

* build(deps): remove orphaned Intel XeSS dependency (community-shaders#1611)

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix: accumulate sunlight color in pixel shader output

* fix(ui): enter key now behaves properly when first time popup is open (community-shaders#1615)

* feat(ui): add tabs to advanced settings & PBR search (community-shaders#1599)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* build: add HLSL intellisense (community-shaders#1614)

* refactor(UI): move light limit visualization into debug (community-shaders#1619)

* refactor(ui): add settings for shader block hotkeys (community-shaders#1624)

Co-authored-by: Bruce <44987693+brucenguyen@users.noreply.github.com>

* fix(ui): anchor reset settings button position  (community-shaders#1621)

Co-authored-by: Giovanni Correia <Gistix@users.noreply.github.com>

* fix(hair): use indirect normal for deferred marschner hair (community-shaders#1626)

* build: fix Package-AIO-Manual for fresh pulls (community-shaders#1625)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(snow): use world space vectors (community-shaders#1618)

* feat(UI): add gaussian blur shader core files (community-shaders#1595)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* feat(ui): add test conditions button (community-shaders#1637)

* fix(ui): blocked shader info overflow in Shader Debug tab (community-shaders#1632)

* fix(upscaling): replace NIS with RCAS for DLSS (community-shaders#1620)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix(dynamic cubemaps): add a check for timeskip (community-shaders#1639)

* refactor: restructure lighting (community-shaders#1633)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* feat(ui): add themes & fonts (community-shaders#1596)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* feat(water): add flowmap parallax (community-shaders#1636)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* fix cloud shadow setting saving

---------

Co-authored-by: zxcvbn <66063766+zndxcvbn@users.noreply.github.com>
Co-authored-by: davo0411 <davidkehoe0411@outlook.com>
Co-authored-by: doodlum <15017472+doodlum@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Alan Tse <alandtse@users.noreply.github.com>
Co-authored-by: soda <130315225+soda3000@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: ThePagi <32794457+ThePagi@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: alandtse <7086117+alandtse@users.noreply.github.com>
Co-authored-by: Alan Tse <alandtse@gmail.com>
Co-authored-by: Yupeng Zhang <ArcEarth@outlook.com>
Co-authored-by: kuplion <kuplion@hotmail.com>
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
Co-authored-by: Giovanni Correia <Gistix@users.noreply.github.com>
Co-authored-by: Bruce <44987693+brucenguyen@users.noreply.github.com>
Co-authored-by: Midona <106106405+midona-rhel@users.noreply.github.com>
@davo0411 davo0411 deleted the Advanced-cleanup branch December 31, 2025 04:36
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.

3 participants