Add OSD shader driving
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <imgui.h>
|
||||
#include <reshade.hpp>
|
||||
#include <string>
|
||||
#include <chrono>
|
||||
#include <Windows.h>
|
||||
|
||||
// Screen informations
|
||||
@@ -40,7 +41,6 @@ static bool CA_fix_enabled = false;
|
||||
static bool Vignetting_fix_enabled = false;
|
||||
static bool Fog_fix_enabled = false;
|
||||
static bool Time_Dilation_fix_enabled = false;
|
||||
static bool prev_TimeDilation = Time_Dilation_fix_enabled;
|
||||
static bool fix_enabled = false;
|
||||
static bool console = true;
|
||||
static int worldFOVValue = 0;
|
||||
@@ -49,12 +49,19 @@ static int cameraOffsetValue = 0;
|
||||
static float worldTimeDilationValue = 1.f;
|
||||
static float AITimeDilationValue = 1.f;
|
||||
static float cameraSmoothnessValue = 3.5f;
|
||||
static float OSD_duration = 3.f;
|
||||
|
||||
// Overlays popups
|
||||
static bool popup_Informations = false;
|
||||
static bool show_log_overlay = false;
|
||||
static std::string log_content;
|
||||
|
||||
// Shader toggles
|
||||
static reshade::api::effect_uniform_variable u_td_show = {};
|
||||
static reshade::api::effect_uniform_variable u_td_enabled = {};
|
||||
static reshade::api::effect_uniform_variable u_td_world = {};
|
||||
static reshade::api::effect_uniform_variable u_td_AI = {};
|
||||
|
||||
// Plugin settings
|
||||
const std::string SETTINGS_FILE = "./pluginsettings.ini";
|
||||
const char* FIX_VERSION = "0.9.5";
|
||||
@@ -64,6 +71,7 @@ const char* DONATION_URL = "https://buymeacoffee.com/k4sh44";
|
||||
// Scaling factor based on screen resolution
|
||||
float scale = (float)screenHeight / 1200;
|
||||
|
||||
// Plugin sig
|
||||
extern "C" __declspec(dllexport) const char* NAME = "The Callisto Protocol";
|
||||
extern "C" __declspec(dllexport) const char* DESCRIPTION = "Reshade addon to re-enable console, control FOV, camera distance, time dilation, HUD and some effects.";
|
||||
|
||||
@@ -124,6 +132,7 @@ static void SaveSettings()
|
||||
"Set Console to false if you don't want dev console to be enabled"});
|
||||
pluginIniFile["1#General fix"]["Enabled"] = fix_enabled;
|
||||
pluginIniFile["1#General fix"]["Console"] = console;
|
||||
pluginIniFile["1#General fix"]["OSD duration"] = OSD_duration;
|
||||
pluginIniFile["2#Individual fix"].setComment("Controls each fix individually");
|
||||
pluginIniFile["2#Individual fix"]["FOV"] = fov_fix_enabled;
|
||||
pluginIniFile["2#Individual fix"]["Camera"] = Camera_fix_enabled;
|
||||
@@ -150,6 +159,7 @@ static void LoadSettings()
|
||||
pluginIniFile.load(SETTINGS_FILE);
|
||||
fix_enabled = pluginIniFile["1#General fix"]["Enabled"].as<bool>();
|
||||
console = pluginIniFile["1#General fix"]["Console"].as<bool>();
|
||||
OSD_duration = pluginIniFile["1#General fix"]["OSD duration"].as<float>();
|
||||
fov_fix_enabled = pluginIniFile["2#Individual fix"]["FOV"].as<bool>();
|
||||
HUD_fix_enabled = pluginIniFile["2#Individual fix"]["HUD"].as<bool>();
|
||||
Camera_fix_enabled = pluginIniFile["2#Individual fix"]["Camera"].as<bool>();
|
||||
@@ -168,17 +178,18 @@ static void LoadSettings()
|
||||
}
|
||||
|
||||
// Read plugin log file
|
||||
void read_log_file(const std::string& filename) {
|
||||
static std::string read_log_file(const std::string& filename) {
|
||||
std::ifstream file(filename);
|
||||
if (!file.is_open())
|
||||
{
|
||||
log_content = "Impossible to open file : " + filename;
|
||||
return;
|
||||
std::string log;
|
||||
if (!file.is_open()) {
|
||||
log = "Impossible to open file : " + filename;
|
||||
return log;
|
||||
}
|
||||
|
||||
std::ostringstream ss;
|
||||
ss << file.rdbuf();
|
||||
log_content = ss.str();
|
||||
log = ss.str();
|
||||
return log;
|
||||
}
|
||||
|
||||
// Initialize ImGui widgets for Reshade
|
||||
@@ -202,7 +213,7 @@ static void on_overlay_draw(reshade::api::effect_runtime* runtime)
|
||||
if (ImGui::Button("Fix informations")) popup_Informations = true; // Fix information
|
||||
ImGui::SameLine();
|
||||
if (ImGui::Button("View logs")) {
|
||||
read_log_file("TheCallistoProtocol.log");
|
||||
log_content = read_log_file("TheCallistoProtocol.log");
|
||||
show_log_overlay = true; // Fix information
|
||||
}
|
||||
|
||||
@@ -281,19 +292,18 @@ static void on_overlay_draw(reshade::api::effect_runtime* runtime)
|
||||
if (SetFixesEnabled) SetFixesEnabled(GameFixes::ChromaticAberrations, CA_fix_enabled);
|
||||
SaveSettings();
|
||||
}
|
||||
|
||||
ImGui::EndTable();
|
||||
}
|
||||
}
|
||||
ImGui::EndTable();
|
||||
}
|
||||
|
||||
// Sliders
|
||||
if (ImGui::BeginTable("SlidersTable", 2, ImGuiTableFlags_SizingStretchSame)) {
|
||||
ImGui::TableSetupColumn("LeftSliders", ImGuiTableColumnFlags_WidthStretch, 0.5f);
|
||||
ImGui::TableSetupColumn("RightSliders", ImGuiTableColumnFlags_WidthStretch, 0.5f);
|
||||
ImGui::TableNextRow();
|
||||
|
||||
// Sliders
|
||||
ImGui::TableSetColumnIndex(0);
|
||||
if (ImGui::CollapsingHeader("In game additional FOV", ImGuiTreeNodeFlags_DefaultOpen))
|
||||
{
|
||||
@@ -346,7 +356,10 @@ static void on_overlay_draw(reshade::api::effect_runtime* runtime)
|
||||
|
||||
if (ImGui::BeginTabItem("Cheats"))
|
||||
{
|
||||
ImGui::Checkbox("Time dilation", &Time_Dilation_fix_enabled);
|
||||
if (ImGui::Checkbox("Time dilation", &Time_Dilation_fix_enabled)) {
|
||||
if (SetFixesEnabled) SetFixesEnabled(GameFixes::WorldTimeDilation, Time_Dilation_fix_enabled);
|
||||
SaveSettings();
|
||||
}
|
||||
if (ImGui::IsItemHovered()) {
|
||||
ImGui::BeginTooltip();
|
||||
ImGui::Text("Use ALT + F1 shortcut to de/activate.");
|
||||
@@ -409,21 +422,56 @@ static void on_overlay_draw(reshade::api::effect_runtime* runtime)
|
||||
}
|
||||
|
||||
static void on_reshade_present(reshade::api::effect_runtime* runtime) {
|
||||
if (!runtime) return; // Ensure runtime is valid
|
||||
|
||||
static bool wasTimeDilationInvoked = false;
|
||||
static float OSD_local_duration = OSD_duration;
|
||||
static auto last_time = std::chrono::steady_clock::now();
|
||||
|
||||
// ---- Delta time ----
|
||||
auto now = std::chrono::steady_clock::now();
|
||||
float delta_time = std::chrono::duration<float>(now - last_time).count();
|
||||
last_time = now;
|
||||
|
||||
// ---- ALT+F1 toggle ----
|
||||
bool timeDilationInvoked = runtime->is_key_down(VK_MENU) && runtime->is_key_down(VK_F1);
|
||||
|
||||
if (timeDilationInvoked && !wasTimeDilationInvoked)
|
||||
{
|
||||
Time_Dilation_fix_enabled = !Time_Dilation_fix_enabled;
|
||||
OSD_local_duration = OSD_duration;
|
||||
|
||||
// Apply values in the shader
|
||||
if (u_td_show.handle && u_td_enabled.handle && u_td_world.handle && u_td_AI.handle) {
|
||||
runtime->set_uniform_value_bool(u_td_enabled, Time_Dilation_fix_enabled);
|
||||
runtime->set_uniform_value_bool(u_td_show, true);
|
||||
runtime->set_uniform_value_float(u_td_world, worldTimeDilationValue);
|
||||
runtime->set_uniform_value_float(u_td_AI, AITimeDilationValue);
|
||||
}
|
||||
|
||||
if (SetFixesEnabled) SetFixesEnabled(GameFixes::WorldTimeDilation, Time_Dilation_fix_enabled);
|
||||
SaveSettings();
|
||||
}
|
||||
wasTimeDilationInvoked = timeDilationInvoked;
|
||||
|
||||
if (prev_TimeDilation != Time_Dilation_fix_enabled) {
|
||||
if (SetFixesEnabled) SetFixesEnabled(GameFixes::WorldTimeDilation, Time_Dilation_fix_enabled); // Apply cheat
|
||||
SaveSettings();
|
||||
prev_TimeDilation = Time_Dilation_fix_enabled;
|
||||
if (OSD_local_duration > 0.0f) { // ---- Timer to hide OSD ----
|
||||
OSD_local_duration -= delta_time;
|
||||
if (OSD_local_duration <= 0.0f) {
|
||||
if (u_td_show.handle) runtime->set_uniform_value_bool(u_td_show, false);
|
||||
|
||||
OSD_local_duration = 0.0f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Retrieve all shader uniform variables
|
||||
static void on_reshade_begin_effects(reshade::api::effect_runtime* runtime, reshade::api::command_list* cmd_list,
|
||||
reshade::api::resource_view rtv, reshade::api::resource_view rtv_srgb) {
|
||||
u_td_show = runtime->find_uniform_variable(nullptr, "TD_Show");
|
||||
u_td_enabled = runtime->find_uniform_variable(nullptr, "TD_Enabled");
|
||||
u_td_world = runtime->find_uniform_variable(nullptr, "TD_World");
|
||||
u_td_AI = runtime->find_uniform_variable(nullptr, "TD_AI");
|
||||
}
|
||||
|
||||
// Main dll intrance
|
||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID)
|
||||
{
|
||||
@@ -440,9 +488,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD ul_reason_for_call, LPVOID)
|
||||
LoadFixDLL();
|
||||
});
|
||||
reshade::register_event<reshade::addon_event::reshade_present>(&on_reshade_present);
|
||||
reshade::register_event<reshade::addon_event::reshade_begin_effects>(&on_reshade_begin_effects);
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
reshade::unregister_event<reshade::addon_event::reshade_present>(&on_reshade_present);
|
||||
reshade::unregister_event<reshade::addon_event::reshade_begin_effects>(&on_reshade_begin_effects);
|
||||
reshade::unregister_addon(hinstDLL);
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user