diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp index aefd9fb1..3bd0c16f 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -1653,18 +1653,29 @@ void CMinecraftApp::ActionGameSettings(int iPad,eGameSetting eVal) if (graphicsLevel == 0) { pMinecraft->options->set(Options::Option::GRAPHICS, false); + pMinecraft->options->set(Options::Option::BETTER_WATER, false); pMinecraft->options->set(Options::Option::AMBIENT_OCCLUSION, false); pMinecraft->options->set(Options::Option::PARTICLES, 2); } else if (graphicsLevel == 1) { pMinecraft->options->set(Options::Option::GRAPHICS, false); + pMinecraft->options->set(Options::Option::BETTER_WATER, false); pMinecraft->options->set(Options::Option::AMBIENT_OCCLUSION, true); pMinecraft->options->set(Options::Option::PARTICLES, 1); } + else if (graphicsLevel == 2) + { + pMinecraft->options->set(Options::Option::GRAPHICS, true); + pMinecraft->options->set(Options::Option::BETTER_WATER, false); + pMinecraft->options->set(Options::Option::AMBIENT_OCCLUSION, true); + pMinecraft->options->set(Options::Option::PARTICLES, 0); + pMinecraft->textures->reloadAll(); + } else { pMinecraft->options->set(Options::Option::GRAPHICS, true); + pMinecraft->options->set(Options::Option::BETTER_WATER, true); pMinecraft->options->set(Options::Option::AMBIENT_OCCLUSION, true); pMinecraft->options->set(Options::Option::PARTICLES, 0); pMinecraft->textures->reloadAll(); diff --git a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp index c3291950..e2eae1a3 100644 --- a/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_SettingsGraphicsMenu.cpp @@ -85,10 +85,11 @@ UIScene_SettingsGraphicsMenu::UIScene_SettingsGraphicsMenu(int iPad, void *initD const wchar_t* graphicsText = L""; if (currentGraphics == 0) graphicsText = L"Graphics: Potato"; else if (currentGraphics == 1) graphicsText = L"Graphics: Fast"; - else graphicsText = L"Graphics: Fancy"; + else if (currentGraphics == 2) graphicsText = L"Graphics: Fancy"; + else graphicsText = L"Graphics: Extra"; swprintf(TempString, 256, L"%ls", graphicsText); - m_sliderGraphicsMode.init(TempString, eControl_GraphicsMode, 0, 2, currentGraphics); + m_sliderGraphicsMode.init(TempString, eControl_GraphicsMode, 0, 3, currentGraphics); doHorizontalResizeCheck(); @@ -255,6 +256,7 @@ void UIScene_SettingsGraphicsMenu::handleSliderMove(F64 sliderId, F64 currentVal const wchar_t* modeName = L"Potato"; if (value == 1) modeName = L"Fast"; else if (value == 2) modeName = L"Fancy"; + else if (value == 3) modeName = L"Extra"; swprintf(TempString, 256, L"Graphics: %ls", modeName); diff --git a/Minecraft.Client/Options.cpp b/Minecraft.Client/Options.cpp index 9a93f608..c0be5483 100644 --- a/Minecraft.Client/Options.cpp +++ b/Minecraft.Client/Options.cpp @@ -15,7 +15,7 @@ #include "..\Minecraft.World\StringHelpers.h" // 4J - the Option sub-class used to be an java enumerated type, trying to emulate that functionality here -const Options::Option Options::Option::options[17] = +const Options::Option Options::Option::options[18] = { Options::Option(L"options.music", true, false), Options::Option(L"options.sound", true, false), @@ -29,6 +29,7 @@ const Options::Option Options::Option::options[17] = Options::Option(L"options.difficulty", false, false), Options::Option(L"options.graphics", false, false), Options::Option(L"options.ao", false, true), + Options::Option(L"options.betterWater", false, false), Options::Option(L"options.guiScale", false, false), Options::Option(L"options.fov", true, false), Options::Option(L"options.gamma", true, false), @@ -48,11 +49,12 @@ const Options::Option *Options::Option::FRAMERATE_LIMIT = &Options::Option::opti const Options::Option *Options::Option::DIFFICULTY = &Options::Option::options[9]; const Options::Option *Options::Option::GRAPHICS = &Options::Option::options[10]; const Options::Option *Options::Option::AMBIENT_OCCLUSION = &Options::Option::options[11]; -const Options::Option *Options::Option::GUI_SCALE = &Options::Option::options[12]; -const Options::Option *Options::Option::FOV = &Options::Option::options[13]; -const Options::Option *Options::Option::GAMMA = &Options::Option::options[14]; -const Options::Option *Options::Option::RENDER_CLOUDS = &Options::Option::options[15]; -const Options::Option *Options::Option::PARTICLES = &Options::Option::options[16]; +const Options::Option *Options::Option::BETTER_WATER = &Options::Option::options[12]; +const Options::Option *Options::Option::GUI_SCALE = &Options::Option::options[13]; +const Options::Option *Options::Option::FOV = &Options::Option::options[14]; +const Options::Option *Options::Option::GAMMA = &Options::Option::options[15]; +const Options::Option *Options::Option::RENDER_CLOUDS = &Options::Option::options[16]; +const Options::Option *Options::Option::PARTICLES = &Options::Option::options[17]; const Options::Option *Options::Option::getItem(int id) @@ -119,6 +121,7 @@ void Options::init() advancedOpengl = false; framerateLimit = 0; fancyGraphics = true; + betterWater = false; ambientOcclusion = true; renderClouds = true; skin = L"Default"; @@ -248,6 +251,10 @@ void Options::set(const Options::Option *item, float fVal) { fancyGraphics = fVal; } + if (item == Option::BETTER_WATER) + { + betterWater = fVal; + } if (item == Option::AMBIENT_OCCLUSION) { ambientOcclusion = fVal; @@ -293,6 +300,11 @@ void Options::toggle(const Options::Option *option, int dir) ambientOcclusion = !ambientOcclusion; minecraft->levelRenderer->allChanged(); } + if (option == Option::BETTER_WATER) + { + betterWater = !betterWater; + minecraft->textures->reloadAll(); + } // 4J-PB - don't do the file save on the xbox // save(); @@ -308,6 +320,7 @@ float Options::getProgressValue(const Options::Option *item) if (item == Option::RENDER_DISTANCE) return viewDistance; if (item == Option::GRAPHICS) return fancyGraphics; if (item == Option::AMBIENT_OCCLUSION) return ambientOcclusion; + if (item == Option::BETTER_WATER) return betterWater; return 0; } diff --git a/Minecraft.Client/Options.h b/Minecraft.Client/Options.h index 29cd83ac..ae66d0ab 100644 --- a/Minecraft.Client/Options.h +++ b/Minecraft.Client/Options.h @@ -15,7 +15,7 @@ public: class Option { public: - static const Option options[17]; + static const Option options[18]; static const Option *MUSIC; static const Option *SOUND; static const Option *INVERT_MOUSE; @@ -28,6 +28,7 @@ public: static const Option *DIFFICULTY; static const Option *GRAPHICS; static const Option *AMBIENT_OCCLUSION; + static const Option *BETTER_WATER; static const Option *GUI_SCALE; static const Option *FOV; static const Option *GAMMA; @@ -68,6 +69,7 @@ public: int framerateLimit; bool fancyGraphics; bool ambientOcclusion; + bool betterWater; bool renderClouds; wstring skin; diff --git a/Minecraft.Client/Texture.cpp b/Minecraft.Client/Texture.cpp index fafb5cac..78dbcf4e 100644 --- a/Minecraft.Client/Texture.cpp +++ b/Minecraft.Client/Texture.cpp @@ -717,39 +717,47 @@ int Texture::crispBlend(int c0, int c1) int a0 = static_cast(((c0 & 0xff000000) >> 24)) & 0xff; int a1 = static_cast(((c1 & 0xff000000) >> 24)) & 0xff; - int a = 255; - - if (a0 + a1 < 255) + // continue with crisp blend if it's likely to be an opaque/cutout tile in the atlas + if (a0 >= 0xfa || a1 >= 0xfa || !Minecraft::GetInstance()->options->betterWater) { - a = 0; - a0 = 1; - a1 = 1; + int a = 255; + + if (a0 + a1 < 255) + { + a = 0; + a0 = 1; + a1 = 1; + } + else if (a0 > a1) + { + a0 = 255; + a1 = 1; + } + else + { + a0 = 1; + a1 = 255; + + } + + int r0 = ((c0 >> 16) & 0xff) * a0; + int g0 = ((c0 >> 8) & 0xff) * a0; + int b0 = ((c0) & 0xff) * a0; + + int r1 = ((c1 >> 16) & 0xff) * a1; + int g1 = ((c1 >> 8) & 0xff) * a1; + int b1 = ((c1) & 0xff) * a1; + + int r = (r0 + r1) / (a0 + a1); + int g = (g0 + g1) / (a0 + a1); + int b = (b0 + b1) / (a0 + a1); + + return (a << 24) | (r << 16) | (g << 8) | b; } - else if (a0 > a1) + else // smoothblend if it's transparent { - a0 = 255; - a1 = 1; + return (((a0 + a1) >> 1) << 24) | (((c0 & 0xfefefe) + (c1 & 0xfefefe)) >> 1); } - else - { - a0 = 1; - a1 = 255; - - } - - int r0 = ((c0 >> 16) & 0xff) * a0; - int g0 = ((c0 >> 8) & 0xff) * a0; - int b0 = ((c0) & 0xff) * a0; - - int r1 = ((c1 >> 16) & 0xff) * a1; - int g1 = ((c1 >> 8) & 0xff) * a1; - int b1 = ((c1) & 0xff) * a1; - - int r = (r0 + r1) / (a0 + a1); - int g = (g0 + g1) / (a0 + a1); - int b = (b0 + b1) / (a0 + a1); - - return (a << 24) | (r << 16) | (g << 8) | b; } int Texture::getManagerId()