Browse Source

Allow to set maximum star opacity at daytime (#11663)

Wuzzy 1 year ago
parent
commit
142928e944

+ 3 - 0
doc/lua_api.txt

@@ -7200,6 +7200,9 @@ object you are working with still exists.
     * `star_parameters` is a table with the following optional fields:
         * `visible`: Boolean for whether the stars are visible.
             (default: `true`)
+        * `day_opacity`: Float for maximum opacity of stars at day.
+            No effect if `visible` is false.
+            (default: 0.0; maximum: 1.0; minimum: 0.0)
         * `count`: Integer number to set the number of stars in
             the skybox. Only applies to `"skybox"` and `"regular"` sky types.
             (default: `1000`)

+ 1 - 0
src/client/game.cpp

@@ -2876,6 +2876,7 @@ void Game::handleClientEvent_SetStars(ClientEvent *event, CameraOrientation *cam
 	sky->setStarCount(event->star_params->count);
 	sky->setStarColor(event->star_params->starcolor);
 	sky->setStarScale(event->star_params->scale);
+	sky->setStarDayOpacity(event->star_params->day_opacity);
 	delete event->star_params;
 }
 

+ 5 - 2
src/client/sky.cpp

@@ -660,9 +660,12 @@ void Sky::draw_stars(video::IVideoDriver * driver, float wicked_time_of_day)
 	// to time 4000.
 
 	float tod = wicked_time_of_day < 0.5f ? wicked_time_of_day : (1.0f - wicked_time_of_day);
-	float starbrightness = (0.25f - fabsf(tod)) * 20.0f;
+	float day_opacity = clamp(m_star_params.day_opacity, 0.0f, 1.0f);
+	float starbrightness = (0.25f - fabs(tod)) * 20.0f;
+	float alpha = clamp(starbrightness, day_opacity, 1.0f);
+
 	m_star_color = m_star_params.starcolor;
-	m_star_color.a *= clamp(starbrightness, 0.0f, 1.0f);
+	m_star_color.a *= alpha;
 	if (m_star_color.a <= 0.0f) // Stars are only drawn when not fully transparent
 		return;
 	m_materials[0].DiffuseColor = m_materials[0].EmissiveColor = m_star_color.toSColor();

+ 1 - 0
src/client/sky.h

@@ -82,6 +82,7 @@ public:
 	void setStarCount(u16 star_count);
 	void setStarColor(video::SColor star_color) { m_star_params.starcolor = star_color; }
 	void setStarScale(f32 star_scale) { m_star_params.scale = star_scale; updateStars(); }
+	void setStarDayOpacity(f32 day_opacity) { m_star_params.day_opacity = day_opacity; }
 
 	bool getCloudsVisible() const { return m_clouds_visible && m_clouds_enabled; }
 	const video::SColorf &getCloudColor() const { return m_cloudcolor_f; }

+ 4 - 1
src/network/clientpackethandler.cpp

@@ -1340,10 +1340,13 @@ void Client::handleCommand_HudSetMoon(NetworkPacket *pkt)
 
 void Client::handleCommand_HudSetStars(NetworkPacket *pkt)
 {
-	StarParams stars;
+	StarParams stars = SkyboxDefaults::getStarDefaults();
 
 	*pkt >> stars.visible >> stars.count
 		>> stars.starcolor >> stars.scale;
+	try {
+		*pkt >> stars.day_opacity;
+	} catch (PacketError &e) {};
 
 	ClientEvent *event = new ClientEvent();
 	event->type        = CE_SET_STARS;

+ 1 - 0
src/network/networkprotocol.h

@@ -735,6 +735,7 @@ enum ToClientCommand
 		u32 count
 		u8[4] starcolor (ARGB)
 		f32 scale
+		f32 day_opacity
 	*/
 
 	TOCLIENT_SRP_BYTES_S_B = 0x60,

+ 5 - 0
src/script/lua_api/l_object.cpp

@@ -2084,6 +2084,9 @@ int ObjectRef::l_set_stars(lua_State *L)
 			"scale", star_params.scale);
 	}
 
+	star_params.day_opacity = getfloatfield_default(L, 2,
+		"day_opacity", star_params.day_opacity);
+
 	getServer(L)->setStars(player, star_params);
 	return 0;
 }
@@ -2108,6 +2111,8 @@ int ObjectRef::l_get_stars(lua_State *L)
 	lua_setfield(L, -2, "star_color");
 	lua_pushnumber(L, star_params.scale);
 	lua_setfield(L, -2, "scale");
+	lua_pushnumber(L, star_params.day_opacity);
+	lua_setfield(L, -2, "day_opacity");
 	return 1;
 }
 

+ 2 - 1
src/server.cpp

@@ -1775,7 +1775,8 @@ void Server::SendSetStars(session_t peer_id, const StarParams &params)
 	NetworkPacket pkt(TOCLIENT_SET_STARS, 0, peer_id);
 
 	pkt << params.visible << params.count
-		<< params.starcolor << params.scale;
+		<< params.starcolor << params.scale
+		<< params.day_opacity;
 
 	Send(&pkt);
 }

+ 2 - 0
src/skyparams.h

@@ -66,6 +66,7 @@ struct StarParams
 	u32 count;
 	video::SColor starcolor;
 	f32 scale;
+	f32 day_opacity;
 };
 
 struct CloudParams
@@ -141,6 +142,7 @@ public:
 		stars.count = 1000;
 		stars.starcolor = video::SColor(105, 235, 235, 255);
 		stars.scale = 1;
+		stars.day_opacity = 0;
 		return stars;
 	}