diff options
Diffstat (limited to 'modules/noise/noise_texture.cpp')
| -rw-r--r-- | modules/noise/noise_texture.cpp | 101 | 
1 files changed, 90 insertions, 11 deletions
| diff --git a/modules/noise/noise_texture.cpp b/modules/noise/noise_texture.cpp index 276335797a..ca55d3b96d 100644 --- a/modules/noise/noise_texture.cpp +++ b/modules/noise/noise_texture.cpp @@ -47,15 +47,22 @@ NoiseTexture::~NoiseTexture() {  }  void NoiseTexture::_bind_methods() { +	ClassDB::bind_method(D_METHOD("_update_texture"), &NoiseTexture::_update_texture); +	ClassDB::bind_method(D_METHOD("_generate_texture"), &NoiseTexture::_generate_texture); +	ClassDB::bind_method(D_METHOD("_thread_done", "image"), &NoiseTexture::_thread_done); +  	ClassDB::bind_method(D_METHOD("set_width", "width"), &NoiseTexture::set_width);  	ClassDB::bind_method(D_METHOD("set_height", "height"), &NoiseTexture::set_height); -	ClassDB::bind_method(D_METHOD("set_noise", "noise"), &NoiseTexture::set_noise); -	ClassDB::bind_method(D_METHOD("get_noise"), &NoiseTexture::get_noise); -  	ClassDB::bind_method(D_METHOD("set_invert", "invert"), &NoiseTexture::set_invert);  	ClassDB::bind_method(D_METHOD("get_invert"), &NoiseTexture::get_invert); +	ClassDB::bind_method(D_METHOD("set_in_3d_space", "enable"), &NoiseTexture::set_in_3d_space); +	ClassDB::bind_method(D_METHOD("is_in_3d_space"), &NoiseTexture::is_in_3d_space); + +	ClassDB::bind_method(D_METHOD("set_generate_mipmaps", "invert"), &NoiseTexture::set_generate_mipmaps); +	ClassDB::bind_method(D_METHOD("is_generating_mipmaps"), &NoiseTexture::is_generating_mipmaps); +  	ClassDB::bind_method(D_METHOD("set_seamless", "seamless"), &NoiseTexture::set_seamless);  	ClassDB::bind_method(D_METHOD("get_seamless"), &NoiseTexture::get_seamless); @@ -68,17 +75,22 @@ void NoiseTexture::_bind_methods() {  	ClassDB::bind_method(D_METHOD("set_bump_strength", "bump_strength"), &NoiseTexture::set_bump_strength);  	ClassDB::bind_method(D_METHOD("get_bump_strength"), &NoiseTexture::get_bump_strength); -	ClassDB::bind_method(D_METHOD("_update_texture"), &NoiseTexture::_update_texture); -	ClassDB::bind_method(D_METHOD("_generate_texture"), &NoiseTexture::_generate_texture); -	ClassDB::bind_method(D_METHOD("_thread_done", "image"), &NoiseTexture::_thread_done); +	ClassDB::bind_method(D_METHOD("set_color_ramp", "gradient"), &NoiseTexture::set_color_ramp); +	ClassDB::bind_method(D_METHOD("get_color_ramp"), &NoiseTexture::get_color_ramp); -	ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "1,2048,1,or_greater"), "set_width", "get_width"); -	ADD_PROPERTY(PropertyInfo(Variant::INT, "height", PROPERTY_HINT_RANGE, "1,2048,1,or_greater"), "set_height", "get_height"); +	ClassDB::bind_method(D_METHOD("set_noise", "noise"), &NoiseTexture::set_noise); +	ClassDB::bind_method(D_METHOD("get_noise"), &NoiseTexture::get_noise); + +	ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "1,2048,1,or_greater,suffix:px"), "set_width", "get_width"); +	ADD_PROPERTY(PropertyInfo(Variant::INT, "height", PROPERTY_HINT_RANGE, "1,2048,1,or_greater,suffix:px"), "set_height", "get_height");  	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "invert"), "set_invert", "get_invert"); +	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "in_3d_space"), "set_in_3d_space", "is_in_3d_space"); +	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "generate_mipmaps"), "set_generate_mipmaps", "is_generating_mipmaps");  	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "seamless"), "set_seamless", "get_seamless");  	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "seamless_blend_skirt", PROPERTY_HINT_RANGE, "0.05,1,0.001"), "set_seamless_blend_skirt", "get_seamless_blend_skirt");  	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "as_normal_map"), "set_as_normal_map", "is_normal_map");  	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "bump_strength", PROPERTY_HINT_RANGE, "0,32,0.1,or_greater"), "set_bump_strength", "get_bump_strength"); +	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "color_ramp", PROPERTY_HINT_RESOURCE_TYPE, "Gradient"), "set_color_ramp", "get_color_ramp");  	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "noise", PROPERTY_HINT_RESOURCE_TYPE, "Noise"), "set_noise", "get_noise");  } @@ -143,18 +155,42 @@ Ref<Image> NoiseTexture::_generate_texture() {  	Ref<Image> image;  	if (seamless) { -		image = ref_noise->get_seamless_image(size.x, size.y, invert, seamless_blend_skirt); +		image = ref_noise->get_seamless_image(size.x, size.y, invert, in_3d_space, seamless_blend_skirt);  	} else { -		image = ref_noise->get_image(size.x, size.y, invert); +		image = ref_noise->get_image(size.x, size.y, invert, in_3d_space); +	} +	if (color_ramp.is_valid()) { +		image = _modulate_with_gradient(image, color_ramp);  	} -  	if (as_normal_map) {  		image->bump_map_to_normal_map(bump_strength);  	} +	if (generate_mipmaps) { +		image->generate_mipmaps(); +	}  	return image;  } +Ref<Image> NoiseTexture::_modulate_with_gradient(Ref<Image> p_image, Ref<Gradient> p_gradient) { +	int width = p_image->get_width(); +	int height = p_image->get_height(); + +	Ref<Image> new_image; +	new_image.instantiate(); +	new_image->create(width, height, false, Image::FORMAT_RGBA8); + +	for (int row = 0; row < height; row++) { +		for (int col = 0; col < width; col++) { +			Color pixel_color = p_image->get_pixel(col, row); +			Color ramp_color = color_ramp->get_color_at_offset(pixel_color.get_luminance()); +			new_image->set_pixel(col, row, ramp_color); +		} +	} + +	return new_image; +} +  void NoiseTexture::_update_texture() {  	bool use_thread = true;  	if (first_time) { @@ -227,6 +263,29 @@ bool NoiseTexture::get_invert() const {  	return invert;  } +void NoiseTexture::set_in_3d_space(bool p_enable) { +	if (p_enable == in_3d_space) { +		return; +	} +	in_3d_space = p_enable; +	_queue_update(); +} +bool NoiseTexture::is_in_3d_space() const { +	return in_3d_space; +} + +void NoiseTexture::set_generate_mipmaps(bool p_enable) { +	if (p_enable == generate_mipmaps) { +		return; +	} +	generate_mipmaps = p_enable; +	_queue_update(); +} + +bool NoiseTexture::is_generating_mipmaps() const { +	return generate_mipmaps; +} +  void NoiseTexture::set_seamless(bool p_seamless) {  	if (p_seamless == seamless) {  		return; @@ -241,6 +300,8 @@ bool NoiseTexture::get_seamless() {  }  void NoiseTexture::set_seamless_blend_skirt(real_t p_blend_skirt) { +	ERR_FAIL_COND(p_blend_skirt < 0.05 || p_blend_skirt > 1); +  	if (p_blend_skirt == seamless_blend_skirt) {  		return;  	} @@ -278,6 +339,24 @@ float NoiseTexture::get_bump_strength() {  	return bump_strength;  } +void NoiseTexture::set_color_ramp(const Ref<Gradient> &p_gradient) { +	if (p_gradient == color_ramp) { +		return; +	} +	if (color_ramp.is_valid()) { +		color_ramp->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture::_queue_update)); +	} +	color_ramp = p_gradient; +	if (color_ramp.is_valid()) { +		color_ramp->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NoiseTexture::_queue_update)); +	} +	_queue_update(); +} + +Ref<Gradient> NoiseTexture::get_color_ramp() const { +	return color_ramp; +} +  int NoiseTexture::get_width() const {  	return size.x;  } |