feat: add brightness slider to Video settings

Black overlay dims below 50%, white overlay brightens above 50%.
Persisted in settings.cfg, with restore-defaults support.
This commit is contained in:
Kelsi 2026-03-17 09:04:53 -07:00
parent cf3fe70f1f
commit 192c6175b8
4 changed files with 40 additions and 0 deletions

View file

@ -5287,6 +5287,13 @@ void Renderer::renderWorld(game::World* world, game::GameHandler* gameHandler) {
renderOverlay(tint, cmd);
}
}
// Brightness overlay (applied before minimap so it doesn't affect UI)
if (brightness_ < 0.99f) {
renderOverlay(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f - brightness_), cmd);
} else if (brightness_ > 1.01f) {
float alpha = (brightness_ - 1.0f) / 1.0f; // maps 1.0-2.0 → 0.0-1.0
renderOverlay(glm::vec4(1.0f, 1.0f, 1.0f, alpha), cmd);
}
if (minimap && minimap->isEnabled() && camera && window) {
glm::vec3 minimapCenter = camera->getPosition();
if (cameraController && cameraController->isThirdPerson())
@ -5421,6 +5428,13 @@ void Renderer::renderWorld(game::World* world, game::GameHandler* gameHandler) {
renderOverlay(tint);
}
}
// Brightness overlay (applied before minimap so it doesn't affect UI)
if (brightness_ < 0.99f) {
renderOverlay(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f - brightness_));
} else if (brightness_ > 1.01f) {
float alpha = (brightness_ - 1.0f) / 1.0f;
renderOverlay(glm::vec4(1.0f, 1.0f, 1.0f, alpha));
}
if (minimap && minimap->isEnabled() && camera && window) {
glm::vec3 minimapCenter = camera->getPosition();
if (cameraController && cameraController->isThirdPerson())

View file

@ -14900,6 +14900,16 @@ void GameScreen::renderSettingsWindow() {
ImGui::Separator();
ImGui::Spacing();
ImGui::SetNextItemWidth(200.0f);
if (ImGui::SliderInt("Brightness", &pendingBrightness, 0, 100, "%d%%")) {
if (renderer) renderer->setBrightness(static_cast<float>(pendingBrightness) / 50.0f);
saveSettings();
}
ImGui::Spacing();
ImGui::Separator();
ImGui::Spacing();
if (ImGui::Button("Restore Video Defaults", ImVec2(-1, 0))) {
pendingFullscreen = kDefaultFullscreen;
pendingVsync = kDefaultVsync;
@ -14912,9 +14922,11 @@ void GameScreen::renderSettingsWindow() {
pendingPOM = true;
pendingPOMQuality = 1;
pendingResIndex = defaultResIndex;
pendingBrightness = 50;
window->setFullscreen(pendingFullscreen);
window->setVsync(pendingVsync);
window->applyResolution(kResolutions[pendingResIndex][0], kResolutions[pendingResIndex][1]);
if (renderer) renderer->setBrightness(1.0f);
pendingWaterRefraction = false;
if (renderer) {
renderer->setShadowsEnabled(pendingShadows);
@ -17284,6 +17296,7 @@ void GameScreen::saveSettings() {
out << "ground_clutter_density=" << pendingGroundClutterDensity << "\n";
out << "shadows=" << (pendingShadows ? 1 : 0) << "\n";
out << "shadow_distance=" << pendingShadowDistance << "\n";
out << "brightness=" << pendingBrightness << "\n";
out << "water_refraction=" << (pendingWaterRefraction ? 1 : 0) << "\n";
out << "antialiasing=" << pendingAntiAliasing << "\n";
out << "fxaa=" << (pendingFXAA ? 1 : 0) << "\n";
@ -17428,6 +17441,11 @@ void GameScreen::loadSettings() {
else if (key == "ground_clutter_density") pendingGroundClutterDensity = std::clamp(std::stoi(val), 0, 150);
else if (key == "shadows") pendingShadows = (std::stoi(val) != 0);
else if (key == "shadow_distance") pendingShadowDistance = std::clamp(std::stof(val), 40.0f, 500.0f);
else if (key == "brightness") {
pendingBrightness = std::clamp(std::stoi(val), 0, 100);
if (auto* r = core::Application::getInstance().getRenderer())
r->setBrightness(static_cast<float>(pendingBrightness) / 50.0f);
}
else if (key == "water_refraction") pendingWaterRefraction = (std::stoi(val) != 0);
else if (key == "antialiasing") pendingAntiAliasing = std::clamp(std::stoi(val), 0, 3);
else if (key == "fxaa") pendingFXAA = (std::stoi(val) != 0);