mirror of
https://github.com/godotengine/godot.git
synced 2024-11-27 09:16:35 +08:00
Merge pull request #17752 from nikibobi/texture-progress-tint
Add tint property to TextureProgress
This commit is contained in:
commit
644ada1aac
@ -106,6 +106,33 @@ Ref<Texture> TextureProgress::get_progress_texture() const {
|
||||
return progress;
|
||||
}
|
||||
|
||||
void TextureProgress::set_tint_under(const Color &p_tint) {
|
||||
tint_under = p_tint;
|
||||
update();
|
||||
}
|
||||
|
||||
Color TextureProgress::get_tint_under() const {
|
||||
return tint_under;
|
||||
}
|
||||
|
||||
void TextureProgress::set_tint_progress(const Color &p_tint) {
|
||||
tint_progress = p_tint;
|
||||
update();
|
||||
}
|
||||
|
||||
Color TextureProgress::get_tint_progress() const {
|
||||
return tint_progress;
|
||||
}
|
||||
|
||||
void TextureProgress::set_tint_over(const Color &p_tint) {
|
||||
tint_over = p_tint;
|
||||
update();
|
||||
}
|
||||
|
||||
Color TextureProgress::get_tint_over() const {
|
||||
return tint_over;
|
||||
}
|
||||
|
||||
Point2 TextureProgress::unit_val_to_uv(float val) {
|
||||
if (progress.is_null())
|
||||
return Point2();
|
||||
@ -170,7 +197,7 @@ Point2 TextureProgress::get_relative_center() {
|
||||
return p;
|
||||
}
|
||||
|
||||
void TextureProgress::draw_nine_patch_stretched(const Ref<Texture> &p_texture, FillMode p_mode, double p_ratio) {
|
||||
void TextureProgress::draw_nine_patch_stretched(const Ref<Texture> &p_texture, FillMode p_mode, double p_ratio, const Color &p_modulate) {
|
||||
Vector2 texture_size = p_texture->get_size();
|
||||
Vector2 topleft = Vector2(stretch_margin[MARGIN_LEFT], stretch_margin[MARGIN_TOP]);
|
||||
Vector2 bottomright = Vector2(stretch_margin[MARGIN_RIGHT], stretch_margin[MARGIN_BOTTOM]);
|
||||
@ -240,7 +267,7 @@ void TextureProgress::draw_nine_patch_stretched(const Ref<Texture> &p_texture, F
|
||||
}
|
||||
|
||||
RID ci = get_canvas_item();
|
||||
VS::get_singleton()->canvas_item_add_nine_patch(ci, dst_rect, src_rect, p_texture->get_rid(), topleft, bottomright);
|
||||
VS::get_singleton()->canvas_item_add_nine_patch(ci, dst_rect, src_rect, p_texture->get_rid(), topleft, bottomright, VS::NINE_PATCH_STRETCH, VS::NINE_PATCH_STRETCH, true, p_modulate);
|
||||
}
|
||||
|
||||
void TextureProgress::_notification(int p_what) {
|
||||
@ -251,42 +278,42 @@ void TextureProgress::_notification(int p_what) {
|
||||
|
||||
if (nine_patch_stretch && (mode == FILL_LEFT_TO_RIGHT || mode == FILL_RIGHT_TO_LEFT || mode == FILL_TOP_TO_BOTTOM || mode == FILL_BOTTOM_TO_TOP)) {
|
||||
if (under.is_valid()) {
|
||||
draw_nine_patch_stretched(under, FILL_LEFT_TO_RIGHT, 1.0);
|
||||
draw_nine_patch_stretched(under, FILL_LEFT_TO_RIGHT, 1.0, tint_under);
|
||||
}
|
||||
if (progress.is_valid()) {
|
||||
draw_nine_patch_stretched(progress, mode, get_as_ratio());
|
||||
draw_nine_patch_stretched(progress, mode, get_as_ratio(), tint_progress);
|
||||
}
|
||||
if (over.is_valid()) {
|
||||
draw_nine_patch_stretched(over, FILL_LEFT_TO_RIGHT, 1.0);
|
||||
draw_nine_patch_stretched(over, FILL_LEFT_TO_RIGHT, 1.0, tint_over);
|
||||
}
|
||||
} else {
|
||||
if (under.is_valid())
|
||||
draw_texture(under, Point2());
|
||||
draw_texture(under, Point2(), tint_under);
|
||||
if (progress.is_valid()) {
|
||||
Size2 s = progress->get_size();
|
||||
switch (mode) {
|
||||
case FILL_LEFT_TO_RIGHT: {
|
||||
Rect2 region = Rect2(Point2(), Size2(s.x * get_as_ratio(), s.y));
|
||||
draw_texture_rect_region(progress, region, region);
|
||||
draw_texture_rect_region(progress, region, region, tint_progress);
|
||||
} break;
|
||||
case FILL_RIGHT_TO_LEFT: {
|
||||
Rect2 region = Rect2(Point2(s.x - s.x * get_as_ratio(), 0), Size2(s.x * get_as_ratio(), s.y));
|
||||
draw_texture_rect_region(progress, region, region);
|
||||
draw_texture_rect_region(progress, region, region, tint_progress);
|
||||
} break;
|
||||
case FILL_TOP_TO_BOTTOM: {
|
||||
Rect2 region = Rect2(Point2(), Size2(s.x, s.y * get_as_ratio()));
|
||||
draw_texture_rect_region(progress, region, region);
|
||||
draw_texture_rect_region(progress, region, region, tint_progress);
|
||||
} break;
|
||||
case FILL_BOTTOM_TO_TOP: {
|
||||
Rect2 region = Rect2(Point2(0, s.y - s.y * get_as_ratio()), Size2(s.x, s.y * get_as_ratio()));
|
||||
draw_texture_rect_region(progress, region, region);
|
||||
draw_texture_rect_region(progress, region, region, tint_progress);
|
||||
} break;
|
||||
case FILL_CLOCKWISE:
|
||||
case FILL_COUNTER_CLOCKWISE: {
|
||||
float val = get_as_ratio() * rad_max_degrees / 360;
|
||||
if (val == 1) {
|
||||
Rect2 region = Rect2(Point2(), s);
|
||||
draw_texture_rect_region(progress, region, region);
|
||||
draw_texture_rect_region(progress, region, region, tint_progress);
|
||||
} else if (val != 0) {
|
||||
Array pts;
|
||||
float direction = mode == FILL_CLOCKWISE ? 1 : -1;
|
||||
@ -311,7 +338,9 @@ void TextureProgress::_notification(int p_what) {
|
||||
uvs.push_back(uv);
|
||||
points.push_back(Point2(uv.x * s.x, uv.y * s.y));
|
||||
}
|
||||
draw_polygon(points, Vector<Color>(), uvs, progress);
|
||||
Vector<Color> colors;
|
||||
colors.push_back(tint_progress);
|
||||
draw_polygon(points, colors, uvs, progress);
|
||||
}
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
Point2 p = progress->get_size();
|
||||
@ -323,11 +352,11 @@ void TextureProgress::_notification(int p_what) {
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
draw_texture_rect_region(progress, Rect2(Point2(), Size2(s.x * get_as_ratio(), s.y)), Rect2(Point2(), Size2(s.x * get_as_ratio(), s.y)));
|
||||
draw_texture_rect_region(progress, Rect2(Point2(), Size2(s.x * get_as_ratio(), s.y)), Rect2(Point2(), Size2(s.x * get_as_ratio(), s.y)), tint_progress);
|
||||
}
|
||||
}
|
||||
if (over.is_valid())
|
||||
draw_texture(over, Point2());
|
||||
draw_texture(over, Point2(), tint_over);
|
||||
}
|
||||
|
||||
} break;
|
||||
@ -389,6 +418,15 @@ void TextureProgress::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_fill_mode", "mode"), &TextureProgress::set_fill_mode);
|
||||
ClassDB::bind_method(D_METHOD("get_fill_mode"), &TextureProgress::get_fill_mode);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_tint_under", "tint"), &TextureProgress::set_tint_under);
|
||||
ClassDB::bind_method(D_METHOD("get_tint_under"), &TextureProgress::get_tint_under);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_tint_progress", "tint"), &TextureProgress::set_tint_progress);
|
||||
ClassDB::bind_method(D_METHOD("get_tint_progress"), &TextureProgress::get_tint_progress);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_tint_over", "tint"), &TextureProgress::set_tint_over);
|
||||
ClassDB::bind_method(D_METHOD("get_tint_over"), &TextureProgress::get_tint_over);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_radial_initial_angle", "mode"), &TextureProgress::set_radial_initial_angle);
|
||||
ClassDB::bind_method(D_METHOD("get_radial_initial_angle"), &TextureProgress::get_radial_initial_angle);
|
||||
|
||||
@ -409,6 +447,10 @@ void TextureProgress::_bind_methods() {
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_over", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_over_texture", "get_over_texture");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_progress", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_progress_texture", "get_progress_texture");
|
||||
ADD_PROPERTYNZ(PropertyInfo(Variant::INT, "fill_mode", PROPERTY_HINT_ENUM, "Left to Right,Right to Left,Top to Bottom,Bottom to Top,Clockwise,Counter Clockwise"), "set_fill_mode", "get_fill_mode");
|
||||
ADD_GROUP("Tint", "tint_");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "tint_under", PROPERTY_HINT_COLOR_NO_ALPHA), "set_tint_under", "get_tint_under");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "tint_over", PROPERTY_HINT_COLOR_NO_ALPHA), "set_tint_over", "get_tint_over");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "tint_progress", PROPERTY_HINT_COLOR_NO_ALPHA), "set_tint_progress", "get_tint_progress");
|
||||
ADD_GROUP("Radial Fill", "radial_");
|
||||
ADD_PROPERTYNZ(PropertyInfo(Variant::REAL, "radial_initial_angle", PROPERTY_HINT_RANGE, "0.0,360.0,0.1,slider"), "set_radial_initial_angle", "get_radial_initial_angle");
|
||||
ADD_PROPERTYNZ(PropertyInfo(Variant::REAL, "radial_fill_degrees", PROPERTY_HINT_RANGE, "0.0,360.0,0.1,slider"), "set_fill_degrees", "get_fill_degrees");
|
||||
@ -440,4 +482,6 @@ TextureProgress::TextureProgress() {
|
||||
stretch_margin[MARGIN_RIGHT] = 0;
|
||||
stretch_margin[MARGIN_BOTTOM] = 0;
|
||||
stretch_margin[MARGIN_TOP] = 0;
|
||||
|
||||
tint_under = tint_progress = tint_over = Color(1, 1, 1);
|
||||
}
|
||||
|
@ -82,6 +82,15 @@ public:
|
||||
void set_nine_patch_stretch(bool p_stretch);
|
||||
bool get_nine_patch_stretch() const;
|
||||
|
||||
void set_tint_under(const Color &p_tint);
|
||||
Color get_tint_under() const;
|
||||
|
||||
void set_tint_progress(const Color &p_tint);
|
||||
Color get_tint_progress() const;
|
||||
|
||||
void set_tint_over(const Color &p_tint);
|
||||
Color get_tint_over() const;
|
||||
|
||||
Size2 get_minimum_size() const;
|
||||
|
||||
TextureProgress();
|
||||
@ -93,10 +102,11 @@ private:
|
||||
Point2 rad_center_off;
|
||||
bool nine_patch_stretch;
|
||||
int stretch_margin[4];
|
||||
Color tint_under, tint_progress, tint_over;
|
||||
|
||||
Point2 unit_val_to_uv(float val);
|
||||
Point2 get_relative_center();
|
||||
void draw_nine_patch_stretched(const Ref<Texture> &p_texture, FillMode p_mode, double p_ratio);
|
||||
void draw_nine_patch_stretched(const Ref<Texture> &p_texture, FillMode p_mode, double p_ratio, const Color &p_modulate);
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(TextureProgress::FillMode);
|
||||
|
Loading…
Reference in New Issue
Block a user