2022-03-21 21:52:44 -04:00
# include "SohImGuiImpl.h"
# include <iostream>
2022-04-03 15:47:24 -04:00
# include <map>
2022-03-21 21:52:44 -04:00
# include <utility>
2022-04-26 19:50:24 -04:00
# include <string>
# include <algorithm>
# include <vector>
2022-03-21 21:52:44 -04:00
# include "Archive.h"
# include "Environment.h"
# include "GameSettings.h"
# include "SohConsole.h"
# include "SohHooks.h"
# include "Lib/ImGui/imgui_internal.h"
# include "GlobalCtx2.h"
# include "ResourceMgr.h"
# include "TextureMod.h"
# include "Window.h"
# include "Cvar.h"
2022-05-11 13:35:03 -04:00
# include "GameOverlay.h"
2022-04-03 15:47:24 -04:00
# include "Texture.h"
2022-03-21 21:52:44 -04:00
# include "../Fast3D/gfx_pc.h"
# include "Lib/stb/stb_image.h"
# include "Lib/Fast3D/gfx_rendering_api.h"
2022-04-03 15:47:24 -04:00
# include "Lib/spdlog/include/spdlog/common.h"
2022-03-21 21:52:44 -04:00
# include "Utils/StringHelper.h"
# ifdef ENABLE_OPENGL
# include "Lib/ImGui/backends/imgui_impl_opengl3.h"
# include "Lib/ImGui/backends/imgui_impl_sdl.h"
# endif
# if defined(ENABLE_DX11) || defined(ENABLE_DX12)
# include "Lib/ImGui/backends/imgui_impl_dx11.h"
# include "Lib/ImGui/backends/imgui_impl_win32.h"
# include <Windows.h>
IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler ( HWND hWnd , UINT msg , WPARAM wParam , LPARAM lParam ) ;
# endif
using namespace Ship ;
bool oldCursorState = true ;
2022-05-11 10:59:56 -04:00
# define EXPERIMENTAL() \
ImGui : : PushStyleColor ( ImGuiCol_Text , IM_COL32 ( 255 , 50 , 50 , 255 ) ) ; \
ImGui : : Text ( " Experimental " ) ; \
ImGui : : PopStyleColor ( ) ; \
ImGui : : Separator ( ) ;
2022-03-21 21:52:44 -04:00
# define TOGGLE_BTN ImGuiKey_F1
# define HOOK(b) if(b) needs_save = true;
OSContPad * pads ;
std : : map < std : : string , GameAsset * > DefaultAssets ;
namespace SohImGui {
WindowImpl impl ;
ImGuiIO * io ;
Console * console = new Console ;
2022-05-11 13:35:03 -04:00
GameOverlay * overlay = new GameOverlay ;
2022-03-21 21:52:44 -04:00
bool p_open = false ;
bool needs_save = false ;
2022-05-11 13:35:03 -04:00
std : : vector < const char * > CustomTexts ;
2022-05-02 18:24:12 -04:00
int SelectedLanguage = CVar_GetS32 ( " gLanguages " , 0 ) ; //Default Language to 0=English 1=German 2=French
2022-05-21 13:16:28 -04:00
int SelectedHUD = CVar_GetS32 ( " gHudColors " , 1 ) ; //Default colors to Gamecube.
float hearts_colors [ 3 ] = { 0 , 0 , 0 } ;
float hearts_dd_colors [ 3 ] = { 0 , 0 , 0 } ;
float a_btn_colors [ 3 ] = { 0 , 0 , 0 } ;
float b_btn_colors [ 3 ] = { 0 , 0 , 0 } ;
float c_btn_colors [ 3 ] = { 0 , 0 , 0 } ;
float start_btn_colors [ 3 ] = { 0 , 0 , 0 } ;
float magic_border_colors [ 3 ] = { 0 , 0 , 0 } ;
float magic_remaining_colors [ 3 ] = { 0 , 0 , 0 } ;
float magic_use_colors [ 3 ] = { 0 , 0 , 0 } ;
float minimap_colors [ 3 ] = { 0 , 0 , 0 } ;
float rupee_colors [ 3 ] = { 0 , 0 , 0 } ;
float smolekey_colors [ 3 ] = { 0 , 0 , 0 } ;
2022-04-26 18:33:18 -04:00
float kokiri_col [ 3 ] = { 0.118f , 0.41f , 0.106f } ;
float goron_col [ 3 ] = { 0.392f , 0.078f , 0.0f } ;
float zora_col [ 3 ] = { 0.0f , 0.235f , 0.392f } ;
float navi_idle_i_col [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
float navi_idle_o_col [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
float navi_npc_i_col [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
float navi_npc_o_col [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
float navi_enemy_i_col [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
float navi_enemy_o_col [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
float navi_prop_i_col [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
float navi_prop_o_col [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
2022-03-21 21:52:44 -04:00
2022-05-11 10:59:56 -04:00
const char * filters [ 3 ] = {
" Three-Point " ,
" Linear " ,
" None "
} ;
2022-04-03 15:47:24 -04:00
std : : map < std : : string , std : : vector < std : : string > > windowCategories ;
std : : map < std : : string , CustomWindow > customWindows ;
2022-03-21 21:52:44 -04:00
void ImGuiWMInit ( ) {
switch ( impl . backend ) {
case Backend : : SDL :
ImGui_ImplSDL2_InitForOpenGL ( static_cast < SDL_Window * > ( impl . sdl . window ) , impl . sdl . context ) ;
break ;
2022-05-11 13:18:24 -04:00
# if defined(ENABLE_DX11) || defined(ENABLE_DX12)
2022-03-21 21:52:44 -04:00
case Backend : : DX11 :
ImGui_ImplWin32_Init ( impl . dx11 . window ) ;
break ;
2022-05-11 13:18:24 -04:00
# endif
default :
break ;
2022-03-21 21:52:44 -04:00
}
2022-05-11 10:59:56 -04:00
2022-03-21 21:52:44 -04:00
}
void ImGuiBackendInit ( ) {
switch ( impl . backend ) {
case Backend : : SDL :
ImGui_ImplOpenGL3_Init ( " #version 120 " ) ;
break ;
2022-05-11 13:18:24 -04:00
# if defined(ENABLE_DX11) || defined(ENABLE_DX12)
2022-03-21 21:52:44 -04:00
case Backend : : DX11 :
ImGui_ImplDX11_Init ( static_cast < ID3D11Device * > ( impl . dx11 . device ) , static_cast < ID3D11DeviceContext * > ( impl . dx11 . device_context ) ) ;
break ;
2022-05-11 13:18:24 -04:00
# endif
default :
break ;
2022-03-21 21:52:44 -04:00
}
}
void ImGuiProcessEvent ( EventImpl event ) {
switch ( impl . backend ) {
case Backend : : SDL :
ImGui_ImplSDL2_ProcessEvent ( static_cast < const SDL_Event * > ( event . sdl . event ) ) ;
break ;
2022-05-11 13:18:24 -04:00
# if defined(ENABLE_DX11) || defined(ENABLE_DX12)
2022-03-21 21:52:44 -04:00
case Backend : : DX11 :
ImGui_ImplWin32_WndProcHandler ( static_cast < HWND > ( event . win32 . handle ) , event . win32 . msg , event . win32 . wparam , event . win32 . lparam ) ;
break ;
2022-05-11 13:18:24 -04:00
# endif
default :
break ;
2022-03-21 21:52:44 -04:00
}
}
void ImGuiWMNewFrame ( ) {
switch ( impl . backend ) {
case Backend : : SDL :
ImGui_ImplSDL2_NewFrame ( static_cast < SDL_Window * > ( impl . sdl . window ) ) ;
break ;
2022-05-11 13:18:24 -04:00
# if defined(ENABLE_DX11) || defined(ENABLE_DX12)
2022-03-21 21:52:44 -04:00
case Backend : : DX11 :
ImGui_ImplWin32_NewFrame ( ) ;
break ;
2022-05-11 13:18:24 -04:00
# endif
default :
break ;
2022-03-21 21:52:44 -04:00
}
}
void ImGuiBackendNewFrame ( ) {
switch ( impl . backend ) {
case Backend : : SDL :
ImGui_ImplOpenGL3_NewFrame ( ) ;
break ;
2022-05-11 13:18:24 -04:00
# if defined(ENABLE_DX11) || defined(ENABLE_DX12)
2022-03-21 21:52:44 -04:00
case Backend : : DX11 :
ImGui_ImplDX11_NewFrame ( ) ;
break ;
2022-05-11 13:18:24 -04:00
# endif
default :
break ;
2022-03-21 21:52:44 -04:00
}
}
void ImGuiRenderDrawData ( ImDrawData * data ) {
switch ( impl . backend ) {
case Backend : : SDL :
ImGui_ImplOpenGL3_RenderDrawData ( data ) ;
break ;
2022-05-11 13:18:24 -04:00
# if defined(ENABLE_DX11) || defined(ENABLE_DX12)
2022-03-21 21:52:44 -04:00
case Backend : : DX11 :
ImGui_ImplDX11_RenderDrawData ( data ) ;
break ;
2022-05-11 13:18:24 -04:00
# endif
default :
break ;
2022-03-21 21:52:44 -04:00
}
}
bool UseViewports ( ) {
switch ( impl . backend ) {
case Backend : : DX11 :
return true ;
2022-05-11 13:18:24 -04:00
default :
return false ;
2022-03-21 21:52:44 -04:00
}
}
2022-05-11 13:18:24 -04:00
void ShowCursor ( bool hide , Dialogues d ) {
2022-03-21 21:52:44 -04:00
if ( d = = Dialogues : : dLoadSettings ) {
GlobalCtx2 : : GetInstance ( ) - > GetWindow ( ) - > ShowCursor ( hide ) ;
return ;
}
2022-05-11 10:59:56 -04:00
if ( d = = Dialogues : : dConsole & & CVar_GetS32 ( " gOpenMenuBar " , 0 ) ) {
2022-03-21 21:52:44 -04:00
return ;
}
if ( ! GlobalCtx2 : : GetInstance ( ) - > GetWindow ( ) - > IsFullscreen ( ) ) {
oldCursorState = false ;
return ;
}
if ( oldCursorState ! = hide ) {
oldCursorState = hide ;
GlobalCtx2 : : GetInstance ( ) - > GetWindow ( ) - > ShowCursor ( hide ) ;
}
}
2022-04-03 15:47:24 -04:00
void LoadTexture ( const std : : string & name , const std : : string & path ) {
2022-03-21 21:52:44 -04:00
GfxRenderingAPI * api = gfx_get_current_rendering_api ( ) ;
2022-05-12 10:26:32 -04:00
const auto res = GlobalCtx2 : : GetInstance ( ) - > GetResourceManager ( ) - > LoadFile ( path ) ;
2022-03-21 21:52:44 -04:00
const auto asset = new GameAsset { api - > new_texture ( ) } ;
uint8_t * img_data = stbi_load_from_memory ( reinterpret_cast < const stbi_uc * > ( res - > buffer . get ( ) ) , res - > dwBufferSize , & asset - > width , & asset - > height , nullptr , 4 ) ;
if ( img_data = = nullptr ) {
std : : cout < < " Found error: " < < stbi_failure_reason ( ) < < std : : endl ;
return ;
}
api - > select_texture ( 0 , asset - > textureId ) ;
api - > set_sampler_parameters ( 0 , false , 0 , 0 ) ;
api - > upload_texture ( img_data , asset - > width , asset - > height ) ;
DefaultAssets [ name ] = asset ;
stbi_image_free ( img_data ) ;
}
2022-05-21 13:16:28 -04:00
void LoadInterfaceEditor ( ) { //This function is necessary as without it IMGui wont load the updated float array.
hearts_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCHeartsPrimR " , 255 ) / 255 ;
hearts_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCHeartsPrimG " , 70 ) / 255 ;
hearts_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCHeartsPrimB " , 50 ) / 255 ;
hearts_dd_colors [ 0 ] = ( float ) CVar_GetS32 ( " gDDCCHeartsPrimR " , 255 ) / 255 ;
hearts_dd_colors [ 1 ] = ( float ) CVar_GetS32 ( " gDDCCHeartsPrimG " , 255 ) / 255 ;
hearts_dd_colors [ 2 ] = ( float ) CVar_GetS32 ( " gDDCCHeartsPrimB " , 255 ) / 255 ;
a_btn_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCABtnPrimR " , 90 ) / 255 ;
a_btn_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCABtnPrimG " , 90 ) / 255 ;
a_btn_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCABtnPrimB " , 255 ) / 255 ;
b_btn_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCBBtnPrimR " , 0 ) / 255 ;
b_btn_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCBBtnPrimG " , 150 ) / 255 ;
b_btn_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCBBtnPrimB " , 0 ) / 255 ;
c_btn_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCCBtnPrimR " , 255 ) / 255 ;
c_btn_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCCBtnPrimG " , 160 ) / 255 ;
c_btn_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCCBtnPrimB " , 0 ) / 255 ;
start_btn_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCStartBtnPrimR " , 120 ) / 255 ;
start_btn_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCStartBtnPrimG " , 120 ) / 255 ;
start_btn_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCStartBtnPrimB " , 120 ) / 255 ;
magic_border_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCMagicBorderPrimR " , 255 ) / 255 ;
magic_border_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCMagicBorderPrimG " , 255 ) / 255 ;
magic_border_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCMagicBorderPrimB " , 255 ) / 255 ;
magic_use_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCMagicPrimR " , 250 ) / 255 ;
magic_use_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCMagicPrimG " , 250 ) / 255 ;
magic_use_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCMagicPrimB " , 0 ) / 255 ;
magic_remaining_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCMagicUsePrimR " , 0 ) / 255 ;
magic_remaining_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCMagicUsePrimG " , 200 ) / 255 ;
magic_remaining_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCMagicUsePrimB " , 0 ) / 255 ;
minimap_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCMinimapPrimR " , 0 ) / 255 ;
minimap_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCMinimapPrimG " , 255 ) / 255 ;
minimap_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCMinimapPrimB " , 255 ) / 255 ;
rupee_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCRupeePrimR " , 200 ) / 255 ;
rupee_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCRupeePrimG " , 255 ) / 255 ;
rupee_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCRupeePrimB " , 100 ) / 255 ;
smolekey_colors [ 0 ] = ( float ) CVar_GetS32 ( " gCCKeysPrimR " , 200 ) / 255 ;
smolekey_colors [ 1 ] = ( float ) CVar_GetS32 ( " gCCKeysPrimG " , 230 ) / 255 ;
smolekey_colors [ 2 ] = ( float ) CVar_GetS32 ( " gCCKeysPrimB " , 255 ) / 255 ;
kokiri_col [ 0 ] = ( float ) CVar_GetS32 ( " gTunic_Kokiri_R " , 30 ) / 255 ;
kokiri_col [ 1 ] = ( float ) CVar_GetS32 ( " gTunic_Kokiri_G " , 105 ) / 255 ;
kokiri_col [ 2 ] = ( float ) CVar_GetS32 ( " gTunic_Kokiri_B " , 27 ) / 255 ;
goron_col [ 0 ] = ( float ) CVar_GetS32 ( " gTunic_Goron_R " , 100 ) / 255 ;
goron_col [ 1 ] = ( float ) CVar_GetS32 ( " gTunic_Goron_G " , 20 ) / 255 ;
goron_col [ 2 ] = ( float ) CVar_GetS32 ( " gTunic_Goron_B " , 0 ) / 255 ;
zora_col [ 0 ] = ( float ) CVar_GetS32 ( " gTunic_Zora_R " , 0 ) / 255 ;
zora_col [ 1 ] = ( float ) CVar_GetS32 ( " gTunic_Zora_G " , 60 ) / 255 ;
zora_col [ 2 ] = ( float ) CVar_GetS32 ( " gTunic_Zora_B " , 100 ) / 255 ;
navi_idle_i_col [ 0 ] = ( float ) CVar_GetS32 ( " gNavi_Idle_Inner_R " , 255 ) / 255 ;
navi_idle_i_col [ 1 ] = ( float ) CVar_GetS32 ( " gNavi_Idle_Inner_G " , 255 ) / 255 ;
navi_idle_i_col [ 2 ] = ( float ) CVar_GetS32 ( " gNavi_Idle_Inner_B " , 255 ) / 255 ;
navi_idle_o_col [ 0 ] = ( float ) CVar_GetS32 ( " gNavi_Idle_Outer_R " , 115 ) / 255 ;
navi_idle_o_col [ 1 ] = ( float ) CVar_GetS32 ( " gNavi_Idle_Outer_G " , 230 ) / 255 ;
navi_idle_o_col [ 2 ] = ( float ) CVar_GetS32 ( " gNavi_Idle_Outer_B " , 255 ) / 255 ;
navi_npc_i_col [ 0 ] = ( float ) CVar_GetS32 ( " gNavi_NPC_Inner_R " , 100 ) / 255 ;
navi_npc_i_col [ 1 ] = ( float ) CVar_GetS32 ( " gNavi_NPC_Inner_G " , 100 ) / 255 ;
navi_npc_i_col [ 2 ] = ( float ) CVar_GetS32 ( " gNavi_NPC_Inner_B " , 255 ) / 255 ;
navi_npc_o_col [ 0 ] = ( float ) CVar_GetS32 ( " gNavi_NPC_Outer_R " , 90 ) / 255 ;
navi_npc_o_col [ 1 ] = ( float ) CVar_GetS32 ( " gNavi_NPC_Outer_G " , 90 ) / 255 ;
navi_npc_o_col [ 2 ] = ( float ) CVar_GetS32 ( " gNavi_NPC_Outer_B " , 255 ) / 255 ;
navi_enemy_i_col [ 0 ] = ( float ) CVar_GetS32 ( " gNavi_Enemy_Inner_R " , 255 ) / 255 ;
navi_enemy_i_col [ 1 ] = ( float ) CVar_GetS32 ( " gNavi_Enemy_Inner_G " , 255 ) / 255 ;
navi_enemy_i_col [ 2 ] = ( float ) CVar_GetS32 ( " gNavi_Enemy_Inner_B " , 0 ) / 255 ;
navi_enemy_o_col [ 0 ] = ( float ) CVar_GetS32 ( " gNavi_Enemy_Outer_R " , 220 ) / 255 ;
navi_enemy_o_col [ 1 ] = ( float ) CVar_GetS32 ( " gNavi_Enemy_Outer_G " , 220 ) / 255 ;
navi_enemy_o_col [ 2 ] = ( float ) CVar_GetS32 ( " gNavi_Enemy_Outer_B " , 0 ) / 255 ;
navi_prop_i_col [ 0 ] = ( float ) CVar_GetS32 ( " gNavi_Prop_Inner_R " , 0 ) / 255 ;
navi_prop_i_col [ 1 ] = ( float ) CVar_GetS32 ( " gNavi_Prop_Inner_G " , 255 ) / 255 ;
navi_prop_i_col [ 2 ] = ( float ) CVar_GetS32 ( " gNavi_Prop_Inner_B " , 0 ) / 255 ;
navi_prop_o_col [ 0 ] = ( float ) CVar_GetS32 ( " gNavi_Prop_Outer_R " , 0 ) / 255 ;
navi_prop_o_col [ 1 ] = ( float ) CVar_GetS32 ( " gNavi_Prop_Outer_G " , 220 ) / 255 ;
navi_prop_o_col [ 2 ] = ( float ) CVar_GetS32 ( " gNavi_Prop_Outer_B " , 0 ) / 255 ;
if ( CVar_GetS32 ( " gHudColors " , 1 ) = = 0 ) {
SelectedHUD = 0 ;
} else if ( CVar_GetS32 ( " gHudColors " , 1 ) = = 1 ) {
SelectedHUD = 1 ;
} else if ( CVar_GetS32 ( " gHudColors " , 1 ) = = 2 ) {
SelectedHUD = 2 ;
}
}
2022-04-17 11:24:43 -04:00
void LoadResource ( const std : : string & name , const std : : string & path , const ImVec4 & tint ) {
2022-04-03 15:47:24 -04:00
GfxRenderingAPI * api = gfx_get_current_rendering_api ( ) ;
2022-05-12 10:28:25 -04:00
const auto res = static_cast < Ship : : Texture * > ( GlobalCtx2 : : GetInstance ( ) - > GetResourceManager ( ) - > LoadResource ( path ) . get ( ) ) ;
2022-04-03 15:47:24 -04:00
2022-04-17 11:24:43 -04:00
std : : vector < uint8_t > texBuffer ;
texBuffer . reserve ( res - > width * res - > height * 4 ) ;
switch ( res - > texType ) {
case Ship : : TextureType : : RGBA32bpp :
texBuffer . assign ( res - > imageData , res - > imageData + ( res - > width * res - > height * 4 ) ) ;
break ;
case Ship : : TextureType : : GrayscaleAlpha8bpp :
for ( int32_t i = 0 ; i < res - > width * res - > height ; i + + ) {
uint8_t ia = res - > imageData [ i ] ;
uint8_t color = ( ( ia > > 4 ) & 0xF ) * 255 / 15 ;
uint8_t alpha = ( ia & 0xF ) * 255 / 15 ;
texBuffer . push_back ( color ) ;
texBuffer . push_back ( color ) ;
texBuffer . push_back ( color ) ;
texBuffer . push_back ( alpha ) ;
}
break ;
default :
2022-04-03 15:47:24 -04:00
// TODO convert other image types
SPDLOG_WARN ( " SohImGui::LoadResource: Attempting to load unsupporting image type %s " , path . c_str ( ) ) ;
return ;
}
2022-04-17 11:24:43 -04:00
for ( size_t pixel = 0 ; pixel < texBuffer . size ( ) / 4 ; pixel + + ) {
texBuffer [ pixel * 4 + 0 ] * = tint . x ;
texBuffer [ pixel * 4 + 1 ] * = tint . y ;
texBuffer [ pixel * 4 + 2 ] * = tint . z ;
texBuffer [ pixel * 4 + 3 ] * = tint . w ;
}
2022-04-03 15:47:24 -04:00
const auto asset = new GameAsset { api - > new_texture ( ) } ;
api - > select_texture ( 0 , asset - > textureId ) ;
api - > set_sampler_parameters ( 0 , false , 0 , 0 ) ;
2022-04-17 11:24:43 -04:00
api - > upload_texture ( texBuffer . data ( ) , res - > width , res - > height ) ;
2022-04-03 15:47:24 -04:00
DefaultAssets [ name ] = asset ;
}
2022-03-21 21:52:44 -04:00
void Init ( WindowImpl window_impl ) {
Game : : LoadSettings ( ) ;
2022-05-11 10:59:56 -04:00
impl = window_impl ;
2022-03-21 21:52:44 -04:00
ImGuiContext * ctx = ImGui : : CreateContext ( ) ;
ImGui : : SetCurrentContext ( ctx ) ;
io = & ImGui : : GetIO ( ) ;
io - > ConfigFlags | = ImGuiConfigFlags_DockingEnable ;
2022-05-11 13:35:03 -04:00
io - > Fonts - > AddFontDefault ( ) ;
2022-05-21 13:21:14 -04:00
if ( CVar_GetS32 ( " gOpenMenuBar " , 0 ) ! = 1 ) {
SohImGui : : overlay - > TextDrawNotification ( 30.0f , true , " Press F1 to access enhancements menu " ) ;
}
2022-05-11 13:35:03 -04:00
2022-03-21 21:52:44 -04:00
if ( UseViewports ( ) ) {
io - > ConfigFlags | = ImGuiConfigFlags_ViewportsEnable ;
}
console - > Init ( ) ;
2022-05-11 13:35:03 -04:00
overlay - > Init ( ) ;
2022-03-21 21:52:44 -04:00
ImGuiWMInit ( ) ;
ImGuiBackendInit ( ) ;
2022-05-21 13:22:25 -04:00
ModInternal : : RegisterHook < ModInternal : : GfxInit > ( [ ] {
2022-03-21 21:52:44 -04:00
if ( GlobalCtx2 : : GetInstance ( ) - > GetWindow ( ) - > IsFullscreen ( ) )
2022-05-11 10:59:56 -04:00
ShowCursor ( CVar_GetS32 ( " gOpenMenuBar " , 0 ) , Dialogues : : dLoadSettings ) ;
2022-03-21 21:52:44 -04:00
LoadTexture ( " Game_Icon " , " assets/ship_of_harkinian/icons/gSohIcon.png " ) ;
LoadTexture ( " A-Btn " , " assets/ship_of_harkinian/buttons/ABtn.png " ) ;
LoadTexture ( " B-Btn " , " assets/ship_of_harkinian/buttons/BBtn.png " ) ;
LoadTexture ( " L-Btn " , " assets/ship_of_harkinian/buttons/LBtn.png " ) ;
LoadTexture ( " R-Btn " , " assets/ship_of_harkinian/buttons/RBtn.png " ) ;
LoadTexture ( " Z-Btn " , " assets/ship_of_harkinian/buttons/ZBtn.png " ) ;
LoadTexture ( " Start-Btn " , " assets/ship_of_harkinian/buttons/StartBtn.png " ) ;
LoadTexture ( " C-Left " , " assets/ship_of_harkinian/buttons/CLeft.png " ) ;
LoadTexture ( " C-Right " , " assets/ship_of_harkinian/buttons/CRight.png " ) ;
LoadTexture ( " C-Up " , " assets/ship_of_harkinian/buttons/CUp.png " ) ;
LoadTexture ( " C-Down " , " assets/ship_of_harkinian/buttons/CDown.png " ) ;
2022-05-21 13:22:25 -04:00
} ) ;
2022-03-21 21:52:44 -04:00
2022-05-01 13:23:40 -04:00
for ( const auto & [ i , controllers ] : Ship : : Window : : Controllers )
{
CVar_SetFloat ( StringHelper : : Sprintf ( " gCont%i_GyroDriftX " , i ) . c_str ( ) , 0 ) ;
CVar_SetFloat ( StringHelper : : Sprintf ( " gCont%i_GyroDriftY " , i ) . c_str ( ) , 0 ) ;
needs_save = true ;
}
2022-05-21 13:22:25 -04:00
ModInternal : : RegisterHook < ModInternal : : ControllerRead > ( [ ] ( OSContPad * cont_pad ) {
pads = cont_pad ;
} ) ;
2022-03-21 21:52:44 -04:00
Game : : InitSettings ( ) ;
}
void Update ( EventImpl event ) {
if ( needs_save ) {
Game : : SaveSettings ( ) ;
needs_save = false ;
}
ImGuiProcessEvent ( event ) ;
}
2022-04-03 15:47:24 -04:00
# define BindButton(btn, status) ImGui::Image(GetTextureByID(DefaultAssets[btn]->textureId), ImVec2(16.0f * scale, 16.0f * scale), ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, (status) ? 255 : 0));
2022-03-21 21:52:44 -04:00
2022-05-11 10:59:56 -04:00
void BindAudioSlider ( const char * name , const char * key , float defaultValue , SeqPlayers playerId )
2022-04-25 02:27:24 -04:00
{
float value = CVar_GetFloat ( key , defaultValue ) ;
ImGui : : Text ( name , static_cast < int > ( 100 * value ) ) ;
if ( ImGui : : SliderFloat ( ( std : : string ( " ## " ) + key ) . c_str ( ) , & value , 0.0f , 1.0f , " " ) ) {
const float volume = floorf ( value * 100 ) / 100 ;
2022-04-06 20:42:23 -04:00
CVar_SetFloat ( key , volume ) ;
2022-03-21 21:52:44 -04:00
needs_save = true ;
Game : : SetSeqPlayerVolume ( playerId , volume ) ;
}
}
2022-05-02 18:24:12 -04:00
void EnhancementRadioButton ( std : : string text , std : : string cvarName , int id ) {
/*Usage :
EnhancementRadioButton ( " My Visible Name " , " gMyCVarName " , MyID ) ;
First arg is the visible name of the Radio button
Second is the cvar name where MyID will be saved .
Note : the CVar name should be the same to each Buddies .
Example :
EnhancementRadioButton ( " English " , " gLanguages " , 0 ) ;
EnhancementRadioButton ( " German " , " gLanguages " , 1 ) ;
EnhancementRadioButton ( " French " , " gLanguages " , 2 ) ;
*/
int val = CVar_GetS32 ( cvarName . c_str ( ) , 0 ) ;
2022-05-15 15:51:58 -04:00
if ( ImGui : : RadioButton ( text . c_str ( ) , id = = val ) ) {
2022-05-02 18:24:12 -04:00
CVar_SetS32 ( cvarName . c_str ( ) , ( int ) id ) ;
needs_save = true ;
}
}
2022-04-25 02:27:24 -04:00
void EnhancementCheckbox ( std : : string text , std : : string cvarName )
{
bool val = ( bool ) CVar_GetS32 ( cvarName . c_str ( ) , 0 ) ;
if ( ImGui : : Checkbox ( text . c_str ( ) , & val ) ) {
CVar_SetS32 ( cvarName . c_str ( ) , val ) ;
needs_save = true ;
}
}
2022-05-12 09:05:54 -04:00
void EnhancementButton ( std : : string text , std : : string cvarName )
{
bool val = ( bool ) CVar_GetS32 ( cvarName . c_str ( ) , 0 ) ;
if ( ImGui : : Button ( text . c_str ( ) ) ) {
CVar_SetS32 ( cvarName . c_str ( ) , ! val ) ;
needs_save = true ;
}
}
2022-04-25 02:27:24 -04:00
void EnhancementSliderInt ( std : : string text , std : : string id , std : : string cvarName , int min , int max , std : : string format )
{
int val = CVar_GetS32 ( cvarName . c_str ( ) , 0 ) ;
ImGui : : Text ( text . c_str ( ) , val ) ;
2022-05-11 10:59:56 -04:00
if ( ImGui : : SliderInt ( id . c_str ( ) , & val , min , max , format . c_str ( ) ) )
2022-04-25 02:27:24 -04:00
{
CVar_SetS32 ( cvarName . c_str ( ) , val ) ;
needs_save = true ;
}
if ( val < min )
{
val = min ;
CVar_SetS32 ( cvarName . c_str ( ) , val ) ;
needs_save = true ;
}
if ( val > max )
{
val = max ;
CVar_SetS32 ( cvarName . c_str ( ) , val ) ;
needs_save = true ;
}
}
2022-04-29 11:49:28 -04:00
void EnhancementSliderFloat ( std : : string text , std : : string id , std : : string cvarName , float min , float max , std : : string format , float defaultValue , bool isPercentage )
2022-04-25 02:27:24 -04:00
{
float val = CVar_GetFloat ( cvarName . c_str ( ) , defaultValue ) ;
2022-04-29 11:49:28 -04:00
if ( ! isPercentage )
ImGui : : Text ( text . c_str ( ) , val ) ;
else
ImGui : : Text ( text . c_str ( ) , static_cast < int > ( 100 * val ) ) ;
2022-04-25 02:27:24 -04:00
if ( ImGui : : SliderFloat ( id . c_str ( ) , & val , min , max , format . c_str ( ) ) )
{
CVar_SetFloat ( cvarName . c_str ( ) , val ) ;
needs_save = true ;
}
if ( val < min )
{
val = min ;
CVar_SetFloat ( cvarName . c_str ( ) , val ) ;
needs_save = true ;
}
if ( val > max )
{
val = max ;
CVar_SetFloat ( cvarName . c_str ( ) , val ) ;
needs_save = true ;
}
}
2022-05-21 13:16:28 -04:00
int ClampFloatToInt ( float value , int min , int max ) {
return fmin ( fmax ( value , min ) , max ) ;
}
2022-04-29 11:49:28 -04:00
2022-05-21 13:16:28 -04:00
void EnhancementColor3 ( std : : string text , std : : string cvarName , float ColorRGB [ 3 ] , bool TitleSameLine ) {
//Simplified.
ImGuiColorEditFlags flags = ImGuiColorEditFlags_None ;
if ( ! TitleSameLine ) {
ImGui : : Text ( " %s " , text . c_str ( ) ) ;
flags = ImGuiColorEditFlags_NoLabel ;
}
if ( ImGui : : ColorEdit3 ( text . c_str ( ) , ColorRGB , flags ) ) {
CVar_SetS32 ( ( cvarName + " R " ) . c_str ( ) , ClampFloatToInt ( ColorRGB [ 0 ] * 255 , 0 , 255 ) ) ;
CVar_SetS32 ( ( cvarName + " G " ) . c_str ( ) , ClampFloatToInt ( ColorRGB [ 1 ] * 255 , 0 , 255 ) ) ;
CVar_SetS32 ( ( cvarName + " B " ) . c_str ( ) , ClampFloatToInt ( ColorRGB [ 2 ] * 255 , 0 , 255 ) ) ;
needs_save = true ;
2022-04-29 11:49:28 -04:00
}
}
2022-05-15 15:51:58 -04:00
void Tooltip ( std : : string text ) {
2022-05-14 15:08:17 -04:00
if ( ImGui : : IsItemHovered ( ) )
ImGui : : SetTooltip ( " %s " , text . c_str ( ) ) ;
}
2022-05-15 15:51:58 -04:00
void DrawMainMenuAndCalculateGameSize ( ) {
2022-03-21 21:52:44 -04:00
console - > Update ( ) ;
ImGuiBackendNewFrame ( ) ;
ImGuiWMNewFrame ( ) ;
ImGui : : NewFrame ( ) ;
2022-05-21 13:16:28 -04:00
LoadInterfaceEditor ( ) ;
2022-03-21 21:52:44 -04:00
const std : : shared_ptr < Window > wnd = GlobalCtx2 : : GetInstance ( ) - > GetWindow ( ) ;
2022-04-18 05:37:47 -04:00
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoBackground |
2022-03-21 21:52:44 -04:00
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove |
ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoResize ;
2022-05-11 10:59:56 -04:00
if ( CVar_GetS32 ( " gOpenMenuBar " , 0 ) ) window_flags | = ImGuiWindowFlags_MenuBar ;
2022-03-21 21:52:44 -04:00
const ImGuiViewport * viewport = ImGui : : GetMainViewport ( ) ;
ImGui : : SetNextWindowPos ( viewport - > WorkPos ) ;
ImGui : : SetNextWindowSize ( ImVec2 ( wnd - > GetCurrentWidth ( ) , wnd - > GetCurrentHeight ( ) ) ) ;
ImGui : : SetNextWindowViewport ( viewport - > ID ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_WindowPadding , ImVec2 ( 0.0f , 0.0f ) ) ;
2022-04-18 05:37:47 -04:00
ImGui : : PushStyleVar ( ImGuiStyleVar_WindowBorderSize , 0.0f ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_ChildBorderSize , 0.0f ) ;
2022-03-21 21:52:44 -04:00
ImGui : : Begin ( " Main - Deck " , nullptr , window_flags ) ;
2022-04-18 05:37:47 -04:00
ImGui : : PopStyleVar ( 3 ) ;
ImVec2 top_left_pos = ImGui : : GetWindowPos ( ) ;
2022-03-21 21:52:44 -04:00
const ImGuiID dockId = ImGui : : GetID ( " main_dock " ) ;
if ( ! ImGui : : DockBuilderGetNode ( dockId ) ) {
ImGui : : DockBuilderRemoveNode ( dockId ) ;
ImGui : : DockBuilderAddNode ( dockId , ImGuiDockNodeFlags_NoTabBar ) ;
ImGui : : DockBuilderDockWindow ( " OoT Master Quest " , dockId ) ;
ImGui : : DockBuilderFinish ( dockId ) ;
}
ImGui : : DockSpace ( dockId , ImVec2 ( 0.0f , 0.0f ) , ImGuiDockNodeFlags_None ) ;
if ( ImGui : : IsKeyPressed ( TOGGLE_BTN ) ) {
2022-05-11 10:59:56 -04:00
bool menu_bar = CVar_GetS32 ( " gOpenMenuBar " , 0 ) ;
CVar_SetS32 ( " gOpenMenuBar " , ! menu_bar ) ;
2022-03-21 21:52:44 -04:00
needs_save = true ;
2022-05-11 10:59:56 -04:00
GlobalCtx2 : : GetInstance ( ) - > GetWindow ( ) - > dwMenubar = menu_bar ;
ShowCursor ( menu_bar , Dialogues : : dMenubar ) ;
2022-03-21 21:52:44 -04:00
}
if ( ImGui : : BeginMenuBar ( ) ) {
if ( DefaultAssets . contains ( " Game_Icon " ) ) {
ImGui : : SetCursorPos ( ImVec2 ( 5 , 2.5f ) ) ;
2022-04-03 15:47:24 -04:00
ImGui : : Image ( GetTextureByID ( DefaultAssets [ " Game_Icon " ] - > textureId ) , ImVec2 ( 16.0f , 16.0f ) ) ;
2022-03-21 21:52:44 -04:00
ImGui : : SameLine ( ) ;
ImGui : : SetCursorPos ( ImVec2 ( 25 , 0 ) ) ;
}
ImGui : : Text ( " Shipwright " ) ;
ImGui : : Separator ( ) ;
if ( ImGui : : BeginMenu ( " Audio " ) ) {
2022-04-29 11:49:28 -04:00
EnhancementSliderFloat ( " Master Volume: %d %% " , " ##Master_Vol " , " gGameMasterVolume " , 0.0f , 1.0f , " " , 1.0f , true ) ;
2022-03-21 21:52:44 -04:00
2022-04-25 02:27:24 -04:00
BindAudioSlider ( " Main Music Volume: %d %% " , " gMainMusicVolume " , 1.0f , SEQ_BGM_MAIN ) ;
BindAudioSlider ( " Sub Music Volume: %d %% " , " gSubMusicVolume " , 1.0f , SEQ_BGM_SUB ) ;
BindAudioSlider ( " Sound Effects Volume: %d %% " , " gSFXMusicVolume " , 1.0f , SEQ_SFX ) ;
BindAudioSlider ( " Fanfare Volume: %d %% " , " gFanfareVolume " , 1.0f , SEQ_FANFARE ) ;
2022-03-21 21:52:44 -04:00
ImGui : : EndMenu ( ) ;
}
2022-04-29 11:49:28 -04:00
if ( ImGui : : BeginMenu ( " Controller " ) )
2022-04-25 02:27:24 -04:00
{
2022-04-29 11:49:28 -04:00
for ( const auto & [ i , controllers ] : Ship : : Window : : Controllers )
{
bool hasPad = std : : find_if ( controllers . begin ( ) , controllers . end ( ) , [ ] ( const auto & c ) {
return c - > HasPadConf ( ) & & c - > Connected ( ) ;
} ) ! = controllers . end ( ) ;
2022-03-29 22:23:02 -04:00
2022-04-29 11:49:28 -04:00
if ( ! hasPad ) continue ;
2022-03-29 22:23:02 -04:00
2022-04-29 11:49:28 -04:00
auto menuLabel = " Controller " + std : : to_string ( i + 1 ) ;
if ( ImGui : : BeginMenu ( menuLabel . c_str ( ) ) )
{
EnhancementSliderFloat ( " Gyro Sensitivity: %d %% " , " ##GYROSCOPE " , StringHelper : : Sprintf ( " gCont%i_GyroSensitivity " , i ) , 0.0f , 1.0f , " " , 1.0f , true ) ;
if ( ImGui : : Button ( " Recalibrate Gyro " ) )
{
2022-05-01 13:23:40 -04:00
CVar_SetFloat ( StringHelper : : Sprintf ( " gCont%i_GyroDriftX " , i ) . c_str ( ) , 0 ) ;
CVar_SetFloat ( StringHelper : : Sprintf ( " gCont%i_GyroDriftY " , i ) . c_str ( ) , 0 ) ;
2022-04-29 11:49:28 -04:00
needs_save = true ;
}
ImGui : : Separator ( ) ;
EnhancementSliderFloat ( " Rumble Strength: %d %% " , " ##RUMBLE " , StringHelper : : Sprintf ( " gCont%i_RumbleStrength " , i ) , 0.0f , 1.0f , " " , 1.0f , true ) ;
ImGui : : EndMenu ( ) ;
}
ImGui : : Separator ( ) ;
2022-03-21 21:52:44 -04:00
}
2022-04-29 11:49:28 -04:00
EnhancementCheckbox ( " Show Inputs " , " gInputEnabled " ) ;
2022-05-14 15:08:17 -04:00
Tooltip ( " Shows currently pressed inputs on the bottom right of the screen " ) ;
2022-04-29 11:49:28 -04:00
EnhancementCheckbox ( " Rumble Enabled " , " gRumbleEnabled " ) ;
EnhancementSliderFloat ( " Input Scale: %.1f " , " ##Input " , " gInputScale " , 1.0f , 3.0f , " " , 1.0f , false ) ;
2022-05-14 15:08:17 -04:00
Tooltip ( " Sets the on screen size of the displayed inputs from Show Inputs " ) ;
2022-03-21 21:52:44 -04:00
2022-04-10 18:19:26 -04:00
ImGui : : Separator ( ) ;
2022-05-14 15:08:17 -04:00
EnhancementCheckbox ( " D-pad Support on Pause and File Select " , " gDpadPauseName " ) ;
EnhancementCheckbox ( " D-pad Support in Ocarina and Text Choice " , " gDpadOcarinaText " ) ;
EnhancementCheckbox ( " D-pad Support for Browsing Shop Items " , " gDpadShop " ) ;
2022-04-12 21:38:08 -04:00
2022-03-21 21:52:44 -04:00
ImGui : : EndMenu ( ) ;
}
2022-05-11 10:59:56 -04:00
if ( ImGui : : BeginMenu ( " Graphics " ) )
2022-04-29 11:49:28 -04:00
{
2022-05-11 10:59:56 -04:00
EnhancementSliderInt ( " Internal Resolution: %dx " , " ##IMul " , " gInternalResolution " , 1 , 8 , " " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Increases the render resolution of the game, up to 8x your output resolution, \n as a more intensive but effective form of anti-aliasing " ) ;
2022-05-11 10:59:56 -04:00
gfx_current_dimensions . internal_mul = CVar_GetS32 ( " gInternalResolution " , 1 ) ;
EnhancementSliderInt ( " MSAA: %d " , " ##IMSAA " , " gMSAAValue " , 1 , 8 , " " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Activates anti-aliasing when above 1, up to 8x for 8 samples for every pixel " ) ;
2022-05-11 10:59:56 -04:00
gfx_msaa_level = CVar_GetS32 ( " gMSAAValue " , 1 ) ;
EXPERIMENTAL ( ) ;
ImGui : : Text ( " Texture Filter (Needs reload) " ) ;
GfxRenderingAPI * gapi = gfx_get_current_rendering_api ( ) ;
if ( ImGui : : BeginCombo ( " ##filters " , filters [ gapi - > get_texture_filter ( ) ] ) ) {
for ( int fId = 0 ; fId < = FilteringMode : : NONE ; fId + + ) {
if ( ImGui : : Selectable ( filters [ fId ] , fId = = gapi - > get_texture_filter ( ) ) ) {
INFO ( " New Filter: %s " , filters [ fId ] ) ;
gapi - > set_texture_filter ( ( FilteringMode ) fId ) ;
2022-05-15 15:51:58 -04:00
CVar_SetS32 ( " gTextureFilter " , ( int ) fId ) ;
2022-05-11 10:59:56 -04:00
needs_save = true ;
}
2022-03-21 21:52:44 -04:00
2022-05-11 10:59:56 -04:00
}
ImGui : : EndCombo ( ) ;
}
2022-05-11 13:35:03 -04:00
overlay - > DrawSettings ( ) ;
2022-05-11 10:59:56 -04:00
ImGui : : EndMenu ( ) ;
}
if ( ImGui : : BeginMenu ( " Languages " ) ) {
EnhancementRadioButton ( " English " , " gLanguages " , 0 ) ;
EnhancementRadioButton ( " German " , " gLanguages " , 1 ) ;
EnhancementRadioButton ( " French " , " gLanguages " , 2 ) ;
ImGui : : EndMenu ( ) ;
}
if ( ImGui : : BeginMenu ( " Enhancements " ) )
{
2022-05-15 15:51:58 -04:00
if ( ImGui : : BeginMenu ( " Gameplay " ) )
{
EnhancementSliderInt ( " Text Speed: %dx " , " ##TEXTSPEED " , " gTextSpeed " , 1 , 5 , " " ) ;
EnhancementSliderInt ( " King Zora Speed: %dx " , " ##WEEPSPEED " , " gMweepSpeed " , 1 , 5 , " " ) ;
EnhancementCheckbox ( " Skip Text " , " gSkipText " ) ;
Tooltip ( " Holding down B skips text " ) ;
EnhancementCheckbox ( " Mute Low HP Alarm " , " gLowHpAlarm " ) ;
Tooltip ( " Disable the low HP beeping sound " ) ;
EnhancementCheckbox ( " Minimal UI " , " gMinimalUI " ) ;
Tooltip ( " Hides most of the UI when not needed " ) ;
EnhancementCheckbox ( " Visual Stone of Agony " , " gVisualAgony " ) ;
Tooltip ( " Displays an icon and plays a sound when Stone of Agony should be activated, for those without rumble " ) ;
EnhancementCheckbox ( " Faster Block Push " , " gFasterBlockPush " ) ;
EnhancementCheckbox ( " Assignable Tunics and Boots " , " gAssignableTunicsAndBoots " ) ;
Tooltip ( " Allows equiping the tunic and boots to c-buttons " ) ;
EnhancementCheckbox ( " MM Bunny Hood " , " gMMBunnyHood " ) ;
Tooltip ( " Wearing the Bunny Hood grants a speed increase like in Majora's Mask " ) ;
2022-05-21 13:16:48 -04:00
EnhancementCheckbox ( " Disable Navi Call Audio " , " gDisableNaviCallAudio " ) ;
Tooltip ( " Disables the voice audio when Navi calls you " ) ;
2022-05-15 15:51:58 -04:00
ImGui : : EndMenu ( ) ;
}
if ( ImGui : : BeginMenu ( " Graphics " ) )
{
EnhancementCheckbox ( " N64 Mode " , " gN64Mode " ) ;
Tooltip ( " Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution " ) ;
EnhancementCheckbox ( " Animated Link in Pause Menu " , " gPauseLiveLink " ) ;
EnhancementCheckbox ( " Enable 3D Dropped items " , " gNewDrops " ) ;
EnhancementCheckbox ( " Dynamic Wallet Icon " , " gDynamicWalletIcon " ) ;
Tooltip ( " Changes the rupee in the wallet icon to match the wallet size you currently have " ) ;
EnhancementCheckbox ( " Always show dungeon entrances " , " gAlwaysShowDungeonMinimapIcon " ) ;
Tooltip ( " Always shows dungeon entrance icons on the minimap " ) ;
2022-03-21 21:52:44 -04:00
2022-05-15 15:51:58 -04:00
ImGui : : EndMenu ( ) ;
}
2022-04-24 10:50:41 -04:00
2022-05-15 15:51:58 -04:00
if ( ImGui : : BeginMenu ( " Fixes " ) )
{
EnhancementCheckbox ( " Fix L&R Pause menu " , " gUniformLR " ) ;
Tooltip ( " Makes the L and R buttons in the pause menu the same color " ) ;
EnhancementCheckbox ( " Fix Dungeon entrances " , " gFixDungeonMinimapIcon " ) ;
Tooltip ( " Show dungeon entrances icon only when it should be " ) ;
EnhancementCheckbox ( " Fix Two Handed idle animations " , " gTwoHandedIdle " ) ;
Tooltip ( " Makes two handed idle animation play, a seemingly finished animation that was disabled on accident in the original game " ) ;
2022-05-21 13:15:41 -04:00
EnhancementCheckbox ( " Fix Deku Nut upgrade " , " gDekuNutUpgradeFix " ) ;
Tooltip ( " Prevents the Forest Stage Deku Nut upgrade from becoming unobtainable after receiving the Poacher's Saw " ) ;
2022-03-21 21:52:44 -04:00
2022-05-15 15:51:58 -04:00
ImGui : : EndMenu ( ) ;
}
2022-04-18 05:37:47 -04:00
2022-05-11 10:59:56 -04:00
EXPERIMENTAL ( ) ;
2022-05-15 15:51:58 -04:00
EnhancementCheckbox ( " 60FPS Interpolation " , " g60FPS " ) ;
2022-05-11 10:59:56 -04:00
EnhancementCheckbox ( " Disable LOD " , " gDisableLOD " ) ;
2022-05-14 15:08:17 -04:00
Tooltip ( " Turns off the level of detail setting, making models always use their higher poly variants " ) ;
2022-03-21 21:52:44 -04:00
ImGui : : EndMenu ( ) ;
}
2022-04-18 05:37:47 -04:00
2022-05-21 13:16:28 -04:00
if ( ImGui : : BeginMenu ( " Cosmetics " ) ) {
EnhancementCheckbox ( " Cosmetics editor " , " gCosmticsEditor " ) ;
Tooltip ( " Edit Navi and Link's Tunics color. " ) ;
EnhancementCheckbox ( " HUD Margins editor " , " gUseMargins " ) ;
EnhancementRadioButton ( " N64 interface " , " gHudColors " , 0 ) ;
Tooltip ( " Change interface color to N64 style. " ) ;
EnhancementRadioButton ( " Gamecube interface " , " gHudColors " , 1 ) ;
Tooltip ( " Change interface color to Gamecube style. " ) ;
EnhancementRadioButton ( " Custom interface " , " gHudColors " , 2 ) ;
Tooltip ( " Change interface color to your own made style. " ) ;
if ( CVar_GetS32 ( " gHudColors " , 1 ) = = 2 ) {
EnhancementCheckbox ( " Interface editor " , " gColorsEditor " ) ;
Tooltip ( " Edit the colors used for your own interface " ) ;
}
ImGui : : EndMenu ( ) ;
2022-04-18 05:37:47 -04:00
}
2022-04-29 11:49:28 -04:00
if ( ImGui : : BeginMenu ( " Cheats " ) )
{
2022-04-21 18:39:39 -04:00
if ( ImGui : : BeginMenu ( " Infinite... " ) ) {
2022-04-25 02:27:24 -04:00
EnhancementCheckbox ( " Money " , " gInfiniteMoney " ) ;
EnhancementCheckbox ( " Health " , " gInfiniteHealth " ) ;
EnhancementCheckbox ( " Ammo " , " gInfiniteAmmo " ) ;
EnhancementCheckbox ( " Magic " , " gInfiniteMagic " ) ;
EnhancementCheckbox ( " Nayru's Love " , " gInfiniteNayru " ) ;
2022-04-21 18:39:39 -04:00
2022-04-26 19:04:47 -04:00
ImGui : : EndMenu ( ) ;
2022-03-27 21:18:05 -04:00
}
2022-04-18 05:37:47 -04:00
2022-04-25 02:27:24 -04:00
EnhancementCheckbox ( " No Clip " , " gNoClip " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Allows you to walk through walls " ) ;
2022-04-25 02:27:24 -04:00
EnhancementCheckbox ( " Climb Everything " , " gClimbEverything " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Makes every surface in the game climbable " ) ;
2022-04-25 02:27:24 -04:00
EnhancementCheckbox ( " Moon Jump on L " , " gMoonJumpOnL " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Holding L makes you float into the air " ) ;
2022-04-25 02:27:24 -04:00
EnhancementCheckbox ( " Super Tunic " , " gSuperTunic " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Makes every tunic have the effects of every other tunic " ) ;
2022-04-25 02:27:24 -04:00
EnhancementCheckbox ( " Easy ISG " , " gEzISG " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Automatically activates the Infinite Sword glitch, making you constantly swing your sword " ) ;
2022-04-25 02:27:24 -04:00
EnhancementCheckbox ( " Unrestricted Items " , " gNoRestrictItems " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Allows you to use any item at any location " ) ;
2022-04-25 02:27:24 -04:00
EnhancementCheckbox ( " Freeze Time " , " gFreezeTime " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Freezes the time of day " ) ;
2022-04-18 05:37:47 -04:00
2022-04-27 21:16:26 -04:00
ImGui : : EndMenu ( ) ;
2022-04-26 19:04:47 -04:00
}
2022-04-26 18:33:18 -04:00
2022-05-11 10:59:56 -04:00
if ( ImGui : : BeginMenu ( " Developer Tools " ) )
2022-04-29 11:49:28 -04:00
{
2022-05-12 09:05:54 -04:00
EnhancementCheckbox ( " OoT Debug Mode " , " gDebugEnabled " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Enables Debug Mode, allowing you to select maps with L + R + Z, noclip with L + D-pad Right, \n and open the debug menu with L on the pause screen " ) ;
2022-05-21 13:32:21 -04:00
EnhancementCheckbox ( " Fast File Select " , " gSkipLogoTitle " ) ;
Tooltip ( " Directly load the game to selected slot bellow \n Use slot number 4 to load directly in Zelda Map Select \n (Do not require debug menu but you will be unable to save there) \n (you can also load Zelda map select with Debug mod + slot 0). \n With Slot : 0 you can go directly in File Select menu \n Attention, Loading an empty save will result in crash " ) ;
if ( CVar_GetS32 ( " gSkipLogoTitle " , 0 ) ) {
EnhancementSliderInt ( " Loading %d " , " ##SaveFileID " , " gSaveFileID " , 0 , 4 , " " ) ;
}
ImGui : : Separator ( ) ;
2022-05-11 10:59:56 -04:00
EnhancementCheckbox ( " Stats " , " gStatsEnabled " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Shows the stats window, with your FPS and frametimes, and the OS you're playing on " ) ;
2022-05-11 10:59:56 -04:00
EnhancementCheckbox ( " Console " , " gConsoleEnabled " ) ;
2022-05-15 15:51:58 -04:00
Tooltip ( " Enables the console window, allowing you to input commands, type help for some examples " ) ;
2022-05-11 10:59:56 -04:00
console - > opened = CVar_GetS32 ( " gConsoleEnabled " , 0 ) ;
2022-03-21 21:52:44 -04:00
2022-05-02 18:24:12 -04:00
ImGui : : EndMenu ( ) ;
}
2022-05-21 13:16:28 -04:00
bool Margins_isOpen = CVar_GetS32 ( " gUseMargins " , 0 ) ;
bool Cosmetics_isOpen = CVar_GetS32 ( " gCosmticsEditor " , 0 ) ;
bool Interface_isOpen = CVar_GetS32 ( " gColorsEditor " , 0 ) ;
if ( Margins_isOpen ) {
if ( ! Margins_isOpen ) {
return ;
}
ImGui : : PushStyleColor ( ImGuiCol_Border , ImVec4 ( 0 , 0 , 0 , 0 ) ) ;
ImGui : : Begin ( " Margins Editor " , nullptr , ImGuiWindowFlags_NoFocusOnAppearing ) ;
if ( ImGui : : BeginTabBar ( " Margins Editor " , ImGuiTabBarFlags_NoCloseWithMiddleMouseButton ) ) {
if ( ImGui : : BeginTabItem ( " Interface margins " ) ) {
EnhancementCheckbox ( " Use margins " , " gHUDMargins " ) ;
Tooltip ( " Enable/Disable custom margins. \n If disabled you will have original margins " ) ;
EnhancementSliderInt ( " Top : %dx " , " ##UIMARGINT " , " gHUDMargin_T " , - 20 , 20 , " " ) ;
EnhancementSliderInt ( " Left: %dx " , " ##UIMARGINL " , " gHUDMargin_L " , - 25 , 25 , " " ) ;
EnhancementSliderInt ( " Right: %dx " , " ##UIMARGINR " , " gHUDMargin_R " , - 25 , 25 , " " ) ;
EnhancementSliderInt ( " Bottom: %dx " , " ##UIMARGINB " , " gHUDMargin_B " , - 20 , 20 , " " ) ;
ImGui : : EndTabItem ( ) ;
}
ImGui : : EndTabBar ( ) ;
}
ImGui : : PopStyleColor ( ) ;
ImGui : : End ( ) ;
}
if ( Cosmetics_isOpen ) {
if ( ! Cosmetics_isOpen ) {
return ;
}
ImGui : : PushStyleColor ( ImGuiCol_Border , ImVec4 ( 0 , 0 , 0 , 0 ) ) ;
ImGui : : Begin ( " Cosmetics Editor " , nullptr , ImGuiWindowFlags_NoFocusOnAppearing ) ;
if ( ImGui : : BeginTabBar ( " Cosmetics Editor " , ImGuiTabBarFlags_NoCloseWithMiddleMouseButton ) ) {
if ( ImGui : : BeginTabItem ( " Navi " ) ) {
EnhancementCheckbox ( " Custom colors for Navi " , " gUseNaviCol " ) ;
Tooltip ( " Enable/Disable custom Navi's colors. \n If disabled you will have original colors for Navi. \n Colors are refreshed when Navi goes back in your pockets " ) ;
EnhancementColor3 ( " Navi Idle Inner " , " gNavi_Idle_Inner_ " , navi_idle_i_col , false ) ;
Tooltip ( " Inner color for Navi (idle flying around) " ) ;
EnhancementColor3 ( " Navi Idle Outer " , " gNavi_Idle_Outer_ " , navi_idle_o_col , false ) ;
Tooltip ( " Outer color for Navi (idle flying around) " ) ;
ImGui : : Separator ( ) ;
EnhancementColor3 ( " Navi NPC Inner " , " gNavi_NPC_Inner_ " , navi_npc_i_col , false ) ;
Tooltip ( " Inner color for Navi (when Navi fly around NPCs) " ) ;
EnhancementColor3 ( " Navi NPC Outer " , " gNavi_NPC_Outer_ " , navi_npc_o_col , false ) ;
Tooltip ( " Outer color for Navi (when Navi fly around NPCs) " ) ;
ImGui : : Separator ( ) ;
EnhancementColor3 ( " Navi Enemy Inner " , " gNavi_Enemy_Inner_ " , navi_enemy_i_col , false ) ;
Tooltip ( " Inner color for Navi (when Navi fly around Enemies or Bosses) " ) ;
EnhancementColor3 ( " Navi Enemy Outer " , " gNavi_Enemy_Outer_ " , navi_enemy_o_col , false ) ;
Tooltip ( " Outer color for Navi (when Navi fly around Enemies or Bosses) " ) ;
ImGui : : Separator ( ) ;
EnhancementColor3 ( " Navi Prop Inner " , " gNavi_Prop_Inner_ " , navi_prop_i_col , false ) ;
Tooltip ( " Inner color for Navi (when Navi fly around props (signs etc)) " ) ;
EnhancementColor3 ( " Navi Prop Outer " , " gNavi_Prop_Outer_ " , navi_prop_o_col , false ) ;
Tooltip ( " Outer color for Navi (when Navi fly around props (signs etc)) " ) ;
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : BeginTabItem ( " Tunics " ) ) {
EnhancementCheckbox ( " Custom colors on tunics " , " gUseTunicsCol " ) ;
Tooltip ( " Enable/Disable custom Link's tunics colors. \n If disabled you will have original colors for Link's tunics " ) ;
EnhancementColor3 ( " Kokiri Tunic " , " gTunic_Kokiri_ " , kokiri_col , false ) ;
ImGui : : Separator ( ) ;
EnhancementColor3 ( " Goron Tunic " , " gTunic_Goron_ " , goron_col , false ) ;
ImGui : : Separator ( ) ;
EnhancementColor3 ( " Zora Tunic " , " gTunic_Zora_ " , zora_col , false ) ;
ImGui : : EndTabItem ( ) ;
}
ImGui : : EndTabBar ( ) ;
}
ImGui : : PopStyleColor ( ) ;
ImGui : : End ( ) ;
}
if ( Interface_isOpen ) {
if ( ! Interface_isOpen ) {
return ;
}
ImGui : : PushStyleColor ( ImGuiCol_Border , ImVec4 ( 0 , 0 , 0 , 0 ) ) ;
ImGui : : Begin ( " Interface Editor " , nullptr , ImGuiWindowFlags_NoFocusOnAppearing ) ;
if ( ImGui : : BeginTabBar ( " Interface Editor " , ImGuiTabBarFlags_NoCloseWithMiddleMouseButton ) ) {
if ( ImGui : : BeginTabItem ( " Hearts " ) ) {
EnhancementColor3 ( " Hearts inner " , " gCCHeartsPrim " , hearts_colors , false ) ;
Tooltip ( " Hearts inner color (red in original) \n Affect both Normal Hearts and the ones in Double Defense " ) ;
EnhancementColor3 ( " Hearts double def " , " gDDCCHeartsPrim " , hearts_dd_colors , false ) ;
Tooltip ( " Hearts outline color (white in original) \n Affect Double Defense outline only " ) ;
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : BeginTabItem ( " Buttons " ) ) {
EnhancementColor3 ( " A Buttons " , " gCCABtnPrim " , a_btn_colors , false ) ;
Tooltip ( " A Buttons colors (Green in original Gamecube) \n Affect A buttons colors on interface, in shops, messages boxes, ocarina notes and inventory cursors " ) ;
EnhancementColor3 ( " B Buttons " , " gCCBBtnPrim " , b_btn_colors , false ) ;
Tooltip ( " B Button colors (Red in original Gamecube) \n Affect B button colors on interface " ) ;
EnhancementColor3 ( " C Buttons " , " gCCCBtnPrim " , c_btn_colors , false ) ;
Tooltip ( " C Buttons colors (Yellowish / Oranges in originals) \n Affect C buttons colors on interface, in inventory and ocarina notes " ) ;
EnhancementColor3 ( " Start Buttons " , " gCCStartBtnPrim " , start_btn_colors , false ) ;
Tooltip ( " Start Button colors (gray in Gamecube) \n Affect Start button colors in inventory " ) ;
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : BeginTabItem ( " Magic Bar " ) ) {
EnhancementColor3 ( " Magic bar borders " , " gCCMagicBorderPrim " , magic_border_colors , false ) ;
Tooltip ( " Affect the border of the magic bar when being used \n White flash in original game " ) ;
EnhancementColor3 ( " Magic bar main color " , " gCCMagicPrim " , magic_remaining_colors , false ) ;
Tooltip ( " Affect the magic bar color \n Green in original game " ) ;
EnhancementColor3 ( " Magic bar being used " , " gCCMagicUsePrim " , magic_use_colors , false ) ;
Tooltip ( " Affect the magic bar when being used \n Yellow in original game " ) ;
ImGui : : EndTabItem ( ) ;
}
if ( ImGui : : BeginTabItem ( " Misc " ) ) {
EnhancementColor3 ( " Minimap color " , " gCCMinimapPrim " , minimap_colors , false ) ;
Tooltip ( " Affect the Dungeon and Overworld minimaps " ) ;
EnhancementColor3 ( " Rupee icon color " , " gCCRupeePrim " , rupee_colors , false ) ;
Tooltip ( " Affect the Rupee icon on interface \n Green by default " ) ;
EnhancementColor3 ( " Small Keys icon color " , " gCCKeysPrim " , smolekey_colors , false ) ;
Tooltip ( " Affect the Small keys icon on interface \n Gray by default " ) ;
ImGui : : EndTabItem ( ) ;
}
ImGui : : EndTabBar ( ) ;
}
ImGui : : PopStyleColor ( ) ;
ImGui : : End ( ) ;
}
2022-04-03 15:47:24 -04:00
for ( const auto & category : windowCategories ) {
if ( ImGui : : BeginMenu ( category . first . c_str ( ) ) ) {
for ( const std : : string & name : category . second ) {
2022-05-11 10:59:56 -04:00
std : : string varName ( name ) ;
2022-05-15 15:51:58 -04:00
varName . erase ( std : : ranges : : remove_if ( varName , isspace ) . begin ( ) , varName . end ( ) ) ;
2022-05-11 10:59:56 -04:00
std : : string toggleName = " g " + varName + " Enabled " ;
EnhancementCheckbox ( name , toggleName ) ;
customWindows [ name ] . enabled = CVar_GetS32 ( toggleName . c_str ( ) , 0 ) ;
2022-04-03 15:47:24 -04:00
}
ImGui : : EndMenu ( ) ;
}
2022-05-12 09:05:54 -04:00
2022-04-03 15:47:24 -04:00
}
2022-03-21 21:52:44 -04:00
ImGui : : EndMenuBar ( ) ;
}
ImGui : : End ( ) ;
2022-04-18 05:37:47 -04:00
2022-05-11 10:59:56 -04:00
if ( CVar_GetS32 ( " gStatsEnabled " , 0 ) ) {
2022-04-18 05:37:47 -04:00
const float framerate = ImGui : : GetIO ( ) . Framerate ;
ImGui : : PushStyleColor ( ImGuiCol_Border , ImVec4 ( 0 , 0 , 0 , 0 ) ) ;
2022-05-12 09:05:54 -04:00
ImGui : : Begin ( " Debug Stats " , nullptr , ImGuiWindowFlags_NoFocusOnAppearing ) ;
2022-04-18 05:37:47 -04:00
2022-05-11 13:18:24 -04:00
# ifdef _WIN32
2022-04-18 05:37:47 -04:00
ImGui : : Text ( " Platform: Windows " ) ;
2022-05-11 13:18:24 -04:00
# else
ImGui : : Text ( " Platform: Linux " ) ;
# endif
2022-04-18 05:37:47 -04:00
ImGui : : Text ( " Status: %.3f ms/frame (%.1f FPS) " , 1000.0f / framerate , framerate ) ;
ImGui : : End ( ) ;
ImGui : : PopStyleColor ( ) ;
}
console - > Draw ( ) ;
for ( auto & windowIter : customWindows ) {
CustomWindow & window = windowIter . second ;
if ( window . drawFunc ! = nullptr ) {
window . drawFunc ( window . enabled ) ;
}
}
2022-03-21 21:52:44 -04:00
ImGui : : PushStyleVar ( ImGuiStyleVar_WindowPadding , ImVec2 ( 0 , 0 ) ) ;
2022-04-18 05:37:47 -04:00
ImGui : : PushStyleVar ( ImGuiStyleVar_WindowBorderSize , 0.0f ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_ChildBorderSize , 0.0f ) ;
2022-03-21 21:52:44 -04:00
ImGui : : PushStyleColor ( ImGuiCol_ChildBg , ImVec4 ( 0.0f , 0.0f , 0.0f , 0.0f ) ) ;
2022-04-18 05:37:47 -04:00
ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBackground ;
2022-03-21 21:52:44 -04:00
ImGui : : Begin ( " OoT Master Quest " , nullptr , flags ) ;
2022-04-18 05:37:47 -04:00
ImGui : : PopStyleVar ( 3 ) ;
2022-03-21 21:52:44 -04:00
ImGui : : PopStyleColor ( ) ;
ImVec2 main_pos = ImGui : : GetWindowPos ( ) ;
2022-04-18 05:37:47 -04:00
main_pos . x - = top_left_pos . x ;
main_pos . y - = top_left_pos . y ;
2022-03-21 21:52:44 -04:00
ImVec2 size = ImGui : : GetContentRegionAvail ( ) ;
ImVec2 pos = ImVec2 ( 0 , 0 ) ;
gfx_current_dimensions . width = size . x * gfx_current_dimensions . internal_mul ;
gfx_current_dimensions . height = size . y * gfx_current_dimensions . internal_mul ;
2022-04-18 05:37:47 -04:00
gfx_current_game_window_viewport . x = main_pos . x ;
gfx_current_game_window_viewport . y = main_pos . y ;
gfx_current_game_window_viewport . width = size . x ;
gfx_current_game_window_viewport . height = size . y ;
2022-04-25 02:27:24 -04:00
if ( CVar_GetS32 ( " gN64Mode " , 0 ) )
{
2022-04-18 05:37:47 -04:00
gfx_current_dimensions . width = 320 ;
gfx_current_dimensions . height = 240 ;
const int sw = size . y * 320 / 240 ;
gfx_current_game_window_viewport . x + = ( size . x - sw ) / 2 ;
gfx_current_game_window_viewport . width = sw ;
pos = ImVec2 ( size . x / 2 - sw / 2 , 0 ) ;
size = ImVec2 ( sw , size . y ) ;
2022-03-21 21:52:44 -04:00
}
2022-05-11 13:35:03 -04:00
overlay - > Draw ( ) ;
2022-04-18 05:37:47 -04:00
}
2022-03-21 21:52:44 -04:00
2022-04-18 05:37:47 -04:00
void DrawFramebufferAndGameInput ( ) {
ImVec2 main_pos = ImGui : : GetWindowPos ( ) ;
ImVec2 size = ImGui : : GetContentRegionAvail ( ) ;
ImVec2 pos = ImVec2 ( 0 , 0 ) ;
2022-04-25 02:27:24 -04:00
if ( CVar_GetS32 ( " gN64Mode " , 0 ) ) {
2022-04-18 05:37:47 -04:00
const int sw = size . y * 320 / 240 ;
pos = ImVec2 ( size . x / 2 - sw / 2 , 0 ) ;
size = ImVec2 ( sw , size . y ) ;
2022-03-21 21:52:44 -04:00
}
2022-04-18 05:37:47 -04:00
std : : string fb_str = SohUtils : : getEnvironmentVar ( " framebuffer " ) ;
if ( ! fb_str . empty ( ) ) {
uintptr_t fbuf = ( uintptr_t ) std : : stoull ( fb_str ) ;
//ImGui::ImageSimple(reinterpret_cast<ImTextureID>(fbuf), pos, size);
ImGui : : SetCursorPos ( pos ) ;
ImGui : : Image ( reinterpret_cast < ImTextureID > ( fbuf ) , size ) ;
2022-03-21 21:52:44 -04:00
}
2022-04-18 05:37:47 -04:00
ImGui : : End ( ) ;
2022-04-25 02:27:24 -04:00
const float scale = CVar_GetFloat ( " gInputScale " , 1.0f ) ;
2022-03-21 21:52:44 -04:00
ImVec2 BtnPos = ImVec2 ( 160 * scale , 85 * scale ) ;
2022-04-25 02:27:24 -04:00
if ( CVar_GetS32 ( " gInputEnabled " , 0 ) ) {
2022-03-21 22:25:30 -04:00
ImGui : : SetNextWindowSize ( BtnPos ) ;
ImGui : : SetNextWindowPos ( ImVec2 ( main_pos . x + size . x - BtnPos . x - 20 , main_pos . y + size . y - BtnPos . y - 20 ) ) ;
if ( pads ! = nullptr & & ImGui : : Begin ( " Game Buttons " , nullptr , ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBackground ) ) {
ImGui : : SetCursorPosY ( 32 * scale ) ;
ImGui : : BeginGroup ( ) ;
const ImVec2 cPos = ImGui : : GetCursorPos ( ) ;
ImGui : : SetCursorPos ( ImVec2 ( cPos . x + 10 * scale , cPos . y - 20 * scale ) ) ;
BindButton ( " L-Btn " , pads [ 0 ] . button & BTN_L ) ;
ImGui : : SetCursorPos ( ImVec2 ( cPos . x + 16 * scale , cPos . y ) ) ;
BindButton ( " C-Up " , pads [ 0 ] . button & BTN_CUP ) ;
ImGui : : SetCursorPos ( ImVec2 ( cPos . x , cPos . y + 16 * scale ) ) ;
BindButton ( " C-Left " , pads [ 0 ] . button & BTN_CLEFT ) ;
ImGui : : SetCursorPos ( ImVec2 ( cPos . x + 32 * scale , cPos . y + 16 * scale ) ) ;
BindButton ( " C-Right " , pads [ 0 ] . button & BTN_CRIGHT ) ;
ImGui : : SetCursorPos ( ImVec2 ( cPos . x + 16 * scale , cPos . y + 32 * scale ) ) ;
BindButton ( " C-Down " , pads [ 0 ] . button & BTN_CDOWN ) ;
ImGui : : EndGroup ( ) ;
2022-03-21 21:52:44 -04:00
2022-03-21 22:25:30 -04:00
ImGui : : SameLine ( ) ;
ImGui : : BeginGroup ( ) ;
const ImVec2 sPos = ImGui : : GetCursorPos ( ) ;
ImGui : : SetCursorPos ( ImVec2 ( sPos . x + 21 , sPos . y - 20 * scale ) ) ;
BindButton ( " Z-Btn " , pads [ 0 ] . button & BTN_Z ) ;
ImGui : : SetCursorPos ( ImVec2 ( sPos . x + 22 , sPos . y + 16 * scale ) ) ;
BindButton ( " Start-Btn " , pads [ 0 ] . button & BTN_START ) ;
ImGui : : EndGroup ( ) ;
ImGui : : SameLine ( ) ;
ImGui : : BeginGroup ( ) ;
const ImVec2 bPos = ImGui : : GetCursorPos ( ) ;
ImGui : : SetCursorPos ( ImVec2 ( bPos . x + 20 * scale , bPos . y - 20 * scale ) ) ;
BindButton ( " R-Btn " , pads [ 0 ] . button & BTN_R ) ;
ImGui : : SetCursorPos ( ImVec2 ( bPos . x + 12 * scale , bPos . y + 8 * scale ) ) ;
BindButton ( " B-Btn " , pads [ 0 ] . button & BTN_B ) ;
ImGui : : SetCursorPos ( ImVec2 ( bPos . x + 28 * scale , bPos . y + 24 * scale ) ) ;
BindButton ( " A-Btn " , pads [ 0 ] . button & BTN_A ) ;
ImGui : : EndGroup ( ) ;
ImGui : : End ( ) ;
}
2022-03-21 21:52:44 -04:00
}
2022-04-18 05:37:47 -04:00
}
2022-03-21 21:52:44 -04:00
2022-04-18 05:37:47 -04:00
void Render ( ) {
2022-03-21 21:52:44 -04:00
ImGui : : Render ( ) ;
ImGuiRenderDrawData ( ImGui : : GetDrawData ( ) ) ;
if ( UseViewports ( ) ) {
ImGui : : UpdatePlatformWindows ( ) ;
ImGui : : RenderPlatformWindowsDefault ( ) ;
}
}
2022-04-18 05:37:47 -04:00
void CancelFrame ( ) {
ImGui : : EndFrame ( ) ;
if ( UseViewports ( ) ) {
ImGui : : UpdatePlatformWindows ( ) ;
}
}
2022-03-21 21:52:44 -04:00
void BindCmd ( const std : : string & cmd , CommandEntry entry ) {
console - > Commands [ cmd ] = std : : move ( entry ) ;
}
2022-04-03 15:47:24 -04:00
void AddWindow ( const std : : string & category , const std : : string & name , WindowDrawFunc drawFunc ) {
if ( customWindows . contains ( name ) ) {
SPDLOG_ERROR ( " SohImGui::AddWindow: Attempting to add duplicate window name %s " , name . c_str ( ) ) ;
return ;
}
customWindows [ name ] = {
. enabled = false ,
. drawFunc = drawFunc
} ;
windowCategories [ category ] . emplace_back ( name ) ;
}
ImTextureID GetTextureByName ( const std : : string & name ) {
return GetTextureByID ( DefaultAssets [ name ] - > textureId ) ;
}
2022-05-11 13:18:24 -04:00
ImTextureID GetTextureByID ( int id ) {
# ifdef ENABLE_DX11
2022-05-12 09:06:39 -04:00
if ( impl . backend = = Backend : : DX11 )
{
ImTextureID gfx_d3d11_get_texture_by_id ( int id ) ;
return gfx_d3d11_get_texture_by_id ( id ) ;
}
2022-05-11 13:18:24 -04:00
# endif
2022-05-12 09:06:39 -04:00
return reinterpret_cast < ImTextureID > ( id ) ;
2022-05-11 13:18:24 -04:00
}
2022-04-17 11:26:49 -04:00
}