diff options
Diffstat (limited to 'scene/resources/gradient_texture.cpp')
-rw-r--r-- | scene/resources/gradient_texture.cpp | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/scene/resources/gradient_texture.cpp b/scene/resources/gradient_texture.cpp index 20868faaa2..327a99c6ad 100644 --- a/scene/resources/gradient_texture.cpp +++ b/scene/resources/gradient_texture.cpp @@ -54,8 +54,6 @@ void GradientTexture1D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_use_hdr", "enabled"), &GradientTexture1D::set_use_hdr); ClassDB::bind_method(D_METHOD("is_using_hdr"), &GradientTexture1D::is_using_hdr); - ClassDB::bind_method(D_METHOD("_update"), &GradientTexture1D::_update); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "gradient", PROPERTY_HINT_RESOURCE_TYPE, "Gradient", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT), "set_gradient", "get_gradient"); ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "1,16384,suffix:px"), "set_width", "get_width"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_hdr"), "set_use_hdr", "is_using_hdr"); @@ -66,13 +64,13 @@ void GradientTexture1D::set_gradient(Ref<Gradient> p_gradient) { return; } if (gradient.is_valid()) { - gradient->disconnect_changed(callable_mp(this, &GradientTexture1D::_update)); + gradient->disconnect_changed(callable_mp(this, &GradientTexture1D::_queue_update)); } gradient = p_gradient; if (gradient.is_valid()) { - gradient->connect_changed(callable_mp(this, &GradientTexture1D::_update)); + gradient->connect_changed(callable_mp(this, &GradientTexture1D::_queue_update)); } - _update(); + _queue_update(); emit_changed(); } @@ -84,9 +82,8 @@ void GradientTexture1D::_queue_update() { if (update_pending) { return; } - update_pending = true; - call_deferred(SNAME("_update")); + callable_mp(this, &GradientTexture1D::update_now).call_deferred(); } void GradientTexture1D::_update() { @@ -140,14 +137,13 @@ void GradientTexture1D::_update() { texture = RS::get_singleton()->texture_2d_create(image); } } - - emit_changed(); } void GradientTexture1D::set_width(int p_width) { ERR_FAIL_COND_MSG(p_width <= 0 || p_width > 16384, "Texture dimensions have to be within 1 to 16384 range."); width = p_width; _queue_update(); + emit_changed(); } int GradientTexture1D::get_width() const { @@ -161,19 +157,34 @@ void GradientTexture1D::set_use_hdr(bool p_enabled) { use_hdr = p_enabled; _queue_update(); + emit_changed(); } bool GradientTexture1D::is_using_hdr() const { return use_hdr; } +RID GradientTexture1D::get_rid() const { + if (!texture.is_valid()) { + texture = RS::get_singleton()->texture_2d_placeholder_create(); + } + return texture; +} + Ref<Image> GradientTexture1D::get_image() const { + const_cast<GradientTexture1D *>(this)->update_now(); if (!texture.is_valid()) { return Ref<Image>(); } return RenderingServer::get_singleton()->texture_2d_get(texture); } +void GradientTexture1D::update_now() { + if (update_pending) { + _update(); + } +} + ////////////////// GradientTexture2D::GradientTexture2D() { @@ -198,7 +209,7 @@ void GradientTexture2D::set_gradient(Ref<Gradient> p_gradient) { if (gradient.is_valid()) { gradient->connect_changed(callable_mp(this, &GradientTexture2D::_queue_update)); } - _update(); + _queue_update(); emit_changed(); } @@ -211,7 +222,7 @@ void GradientTexture2D::_queue_update() { return; } update_pending = true; - call_deferred(SNAME("_update")); + callable_mp(this, &GradientTexture2D::update_now).call_deferred(); } void GradientTexture2D::_update() { @@ -265,7 +276,6 @@ void GradientTexture2D::_update() { } else { texture = RS::get_singleton()->texture_2d_create(image); } - emit_changed(); } float GradientTexture2D::_get_gradient_offset_at(int x, int y) const { @@ -315,6 +325,7 @@ void GradientTexture2D::set_width(int p_width) { ERR_FAIL_COND_MSG(p_width <= 0 || p_width > 16384, "Texture dimensions have to be within 1 to 16384 range."); width = p_width; _queue_update(); + emit_changed(); } int GradientTexture2D::get_width() const { @@ -325,6 +336,7 @@ void GradientTexture2D::set_height(int p_height) { ERR_FAIL_COND_MSG(p_height <= 0 || p_height > 16384, "Texture dimensions have to be within 1 to 16384 range."); height = p_height; _queue_update(); + emit_changed(); } int GradientTexture2D::get_height() const { return height; @@ -337,6 +349,7 @@ void GradientTexture2D::set_use_hdr(bool p_enabled) { use_hdr = p_enabled; _queue_update(); + emit_changed(); } bool GradientTexture2D::is_using_hdr() const { @@ -346,6 +359,7 @@ bool GradientTexture2D::is_using_hdr() const { void GradientTexture2D::set_fill_from(Vector2 p_fill_from) { fill_from = p_fill_from; _queue_update(); + emit_changed(); } Vector2 GradientTexture2D::get_fill_from() const { @@ -355,6 +369,7 @@ Vector2 GradientTexture2D::get_fill_from() const { void GradientTexture2D::set_fill_to(Vector2 p_fill_to) { fill_to = p_fill_to; _queue_update(); + emit_changed(); } Vector2 GradientTexture2D::get_fill_to() const { @@ -364,6 +379,7 @@ Vector2 GradientTexture2D::get_fill_to() const { void GradientTexture2D::set_fill(Fill p_fill) { fill = p_fill; _queue_update(); + emit_changed(); } GradientTexture2D::Fill GradientTexture2D::get_fill() const { @@ -373,6 +389,7 @@ GradientTexture2D::Fill GradientTexture2D::get_fill() const { void GradientTexture2D::set_repeat(Repeat p_repeat) { repeat = p_repeat; _queue_update(); + emit_changed(); } GradientTexture2D::Repeat GradientTexture2D::get_repeat() const { @@ -387,12 +404,19 @@ RID GradientTexture2D::get_rid() const { } Ref<Image> GradientTexture2D::get_image() const { + const_cast<GradientTexture2D *>(this)->update_now(); if (!texture.is_valid()) { return Ref<Image>(); } return RenderingServer::get_singleton()->texture_2d_get(texture); } +void GradientTexture2D::update_now() { + if (update_pending) { + _update(); + } +} + void GradientTexture2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_gradient", "gradient"), &GradientTexture2D::set_gradient); ClassDB::bind_method(D_METHOD("get_gradient"), &GradientTexture2D::get_gradient); @@ -413,8 +437,6 @@ void GradientTexture2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_repeat", "repeat"), &GradientTexture2D::set_repeat); ClassDB::bind_method(D_METHOD("get_repeat"), &GradientTexture2D::get_repeat); - ClassDB::bind_method(D_METHOD("_update"), &GradientTexture2D::_update); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "gradient", PROPERTY_HINT_RESOURCE_TYPE, "Gradient", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT), "set_gradient", "get_gradient"); ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "1,2048,or_greater,suffix:px"), "set_width", "get_width"); ADD_PROPERTY(PropertyInfo(Variant::INT, "height", PROPERTY_HINT_RANGE, "1,2048,or_greater,suffix:px"), "set_height", "get_height"); |