diff options
| -rw-r--r-- | core/io/image.cpp | 2 | ||||
| -rw-r--r-- | core/math/color.h | 4 | ||||
| -rw-r--r-- | core/variant/variant_call.cpp | 4 | ||||
| -rw-r--r-- | doc/classes/Color.xml | 26 | ||||
| -rw-r--r-- | modules/gltf/gltf_document.cpp | 18 | ||||
| -rw-r--r-- | modules/hdr/image_loader_hdr.cpp | 2 | ||||
| -rw-r--r-- | modules/tinyexr/image_loader_tinyexr.cpp | 4 | ||||
| -rw-r--r-- | scene/3d/lightmap_gi.cpp | 2 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp | 14 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp | 16 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp | 10 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/renderer_scene_render_rd.cpp | 16 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/renderer_scene_sky_rd.cpp | 4 | ||||
| -rw-r--r-- | servers/rendering/renderer_rd/storage_rd/material_storage.cpp | 6 | ||||
| -rw-r--r-- | tests/core/math/test_color.h | 8 | 
15 files changed, 68 insertions, 68 deletions
diff --git a/core/io/image.cpp b/core/io/image.cpp index fad9942017..4aed5a913a 100644 --- a/core/io/image.cpp +++ b/core/io/image.cpp @@ -3276,7 +3276,7 @@ Ref<Image> Image::rgbe_to_srgb() {  	for (int row = 0; row < height; row++) {  		for (int col = 0; col < width; col++) { -			new_image->set_pixel(col, row, get_pixel(col, row).to_srgb()); +			new_image->set_pixel(col, row, get_pixel(col, row).linear_to_srgb());  		}  	} diff --git a/core/math/color.h b/core/math/color.h index b90a0f33a2..91e0bf5532 100644 --- a/core/math/color.h +++ b/core/math/color.h @@ -169,14 +169,14 @@ struct _NO_DISCARD_ Color {  		return res;  	} -	_FORCE_INLINE_ Color to_linear() const { +	_FORCE_INLINE_ Color srgb_to_linear() const {  		return Color(  				r < 0.04045f ? r * (1.0 / 12.92) : Math::pow((r + 0.055f) * (float)(1.0 / (1 + 0.055)), 2.4f),  				g < 0.04045f ? g * (1.0 / 12.92) : Math::pow((g + 0.055f) * (float)(1.0 / (1 + 0.055)), 2.4f),  				b < 0.04045f ? b * (1.0 / 12.92) : Math::pow((b + 0.055f) * (float)(1.0 / (1 + 0.055)), 2.4f),  				a);  	} -	_FORCE_INLINE_ Color to_srgb() const { +	_FORCE_INLINE_ Color linear_to_srgb() const {  		return Color(  				r < 0.0031308f ? 12.92f * r : (1.0f + 0.055f) * Math::pow(r, 1.0f / 2.4f) - 0.055f,  				g < 0.0031308f ? 12.92f * g : (1.0f + 0.055f) * Math::pow(g, 1.0f / 2.4f) - 0.055f, diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index c11925fa8c..f1daf1de13 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -1656,8 +1656,8 @@ static void _register_variant_builtin_methods() {  	bind_method(Color, darkened, sarray("amount"), varray());  	bind_method(Color, blend, sarray("over"), varray());  	bind_method(Color, get_luminance, sarray(), varray()); -	bind_method(Color, to_linear, sarray(), varray()); -	bind_method(Color, to_srgb, sarray(), varray()); +	bind_method(Color, srgb_to_linear, sarray(), varray()); +	bind_method(Color, linear_to_srgb, sarray(), varray());  	bind_method(Color, is_equal_approx, sarray("to"), varray()); diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml index 5b48804d9d..7b8a57ed22 100644 --- a/doc/classes/Color.xml +++ b/doc/classes/Color.xml @@ -183,7 +183,7 @@  			<description>  				Returns the luminance of the color in the [code][0.0, 1.0][/code] range.  				This is useful when determining light or dark color. Colors with a luminance smaller than 0.5 can be generally considered dark. -				[b]Note:[/b] [method get_luminance] relies on the colour being in the linear color space to return an accurate relative luminance value. If the color is in the sRGB color space, use [method to_linear] to convert it to the linear color space first. +				[b]Note:[/b] [method get_luminance] relies on the colour being in the linear color space to return an accurate relative luminance value. If the color is in the sRGB color space, use [method srgb_to_linear] to convert it to the linear color space first.  			</description>  		</method>  		<method name="get_named_color" qualifiers="static"> @@ -321,6 +321,18 @@  				[/codeblocks]  			</description>  		</method> +		<method name="linear_to_srgb" qualifiers="const"> +			<return type="Color" /> +			<description> +				Returns the color converted to the [url=https://en.wikipedia.org/wiki/SRGB]sRGB[/url] color space. This assumes the original color is in the linear color space. See also [method srgb_to_linear] which performs the opposite operation. +			</description> +		</method> +		<method name="srgb_to_linear" qualifiers="const"> +			<return type="Color" /> +			<description> +				Returns the color converted to the linear color space. This assumes the original color is in the sRGB color space. See also [method linear_to_srgb] which performs the opposite operation. +			</description> +		</method>  		<method name="to_abgr32" qualifiers="const">  			<return type="int" />  			<description> @@ -405,12 +417,6 @@  				[/codeblocks]  			</description>  		</method> -		<method name="to_linear" qualifiers="const"> -			<return type="Color" /> -			<description> -				Returns the color converted to the linear color space. This assumes the original color is in the sRGB color space. See also [method to_srgb] which performs the opposite operation. -			</description> -		</method>  		<method name="to_rgba32" qualifiers="const">  			<return type="int" />  			<description> @@ -443,12 +449,6 @@  				[/codeblocks]  			</description>  		</method> -		<method name="to_srgb" qualifiers="const"> -			<return type="Color" /> -			<description> -				Returns the color converted to the [url=https://en.wikipedia.org/wiki/SRGB]sRGB[/url] color space. This assumes the original color is in the linear color space. See also [method to_linear] which performs the opposite operation. -			</description> -		</method>  	</methods>  	<members>  		<member name="a" type="float" setter="" getter="" default="1.0"> diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index 73222330db..784733aba2 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -3272,7 +3272,7 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) {  			Dictionary mr;  			{  				Array arr; -				const Color c = material->get_albedo().to_linear(); +				const Color c = material->get_albedo().srgb_to_linear();  				arr.push_back(c.r);  				arr.push_back(c.g);  				arr.push_back(c.b); @@ -3473,7 +3473,7 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) {  		}  		if (material->get_feature(BaseMaterial3D::FEATURE_EMISSION)) { -			const Color c = material->get_emission().to_srgb(); +			const Color c = material->get_emission().linear_to_srgb();  			Array arr;  			arr.push_back(c.r);  			arr.push_back(c.g); @@ -3555,7 +3555,7 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) {  			if (sgm.has("diffuseFactor")) {  				const Array &arr = sgm["diffuseFactor"];  				ERR_FAIL_COND_V(arr.size() != 4, ERR_PARSE_ERROR); -				const Color c = Color(arr[0], arr[1], arr[2], arr[3]).to_srgb(); +				const Color c = Color(arr[0], arr[1], arr[2], arr[3]).linear_to_srgb();  				spec_gloss->diffuse_factor = c;  				material->set_albedo(spec_gloss->diffuse_factor);  			} @@ -3586,7 +3586,7 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) {  			if (mr.has("baseColorFactor")) {  				const Array &arr = mr["baseColorFactor"];  				ERR_FAIL_COND_V(arr.size() != 4, ERR_PARSE_ERROR); -				const Color c = Color(arr[0], arr[1], arr[2], arr[3]).to_srgb(); +				const Color c = Color(arr[0], arr[1], arr[2], arr[3]).linear_to_srgb();  				material->set_albedo(c);  			} @@ -3653,7 +3653,7 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) {  		if (d.has("emissiveFactor")) {  			const Array &arr = d["emissiveFactor"];  			ERR_FAIL_COND_V(arr.size() != 3, ERR_PARSE_ERROR); -			const Color c = Color(arr[0], arr[1], arr[2]).to_srgb(); +			const Color c = Color(arr[0], arr[1], arr[2]).linear_to_srgb();  			material->set_feature(BaseMaterial3D::FEATURE_EMISSION, true);  			material->set_emission(c); @@ -3737,11 +3737,11 @@ void GLTFDocument::spec_gloss_to_rough_metal(Ref<GLTFSpecGloss> r_spec_gloss, Re  	}  	for (int32_t y = 0; y < r_spec_gloss->spec_gloss_img->get_height(); y++) {  		for (int32_t x = 0; x < r_spec_gloss->spec_gloss_img->get_width(); x++) { -			const Color specular_pixel = r_spec_gloss->spec_gloss_img->get_pixel(x, y).to_linear(); +			const Color specular_pixel = r_spec_gloss->spec_gloss_img->get_pixel(x, y).srgb_to_linear();  			Color specular = Color(specular_pixel.r, specular_pixel.g, specular_pixel.b);  			specular *= r_spec_gloss->specular_factor;  			Color diffuse = Color(1.0f, 1.0f, 1.0f); -			diffuse *= r_spec_gloss->diffuse_img->get_pixel(x, y).to_linear(); +			diffuse *= r_spec_gloss->diffuse_img->get_pixel(x, y).srgb_to_linear();  			float metallic = 0.0f;  			Color base_color;  			spec_gloss_to_metal_base_color(specular, diffuse, base_color, metallic); @@ -3758,7 +3758,7 @@ void GLTFDocument::spec_gloss_to_rough_metal(Ref<GLTFSpecGloss> r_spec_gloss, Re  			mr.g = 1.0f - mr.g;  			rm_img->set_pixel(x, y, mr);  			if (r_spec_gloss->diffuse_img.is_valid()) { -				r_spec_gloss->diffuse_img->set_pixel(x, y, base_color.to_srgb()); +				r_spec_gloss->diffuse_img->set_pixel(x, y, base_color.linear_to_srgb());  			}  		}  	} @@ -4626,7 +4626,7 @@ Error GLTFDocument::_parse_lights(Ref<GLTFState> state) {  		if (d.has("color")) {  			const Array &arr = d["color"];  			ERR_FAIL_COND_V(arr.size() != 3, ERR_PARSE_ERROR); -			const Color c = Color(arr[0], arr[1], arr[2]).to_srgb(); +			const Color c = Color(arr[0], arr[1], arr[2]).linear_to_srgb();  			light->color = c;  		}  		if (d.has("intensity")) { diff --git a/modules/hdr/image_loader_hdr.cpp b/modules/hdr/image_loader_hdr.cpp index 4588caf0a5..eca689e87a 100644 --- a/modules/hdr/image_loader_hdr.cpp +++ b/modules/hdr/image_loader_hdr.cpp @@ -132,7 +132,7 @@ Error ImageLoaderHDR::load_image(Ref<Image> p_image, Ref<FileAccess> f, bool p_f  					ptr[2] * exp / 255.0);  			if (p_force_linear) { -				c = c.to_linear(); +				c = c.srgb_to_linear();  			}  			*(uint32_t *)ptr = c.to_rgbe9995(); diff --git a/modules/tinyexr/image_loader_tinyexr.cpp b/modules/tinyexr/image_loader_tinyexr.cpp index 1ff2600839..864df765ee 100644 --- a/modules/tinyexr/image_loader_tinyexr.cpp +++ b/modules/tinyexr/image_loader_tinyexr.cpp @@ -230,7 +230,7 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, Ref<FileAccess> f, bool  						}  						if (p_force_linear) { -							color = color.to_linear(); +							color = color.srgb_to_linear();  						}  						*row_w++ = Math::make_half_float(color.r); @@ -261,7 +261,7 @@ Error ImageLoaderTinyEXR::load_image(Ref<Image> p_image, Ref<FileAccess> f, bool  						}  						if (p_force_linear) { -							color = color.to_linear(); +							color = color.srgb_to_linear();  						}  						*row_w++ = color.r; diff --git a/scene/3d/lightmap_gi.cpp b/scene/3d/lightmap_gi.cpp index 3461caf638..8b457b683d 100644 --- a/scene/3d/lightmap_gi.cpp +++ b/scene/3d/lightmap_gi.cpp @@ -884,7 +884,7 @@ LightmapGI::BakeError LightmapGI::bake(Node *p_from_node, String p_image_data_pa  			Light3D *light = lights_found[i].light;  			Transform3D xf = lights_found[i].xform; -			Color linear_color = light->get_color().to_linear(); +			Color linear_color = light->get_color().srgb_to_linear();  			if (Object::cast_to<DirectionalLight3D>(light)) {  				DirectionalLight3D *l = Object::cast_to<DirectionalLight3D>(light);  				lightmapper->add_directional_light(light->get_bake_mode() == Light3D::BAKE_STATIC, -xf.basis.get_axis(Vector3::AXIS_Z).normalized(), linear_color, l->get_param(Light3D::PARAM_ENERGY), l->get_param(Light3D::PARAM_SIZE)); diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index 365bef896f..b541e6ca88 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -783,7 +783,7 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat  		//ambient  		if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) {  			Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : environment_get_bg_color(p_render_data->environment); -			color = color.to_linear(); +			color = color.srgb_to_linear();  			scene_state.ubo.ambient_light_color_energy[0] = color.r * bg_energy;  			scene_state.ubo.ambient_light_color_energy[1] = color.g * bg_energy; @@ -793,7 +793,7 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat  		} else {  			float energy = environment_get_ambient_light_energy(p_render_data->environment);  			Color color = environment_get_ambient_light_color(p_render_data->environment); -			color = color.to_linear(); +			color = color.srgb_to_linear();  			scene_state.ubo.ambient_light_color_energy[0] = color.r * energy;  			scene_state.ubo.ambient_light_color_energy[1] = color.g * energy;  			scene_state.ubo.ambient_light_color_energy[2] = color.b * energy; @@ -829,7 +829,7 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat  		scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment);  		scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_render_data->environment); -		Color fog_color = environment_get_fog_light_color(p_render_data->environment).to_linear(); +		Color fog_color = environment_get_fog_light_color(p_render_data->environment).srgb_to_linear();  		float fog_energy = environment_get_fog_light_energy(p_render_data->environment);  		scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy; @@ -844,7 +844,7 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat  		} else {  			scene_state.ubo.use_ambient_light = true;  			Color clear_color = p_default_bg_color; -			clear_color = clear_color.to_linear(); +			clear_color = clear_color.srgb_to_linear();  			scene_state.ubo.ambient_light_color_energy[0] = clear_color.r;  			scene_state.ubo.ambient_light_color_energy[1] = clear_color.g;  			scene_state.ubo.ambient_light_color_energy[2] = clear_color.b; @@ -1391,7 +1391,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co  				clear_color.b *= bg_energy;  				if (render_buffers_has_volumetric_fog(p_render_data->render_buffers) || environment_is_fog_enabled(p_render_data->environment)) {  					draw_sky_fog_only = true; -					RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.to_linear())); +					RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.srgb_to_linear()));  				}  			} break;  			case RS::ENV_BG_COLOR: { @@ -1401,7 +1401,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co  				clear_color.b *= bg_energy;  				if (render_buffers_has_volumetric_fog(p_render_data->render_buffers) || environment_is_fog_enabled(p_render_data->environment)) {  					draw_sky_fog_only = true; -					RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.to_linear())); +					RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.srgb_to_linear()));  				}  			} break;  			case RS::ENV_BG_SKY: { @@ -1520,7 +1520,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co  		Vector<Color> c;  		{ -			Color cc = clear_color.to_linear(); +			Color cc = clear_color.srgb_to_linear();  			if (using_separate_specular) {  				cc.a = 0; //subsurf scatter must be 0  			} diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index 7272b2f8d0..6988e3c1dd 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -596,7 +596,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color  				/*  				if (render_buffers_has_volumetric_fog(p_render_data->render_buffers) || environment_is_fog_enabled(p_render_data->environment)) {  					draw_sky_fog_only = true; -					RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.to_linear())); +					RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.srgb_to_linear()));  				}  				*/  			} break; @@ -608,7 +608,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color  				/*  				if (render_buffers_has_volumetric_fog(p_render_data->render_buffers) || environment_is_fog_enabled(p_render_data->environment)) {  					draw_sky_fog_only = true; -					RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.to_linear())); +					RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.srgb_to_linear()));  				}  				*/  			} break; @@ -723,10 +723,10 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color  		{  			// regular forward for now  			Vector<Color> c; -			c.push_back(clear_color.to_linear()); // our render buffer +			c.push_back(clear_color.srgb_to_linear()); // our render buffer  			if (render_buffer) {  				if (render_buffer->msaa != RS::VIEWPORT_MSAA_DISABLED) { -					c.push_back(clear_color.to_linear()); // our resolve buffer +					c.push_back(clear_color.srgb_to_linear()); // our resolve buffer  				}  				if (using_subpass_post_process) {  					c.push_back(Color()); // our 2D buffer we're copying into @@ -1616,7 +1616,7 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,  		//ambient  		if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) {  			Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : environment_get_bg_color(p_render_data->environment); -			color = color.to_linear(); +			color = color.srgb_to_linear();  			scene_state.ubo.ambient_light_color_energy[0] = color.r * bg_energy;  			scene_state.ubo.ambient_light_color_energy[1] = color.g * bg_energy; @@ -1626,7 +1626,7 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,  		} else {  			float energy = environment_get_ambient_light_energy(p_render_data->environment);  			Color color = environment_get_ambient_light_color(p_render_data->environment); -			color = color.to_linear(); +			color = color.srgb_to_linear();  			scene_state.ubo.ambient_light_color_energy[0] = color.r * energy;  			scene_state.ubo.ambient_light_color_energy[1] = color.g * energy;  			scene_state.ubo.ambient_light_color_energy[2] = color.b * energy; @@ -1657,7 +1657,7 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,  		scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment);  		scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_render_data->environment); -		Color fog_color = environment_get_fog_light_color(p_render_data->environment).to_linear(); +		Color fog_color = environment_get_fog_light_color(p_render_data->environment).srgb_to_linear();  		float fog_energy = environment_get_fog_light_energy(p_render_data->environment);  		scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy; @@ -1672,7 +1672,7 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,  		} else {  			scene_state.ubo.use_ambient_light = true;  			Color clear_color = p_default_bg_color; -			clear_color = clear_color.to_linear(); +			clear_color = clear_color.srgb_to_linear();  			scene_state.ubo.ambient_light_color_energy[0] = clear_color.r;  			scene_state.ubo.ambient_light_color_energy[1] = clear_color.g;  			scene_state.ubo.ambient_light_color_energy[2] = clear_color.b; diff --git a/servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp index 75202d5abb..c735fda5f8 100644 --- a/servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_gi_rd.cpp @@ -921,7 +921,7 @@ void RendererSceneGIRD::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env,  		if (p_env->background == RS::ENV_BG_CLEAR_COLOR) {  			push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_COLOR; -			Color c = storage->get_default_clear_color().to_linear(); +			Color c = storage->get_default_clear_color().srgb_to_linear();  			push_constant.sky_color[0] = c.r;  			push_constant.sky_color[1] = c.g;  			push_constant.sky_color[2] = c.b; @@ -1469,7 +1469,7 @@ void RendererSceneGIRD::SDFGI::pre_process_gi(const Transform3D &p_transform, Re  			lights[idx].direction[1] = dir.y;  			lights[idx].direction[2] = dir.z;  			Color color = storage->light_get_color(li->light); -			color = color.to_linear(); +			color = color.srgb_to_linear();  			lights[idx].color[0] = color.r;  			lights[idx].color[1] = color.g;  			lights[idx].color[2] = color.b; @@ -1514,7 +1514,7 @@ void RendererSceneGIRD::SDFGI::pre_process_gi(const Transform3D &p_transform, Re  			lights[idx].position[1] = pos.y;  			lights[idx].position[2] = pos.z;  			Color color = storage->light_get_color(li->light); -			color = color.to_linear(); +			color = color.srgb_to_linear();  			lights[idx].color[0] = color.r;  			lights[idx].color[1] = color.g;  			lights[idx].color[2] = color.b; @@ -1953,7 +1953,7 @@ void RendererSceneGIRD::SDFGI::render_static_lights(RID p_render_buffers, uint32  				lights[idx].position[1] = pos.y;  				lights[idx].position[2] = pos.z;  				Color color = storage->light_get_color(li->light); -				color = color.to_linear(); +				color = color.srgb_to_linear();  				lights[idx].color[0] = color.r;  				lights[idx].color[1] = color.g;  				lights[idx].color[2] = color.b; @@ -2396,7 +2396,7 @@ void RendererSceneGIRD::VoxelGIInstance::update(bool p_update_light_instances, c  				l.attenuation = storage->light_get_param(light, RS::LIGHT_PARAM_ATTENUATION);  				l.energy = storage->light_get_param(light, RS::LIGHT_PARAM_ENERGY) * storage->light_get_param(light, RS::LIGHT_PARAM_INDIRECT_ENERGY);  				l.radius = to_cell.basis.xform(Vector3(storage->light_get_param(light, RS::LIGHT_PARAM_RANGE), 0, 0)).length(); -				Color color = storage->light_get_color(light).to_linear(); +				Color color = storage->light_get_color(light).srgb_to_linear();  				l.color[0] = color.r;  				l.color[1] = color.g;  				l.color[2] = color.b; diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index ac7ac692ce..b342e8f043 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -517,7 +517,7 @@ Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_ba  		ambient_color_sky_mix = env->ambient_sky_contribution;  		const float ambient_energy = env->ambient_light_energy;  		ambient_color = env->ambient_light; -		ambient_color = ambient_color.to_linear(); +		ambient_color = ambient_color.srgb_to_linear();  		ambient_color.r *= ambient_energy;  		ambient_color.g *= ambient_energy;  		ambient_color.b *= ambient_energy; @@ -536,7 +536,7 @@ Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_ba  	} else {  		const float bg_energy = env->bg_energy;  		Color panorama_color = ((environment_background == RS::ENV_BG_CLEAR_COLOR) ? storage->get_default_clear_color() : env->bg_color); -		panorama_color = panorama_color.to_linear(); +		panorama_color = panorama_color.srgb_to_linear();  		panorama_color.r *= bg_energy;  		panorama_color.g *= bg_energy;  		panorama_color.b *= bg_energy; @@ -3245,7 +3245,7 @@ void RendererSceneRenderRD::_setup_reflections(const PagedArray<RID> &p_reflecti  		reflection_ubo.exterior = !storage->reflection_probe_is_interior(base_probe);  		reflection_ubo.box_project = storage->reflection_probe_is_box_projection(base_probe); -		Color ambient_linear = storage->reflection_probe_get_ambient_color(base_probe).to_linear(); +		Color ambient_linear = storage->reflection_probe_get_ambient_color(base_probe).srgb_to_linear();  		float interior_ambient_energy = storage->reflection_probe_get_ambient_color_energy(base_probe);  		reflection_ubo.ambient[0] = ambient_linear.r * interior_ambient_energy;  		reflection_ubo.ambient[1] = ambient_linear.g * interior_ambient_energy; @@ -3312,7 +3312,7 @@ void RendererSceneRenderRD::_setup_lights(const PagedArray<RID> &p_lights, const  				light_data.energy = sign * storage->light_get_param(base, RS::LIGHT_PARAM_ENERGY) * Math_PI; -				Color linear_col = storage->light_get_color(base).to_linear(); +				Color linear_col = storage->light_get_color(base).srgb_to_linear();  				light_data.color[0] = linear_col.r;  				light_data.color[1] = linear_col.g;  				light_data.color[2] = linear_col.b; @@ -3491,7 +3491,7 @@ void RendererSceneRenderRD::_setup_lights(const PagedArray<RID> &p_lights, const  		Transform3D light_transform = li->transform;  		float sign = storage->light_is_negative(base) ? -1 : 1; -		Color linear_col = storage->light_get_color(base).to_linear(); +		Color linear_col = storage->light_get_color(base).srgb_to_linear();  		light_data.attenuation = storage->light_get_param(base, RS::LIGHT_PARAM_ATTENUATION); @@ -4641,7 +4641,7 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e  	params.fog_frustum_end = fog_end; -	Color ambient_color = env->ambient_light.to_linear(); +	Color ambient_color = env->ambient_light.srgb_to_linear();  	params.ambient_color[0] = ambient_color.r;  	params.ambient_color[1] = ambient_color.g;  	params.ambient_color[2] = ambient_color.b; @@ -4653,13 +4653,13 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e  	params.directional_light_count = p_directional_light_count; -	Color emission = env->volumetric_fog_emission.to_linear(); +	Color emission = env->volumetric_fog_emission.srgb_to_linear();  	params.base_emission[0] = emission.r * env->volumetric_fog_emission_energy;  	params.base_emission[1] = emission.g * env->volumetric_fog_emission_energy;  	params.base_emission[2] = emission.b * env->volumetric_fog_emission_energy;  	params.base_density = env->volumetric_fog_density; -	Color base_scattering = env->volumetric_fog_scattering.to_linear(); +	Color base_scattering = env->volumetric_fog_scattering.srgb_to_linear();  	params.base_scattering[0] = base_scattering.r;  	params.base_scattering[1] = base_scattering.g;  	params.base_scattering[2] = base_scattering.b; diff --git a/servers/rendering/renderer_rd/renderer_scene_sky_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_sky_rd.cpp index 061aa8b4aa..44298711cd 100644 --- a/servers/rendering/renderer_rd/renderer_scene_sky_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_sky_rd.cpp @@ -1194,7 +1194,7 @@ void RendererSceneSkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_b  					float sign = storage->light_is_negative(base) ? -1 : 1;  					sky_light_data.energy = sign * storage->light_get_param(base, RS::LIGHT_PARAM_ENERGY); -					Color linear_col = storage->light_get_color(base).to_linear(); +					Color linear_col = storage->light_get_color(base).srgb_to_linear();  					sky_light_data.color[0] = linear_col.r;  					sky_light_data.color[1] = linear_col.g;  					sky_light_data.color[2] = linear_col.b; @@ -1286,7 +1286,7 @@ void RendererSceneSkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_b  	sky_scene_state.ubo.fog_enabled = p_env->fog_enabled;  	sky_scene_state.ubo.fog_density = p_env->fog_density;  	sky_scene_state.ubo.fog_aerial_perspective = p_env->fog_aerial_perspective; -	Color fog_color = p_env->fog_light_color.to_linear(); +	Color fog_color = p_env->fog_light_color.srgb_to_linear();  	float fog_energy = p_env->fog_light_energy;  	sky_scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy;  	sky_scene_state.ubo.fog_light_color[1] = fog_color.g * fog_energy; diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp index 9e3d124bbb..2a2c5f350a 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp @@ -422,7 +422,7 @@ _FORCE_INLINE_ static void _fill_std140_variant_ubo_value(ShaderLanguage::DataTy  						if (i < s) {  							Color color = a[i];  							if (p_linear_color) { -								color = color.to_linear(); +								color = color.srgb_to_linear();  							}  							gui[j] = color.r;  							gui[j + 1] = color.g; @@ -459,7 +459,7 @@ _FORCE_INLINE_ static void _fill_std140_variant_ubo_value(ShaderLanguage::DataTy  					Color v = value;  					if (p_linear_color) { -						v = v.to_linear(); +						v = v.srgb_to_linear();  					}  					gui[0] = v.r; @@ -1498,7 +1498,7 @@ void MaterialStorage::_global_variable_store_in_buffer(int32_t p_index, RS::Glob  			bv.w = v.a;  			GlobalVariables::Value &bv_linear = global_variables.buffer_values[p_index + 1]; -			v = v.to_linear(); +			v = v.srgb_to_linear();  			bv_linear.x = v.r;  			bv_linear.y = v.g;  			bv_linear.z = v.b; diff --git a/tests/core/math/test_color.h b/tests/core/math/test_color.h index 6f40f8ecc0..51c3bc8bdc 100644 --- a/tests/core/math/test_color.h +++ b/tests/core/math/test_color.h @@ -146,8 +146,8 @@ TEST_CASE("[Color] Conversion methods") {  TEST_CASE("[Color] Linear <-> sRGB conversion") {  	const Color color = Color(0.35, 0.5, 0.6, 0.7); -	const Color color_linear = color.to_linear(); -	const Color color_srgb = color.to_srgb(); +	const Color color_linear = color.srgb_to_linear(); +	const Color color_srgb = color.linear_to_srgb();  	CHECK_MESSAGE(  			color_linear.is_equal_approx(Color(0.100481, 0.214041, 0.318547, 0.7)),  			"The color converted to linear color space should match the expected value."); @@ -155,10 +155,10 @@ TEST_CASE("[Color] Linear <-> sRGB conversion") {  			color_srgb.is_equal_approx(Color(0.62621, 0.735357, 0.797738, 0.7)),  			"The color converted to sRGB color space should match the expected value.");  	CHECK_MESSAGE( -			color_linear.to_srgb().is_equal_approx(Color(0.35, 0.5, 0.6, 0.7)), +			color_linear.linear_to_srgb().is_equal_approx(Color(0.35, 0.5, 0.6, 0.7)),  			"The linear color converted back to sRGB color space should match the expected value.");  	CHECK_MESSAGE( -			color_srgb.to_linear().is_equal_approx(Color(0.35, 0.5, 0.6, 0.7)), +			color_srgb.srgb_to_linear().is_equal_approx(Color(0.35, 0.5, 0.6, 0.7)),  			"The sRGB color converted back to linear color space should match the expected value.");  }  |