mirror of
https://github.com/smartcmd/MinecraftConsoles.git
synced 2026-08-20 09:57:09 +00:00
Fix gamma slider via pixel shader #178
This commit is contained in:
parent
2be856a2d4
commit
f34c35a526
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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<MultiplayerLocalPlayer> player = Minecraft::GetInstance()->localplayers[j];
|
||||
if (player == NULL) continue;
|
||||
for (int j = 0; j < XUSER_MAX_COUNT; j++)
|
||||
{
|
||||
shared_ptr<MultiplayerLocalPlayer> 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<int>(_r * 255);
|
||||
const int g = static_cast<int>(_g * 255);
|
||||
const int b = static_cast<int>(_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> player, float a)
|
||||
|
|
|
|||
Loading…
Reference in a new issue