diff --git a/Minecraft.Client/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp index b476ca909..18e0cfd97 100644 --- a/Minecraft.Client/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -836,7 +836,8 @@ int CMinecraftApp::SetDefaultOptions(C_4JProfile::PROFILESETTINGS *pSettings,con { SetGameSettings(iPad,eGameSetting_MusicVolume,DEFAULT_VOLUME_LEVEL); SetGameSettings(iPad,eGameSetting_SoundFXVolume,DEFAULT_VOLUME_LEVEL); - SetGameSettings(iPad,eGameSetting_Gamma,50); + // 75% gamma as it looks better than 50% after the latest update. + SetGameSettings(iPad,eGameSetting_Gamma,75); // 4J-PB - Don't reset the difficult level if we're in-game if(Minecraft::GetInstance()->level==NULL) diff --git a/Minecraft.Client/GameRenderer.cpp b/Minecraft.Client/GameRenderer.cpp index d3c5e8d39..3a7ec95a1 100644 --- a/Minecraft.Client/GameRenderer.cpp +++ b/Minecraft.Client/GameRenderer.cpp @@ -834,124 +834,146 @@ void GameRenderer::tickLightTexture() void GameRenderer::updateLightTexture(float a) { - // 4J-JEV: Now doing light textures on PER PLAYER basis. - // 4J - we *had* added separate light textures for all dimensions, and this loop to update them all here - for(int j = 0; j < XUSER_MAX_COUNT; j++ ) - { - // Loop over all the players - shared_ptr player = Minecraft::GetInstance()->localplayers[j]; - if (player == NULL) continue; + for (int j = 0; j < XUSER_MAX_COUNT; j++) + { + shared_ptr player = Minecraft::GetInstance()->localplayers[j]; + if (player == nullptr) continue; - Level *level = player->level; // 4J - was mc->level when it was just to update the one light texture + Level* level = player->level; - float skyDarken1 = level->getSkyDarken((float) 1); - for (int i = 0; i < 256; i++) - { - float darken = skyDarken1 * 0.95f + 0.05f; - float sky = level->dimension->brightnessRamp[i / 16] * darken; - float block = level->dimension->brightnessRamp[i % 16] * (blr * 0.1f + 1.5f); + float slider = app.GetGameSettings(j, eGameSetting_Gamma); // 0..100 + if (slider < 0.0f) slider = 0.0f; + if (slider > 100.0f) slider = 100.0f; + const float s = slider / 100.0f; - if (level->skyFlashTime > 0) - { - sky = level->dimension->brightnessRamp[i / 16]; - } + float gammaExponent; + float brightT = 0.0f; + if (s >= 0.5f) + { + const float t = (s - 0.5f) * 2.0f; // 0..1 + gammaExponent = 1.0f + (0.5f - 1.0f) * t; // 1.0 -> 0.5 + brightT = t; + } + else + { + const float t = (0.5f - s) * 2.0f; // 0..1 + gammaExponent = 1.0f + (2.0f - 1.0f) * t; // 1.0 -> 2.0 + brightT = 0.0f; + } - float rs = sky * (skyDarken1 * 0.65f + 0.35f); - float gs = sky * (skyDarken1 * 0.65f + 0.35f); - float bs = sky; + // Toe lift scales with brightening only + const float toe = 0.06f + 0.10f * brightT; - float rb = block; - float gb = block * ((block * 0.6f + 0.4f) * 0.6f + 0.4f); - float bb = block * ((block * block) * 0.6f + 0.4f); + const float skyDarken1 = level->getSkyDarken(1.0f); + for (int i = 0; i < 256; i++) + { + const float darken = skyDarken1 * 0.95f + 0.05f; + float sky = level->dimension->brightnessRamp[i / 16] * darken; + const float block = level->dimension->brightnessRamp[i % 16] * (blr * 0.1f + 1.5f); - float _r = (rs + rb); - float _g = (gs + gb); - float _b = (bs + bb); + if (level->skyFlashTime < 0) + { + sky = level->dimension->brightnessRamp[i / 16]; + } - _r = _r * 0.96f + 0.03f; - _g = _g * 0.96f + 0.03f; - _b = _b * 0.96f + 0.03f; + const float rs = sky * (skyDarken1 * 0.65f + 0.35f); + const float gs = sky * (skyDarken1 * 0.65f + 0.35f); + const float bs = sky; - if (darkenWorldAmount > 0) - { - float amount = darkenWorldAmountO + (darkenWorldAmount - darkenWorldAmountO) * a; - _r = _r * (1.0f - amount) + (_r * .7f) * amount; - _g = _g * (1.0f - amount) + (_g * .6f) * amount; - _b = _b * (1.0f - amount) + (_b * .6f) * amount; - } + const float rb = block; + const float gb = block * ((block * 0.6f + 0.4f) * 0.6f + 0.4f); + const float bb = block * ((block * block) * 0.6f + 0.4f); - if (level->dimension->id == 1) - { - _r = (0.22f + rb * 0.75f); - _g = (0.28f + gb * 0.75f); - _b = (0.25f + bb * 0.75f); - } + float _r = (rs + rb); + float _g = (gs + gb); + float _b = (bs + bb); - if (player->hasEffect(MobEffect::nightVision)) - { - float scale = getNightVisionScale(player, a); - { - float dist = 1.0f / _r; - if (dist > (1.0f / _g)) - { - dist = (1.0f / _g); - } - if (dist > (1.0f / _b)) - { - dist = (1.0f / _b); - } - _r = _r * (1.0f - scale) + (_r * dist) * scale; - _g = _g * (1.0f - scale) + (_g * dist) * scale; - _b = _b * (1.0f - scale) + (_b * dist) * scale; - } - } + _r = _r * 0.96f + 0.03f; + _g = _g * 0.96f + 0.03f; + _b = _b * 0.96f + 0.03f; - if (_r > 1) _r = 1; - if (_g > 1) _g = 1; - if (_b > 1) _b = 1; + if (darkenWorldAmount > 0) + { + const float amount = darkenWorldAmountO + (darkenWorldAmount - darkenWorldAmountO) * a; + _r = _r * (1.0f - amount) + (_r * 0.7f) * amount; + _g = _g * (1.0f - amount) + (_g * 0.6f) * amount; + _b = _b * (1.0f - amount) + (_b * 0.6f) * amount; + } - float brightness = mc->options->gamma; + if (level->dimension->id == 1) + { + _r = (0.22f + rb * 0.75f); + _g = (0.28f + gb * 0.75f); + _b = (0.25f + bb * 0.75f); + } - float ir = 1 - _r; - float ig = 1 - _g; - float ib = 1 - _b; - ir = 1 - (ir * ir * ir * ir); - ig = 1 - (ig * ig * ig * ig); - ib = 1 - (ib * ib * ib * ib); - _r = _r * (1 - brightness) + ir * brightness; - _g = _g * (1 - brightness) + ig * brightness; - _b = _b * (1 - brightness) + ib * brightness; + if (player->hasEffect(MobEffect::nightVision)) + { + const float scale = getNightVisionScale(player, a); + float dist = 1.0f / _r; + if (dist > (1.0f / _g)) dist = (1.0f / _g); + if (dist > (1.0f / _b)) dist = (1.0f / _b); + _r = _r * (1.0f - scale) + (_r * dist) * scale; + _g = _g * (1.0f - scale) + (_g * dist) * scale; + _b = _b * (1.0f - scale) + (_b * dist) * scale; + } - _r = _r * 0.96f + 0.03f; - _g = _g * 0.96f + 0.03f; - _b = _b * 0.96f + 0.03f; + if (_r > 1.0f) _r = 1.0f; if (_r < 0.0f) _r = 0.0f; + if (_g > 1.0f) _g = 1.0f; if (_g < 0.0f) _g = 0.0f; + if (_b > 1.0f) _b = 1.0f; if (_b < 0.0f) _b = 0.0f; - if (_r > 1) _r = 1; - if (_g > 1) _g = 1; - if (_b > 1) _b = 1; - if (_r < 0) _r = 0; - if (_g < 0) _g = 0; - if (_b < 0) _b = 0; + if (gammaExponent > 0.999f && gammaExponent < 1.001f) + { + // no op + } + else if (gammaExponent > 0.499f && gammaExponent < 0.501f) + { + _r = sqrtf(_r); + _g = sqrtf(_g); + _b = sqrtf(_b); + } + else if (gammaExponent > 1.999f && gammaExponent < 2.001f) + { + _r = _r * _r; + _g = _g * _g; + _b = _b * _b; + } + else + { + _r = powf(_r, gammaExponent); + _g = powf(_g, gammaExponent); + _b = powf(_b, gammaExponent); + } - int alpha = 255; - int r = (int) (_r * 255); - int g = (int) (_g * 255); - int b = (int) (_b * 255); + // Toe lift + float ir = 1.0f - _r; ir = 1.0f - ir * ir * ir * ir; + float ig = 1.0f - _g; ig = 1.0f - ig * ig * ig * ig; + float ib = 1.0f - _b; ib = 1.0f - ib * ib * ib * ib; + + _r = _r * (1.0f - toe) + ir * toe; + _g = _g * (1.0f - toe) + ig * toe; + _b = _b * (1.0f - toe) + ib * toe; + + if (_r < 0.0f) _r = 0.0f; if (_r > 1.0f) _r = 1.0f; + if (_g < 0.0f) _g = 0.0f; if (_g > 1.0f) _g = 1.0f; + if (_b < 0.0f) _b = 0.0f; if (_b > 1.0f) _b = 1.0f; + + constexpr int alpha = 255; + const int r = static_cast(_r * 255); + const int g = static_cast(_g * 255); + const int b = static_cast(_b * 255); #if ( defined _DURANGO || defined _WIN64 || __PSVITA__ ) - lightPixels[j][i] = alpha << 24 | b << 16 | g << 8 | r; + lightPixels[j][i] = alpha << 24 | b << 16 | g << 8 | r; #elif ( defined _XBOX || defined __ORBIS__ ) - lightPixels[j][i] = alpha << 24 | r << 16 | g << 8 | b; + lightPixels[j][i] = alpha << 24 | r << 16 | g << 8 | b; #else - lightPixels[j][i] = r << 24 | g << 16 | b << 8 | alpha; + lightPixels[j][i] = r << 24 | g << 16 | b << 8 | alpha; #endif - } + } - mc->textures->replaceTextureDirect( lightPixels[j], 16, 16, getLightTexture(j,level) ); - // lightTexture->upload(); // 4J: not relevant - - //_updateLightTexture = false; - } + mc->textures->replaceTextureDirect(lightPixels[j], 16, 16, getLightTexture(j, level)); + } } float GameRenderer::getNightVisionScale(shared_ptr player, float a)