From 40f454b602a7c260618dbfd8274f2a5620ab7e5c Mon Sep 17 00:00:00 2001 From: Goodlyay Date: Wed, 15 May 2024 20:41:39 -0700 Subject: [PATCH] Support LavaLight and LampLight env color part 1 --- src/Block.c | 9 +++++---- src/ModernLighting.c | 26 +++++++++----------------- src/Protocol.c | 16 +++++++++------- src/World.c | 20 +++++++++++--------- src/World.h | 26 +++++++++++++++----------- 5 files changed, 49 insertions(+), 48 deletions(-) diff --git a/src/Block.c b/src/Block.c index 65f677f7b..25344b54e 100644 --- a/src/Block.c +++ b/src/Block.c @@ -539,8 +539,8 @@ int Block_Parse(const cc_string* name) { /* 0b_0000_1111 */ #define BRIGHTNESS_MASK MODERN_LIGHTING_MAX_LEVEL -/* Reads network format 0b_US--_LLLL where U = uses modern brightness, S = uses sun brightness, and L = brightness */ -/* Into CC's native format 0b_SSSS_BBBB where S = sunlight brightness and B = block brightness */ +/* Reads network format 0b_US--_LLLL where U = uses fancy brightness, S = uses lamp brightness, and L = brightness */ +/* Into CC's native format 0b_SSSS_BBBB where S = lamp brightness and B = lava brightness */ cc_uint8 Block_ReadBrightness(cc_uint8 fullBright) { cc_bool useSun; /* If the fullBright byte does not use the flag, we should interpret it as either completely dark or casting max block light */ @@ -555,8 +555,9 @@ cc_uint8 Block_ReadBrightness(cc_uint8 fullBright) { if (useSun) { fullBright <<= MODERN_LIGHTING_SUN_SHIFT; } return fullBright; } -/* Writes CC's native 0b_SSSS_BBBB format where S is sunlight brightness and B is block brightness */ -/* into Network format 0b_US--_LLLL format where U is uses modern brightness, S is uses sun brightness, and L is brightness */ + +/* Writes CC's native format 0b_SSSS_BBBB where S = lamp brightness and B = lava brightness */ +/* into network format 0b_US--_LLLL where U = uses fancy brightness, S = uses lamp brightness, and L = brightness */ cc_uint8 Block_WriteFullBright(cc_uint8 brightness) { cc_uint8 blockBrightness, sunBrightness, fullBright; blockBrightness = brightness & BRIGHTNESS_MASK; diff --git a/src/ModernLighting.c b/src/ModernLighting.c index 34d0c3cfb..4dede74ec 100644 --- a/src/ModernLighting.c +++ b/src/ModernLighting.c @@ -42,15 +42,14 @@ static LightingChunk* chunkLightingData; #define Modern_MakePaletteIndex(sun, block) ((sun << MODERN_LIGHTING_SUN_SHIFT) | block) -/* Fill in modernLighting_palette with values based on the current environment colors in lieu of recieving a palette from the server */ +/* Fill in a palette with values based on the current environment colors */ static void ModernLighting_InitPalette(PackedCol* palette, float shaded) { PackedCol darkestShadow, defaultBlockLight, blockColor, sunColor, invertedBlockColor, invertedSunColor, finalColor; int sunLevel, blockLevel; float blockLerp; cc_uint8 R, G, B; - defaultBlockLight = Env.BlockLightCol; - //darkestShadow = PackedCol_Lerp(Env.ShadowCol, 0, 0.75f); /* Use a darkened version of shadow color as the darkest color in sun ramp */ + defaultBlockLight = Env.LavaLightCol; darkestShadow = Env.ShadowCol; for (sunLevel = 0; sunLevel < MODERN_LIGHTING_LEVELS; sunLevel++) { @@ -59,11 +58,7 @@ static void ModernLighting_InitPalette(PackedCol* palette, float shaded) { sunColor = Env.SunCol; } else { - //sunColor = PackedCol_Lerp(darkestShadow, Env.ShadowCol, sunLevel / (float)(MODERN_LIGHTING_LEVELS - 3)); - - //used -2 before to go from sun to darkest shadow, thus making sun cloned twice at the start of the ramp blockLerp = max(sunLevel, MODERN_LIGHTING_LEVELS - SUN_LEVELS) / (float)(MODERN_LIGHTING_LEVELS - 1); - //blockLerp *= blockLerp; blockLerp *= (MATH_PI / 2); blockLerp = Math_Cos(blockLerp); sunColor = PackedCol_Lerp(darkestShadow, Env.SunCol, 1 - blockLerp); @@ -92,9 +87,6 @@ static void ModernLighting_InitPalette(PackedCol* palette, float shaded) { B = 255 - PackedCol_B(finalColor); palette[Modern_MakePaletteIndex(sunLevel, blockLevel)] = PackedCol_Scale(PackedCol_Make(R, G, B, 255), shaded); - // PackedCol_Scale(PackedCol_Make(R, G, B, 255), - // shaded + ((1-shaded) * ((MODERN_LIGHTING_LEVELS - sunLevel+1) / (float)MODERN_LIGHTING_LEVELS)) - // ); } } } @@ -266,7 +258,6 @@ static void FlushLightQueue(cc_bool isSun, cc_bool refreshChunk) { ln.coords.z += 2; Light_TrySpreadInto(z, Z, < , World.MaxZ, isSun, MIN, MAX) } - //Platform_Log1("Handled %i queue entries.", &handled); } cc_uint8 GetBlockBrightness(BlockID curBlock, cc_bool isSun) { @@ -516,12 +507,13 @@ static PackedCol ModernLighting_Color_Core(int x, int y, int z, PackedCol* palet lightData |= MODERN_LIGHTING_SUN_MASK; /* Force the palette to use full sun color */ } - return palette[lightData]; ////palette test - //cc_uint8 thing = y % MODERN_LIGHTING_LEVELS; - //cc_uint8 thing2 = z % MODERN_LIGHTING_LEVELS; - //return modernLighting_palette[thing | (thing2 << 4)]; + cc_uint8 thing = y % MODERN_LIGHTING_LEVELS; + cc_uint8 thing2 = z % MODERN_LIGHTING_LEVELS; + return modernLighting_palette[thing | (thing2 << 4)]; + + return palette[lightData]; } static PackedCol ModernLighting_Color(int x, int y, int z) { @@ -578,8 +570,8 @@ void ModernLighting_OnEnvVariableChanged(void* obj, int envVar) { /* This is always called, but should only do anything if modern lighting is on */ if (!Lighting_Modern) { return; } - if (envVar == ENV_VAR_SUN_COLOR || envVar == ENV_VAR_SHADOW_COLOR || envVar == ENV_VAR_BLOCKLIGHT_COLOR) { + if (envVar == ENV_VAR_SUN_COLOR || envVar == ENV_VAR_SHADOW_COLOR || envVar == ENV_VAR_LAVALIGHT_COLOR || envVar == ENV_VAR_LAMPLIGHT_COLOR) { ModernLighting_InitPalettes(); } - if (envVar == ENV_VAR_BLOCKLIGHT_COLOR) MapRenderer_Refresh(); + if (envVar == ENV_VAR_LAVALIGHT_COLOR || envVar == ENV_VAR_LAMPLIGHT_COLOR) MapRenderer_Refresh(); } \ No newline at end of file diff --git a/src/Protocol.c b/src/Protocol.c index f8aad4e60..7dbbac562 100644 --- a/src/Protocol.c +++ b/src/Protocol.c @@ -1155,19 +1155,21 @@ static void CPE_SetEnvCol(cc_uint8* data) { c = PackedCol_Make(data[2], data[4], data[6], 255); if (variable == 0) { - Env_SetSkyCol(invalid ? ENV_DEFAULT_SKY_COLOR : c); + Env_SetSkyCol(invalid ? ENV_DEFAULT_SKY_COLOR : c); } else if (variable == 1) { - Env_SetCloudsCol(invalid ? ENV_DEFAULT_CLOUDS_COLOR : c); + Env_SetCloudsCol(invalid ? ENV_DEFAULT_CLOUDS_COLOR : c); } else if (variable == 2) { - Env_SetFogCol(invalid ? ENV_DEFAULT_FOG_COLOR : c); + Env_SetFogCol(invalid ? ENV_DEFAULT_FOG_COLOR : c); } else if (variable == 3) { - Env_SetShadowCol(invalid ? ENV_DEFAULT_SHADOW_COLOR : c); + Env_SetShadowCol(invalid ? ENV_DEFAULT_SHADOW_COLOR : c); } else if (variable == 4) { - Env_SetSunCol(invalid ? ENV_DEFAULT_SUN_COLOR : c); + Env_SetSunCol(invalid ? ENV_DEFAULT_SUN_COLOR : c); } else if (variable == 5) { - Env_SetSkyboxCol(invalid ? ENV_DEFAULT_SKYBOX_COLOR : c); + Env_SetSkyboxCol(invalid ? ENV_DEFAULT_SKYBOX_COLOR : c); } else if (variable == 6) { - Env_SetBlockLightCol(invalid ? ENV_DEFAULT_BLOCKLIGHT_COLOR : c); + Env_SetLavaLightCol(invalid ? ENV_DEFAULT_LAVALIGHT_COLOR : c); + } else if (variable == 7) { + Env_SetLampLightCol(invalid ? ENV_DEFAULT_LAMPLIGHT_COLOR : c); } } diff --git a/src/World.c b/src/World.c index dd2e315cf..a96547a3f 100644 --- a/src/World.c +++ b/src/World.c @@ -183,11 +183,12 @@ void Env_Reset(void) { PackedCol_GetShaded(Env.SunCol, &Env.SunXSide, &Env.SunZSide, &Env.SunYMin); - Env.SkyCol = ENV_DEFAULT_SKY_COLOR; - Env.FogCol = ENV_DEFAULT_FOG_COLOR; - Env.CloudsCol = ENV_DEFAULT_CLOUDS_COLOR; - Env.SkyboxCol = ENV_DEFAULT_SKYBOX_COLOR; - Env.BlockLightCol = ENV_DEFAULT_BLOCKLIGHT_COLOR; + Env.SkyCol = ENV_DEFAULT_SKY_COLOR; + Env.FogCol = ENV_DEFAULT_FOG_COLOR; + Env.CloudsCol = ENV_DEFAULT_CLOUDS_COLOR; + Env.SkyboxCol = ENV_DEFAULT_SKYBOX_COLOR; + Env.LavaLightCol = ENV_DEFAULT_LAVALIGHT_COLOR; + Env.LampLightCol = ENV_DEFAULT_LAMPLIGHT_COLOR; Env.Weather = WEATHER_SUNNY; Env.ExpFog = false; } @@ -248,11 +249,12 @@ void Env_SetCloudsCol(PackedCol color) { void Env_SetSkyboxCol(PackedCol color) { Env_Set(color, Env.SkyboxCol, ENV_VAR_SKYBOX_COLOR); } - -void Env_SetBlockLightCol(PackedCol color) { - Env_Set(color, Env.BlockLightCol, ENV_VAR_BLOCKLIGHT_COLOR); +void Env_SetLavaLightCol(PackedCol color) { + Env_Set(color, Env.LavaLightCol, ENV_VAR_LAVALIGHT_COLOR); +} +void Env_SetLampLightCol(PackedCol color) { + Env_Set(color, Env.LampLightCol, ENV_VAR_LAMPLIGHT_COLOR); } - void Env_SetSunCol(PackedCol color) { PackedCol_GetShaded(color, &Env.SunXSide, &Env.SunZSide, &Env.SunYMin); Env_Set(color, Env.SunCol, ENV_VAR_SUN_COLOR); diff --git a/src/World.h b/src/World.h index 0dd0a2c94..1f98c148f 100644 --- a/src/World.h +++ b/src/World.h @@ -118,7 +118,8 @@ enum EnvVar { ENV_VAR_CLOUDS_HEIGHT, ENV_VAR_CLOUDS_SPEED, ENV_VAR_WEATHER_SPEED, ENV_VAR_WEATHER_FADE, ENV_VAR_WEATHER, ENV_VAR_EXP_FOG, ENV_VAR_SKYBOX_HOR_SPEED, ENV_VAR_SKYBOX_VER_SPEED, ENV_VAR_SKY_COLOR, ENV_VAR_CLOUDS_COLOR, ENV_VAR_FOG_COLOR, - ENV_VAR_SUN_COLOR, ENV_VAR_SHADOW_COLOR, ENV_VAR_SKYBOX_COLOR, ENV_VAR_BLOCKLIGHT_COLOR + ENV_VAR_SUN_COLOR, ENV_VAR_SHADOW_COLOR, ENV_VAR_SKYBOX_COLOR, + ENV_VAR_LAVALIGHT_COLOR, ENV_VAR_LAMPLIGHT_COLOR }; CC_VAR extern struct _EnvData { @@ -134,20 +135,21 @@ CC_VAR extern struct _EnvData { PackedCol SkyCol, FogCol, CloudsCol, SkyboxCol; PackedCol SunCol, SunXSide, SunZSide, SunYMin; PackedCol ShadowCol, ShadowXSide, ShadowZSide, ShadowYMin; - PackedCol BlockLightCol; + PackedCol LavaLightCol, LampLightCol; } Env; #define Env_SidesHeight (Env.EdgeHeight + Env.SidesOffset) enum Weather_ { WEATHER_SUNNY, WEATHER_RAINY, WEATHER_SNOWY }; extern const char* const Weather_Names[3]; -#define ENV_DEFAULT_SKY_COLOR PackedCol_Make(0x99, 0xCC, 0xFF, 0xFF) -#define ENV_DEFAULT_FOG_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) -#define ENV_DEFAULT_CLOUDS_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) -#define ENV_DEFAULT_SKYBOX_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) -#define ENV_DEFAULT_SUN_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) -#define ENV_DEFAULT_SHADOW_COLOR PackedCol_Make(0x9B, 0x9B, 0x9B, 0xFF) -#define ENV_DEFAULT_BLOCKLIGHT_COLOR PackedCol_Make(0xFF, 0xEB, 0xC6, 0xFF) +#define ENV_DEFAULT_SKY_COLOR PackedCol_Make(0x99, 0xCC, 0xFF, 0xFF) +#define ENV_DEFAULT_FOG_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) +#define ENV_DEFAULT_CLOUDS_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) +#define ENV_DEFAULT_SKYBOX_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) +#define ENV_DEFAULT_SUN_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) +#define ENV_DEFAULT_SHADOW_COLOR PackedCol_Make(0x9B, 0x9B, 0x9B, 0xFF) +#define ENV_DEFAULT_LAVALIGHT_COLOR PackedCol_Make(0xFF, 0xEB, 0xC6, 0xFF) +#define ENV_DEFAULT_LAMPLIGHT_COLOR PackedCol_Make(0xFF, 0xFF, 0xFF, 0xFF) /* Resets all environment settings to default. */ /* NOTE: Unlike Env_Set functions, DOES NOT raise EnvVarChanged event. */ @@ -199,8 +201,10 @@ CC_API void Env_SetSunCol(PackedCol color); /* Sets colour of shadow. (default #9B9B9B) */ /* This is the colour used for lighting when underground. */ CC_API void Env_SetShadowCol(PackedCol color); -/* Sets colour that blocks cast with fancy lighting. (default #FFEBC6) */ -CC_API void Env_SetBlockLightCol(PackedCol color); +/* Sets colour that bright natural blocks cast with fancy lighting. (default #FFEBC6) */ +CC_API void Env_SetLavaLightCol(PackedCol color); +/* Sets colour that bright artificial blocks cast with fancy lighting. (default #FFFFFF) */ +CC_API void Env_SetLampLightCol(PackedCol color); #define RESPAWN_NOT_FOUND -100000.0f /* Finds the highest Y coordinate of any solid block that intersects the given bounding box */