FOV Slider Tweak (Java Edition Similar)

This commit is contained in:
synanesthetics 2026-03-07 11:11:28 -06:00
parent 341dfa1868
commit e41607e58c
5 changed files with 52 additions and 23 deletions

View file

@ -837,7 +837,7 @@ int CMinecraftApp::SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,con
SetGameSettings(iPad,eGameSetting_SoundFXVolume,DEFAULT_VOLUME_LEVEL);
SetGameSettings(iPad,eGameSetting_RenderDistance,16);
SetGameSettings(iPad,eGameSetting_Gamma,50);
SetGameSettings(iPad,eGameSetting_FOV,0);
SetGameSettings(iPad,eGameSetting_FOV,75); // jvnpr -- default to 75% between 30 and 110, which is 90 (70 internal)
// 4J-PB - Don't reset the difficult level if we're in-game
if(Minecraft::GetInstance()->level==NULL)
@ -1406,8 +1406,9 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal)
case eGameSetting_FOV:
if(iPad==ProfileManager.GetPrimaryPad())
{
float fovDeg = 70.0f + (float)GameSettingsA[iPad]->ucFov * 40.0f / 100.0f;
pMinecraft->gameRenderer->SetFovVal(fovDeg);
float simulatedFovDeg = 30.0f + (float)GameSettingsA[iPad]->ucFov * 80.0f / 100.0f; // jvnpr -- convert 0-80 to 30-110
float trueFovDeg = ( 55.0f / 80.0f ) * (simulatedFovDeg - 30.0f) + 30.0f; // jnvpr -- further convert 30-110 to a range from 30-85 to better reflect JE fov values
pMinecraft->gameRenderer->SetFovVal(trueFovDeg);
pMinecraft->options->set(Options::Option::FOV, (float)GameSettingsA[iPad]->ucFov / 100.0f);
}
break;

View file

@ -23,10 +23,10 @@ UIScene_DebugOverlay::UIScene_DebugOverlay(int iPad, void *initData, UILayer *pa
Minecraft *pMinecraft = Minecraft::GetInstance();
WCHAR TempString[256];
int fovSliderVal = app.GetGameSettings(m_iPad, eGameSetting_FOV);
int fovDeg = 70 + fovSliderVal * 40 / 100;
int fovSliderVal = app.GetGameSettings(m_iPad, eGameSetting_FOV) * 80.0f / 100.0f;
int fovDeg = 30 + fovSliderVal * 80 / 100;
swprintf( (WCHAR *)TempString, 256, L"Set fov (%d)", fovDeg);
m_sliderFov.init(TempString,eControl_FOV,0,100,fovSliderVal);
m_sliderFov.init(TempString,eControl_FOV,0,80,fovSliderVal);
float currentTime = pMinecraft->level->getLevelData()->getGameTime() % 24000;
swprintf( (WCHAR *)TempString, 256, L"Set time (unsafe) (%d)", (int)currentTime);
@ -274,16 +274,17 @@ void UIScene_DebugOverlay::handleSliderMove(F64 sliderId, F64 currentValue)
break;
case eControl_FOV:
{
Minecraft *pMinecraft = Minecraft::GetInstance();
int v = (int)currentValue;
Minecraft *pMinecraft = Minecraft::GetInstance();
if (v < 0) v = 0;
if (v > 100) v = 100;
int fovDeg = 70 + v * 40 / 100;
pMinecraft->gameRenderer->SetFovVal((float)fovDeg);
app.SetGameSettings(m_iPad, eGameSetting_FOV, v);
if (v > 80) v = 80;
int simulatedFovDeg = v + 30; // jvnpr -- convert 0-80 to 30-110
float trueFovDeg = ( 55.0f / 80.0f ) * (simulatedFovDeg - 30.0f) + 30.0f; // jvnpr -- further convert 30-110 to a range from 30-85 to better reflect JE fov values
pMinecraft->gameRenderer->SetFovVal(trueFovDeg);
app.SetGameSettings(m_iPad, eGameSetting_FOV, (v / (80.0f / 100.0f)));
WCHAR TempString[256];
swprintf( (WCHAR *)TempString, 256, L"Set fov (%d)", fovDeg);
swprintf( (WCHAR *)TempString, 256, L"FOV: %d (True: %d)", simulatedFovDeg, (int)trueFovDeg);
m_sliderFov.setLabel(TempString);
}
break;

View file

@ -7,6 +7,10 @@
namespace
{
/*
jvnpr -- commented out this code from the kbm refactor to modify fov system :p
const int FOV_MIN = 70;
const int FOV_MAX = 110;
const int FOV_SLIDER_MAX = 100;
@ -30,6 +34,8 @@ namespace
if (sliderValue > FOV_SLIDER_MAX) sliderValue = FOV_SLIDER_MAX;
return FOV_MIN + ((sliderValue * (FOV_MAX - FOV_MIN)) / FOV_SLIDER_MAX);
}
*/
}
int UIScene_SettingsGraphicsMenu::LevelToDistance(int level)
@ -71,10 +77,10 @@ UIScene_SettingsGraphicsMenu::UIScene_SettingsGraphicsMenu(int iPad, void *initD
swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_GAMMA ),app.GetGameSettings(m_iPad,eGameSetting_Gamma));
m_sliderGamma.init(TempString,eControl_Gamma,0,100,app.GetGameSettings(m_iPad,eGameSetting_Gamma));
int initialFovSlider = app.GetGameSettings(m_iPad, eGameSetting_FOV);
int initialFovDeg = sliderValueToFov(initialFovSlider);
swprintf((WCHAR*)TempString, 256, L"FOV: %d", initialFovDeg);
m_sliderFOV.init(TempString, eControl_FOV, 0, FOV_SLIDER_MAX, initialFovSlider);
//int initialFovSlider = app.GetGameSettings(m_iPad, eGameSetting_FOV);
//int initialFovDeg = sliderValueToFov(initialFovSlider);
swprintf((WCHAR*)TempString, 256, L"FOV: %d", (int)(30.0f + app.GetGameSettings(m_iPad, eGameSetting_FOV) * 80.0f / 100.0f));
m_sliderFOV.init(TempString, eControl_FOV, 0, 80, (app.GetGameSettings(m_iPad, eGameSetting_FOV)) * 80.0f / 100.0f);
swprintf( (WCHAR *)TempString, 256, L"%ls: %d%%", app.GetString( IDS_SLIDER_INTERFACEOPACITY ),app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity));
m_sliderInterfaceOpacity.init(TempString,eControl_InterfaceOpacity,0,100,app.GetGameSettings(m_iPad,eGameSetting_InterfaceOpacity));
@ -215,14 +221,31 @@ void UIScene_SettingsGraphicsMenu::handleSliderMove(F64 sliderId, F64 currentVal
break;
case eControl_FOV:
{
{ /* jvnpr -- commented code from keyboard mouse refactor
m_sliderFOV.handleSliderMove(value);
int fovVal = value + 30;
Minecraft* pMinecraft = Minecraft::GetInstance();
int fovValue = sliderValueToFov(value);
pMinecraft->gameRenderer->SetFovVal((float)fovValue);
app.SetGameSettings(m_iPad, eGameSetting_FOV, value);
//int fovValue = sliderValueToFov(value);
pMinecraft->gameRenderer->SetFovVal((float)fovVal);
app.SetGameSettings(m_iPad, eGameSetting_FOV, fovVal);
WCHAR TempString[256];
swprintf((WCHAR*)TempString, 256, L"FOV: %d", fovValue);
swprintf((WCHAR*)TempString, 256, L"FOV: %d", fovVal);
m_sliderFOV.setLabel(TempString);
*/
int v = (int)currentValue;
m_sliderFOV.handleSliderMove(v);
Minecraft *pMinecraft = Minecraft::GetInstance();
if (v < 0) v = 0;
if (v > 80) v = 80;
int simulatedFovDeg = v + 30; // jvnpr -- convert 0-80 to 30-110
float trueFovDeg = ( 55.0f / 80.0f ) * (simulatedFovDeg - 30.0f) + 30.0f; // jvnpr -- further convert 30-110 to a range from 30-85 to better reflect JE fov values
pMinecraft->gameRenderer->SetFovVal(trueFovDeg);
app.SetGameSettings(m_iPad, eGameSetting_FOV, (v / (80.0f / 100.0f)));
WCHAR TempString[256];
swprintf( (WCHAR *)TempString, 256, L"FOV: %d (True: %d)", simulatedFovDeg, (int)trueFovDeg);
m_sliderFOV.setLabel(TempString);
}
break;

View file

@ -132,6 +132,8 @@ GameRenderer::GameRenderer(Minecraft *mc)
m_fov=70.0f;
h_fov=70.0f; // jvnpr -- Hardcoded hand FOV to prevent scaling with main renderer fov
// 4J Stu - Init these so they are setup before the tick
for( int i = 0; i < 4; i++ )
{
@ -714,14 +716,14 @@ void GameRenderer::renderItemInHand(float a, int eye)
// 4J - have split out fov & aspect calculation so we can take into account viewports
float fov, aspect;
getFovAndAspect(fov, aspect, a, false);
getFovAndAspect(fov, aspect, a, false); // jvnpr -- don't need to run fov calc since it's hardcoded now but it's probably better to just leave this
if (zoom != 1)
{
glTranslatef((float) zoom_x, (float) -zoom_y, 0);
glScaled(zoom, zoom, 1);
}
gluPerspective(fov, aspect, 0.05f, renderDistance * 2);
gluPerspective(h_fov, aspect, 0.05f, renderDistance * 2); // jvnpr -- hardcoded h_fov to fix hand fov scaling
if (mc->gameMode->isCutScene())
{

View file

@ -88,6 +88,8 @@ private:
bool isInClouds;
float m_fov;
float h_fov; // jvnpr -- Hardcoded hand FOV to prevent scaling with main renderer fov
public:
GameRenderer(Minecraft *mc);
~GameRenderer();