diff options
Diffstat (limited to 'scene')
374 files changed, 7971 insertions, 13041 deletions
diff --git a/scene/2d/animated_sprite_2d.cpp b/scene/2d/animated_sprite_2d.cpp index fc34f967ce..3268544519 100644 --- a/scene/2d/animated_sprite_2d.cpp +++ b/scene/2d/animated_sprite_2d.cpp @@ -70,8 +70,9 @@ bool AnimatedSprite2D::_edit_use_rect() const { return false; } Ref<Texture2D> t; - if (animation) + if (animation) { t = frames->get_frame(animation, frame); + } return t.is_valid(); } #endif @@ -86,31 +87,35 @@ Rect2 AnimatedSprite2D::_get_rect() const { } Ref<Texture2D> t; - if (animation) + if (animation) { t = frames->get_frame(animation, frame); - if (t.is_null()) + } + if (t.is_null()) { return Rect2(); + } Size2 s = t->get_size(); Point2 ofs = offset; - if (centered) + if (centered) { ofs -= Size2(s) / 2; + } - if (s == Size2(0, 0)) + if (s == Size2(0, 0)) { s = Size2(1, 1); + } return Rect2(ofs, s); } void SpriteFrames::add_frame(const StringName &p_anim, const Ref<Texture2D> &p_frame, int p_at_pos) { - Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); - if (p_at_pos >= 0 && p_at_pos < E->get().frames.size()) + if (p_at_pos >= 0 && p_at_pos < E->get().frames.size()) { E->get().frames.insert(p_at_pos, p_frame); - else + } else { E->get().frames.push_back(p_frame); + } emit_changed(); } @@ -123,15 +128,14 @@ int SpriteFrames::get_frame_count(const StringName &p_anim) const { } void SpriteFrames::remove_frame(const StringName &p_anim, int p_idx) { - Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); E->get().frames.remove(p_idx); emit_changed(); } -void SpriteFrames::clear(const StringName &p_anim) { +void SpriteFrames::clear(const StringName &p_anim) { Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); @@ -140,13 +144,11 @@ void SpriteFrames::clear(const StringName &p_anim) { } void SpriteFrames::clear_all() { - animations.clear(); add_animation("default"); } void SpriteFrames::add_animation(const StringName &p_anim) { - ERR_FAIL_COND_MSG(animations.has(p_anim), "SpriteFrames already has animation '" + p_anim + "'."); animations[p_anim] = Anim(); @@ -155,16 +157,14 @@ void SpriteFrames::add_animation(const StringName &p_anim) { } bool SpriteFrames::has_animation(const StringName &p_anim) const { - return animations.has(p_anim); } -void SpriteFrames::remove_animation(const StringName &p_anim) { +void SpriteFrames::remove_animation(const StringName &p_anim) { animations.erase(p_anim); } void SpriteFrames::rename_animation(const StringName &p_prev, const StringName &p_next) { - ERR_FAIL_COND_MSG(!animations.has(p_prev), "SpriteFrames doesn't have animation '" + String(p_prev) + "'."); ERR_FAIL_COND_MSG(animations.has(p_next), "Animation '" + String(p_next) + "' already exists."); @@ -176,12 +176,10 @@ void SpriteFrames::rename_animation(const StringName &p_prev, const StringName & } Vector<String> SpriteFrames::_get_animation_list() const { - Vector<String> ret; List<StringName> al; get_animation_list(&al); for (List<StringName>::Element *E = al.front(); E; E = E->next()) { - ret.push_back(E->get()); } @@ -189,14 +187,12 @@ Vector<String> SpriteFrames::_get_animation_list() const { } void SpriteFrames::get_animation_list(List<StringName> *r_animations) const { - for (const Map<StringName, Anim>::Element *E = animations.front(); E; E = E->next()) { r_animations->push_back(E->key()); } } Vector<String> SpriteFrames::get_animation_names() const { - Vector<String> names; for (const Map<StringName, Anim>::Element *E = animations.front(); E; E = E->next()) { names.push_back(E->key()); @@ -206,14 +202,13 @@ Vector<String> SpriteFrames::get_animation_names() const { } void SpriteFrames::set_animation_speed(const StringName &p_anim, float p_fps) { - ERR_FAIL_COND_MSG(p_fps < 0, "Animation speed cannot be negative (" + itos(p_fps) + ")."); Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); E->get().speed = p_fps; } -float SpriteFrames::get_animation_speed(const StringName &p_anim) const { +float SpriteFrames::get_animation_speed(const StringName &p_anim) const { const Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_V_MSG(!E, 0, "Animation '" + String(p_anim) + "' doesn't exist."); return E->get().speed; @@ -224,6 +219,7 @@ void SpriteFrames::set_animation_loop(const StringName &p_anim, bool p_loop) { ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); E->get().loop = p_loop; } + bool SpriteFrames::get_animation_loop(const StringName &p_anim) const { const Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_V_MSG(!E, false, "Animation '" + String(p_anim) + "' doesn't exist."); @@ -231,22 +227,21 @@ bool SpriteFrames::get_animation_loop(const StringName &p_anim) const { } void SpriteFrames::_set_frames(const Array &p_frames) { - clear_all(); Map<StringName, Anim>::Element *E = animations.find(SceneStringNames::get_singleton()->_default); ERR_FAIL_COND(!E); E->get().frames.resize(p_frames.size()); - for (int i = 0; i < E->get().frames.size(); i++) + for (int i = 0; i < E->get().frames.size(); i++) { E->get().frames.write[i] = p_frames[i]; + } } -Array SpriteFrames::_get_frames() const { +Array SpriteFrames::_get_frames() const { return Array(); } Array SpriteFrames::_get_animations() const { - Array anims; for (Map<StringName, Anim>::Element *E = animations.front(); E; E = E->next()) { Dictionary d; @@ -263,11 +258,10 @@ Array SpriteFrames::_get_animations() const { return anims; } -void SpriteFrames::_set_animations(const Array &p_animations) { +void SpriteFrames::_set_animations(const Array &p_animations) { animations.clear(); for (int i = 0; i < p_animations.size(); i++) { - Dictionary d = p_animations[i]; ERR_CONTINUE(!d.has("name")); @@ -280,7 +274,6 @@ void SpriteFrames::_set_animations(const Array &p_animations) { anim.loop = d["loop"]; Array frames = d["frames"]; for (int j = 0; j < frames.size(); j++) { - RES res = frames[j]; anim.frames.push_back(res); } @@ -290,7 +283,6 @@ void SpriteFrames::_set_animations(const Array &p_animations) { } void SpriteFrames::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_animation", "anim"), &SpriteFrames::add_animation); ClassDB::bind_method(D_METHOD("has_animation", "anim"), &SpriteFrames::has_animation); ClassDB::bind_method(D_METHOD("remove_animation", "anim"), &SpriteFrames::remove_animation); @@ -324,16 +316,14 @@ void SpriteFrames::_bind_methods() { } SpriteFrames::SpriteFrames() { - add_animation(SceneStringNames::get_singleton()->_default); } void AnimatedSprite2D::_validate_property(PropertyInfo &property) const { - - if (!frames.is_valid()) + if (!frames.is_valid()) { return; + } if (property.name == "animation") { - property.hint = PROPERTY_HINT_ENUM; List<StringName> names; frames->get_animation_list(&names); @@ -371,43 +361,45 @@ void AnimatedSprite2D::_validate_property(PropertyInfo &property) const { } void AnimatedSprite2D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_INTERNAL_PROCESS: { - - if (frames.is_null()) + if (frames.is_null()) { return; - if (!frames->has_animation(animation)) + } + if (!frames->has_animation(animation)) { return; - if (frame < 0) + } + if (frame < 0) { return; + } float speed = frames->get_animation_speed(animation) * speed_scale; - if (speed == 0) + if (speed == 0) { return; //do nothing + } float remaining = get_process_delta_time(); while (remaining) { - if (timeout <= 0) { - timeout = _get_frame_duration(); int fc = frames->get_frame_count(animation); if ((!backwards && frame >= fc - 1) || (backwards && frame <= 0)) { if (frames->get_animation_loop(animation)) { - if (backwards) + if (backwards) { frame = fc - 1; - else + } else { frame = 0; + } emit_signal(SceneStringNames::get_singleton()->animation_finished); } else { - if (backwards) + if (backwards) { frame = 0; - else + } else { frame = fc - 1; + } if (!is_over) { is_over = true; @@ -415,10 +407,11 @@ void AnimatedSprite2D::_notification(int p_what) { } } } else { - if (backwards) + if (backwards) { frame--; - else + } else { frame++; + } } update(); @@ -433,17 +426,20 @@ void AnimatedSprite2D::_notification(int p_what) { } break; case NOTIFICATION_DRAW: { - - if (frames.is_null()) + if (frames.is_null()) { return; - if (frame < 0) + } + if (frame < 0) { return; - if (!frames->has_animation(animation)) + } + if (!frames->has_animation(animation)) { return; + } Ref<Texture2D> texture = frames->get_frame(animation, frame); - if (texture.is_null()) + if (texture.is_null()) { return; + } Ref<Texture2D> normal = frames->get_normal_frame(animation, frame); Ref<Texture2D> specular = frames->get_specular_frame(animation, frame); @@ -453,18 +449,21 @@ void AnimatedSprite2D::_notification(int p_what) { Size2i s; s = texture->get_size(); Point2 ofs = offset; - if (centered) + if (centered) { ofs -= s / 2; + } if (Engine::get_singleton()->get_use_pixel_snap()) { ofs = ofs.floor(); } Rect2 dst_rect(ofs, s); - if (hflip) + if (hflip) { dst_rect.size.x = -dst_rect.size.x; - if (vflip) + } + if (vflip) { dst_rect.size.y = -dst_rect.size.y; + } texture->draw_rect_region(ci, dst_rect, Rect2(Vector2(), texture->get_size()), Color(1, 1, 1), false, normal, specular, Color(specular_color.r, specular_color.g, specular_color.b, shininess)); @@ -473,12 +472,13 @@ void AnimatedSprite2D::_notification(int p_what) { } void AnimatedSprite2D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { - - if (frames.is_valid()) + if (frames.is_valid()) { frames->disconnect("changed", callable_mp(this, &AnimatedSprite2D::_res_changed)); + } frames = p_frames; - if (frames.is_valid()) + if (frames.is_valid()) { frames->connect("changed", callable_mp(this, &AnimatedSprite2D::_res_changed)); + } if (!frames.is_valid()) { frame = 0; @@ -493,27 +493,28 @@ void AnimatedSprite2D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { } Ref<SpriteFrames> AnimatedSprite2D::get_sprite_frames() const { - return frames; } void AnimatedSprite2D::set_frame(int p_frame) { - if (!frames.is_valid()) { return; } if (frames->has_animation(animation)) { int limit = frames->get_frame_count(animation); - if (p_frame >= limit) + if (p_frame >= limit) { p_frame = limit - 1; + } } - if (p_frame < 0) + if (p_frame < 0) { p_frame = 0; + } - if (frame == p_frame) + if (frame == p_frame) { return; + } frame = p_frame; _reset_timeout(); @@ -521,13 +522,12 @@ void AnimatedSprite2D::set_frame(int p_frame) { _change_notify("frame"); emit_signal(SceneStringNames::get_singleton()->frame_changed); } -int AnimatedSprite2D::get_frame() const { +int AnimatedSprite2D::get_frame() const { return frame; } void AnimatedSprite2D::set_speed_scale(float p_speed_scale) { - float elapsed = _get_frame_duration() - timeout; speed_scale = MAX(p_speed_scale, 0.0f); @@ -538,56 +538,49 @@ void AnimatedSprite2D::set_speed_scale(float p_speed_scale) { } float AnimatedSprite2D::get_speed_scale() const { - return speed_scale; } void AnimatedSprite2D::set_centered(bool p_center) { - centered = p_center; update(); item_rect_changed(); } bool AnimatedSprite2D::is_centered() const { - return centered; } void AnimatedSprite2D::set_offset(const Point2 &p_offset) { - offset = p_offset; update(); item_rect_changed(); _change_notify("offset"); } -Point2 AnimatedSprite2D::get_offset() const { +Point2 AnimatedSprite2D::get_offset() const { return offset; } void AnimatedSprite2D::set_flip_h(bool p_flip) { - hflip = p_flip; update(); } -bool AnimatedSprite2D::is_flipped_h() const { +bool AnimatedSprite2D::is_flipped_h() const { return hflip; } void AnimatedSprite2D::set_flip_v(bool p_flip) { - vflip = p_flip; update(); } -bool AnimatedSprite2D::is_flipped_v() const { +bool AnimatedSprite2D::is_flipped_v() const { return vflip; } void AnimatedSprite2D::_res_changed() { - set_frame(frame); _change_notify("frame"); _change_notify("animation"); @@ -595,39 +588,36 @@ void AnimatedSprite2D::_res_changed() { } void AnimatedSprite2D::_set_playing(bool p_playing) { - - if (playing == p_playing) + if (playing == p_playing) { return; + } playing = p_playing; _reset_timeout(); set_process_internal(playing); } bool AnimatedSprite2D::_is_playing() const { - return playing; } void AnimatedSprite2D::play(const StringName &p_animation, const bool p_backwards) { - backwards = p_backwards; if (p_animation) { set_animation(p_animation); - if (backwards && get_frame() == 0) + if (backwards && get_frame() == 0) { set_frame(frames->get_frame_count(p_animation) - 1); + } } _set_playing(true); } void AnimatedSprite2D::stop() { - _set_playing(false); } bool AnimatedSprite2D::is_playing() const { - return playing; } @@ -642,21 +632,21 @@ float AnimatedSprite2D::_get_frame_duration() { } void AnimatedSprite2D::_reset_timeout() { - - if (!playing) + if (!playing) { return; + } timeout = _get_frame_duration(); is_over = false; } void AnimatedSprite2D::set_animation(const StringName &p_animation) { - ERR_FAIL_COND_MSG(frames == nullptr, vformat("There is no animation with name '%s'.", p_animation)); ERR_FAIL_COND_MSG(frames->get_animation_names().find(p_animation) == -1, vformat("There is no animation with name '%s'.", p_animation)); - if (animation == p_animation) + if (animation == p_animation) { return; + } animation = p_animation; _reset_timeout(); @@ -664,13 +654,12 @@ void AnimatedSprite2D::set_animation(const StringName &p_animation) { _change_notify(); update(); } -StringName AnimatedSprite2D::get_animation() const { +StringName AnimatedSprite2D::get_animation() const { return animation; } String AnimatedSprite2D::get_configuration_warning() const { - if (frames.is_null()) { return TTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite to display frames."); } @@ -697,7 +686,6 @@ float AnimatedSprite2D::get_shininess() const { } void AnimatedSprite2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_sprite_frames", "sprite_frames"), &AnimatedSprite2D::set_sprite_frames); ClassDB::bind_method(D_METHOD("get_sprite_frames"), &AnimatedSprite2D::get_sprite_frames); @@ -755,7 +743,6 @@ void AnimatedSprite2D::_bind_methods() { } AnimatedSprite2D::AnimatedSprite2D() { - centered = true; hflip = false; vflip = false; diff --git a/scene/2d/animated_sprite_2d.h b/scene/2d/animated_sprite_2d.h index 726ecefd32..5e8344ec4c 100644 --- a/scene/2d/animated_sprite_2d.h +++ b/scene/2d/animated_sprite_2d.h @@ -35,11 +35,9 @@ #include "scene/resources/texture.h" class SpriteFrames : public Resource { - GDCLASS(SpriteFrames, Resource); struct Anim { - float speed; bool loop; Vector<Ref<Texture2D>> frames; @@ -87,40 +85,40 @@ public: void add_frame(const StringName &p_anim, const Ref<Texture2D> &p_frame, int p_at_pos = -1); int get_frame_count(const StringName &p_anim) const; _FORCE_INLINE_ Ref<Texture2D> get_frame(const StringName &p_anim, int p_idx) const { - const Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_V_MSG(!E, Ref<Texture2D>(), "Animation '" + String(p_anim) + "' doesn't exist."); ERR_FAIL_COND_V(p_idx < 0, Ref<Texture2D>()); - if (p_idx >= E->get().frames.size()) + if (p_idx >= E->get().frames.size()) { return Ref<Texture2D>(); + } return E->get().frames[p_idx]; } _FORCE_INLINE_ Ref<Texture2D> get_normal_frame(const StringName &p_anim, int p_idx) const { - const Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_V_MSG(!E, Ref<Texture2D>(), "Animation '" + String(p_anim) + "' doesn't exist."); ERR_FAIL_COND_V(p_idx < 0, Ref<Texture2D>()); const Map<StringName, Anim>::Element *EN = animations.find(E->get().normal_name); - if (!EN || p_idx >= EN->get().frames.size()) + if (!EN || p_idx >= EN->get().frames.size()) { return Ref<Texture2D>(); + } return EN->get().frames[p_idx]; } _FORCE_INLINE_ Ref<Texture2D> get_specular_frame(const StringName &p_anim, int p_idx) const { - const Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_V(!E, Ref<Texture2D>()); ERR_FAIL_COND_V(p_idx < 0, Ref<Texture2D>()); const Map<StringName, Anim>::Element *EN = animations.find(E->get().specular_name); - if (!EN || p_idx >= EN->get().frames.size()) + if (!EN || p_idx >= EN->get().frames.size()) { return Ref<Texture2D>(); + } return EN->get().frames[p_idx]; } @@ -129,8 +127,9 @@ public: Map<StringName, Anim>::Element *E = animations.find(p_anim); ERR_FAIL_COND_MSG(!E, "Animation '" + String(p_anim) + "' doesn't exist."); ERR_FAIL_COND(p_idx < 0); - if (p_idx >= E->get().frames.size()) + if (p_idx >= E->get().frames.size()) { return; + } E->get().frames.write[p_idx] = p_frame; } void remove_frame(const StringName &p_anim, int p_idx); @@ -141,7 +140,6 @@ public: }; class AnimatedSprite2D : public Node2D { - GDCLASS(AnimatedSprite2D, Node2D); Ref<SpriteFrames> frames; diff --git a/scene/2d/area_2d.cpp b/scene/2d/area_2d.cpp index 8ba334bc67..ebfcb9cad6 100644 --- a/scene/2d/area_2d.cpp +++ b/scene/2d/area_2d.cpp @@ -35,27 +35,24 @@ #include "servers/physics_server_2d.h" void Area2D::set_space_override_mode(SpaceOverride p_mode) { - space_override = p_mode; PhysicsServer2D::get_singleton()->area_set_space_override_mode(get_rid(), PhysicsServer2D::AreaSpaceOverrideMode(p_mode)); } -Area2D::SpaceOverride Area2D::get_space_override_mode() const { +Area2D::SpaceOverride Area2D::get_space_override_mode() const { return space_override; } void Area2D::set_gravity_is_point(bool p_enabled) { - gravity_is_point = p_enabled; PhysicsServer2D::get_singleton()->area_set_param(get_rid(), PhysicsServer2D::AREA_PARAM_GRAVITY_IS_POINT, p_enabled); } -bool Area2D::is_gravity_a_point() const { +bool Area2D::is_gravity_a_point() const { return gravity_is_point; } void Area2D::set_gravity_distance_scale(real_t p_scale) { - gravity_distance_scale = p_scale; PhysicsServer2D::get_singleton()->area_set_param(get_rid(), PhysicsServer2D::AREA_PARAM_GRAVITY_DISTANCE_SCALE, p_scale); } @@ -65,58 +62,51 @@ real_t Area2D::get_gravity_distance_scale() const { } void Area2D::set_gravity_vector(const Vector2 &p_vec) { - gravity_vec = p_vec; PhysicsServer2D::get_singleton()->area_set_param(get_rid(), PhysicsServer2D::AREA_PARAM_GRAVITY_VECTOR, p_vec); } -Vector2 Area2D::get_gravity_vector() const { +Vector2 Area2D::get_gravity_vector() const { return gravity_vec; } void Area2D::set_gravity(real_t p_gravity) { - gravity = p_gravity; PhysicsServer2D::get_singleton()->area_set_param(get_rid(), PhysicsServer2D::AREA_PARAM_GRAVITY, p_gravity); } -real_t Area2D::get_gravity() const { +real_t Area2D::get_gravity() const { return gravity; } void Area2D::set_linear_damp(real_t p_linear_damp) { - linear_damp = p_linear_damp; PhysicsServer2D::get_singleton()->area_set_param(get_rid(), PhysicsServer2D::AREA_PARAM_LINEAR_DAMP, p_linear_damp); } -real_t Area2D::get_linear_damp() const { +real_t Area2D::get_linear_damp() const { return linear_damp; } void Area2D::set_angular_damp(real_t p_angular_damp) { - angular_damp = p_angular_damp; PhysicsServer2D::get_singleton()->area_set_param(get_rid(), PhysicsServer2D::AREA_PARAM_ANGULAR_DAMP, p_angular_damp); } real_t Area2D::get_angular_damp() const { - return angular_damp; } void Area2D::set_priority(real_t p_priority) { - priority = p_priority; PhysicsServer2D::get_singleton()->area_set_param(get_rid(), PhysicsServer2D::AREA_PARAM_PRIORITY, p_priority); } -real_t Area2D::get_priority() const { +real_t Area2D::get_priority() const { return priority; } void Area2D::_body_enter_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -128,13 +118,11 @@ void Area2D::_body_enter_tree(ObjectID p_id) { E->get().in_tree = true; emit_signal(SceneStringNames::get_singleton()->body_entered, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape); } } void Area2D::_body_exit_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -144,13 +132,11 @@ void Area2D::_body_exit_tree(ObjectID p_id) { E->get().in_tree = false; emit_signal(SceneStringNames::get_singleton()->body_exited, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape); } } void Area2D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, int p_body_shape, int p_area_shape) { - bool body_in = p_status == PhysicsServer2D::AREA_BODY_ADDED; ObjectID objid = p_instance; @@ -167,7 +153,6 @@ void Area2D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i if (body_in) { if (!E) { - E = body_map.insert(objid, BodyState()); E->get().rc = 0; E->get().in_tree = node && node->is_inside_tree(); @@ -180,29 +165,30 @@ void Area2D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i } } E->get().rc++; - if (node) + if (node) { E->get().shapes.insert(ShapePair(p_body_shape, p_area_shape)); + } if (!node || E->get().in_tree) { emit_signal(SceneStringNames::get_singleton()->body_shape_entered, objid, node, p_body_shape, p_area_shape); } } else { - E->get().rc--; - if (node) + if (node) { E->get().shapes.erase(ShapePair(p_body_shape, p_area_shape)); + } bool eraseit = false; if (E->get().rc == 0) { - if (node) { node->disconnect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &Area2D::_body_enter_tree)); node->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Area2D::_body_exit_tree)); - if (E->get().in_tree) + if (E->get().in_tree) { emit_signal(SceneStringNames::get_singleton()->body_exited, obj); + } } eraseit = true; @@ -211,15 +197,15 @@ void Area2D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i emit_signal(SceneStringNames::get_singleton()->body_shape_exited, objid, obj, p_body_shape, p_area_shape); } - if (eraseit) + if (eraseit) { body_map.erase(E); + } } locked = false; } void Area2D::_area_enter_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -231,13 +217,11 @@ void Area2D::_area_enter_tree(ObjectID p_id) { E->get().in_tree = true; emit_signal(SceneStringNames::get_singleton()->area_entered, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->area_shape_entered, p_id, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape); } } void Area2D::_area_exit_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -247,13 +231,11 @@ void Area2D::_area_exit_tree(ObjectID p_id) { E->get().in_tree = false; emit_signal(SceneStringNames::get_singleton()->area_exited, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->area_shape_exited, p_id, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape); } } void Area2D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, int p_area_shape, int p_self_shape) { - bool area_in = p_status == PhysicsServer2D::AREA_BODY_ADDED; ObjectID objid = p_instance; @@ -269,7 +251,6 @@ void Area2D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i if (area_in) { if (!E) { - E = area_map.insert(objid, AreaState()); E->get().rc = 0; E->get().in_tree = node && node->is_inside_tree(); @@ -282,29 +263,30 @@ void Area2D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i } } E->get().rc++; - if (node) + if (node) { E->get().shapes.insert(AreaShapePair(p_area_shape, p_self_shape)); + } if (!node || E->get().in_tree) { emit_signal(SceneStringNames::get_singleton()->area_shape_entered, objid, node, p_area_shape, p_self_shape); } } else { - E->get().rc--; - if (node) + if (node) { E->get().shapes.erase(AreaShapePair(p_area_shape, p_self_shape)); + } bool eraseit = false; if (E->get().rc == 0) { - if (node) { node->disconnect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &Area2D::_area_enter_tree)); node->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Area2D::_area_exit_tree)); - if (E->get().in_tree) + if (E->get().in_tree) { emit_signal(SceneStringNames::get_singleton()->area_exited, obj); + } } eraseit = true; @@ -313,15 +295,15 @@ void Area2D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i emit_signal(SceneStringNames::get_singleton()->area_shape_exited, objid, obj, p_area_shape, p_self_shape); } - if (eraseit) + if (eraseit) { area_map.erase(E); + } } locked = false; } void Area2D::_clear_monitoring() { - ERR_FAIL_COND_MSG(locked, "This function can't be used during the in/out signal."); { @@ -330,21 +312,21 @@ void Area2D::_clear_monitoring() { //disconnect all monitored stuff for (Map<ObjectID, BodyState>::Element *E = bmcopy.front(); E; E = E->next()) { - Object *obj = ObjectDB::get_instance(E->key()); Node *node = Object::cast_to<Node>(obj); - if (!node) //node may have been deleted in previous frame or at other legitimate point + if (!node) { //node may have been deleted in previous frame or at other legitimate point continue; + } node->disconnect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &Area2D::_body_enter_tree)); node->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Area2D::_body_exit_tree)); - if (!E->get().in_tree) + if (!E->get().in_tree) { continue; + } for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->key(), node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape); } @@ -353,27 +335,26 @@ void Area2D::_clear_monitoring() { } { - Map<ObjectID, AreaState> bmcopy = area_map; area_map.clear(); //disconnect all monitored stuff for (Map<ObjectID, AreaState>::Element *E = bmcopy.front(); E; E = E->next()) { - Object *obj = ObjectDB::get_instance(E->key()); Node *node = Object::cast_to<Node>(obj); - if (!node) //node may have been deleted in previous frame or at other legitimate point + if (!node) { //node may have been deleted in previous frame or at other legitimate point continue; + } node->disconnect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &Area2D::_area_enter_tree)); node->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Area2D::_area_exit_tree)); - if (!E->get().in_tree) + if (!E->get().in_tree) { continue; + } for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->area_shape_exited, E->key(), node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape); } @@ -383,26 +364,22 @@ void Area2D::_clear_monitoring() { } void Area2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_EXIT_TREE: { - _clear_monitoring(); } break; } } void Area2D::set_monitoring(bool p_enable) { - - if (p_enable == monitoring) + if (p_enable == monitoring) { return; + } ERR_FAIL_COND_MSG(locked, "Function blocked during in/out signal. Use set_deferred(\"monitoring\", true/false)."); monitoring = p_enable; if (monitoring) { - PhysicsServer2D::get_singleton()->area_set_monitor_callback(get_rid(), this, SceneStringNames::get_singleton()->_body_inout); PhysicsServer2D::get_singleton()->area_set_area_monitor_callback(get_rid(), this, SceneStringNames::get_singleton()->_area_inout); @@ -414,16 +391,15 @@ void Area2D::set_monitoring(bool p_enable) { } bool Area2D::is_monitoring() const { - return monitoring; } void Area2D::set_monitorable(bool p_enable) { - ERR_FAIL_COND_MSG(locked || (is_inside_tree() && PhysicsServer2D::get_singleton()->is_flushing_queries()), "Function blocked during in/out signal. Use set_deferred(\"monitorable\", true/false)."); - if (p_enable == monitorable) + if (p_enable == monitorable) { return; + } monitorable = p_enable; @@ -431,12 +407,10 @@ void Area2D::set_monitorable(bool p_enable) { } bool Area2D::is_monitorable() const { - return monitorable; } TypedArray<Node2D> Area2D::get_overlapping_bodies() const { - ERR_FAIL_COND_V_MSG(!monitoring, Array(), "Can't find overlapping bodies when monitoring is off."); TypedArray<Node2D> ret; ret.resize(body_map.size()); @@ -454,7 +428,6 @@ TypedArray<Node2D> Area2D::get_overlapping_bodies() const { } TypedArray<Area2D> Area2D::get_overlapping_areas() const { - ERR_FAIL_COND_V_MSG(!monitoring, Array(), "Can't find overlapping bodies when monitoring is off."); TypedArray<Area2D> ret; ret.resize(area_map.size()); @@ -472,92 +445,82 @@ TypedArray<Area2D> Area2D::get_overlapping_areas() const { } bool Area2D::overlaps_area(Node *p_area) const { - ERR_FAIL_NULL_V(p_area, false); const Map<ObjectID, AreaState>::Element *E = area_map.find(p_area->get_instance_id()); - if (!E) + if (!E) { return false; + } return E->get().in_tree; } bool Area2D::overlaps_body(Node *p_body) const { - ERR_FAIL_NULL_V(p_body, false); const Map<ObjectID, BodyState>::Element *E = body_map.find(p_body->get_instance_id()); - if (!E) + if (!E) { return false; + } return E->get().in_tree; } void Area2D::set_collision_mask(uint32_t p_mask) { - collision_mask = p_mask; PhysicsServer2D::get_singleton()->area_set_collision_mask(get_rid(), p_mask); } uint32_t Area2D::get_collision_mask() const { - return collision_mask; } void Area2D::set_collision_layer(uint32_t p_layer) { - collision_layer = p_layer; PhysicsServer2D::get_singleton()->area_set_collision_layer(get_rid(), p_layer); } uint32_t Area2D::get_collision_layer() const { - return collision_layer; } void Area2D::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } bool Area2D::get_collision_mask_bit(int p_bit) const { - return get_collision_mask() & (1 << p_bit); } void Area2D::set_collision_layer_bit(int p_bit, bool p_value) { - uint32_t layer = get_collision_layer(); - if (p_value) + if (p_value) { layer |= 1 << p_bit; - else + } else { layer &= ~(1 << p_bit); + } set_collision_layer(layer); } bool Area2D::get_collision_layer_bit(int p_bit) const { - return get_collision_layer() & (1 << p_bit); } void Area2D::set_audio_bus_override(bool p_override) { - audio_bus_override = p_override; } bool Area2D::is_overriding_audio_bus() const { - return audio_bus_override; } void Area2D::set_audio_bus_name(const StringName &p_audio_bus) { - audio_bus = p_audio_bus; } StringName Area2D::get_audio_bus_name() const { - for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { if (AudioServer::get_singleton()->get_bus_name(i) == audio_bus) { return audio_bus; @@ -567,13 +530,12 @@ StringName Area2D::get_audio_bus_name() const { } void Area2D::_validate_property(PropertyInfo &property) const { - if (property.name == "audio_bus_name") { - String options; for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { - if (i > 0) + if (i > 0) { options += ","; + } String name = AudioServer::get_singleton()->get_bus_name(i); options += name; } @@ -677,7 +639,6 @@ void Area2D::_bind_methods() { Area2D::Area2D() : CollisionObject2D(PhysicsServer2D::get_singleton()->area_create(), true) { - space_override = SPACE_OVERRIDE_DISABLED; set_gravity(98); set_gravity_vector(Vector2(0, 1)); diff --git a/scene/2d/area_2d.h b/scene/2d/area_2d.h index 0e2c0ac672..0d0293dd12 100644 --- a/scene/2d/area_2d.h +++ b/scene/2d/area_2d.h @@ -35,7 +35,6 @@ #include "scene/2d/collision_object_2d.h" class Area2D : public CollisionObject2D { - GDCLASS(Area2D, CollisionObject2D); public: @@ -68,14 +67,14 @@ private: void _body_exit_tree(ObjectID p_id); struct ShapePair { - int body_shape; int area_shape; bool operator<(const ShapePair &p_sp) const { - if (body_shape == p_sp.body_shape) + if (body_shape == p_sp.body_shape) { return area_shape < p_sp.area_shape; - else + } else { return body_shape < p_sp.body_shape; + } } ShapePair() {} @@ -86,7 +85,6 @@ private: }; struct BodyState { - int rc; bool in_tree; VSet<ShapePair> shapes; @@ -100,14 +98,14 @@ private: void _area_exit_tree(ObjectID p_id); struct AreaShapePair { - int area_shape; int self_shape; bool operator<(const AreaShapePair &p_sp) const { - if (area_shape == p_sp.area_shape) + if (area_shape == p_sp.area_shape) { return self_shape < p_sp.self_shape; - else + } else { return area_shape < p_sp.area_shape; + } } AreaShapePair() {} @@ -118,7 +116,6 @@ private: }; struct AreaState { - int rc; bool in_tree; VSet<AreaShapePair> shapes; diff --git a/scene/2d/audio_stream_player_2d.cpp b/scene/2d/audio_stream_player_2d.cpp index 55d111439a..5b89ac15b1 100644 --- a/scene/2d/audio_stream_player_2d.cpp +++ b/scene/2d/audio_stream_player_2d.cpp @@ -35,7 +35,6 @@ #include "scene/main/window.h" void AudioStreamPlayer2D::_mix_audio() { - if (!stream_playback.is_valid() || !active || (stream_paused && !stream_paused_fade_out)) { return; @@ -59,7 +58,6 @@ void AudioStreamPlayer2D::_mix_audio() { //write all outputs for (int i = 0; i < output_count; i++) { - Output current = outputs[i]; //see if current output exists, to keep volume ramp @@ -92,13 +90,13 @@ void AudioStreamPlayer2D::_mix_audio() { int cc = AudioServer::get_singleton()->get_channel_count(); if (cc == 1) { - if (!AudioServer::get_singleton()->thread_has_channel_mix_buffer(current.bus_index, 0)) + if (!AudioServer::get_singleton()->thread_has_channel_mix_buffer(current.bus_index, 0)) { continue; //may have been removed + } AudioFrame *target = AudioServer::get_singleton()->thread_get_channel_mix_buffer(current.bus_index, 0); for (int j = 0; j < buffer_size; j++) { - target[j] += buffer[j] * vol; vol += vol_inc; } @@ -116,11 +114,11 @@ void AudioStreamPlayer2D::_mix_audio() { targets[k] = AudioServer::get_singleton()->thread_get_channel_mix_buffer(current.bus_index, k); } - if (!valid) + if (!valid) { continue; + } for (int j = 0; j < buffer_size; j++) { - AudioFrame frame = buffer[j] * vol; for (int k = 0; k < cc; k++) { targets[k][j] += frame; @@ -145,9 +143,7 @@ void AudioStreamPlayer2D::_mix_audio() { } void AudioStreamPlayer2D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - AudioServer::get_singleton()->add_callback(_mix_audios, this); if (autoplay && !Engine::get_singleton()->is_editor_hint()) { play(); @@ -155,7 +151,6 @@ void AudioStreamPlayer2D::_notification(int p_what) { } if (p_what == NOTIFICATION_EXIT_TREE) { - AudioServer::get_singleton()->remove_callback(_mix_audios, this); } @@ -171,7 +166,6 @@ void AudioStreamPlayer2D::_notification(int p_what) { } if (p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS) { - //update anything related to position first, if possible of course if (!output_ready) { @@ -194,13 +188,14 @@ void AudioStreamPlayer2D::_notification(int p_what) { int areas = space_state->intersect_point(global_pos, sr, MAX_INTERSECT_AREAS, Set<RID>(), area_mask, false, true); for (int i = 0; i < areas; i++) { - Area2D *area2d = Object::cast_to<Area2D>(sr[i].collider); - if (!area2d) + if (!area2d) { continue; + } - if (!area2d->is_overriding_audio_bus()) + if (!area2d->is_overriding_audio_bus()) { continue; + } StringName bus_name = area2d->get_audio_bus_name(); bus_index = AudioServer::get_singleton()->thread_find_bus_index(bus_name); @@ -209,10 +204,8 @@ void AudioStreamPlayer2D::_notification(int p_what) { world_2d->get_viewport_list(&viewports); for (List<Viewport *>::Element *E = viewports.front(); E; E = E->next()) { - Viewport *vp = E->get(); if (vp->is_audio_listener_2d()) { - //compute matrix to convert to screen Transform2D to_screen = vp->get_global_canvas_transform() * vp->get_canvas_transform(); Vector2 screen_size = vp->get_visible_rect().size; @@ -222,8 +215,9 @@ void AudioStreamPlayer2D::_notification(int p_what) { float dist = global_pos.distance_to(screen_in_global); //distance to screen center - if (dist > max_distance) + if (dist > max_distance) { continue; //can't hear this sound in this viewport + } float multiplier = Math::pow(1.0f - dist / max_distance, attenuation); multiplier *= Math::db2linear(volume_db); //also apply player volume! @@ -240,8 +234,9 @@ void AudioStreamPlayer2D::_notification(int p_what) { outputs[new_output_count].bus_index = bus_index; outputs[new_output_count].viewport = vp; //keep pointer only for reference new_output_count++; - if (new_output_count == MAX_OUTPUTS) + if (new_output_count == MAX_OUTPUTS) { break; + } } } @@ -269,7 +264,6 @@ void AudioStreamPlayer2D::_notification(int p_what) { } void AudioStreamPlayer2D::set_stream(Ref<AudioStream> p_stream) { - AudioServer::get_singleton()->lock(); mix_buffer.resize(AudioServer::get_singleton()->thread_get_mix_buffer_size()); @@ -294,16 +288,14 @@ void AudioStreamPlayer2D::set_stream(Ref<AudioStream> p_stream) { } Ref<AudioStream> AudioStreamPlayer2D::get_stream() const { - return stream; } void AudioStreamPlayer2D::set_volume_db(float p_volume) { - volume_db = p_volume; } -float AudioStreamPlayer2D::get_volume_db() const { +float AudioStreamPlayer2D::get_volume_db() const { return volume_db; } @@ -311,12 +303,12 @@ void AudioStreamPlayer2D::set_pitch_scale(float p_pitch_scale) { ERR_FAIL_COND(p_pitch_scale <= 0.0); pitch_scale = p_pitch_scale; } + float AudioStreamPlayer2D::get_pitch_scale() const { return pitch_scale; } void AudioStreamPlayer2D::play(float p_from_pos) { - if (!is_playing()) { // Reset the prev_output_count if the stream is stopped prev_output_count = 0; @@ -331,14 +323,12 @@ void AudioStreamPlayer2D::play(float p_from_pos) { } void AudioStreamPlayer2D::seek(float p_seconds) { - if (stream_playback.is_valid()) { setseek = p_seconds; } } void AudioStreamPlayer2D::stop() { - if (stream_playback.is_valid()) { active = false; set_physics_process_internal(false); @@ -347,7 +337,6 @@ void AudioStreamPlayer2D::stop() { } bool AudioStreamPlayer2D::is_playing() const { - if (stream_playback.is_valid()) { return active; // && stream_playback->is_playing(); } @@ -356,7 +345,6 @@ bool AudioStreamPlayer2D::is_playing() const { } float AudioStreamPlayer2D::get_playback_position() { - if (stream_playback.is_valid()) { return stream_playback->get_playback_position(); } @@ -365,14 +353,13 @@ float AudioStreamPlayer2D::get_playback_position() { } void AudioStreamPlayer2D::set_bus(const StringName &p_bus) { - //if audio is active, must lock this AudioServer::get_singleton()->lock(); bus = p_bus; AudioServer::get_singleton()->unlock(); } -StringName AudioStreamPlayer2D::get_bus() const { +StringName AudioStreamPlayer2D::get_bus() const { for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { if (AudioServer::get_singleton()->get_bus_name(i) == bus) { return bus; @@ -382,34 +369,32 @@ StringName AudioStreamPlayer2D::get_bus() const { } void AudioStreamPlayer2D::set_autoplay(bool p_enable) { - autoplay = p_enable; } -bool AudioStreamPlayer2D::is_autoplay_enabled() { +bool AudioStreamPlayer2D::is_autoplay_enabled() { return autoplay; } void AudioStreamPlayer2D::_set_playing(bool p_enable) { - - if (p_enable) + if (p_enable) { play(); - else + } else { stop(); + } } -bool AudioStreamPlayer2D::_is_active() const { +bool AudioStreamPlayer2D::_is_active() const { return active; } void AudioStreamPlayer2D::_validate_property(PropertyInfo &property) const { - if (property.name == "bus") { - String options; for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { - if (i > 0) + if (i > 0) { options += ","; + } String name = AudioServer::get_singleton()->get_bus_name(i); options += name; } @@ -419,42 +404,35 @@ void AudioStreamPlayer2D::_validate_property(PropertyInfo &property) const { } void AudioStreamPlayer2D::_bus_layout_changed() { - _change_notify(); } void AudioStreamPlayer2D::set_max_distance(float p_pixels) { - ERR_FAIL_COND(p_pixels <= 0.0); max_distance = p_pixels; } float AudioStreamPlayer2D::get_max_distance() const { - return max_distance; } void AudioStreamPlayer2D::set_attenuation(float p_curve) { - attenuation = p_curve; } -float AudioStreamPlayer2D::get_attenuation() const { +float AudioStreamPlayer2D::get_attenuation() const { return attenuation; } void AudioStreamPlayer2D::set_area_mask(uint32_t p_mask) { - area_mask = p_mask; } uint32_t AudioStreamPlayer2D::get_area_mask() const { - return area_mask; } void AudioStreamPlayer2D::set_stream_paused(bool p_pause) { - if (p_pause != stream_paused) { stream_paused = p_pause; stream_paused_fade_in = !p_pause; @@ -463,7 +441,6 @@ void AudioStreamPlayer2D::set_stream_paused(bool p_pause) { } bool AudioStreamPlayer2D::get_stream_paused() const { - return stream_paused; } @@ -472,7 +449,6 @@ Ref<AudioStreamPlayback> AudioStreamPlayer2D::get_stream_playback() { } void AudioStreamPlayer2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_stream", "stream"), &AudioStreamPlayer2D::set_stream); ClassDB::bind_method(D_METHOD("get_stream"), &AudioStreamPlayer2D::get_stream); @@ -527,7 +503,6 @@ void AudioStreamPlayer2D::_bind_methods() { } AudioStreamPlayer2D::AudioStreamPlayer2D() { - volume_db = 0; pitch_scale = 1.0; autoplay = false; diff --git a/scene/2d/audio_stream_player_2d.h b/scene/2d/audio_stream_player_2d.h index 86e931b3c6..7f0b6f5897 100644 --- a/scene/2d/audio_stream_player_2d.h +++ b/scene/2d/audio_stream_player_2d.h @@ -36,7 +36,6 @@ #include "servers/audio_server.h" class AudioStreamPlayer2D : public Node2D { - GDCLASS(AudioStreamPlayer2D, Node2D); private: @@ -47,7 +46,6 @@ private: }; struct Output { - AudioFrame vol; int bus_index; Viewport *viewport; //pointer only used for reference to previous mix diff --git a/scene/2d/back_buffer_copy.cpp b/scene/2d/back_buffer_copy.cpp index 4c952b7ca6..a36e0a86e1 100644 --- a/scene/2d/back_buffer_copy.cpp +++ b/scene/2d/back_buffer_copy.cpp @@ -31,19 +31,14 @@ #include "back_buffer_copy.h" void BackBufferCopy::_update_copy_mode() { - switch (copy_mode) { - case COPY_MODE_DISABLED: { - RS::get_singleton()->canvas_item_set_copy_to_backbuffer(get_canvas_item(), false, Rect2()); } break; case COPY_MODE_RECT: { - RS::get_singleton()->canvas_item_set_copy_to_backbuffer(get_canvas_item(), true, rect); } break; case COPY_MODE_VIEWPORT: { - RS::get_singleton()->canvas_item_set_copy_to_backbuffer(get_canvas_item(), true, Rect2()); } break; @@ -52,7 +47,6 @@ void BackBufferCopy::_update_copy_mode() { #ifdef TOOLS_ENABLED Rect2 BackBufferCopy::_edit_get_rect() const { - return rect; } @@ -62,12 +56,10 @@ bool BackBufferCopy::_edit_use_rect() const { #endif Rect2 BackBufferCopy::get_anchorable_rect() const { - return rect; } void BackBufferCopy::set_rect(const Rect2 &p_rect) { - rect = p_rect; _update_copy_mode(); } @@ -77,17 +69,15 @@ Rect2 BackBufferCopy::get_rect() const { } void BackBufferCopy::set_copy_mode(CopyMode p_mode) { - copy_mode = p_mode; _update_copy_mode(); } -BackBufferCopy::CopyMode BackBufferCopy::get_copy_mode() const { +BackBufferCopy::CopyMode BackBufferCopy::get_copy_mode() const { return copy_mode; } void BackBufferCopy::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_rect", "rect"), &BackBufferCopy::set_rect); ClassDB::bind_method(D_METHOD("get_rect"), &BackBufferCopy::get_rect); @@ -103,10 +93,10 @@ void BackBufferCopy::_bind_methods() { } BackBufferCopy::BackBufferCopy() { - rect = Rect2(-100, -100, 200, 200); copy_mode = COPY_MODE_RECT; _update_copy_mode(); } + BackBufferCopy::~BackBufferCopy() { } diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index d8af14a3fb..8f69676da4 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -36,20 +36,20 @@ #include "servers/rendering_server.h" void Camera2D::_update_scroll() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (Engine::get_singleton()->is_editor_hint()) { update(); //will just be drawn return; } - if (!viewport) + if (!viewport) { return; + } if (current) { - ERR_FAIL_COND(custom_viewport && !ObjectDB::get_instance(custom_viewport_id)); Transform2D xform = get_camera_transform(); @@ -64,7 +64,6 @@ void Camera2D::_update_scroll() { } void Camera2D::_update_process_mode() { - if (Engine::get_singleton()->is_editor_hint()) { set_process_internal(false); set_physics_process_internal(false); @@ -78,7 +77,6 @@ void Camera2D::_update_process_mode() { } void Camera2D::set_zoom(const Vector2 &p_zoom) { - zoom = p_zoom; Point2 old_smoothed_camera_pos = smoothed_camera_pos; _update_scroll(); @@ -86,14 +84,13 @@ void Camera2D::set_zoom(const Vector2 &p_zoom) { }; Vector2 Camera2D::get_zoom() const { - return zoom; }; Transform2D Camera2D::get_camera_transform() { - - if (!get_tree()) + if (!get_tree()) { return Transform2D(); + } ERR_FAIL_COND_V(custom_viewport && !ObjectDB::get_instance(custom_viewport_id), Transform2D()); @@ -103,14 +100,11 @@ Transform2D Camera2D::get_camera_transform() { Point2 ret_camera_pos; if (!first) { - if (anchor_mode == ANCHOR_MODE_DRAG_CENTER) { - if (h_drag_enabled && !Engine::get_singleton()->is_editor_hint() && !h_offset_changed) { camera_pos.x = MIN(camera_pos.x, (new_camera_pos.x + screen_size.x * 0.5 * zoom.x * drag_margin[MARGIN_LEFT])); camera_pos.x = MAX(camera_pos.x, (new_camera_pos.x - screen_size.x * 0.5 * zoom.x * drag_margin[MARGIN_RIGHT])); } else { - if (h_ofs < 0) { camera_pos.x = new_camera_pos.x + screen_size.x * 0.5 * drag_margin[MARGIN_RIGHT] * h_ofs; } else { @@ -121,12 +115,10 @@ Transform2D Camera2D::get_camera_transform() { } if (v_drag_enabled && !Engine::get_singleton()->is_editor_hint() && !v_offset_changed) { - camera_pos.y = MIN(camera_pos.y, (new_camera_pos.y + screen_size.y * 0.5 * zoom.y * drag_margin[MARGIN_TOP])); camera_pos.y = MAX(camera_pos.y, (new_camera_pos.y - screen_size.y * 0.5 * zoom.y * drag_margin[MARGIN_BOTTOM])); } else { - if (v_ofs < 0) { camera_pos.y = new_camera_pos.y + screen_size.y * 0.5 * drag_margin[MARGIN_BOTTOM] * v_ofs; } else { @@ -137,7 +129,6 @@ Transform2D Camera2D::get_camera_transform() { } } else if (anchor_mode == ANCHOR_MODE_FIXED_TOP_LEFT) { - camera_pos = new_camera_pos; } @@ -145,27 +136,29 @@ Transform2D Camera2D::get_camera_transform() { Rect2 screen_rect(-screen_offset + camera_pos, screen_size * zoom); if (limit_smoothing_enabled) { - if (screen_rect.position.x < limit[MARGIN_LEFT]) + if (screen_rect.position.x < limit[MARGIN_LEFT]) { camera_pos.x -= screen_rect.position.x - limit[MARGIN_LEFT]; + } - if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) + if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) { camera_pos.x -= screen_rect.position.x + screen_rect.size.x - limit[MARGIN_RIGHT]; + } - if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) + if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) { camera_pos.y -= screen_rect.position.y + screen_rect.size.y - limit[MARGIN_BOTTOM]; + } - if (screen_rect.position.y < limit[MARGIN_TOP]) + if (screen_rect.position.y < limit[MARGIN_TOP]) { camera_pos.y -= screen_rect.position.y - limit[MARGIN_TOP]; + } } if (smoothing_enabled && !Engine::get_singleton()->is_editor_hint()) { - float c = smoothing * (process_mode == CAMERA2D_PROCESS_PHYSICS ? get_physics_process_delta_time() : get_process_delta_time()); smoothed_camera_pos = ((camera_pos - smoothed_camera_pos) * c) + smoothed_camera_pos; ret_camera_pos = smoothed_camera_pos; //camera_pos=camera_pos*(1.0-smoothing)+new_camera_pos*smoothing; } else { - ret_camera_pos = smoothed_camera_pos = camera_pos; } @@ -182,20 +175,25 @@ Transform2D Camera2D::get_camera_transform() { } Rect2 screen_rect(-screen_offset + ret_camera_pos, screen_size * zoom); - if (screen_rect.position.x < limit[MARGIN_LEFT]) + if (screen_rect.position.x < limit[MARGIN_LEFT]) { screen_rect.position.x = limit[MARGIN_LEFT]; + } - if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) + if (screen_rect.position.x + screen_rect.size.x > limit[MARGIN_RIGHT]) { screen_rect.position.x = limit[MARGIN_RIGHT] - screen_rect.size.x; + } - if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) + if (screen_rect.position.y + screen_rect.size.y > limit[MARGIN_BOTTOM]) { screen_rect.position.y = limit[MARGIN_BOTTOM] - screen_rect.size.y; + } - if (screen_rect.position.y < limit[MARGIN_TOP]) + if (screen_rect.position.y < limit[MARGIN_TOP]) { screen_rect.position.y = limit[MARGIN_TOP]; + } - if (offset != Vector2()) + if (offset != Vector2()) { screen_rect.position += offset; + } camera_screen_center = screen_rect.position + screen_rect.size * 0.5; @@ -218,23 +216,19 @@ Transform2D Camera2D::get_camera_transform() { } void Camera2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_INTERNAL_PROCESS: case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { - _update_scroll(); } break; case NOTIFICATION_TRANSFORM_CHANGED: { - - if (!is_processing_internal() && !is_physics_processing_internal()) + if (!is_processing_internal() && !is_physics_processing_internal()) { _update_scroll(); + } } break; case NOTIFICATION_ENTER_TREE: { - if (custom_viewport && ObjectDB::get_instance(custom_viewport_id)) { viewport = custom_viewport; } else { @@ -256,7 +250,6 @@ void Camera2D::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { - if (is_current()) { if (viewport && !(custom_viewport && !ObjectDB::get_instance(custom_viewport_id))) { viewport->set_canvas_transform(Transform2D()); @@ -268,9 +261,9 @@ void Camera2D::_notification(int p_what) { } break; case NOTIFICATION_DRAW: { - - if (!is_inside_tree() || !Engine::get_singleton()->is_editor_hint()) + if (!is_inside_tree() || !Engine::get_singleton()->is_editor_hint()) { break; + } if (screen_drawing_enabled) { Color area_axis_color(0.5, 0.42, 0.87, 0.63); @@ -349,56 +342,47 @@ void Camera2D::_notification(int p_what) { } void Camera2D::set_offset(const Vector2 &p_offset) { - offset = p_offset; _update_scroll(); } Vector2 Camera2D::get_offset() const { - return offset; } void Camera2D::set_anchor_mode(AnchorMode p_anchor_mode) { - anchor_mode = p_anchor_mode; _update_scroll(); } Camera2D::AnchorMode Camera2D::get_anchor_mode() const { - return anchor_mode; } void Camera2D::set_rotating(bool p_rotating) { - rotating = p_rotating; _update_scroll(); } bool Camera2D::is_rotating() const { - return rotating; } void Camera2D::set_process_mode(Camera2DProcessMode p_mode) { - - if (process_mode == p_mode) + if (process_mode == p_mode) { return; + } process_mode = p_mode; _update_process_mode(); } Camera2D::Camera2DProcessMode Camera2D::get_process_mode() const { - return process_mode; } void Camera2D::_make_current(Object *p_which) { - if (p_which == this) { - current = true; } else { current = false; @@ -406,21 +390,19 @@ void Camera2D::_make_current(Object *p_which) { } void Camera2D::_set_current(bool p_current) { - - if (p_current) + if (p_current) { make_current(); + } current = p_current; update(); } bool Camera2D::is_current() const { - return current; } void Camera2D::make_current() { - if (!is_inside_tree()) { current = true; } else { @@ -430,7 +412,6 @@ void Camera2D::make_current() { } void Camera2D::clear_current() { - current = false; if (is_inside_tree()) { get_tree()->call_group_flags(SceneTree::GROUP_CALL_REALTIME, group_name, "_make_current", (Object *)nullptr); @@ -438,60 +419,50 @@ void Camera2D::clear_current() { } void Camera2D::set_limit(Margin p_margin, int p_limit) { - ERR_FAIL_INDEX((int)p_margin, 4); limit[p_margin] = p_limit; update(); } int Camera2D::get_limit(Margin p_margin) const { - ERR_FAIL_INDEX_V((int)p_margin, 4, 0); return limit[p_margin]; } void Camera2D::set_limit_smoothing_enabled(bool enable) { - limit_smoothing_enabled = enable; _update_scroll(); } bool Camera2D::is_limit_smoothing_enabled() const { - return limit_smoothing_enabled; } void Camera2D::set_drag_margin(Margin p_margin, float p_drag_margin) { - ERR_FAIL_INDEX((int)p_margin, 4); drag_margin[p_margin] = p_drag_margin; update(); } float Camera2D::get_drag_margin(Margin p_margin) const { - ERR_FAIL_INDEX_V((int)p_margin, 4, 0); return drag_margin[p_margin]; } Vector2 Camera2D::get_camera_position() const { - return camera_pos; } void Camera2D::force_update_scroll() { - _update_scroll(); } void Camera2D::reset_smoothing() { - smoothed_camera_pos = camera_pos; _update_scroll(); } void Camera2D::align() { - ERR_FAIL_COND(custom_viewport && !ObjectDB::get_instance(custom_viewport_id)); Size2 screen_size = viewport->get_visible_rect().size; @@ -509,7 +480,6 @@ void Camera2D::align() { camera_pos.y = current_camera_pos.y + screen_size.y * 0.5 * drag_margin[MARGIN_BOTTOM] * v_ofs; } } else if (anchor_mode == ANCHOR_MODE_FIXED_TOP_LEFT) { - camera_pos = current_camera_pos; } @@ -517,64 +487,55 @@ void Camera2D::align() { } void Camera2D::set_follow_smoothing(float p_speed) { - smoothing = p_speed; - if (smoothing > 0 && !(is_inside_tree() && Engine::get_singleton()->is_editor_hint())) + if (smoothing > 0 && !(is_inside_tree() && Engine::get_singleton()->is_editor_hint())) { set_process_internal(true); - else + } else { set_process_internal(false); + } } float Camera2D::get_follow_smoothing() const { - return smoothing; } Point2 Camera2D::get_camera_screen_center() const { - return camera_screen_center; } void Camera2D::set_h_drag_enabled(bool p_enabled) { - h_drag_enabled = p_enabled; } bool Camera2D::is_h_drag_enabled() const { - return h_drag_enabled; } void Camera2D::set_v_drag_enabled(bool p_enabled) { - v_drag_enabled = p_enabled; } bool Camera2D::is_v_drag_enabled() const { - return v_drag_enabled; } void Camera2D::set_v_offset(float p_offset) { - v_ofs = p_offset; v_offset_changed = true; _update_scroll(); } float Camera2D::get_v_offset() const { - return v_ofs; } void Camera2D::set_h_offset(float p_offset) { - h_ofs = p_offset; h_offset_changed = true; _update_scroll(); } -float Camera2D::get_h_offset() const { +float Camera2D::get_h_offset() const { return h_ofs; } @@ -587,12 +548,10 @@ void Camera2D::_set_old_smoothing(float p_enable) { } void Camera2D::set_enable_follow_smoothing(bool p_enabled) { - smoothing_enabled = p_enabled; } bool Camera2D::is_follow_smoothing_enabled() const { - return smoothing_enabled; } @@ -612,11 +571,11 @@ void Camera2D::set_custom_viewport(Node *p_viewport) { } if (is_inside_tree()) { - - if (custom_viewport) + if (custom_viewport) { viewport = custom_viewport; - else + } else { viewport = get_viewport(); + } RID vp = viewport->get_viewport_rid(); group_name = "__cameras_" + itos(vp.get_id()); @@ -627,7 +586,6 @@ void Camera2D::set_custom_viewport(Node *p_viewport) { } Node *Camera2D::get_custom_viewport() const { - return custom_viewport; } @@ -659,7 +617,6 @@ bool Camera2D::is_margin_drawing_enabled() const { } void Camera2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_offset", "offset"), &Camera2D::set_offset); ClassDB::bind_method(D_METHOD("get_offset"), &Camera2D::get_offset); @@ -777,7 +734,6 @@ void Camera2D::_bind_methods() { } Camera2D::Camera2D() { - anchor_mode = ANCHOR_MODE_DRAG_CENTER; rotating = false; current = false; diff --git a/scene/2d/camera_2d.h b/scene/2d/camera_2d.h index 7a106ef79a..0a4e269c40 100644 --- a/scene/2d/camera_2d.h +++ b/scene/2d/camera_2d.h @@ -35,7 +35,6 @@ #include "scene/main/window.h" class Camera2D : public Node2D { - GDCLASS(Camera2D, Node2D); public: diff --git a/scene/2d/canvas_modulate.cpp b/scene/2d/canvas_modulate.cpp index 05f8804e2a..56643542a8 100644 --- a/scene/2d/canvas_modulate.cpp +++ b/scene/2d/canvas_modulate.cpp @@ -31,22 +31,18 @@ #include "canvas_modulate.h" void CanvasModulate::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_CANVAS) { - if (is_visible_in_tree()) { RS::get_singleton()->canvas_set_modulate(get_canvas(), color); add_to_group("_canvas_modulate_" + itos(get_canvas().get_id())); } } else if (p_what == NOTIFICATION_EXIT_CANVAS) { - if (is_visible_in_tree()) { RS::get_singleton()->canvas_set_modulate(get_canvas(), Color(1, 1, 1, 1)); remove_from_group("_canvas_modulate_" + itos(get_canvas().get_id())); } } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (is_visible_in_tree()) { RS::get_singleton()->canvas_set_modulate(get_canvas(), color); add_to_group("_canvas_modulate_" + itos(get_canvas().get_id())); @@ -60,7 +56,6 @@ void CanvasModulate::_notification(int p_what) { } void CanvasModulate::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_color", "color"), &CanvasModulate::set_color); ClassDB::bind_method(D_METHOD("get_color"), &CanvasModulate::get_color); @@ -68,21 +63,20 @@ void CanvasModulate::_bind_methods() { } void CanvasModulate::set_color(const Color &p_color) { - color = p_color; if (is_visible_in_tree()) { RS::get_singleton()->canvas_set_modulate(get_canvas(), color); } } -Color CanvasModulate::get_color() const { +Color CanvasModulate::get_color() const { return color; } String CanvasModulate::get_configuration_warning() const { - - if (!is_visible_in_tree() || !is_inside_tree()) + if (!is_visible_in_tree() || !is_inside_tree()) { return String(); + } List<Node *> nodes; get_tree()->get_nodes_in_group("_canvas_modulate_" + itos(get_canvas().get_id()), &nodes); diff --git a/scene/2d/canvas_modulate.h b/scene/2d/canvas_modulate.h index ada6e27760..a0b61f43ba 100644 --- a/scene/2d/canvas_modulate.h +++ b/scene/2d/canvas_modulate.h @@ -34,7 +34,6 @@ #include "scene/2d/node_2d.h" class CanvasModulate : public Node2D { - GDCLASS(CanvasModulate, Node2D); Color color; diff --git a/scene/2d/collision_object_2d.cpp b/scene/2d/collision_object_2d.cpp index d82f4a2f2b..fe16d4089a 100644 --- a/scene/2d/collision_object_2d.cpp +++ b/scene/2d/collision_object_2d.cpp @@ -34,23 +34,22 @@ #include "servers/physics_server_2d.h" void CollisionObject2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - Transform2D global_transform = get_global_transform(); - if (area) + if (area) { PhysicsServer2D::get_singleton()->area_set_transform(rid, global_transform); - else + } else { PhysicsServer2D::get_singleton()->body_set_state(rid, PhysicsServer2D::BODY_STATE_TRANSFORM, global_transform); + } RID space = get_world_2d()->get_space(); if (area) { PhysicsServer2D::get_singleton()->area_set_space(rid, space); - } else + } else { PhysicsServer2D::get_singleton()->body_set_space(rid, space); + } _update_pickable(); @@ -58,52 +57,50 @@ void CollisionObject2D::_notification(int p_what) { } break; case NOTIFICATION_ENTER_CANVAS: { - - if (area) + if (area) { PhysicsServer2D::get_singleton()->area_attach_canvas_instance_id(rid, get_canvas_layer_instance_id()); - else + } else { PhysicsServer2D::get_singleton()->body_attach_canvas_instance_id(rid, get_canvas_layer_instance_id()); + } } break; case NOTIFICATION_VISIBILITY_CHANGED: { - _update_pickable(); } break; case NOTIFICATION_TRANSFORM_CHANGED: { - if (only_update_transform_changes) { return; } Transform2D global_transform = get_global_transform(); - if (area) + if (area) { PhysicsServer2D::get_singleton()->area_set_transform(rid, global_transform); - else + } else { PhysicsServer2D::get_singleton()->body_set_state(rid, PhysicsServer2D::BODY_STATE_TRANSFORM, global_transform); + } } break; case NOTIFICATION_EXIT_TREE: { - if (area) { PhysicsServer2D::get_singleton()->area_set_space(rid, RID()); - } else + } else { PhysicsServer2D::get_singleton()->body_set_space(rid, RID()); + } } break; case NOTIFICATION_EXIT_CANVAS: { - - if (area) + if (area) { PhysicsServer2D::get_singleton()->area_attach_canvas_instance_id(rid, ObjectID()); - else + } else { PhysicsServer2D::get_singleton()->body_attach_canvas_instance_id(rid, ObjectID()); + } } break; } } uint32_t CollisionObject2D::create_shape_owner(Object *p_owner) { - ShapeData sd; uint32_t id; @@ -121,7 +118,6 @@ uint32_t CollisionObject2D::create_shape_owner(Object *p_owner) { } void CollisionObject2D::remove_shape_owner(uint32_t owner) { - ERR_FAIL_COND(!shapes.has(owner)); shape_owner_clear_shapes(owner); @@ -144,16 +140,15 @@ void CollisionObject2D::shape_owner_set_disabled(uint32_t p_owner, bool p_disabl } bool CollisionObject2D::is_shape_owner_disabled(uint32_t p_owner) const { - ERR_FAIL_COND_V(!shapes.has(p_owner), false); return shapes[p_owner].disabled; } void CollisionObject2D::shape_owner_set_one_way_collision(uint32_t p_owner, bool p_enable) { - - if (area) + if (area) { return; //not for areas + } ERR_FAIL_COND(!shapes.has(p_owner)); @@ -165,16 +160,15 @@ void CollisionObject2D::shape_owner_set_one_way_collision(uint32_t p_owner, bool } bool CollisionObject2D::is_shape_owner_one_way_collision_enabled(uint32_t p_owner) const { - ERR_FAIL_COND_V(!shapes.has(p_owner), false); return shapes[p_owner].one_way_collision; } void CollisionObject2D::shape_owner_set_one_way_collision_margin(uint32_t p_owner, float p_margin) { - - if (area) + if (area) { return; //not for areas + } ERR_FAIL_COND(!shapes.has(p_owner)); @@ -186,21 +180,18 @@ void CollisionObject2D::shape_owner_set_one_way_collision_margin(uint32_t p_owne } float CollisionObject2D::get_shape_owner_one_way_collision_margin(uint32_t p_owner) const { - ERR_FAIL_COND_V(!shapes.has(p_owner), 0); return shapes[p_owner].one_way_collision_margin; } void CollisionObject2D::get_shape_owners(List<uint32_t> *r_owners) { - for (Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { r_owners->push_back(E->key()); } } Array CollisionObject2D::_get_shape_owners() { - Array ret; for (Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { ret.push_back(E->key()); @@ -210,7 +201,6 @@ Array CollisionObject2D::_get_shape_owners() { } void CollisionObject2D::shape_owner_set_transform(uint32_t p_owner, const Transform2D &p_transform) { - ERR_FAIL_COND(!shapes.has(p_owner)); ShapeData &sd = shapes[p_owner]; @@ -224,22 +214,20 @@ void CollisionObject2D::shape_owner_set_transform(uint32_t p_owner, const Transf } } } -Transform2D CollisionObject2D::shape_owner_get_transform(uint32_t p_owner) const { +Transform2D CollisionObject2D::shape_owner_get_transform(uint32_t p_owner) const { ERR_FAIL_COND_V(!shapes.has(p_owner), Transform2D()); return shapes[p_owner].xform; } Object *CollisionObject2D::shape_owner_get_owner(uint32_t p_owner) const { - ERR_FAIL_COND_V(!shapes.has(p_owner), nullptr); return shapes[p_owner].owner; } void CollisionObject2D::shape_owner_add_shape(uint32_t p_owner, const Ref<Shape2D> &p_shape) { - ERR_FAIL_COND(!shapes.has(p_owner)); ERR_FAIL_COND(p_shape.is_null()); @@ -256,21 +244,21 @@ void CollisionObject2D::shape_owner_add_shape(uint32_t p_owner, const Ref<Shape2 total_subshapes++; } -int CollisionObject2D::shape_owner_get_shape_count(uint32_t p_owner) const { +int CollisionObject2D::shape_owner_get_shape_count(uint32_t p_owner) const { ERR_FAIL_COND_V(!shapes.has(p_owner), 0); return shapes[p_owner].shapes.size(); } -Ref<Shape2D> CollisionObject2D::shape_owner_get_shape(uint32_t p_owner, int p_shape) const { +Ref<Shape2D> CollisionObject2D::shape_owner_get_shape(uint32_t p_owner, int p_shape) const { ERR_FAIL_COND_V(!shapes.has(p_owner), Ref<Shape2D>()); ERR_FAIL_INDEX_V(p_shape, shapes[p_owner].shapes.size(), Ref<Shape2D>()); return shapes[p_owner].shapes[p_shape].shape; } -int CollisionObject2D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const { +int CollisionObject2D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const { ERR_FAIL_COND_V(!shapes.has(p_owner), -1); ERR_FAIL_INDEX_V(p_shape, shapes[p_owner].shapes.size(), -1); @@ -278,7 +266,6 @@ int CollisionObject2D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape } void CollisionObject2D::shape_owner_remove_shape(uint32_t p_owner, int p_shape) { - ERR_FAIL_COND(!shapes.has(p_owner)); ERR_FAIL_INDEX(p_shape, shapes[p_owner].shapes.size()); @@ -303,7 +290,6 @@ void CollisionObject2D::shape_owner_remove_shape(uint32_t p_owner, int p_shape) } void CollisionObject2D::shape_owner_clear_shapes(uint32_t p_owner) { - ERR_FAIL_COND(!shapes.has(p_owner)); while (shape_owner_get_shape_count(p_owner) > 0) { @@ -312,7 +298,6 @@ void CollisionObject2D::shape_owner_clear_shapes(uint32_t p_owner) { } uint32_t CollisionObject2D::shape_find_owner(int p_shape_index) const { - ERR_FAIL_INDEX_V(p_shape_index, total_subshapes, 0); for (const Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { @@ -328,21 +313,19 @@ uint32_t CollisionObject2D::shape_find_owner(int p_shape_index) const { } void CollisionObject2D::set_pickable(bool p_enabled) { - - if (pickable == p_enabled) + if (pickable == p_enabled) { return; + } pickable = p_enabled; _update_pickable(); } bool CollisionObject2D::is_pickable() const { - return pickable; } void CollisionObject2D::_input_event(Node *p_viewport, const Ref<InputEvent> &p_input_event, int p_shape) { - if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_input_event, p_viewport, p_input_event, p_shape); } @@ -350,7 +333,6 @@ void CollisionObject2D::_input_event(Node *p_viewport, const Ref<InputEvent> &p_ } void CollisionObject2D::_mouse_enter() { - if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_mouse_enter); } @@ -358,7 +340,6 @@ void CollisionObject2D::_mouse_enter() { } void CollisionObject2D::_mouse_exit() { - if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_mouse_exit); } @@ -370,18 +351,19 @@ void CollisionObject2D::set_only_update_transform_changes(bool p_enable) { } void CollisionObject2D::_update_pickable() { - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } bool is_pickable = pickable && is_visible_in_tree(); - if (area) + if (area) { PhysicsServer2D::get_singleton()->area_set_pickable(rid, is_pickable); - else + } else { PhysicsServer2D::get_singleton()->body_set_pickable(rid, is_pickable); + } } String CollisionObject2D::get_configuration_warning() const { - String warning = Node2D::get_configuration_warning(); if (shapes.empty()) { @@ -395,7 +377,6 @@ String CollisionObject2D::get_configuration_warning() const { } void CollisionObject2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_rid"), &CollisionObject2D::get_rid); ClassDB::bind_method(D_METHOD("set_pickable", "enabled"), &CollisionObject2D::set_pickable); @@ -432,7 +413,6 @@ void CollisionObject2D::_bind_methods() { } CollisionObject2D::CollisionObject2D(RID p_rid, bool p_area) { - rid = p_rid; area = p_area; pickable = true; @@ -441,7 +421,6 @@ CollisionObject2D::CollisionObject2D(RID p_rid, bool p_area) { only_update_transform_changes = false; if (p_area) { - PhysicsServer2D::get_singleton()->area_attach_object_instance_id(rid, get_instance_id()); } else { PhysicsServer2D::get_singleton()->body_attach_object_instance_id(rid, get_instance_id()); @@ -449,13 +428,11 @@ CollisionObject2D::CollisionObject2D(RID p_rid, bool p_area) { } CollisionObject2D::CollisionObject2D() { - //owner= set_notify_transform(true); } CollisionObject2D::~CollisionObject2D() { - PhysicsServer2D::get_singleton()->free(rid); } diff --git a/scene/2d/collision_object_2d.h b/scene/2d/collision_object_2d.h index e931f20f40..d7af2f3a2a 100644 --- a/scene/2d/collision_object_2d.h +++ b/scene/2d/collision_object_2d.h @@ -35,7 +35,6 @@ #include "scene/resources/shape_2d.h" class CollisionObject2D : public Node2D { - GDCLASS(CollisionObject2D, Node2D); bool area; @@ -43,7 +42,6 @@ class CollisionObject2D : public Node2D { bool pickable; struct ShapeData { - Object *owner; Transform2D xform; struct Shape { diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp index 1e48b2d67f..4919ef8304 100644 --- a/scene/2d/collision_polygon_2d.cpp +++ b/scene/2d/collision_polygon_2d.cpp @@ -38,16 +38,15 @@ #include "thirdparty/misc/triangulator.h" void CollisionPolygon2D::_build_polygon() { - parent->shape_owner_clear_shapes(owner_id); - if (polygon.size() == 0) + if (polygon.size() == 0) { return; + } bool solids = build_mode == BUILD_SOLIDS; if (solids) { - //here comes the sun, lalalala //decompose concave into multiple convex polygons and add them Vector<Vector<Vector2>> decomp = _decompose_in_convex(); @@ -58,7 +57,6 @@ void CollisionPolygon2D::_build_polygon() { } } else { - Ref<ConcavePolygonShape2D> concave = memnew(ConcavePolygonShape2D); Vector<Vector2> segments; @@ -82,20 +80,18 @@ Vector<Vector<Vector2>> CollisionPolygon2D::_decompose_in_convex() { } void CollisionPolygon2D::_update_in_shape_owner(bool p_xform_only) { - parent->shape_owner_set_transform(owner_id, get_transform()); - if (p_xform_only) + if (p_xform_only) { return; + } parent->shape_owner_set_disabled(owner_id, disabled); parent->shape_owner_set_one_way_collision(owner_id, one_way_collision); parent->shape_owner_set_one_way_collision_margin(owner_id, one_way_collision_margin); } void CollisionPolygon2D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_PARENTED: { - parent = Object::cast_to<CollisionObject2D>(get_parent()); if (parent) { owner_id = parent->create_shape_owner(this); @@ -111,14 +107,12 @@ void CollisionPolygon2D::_notification(int p_what) { } break; case NOTIFICATION_ENTER_TREE: { - if (parent) { _update_in_shape_owner(); } } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (parent) { _update_in_shape_owner(true); } @@ -133,13 +127,11 @@ void CollisionPolygon2D::_notification(int p_what) { } break; case NOTIFICATION_DRAW: { - if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; } for (int i = 0; i < polygon.size(); i++) { - Vector2 p = polygon[i]; Vector2 n = polygon[(i + 1) % polygon.size()]; // draw line with width <= 1, so it does not scale with zoom and break pixel exact editing @@ -152,7 +144,6 @@ void CollisionPolygon2D::_notification(int p_what) { Color c(0.4, 0.9, 0.1); for (int i = 0; i < decomp.size(); i++) { - c.set_hsv(Math::fmod(c.get_h() + 0.738, 1), c.get_s(), c.get_v(), 0.5); draw_colored_polygon(decomp[i], c); } @@ -171,8 +162,9 @@ void CollisionPolygon2D::_notification(int p_what) { pts.push_back(line_to + (Vector2(Math_SQRT12 * tsize, 0))); pts.push_back(line_to + (Vector2(-Math_SQRT12 * tsize, 0))); Vector<Color> cols; - for (int i = 0; i < 3; i++) + for (int i = 0; i < 3; i++) { cols.push_back(dcol); + } draw_primitive(pts, cols, Vector<Vector2>()); //small arrow } @@ -181,18 +173,17 @@ void CollisionPolygon2D::_notification(int p_what) { } void CollisionPolygon2D::set_polygon(const Vector<Point2> &p_polygon) { - polygon = p_polygon; { for (int i = 0; i < polygon.size(); i++) { - if (i == 0) + if (i == 0) { aabb = Rect2(polygon[i], Size2()); - else + } else { aabb.expand_to(polygon[i]); + } } if (aabb == Rect2()) { - aabb = Rect2(-10, -10, 20, 20); } else { aabb.position -= aabb.size * 0.3; @@ -208,12 +199,10 @@ void CollisionPolygon2D::set_polygon(const Vector<Point2> &p_polygon) { } Vector<Point2> CollisionPolygon2D::get_polygon() const { - return polygon; } void CollisionPolygon2D::set_build_mode(BuildMode p_mode) { - ERR_FAIL_INDEX((int)p_mode, 2); build_mode = p_mode; if (parent) { @@ -222,13 +211,11 @@ void CollisionPolygon2D::set_build_mode(BuildMode p_mode) { } CollisionPolygon2D::BuildMode CollisionPolygon2D::get_build_mode() const { - return build_mode; } #ifdef TOOLS_ENABLED Rect2 CollisionPolygon2D::_edit_get_rect() const { - return aabb; } @@ -237,13 +224,11 @@ bool CollisionPolygon2D::_edit_use_rect() const { } bool CollisionPolygon2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - return Geometry::is_point_in_polygon(p_point, Variant(polygon)); } #endif String CollisionPolygon2D::get_configuration_warning() const { - if (!Object::cast_to<CollisionObject2D>(get_parent())) { return TTR("CollisionPolygon2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."); } @@ -276,7 +261,6 @@ void CollisionPolygon2D::set_one_way_collision(bool p_enable) { } bool CollisionPolygon2D::is_one_way_collision_enabled() const { - return one_way_collision; } @@ -290,8 +274,8 @@ void CollisionPolygon2D::set_one_way_collision_margin(float p_margin) { float CollisionPolygon2D::get_one_way_collision_margin() const { return one_way_collision_margin; } -void CollisionPolygon2D::_bind_methods() { +void CollisionPolygon2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_polygon", "polygon"), &CollisionPolygon2D::set_polygon); ClassDB::bind_method(D_METHOD("get_polygon"), &CollisionPolygon2D::get_polygon); @@ -315,7 +299,6 @@ void CollisionPolygon2D::_bind_methods() { } CollisionPolygon2D::CollisionPolygon2D() { - aabb = Rect2(-10, -10, 20, 20); build_mode = BUILD_SOLIDS; set_notify_local_transform(true); diff --git a/scene/2d/collision_polygon_2d.h b/scene/2d/collision_polygon_2d.h index 92a2758813..bf3e560a93 100644 --- a/scene/2d/collision_polygon_2d.h +++ b/scene/2d/collision_polygon_2d.h @@ -37,7 +37,6 @@ class CollisionObject2D; class CollisionPolygon2D : public Node2D { - GDCLASS(CollisionPolygon2D, Node2D); public: diff --git a/scene/2d/collision_shape_2d.cpp b/scene/2d/collision_shape_2d.cpp index b1dbc57c94..88d124536c 100644 --- a/scene/2d/collision_shape_2d.cpp +++ b/scene/2d/collision_shape_2d.cpp @@ -41,26 +41,22 @@ #include "scene/resources/segment_shape_2d.h" void CollisionShape2D::_shape_changed() { - update(); } void CollisionShape2D::_update_in_shape_owner(bool p_xform_only) { - parent->shape_owner_set_transform(owner_id, get_transform()); - if (p_xform_only) + if (p_xform_only) { return; + } parent->shape_owner_set_disabled(owner_id, disabled); parent->shape_owner_set_one_way_collision(owner_id, one_way_collision); parent->shape_owner_set_one_way_collision_margin(owner_id, one_way_collision_margin); } void CollisionShape2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_PARENTED: { - parent = Object::cast_to<CollisionObject2D>(get_parent()); if (parent) { owner_id = parent->create_shape_owner(this); @@ -78,14 +74,12 @@ void CollisionShape2D::_notification(int p_what) { } break; case NOTIFICATION_ENTER_TREE: { - if (parent) { _update_in_shape_owner(); } } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (parent) { _update_in_shape_owner(true); } @@ -100,7 +94,6 @@ void CollisionShape2D::_notification(int p_what) { } break; case NOTIFICATION_DRAW: { - if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; } @@ -137,8 +130,9 @@ void CollisionShape2D::_notification(int p_what) { pts.push_back(line_to + (Vector2(Math_SQRT12 * tsize, 0))); pts.push_back(line_to + (Vector2(-Math_SQRT12 * tsize, 0))); Vector<Color> cols; - for (int i = 0; i < 3; i++) + for (int i = 0; i < 3; i++) { cols.push_back(draw_col); + } draw_primitive(pts, cols, Vector<Vector2>()); } @@ -147,9 +141,9 @@ void CollisionShape2D::_notification(int p_what) { } void CollisionShape2D::set_shape(const Ref<Shape2D> &p_shape) { - - if (shape.is_valid()) + if (shape.is_valid()) { shape->disconnect("changed", callable_mp(this, &CollisionShape2D::_shape_changed)); + } shape = p_shape; update(); if (parent) { @@ -159,27 +153,26 @@ void CollisionShape2D::set_shape(const Ref<Shape2D> &p_shape) { } } - if (shape.is_valid()) + if (shape.is_valid()) { shape->connect("changed", callable_mp(this, &CollisionShape2D::_shape_changed)); + } update_configuration_warning(); } Ref<Shape2D> CollisionShape2D::get_shape() const { - return shape; } bool CollisionShape2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - - if (!shape.is_valid()) + if (!shape.is_valid()) { return false; + } return shape->_edit_is_selected_on_click(p_point, p_tolerance); } String CollisionShape2D::get_configuration_warning() const { - if (!Object::cast_to<CollisionObject2D>(get_parent())) { return TTR("CollisionShape2D only serves to provide a collision shape to a CollisionObject2D derived node. Please only use it as a child of Area2D, StaticBody2D, RigidBody2D, KinematicBody2D, etc. to give them a shape."); } @@ -212,7 +205,6 @@ void CollisionShape2D::set_one_way_collision(bool p_enable) { } bool CollisionShape2D::is_one_way_collision_enabled() const { - return one_way_collision; } @@ -228,7 +220,6 @@ float CollisionShape2D::get_one_way_collision_margin() const { } void CollisionShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_shape", "shape"), &CollisionShape2D::set_shape); ClassDB::bind_method(D_METHOD("get_shape"), &CollisionShape2D::get_shape); ClassDB::bind_method(D_METHOD("set_disabled", "disabled"), &CollisionShape2D::set_disabled); @@ -245,7 +236,6 @@ void CollisionShape2D::_bind_methods() { } CollisionShape2D::CollisionShape2D() { - rect = Rect2(-Point2(10, 10), Point2(20, 20)); set_notify_local_transform(true); owner_id = 0; diff --git a/scene/2d/collision_shape_2d.h b/scene/2d/collision_shape_2d.h index 80bea0a979..ec7808ee7c 100644 --- a/scene/2d/collision_shape_2d.h +++ b/scene/2d/collision_shape_2d.h @@ -37,7 +37,6 @@ class CollisionObject2D; class CollisionShape2D : public Node2D { - GDCLASS(CollisionShape2D, Node2D); Ref<Shape2D> shape; Rect2 rect; diff --git a/scene/2d/cpu_particles_2d.cpp b/scene/2d/cpu_particles_2d.cpp index c37cd398c4..526951976e 100644 --- a/scene/2d/cpu_particles_2d.cpp +++ b/scene/2d/cpu_particles_2d.cpp @@ -37,17 +37,17 @@ #include "servers/rendering_server.h" void CPUParticles2D::set_emitting(bool p_emitting) { - - if (emitting == p_emitting) + if (emitting == p_emitting) { return; + } emitting = p_emitting; - if (emitting) + if (emitting) { set_process_internal(true); + } } void CPUParticles2D::set_amount(int p_amount) { - ERR_FAIL_COND_MSG(p_amount < 1, "Amount of particles must be greater than 0."); particles.resize(p_amount); @@ -64,100 +64,90 @@ void CPUParticles2D::set_amount(int p_amount) { particle_order.resize(p_amount); } -void CPUParticles2D::set_lifetime(float p_lifetime) { +void CPUParticles2D::set_lifetime(float p_lifetime) { ERR_FAIL_COND_MSG(p_lifetime <= 0, "Particles lifetime must be greater than 0."); lifetime = p_lifetime; } void CPUParticles2D::set_one_shot(bool p_one_shot) { - one_shot = p_one_shot; } void CPUParticles2D::set_pre_process_time(float p_time) { - pre_process_time = p_time; } -void CPUParticles2D::set_explosiveness_ratio(float p_ratio) { +void CPUParticles2D::set_explosiveness_ratio(float p_ratio) { explosiveness_ratio = p_ratio; } -void CPUParticles2D::set_randomness_ratio(float p_ratio) { +void CPUParticles2D::set_randomness_ratio(float p_ratio) { randomness_ratio = p_ratio; } -void CPUParticles2D::set_lifetime_randomness(float p_random) { +void CPUParticles2D::set_lifetime_randomness(float p_random) { lifetime_randomness = p_random; } -void CPUParticles2D::set_use_local_coordinates(bool p_enable) { +void CPUParticles2D::set_use_local_coordinates(bool p_enable) { local_coords = p_enable; set_notify_transform(!p_enable); } void CPUParticles2D::set_speed_scale(float p_scale) { - speed_scale = p_scale; } bool CPUParticles2D::is_emitting() const { - return emitting; } -int CPUParticles2D::get_amount() const { +int CPUParticles2D::get_amount() const { return particles.size(); } -float CPUParticles2D::get_lifetime() const { +float CPUParticles2D::get_lifetime() const { return lifetime; } -bool CPUParticles2D::get_one_shot() const { +bool CPUParticles2D::get_one_shot() const { return one_shot; } float CPUParticles2D::get_pre_process_time() const { - return pre_process_time; } -float CPUParticles2D::get_explosiveness_ratio() const { +float CPUParticles2D::get_explosiveness_ratio() const { return explosiveness_ratio; } -float CPUParticles2D::get_randomness_ratio() const { +float CPUParticles2D::get_randomness_ratio() const { return randomness_ratio; } -float CPUParticles2D::get_lifetime_randomness() const { +float CPUParticles2D::get_lifetime_randomness() const { return lifetime_randomness; } bool CPUParticles2D::get_use_local_coordinates() const { - return local_coords; } float CPUParticles2D::get_speed_scale() const { - return speed_scale; } void CPUParticles2D::set_draw_order(DrawOrder p_order) { - draw_order = p_order; } CPUParticles2D::DrawOrder CPUParticles2D::get_draw_order() const { - return draw_order; } void CPUParticles2D::_update_mesh_texture() { - Size2 tex_size; if (texture.is_valid()) { tex_size = texture->get_size(); @@ -209,23 +199,25 @@ void CPUParticles2D::_update_mesh_texture() { } void CPUParticles2D::set_texture(const Ref<Texture2D> &p_texture) { - if (p_texture == texture) + if (p_texture == texture) { return; + } - if (texture.is_valid()) + if (texture.is_valid()) { texture->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &CPUParticles2D::_texture_changed)); + } texture = p_texture; - if (texture.is_valid()) + if (texture.is_valid()) { texture->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &CPUParticles2D::_texture_changed)); + } update(); _update_mesh_texture(); } void CPUParticles2D::_texture_changed() { - if (texture.is_valid()) { update(); _update_mesh_texture(); @@ -233,18 +225,15 @@ void CPUParticles2D::_texture_changed() { } Ref<Texture2D> CPUParticles2D::get_texture() const { - return texture; } void CPUParticles2D::set_normalmap(const Ref<Texture2D> &p_normalmap) { - normalmap = p_normalmap; update(); } Ref<Texture2D> CPUParticles2D::get_normalmap() const { - return normalmap; } @@ -265,7 +254,6 @@ bool CPUParticles2D::get_fractional_delta() const { } String CPUParticles2D::get_configuration_warning() const { - String warnings; CanvasItemMaterial *mat = Object::cast_to<CanvasItemMaterial>(get_material().ptr()); @@ -273,8 +261,9 @@ String CPUParticles2D::get_configuration_warning() const { if (get_material().is_null() || (mat && !mat->get_particles_animation())) { if (get_param(PARAM_ANIM_SPEED) != 0.0 || get_param(PARAM_ANIM_OFFSET) != 0.0 || get_param_curve(PARAM_ANIM_SPEED).is_valid() || get_param_curve(PARAM_ANIM_OFFSET).is_valid()) { - if (warnings != String()) + if (warnings != String()) { warnings += "\n"; + } warnings += "- " + TTR("CPUParticles2D animation requires the usage of a CanvasItemMaterial with \"Particles Animation\" enabled."); } } @@ -283,7 +272,6 @@ String CPUParticles2D::get_configuration_warning() const { } void CPUParticles2D::restart() { - time = 0; inactive_time = 0; frame_remainder = 0; @@ -303,62 +291,55 @@ void CPUParticles2D::restart() { } void CPUParticles2D::set_direction(Vector2 p_direction) { - direction = p_direction; } Vector2 CPUParticles2D::get_direction() const { - return direction; } void CPUParticles2D::set_spread(float p_spread) { - spread = p_spread; } float CPUParticles2D::get_spread() const { - return spread; } void CPUParticles2D::set_param(Parameter p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); parameters[p_param] = p_value; } -float CPUParticles2D::get_param(Parameter p_param) const { +float CPUParticles2D::get_param(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return parameters[p_param]; } void CPUParticles2D::set_param_randomness(Parameter p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); randomness[p_param] = p_value; } -float CPUParticles2D::get_param_randomness(Parameter p_param) const { +float CPUParticles2D::get_param_randomness(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return randomness[p_param]; } static void _adjust_curve_range(const Ref<Curve> &p_curve, float p_min, float p_max) { - Ref<Curve> curve = p_curve; - if (!curve.is_valid()) + if (!curve.is_valid()) { return; + } curve->ensure_default_setup(p_min, p_max); } void CPUParticles2D::set_param_curve(Parameter p_param, const Ref<Curve> &p_curve) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); curve_parameters[p_param] = p_curve; @@ -389,7 +370,6 @@ void CPUParticles2D::set_param_curve(Parameter p_param, const Ref<Curve> &p_curv _adjust_curve_range(p_curve, -360, 360); } break; case PARAM_SCALE: { - } break; case PARAM_HUE_VARIATION: { _adjust_curve_range(p_curve, -1, 1); @@ -403,30 +383,26 @@ void CPUParticles2D::set_param_curve(Parameter p_param, const Ref<Curve> &p_curv } } } -Ref<Curve> CPUParticles2D::get_param_curve(Parameter p_param) const { +Ref<Curve> CPUParticles2D::get_param_curve(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, Ref<Curve>()); return curve_parameters[p_param]; } void CPUParticles2D::set_color(const Color &p_color) { - color = p_color; } Color CPUParticles2D::get_color() const { - return color; } void CPUParticles2D::set_color_ramp(const Ref<Gradient> &p_ramp) { - color_ramp = p_ramp; } Ref<Gradient> CPUParticles2D::get_color_ramp() const { - return color_ramp; } @@ -447,67 +423,58 @@ void CPUParticles2D::set_emission_shape(EmissionShape p_shape) { } void CPUParticles2D::set_emission_sphere_radius(float p_radius) { - emission_sphere_radius = p_radius; } void CPUParticles2D::set_emission_rect_extents(Vector2 p_extents) { - emission_rect_extents = p_extents; } void CPUParticles2D::set_emission_points(const Vector<Vector2> &p_points) { - emission_points = p_points; } void CPUParticles2D::set_emission_normals(const Vector<Vector2> &p_normals) { - emission_normals = p_normals; } void CPUParticles2D::set_emission_colors(const Vector<Color> &p_colors) { - emission_colors = p_colors; } float CPUParticles2D::get_emission_sphere_radius() const { - return emission_sphere_radius; } -Vector2 CPUParticles2D::get_emission_rect_extents() const { +Vector2 CPUParticles2D::get_emission_rect_extents() const { return emission_rect_extents; } -Vector<Vector2> CPUParticles2D::get_emission_points() const { +Vector<Vector2> CPUParticles2D::get_emission_points() const { return emission_points; } -Vector<Vector2> CPUParticles2D::get_emission_normals() const { +Vector<Vector2> CPUParticles2D::get_emission_normals() const { return emission_normals; } Vector<Color> CPUParticles2D::get_emission_colors() const { - return emission_colors; } CPUParticles2D::EmissionShape CPUParticles2D::get_emission_shape() const { return emission_shape; } -void CPUParticles2D::set_gravity(const Vector2 &p_gravity) { +void CPUParticles2D::set_gravity(const Vector2 &p_gravity) { gravity = p_gravity; } Vector2 CPUParticles2D::get_gravity() const { - return gravity; } void CPUParticles2D::_validate_property(PropertyInfo &property) const { - if (property.name == "color" && color_ramp.is_valid()) { property.usage = 0; } @@ -538,7 +505,6 @@ void CPUParticles2D::_validate_property(PropertyInfo &property) const { } static uint32_t idhash(uint32_t x) { - x = ((x >> uint32_t(16)) ^ x) * uint32_t(0x45d9f3b); x = ((x >> uint32_t(16)) ^ x) * uint32_t(0x45d9f3b); x = (x >> uint32_t(16)) ^ x; @@ -548,18 +514,19 @@ static uint32_t idhash(uint32_t x) { static float rand_from_seed(uint32_t &seed) { int k; int s = int(seed); - if (s == 0) + if (s == 0) { s = 305420679; + } k = s / 127773; s = 16807 * (s - k * 127773) - 2836 * k; - if (s < 0) + if (s < 0) { s += 2147483647; + } seed = uint32_t(s); return float(seed % uint32_t(65536)) / 65535.0; } void CPUParticles2D::_update_internal() { - if (particles.size() == 0 || !is_visible_in_tree()) { _set_redraw(false); return; @@ -585,12 +552,12 @@ void CPUParticles2D::_update_internal() { _set_redraw(true); if (time == 0 && pre_process_time > 0.0) { - float frame_time; - if (fixed_fps > 0) + if (fixed_fps > 0) { frame_time = 1.0 / fixed_fps; - else + } else { frame_time = 1.0 / 30.0; + } float todo = pre_process_time; @@ -627,7 +594,6 @@ void CPUParticles2D::_update_internal() { } void CPUParticles2D::_particles_process(float p_delta) { - p_delta *= speed_scale; int pcount = particles.size(); @@ -657,11 +623,11 @@ void CPUParticles2D::_particles_process(float p_delta) { float system_phase = time / lifetime; for (int i = 0; i < pcount; i++) { - Particle &p = parray[i]; - if (!emitting && !p.active) + if (!emitting && !p.active) { continue; + } float local_delta = p_delta; @@ -715,7 +681,6 @@ void CPUParticles2D::_particles_process(float p_delta) { } if (restart) { - if (!emitting) { p.active = false; continue; @@ -774,10 +739,10 @@ void CPUParticles2D::_particles_process(float p_delta) { } break; case EMISSION_SHAPE_POINTS: case EMISSION_SHAPE_DIRECTED_POINTS: { - int pc = emission_points.size(); - if (pc == 0) + if (pc == 0) { break; + } int random_idx = Math::rand() % pc; @@ -806,7 +771,6 @@ void CPUParticles2D::_particles_process(float p_delta) { } else if (p.time > p.lifetime) { p.active = false; } else { - uint32_t alt_seed = p.seed; p.time += local_delta; @@ -890,7 +854,6 @@ void CPUParticles2D::_particles_process(float p_delta) { } if (parameters[PARAM_DAMPING] + tex_damping > 0.0) { - float v = p.velocity.length(); float damp = (parameters[PARAM_DAMPING] + tex_damping) * Math::lerp(1.0f, rand_from_seed(alt_seed), randomness[PARAM_DAMPING]); v -= damp * local_delta; @@ -949,7 +912,6 @@ void CPUParticles2D::_particles_process(float p_delta) { if (flags[FLAG_ALIGN_Y_TO_VELOCITY]) { if (p.velocity.length() > 0.0) { - p.transform.elements[1] = p.velocity.normalized(); p.transform.elements[0] = p.transform.elements[1].tangent(); } @@ -961,8 +923,9 @@ void CPUParticles2D::_particles_process(float p_delta) { //scale by scale float base_scale = tex_scale * Math::lerp(parameters[PARAM_SCALE], 1.0f, p.scale_rand * randomness[PARAM_SCALE]); - if (base_scale < 0.000001) + if (base_scale < 0.000001) { base_scale = 0.000001; + } p.transform.elements[0] *= base_scale; p.transform.elements[1] *= base_scale; @@ -998,7 +961,6 @@ void CPUParticles2D::_update_particle_data_buffer() { } for (int i = 0; i < pc; i++) { - int idx = order ? order[i] : i; Transform2D t = r[idx].transform; @@ -1008,7 +970,6 @@ void CPUParticles2D::_update_particle_data_buffer() { } if (r[idx].active) { - ptr[0] = t.elements[0][0]; ptr[1] = t.elements[1][0]; ptr[2] = 0; @@ -1039,8 +1000,9 @@ void CPUParticles2D::_update_particle_data_buffer() { } void CPUParticles2D::_set_redraw(bool p_redraw) { - if (redraw == p_redraw) + if (redraw == p_redraw) { return; + } redraw = p_redraw; { @@ -1065,14 +1027,12 @@ void CPUParticles2D::_set_redraw(bool p_redraw) { } void CPUParticles2D::_update_render_thread() { - MutexLock lock(update_mutex); RS::get_singleton()->multimesh_set_buffer(multimesh, particle_data); } void CPUParticles2D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { set_process_internal(emitting); } @@ -1083,11 +1043,13 @@ void CPUParticles2D::_notification(int p_what) { if (p_what == NOTIFICATION_DRAW) { // first update before rendering to avoid one frame delay after emitting starts - if (emitting && (time == 0)) + if (emitting && (time == 0)) { _update_internal(); + } - if (!redraw) + if (!redraw) { return; // don't add to render list + } RID texrid; if (texture.is_valid()) { @@ -1107,11 +1069,9 @@ void CPUParticles2D::_notification(int p_what) { } if (p_what == NOTIFICATION_TRANSFORM_CHANGED) { - inv_emission_transform = get_global_transform().affine_inverse(); if (!local_coords) { - int pc = particles.size(); float *w = particle_data.ptrw(); @@ -1119,11 +1079,9 @@ void CPUParticles2D::_notification(int p_what) { float *ptr = w; for (int i = 0; i < pc; i++) { - Transform2D t = inv_emission_transform * r[i].transform; if (r[i].active) { - ptr[0] = t.elements[0][0]; ptr[1] = t.elements[1][0]; ptr[2] = 0; @@ -1144,7 +1102,6 @@ void CPUParticles2D::_notification(int p_what) { } void CPUParticles2D::convert_from_particles(Node *p_particles) { - GPUParticles2D *particles = Object::cast_to<GPUParticles2D>(p_particles); ERR_FAIL_COND_MSG(!particles, "Only GPUParticles2D nodes can be converted to CPUParticles2D."); @@ -1168,8 +1125,9 @@ void CPUParticles2D::convert_from_particles(Node *p_particles) { } Ref<ParticlesMaterial> material = particles->get_process_material(); - if (material.is_null()) + if (material.is_null()) { return; + } Vector3 dir = material->get_direction(); set_direction(Vector2(dir.x, dir.y)); @@ -1219,7 +1177,6 @@ void CPUParticles2D::convert_from_particles(Node *p_particles) { } void CPUParticles2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_emitting", "emitting"), &CPUParticles2D::set_emitting); ClassDB::bind_method(D_METHOD("set_amount", "amount"), &CPUParticles2D::set_amount); ClassDB::bind_method(D_METHOD("set_lifetime", "secs"), &CPUParticles2D::set_lifetime); @@ -1422,7 +1379,6 @@ void CPUParticles2D::_bind_methods() { } CPUParticles2D::CPUParticles2D() { - time = 0; inactive_time = 0; frame_remainder = 0; diff --git a/scene/2d/cpu_particles_2d.h b/scene/2d/cpu_particles_2d.h index 18d0caceed..747f06b90d 100644 --- a/scene/2d/cpu_particles_2d.h +++ b/scene/2d/cpu_particles_2d.h @@ -124,7 +124,6 @@ private: const Particle *particles; Vector2 axis; bool operator()(int p_a, int p_b) const { - return axis.dot(particles[p_a].transform[2]) < axis.dot(particles[p_b].transform[2]); } }; diff --git a/scene/2d/gpu_particles_2d.cpp b/scene/2d/gpu_particles_2d.cpp index de3f8fa09e..0814fbb549 100644 --- a/scene/2d/gpu_particles_2d.cpp +++ b/scene/2d/gpu_particles_2d.cpp @@ -39,7 +39,6 @@ #endif void GPUParticles2D::set_emitting(bool p_emitting) { - RS::get_singleton()->particles_set_emitting(particles, p_emitting); if (p_emitting && one_shot) { @@ -50,50 +49,49 @@ void GPUParticles2D::set_emitting(bool p_emitting) { } void GPUParticles2D::set_amount(int p_amount) { - ERR_FAIL_COND_MSG(p_amount < 1, "Amount of particles cannot be smaller than 1."); amount = p_amount; RS::get_singleton()->particles_set_amount(particles, amount); } -void GPUParticles2D::set_lifetime(float p_lifetime) { +void GPUParticles2D::set_lifetime(float p_lifetime) { ERR_FAIL_COND_MSG(p_lifetime <= 0, "Particles lifetime must be greater than 0."); lifetime = p_lifetime; RS::get_singleton()->particles_set_lifetime(particles, lifetime); } void GPUParticles2D::set_one_shot(bool p_enable) { - one_shot = p_enable; RS::get_singleton()->particles_set_one_shot(particles, one_shot); if (is_emitting()) { - set_process_internal(true); - if (!one_shot) + if (!one_shot) { RenderingServer::get_singleton()->particles_restart(particles); + } } - if (!one_shot) + if (!one_shot) { set_process_internal(false); + } } -void GPUParticles2D::set_pre_process_time(float p_time) { +void GPUParticles2D::set_pre_process_time(float p_time) { pre_process_time = p_time; RS::get_singleton()->particles_set_pre_process_time(particles, pre_process_time); } -void GPUParticles2D::set_explosiveness_ratio(float p_ratio) { +void GPUParticles2D::set_explosiveness_ratio(float p_ratio) { explosiveness_ratio = p_ratio; RS::get_singleton()->particles_set_explosiveness_ratio(particles, explosiveness_ratio); } -void GPUParticles2D::set_randomness_ratio(float p_ratio) { +void GPUParticles2D::set_randomness_ratio(float p_ratio) { randomness_ratio = p_ratio; RS::get_singleton()->particles_set_randomness_ratio(particles, randomness_ratio); } -void GPUParticles2D::set_visibility_rect(const Rect2 &p_visibility_rect) { +void GPUParticles2D::set_visibility_rect(const Rect2 &p_visibility_rect) { visibility_rect = p_visibility_rect; AABB aabb; aabb.position.x = p_visibility_rect.position.x; @@ -106,8 +104,8 @@ void GPUParticles2D::set_visibility_rect(const Rect2 &p_visibility_rect) { _change_notify("visibility_rect"); update(); } -void GPUParticles2D::set_use_local_coordinates(bool p_enable) { +void GPUParticles2D::set_use_local_coordinates(bool p_enable) { local_coords = p_enable; RS::get_singleton()->particles_set_use_local_coordinates(particles, local_coords); set_notify_transform(!p_enable); @@ -117,7 +115,6 @@ void GPUParticles2D::set_use_local_coordinates(bool p_enable) { } void GPUParticles2D::_update_particle_emission_transform() { - Transform2D xf2d = get_global_transform(); Transform xf; xf.basis.set_axis(0, Vector3(xf2d.get_axis(0).x, xf2d.get_axis(0).y, 0)); @@ -128,7 +125,6 @@ void GPUParticles2D::_update_particle_emission_transform() { } void GPUParticles2D::set_process_material(const Ref<Material> &p_material) { - process_material = p_material; Ref<ParticlesMaterial> pm = p_material; if (pm.is_valid() && !pm->get_flag(ParticlesMaterial::FLAG_DISABLE_Z) && pm->get_gravity() == Vector3(0, -9.8, 0)) { @@ -137,74 +133,69 @@ void GPUParticles2D::set_process_material(const Ref<Material> &p_material) { pm->set_gravity(Vector3(0, 98, 0)); } RID material_rid; - if (process_material.is_valid()) + if (process_material.is_valid()) { material_rid = process_material->get_rid(); + } RS::get_singleton()->particles_set_process_material(particles, material_rid); update_configuration_warning(); } void GPUParticles2D::set_speed_scale(float p_scale) { - speed_scale = p_scale; RS::get_singleton()->particles_set_speed_scale(particles, p_scale); } bool GPUParticles2D::is_emitting() const { - return RS::get_singleton()->particles_get_emitting(particles); } -int GPUParticles2D::get_amount() const { +int GPUParticles2D::get_amount() const { return amount; } -float GPUParticles2D::get_lifetime() const { +float GPUParticles2D::get_lifetime() const { return lifetime; } bool GPUParticles2D::get_one_shot() const { - return one_shot; } -float GPUParticles2D::get_pre_process_time() const { +float GPUParticles2D::get_pre_process_time() const { return pre_process_time; } -float GPUParticles2D::get_explosiveness_ratio() const { +float GPUParticles2D::get_explosiveness_ratio() const { return explosiveness_ratio; } -float GPUParticles2D::get_randomness_ratio() const { +float GPUParticles2D::get_randomness_ratio() const { return randomness_ratio; } -Rect2 GPUParticles2D::get_visibility_rect() const { +Rect2 GPUParticles2D::get_visibility_rect() const { return visibility_rect; } -bool GPUParticles2D::get_use_local_coordinates() const { +bool GPUParticles2D::get_use_local_coordinates() const { return local_coords; } -Ref<Material> GPUParticles2D::get_process_material() const { +Ref<Material> GPUParticles2D::get_process_material() const { return process_material; } float GPUParticles2D::get_speed_scale() const { - return speed_scale; } void GPUParticles2D::set_draw_order(DrawOrder p_order) { - draw_order = p_order; RS::get_singleton()->particles_set_draw_order(particles, RS::ParticlesDrawOrder(p_order)); } GPUParticles2D::DrawOrder GPUParticles2D::get_draw_order() const { - return draw_order; } @@ -227,7 +218,6 @@ bool GPUParticles2D::get_fractional_delta() const { } String GPUParticles2D::get_configuration_warning() const { - if (RenderingServer::get_singleton()->is_low_end()) { return TTR("GPU-based particles are not supported by the GLES2 video driver.\nUse the CPUParticles2D node instead. You can use the \"Convert to CPUParticles2D\" option for this purpose."); } @@ -235,11 +225,11 @@ String GPUParticles2D::get_configuration_warning() const { String warnings; if (process_material.is_null()) { - if (warnings != String()) + if (warnings != String()) { warnings += "\n"; + } warnings += "- " + TTR("A material to process the particles is not assigned, so no behavior is imprinted."); } else { - CanvasItemMaterial *mat = Object::cast_to<CanvasItemMaterial>(get_material().ptr()); if (get_material().is_null() || (mat && !mat->get_particles_animation())) { @@ -247,8 +237,9 @@ String GPUParticles2D::get_configuration_warning() const { if (process && (process->get_param(ParticlesMaterial::PARAM_ANIM_SPEED) != 0.0 || process->get_param(ParticlesMaterial::PARAM_ANIM_OFFSET) != 0.0 || process->get_param_texture(ParticlesMaterial::PARAM_ANIM_SPEED).is_valid() || process->get_param_texture(ParticlesMaterial::PARAM_ANIM_OFFSET).is_valid())) { - if (warnings != String()) + if (warnings != String()) { warnings += "\n"; + } warnings += "- " + TTR("Particles2D animation requires the usage of a CanvasItemMaterial with \"Particles Animation\" enabled."); } } @@ -258,7 +249,6 @@ String GPUParticles2D::get_configuration_warning() const { } Rect2 GPUParticles2D::capture_rect() const { - AABB aabb = RS::get_singleton()->particles_get_current_aabb(particles); Rect2 r; r.position.x = aabb.position.x; @@ -278,7 +268,6 @@ Ref<Texture2D> GPUParticles2D::get_texture() const { } void GPUParticles2D::set_normal_map(const Ref<Texture2D> &p_normal_map) { - normal_map = p_normal_map; update(); } @@ -296,21 +285,20 @@ void GPUParticles2D::restart() { } void GPUParticles2D::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - RID texture_rid; - if (texture.is_valid()) + if (texture.is_valid()) { texture_rid = texture->get_rid(); + } RID normal_rid; - if (normal_map.is_valid()) + if (normal_map.is_valid()) { normal_rid = normal_map->get_rid(); + } RS::get_singleton()->canvas_item_add_particles(get_canvas_item(), particles, texture_rid, normal_rid); #ifdef TOOLS_ENABLED if (Engine::get_singleton()->is_editor_hint() && (this == get_tree()->get_edited_scene_root() || get_tree()->get_edited_scene_root()->is_a_parent_of(this))) { - draw_rect(visibility_rect, Color(0, 0.7, 0.9, 0.4), false); } #endif @@ -320,7 +308,6 @@ void GPUParticles2D::_notification(int p_what) { if (can_process()) { RS::get_singleton()->particles_set_speed_scale(particles, speed_scale); } else { - RS::get_singleton()->particles_set_speed_scale(particles, 0); } } @@ -330,7 +317,6 @@ void GPUParticles2D::_notification(int p_what) { } if (p_what == NOTIFICATION_INTERNAL_PROCESS) { - if (one_shot && !is_emitting()) { _change_notify(); set_process_internal(false); @@ -339,7 +325,6 @@ void GPUParticles2D::_notification(int p_what) { } void GPUParticles2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_emitting", "emitting"), &GPUParticles2D::set_emitting); ClassDB::bind_method(D_METHOD("set_amount", "amount"), &GPUParticles2D::set_amount); ClassDB::bind_method(D_METHOD("set_lifetime", "secs"), &GPUParticles2D::set_lifetime); @@ -407,7 +392,6 @@ void GPUParticles2D::_bind_methods() { } GPUParticles2D::GPUParticles2D() { - particles = RS::get_singleton()->particles_create(); one_shot = false; // Needed so that set_emitting doesn't access uninitialized values @@ -427,6 +411,5 @@ GPUParticles2D::GPUParticles2D() { } GPUParticles2D::~GPUParticles2D() { - RS::get_singleton()->free(particles); } diff --git a/scene/2d/joints_2d.cpp b/scene/2d/joints_2d.cpp index 4d49f4762f..0d126b949d 100644 --- a/scene/2d/joints_2d.cpp +++ b/scene/2d/joints_2d.cpp @@ -35,10 +35,10 @@ #include "servers/physics_server_2d.h" void Joint2D::_update_joint(bool p_only_free) { - if (joint.is_valid()) { - if (ba.is_valid() && bb.is_valid() && exclude_from_collision) + if (ba.is_valid() && bb.is_valid() && exclude_from_collision) { PhysicsServer2D::get_singleton()->joint_disable_collisions_between_bodies(joint, false); + } PhysicsServer2D::get_singleton()->free(joint); joint = RID(); @@ -46,25 +46,29 @@ void Joint2D::_update_joint(bool p_only_free) { bb = RID(); } - if (p_only_free || !is_inside_tree()) + if (p_only_free || !is_inside_tree()) { return; + } Node *node_a = has_node(get_node_a()) ? get_node(get_node_a()) : (Node *)nullptr; Node *node_b = has_node(get_node_b()) ? get_node(get_node_b()) : (Node *)nullptr; - if (!node_a || !node_b) + if (!node_a || !node_b) { return; + } PhysicsBody2D *body_a = Object::cast_to<PhysicsBody2D>(node_a); PhysicsBody2D *body_b = Object::cast_to<PhysicsBody2D>(node_b); - if (!body_a || !body_b) + if (!body_a || !body_b) { return; + } joint = _configure_joint(body_a, body_b); - if (!joint.is_valid()) + if (!joint.is_valid()) { return; + } PhysicsServer2D::get_singleton()->get_singleton()->joint_set_param(joint, PhysicsServer2D::JOINT_PARAM_BIAS, bias); @@ -75,35 +79,32 @@ void Joint2D::_update_joint(bool p_only_free) { } void Joint2D::set_node_a(const NodePath &p_node_a) { - - if (a == p_node_a) + if (a == p_node_a) { return; + } a = p_node_a; _update_joint(); } NodePath Joint2D::get_node_a() const { - return a; } void Joint2D::set_node_b(const NodePath &p_node_b) { - - if (b == p_node_b) + if (b == p_node_b) { return; + } b = p_node_b; _update_joint(); } -NodePath Joint2D::get_node_b() const { +NodePath Joint2D::get_node_b() const { return b; } void Joint2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_READY: { _update_joint(); } break; @@ -116,21 +117,20 @@ void Joint2D::_notification(int p_what) { } void Joint2D::set_bias(real_t p_bias) { - bias = p_bias; - if (joint.is_valid()) + if (joint.is_valid()) { PhysicsServer2D::get_singleton()->get_singleton()->joint_set_param(joint, PhysicsServer2D::JOINT_PARAM_BIAS, bias); + } } real_t Joint2D::get_bias() const { - return bias; } void Joint2D::set_exclude_nodes_from_collision(bool p_enable) { - - if (exclude_from_collision == p_enable) + if (exclude_from_collision == p_enable) { return; + } _update_joint(true); exclude_from_collision = p_enable; @@ -138,12 +138,10 @@ void Joint2D::set_exclude_nodes_from_collision(bool p_enable) { } bool Joint2D::get_exclude_nodes_from_collision() const { - return exclude_from_collision; } void Joint2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_node_a", "node"), &Joint2D::set_node_a); ClassDB::bind_method(D_METHOD("get_node_a"), &Joint2D::get_node_a); @@ -163,7 +161,6 @@ void Joint2D::_bind_methods() { } Joint2D::Joint2D() { - bias = 0; exclude_from_collision = true; } @@ -173,12 +170,11 @@ Joint2D::Joint2D() { /////////////////////////////////////////////////////////////////////////////// void PinJoint2D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_DRAW: { - - if (!is_inside_tree()) + if (!is_inside_tree()) { break; + } if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; @@ -191,27 +187,24 @@ void PinJoint2D::_notification(int p_what) { } RID PinJoint2D::_configure_joint(PhysicsBody2D *body_a, PhysicsBody2D *body_b) { - RID pj = PhysicsServer2D::get_singleton()->pin_joint_create(get_global_transform().get_origin(), body_a->get_rid(), body_b ? body_b->get_rid() : RID()); PhysicsServer2D::get_singleton()->pin_joint_set_param(pj, PhysicsServer2D::PIN_JOINT_SOFTNESS, softness); return pj; } void PinJoint2D::set_softness(real_t p_softness) { - softness = p_softness; update(); - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer2D::get_singleton()->pin_joint_set_param(get_joint(), PhysicsServer2D::PIN_JOINT_SOFTNESS, p_softness); + } } real_t PinJoint2D::get_softness() const { - return softness; } void PinJoint2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_softness", "softness"), &PinJoint2D::set_softness); ClassDB::bind_method(D_METHOD("get_softness"), &PinJoint2D::get_softness); @@ -219,7 +212,6 @@ void PinJoint2D::_bind_methods() { } PinJoint2D::PinJoint2D() { - softness = 0; } @@ -228,11 +220,11 @@ PinJoint2D::PinJoint2D() { /////////////////////////////////////////////////////////////////////////////// void GrooveJoint2D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_DRAW: { - if (!is_inside_tree()) + if (!is_inside_tree()) { break; + } if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; @@ -247,7 +239,6 @@ void GrooveJoint2D::_notification(int p_what) { } RID GrooveJoint2D::_configure_joint(PhysicsBody2D *body_a, PhysicsBody2D *body_b) { - Transform2D gt = get_global_transform(); Vector2 groove_A1 = gt.get_origin(); Vector2 groove_A2 = gt.xform(Vector2(0, length)); @@ -257,29 +248,24 @@ RID GrooveJoint2D::_configure_joint(PhysicsBody2D *body_a, PhysicsBody2D *body_b } void GrooveJoint2D::set_length(real_t p_length) { - length = p_length; update(); } real_t GrooveJoint2D::get_length() const { - return length; } void GrooveJoint2D::set_initial_offset(real_t p_initial_offset) { - initial_offset = p_initial_offset; update(); } real_t GrooveJoint2D::get_initial_offset() const { - return initial_offset; } void GrooveJoint2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_length", "length"), &GrooveJoint2D::set_length); ClassDB::bind_method(D_METHOD("get_length"), &GrooveJoint2D::get_length); ClassDB::bind_method(D_METHOD("set_initial_offset", "offset"), &GrooveJoint2D::set_initial_offset); @@ -290,7 +276,6 @@ void GrooveJoint2D::_bind_methods() { } GrooveJoint2D::GrooveJoint2D() { - length = 50; initial_offset = 25; } @@ -300,12 +285,11 @@ GrooveJoint2D::GrooveJoint2D() { /////////////////////////////////////////////////////////////////////////////// void DampedSpringJoint2D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_DRAW: { - - if (!is_inside_tree()) + if (!is_inside_tree()) { break; + } if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; @@ -319,14 +303,14 @@ void DampedSpringJoint2D::_notification(int p_what) { } RID DampedSpringJoint2D::_configure_joint(PhysicsBody2D *body_a, PhysicsBody2D *body_b) { - Transform2D gt = get_global_transform(); Vector2 anchor_A = gt.get_origin(); Vector2 anchor_B = gt.xform(Vector2(0, length)); RID dsj = PhysicsServer2D::get_singleton()->damped_spring_joint_create(anchor_A, anchor_B, body_a->get_rid(), body_b->get_rid()); - if (rest_length) + if (rest_length) { PhysicsServer2D::get_singleton()->damped_string_joint_set_param(dsj, PhysicsServer2D::DAMPED_STRING_REST_LENGTH, rest_length); + } PhysicsServer2D::get_singleton()->damped_string_joint_set_param(dsj, PhysicsServer2D::DAMPED_STRING_STIFFNESS, stiffness); PhysicsServer2D::get_singleton()->damped_string_joint_set_param(dsj, PhysicsServer2D::DAMPED_STRING_DAMPING, damping); @@ -334,57 +318,51 @@ RID DampedSpringJoint2D::_configure_joint(PhysicsBody2D *body_a, PhysicsBody2D * } void DampedSpringJoint2D::set_length(real_t p_length) { - length = p_length; update(); } real_t DampedSpringJoint2D::get_length() const { - return length; } void DampedSpringJoint2D::set_rest_length(real_t p_rest_length) { - rest_length = p_rest_length; update(); - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer2D::get_singleton()->damped_string_joint_set_param(get_joint(), PhysicsServer2D::DAMPED_STRING_REST_LENGTH, p_rest_length ? p_rest_length : length); + } } real_t DampedSpringJoint2D::get_rest_length() const { - return rest_length; } void DampedSpringJoint2D::set_stiffness(real_t p_stiffness) { - stiffness = p_stiffness; update(); - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer2D::get_singleton()->damped_string_joint_set_param(get_joint(), PhysicsServer2D::DAMPED_STRING_STIFFNESS, p_stiffness); + } } real_t DampedSpringJoint2D::get_stiffness() const { - return stiffness; } void DampedSpringJoint2D::set_damping(real_t p_damping) { - damping = p_damping; update(); - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer2D::get_singleton()->damped_string_joint_set_param(get_joint(), PhysicsServer2D::DAMPED_STRING_DAMPING, p_damping); + } } real_t DampedSpringJoint2D::get_damping() const { - return damping; } void DampedSpringJoint2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_length", "length"), &DampedSpringJoint2D::set_length); ClassDB::bind_method(D_METHOD("get_length"), &DampedSpringJoint2D::get_length); ClassDB::bind_method(D_METHOD("set_rest_length", "rest_length"), &DampedSpringJoint2D::set_rest_length); @@ -401,7 +379,6 @@ void DampedSpringJoint2D::_bind_methods() { } DampedSpringJoint2D::DampedSpringJoint2D() { - length = 50; rest_length = 0; stiffness = 20; diff --git a/scene/2d/joints_2d.h b/scene/2d/joints_2d.h index f1750e56b6..9a3bea4407 100644 --- a/scene/2d/joints_2d.h +++ b/scene/2d/joints_2d.h @@ -36,7 +36,6 @@ class PhysicsBody2D; class Joint2D : public Node2D { - GDCLASS(Joint2D, Node2D); RID joint; @@ -74,7 +73,6 @@ public: }; class PinJoint2D : public Joint2D { - GDCLASS(PinJoint2D, Joint2D); real_t softness; @@ -92,7 +90,6 @@ public: }; class GrooveJoint2D : public Joint2D { - GDCLASS(GrooveJoint2D, Joint2D); real_t length; @@ -114,7 +111,6 @@ public: }; class DampedSpringJoint2D : public Joint2D { - GDCLASS(DampedSpringJoint2D, Joint2D); real_t stiffness; diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp index b3d54b81f8..1e7e9f6b6a 100644 --- a/scene/2d/light_2d.cpp +++ b/scene/2d/light_2d.cpp @@ -59,8 +59,9 @@ bool Light2D::_edit_use_pivot() const { } Rect2 Light2D::_edit_get_rect() const { - if (texture.is_null()) + if (texture.is_null()) { return Rect2(); + } Size2 s = texture->get_size() * _scale; return Rect2(texture_offset - s / 2.0, s); @@ -72,17 +73,18 @@ bool Light2D::_edit_use_rect() const { #endif Rect2 Light2D::get_anchorable_rect() const { - if (texture.is_null()) + if (texture.is_null()) { return Rect2(); + } Size2 s = texture->get_size() * _scale; return Rect2(texture_offset - s / 2.0, s); } void Light2D::_update_light_visibility() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } bool editor_ok = true; @@ -104,45 +106,39 @@ void Light2D::_update_light_visibility() { } void Light2D::set_enabled(bool p_enabled) { - enabled = p_enabled; _update_light_visibility(); } bool Light2D::is_enabled() const { - return enabled; } void Light2D::set_editor_only(bool p_editor_only) { - editor_only = p_editor_only; _update_light_visibility(); } bool Light2D::is_editor_only() const { - return editor_only; } void Light2D::set_texture(const Ref<Texture2D> &p_texture) { - texture = p_texture; - if (texture.is_valid()) + if (texture.is_valid()) { RS::get_singleton()->canvas_light_set_texture(canvas_light, texture->get_rid()); - else + } else { RS::get_singleton()->canvas_light_set_texture(canvas_light, RID()); + } update_configuration_warning(); } Ref<Texture2D> Light2D::get_texture() const { - return texture; } void Light2D::set_texture_offset(const Vector2 &p_offset) { - texture_offset = p_offset; RS::get_singleton()->canvas_light_set_texture_offset(canvas_light, texture_offset); item_rect_changed(); @@ -150,44 +146,37 @@ void Light2D::set_texture_offset(const Vector2 &p_offset) { } Vector2 Light2D::get_texture_offset() const { - return texture_offset; } void Light2D::set_color(const Color &p_color) { - color = p_color; RS::get_singleton()->canvas_light_set_color(canvas_light, color); } -Color Light2D::get_color() const { +Color Light2D::get_color() const { return color; } void Light2D::set_height(float p_height) { - height = p_height; RS::get_singleton()->canvas_light_set_height(canvas_light, height); } float Light2D::get_height() const { - return height; } void Light2D::set_energy(float p_energy) { - energy = p_energy; RS::get_singleton()->canvas_light_set_energy(canvas_light, energy); } float Light2D::get_energy() const { - return energy; } void Light2D::set_texture_scale(float p_scale) { - _scale = p_scale; // Avoid having 0 scale values, can lead to errors in physics and rendering. if (_scale == 0) { @@ -198,101 +187,87 @@ void Light2D::set_texture_scale(float p_scale) { } float Light2D::get_texture_scale() const { - return _scale; } void Light2D::set_z_range_min(int p_min_z) { - z_min = p_min_z; RS::get_singleton()->canvas_light_set_z_range(canvas_light, z_min, z_max); } -int Light2D::get_z_range_min() const { +int Light2D::get_z_range_min() const { return z_min; } void Light2D::set_z_range_max(int p_max_z) { - z_max = p_max_z; RS::get_singleton()->canvas_light_set_z_range(canvas_light, z_min, z_max); } -int Light2D::get_z_range_max() const { +int Light2D::get_z_range_max() const { return z_max; } void Light2D::set_layer_range_min(int p_min_layer) { - layer_min = p_min_layer; RS::get_singleton()->canvas_light_set_layer_range(canvas_light, layer_min, layer_max); } -int Light2D::get_layer_range_min() const { +int Light2D::get_layer_range_min() const { return layer_min; } void Light2D::set_layer_range_max(int p_max_layer) { - layer_max = p_max_layer; RS::get_singleton()->canvas_light_set_layer_range(canvas_light, layer_min, layer_max); } -int Light2D::get_layer_range_max() const { +int Light2D::get_layer_range_max() const { return layer_max; } void Light2D::set_item_cull_mask(int p_mask) { - item_mask = p_mask; RS::get_singleton()->canvas_light_set_item_cull_mask(canvas_light, item_mask); } int Light2D::get_item_cull_mask() const { - return item_mask; } void Light2D::set_item_shadow_cull_mask(int p_mask) { - item_shadow_mask = p_mask; RS::get_singleton()->canvas_light_set_item_shadow_cull_mask(canvas_light, item_shadow_mask); } int Light2D::get_item_shadow_cull_mask() const { - return item_shadow_mask; } void Light2D::set_mode(Mode p_mode) { - mode = p_mode; RS::get_singleton()->canvas_light_set_mode(canvas_light, RS::CanvasLightMode(p_mode)); } Light2D::Mode Light2D::get_mode() const { - return mode; } void Light2D::set_shadow_enabled(bool p_enabled) { - shadow = p_enabled; RS::get_singleton()->canvas_light_set_shadow_enabled(canvas_light, shadow); } -bool Light2D::is_shadow_enabled() const { +bool Light2D::is_shadow_enabled() const { return shadow; } void Light2D::set_shadow_buffer_size(int p_size) { - shadow_buffer_size = p_size; RS::get_singleton()->canvas_light_set_shadow_buffer_size(canvas_light, shadow_buffer_size); } int Light2D::get_shadow_buffer_size() const { - return shadow_buffer_size; } @@ -303,7 +278,6 @@ void Light2D::set_shadow_filter(ShadowFilter p_filter) { } Light2D::ShadowFilter Light2D::get_shadow_filter() const { - return shadow_filter; } @@ -317,31 +291,25 @@ Color Light2D::get_shadow_color() const { } void Light2D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - RS::get_singleton()->canvas_light_attach_to_canvas(canvas_light, get_canvas()); _update_light_visibility(); } if (p_what == NOTIFICATION_TRANSFORM_CHANGED) { - RS::get_singleton()->canvas_light_set_transform(canvas_light, get_global_transform()); } if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - _update_light_visibility(); } if (p_what == NOTIFICATION_EXIT_TREE) { - RS::get_singleton()->canvas_light_attach_to_canvas(canvas_light, RID()); _update_light_visibility(); } } String Light2D::get_configuration_warning() const { - if (!texture.is_valid()) { return TTR("A texture with the shape of the light must be supplied to the \"Texture\" property."); } @@ -350,18 +318,15 @@ String Light2D::get_configuration_warning() const { } void Light2D::set_shadow_smooth(float p_amount) { - shadow_smooth = p_amount; RS::get_singleton()->canvas_light_set_shadow_smooth(canvas_light, shadow_smooth); } float Light2D::get_shadow_smooth() const { - return shadow_smooth; } void Light2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &Light2D::set_enabled); ClassDB::bind_method(D_METHOD("is_enabled"), &Light2D::is_enabled); @@ -457,7 +422,6 @@ void Light2D::_bind_methods() { } Light2D::Light2D() { - canvas_light = RenderingServer::get_singleton()->canvas_light_create(); enabled = true; editor_only = false; @@ -482,6 +446,5 @@ Light2D::Light2D() { } Light2D::~Light2D() { - RenderingServer::get_singleton()->free(canvas_light); } diff --git a/scene/2d/light_2d.h b/scene/2d/light_2d.h index 7134029441..0d5e8d674a 100644 --- a/scene/2d/light_2d.h +++ b/scene/2d/light_2d.h @@ -34,7 +34,6 @@ #include "scene/2d/node_2d.h" class Light2D : public Node2D { - GDCLASS(Light2D, Node2D); public: diff --git a/scene/2d/light_occluder_2d.cpp b/scene/2d/light_occluder_2d.cpp index bd1a820aec..0f4880f69a 100644 --- a/scene/2d/light_occluder_2d.cpp +++ b/scene/2d/light_occluder_2d.cpp @@ -36,17 +36,17 @@ #ifdef TOOLS_ENABLED Rect2 OccluderPolygon2D::_edit_get_rect() const { - if (rect_cache_dirty) { if (closed) { const Vector2 *r = polygon.ptr(); item_rect = Rect2(); for (int i = 0; i < polygon.size(); i++) { Vector2 pos = r[i]; - if (i == 0) + if (i == 0) { item_rect.position = pos; - else + } else { item_rect.expand_to(pos); + } } rect_cache_dirty = false; } else { @@ -67,7 +67,6 @@ Rect2 OccluderPolygon2D::_edit_get_rect() const { } bool OccluderPolygon2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - if (closed) { return Geometry::is_point_in_polygon(p_point, Variant(polygon)); } else { @@ -75,8 +74,9 @@ bool OccluderPolygon2D::_edit_is_selected_on_click(const Point2 &p_point, double const Vector2 *points = polygon.ptr(); for (int i = 0; i < polygon.size() - 1; i++) { Vector2 p = Geometry::get_closest_point_to_segment_2d(p_point, &points[i]); - if (p.distance_to(p_point) <= d) + if (p.distance_to(p_point) <= d) { return true; + } } return false; @@ -85,7 +85,6 @@ bool OccluderPolygon2D::_edit_is_selected_on_click(const Point2 &p_point, double #endif void OccluderPolygon2D::set_polygon(const Vector<Vector2> &p_polygon) { - polygon = p_polygon; rect_cache_dirty = true; RS::get_singleton()->canvas_occluder_polygon_set_shape(occ_polygon, p_polygon, closed); @@ -93,43 +92,38 @@ void OccluderPolygon2D::set_polygon(const Vector<Vector2> &p_polygon) { } Vector<Vector2> OccluderPolygon2D::get_polygon() const { - return polygon; } void OccluderPolygon2D::set_closed(bool p_closed) { - - if (closed == p_closed) + if (closed == p_closed) { return; + } closed = p_closed; - if (polygon.size()) + if (polygon.size()) { RS::get_singleton()->canvas_occluder_polygon_set_shape(occ_polygon, polygon, closed); + } emit_changed(); } bool OccluderPolygon2D::is_closed() const { - return closed; } void OccluderPolygon2D::set_cull_mode(CullMode p_mode) { - cull = p_mode; RS::get_singleton()->canvas_occluder_polygon_set_cull_mode(occ_polygon, RS::CanvasOccluderPolygonCullMode(p_mode)); } OccluderPolygon2D::CullMode OccluderPolygon2D::get_cull_mode() const { - return cull; } RID OccluderPolygon2D::get_rid() const { - return occ_polygon; } void OccluderPolygon2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_closed", "closed"), &OccluderPolygon2D::set_closed); ClassDB::bind_method(D_METHOD("is_closed"), &OccluderPolygon2D::is_closed); @@ -149,7 +143,6 @@ void OccluderPolygon2D::_bind_methods() { } OccluderPolygon2D::OccluderPolygon2D() { - occ_polygon = RS::get_singleton()->canvas_occluder_polygon_create(); closed = true; cull = CULL_DISABLED; @@ -157,40 +150,31 @@ OccluderPolygon2D::OccluderPolygon2D() { } OccluderPolygon2D::~OccluderPolygon2D() { - RS::get_singleton()->free(occ_polygon); } void LightOccluder2D::_poly_changed() { - #ifdef DEBUG_ENABLED update(); #endif } void LightOccluder2D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_CANVAS) { - RS::get_singleton()->canvas_light_occluder_attach_to_canvas(occluder, get_canvas()); RS::get_singleton()->canvas_light_occluder_set_transform(occluder, get_global_transform()); RS::get_singleton()->canvas_light_occluder_set_enabled(occluder, is_visible_in_tree()); } if (p_what == NOTIFICATION_TRANSFORM_CHANGED) { - RS::get_singleton()->canvas_light_occluder_set_transform(occluder, get_global_transform()); } if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - RS::get_singleton()->canvas_light_occluder_set_enabled(occluder, is_visible_in_tree()); } if (p_what == NOTIFICATION_DRAW) { - if (Engine::get_singleton()->is_editor_hint()) { - if (occluder_polygon.is_valid()) { - Vector<Vector2> poly = occluder_polygon->get_polygon(); if (poly.size()) { @@ -199,11 +183,9 @@ void LightOccluder2D::_notification(int p_what) { color.push_back(Color(0, 0, 0, 0.6)); draw_polygon(Variant(poly), color); } else { - int ps = poly.size(); const Vector2 *r = poly.ptr(); for (int i = 0; i < ps - 1; i++) { - draw_line(r[i], r[i + 1], Color(0, 0, 0, 0.6), 3); } } @@ -213,61 +195,56 @@ void LightOccluder2D::_notification(int p_what) { } if (p_what == NOTIFICATION_EXIT_CANVAS) { - RS::get_singleton()->canvas_light_occluder_attach_to_canvas(occluder, RID()); } } #ifdef TOOLS_ENABLED Rect2 LightOccluder2D::_edit_get_rect() const { - return occluder_polygon.is_valid() ? occluder_polygon->_edit_get_rect() : Rect2(); } bool LightOccluder2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - return occluder_polygon.is_valid() ? occluder_polygon->_edit_is_selected_on_click(p_point, p_tolerance) : false; } #endif void LightOccluder2D::set_occluder_polygon(const Ref<OccluderPolygon2D> &p_polygon) { - #ifdef DEBUG_ENABLED - if (occluder_polygon.is_valid()) + if (occluder_polygon.is_valid()) { occluder_polygon->disconnect("changed", callable_mp(this, &LightOccluder2D::_poly_changed)); + } #endif occluder_polygon = p_polygon; - if (occluder_polygon.is_valid()) + if (occluder_polygon.is_valid()) { RS::get_singleton()->canvas_light_occluder_set_polygon(occluder, occluder_polygon->get_rid()); - else + } else { RS::get_singleton()->canvas_light_occluder_set_polygon(occluder, RID()); + } #ifdef DEBUG_ENABLED - if (occluder_polygon.is_valid()) + if (occluder_polygon.is_valid()) { occluder_polygon->connect("changed", callable_mp(this, &LightOccluder2D::_poly_changed)); + } update(); #endif } Ref<OccluderPolygon2D> LightOccluder2D::get_occluder_polygon() const { - return occluder_polygon; } void LightOccluder2D::set_occluder_light_mask(int p_mask) { - mask = p_mask; RS::get_singleton()->canvas_light_occluder_set_light_mask(occluder, mask); } int LightOccluder2D::get_occluder_light_mask() const { - return mask; } String LightOccluder2D::get_configuration_warning() const { - if (!occluder_polygon.is_valid()) { return TTR("An occluder polygon must be set (or drawn) for this occluder to take effect."); } @@ -280,7 +257,6 @@ String LightOccluder2D::get_configuration_warning() const { } void LightOccluder2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_occluder_polygon", "polygon"), &LightOccluder2D::set_occluder_polygon); ClassDB::bind_method(D_METHOD("get_occluder_polygon"), &LightOccluder2D::get_occluder_polygon); @@ -292,13 +268,11 @@ void LightOccluder2D::_bind_methods() { } LightOccluder2D::LightOccluder2D() { - occluder = RS::get_singleton()->canvas_light_occluder_create(); mask = 1; set_notify_transform(true); } LightOccluder2D::~LightOccluder2D() { - RS::get_singleton()->free(occluder); } diff --git a/scene/2d/light_occluder_2d.h b/scene/2d/light_occluder_2d.h index 83702f2875..eba67edfe4 100644 --- a/scene/2d/light_occluder_2d.h +++ b/scene/2d/light_occluder_2d.h @@ -34,7 +34,6 @@ #include "scene/2d/node_2d.h" class OccluderPolygon2D : public Resource { - GDCLASS(OccluderPolygon2D, Resource); public: diff --git a/scene/2d/line_2d.cpp b/scene/2d/line_2d.cpp index 43c54ffd17..28183403f2 100644 --- a/scene/2d/line_2d.cpp +++ b/scene/2d/line_2d.cpp @@ -52,9 +52,9 @@ Line2D::Line2D() { #ifdef TOOLS_ENABLED Rect2 Line2D::_edit_get_rect() const { - - if (_points.size() == 0) + if (_points.size() == 0) { return Rect2(0, 0, 0, 0); + } Vector2 d = Vector2(_width, _width); Rect2 aabb = Rect2(_points[0] - d, 2 * d); for (int i = 1; i < _points.size(); i++) { @@ -69,13 +69,13 @@ bool Line2D::_edit_use_rect() const { } bool Line2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - const real_t d = _width / 2 + p_tolerance; const Vector2 *points = _points.ptr(); for (int i = 0; i < _points.size() - 1; i++) { Vector2 p = Geometry::get_closest_point_to_segment_2d(p_point, &points[i]); - if (p.distance_to(p_point) <= d) + if (p.distance_to(p_point) <= d) { return true; + } } return false; @@ -88,8 +88,9 @@ void Line2D::set_points(const Vector<Vector2> &p_points) { } void Line2D::set_width(float p_width) { - if (p_width < 0.0) + if (p_width < 0.0) { p_width = 0.0; + } _width = p_width; update(); } @@ -168,7 +169,6 @@ Color Line2D::get_default_color() const { } void Line2D::set_gradient(const Ref<Gradient> &p_gradient) { - // Cleanup previous connection if any if (_gradient.is_valid()) { _gradient->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Line2D::_gradient_changed)); @@ -242,8 +242,9 @@ void Line2D::_notification(int p_what) { } void Line2D::set_sharp_limit(float p_limit) { - if (p_limit < 0.f) + if (p_limit < 0.f) { p_limit = 0.f; + } _sharp_limit = p_limit; update(); } @@ -253,8 +254,9 @@ float Line2D::get_sharp_limit() const { } void Line2D::set_round_precision(int p_precision) { - if (p_precision < 1) + if (p_precision < 1) { p_precision = 1; + } _round_precision = p_precision; update(); } @@ -273,8 +275,9 @@ bool Line2D::get_antialiased() const { } void Line2D::_draw() { - if (_points.size() <= 1 || _width == 0.f) + if (_points.size() <= 1 || _width == 0.f) { return; + } // TODO Is this really needed? // Copy points for faster access @@ -350,7 +353,6 @@ void Line2D::_curve_changed() { // static void Line2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_points", "points"), &Line2D::set_points); ClassDB::bind_method(D_METHOD("get_points"), &Line2D::get_points); diff --git a/scene/2d/line_2d.h b/scene/2d/line_2d.h index 51706befdb..bccbcbdcb9 100644 --- a/scene/2d/line_2d.h +++ b/scene/2d/line_2d.h @@ -34,7 +34,6 @@ #include "node_2d.h" class Line2D : public Node2D { - GDCLASS(Line2D, Node2D); public: diff --git a/scene/2d/line_builder.cpp b/scene/2d/line_builder.cpp index 6b06f2227a..f1522dbaeb 100644 --- a/scene/2d/line_builder.cpp +++ b/scene/2d/line_builder.cpp @@ -53,8 +53,9 @@ static SegmentIntersectionResult segment_intersection( float ub = (ab.x * (a.y - c.y) - ab.y * (a.x - c.x)) / div; *out_intersection = a + ua * ab; if (ua >= 0.f && ua <= 1.f && - ub >= 0.f && ub <= 1.f) + ub >= 0.f && ub <= 1.f) { return SEGMENT_INTERSECT; + } return SEGMENT_NO_INTERSECT; } @@ -117,7 +118,6 @@ void LineBuilder::clear_output() { } void LineBuilder::build() { - // Need at least 2 points to draw a line if (points.size() < 2) { clear_output(); @@ -158,28 +158,32 @@ void LineBuilder::build() { //Adjust totalDistance. // The line's outer length will be a little higher due to begin and end caps if (begin_cap_mode == Line2D::LINE_CAP_BOX || begin_cap_mode == Line2D::LINE_CAP_ROUND) { - if (retrieve_curve) + if (retrieve_curve) { total_distance += width * curve->interpolate_baked(0.f) * 0.5f; - else + } else { total_distance += width * 0.5f; + } } if (end_cap_mode == Line2D::LINE_CAP_BOX || end_cap_mode == Line2D::LINE_CAP_ROUND) { - if (retrieve_curve) + if (retrieve_curve) { total_distance += width * curve->interpolate_baked(1.f) * 0.5f; - else + } else { total_distance += width * 0.5f; + } } } - if (_interpolate_color) + if (_interpolate_color) { color0 = gradient->get_color(0); - else + } else { colors.push_back(default_color); + } float uvx0 = 0.f; float uvx1 = 0.f; - if (retrieve_curve) + if (retrieve_curve) { width_factor = curve->interpolate_baked(0.f); + } pos_up0 += u0 * hw * width_factor; pos_down0 -= u0 * hw * width_factor; @@ -220,7 +224,6 @@ void LineBuilder::build() { // For each additional segment for (int i = 1; i < len - 1; ++i) { - pos1 = points[i]; Vector2 pos2 = points[i + 1]; @@ -271,10 +274,10 @@ void LineBuilder::build() { pos1 + inner_normal1, pos2 + inner_normal1, &corner_pos_in); - if (intersection_result == SEGMENT_INTERSECT) + if (intersection_result == SEGMENT_INTERSECT) { // Inner parts of the segments intersect corner_pos_out = 2.f * pos1 - corner_pos_in; - else { + } else { // No intersection, segments are either parallel or too sharp corner_pos_in = pos1 + inner_normal0; corner_pos_out = pos1 - inner_normal0; @@ -359,7 +362,6 @@ void LineBuilder::build() { // Add joint geometry if (current_joint_mode != Line2D::LINE_JOINT_SHARP) { - /* ________________ cbegin * / \ * / \ @@ -386,10 +388,11 @@ void LineBuilder::build() { strip_add_arc(pos1, vbegin.angle_to(vend), orientation); } - if (intersection_result != SEGMENT_INTERSECT) + if (intersection_result != SEGMENT_INTERSECT) { // In this case the joint is too corrputed to be re-used, // start again the strip with fallback points strip_begin(pos_up0, pos_down0, color1, uvx1); + } } } // Last (or only) segment @@ -541,7 +544,6 @@ void LineBuilder::strip_add_tri(Vector2 up, Orientation orientation) { } void LineBuilder::strip_add_arc(Vector2 center, float angle_delta, Orientation orientation) { - // Take the two last vertices and extrude an arc made of triangles // that all share one of the initial vertices @@ -551,8 +553,9 @@ void LineBuilder::strip_add_arc(Vector2 center, float angle_delta, Orientation o float angle_step = Math_PI / static_cast<float>(round_precision); float steps = Math::abs(angle_delta) / angle_step; - if (angle_delta < 0.f) + if (angle_delta < 0.f) { angle_step = -angle_step; + } float t = Vector2(1, 0).angle_to(vbegin); float end_angle = t + angle_delta; @@ -570,7 +573,6 @@ void LineBuilder::strip_add_arc(Vector2 center, float angle_delta, Orientation o } void LineBuilder::new_arc(Vector2 center, Vector2 vbegin, float angle_delta, Color color, Rect2 uv_rect) { - // Make a standalone arc that doesn't use existing vertices, // with undistorted UVs from within a square section @@ -578,8 +580,9 @@ void LineBuilder::new_arc(Vector2 center, Vector2 vbegin, float angle_delta, Col float angle_step = Math_PI / static_cast<float>(round_precision); float steps = Math::abs(angle_delta) / angle_step; - if (angle_delta < 0.f) + if (angle_delta < 0.f) { angle_step = -angle_step; + } float t = Vector2(1, 0).angle_to(vbegin); float end_angle = t + angle_delta; @@ -590,10 +593,12 @@ void LineBuilder::new_arc(Vector2 center, Vector2 vbegin, float angle_delta, Col // Center vertice int vi = vertices.size(); vertices.push_back(center); - if (_interpolate_color) + if (_interpolate_color) { colors.push_back(color); - if (texture_mode != Line2D::LINE_TEXTURE_NONE) + } + if (texture_mode != Line2D::LINE_TEXTURE_NONE) { uvs.push_back(interpolate(uv_rect, Vector2(0.5f, 0.5f))); + } // Arc vertices for (int ti = 0; ti < steps; ++ti, t += angle_step) { @@ -601,8 +606,9 @@ void LineBuilder::new_arc(Vector2 center, Vector2 vbegin, float angle_delta, Col rpos = center + sc * radius; vertices.push_back(rpos); - if (_interpolate_color) + if (_interpolate_color) { colors.push_back(color); + } if (texture_mode != Line2D::LINE_TEXTURE_NONE) { Vector2 tsc = Vector2(Math::cos(tt), Math::sin(tt)); uvs.push_back(interpolate(uv_rect, 0.5f * (tsc + Vector2(1.f, 1.f)))); @@ -614,8 +620,9 @@ void LineBuilder::new_arc(Vector2 center, Vector2 vbegin, float angle_delta, Col Vector2 sc = Vector2(Math::cos(end_angle), Math::sin(end_angle)); rpos = center + sc * radius; vertices.push_back(rpos); - if (_interpolate_color) + if (_interpolate_color) { colors.push_back(color); + } if (texture_mode != Line2D::LINE_TEXTURE_NONE) { tt = tt_begin + angle_delta; Vector2 tsc = Vector2(Math::cos(tt), Math::sin(tt)); diff --git a/scene/2d/mesh_instance_2d.cpp b/scene/2d/mesh_instance_2d.cpp index 5e258be700..897595ad1f 100644 --- a/scene/2d/mesh_instance_2d.cpp +++ b/scene/2d/mesh_instance_2d.cpp @@ -31,7 +31,6 @@ #include "mesh_instance_2d.h" void MeshInstance2D::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { if (mesh.is_valid()) { draw_mesh(mesh, texture, normal_map); @@ -40,7 +39,6 @@ void MeshInstance2D::_notification(int p_what) { } void MeshInstance2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &MeshInstance2D::set_mesh); ClassDB::bind_method(D_METHOD("get_mesh"), &MeshInstance2D::get_mesh); @@ -58,20 +56,18 @@ void MeshInstance2D::_bind_methods() { } void MeshInstance2D::set_mesh(const Ref<Mesh> &p_mesh) { - mesh = p_mesh; update(); } Ref<Mesh> MeshInstance2D::get_mesh() const { - return mesh; } void MeshInstance2D::set_texture(const Ref<Texture2D> &p_texture) { - - if (p_texture == texture) + if (p_texture == texture) { return; + } texture = p_texture; update(); emit_signal("texture_changed"); @@ -79,24 +75,20 @@ void MeshInstance2D::set_texture(const Ref<Texture2D> &p_texture) { } void MeshInstance2D::set_normal_map(const Ref<Texture2D> &p_texture) { - normal_map = p_texture; update(); } Ref<Texture2D> MeshInstance2D::get_normal_map() const { - return normal_map; } Ref<Texture2D> MeshInstance2D::get_texture() const { - return texture; } #ifdef TOOLS_ENABLED Rect2 MeshInstance2D::_edit_get_rect() const { - if (mesh.is_valid()) { AABB aabb = mesh->get_aabb(); return Rect2(aabb.position.x, aabb.position.y, aabb.size.x, aabb.size.y); diff --git a/scene/2d/multimesh_instance_2d.cpp b/scene/2d/multimesh_instance_2d.cpp index 6620027020..b99c0a3fa9 100644 --- a/scene/2d/multimesh_instance_2d.cpp +++ b/scene/2d/multimesh_instance_2d.cpp @@ -31,7 +31,6 @@ #include "multimesh_instance_2d.h" void MultiMeshInstance2D::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { if (multimesh.is_valid()) { draw_multimesh(multimesh, texture, normal_map); @@ -40,7 +39,6 @@ void MultiMeshInstance2D::_notification(int p_what) { } void MultiMeshInstance2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_multimesh", "multimesh"), &MultiMeshInstance2D::set_multimesh); ClassDB::bind_method(D_METHOD("get_multimesh"), &MultiMeshInstance2D::get_multimesh); @@ -58,20 +56,18 @@ void MultiMeshInstance2D::_bind_methods() { } void MultiMeshInstance2D::set_multimesh(const Ref<MultiMesh> &p_multimesh) { - multimesh = p_multimesh; update(); } Ref<MultiMesh> MultiMeshInstance2D::get_multimesh() const { - return multimesh; } void MultiMeshInstance2D::set_texture(const Ref<Texture2D> &p_texture) { - - if (p_texture == texture) + if (p_texture == texture) { return; + } texture = p_texture; update(); emit_signal("texture_changed"); @@ -79,24 +75,20 @@ void MultiMeshInstance2D::set_texture(const Ref<Texture2D> &p_texture) { } Ref<Texture2D> MultiMeshInstance2D::get_texture() const { - return texture; } void MultiMeshInstance2D::set_normal_map(const Ref<Texture2D> &p_texture) { - normal_map = p_texture; update(); } Ref<Texture2D> MultiMeshInstance2D::get_normal_map() const { - return normal_map; } #ifdef TOOLS_ENABLED Rect2 MultiMeshInstance2D::_edit_get_rect() const { - if (multimesh.is_valid()) { AABB aabb = multimesh->get_aabb(); return Rect2(aabb.position.x, aabb.position.y, aabb.size.x, aabb.size.y); diff --git a/scene/2d/navigation_2d.cpp b/scene/2d/navigation_2d.cpp index ae9fc0f32c..039c6f2e53 100644 --- a/scene/2d/navigation_2d.cpp +++ b/scene/2d/navigation_2d.cpp @@ -54,7 +54,6 @@ void Navigation2D::_notification(int p_what) { NavigationServer2D::get_singleton()->map_set_active(map, true); } break; case NOTIFICATION_EXIT_TREE: { - NavigationServer2D::get_singleton()->map_set_active(map, false); } break; } @@ -83,7 +82,6 @@ RID Navigation2D::get_closest_point_owner(const Vector2 &p_point) const { } Navigation2D::Navigation2D() { - map = NavigationServer2D::get_singleton()->map_create(); set_cell_size(10); // Ten pixels set_edge_connection_margin(100); diff --git a/scene/2d/navigation_2d.h b/scene/2d/navigation_2d.h index 1da13fc78a..6046bddb32 100644 --- a/scene/2d/navigation_2d.h +++ b/scene/2d/navigation_2d.h @@ -35,7 +35,6 @@ #include "scene/2d/node_2d.h" class Navigation2D : public Node2D { - GDCLASS(Navigation2D, Node2D); RID map; diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp index dfeb5eea45..cb2dbba0fe 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -35,7 +35,6 @@ #include "servers/navigation_server_2d.h" void NavigationAgent2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_target_desired_distance", "desired_distance"), &NavigationAgent2D::set_target_desired_distance); ClassDB::bind_method(D_METHOD("get_target_desired_distance"), &NavigationAgent2D::get_target_desired_distance); @@ -91,7 +90,6 @@ void NavigationAgent2D::_bind_methods() { void NavigationAgent2D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { - agent_parent = Object::cast_to<Node2D>(get_parent()); NavigationServer2D::get_singleton()->agent_set_callback(agent, this, "_avoidance_done"); @@ -102,10 +100,11 @@ void NavigationAgent2D::_notification(int p_what) { Node *p = get_parent(); while (p != nullptr) { nav = Object::cast_to<Navigation2D>(p); - if (nav != nullptr) + if (nav != nullptr) { p = nullptr; - else + } else { p = p->get_parent(); + } } set_navigation(nav); @@ -120,7 +119,6 @@ void NavigationAgent2D::_notification(int p_what) { } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { if (agent_parent) { - NavigationServer2D::get_singleton()->agent_set_position(agent, agent_parent->get_global_transform().get_origin()); if (!target_reached) { if (distance_to_target() < target_desired_distance) { @@ -148,8 +146,9 @@ NavigationAgent2D::~NavigationAgent2D() { } void NavigationAgent2D::set_navigation(Navigation2D *p_nav) { - if (navigation == p_nav) + if (navigation == p_nav) { return; // Pointless + } navigation = p_nav; NavigationServer2D::get_singleton()->agent_set_map(agent, navigation == nullptr ? RID() : navigation->get_rid()); @@ -279,13 +278,15 @@ String NavigationAgent2D::get_configuration_warning() const { } void NavigationAgent2D::update_navigation() { - - if (agent_parent == nullptr) + if (agent_parent == nullptr) { return; - if (navigation == nullptr) + } + if (navigation == nullptr) { return; - if (update_frame_id == Engine::get_singleton()->get_physics_frames()) + } + if (update_frame_id == Engine::get_singleton()->get_physics_frames()) { return; + } update_frame_id = Engine::get_singleton()->get_physics_frames(); @@ -318,8 +319,9 @@ void NavigationAgent2D::update_navigation() { emit_signal("path_changed"); } - if (navigation_path.size() == 0) + if (navigation_path.size() == 0) { return; + } // Check if we can advance the navigation path if (navigation_finished == false) { diff --git a/scene/2d/navigation_obstacle_2d.cpp b/scene/2d/navigation_obstacle_2d.cpp index 3eb3ef332f..568023bbe2 100644 --- a/scene/2d/navigation_obstacle_2d.cpp +++ b/scene/2d/navigation_obstacle_2d.cpp @@ -36,7 +36,6 @@ #include "servers/navigation_server_2d.h" void NavigationObstacle2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_navigation", "navigation"), &NavigationObstacle2D::set_navigation_node); ClassDB::bind_method(D_METHOD("get_navigation"), &NavigationObstacle2D::get_navigation_node); } @@ -44,7 +43,6 @@ void NavigationObstacle2D::_bind_methods() { void NavigationObstacle2D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { - update_agent_shape(); // Search the navigation node and set it @@ -53,10 +51,11 @@ void NavigationObstacle2D::_notification(int p_what) { Node *p = get_parent(); while (p != nullptr) { nav = Object::cast_to<Navigation2D>(p); - if (nav != nullptr) + if (nav != nullptr) { p = nullptr; - else + } else { p = p->get_parent(); + } } set_navigation(nav); @@ -88,8 +87,9 @@ NavigationObstacle2D::~NavigationObstacle2D() { } void NavigationObstacle2D::set_navigation(Navigation2D *p_nav) { - if (navigation == p_nav) + if (navigation == p_nav) { return; // Pointless + } navigation = p_nav; NavigationServer2D::get_singleton()->agent_set_map(agent, navigation == nullptr ? RID() : navigation->get_rid()); @@ -140,8 +140,9 @@ void NavigationObstacle2D::update_agent_shape() { radius *= MAX(s.x, s.y); } - if (radius == 0.0) + if (radius == 0.0) { radius = 1.0; // Never a 0 radius + } // Initialize the Agent as an object NavigationServer2D::get_singleton()->agent_set_neighbor_dist(agent, 0.0); diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index f3f335e66a..72bde17428 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -40,7 +40,6 @@ #ifdef TOOLS_ENABLED Rect2 NavigationPolygon::_edit_get_rect() const { - if (rect_cache_dirty) { item_rect = Rect2(); bool first = true; @@ -48,8 +47,9 @@ Rect2 NavigationPolygon::_edit_get_rect() const { for (int i = 0; i < outlines.size(); i++) { const Vector<Vector2> &outline = outlines[i]; const int outline_size = outline.size(); - if (outline_size < 3) + if (outline_size < 3) { continue; + } const Vector2 *p = outline.ptr(); for (int j = 0; j < outline_size; j++) { if (first) { @@ -67,21 +67,21 @@ Rect2 NavigationPolygon::_edit_get_rect() const { } bool NavigationPolygon::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - for (int i = 0; i < outlines.size(); i++) { const Vector<Vector2> &outline = outlines[i]; const int outline_size = outline.size(); - if (outline_size < 3) + if (outline_size < 3) { continue; - if (Geometry::is_point_in_polygon(p_point, Variant(outline))) + } + if (Geometry::is_point_in_polygon(p_point, Variant(outline))) { return true; + } } return false; } #endif void NavigationPolygon::set_vertices(const Vector<Vector2> &p_vertices) { - { MutexLock lock(navmesh_generation); navmesh.unref(); @@ -91,12 +91,10 @@ void NavigationPolygon::set_vertices(const Vector<Vector2> &p_vertices) { } Vector<Vector2> NavigationPolygon::get_vertices() const { - return vertices; } void NavigationPolygon::_set_polygons(const TypedArray<Vector<int32_t>> &p_array) { - { MutexLock lock(navmesh_generation); navmesh.unref(); @@ -108,7 +106,6 @@ void NavigationPolygon::_set_polygons(const TypedArray<Vector<int32_t>> &p_array } Array NavigationPolygon::_get_polygons() const { - Array ret; ret.resize(polygons.size()); for (int i = 0; i < ret.size(); i++) { @@ -119,7 +116,6 @@ Array NavigationPolygon::_get_polygons() const { } void NavigationPolygon::_set_outlines(const TypedArray<Vector<Vector2>> &p_array) { - outlines.resize(p_array.size()); for (int i = 0; i < p_array.size(); i++) { outlines.write[i] = p_array[i]; @@ -128,7 +124,6 @@ void NavigationPolygon::_set_outlines(const TypedArray<Vector<Vector2>> &p_array } Array NavigationPolygon::_get_outlines() const { - Array ret; ret.resize(outlines.size()); for (int i = 0; i < ret.size(); i++) { @@ -139,7 +134,6 @@ Array NavigationPolygon::_get_outlines() const { } void NavigationPolygon::add_polygon(const Vector<int> &p_polygon) { - Polygon polygon; polygon.indices = p_polygon; polygons.push_back(polygon); @@ -150,22 +144,20 @@ void NavigationPolygon::add_polygon(const Vector<int> &p_polygon) { } void NavigationPolygon::add_outline_at_index(const Vector<Vector2> &p_outline, int p_index) { - outlines.insert(p_index, p_outline); rect_cache_dirty = true; } int NavigationPolygon::get_polygon_count() const { - return polygons.size(); } -Vector<int> NavigationPolygon::get_polygon(int p_idx) { +Vector<int> NavigationPolygon::get_polygon(int p_idx) { ERR_FAIL_INDEX_V(p_idx, polygons.size(), Vector<int>()); return polygons[p_idx].indices; } -void NavigationPolygon::clear_polygons() { +void NavigationPolygon::clear_polygons() { polygons.clear(); { MutexLock lock(navmesh_generation); @@ -200,13 +192,11 @@ Ref<NavigationMesh> NavigationPolygon::get_mesh() { } void NavigationPolygon::add_outline(const Vector<Vector2> &p_outline) { - outlines.push_back(p_outline); rect_cache_dirty = true; } int NavigationPolygon::get_outline_count() const { - return outlines.size(); } @@ -217,7 +207,6 @@ void NavigationPolygon::set_outline(int p_idx, const Vector<Vector2> &p_outline) } void NavigationPolygon::remove_outline(int p_idx) { - ERR_FAIL_INDEX(p_idx, outlines.size()); outlines.remove(p_idx); rect_cache_dirty = true; @@ -229,12 +218,11 @@ Vector<Vector2> NavigationPolygon::get_outline(int p_idx) const { } void NavigationPolygon::clear_outlines() { - outlines.clear(); rect_cache_dirty = true; } -void NavigationPolygon::make_polygons_from_outlines() { +void NavigationPolygon::make_polygons_from_outlines() { { MutexLock lock(navmesh_generation); navmesh.unref(); @@ -244,11 +232,11 @@ void NavigationPolygon::make_polygons_from_outlines() { Vector2 outside_point(-1e10, -1e10); for (int i = 0; i < outlines.size(); i++) { - Vector<Vector2> ol = outlines[i]; int olsize = ol.size(); - if (olsize < 3) + if (olsize < 3) { continue; + } const Vector2 *r = ol.ptr(); for (int j = 0; j < olsize; j++) { outside_point.x = MAX(r[j].x, outside_point.x); @@ -259,28 +247,28 @@ void NavigationPolygon::make_polygons_from_outlines() { outside_point += Vector2(0.7239784, 0.819238); //avoid precision issues for (int i = 0; i < outlines.size(); i++) { - Vector<Vector2> ol = outlines[i]; int olsize = ol.size(); - if (olsize < 3) + if (olsize < 3) { continue; + } const Vector2 *r = ol.ptr(); int interscount = 0; //test if this is an outer outline for (int k = 0; k < outlines.size(); k++) { - - if (i == k) + if (i == k) { continue; //no self intersect + } Vector<Vector2> ol2 = outlines[k]; int olsize2 = ol2.size(); - if (olsize2 < 3) + if (olsize2 < 3) { continue; + } const Vector2 *r2 = ol2.ptr(); for (int l = 0; l < olsize2; l++) { - if (Geometry::segment_intersects_segment_2d(r[0], outside_point, r2[l], r2[(l + 1) % olsize2], nullptr)) { interscount++; } @@ -295,9 +283,9 @@ void NavigationPolygon::make_polygons_from_outlines() { tp[j] = r[j]; } - if (outer) + if (outer) { tp.SetOrientation(TRIANGULATOR_CCW); - else { + } else { tp.SetOrientation(TRIANGULATOR_CW); tp.SetHole(true); } @@ -316,13 +304,11 @@ void NavigationPolygon::make_polygons_from_outlines() { Map<Vector2, int> points; for (List<TriangulatorPoly>::Element *I = out_poly.front(); I; I = I->next()) { - TriangulatorPoly &tp = I->get(); struct Polygon p; for (int64_t i = 0; i < tp.GetNumPoints(); i++) { - Map<Vector2, int>::Element *E = points.find(tp[i]); if (!E) { E = points.insert(tp[i], vertices.size()); @@ -338,7 +324,6 @@ void NavigationPolygon::make_polygons_from_outlines() { } void NavigationPolygon::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_vertices", "vertices"), &NavigationPolygon::set_vertices); ClassDB::bind_method(D_METHOD("get_vertices"), &NavigationPolygon::get_vertices); @@ -368,60 +353,51 @@ void NavigationPolygon::_bind_methods() { } void NavigationRegion2D::set_enabled(bool p_enabled) { - - if (enabled == p_enabled) + if (enabled == p_enabled) { return; + } enabled = p_enabled; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (!enabled) { - NavigationServer2D::get_singleton()->region_set_map(region, RID()); } else { - if (navigation) { - NavigationServer2D::get_singleton()->region_set_map(region, navigation->get_rid()); } } - if (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint()) + if (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint()) { update(); + } } bool NavigationRegion2D::is_enabled() const { - return enabled; } ///////////////////////////// #ifdef TOOLS_ENABLED Rect2 NavigationRegion2D::_edit_get_rect() const { - return navpoly.is_valid() ? navpoly->_edit_get_rect() : Rect2(); } bool NavigationRegion2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - return navpoly.is_valid() ? navpoly->_edit_is_selected_on_click(p_point, p_tolerance) : false; } #endif void NavigationRegion2D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_ENTER_TREE: { - Node2D *c = this; while (c) { - navigation = Object::cast_to<Navigation2D>(c); if (navigation) { - if (enabled) { - NavigationServer2D::get_singleton()->region_set_map(region, navigation->get_rid()); } break; @@ -432,26 +408,22 @@ void NavigationRegion2D::_notification(int p_what) { } break; case NOTIFICATION_TRANSFORM_CHANGED: { - NavigationServer2D::get_singleton()->region_set_transform(region, get_global_transform()); } break; case NOTIFICATION_EXIT_TREE: { - if (navigation) { - NavigationServer2D::get_singleton()->region_set_map(region, RID()); } navigation = nullptr; } break; case NOTIFICATION_DRAW: { - if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint()) && navpoly.is_valid()) { - Vector<Vector2> verts = navpoly->get_vertices(); int vsize = verts.size(); - if (vsize < 3) + if (vsize < 3) { return; + } Color color; if (enabled) { @@ -477,10 +449,8 @@ void NavigationRegion2D::_notification(int p_what) { Vector<int> polygon = navpoly->get_polygon(i); for (int j = 2; j < polygon.size(); j++) { - int kofs[3] = { 0, j - 1, j }; for (int k = 0; k < 3; k++) { - int idx = polygon[kofs[k]]; ERR_FAIL_INDEX(idx, vsize); indices.push_back(idx); @@ -494,7 +464,6 @@ void NavigationRegion2D::_notification(int p_what) { } void NavigationRegion2D::set_navigation_polygon(const Ref<NavigationPolygon> &p_navpoly) { - if (p_navpoly == navpoly) { return; } @@ -516,27 +485,25 @@ void NavigationRegion2D::set_navigation_polygon(const Ref<NavigationPolygon> &p_ } Ref<NavigationPolygon> NavigationRegion2D::get_navigation_polygon() const { - return navpoly; } void NavigationRegion2D::_navpoly_changed() { - - if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint())) + if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint())) { update(); + } } String NavigationRegion2D::get_configuration_warning() const { - - if (!is_visible_in_tree() || !is_inside_tree()) + if (!is_visible_in_tree() || !is_inside_tree()) { return String(); + } if (!navpoly.is_valid()) { return TTR("A NavigationPolygon resource must be set or created for this node to work. Please set a property or draw a polygon."); } const Node2D *c = this; while (c) { - if (Object::cast_to<Navigation2D>(c)) { return String(); } @@ -548,7 +515,6 @@ String NavigationRegion2D::get_configuration_warning() const { } void NavigationRegion2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_navigation_polygon", "navpoly"), &NavigationRegion2D::set_navigation_polygon); ClassDB::bind_method(D_METHOD("get_navigation_polygon"), &NavigationRegion2D::get_navigation_polygon); diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h index 54d2ac11f8..07cf4d6668 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -35,7 +35,6 @@ #include "scene/resources/navigation_mesh.h" class NavigationPolygon : public Resource { - GDCLASS(NavigationPolygon, Resource); Vector<Vector2> vertices; @@ -95,7 +94,6 @@ public: class Navigation2D; class NavigationRegion2D : public Node2D { - GDCLASS(NavigationRegion2D, Node2D); bool enabled = true; diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp index 1ea51be148..72250e96b3 100644 --- a/scene/2d/node_2d.cpp +++ b/scene/2d/node_2d.cpp @@ -37,7 +37,6 @@ #ifdef TOOLS_ENABLED Dictionary Node2D::_edit_get_state() const { - Dictionary state; state["position"] = get_position(); state["rotation"] = get_rotation(); @@ -48,7 +47,6 @@ Dictionary Node2D::_edit_get_state() const { } void Node2D::_edit_set_state(const Dictionary &p_state) { - pos = p_state["position"]; angle = p_state["rotation"]; _scale = p_state["scale"]; @@ -100,17 +98,21 @@ void Node2D::_edit_set_rect(const Rect2 &p_edit_rect) { Rect2 r = _edit_get_rect(); Vector2 zero_offset; - if (r.size.x != 0) + if (r.size.x != 0) { zero_offset.x = -r.position.x / r.size.x; - if (r.size.y != 0) + } + if (r.size.y != 0) { zero_offset.y = -r.position.y / r.size.y; + } Size2 new_scale(1, 1); - if (r.size.x != 0) + if (r.size.x != 0) { new_scale.x = p_edit_rect.size.x / r.size.x; - if (r.size.y != 0) + } + if (r.size.y != 0) { new_scale.y = p_edit_rect.size.y / r.size.y; + } Point2 new_pos = p_edit_rect.position + p_edit_rect.size * zero_offset; @@ -128,7 +130,6 @@ void Node2D::_edit_set_rect(const Rect2 &p_edit_rect) { #endif void Node2D::_update_xform_values() { - pos = _mat.elements[2]; angle = _mat.get_rotation(); _scale = _mat.get_scale(); @@ -137,31 +138,31 @@ void Node2D::_update_xform_values() { } void Node2D::_update_transform() { - _mat.set_rotation_scale_and_skew(angle, _scale, skew); _mat.elements[2] = pos; RenderingServer::get_singleton()->canvas_item_set_transform(get_canvas_item(), _mat); - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _notify_transform(); } void Node2D::set_position(const Point2 &p_pos) { - - if (_xform_dirty) + if (_xform_dirty) { ((Node2D *)this)->_update_xform_values(); + } pos = p_pos; _update_transform(); _change_notify("position"); } void Node2D::set_rotation(float p_radians) { - - if (_xform_dirty) + if (_xform_dirty) { ((Node2D *)this)->_update_xform_values(); + } angle = p_radians; _update_transform(); _change_notify("rotation"); @@ -169,9 +170,9 @@ void Node2D::set_rotation(float p_radians) { } void Node2D::set_skew(float p_radians) { - - if (_xform_dirty) + if (_xform_dirty) { ((Node2D *)this)->_update_xform_values(); + } skew = p_radians; _update_transform(); _change_notify("skew"); @@ -179,116 +180,111 @@ void Node2D::set_skew(float p_radians) { } void Node2D::set_rotation_degrees(float p_degrees) { - set_rotation(Math::deg2rad(p_degrees)); } void Node2D::set_skew_degrees(float p_degrees) { - set_skew(Math::deg2rad(p_degrees)); } void Node2D::set_scale(const Size2 &p_scale) { - - if (_xform_dirty) + if (_xform_dirty) { ((Node2D *)this)->_update_xform_values(); + } _scale = p_scale; // Avoid having 0 scale values, can lead to errors in physics and rendering. - if (_scale.x == 0) + if (_scale.x == 0) { _scale.x = CMP_EPSILON; - if (_scale.y == 0) + } + if (_scale.y == 0) { _scale.y = CMP_EPSILON; + } _update_transform(); _change_notify("scale"); } Point2 Node2D::get_position() const { - - if (_xform_dirty) + if (_xform_dirty) { ((Node2D *)this)->_update_xform_values(); + } return pos; } float Node2D::get_rotation() const { - if (_xform_dirty) + if (_xform_dirty) { ((Node2D *)this)->_update_xform_values(); + } return angle; } float Node2D::get_skew() const { - if (_xform_dirty) + if (_xform_dirty) { ((Node2D *)this)->_update_xform_values(); + } return skew; } float Node2D::get_rotation_degrees() const { - return Math::rad2deg(get_rotation()); } float Node2D::get_skew_degrees() const { - return Math::rad2deg(get_skew()); } + Size2 Node2D::get_scale() const { - if (_xform_dirty) + if (_xform_dirty) { ((Node2D *)this)->_update_xform_values(); + } return _scale; } Transform2D Node2D::get_transform() const { - return _mat; } void Node2D::rotate(float p_radians) { - set_rotation(get_rotation() + p_radians); } void Node2D::translate(const Vector2 &p_amount) { - set_position(get_position() + p_amount); } void Node2D::global_translate(const Vector2 &p_amount) { - set_global_position(get_global_position() + p_amount); } void Node2D::apply_scale(const Size2 &p_amount) { - set_scale(get_scale() * p_amount); } void Node2D::move_x(float p_delta, bool p_scaled) { - Transform2D t = get_transform(); Vector2 m = t[0]; - if (!p_scaled) + if (!p_scaled) { m.normalize(); + } set_position(t[2] + m * p_delta); } void Node2D::move_y(float p_delta, bool p_scaled) { - Transform2D t = get_transform(); Vector2 m = t[1]; - if (!p_scaled) + if (!p_scaled) { m.normalize(); + } set_position(t[2] + m * p_delta); } Point2 Node2D::get_global_position() const { - return get_global_transform().get_origin(); } void Node2D::set_global_position(const Point2 &p_pos) { - Transform2D inv; CanvasItem *pi = get_parent_item(); if (pi) { @@ -300,12 +296,10 @@ void Node2D::set_global_position(const Point2 &p_pos) { } float Node2D::get_global_rotation() const { - return get_global_transform().get_rotation(); } void Node2D::set_global_rotation(float p_radians) { - CanvasItem *pi = get_parent_item(); if (pi) { const float parent_global_rot = pi->get_global_transform().get_rotation(); @@ -316,22 +310,18 @@ void Node2D::set_global_rotation(float p_radians) { } float Node2D::get_global_rotation_degrees() const { - return Math::rad2deg(get_global_rotation()); } void Node2D::set_global_rotation_degrees(float p_degrees) { - set_global_rotation(Math::deg2rad(p_degrees)); } Size2 Node2D::get_global_scale() const { - return get_global_transform().get_scale(); } void Node2D::set_global_scale(const Size2 &p_scale) { - CanvasItem *pi = get_parent_item(); if (pi) { const Size2 parent_global_scale = pi->get_global_transform().get_scale(); @@ -342,29 +332,28 @@ void Node2D::set_global_scale(const Size2 &p_scale) { } void Node2D::set_transform(const Transform2D &p_transform) { - _mat = p_transform; _xform_dirty = true; RenderingServer::get_singleton()->canvas_item_set_transform(get_canvas_item(), _mat); - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _notify_transform(); } void Node2D::set_global_transform(const Transform2D &p_transform) { - CanvasItem *pi = get_parent_item(); - if (pi) + if (pi) { set_transform(pi->get_global_transform().affine_inverse() * p_transform); - else + } else { set_transform(p_transform); + } } void Node2D::set_z_index(int p_z) { - ERR_FAIL_COND(p_z < RS::CANVAS_ITEM_Z_MIN); ERR_FAIL_COND(p_z > RS::CANVAS_ITEM_Z_MAX); z_index = p_z; @@ -373,59 +362,53 @@ void Node2D::set_z_index(int p_z) { } void Node2D::set_z_as_relative(bool p_enabled) { - - if (z_relative == p_enabled) + if (z_relative == p_enabled) { return; + } z_relative = p_enabled; RS::get_singleton()->canvas_item_set_z_as_relative_to_parent(get_canvas_item(), p_enabled); } bool Node2D::is_z_relative() const { - return z_relative; } int Node2D::get_z_index() const { - return z_index; } Transform2D Node2D::get_relative_transform_to_parent(const Node *p_parent) const { - - if (p_parent == this) + if (p_parent == this) { return Transform2D(); + } Node2D *parent_2d = Object::cast_to<Node2D>(get_parent()); ERR_FAIL_COND_V(!parent_2d, Transform2D()); - if (p_parent == parent_2d) + if (p_parent == parent_2d) { return get_transform(); - else + } else { return parent_2d->get_relative_transform_to_parent(p_parent) * get_transform(); + } } void Node2D::look_at(const Vector2 &p_pos) { - rotate(get_angle_to(p_pos)); } float Node2D::get_angle_to(const Vector2 &p_pos) const { - return (to_local(p_pos) * get_scale()).angle(); } Point2 Node2D::to_local(Point2 p_global) const { - return get_global_transform().affine_inverse().xform(p_global); } Point2 Node2D::to_global(Point2 p_local) const { - return get_global_transform().xform(p_local); } void Node2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_position", "position"), &Node2D::set_position); ClassDB::bind_method(D_METHOD("set_rotation", "radians"), &Node2D::set_rotation); ClassDB::bind_method(D_METHOD("set_rotation_degrees", "degrees"), &Node2D::set_rotation_degrees); @@ -494,7 +477,6 @@ void Node2D::_bind_methods() { } Node2D::Node2D() { - angle = 0; _scale = Vector2(1, 1); skew = 0; diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h index 0afec36254..827c192585 100644 --- a/scene/2d/node_2d.h +++ b/scene/2d/node_2d.h @@ -34,7 +34,6 @@ #include "scene/main/canvas_item.h" class Node2D : public CanvasItem { - GDCLASS(Node2D, CanvasItem); Point2 pos; diff --git a/scene/2d/parallax_background.cpp b/scene/2d/parallax_background.cpp index 0d5f74a265..416622e6d5 100644 --- a/scene/2d/parallax_background.cpp +++ b/scene/2d/parallax_background.cpp @@ -32,24 +32,19 @@ #include "parallax_layer.h" void ParallaxBackground::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - group_name = "__cameras_" + itos(get_viewport().get_id()); add_to_group(group_name); } break; case NOTIFICATION_EXIT_TREE: { - remove_from_group(group_name); } break; } } void ParallaxBackground::_camera_moved(const Transform2D &p_transform, const Point2 &p_screen_offset) { - screen_offset = p_screen_offset; set_scroll_scale(p_transform.get_scale().dot(Vector2(0.5, 0.5))); @@ -57,26 +52,23 @@ void ParallaxBackground::_camera_moved(const Transform2D &p_transform, const Poi } void ParallaxBackground::set_scroll_scale(float p_scale) { - scale = p_scale; } float ParallaxBackground::get_scroll_scale() const { - return scale; } void ParallaxBackground::set_scroll_offset(const Point2 &p_ofs) { - offset = p_ofs; _update_scroll(); } void ParallaxBackground::_update_scroll() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } Vector2 ofs = base_offset + offset * base_scale; @@ -84,103 +76,91 @@ void ParallaxBackground::_update_scroll() { ofs = -ofs; if (limit_begin.x < limit_end.x) { - - if (ofs.x < limit_begin.x) + if (ofs.x < limit_begin.x) { ofs.x = limit_begin.x; - else if (ofs.x + vps.x > limit_end.x) + } else if (ofs.x + vps.x > limit_end.x) { ofs.x = limit_end.x - vps.x; + } } if (limit_begin.y < limit_end.y) { - - if (ofs.y < limit_begin.y) + if (ofs.y < limit_begin.y) { ofs.y = limit_begin.y; - else if (ofs.y + vps.y > limit_end.y) + } else if (ofs.y + vps.y > limit_end.y) { ofs.y = limit_end.y - vps.y; + } } ofs = -ofs; final_offset = ofs; for (int i = 0; i < get_child_count(); i++) { - ParallaxLayer *l = Object::cast_to<ParallaxLayer>(get_child(i)); - if (!l) + if (!l) { continue; + } - if (ignore_camera_zoom) + if (ignore_camera_zoom) { l->set_base_offset_and_scale(ofs, 1.0, screen_offset); - else + } else { l->set_base_offset_and_scale(ofs, scale, screen_offset); + } } } Point2 ParallaxBackground::get_scroll_offset() const { - return offset; } void ParallaxBackground::set_scroll_base_offset(const Point2 &p_ofs) { - base_offset = p_ofs; _update_scroll(); } Point2 ParallaxBackground::get_scroll_base_offset() const { - return base_offset; } void ParallaxBackground::set_scroll_base_scale(const Point2 &p_ofs) { - base_scale = p_ofs; _update_scroll(); } Point2 ParallaxBackground::get_scroll_base_scale() const { - return base_scale; } void ParallaxBackground::set_limit_begin(const Point2 &p_ofs) { - limit_begin = p_ofs; _update_scroll(); } Point2 ParallaxBackground::get_limit_begin() const { - return limit_begin; } void ParallaxBackground::set_limit_end(const Point2 &p_ofs) { - limit_end = p_ofs; _update_scroll(); } Point2 ParallaxBackground::get_limit_end() const { - return limit_end; } void ParallaxBackground::set_ignore_camera_zoom(bool ignore) { - ignore_camera_zoom = ignore; } bool ParallaxBackground::is_ignore_camera_zoom() { - return ignore_camera_zoom; } Vector2 ParallaxBackground::get_final_offset() const { - return final_offset; } void ParallaxBackground::_bind_methods() { - ClassDB::bind_method(D_METHOD("_camera_moved"), &ParallaxBackground::_camera_moved); ClassDB::bind_method(D_METHOD("set_scroll_offset", "ofs"), &ParallaxBackground::set_scroll_offset); ClassDB::bind_method(D_METHOD("get_scroll_offset"), &ParallaxBackground::get_scroll_offset); @@ -205,7 +185,6 @@ void ParallaxBackground::_bind_methods() { } ParallaxBackground::ParallaxBackground() { - scale = 1.0; set_layer(-100); //behind all by default diff --git a/scene/2d/parallax_background.h b/scene/2d/parallax_background.h index 25ccd910d1..1667880ddb 100644 --- a/scene/2d/parallax_background.h +++ b/scene/2d/parallax_background.h @@ -36,7 +36,6 @@ #include "scene/main/canvas_layer.h" class ParallaxBackground : public CanvasLayer { - GDCLASS(ParallaxBackground, CanvasLayer); Point2 offset; diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp index 181f0f158c..4ed335dec8 100644 --- a/scene/2d/parallax_layer.cpp +++ b/scene/2d/parallax_layer.cpp @@ -34,7 +34,6 @@ #include "parallax_background.h" void ParallaxLayer::set_motion_scale(const Size2 &p_scale) { - motion_scale = p_scale; ParallaxBackground *pb = Object::cast_to<ParallaxBackground>(get_parent()); @@ -46,12 +45,10 @@ void ParallaxLayer::set_motion_scale(const Size2 &p_scale) { } Size2 ParallaxLayer::get_motion_scale() const { - return motion_scale; } void ParallaxLayer::set_motion_offset(const Size2 &p_offset) { - motion_offset = p_offset; ParallaxBackground *pb = Object::cast_to<ParallaxBackground>(get_parent()); @@ -63,18 +60,16 @@ void ParallaxLayer::set_motion_offset(const Size2 &p_offset) { } Size2 ParallaxLayer::get_motion_offset() const { - return motion_offset; } void ParallaxLayer::_update_mirroring() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } ParallaxBackground *pb = Object::cast_to<ParallaxBackground>(get_parent()); if (pb) { - RID c = pb->get_canvas(); RID ci = get_canvas_item(); Point2 mirrorScale = mirroring * get_scale(); @@ -83,33 +78,29 @@ void ParallaxLayer::_update_mirroring() { } void ParallaxLayer::set_mirroring(const Size2 &p_mirroring) { - mirroring = p_mirroring; - if (mirroring.x < 0) + if (mirroring.x < 0) { mirroring.x = 0; - if (mirroring.y < 0) + } + if (mirroring.y < 0) { mirroring.y = 0; + } _update_mirroring(); } Size2 ParallaxLayer::get_mirroring() const { - return mirroring; } void ParallaxLayer::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - orig_offset = get_position(); orig_scale = get_scale(); _update_mirroring(); } break; case NOTIFICATION_EXIT_TREE: { - set_position(orig_offset); set_scale(orig_scale); } break; @@ -119,10 +110,12 @@ void ParallaxLayer::_notification(int p_what) { void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, float p_scale, const Point2 &p_screen_offset) { screen_offset = p_screen_offset; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; - if (Engine::get_singleton()->is_editor_hint()) + } + if (Engine::get_singleton()->is_editor_hint()) { return; + } Point2 new_ofs = (screen_offset + (p_offset - screen_offset) * motion_scale) + motion_offset * p_scale + orig_offset * p_scale; @@ -143,7 +136,6 @@ void ParallaxLayer::set_base_offset_and_scale(const Point2 &p_offset, float p_sc } String ParallaxLayer::get_configuration_warning() const { - if (!Object::cast_to<ParallaxBackground>(get_parent())) { return TTR("ParallaxLayer node only works when set as child of a ParallaxBackground node."); } @@ -152,7 +144,6 @@ String ParallaxLayer::get_configuration_warning() const { } void ParallaxLayer::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_motion_scale", "scale"), &ParallaxLayer::set_motion_scale); ClassDB::bind_method(D_METHOD("get_motion_scale"), &ParallaxLayer::get_motion_scale); ClassDB::bind_method(D_METHOD("set_motion_offset", "offset"), &ParallaxLayer::set_motion_offset); diff --git a/scene/2d/parallax_layer.h b/scene/2d/parallax_layer.h index ba59184649..1f001943b5 100644 --- a/scene/2d/parallax_layer.h +++ b/scene/2d/parallax_layer.h @@ -34,7 +34,6 @@ #include "scene/2d/node_2d.h" class ParallaxLayer : public Node2D { - GDCLASS(ParallaxLayer, Node2D); Point2 orig_offset; diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp index 149d5c6b0d..046e4dbd41 100644 --- a/scene/2d/path_2d.cpp +++ b/scene/2d/path_2d.cpp @@ -39,16 +39,14 @@ #ifdef TOOLS_ENABLED Rect2 Path2D::_edit_get_rect() const { - - if (!curve.is_valid() || curve->get_point_count() == 0) + if (!curve.is_valid() || curve->get_point_count() == 0) { return Rect2(0, 0, 0, 0); + } Rect2 aabb = Rect2(curve->get_point_position(0), Vector2(0, 0)); for (int i = 0; i < curve->get_point_count(); i++) { - for (int j = 0; j <= 8; j++) { - real_t frac = j / 8.0; Vector2 p = curve->interpolate(i, frac); aabb.expand_to(p); @@ -63,7 +61,6 @@ bool Path2D::_edit_use_rect() const { } bool Path2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - if (curve.is_null()) { return false; } @@ -77,8 +74,9 @@ bool Path2D::_edit_is_selected_on_click(const Point2 &p_point, double p_toleranc s[1] = curve->interpolate(i, frac); Vector2 p = Geometry::get_closest_point_to_segment_2d(p_point, s); - if (p.distance_to(p_point) <= p_tolerance) + if (p.distance_to(p_point) <= p_tolerance) { return true; + } s[0] = s[1]; } @@ -89,7 +87,6 @@ bool Path2D::_edit_is_selected_on_click(const Point2 &p_point, double p_toleranc #endif void Path2D::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW && curve.is_valid()) { //draw the curve!! @@ -105,11 +102,9 @@ void Path2D::_notification(int p_what) { const Color color = Color(0.5, 0.6, 1.0, 0.7); for (int i = 0; i < curve->get_point_count(); i++) { - Vector2 prev_p = curve->get_point_position(i); for (int j = 1; j <= 8; j++) { - real_t frac = j / 8.0; Vector2 p = curve->interpolate(i, frac); draw_line(prev_p, p, color, line_width); @@ -132,7 +127,6 @@ void Path2D::_curve_changed() { } void Path2D::set_curve(const Ref<Curve2D> &p_curve) { - if (curve.is_valid()) { curve->disconnect("changed", callable_mp(this, &Path2D::_curve_changed)); } @@ -147,12 +141,10 @@ void Path2D::set_curve(const Ref<Curve2D> &p_curve) { } Ref<Curve2D> Path2D::get_curve() const { - return curve; } void Path2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_curve", "curve"), &Path2D::set_curve); ClassDB::bind_method(D_METHOD("get_curve"), &Path2D::get_curve); @@ -160,20 +152,20 @@ void Path2D::_bind_methods() { } Path2D::Path2D() { - set_curve(Ref<Curve2D>(memnew(Curve2D))); //create one by default } ///////////////////////////////////////////////////////////////////////////////// void PathFollow2D::_update_transform() { - - if (!path) + if (!path) { return; + } Ref<Curve2D> c = path->get_curve(); - if (!c.is_valid()) + if (!c.is_valid()) { return; + } float path_length = c->get_baked_length(); if (path_length == 0) { @@ -219,7 +211,6 @@ void PathFollow2D::_update_transform() { set_rotation(tangent_to_curve.angle()); } else { - pos.x += h_offset; pos.y += v_offset; } @@ -228,11 +219,8 @@ void PathFollow2D::_update_transform() { } void PathFollow2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - path = Object::cast_to<Path2D>(get_parent()); if (path) { _update_transform(); @@ -240,38 +228,34 @@ void PathFollow2D::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { - path = nullptr; } break; } } void PathFollow2D::set_cubic_interpolation(bool p_enable) { - cubic = p_enable; } bool PathFollow2D::get_cubic_interpolation() const { - return cubic; } void PathFollow2D::_validate_property(PropertyInfo &property) const { - if (property.name == "offset") { - float max = 10000; - if (path && path->get_curve().is_valid()) + if (path && path->get_curve().is_valid()) { max = path->get_curve()->get_baked_length(); + } property.hint_string = "0," + rtos(max) + ",0.01,or_lesser,or_greater"; } } String PathFollow2D::get_configuration_warning() const { - - if (!is_visible_in_tree() || !is_inside_tree()) + if (!is_visible_in_tree() || !is_inside_tree()) { return String(); + } if (!Object::cast_to<Path2D>(get_parent())) { return TTR("PathFollow2D only works when set as a child of a Path2D node."); @@ -281,7 +265,6 @@ String PathFollow2D::get_configuration_warning() const { } void PathFollow2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_offset", "offset"), &PathFollow2D::set_offset); ClassDB::bind_method(D_METHOD("get_offset"), &PathFollow2D::get_offset); @@ -317,7 +300,6 @@ void PathFollow2D::_bind_methods() { } void PathFollow2D::set_offset(float p_offset) { - offset = p_offset; if (path) { if (path->get_curve().is_valid()) { @@ -340,81 +322,71 @@ void PathFollow2D::set_offset(float p_offset) { } void PathFollow2D::set_h_offset(float p_h_offset) { - h_offset = p_h_offset; - if (path) + if (path) { _update_transform(); + } } float PathFollow2D::get_h_offset() const { - return h_offset; } void PathFollow2D::set_v_offset(float p_v_offset) { - v_offset = p_v_offset; - if (path) + if (path) { _update_transform(); + } } float PathFollow2D::get_v_offset() const { - return v_offset; } float PathFollow2D::get_offset() const { - return offset; } void PathFollow2D::set_unit_offset(float p_unit_offset) { - - if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length()) + if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length()) { set_offset(p_unit_offset * path->get_curve()->get_baked_length()); + } } float PathFollow2D::get_unit_offset() const { - - if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length()) + if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length()) { return get_offset() / path->get_curve()->get_baked_length(); - else + } else { return 0; + } } void PathFollow2D::set_lookahead(float p_lookahead) { - lookahead = p_lookahead; } float PathFollow2D::get_lookahead() const { - return lookahead; } void PathFollow2D::set_rotate(bool p_rotate) { - rotate = p_rotate; _update_transform(); } bool PathFollow2D::is_rotating() const { - return rotate; } void PathFollow2D::set_loop(bool p_loop) { - loop = p_loop; } bool PathFollow2D::has_loop() const { - return loop; } PathFollow2D::PathFollow2D() { - offset = 0; h_offset = 0; v_offset = 0; diff --git a/scene/2d/path_2d.h b/scene/2d/path_2d.h index 35cf8211f4..288ef698e7 100644 --- a/scene/2d/path_2d.h +++ b/scene/2d/path_2d.h @@ -35,7 +35,6 @@ #include "scene/resources/curve.h" class Path2D : public Node2D { - GDCLASS(Path2D, Node2D); Ref<Curve2D> curve; @@ -60,7 +59,6 @@ public: }; class PathFollow2D : public Node2D { - GDCLASS(PathFollow2D, Node2D); public: diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 4198eb6c06..ae448129bc 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -43,18 +43,15 @@ void PhysicsBody2D::_notification(int p_what) { } void PhysicsBody2D::_set_layers(uint32_t p_mask) { - set_collision_layer(p_mask); set_collision_mask(p_mask); } uint32_t PhysicsBody2D::_get_layers() const { - return get_collision_layer(); } void PhysicsBody2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_collision_layer", "layer"), &PhysicsBody2D::set_collision_layer); ClassDB::bind_method(D_METHOD("get_collision_layer"), &PhysicsBody2D::get_collision_layer); ClassDB::bind_method(D_METHOD("set_collision_mask", "mask"), &PhysicsBody2D::set_collision_mask); @@ -80,59 +77,53 @@ void PhysicsBody2D::_bind_methods() { } void PhysicsBody2D::set_collision_layer(uint32_t p_layer) { - collision_layer = p_layer; PhysicsServer2D::get_singleton()->body_set_collision_layer(get_rid(), p_layer); } uint32_t PhysicsBody2D::get_collision_layer() const { - return collision_layer; } void PhysicsBody2D::set_collision_mask(uint32_t p_mask) { - collision_mask = p_mask; PhysicsServer2D::get_singleton()->body_set_collision_mask(get_rid(), p_mask); } uint32_t PhysicsBody2D::get_collision_mask() const { - return collision_mask; } void PhysicsBody2D::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } -bool PhysicsBody2D::get_collision_mask_bit(int p_bit) const { +bool PhysicsBody2D::get_collision_mask_bit(int p_bit) const { return get_collision_mask() & (1 << p_bit); } void PhysicsBody2D::set_collision_layer_bit(int p_bit, bool p_value) { - uint32_t collision_layer = get_collision_layer(); - if (p_value) + if (p_value) { collision_layer |= 1 << p_bit; - else + } else { collision_layer &= ~(1 << p_bit); + } set_collision_layer(collision_layer); } bool PhysicsBody2D::get_collision_layer_bit(int p_bit) const { - return get_collision_layer() & (1 << p_bit); } PhysicsBody2D::PhysicsBody2D(PhysicsServer2D::BodyMode p_mode) : CollisionObject2D(PhysicsServer2D::get_singleton()->body_create(), false) { - PhysicsServer2D::get_singleton()->body_set_mode(get_rid(), p_mode); collision_layer = 1; collision_mask = 1; @@ -154,7 +145,6 @@ TypedArray<PhysicsBody2D> PhysicsBody2D::get_collision_exceptions() { } void PhysicsBody2D::add_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); PhysicsBody2D *physics_body = Object::cast_to<PhysicsBody2D>(p_node); ERR_FAIL_COND_MSG(!physics_body, "Collision exception only works between two objects of PhysicsBody2D type."); @@ -162,7 +152,6 @@ void PhysicsBody2D::add_collision_exception_with(Node *p_node) { } void PhysicsBody2D::remove_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); PhysicsBody2D *physics_body = Object::cast_to<PhysicsBody2D>(p_node); ERR_FAIL_COND_MSG(!physics_body, "Collision exception only works between two objects of PhysicsBody2D type."); @@ -170,23 +159,20 @@ void PhysicsBody2D::remove_collision_exception_with(Node *p_node) { } void StaticBody2D::set_constant_linear_velocity(const Vector2 &p_vel) { - constant_linear_velocity = p_vel; PhysicsServer2D::get_singleton()->body_set_state(get_rid(), PhysicsServer2D::BODY_STATE_LINEAR_VELOCITY, constant_linear_velocity); } void StaticBody2D::set_constant_angular_velocity(real_t p_vel) { - constant_angular_velocity = p_vel; PhysicsServer2D::get_singleton()->body_set_state(get_rid(), PhysicsServer2D::BODY_STATE_ANGULAR_VELOCITY, constant_angular_velocity); } Vector2 StaticBody2D::get_constant_linear_velocity() const { - return constant_linear_velocity; } -real_t StaticBody2D::get_constant_angular_velocity() const { +real_t StaticBody2D::get_constant_angular_velocity() const { return constant_angular_velocity; } @@ -210,7 +196,6 @@ Ref<PhysicsMaterial> StaticBody2D::get_physics_material_override() const { } void StaticBody2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_constant_linear_velocity", "vel"), &StaticBody2D::set_constant_linear_velocity); ClassDB::bind_method(D_METHOD("set_constant_angular_velocity", "vel"), &StaticBody2D::set_constant_angular_velocity); ClassDB::bind_method(D_METHOD("get_constant_linear_velocity"), &StaticBody2D::get_constant_linear_velocity); @@ -226,7 +211,6 @@ void StaticBody2D::_bind_methods() { StaticBody2D::StaticBody2D() : PhysicsBody2D(PhysicsServer2D::BODY_MODE_STATIC) { - constant_angular_velocity = 0; } @@ -244,7 +228,6 @@ void StaticBody2D::_reload_physics_characteristics() { } void RigidBody2D::_body_enter_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -260,7 +243,6 @@ void RigidBody2D::_body_enter_tree(ObjectID p_id) { emit_signal(SceneStringNames::get_singleton()->body_entered, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape); } @@ -268,7 +250,6 @@ void RigidBody2D::_body_enter_tree(ObjectID p_id) { } void RigidBody2D::_body_exit_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -283,7 +264,6 @@ void RigidBody2D::_body_exit_tree(ObjectID p_id) { emit_signal(SceneStringNames::get_singleton()->body_exited, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape); } @@ -291,7 +271,6 @@ void RigidBody2D::_body_exit_tree(ObjectID p_id) { } void RigidBody2D::_body_inout(int p_status, ObjectID p_instance, int p_body_shape, int p_local_shape) { - bool body_in = p_status == 1; ObjectID objid = p_instance; @@ -305,7 +284,6 @@ void RigidBody2D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap if (body_in) { if (!E) { - E = contact_monitor->body_map.insert(objid, BodyState()); //E->get().rc=0; E->get().in_scene = node && node->is_inside_tree(); @@ -320,29 +298,30 @@ void RigidBody2D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap //E->get().rc++; } - if (node) + if (node) { E->get().shapes.insert(ShapePair(p_body_shape, p_local_shape)); + } if (E->get().in_scene) { emit_signal(SceneStringNames::get_singleton()->body_shape_entered, objid, node, p_body_shape, p_local_shape); } } else { - //E->get().rc--; - if (node) + if (node) { E->get().shapes.erase(ShapePair(p_body_shape, p_local_shape)); + } bool in_scene = E->get().in_scene; if (E->get().shapes.empty()) { - if (node) { node->disconnect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &RigidBody2D::_body_enter_tree)); node->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &RigidBody2D::_body_exit_tree)); - if (in_scene) + if (in_scene) { emit_signal(SceneStringNames::get_singleton()->body_exited, node); + } } contact_monitor->body_map.erase(E); @@ -354,22 +333,20 @@ void RigidBody2D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap } struct _RigidBody2DInOut { - ObjectID id; int shape; int local_shape; }; bool RigidBody2D::_test_motion(const Vector2 &p_motion, bool p_infinite_inertia, float p_margin, const Ref<PhysicsTestMotionResult2D> &p_result) { - PhysicsServer2D::MotionResult *r = nullptr; - if (p_result.is_valid()) + if (p_result.is_valid()) { r = p_result->get_result_ptr(); + } return PhysicsServer2D::get_singleton()->body_test_motion(get_rid(), get_global_transform(), p_motion, p_infinite_inertia, p_margin, r); } void RigidBody2D::_direct_state_changed(Object *p_state) { - #ifdef DEBUG_ENABLED state = Object::cast_to<PhysicsDirectBodyState2D>(p_state); #else @@ -377,28 +354,27 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { #endif set_block_transform_notify(true); // don't want notify (would feedback loop) - if (mode != MODE_KINEMATIC) + if (mode != MODE_KINEMATIC) { set_global_transform(state->get_transform()); + } linear_velocity = state->get_linear_velocity(); angular_velocity = state->get_angular_velocity(); if (sleeping != state->is_sleeping()) { sleeping = state->is_sleeping(); emit_signal(SceneStringNames::get_singleton()->sleeping_state_changed); } - if (get_script_instance()) + if (get_script_instance()) { get_script_instance()->call("_integrate_forces", state); + } set_block_transform_notify(false); // want it back if (contact_monitor) { - contact_monitor->locked = true; //untag all int rc = 0; for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) { - for (int i = 0; i < E->get().shapes.size(); i++) { - E->get().shapes[i].tagged = false; rc++; } @@ -412,7 +388,6 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { //put the ones to add for (int i = 0; i < state->get_contact_count(); i++) { - ObjectID obj = state->get_contact_collider_id(i); int local_shape = state->get_contact_local_shape(i); int shape = state->get_contact_collider_shape(i); @@ -431,7 +406,6 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { ShapePair sp(shape, local_shape); int idx = E->get().shapes.find(sp); if (idx == -1) { - toadd[toadd_count].local_shape = local_shape; toadd[toadd_count].id = obj; toadd[toadd_count].shape = shape; @@ -445,11 +419,8 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { //put the ones to remove for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) { - for (int i = 0; i < E->get().shapes.size(); i++) { - if (!E->get().shapes[i].tagged) { - toremove[toremove_count].body_id = E->key(); toremove[toremove_count].pair = E->get().shapes[i]; toremove_count++; @@ -460,14 +431,12 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { //process remotions for (int i = 0; i < toremove_count; i++) { - _body_inout(0, toremove[i].body_id, toremove[i].pair.body_shape, toremove[i].pair.local_shape); } //process aditions for (int i = 0; i < toadd_count; i++) { - _body_inout(1, toadd[i].id, toadd[i].shape, toadd[i].local_shape); } @@ -478,21 +447,16 @@ void RigidBody2D::_direct_state_changed(Object *p_state) { } void RigidBody2D::set_mode(Mode p_mode) { - mode = p_mode; switch (p_mode) { - case MODE_RIGID: { - PhysicsServer2D::get_singleton()->body_set_mode(get_rid(), PhysicsServer2D::BODY_MODE_RIGID); } break; case MODE_STATIC: { - PhysicsServer2D::get_singleton()->body_set_mode(get_rid(), PhysicsServer2D::BODY_MODE_STATIC); } break; case MODE_KINEMATIC: { - PhysicsServer2D::get_singleton()->body_set_mode(get_rid(), PhysicsServer2D::BODY_MODE_KINEMATIC); } break; @@ -504,41 +468,35 @@ void RigidBody2D::set_mode(Mode p_mode) { } RigidBody2D::Mode RigidBody2D::get_mode() const { - return mode; } void RigidBody2D::set_mass(real_t p_mass) { - ERR_FAIL_COND(p_mass <= 0); mass = p_mass; _change_notify("mass"); _change_notify("weight"); PhysicsServer2D::get_singleton()->body_set_param(get_rid(), PhysicsServer2D::BODY_PARAM_MASS, mass); } -real_t RigidBody2D::get_mass() const { +real_t RigidBody2D::get_mass() const { return mass; } void RigidBody2D::set_inertia(real_t p_inertia) { - ERR_FAIL_COND(p_inertia < 0); PhysicsServer2D::get_singleton()->body_set_param(get_rid(), PhysicsServer2D::BODY_PARAM_INERTIA, p_inertia); } real_t RigidBody2D::get_inertia() const { - return PhysicsServer2D::get_singleton()->body_get_param(get_rid(), PhysicsServer2D::BODY_PARAM_INERTIA); } void RigidBody2D::set_weight(real_t p_weight) { - set_mass(p_weight / (real_t(GLOBAL_DEF("physics/2d/default_gravity", 98)) / 10)); } real_t RigidBody2D::get_weight() const { - return mass * (real_t(GLOBAL_DEF("physics/2d/default_gravity", 98)) / 10); } @@ -562,39 +520,35 @@ Ref<PhysicsMaterial> RigidBody2D::get_physics_material_override() const { } void RigidBody2D::set_gravity_scale(real_t p_gravity_scale) { - gravity_scale = p_gravity_scale; PhysicsServer2D::get_singleton()->body_set_param(get_rid(), PhysicsServer2D::BODY_PARAM_GRAVITY_SCALE, gravity_scale); } -real_t RigidBody2D::get_gravity_scale() const { +real_t RigidBody2D::get_gravity_scale() const { return gravity_scale; } void RigidBody2D::set_linear_damp(real_t p_linear_damp) { - ERR_FAIL_COND(p_linear_damp < -1); linear_damp = p_linear_damp; PhysicsServer2D::get_singleton()->body_set_param(get_rid(), PhysicsServer2D::BODY_PARAM_LINEAR_DAMP, linear_damp); } -real_t RigidBody2D::get_linear_damp() const { +real_t RigidBody2D::get_linear_damp() const { return linear_damp; } void RigidBody2D::set_angular_damp(real_t p_angular_damp) { - ERR_FAIL_COND(p_angular_damp < -1); angular_damp = p_angular_damp; PhysicsServer2D::get_singleton()->body_set_param(get_rid(), PhysicsServer2D::BODY_PARAM_ANGULAR_DAMP, angular_damp); } -real_t RigidBody2D::get_angular_damp() const { +real_t RigidBody2D::get_angular_damp() const { return angular_damp; } void RigidBody2D::set_axis_velocity(const Vector2 &p_axis) { - Vector2 v = state ? state->get_linear_velocity() : linear_velocity; Vector2 axis = p_axis.normalized(); v -= axis * axis.dot(v); @@ -608,77 +562,68 @@ void RigidBody2D::set_axis_velocity(const Vector2 &p_axis) { } void RigidBody2D::set_linear_velocity(const Vector2 &p_velocity) { - linear_velocity = p_velocity; - if (state) + if (state) { state->set_linear_velocity(linear_velocity); - else { - + } else { PhysicsServer2D::get_singleton()->body_set_state(get_rid(), PhysicsServer2D::BODY_STATE_LINEAR_VELOCITY, linear_velocity); } } Vector2 RigidBody2D::get_linear_velocity() const { - return linear_velocity; } void RigidBody2D::set_angular_velocity(real_t p_velocity) { - angular_velocity = p_velocity; - if (state) + if (state) { state->set_angular_velocity(angular_velocity); - else + } else { PhysicsServer2D::get_singleton()->body_set_state(get_rid(), PhysicsServer2D::BODY_STATE_ANGULAR_VELOCITY, angular_velocity); + } } -real_t RigidBody2D::get_angular_velocity() const { +real_t RigidBody2D::get_angular_velocity() const { return angular_velocity; } void RigidBody2D::set_use_custom_integrator(bool p_enable) { - - if (custom_integrator == p_enable) + if (custom_integrator == p_enable) { return; + } custom_integrator = p_enable; PhysicsServer2D::get_singleton()->body_set_omit_force_integration(get_rid(), p_enable); } -bool RigidBody2D::is_using_custom_integrator() { +bool RigidBody2D::is_using_custom_integrator() { return custom_integrator; } void RigidBody2D::set_sleeping(bool p_sleeping) { - sleeping = p_sleeping; PhysicsServer2D::get_singleton()->body_set_state(get_rid(), PhysicsServer2D::BODY_STATE_SLEEPING, sleeping); } void RigidBody2D::set_can_sleep(bool p_active) { - can_sleep = p_active; PhysicsServer2D::get_singleton()->body_set_state(get_rid(), PhysicsServer2D::BODY_STATE_CAN_SLEEP, p_active); } bool RigidBody2D::is_able_to_sleep() const { - return can_sleep; } bool RigidBody2D::is_sleeping() const { - return sleeping; } void RigidBody2D::set_max_contacts_reported(int p_amount) { - max_contacts_reported = p_amount; PhysicsServer2D::get_singleton()->body_set_max_contacts_reported(get_rid(), p_amount); } int RigidBody2D::get_max_contacts_reported() const { - return max_contacts_reported; } @@ -687,7 +632,6 @@ void RigidBody2D::apply_central_impulse(const Vector2 &p_impulse) { } void RigidBody2D::apply_impulse(const Vector2 &p_offset, const Vector2 &p_impulse) { - PhysicsServer2D::get_singleton()->body_apply_impulse(get_rid(), p_offset, p_impulse); } @@ -696,22 +640,18 @@ void RigidBody2D::apply_torque_impulse(float p_torque) { } void RigidBody2D::set_applied_force(const Vector2 &p_force) { - PhysicsServer2D::get_singleton()->body_set_applied_force(get_rid(), p_force); }; Vector2 RigidBody2D::get_applied_force() const { - return PhysicsServer2D::get_singleton()->body_get_applied_force(get_rid()); }; void RigidBody2D::set_applied_torque(const float p_torque) { - PhysicsServer2D::get_singleton()->body_set_applied_torque(get_rid(), p_torque); }; float RigidBody2D::get_applied_torque() const { - return PhysicsServer2D::get_singleton()->body_get_applied_torque(get_rid()); }; @@ -720,7 +660,6 @@ void RigidBody2D::add_central_force(const Vector2 &p_force) { } void RigidBody2D::add_force(const Vector2 &p_offset, const Vector2 &p_force) { - PhysicsServer2D::get_singleton()->body_add_force(get_rid(), p_offset, p_force); } @@ -729,18 +668,15 @@ void RigidBody2D::add_torque(const float p_torque) { } void RigidBody2D::set_continuous_collision_detection_mode(CCDMode p_mode) { - ccd_mode = p_mode; PhysicsServer2D::get_singleton()->body_set_continuous_collision_detection_mode(get_rid(), PhysicsServer2D::CCDMode(p_mode)); } RigidBody2D::CCDMode RigidBody2D::get_continuous_collision_detection_mode() const { - return ccd_mode; } TypedArray<Node2D> RigidBody2D::get_colliding_bodies() const { - ERR_FAIL_COND_V(!contact_monitor, Array()); TypedArray<Node2D> ret; @@ -759,16 +695,14 @@ TypedArray<Node2D> RigidBody2D::get_colliding_bodies() const { } void RigidBody2D::set_contact_monitor(bool p_enabled) { - - if (p_enabled == is_contact_monitor_enabled()) + if (p_enabled == is_contact_monitor_enabled()) { return; + } if (!p_enabled) { - ERR_FAIL_COND_MSG(contact_monitor->locked, "Can't disable contact monitoring during in/out callback. Use call_deferred(\"set_contact_monitor\", false) instead."); for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) { - //clean up mess Object *obj = ObjectDB::get_instance(E->key()); Node *node = Object::cast_to<Node>(obj); @@ -782,19 +716,16 @@ void RigidBody2D::set_contact_monitor(bool p_enabled) { memdelete(contact_monitor); contact_monitor = nullptr; } else { - contact_monitor = memnew(ContactMonitor); contact_monitor->locked = false; } } bool RigidBody2D::is_contact_monitor_enabled() const { - return contact_monitor != nullptr; } void RigidBody2D::_notification(int p_what) { - #ifdef TOOLS_ENABLED if (p_what == NOTIFICATION_ENTER_TREE) { if (Engine::get_singleton()->is_editor_hint()) { @@ -812,7 +743,6 @@ void RigidBody2D::_notification(int p_what) { } String RigidBody2D::get_configuration_warning() const { - Transform2D t = get_transform(); String warning = CollisionObject2D::get_configuration_warning(); @@ -828,7 +758,6 @@ String RigidBody2D::get_configuration_warning() const { } void RigidBody2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_mode", "mode"), &RigidBody2D::set_mode); ClassDB::bind_method(D_METHOD("get_mode"), &RigidBody2D::get_mode); @@ -940,7 +869,6 @@ void RigidBody2D::_bind_methods() { RigidBody2D::RigidBody2D() : PhysicsBody2D(PhysicsServer2D::BODY_MODE_RIGID) { - mode = MODE_RIGID; mass = 1; @@ -964,9 +892,9 @@ RigidBody2D::RigidBody2D() : } RigidBody2D::~RigidBody2D() { - - if (contact_monitor) + if (contact_monitor) { memdelete(contact_monitor); + } } void RigidBody2D::_reload_physics_characteristics() { @@ -982,7 +910,6 @@ void RigidBody2D::_reload_physics_characteristics() { ////////////////////////// Ref<KinematicCollision2D> KinematicBody2D::_move(const Vector2 &p_motion, bool p_infinite_inertia, bool p_exclude_raycast_shapes, bool p_test_only) { - Collision col; if (move_and_collide(p_motion, p_infinite_inertia, col, p_exclude_raycast_shapes, p_test_only)) { @@ -1000,7 +927,6 @@ Ref<KinematicCollision2D> KinematicBody2D::_move(const Vector2 &p_motion, bool p } bool KinematicBody2D::separate_raycast_shapes(bool p_infinite_inertia, Collision &r_collision) { - PhysicsServer2D::SeparationResult sep_res[8]; //max 8 rays Transform2D gt = get_global_transform(); @@ -1037,7 +963,6 @@ bool KinematicBody2D::separate_raycast_shapes(bool p_infinite_inertia, Collision } bool KinematicBody2D::move_and_collide(const Vector2 &p_motion, bool p_infinite_inertia, Collision &r_collision, bool p_exclude_raycast_shapes, bool p_test_only) { - if (sync_to_physics) { ERR_PRINT("Functions move_and_slide and move_and_collide do not work together with 'sync to physics' option. Please read the documentation."); } @@ -1070,7 +995,6 @@ bool KinematicBody2D::move_and_collide(const Vector2 &p_motion, bool p_infinite_ #define FLOOR_ANGLE_THRESHOLD 0.01 Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const Vector2 &p_up_direction, bool p_stop_on_slope, int p_max_slides, float p_floor_max_angle, bool p_infinite_inertia) { - Vector2 body_velocity = p_linear_velocity; Vector2 body_velocity_normal = body_velocity.normalized(); @@ -1095,7 +1019,6 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const floor_velocity = Vector2(); while (p_max_slides) { - Collision collision; bool found_collision = false; @@ -1151,8 +1074,9 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const } } - if (!found_collision || motion == Vector2()) + if (!found_collision || motion == Vector2()) { break; + } --p_max_slides; } @@ -1161,7 +1085,6 @@ Vector2 KinematicBody2D::move_and_slide(const Vector2 &p_linear_velocity, const } Vector2 KinematicBody2D::move_and_slide_with_snap(const Vector2 &p_linear_velocity, const Vector2 &p_snap, const Vector2 &p_up_direction, bool p_stop_on_slope, int p_max_slides, float p_floor_max_angle, bool p_infinite_inertia) { - bool was_on_floor = on_floor; Vector2 ret = move_and_slide(p_linear_velocity, p_up_direction, p_stop_on_slope, p_max_slides, p_floor_max_angle, p_infinite_inertia); @@ -1201,47 +1124,40 @@ Vector2 KinematicBody2D::move_and_slide_with_snap(const Vector2 &p_linear_veloci } bool KinematicBody2D::is_on_floor() const { - return on_floor; } -bool KinematicBody2D::is_on_wall() const { +bool KinematicBody2D::is_on_wall() const { return on_wall; } -bool KinematicBody2D::is_on_ceiling() const { +bool KinematicBody2D::is_on_ceiling() const { return on_ceiling; } Vector2 KinematicBody2D::get_floor_normal() const { - return floor_normal; } Vector2 KinematicBody2D::get_floor_velocity() const { - return floor_velocity; } bool KinematicBody2D::test_move(const Transform2D &p_from, const Vector2 &p_motion, bool p_infinite_inertia) { - ERR_FAIL_COND_V(!is_inside_tree(), false); return PhysicsServer2D::get_singleton()->body_test_motion(get_rid(), p_from, p_motion, p_infinite_inertia, margin); } void KinematicBody2D::set_safe_margin(float p_margin) { - margin = p_margin; } float KinematicBody2D::get_safe_margin() const { - return margin; } int KinematicBody2D::get_slide_count() const { - return colliders.size(); } @@ -1251,7 +1167,6 @@ KinematicBody2D::Collision KinematicBody2D::get_slide_collision(int p_bounce) co } Ref<KinematicCollision2D> KinematicBody2D::_get_slide_collision(int p_bounce) { - ERR_FAIL_INDEX_V(p_bounce, colliders.size(), Ref<KinematicCollision2D>()); if (p_bounce >= slide_colliders.size()) { slide_colliders.resize(p_bounce + 1); @@ -1267,14 +1182,14 @@ Ref<KinematicCollision2D> KinematicBody2D::_get_slide_collision(int p_bounce) { } void KinematicBody2D::set_sync_to_physics(bool p_enable) { - if (sync_to_physics == p_enable) { return; } sync_to_physics = p_enable; - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { return; + } if (p_enable) { PhysicsServer2D::get_singleton()->body_set_force_integration_callback(get_rid(), this, "_direct_state_changed"); @@ -1292,9 +1207,9 @@ bool KinematicBody2D::is_sync_to_physics_enabled() const { } void KinematicBody2D::_direct_state_changed(Object *p_state) { - - if (!sync_to_physics) + if (!sync_to_physics) { return; + } PhysicsDirectBodyState2D *state = Object::cast_to<PhysicsDirectBodyState2D>(p_state); @@ -1327,8 +1242,8 @@ void KinematicBody2D::_notification(int p_what) { set_notify_local_transform(true); } } -void KinematicBody2D::_bind_methods() { +void KinematicBody2D::_bind_methods() { ClassDB::bind_method(D_METHOD("move_and_collide", "rel_vec", "infinite_inertia", "exclude_raycast_shapes", "test_only"), &KinematicBody2D::_move, DEFVAL(true), DEFVAL(true), DEFVAL(false)); ClassDB::bind_method(D_METHOD("move_and_slide", "linear_velocity", "up_direction", "stop_on_slope", "max_slides", "floor_max_angle", "infinite_inertia"), &KinematicBody2D::move_and_slide, DEFVAL(Vector2(0, 0)), DEFVAL(false), DEFVAL(4), DEFVAL(Math::deg2rad((float)45)), DEFVAL(true)); ClassDB::bind_method(D_METHOD("move_and_slide_with_snap", "linear_velocity", "snap", "up_direction", "stop_on_slope", "max_slides", "floor_max_angle", "infinite_inertia"), &KinematicBody2D::move_and_slide_with_snap, DEFVAL(Vector2(0, 0)), DEFVAL(false), DEFVAL(4), DEFVAL(Math::deg2rad((float)45)), DEFVAL(true)); @@ -1358,7 +1273,6 @@ void KinematicBody2D::_bind_methods() { KinematicBody2D::KinematicBody2D() : PhysicsBody2D(PhysicsServer2D::BODY_MODE_KINEMATIC) { - margin = 0.08; on_floor = false; @@ -1366,6 +1280,7 @@ KinematicBody2D::KinematicBody2D() : on_wall = false; sync_to_physics = false; } + KinematicBody2D::~KinematicBody2D() { if (motion_cache.is_valid()) { motion_cache->owner = nullptr; @@ -1381,39 +1296,42 @@ KinematicBody2D::~KinematicBody2D() { //////////////////////// Vector2 KinematicCollision2D::get_position() const { - return collision.collision; } + Vector2 KinematicCollision2D::get_normal() const { return collision.normal; } + Vector2 KinematicCollision2D::get_travel() const { return collision.travel; } + Vector2 KinematicCollision2D::get_remainder() const { return collision.remainder; } + Object *KinematicCollision2D::get_local_shape() const { - if (!owner) + if (!owner) { return nullptr; + } uint32_t ownerid = owner->shape_find_owner(collision.local_shape); return owner->shape_owner_get_owner(ownerid); } Object *KinematicCollision2D::get_collider() const { - if (collision.collider.is_valid()) { return ObjectDB::get_instance(collision.collider); } return nullptr; } -ObjectID KinematicCollision2D::get_collider_id() const { +ObjectID KinematicCollision2D::get_collider_id() const { return collision.collider; } -Object *KinematicCollision2D::get_collider_shape() const { +Object *KinematicCollision2D::get_collider_shape() const { Object *collider = get_collider(); if (collider) { CollisionObject2D *obj2d = Object::cast_to<CollisionObject2D>(collider); @@ -1425,21 +1343,20 @@ Object *KinematicCollision2D::get_collider_shape() const { return nullptr; } -int KinematicCollision2D::get_collider_shape_index() const { +int KinematicCollision2D::get_collider_shape_index() const { return collision.collider_shape; } -Vector2 KinematicCollision2D::get_collider_velocity() const { +Vector2 KinematicCollision2D::get_collider_velocity() const { return collision.collider_vel; } -Variant KinematicCollision2D::get_collider_metadata() const { +Variant KinematicCollision2D::get_collider_metadata() const { return Variant(); } void KinematicCollision2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_position"), &KinematicCollision2D::get_position); ClassDB::bind_method(D_METHOD("get_normal"), &KinematicCollision2D::get_normal); ClassDB::bind_method(D_METHOD("get_travel"), &KinematicCollision2D::get_travel); @@ -1466,7 +1383,6 @@ void KinematicCollision2D::_bind_methods() { } KinematicCollision2D::KinematicCollision2D() { - collision.collider_shape = 0; collision.local_shape = 0; owner = nullptr; diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h index 75f4f778bf..cde4398ad3 100644 --- a/scene/2d/physics_body_2d.h +++ b/scene/2d/physics_body_2d.h @@ -39,7 +39,6 @@ class KinematicCollision2D; class PhysicsBody2D : public CollisionObject2D { - GDCLASS(PhysicsBody2D, CollisionObject2D); uint32_t collision_layer; @@ -75,7 +74,6 @@ public: }; class StaticBody2D : public PhysicsBody2D { - GDCLASS(StaticBody2D, PhysicsBody2D); Vector2 constant_linear_velocity; @@ -104,7 +102,6 @@ private: }; class RigidBody2D : public PhysicsBody2D { - GDCLASS(RigidBody2D, PhysicsBody2D); public: @@ -143,13 +140,13 @@ private: CCDMode ccd_mode; struct ShapePair { - int body_shape; int local_shape; bool tagged; bool operator<(const ShapePair &p_sp) const { - if (body_shape == p_sp.body_shape) + if (body_shape == p_sp.body_shape) { return local_shape < p_sp.local_shape; + } return body_shape < p_sp.body_shape; } @@ -161,19 +158,16 @@ private: } }; struct RigidBody2D_RemoveAction { - ObjectID body_id; ShapePair pair; }; struct BodyState { - //int rc; bool in_scene; VSet<ShapePair> shapes; }; struct ContactMonitor { - bool locked; Map<ObjectID, BodyState> body_map; }; @@ -271,7 +265,6 @@ VARIANT_ENUM_CAST(RigidBody2D::Mode); VARIANT_ENUM_CAST(RigidBody2D::CCDMode); class KinematicBody2D : public PhysicsBody2D { - GDCLASS(KinematicBody2D, PhysicsBody2D); public: @@ -344,7 +337,6 @@ public: }; class KinematicCollision2D : public Reference { - GDCLASS(KinematicCollision2D, Reference); KinematicBody2D *owner; diff --git a/scene/2d/polygon_2d.cpp b/scene/2d/polygon_2d.cpp index cec598774e..62c66dbb29 100644 --- a/scene/2d/polygon_2d.cpp +++ b/scene/2d/polygon_2d.cpp @@ -65,10 +65,11 @@ Rect2 Polygon2D::_edit_get_rect() const { item_rect = Rect2(); for (int i = 0; i < l; i++) { Vector2 pos = r[i] + offset; - if (i == 0) + if (i == 0) { item_rect.position = pos; - else + } else { item_rect.expand_to(pos); + } } rect_cache_dirty = false; } @@ -81,7 +82,6 @@ bool Polygon2D::_edit_use_rect() const { } bool Polygon2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - Vector<Vector2> polygon2d = Variant(polygon); if (internal_vertices > 0) { polygon2d.resize(polygon2d.size() - internal_vertices); @@ -95,13 +95,11 @@ void Polygon2D::_skeleton_bone_setup_changed() { } void Polygon2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_DRAW: { - - if (polygon.size() < 3) + if (polygon.size() < 3) { return; + } Skeleton2D *skeleton_node = nullptr; if (has_node(skeleton)) { @@ -147,7 +145,6 @@ void Polygon2D::_notification(int p_what) { points.resize(len); { - const Vector2 *polyr = polygon.ptr(); for (int i = 0; i < len; i++) { points.write[i] = polyr[i] + offset; @@ -155,17 +152,17 @@ void Polygon2D::_notification(int p_what) { } if (invert) { - Rect2 bounds; int highest_idx = -1; float highest_y = -1e20; float sum = 0; for (int i = 0; i < len; i++) { - if (i == 0) + if (i == 0) { bounds.position = points[i]; - else + } else { bounds.expand_to(points[i]); + } if (points[i].y > highest_y) { highest_idx = i; highest_y = points[i].y; @@ -195,12 +192,10 @@ void Polygon2D::_notification(int p_what) { points.resize(points.size() + 7); for (int i = points.size() - 1; i >= highest_idx + 7; i--) { - points.write[i] = points[i - 7]; } for (int i = 0; i < 7; i++) { - points.write[highest_idx + i + 1] = ep[i]; } @@ -208,7 +203,6 @@ void Polygon2D::_notification(int p_what) { } if (texture.is_valid()) { - Transform2D texmat(tex_rot, tex_ofs); texmat.scale(tex_scale); Size2 tex_size = texture->get_size(); @@ -216,7 +210,6 @@ void Polygon2D::_notification(int p_what) { uvs.resize(len); if (points.size() == uv.size()) { - const Vector2 *uvr = uv.ptr(); for (int i = 0; i < len; i++) { @@ -259,8 +252,9 @@ void Polygon2D::_notification(int p_what) { int bone_index = bone->get_index_in_skeleton(); const float *r = bone_weights[i].weights.ptr(); for (int j = 0; j < vc; j++) { - if (r[j] == 0.0) + if (r[j] == 0.0) { continue; //weight is unpainted, skip + } //find an index with a weight for (int k = 0; k < 4; k++) { if (weightsw[j * 4 + k] < r[j]) { @@ -283,8 +277,9 @@ void Polygon2D::_notification(int p_what) { for (int j = 0; j < 4; j++) { tw += weightsw[i * 4 + j]; } - if (tw == 0) + if (tw == 0) { continue; //unpainted, do nothing + } //normalize for (int j = 0; j < 4; j++) { @@ -315,8 +310,9 @@ void Polygon2D::_notification(int p_what) { for (int i = 0; i < polygons.size(); i++) { Vector<int> src_indices = polygons[i]; int ic = src_indices.size(); - if (ic < 3) + if (ic < 3) { continue; + } const int *r = src_indices.ptr(); Vector<Vector2> tmp_points; @@ -356,12 +352,10 @@ void Polygon2D::set_polygon(const Vector<Vector2> &p_polygon) { } Vector<Vector2> Polygon2D::get_polygon() const { - return polygon; } void Polygon2D::set_internal_vertex_count(int p_count) { - internal_vertices = p_count; } @@ -370,49 +364,42 @@ int Polygon2D::get_internal_vertex_count() const { } void Polygon2D::set_uv(const Vector<Vector2> &p_uv) { - uv = p_uv; update(); } Vector<Vector2> Polygon2D::get_uv() const { - return uv; } void Polygon2D::set_polygons(const Array &p_polygons) { - polygons = p_polygons; update(); } Array Polygon2D::get_polygons() const { - return polygons; } void Polygon2D::set_color(const Color &p_color) { - color = p_color; update(); } -Color Polygon2D::get_color() const { +Color Polygon2D::get_color() const { return color; } void Polygon2D::set_vertex_colors(const Vector<Color> &p_colors) { - vertex_colors = p_colors; update(); } -Vector<Color> Polygon2D::get_vertex_colors() const { +Vector<Color> Polygon2D::get_vertex_colors() const { return vertex_colors; } void Polygon2D::set_texture(const Ref<Texture2D> &p_texture) { - texture = p_texture; /*if (texture.is_valid()) { @@ -425,8 +412,8 @@ void Polygon2D::set_texture(const Ref<Texture2D> &p_texture) { }*/ update(); } -Ref<Texture2D> Polygon2D::get_texture() const { +Ref<Texture2D> Polygon2D::get_texture() const { return texture; } @@ -467,76 +454,68 @@ float Polygon2D::get_shininess() const { } void Polygon2D::set_texture_offset(const Vector2 &p_offset) { - tex_ofs = p_offset; update(); } -Vector2 Polygon2D::get_texture_offset() const { +Vector2 Polygon2D::get_texture_offset() const { return tex_ofs; } void Polygon2D::set_texture_rotation(float p_rot) { - tex_rot = p_rot; update(); } -float Polygon2D::get_texture_rotation() const { +float Polygon2D::get_texture_rotation() const { return tex_rot; } void Polygon2D::set_texture_rotation_degrees(float p_rot) { - set_texture_rotation(Math::deg2rad(p_rot)); } -float Polygon2D::get_texture_rotation_degrees() const { +float Polygon2D::get_texture_rotation_degrees() const { return Math::rad2deg(get_texture_rotation()); } void Polygon2D::set_texture_scale(const Size2 &p_scale) { - tex_scale = p_scale; update(); } -Size2 Polygon2D::get_texture_scale() const { +Size2 Polygon2D::get_texture_scale() const { return tex_scale; } void Polygon2D::set_invert(bool p_invert) { - invert = p_invert; update(); } -bool Polygon2D::get_invert() const { +bool Polygon2D::get_invert() const { return invert; } void Polygon2D::set_antialiased(bool p_antialiased) { - antialiased = p_antialiased; update(); } -bool Polygon2D::get_antialiased() const { +bool Polygon2D::get_antialiased() const { return antialiased; } void Polygon2D::set_invert_border(float p_invert_border) { - invert_border = p_invert_border; update(); } -float Polygon2D::get_invert_border() const { +float Polygon2D::get_invert_border() const { return invert_border; } void Polygon2D::set_offset(const Vector2 &p_offset) { - offset = p_offset; rect_cache_dirty = true; update(); @@ -544,31 +523,31 @@ void Polygon2D::set_offset(const Vector2 &p_offset) { } Vector2 Polygon2D::get_offset() const { - return offset; } void Polygon2D::add_bone(const NodePath &p_path, const Vector<float> &p_weights) { - Bone bone; bone.path = p_path; bone.weights = p_weights; bone_weights.push_back(bone); } + int Polygon2D::get_bone_count() const { return bone_weights.size(); } + NodePath Polygon2D::get_bone_path(int p_index) const { ERR_FAIL_INDEX_V(p_index, bone_weights.size(), NodePath()); return bone_weights[p_index].path; } -Vector<float> Polygon2D::get_bone_weights(int p_index) const { +Vector<float> Polygon2D::get_bone_weights(int p_index) const { ERR_FAIL_INDEX_V(p_index, bone_weights.size(), Vector<float>()); return bone_weights[p_index].weights; } -void Polygon2D::erase_bone(int p_idx) { +void Polygon2D::erase_bone(int p_idx) { ERR_FAIL_INDEX(p_idx, bone_weights.size()); bone_weights.remove(p_idx); } @@ -582,6 +561,7 @@ void Polygon2D::set_bone_weights(int p_index, const Vector<float> &p_weights) { bone_weights.write[p_index].weights = p_weights; update(); } + void Polygon2D::set_bone_path(int p_index, const NodePath &p_path) { ERR_FAIL_INDEX(p_index, bone_weights.size()); bone_weights.write[p_index].path = p_path; @@ -596,8 +576,8 @@ Array Polygon2D::_get_bones() const { } return bones; } -void Polygon2D::_set_bones(const Array &p_bones) { +void Polygon2D::_set_bones(const Array &p_bones) { ERR_FAIL_COND(p_bones.size() & 1); clear_bones(); for (int i = 0; i < p_bones.size(); i += 2) { @@ -606,8 +586,9 @@ void Polygon2D::_set_bones(const Array &p_bones) { } void Polygon2D::set_skeleton(const NodePath &p_skeleton) { - if (skeleton == p_skeleton) + if (skeleton == p_skeleton) { return; + } skeleton = p_skeleton; update(); } @@ -617,7 +598,6 @@ NodePath Polygon2D::get_skeleton() const { } void Polygon2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_polygon", "polygon"), &Polygon2D::set_polygon); ClassDB::bind_method(D_METHOD("get_polygon"), &Polygon2D::get_polygon); @@ -722,7 +702,6 @@ void Polygon2D::_bind_methods() { } Polygon2D::Polygon2D() { - invert = false; invert_border = 100; antialiased = false; diff --git a/scene/2d/polygon_2d.h b/scene/2d/polygon_2d.h index 777c1f82f3..dafec1c343 100644 --- a/scene/2d/polygon_2d.h +++ b/scene/2d/polygon_2d.h @@ -34,7 +34,6 @@ #include "scene/2d/node_2d.h" class Polygon2D : public Node2D { - GDCLASS(Polygon2D, Node2D); Vector<Vector2> polygon; diff --git a/scene/2d/position_2d.cpp b/scene/2d/position_2d.cpp index 9e95a55d9f..a94a9f7085 100644 --- a/scene/2d/position_2d.cpp +++ b/scene/2d/position_2d.cpp @@ -36,7 +36,6 @@ const float DEFAULT_GIZMO_EXTENTS = 10.0; void Position2D::_draw_cross() { - float extents = get_gizmo_extents(); // Colors taken from `axis_x_color` and `axis_y_color` (defined in `editor/editor_themes.cpp`) draw_line(Point2(-extents, 0), Point2(+extents, 0), Color(0.96, 0.20, 0.32)); @@ -45,7 +44,6 @@ void Position2D::_draw_cross() { #ifdef TOOLS_ENABLED Rect2 Position2D::_edit_get_rect() const { - float extents = get_gizmo_extents(); return Rect2(Point2(-extents, -extents), Size2(extents * 2, extents * 2)); } @@ -56,18 +54,17 @@ bool Position2D::_edit_use_rect() const { #endif void Position2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - update(); } break; case NOTIFICATION_DRAW: { - if (!is_inside_tree()) + if (!is_inside_tree()) { break; - if (Engine::get_singleton()->is_editor_hint()) + } + if (Engine::get_singleton()->is_editor_hint()) { _draw_cross(); + } } break; } @@ -92,7 +89,6 @@ float Position2D::get_gizmo_extents() const { } void Position2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("_set_gizmo_extents", "extents"), &Position2D::set_gizmo_extents); ClassDB::bind_method(D_METHOD("_get_gizmo_extents"), &Position2D::get_gizmo_extents); diff --git a/scene/2d/position_2d.h b/scene/2d/position_2d.h index 3ea636171d..b53fa4c0e2 100644 --- a/scene/2d/position_2d.h +++ b/scene/2d/position_2d.h @@ -34,7 +34,6 @@ #include "scene/2d/node_2d.h" class Position2D : public Node2D { - GDCLASS(Position2D, Node2D); void _draw_cross(); diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp index 9d6c7304ce..5020940c5c 100644 --- a/scene/2d/ray_cast_2d.cpp +++ b/scene/2d/ray_cast_2d.cpp @@ -36,134 +36,129 @@ #include "servers/physics_server_2d.h" void RayCast2D::set_cast_to(const Vector2 &p_point) { - cast_to = p_point; - if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_collisions_hint())) + if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_collisions_hint())) { update(); + } } Vector2 RayCast2D::get_cast_to() const { - return cast_to; } void RayCast2D::set_collision_mask(uint32_t p_mask) { - collision_mask = p_mask; } uint32_t RayCast2D::get_collision_mask() const { - return collision_mask; } void RayCast2D::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } bool RayCast2D::get_collision_mask_bit(int p_bit) const { - return get_collision_mask() & (1 << p_bit); } bool RayCast2D::is_colliding() const { - return collided; } -Object *RayCast2D::get_collider() const { - if (against.is_null()) +Object *RayCast2D::get_collider() const { + if (against.is_null()) { return nullptr; + } return ObjectDB::get_instance(against); } int RayCast2D::get_collider_shape() const { - return against_shape; } -Vector2 RayCast2D::get_collision_point() const { +Vector2 RayCast2D::get_collision_point() const { return collision_point; } -Vector2 RayCast2D::get_collision_normal() const { +Vector2 RayCast2D::get_collision_normal() const { return collision_normal; } void RayCast2D::set_enabled(bool p_enabled) { - enabled = p_enabled; update(); - if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) + if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) { set_physics_process_internal(p_enabled); - if (!p_enabled) + } + if (!p_enabled) { collided = false; + } } bool RayCast2D::is_enabled() const { - return enabled; } void RayCast2D::set_exclude_parent_body(bool p_exclude_parent_body) { - - if (exclude_parent_body == p_exclude_parent_body) + if (exclude_parent_body == p_exclude_parent_body) { return; + } exclude_parent_body = p_exclude_parent_body; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (Object::cast_to<CollisionObject2D>(get_parent())) { - if (exclude_parent_body) + if (exclude_parent_body) { exclude.insert(Object::cast_to<CollisionObject2D>(get_parent())->get_rid()); - else + } else { exclude.erase(Object::cast_to<CollisionObject2D>(get_parent())->get_rid()); + } } } bool RayCast2D::get_exclude_parent_body() const { - return exclude_parent_body; } void RayCast2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - - if (enabled && !Engine::get_singleton()->is_editor_hint()) + if (enabled && !Engine::get_singleton()->is_editor_hint()) { set_physics_process_internal(true); - else + } else { set_physics_process_internal(false); + } if (Object::cast_to<CollisionObject2D>(get_parent())) { - if (exclude_parent_body) + if (exclude_parent_body) { exclude.insert(Object::cast_to<CollisionObject2D>(get_parent())->get_rid()); - else + } else { exclude.erase(Object::cast_to<CollisionObject2D>(get_parent())->get_rid()); + } } } break; case NOTIFICATION_EXIT_TREE: { - - if (enabled) + if (enabled) { set_physics_process_internal(false); + } } break; case NOTIFICATION_DRAW: { - - if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) + if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { break; + } Transform2D xf; xf.rotate(cast_to.angle()); xf.translate(Vector2(cast_to.length(), 0)); @@ -183,17 +178,18 @@ void RayCast2D::_notification(int p_what) { pts.push_back(xf.xform(Vector2(0, Math_SQRT12 * tsize))); pts.push_back(xf.xform(Vector2(0, -Math_SQRT12 * tsize))); Vector<Color> cols; - for (int i = 0; i < 3; i++) + for (int i = 0; i < 3; i++) { cols.push_back(draw_col); + } draw_primitive(pts, cols, Vector<Vector2>()); } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { - - if (!enabled) + if (!enabled) { break; + } _update_raycast_state(); @@ -211,13 +207,13 @@ void RayCast2D::_update_raycast_state() { Transform2D gt = get_global_transform(); Vector2 to = cast_to; - if (to == Vector2()) + if (to == Vector2()) { to = Vector2(0, 0.01); + } PhysicsDirectSpaceState2D::RayResult rr; if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, collide_with_bodies, collide_with_areas)) { - collided = true; against = rr.collider_id; collision_point = rr.position; @@ -235,60 +231,52 @@ void RayCast2D::force_raycast_update() { } void RayCast2D::add_exception_rid(const RID &p_rid) { - exclude.insert(p_rid); } void RayCast2D::add_exception(const Object *p_object) { - ERR_FAIL_NULL(p_object); const CollisionObject2D *co = Object::cast_to<CollisionObject2D>(p_object); - if (!co) + if (!co) { return; + } add_exception_rid(co->get_rid()); } void RayCast2D::remove_exception_rid(const RID &p_rid) { - exclude.erase(p_rid); } void RayCast2D::remove_exception(const Object *p_object) { - ERR_FAIL_NULL(p_object); const CollisionObject2D *co = Object::cast_to<CollisionObject2D>(p_object); - if (!co) + if (!co) { return; + } remove_exception_rid(co->get_rid()); } void RayCast2D::clear_exceptions() { - exclude.clear(); } void RayCast2D::set_collide_with_areas(bool p_clip) { - collide_with_areas = p_clip; } bool RayCast2D::is_collide_with_areas_enabled() const { - return collide_with_areas; } void RayCast2D::set_collide_with_bodies(bool p_clip) { - collide_with_bodies = p_clip; } bool RayCast2D::is_collide_with_bodies_enabled() const { - return collide_with_bodies; } void RayCast2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &RayCast2D::set_enabled); ClassDB::bind_method(D_METHOD("is_enabled"), &RayCast2D::is_enabled); @@ -337,7 +325,6 @@ void RayCast2D::_bind_methods() { } RayCast2D::RayCast2D() { - enabled = false; collided = false; diff --git a/scene/2d/ray_cast_2d.h b/scene/2d/ray_cast_2d.h index 20f05e7525..6accc264a0 100644 --- a/scene/2d/ray_cast_2d.h +++ b/scene/2d/ray_cast_2d.h @@ -34,7 +34,6 @@ #include "scene/2d/node_2d.h" class RayCast2D : public Node2D { - GDCLASS(RayCast2D, Node2D); bool enabled; diff --git a/scene/2d/remote_transform_2d.cpp b/scene/2d/remote_transform_2d.cpp index ec50f5f922..3104436dbe 100644 --- a/scene/2d/remote_transform_2d.cpp +++ b/scene/2d/remote_transform_2d.cpp @@ -32,7 +32,6 @@ #include "scene/scene_string_names.h" void RemoteTransform2D::_update_cache() { - cache = ObjectID(); if (has_node(remote_node)) { Node *node = get_node(remote_node); @@ -45,23 +44,25 @@ void RemoteTransform2D::_update_cache() { } void RemoteTransform2D::_update_remote() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (cache.is_null()) + if (cache.is_null()) { return; + } Node2D *n = Object::cast_to<Node2D>(ObjectDB::get_instance(cache)); - if (!n) + if (!n) { return; + } - if (!n->is_inside_tree()) + if (!n->is_inside_tree()) { return; + } //todo make faster if (use_global_coordinates) { - if (update_remote_position && update_remote_rotation && update_remote_scale) { n->set_global_transform(get_global_transform()); } else { @@ -69,21 +70,23 @@ void RemoteTransform2D::_update_remote() { Transform2D our_trans = get_global_transform(); Vector2 n_scale = n->get_scale(); - if (!update_remote_position) + if (!update_remote_position) { our_trans.set_origin(n_trans.get_origin()); - if (!update_remote_rotation) + } + if (!update_remote_rotation) { our_trans.set_rotation(n_trans.get_rotation()); + } n->set_global_transform(our_trans); - if (update_remote_scale) + if (update_remote_scale) { n->set_scale(get_global_scale()); - else + } else { n->set_scale(n_scale); + } } } else { - if (update_remote_position && update_remote_rotation && update_remote_scale) { n->set_transform(get_transform()); } else { @@ -91,36 +94,36 @@ void RemoteTransform2D::_update_remote() { Transform2D our_trans = get_transform(); Vector2 n_scale = n->get_scale(); - if (!update_remote_position) + if (!update_remote_position) { our_trans.set_origin(n_trans.get_origin()); - if (!update_remote_rotation) + } + if (!update_remote_rotation) { our_trans.set_rotation(n_trans.get_rotation()); + } n->set_transform(our_trans); - if (update_remote_scale) + if (update_remote_scale) { n->set_scale(get_scale()); - else + } else { n->set_scale(n_scale); + } } } } void RemoteTransform2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - _update_cache(); } break; case NOTIFICATION_TRANSFORM_CHANGED: { - if (!is_inside_tree()) + if (!is_inside_tree()) { break; + } if (cache.is_valid()) { - _update_remote(); } @@ -129,7 +132,6 @@ void RemoteTransform2D::_notification(int p_what) { } void RemoteTransform2D::set_remote_node(const NodePath &p_remote_node) { - remote_node = p_remote_node; if (is_inside_tree()) { _update_cache(); @@ -140,7 +142,6 @@ void RemoteTransform2D::set_remote_node(const NodePath &p_remote_node) { } NodePath RemoteTransform2D::get_remote_node() const { - return remote_node; } @@ -185,7 +186,6 @@ void RemoteTransform2D::force_update_cache() { } String RemoteTransform2D::get_configuration_warning() const { - if (!has_node(remote_node) || !Object::cast_to<Node2D>(get_node(remote_node))) { return TTR("Path property must point to a valid Node2D node to work."); } @@ -194,7 +194,6 @@ String RemoteTransform2D::get_configuration_warning() const { } void RemoteTransform2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_remote_node", "path"), &RemoteTransform2D::set_remote_node); ClassDB::bind_method(D_METHOD("get_remote_node"), &RemoteTransform2D::get_remote_node); ClassDB::bind_method(D_METHOD("force_update_cache"), &RemoteTransform2D::force_update_cache); @@ -219,7 +218,6 @@ void RemoteTransform2D::_bind_methods() { } RemoteTransform2D::RemoteTransform2D() { - use_global_coordinates = true; update_remote_position = true; update_remote_rotation = true; diff --git a/scene/2d/remote_transform_2d.h b/scene/2d/remote_transform_2d.h index f5b949d10b..caaa0394f2 100644 --- a/scene/2d/remote_transform_2d.h +++ b/scene/2d/remote_transform_2d.h @@ -34,7 +34,6 @@ #include "scene/2d/node_2d.h" class RemoteTransform2D : public Node2D { - GDCLASS(RemoteTransform2D, Node2D); NodePath remote_node; diff --git a/scene/2d/skeleton_2d.cpp b/scene/2d/skeleton_2d.cpp index 86c9ff6076..ea37c8dfe7 100644 --- a/scene/2d/skeleton_2d.cpp +++ b/scene/2d/skeleton_2d.cpp @@ -31,17 +31,18 @@ #include "skeleton_2d.h" void Bone2D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { Node *parent = get_parent(); parent_bone = Object::cast_to<Bone2D>(parent); skeleton = nullptr; while (parent) { skeleton = Object::cast_to<Skeleton2D>(parent); - if (skeleton) + if (skeleton) { break; - if (!Object::cast_to<Bone2D>(parent)) + } + if (!Object::cast_to<Bone2D>(parent)) { break; //skeletons must be chained to Bone2Ds. + } parent = parent->get_parent(); } @@ -78,8 +79,8 @@ void Bone2D::_notification(int p_what) { parent_bone = nullptr; } } -void Bone2D::_bind_methods() { +void Bone2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_rest", "rest"), &Bone2D::set_rest); ClassDB::bind_method(D_METHOD("get_rest"), &Bone2D::get_rest); ClassDB::bind_method(D_METHOD("apply_rest"), &Bone2D::apply_rest); @@ -95,8 +96,9 @@ void Bone2D::_bind_methods() { void Bone2D::set_rest(const Transform2D &p_rest) { rest = p_rest; - if (skeleton) + if (skeleton) { skeleton->_make_bone_setup_dirty(); + } update_configuration_warning(); } @@ -106,7 +108,6 @@ Transform2D Bone2D::get_rest() const { } Transform2D Bone2D::get_skeleton_rest() const { - if (parent_bone) { return parent_bone->get_skeleton_rest() * rest; } else { @@ -119,7 +120,6 @@ void Bone2D::apply_rest() { } void Bone2D::set_default_length(float p_length) { - default_length = p_length; } @@ -132,8 +132,8 @@ int Bone2D::get_index_in_skeleton() const { skeleton->_update_bone_setup(); return skeleton_index; } -String Bone2D::get_configuration_warning() const { +String Bone2D::get_configuration_warning() const { String warning = Node2D::get_configuration_warning(); if (!skeleton) { if (warning != String()) { @@ -171,9 +171,9 @@ Bone2D::Bone2D() { ////////////////////////////////////// void Skeleton2D::_make_bone_setup_dirty() { - - if (bone_setup_dirty) + if (bone_setup_dirty) { return; + } bone_setup_dirty = true; if (is_inside_tree()) { call_deferred("_update_bone_setup"); @@ -181,9 +181,9 @@ void Skeleton2D::_make_bone_setup_dirty() { } void Skeleton2D::_update_bone_setup() { - - if (!bone_setup_dirty) + if (!bone_setup_dirty) { return; + } bone_setup_dirty = false; RS::get_singleton()->skeleton_allocate(skeleton, bones.size(), true); @@ -207,9 +207,9 @@ void Skeleton2D::_update_bone_setup() { } void Skeleton2D::_make_transform_dirty() { - - if (transform_dirty) + if (transform_dirty) { return; + } transform_dirty = true; if (is_inside_tree()) { call_deferred("_update_transform"); @@ -217,18 +217,17 @@ void Skeleton2D::_make_transform_dirty() { } void Skeleton2D::_update_transform() { - if (bone_setup_dirty) { _update_bone_setup(); return; //above will update transform anyway } - if (!transform_dirty) + if (!transform_dirty) { return; + } transform_dirty = false; for (int i = 0; i < bones.size(); i++) { - ERR_CONTINUE(bones[i].parent_index >= i); if (bones[i].parent_index >= 0) { bones.write[i].accum_transform = bones[bones[i].parent_index].accum_transform * bones[i].bone->get_transform(); @@ -238,14 +237,12 @@ void Skeleton2D::_update_transform() { } for (int i = 0; i < bones.size(); i++) { - Transform2D final_xform = bones[i].accum_transform * bones[i].rest_inverse; RS::get_singleton()->skeleton_bone_set_transform_2d(skeleton, i, final_xform); } } int Skeleton2D::get_bone_count() const { - ERR_FAIL_COND_V(!is_inside_tree(), 0); if (bone_setup_dirty) { @@ -256,7 +253,6 @@ int Skeleton2D::get_bone_count() const { } Bone2D *Skeleton2D::get_bone(int p_idx) { - ERR_FAIL_COND_V(!is_inside_tree(), nullptr); ERR_FAIL_INDEX_V(p_idx, bones.size(), nullptr); @@ -264,13 +260,13 @@ Bone2D *Skeleton2D::get_bone(int p_idx) { } void Skeleton2D::_notification(int p_what) { - if (p_what == NOTIFICATION_READY) { - - if (bone_setup_dirty) + if (bone_setup_dirty) { _update_bone_setup(); - if (transform_dirty) + } + if (transform_dirty) { _update_transform(); + } request_ready(); } @@ -283,8 +279,8 @@ void Skeleton2D::_notification(int p_what) { RID Skeleton2D::get_skeleton() const { return skeleton; } -void Skeleton2D::_bind_methods() { +void Skeleton2D::_bind_methods() { ClassDB::bind_method(D_METHOD("_update_bone_setup"), &Skeleton2D::_update_bone_setup); ClassDB::bind_method(D_METHOD("_update_transform"), &Skeleton2D::_update_transform); @@ -305,6 +301,5 @@ Skeleton2D::Skeleton2D() { } Skeleton2D::~Skeleton2D() { - RS::get_singleton()->free(skeleton); } diff --git a/scene/2d/sprite_2d.cpp b/scene/2d/sprite_2d.cpp index df8859bd9a..7e07019578 100644 --- a/scene/2d/sprite_2d.cpp +++ b/scene/2d/sprite_2d.cpp @@ -61,7 +61,6 @@ bool Sprite2D::_edit_use_pivot() const { } bool Sprite2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - return is_pixel_opaque(p_point); } @@ -79,7 +78,6 @@ Rect2 Sprite2D::get_anchorable_rect() const { } void Sprite2D::_get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_clip) const { - Rect2 base_rect; if (region) { @@ -98,28 +96,29 @@ void Sprite2D::_get_rects(Rect2 &r_src_rect, Rect2 &r_dst_rect, bool &r_filter_c r_src_rect.position = base_rect.position + frame_offset; Point2 dest_offset = offset; - if (centered) + if (centered) { dest_offset -= frame_size / 2; + } if (Engine::get_singleton()->get_use_pixel_snap()) { dest_offset = dest_offset.floor(); } r_dst_rect = Rect2(dest_offset, frame_size); - if (hflip) + if (hflip) { r_dst_rect.size.x = -r_dst_rect.size.x; - if (vflip) + } + if (vflip) { r_dst_rect.size.y = -r_dst_rect.size.y; + } } void Sprite2D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_DRAW: { - - if (texture.is_null()) + if (texture.is_null()) { return; + } RID ci = get_canvas_item(); @@ -138,17 +137,19 @@ void Sprite2D::_notification(int p_what) { } void Sprite2D::set_texture(const Ref<Texture2D> &p_texture) { - - if (p_texture == texture) + if (p_texture == texture) { return; + } - if (texture.is_valid()) + if (texture.is_valid()) { texture->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Sprite2D::_texture_changed)); + } texture = p_texture; - if (texture.is_valid()) + if (texture.is_valid()) { texture->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Sprite2D::_texture_changed)); + } update(); emit_signal("texture_changed"); @@ -157,24 +158,20 @@ void Sprite2D::set_texture(const Ref<Texture2D> &p_texture) { } void Sprite2D::set_normal_map(const Ref<Texture2D> &p_texture) { - normal_map = p_texture; update(); } Ref<Texture2D> Sprite2D::get_normal_map() const { - return normal_map; } void Sprite2D::set_specular_map(const Ref<Texture2D> &p_texture) { - specular = p_texture; update(); } Ref<Texture2D> Sprite2D::get_specular_map() const { - return specular; } @@ -197,83 +194,76 @@ float Sprite2D::get_shininess() const { } Ref<Texture2D> Sprite2D::get_texture() const { - return texture; } void Sprite2D::set_centered(bool p_center) { - centered = p_center; update(); item_rect_changed(); } bool Sprite2D::is_centered() const { - return centered; } void Sprite2D::set_offset(const Point2 &p_offset) { - offset = p_offset; update(); item_rect_changed(); _change_notify("offset"); } -Point2 Sprite2D::get_offset() const { +Point2 Sprite2D::get_offset() const { return offset; } void Sprite2D::set_flip_h(bool p_flip) { - hflip = p_flip; update(); } -bool Sprite2D::is_flipped_h() const { +bool Sprite2D::is_flipped_h() const { return hflip; } void Sprite2D::set_flip_v(bool p_flip) { - vflip = p_flip; update(); } -bool Sprite2D::is_flipped_v() const { +bool Sprite2D::is_flipped_v() const { return vflip; } void Sprite2D::set_region(bool p_region) { - - if (p_region == region) + if (p_region == region) { return; + } region = p_region; update(); } bool Sprite2D::is_region() const { - return region; } void Sprite2D::set_region_rect(const Rect2 &p_region_rect) { - - if (region_rect == p_region_rect) + if (region_rect == p_region_rect) { return; + } region_rect = p_region_rect; - if (region) + if (region) { item_rect_changed(); + } _change_notify("region_rect"); } Rect2 Sprite2D::get_region_rect() const { - return region_rect; } @@ -287,11 +277,11 @@ bool Sprite2D::is_region_filter_clip_enabled() const { } void Sprite2D::set_frame(int p_frame) { - ERR_FAIL_INDEX(p_frame, vframes * hframes); - if (frame != p_frame) + if (frame != p_frame) { item_rect_changed(); + } frame = p_frame; @@ -301,7 +291,6 @@ void Sprite2D::set_frame(int p_frame) { } int Sprite2D::get_frame() const { - return frame; } @@ -317,52 +306,54 @@ Vector2 Sprite2D::get_frame_coords() const { } void Sprite2D::set_vframes(int p_amount) { - ERR_FAIL_COND_MSG(p_amount < 1, "Amount of vframes cannot be smaller than 1."); vframes = p_amount; update(); item_rect_changed(); _change_notify(); } -int Sprite2D::get_vframes() const { +int Sprite2D::get_vframes() const { return vframes; } void Sprite2D::set_hframes(int p_amount) { - ERR_FAIL_COND_MSG(p_amount < 1, "Amount of hframes cannot be smaller than 1."); hframes = p_amount; update(); item_rect_changed(); _change_notify(); } -int Sprite2D::get_hframes() const { +int Sprite2D::get_hframes() const { return hframes; } bool Sprite2D::is_pixel_opaque(const Point2 &p_point) const { - - if (texture.is_null()) + if (texture.is_null()) { return false; + } - if (texture->get_size().width == 0 || texture->get_size().height == 0) + if (texture->get_size().width == 0 || texture->get_size().height == 0) { return false; + } Rect2 src_rect, dst_rect; bool filter_clip; _get_rects(src_rect, dst_rect, filter_clip); dst_rect.size = dst_rect.size.abs(); - if (!dst_rect.has_point(p_point)) + if (!dst_rect.has_point(p_point)) { return false; + } Vector2 q = (p_point - dst_rect.position) / dst_rect.size; - if (hflip) + if (hflip) { q.x = 1.0f - q.x; - if (vflip) + } + if (vflip) { q.y = 1.0f - q.y; + } q = q * src_rect.size + src_rect.position; #ifndef _MSC_VER #warning this need to be obtained from CanvasItem new repeat mode (but it needs to guess it from hierarchy, need to add a function for that) @@ -393,9 +384,9 @@ bool Sprite2D::is_pixel_opaque(const Point2 &p_point) const { } Rect2 Sprite2D::get_rect() const { - - if (texture.is_null()) + if (texture.is_null()) { return Rect2(0, 0, 1, 1); + } Size2i s; @@ -408,17 +399,18 @@ Rect2 Sprite2D::get_rect() const { s = s / Point2(hframes, vframes); Point2 ofs = offset; - if (centered) + if (centered) { ofs -= Size2(s) / 2; + } - if (s == Size2(0, 0)) + if (s == Size2(0, 0)) { s = Size2(1, 1); + } return Rect2(ofs, s); } void Sprite2D::_validate_property(PropertyInfo &property) const { - if (property.name == "frame") { property.hint = PROPERTY_HINT_RANGE; property.hint_string = "0," + itos(vframes * hframes - 1) + ",1"; @@ -431,7 +423,6 @@ void Sprite2D::_validate_property(PropertyInfo &property) const { } void Sprite2D::_texture_changed() { - // Changes to the texture need to trigger an update to make // the editor redraw the sprite with the updated texture. if (texture.is_valid()) { @@ -440,7 +431,6 @@ void Sprite2D::_texture_changed() { } void Sprite2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_texture", "texture"), &Sprite2D::set_texture); ClassDB::bind_method(D_METHOD("get_texture"), &Sprite2D::get_texture); @@ -520,7 +510,6 @@ void Sprite2D::_bind_methods() { } Sprite2D::Sprite2D() { - centered = true; hflip = false; vflip = false; diff --git a/scene/2d/sprite_2d.h b/scene/2d/sprite_2d.h index 599a9e937e..c72e956307 100644 --- a/scene/2d/sprite_2d.h +++ b/scene/2d/sprite_2d.h @@ -35,7 +35,6 @@ #include "scene/resources/texture.h" class Sprite2D : public Node2D { - GDCLASS(Sprite2D, Node2D); Ref<Texture2D> texture; diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 869f290f97..c7a809f6d8 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -39,22 +39,18 @@ #include "servers/physics_server_2d.h" int TileMap::_get_quadrant_size() const { - - if (use_y_sort) + if (use_y_sort) { return 1; - else + } else { return quadrant_size; + } } void TileMap::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - Node2D *c = this; while (c) { - navigation = Object::cast_to<Navigation2D>(c); if (navigation) { break; @@ -79,14 +75,11 @@ void TileMap::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { - _update_quadrant_space(RID()); for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); if (navigation) { for (Map<PosKey, Quadrant::NavPoly>::Element *F = q.navpoly_ids.front(); F; F = F->next()) { - NavigationServer2D::get_singleton()->region_set_map(F->get().region, RID()); } q.navpoly_ids.clear(); @@ -109,13 +102,11 @@ void TileMap::_notification(int p_what) { } break; case NOTIFICATION_TRANSFORM_CHANGED: { - //move stuff _update_quadrant_transform(); } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (use_parent) { _recreate_quadrants(); } @@ -125,10 +116,8 @@ void TileMap::_notification(int p_what) { } void TileMap::_update_quadrant_space(const RID &p_space) { - if (!use_parent) { for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); PhysicsServer2D::get_singleton()->body_set_space(q.body, p_space); } @@ -136,22 +125,23 @@ void TileMap::_update_quadrant_space(const RID &p_space) { } void TileMap::_update_quadrant_transform() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } Transform2D global_transform = get_global_transform(); Transform2D local_transform; - if (collision_parent) + if (collision_parent) { local_transform = get_transform(); + } Transform2D nav_rel; - if (navigation) + if (navigation) { nav_rel = get_relative_transform_to_parent(navigation); + } for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); Transform2D xform; xform.set_origin(q.pos); @@ -163,7 +153,6 @@ void TileMap::_update_quadrant_transform() { if (navigation) { for (Map<PosKey, Quadrant::NavPoly>::Element *F = q.navpoly_ids.front(); F; F = F->next()) { - NavigationServer2D::get_singleton()->region_set_transform(F->get().region, nav_rel * F->get().xform); } } @@ -175,7 +164,6 @@ void TileMap::_update_quadrant_transform() { } void TileMap::set_tileset(const Ref<TileSet> &p_tileset) { - if (tile_set.is_valid()) { tile_set->disconnect("changed", callable_mp(this, &TileMap::_recreate_quadrants)); tile_set->remove_change_receptor(this); @@ -196,12 +184,10 @@ void TileMap::set_tileset(const Ref<TileSet> &p_tileset) { } Ref<TileSet> TileMap::get_tileset() const { - return tile_set; } void TileMap::set_cell_size(Size2 p_size) { - ERR_FAIL_COND(p_size.x < 1 || p_size.y < 1); _clear_quadrants(); @@ -211,12 +197,10 @@ void TileMap::set_cell_size(Size2 p_size) { } Size2 TileMap::get_cell_size() const { - return cell_size; } void TileMap::set_quadrant_size(int p_size) { - ERR_FAIL_COND_MSG(p_size < 1, "Quadrant size cannot be smaller than 1."); _clear_quadrants(); @@ -226,17 +210,14 @@ void TileMap::set_quadrant_size(int p_size) { } int TileMap::get_quadrant_size() const { - return quadrant_size; } void TileMap::_fix_cell_transform(Transform2D &xform, const Cell &p_cell, const Vector2 &p_offset, const Size2 &p_sc) { - Size2 s = p_sc; Vector2 offset = p_offset; if (compatibility_mode && !centered_textures) { - if (tile_origin == TILE_ORIGIN_BOTTOM_LEFT) { offset.y += cell_size.y; } else if (tile_origin == TILE_ORIGIN_CENTER) { @@ -326,9 +307,9 @@ void TileMap::_add_shape(int &shape_idx, const Quadrant &p_q, const Ref<Shape2D> } void TileMap::update_dirty_quadrants() { - - if (!pending_update) + if (!pending_update) { return; + } if (!is_inside_tree() || !tile_set.is_valid()) { pending_update = false; return; @@ -338,8 +319,9 @@ void TileMap::update_dirty_quadrants() { PhysicsServer2D *ps = PhysicsServer2D::get_singleton(); Vector2 tofs = get_cell_draw_offset(); Transform2D nav_rel; - if (navigation) + if (navigation) { nav_rel = get_relative_transform_to_parent(navigation); + } Vector2 qofs; @@ -358,11 +340,9 @@ void TileMap::update_dirty_quadrants() { } while (dirty_quadrant_list.first()) { - Quadrant &q = *dirty_quadrant_list.first()->self(); for (List<RID>::Element *E = q.canvas_items.front(); E; E = E->next()) { - vs->free(E->get()); } @@ -377,7 +357,6 @@ void TileMap::update_dirty_quadrants() { if (navigation) { for (Map<PosKey, Quadrant::NavPoly>::Element *E = q.navpoly_ids.front(); E; E = E->next()) { - NavigationServer2D::get_singleton()->region_set_map(E->get().region, RID()); } q.navpoly_ids.clear(); @@ -393,20 +372,21 @@ void TileMap::update_dirty_quadrants() { RID prev_debug_canvas_item; for (int i = 0; i < q.cells.size(); i++) { - Map<PosKey, Cell>::Element *E = tile_map.find(q.cells[i]); Cell &c = E->get(); //moment of truth - if (!tile_set->has_tile(c.id)) + if (!tile_set->has_tile(c.id)) { continue; + } Ref<Texture2D> tex = tile_set->tile_get_texture(c.id); Vector2 tile_ofs = tile_set->tile_get_texture_offset(c.id); Vector2 wofs = _map_to_world(E->key().x, E->key().y); Vector2 offset = wofs - q.pos + tofs; - if (!tex.is_valid()) + if (!tex.is_valid()) { continue; + } Ref<ShaderMaterial> mat = tile_set->tile_get_material(c.id); int z_index = tile_set->tile_get_z_index(c.id); @@ -420,10 +400,10 @@ void TileMap::update_dirty_quadrants() { RID debug_canvas_item; if (prev_canvas_item == RID() || prev_material != mat || prev_z_index != z_index) { - canvas_item = vs->canvas_item_create(); - if (mat.is_valid()) + if (mat.is_valid()) { vs->canvas_item_set_material(canvas_item, mat->get_rid()); + } vs->canvas_item_set_parent(canvas_item, get_canvas_item()); _update_item_material_state(canvas_item); Transform2D xform; @@ -435,7 +415,6 @@ void TileMap::update_dirty_quadrants() { q.canvas_items.push_back(canvas_item); if (debug_shapes) { - debug_canvas_item = vs->canvas_item_create(); vs->canvas_item_set_parent(debug_canvas_item, canvas_item); vs->canvas_item_set_z_as_relative_to_parent(debug_canvas_item, false); @@ -463,10 +442,11 @@ void TileMap::update_dirty_quadrants() { } Size2 s; - if (r == Rect2()) + if (r == Rect2()) { s = tex->get_size(); - else + } else { s = r.size; + } Rect2 rect; rect.position = offset.floor(); @@ -476,11 +456,13 @@ void TileMap::update_dirty_quadrants() { if (compatibility_mode && !centered_textures) { if (rect.size.y > rect.size.x) { - if ((c.flip_h && (c.flip_v || c.transpose)) || (c.flip_v && !c.transpose)) + if ((c.flip_h && (c.flip_v || c.transpose)) || (c.flip_v && !c.transpose)) { tile_ofs.y += rect.size.y - rect.size.x; + } } else if (rect.size.y < rect.size.x) { - if ((c.flip_v && (c.flip_h || c.transpose)) || (c.flip_h && !c.transpose)) + if ((c.flip_v && (c.flip_h || c.transpose)) || (c.flip_h && !c.transpose)) { tile_ofs.x += rect.size.x - rect.size.y; + } } } @@ -509,34 +491,36 @@ void TileMap::update_dirty_quadrants() { rect.position += tile_ofs; } else if (tile_origin == TILE_ORIGIN_BOTTOM_LEFT) { - rect.position += tile_ofs; if (c.transpose) { - if (c.flip_h) + if (c.flip_h) { rect.position.x -= cell_size.x; - else + } else { rect.position.x += cell_size.x; + } } else { - if (c.flip_v) + if (c.flip_v) { rect.position.y -= cell_size.y; - else + } else { rect.position.y += cell_size.y; + } } } else if (tile_origin == TILE_ORIGIN_CENTER) { - rect.position += tile_ofs; - if (c.flip_h) + if (c.flip_h) { rect.position.x -= cell_size.x / 2; - else + } else { rect.position.x += cell_size.x / 2; + } - if (c.flip_v) + if (c.flip_v) { rect.position.y -= cell_size.y / 2; - else + } else { rect.position.y += cell_size.y / 2; + } } } else { rect.position += tile_ofs; @@ -651,10 +635,8 @@ void TileMap::update_dirty_quadrants() { Vector<int> polygon = navpoly->get_polygon(j); for (int k = 2; k < polygon.size(); k++) { - int kofs[3] = { 0, k - 1, k }; for (int l = 0; l < 3; l++) { - int idx = polygon[kofs[l]]; ERR_FAIL_INDEX(idx, vsize); indices.push_back(idx); @@ -704,13 +686,10 @@ void TileMap::update_dirty_quadrants() { pending_update = false; if (quadrant_order_dirty) { - int index = -(int64_t)0x80000000; //always must be drawn below children for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); for (List<RID>::Element *F = q.canvas_items.front(); F; F = F->next()) { - RS::get_singleton()->canvas_item_set_draw_index(F->get(), index++); } } @@ -722,24 +701,24 @@ void TileMap::update_dirty_quadrants() { } void TileMap::_recompute_rect_cache() { - #ifdef DEBUG_ENABLED - if (!rect_cache_dirty) + if (!rect_cache_dirty) { return; + } Rect2 r_total; for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Rect2 r; r.position = _map_to_world(E->key().x * _get_quadrant_size(), E->key().y * _get_quadrant_size()); r.expand_to(_map_to_world(E->key().x * _get_quadrant_size() + _get_quadrant_size(), E->key().y * _get_quadrant_size())); r.expand_to(_map_to_world(E->key().x * _get_quadrant_size() + _get_quadrant_size(), E->key().y * _get_quadrant_size() + _get_quadrant_size())); r.expand_to(_map_to_world(E->key().x * _get_quadrant_size(), E->key().y * _get_quadrant_size() + _get_quadrant_size())); - if (E == quadrant_map.front()) + if (E == quadrant_map.front()) { r_total = r; - else + } else { r_total = r_total.merge(r); + } } rect_cache = r_total; @@ -751,16 +730,16 @@ void TileMap::_recompute_rect_cache() { } Map<TileMap::PosKey, TileMap::Quadrant>::Element *TileMap::_create_quadrant(const PosKey &p_qk) { - Transform2D xform; //xform.set_origin(Point2(p_qk.x,p_qk.y)*cell_size*quadrant_size); Quadrant q; q.pos = _map_to_world(p_qk.x * _get_quadrant_size(), p_qk.y * _get_quadrant_size()); q.pos += get_cell_draw_offset(); - if (tile_origin == TILE_ORIGIN_CENTER) + if (tile_origin == TILE_ORIGIN_CENTER) { q.pos += cell_size / 2; - else if (tile_origin == TILE_ORIGIN_BOTTOM_LEFT) + } else if (tile_origin == TILE_ORIGIN_BOTTOM_LEFT) { q.pos.y += cell_size.y; + } xform.set_origin(q.pos); //q.canvas_item = RenderingServer::get_singleton()->canvas_item_create(); @@ -794,7 +773,6 @@ Map<TileMap::PosKey, TileMap::Quadrant>::Element *TileMap::_create_quadrant(cons } void TileMap::_erase_quadrant(Map<PosKey, Quadrant>::Element *Q) { - Quadrant &q = Q->get(); if (!use_parent) { PhysicsServer2D::get_singleton()->free(q.body); @@ -803,16 +781,15 @@ void TileMap::_erase_quadrant(Map<PosKey, Quadrant>::Element *Q) { } for (List<RID>::Element *E = q.canvas_items.front(); E; E = E->next()) { - RenderingServer::get_singleton()->free(E->get()); } q.canvas_items.clear(); - if (q.dirty_list.in_list()) + if (q.dirty_list.in_list()) { dirty_quadrant_list.remove(&q.dirty_list); + } if (navigation) { for (Map<PosKey, Quadrant::NavPoly>::Element *E = q.navpoly_ids.front(); E; E = E->next()) { - NavigationServer2D::get_singleton()->region_set_map(E->get().region, RID()); } q.navpoly_ids.clear(); @@ -828,16 +805,18 @@ void TileMap::_erase_quadrant(Map<PosKey, Quadrant>::Element *Q) { } void TileMap::_make_quadrant_dirty(Map<PosKey, Quadrant>::Element *Q, bool update) { - Quadrant &q = Q->get(); - if (!q.dirty_list.in_list()) + if (!q.dirty_list.in_list()) { dirty_quadrant_list.add(&q.dirty_list); + } - if (pending_update) + if (pending_update) { return; + } pending_update = true; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (update) { call_deferred("update_dirty_quadrants"); @@ -845,12 +824,10 @@ void TileMap::_make_quadrant_dirty(Map<PosKey, Quadrant>::Element *Q, bool updat } void TileMap::set_cellv(const Vector2 &p_pos, int p_tile, bool p_flip_x, bool p_flip_y, bool p_transpose) { - set_cell(p_pos.x, p_pos.y, p_tile, p_flip_x, p_flip_y, p_transpose); } void TileMap::_set_celld(const Vector2 &p_pos, const Dictionary &p_data) { - Variant v_pos_x = p_pos.x, v_pos_y = p_pos.y, v_tile = p_data["id"], v_flip_h = p_data["flip_h"], v_flip_v = p_data["flip_y"], v_transpose = p_data["transpose"], v_autotile_coord = p_data["auto_coord"]; const Variant *args[7] = { &v_pos_x, &v_pos_y, &v_tile, &v_flip_h, &v_flip_v, &v_transpose, &v_autotile_coord }; Callable::CallError ce; @@ -858,12 +835,12 @@ void TileMap::_set_celld(const Vector2 &p_pos, const Dictionary &p_data) { } void TileMap::set_cell(int p_x, int p_y, int p_tile, bool p_flip_x, bool p_flip_y, bool p_transpose, Vector2 p_autotile_coord) { - PosKey pk(p_x, p_y); Map<PosKey, Cell>::Element *E = tile_map.find(pk); - if (!E && p_tile == INVALID_CELL) + if (!E && p_tile == INVALID_CELL) { return; //nothing to do + } PosKey qk = pk.to_quadrant(_get_quadrant_size()); if (p_tile == INVALID_CELL) { @@ -873,10 +850,11 @@ void TileMap::set_cell(int p_x, int p_y, int p_tile, bool p_flip_x, bool p_flip_ ERR_FAIL_COND(!Q); Quadrant &q = Q->get(); q.cells.erase(pk); - if (q.cells.size() == 0) + if (q.cells.size() == 0) { _erase_quadrant(Q); - else + } else { _make_quadrant_dirty(Q); + } used_size_cache_dirty = true; return; @@ -894,8 +872,9 @@ void TileMap::set_cell(int p_x, int p_y, int p_tile, bool p_flip_x, bool p_flip_ } else { ERR_FAIL_COND(!Q); // quadrant should exist... - if (E->get().id == p_tile && E->get().flip_h == p_flip_x && E->get().flip_v == p_flip_y && E->get().transpose == p_transpose && E->get().autotile_coord_x == (uint16_t)p_autotile_coord.x && E->get().autotile_coord_y == (uint16_t)p_autotile_coord.y) + if (E->get().id == p_tile && E->get().flip_h == p_flip_x && E->get().flip_v == p_flip_y && E->get().transpose == p_transpose && E->get().autotile_coord_x == (uint16_t)p_autotile_coord.x && E->get().autotile_coord_y == (uint16_t)p_autotile_coord.y) { return; //nothing changed + } } Cell &c = E->get(); @@ -912,12 +891,10 @@ void TileMap::set_cell(int p_x, int p_y, int p_tile, bool p_flip_x, bool p_flip_ } int TileMap::get_cellv(const Vector2 &p_pos) const { - return get_cell(p_pos.x, p_pos.y); } void TileMap::make_bitmask_area_dirty(const Vector2 &p_pos) { - for (int x = p_pos.x - 1; x <= p_pos.x + 1; x++) { for (int y = p_pos.y - 1; y <= p_pos.y + 1; y++) { PosKey p(x, y); @@ -929,7 +906,6 @@ void TileMap::make_bitmask_area_dirty(const Vector2 &p_pos) { } void TileMap::update_bitmask_area(const Vector2 &p_pos) { - for (int x = p_pos.x - 1; x <= p_pos.x + 1; x++) { for (int y = p_pos.y - 1; y <= p_pos.y + 1; y++) { update_cell_bitmask(x, y); @@ -938,7 +914,6 @@ void TileMap::update_bitmask_area(const Vector2 &p_pos) { } void TileMap::update_bitmask_region(const Vector2 &p_start, const Vector2 &p_end) { - if ((p_end.x < p_start.x || p_end.y < p_start.y) || (p_end.x == p_start.x && p_end.y == p_start.y)) { Array a = get_used_cells(); for (int i = 0; i < a.size(); i++) { @@ -955,7 +930,6 @@ void TileMap::update_bitmask_region(const Vector2 &p_start, const Vector2 &p_end } void TileMap::update_cell_bitmask(int p_x, int p_y) { - ERR_FAIL_COND_MSG(tile_set.is_null(), "Cannot update cell bitmask if Tileset is not open."); PosKey p(p_x, p_y); Map<PosKey, Cell>::Element *E = tile_map.find(p); @@ -1027,11 +1001,9 @@ void TileMap::update_cell_bitmask(int p_x, int p_y) { _make_quadrant_dirty(Q); } else if (tile_set->tile_get_tile_mode(id) == TileSet::SINGLE_TILE) { - E->get().autotile_coord_x = 0; E->get().autotile_coord_y = 0; } else if (tile_set->tile_get_tile_mode(id) == TileSet::ATLAS_TILE) { - if (tile_set->autotile_get_bitmask(id, Vector2(p_x, p_y)) == TileSet::BIND_CENTER) { Vector2 coord = tile_set->atlastile_get_subtile_by_priority(id, this, Vector2(p_x, p_y)); @@ -1043,7 +1015,6 @@ void TileMap::update_cell_bitmask(int p_x, int p_y) { } void TileMap::update_dirty_bitmask() { - while (dirty_bitmask.size() > 0) { update_cell_bitmask(dirty_bitmask[0].x, dirty_bitmask[0].y); dirty_bitmask.pop_front(); @@ -1051,10 +1022,8 @@ void TileMap::update_dirty_bitmask() { } void TileMap::fix_invalid_tiles() { - ERR_FAIL_COND_MSG(tile_set.is_null(), "Cannot fix invalid tiles if Tileset is not open."); for (Map<PosKey, Cell>::Element *E = tile_map.front(); E; E = E->next()) { - if (!tile_set->has_tile(get_cell(E->key().x, E->key().y))) { set_cell(E->key().x, E->key().y, INVALID_CELL); } @@ -1062,58 +1031,61 @@ void TileMap::fix_invalid_tiles() { } int TileMap::get_cell(int p_x, int p_y) const { - PosKey pk(p_x, p_y); const Map<PosKey, Cell>::Element *E = tile_map.find(pk); - if (!E) + if (!E) { return INVALID_CELL; + } return E->get().id; } -bool TileMap::is_cell_x_flipped(int p_x, int p_y) const { +bool TileMap::is_cell_x_flipped(int p_x, int p_y) const { PosKey pk(p_x, p_y); const Map<PosKey, Cell>::Element *E = tile_map.find(pk); - if (!E) + if (!E) { return false; + } return E->get().flip_h; } -bool TileMap::is_cell_y_flipped(int p_x, int p_y) const { +bool TileMap::is_cell_y_flipped(int p_x, int p_y) const { PosKey pk(p_x, p_y); const Map<PosKey, Cell>::Element *E = tile_map.find(pk); - if (!E) + if (!E) { return false; + } return E->get().flip_v; } -bool TileMap::is_cell_transposed(int p_x, int p_y) const { +bool TileMap::is_cell_transposed(int p_x, int p_y) const { PosKey pk(p_x, p_y); const Map<PosKey, Cell>::Element *E = tile_map.find(pk); - if (!E) + if (!E) { return false; + } return E->get().transpose; } void TileMap::set_cell_autotile_coord(int p_x, int p_y, const Vector2 &p_coord) { - PosKey pk(p_x, p_y); const Map<PosKey, Cell>::Element *E = tile_map.find(pk); - if (!E) + if (!E) { return; + } Cell c = E->get(); c.autotile_coord_x = p_coord.x; @@ -1123,30 +1095,29 @@ void TileMap::set_cell_autotile_coord(int p_x, int p_y, const Vector2 &p_coord) PosKey qk = pk.to_quadrant(_get_quadrant_size()); Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk); - if (!Q) + if (!Q) { return; + } _make_quadrant_dirty(Q); } Vector2 TileMap::get_cell_autotile_coord(int p_x, int p_y) const { - PosKey pk(p_x, p_y); const Map<PosKey, Cell>::Element *E = tile_map.find(pk); - if (!E) + if (!E) { return Vector2(); + } return Vector2(E->get().autotile_coord_x, E->get().autotile_coord_y); } void TileMap::_recreate_quadrants() { - _clear_quadrants(); for (Map<PosKey, Cell>::Element *E = tile_map.front(); E; E = E->next()) { - PosKey qk = PosKey(E->key().x, E->key().y).to_quadrant(_get_quadrant_size()); Map<PosKey, Quadrant>::Element *Q = quadrant_map.find(qk); @@ -1162,50 +1133,41 @@ void TileMap::_recreate_quadrants() { } void TileMap::_clear_quadrants() { - while (quadrant_map.size()) { _erase_quadrant(quadrant_map.front()); } } void TileMap::set_material(const Ref<Material> &p_material) { - CanvasItem::set_material(p_material); _update_all_items_material_state(); } void TileMap::set_use_parent_material(bool p_use_parent_material) { - CanvasItem::set_use_parent_material(p_use_parent_material); _update_all_items_material_state(); } void TileMap::_update_all_items_material_state() { - for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); for (List<RID>::Element *F = q.canvas_items.front(); F; F = F->next()) { - _update_item_material_state(F->get()); } } } void TileMap::_update_item_material_state(const RID &p_canvas_item) { - RS::get_singleton()->canvas_item_set_use_parent_material(p_canvas_item, get_use_parent_material() || get_material().is_valid()); } void TileMap::clear() { - _clear_quadrants(); tile_map.clear(); used_size_cache_dirty = true; } void TileMap::_set_tile_data(const Vector<int> &p_data) { - ERR_FAIL_COND(format > FORMAT_2); int c = p_data.size(); @@ -1215,11 +1177,11 @@ void TileMap::_set_tile_data(const Vector<int> &p_data) { clear(); for (int i = 0; i < c; i += offset) { - const uint8_t *ptr = (const uint8_t *)&r[i]; uint8_t local[12]; - for (int j = 0; j < ((format == FORMAT_2) ? 12 : 8); j++) + for (int j = 0; j < ((format == FORMAT_2) ? 12 : 8); j++) { local[j] = ptr[j]; + } #ifdef BIG_ENDIAN_ENABLED @@ -1253,7 +1215,6 @@ void TileMap::_set_tile_data(const Vector<int> &p_data) { } Vector<int> TileMap::_get_tile_data() const { - Vector<int> data; data.resize(tile_map.size() * 3); int *w = data.ptrw(); @@ -1266,12 +1227,15 @@ Vector<int> TileMap::_get_tile_data() const { encode_uint16(E->key().x, &ptr[0]); encode_uint16(E->key().y, &ptr[2]); uint32_t val = E->get().id; - if (E->get().flip_h) + if (E->get().flip_h) { val |= (1 << 29); - if (E->get().flip_v) + } + if (E->get().flip_v) { val |= (1 << 30); - if (E->get().transpose) + } + if (E->get().transpose) { val |= (1 << 31); + } encode_uint32(val, &ptr[4]); encode_uint16(E->get().autotile_coord_x, &ptr[8]); encode_uint16(E->get().autotile_coord_y, &ptr[10]); @@ -1293,11 +1257,9 @@ Rect2 TileMap::_edit_get_rect() const { #endif void TileMap::set_collision_layer(uint32_t p_layer) { - collision_layer = p_layer; if (!use_parent) { for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); PhysicsServer2D::get_singleton()->body_set_collision_layer(q.body, collision_layer); } @@ -1305,11 +1267,9 @@ void TileMap::set_collision_layer(uint32_t p_layer) { } void TileMap::set_collision_mask(uint32_t p_mask) { - collision_mask = p_mask; if (!use_parent) { for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); PhysicsServer2D::get_singleton()->body_set_collision_mask(q.body, collision_mask); } @@ -1317,46 +1277,43 @@ void TileMap::set_collision_mask(uint32_t p_mask) { } void TileMap::set_collision_layer_bit(int p_bit, bool p_value) { - uint32_t layer = get_collision_layer(); - if (p_value) + if (p_value) { layer |= 1 << p_bit; - else + } else { layer &= ~(1 << p_bit); + } set_collision_layer(layer); } void TileMap::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } bool TileMap::get_collision_use_kinematic() const { - return use_kinematic; } void TileMap::set_collision_use_kinematic(bool p_use_kinematic) { - _clear_quadrants(); use_kinematic = p_use_kinematic; _recreate_quadrants(); } bool TileMap::get_collision_use_parent() const { - return use_parent; } void TileMap::set_collision_use_parent(bool p_use_parent) { - - if (use_parent == p_use_parent) + if (use_parent == p_use_parent) { return; + } _clear_quadrants(); @@ -1375,11 +1332,9 @@ void TileMap::set_collision_use_parent(bool p_use_parent) { } void TileMap::set_collision_friction(float p_friction) { - friction = p_friction; if (!use_parent) { for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); PhysicsServer2D::get_singleton()->body_set_param(q.body, PhysicsServer2D::BODY_PARAM_FRICTION, p_friction); } @@ -1387,48 +1342,40 @@ void TileMap::set_collision_friction(float p_friction) { } float TileMap::get_collision_friction() const { - return friction; } void TileMap::set_collision_bounce(float p_bounce) { - bounce = p_bounce; if (!use_parent) { for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - Quadrant &q = E->get(); PhysicsServer2D::get_singleton()->body_set_param(q.body, PhysicsServer2D::BODY_PARAM_BOUNCE, p_bounce); } } } -float TileMap::get_collision_bounce() const { +float TileMap::get_collision_bounce() const { return bounce; } uint32_t TileMap::get_collision_layer() const { - return collision_layer; } uint32_t TileMap::get_collision_mask() const { - return collision_mask; } bool TileMap::get_collision_layer_bit(int p_bit) const { - return get_collision_layer() & (1 << p_bit); } bool TileMap::get_collision_mask_bit(int p_bit) const { - return get_collision_mask() & (1 << p_bit); } void TileMap::set_mode(Mode p_mode) { - _clear_quadrants(); mode = p_mode; _recreate_quadrants(); @@ -1440,7 +1387,6 @@ TileMap::Mode TileMap::get_mode() const { } void TileMap::set_half_offset(HalfOffset p_half_offset) { - _clear_quadrants(); half_offset = p_half_offset; _recreate_quadrants(); @@ -1448,7 +1394,6 @@ void TileMap::set_half_offset(HalfOffset p_half_offset) { } void TileMap::set_tile_origin(TileOrigin p_tile_origin) { - _clear_quadrants(); tile_origin = p_tile_origin; _recreate_quadrants(); @@ -1456,25 +1401,19 @@ void TileMap::set_tile_origin(TileOrigin p_tile_origin) { } TileMap::TileOrigin TileMap::get_tile_origin() const { - return tile_origin; } Vector2 TileMap::get_cell_draw_offset() const { - switch (mode) { - case MODE_SQUARE: { - return Vector2(); } break; case MODE_ISOMETRIC: { - return Vector2(-cell_size.x * 0.5, 0); } break; case MODE_CUSTOM: { - Vector2 min; min.x = MIN(custom_transform[0].x, min.x); min.y = MIN(custom_transform[0].y, min.y); @@ -1492,18 +1431,14 @@ TileMap::HalfOffset TileMap::get_half_offset() const { } Transform2D TileMap::get_cell_transform() const { - switch (mode) { - case MODE_SQUARE: { - Transform2D m; m[0] *= cell_size.x; m[1] *= cell_size.y; return m; } break; case MODE_ISOMETRIC: { - //isometric only makes sense when y is positive in both x and y vectors, otherwise //the drawing of tiles will overlap Transform2D m; @@ -1513,7 +1448,6 @@ Transform2D TileMap::get_cell_transform() const { } break; case MODE_CUSTOM: { - return custom_transform; } break; } @@ -1522,7 +1456,6 @@ Transform2D TileMap::get_cell_transform() const { } void TileMap::set_custom_transform(const Transform2D &p_xform) { - _clear_quadrants(); custom_transform = p_xform; _recreate_quadrants(); @@ -1530,20 +1463,16 @@ void TileMap::set_custom_transform(const Transform2D &p_xform) { } Transform2D TileMap::get_custom_transform() const { - return custom_transform; } Vector2 TileMap::_map_to_world(int p_x, int p_y, bool p_ignore_ofs) const { - Vector2 ret = get_cell_transform().xform(Vector2(p_x, p_y)); if (!p_ignore_ofs) { switch (half_offset) { - case HALF_OFFSET_X: case HALF_OFFSET_NEGATIVE_X: { if (ABS(p_y) & 1) { - ret += get_cell_transform()[0] * (half_offset == HALF_OFFSET_X ? 0.5 : -0.5); } } break; @@ -1562,7 +1491,6 @@ Vector2 TileMap::_map_to_world(int p_x, int p_y, bool p_ignore_ofs) const { } bool TileMap::_set(const StringName &p_name, const Variant &p_value) { - if (p_name == "format") { if (p_value.get_type() == Variant::INT) { format = (DataFormat)(p_value.operator int64_t()); // Set format used for loading @@ -1579,7 +1507,6 @@ bool TileMap::_set(const StringName &p_name, const Variant &p_value) { } bool TileMap::_get(const StringName &p_name, Variant &r_ret) const { - if (p_name == "format") { r_ret = FORMAT_2; // When saving, always save highest format return true; @@ -1591,7 +1518,6 @@ bool TileMap::_get(const StringName &p_name, Variant &r_ret) const { } void TileMap::_get_property_list(List<PropertyInfo> *p_list) const { - PropertyInfo p(Variant::INT, "format", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL); p_list->push_back(p); @@ -1606,16 +1532,13 @@ void TileMap::_validate_property(PropertyInfo &property) const { } Vector2 TileMap::map_to_world(const Vector2 &p_pos, bool p_ignore_ofs) const { - return _map_to_world(p_pos.x, p_pos.y, p_ignore_ofs); } Vector2 TileMap::world_to_map(const Vector2 &p_pos) const { - Vector2 ret = get_cell_transform().affine_inverse().xform(p_pos); switch (half_offset) { - case HALF_OFFSET_X: { if (int(floor(ret.y)) & 1) { ret.x -= 0.5; @@ -1650,7 +1573,6 @@ Vector2 TileMap::world_to_map(const Vector2 &p_pos) const { } void TileMap::set_y_sort_enabled(bool p_enable) { - _clear_quadrants(); use_y_sort = p_enable; RS::get_singleton()->canvas_item_set_sort_children_by_y(get_canvas_item(), use_y_sort); @@ -1659,12 +1581,10 @@ void TileMap::set_y_sort_enabled(bool p_enable) { } bool TileMap::is_y_sort_enabled() const { - return use_y_sort; } void TileMap::set_compatibility_mode(bool p_enable) { - _clear_quadrants(); compatibility_mode = p_enable; _recreate_quadrants(); @@ -1672,12 +1592,10 @@ void TileMap::set_compatibility_mode(bool p_enable) { } bool TileMap::is_compatibility_mode_enabled() const { - return compatibility_mode; } void TileMap::set_centered_textures(bool p_enable) { - _clear_quadrants(); centered_textures = p_enable; _recreate_quadrants(); @@ -1685,17 +1603,14 @@ void TileMap::set_centered_textures(bool p_enable) { } bool TileMap::is_centered_textures_enabled() const { - return centered_textures; } TypedArray<Vector2i> TileMap::get_used_cells() const { - TypedArray<Vector2i> a; a.resize(tile_map.size()); int i = 0; for (Map<PosKey, Cell>::Element *E = tile_map.front(); E; E = E->next()) { - Vector2i p(E->key().x, E->key().y); a[i++] = p; } @@ -1704,10 +1619,8 @@ TypedArray<Vector2i> TileMap::get_used_cells() const { } TypedArray<Vector2i> TileMap::get_used_cells_by_index(int p_id) const { - TypedArray<Vector2i> a; for (Map<PosKey, Cell>::Element *E = tile_map.front(); E; E = E->next()) { - if (E->value().id == p_id) { Vector2i p(E->key().x, E->key().y); a.push_back(p); @@ -1739,10 +1652,8 @@ Rect2 TileMap::get_used_rect() { // Not const because of cache } void TileMap::set_occluder_light_mask(int p_mask) { - occluder_light_mask = p_mask; for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - for (Map<PosKey, Quadrant::Occluder>::Element *F = E->get().occluder_instances.front(); F; F = F->next()) { RenderingServer::get_singleton()->canvas_light_occluder_set_light_mask(F->get().id, occluder_light_mask); } @@ -1750,15 +1661,12 @@ void TileMap::set_occluder_light_mask(int p_mask) { } int TileMap::get_occluder_light_mask() const { - return occluder_light_mask; } void TileMap::set_light_mask(int p_light_mask) { - CanvasItem::set_light_mask(p_light_mask); for (Map<PosKey, Quadrant>::Element *E = quadrant_map.front(); E; E = E->next()) { - for (List<RID>::Element *F = E->get().canvas_items.front(); F; F = F->next()) { RenderingServer::get_singleton()->canvas_item_set_light_mask(F->get(), get_light_mask()); } @@ -1766,9 +1674,9 @@ void TileMap::set_light_mask(int p_light_mask) { } void TileMap::set_clip_uv(bool p_enable) { - - if (clip_uv == p_enable) + if (clip_uv == p_enable) { return; + } _clear_quadrants(); clip_uv = p_enable; @@ -1776,12 +1684,10 @@ void TileMap::set_clip_uv(bool p_enable) { } bool TileMap::get_clip_uv() const { - return clip_uv; } String TileMap::get_configuration_warning() const { - String warning = Node2D::get_configuration_warning(); if (use_parent && !collision_parent) { @@ -1795,7 +1701,6 @@ String TileMap::get_configuration_warning() const { } void TileMap::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_tileset", "tileset"), &TileMap::set_tileset); ClassDB::bind_method(D_METHOD("get_tileset"), &TileMap::get_tileset); @@ -1942,7 +1847,6 @@ void TileMap::_changed_callback(Object *p_changed, const char *p_prop) { } TileMap::TileMap() { - rect_cache_dirty = true; used_size_cache_dirty = true; pending_update = false; @@ -1974,9 +1878,9 @@ TileMap::TileMap() { } TileMap::~TileMap() { - - if (tile_set.is_valid()) + if (tile_set.is_valid()) { tile_set->remove_change_receptor(this); + } clear(); } diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index 16784571bf..24d4dc09db 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -40,7 +40,6 @@ class CollisionObject2D; class TileMap : public Node2D { - GDCLASS(TileMap, Node2D); public: @@ -82,7 +81,6 @@ private: Navigation2D *navigation; union PosKey { - struct { int16_t x; int16_t y; @@ -112,7 +110,6 @@ private: }; union Cell { - struct { int32_t id : 24; bool flip_h : 1; @@ -130,7 +127,6 @@ private: List<PosKey> dirty_bitmask; struct Quadrant { - Vector2 pos; List<RID> canvas_items; RID body; diff --git a/scene/2d/touch_screen_button.cpp b/scene/2d/touch_screen_button.cpp index 590cc1e6c4..4597300db8 100644 --- a/scene/2d/touch_screen_button.cpp +++ b/scene/2d/touch_screen_button.cpp @@ -36,104 +36,96 @@ #include "scene/main/window.h" # void TouchScreenButton::set_texture(const Ref<Texture2D> &p_texture) { - texture = p_texture; update(); } Ref<Texture2D> TouchScreenButton::get_texture() const { - return texture; } void TouchScreenButton::set_texture_pressed(const Ref<Texture2D> &p_texture_pressed) { - texture_pressed = p_texture_pressed; update(); } Ref<Texture2D> TouchScreenButton::get_texture_pressed() const { - return texture_pressed; } void TouchScreenButton::set_bitmask(const Ref<BitMap> &p_bitmask) { - bitmask = p_bitmask; } Ref<BitMap> TouchScreenButton::get_bitmask() const { - return bitmask; } void TouchScreenButton::set_shape(const Ref<Shape2D> &p_shape) { - - if (shape.is_valid()) + if (shape.is_valid()) { shape->disconnect("changed", callable_mp((CanvasItem *)this, &CanvasItem::update)); + } shape = p_shape; - if (shape.is_valid()) + if (shape.is_valid()) { shape->connect("changed", callable_mp((CanvasItem *)this, &CanvasItem::update)); + } update(); } Ref<Shape2D> TouchScreenButton::get_shape() const { - return shape; } void TouchScreenButton::set_shape_centered(bool p_shape_centered) { - shape_centered = p_shape_centered; update(); } bool TouchScreenButton::is_shape_visible() const { - return shape_visible; } void TouchScreenButton::set_shape_visible(bool p_shape_visible) { - shape_visible = p_shape_visible; update(); } bool TouchScreenButton::is_shape_centered() const { - return shape_centered; } void TouchScreenButton::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_DRAW: { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; - if (!Engine::get_singleton()->is_editor_hint() && !!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())) && visibility == VISIBILITY_TOUCHSCREEN_ONLY) + } + if (!Engine::get_singleton()->is_editor_hint() && !!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())) && visibility == VISIBILITY_TOUCHSCREEN_ONLY) { return; + } if (finger_pressed != -1) { - - if (texture_pressed.is_valid()) + if (texture_pressed.is_valid()) { draw_texture(texture_pressed, Point2()); - else if (texture.is_valid()) + } else if (texture.is_valid()) { draw_texture(texture, Point2()); + } } else { - if (texture.is_valid()) + if (texture.is_valid()) { draw_texture(texture, Point2()); + } } - if (!shape_visible) + if (!shape_visible) { return; - if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) + } + if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) { return; + } if (shape.is_valid()) { Color draw_col = get_tree()->get_debug_collisions_color(); @@ -145,80 +137,79 @@ void TouchScreenButton::_notification(int p_what) { } break; case NOTIFICATION_ENTER_TREE: { - - if (!Engine::get_singleton()->is_editor_hint() && !!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())) && visibility == VISIBILITY_TOUCHSCREEN_ONLY) + if (!Engine::get_singleton()->is_editor_hint() && !!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())) && visibility == VISIBILITY_TOUCHSCREEN_ONLY) { return; + } update(); - if (!Engine::get_singleton()->is_editor_hint()) + if (!Engine::get_singleton()->is_editor_hint()) { set_process_input(is_visible_in_tree()); + } } break; case NOTIFICATION_EXIT_TREE: { - if (is_pressed()) + if (is_pressed()) { _release(true); + } } break; case NOTIFICATION_VISIBILITY_CHANGED: { - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { break; + } if (is_visible_in_tree()) { set_process_input(true); } else { set_process_input(false); - if (is_pressed()) + if (is_pressed()) { _release(); + } } } break; case NOTIFICATION_PAUSED: { - if (is_pressed()) + if (is_pressed()) { _release(); + } } break; } } bool TouchScreenButton::is_pressed() const { - return finger_pressed != -1; } void TouchScreenButton::set_action(const String &p_action) { - action = p_action; } String TouchScreenButton::get_action() const { - return action; } void TouchScreenButton::_input(const Ref<InputEvent> &p_event) { - - if (!get_tree()) + if (!get_tree()) { return; + } - if (p_event->get_device() != 0) + if (p_event->get_device() != 0) { return; + } ERR_FAIL_COND(!is_visible_in_tree()); const InputEventScreenTouch *st = Object::cast_to<InputEventScreenTouch>(*p_event); if (passby_press) { - const InputEventScreenDrag *sd = Object::cast_to<InputEventScreenDrag>(*p_event); if (st && !st->is_pressed() && finger_pressed == st->get_index()) { - _release(); } if ((st && st->is_pressed()) || sd) { - int index = st ? st->get_index() : sd->get_index(); Point2 coord = st ? st->get_position() : sd->get_position(); if (finger_pressed == -1 || index == finger_pressed) { - if (_is_point_inside(coord)) { if (finger_pressed == -1) { _press(index); @@ -232,14 +223,12 @@ void TouchScreenButton::_input(const Ref<InputEvent> &p_event) { } } else { - if (st) { - if (st->is_pressed()) { - const bool can_press = finger_pressed == -1; - if (!can_press) + if (!can_press) { return; //already fingering + } if (_is_point_inside(st->get_position())) { _press(st->get_index()); @@ -268,29 +257,27 @@ bool TouchScreenButton::_is_point_inside(const Point2 &p_point) { } if (bitmask.is_valid()) { - check_rect = false; if (!touched && Rect2(Point2(), bitmask->get_size()).has_point(coord)) { - - if (bitmask->get_bit(coord)) + if (bitmask->get_bit(coord)) { touched = true; + } } } if (!touched && check_rect) { - if (texture.is_valid()) + if (texture.is_valid()) { touched = Rect2(Size2(), texture->get_size()).has_point(coord); + } } return touched; } void TouchScreenButton::_press(int p_finger_pressed) { - finger_pressed = p_finger_pressed; if (action != StringName()) { - Input::get_singleton()->action_press(action); Ref<InputEventAction> iea; iea.instance(); @@ -304,14 +291,11 @@ void TouchScreenButton::_press(int p_finger_pressed) { } void TouchScreenButton::_release(bool p_exiting_tree) { - finger_pressed = -1; if (action != StringName()) { - Input::get_singleton()->action_release(action); if (!p_exiting_tree) { - Ref<InputEventAction> iea; iea.instance(); iea->set_action(action); @@ -328,8 +312,9 @@ void TouchScreenButton::_release(bool p_exiting_tree) { #ifdef TOOLS_ENABLED Rect2 TouchScreenButton::_edit_get_rect() const { - if (texture.is_null()) + if (texture.is_null()) { return CanvasItem::_edit_get_rect(); + } return Rect2(Size2(), texture->get_size()); } @@ -340,8 +325,9 @@ bool TouchScreenButton::_edit_use_rect() const { #endif Rect2 TouchScreenButton::get_anchorable_rect() const { - if (texture.is_null()) + if (texture.is_null()) { return CanvasItem::get_anchorable_rect(); + } return Rect2(Size2(), texture->get_size()); } @@ -352,22 +338,18 @@ void TouchScreenButton::set_visibility_mode(VisibilityMode p_mode) { } TouchScreenButton::VisibilityMode TouchScreenButton::get_visibility_mode() const { - return visibility; } void TouchScreenButton::set_passby_press(bool p_enable) { - passby_press = p_enable; } bool TouchScreenButton::is_passby_press_enabled() const { - return passby_press; } void TouchScreenButton::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_texture", "texture"), &TouchScreenButton::set_texture); ClassDB::bind_method(D_METHOD("get_texture"), &TouchScreenButton::get_texture); @@ -417,7 +399,6 @@ void TouchScreenButton::_bind_methods() { } TouchScreenButton::TouchScreenButton() { - finger_pressed = -1; passby_press = false; visibility = VISIBILITY_ALWAYS; diff --git a/scene/2d/touch_screen_button.h b/scene/2d/touch_screen_button.h index 42e93f7048..d9c7ef7034 100644 --- a/scene/2d/touch_screen_button.h +++ b/scene/2d/touch_screen_button.h @@ -37,7 +37,6 @@ #include "scene/resources/texture.h" class TouchScreenButton : public Node2D { - GDCLASS(TouchScreenButton, Node2D); public: diff --git a/scene/2d/visibility_notifier_2d.cpp b/scene/2d/visibility_notifier_2d.cpp index 780d08693d..75154c7acb 100644 --- a/scene/2d/visibility_notifier_2d.cpp +++ b/scene/2d/visibility_notifier_2d.cpp @@ -49,12 +49,12 @@ bool VisibilityNotifier2D::_edit_use_rect() const { #endif void VisibilityNotifier2D::_enter_viewport(Viewport *p_viewport) { - ERR_FAIL_COND(viewports.has(p_viewport)); viewports.insert(p_viewport); - if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) + if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) { return; + } if (viewports.size() == 1) { emit_signal(SceneStringNames::get_singleton()->screen_entered); @@ -65,12 +65,12 @@ void VisibilityNotifier2D::_enter_viewport(Viewport *p_viewport) { } void VisibilityNotifier2D::_exit_viewport(Viewport *p_viewport) { - ERR_FAIL_COND(!viewports.has(p_viewport)); viewports.erase(p_viewport); - if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) + if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) { return; + } emit_signal(SceneStringNames::get_singleton()->viewport_exited, p_viewport); if (viewports.size() == 0) { @@ -81,7 +81,6 @@ void VisibilityNotifier2D::_exit_viewport(Viewport *p_viewport) { } void VisibilityNotifier2D::set_rect(const Rect2 &p_rect) { - rect = p_rect; if (is_inside_tree()) { get_world_2d()->_update_notifier(this, get_global_transform().xform(rect)); @@ -95,44 +94,35 @@ void VisibilityNotifier2D::set_rect(const Rect2 &p_rect) { } Rect2 VisibilityNotifier2D::get_rect() const { - return rect; } void VisibilityNotifier2D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_ENTER_TREE: { - //get_world_2d()-> get_world_2d()->_register_notifier(this, get_global_transform().xform(rect)); } break; case NOTIFICATION_TRANSFORM_CHANGED: { - //get_world_2d()-> get_world_2d()->_update_notifier(this, get_global_transform().xform(rect)); } break; case NOTIFICATION_DRAW: { - if (Engine::get_singleton()->is_editor_hint()) { - draw_rect(rect, Color(1, 0.5, 1, 0.2)); } } break; case NOTIFICATION_EXIT_TREE: { - get_world_2d()->_remove_notifier(this); } break; } } bool VisibilityNotifier2D::is_on_screen() const { - return viewports.size() > 0; } void VisibilityNotifier2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_rect", "rect"), &VisibilityNotifier2D::set_rect); ClassDB::bind_method(D_METHOD("get_rect"), &VisibilityNotifier2D::get_rect); ClassDB::bind_method(D_METHOD("is_on_screen"), &VisibilityNotifier2D::is_on_screen); @@ -146,7 +136,6 @@ void VisibilityNotifier2D::_bind_methods() { } VisibilityNotifier2D::VisibilityNotifier2D() { - rect = Rect2(-10, -10, 20, 20); set_notify_transform(true); } @@ -154,44 +143,42 @@ VisibilityNotifier2D::VisibilityNotifier2D() { ////////////////////////////////////// void VisibilityEnabler2D::_screen_enter() { - for (Map<Node *, Variant>::Element *E = nodes.front(); E; E = E->next()) { - _change_node_state(E->key(), true); } - if (enabler[ENABLER_PARENT_PHYSICS_PROCESS] && get_parent()) + if (enabler[ENABLER_PARENT_PHYSICS_PROCESS] && get_parent()) { get_parent()->set_physics_process(true); - if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) + } + if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) { get_parent()->set_process(true); + } visible = true; } void VisibilityEnabler2D::_screen_exit() { - for (Map<Node *, Variant>::Element *E = nodes.front(); E; E = E->next()) { - _change_node_state(E->key(), false); } - if (enabler[ENABLER_PARENT_PHYSICS_PROCESS] && get_parent()) + if (enabler[ENABLER_PARENT_PHYSICS_PROCESS] && get_parent()) { get_parent()->set_physics_process(false); - if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) + } + if (enabler[ENABLER_PARENT_PROCESS] && get_parent()) { get_parent()->set_process(false); + } visible = false; } void VisibilityEnabler2D::_find_nodes(Node *p_node) { - bool add = false; Variant meta; { RigidBody2D *rb2d = Object::cast_to<RigidBody2D>(p_node); if (rb2d && ((rb2d->get_mode() == RigidBody2D::MODE_CHARACTER || rb2d->get_mode() == RigidBody2D::MODE_RIGID))) { - add = true; meta = rb2d->get_mode(); } @@ -219,7 +206,6 @@ void VisibilityEnabler2D::_find_nodes(Node *p_node) { } if (add) { - p_node->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &VisibilityEnabler2D::_node_removed), varray(p_node), CONNECT_ONESHOT); nodes[p_node] = meta; _change_node_state(p_node, false); @@ -227,24 +213,25 @@ void VisibilityEnabler2D::_find_nodes(Node *p_node) { for (int i = 0; i < p_node->get_child_count(); i++) { Node *c = p_node->get_child(i); - if (c->get_filename() != String()) + if (c->get_filename() != String()) { continue; //skip, instance + } _find_nodes(c); } } void VisibilityEnabler2D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { return; + } Node *from = this; //find where current scene starts - while (from->get_parent() && from->get_filename() == String()) + while (from->get_parent() && from->get_filename() == String()) { from = from->get_parent(); + } _find_nodes(from); @@ -264,14 +251,14 @@ void VisibilityEnabler2D::_notification(int p_what) { } if (p_what == NOTIFICATION_EXIT_TREE) { - - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { return; + } for (Map<Node *, Variant>::Element *E = nodes.front(); E; E = E->next()) { - - if (!visible) + if (!visible) { _change_node_state(E->key(), true); + } E->key()->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &VisibilityEnabler2D::_node_removed)); } @@ -280,13 +267,11 @@ void VisibilityEnabler2D::_notification(int p_what) { } void VisibilityEnabler2D::_change_node_state(Node *p_node, bool p_enabled) { - ERR_FAIL_COND(!nodes.has(p_node)); if (enabler[ENABLER_FREEZE_BODIES]) { RigidBody2D *rb = Object::cast_to<RigidBody2D>(p_node); if (rb) { - rb->set_sleeping(!p_enabled); } } @@ -295,7 +280,6 @@ void VisibilityEnabler2D::_change_node_state(Node *p_node, bool p_enabled) { AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(p_node); if (ap) { - ap->set_active(p_enabled); } } @@ -304,11 +288,11 @@ void VisibilityEnabler2D::_change_node_state(Node *p_node, bool p_enabled) { AnimatedSprite2D *as = Object::cast_to<AnimatedSprite2D>(p_node); if (as) { - - if (p_enabled) + if (p_enabled) { as->play(); - else + } else { as->stop(); + } } } @@ -316,16 +300,15 @@ void VisibilityEnabler2D::_change_node_state(Node *p_node, bool p_enabled) { GPUParticles2D *ps = Object::cast_to<GPUParticles2D>(p_node); if (ps) { - ps->set_emitting(p_enabled); } } } void VisibilityEnabler2D::_node_removed(Node *p_node) { - - if (!visible) + if (!visible) { _change_node_state(p_node, true); + } nodes.erase(p_node); } @@ -339,7 +322,6 @@ String VisibilityEnabler2D::get_configuration_warning() const { } void VisibilityEnabler2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_enabler", "enabler", "enabled"), &VisibilityEnabler2D::set_enabler); ClassDB::bind_method(D_METHOD("is_enabler_enabled", "enabler"), &VisibilityEnabler2D::is_enabler_enabled); ClassDB::bind_method(D_METHOD("_node_removed"), &VisibilityEnabler2D::_node_removed); @@ -361,20 +343,19 @@ void VisibilityEnabler2D::_bind_methods() { } void VisibilityEnabler2D::set_enabler(Enabler p_enabler, bool p_enable) { - ERR_FAIL_INDEX(p_enabler, ENABLER_MAX); enabler[p_enabler] = p_enable; } -bool VisibilityEnabler2D::is_enabler_enabled(Enabler p_enabler) const { +bool VisibilityEnabler2D::is_enabler_enabled(Enabler p_enabler) const { ERR_FAIL_INDEX_V(p_enabler, ENABLER_MAX, false); return enabler[p_enabler]; } VisibilityEnabler2D::VisibilityEnabler2D() { - - for (int i = 0; i < ENABLER_MAX; i++) + for (int i = 0; i < ENABLER_MAX; i++) { enabler[i] = true; + } enabler[ENABLER_PARENT_PROCESS] = false; enabler[ENABLER_PARENT_PHYSICS_PROCESS] = false; diff --git a/scene/2d/visibility_notifier_2d.h b/scene/2d/visibility_notifier_2d.h index a3b79d29e9..fb6e48f5e8 100644 --- a/scene/2d/visibility_notifier_2d.h +++ b/scene/2d/visibility_notifier_2d.h @@ -35,7 +35,6 @@ class Viewport; class VisibilityNotifier2D : public Node2D { - GDCLASS(VisibilityNotifier2D, Node2D); Set<Viewport *> viewports; @@ -69,7 +68,6 @@ public: }; class VisibilityEnabler2D : public VisibilityNotifier2D { - GDCLASS(VisibilityEnabler2D, VisibilityNotifier2D); public: diff --git a/scene/2d/y_sort.cpp b/scene/2d/y_sort.cpp index 15d97eeaa0..7c2b41db70 100644 --- a/scene/2d/y_sort.cpp +++ b/scene/2d/y_sort.cpp @@ -31,18 +31,15 @@ #include "y_sort.h" void YSort::set_sort_enabled(bool p_enabled) { - sort_enabled = p_enabled; RS::get_singleton()->canvas_item_set_sort_children_by_y(get_canvas_item(), sort_enabled); } bool YSort::is_sort_enabled() const { - return sort_enabled; } void YSort::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_sort_enabled", "enabled"), &YSort::set_sort_enabled); ClassDB::bind_method(D_METHOD("is_sort_enabled"), &YSort::is_sort_enabled); @@ -51,7 +48,6 @@ void YSort::_bind_methods() { } YSort::YSort() { - sort_enabled = true; RS::get_singleton()->canvas_item_set_sort_children_by_y(get_canvas_item(), true); } diff --git a/scene/3d/area_3d.cpp b/scene/3d/area_3d.cpp index b72483d71b..a024757927 100644 --- a/scene/3d/area_3d.cpp +++ b/scene/3d/area_3d.cpp @@ -35,27 +35,24 @@ #include "servers/physics_server_3d.h" void Area3D::set_space_override_mode(SpaceOverride p_mode) { - space_override = p_mode; PhysicsServer3D::get_singleton()->area_set_space_override_mode(get_rid(), PhysicsServer3D::AreaSpaceOverrideMode(p_mode)); } -Area3D::SpaceOverride Area3D::get_space_override_mode() const { +Area3D::SpaceOverride Area3D::get_space_override_mode() const { return space_override; } void Area3D::set_gravity_is_point(bool p_enabled) { - gravity_is_point = p_enabled; PhysicsServer3D::get_singleton()->area_set_param(get_rid(), PhysicsServer3D::AREA_PARAM_GRAVITY_IS_POINT, p_enabled); } -bool Area3D::is_gravity_a_point() const { +bool Area3D::is_gravity_a_point() const { return gravity_is_point; } void Area3D::set_gravity_distance_scale(real_t p_scale) { - gravity_distance_scale = p_scale; PhysicsServer3D::get_singleton()->area_set_param(get_rid(), PhysicsServer3D::AREA_PARAM_GRAVITY_DISTANCE_SCALE, p_scale); } @@ -65,57 +62,51 @@ real_t Area3D::get_gravity_distance_scale() const { } void Area3D::set_gravity_vector(const Vector3 &p_vec) { - gravity_vec = p_vec; PhysicsServer3D::get_singleton()->area_set_param(get_rid(), PhysicsServer3D::AREA_PARAM_GRAVITY_VECTOR, p_vec); } -Vector3 Area3D::get_gravity_vector() const { +Vector3 Area3D::get_gravity_vector() const { return gravity_vec; } void Area3D::set_gravity(real_t p_gravity) { - gravity = p_gravity; PhysicsServer3D::get_singleton()->area_set_param(get_rid(), PhysicsServer3D::AREA_PARAM_GRAVITY, p_gravity); } -real_t Area3D::get_gravity() const { +real_t Area3D::get_gravity() const { return gravity; } -void Area3D::set_linear_damp(real_t p_linear_damp) { +void Area3D::set_linear_damp(real_t p_linear_damp) { linear_damp = p_linear_damp; PhysicsServer3D::get_singleton()->area_set_param(get_rid(), PhysicsServer3D::AREA_PARAM_LINEAR_DAMP, p_linear_damp); } -real_t Area3D::get_linear_damp() const { +real_t Area3D::get_linear_damp() const { return linear_damp; } void Area3D::set_angular_damp(real_t p_angular_damp) { - angular_damp = p_angular_damp; PhysicsServer3D::get_singleton()->area_set_param(get_rid(), PhysicsServer3D::AREA_PARAM_ANGULAR_DAMP, p_angular_damp); } real_t Area3D::get_angular_damp() const { - return angular_damp; } void Area3D::set_priority(real_t p_priority) { - priority = p_priority; PhysicsServer3D::get_singleton()->area_set_param(get_rid(), PhysicsServer3D::AREA_PARAM_PRIORITY, p_priority); } -real_t Area3D::get_priority() const { +real_t Area3D::get_priority() const { return priority; } void Area3D::_body_enter_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -127,13 +118,11 @@ void Area3D::_body_enter_tree(ObjectID p_id) { E->get().in_tree = true; emit_signal(SceneStringNames::get_singleton()->body_entered, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape); } } void Area3D::_body_exit_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -143,13 +132,11 @@ void Area3D::_body_exit_tree(ObjectID p_id) { E->get().in_tree = false; emit_signal(SceneStringNames::get_singleton()->body_exited, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape); } } void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, int p_body_shape, int p_area_shape) { - bool body_in = p_status == PhysicsServer3D::AREA_BODY_ADDED; ObjectID objid = p_instance; @@ -166,7 +153,6 @@ void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i if (body_in) { if (!E) { - E = body_map.insert(objid, BodyState()); E->get().rc = 0; E->get().in_tree = node && node->is_inside_tree(); @@ -179,29 +165,30 @@ void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i } } E->get().rc++; - if (node) + if (node) { E->get().shapes.insert(ShapePair(p_body_shape, p_area_shape)); + } if (E->get().in_tree) { emit_signal(SceneStringNames::get_singleton()->body_shape_entered, objid, node, p_body_shape, p_area_shape); } } else { - E->get().rc--; - if (node) + if (node) { E->get().shapes.erase(ShapePair(p_body_shape, p_area_shape)); + } bool eraseit = false; if (E->get().rc == 0) { - if (node) { node->disconnect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &Area3D::_body_enter_tree)); node->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Area3D::_body_exit_tree)); - if (E->get().in_tree) + if (E->get().in_tree) { emit_signal(SceneStringNames::get_singleton()->body_exited, obj); + } } eraseit = true; @@ -210,15 +197,15 @@ void Area3D::_body_inout(int p_status, const RID &p_body, ObjectID p_instance, i emit_signal(SceneStringNames::get_singleton()->body_shape_exited, objid, obj, p_body_shape, p_area_shape); } - if (eraseit) + if (eraseit) { body_map.erase(E); + } } locked = false; } void Area3D::_clear_monitoring() { - ERR_FAIL_COND_MSG(locked, "This function can't be used during the in/out signal."); { @@ -227,19 +214,19 @@ void Area3D::_clear_monitoring() { //disconnect all monitored stuff for (Map<ObjectID, BodyState>::Element *E = bmcopy.front(); E; E = E->next()) { - Object *obj = ObjectDB::get_instance(E->key()); Node *node = Object::cast_to<Node>(obj); - if (!node) //node may have been deleted in previous frame or at other legiminate point + if (!node) { //node may have been deleted in previous frame or at other legiminate point continue; + } //ERR_CONTINUE(!node); - if (!E->get().in_tree) + if (!E->get().in_tree) { continue; + } for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_exited, E->key(), node, E->get().shapes[i].body_shape, E->get().shapes[i].area_shape); } @@ -251,25 +238,24 @@ void Area3D::_clear_monitoring() { } { - Map<ObjectID, AreaState> bmcopy = area_map; area_map.clear(); //disconnect all monitored stuff for (Map<ObjectID, AreaState>::Element *E = bmcopy.front(); E; E = E->next()) { - Object *obj = ObjectDB::get_instance(E->key()); Node *node = Object::cast_to<Node>(obj); - if (!node) //node may have been deleted in previous frame or at other legiminate point + if (!node) { //node may have been deleted in previous frame or at other legiminate point continue; + } //ERR_CONTINUE(!node); - if (!E->get().in_tree) + if (!E->get().in_tree) { continue; + } for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->area_shape_exited, E->key(), node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape); } @@ -280,24 +266,23 @@ void Area3D::_clear_monitoring() { } } } -void Area3D::_notification(int p_what) { +void Area3D::_notification(int p_what) { if (p_what == NOTIFICATION_EXIT_TREE) { _clear_monitoring(); } } void Area3D::set_monitoring(bool p_enable) { - ERR_FAIL_COND_MSG(locked, "Function blocked during in/out signal. Use set_deferred(\"monitoring\", true/false)."); - if (p_enable == monitoring) + if (p_enable == monitoring) { return; + } monitoring = p_enable; if (monitoring) { - PhysicsServer3D::get_singleton()->area_set_monitor_callback(get_rid(), this, SceneStringNames::get_singleton()->_body_inout); PhysicsServer3D::get_singleton()->area_set_area_monitor_callback(get_rid(), this, SceneStringNames::get_singleton()->_area_inout); } else { @@ -308,7 +293,6 @@ void Area3D::set_monitoring(bool p_enable) { } void Area3D::_area_enter_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -320,13 +304,11 @@ void Area3D::_area_enter_tree(ObjectID p_id) { E->get().in_tree = true; emit_signal(SceneStringNames::get_singleton()->area_entered, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->area_shape_entered, p_id, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape); } } void Area3D::_area_exit_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -336,13 +318,11 @@ void Area3D::_area_exit_tree(ObjectID p_id) { E->get().in_tree = false; emit_signal(SceneStringNames::get_singleton()->area_exited, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->area_shape_exited, p_id, node, E->get().shapes[i].area_shape, E->get().shapes[i].self_shape); } } void Area3D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, int p_area_shape, int p_self_shape) { - bool area_in = p_status == PhysicsServer3D::AREA_BODY_ADDED; ObjectID objid = p_instance; @@ -359,7 +339,6 @@ void Area3D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i if (area_in) { if (!E) { - E = area_map.insert(objid, AreaState()); E->get().rc = 0; E->get().in_tree = node && node->is_inside_tree(); @@ -372,24 +351,24 @@ void Area3D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i } } E->get().rc++; - if (node) + if (node) { E->get().shapes.insert(AreaShapePair(p_area_shape, p_self_shape)); + } if (!node || E->get().in_tree) { emit_signal(SceneStringNames::get_singleton()->area_shape_entered, objid, node, p_area_shape, p_self_shape); } } else { - E->get().rc--; - if (node) + if (node) { E->get().shapes.erase(AreaShapePair(p_area_shape, p_self_shape)); + } bool eraseit = false; if (E->get().rc == 0) { - if (node) { node->disconnect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &Area3D::_area_enter_tree)); node->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &Area3D::_area_exit_tree)); @@ -404,20 +383,19 @@ void Area3D::_area_inout(int p_status, const RID &p_area, ObjectID p_instance, i emit_signal(SceneStringNames::get_singleton()->area_shape_exited, objid, obj, p_area_shape, p_self_shape); } - if (eraseit) + if (eraseit) { area_map.erase(E); + } } locked = false; } bool Area3D::is_monitoring() const { - return monitoring; } TypedArray<Node3D> Area3D::get_overlapping_bodies() const { - ERR_FAIL_COND_V(!monitoring, Array()); Array ret; ret.resize(body_map.size()); @@ -435,11 +413,11 @@ TypedArray<Node3D> Area3D::get_overlapping_bodies() const { } void Area3D::set_monitorable(bool p_enable) { - ERR_FAIL_COND_MSG(locked || (is_inside_tree() && PhysicsServer3D::get_singleton()->is_flushing_queries()), "Function blocked during in/out signal. Use set_deferred(\"monitorable\", true/false)."); - if (p_enable == monitorable) + if (p_enable == monitorable) { return; + } monitorable = p_enable; @@ -447,12 +425,10 @@ void Area3D::set_monitorable(bool p_enable) { } bool Area3D::is_monitorable() const { - return monitorable; } TypedArray<Area3D> Area3D::get_overlapping_areas() const { - ERR_FAIL_COND_V(!monitoring, Array()); Array ret; ret.resize(area_map.size()); @@ -470,89 +446,82 @@ TypedArray<Area3D> Area3D::get_overlapping_areas() const { } bool Area3D::overlaps_area(Node *p_area) const { - ERR_FAIL_NULL_V(p_area, false); const Map<ObjectID, AreaState>::Element *E = area_map.find(p_area->get_instance_id()); - if (!E) + if (!E) { return false; + } return E->get().in_tree; } bool Area3D::overlaps_body(Node *p_body) const { - ERR_FAIL_NULL_V(p_body, false); const Map<ObjectID, BodyState>::Element *E = body_map.find(p_body->get_instance_id()); - if (!E) + if (!E) { return false; + } return E->get().in_tree; } -void Area3D::set_collision_mask(uint32_t p_mask) { +void Area3D::set_collision_mask(uint32_t p_mask) { collision_mask = p_mask; PhysicsServer3D::get_singleton()->area_set_collision_mask(get_rid(), p_mask); } uint32_t Area3D::get_collision_mask() const { - return collision_mask; } -void Area3D::set_collision_layer(uint32_t p_layer) { +void Area3D::set_collision_layer(uint32_t p_layer) { collision_layer = p_layer; PhysicsServer3D::get_singleton()->area_set_collision_layer(get_rid(), p_layer); } uint32_t Area3D::get_collision_layer() const { - return collision_layer; } void Area3D::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } bool Area3D::get_collision_mask_bit(int p_bit) const { - return get_collision_mask() & (1 << p_bit); } void Area3D::set_collision_layer_bit(int p_bit, bool p_value) { - uint32_t layer = get_collision_layer(); - if (p_value) + if (p_value) { layer |= 1 << p_bit; - else + } else { layer &= ~(1 << p_bit); + } set_collision_layer(layer); } bool Area3D::get_collision_layer_bit(int p_bit) const { - return get_collision_layer() & (1 << p_bit); } void Area3D::set_audio_bus_override(bool p_override) { - audio_bus_override = p_override; } bool Area3D::is_overriding_audio_bus() const { - return audio_bus_override; } void Area3D::set_audio_bus(const StringName &p_audio_bus) { - audio_bus = p_audio_bus; } -StringName Area3D::get_audio_bus() const { +StringName Area3D::get_audio_bus() const { for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { if (AudioServer::get_singleton()->get_bus_name(i) == audio_bus) { return audio_bus; @@ -562,20 +531,18 @@ StringName Area3D::get_audio_bus() const { } void Area3D::set_use_reverb_bus(bool p_enable) { - use_reverb_bus = p_enable; } -bool Area3D::is_using_reverb_bus() const { +bool Area3D::is_using_reverb_bus() const { return use_reverb_bus; } void Area3D::set_reverb_bus(const StringName &p_audio_bus) { - reverb_bus = p_audio_bus; } -StringName Area3D::get_reverb_bus() const { +StringName Area3D::get_reverb_bus() const { for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { if (AudioServer::get_singleton()->get_bus_name(i) == reverb_bus) { return reverb_bus; @@ -585,31 +552,28 @@ StringName Area3D::get_reverb_bus() const { } void Area3D::set_reverb_amount(float p_amount) { - reverb_amount = p_amount; } -float Area3D::get_reverb_amount() const { +float Area3D::get_reverb_amount() const { return reverb_amount; } void Area3D::set_reverb_uniformity(float p_uniformity) { - reverb_uniformity = p_uniformity; } -float Area3D::get_reverb_uniformity() const { +float Area3D::get_reverb_uniformity() const { return reverb_uniformity; } void Area3D::_validate_property(PropertyInfo &property) const { - if (property.name == "audio_bus_name" || property.name == "reverb_bus_name") { - String options; for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { - if (i > 0) + if (i > 0) { options += ","; + } String name = AudioServer::get_singleton()->get_bus_name(i); options += name; } @@ -729,7 +693,6 @@ void Area3D::_bind_methods() { Area3D::Area3D() : CollisionObject3D(PhysicsServer3D::get_singleton()->area_create(), true) { - space_override = SPACE_OVERRIDE_DISABLED; set_gravity(9.8); locked = false; diff --git a/scene/3d/area_3d.h b/scene/3d/area_3d.h index f6503c6d2d..98f337d3e4 100644 --- a/scene/3d/area_3d.h +++ b/scene/3d/area_3d.h @@ -35,7 +35,6 @@ #include "scene/3d/collision_object_3d.h" class Area3D : public CollisionObject3D { - GDCLASS(Area3D, CollisionObject3D); public: @@ -68,14 +67,14 @@ private: void _body_exit_tree(ObjectID p_id); struct ShapePair { - int body_shape; int area_shape; bool operator<(const ShapePair &p_sp) const { - if (body_shape == p_sp.body_shape) + if (body_shape == p_sp.body_shape) { return area_shape < p_sp.area_shape; - else + } else { return body_shape < p_sp.body_shape; + } } ShapePair() {} @@ -86,7 +85,6 @@ private: }; struct BodyState { - int rc; bool in_tree; VSet<ShapePair> shapes; @@ -100,14 +98,14 @@ private: void _area_exit_tree(ObjectID p_id); struct AreaShapePair { - int area_shape; int self_shape; bool operator<(const AreaShapePair &p_sp) const { - if (area_shape == p_sp.area_shape) + if (area_shape == p_sp.area_shape) { return self_shape < p_sp.self_shape; - else + } else { return area_shape < p_sp.area_shape; + } } AreaShapePair() {} @@ -118,7 +116,6 @@ private: }; struct AreaState { - int rc; bool in_tree; VSet<AreaShapePair> shapes; diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp index 8a00d67e12..6e4db8f382 100644 --- a/scene/3d/audio_stream_player_3d.cpp +++ b/scene/3d/audio_stream_player_3d.cpp @@ -138,7 +138,6 @@ void AudioStreamPlayer3D::_calc_output_vol(const Vector3 &source_dir, real_t tig } void AudioStreamPlayer3D::_mix_audio() { - if (!stream_playback.is_valid() || !active || (stream_paused && !stream_paused_fade_out)) { return; @@ -162,7 +161,6 @@ void AudioStreamPlayer3D::_mix_audio() { // Mix if we're not paused or we're fading out if ((output_count > 0 || out_of_range_mode == OUT_OF_RANGE_MIX)) { - float output_pitch_scale = 0.0; if (output_count) { //used for doppler, not realistic but good enough @@ -179,7 +177,6 @@ void AudioStreamPlayer3D::_mix_audio() { //write all outputs for (int i = 0; i < output_count; i++) { - Output current = outputs[i]; //see if current output exists, to keep volume ramp @@ -216,8 +213,9 @@ void AudioStreamPlayer3D::_mix_audio() { AudioFrame vol_inc = (target_volume - vol_prev) / float(buffer_size); AudioFrame vol = vol_prev; - if (!AudioServer::get_singleton()->thread_has_channel_mix_buffer(current.bus_index, k)) + if (!AudioServer::get_singleton()->thread_has_channel_mix_buffer(current.bus_index, k)) { continue; //may have been deleted, will be updated on process + } AudioFrame *target = AudioServer::get_singleton()->thread_get_channel_mix_buffer(current.bus_index, k); current.filter.set_mode(AudioFilterSW::HIGHSHELF); @@ -228,7 +226,6 @@ void AudioStreamPlayer3D::_mix_audio() { current.filter.set_gain(current.filter_gain); if (interpolate_filter) { - current.filter_process[k * 2 + 0] = prev_outputs[i].filter_process[k * 2 + 0]; current.filter_process[k * 2 + 1] = prev_outputs[i].filter_process[k * 2 + 1]; @@ -238,7 +235,6 @@ void AudioStreamPlayer3D::_mix_audio() { current.filter_process[k * 2 + 0].update_coeffs(buffer_size); current.filter_process[k * 2 + 1].update_coeffs(buffer_size); for (int j = 0; j < buffer_size; j++) { - AudioFrame f = buffer[j] * vol; current.filter_process[k * 2 + 0].process_one_interp(f.l); current.filter_process[k * 2 + 1].process_one_interp(f.r); @@ -253,7 +249,6 @@ void AudioStreamPlayer3D::_mix_audio() { current.filter_process[k * 2 + 0].update_coeffs(); current.filter_process[k * 2 + 1].update_coeffs(); for (int j = 0; j < buffer_size; j++) { - AudioFrame f = buffer[j] * vol; current.filter_process[k * 2 + 0].process_one(f.l); current.filter_process[k * 2 + 1].process_one(f.r); @@ -264,9 +259,9 @@ void AudioStreamPlayer3D::_mix_audio() { } if (current.reverb_bus_index >= 0) { - - if (!AudioServer::get_singleton()->thread_has_channel_mix_buffer(current.reverb_bus_index, k)) + if (!AudioServer::get_singleton()->thread_has_channel_mix_buffer(current.reverb_bus_index, k)) { continue; //may have been deleted, will be updated on process + } AudioFrame *rtarget = AudioServer::get_singleton()->thread_get_channel_mix_buffer(current.reverb_bus_index, k); @@ -275,15 +270,12 @@ void AudioStreamPlayer3D::_mix_audio() { AudioFrame rvol = prev_outputs[i].reverb_vol[k]; for (int j = 0; j < buffer_size; j++) { - rtarget[j] += buffer[j] * rvol; rvol += rvol_inc; } } else { - AudioFrame rvol = current.reverb_vol[k]; for (int j = 0; j < buffer_size; j++) { - rtarget[j] += buffer[j] * rvol; } } @@ -306,7 +298,6 @@ void AudioStreamPlayer3D::_mix_audio() { } float AudioStreamPlayer3D::_get_attenuation_db(float p_distance) const { - float att = 0; switch (attenuation_model) { case ATTENUATION_INVERSE_DISTANCE: { @@ -340,9 +331,7 @@ void _update_sound() { } void AudioStreamPlayer3D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - velocity_tracker->reset(get_global_transform().origin); AudioServer::get_singleton()->add_callback(_mix_audios, this); if (autoplay && !Engine::get_singleton()->is_editor_hint()) { @@ -351,7 +340,6 @@ void AudioStreamPlayer3D::_notification(int p_what) { } if (p_what == NOTIFICATION_EXIT_TREE) { - AudioServer::get_singleton()->remove_callback(_mix_audios, this); } @@ -367,18 +355,15 @@ void AudioStreamPlayer3D::_notification(int p_what) { } if (p_what == NOTIFICATION_TRANSFORM_CHANGED) { - if (doppler_tracking != DOPPLER_TRACKING_DISABLED) { velocity_tracker->update_position(get_global_transform().origin); } } if (p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS) { - //update anything related to position first, if possible of course if (!output_ready) { - Vector3 linear_velocity; //compute linear velocity for doppler @@ -405,15 +390,18 @@ void AudioStreamPlayer3D::_notification(int p_what) { Area3D *area = nullptr; for (int i = 0; i < areas; i++) { - if (!sr[i].collider) + if (!sr[i].collider) { continue; + } Area3D *tarea = Object::cast_to<Area3D>(sr[i].collider); - if (!tarea) + if (!tarea) { continue; + } - if (!tarea->is_overriding_audio_bus() && !tarea->is_using_reverb_bus()) + if (!tarea->is_overriding_audio_bus() && !tarea->is_using_reverb_bus()) { continue; + } area = tarea; break; @@ -423,11 +411,11 @@ void AudioStreamPlayer3D::_notification(int p_what) { world_3d->get_camera_list(&cameras); for (List<Camera3D *>::Element *E = cameras.front(); E; E = E->next()) { - Camera3D *camera = E->get(); Viewport *vp = camera->get_viewport(); - if (!vp->is_audio_listener()) + if (!vp->is_audio_listener()) { continue; + } bool listener_is_camera = true; Node3D *listener_node = camera; @@ -451,7 +439,6 @@ void AudioStreamPlayer3D::_notification(int p_what) { } if (max_distance > 0) { - float total_max = max_distance; if (area && area->is_using_reverb_bus() && area->get_reverb_uniformity() > 0) { @@ -478,8 +465,9 @@ void AudioStreamPlayer3D::_notification(int p_what) { Vector3 listenertopos = global_pos - listener_node->get_global_transform().origin; float c = listenertopos.normalized().dot(get_global_transform().basis.get_axis(2).normalized()); //it's z negative float angle = Math::rad2deg(Math::acos(c)); - if (angle > emission_angle) + if (angle > emission_angle) { db_att -= -emission_angle_filter_attenuation_db; + } } output.filter_gain = Math::db2linear(db_att); @@ -497,7 +485,6 @@ void AudioStreamPlayer3D::_notification(int p_what) { int vol_index_max = AudioServer::get_singleton()->get_speaker_mode() + 1; if (area) { - if (area->is_overriding_audio_bus()) { //override audio bus StringName bus_name = area->get_audio_bus(); @@ -505,7 +492,6 @@ void AudioStreamPlayer3D::_notification(int p_what) { } if (area->is_using_reverb_bus()) { - filled_reverb = true; StringName bus_name = area->get_reverb_bus(); output.reverb_bus_index = AudioServer::get_singleton()->thread_find_bus_index(bus_name); @@ -514,7 +500,6 @@ void AudioStreamPlayer3D::_notification(int p_what) { float area_send = area->get_reverb_amount(); if (uniformity > 0.0) { - float distance = listener_area_pos.length(); float attenuation = Math::db2linear(_get_attenuation_db(distance)); @@ -556,26 +541,21 @@ void AudioStreamPlayer3D::_notification(int p_what) { } for (int i = 0; i < vol_index_max; i++) { - output.reverb_vol[i] = output.reverb_vol[i].lerp(center_frame, attenuation); } } else { for (int i = 0; i < vol_index_max; i++) { - output.reverb_vol[i] = center_frame; } } for (int i = 0; i < vol_index_max; i++) { - output.reverb_vol[i] = output.vol[i].lerp(output.reverb_vol[i] * attenuation, uniformity); output.reverb_vol[i] *= area_send; } } else { - for (int i = 0; i < vol_index_max; i++) { - output.reverb_vol[i] = output.vol[i] * area_send; } } @@ -583,7 +563,6 @@ void AudioStreamPlayer3D::_notification(int p_what) { } if (doppler_tracking != DOPPLER_TRACKING_DISABLED) { - Vector3 listener_velocity; if (listener_is_camera) { @@ -608,17 +587,16 @@ void AudioStreamPlayer3D::_notification(int p_what) { } if (!filled_reverb) { - for (int i = 0; i < vol_index_max; i++) { - output.reverb_vol[i] = AudioFrame(0, 0); } } outputs[new_output_count] = output; new_output_count++; - if (new_output_count == MAX_OUTPUTS) + if (new_output_count == MAX_OUTPUTS) { break; + } } output_count = new_output_count; @@ -645,7 +623,6 @@ void AudioStreamPlayer3D::_notification(int p_what) { } void AudioStreamPlayer3D::set_stream(Ref<AudioStream> p_stream) { - AudioServer::get_singleton()->lock(); mix_buffer.resize(AudioServer::get_singleton()->thread_get_mix_buffer_size()); @@ -670,34 +647,30 @@ void AudioStreamPlayer3D::set_stream(Ref<AudioStream> p_stream) { } Ref<AudioStream> AudioStreamPlayer3D::get_stream() const { - return stream; } void AudioStreamPlayer3D::set_unit_db(float p_volume) { - unit_db = p_volume; } -float AudioStreamPlayer3D::get_unit_db() const { +float AudioStreamPlayer3D::get_unit_db() const { return unit_db; } void AudioStreamPlayer3D::set_unit_size(float p_volume) { - unit_size = p_volume; } -float AudioStreamPlayer3D::get_unit_size() const { +float AudioStreamPlayer3D::get_unit_size() const { return unit_size; } void AudioStreamPlayer3D::set_max_db(float p_boost) { - max_db = p_boost; } -float AudioStreamPlayer3D::get_max_db() const { +float AudioStreamPlayer3D::get_max_db() const { return max_db; } @@ -705,12 +678,12 @@ void AudioStreamPlayer3D::set_pitch_scale(float p_pitch_scale) { ERR_FAIL_COND(p_pitch_scale <= 0.0); pitch_scale = p_pitch_scale; } + float AudioStreamPlayer3D::get_pitch_scale() const { return pitch_scale; } void AudioStreamPlayer3D::play(float p_from_pos) { - if (!is_playing()) { // Reset the prev_output_count if the stream is stopped prev_output_count = 0; @@ -725,14 +698,12 @@ void AudioStreamPlayer3D::play(float p_from_pos) { } void AudioStreamPlayer3D::seek(float p_seconds) { - if (stream_playback.is_valid()) { setseek = p_seconds; } } void AudioStreamPlayer3D::stop() { - if (stream_playback.is_valid()) { active = false; set_physics_process_internal(false); @@ -741,7 +712,6 @@ void AudioStreamPlayer3D::stop() { } bool AudioStreamPlayer3D::is_playing() const { - if (stream_playback.is_valid()) { return active; // && stream_playback->is_playing(); } @@ -750,7 +720,6 @@ bool AudioStreamPlayer3D::is_playing() const { } float AudioStreamPlayer3D::get_playback_position() { - if (stream_playback.is_valid()) { return stream_playback->get_playback_position(); } @@ -759,14 +728,13 @@ float AudioStreamPlayer3D::get_playback_position() { } void AudioStreamPlayer3D::set_bus(const StringName &p_bus) { - //if audio is active, must lock this AudioServer::get_singleton()->lock(); bus = p_bus; AudioServer::get_singleton()->unlock(); } -StringName AudioStreamPlayer3D::get_bus() const { +StringName AudioStreamPlayer3D::get_bus() const { for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { if (AudioServer::get_singleton()->get_bus_name(i) == bus) { return bus; @@ -776,34 +744,32 @@ StringName AudioStreamPlayer3D::get_bus() const { } void AudioStreamPlayer3D::set_autoplay(bool p_enable) { - autoplay = p_enable; } -bool AudioStreamPlayer3D::is_autoplay_enabled() { +bool AudioStreamPlayer3D::is_autoplay_enabled() { return autoplay; } void AudioStreamPlayer3D::_set_playing(bool p_enable) { - - if (p_enable) + if (p_enable) { play(); - else + } else { stop(); + } } -bool AudioStreamPlayer3D::_is_active() const { +bool AudioStreamPlayer3D::_is_active() const { return active; } void AudioStreamPlayer3D::_validate_property(PropertyInfo &property) const { - if (property.name == "bus") { - String options; for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { - if (i > 0) + if (i > 0) { options += ","; + } String name = AudioServer::get_singleton()->get_bus_name(i); options += name; } @@ -813,28 +779,23 @@ void AudioStreamPlayer3D::_validate_property(PropertyInfo &property) const { } void AudioStreamPlayer3D::_bus_layout_changed() { - _change_notify(); } void AudioStreamPlayer3D::set_max_distance(float p_metres) { - ERR_FAIL_COND(p_metres < 0.0); max_distance = p_metres; } float AudioStreamPlayer3D::get_max_distance() const { - return max_distance; } void AudioStreamPlayer3D::set_area_mask(uint32_t p_mask) { - area_mask = p_mask; } uint32_t AudioStreamPlayer3D::get_area_mask() const { - return area_mask; } @@ -859,30 +820,26 @@ float AudioStreamPlayer3D::get_emission_angle() const { } void AudioStreamPlayer3D::set_emission_angle_filter_attenuation_db(float p_angle_attenuation_db) { - emission_angle_filter_attenuation_db = p_angle_attenuation_db; } float AudioStreamPlayer3D::get_emission_angle_filter_attenuation_db() const { - return emission_angle_filter_attenuation_db; } void AudioStreamPlayer3D::set_attenuation_filter_cutoff_hz(float p_hz) { - attenuation_filter_cutoff_hz = p_hz; } -float AudioStreamPlayer3D::get_attenuation_filter_cutoff_hz() const { +float AudioStreamPlayer3D::get_attenuation_filter_cutoff_hz() const { return attenuation_filter_cutoff_hz; } void AudioStreamPlayer3D::set_attenuation_filter_db(float p_db) { - attenuation_filter_db = p_db; } -float AudioStreamPlayer3D::get_attenuation_filter_db() const { +float AudioStreamPlayer3D::get_attenuation_filter_db() const { return attenuation_filter_db; } @@ -896,20 +853,18 @@ AudioStreamPlayer3D::AttenuationModel AudioStreamPlayer3D::get_attenuation_model } void AudioStreamPlayer3D::set_out_of_range_mode(OutOfRangeMode p_mode) { - ERR_FAIL_INDEX((int)p_mode, 2); out_of_range_mode = p_mode; } AudioStreamPlayer3D::OutOfRangeMode AudioStreamPlayer3D::get_out_of_range_mode() const { - return out_of_range_mode; } void AudioStreamPlayer3D::set_doppler_tracking(DopplerTracking p_tracking) { - - if (doppler_tracking == p_tracking) + if (doppler_tracking == p_tracking) { return; + } doppler_tracking = p_tracking; @@ -925,12 +880,10 @@ void AudioStreamPlayer3D::set_doppler_tracking(DopplerTracking p_tracking) { } AudioStreamPlayer3D::DopplerTracking AudioStreamPlayer3D::get_doppler_tracking() const { - return doppler_tracking; } void AudioStreamPlayer3D::set_stream_paused(bool p_pause) { - if (p_pause != stream_paused) { stream_paused = p_pause; stream_paused_fade_in = !stream_paused; @@ -939,7 +892,6 @@ void AudioStreamPlayer3D::set_stream_paused(bool p_pause) { } bool AudioStreamPlayer3D::get_stream_paused() const { - return stream_paused; } @@ -948,7 +900,6 @@ Ref<AudioStreamPlayback> AudioStreamPlayer3D::get_stream_playback() { } void AudioStreamPlayer3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_stream", "stream"), &AudioStreamPlayer3D::set_stream); ClassDB::bind_method(D_METHOD("get_stream"), &AudioStreamPlayer3D::get_stream); @@ -1054,7 +1005,6 @@ void AudioStreamPlayer3D::_bind_methods() { } AudioStreamPlayer3D::AudioStreamPlayer3D() { - unit_db = 0; unit_size = 1; attenuation_model = ATTENUATION_INVERSE_DISTANCE; @@ -1084,5 +1034,6 @@ AudioStreamPlayer3D::AudioStreamPlayer3D() { AudioServer::get_singleton()->connect("bus_layout_changed", callable_mp(this, &AudioStreamPlayer3D::_bus_layout_changed)); set_disable_scale(true); } + AudioStreamPlayer3D::~AudioStreamPlayer3D() { } diff --git a/scene/3d/audio_stream_player_3d.h b/scene/3d/audio_stream_player_3d.h index 13e08339e2..9f261c54b4 100644 --- a/scene/3d/audio_stream_player_3d.h +++ b/scene/3d/audio_stream_player_3d.h @@ -39,7 +39,6 @@ class Camera3D; class AudioStreamPlayer3D : public Node3D { - GDCLASS(AudioStreamPlayer3D, Node3D); public: @@ -69,7 +68,6 @@ private: }; struct Output { - AudioFilterSW filter; AudioFilterSW::Processor filter_process[8]; AudioFrame vol[4]; diff --git a/scene/3d/baked_lightmap.cpp b/scene/3d/baked_lightmap.cpp index 82a9a1e589..e2f1b3807d 100644 --- a/scene/3d/baked_lightmap.cpp +++ b/scene/3d/baked_lightmap.cpp @@ -41,7 +41,6 @@ #include "lightmap_probe.h" void BakedLightmapData::add_user(const NodePath &p_path, const Rect2 &p_uv_scale, int p_slice_index, int32_t p_sub_instance) { - User user; user.path = p_path; user.uv_scale = p_uv_scale; @@ -51,29 +50,25 @@ void BakedLightmapData::add_user(const NodePath &p_path, const Rect2 &p_uv_scale } int BakedLightmapData::get_user_count() const { - return users.size(); } -NodePath BakedLightmapData::get_user_path(int p_user) const { +NodePath BakedLightmapData::get_user_path(int p_user) const { ERR_FAIL_INDEX_V(p_user, users.size(), NodePath()); return users[p_user].path; } int32_t BakedLightmapData::get_user_sub_instance(int p_user) const { - ERR_FAIL_INDEX_V(p_user, users.size(), -1); return users[p_user].sub_instance; } Rect2 BakedLightmapData::get_user_lightmap_uv_scale(int p_user) const { - ERR_FAIL_INDEX_V(p_user, users.size(), Rect2()); return users[p_user].uv_scale; } int BakedLightmapData::get_user_lightmap_slice_index(int p_user) const { - ERR_FAIL_INDEX_V(p_user, users.size(), -1); return users[p_user].slice_index; } @@ -83,7 +78,6 @@ void BakedLightmapData::clear_users() { } void BakedLightmapData::_set_user_data(const Array &p_data) { - ERR_FAIL_COND((p_data.size() % 4) != 0); for (int i = 0; i < p_data.size(); i += 4) { @@ -92,7 +86,6 @@ void BakedLightmapData::_set_user_data(const Array &p_data) { } Array BakedLightmapData::_get_user_data() const { - Array ret; for (int i = 0; i < users.size(); i++) { ret.push_back(users[i].path); @@ -150,9 +143,11 @@ void BakedLightmapData::set_capture_data(const AABB &p_bounds, bool p_interior, PackedVector3Array BakedLightmapData::get_capture_points() const { return RS::get_singleton()->lightmap_get_probe_capture_points(lightmap); } + PackedColorArray BakedLightmapData::get_capture_sh() const { return RS::get_singleton()->lightmap_get_probe_capture_sh(lightmap); } + PackedInt32Array BakedLightmapData::get_capture_tetrahedra() const { return RS::get_singleton()->lightmap_get_probe_capture_tetrahedra(lightmap); } @@ -189,8 +184,8 @@ Dictionary BakedLightmapData::_get_probe_data() const { d["interior"] = is_interior(); return d; } -void BakedLightmapData::_bind_methods() { +void BakedLightmapData::_bind_methods() { ClassDB::bind_method(D_METHOD("_set_user_data", "data"), &BakedLightmapData::_set_user_data); ClassDB::bind_method(D_METHOD("_get_user_data"), &BakedLightmapData::_get_user_data); @@ -215,28 +210,23 @@ void BakedLightmapData::_bind_methods() { } BakedLightmapData::BakedLightmapData() { - lightmap = RS::get_singleton()->lightmap_create(); } BakedLightmapData::~BakedLightmapData() { - RS::get_singleton()->free(lightmap); } /////////////////////////// void BakedLightmap::_find_meshes_and_lights(Node *p_at_node, Vector<MeshesFound> &meshes, Vector<LightsFound> &lights, Vector<Vector3> &probes) { - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_at_node); if (mi && mi->get_gi_mode() == GeometryInstance3D::GI_MODE_BAKED && mi->is_visible_in_tree()) { Ref<Mesh> mesh = mi->get_mesh(); if (mesh.is_valid()) { - bool all_have_uv2_and_normal = true; bool surfaces_found = false; for (int i = 0; i < mesh->get_surface_count(); i++) { - if (mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) { continue; } @@ -284,10 +274,10 @@ void BakedLightmap::_find_meshes_and_lights(Node *p_at_node, Vector<MeshesFound> if (bmeshes.size() && (bmeshes.size() & 1) == 0) { Transform xf = get_global_transform().affine_inverse() * s->get_global_transform(); for (int i = 0; i < bmeshes.size(); i += 2) { - Ref<Mesh> mesh = bmeshes[i]; - if (!mesh.is_valid()) + if (!mesh.is_valid()) { continue; + } MeshesFound mf; @@ -306,7 +296,6 @@ void BakedLightmap::_find_meshes_and_lights(Node *p_at_node, Vector<MeshesFound> Light3D *light = Object::cast_to<Light3D>(p_at_node); if (light && light->get_bake_mode() != Light3D::BAKE_DISABLED) { - LightsFound lf; lf.xform = get_global_transform().affine_inverse() * light->get_global_transform(); lf.light = light; @@ -321,17 +310,16 @@ void BakedLightmap::_find_meshes_and_lights(Node *p_at_node, Vector<MeshesFound> } for (int i = 0; i < p_at_node->get_child_count(); i++) { - Node *child = p_at_node->get_child(i); - if (!child->get_owner()) + if (!child->get_owner()) { continue; //maybe a helper + } _find_meshes_and_lights(child, meshes, lights, probes); } } int BakedLightmap::_bsp_get_simplex_side(const Vector<Vector3> &p_points, const LocalVector<BSPSimplex> &p_simplices, const Plane &p_plane, uint32_t p_simplex) const { - int over = 0; int under = 0; int coplanar = 0; @@ -360,7 +348,6 @@ int BakedLightmap::_bsp_get_simplex_side(const Vector<Vector3> &p_points, const //#define DEBUG_BSP int32_t BakedLightmap::_compute_bsp_tree(const Vector<Vector3> &p_points, const LocalVector<Plane> &p_planes, LocalVector<int32_t> &planes_tested, const LocalVector<BSPSimplex> &p_simplices, const LocalVector<int32_t> &p_simplex_indices, LocalVector<BSPNode> &bsp_nodes) { - //if we reach here, it means there is more than one simplex int32_t node_index = (int32_t)bsp_nodes.size(); bsp_nodes.push_back(BSPNode()); @@ -427,7 +414,6 @@ int32_t BakedLightmap::_compute_bsp_tree(const Vector<Vector3> &p_points, const //score *= Math::sqrt(float(over_count + under_count) / p_simplex_indices.size()); //also multiply score if (score > best_plane_score) { - best_plane = plane; best_plane_score = score; } @@ -439,7 +425,6 @@ int32_t BakedLightmap::_compute_bsp_tree(const Vector<Vector3> &p_points, const //split again, but add to list for (uint32_t i = 0; i < p_simplex_indices.size(); i++) { - uint32_t index = p_simplex_indices[i]; int side = _bsp_get_simplex_side(p_points, p_simplices, best_plane, index); @@ -478,7 +463,6 @@ int32_t BakedLightmap::_compute_bsp_tree(const Vector<Vector3> &p_points, const for (uint32_t i = 0; i < p_simplex_indices.size(); i++) { AABB bounds; for (uint32_t j = 0; j < 4; j++) { - Vector3 p = p_points[p_simplices[p_simplex_indices[i]].vertices[j]]; if (j == 0) { bounds.position = p; @@ -549,7 +533,6 @@ int32_t BakedLightmap::_compute_bsp_tree(const Vector<Vector3> &p_points, const } bool BakedLightmap::_lightmap_bake_step_function(float p_completion, const String &p_text, void *ud, bool p_refresh) { - BakeStepUD *bsud = (BakeStepUD *)ud; bool ret = false; if (bsud->func) { @@ -559,7 +542,6 @@ bool BakedLightmap::_lightmap_bake_step_function(float p_completion, const Strin } void BakedLightmap::_plot_triangle_into_octree(GenProbesOctree *p_cell, float p_cell_size, const Vector3 *p_triangle) { - for (int i = 0; i < 8; i++) { Vector3i pos = p_cell->offset; uint32_t half_size = p_cell->size / 2; @@ -577,8 +559,9 @@ void BakedLightmap::_plot_triangle_into_octree(GenProbesOctree *p_cell, float p_ subcell.position = Vector3(pos) * p_cell_size; subcell.size = Vector3(half_size, half_size, half_size) * p_cell_size; - if (!Geometry::triangle_box_overlap(subcell.position + subcell.size * 0.5, subcell.size * 0.5, p_triangle)) + if (!Geometry::triangle_box_overlap(subcell.position + subcell.size * 0.5, subcell.size * 0.5, p_triangle)) { continue; + } if (p_cell->children[i] == nullptr) { GenProbesOctree *child = memnew(GenProbesOctree); @@ -593,10 +576,9 @@ void BakedLightmap::_plot_triangle_into_octree(GenProbesOctree *p_cell, float p_ } } } -void BakedLightmap::_gen_new_positions_from_octree(const GenProbesOctree *p_cell, float p_cell_size, const Vector<Vector3> &probe_positions, LocalVector<Vector3> &new_probe_positions, HashMap<Vector3i, bool, Vector3iHash> &positions_used, const AABB &p_bounds) { +void BakedLightmap::_gen_new_positions_from_octree(const GenProbesOctree *p_cell, float p_cell_size, const Vector<Vector3> &probe_positions, LocalVector<Vector3> &new_probe_positions, HashMap<Vector3i, bool, Vector3iHash> &positions_used, const AABB &p_bounds) { for (int i = 0; i < 8; i++) { - Vector3i pos = p_cell->offset; if (i & 1) { pos.x += p_cell->size; @@ -616,7 +598,6 @@ void BakedLightmap::_gen_new_positions_from_octree(const GenProbesOctree *p_cell const Vector3 *pp = probe_positions.ptr(); bool exists = false; for (int j = 0; j < ppcount; j++) { - if (pp[j].distance_to(real_pos) < CMP_EPSILON) { exists = true; break; @@ -635,14 +616,13 @@ void BakedLightmap::_gen_new_positions_from_octree(const GenProbesOctree *p_cell } } } -BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_data_path, Lightmapper::BakeStepFunc p_bake_step, void *p_bake_userdata) { +BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_data_path, Lightmapper::BakeStepFunc p_bake_step, void *p_bake_userdata) { if (p_image_data_path == "" && (get_light_data().is_null() || !get_light_data()->get_path().is_resource_file())) { return BAKE_ERROR_NO_SAVE_PATH; } if (p_image_data_path == "") { - if (get_light_data().is_null()) { return BAKE_ERROR_NO_SAVE_PATH; } @@ -681,7 +661,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d //get the base material textures, help compute altlas size and bounds for (int m_i = 0; m_i < meshes_found.size(); m_i++) { - if (p_bake_step) { float p = (float)(m_i) / meshes_found.size(); p_bake_step(p * 0.1, vformat(TTR("Preparing geometry %d/%d"), m_i, meshes_found.size()), p_bake_userdata, false); @@ -718,7 +697,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d } { - if (albedo->get_format() != Image::FORMAT_RGBA8) { albedo->convert(Image::FORMAT_RGBA8); } @@ -779,7 +757,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d const int *ir = nullptr; if (index.size()) { - facecount = index.size() / 3; ir = index.ptr(); } else { @@ -787,7 +764,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d } for (int j = 0; j < facecount; j++) { - uint32_t vidx[3]; if (ir) { @@ -893,7 +869,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d } //skip first level, since probes are always added at bounds endpoints anyway (code above this) for (int i = 0; i < 8; i++) { - if (octree.children[i]) { _gen_new_positions_from_octree(octree.children[i], subdiv_cell_size, probes_found, new_probe_positions, positions_used, bounds); } @@ -910,7 +885,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d } { - for (int i = 0; i < mesh_data.size(); i++) { lightmapper->add_mesh(mesh_data[i]); } @@ -995,7 +969,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d Ref<TextureLayered> texture; { - Vector<Ref<Image>> images; for (int i = 0; i < lightmapper->get_bake_texture_count(); i++) { images.push_back(lightmapper->get_bake_texture(i)); @@ -1016,7 +989,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d config.instance(); if (FileAccess::exists(base_path + ".import")) { - config->load(base_path + ".import"); } @@ -1095,7 +1067,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d PackedInt32Array tetrahedrons; for (int i = 0; i < solved_simplices.size(); i++) { - //Prepare a special representation of the simplex, which uses a BSP Tree BSPSimplex bsp_simplex; for (int j = 0; j < 4; j++) { @@ -1117,7 +1088,6 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d Plane p(a, b, c); int plane_index = -1; for (uint32_t k = 0; k < bsp_planes.size(); k++) { - if (bsp_planes[k].is_equal_approx_any_side(p)) { plane_index = k; break; @@ -1218,14 +1188,12 @@ BakedLightmap::BakeError BakedLightmap::bake(Node *p_from_node, String p_image_d void BakedLightmap::_notification(int p_what) { if (p_what == NOTIFICATION_POST_ENTER_TREE) { - if (light_data.is_valid()) { _assign_lightmaps(); } } if (p_what == NOTIFICATION_EXIT_TREE) { - if (light_data.is_valid()) { _clear_lightmaps(); } @@ -1233,11 +1201,9 @@ void BakedLightmap::_notification(int p_what) { } void BakedLightmap::_assign_lightmaps() { - ERR_FAIL_COND(!light_data.is_valid()); for (int i = 0; i < light_data->get_user_count(); i++) { - Node *node = get_node(light_data->get_user_path(i)); int instance_idx = light_data->get_user_sub_instance(i); if (instance_idx >= 0) { @@ -1272,7 +1238,6 @@ void BakedLightmap::_clear_lightmaps() { } void BakedLightmap::set_light_data(const Ref<BakedLightmapData> &p_data) { - if (light_data.is_valid()) { if (is_inside_tree()) { _clear_lightmaps(); @@ -1292,7 +1257,6 @@ void BakedLightmap::set_light_data(const Ref<BakedLightmapData> &p_data) { } Ref<BakedLightmapData> BakedLightmap::get_light_data() const { - return light_data; } @@ -1307,17 +1271,16 @@ BakedLightmap::BakeQuality BakedLightmap::get_bake_quality() const { AABB BakedLightmap::get_aabb() const { return AABB(); } + Vector<Face3> BakedLightmap::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } void BakedLightmap::set_use_denoiser(bool p_enable) { - use_denoiser = p_enable; } bool BakedLightmap::is_using_denoiser() const { - return use_denoiser; } @@ -1332,6 +1295,7 @@ bool BakedLightmap::is_directional() const { void BakedLightmap::set_interior(bool p_enable) { interior = p_enable; } + bool BakedLightmap::is_interior() const { return interior; } @@ -1356,6 +1320,7 @@ Ref<Sky> BakedLightmap::get_environment_custom_sky() const { void BakedLightmap::set_environment_custom_color(const Color &p_color) { environment_custom_color = p_color; } + Color BakedLightmap::get_environment_custom_color() const { return environment_custom_color; } @@ -1363,6 +1328,7 @@ Color BakedLightmap::get_environment_custom_color() const { void BakedLightmap::set_environment_custom_energy(float p_energy) { environment_custom_energy = p_energy; } + float BakedLightmap::get_environment_custom_energy() const { return environment_custom_energy; } @@ -1415,7 +1381,6 @@ void BakedLightmap::_validate_property(PropertyInfo &property) const { } void BakedLightmap::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_light_data", "data"), &BakedLightmap::set_light_data); ClassDB::bind_method(D_METHOD("get_light_data"), &BakedLightmap::get_light_data); @@ -1501,7 +1466,6 @@ void BakedLightmap::_bind_methods() { } BakedLightmap::BakedLightmap() { - environment_mode = ENVIRONMENT_MODE_DISABLED; environment_custom_color = Color(0.2, 0.7, 1.0); environment_custom_energy = 1.0; diff --git a/scene/3d/baked_lightmap.h b/scene/3d/baked_lightmap.h index 748fdf913f..08098c3d5d 100644 --- a/scene/3d/baked_lightmap.h +++ b/scene/3d/baked_lightmap.h @@ -52,7 +52,6 @@ class BakedLightmapData : public Resource { AABB bounds; struct User { - NodePath path; int32_t sub_instance; Rect2 uv_scale; diff --git a/scene/3d/bone_attachment_3d.cpp b/scene/3d/bone_attachment_3d.cpp index 825cb39e2d..68303bbfe5 100644 --- a/scene/3d/bone_attachment_3d.cpp +++ b/scene/3d/bone_attachment_3d.cpp @@ -31,23 +31,21 @@ #include "bone_attachment_3d.h" void BoneAttachment3D::_validate_property(PropertyInfo &property) const { - if (property.name == "bone_name") { Skeleton3D *parent = Object::cast_to<Skeleton3D>(get_parent()); if (parent) { - String names; for (int i = 0; i < parent->get_bone_count(); i++) { - if (i > 0) + if (i > 0) { names += ","; + } names += parent->get_bone_name(i); } property.hint = PROPERTY_HINT_ENUM; property.hint_string = names; } else { - property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; } @@ -55,10 +53,8 @@ void BoneAttachment3D::_validate_property(PropertyInfo &property) const { } void BoneAttachment3D::_check_bind() { - Skeleton3D *sk = Object::cast_to<Skeleton3D>(get_parent()); if (sk) { - int idx = sk->find_bone(bone_name); if (idx != -1) { sk->bind_child_node_to_bone(idx, this); @@ -69,12 +65,9 @@ void BoneAttachment3D::_check_bind() { } void BoneAttachment3D::_check_unbind() { - if (bound) { - Skeleton3D *sk = Object::cast_to<Skeleton3D>(get_parent()); if (sk) { - int idx = sk->find_bone(bone_name); if (idx != -1) { sk->unbind_child_node_from_bone(idx, this); @@ -85,31 +78,27 @@ void BoneAttachment3D::_check_unbind() { } void BoneAttachment3D::set_bone_name(const String &p_name) { - - if (is_inside_tree()) + if (is_inside_tree()) { _check_unbind(); + } bone_name = p_name; - if (is_inside_tree()) + if (is_inside_tree()) { _check_bind(); + } } String BoneAttachment3D::get_bone_name() const { - return bone_name; } void BoneAttachment3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - _check_bind(); } break; case NOTIFICATION_EXIT_TREE: { - _check_unbind(); } break; } diff --git a/scene/3d/bone_attachment_3d.h b/scene/3d/bone_attachment_3d.h index d2a3ffec90..fec59217d2 100644 --- a/scene/3d/bone_attachment_3d.h +++ b/scene/3d/bone_attachment_3d.h @@ -34,7 +34,6 @@ #include "scene/3d/skeleton_3d.h" class BoneAttachment3D : public Node3D { - GDCLASS(BoneAttachment3D, Node3D); bool bound; diff --git a/scene/3d/camera_3d.cpp b/scene/3d/camera_3d.cpp index 871f3119bc..8dc5cd4aba 100644 --- a/scene/3d/camera_3d.cpp +++ b/scene/3d/camera_3d.cpp @@ -39,16 +39,13 @@ void Camera3D::_update_audio_listener_state() { } void Camera3D::_request_camera_update() { - _update_camera(); } void Camera3D::_update_camera_mode() { - force_change = true; switch (mode) { case PROJECTION_PERSPECTIVE: { - set_perspective(fov, near, far); } break; @@ -78,9 +75,9 @@ void Camera3D::_validate_property(PropertyInfo &p_property) const { } void Camera3D::_update_camera() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } RenderingServer::get_singleton()->camera_set_transform(camera, get_camera_transform()); @@ -90,8 +87,9 @@ void Camera3D::_update_camera() { get_viewport()->_camera_transform_changed_notify(); */ - if (get_tree()->is_node_being_edited(this) || !is_current()) + if (get_tree()->is_node_being_edited(this) || !is_current()) { return; + } get_viewport()->_camera_transform_changed_notify(); @@ -101,11 +99,8 @@ void Camera3D::_update_camera() { } void Camera3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_WORLD: { - // Needs to track the Viewport because it's needed on NOTIFICATION_EXIT_WORLD // and Spatial will handle it first, including clearing its reference to the Viewport, // therefore making it impossible to subclasses to access it @@ -113,19 +108,18 @@ void Camera3D::_notification(int p_what) { ERR_FAIL_COND(!viewport); bool first_camera = viewport->_camera_add(this); - if (current || first_camera) + if (current || first_camera) { viewport->_camera_set(this); + } } break; case NOTIFICATION_TRANSFORM_CHANGED: { - _request_camera_update(); if (doppler_tracking != DOPPLER_TRACKING_DISABLED) { velocity_tracker->update_position(get_global_transform().origin); } } break; case NOTIFICATION_EXIT_WORLD: { - if (!get_tree()->is_node_being_edited(this)) { if (is_current()) { clear_current(); @@ -156,7 +150,6 @@ void Camera3D::_notification(int p_what) { } Transform Camera3D::get_camera_transform() const { - Transform tr = get_global_transform().orthonormalized(); tr.origin += tr.basis.get_axis(1) * v_offset; tr.origin += tr.basis.get_axis(0) * h_offset; @@ -164,9 +157,9 @@ Transform Camera3D::get_camera_transform() const { } void Camera3D::set_perspective(float p_fovy_degrees, float p_z_near, float p_z_far) { - - if (!force_change && fov == p_fovy_degrees && p_z_near == near && p_z_far == far && mode == PROJECTION_PERSPECTIVE) + if (!force_change && fov == p_fovy_degrees && p_z_near == near && p_z_far == far && mode == PROJECTION_PERSPECTIVE) { return; + } fov = p_fovy_degrees; near = p_z_near; @@ -177,10 +170,11 @@ void Camera3D::set_perspective(float p_fovy_degrees, float p_z_near, float p_z_f update_gizmo(); force_change = false; } -void Camera3D::set_orthogonal(float p_size, float p_z_near, float p_z_far) { - if (!force_change && size == p_size && p_z_near == near && p_z_far == far && mode == PROJECTION_ORTHOGONAL) +void Camera3D::set_orthogonal(float p_size, float p_z_near, float p_z_far) { + if (!force_change && size == p_size && p_z_near == near && p_z_far == far && mode == PROJECTION_ORTHOGONAL) { return; + } size = p_size; @@ -194,8 +188,9 @@ void Camera3D::set_orthogonal(float p_size, float p_z_near, float p_z_far) { } void Camera3D::set_frustum(float p_size, Vector2 p_offset, float p_z_near, float p_z_far) { - if (!force_change && size == p_size && frustum_offset == p_offset && p_z_near == near && p_z_far == far && mode == PROJECTION_FRUSTUM) + if (!force_change && size == p_size && frustum_offset == p_offset && p_z_near == near && p_z_far == far && mode == PROJECTION_FRUSTUM) { return; + } size = p_size; frustum_offset = p_offset; @@ -218,16 +213,15 @@ void Camera3D::set_projection(Camera3D::Projection p_mode) { } RID Camera3D::get_camera() const { - return camera; }; void Camera3D::make_current() { - current = true; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } get_viewport()->_camera_set(this); @@ -235,10 +229,10 @@ void Camera3D::make_current() { } void Camera3D::clear_current(bool p_enable_next) { - current = false; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (get_viewport()->get_camera() == this) { get_viewport()->_camera_set(nullptr); @@ -258,27 +252,23 @@ void Camera3D::set_current(bool p_current) { } bool Camera3D::is_current() const { - if (is_inside_tree() && !get_tree()->is_node_being_edited(this)) { - return get_viewport()->get_camera() == this; - } else + } else { return current; + } } bool Camera3D::_can_gizmo_scale() const { - return false; } Vector3 Camera3D::project_ray_normal(const Point2 &p_pos) const { - Vector3 ray = project_local_ray_normal(p_pos); return get_camera_transform().basis.xform(ray).normalized(); }; Vector3 Camera3D::project_local_ray_normal(const Point2 &p_pos) const { - ERR_FAIL_COND_V_MSG(!is_inside_tree(), Vector3(), "Camera is not inside scene."); Size2 viewport_size = get_viewport()->get_camera_rect_size(); @@ -286,7 +276,6 @@ Vector3 Camera3D::project_local_ray_normal(const Point2 &p_pos) const { Vector3 ray; if (mode == PROJECTION_ORTHOGONAL) { - ray = Vector3(0, 0, -1); } else { CameraMatrix cm; @@ -299,7 +288,6 @@ Vector3 Camera3D::project_local_ray_normal(const Point2 &p_pos) const { }; Vector3 Camera3D::project_ray_origin(const Point2 &p_pos) const { - ERR_FAIL_COND_V_MSG(!is_inside_tree(), Vector3(), "Camera is not inside scene."); Size2 viewport_size = get_viewport()->get_camera_rect_size(); @@ -307,10 +295,8 @@ Vector3 Camera3D::project_ray_origin(const Point2 &p_pos) const { ERR_FAIL_COND_V(viewport_size.y == 0, Vector3()); if (mode == PROJECTION_PERSPECTIVE) { - return get_camera_transform().origin; } else { - Vector2 pos = cpos / viewport_size; float vsize, hsize; if (keep_aspect == KEEP_WIDTH) { @@ -331,7 +317,6 @@ Vector3 Camera3D::project_ray_origin(const Point2 &p_pos) const { }; bool Camera3D::is_position_behind(const Vector3 &p_pos) const { - Transform t = get_global_transform(); Vector3 eyedir = -get_global_transform().basis.get_axis(2).normalized(); return eyedir.dot(p_pos) < (eyedir.dot(t.origin) + near); @@ -344,10 +329,11 @@ Vector<Vector3> Camera3D::get_near_plane_points() const { CameraMatrix cm; - if (mode == PROJECTION_ORTHOGONAL) + if (mode == PROJECTION_ORTHOGONAL) { cm.set_orthogonal(size, viewport_size.aspect(), near, far, keep_aspect == KEEP_WIDTH); - else + } else { cm.set_perspective(fov, viewport_size.aspect(), near, far, keep_aspect == KEEP_WIDTH); + } Vector3 endpoints[8]; cm.get_endpoints(Transform(), endpoints); @@ -361,17 +347,17 @@ Vector<Vector3> Camera3D::get_near_plane_points() const { } Point2 Camera3D::unproject_position(const Vector3 &p_pos) const { - ERR_FAIL_COND_V_MSG(!is_inside_tree(), Vector2(), "Camera is not inside scene."); Size2 viewport_size = get_viewport()->get_visible_rect().size; CameraMatrix cm; - if (mode == PROJECTION_ORTHOGONAL) + if (mode == PROJECTION_ORTHOGONAL) { cm.set_orthogonal(size, viewport_size.aspect(), near, far, keep_aspect == KEEP_WIDTH); - else + } else { cm.set_perspective(fov, viewport_size.aspect(), near, far, keep_aspect == KEEP_WIDTH); + } Plane p(get_camera_transform().xform_inv(p_pos), 1.0); @@ -386,7 +372,6 @@ Point2 Camera3D::unproject_position(const Vector3 &p_pos) const { } Vector3 Camera3D::project_position(const Point2 &p_point, float p_z_depth) const { - ERR_FAIL_COND_V_MSG(!is_inside_tree(), Vector3(), "Camera is not inside scene."); if (p_z_depth == 0 && mode != PROJECTION_ORTHOGONAL) { @@ -396,10 +381,11 @@ Vector3 Camera3D::project_position(const Point2 &p_point, float p_z_depth) const CameraMatrix cm; - if (mode == PROJECTION_ORTHOGONAL) + if (mode == PROJECTION_ORTHOGONAL) { cm.set_orthogonal(size, viewport_size.aspect(), p_z_depth, far, keep_aspect == KEEP_WIDTH); - else + } else { cm.set_perspective(fov, viewport_size.aspect(), p_z_depth, far, keep_aspect == KEEP_WIDTH); + } Vector2 vp_he = cm.get_viewport_half_extents(); @@ -414,32 +400,30 @@ Vector3 Camera3D::project_position(const Point2 &p_point, float p_z_depth) const } void Camera3D::set_environment(const Ref<Environment> &p_environment) { - environment = p_environment; - if (environment.is_valid()) + if (environment.is_valid()) { RS::get_singleton()->camera_set_environment(camera, environment->get_rid()); - else + } else { RS::get_singleton()->camera_set_environment(camera, RID()); + } _update_camera_mode(); } Ref<Environment> Camera3D::get_environment() const { - return environment; } void Camera3D::set_effects(const Ref<CameraEffects> &p_effects) { - effects = p_effects; - if (effects.is_valid()) + if (effects.is_valid()) { RS::get_singleton()->camera_set_camera_effects(camera, effects->get_rid()); - else + } else { RS::get_singleton()->camera_set_camera_effects(camera, RID()); + } _update_camera_mode(); } Ref<CameraEffects> Camera3D::get_effects() const { - return effects; } @@ -451,14 +435,13 @@ void Camera3D::set_keep_aspect_mode(KeepAspect p_aspect) { } Camera3D::KeepAspect Camera3D::get_keep_aspect_mode() const { - return keep_aspect; } void Camera3D::set_doppler_tracking(DopplerTracking p_tracking) { - - if (doppler_tracking == p_tracking) + if (doppler_tracking == p_tracking) { return; + } doppler_tracking = p_tracking; if (p_tracking != DOPPLER_TRACKING_DISABLED) { @@ -475,7 +458,6 @@ Camera3D::DopplerTracking Camera3D::get_doppler_tracking() const { } void Camera3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("project_ray_normal", "screen_point"), &Camera3D::project_ray_normal); ClassDB::bind_method(D_METHOD("project_local_ray_normal", "screen_point"), &Camera3D::project_local_ray_normal); ClassDB::bind_method(D_METHOD("project_ray_origin", "screen_point"), &Camera3D::project_ray_origin); @@ -552,17 +534,14 @@ void Camera3D::_bind_methods() { } float Camera3D::get_fov() const { - return fov; } float Camera3D::get_size() const { - return size; } float Camera3D::get_znear() const { - return near; } @@ -571,12 +550,10 @@ Vector2 Camera3D::get_frustum_offset() const { } float Camera3D::get_zfar() const { - return far; } Camera3D::Projection Camera3D::get_projection() const { - return mode; } @@ -616,7 +593,6 @@ void Camera3D::set_cull_mask(uint32_t p_layers) { } uint32_t Camera3D::get_cull_mask() const { - return layers; } @@ -635,27 +611,25 @@ bool Camera3D::get_cull_mask_bit(int p_layer) const { } Vector<Plane> Camera3D::get_frustum() const { - ERR_FAIL_COND_V(!is_inside_world(), Vector<Plane>()); Size2 viewport_size = get_viewport()->get_visible_rect().size; CameraMatrix cm; - if (mode == PROJECTION_PERSPECTIVE) + if (mode == PROJECTION_PERSPECTIVE) { cm.set_perspective(fov, viewport_size.aspect(), near, far, keep_aspect == KEEP_WIDTH); - else + } else { cm.set_orthogonal(size, viewport_size.aspect(), near, far, keep_aspect == KEEP_WIDTH); + } return cm.get_projection_planes(get_camera_transform()); } void Camera3D::set_v_offset(float p_offset) { - v_offset = p_offset; _update_camera(); } float Camera3D::get_v_offset() const { - return v_offset; } @@ -665,20 +639,18 @@ void Camera3D::set_h_offset(float p_offset) { } float Camera3D::get_h_offset() const { - return h_offset; } Vector3 Camera3D::get_doppler_tracked_velocity() const { - if (doppler_tracking != DOPPLER_TRACKING_DISABLED) { return velocity_tracker->get_tracked_linear_velocity(); } else { return Vector3(); } } -Camera3D::Camera3D() { +Camera3D::Camera3D() { camera = RenderingServer::get_singleton()->camera_create(); size = 1; fov = 0; @@ -703,7 +675,6 @@ Camera3D::Camera3D() { } Camera3D::~Camera3D() { - RenderingServer::get_singleton()->free(camera); } @@ -712,11 +683,12 @@ Camera3D::~Camera3D() { void ClippedCamera3D::set_margin(float p_margin) { margin = p_margin; } + float ClippedCamera3D::get_margin() const { return margin; } -void ClippedCamera3D::set_process_mode(ProcessMode p_mode) { +void ClippedCamera3D::set_process_mode(ProcessMode p_mode) { if (process_mode == p_mode) { return; } @@ -724,12 +696,12 @@ void ClippedCamera3D::set_process_mode(ProcessMode p_mode) { set_process_internal(process_mode == CLIP_PROCESS_IDLE); set_physics_process_internal(process_mode == CLIP_PROCESS_PHYSICS); } + ClippedCamera3D::ProcessMode ClippedCamera3D::get_process_mode() const { return process_mode; } Transform ClippedCamera3D::get_camera_transform() const { - Transform t = Camera3D::get_camera_transform(); t.origin += -t.basis.get_axis(Vector3::AXIS_Z).normalized() * clip_offset; return t; @@ -737,7 +709,6 @@ Transform ClippedCamera3D::get_camera_transform() const { void ClippedCamera3D::_notification(int p_what) { if (p_what == NOTIFICATION_INTERNAL_PROCESS || p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS) { - Node3D *parent = Object::cast_to<Node3D>(get_parent()); if (!parent) { return; @@ -797,90 +768,78 @@ void ClippedCamera3D::_notification(int p_what) { } void ClippedCamera3D::set_collision_mask(uint32_t p_mask) { - collision_mask = p_mask; } uint32_t ClippedCamera3D::get_collision_mask() const { - return collision_mask; } void ClippedCamera3D::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } bool ClippedCamera3D::get_collision_mask_bit(int p_bit) const { - return get_collision_mask() & (1 << p_bit); } void ClippedCamera3D::add_exception_rid(const RID &p_rid) { - exclude.insert(p_rid); } void ClippedCamera3D::add_exception(const Object *p_object) { - ERR_FAIL_NULL(p_object); const CollisionObject3D *co = Object::cast_to<CollisionObject3D>(p_object); - if (!co) + if (!co) { return; + } add_exception_rid(co->get_rid()); } void ClippedCamera3D::remove_exception_rid(const RID &p_rid) { - exclude.erase(p_rid); } void ClippedCamera3D::remove_exception(const Object *p_object) { - ERR_FAIL_NULL(p_object); const CollisionObject3D *co = Object::cast_to<CollisionObject3D>(p_object); - if (!co) + if (!co) { return; + } remove_exception_rid(co->get_rid()); } void ClippedCamera3D::clear_exceptions() { - exclude.clear(); } float ClippedCamera3D::get_clip_offset() const { - return clip_offset; } void ClippedCamera3D::set_clip_to_areas(bool p_clip) { - clip_to_areas = p_clip; } bool ClippedCamera3D::is_clip_to_areas_enabled() const { - return clip_to_areas; } void ClippedCamera3D::set_clip_to_bodies(bool p_clip) { - clip_to_bodies = p_clip; } bool ClippedCamera3D::is_clip_to_bodies_enabled() const { - return clip_to_bodies; } void ClippedCamera3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_margin", "margin"), &ClippedCamera3D::set_margin); ClassDB::bind_method(D_METHOD("get_margin"), &ClippedCamera3D::get_margin); @@ -920,6 +879,7 @@ void ClippedCamera3D::_bind_methods() { BIND_ENUM_CONSTANT(CLIP_PROCESS_PHYSICS); BIND_ENUM_CONSTANT(CLIP_PROCESS_IDLE); } + ClippedCamera3D::ClippedCamera3D() { margin = 0; clip_offset = 0; @@ -932,6 +892,7 @@ ClippedCamera3D::ClippedCamera3D() { clip_to_areas = false; clip_to_bodies = true; } + ClippedCamera3D::~ClippedCamera3D() { PhysicsServer3D::get_singleton()->free(pyramid_shape); } diff --git a/scene/3d/camera_3d.h b/scene/3d/camera_3d.h index 9a005226cb..138b1b8a7a 100644 --- a/scene/3d/camera_3d.h +++ b/scene/3d/camera_3d.h @@ -37,7 +37,6 @@ #include "scene/resources/environment.h" class Camera3D : public Node3D { - GDCLASS(Camera3D, Node3D); public: @@ -184,7 +183,6 @@ VARIANT_ENUM_CAST(Camera3D::KeepAspect); VARIANT_ENUM_CAST(Camera3D::DopplerTracking); class ClippedCamera3D : public Camera3D { - GDCLASS(ClippedCamera3D, Camera3D); public: diff --git a/scene/3d/collision_object_3d.cpp b/scene/3d/collision_object_3d.cpp index 5d050e32b0..356992e922 100644 --- a/scene/3d/collision_object_3d.cpp +++ b/scene/3d/collision_object_3d.cpp @@ -34,52 +34,49 @@ #include "servers/physics_server_3d.h" void CollisionObject3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_WORLD: { - - if (area) + if (area) { PhysicsServer3D::get_singleton()->area_set_transform(rid, get_global_transform()); - else + } else { PhysicsServer3D::get_singleton()->body_set_state(rid, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform()); + } RID space = get_world_3d()->get_space(); if (area) { PhysicsServer3D::get_singleton()->area_set_space(rid, space); - } else + } else { PhysicsServer3D::get_singleton()->body_set_space(rid, space); + } _update_pickable(); //get space } break; case NOTIFICATION_TRANSFORM_CHANGED: { - - if (area) + if (area) { PhysicsServer3D::get_singleton()->area_set_transform(rid, get_global_transform()); - else + } else { PhysicsServer3D::get_singleton()->body_set_state(rid, PhysicsServer3D::BODY_STATE_TRANSFORM, get_global_transform()); + } } break; case NOTIFICATION_VISIBILITY_CHANGED: { - _update_pickable(); } break; case NOTIFICATION_EXIT_WORLD: { - if (area) { PhysicsServer3D::get_singleton()->area_set_space(rid, RID()); - } else + } else { PhysicsServer3D::get_singleton()->body_set_space(rid, RID()); + } } break; } } void CollisionObject3D::_input_event(Node *p_camera, const Ref<InputEvent> &p_input_event, const Vector3 &p_pos, const Vector3 &p_normal, int p_shape) { - if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_input_event, p_camera, p_input_event, p_pos, p_normal, p_shape); } @@ -87,7 +84,6 @@ void CollisionObject3D::_input_event(Node *p_camera, const Ref<InputEvent> &p_in } void CollisionObject3D::_mouse_enter() { - if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_mouse_enter); } @@ -95,7 +91,6 @@ void CollisionObject3D::_mouse_enter() { } void CollisionObject3D::_mouse_exit() { - if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_mouse_exit); } @@ -103,29 +98,28 @@ void CollisionObject3D::_mouse_exit() { } void CollisionObject3D::_update_pickable() { - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } bool pickable = ray_pickable && is_visible_in_tree(); - if (area) + if (area) { PhysicsServer3D::get_singleton()->area_set_ray_pickable(rid, pickable); - else + } else { PhysicsServer3D::get_singleton()->body_set_ray_pickable(rid, pickable); + } } void CollisionObject3D::set_ray_pickable(bool p_ray_pickable) { - ray_pickable = p_ray_pickable; _update_pickable(); } bool CollisionObject3D::is_ray_pickable() const { - return ray_pickable; } void CollisionObject3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_ray_pickable", "ray_pickable"), &CollisionObject3D::set_ray_pickable); ClassDB::bind_method(D_METHOD("is_ray_pickable"), &CollisionObject3D::is_ray_pickable); ClassDB::bind_method(D_METHOD("set_capture_input_on_drag", "enable"), &CollisionObject3D::set_capture_input_on_drag); @@ -158,7 +152,6 @@ void CollisionObject3D::_bind_methods() { } uint32_t CollisionObject3D::create_shape_owner(Object *p_owner) { - ShapeData sd; uint32_t id; @@ -176,7 +169,6 @@ uint32_t CollisionObject3D::create_shape_owner(Object *p_owner) { } void CollisionObject3D::remove_shape_owner(uint32_t owner) { - ERR_FAIL_COND(!shapes.has(owner)); shape_owner_clear_shapes(owner); @@ -199,21 +191,18 @@ void CollisionObject3D::shape_owner_set_disabled(uint32_t p_owner, bool p_disabl } bool CollisionObject3D::is_shape_owner_disabled(uint32_t p_owner) const { - ERR_FAIL_COND_V(!shapes.has(p_owner), false); return shapes[p_owner].disabled; } void CollisionObject3D::get_shape_owners(List<uint32_t> *r_owners) { - for (Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { r_owners->push_back(E->key()); } } Array CollisionObject3D::_get_shape_owners() { - Array ret; for (Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { ret.push_back(E->key()); @@ -223,7 +212,6 @@ Array CollisionObject3D::_get_shape_owners() { } void CollisionObject3D::shape_owner_set_transform(uint32_t p_owner, const Transform &p_transform) { - ERR_FAIL_COND(!shapes.has(p_owner)); ShapeData &sd = shapes[p_owner]; @@ -236,22 +224,20 @@ void CollisionObject3D::shape_owner_set_transform(uint32_t p_owner, const Transf } } } -Transform CollisionObject3D::shape_owner_get_transform(uint32_t p_owner) const { +Transform CollisionObject3D::shape_owner_get_transform(uint32_t p_owner) const { ERR_FAIL_COND_V(!shapes.has(p_owner), Transform()); return shapes[p_owner].xform; } Object *CollisionObject3D::shape_owner_get_owner(uint32_t p_owner) const { - ERR_FAIL_COND_V(!shapes.has(p_owner), nullptr); return shapes[p_owner].owner; } void CollisionObject3D::shape_owner_add_shape(uint32_t p_owner, const Ref<Shape3D> &p_shape) { - ERR_FAIL_COND(!shapes.has(p_owner)); ERR_FAIL_COND(p_shape.is_null()); @@ -268,21 +254,21 @@ void CollisionObject3D::shape_owner_add_shape(uint32_t p_owner, const Ref<Shape3 total_subshapes++; } -int CollisionObject3D::shape_owner_get_shape_count(uint32_t p_owner) const { +int CollisionObject3D::shape_owner_get_shape_count(uint32_t p_owner) const { ERR_FAIL_COND_V(!shapes.has(p_owner), 0); return shapes[p_owner].shapes.size(); } -Ref<Shape3D> CollisionObject3D::shape_owner_get_shape(uint32_t p_owner, int p_shape) const { +Ref<Shape3D> CollisionObject3D::shape_owner_get_shape(uint32_t p_owner, int p_shape) const { ERR_FAIL_COND_V(!shapes.has(p_owner), Ref<Shape3D>()); ERR_FAIL_INDEX_V(p_shape, shapes[p_owner].shapes.size(), Ref<Shape3D>()); return shapes[p_owner].shapes[p_shape].shape; } -int CollisionObject3D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const { +int CollisionObject3D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape) const { ERR_FAIL_COND_V(!shapes.has(p_owner), -1); ERR_FAIL_INDEX_V(p_shape, shapes[p_owner].shapes.size(), -1); @@ -290,7 +276,6 @@ int CollisionObject3D::shape_owner_get_shape_index(uint32_t p_owner, int p_shape } void CollisionObject3D::shape_owner_remove_shape(uint32_t p_owner, int p_shape) { - ERR_FAIL_COND(!shapes.has(p_owner)); ERR_FAIL_INDEX(p_shape, shapes[p_owner].shapes.size()); @@ -315,7 +300,6 @@ void CollisionObject3D::shape_owner_remove_shape(uint32_t p_owner, int p_shape) } void CollisionObject3D::shape_owner_clear_shapes(uint32_t p_owner) { - ERR_FAIL_COND(!shapes.has(p_owner)); while (shape_owner_get_shape_count(p_owner) > 0) { @@ -324,7 +308,6 @@ void CollisionObject3D::shape_owner_clear_shapes(uint32_t p_owner) { } uint32_t CollisionObject3D::shape_find_owner(int p_shape_index) const { - ERR_FAIL_INDEX_V(p_shape_index, total_subshapes, 0); for (const Map<uint32_t, ShapeData>::Element *E = shapes.front(); E; E = E->next()) { @@ -340,7 +323,6 @@ uint32_t CollisionObject3D::shape_find_owner(int p_shape_index) const { } CollisionObject3D::CollisionObject3D(RID p_rid, bool p_area) { - rid = p_rid; area = p_area; capture_input_on_drag = false; @@ -357,17 +339,14 @@ CollisionObject3D::CollisionObject3D(RID p_rid, bool p_area) { } void CollisionObject3D::set_capture_input_on_drag(bool p_capture) { - capture_input_on_drag = p_capture; } bool CollisionObject3D::get_capture_input_on_drag() const { - return capture_input_on_drag; } String CollisionObject3D::get_configuration_warning() const { - String warning = Node3D::get_configuration_warning(); if (shapes.empty()) { @@ -381,7 +360,6 @@ String CollisionObject3D::get_configuration_warning() const { } CollisionObject3D::CollisionObject3D() { - capture_input_on_drag = false; ray_pickable = true; set_notify_transform(true); @@ -391,6 +369,5 @@ CollisionObject3D::CollisionObject3D() { } CollisionObject3D::~CollisionObject3D() { - PhysicsServer3D::get_singleton()->free(rid); } diff --git a/scene/3d/collision_object_3d.h b/scene/3d/collision_object_3d.h index 67d3aed3c8..8bcbef0e98 100644 --- a/scene/3d/collision_object_3d.h +++ b/scene/3d/collision_object_3d.h @@ -35,7 +35,6 @@ #include "scene/resources/shape_3d.h" class CollisionObject3D : public Node3D { - GDCLASS(CollisionObject3D, Node3D); bool area; @@ -43,7 +42,6 @@ class CollisionObject3D : public Node3D { RID rid; struct ShapeData { - Object *owner; Transform xform; struct ShapeBase { diff --git a/scene/3d/collision_polygon_3d.cpp b/scene/3d/collision_polygon_3d.cpp index 66bd903eeb..bad4a1fddd 100644 --- a/scene/3d/collision_polygon_3d.cpp +++ b/scene/3d/collision_polygon_3d.cpp @@ -35,18 +35,20 @@ #include "scene/resources/convex_polygon_shape_3d.h" void CollisionPolygon3D::_build_polygon() { - - if (!parent) + if (!parent) { return; + } parent->shape_owner_clear_shapes(owner_id); - if (polygon.size() == 0) + if (polygon.size() == 0) { return; + } Vector<Vector<Vector2>> decomp = Geometry::decompose_polygon_in_convex(polygon); - if (decomp.size() == 0) + if (decomp.size() == 0) { return; + } //here comes the sun, lalalala //decompose concave into multiple convex polygons and add them @@ -60,7 +62,6 @@ void CollisionPolygon3D::_build_polygon() { Vector3 *w = cp.ptrw(); int idx = 0; for (int j = 0; j < cs; j++) { - Vector2 d = decomp[i][j]; w[idx++] = Vector3(d.x, d.y, depth * 0.5); w[idx++] = Vector3(d.x, d.y, -depth * 0.5); @@ -74,17 +75,15 @@ void CollisionPolygon3D::_build_polygon() { } void CollisionPolygon3D::_update_in_shape_owner(bool p_xform_only) { - parent->shape_owner_set_transform(owner_id, get_transform()); - if (p_xform_only) + if (p_xform_only) { return; + } parent->shape_owner_set_disabled(owner_id, disabled); } void CollisionPolygon3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_PARENTED: { parent = Object::cast_to<CollisionObject3D>(get_parent()); if (parent) { @@ -94,14 +93,12 @@ void CollisionPolygon3D::_notification(int p_what) { } } break; case NOTIFICATION_ENTER_TREE: { - if (parent) { _update_in_shape_owner(); } } break; case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: { - if (parent) { _update_in_shape_owner(true); } @@ -118,7 +115,6 @@ void CollisionPolygon3D::_notification(int p_what) { } void CollisionPolygon3D::set_polygon(const Vector<Point2> &p_polygon) { - polygon = p_polygon; if (parent) { _build_polygon(); @@ -128,24 +124,20 @@ void CollisionPolygon3D::set_polygon(const Vector<Point2> &p_polygon) { } Vector<Point2> CollisionPolygon3D::get_polygon() const { - return polygon; } AABB CollisionPolygon3D::get_item_rect() const { - return aabb; } void CollisionPolygon3D::set_depth(float p_depth) { - depth = p_depth; _build_polygon(); update_gizmo(); } float CollisionPolygon3D::get_depth() const { - return depth; } @@ -163,7 +155,6 @@ bool CollisionPolygon3D::is_disabled() const { } String CollisionPolygon3D::get_configuration_warning() const { - if (!Object::cast_to<CollisionObject3D>(get_parent())) { return TTR("CollisionPolygon3D only serves to provide a collision shape to a CollisionObject3D derived node. Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, KinematicBody3D, etc. to give them a shape."); } @@ -178,8 +169,8 @@ String CollisionPolygon3D::get_configuration_warning() const { bool CollisionPolygon3D::_is_editable_3d_polygon() const { return true; } -void CollisionPolygon3D::_bind_methods() { +void CollisionPolygon3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_depth", "depth"), &CollisionPolygon3D::set_depth); ClassDB::bind_method(D_METHOD("get_depth"), &CollisionPolygon3D::get_depth); @@ -197,7 +188,6 @@ void CollisionPolygon3D::_bind_methods() { } CollisionPolygon3D::CollisionPolygon3D() { - aabb = AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); depth = 1.0; set_notify_local_transform(true); diff --git a/scene/3d/collision_polygon_3d.h b/scene/3d/collision_polygon_3d.h index 256aee3d7e..0cd9aee111 100644 --- a/scene/3d/collision_polygon_3d.h +++ b/scene/3d/collision_polygon_3d.h @@ -36,7 +36,6 @@ class CollisionObject3D; class CollisionPolygon3D : public Node3D { - GDCLASS(CollisionPolygon3D, Node3D); protected: diff --git a/scene/3d/collision_shape_3d.cpp b/scene/3d/collision_shape_3d.cpp index a66e84ac3c..56367e9bdd 100644 --- a/scene/3d/collision_shape_3d.cpp +++ b/scene/3d/collision_shape_3d.cpp @@ -45,20 +45,17 @@ //TODO: Implement CylinderShape and HeightMapShape? void CollisionShape3D::make_convex_from_brothers() { - Node *p = get_parent(); - if (!p) + if (!p) { return; + } for (int i = 0; i < p->get_child_count(); i++) { - Node *n = p->get_child(i); MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(n); if (mi) { - Ref<Mesh> m = mi->get_mesh(); if (m.is_valid()) { - Ref<Shape3D> s = m->create_convex_shape(); set_shape(s); } @@ -68,15 +65,14 @@ void CollisionShape3D::make_convex_from_brothers() { void CollisionShape3D::_update_in_shape_owner(bool p_xform_only) { parent->shape_owner_set_transform(owner_id, get_transform()); - if (p_xform_only) + if (p_xform_only) { return; + } parent->shape_owner_set_disabled(owner_id, disabled); } void CollisionShape3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_PARENTED: { parent = Object::cast_to<CollisionObject3D>(get_parent()); if (parent) { @@ -111,12 +107,10 @@ void CollisionShape3D::_notification(int p_what) { } void CollisionShape3D::resource_changed(RES res) { - update_gizmo(); } String CollisionShape3D::get_configuration_warning() const { - if (!Object::cast_to<CollisionObject3D>(get_parent())) { return TTR("CollisionShape3D only serves to provide a collision shape to a CollisionObject3D derived node. Please only use it as a child of Area3D, StaticBody3D, RigidBody3D, KinematicBody3D, etc. to give them a shape."); } @@ -137,7 +131,6 @@ String CollisionShape3D::get_configuration_warning() const { } void CollisionShape3D::_bind_methods() { - //not sure if this should do anything ClassDB::bind_method(D_METHOD("resource_changed", "resource"), &CollisionShape3D::resource_changed); ClassDB::bind_method(D_METHOD("set_shape", "shape"), &CollisionShape3D::set_shape); @@ -154,7 +147,6 @@ void CollisionShape3D::_bind_methods() { } void CollisionShape3D::set_shape(const Ref<Shape3D> &p_shape) { - if (!shape.is_null()) { shape->unregister_owner(this); shape->disconnect("changed", callable_mp(this, &CollisionShape3D::_shape_changed)); @@ -172,18 +164,17 @@ void CollisionShape3D::set_shape(const Ref<Shape3D> &p_shape) { } } - if (is_inside_tree()) + if (is_inside_tree()) { _shape_changed(); + } update_configuration_warning(); } Ref<Shape3D> CollisionShape3D::get_shape() const { - return shape; } void CollisionShape3D::set_disabled(bool p_disabled) { - disabled = p_disabled; update_gizmo(); if (parent) { @@ -192,12 +183,10 @@ void CollisionShape3D::set_disabled(bool p_disabled) { } bool CollisionShape3D::is_disabled() const { - return disabled; } CollisionShape3D::CollisionShape3D() { - //indicator = RenderingServer::get_singleton()->mesh_create(); disabled = false; debug_shape = nullptr; @@ -207,8 +196,9 @@ CollisionShape3D::CollisionShape3D() { } CollisionShape3D::~CollisionShape3D() { - if (!shape.is_null()) + if (!shape.is_null()) { shape->unregister_owner(this); + } //RenderingServer::get_singleton()->free(indicator); } @@ -221,8 +211,9 @@ void CollisionShape3D::_update_debug_shape() { } Ref<Shape3D> s = get_shape(); - if (s.is_null()) + if (s.is_null()) { return; + } Ref<Mesh> mesh = s->get_debug_mesh(); MeshInstance3D *mi = memnew(MeshInstance3D); diff --git a/scene/3d/collision_shape_3d.h b/scene/3d/collision_shape_3d.h index 8515d292af..4ed2f4007b 100644 --- a/scene/3d/collision_shape_3d.h +++ b/scene/3d/collision_shape_3d.h @@ -35,7 +35,6 @@ #include "scene/resources/shape_3d.h" class CollisionObject3D; class CollisionShape3D : public Node3D { - GDCLASS(CollisionShape3D, Node3D); OBJ_CATEGORY("3D Physics Nodes"); diff --git a/scene/3d/cpu_particles_3d.cpp b/scene/3d/cpu_particles_3d.cpp index 414dc6f97b..4244a11592 100644 --- a/scene/3d/cpu_particles_3d.cpp +++ b/scene/3d/cpu_particles_3d.cpp @@ -36,31 +36,30 @@ #include "servers/rendering_server.h" AABB CPUParticles3D::get_aabb() const { - return AABB(); } -Vector<Face3> CPUParticles3D::get_faces(uint32_t p_usage_flags) const { +Vector<Face3> CPUParticles3D::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } void CPUParticles3D::set_emitting(bool p_emitting) { - - if (emitting == p_emitting) + if (emitting == p_emitting) { return; + } emitting = p_emitting; if (emitting) { set_process_internal(true); // first update before rendering to avoid one frame delay after emitting starts - if (time == 0) + if (time == 0) { _update_internal(); + } } } void CPUParticles3D::set_amount(int p_amount) { - ERR_FAIL_COND_MSG(p_amount < 1, "Amount of particles must be greater than 0."); particles.resize(p_amount); @@ -78,98 +77,89 @@ void CPUParticles3D::set_amount(int p_amount) { particle_order.resize(p_amount); } -void CPUParticles3D::set_lifetime(float p_lifetime) { +void CPUParticles3D::set_lifetime(float p_lifetime) { ERR_FAIL_COND_MSG(p_lifetime <= 0, "Particles lifetime must be greater than 0."); lifetime = p_lifetime; } void CPUParticles3D::set_one_shot(bool p_one_shot) { - one_shot = p_one_shot; } void CPUParticles3D::set_pre_process_time(float p_time) { - pre_process_time = p_time; } -void CPUParticles3D::set_explosiveness_ratio(float p_ratio) { +void CPUParticles3D::set_explosiveness_ratio(float p_ratio) { explosiveness_ratio = p_ratio; } -void CPUParticles3D::set_randomness_ratio(float p_ratio) { +void CPUParticles3D::set_randomness_ratio(float p_ratio) { randomness_ratio = p_ratio; } -void CPUParticles3D::set_lifetime_randomness(float p_random) { +void CPUParticles3D::set_lifetime_randomness(float p_random) { lifetime_randomness = p_random; } -void CPUParticles3D::set_use_local_coordinates(bool p_enable) { +void CPUParticles3D::set_use_local_coordinates(bool p_enable) { local_coords = p_enable; } -void CPUParticles3D::set_speed_scale(float p_scale) { +void CPUParticles3D::set_speed_scale(float p_scale) { speed_scale = p_scale; } bool CPUParticles3D::is_emitting() const { - return emitting; } -int CPUParticles3D::get_amount() const { +int CPUParticles3D::get_amount() const { return particles.size(); } -float CPUParticles3D::get_lifetime() const { +float CPUParticles3D::get_lifetime() const { return lifetime; } -bool CPUParticles3D::get_one_shot() const { +bool CPUParticles3D::get_one_shot() const { return one_shot; } float CPUParticles3D::get_pre_process_time() const { - return pre_process_time; } -float CPUParticles3D::get_explosiveness_ratio() const { +float CPUParticles3D::get_explosiveness_ratio() const { return explosiveness_ratio; } -float CPUParticles3D::get_randomness_ratio() const { +float CPUParticles3D::get_randomness_ratio() const { return randomness_ratio; } -float CPUParticles3D::get_lifetime_randomness() const { +float CPUParticles3D::get_lifetime_randomness() const { return lifetime_randomness; } bool CPUParticles3D::get_use_local_coordinates() const { - return local_coords; } float CPUParticles3D::get_speed_scale() const { - return speed_scale; } void CPUParticles3D::set_draw_order(DrawOrder p_order) { - draw_order = p_order; } CPUParticles3D::DrawOrder CPUParticles3D::get_draw_order() const { - return draw_order; } void CPUParticles3D::set_mesh(const Ref<Mesh> &p_mesh) { - mesh = p_mesh; if (mesh.is_valid()) { RS::get_singleton()->multimesh_set_mesh(multimesh, mesh->get_rid()); @@ -179,7 +169,6 @@ void CPUParticles3D::set_mesh(const Ref<Mesh> &p_mesh) { } Ref<Mesh> CPUParticles3D::get_mesh() const { - return mesh; } @@ -200,7 +189,6 @@ bool CPUParticles3D::get_fractional_delta() const { } String CPUParticles3D::get_configuration_warning() const { - String warnings; bool mesh_found = false; @@ -220,15 +208,17 @@ String CPUParticles3D::get_configuration_warning() const { anim_material_found = anim_material_found || (spat && spat->get_billboard_mode() == StandardMaterial3D::BILLBOARD_PARTICLES); if (!mesh_found) { - if (warnings != String()) + if (warnings != String()) { warnings += "\n"; + } warnings += "- " + TTR("Nothing is visible because no mesh has been assigned."); } if (!anim_material_found && (get_param(PARAM_ANIM_SPEED) != 0.0 || get_param(PARAM_ANIM_OFFSET) != 0.0 || get_param_curve(PARAM_ANIM_SPEED).is_valid() || get_param_curve(PARAM_ANIM_OFFSET).is_valid())) { - if (warnings != String()) + if (warnings != String()) { warnings += "\n"; + } warnings += "- " + TTR("CPUParticles3D animation requires the usage of a StandardMaterial3D whose Billboard Mode is set to \"Particle Billboard\"."); } @@ -236,7 +226,6 @@ String CPUParticles3D::get_configuration_warning() const { } void CPUParticles3D::restart() { - time = 0; inactive_time = 0; frame_remainder = 0; @@ -256,71 +245,63 @@ void CPUParticles3D::restart() { } void CPUParticles3D::set_direction(Vector3 p_direction) { - direction = p_direction; } Vector3 CPUParticles3D::get_direction() const { - return direction; } void CPUParticles3D::set_spread(float p_spread) { - spread = p_spread; } float CPUParticles3D::get_spread() const { - return spread; } void CPUParticles3D::set_flatness(float p_flatness) { - flatness = p_flatness; } -float CPUParticles3D::get_flatness() const { +float CPUParticles3D::get_flatness() const { return flatness; } void CPUParticles3D::set_param(Parameter p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); parameters[p_param] = p_value; } -float CPUParticles3D::get_param(Parameter p_param) const { +float CPUParticles3D::get_param(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return parameters[p_param]; } void CPUParticles3D::set_param_randomness(Parameter p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); randomness[p_param] = p_value; } -float CPUParticles3D::get_param_randomness(Parameter p_param) const { +float CPUParticles3D::get_param_randomness(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return randomness[p_param]; } static void _adjust_curve_range(const Ref<Curve> &p_curve, float p_min, float p_max) { - Ref<Curve> curve = p_curve; - if (!curve.is_valid()) + if (!curve.is_valid()) { return; + } curve->ensure_default_setup(p_min, p_max); } void CPUParticles3D::set_param_curve(Parameter p_param, const Ref<Curve> &p_curve) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); curve_parameters[p_param] = p_curve; @@ -351,7 +332,6 @@ void CPUParticles3D::set_param_curve(Parameter p_param, const Ref<Curve> &p_curv _adjust_curve_range(p_curve, -360, 360); } break; case PARAM_SCALE: { - } break; case PARAM_HUE_VARIATION: { _adjust_curve_range(p_curve, -1, 1); @@ -365,30 +345,26 @@ void CPUParticles3D::set_param_curve(Parameter p_param, const Ref<Curve> &p_curv } } } -Ref<Curve> CPUParticles3D::get_param_curve(Parameter p_param) const { +Ref<Curve> CPUParticles3D::get_param_curve(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, Ref<Curve>()); return curve_parameters[p_param]; } void CPUParticles3D::set_color(const Color &p_color) { - color = p_color; } Color CPUParticles3D::get_color() const { - return color; } void CPUParticles3D::set_color_ramp(const Ref<Gradient> &p_ramp) { - color_ramp = p_ramp; } Ref<Gradient> CPUParticles3D::get_color_ramp() const { - return color_ramp; } @@ -411,67 +387,58 @@ void CPUParticles3D::set_emission_shape(EmissionShape p_shape) { } void CPUParticles3D::set_emission_sphere_radius(float p_radius) { - emission_sphere_radius = p_radius; } void CPUParticles3D::set_emission_box_extents(Vector3 p_extents) { - emission_box_extents = p_extents; } void CPUParticles3D::set_emission_points(const Vector<Vector3> &p_points) { - emission_points = p_points; } void CPUParticles3D::set_emission_normals(const Vector<Vector3> &p_normals) { - emission_normals = p_normals; } void CPUParticles3D::set_emission_colors(const Vector<Color> &p_colors) { - emission_colors = p_colors; } float CPUParticles3D::get_emission_sphere_radius() const { - return emission_sphere_radius; } -Vector3 CPUParticles3D::get_emission_box_extents() const { +Vector3 CPUParticles3D::get_emission_box_extents() const { return emission_box_extents; } -Vector<Vector3> CPUParticles3D::get_emission_points() const { +Vector<Vector3> CPUParticles3D::get_emission_points() const { return emission_points; } -Vector<Vector3> CPUParticles3D::get_emission_normals() const { +Vector<Vector3> CPUParticles3D::get_emission_normals() const { return emission_normals; } Vector<Color> CPUParticles3D::get_emission_colors() const { - return emission_colors; } CPUParticles3D::EmissionShape CPUParticles3D::get_emission_shape() const { return emission_shape; } -void CPUParticles3D::set_gravity(const Vector3 &p_gravity) { +void CPUParticles3D::set_gravity(const Vector3 &p_gravity) { gravity = p_gravity; } Vector3 CPUParticles3D::get_gravity() const { - return gravity; } void CPUParticles3D::_validate_property(PropertyInfo &property) const { - if (property.name == "color" && color_ramp.is_valid()) { property.usage = 0; } @@ -498,7 +465,6 @@ void CPUParticles3D::_validate_property(PropertyInfo &property) const { } static uint32_t idhash(uint32_t x) { - x = ((x >> uint32_t(16)) ^ x) * uint32_t(0x45d9f3b); x = ((x >> uint32_t(16)) ^ x) * uint32_t(0x45d9f3b); x = (x >> uint32_t(16)) ^ x; @@ -508,18 +474,19 @@ static uint32_t idhash(uint32_t x) { static float rand_from_seed(uint32_t &seed) { int k; int s = int(seed); - if (s == 0) + if (s == 0) { s = 305420679; + } k = s / 127773; s = 16807 * (s - k * 127773) - 2836 * k; - if (s < 0) + if (s < 0) { s += 2147483647; + } seed = uint32_t(s); return float(seed % uint32_t(65536)) / 65535.0; } void CPUParticles3D::_update_internal() { - if (particles.size() == 0 || !is_visible_in_tree()) { _set_redraw(false); return; @@ -547,12 +514,12 @@ void CPUParticles3D::_update_internal() { bool processed = false; if (time == 0 && pre_process_time > 0.0) { - float frame_time; - if (fixed_fps > 0) + if (fixed_fps > 0) { frame_time = 1.0 / fixed_fps; - else + } else { frame_time = 1.0 / 30.0; + } float todo = pre_process_time; @@ -594,7 +561,6 @@ void CPUParticles3D::_update_internal() { } void CPUParticles3D::_particles_process(float p_delta) { - p_delta *= speed_scale; int pcount = particles.size(); @@ -623,11 +589,11 @@ void CPUParticles3D::_particles_process(float p_delta) { float system_phase = time / lifetime; for (int i = 0; i < pcount; i++) { - Particle &p = parray[i]; - if (!emitting && !p.active) + if (!emitting && !p.active) { continue; + } float local_delta = p_delta; @@ -681,7 +647,6 @@ void CPUParticles3D::_particles_process(float p_delta) { } if (restart) { - if (!emitting) { p.active = false; continue; @@ -750,10 +715,10 @@ void CPUParticles3D::_particles_process(float p_delta) { } break; case EMISSION_SHAPE_POINTS: case EMISSION_SHAPE_DIRECTED_POINTS: { - int pc = emission_points.size(); - if (pc == 0) + if (pc == 0) { break; + } int random_idx = Math::rand() % pc; @@ -805,7 +770,6 @@ void CPUParticles3D::_particles_process(float p_delta) { } else if (p.time > p.lifetime) { p.active = false; } else { - uint32_t alt_seed = p.seed; p.time += local_delta; @@ -875,7 +839,6 @@ void CPUParticles3D::_particles_process(float p_delta) { force += diff.length() > 0.0 ? diff.normalized() * (parameters[PARAM_RADIAL_ACCEL] + tex_radial_accel) * Math::lerp(1.0f, rand_from_seed(alt_seed), randomness[PARAM_RADIAL_ACCEL]) : Vector3(); //apply tangential acceleration; if (flags[FLAG_DISABLE_Z]) { - Vector2 yx = Vector2(diff.y, diff.x); Vector2 yx2 = (yx * Vector2(-1.0, 1.0)).normalized(); force += yx.length() > 0.0 ? Vector3(yx2.x, yx2.y, 0.0) * ((parameters[PARAM_TANGENTIAL_ACCEL] + tex_tangential_accel) * Math::lerp(1.0f, rand_from_seed(alt_seed), randomness[PARAM_TANGENTIAL_ACCEL])) : Vector3(); @@ -903,7 +866,6 @@ void CPUParticles3D::_particles_process(float p_delta) { p.velocity = p.velocity.normalized() * tex_linear_velocity; } if (parameters[PARAM_DAMPING] + tex_damping > 0.0) { - float v = p.velocity.length(); float damp = (parameters[PARAM_DAMPING] + tex_damping) * Math::lerp(1.0f, rand_from_seed(alt_seed), randomness[PARAM_DAMPING]); v -= damp * local_delta; @@ -960,7 +922,6 @@ void CPUParticles3D::_particles_process(float p_delta) { p.color *= p.base_color; if (flags[FLAG_DISABLE_Z]) { - if (flags[FLAG_ALIGN_Y_TO_VELOCITY]) { if (p.velocity.length() > 0.0) { p.transform.basis.set_axis(1, p.velocity.normalized()); @@ -1004,8 +965,9 @@ void CPUParticles3D::_particles_process(float p_delta) { //scale by scale float base_scale = tex_scale * Math::lerp(parameters[PARAM_SCALE], 1.0f, p.scale_rand * randomness[PARAM_SCALE]); - if (base_scale < 0.000001) + if (base_scale < 0.000001) { base_scale = 0.000001; + } p.transform.basis.scale(Vector3(1, 1, 1) * base_scale); @@ -1047,7 +1009,6 @@ void CPUParticles3D::_update_particle_data_buffer() { Vector3 dir = c->get_global_transform().basis.get_axis(2); //far away to close if (local_coords) { - // will look different from Particles in editor as this is based on the camera in the scenetree // and not the editor camera dir = inv_emission_transform.xform(dir).normalized(); @@ -1064,7 +1025,6 @@ void CPUParticles3D::_update_particle_data_buffer() { } for (int i = 0; i < pc; i++) { - int idx = order ? order[i] : i; Transform t = r[idx].transform; @@ -1109,8 +1069,9 @@ void CPUParticles3D::_update_particle_data_buffer() { } void CPUParticles3D::_set_redraw(bool p_redraw) { - if (redraw == p_redraw) + if (redraw == p_redraw) { return; + } redraw = p_redraw; { @@ -1131,7 +1092,6 @@ void CPUParticles3D::_set_redraw(bool p_redraw) { } void CPUParticles3D::_update_render_thread() { - MutexLock lock(update_mutex); if (can_update) { @@ -1141,13 +1101,13 @@ void CPUParticles3D::_update_render_thread() { } void CPUParticles3D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { set_process_internal(emitting); // first update before rendering to avoid one frame delay after emitting starts - if (emitting && (time == 0)) + if (emitting && (time == 0)) { _update_internal(); + } } if (p_what == NOTIFICATION_EXIT_TREE) { @@ -1156,8 +1116,9 @@ void CPUParticles3D::_notification(int p_what) { if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { // first update before rendering to avoid one frame delay after emitting starts - if (emitting && (time == 0)) + if (emitting && (time == 0)) { _update_internal(); + } } if (p_what == NOTIFICATION_INTERNAL_PROCESS) { @@ -1165,11 +1126,9 @@ void CPUParticles3D::_notification(int p_what) { } if (p_what == NOTIFICATION_TRANSFORM_CHANGED) { - inv_emission_transform = get_global_transform().affine_inverse(); if (!local_coords) { - int pc = particles.size(); float *w = particle_data.ptrw(); @@ -1177,7 +1136,6 @@ void CPUParticles3D::_notification(int p_what) { float *ptr = w; for (int i = 0; i < pc; i++) { - Transform t = inv_emission_transform * r[i].transform; if (r[i].active) { @@ -1206,7 +1164,6 @@ void CPUParticles3D::_notification(int p_what) { } void CPUParticles3D::convert_from_particles(Node *p_particles) { - GPUParticles3D *particles = Object::cast_to<GPUParticles3D>(p_particles); ERR_FAIL_COND_MSG(!particles, "Only GPUParticles3D nodes can be converted to CPUParticles3D."); @@ -1225,8 +1182,9 @@ void CPUParticles3D::convert_from_particles(Node *p_particles) { set_mesh(particles->get_draw_pass_mesh(0)); Ref<ParticlesMaterial> material = particles->get_process_material(); - if (material.is_null()) + if (material.is_null()) { return; + } set_direction(material->get_direction()); set_spread(material->get_spread()); @@ -1276,7 +1234,6 @@ void CPUParticles3D::convert_from_particles(Node *p_particles) { } void CPUParticles3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_emitting", "emitting"), &CPUParticles3D::set_emitting); ClassDB::bind_method(D_METHOD("set_amount", "amount"), &CPUParticles3D::set_amount); ClassDB::bind_method(D_METHOD("set_lifetime", "secs"), &CPUParticles3D::set_lifetime); @@ -1481,7 +1438,6 @@ void CPUParticles3D::_bind_methods() { } CPUParticles3D::CPUParticles3D() { - time = 0; inactive_time = 0; frame_remainder = 0; diff --git a/scene/3d/cpu_particles_3d.h b/scene/3d/cpu_particles_3d.h index ffe0ecc9a9..2afb6846c0 100644 --- a/scene/3d/cpu_particles_3d.h +++ b/scene/3d/cpu_particles_3d.h @@ -122,7 +122,6 @@ private: const Particle *particles; Vector3 axis; bool operator()(int p_a, int p_b) const { - return axis.dot(particles[p_a].transform.origin) < axis.dot(particles[p_b].transform.origin); } }; diff --git a/scene/3d/decal.cpp b/scene/3d/decal.cpp index 4c824aedc4..fb72e10171 100644 --- a/scene/3d/decal.cpp +++ b/scene/3d/decal.cpp @@ -47,6 +47,7 @@ void Decal::set_texture(DecalTexture p_type, const Ref<Texture2D> &p_texture) { RID texture_rid = p_texture.is_valid() ? p_texture->get_rid() : RID(); RS::get_singleton()->decal_set_texture(decal, RS::DecalTexture(p_type), texture_rid); } + Ref<Texture2D> Decal::get_texture(DecalTexture p_type) const { ERR_FAIL_INDEX_V(p_type, TEXTURE_MAX, Ref<Texture2D>()); return textures[p_type]; @@ -56,6 +57,7 @@ void Decal::set_emission_energy(float p_energy) { emission_energy = p_energy; RS::get_singleton()->decal_set_emission_energy(decal, emission_energy); } + float Decal::get_emission_energy() const { return emission_energy; } @@ -64,6 +66,7 @@ void Decal::set_albedo_mix(float p_mix) { albedo_mix = p_mix; RS::get_singleton()->decal_set_albedo_mix(decal, albedo_mix); } + float Decal::get_albedo_mix() const { return albedo_mix; } @@ -72,6 +75,7 @@ void Decal::set_upper_fade(float p_fade) { upper_fade = p_fade; RS::get_singleton()->decal_set_fade(decal, upper_fade, lower_fade); } + float Decal::get_upper_fade() const { return upper_fade; } @@ -80,6 +84,7 @@ void Decal::set_lower_fade(float p_fade) { lower_fade = p_fade; RS::get_singleton()->decal_set_fade(decal, upper_fade, lower_fade); } + float Decal::get_lower_fade() const { return lower_fade; } @@ -88,6 +93,7 @@ void Decal::set_normal_fade(float p_fade) { normal_fade = p_fade; RS::get_singleton()->decal_set_normal_fade(decal, normal_fade); } + float Decal::get_normal_fade() const { return normal_fade; } @@ -105,6 +111,7 @@ void Decal::set_enable_distance_fade(bool p_enable) { distance_fade_enabled = p_enable; RS::get_singleton()->decal_set_distance_fade(decal, distance_fade_enabled, distance_fade_begin, distance_fade_length); } + bool Decal::is_distance_fade_enabled() const { return distance_fade_enabled; } @@ -113,6 +120,7 @@ void Decal::set_distance_fade_begin(float p_distance) { distance_fade_begin = p_distance; RS::get_singleton()->decal_set_distance_fade(decal, distance_fade_enabled, distance_fade_begin, distance_fade_length); } + float Decal::get_distance_fade_begin() const { return distance_fade_begin; } @@ -121,6 +129,7 @@ void Decal::set_distance_fade_length(float p_length) { distance_fade_length = p_length; RS::get_singleton()->decal_set_distance_fade(decal, distance_fade_enabled, distance_fade_begin, distance_fade_length); } + float Decal::get_distance_fade_length() const { return distance_fade_length; } @@ -129,24 +138,23 @@ void Decal::set_cull_mask(uint32_t p_layers) { cull_mask = p_layers; RS::get_singleton()->decal_set_cull_mask(decal, cull_mask); } + uint32_t Decal::get_cull_mask() const { return cull_mask; } AABB Decal::get_aabb() const { - AABB aabb; aabb.position = -extents; aabb.size = extents * 2.0; return aabb; } -Vector<Face3> Decal::get_faces(uint32_t p_usage_flags) const { +Vector<Face3> Decal::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } void Decal::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_extents", "extents"), &Decal::set_extents); ClassDB::bind_method(D_METHOD("get_extents"), &Decal::get_extents); @@ -212,7 +220,6 @@ void Decal::_bind_methods() { } Decal::Decal() { - extents = Vector3(1, 1, 1); emission_energy = 1.0; modulate = Color(1, 1, 1, 1); @@ -230,6 +237,5 @@ Decal::Decal() { } Decal::~Decal() { - RS::get_singleton()->free(decal); } diff --git a/scene/3d/gi_probe.cpp b/scene/3d/gi_probe.cpp index 65a330ddc0..1b6f9b45b9 100644 --- a/scene/3d/gi_probe.cpp +++ b/scene/3d/gi_probe.cpp @@ -101,15 +101,19 @@ void GIProbeData::allocate(const Transform &p_to_cell_xform, const AABB &p_aabb, AABB GIProbeData::get_bounds() const { return bounds; } + Vector3 GIProbeData::get_octree_size() const { return octree_size; } + Vector<uint8_t> GIProbeData::get_octree_cells() const { return RS::get_singleton()->gi_probe_get_octree_cells(probe); } + Vector<uint8_t> GIProbeData::get_data_cells() const { return RS::get_singleton()->gi_probe_get_data_cells(probe); } + Vector<uint8_t> GIProbeData::get_distance_field() const { return RS::get_singleton()->gi_probe_get_distance_field(probe); } @@ -117,6 +121,7 @@ Vector<uint8_t> GIProbeData::get_distance_field() const { Vector<int> GIProbeData::get_level_counts() const { return RS::get_singleton()->gi_probe_get_level_counts(probe); } + Transform GIProbeData::get_to_cell_xform() const { return to_cell_xform; } @@ -212,7 +217,6 @@ bool GIProbeData::is_using_two_bounces() const { } RID GIProbeData::get_rid() const { - return probe; } @@ -283,7 +287,6 @@ void GIProbeData::_bind_methods() { } GIProbeData::GIProbeData() { - ao = 0.0; ao_size = 0.5; dynamic_range = 4; @@ -299,7 +302,6 @@ GIProbeData::GIProbeData() { } GIProbeData::~GIProbeData() { - RS::get_singleton()->free(probe); } @@ -307,7 +309,6 @@ GIProbeData::~GIProbeData() { ////////////////////// void GIProbe::set_probe_data(const Ref<GIProbeData> &p_data) { - if (p_data.is_valid()) { RS::get_singleton()->instance_set_base(get_instance(), p_data->get_rid()); } else { @@ -318,41 +319,34 @@ void GIProbe::set_probe_data(const Ref<GIProbeData> &p_data) { } Ref<GIProbeData> GIProbe::get_probe_data() const { - return probe_data; } void GIProbe::set_subdiv(Subdiv p_subdiv) { - ERR_FAIL_INDEX(p_subdiv, SUBDIV_MAX); subdiv = p_subdiv; update_gizmo(); } GIProbe::Subdiv GIProbe::get_subdiv() const { - return subdiv; } void GIProbe::set_extents(const Vector3 &p_extents) { - extents = p_extents; update_gizmo(); _change_notify("extents"); } Vector3 GIProbe::get_extents() const { - return extents; } void GIProbe::_find_meshes(Node *p_at_node, List<PlotMesh> &plot_meshes) { - MeshInstance3D *mi = Object::cast_to<MeshInstance3D>(p_at_node); if (mi && mi->get_gi_mode() == GeometryInstance3D::GI_MODE_BAKED && mi->is_visible_in_tree()) { Ref<Mesh> mesh = mi->get_mesh(); if (mesh.is_valid()) { - AABB aabb = mesh->get_aabb(); Transform xf = get_global_transform().affine_inverse() * mi->get_global_transform(); @@ -372,16 +366,14 @@ void GIProbe::_find_meshes(Node *p_at_node, List<PlotMesh> &plot_meshes) { Node3D *s = Object::cast_to<Node3D>(p_at_node); if (s) { - if (s->is_visible_in_tree()) { - Array meshes = p_at_node->call("get_meshes"); for (int i = 0; i < meshes.size(); i += 2) { - Transform mxf = meshes[i]; Ref<Mesh> mesh = meshes[i + 1]; - if (!mesh.is_valid()) + if (!mesh.is_valid()) { continue; + } AABB aabb = mesh->get_aabb(); @@ -416,9 +408,9 @@ Vector3i GIProbe::get_estimated_cell_size() const { axis_cell_size[longest_axis] = 1 << cell_subdiv; for (int i = 0; i < 3; i++) { - - if (i == longest_axis) + if (i == longest_axis) { continue; + } axis_cell_size[i] = axis_cell_size[longest_axis]; float axis_size = bounds.size[longest_axis]; @@ -432,8 +424,8 @@ Vector3i GIProbe::get_estimated_cell_size() const { return Vector3i(axis_cell_size[0], axis_cell_size[1], axis_cell_size[2]); } -void GIProbe::bake(Node *p_from_node, bool p_create_visual_debug) { +void GIProbe::bake(Node *p_from_node, bool p_create_visual_debug) { static const int subdiv_value[SUBDIV_MAX] = { 6, 7, 8, 9 }; Voxelizer baker; @@ -451,7 +443,6 @@ void GIProbe::bake(Node *p_from_node, bool p_create_visual_debug) { int pmc = 0; for (List<PlotMesh>::Element *E = mesh_list.front(); E; E = E->next()) { - if (bake_step_function) { bake_step_function(pmc, RTR("Plotting Meshes") + " " + itos(pmc) + "/" + itos(mesh_list.size())); } @@ -483,11 +474,11 @@ void GIProbe::bake(Node *p_from_node, bool p_create_visual_debug) { #endif } else { - Ref<GIProbeData> probe_data = get_probe_data(); - if (probe_data.is_null()) + if (probe_data.is_null()) { probe_data.instance(); + } if (bake_step_function) { bake_step_function(pmc++, RTR("Generating Distance Field")); @@ -511,22 +502,18 @@ void GIProbe::bake(Node *p_from_node, bool p_create_visual_debug) { } void GIProbe::_debug_bake() { - bake(nullptr, true); } AABB GIProbe::get_aabb() const { - return AABB(-extents, extents * 2); } Vector<Face3> GIProbe::get_faces(uint32_t p_usage_flags) const { - return Vector<Face3>(); } String GIProbe::get_configuration_warning() const { - if (RenderingServer::get_singleton()->is_low_end()) { return TTR("GIProbes are not supported by the GLES2 video driver.\nUse a BakedLightmap instead."); } @@ -534,7 +521,6 @@ String GIProbe::get_configuration_warning() const { } void GIProbe::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_probe_data", "data"), &GIProbe::set_probe_data); ClassDB::bind_method(D_METHOD("get_probe_data"), &GIProbe::get_probe_data); @@ -560,7 +546,6 @@ void GIProbe::_bind_methods() { } GIProbe::GIProbe() { - subdiv = SUBDIV_128; extents = Vector3(10, 10, 10); diff --git a/scene/3d/gi_probe.h b/scene/3d/gi_probe.h index 28b533e82d..b7abfbd01b 100644 --- a/scene/3d/gi_probe.h +++ b/scene/3d/gi_probe.h @@ -35,7 +35,6 @@ #include "scene/3d/visual_instance_3d.h" class GIProbeData : public Resource { - GDCLASS(GIProbeData, Resource); RID probe; diff --git a/scene/3d/gpu_particles_3d.cpp b/scene/3d/gpu_particles_3d.cpp index 01886a730f..c4480e3ed2 100644 --- a/scene/3d/gpu_particles_3d.cpp +++ b/scene/3d/gpu_particles_3d.cpp @@ -36,16 +36,14 @@ #include "servers/rendering_server.h" AABB GPUParticles3D::get_aabb() const { - return AABB(); } -Vector<Face3> GPUParticles3D::get_faces(uint32_t p_usage_flags) const { +Vector<Face3> GPUParticles3D::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } void GPUParticles3D::set_emitting(bool p_emitting) { - RS::get_singleton()->particles_set_emitting(particles, p_emitting); if (p_emitting && one_shot) { @@ -56,157 +54,149 @@ void GPUParticles3D::set_emitting(bool p_emitting) { } void GPUParticles3D::set_amount(int p_amount) { - ERR_FAIL_COND_MSG(p_amount < 1, "Amount of particles cannot be smaller than 1."); amount = p_amount; RS::get_singleton()->particles_set_amount(particles, amount); } -void GPUParticles3D::set_lifetime(float p_lifetime) { +void GPUParticles3D::set_lifetime(float p_lifetime) { ERR_FAIL_COND_MSG(p_lifetime <= 0, "Particles lifetime must be greater than 0."); lifetime = p_lifetime; RS::get_singleton()->particles_set_lifetime(particles, lifetime); } void GPUParticles3D::set_one_shot(bool p_one_shot) { - one_shot = p_one_shot; RS::get_singleton()->particles_set_one_shot(particles, one_shot); if (is_emitting()) { - set_process_internal(true); - if (!one_shot) + if (!one_shot) { RenderingServer::get_singleton()->particles_restart(particles); + } } - if (!one_shot) + if (!one_shot) { set_process_internal(false); + } } void GPUParticles3D::set_pre_process_time(float p_time) { - pre_process_time = p_time; RS::get_singleton()->particles_set_pre_process_time(particles, pre_process_time); } -void GPUParticles3D::set_explosiveness_ratio(float p_ratio) { +void GPUParticles3D::set_explosiveness_ratio(float p_ratio) { explosiveness_ratio = p_ratio; RS::get_singleton()->particles_set_explosiveness_ratio(particles, explosiveness_ratio); } -void GPUParticles3D::set_randomness_ratio(float p_ratio) { +void GPUParticles3D::set_randomness_ratio(float p_ratio) { randomness_ratio = p_ratio; RS::get_singleton()->particles_set_randomness_ratio(particles, randomness_ratio); } -void GPUParticles3D::set_visibility_aabb(const AABB &p_aabb) { +void GPUParticles3D::set_visibility_aabb(const AABB &p_aabb) { visibility_aabb = p_aabb; RS::get_singleton()->particles_set_custom_aabb(particles, visibility_aabb); update_gizmo(); _change_notify("visibility_aabb"); } -void GPUParticles3D::set_use_local_coordinates(bool p_enable) { +void GPUParticles3D::set_use_local_coordinates(bool p_enable) { local_coords = p_enable; RS::get_singleton()->particles_set_use_local_coordinates(particles, local_coords); } -void GPUParticles3D::set_process_material(const Ref<Material> &p_material) { +void GPUParticles3D::set_process_material(const Ref<Material> &p_material) { process_material = p_material; RID material_rid; - if (process_material.is_valid()) + if (process_material.is_valid()) { material_rid = process_material->get_rid(); + } RS::get_singleton()->particles_set_process_material(particles, material_rid); update_configuration_warning(); } void GPUParticles3D::set_speed_scale(float p_scale) { - speed_scale = p_scale; RS::get_singleton()->particles_set_speed_scale(particles, p_scale); } bool GPUParticles3D::is_emitting() const { - return RS::get_singleton()->particles_get_emitting(particles); } -int GPUParticles3D::get_amount() const { +int GPUParticles3D::get_amount() const { return amount; } -float GPUParticles3D::get_lifetime() const { +float GPUParticles3D::get_lifetime() const { return lifetime; } -bool GPUParticles3D::get_one_shot() const { +bool GPUParticles3D::get_one_shot() const { return one_shot; } float GPUParticles3D::get_pre_process_time() const { - return pre_process_time; } -float GPUParticles3D::get_explosiveness_ratio() const { +float GPUParticles3D::get_explosiveness_ratio() const { return explosiveness_ratio; } -float GPUParticles3D::get_randomness_ratio() const { +float GPUParticles3D::get_randomness_ratio() const { return randomness_ratio; } -AABB GPUParticles3D::get_visibility_aabb() const { +AABB GPUParticles3D::get_visibility_aabb() const { return visibility_aabb; } -bool GPUParticles3D::get_use_local_coordinates() const { +bool GPUParticles3D::get_use_local_coordinates() const { return local_coords; } -Ref<Material> GPUParticles3D::get_process_material() const { +Ref<Material> GPUParticles3D::get_process_material() const { return process_material; } float GPUParticles3D::get_speed_scale() const { - return speed_scale; } void GPUParticles3D::set_draw_order(DrawOrder p_order) { - draw_order = p_order; RS::get_singleton()->particles_set_draw_order(particles, RS::ParticlesDrawOrder(p_order)); } GPUParticles3D::DrawOrder GPUParticles3D::get_draw_order() const { - return draw_order; } void GPUParticles3D::set_draw_passes(int p_count) { - ERR_FAIL_COND(p_count < 1); draw_passes.resize(p_count); RS::get_singleton()->particles_set_draw_passes(particles, p_count); _change_notify(); } -int GPUParticles3D::get_draw_passes() const { +int GPUParticles3D::get_draw_passes() const { return draw_passes.size(); } void GPUParticles3D::set_draw_pass_mesh(int p_pass, const Ref<Mesh> &p_mesh) { - ERR_FAIL_INDEX(p_pass, draw_passes.size()); draw_passes.write[p_pass] = p_mesh; RID mesh_rid; - if (p_mesh.is_valid()) + if (p_mesh.is_valid()) { mesh_rid = p_mesh->get_rid(); + } RS::get_singleton()->particles_set_draw_pass_mesh(particles, p_pass, mesh_rid); @@ -214,7 +204,6 @@ void GPUParticles3D::set_draw_pass_mesh(int p_pass, const Ref<Mesh> &p_mesh) { } Ref<Mesh> GPUParticles3D::get_draw_pass_mesh(int p_pass) const { - ERR_FAIL_INDEX_V(p_pass, draw_passes.size(), Ref<Mesh>()); return draw_passes[p_pass]; @@ -239,7 +228,6 @@ bool GPUParticles3D::get_fractional_delta() const { } String GPUParticles3D::get_configuration_warning() const { - if (RenderingServer::get_singleton()->is_low_end()) { return TTR("GPU-based particles are not supported by the GLES2 video driver.\nUse the CPUParticles3D node instead. You can use the \"Convert to CPUParticles3D\" option for this purpose."); } @@ -257,8 +245,9 @@ String GPUParticles3D::get_configuration_warning() const { StandardMaterial3D *spat = Object::cast_to<StandardMaterial3D>(draw_passes[i]->surface_get_material(j).ptr()); anim_material_found = anim_material_found || (spat && spat->get_billboard_mode() == StandardMaterial3D::BILLBOARD_PARTICLES); } - if (anim_material_found) + if (anim_material_found) { break; + } } } @@ -267,22 +256,25 @@ String GPUParticles3D::get_configuration_warning() const { anim_material_found = anim_material_found || (spat && spat->get_billboard_mode() == StandardMaterial3D::BILLBOARD_PARTICLES); if (!meshes_found) { - if (warnings != String()) + if (warnings != String()) { warnings += "\n"; + } warnings += "- " + TTR("Nothing is visible because meshes have not been assigned to draw passes."); } if (process_material.is_null()) { - if (warnings != String()) + if (warnings != String()) { warnings += "\n"; + } warnings += "- " + TTR("A material to process the particles is not assigned, so no behavior is imprinted."); } else { const ParticlesMaterial *process = Object::cast_to<ParticlesMaterial>(process_material.ptr()); if (!anim_material_found && process && (process->get_param(ParticlesMaterial::PARAM_ANIM_SPEED) != 0.0 || process->get_param(ParticlesMaterial::PARAM_ANIM_OFFSET) != 0.0 || process->get_param_texture(ParticlesMaterial::PARAM_ANIM_SPEED).is_valid() || process->get_param_texture(ParticlesMaterial::PARAM_ANIM_OFFSET).is_valid())) { - if (warnings != String()) + if (warnings != String()) { warnings += "\n"; + } warnings += "- " + TTR("Particles animation requires the usage of a StandardMaterial3D whose Billboard Mode is set to \"Particle Billboard\"."); } } @@ -291,18 +283,15 @@ String GPUParticles3D::get_configuration_warning() const { } void GPUParticles3D::restart() { - RenderingServer::get_singleton()->particles_restart(particles); RenderingServer::get_singleton()->particles_set_emitting(particles, true); } AABB GPUParticles3D::capture_aabb() const { - return RS::get_singleton()->particles_get_current_aabb(particles); } void GPUParticles3D::_validate_property(PropertyInfo &property) const { - if (property.name.begins_with("draw_pass_")) { int index = property.name.get_slicec('_', 2).to_int() - 1; if (index >= draw_passes.size()) { @@ -313,12 +302,10 @@ void GPUParticles3D::_validate_property(PropertyInfo &property) const { } void GPUParticles3D::_notification(int p_what) { - if (p_what == NOTIFICATION_PAUSED || p_what == NOTIFICATION_UNPAUSED) { if (can_process()) { RS::get_singleton()->particles_set_speed_scale(particles, speed_scale); } else { - RS::get_singleton()->particles_set_speed_scale(particles, 0); } } @@ -326,7 +313,6 @@ void GPUParticles3D::_notification(int p_what) { // Use internal process when emitting and one_shot are on so that when // the shot ends the editor can properly update if (p_what == NOTIFICATION_INTERNAL_PROCESS) { - if (one_shot && !is_emitting()) { _change_notify(); set_process_internal(false); @@ -342,7 +328,6 @@ void GPUParticles3D::_notification(int p_what) { } void GPUParticles3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_emitting", "emitting"), &GPUParticles3D::set_emitting); ClassDB::bind_method(D_METHOD("set_amount", "amount"), &GPUParticles3D::set_amount); ClassDB::bind_method(D_METHOD("set_lifetime", "secs"), &GPUParticles3D::set_lifetime); @@ -404,7 +389,6 @@ void GPUParticles3D::_bind_methods() { ADD_GROUP("Draw Passes", "draw_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "draw_passes", PROPERTY_HINT_RANGE, "0," + itos(MAX_DRAW_PASSES) + ",1"), "set_draw_passes", "get_draw_passes"); for (int i = 0; i < MAX_DRAW_PASSES; i++) { - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "draw_pass_" + itos(i + 1), PROPERTY_HINT_RESOURCE_TYPE, "Mesh"), "set_draw_pass_mesh", "get_draw_pass_mesh", i); } @@ -416,7 +400,6 @@ void GPUParticles3D::_bind_methods() { } GPUParticles3D::GPUParticles3D() { - particles = RS::get_singleton()->particles_create(); set_base(particles); one_shot = false; // Needed so that set_emitting doesn't access uninitialized values @@ -437,6 +420,5 @@ GPUParticles3D::GPUParticles3D() { } GPUParticles3D::~GPUParticles3D() { - RS::get_singleton()->free(particles); } diff --git a/scene/3d/immediate_geometry_3d.cpp b/scene/3d/immediate_geometry_3d.cpp index 63d4b1ac84..7ccfd527a1 100644 --- a/scene/3d/immediate_geometry_3d.cpp +++ b/scene/3d/immediate_geometry_3d.cpp @@ -31,39 +31,33 @@ #include "immediate_geometry_3d.h" void ImmediateGeometry3D::begin(Mesh::PrimitiveType p_primitive, const Ref<Texture2D> &p_texture) { - RS::get_singleton()->immediate_begin(im, (RS::PrimitiveType)p_primitive, p_texture.is_valid() ? p_texture->get_rid() : RID()); - if (p_texture.is_valid()) + if (p_texture.is_valid()) { cached_textures.push_back(p_texture); + } } void ImmediateGeometry3D::set_normal(const Vector3 &p_normal) { - RS::get_singleton()->immediate_normal(im, p_normal); } void ImmediateGeometry3D::set_tangent(const Plane &p_tangent) { - RS::get_singleton()->immediate_tangent(im, p_tangent); } void ImmediateGeometry3D::set_color(const Color &p_color) { - RS::get_singleton()->immediate_color(im, p_color); } void ImmediateGeometry3D::set_uv(const Vector2 &p_uv) { - RS::get_singleton()->immediate_uv(im, p_uv); } void ImmediateGeometry3D::set_uv2(const Vector2 &p_uv2) { - RS::get_singleton()->immediate_uv2(im, p_uv2); } void ImmediateGeometry3D::add_vertex(const Vector3 &p_vertex) { - RS::get_singleton()->immediate_vertex(im, p_vertex); if (empty) { aabb.position = p_vertex; @@ -75,28 +69,24 @@ void ImmediateGeometry3D::add_vertex(const Vector3 &p_vertex) { } void ImmediateGeometry3D::end() { - RS::get_singleton()->immediate_end(im); } void ImmediateGeometry3D::clear() { - RS::get_singleton()->immediate_clear(im); empty = true; cached_textures.clear(); } AABB ImmediateGeometry3D::get_aabb() const { - return aabb; } -Vector<Face3> ImmediateGeometry3D::get_faces(uint32_t p_usage_flags) const { +Vector<Face3> ImmediateGeometry3D::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } void ImmediateGeometry3D::add_sphere(int p_lats, int p_lons, float p_radius, bool p_add_uv) { - for (int i = 1; i <= p_lats; i++) { double lat0 = Math_PI * (-0.5 + (double)(i - 1) / p_lats); double z0 = Math::sin(lat0); @@ -107,7 +97,6 @@ void ImmediateGeometry3D::add_sphere(int p_lats, int p_lons, float p_radius, boo double zr1 = Math::cos(lat1); for (int j = p_lons; j >= 1; j--) { - double lng0 = 2 * Math_PI * (double)(j - 1) / p_lons; double x0 = Math::cos(lng0); double y0 = Math::sin(lng0); @@ -143,7 +132,6 @@ void ImmediateGeometry3D::add_sphere(int p_lats, int p_lons, float p_radius, boo } void ImmediateGeometry3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("begin", "primitive", "texture"), &ImmediateGeometry3D::begin, DEFVAL(Ref<Texture2D>())); ClassDB::bind_method(D_METHOD("set_normal", "normal"), &ImmediateGeometry3D::set_normal); ClassDB::bind_method(D_METHOD("set_tangent", "tangent"), &ImmediateGeometry3D::set_tangent); @@ -157,13 +145,11 @@ void ImmediateGeometry3D::_bind_methods() { } ImmediateGeometry3D::ImmediateGeometry3D() { - im = RenderingServer::get_singleton()->immediate_create(); set_base(im); empty = true; } ImmediateGeometry3D::~ImmediateGeometry3D() { - RenderingServer::get_singleton()->free(im); } diff --git a/scene/3d/immediate_geometry_3d.h b/scene/3d/immediate_geometry_3d.h index 6e15450a5b..7c9e8851a2 100644 --- a/scene/3d/immediate_geometry_3d.h +++ b/scene/3d/immediate_geometry_3d.h @@ -35,7 +35,6 @@ #include "scene/resources/mesh.h" class ImmediateGeometry3D : public GeometryInstance3D { - GDCLASS(ImmediateGeometry3D, GeometryInstance3D); RID im; diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index 0aa0f7e5ac..814e911372 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -35,12 +35,10 @@ #include "scene/resources/surface_tool.h" bool Light3D::_can_gizmo_scale() const { - return false; } void Light3D::set_param(Param p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); param[p_param] = p_value; @@ -60,13 +58,11 @@ void Light3D::set_param(Param p_param, float p_value) { } float Light3D::get_param(Param p_param) const { - ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return param[p_param]; } void Light3D::set_shadow(bool p_enable) { - shadow = p_enable; RS::get_singleton()->light_set_shadow(light, p_enable); @@ -74,51 +70,46 @@ void Light3D::set_shadow(bool p_enable) { update_configuration_warning(); } } -bool Light3D::has_shadow() const { +bool Light3D::has_shadow() const { return shadow; } void Light3D::set_negative(bool p_enable) { - negative = p_enable; RS::get_singleton()->light_set_negative(light, p_enable); } -bool Light3D::is_negative() const { +bool Light3D::is_negative() const { return negative; } void Light3D::set_cull_mask(uint32_t p_cull_mask) { - cull_mask = p_cull_mask; RS::get_singleton()->light_set_cull_mask(light, p_cull_mask); } -uint32_t Light3D::get_cull_mask() const { +uint32_t Light3D::get_cull_mask() const { return cull_mask; } void Light3D::set_color(const Color &p_color) { - color = p_color; RS::get_singleton()->light_set_color(light, p_color); // The gizmo color depends on the light color, so update it. update_gizmo(); } -Color Light3D::get_color() const { +Color Light3D::get_color() const { return color; } void Light3D::set_shadow_color(const Color &p_shadow_color) { - shadow_color = p_shadow_color; RS::get_singleton()->light_set_shadow_color(light, p_shadow_color); } Color Light3D::get_shadow_color() const { - return shadow_color; } @@ -128,22 +119,17 @@ void Light3D::set_shadow_reverse_cull_face(bool p_enable) { } bool Light3D::get_shadow_reverse_cull_face() const { - return reverse_cull; } AABB Light3D::get_aabb() const { - if (type == RenderingServer::LIGHT_DIRECTIONAL) { - return AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); } else if (type == RenderingServer::LIGHT_OMNI) { - return AABB(Vector3(-1, -1, -1) * param[PARAM_RANGE], Vector3(2, 2, 2) * param[PARAM_RANGE]); } else if (type == RenderingServer::LIGHT_SPOT) { - float len = param[PARAM_RANGE]; float size = Math::tan(Math::deg2rad(param[PARAM_SPOT_ANGLE])) * len; return AABB(Vector3(-size, -size, -len), Vector3(size * 2, size * 2, len)); @@ -153,7 +139,6 @@ AABB Light3D::get_aabb() const { } Vector<Face3> Light3D::get_faces(uint32_t p_usage_flags) const { - return Vector<Face3>(); } @@ -167,7 +152,6 @@ Light3D::BakeMode Light3D::get_bake_mode() const { } void Light3D::set_projector(const Ref<Texture2D> &p_texture) { - projector = p_texture; RID tex_id = projector.is_valid() ? projector->get_rid() : RID(); RS::get_singleton()->light_set_projector(light, tex_id); @@ -179,9 +163,9 @@ Ref<Texture2D> Light3D::get_projector() const { } void Light3D::_update_visibility() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } bool editor_ok = true; @@ -205,9 +189,7 @@ void Light3D::_update_visibility() { } void Light3D::_notification(int p_what) { - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - _update_visibility(); } @@ -217,18 +199,15 @@ void Light3D::_notification(int p_what) { } void Light3D::set_editor_only(bool p_editor_only) { - editor_only = p_editor_only; _update_visibility(); } bool Light3D::is_editor_only() const { - return editor_only; } void Light3D::_validate_property(PropertyInfo &property) const { - if (get_light_type() == RS::LIGHT_DIRECTIONAL && property.name == "light_size") { property.usage = 0; } @@ -243,7 +222,6 @@ void Light3D::_validate_property(PropertyInfo &property) const { } void Light3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_editor_only", "editor_only"), &Light3D::set_editor_only); ClassDB::bind_method(D_METHOD("is_editor_only"), &Light3D::is_editor_only); @@ -323,7 +301,6 @@ void Light3D::_bind_methods() { } Light3D::Light3D(RenderingServer::LightType p_type) { - type = p_type; switch (p_type) { case RS::LIGHT_DIRECTIONAL: @@ -373,28 +350,26 @@ Light3D::Light3D(RenderingServer::LightType p_type) { } Light3D::Light3D() { - type = RenderingServer::LIGHT_DIRECTIONAL; ERR_PRINT("Light3D should not be instanced directly; use the DirectionalLight3D, OmniLight3D or SpotLight3D subtypes instead."); } Light3D::~Light3D() { - RS::get_singleton()->instance_set_base(get_instance(), RID()); - if (light.is_valid()) + if (light.is_valid()) { RenderingServer::get_singleton()->free(light); + } } + ///////////////////////////////////////// void DirectionalLight3D::set_shadow_mode(ShadowMode p_mode) { - shadow_mode = p_mode; RS::get_singleton()->light_directional_set_shadow_mode(light, RS::LightDirectionalShadowMode(p_mode)); } DirectionalLight3D::ShadowMode DirectionalLight3D::get_shadow_mode() const { - return shadow_mode; } @@ -404,23 +379,19 @@ void DirectionalLight3D::set_shadow_depth_range(ShadowDepthRange p_range) { } DirectionalLight3D::ShadowDepthRange DirectionalLight3D::get_shadow_depth_range() const { - return shadow_depth_range; } void DirectionalLight3D::set_blend_splits(bool p_enable) { - blend_splits = p_enable; RS::get_singleton()->light_directional_set_blend_splits(light, p_enable); } bool DirectionalLight3D::is_blend_splits_enabled() const { - return blend_splits; } void DirectionalLight3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_shadow_mode", "mode"), &DirectionalLight3D::set_shadow_mode); ClassDB::bind_method(D_METHOD("get_shadow_mode"), &DirectionalLight3D::get_shadow_mode); @@ -451,7 +422,6 @@ void DirectionalLight3D::_bind_methods() { DirectionalLight3D::DirectionalLight3D() : Light3D(RenderingServer::LIGHT_DIRECTIONAL) { - set_param(PARAM_SHADOW_MAX_DISTANCE, 100); set_param(PARAM_SHADOW_FADE_START, 0.8); set_shadow_mode(SHADOW_PARALLEL_4_SPLITS); @@ -461,13 +431,11 @@ DirectionalLight3D::DirectionalLight3D() : } void OmniLight3D::set_shadow_mode(ShadowMode p_mode) { - shadow_mode = p_mode; RS::get_singleton()->light_omni_set_shadow_mode(light, RS::LightOmniShadowMode(p_mode)); } OmniLight3D::ShadowMode OmniLight3D::get_shadow_mode() const { - return shadow_mode; } @@ -485,7 +453,6 @@ String OmniLight3D::get_configuration_warning() const { } void OmniLight3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_shadow_mode", "mode"), &OmniLight3D::set_shadow_mode); ClassDB::bind_method(D_METHOD("get_shadow_mode"), &OmniLight3D::get_shadow_mode); @@ -500,7 +467,6 @@ void OmniLight3D::_bind_methods() { OmniLight3D::OmniLight3D() : Light3D(RenderingServer::LIGHT_OMNI) { - set_shadow_mode(SHADOW_CUBE); } @@ -526,7 +492,6 @@ String SpotLight3D::get_configuration_warning() const { } void SpotLight3D::_bind_methods() { - ADD_GROUP("Spot", "spot_"); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "spot_range", PROPERTY_HINT_EXP_RANGE, "0,4096,0.1,or_greater"), "set_param", "get_param", PARAM_RANGE); ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "spot_attenuation", PROPERTY_HINT_EXP_EASING, "attenuation"), "set_param", "get_param", PARAM_ATTENUATION); diff --git a/scene/3d/light_3d.h b/scene/3d/light_3d.h index 6e78217342..f16773f6ae 100644 --- a/scene/3d/light_3d.h +++ b/scene/3d/light_3d.h @@ -36,7 +36,6 @@ #include "servers/rendering_server.h" class Light3D : public VisualInstance3D { - GDCLASS(Light3D, VisualInstance3D); OBJ_CATEGORY("3D Light Nodes"); @@ -140,7 +139,6 @@ VARIANT_ENUM_CAST(Light3D::Param); VARIANT_ENUM_CAST(Light3D::BakeMode); class DirectionalLight3D : public Light3D { - GDCLASS(DirectionalLight3D, Light3D); public: @@ -180,7 +178,6 @@ VARIANT_ENUM_CAST(DirectionalLight3D::ShadowMode) VARIANT_ENUM_CAST(DirectionalLight3D::ShadowDepthRange) class OmniLight3D : public Light3D { - GDCLASS(OmniLight3D, Light3D); public: @@ -208,7 +205,6 @@ public: VARIANT_ENUM_CAST(OmniLight3D::ShadowMode) class SpotLight3D : public Light3D { - GDCLASS(SpotLight3D, Light3D); protected: diff --git a/scene/3d/lightmap_probe.cpp b/scene/3d/lightmap_probe.cpp index 2da81337f0..ee21934b80 100644 --- a/scene/3d/lightmap_probe.cpp +++ b/scene/3d/lightmap_probe.cpp @@ -1,3 +1,33 @@ +/*************************************************************************/ +/* lightmap_probe.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + #include "lightmap_probe.h" LightmapProbe::LightmapProbe() { diff --git a/scene/3d/lightmap_probe.h b/scene/3d/lightmap_probe.h index 65bc6914f4..c4bd33556f 100644 --- a/scene/3d/lightmap_probe.h +++ b/scene/3d/lightmap_probe.h @@ -1,3 +1,33 @@ +/*************************************************************************/ +/* lightmap_probe.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + #ifndef LIGHTMAP_PROBE_H #define LIGHTMAP_PROBE_H diff --git a/scene/3d/lightmapper.cpp b/scene/3d/lightmapper.cpp index 53ebd5ee2e..26faf5154c 100644 --- a/scene/3d/lightmapper.cpp +++ b/scene/3d/lightmapper.cpp @@ -1,3 +1,33 @@ +/*************************************************************************/ +/* lightmapper.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + #include "lightmapper.h" LightmapDenoiser *(*LightmapDenoiser::create_function)() = nullptr; diff --git a/scene/3d/lightmapper.h b/scene/3d/lightmapper.h index 7c052a30a0..ccf9bde279 100644 --- a/scene/3d/lightmapper.h +++ b/scene/3d/lightmapper.h @@ -1,3 +1,33 @@ +/*************************************************************************/ +/* lightmapper.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + #ifndef LIGHTMAPPER_H #define LIGHTMAPPER_H diff --git a/scene/3d/listener_3d.cpp b/scene/3d/listener_3d.cpp index 426e34ea80..0a5b9ad09f 100644 --- a/scene/3d/listener_3d.cpp +++ b/scene/3d/listener_3d.cpp @@ -36,63 +36,59 @@ void Listener3D::_update_audio_listener_state() { } void Listener3D::_request_listener_update() { - _update_listener(); } bool Listener3D::_set(const StringName &p_name, const Variant &p_value) { - if (p_name == "current") { if (p_value.operator bool()) { make_current(); } else { clear_current(); } - } else + } else { return false; + } return true; } -bool Listener3D::_get(const StringName &p_name, Variant &r_ret) const { +bool Listener3D::_get(const StringName &p_name, Variant &r_ret) const { if (p_name == "current") { if (is_inside_tree() && get_tree()->is_node_being_edited(this)) { r_ret = current; } else { r_ret = is_current(); } - } else + } else { return false; + } return true; } void Listener3D::_get_property_list(List<PropertyInfo> *p_list) const { - p_list->push_back(PropertyInfo(Variant::BOOL, "current")); } void Listener3D::_update_listener() { - if (is_inside_tree() && is_current()) { get_viewport()->_listener_transform_changed_notify(); } } void Listener3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_WORLD: { bool first_listener = get_viewport()->_listener_add(this); - if (!get_tree()->is_node_being_edited(this) && (current || first_listener)) + if (!get_tree()->is_node_being_edited(this) && (current || first_listener)) { make_current(); + } } break; case NOTIFICATION_TRANSFORM_CHANGED: { _request_listener_update(); } break; case NOTIFICATION_EXIT_WORLD: { - if (!get_tree()->is_node_being_edited(this)) { if (is_current()) { clear_current(); @@ -110,25 +106,24 @@ void Listener3D::_notification(int p_what) { } Transform Listener3D::get_listener_transform() const { - return get_global_transform().orthonormalized(); } void Listener3D::make_current() { - current = true; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } get_viewport()->_listener_set(this); } void Listener3D::clear_current() { - current = false; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (get_viewport()->get_listener() == this) { get_viewport()->_listener_set(nullptr); @@ -137,18 +132,16 @@ void Listener3D::clear_current() { } bool Listener3D::is_current() const { - if (is_inside_tree() && !get_tree()->is_node_being_edited(this)) { - return get_viewport()->get_listener() == this; - } else + } else { return current; + } return false; } bool Listener3D::_can_gizmo_scale() const { - return false; } @@ -159,7 +152,6 @@ RES Listener3D::_get_gizmo_geometry() const { } void Listener3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("make_current"), &Listener3D::make_current); ClassDB::bind_method(D_METHOD("clear_current"), &Listener3D::clear_current); ClassDB::bind_method(D_METHOD("is_current"), &Listener3D::is_current); @@ -167,7 +159,6 @@ void Listener3D::_bind_methods() { } Listener3D::Listener3D() { - current = false; force_change = false; set_notify_transform(true); diff --git a/scene/3d/listener_3d.h b/scene/3d/listener_3d.h index 3383d6725e..4b6923d6e8 100644 --- a/scene/3d/listener_3d.h +++ b/scene/3d/listener_3d.h @@ -35,7 +35,6 @@ #include "scene/main/window.h" class Listener3D : public Node3D { - GDCLASS(Listener3D, Node3D); private: diff --git a/scene/3d/mesh_instance_3d.cpp b/scene/3d/mesh_instance_3d.cpp index cdc8db8aea..13f40aed4f 100644 --- a/scene/3d/mesh_instance_3d.cpp +++ b/scene/3d/mesh_instance_3d.cpp @@ -37,12 +37,12 @@ #include "skeleton_3d.h" bool MeshInstance3D::_set(const StringName &p_name, const Variant &p_value) { - //this is not _too_ bad performance wise, really. it only arrives here if the property was not set anywhere else. //add to it that it's probably found on first call to _set anyway. - if (!get_instance().is_valid()) + if (!get_instance().is_valid()) { return false; + } Map<StringName, BlendShapeTrack>::Element *E = blend_shape_tracks.find(p_name); if (E) { @@ -53,8 +53,9 @@ bool MeshInstance3D::_set(const StringName &p_name, const Variant &p_value) { if (p_name.operator String().begins_with("material/")) { int idx = p_name.operator String().get_slicec('/', 1).to_int(); - if (idx >= materials.size() || idx < 0) + if (idx >= materials.size() || idx < 0) { return false; + } set_surface_material(idx, p_value); return true; @@ -64,9 +65,9 @@ bool MeshInstance3D::_set(const StringName &p_name, const Variant &p_value) { } bool MeshInstance3D::_get(const StringName &p_name, Variant &r_ret) const { - - if (!get_instance().is_valid()) + if (!get_instance().is_valid()) { return false; + } const Map<StringName, BlendShapeTrack>::Element *E = blend_shape_tracks.find(p_name); if (E) { @@ -76,8 +77,9 @@ bool MeshInstance3D::_get(const StringName &p_name, Variant &r_ret) const { if (p_name.operator String().begins_with("material/")) { int idx = p_name.operator String().get_slicec('/', 1).to_int(); - if (idx >= materials.size() || idx < 0) + if (idx >= materials.size() || idx < 0) { return false; + } r_ret = materials[idx]; return true; } @@ -85,10 +87,8 @@ bool MeshInstance3D::_get(const StringName &p_name, Variant &r_ret) const { } void MeshInstance3D::_get_property_list(List<PropertyInfo> *p_list) const { - List<String> ls; for (const Map<StringName, BlendShapeTrack>::Element *E = blend_shape_tracks.front(); E; E = E->next()) { - ls.push_back(E->key()); } @@ -106,9 +106,9 @@ void MeshInstance3D::_get_property_list(List<PropertyInfo> *p_list) const { } void MeshInstance3D::set_mesh(const Ref<Mesh> &p_mesh) { - - if (mesh == p_mesh) + if (mesh == p_mesh) { return; + } if (mesh.is_valid()) { mesh->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &MeshInstance3D::_mesh_changed)); @@ -119,9 +119,7 @@ void MeshInstance3D::set_mesh(const Ref<Mesh> &p_mesh) { blend_shape_tracks.clear(); if (mesh.is_valid()) { - for (int i = 0; i < mesh->get_blend_shape_count(); i++) { - BlendShapeTrack mt; mt.idx = i; mt.value = 0; @@ -133,7 +131,6 @@ void MeshInstance3D::set_mesh(const Ref<Mesh> &p_mesh) { set_base(mesh->get_rid()); } else { - set_base(RID()); } @@ -141,13 +138,12 @@ void MeshInstance3D::set_mesh(const Ref<Mesh> &p_mesh) { _change_notify(); } -Ref<Mesh> MeshInstance3D::get_mesh() const { +Ref<Mesh> MeshInstance3D::get_mesh() const { return mesh; } void MeshInstance3D::_resolve_skeleton_path() { - Ref<SkinReference> new_skin_reference; if (!skeleton_path.is_empty()) { @@ -174,8 +170,9 @@ void MeshInstance3D::_resolve_skeleton_path() { void MeshInstance3D::set_skin(const Ref<Skin> &p_skin) { skin_internal = p_skin; skin = p_skin; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _resolve_skeleton_path(); } @@ -184,10 +181,10 @@ Ref<Skin> MeshInstance3D::get_skin() const { } void MeshInstance3D::set_skeleton_path(const NodePath &p_skeleton) { - skeleton_path = p_skeleton; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _resolve_skeleton_path(); } @@ -196,32 +193,34 @@ NodePath MeshInstance3D::get_skeleton_path() { } AABB MeshInstance3D::get_aabb() const { - - if (!mesh.is_null()) + if (!mesh.is_null()) { return mesh->get_aabb(); + } return AABB(); } Vector<Face3> MeshInstance3D::get_faces(uint32_t p_usage_flags) const { - - if (!(p_usage_flags & (FACES_SOLID | FACES_ENCLOSING))) + if (!(p_usage_flags & (FACES_SOLID | FACES_ENCLOSING))) { return Vector<Face3>(); + } - if (mesh.is_null()) + if (mesh.is_null()) { return Vector<Face3>(); + } return mesh->get_faces(); } Node *MeshInstance3D::create_trimesh_collision_node() { - - if (mesh.is_null()) + if (mesh.is_null()) { return nullptr; + } Ref<Shape3D> shape = mesh->create_trimesh_shape(); - if (shape.is_null()) + if (shape.is_null()) { return nullptr; + } StaticBody3D *static_body = memnew(StaticBody3D); CollisionShape3D *cshape = memnew(CollisionShape3D); @@ -231,7 +230,6 @@ Node *MeshInstance3D::create_trimesh_collision_node() { } void MeshInstance3D::create_trimesh_collision() { - StaticBody3D *static_body = Object::cast_to<StaticBody3D>(create_trimesh_collision_node()); ERR_FAIL_COND(!static_body); static_body->set_name(String(get_name()) + "_col"); @@ -245,13 +243,14 @@ void MeshInstance3D::create_trimesh_collision() { } Node *MeshInstance3D::create_convex_collision_node() { - - if (mesh.is_null()) + if (mesh.is_null()) { return nullptr; + } Ref<Shape3D> shape = mesh->create_convex_shape(); - if (shape.is_null()) + if (shape.is_null()) { return nullptr; + } StaticBody3D *static_body = memnew(StaticBody3D); CollisionShape3D *cshape = memnew(CollisionShape3D); @@ -261,7 +260,6 @@ Node *MeshInstance3D::create_convex_collision_node() { } void MeshInstance3D::create_convex_collision() { - StaticBody3D *static_body = Object::cast_to<StaticBody3D>(create_convex_collision_node()); ERR_FAIL_COND(!static_body); static_body->set_name(String(get_name()) + "_col"); @@ -275,38 +273,34 @@ void MeshInstance3D::create_convex_collision() { } void MeshInstance3D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { _resolve_skeleton_path(); } } int MeshInstance3D::get_surface_material_count() const { - return materials.size(); } void MeshInstance3D::set_surface_material(int p_surface, const Ref<Material> &p_material) { - ERR_FAIL_INDEX(p_surface, materials.size()); materials.write[p_surface] = p_material; - if (materials[p_surface].is_valid()) + if (materials[p_surface].is_valid()) { RS::get_singleton()->instance_set_surface_material(get_instance(), p_surface, materials[p_surface]->get_rid()); - else + } else { RS::get_singleton()->instance_set_surface_material(get_instance(), p_surface, RID()); + } } Ref<Material> MeshInstance3D::get_surface_material(int p_surface) const { - ERR_FAIL_INDEX_V(p_surface, materials.size(), Ref<Material>()); return materials[p_surface]; } Ref<Material> MeshInstance3D::get_active_material(int p_surface) const { - Ref<Material> material_override = get_material_override(); if (material_override.is_valid()) { return material_override; @@ -326,28 +320,29 @@ Ref<Material> MeshInstance3D::get_active_material(int p_surface) const { } void MeshInstance3D::_mesh_changed() { - materials.resize(mesh->get_surface_count()); } void MeshInstance3D::create_debug_tangents() { - Vector<Vector3> lines; Vector<Color> colors; Ref<Mesh> mesh = get_mesh(); - if (!mesh.is_valid()) + if (!mesh.is_valid()) { return; + } for (int i = 0; i < mesh->get_surface_count(); i++) { Array arrays = mesh->surface_get_arrays(i); Vector<Vector3> verts = arrays[Mesh::ARRAY_VERTEX]; Vector<Vector3> norms = arrays[Mesh::ARRAY_NORMAL]; - if (norms.size() == 0) + if (norms.size() == 0) { continue; + } Vector<float> tangents = arrays[Mesh::ARRAY_TANGENT]; - if (tangents.size() == 0) + if (tangents.size() == 0) { continue; + } for (int j = 0; j < verts.size(); j++) { Vector3 v = verts[j]; @@ -373,7 +368,6 @@ void MeshInstance3D::create_debug_tangents() { } if (lines.size()) { - Ref<StandardMaterial3D> sm; sm.instance(); @@ -397,16 +391,16 @@ void MeshInstance3D::create_debug_tangents() { add_child(mi); #ifdef TOOLS_ENABLED - if (this == get_tree()->get_edited_scene_root()) + if (this == get_tree()->get_edited_scene_root()) { mi->set_owner(this); - else + } else { mi->set_owner(get_owner()); + } #endif } } void MeshInstance3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &MeshInstance3D::set_mesh); ClassDB::bind_method(D_METHOD("get_mesh"), &MeshInstance3D::get_mesh); ClassDB::bind_method(D_METHOD("set_skeleton_path", "skeleton_path"), &MeshInstance3D::set_skeleton_path); diff --git a/scene/3d/mesh_instance_3d.h b/scene/3d/mesh_instance_3d.h index 914148f427..e29204f702 100644 --- a/scene/3d/mesh_instance_3d.h +++ b/scene/3d/mesh_instance_3d.h @@ -37,7 +37,6 @@ #include "scene/resources/skin.h" class MeshInstance3D : public GeometryInstance3D { - GDCLASS(MeshInstance3D, GeometryInstance3D); protected: @@ -48,7 +47,6 @@ protected: NodePath skeleton_path; struct BlendShapeTrack { - int idx; float value; BlendShapeTrack() { diff --git a/scene/3d/multimesh_instance_3d.cpp b/scene/3d/multimesh_instance_3d.cpp index a625a34283..88dff111f7 100644 --- a/scene/3d/multimesh_instance_3d.cpp +++ b/scene/3d/multimesh_instance_3d.cpp @@ -31,37 +31,34 @@ #include "multimesh_instance_3d.h" void MultiMeshInstance3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_multimesh", "multimesh"), &MultiMeshInstance3D::set_multimesh); ClassDB::bind_method(D_METHOD("get_multimesh"), &MultiMeshInstance3D::get_multimesh); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "multimesh", PROPERTY_HINT_RESOURCE_TYPE, "MultiMesh"), "set_multimesh", "get_multimesh"); } void MultiMeshInstance3D::set_multimesh(const Ref<MultiMesh> &p_multimesh) { - multimesh = p_multimesh; - if (multimesh.is_valid()) + if (multimesh.is_valid()) { set_base(multimesh->get_rid()); - else + } else { set_base(RID()); + } } Ref<MultiMesh> MultiMeshInstance3D::get_multimesh() const { - return multimesh; } Vector<Face3> MultiMeshInstance3D::get_faces(uint32_t p_usage_flags) const { - return Vector<Face3>(); } AABB MultiMeshInstance3D::get_aabb() const { - - if (multimesh.is_null()) + if (multimesh.is_null()) { return AABB(); - else + } else { return multimesh->get_aabb(); + } } MultiMeshInstance3D::MultiMeshInstance3D() { diff --git a/scene/3d/navigation_3d.cpp b/scene/3d/navigation_3d.cpp index f880f65d37..07a4824c28 100644 --- a/scene/3d/navigation_3d.cpp +++ b/scene/3d/navigation_3d.cpp @@ -33,7 +33,6 @@ #include "servers/navigation_server_3d.h" Vector<Vector3> Navigation3D::get_simple_path(const Vector3 &p_start, const Vector3 &p_end, bool p_optimize) const { - return NavigationServer3D::get_singleton()->map_get_path(map, p_start, p_end, p_optimize); } @@ -54,13 +53,11 @@ RID Navigation3D::get_closest_point_owner(const Vector3 &p_point) const { } void Navigation3D::set_up_vector(const Vector3 &p_up) { - up = p_up; NavigationServer3D::get_singleton()->map_set_up(map, up); } Vector3 Navigation3D::get_up_vector() const { - return up; } @@ -75,7 +72,6 @@ void Navigation3D::set_edge_connection_margin(float p_edge_connection_margin) { } void Navigation3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_rid"), &Navigation3D::get_rid); ClassDB::bind_method(D_METHOD("get_simple_path", "start", "end", "optimize"), &Navigation3D::get_simple_path, DEFVAL(true)); @@ -104,14 +100,12 @@ void Navigation3D::_notification(int p_what) { NavigationServer3D::get_singleton()->map_set_active(map, true); } break; case NOTIFICATION_EXIT_TREE: { - NavigationServer3D::get_singleton()->map_set_active(map, false); } break; } } Navigation3D::Navigation3D() { - map = NavigationServer3D::get_singleton()->map_create(); set_cell_size(0.3); diff --git a/scene/3d/navigation_3d.h b/scene/3d/navigation_3d.h index daa9558125..890caed171 100644 --- a/scene/3d/navigation_3d.h +++ b/scene/3d/navigation_3d.h @@ -35,7 +35,6 @@ #include "scene/3d/node_3d.h" class Navigation3D : public Node3D { - GDCLASS(Navigation3D, Node3D); RID map; diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp index 020d598f00..f8d44506b6 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -35,7 +35,6 @@ #include "servers/navigation_server_3d.h" void NavigationAgent3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_target_desired_distance", "desired_distance"), &NavigationAgent3D::set_target_desired_distance); ClassDB::bind_method(D_METHOD("get_target_desired_distance"), &NavigationAgent3D::get_target_desired_distance); @@ -99,7 +98,6 @@ void NavigationAgent3D::_bind_methods() { void NavigationAgent3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { - agent_parent = Object::cast_to<Node3D>(get_parent()); NavigationServer3D::get_singleton()->agent_set_callback(agent, this, "_avoidance_done"); @@ -110,10 +108,11 @@ void NavigationAgent3D::_notification(int p_what) { Node *p = get_parent(); while (p != nullptr) { nav = Object::cast_to<Navigation3D>(p); - if (nav != nullptr) + if (nav != nullptr) { p = nullptr; - else + } else { p = p->get_parent(); + } } set_navigation(nav); @@ -128,7 +127,6 @@ void NavigationAgent3D::_notification(int p_what) { } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { if (agent_parent) { - NavigationServer3D::get_singleton()->agent_set_position(agent, agent_parent->get_global_transform().origin); if (!target_reached) { if (distance_to_target() < target_desired_distance) { @@ -157,8 +155,9 @@ NavigationAgent3D::~NavigationAgent3D() { } void NavigationAgent3D::set_navigation(Navigation3D *p_nav) { - if (navigation == p_nav) + if (navigation == p_nav) { return; // Pointless + } navigation = p_nav; NavigationServer3D::get_singleton()->agent_set_map(agent, navigation == nullptr ? RID() : navigation->get_rid()); @@ -296,13 +295,15 @@ String NavigationAgent3D::get_configuration_warning() const { } void NavigationAgent3D::update_navigation() { - - if (agent_parent == nullptr) + if (agent_parent == nullptr) { return; - if (navigation == nullptr) + } + if (navigation == nullptr) { return; - if (update_frame_id == Engine::get_singleton()->get_physics_frames()) + } + if (update_frame_id == Engine::get_singleton()->get_physics_frames()) { return; + } update_frame_id = Engine::get_singleton()->get_physics_frames(); @@ -337,8 +338,9 @@ void NavigationAgent3D::update_navigation() { emit_signal("path_changed"); } - if (navigation_path.size() == 0) + if (navigation_path.size() == 0) { return; + } // Check if we can advance the navigation path if (navigation_finished == false) { diff --git a/scene/3d/navigation_obstacle_3d.cpp b/scene/3d/navigation_obstacle_3d.cpp index 2f99a5f99e..69fd5b02fc 100644 --- a/scene/3d/navigation_obstacle_3d.cpp +++ b/scene/3d/navigation_obstacle_3d.cpp @@ -36,7 +36,6 @@ #include "servers/navigation_server_3d.h" void NavigationObstacle3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_navigation", "navigation"), &NavigationObstacle3D::set_navigation_node); ClassDB::bind_method(D_METHOD("get_navigation"), &NavigationObstacle3D::get_navigation_node); } @@ -44,7 +43,6 @@ void NavigationObstacle3D::_bind_methods() { void NavigationObstacle3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { - update_agent_shape(); // Search the navigation node and set it @@ -53,10 +51,11 @@ void NavigationObstacle3D::_notification(int p_what) { Node *p = get_parent(); while (p != nullptr) { nav = Object::cast_to<Navigation3D>(p); - if (nav != nullptr) + if (nav != nullptr) { p = nullptr; - else + } else { p = p->get_parent(); + } } set_navigation(nav); @@ -76,7 +75,6 @@ void NavigationObstacle3D::_notification(int p_what) { PhysicsBody3D *rigid = Object::cast_to<PhysicsBody3D>(get_parent()); if (rigid) { - Vector3 v = rigid->get_linear_velocity(); NavigationServer3D::get_singleton()->agent_set_velocity(agent, v); NavigationServer3D::get_singleton()->agent_set_target_velocity(agent, v); @@ -96,8 +94,9 @@ NavigationObstacle3D::~NavigationObstacle3D() { } void NavigationObstacle3D::set_navigation(Navigation3D *p_nav) { - if (navigation == p_nav) + if (navigation == p_nav) { return; // Pointless + } navigation = p_nav; NavigationServer3D::get_singleton()->agent_set_map(agent, navigation == nullptr ? RID() : navigation->get_rid()); @@ -115,7 +114,6 @@ Node *NavigationObstacle3D::get_navigation_node() const { String NavigationObstacle3D::get_configuration_warning() const { if (!Object::cast_to<Node3D>(get_parent())) { - return TTR("The NavigationObstacle3D only serves to provide collision avoidance to a spatial object."); } @@ -149,8 +147,9 @@ void NavigationObstacle3D::update_agent_shape() { radius *= MAX(s.x, MAX(s.y, s.z)); } - if (radius == 0.0) + if (radius == 0.0) { radius = 1.0; // Never a 0 radius + } // Initialize the Agent as an object NavigationServer3D::get_singleton()->agent_set_neighbor_dist(agent, 0.0); diff --git a/scene/3d/navigation_region_3d.cpp b/scene/3d/navigation_region_3d.cpp index b15fa6166f..15ed448a65 100644 --- a/scene/3d/navigation_region_3d.cpp +++ b/scene/3d/navigation_region_3d.cpp @@ -36,21 +36,19 @@ #include "servers/navigation_server_3d.h" void NavigationRegion3D::set_enabled(bool p_enabled) { - - if (enabled == p_enabled) + if (enabled == p_enabled) { return; + } enabled = p_enabled; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (!enabled) { - NavigationServer3D::get_singleton()->region_set_map(region, RID()); } else { - if (navigation) { - NavigationServer3D::get_singleton()->region_set_map(region, navigation->get_rid()); } } @@ -68,25 +66,19 @@ void NavigationRegion3D::set_enabled(bool p_enabled) { } bool NavigationRegion3D::is_enabled() const { - return enabled; } ///////////////////////////// void NavigationRegion3D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_ENTER_TREE: { - Node3D *c = this; while (c) { - navigation = Object::cast_to<Navigation3D>(c); if (navigation) { - if (enabled) { - NavigationServer3D::get_singleton()->region_set_map(region, navigation->get_rid()); } break; @@ -96,7 +88,6 @@ void NavigationRegion3D::_notification(int p_what) { } if (navmesh.is_valid() && get_tree()->is_debugging_navigation_hint()) { - MeshInstance3D *dm = memnew(MeshInstance3D); dm->set_mesh(navmesh->get_debug_mesh()); if (is_enabled()) { @@ -110,14 +101,11 @@ void NavigationRegion3D::_notification(int p_what) { } break; case NOTIFICATION_TRANSFORM_CHANGED: { - NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform()); } break; case NOTIFICATION_EXIT_TREE: { - if (navigation) { - NavigationServer3D::get_singleton()->region_set_map(region, RID()); } @@ -131,9 +119,9 @@ void NavigationRegion3D::_notification(int p_what) { } void NavigationRegion3D::set_navigation_mesh(const Ref<NavigationMesh> &p_navmesh) { - - if (p_navmesh == navmesh) + if (p_navmesh == navmesh) { return; + } if (navmesh.is_valid()) { navmesh->remove_change_receptor(this); @@ -158,7 +146,6 @@ void NavigationRegion3D::set_navigation_mesh(const Ref<NavigationMesh> &p_navmes } Ref<NavigationMesh> NavigationRegion3D::get_navigation_mesh() const { - return navmesh; } @@ -176,7 +163,6 @@ void _bake_navigation_mesh(void *p_user_data) { args->nav_region->call_deferred("_bake_finished", nav_mesh); memdelete(args); } else { - ERR_PRINT("Can't bake the navigation mesh if the `NavigationMesh` resource doesn't exist"); args->nav_region->call_deferred("_bake_finished", Ref<NavigationMesh>()); memdelete(args); @@ -199,18 +185,18 @@ void NavigationRegion3D::_bake_finished(Ref<NavigationMesh> p_nav_mesh) { } String NavigationRegion3D::get_configuration_warning() const { - - if (!is_visible_in_tree() || !is_inside_tree()) + if (!is_visible_in_tree() || !is_inside_tree()) { return String(); + } if (!navmesh.is_valid()) { return TTR("A NavigationMesh resource must be set or created for this node to work."); } const Node3D *c = this; while (c) { - - if (Object::cast_to<Navigation3D>(c)) + if (Object::cast_to<Navigation3D>(c)) { return String(); + } c = Object::cast_to<Node3D>(c->get_parent()); } @@ -219,7 +205,6 @@ String NavigationRegion3D::get_configuration_warning() const { } void NavigationRegion3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_navigation_mesh", "navmesh"), &NavigationRegion3D::set_navigation_mesh); ClassDB::bind_method(D_METHOD("get_navigation_mesh"), &NavigationRegion3D::get_navigation_mesh); @@ -247,7 +232,8 @@ NavigationRegion3D::NavigationRegion3D() { } NavigationRegion3D::~NavigationRegion3D() { - if (navmesh.is_valid()) + if (navmesh.is_valid()) { navmesh->remove_change_receptor(this); + } NavigationServer3D::get_singleton()->free(region); } diff --git a/scene/3d/navigation_region_3d.h b/scene/3d/navigation_region_3d.h index a7b5077f53..fcd2efd4ef 100644 --- a/scene/3d/navigation_region_3d.h +++ b/scene/3d/navigation_region_3d.h @@ -38,7 +38,6 @@ class Navigation3D; class NavigationRegion3D : public Node3D { - GDCLASS(NavigationRegion3D, Node3D); bool enabled = true; diff --git a/scene/3d/node_3d.cpp b/scene/3d/node_3d.cpp index 913a3ea49f..73f17060df 100644 --- a/scene/3d/node_3d.cpp +++ b/scene/3d/node_3d.cpp @@ -74,7 +74,6 @@ Node3DGizmo::Node3DGizmo() { } void Node3D::_notify_dirty() { - #ifdef TOOLS_ENABLED if ((data.gizmo.is_valid() || data.notify_transform) && !data.ignore_notification && !xform_change.in_list()) { #else @@ -90,8 +89,8 @@ void Node3D::_update_local_transform() const { data.dirty &= ~DIRTY_LOCAL; } -void Node3D::_propagate_transform_changed(Node3D *p_origin) { +void Node3D::_propagate_transform_changed(Node3D *p_origin) { if (!is_inside_tree()) { return; } @@ -104,9 +103,9 @@ void Node3D::_propagate_transform_changed(Node3D *p_origin) { data.children_lock++; for (List<Node3D *>::Element *E = data.children.front(); E; E = E->next()) { - - if (E->get()->data.toplevel_active) + if (E->get()->data.toplevel_active) { continue; //don't propagate to a toplevel + } E->get()->_propagate_transform_changed(p_origin); } #ifdef TOOLS_ENABLED @@ -122,22 +121,22 @@ void Node3D::_propagate_transform_changed(Node3D *p_origin) { } void Node3D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_ENTER_TREE: { ERR_FAIL_COND(!get_tree()); Node *p = get_parent(); - if (p) + if (p) { data.parent = Object::cast_to<Node3D>(p); + } - if (data.parent) + if (data.parent) { data.C = data.parent->data.children.push_back(this); - else + } else { data.C = nullptr; + } if (data.toplevel && !Engine::get_singleton()->is_editor_hint()) { - if (data.parent) { data.local_transform = data.parent->get_global_transform() * get_transform(); data.dirty = DIRTY_VECTORS; //global is always dirty upon entering a scene @@ -152,18 +151,18 @@ void Node3D::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { - notification(NOTIFICATION_EXIT_WORLD, true); - if (xform_change.in_list()) + if (xform_change.in_list()) { get_tree()->xform_change_list.remove(&xform_change); - if (data.C) + } + if (data.C) { data.parent->data.children.erase(data.C); + } data.parent = nullptr; data.C = nullptr; data.toplevel_active = false; } break; case NOTIFICATION_ENTER_WORLD: { - data.inside_world = true; data.viewport = nullptr; Node *parent = get_parent(); @@ -175,16 +174,13 @@ void Node3D::_notification(int p_what) { ERR_FAIL_COND(!data.viewport); if (get_script_instance()) { - get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_enter_world, nullptr, 0); } #ifdef TOOLS_ENABLED if (Engine::get_singleton()->is_editor_hint() && get_tree()->is_node_being_edited(this)) { - //get_scene()->call_group(SceneMainLoop::GROUP_CALL_REALTIME,SceneStringNames::get_singleton()->_spatial_editor_group,SceneStringNames::get_singleton()->_request_gizmo,this); get_tree()->call_group_flags(0, SceneStringNames::get_singleton()->_spatial_editor_group, SceneStringNames::get_singleton()->_request_gizmo, this); if (!data.gizmo_disabled) { - if (data.gizmo.is_valid()) { data.gizmo->create(); if (is_visible_in_tree()) { @@ -198,7 +194,6 @@ void Node3D::_notification(int p_what) { } break; case NOTIFICATION_EXIT_WORLD: { - #ifdef TOOLS_ENABLED if (data.gizmo.is_valid()) { data.gizmo->free(); @@ -207,7 +202,6 @@ void Node3D::_notification(int p_what) { #endif if (get_script_instance()) { - get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_exit_world, nullptr, 0); } @@ -217,7 +211,6 @@ void Node3D::_notification(int p_what) { } break; case NOTIFICATION_TRANSFORM_CHANGED: { - #ifdef TOOLS_ENABLED if (data.gizmo.is_valid()) { data.gizmo->transform(); @@ -231,7 +224,6 @@ void Node3D::_notification(int p_what) { } void Node3D::set_transform(const Transform &p_transform) { - data.local_transform = p_transform; data.dirty |= DIRTY_VECTORS; _change_notify("translation"); @@ -245,7 +237,6 @@ void Node3D::set_transform(const Transform &p_transform) { } void Node3D::set_global_transform(const Transform &p_transform) { - Transform xform = (data.parent && !data.toplevel_active) ? data.parent->get_global_transform().affine_inverse() * p_transform : @@ -255,30 +246,24 @@ void Node3D::set_global_transform(const Transform &p_transform) { } Transform Node3D::get_transform() const { - if (data.dirty & DIRTY_LOCAL) { - _update_local_transform(); } return data.local_transform; } -Transform Node3D::get_global_transform() const { +Transform Node3D::get_global_transform() const { ERR_FAIL_COND_V(!is_inside_tree(), Transform()); if (data.dirty & DIRTY_GLOBAL) { - if (data.dirty & DIRTY_LOCAL) { - _update_local_transform(); } if (data.parent && !data.toplevel_active) { - data.global_transform = data.parent->get_global_transform() * data.local_transform; } else { - data.global_transform = data.local_transform; } @@ -303,25 +288,24 @@ Transform Node3D::get_local_gizmo_transform() const { #endif Node3D *Node3D::get_parent_spatial() const { - return data.parent; } Transform Node3D::get_relative_transform(const Node *p_parent) const { - - if (p_parent == this) + if (p_parent == this) { return Transform(); + } ERR_FAIL_COND_V(!data.parent, Transform()); - if (p_parent == data.parent) + if (p_parent == data.parent) { return get_transform(); - else + } else { return data.parent->get_relative_transform(p_parent) * get_transform(); + } } void Node3D::set_translation(const Vector3 &p_translation) { - data.local_transform.origin = p_translation; _change_notify("transform"); _propagate_transform_changed(this); @@ -331,7 +315,6 @@ void Node3D::set_translation(const Vector3 &p_translation) { } void Node3D::set_rotation(const Vector3 &p_euler_rad) { - if (data.dirty & DIRTY_VECTORS) { data.scale = data.local_transform.basis.get_scale(); data.dirty &= ~DIRTY_VECTORS; @@ -347,12 +330,10 @@ void Node3D::set_rotation(const Vector3 &p_euler_rad) { } void Node3D::set_rotation_degrees(const Vector3 &p_euler_deg) { - set_rotation(p_euler_deg * Math_PI / 180.0); } void Node3D::set_scale(const Vector3 &p_scale) { - if (data.dirty & DIRTY_VECTORS) { data.rotation = data.local_transform.basis.get_rotation(); data.dirty &= ~DIRTY_VECTORS; @@ -368,12 +349,10 @@ void Node3D::set_scale(const Vector3 &p_scale) { } Vector3 Node3D::get_translation() const { - return data.local_transform.origin; } Vector3 Node3D::get_rotation() const { - if (data.dirty & DIRTY_VECTORS) { data.scale = data.local_transform.basis.get_scale(); data.rotation = data.local_transform.basis.get_rotation(); @@ -385,12 +364,10 @@ Vector3 Node3D::get_rotation() const { } Vector3 Node3D::get_rotation_degrees() const { - return get_rotation() * 180.0 / Math_PI; } Vector3 Node3D::get_scale() const { - if (data.dirty & DIRTY_VECTORS) { data.scale = data.local_transform.basis.get_scale(); data.rotation = data.local_transform.basis.get_rotation(); @@ -402,32 +379,35 @@ Vector3 Node3D::get_scale() const { } void Node3D::update_gizmo() { - #ifdef TOOLS_ENABLED - if (!is_inside_world()) + if (!is_inside_world()) { return; - if (!data.gizmo.is_valid()) + } + if (!data.gizmo.is_valid()) { get_tree()->call_group_flags(SceneTree::GROUP_CALL_REALTIME, SceneStringNames::get_singleton()->_spatial_editor_group, SceneStringNames::get_singleton()->_request_gizmo, this); - if (!data.gizmo.is_valid()) + } + if (!data.gizmo.is_valid()) { return; - if (data.gizmo_dirty) + } + if (data.gizmo_dirty) { return; + } data.gizmo_dirty = true; MessageQueue::get_singleton()->push_call(this, "_update_gizmo"); #endif } void Node3D::set_gizmo(const Ref<Node3DGizmo> &p_gizmo) { - #ifdef TOOLS_ENABLED - if (data.gizmo_disabled) + if (data.gizmo_disabled) { return; - if (data.gizmo.is_valid() && is_inside_world()) + } + if (data.gizmo.is_valid() && is_inside_world()) { data.gizmo->free(); + } data.gizmo = p_gizmo; if (data.gizmo.is_valid() && is_inside_world()) { - data.gizmo->create(); if (is_visible_in_tree()) { data.gizmo->redraw(); @@ -439,7 +419,6 @@ void Node3D::set_gizmo(const Ref<Node3DGizmo> &p_gizmo) { } Ref<Node3DGizmo> Node3D::get_gizmo() const { - #ifdef TOOLS_ENABLED return data.gizmo; @@ -450,32 +429,32 @@ Ref<Node3DGizmo> Node3D::get_gizmo() const { } void Node3D::_update_gizmo() { - #ifdef TOOLS_ENABLED - if (!is_inside_world()) + if (!is_inside_world()) { return; + } data.gizmo_dirty = false; if (data.gizmo.is_valid()) { - if (is_visible_in_tree()) + if (is_visible_in_tree()) { data.gizmo->redraw(); - else + } else { data.gizmo->clear(); + } } #endif } #ifdef TOOLS_ENABLED void Node3D::set_disable_gizmo(bool p_enabled) { - data.gizmo_disabled = p_enabled; - if (!p_enabled && data.gizmo.is_valid()) + if (!p_enabled && data.gizmo.is_valid()) { data.gizmo = Ref<Node3DGizmo>(); + } } #endif void Node3D::set_disable_scale(bool p_enabled) { - data.disable_scale = p_enabled; } @@ -484,15 +463,15 @@ bool Node3D::is_scale_disabled() const { } void Node3D::set_as_toplevel(bool p_enabled) { - - if (data.toplevel == p_enabled) + if (data.toplevel == p_enabled) { return; + } if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) { - - if (p_enabled) + if (p_enabled) { set_transform(get_global_transform()); - else if (data.parent) + } else if (data.parent) { set_transform(data.parent->get_global_transform().affine_inverse() * get_global_transform()); + } data.toplevel = p_enabled; data.toplevel_active = p_enabled; @@ -503,12 +482,10 @@ void Node3D::set_as_toplevel(bool p_enabled) { } bool Node3D::is_set_as_toplevel() const { - return data.toplevel; } Ref<World3D> Node3D::get_world_3d() const { - ERR_FAIL_COND_V(!is_inside_world(), Ref<World3D>()); ERR_FAIL_COND_V(!data.viewport, Ref<World3D>()); @@ -516,52 +493,53 @@ Ref<World3D> Node3D::get_world_3d() const { } void Node3D::_propagate_visibility_changed() { - notification(NOTIFICATION_VISIBILITY_CHANGED); emit_signal(SceneStringNames::get_singleton()->visibility_changed); _change_notify("visible"); #ifdef TOOLS_ENABLED - if (data.gizmo.is_valid()) + if (data.gizmo.is_valid()) { _update_gizmo(); + } #endif for (List<Node3D *>::Element *E = data.children.front(); E; E = E->next()) { - Node3D *c = E->get(); - if (!c || !c->data.visible) + if (!c || !c->data.visible) { continue; + } c->_propagate_visibility_changed(); } } void Node3D::show() { - - if (data.visible) + if (data.visible) { return; + } data.visible = true; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _propagate_visibility_changed(); } void Node3D::hide() { - - if (!data.visible) + if (!data.visible) { return; + } data.visible = false; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _propagate_visibility_changed(); } bool Node3D::is_visible_in_tree() const { - const Node3D *s = this; while (s) { @@ -575,15 +553,14 @@ bool Node3D::is_visible_in_tree() const { } void Node3D::set_visible(bool p_visible) { - - if (p_visible) + if (p_visible) { show(); - else + } else { hide(); + } } bool Node3D::is_visible() const { - return data.visible; } @@ -594,34 +571,30 @@ void Node3D::rotate_object_local(const Vector3 &p_axis, float p_angle) { } void Node3D::rotate(const Vector3 &p_axis, float p_angle) { - Transform t = get_transform(); t.basis.rotate(p_axis, p_angle); set_transform(t); } void Node3D::rotate_x(float p_angle) { - Transform t = get_transform(); t.basis.rotate(Vector3(1, 0, 0), p_angle); set_transform(t); } void Node3D::rotate_y(float p_angle) { - Transform t = get_transform(); t.basis.rotate(Vector3(0, 1, 0), p_angle); set_transform(t); } -void Node3D::rotate_z(float p_angle) { +void Node3D::rotate_z(float p_angle) { Transform t = get_transform(); t.basis.rotate(Vector3(0, 0, 1), p_angle); set_transform(t); } void Node3D::translate(const Vector3 &p_offset) { - Transform t = get_transform(); t.translate(p_offset); set_transform(t); @@ -636,7 +609,6 @@ void Node3D::translate_object_local(const Vector3 &p_offset) { } void Node3D::scale(const Vector3 &p_ratio) { - Transform t = get_transform(); t.basis.scale(p_ratio); set_transform(t); @@ -649,14 +621,12 @@ void Node3D::scale_object_local(const Vector3 &p_scale) { } void Node3D::global_rotate(const Vector3 &p_axis, float p_angle) { - Transform t = get_global_transform(); t.basis.rotate(p_axis, p_angle); set_global_transform(t); } void Node3D::global_scale(const Vector3 &p_scale) { - Transform t = get_global_transform(); t.basis.scale(p_scale); set_global_transform(t); @@ -669,25 +639,21 @@ void Node3D::global_translate(const Vector3 &p_offset) { } void Node3D::orthonormalize() { - Transform t = get_transform(); t.orthonormalize(); set_transform(t); } void Node3D::set_identity() { - set_transform(Transform()); } void Node3D::look_at(const Vector3 &p_target, const Vector3 &p_up) { - Vector3 origin(get_global_transform().origin); look_at_from_position(origin, p_target, p_up); } void Node3D::look_at_from_position(const Vector3 &p_pos, const Vector3 &p_target, const Vector3 &p_up) { - ERR_FAIL_COND_MSG(p_pos == p_target, "Node origin and target are in the same position, look_at() failed."); ERR_FAIL_COND_MSG(p_up.cross(p_target - p_pos) == Vector3(), "Up vector and direction between node origin and target are aligned, look_at() failed."); @@ -701,12 +667,10 @@ void Node3D::look_at_from_position(const Vector3 &p_pos, const Vector3 &p_target } Vector3 Node3D::to_local(Vector3 p_global) const { - return get_global_transform().affine_inverse().xform(p_global); } Vector3 Node3D::to_global(Vector3 p_local) const { - return get_global_transform().xform(p_local); } @@ -737,7 +701,6 @@ void Node3D::force_update_transform() { } void Node3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_transform", "local"), &Node3D::set_transform); ClassDB::bind_method(D_METHOD("get_transform"), &Node3D::get_transform); ClassDB::bind_method(D_METHOD("set_translation", "translation"), &Node3D::set_translation); @@ -821,7 +784,6 @@ void Node3D::_bind_methods() { Node3D::Node3D() : xform_change(this) { - data.dirty = DIRTY_NONE; data.children_lock = 0; diff --git a/scene/3d/node_3d.h b/scene/3d/node_3d.h index a4191eb2b3..327d4671e9 100644 --- a/scene/3d/node_3d.h +++ b/scene/3d/node_3d.h @@ -35,7 +35,6 @@ #include "scene/main/scene_tree.h" class Node3DGizmo : public Reference { - GDCLASS(Node3DGizmo, Reference); public: @@ -50,7 +49,6 @@ public: }; class Node3D : public Node { - GDCLASS(Node3D, Node); OBJ_CATEGORY("3D"); @@ -64,7 +62,6 @@ class Node3D : public Node { mutable SelfList<Node> xform_change; struct Data { - mutable Transform global_transform; mutable Transform local_transform; mutable Vector3 rotation; diff --git a/scene/3d/path_3d.cpp b/scene/3d/path_3d.cpp index 4a425d1e0e..dcfdf8efcf 100644 --- a/scene/3d/path_3d.cpp +++ b/scene/3d/path_3d.cpp @@ -37,9 +37,9 @@ void Path3D::_notification(int p_what) { } void Path3D::_curve_changed() { - - if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) + if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) { update_gizmo(); + } if (is_inside_tree()) { emit_signal("curve_changed"); } @@ -57,7 +57,6 @@ void Path3D::_curve_changed() { } void Path3D::set_curve(const Ref<Curve3D> &p_curve) { - if (curve.is_valid()) { curve->disconnect("changed", callable_mp(this, &Path3D::_curve_changed)); } @@ -71,12 +70,10 @@ void Path3D::set_curve(const Ref<Curve3D> &p_curve) { } Ref<Curve3D> Path3D::get_curve() const { - return curve; } void Path3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_curve", "curve"), &Path3D::set_curve); ClassDB::bind_method(D_METHOD("get_curve"), &Path3D::get_curve); @@ -86,20 +83,20 @@ void Path3D::_bind_methods() { } Path3D::Path3D() { - set_curve(Ref<Curve3D>(memnew(Curve3D))); //create one by default } ////////////// void PathFollow3D::_update_transform() { - - if (!path) + if (!path) { return; + } Ref<Curve3D> c = path->get_curve(); - if (!c.is_valid()) + if (!c.is_valid()) { return; + } if (delta_offset == 0) { return; @@ -124,13 +121,13 @@ void PathFollow3D::_update_transform() { // will be replaced by "Vector3(h_offset, v_offset, 0)" where it was formerly used if (rotation_mode == ROTATION_ORIENTED) { - Vector3 forward = c->interpolate_baked(o_next, cubic) - pos; - if (forward.length_squared() < CMP_EPSILON2) + if (forward.length_squared() < CMP_EPSILON2) { forward = Vector3(0, 0, 1); - else + } else { forward.normalize(); + } Vector3 up = c->interpolate_baked_up_vector(offset, true); @@ -138,10 +135,11 @@ void PathFollow3D::_update_transform() { Vector3 up1 = c->interpolate_baked_up_vector(o_next, true); Vector3 axis = up.cross(up1); - if (axis.length_squared() < CMP_EPSILON2) + if (axis.length_squared() < CMP_EPSILON2) { axis = forward; - else + } else { axis.normalize(); + } up.rotate(axis, up.angle_to(up1) * 0.5f); } @@ -213,11 +211,8 @@ void PathFollow3D::_update_transform() { } void PathFollow3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - Node *parent = get_parent(); if (parent) { path = Object::cast_to<Path3D>(parent); @@ -228,38 +223,34 @@ void PathFollow3D::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { - path = nullptr; } break; } } void PathFollow3D::set_cubic_interpolation(bool p_enable) { - cubic = p_enable; } bool PathFollow3D::get_cubic_interpolation() const { - return cubic; } void PathFollow3D::_validate_property(PropertyInfo &property) const { - if (property.name == "offset") { - float max = 10000; - if (path && path->get_curve().is_valid()) + if (path && path->get_curve().is_valid()) { max = path->get_curve()->get_baked_length(); + } property.hint_string = "0," + rtos(max) + ",0.01,or_lesser,or_greater"; } } String PathFollow3D::get_configuration_warning() const { - - if (!is_visible_in_tree() || !is_inside_tree()) + if (!is_visible_in_tree() || !is_inside_tree()) { return String(); + } if (!Object::cast_to<Path3D>(get_parent())) { return TTR("PathFollow3D only works when set as a child of a Path3D node."); @@ -274,7 +265,6 @@ String PathFollow3D::get_configuration_warning() const { } void PathFollow3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_offset", "offset"), &PathFollow3D::set_offset); ClassDB::bind_method(D_METHOD("get_offset"), &PathFollow3D::get_offset); @@ -336,50 +326,46 @@ void PathFollow3D::set_offset(float p_offset) { } void PathFollow3D::set_h_offset(float p_h_offset) { - h_offset = p_h_offset; - if (path) + if (path) { _update_transform(); + } } float PathFollow3D::get_h_offset() const { - return h_offset; } void PathFollow3D::set_v_offset(float p_v_offset) { - v_offset = p_v_offset; - if (path) + if (path) { _update_transform(); + } } float PathFollow3D::get_v_offset() const { - return v_offset; } float PathFollow3D::get_offset() const { - return offset; } void PathFollow3D::set_unit_offset(float p_unit_offset) { - - if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length()) + if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length()) { set_offset(p_unit_offset * path->get_curve()->get_baked_length()); + } } float PathFollow3D::get_unit_offset() const { - - if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length()) + if (path && path->get_curve().is_valid() && path->get_curve()->get_baked_length()) { return get_offset() / path->get_curve()->get_baked_length(); - else + } else { return 0; + } } void PathFollow3D::set_rotation_mode(RotationMode p_rotation_mode) { - rotation_mode = p_rotation_mode; update_configuration_warning(); @@ -387,22 +373,18 @@ void PathFollow3D::set_rotation_mode(RotationMode p_rotation_mode) { } PathFollow3D::RotationMode PathFollow3D::get_rotation_mode() const { - return rotation_mode; } void PathFollow3D::set_loop(bool p_loop) { - loop = p_loop; } bool PathFollow3D::has_loop() const { - return loop; } PathFollow3D::PathFollow3D() { - offset = 0; delta_offset = 0; h_offset = 0; diff --git a/scene/3d/path_3d.h b/scene/3d/path_3d.h index 6f0db8c5c2..5a33016bc6 100644 --- a/scene/3d/path_3d.h +++ b/scene/3d/path_3d.h @@ -35,7 +35,6 @@ #include "scene/resources/curve.h" class Path3D : public Node3D { - GDCLASS(Path3D, Node3D); Ref<Curve3D> curve; @@ -54,7 +53,6 @@ public: }; class PathFollow3D : public Node3D { - GDCLASS(PathFollow3D, Node3D); public: diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp index d672c6f6b5..385b4e81a8 100644 --- a/scene/3d/physics_body_3d.cpp +++ b/scene/3d/physics_body_3d.cpp @@ -45,68 +45,60 @@ #endif Vector3 PhysicsBody3D::get_linear_velocity() const { - return Vector3(); } -Vector3 PhysicsBody3D::get_angular_velocity() const { +Vector3 PhysicsBody3D::get_angular_velocity() const { return Vector3(); } float PhysicsBody3D::get_inverse_mass() const { - return 0; } void PhysicsBody3D::set_collision_layer(uint32_t p_layer) { - collision_layer = p_layer; PhysicsServer3D::get_singleton()->body_set_collision_layer(get_rid(), p_layer); } uint32_t PhysicsBody3D::get_collision_layer() const { - return collision_layer; } void PhysicsBody3D::set_collision_mask(uint32_t p_mask) { - collision_mask = p_mask; PhysicsServer3D::get_singleton()->body_set_collision_mask(get_rid(), p_mask); } uint32_t PhysicsBody3D::get_collision_mask() const { - return collision_mask; } void PhysicsBody3D::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } bool PhysicsBody3D::get_collision_mask_bit(int p_bit) const { - return get_collision_mask() & (1 << p_bit); } void PhysicsBody3D::set_collision_layer_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_layer(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_layer(mask); } bool PhysicsBody3D::get_collision_layer_bit(int p_bit) const { - return get_collision_layer() & (1 << p_bit); } @@ -125,7 +117,6 @@ TypedArray<PhysicsBody3D> PhysicsBody3D::get_collision_exceptions() { } void PhysicsBody3D::add_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); CollisionObject3D *collision_object = Object::cast_to<CollisionObject3D>(p_node); ERR_FAIL_COND_MSG(!collision_object, "Collision exception only works between two CollisionObject3Ds."); @@ -133,7 +124,6 @@ void PhysicsBody3D::add_collision_exception_with(Node *p_node) { } void PhysicsBody3D::remove_collision_exception_with(Node *p_node) { - ERR_FAIL_NULL(p_node); CollisionObject3D *collision_object = Object::cast_to<CollisionObject3D>(p_node); ERR_FAIL_COND_MSG(!collision_object, "Collision exception only works between two CollisionObject3Ds."); @@ -146,7 +136,6 @@ void PhysicsBody3D::_set_layers(uint32_t p_mask) { } uint32_t PhysicsBody3D::_get_layers() const { - return get_collision_layer(); } @@ -173,7 +162,6 @@ void PhysicsBody3D::_bind_methods() { PhysicsBody3D::PhysicsBody3D(PhysicsServer3D::BodyMode p_mode) : CollisionObject3D(PhysicsServer3D::get_singleton()->body_create(p_mode), false) { - collision_layer = 1; collision_mask = 1; } @@ -198,28 +186,24 @@ Ref<PhysicsMaterial> StaticBody3D::get_physics_material_override() const { } void StaticBody3D::set_constant_linear_velocity(const Vector3 &p_vel) { - constant_linear_velocity = p_vel; PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_LINEAR_VELOCITY, constant_linear_velocity); } void StaticBody3D::set_constant_angular_velocity(const Vector3 &p_vel) { - constant_angular_velocity = p_vel; PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_ANGULAR_VELOCITY, constant_angular_velocity); } Vector3 StaticBody3D::get_constant_linear_velocity() const { - return constant_linear_velocity; } -Vector3 StaticBody3D::get_constant_angular_velocity() const { +Vector3 StaticBody3D::get_constant_angular_velocity() const { return constant_angular_velocity; } void StaticBody3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_constant_linear_velocity", "vel"), &StaticBody3D::set_constant_linear_velocity); ClassDB::bind_method(D_METHOD("set_constant_angular_velocity", "vel"), &StaticBody3D::set_constant_angular_velocity); ClassDB::bind_method(D_METHOD("get_constant_linear_velocity"), &StaticBody3D::get_constant_linear_velocity); @@ -254,7 +238,6 @@ void StaticBody3D::_reload_physics_characteristics() { } void RigidBody3D::_body_enter_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -271,7 +254,6 @@ void RigidBody3D::_body_enter_tree(ObjectID p_id) { emit_signal(SceneStringNames::get_singleton()->body_entered, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_entered, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape); } @@ -279,7 +261,6 @@ void RigidBody3D::_body_enter_tree(ObjectID p_id) { } void RigidBody3D::_body_exit_tree(ObjectID p_id) { - Object *obj = ObjectDB::get_instance(p_id); Node *node = Object::cast_to<Node>(obj); ERR_FAIL_COND(!node); @@ -294,7 +275,6 @@ void RigidBody3D::_body_exit_tree(ObjectID p_id) { emit_signal(SceneStringNames::get_singleton()->body_exited, node); for (int i = 0; i < E->get().shapes.size(); i++) { - emit_signal(SceneStringNames::get_singleton()->body_shape_exited, p_id, node, E->get().shapes[i].body_shape, E->get().shapes[i].local_shape); } @@ -302,7 +282,6 @@ void RigidBody3D::_body_exit_tree(ObjectID p_id) { } void RigidBody3D::_body_inout(int p_status, ObjectID p_instance, int p_body_shape, int p_local_shape) { - bool body_in = p_status == 1; ObjectID objid = p_instance; @@ -316,7 +295,6 @@ void RigidBody3D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap if (body_in) { if (!E) { - E = contact_monitor->body_map.insert(objid, BodyState()); //E->get().rc=0; E->get().in_tree = node && node->is_inside_tree(); @@ -329,29 +307,30 @@ void RigidBody3D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap } } //E->get().rc++; - if (node) + if (node) { E->get().shapes.insert(ShapePair(p_body_shape, p_local_shape)); + } if (E->get().in_tree) { emit_signal(SceneStringNames::get_singleton()->body_shape_entered, objid, node, p_body_shape, p_local_shape); } } else { - //E->get().rc--; - if (node) + if (node) { E->get().shapes.erase(ShapePair(p_body_shape, p_local_shape)); + } bool in_tree = E->get().in_tree; if (E->get().shapes.empty()) { - if (node) { node->disconnect(SceneStringNames::get_singleton()->tree_entered, callable_mp(this, &RigidBody3D::_body_enter_tree)); node->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &RigidBody3D::_body_exit_tree)); - if (in_tree) + if (in_tree) { emit_signal(SceneStringNames::get_singleton()->body_exited, node); + } } contact_monitor->body_map.erase(E); @@ -363,14 +342,12 @@ void RigidBody3D::_body_inout(int p_status, ObjectID p_instance, int p_body_shap } struct _RigidBodyInOut { - ObjectID id; int shape; int local_shape; }; void RigidBody3D::_direct_state_changed(Object *p_state) { - #ifdef DEBUG_ENABLED state = Object::cast_to<PhysicsDirectBodyState3D>(p_state); #else @@ -385,20 +362,18 @@ void RigidBody3D::_direct_state_changed(Object *p_state) { sleeping = state->is_sleeping(); emit_signal(SceneStringNames::get_singleton()->sleeping_state_changed); } - if (get_script_instance()) + if (get_script_instance()) { get_script_instance()->call("_integrate_forces", state); + } set_ignore_transform_notification(false); if (contact_monitor) { - contact_monitor->locked = true; //untag all int rc = 0; for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) { - for (int i = 0; i < E->get().shapes.size(); i++) { - E->get().shapes[i].tagged = false; rc++; } @@ -412,7 +387,6 @@ void RigidBody3D::_direct_state_changed(Object *p_state) { //put the ones to add for (int i = 0; i < state->get_contact_count(); i++) { - ObjectID obj = state->get_contact_collider_id(i); int local_shape = state->get_contact_local_shape(i); int shape = state->get_contact_collider_shape(i); @@ -431,7 +405,6 @@ void RigidBody3D::_direct_state_changed(Object *p_state) { ShapePair sp(shape, local_shape); int idx = E->get().shapes.find(sp); if (idx == -1) { - toadd[toadd_count].local_shape = local_shape; toadd[toadd_count].id = obj; toadd[toadd_count].shape = shape; @@ -445,11 +418,8 @@ void RigidBody3D::_direct_state_changed(Object *p_state) { //put the ones to remove for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) { - for (int i = 0; i < E->get().shapes.size(); i++) { - if (!E->get().shapes[i].tagged) { - toremove[toremove_count].body_id = E->key(); toremove[toremove_count].pair = E->get().shapes[i]; toremove_count++; @@ -460,14 +430,12 @@ void RigidBody3D::_direct_state_changed(Object *p_state) { //process remotions for (int i = 0; i < toremove_count; i++) { - _body_inout(0, toremove[i].body_id, toremove[i].pair.body_shape, toremove[i].pair.local_shape); } //process aditions for (int i = 0; i < toadd_count; i++) { - _body_inout(1, toadd[i].id, toadd[i].shape, toadd[i].local_shape); } @@ -478,7 +446,6 @@ void RigidBody3D::_direct_state_changed(Object *p_state) { } void RigidBody3D::_notification(int p_what) { - #ifdef TOOLS_ENABLED if (p_what == NOTIFICATION_ENTER_TREE) { if (Engine::get_singleton()->is_editor_hint()) { @@ -496,16 +463,12 @@ void RigidBody3D::_notification(int p_what) { } void RigidBody3D::set_mode(Mode p_mode) { - mode = p_mode; switch (p_mode) { - case MODE_RIGID: { - PhysicsServer3D::get_singleton()->body_set_mode(get_rid(), PhysicsServer3D::BODY_MODE_RIGID); } break; case MODE_STATIC: { - PhysicsServer3D::get_singleton()->body_set_mode(get_rid(), PhysicsServer3D::BODY_MODE_STATIC); } break; @@ -514,7 +477,6 @@ void RigidBody3D::set_mode(Mode p_mode) { } break; case MODE_KINEMATIC: { - PhysicsServer3D::get_singleton()->body_set_mode(get_rid(), PhysicsServer3D::BODY_MODE_KINEMATIC); } break; } @@ -522,29 +484,26 @@ void RigidBody3D::set_mode(Mode p_mode) { } RigidBody3D::Mode RigidBody3D::get_mode() const { - return mode; } void RigidBody3D::set_mass(real_t p_mass) { - ERR_FAIL_COND(p_mass <= 0); mass = p_mass; _change_notify("mass"); _change_notify("weight"); PhysicsServer3D::get_singleton()->body_set_param(get_rid(), PhysicsServer3D::BODY_PARAM_MASS, mass); } -real_t RigidBody3D::get_mass() const { +real_t RigidBody3D::get_mass() const { return mass; } void RigidBody3D::set_weight(real_t p_weight) { - set_mass(p_weight / real_t(GLOBAL_DEF("physics/3d/default_gravity", 9.8))); } -real_t RigidBody3D::get_weight() const { +real_t RigidBody3D::get_weight() const { return mass * real_t(GLOBAL_DEF("physics/3d/default_gravity", 9.8)); } @@ -568,39 +527,35 @@ Ref<PhysicsMaterial> RigidBody3D::get_physics_material_override() const { } void RigidBody3D::set_gravity_scale(real_t p_gravity_scale) { - gravity_scale = p_gravity_scale; PhysicsServer3D::get_singleton()->body_set_param(get_rid(), PhysicsServer3D::BODY_PARAM_GRAVITY_SCALE, gravity_scale); } -real_t RigidBody3D::get_gravity_scale() const { +real_t RigidBody3D::get_gravity_scale() const { return gravity_scale; } void RigidBody3D::set_linear_damp(real_t p_linear_damp) { - ERR_FAIL_COND(p_linear_damp < -1); linear_damp = p_linear_damp; PhysicsServer3D::get_singleton()->body_set_param(get_rid(), PhysicsServer3D::BODY_PARAM_LINEAR_DAMP, linear_damp); } -real_t RigidBody3D::get_linear_damp() const { +real_t RigidBody3D::get_linear_damp() const { return linear_damp; } void RigidBody3D::set_angular_damp(real_t p_angular_damp) { - ERR_FAIL_COND(p_angular_damp < -1); angular_damp = p_angular_damp; PhysicsServer3D::get_singleton()->body_set_param(get_rid(), PhysicsServer3D::BODY_PARAM_ANGULAR_DAMP, angular_damp); } -real_t RigidBody3D::get_angular_damp() const { +real_t RigidBody3D::get_angular_damp() const { return angular_damp; } void RigidBody3D::set_axis_velocity(const Vector3 &p_axis) { - Vector3 v = state ? state->get_linear_velocity() : linear_velocity; Vector3 axis = p_axis.normalized(); v -= axis * axis.dot(v); @@ -614,75 +569,68 @@ void RigidBody3D::set_axis_velocity(const Vector3 &p_axis) { } void RigidBody3D::set_linear_velocity(const Vector3 &p_velocity) { - linear_velocity = p_velocity; - if (state) + if (state) { state->set_linear_velocity(linear_velocity); - else + } else { PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_LINEAR_VELOCITY, linear_velocity); + } } Vector3 RigidBody3D::get_linear_velocity() const { - return linear_velocity; } void RigidBody3D::set_angular_velocity(const Vector3 &p_velocity) { - angular_velocity = p_velocity; - if (state) + if (state) { state->set_angular_velocity(angular_velocity); - else + } else { PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_ANGULAR_VELOCITY, angular_velocity); + } } -Vector3 RigidBody3D::get_angular_velocity() const { +Vector3 RigidBody3D::get_angular_velocity() const { return angular_velocity; } void RigidBody3D::set_use_custom_integrator(bool p_enable) { - - if (custom_integrator == p_enable) + if (custom_integrator == p_enable) { return; + } custom_integrator = p_enable; PhysicsServer3D::get_singleton()->body_set_omit_force_integration(get_rid(), p_enable); } -bool RigidBody3D::is_using_custom_integrator() { +bool RigidBody3D::is_using_custom_integrator() { return custom_integrator; } void RigidBody3D::set_sleeping(bool p_sleeping) { - sleeping = p_sleeping; PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_SLEEPING, sleeping); } void RigidBody3D::set_can_sleep(bool p_active) { - can_sleep = p_active; PhysicsServer3D::get_singleton()->body_set_state(get_rid(), PhysicsServer3D::BODY_STATE_CAN_SLEEP, p_active); } bool RigidBody3D::is_able_to_sleep() const { - return can_sleep; } bool RigidBody3D::is_sleeping() const { - return sleeping; } void RigidBody3D::set_max_contacts_reported(int p_amount) { - max_contacts_reported = p_amount; PhysicsServer3D::get_singleton()->body_set_max_contacts_reported(get_rid(), p_amount); } int RigidBody3D::get_max_contacts_reported() const { - return max_contacts_reported; } @@ -703,7 +651,6 @@ void RigidBody3D::apply_central_impulse(const Vector3 &p_impulse) { } void RigidBody3D::apply_impulse(const Vector3 &p_pos, const Vector3 &p_impulse) { - PhysicsServer3D::get_singleton()->body_apply_impulse(get_rid(), p_pos, p_impulse); } @@ -712,27 +659,23 @@ void RigidBody3D::apply_torque_impulse(const Vector3 &p_impulse) { } void RigidBody3D::set_use_continuous_collision_detection(bool p_enable) { - ccd = p_enable; PhysicsServer3D::get_singleton()->body_set_enable_continuous_collision_detection(get_rid(), p_enable); } bool RigidBody3D::is_using_continuous_collision_detection() const { - return ccd; } void RigidBody3D::set_contact_monitor(bool p_enabled) { - - if (p_enabled == is_contact_monitor_enabled()) + if (p_enabled == is_contact_monitor_enabled()) { return; + } if (!p_enabled) { - ERR_FAIL_COND_MSG(contact_monitor->locked, "Can't disable contact monitoring during in/out callback. Use call_deferred(\"set_contact_monitor\", false) instead."); for (Map<ObjectID, BodyState>::Element *E = contact_monitor->body_map.front(); E; E = E->next()) { - //clean up mess Object *obj = ObjectDB::get_instance(E->key()); Node *node = Object::cast_to<Node>(obj); @@ -746,14 +689,12 @@ void RigidBody3D::set_contact_monitor(bool p_enabled) { memdelete(contact_monitor); contact_monitor = nullptr; } else { - contact_monitor = memnew(ContactMonitor); contact_monitor->locked = false; } } bool RigidBody3D::is_contact_monitor_enabled() const { - return contact_monitor != nullptr; } @@ -766,7 +707,6 @@ bool RigidBody3D::get_axis_lock(PhysicsServer3D::BodyAxis p_axis) const { } Array RigidBody3D::get_colliding_bodies() const { - ERR_FAIL_COND_V(!contact_monitor, Array()); Array ret; @@ -785,7 +725,6 @@ Array RigidBody3D::get_colliding_bodies() const { } String RigidBody3D::get_configuration_warning() const { - Transform t = get_transform(); String warning = CollisionObject3D::get_configuration_warning(); @@ -801,7 +740,6 @@ String RigidBody3D::get_configuration_warning() const { } void RigidBody3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_mode", "mode"), &RigidBody3D::set_mode); ClassDB::bind_method(D_METHOD("get_mode"), &RigidBody3D::get_mode); @@ -905,7 +843,6 @@ void RigidBody3D::_bind_methods() { RigidBody3D::RigidBody3D() : PhysicsBody3D(PhysicsServer3D::BODY_MODE_RIGID) { - mode = MODE_RIGID; mass = 1; @@ -928,9 +865,9 @@ RigidBody3D::RigidBody3D() : } RigidBody3D::~RigidBody3D() { - - if (contact_monitor) + if (contact_monitor) { memdelete(contact_monitor); + } } void RigidBody3D::_reload_physics_characteristics() { @@ -947,7 +884,6 @@ void RigidBody3D::_reload_physics_characteristics() { ////////////////////////// Ref<KinematicCollision3D> KinematicBody3D::_move(const Vector3 &p_motion, bool p_infinite_inertia, bool p_exclude_raycast_shapes, bool p_test_only) { - Collision col; if (move_and_collide(p_motion, p_infinite_inertia, col, p_exclude_raycast_shapes, p_test_only)) { if (motion_cache.is_null()) { @@ -972,7 +908,6 @@ Vector3 KinematicBody3D::get_angular_velocity() const { } bool KinematicBody3D::move_and_collide(const Vector3 &p_motion, bool p_infinite_inertia, Collision &r_collision, bool p_exclude_raycast_shapes, bool p_test_only) { - Transform gt = get_global_transform(); PhysicsServer3D::MotionResult result; bool colliding = PhysicsServer3D::get_singleton()->body_test_motion(get_rid(), gt, p_motion, p_infinite_inertia, &result, p_exclude_raycast_shapes); @@ -1008,7 +943,6 @@ bool KinematicBody3D::move_and_collide(const Vector3 &p_motion, bool p_infinite_ #define FLOOR_ANGLE_THRESHOLD 0.01 Vector3 KinematicBody3D::move_and_slide(const Vector3 &p_linear_velocity, const Vector3 &p_up_direction, bool p_stop_on_slope, int p_max_slides, float p_floor_max_angle, bool p_infinite_inertia) { - Vector3 body_velocity = p_linear_velocity; Vector3 body_velocity_normal = body_velocity.normalized(); @@ -1030,7 +964,6 @@ Vector3 KinematicBody3D::move_and_slide(const Vector3 &p_linear_velocity, const floor_velocity = Vector3(); while (p_max_slides) { - Collision collision; bool found_collision = false; @@ -1092,8 +1025,9 @@ Vector3 KinematicBody3D::move_and_slide(const Vector3 &p_linear_velocity, const } } - if (!found_collision || motion == Vector3()) + if (!found_collision || motion == Vector3()) { break; + } --p_max_slides; } @@ -1102,7 +1036,6 @@ Vector3 KinematicBody3D::move_and_slide(const Vector3 &p_linear_velocity, const } Vector3 KinematicBody3D::move_and_slide_with_snap(const Vector3 &p_linear_velocity, const Vector3 &p_snap, const Vector3 &p_up_direction, bool p_stop_on_slope, int p_max_slides, float p_floor_max_angle, bool p_infinite_inertia) { - bool was_on_floor = on_floor; Vector3 ret = move_and_slide(p_linear_velocity, p_up_direction, p_stop_on_slope, p_max_slides, p_floor_max_angle, p_infinite_inertia); @@ -1114,7 +1047,6 @@ Vector3 KinematicBody3D::move_and_slide_with_snap(const Vector3 &p_linear_veloci Transform gt = get_global_transform(); if (move_and_collide(p_snap, p_infinite_inertia, col, false, true)) { - bool apply = true; if (p_up_direction != Vector3()) { if (Math::acos(p_up_direction.normalized().dot(col.normal)) < p_floor_max_angle) { @@ -1141,38 +1073,32 @@ Vector3 KinematicBody3D::move_and_slide_with_snap(const Vector3 &p_linear_veloci } bool KinematicBody3D::is_on_floor() const { - return on_floor; } bool KinematicBody3D::is_on_wall() const { - return on_wall; } -bool KinematicBody3D::is_on_ceiling() const { +bool KinematicBody3D::is_on_ceiling() const { return on_ceiling; } Vector3 KinematicBody3D::get_floor_normal() const { - return floor_normal; } Vector3 KinematicBody3D::get_floor_velocity() const { - return floor_velocity; } bool KinematicBody3D::test_move(const Transform &p_from, const Vector3 &p_motion, bool p_infinite_inertia) { - ERR_FAIL_COND_V(!is_inside_tree(), false); return PhysicsServer3D::get_singleton()->body_test_motion(get_rid(), p_from, p_motion, p_infinite_inertia); } bool KinematicBody3D::separate_raycast_shapes(bool p_infinite_inertia, Collision &r_collision) { - PhysicsServer3D::SeparationResult sep_res[8]; //max 8 rays Transform gt = get_global_transform(); @@ -1217,17 +1143,15 @@ bool KinematicBody3D::get_axis_lock(PhysicsServer3D::BodyAxis p_axis) const { } void KinematicBody3D::set_safe_margin(float p_margin) { - margin = p_margin; PhysicsServer3D::get_singleton()->body_set_kinematic_safe_margin(get_rid(), margin); } float KinematicBody3D::get_safe_margin() const { - return margin; } -int KinematicBody3D::get_slide_count() const { +int KinematicBody3D::get_slide_count() const { return colliders.size(); } @@ -1237,7 +1161,6 @@ KinematicBody3D::Collision KinematicBody3D::get_slide_collision(int p_bounce) co } Ref<KinematicCollision3D> KinematicBody3D::_get_slide_collision(int p_bounce) { - ERR_FAIL_INDEX_V(p_bounce, colliders.size(), Ref<KinematicCollision3D>()); if (p_bounce >= slide_colliders.size()) { slide_colliders.resize(p_bounce + 1); @@ -1265,7 +1188,6 @@ void KinematicBody3D::_notification(int p_what) { } void KinematicBody3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("_direct_state_changed"), &KinematicBody3D::_direct_state_changed); ClassDB::bind_method(D_METHOD("move_and_collide", "rel_vec", "infinite_inertia", "exclude_raycast_shapes", "test_only"), &KinematicBody3D::_move, DEFVAL(true), DEFVAL(true), DEFVAL(false)); @@ -1309,7 +1231,6 @@ void KinematicBody3D::_direct_state_changed(Object *p_state) { KinematicBody3D::KinematicBody3D() : PhysicsBody3D(PhysicsServer3D::BODY_MODE_KINEMATIC) { - margin = 0.001; locked_axis = 0; on_floor = false; @@ -1318,8 +1239,8 @@ KinematicBody3D::KinematicBody3D() : PhysicsServer3D::get_singleton()->body_set_force_integration_callback(get_rid(), this, "_direct_state_changed"); } -KinematicBody3D::~KinematicBody3D() { +KinematicBody3D::~KinematicBody3D() { if (motion_cache.is_valid()) { motion_cache->owner = nullptr; } @@ -1330,42 +1251,46 @@ KinematicBody3D::~KinematicBody3D() { } } } + /////////////////////////////////////// Vector3 KinematicCollision3D::get_position() const { - return collision.collision; } + Vector3 KinematicCollision3D::get_normal() const { return collision.normal; } + Vector3 KinematicCollision3D::get_travel() const { return collision.travel; } + Vector3 KinematicCollision3D::get_remainder() const { return collision.remainder; } + Object *KinematicCollision3D::get_local_shape() const { - if (!owner) + if (!owner) { return nullptr; + } uint32_t ownerid = owner->shape_find_owner(collision.local_shape); return owner->shape_owner_get_owner(ownerid); } Object *KinematicCollision3D::get_collider() const { - if (collision.collider.is_valid()) { return ObjectDB::get_instance(collision.collider); } return nullptr; } -ObjectID KinematicCollision3D::get_collider_id() const { +ObjectID KinematicCollision3D::get_collider_id() const { return collision.collider; } -Object *KinematicCollision3D::get_collider_shape() const { +Object *KinematicCollision3D::get_collider_shape() const { Object *collider = get_collider(); if (collider) { CollisionObject3D *obj2d = Object::cast_to<CollisionObject3D>(collider); @@ -1377,21 +1302,20 @@ Object *KinematicCollision3D::get_collider_shape() const { return nullptr; } -int KinematicCollision3D::get_collider_shape_index() const { +int KinematicCollision3D::get_collider_shape_index() const { return collision.collider_shape; } -Vector3 KinematicCollision3D::get_collider_velocity() const { +Vector3 KinematicCollision3D::get_collider_velocity() const { return collision.collider_vel; } -Variant KinematicCollision3D::get_collider_metadata() const { +Variant KinematicCollision3D::get_collider_metadata() const { return Variant(); } void KinematicCollision3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_position"), &KinematicCollision3D::get_position); ClassDB::bind_method(D_METHOD("get_normal"), &KinematicCollision3D::get_normal); ClassDB::bind_method(D_METHOD("get_travel"), &KinematicCollision3D::get_travel); @@ -1418,7 +1342,6 @@ void KinematicCollision3D::_bind_methods() { } KinematicCollision3D::KinematicCollision3D() { - collision.collider_shape = 0; collision.local_shape = 0; owner = nullptr; @@ -1470,18 +1393,21 @@ bool PhysicalBone3D::PinJointData::_set(const StringName &p_name, const Variant if ("joint_constraints/bias" == p_name) { bias = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->pin_joint_set_param(j, PhysicsServer3D::PIN_JOINT_BIAS, bias); + } } else if ("joint_constraints/damping" == p_name) { damping = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->pin_joint_set_param(j, PhysicsServer3D::PIN_JOINT_DAMPING, damping); + } } else if ("joint_constraints/impulse_clamp" == p_name) { impulse_clamp = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->pin_joint_set_param(j, PhysicsServer3D::PIN_JOINT_IMPULSE_CLAMP, impulse_clamp); + } } else { return false; @@ -1523,28 +1449,33 @@ bool PhysicalBone3D::ConeJointData::_set(const StringName &p_name, const Variant if ("joint_constraints/swing_span" == p_name) { swing_span = Math::deg2rad(real_t(p_value)); - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->cone_twist_joint_set_param(j, PhysicsServer3D::CONE_TWIST_JOINT_SWING_SPAN, swing_span); + } } else if ("joint_constraints/twist_span" == p_name) { twist_span = Math::deg2rad(real_t(p_value)); - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->cone_twist_joint_set_param(j, PhysicsServer3D::CONE_TWIST_JOINT_TWIST_SPAN, twist_span); + } } else if ("joint_constraints/bias" == p_name) { bias = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->cone_twist_joint_set_param(j, PhysicsServer3D::CONE_TWIST_JOINT_BIAS, bias); + } } else if ("joint_constraints/softness" == p_name) { softness = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->cone_twist_joint_set_param(j, PhysicsServer3D::CONE_TWIST_JOINT_SOFTNESS, softness); + } } else if ("joint_constraints/relaxation" == p_name) { relaxation = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->cone_twist_joint_set_param(j, PhysicsServer3D::CONE_TWIST_JOINT_RELAXATION, relaxation); + } } else { return false; @@ -1592,33 +1523,39 @@ bool PhysicalBone3D::HingeJointData::_set(const StringName &p_name, const Varian if ("joint_constraints/angular_limit_enabled" == p_name) { angular_limit_enabled = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->hinge_joint_set_flag(j, PhysicsServer3D::HINGE_JOINT_FLAG_USE_LIMIT, angular_limit_enabled); + } } else if ("joint_constraints/angular_limit_upper" == p_name) { angular_limit_upper = Math::deg2rad(real_t(p_value)); - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->hinge_joint_set_param(j, PhysicsServer3D::HINGE_JOINT_LIMIT_UPPER, angular_limit_upper); + } } else if ("joint_constraints/angular_limit_lower" == p_name) { angular_limit_lower = Math::deg2rad(real_t(p_value)); - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->hinge_joint_set_param(j, PhysicsServer3D::HINGE_JOINT_LIMIT_LOWER, angular_limit_lower); + } } else if ("joint_constraints/angular_limit_bias" == p_name) { angular_limit_bias = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->hinge_joint_set_param(j, PhysicsServer3D::HINGE_JOINT_LIMIT_BIAS, angular_limit_bias); + } } else if ("joint_constraints/angular_limit_softness" == p_name) { angular_limit_softness = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->hinge_joint_set_param(j, PhysicsServer3D::HINGE_JOINT_LIMIT_SOFTNESS, angular_limit_softness); + } } else if ("joint_constraints/angular_limit_relaxation" == p_name) { angular_limit_relaxation = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->hinge_joint_set_param(j, PhysicsServer3D::HINGE_JOINT_LIMIT_RELAXATION, angular_limit_relaxation); + } } else { return false; @@ -1669,53 +1606,63 @@ bool PhysicalBone3D::SliderJointData::_set(const StringName &p_name, const Varia if ("joint_constraints/linear_limit_upper" == p_name) { linear_limit_upper = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_UPPER, linear_limit_upper); + } } else if ("joint_constraints/linear_limit_lower" == p_name) { linear_limit_lower = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_LOWER, linear_limit_lower); + } } else if ("joint_constraints/linear_limit_softness" == p_name) { linear_limit_softness = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_SOFTNESS, linear_limit_softness); + } } else if ("joint_constraints/linear_limit_restitution" == p_name) { linear_limit_restitution = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_RESTITUTION, linear_limit_restitution); + } } else if ("joint_constraints/linear_limit_damping" == p_name) { linear_limit_damping = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_DAMPING, linear_limit_restitution); + } } else if ("joint_constraints/angular_limit_upper" == p_name) { angular_limit_upper = Math::deg2rad(real_t(p_value)); - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_UPPER, angular_limit_upper); + } } else if ("joint_constraints/angular_limit_lower" == p_name) { angular_limit_lower = Math::deg2rad(real_t(p_value)); - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_LOWER, angular_limit_lower); + } } else if ("joint_constraints/angular_limit_softness" == p_name) { angular_limit_softness = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS, angular_limit_softness); + } } else if ("joint_constraints/angular_limit_restitution" == p_name) { angular_limit_restitution = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_SOFTNESS, angular_limit_softness); + } } else if ("joint_constraints/angular_limit_damping" == p_name) { angular_limit_damping = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(j, PhysicsServer3D::SLIDER_JOINT_ANGULAR_LIMIT_DAMPING, angular_limit_damping); + } } else { return false; @@ -1797,108 +1744,129 @@ bool PhysicalBone3D::SixDOFJointData::_set(const StringName &p_name, const Varia if ("linear_limit_enabled" == var_name) { axis_data[axis].linear_limit_enabled = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_flag(j, axis, PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_LINEAR_LIMIT, axis_data[axis].linear_limit_enabled); + } } else if ("linear_limit_upper" == var_name) { axis_data[axis].linear_limit_upper = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_LINEAR_UPPER_LIMIT, axis_data[axis].linear_limit_upper); + } } else if ("linear_limit_lower" == var_name) { axis_data[axis].linear_limit_lower = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_LINEAR_LOWER_LIMIT, axis_data[axis].linear_limit_lower); + } } else if ("linear_limit_softness" == var_name) { axis_data[axis].linear_limit_softness = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_LINEAR_LIMIT_SOFTNESS, axis_data[axis].linear_limit_softness); + } } else if ("linear_spring_enabled" == var_name) { axis_data[axis].linear_spring_enabled = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_flag(j, axis, PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_LINEAR_SPRING, axis_data[axis].linear_spring_enabled); + } } else if ("linear_spring_stiffness" == var_name) { axis_data[axis].linear_spring_stiffness = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_STIFFNESS, axis_data[axis].linear_spring_stiffness); + } } else if ("linear_spring_damping" == var_name) { axis_data[axis].linear_spring_damping = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_DAMPING, axis_data[axis].linear_spring_damping); + } } else if ("linear_equilibrium_point" == var_name) { axis_data[axis].linear_equilibrium_point = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_LINEAR_SPRING_EQUILIBRIUM_POINT, axis_data[axis].linear_equilibrium_point); + } } else if ("linear_restitution" == var_name) { axis_data[axis].linear_restitution = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_LINEAR_RESTITUTION, axis_data[axis].linear_restitution); + } } else if ("linear_damping" == var_name) { axis_data[axis].linear_damping = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_LINEAR_DAMPING, axis_data[axis].linear_damping); + } } else if ("angular_limit_enabled" == var_name) { axis_data[axis].angular_limit_enabled = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_flag(j, axis, PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_ANGULAR_LIMIT, axis_data[axis].angular_limit_enabled); + } } else if ("angular_limit_upper" == var_name) { axis_data[axis].angular_limit_upper = Math::deg2rad(real_t(p_value)); - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_UPPER_LIMIT, axis_data[axis].angular_limit_upper); + } } else if ("angular_limit_lower" == var_name) { axis_data[axis].angular_limit_lower = Math::deg2rad(real_t(p_value)); - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_LOWER_LIMIT, axis_data[axis].angular_limit_lower); + } } else if ("angular_limit_softness" == var_name) { axis_data[axis].angular_limit_softness = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_LIMIT_SOFTNESS, axis_data[axis].angular_limit_softness); + } } else if ("angular_restitution" == var_name) { axis_data[axis].angular_restitution = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_RESTITUTION, axis_data[axis].angular_restitution); + } } else if ("angular_damping" == var_name) { axis_data[axis].angular_damping = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_DAMPING, axis_data[axis].angular_damping); + } } else if ("erp" == var_name) { axis_data[axis].erp = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_ERP, axis_data[axis].erp); + } } else if ("angular_spring_enabled" == var_name) { axis_data[axis].angular_spring_enabled = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_flag(j, axis, PhysicsServer3D::G6DOF_JOINT_FLAG_ENABLE_ANGULAR_SPRING, axis_data[axis].angular_spring_enabled); + } } else if ("angular_spring_stiffness" == var_name) { axis_data[axis].angular_spring_stiffness = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_STIFFNESS, axis_data[axis].angular_spring_stiffness); + } } else if ("angular_spring_damping" == var_name) { axis_data[axis].angular_spring_damping = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_DAMPING, axis_data[axis].angular_spring_damping); + } } else if ("angular_equilibrium_point" == var_name) { axis_data[axis].angular_equilibrium_point = p_value; - if (j.is_valid()) + if (j.is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(j, axis, PhysicsServer3D::G6DOF_JOINT_ANGULAR_SPRING_EQUILIBRIUM_POINT, axis_data[axis].angular_equilibrium_point); + } } else { return false; @@ -2015,8 +1983,9 @@ bool PhysicalBone3D::_set(const StringName &p_name, const Variant &p_value) { if (joint_data) { if (joint_data->_set(p_name, p_value)) { #ifdef TOOLS_ENABLED - if (get_gizmo().is_valid()) + if (get_gizmo().is_valid()) { get_gizmo()->redraw(); + } #endif return true; } @@ -2039,21 +2008,19 @@ bool PhysicalBone3D::_get(const StringName &p_name, Variant &r_ret) const { } void PhysicalBone3D::_get_property_list(List<PropertyInfo> *p_list) const { - Skeleton3D *parent = find_skeleton_parent(get_parent()); if (parent) { - String names; for (int i = 0; i < parent->get_bone_count(); i++) { - if (i > 0) + if (i > 0) { names += ","; + } names += parent->get_bone_name(i); } p_list->push_back(PropertyInfo(Variant::STRING_NAME, "bone_name", PROPERTY_HINT_ENUM, names)); } else { - p_list->push_back(PropertyInfo(Variant::STRING_NAME, "bone_name")); } @@ -2087,7 +2054,6 @@ void PhysicalBone3D::_notification(int p_what) { break; case NOTIFICATION_TRANSFORM_CHANGED: if (Engine::get_singleton()->is_editor_hint()) { - update_offset(); } break; @@ -2095,7 +2061,6 @@ void PhysicalBone3D::_notification(int p_what) { } void PhysicalBone3D::_direct_state_changed(Object *p_state) { - if (!simulate_physics || !_internal_simulate_physics) { return; } @@ -2225,8 +2190,9 @@ void PhysicalBone3D::_update_joint_offset() { set_ignore_transform_notification(false); #ifdef TOOLS_ENABLED - if (get_gizmo().is_valid()) + if (get_gizmo().is_valid()) { get_gizmo()->redraw(); + } #endif } @@ -2238,7 +2204,6 @@ void PhysicalBone3D::_fix_joint_offset() { } void PhysicalBone3D::_reload_joint() { - if (joint.is_valid()) { PhysicsServer3D::get_singleton()->free(joint); joint = RID(); @@ -2259,7 +2224,6 @@ void PhysicalBone3D::_reload_joint() { switch (get_joint_type()) { case JOINT_TYPE_PIN: { - joint = PhysicsServer3D::get_singleton()->joint_create_pin(body_a->get_rid(), local_a.origin, get_rid(), joint_offset.origin); const PinJointData *pjd(static_cast<const PinJointData *>(joint_data)); PhysicsServer3D::get_singleton()->pin_joint_set_param(joint, PhysicsServer3D::PIN_JOINT_BIAS, pjd->bias); @@ -2268,7 +2232,6 @@ void PhysicalBone3D::_reload_joint() { } break; case JOINT_TYPE_CONE: { - joint = PhysicsServer3D::get_singleton()->joint_create_cone_twist(body_a->get_rid(), local_a, get_rid(), joint_offset); const ConeJointData *cjd(static_cast<const ConeJointData *>(joint_data)); PhysicsServer3D::get_singleton()->cone_twist_joint_set_param(joint, PhysicsServer3D::CONE_TWIST_JOINT_SWING_SPAN, cjd->swing_span); @@ -2279,7 +2242,6 @@ void PhysicalBone3D::_reload_joint() { } break; case JOINT_TYPE_HINGE: { - joint = PhysicsServer3D::get_singleton()->joint_create_hinge(body_a->get_rid(), local_a, get_rid(), joint_offset); const HingeJointData *hjd(static_cast<const HingeJointData *>(joint_data)); PhysicsServer3D::get_singleton()->hinge_joint_set_flag(joint, PhysicsServer3D::HINGE_JOINT_FLAG_USE_LIMIT, hjd->angular_limit_enabled); @@ -2291,7 +2253,6 @@ void PhysicalBone3D::_reload_joint() { } break; case JOINT_TYPE_SLIDER: { - joint = PhysicsServer3D::get_singleton()->joint_create_slider(body_a->get_rid(), local_a, get_rid(), joint_offset); const SliderJointData *sjd(static_cast<const SliderJointData *>(joint_data)); PhysicsServer3D::get_singleton()->slider_joint_set_param(joint, PhysicsServer3D::SLIDER_JOINT_LINEAR_LIMIT_UPPER, sjd->linear_limit_upper); @@ -2307,7 +2268,6 @@ void PhysicalBone3D::_reload_joint() { } break; case JOINT_TYPE_6DOF: { - joint = PhysicsServer3D::get_singleton()->joint_create_generic_6dof(body_a->get_rid(), local_a, get_rid(), joint_offset); const SixDOFJointData *g6dofjd(static_cast<const SixDOFJointData *>(joint_data)); for (int axis = 0; axis < 3; ++axis) { @@ -2370,12 +2330,13 @@ Skeleton3D *PhysicalBone3D::find_skeleton_parent() { } void PhysicalBone3D::set_joint_type(JointType p_joint_type) { - - if (p_joint_type == get_joint_type()) + if (p_joint_type == get_joint_type()) { return; + } - if (joint_data) + if (joint_data) { memdelete(joint_data); + } joint_data = nullptr; switch (p_joint_type) { case JOINT_TYPE_PIN: @@ -2401,8 +2362,9 @@ void PhysicalBone3D::set_joint_type(JointType p_joint_type) { #ifdef TOOLS_ENABLED _change_notify(); - if (get_gizmo().is_valid()) + if (get_gizmo().is_valid()) { get_gizmo()->redraw(); + } #endif } @@ -2469,7 +2431,6 @@ bool PhysicalBone3D::is_simulating_physics() { } void PhysicalBone3D::set_bone_name(const String &p_name) { - bone_name = p_name; bone_id = -1; @@ -2478,34 +2439,28 @@ void PhysicalBone3D::set_bone_name(const String &p_name) { } const String &PhysicalBone3D::get_bone_name() const { - return bone_name; } void PhysicalBone3D::set_mass(real_t p_mass) { - ERR_FAIL_COND(p_mass <= 0); mass = p_mass; PhysicsServer3D::get_singleton()->body_set_param(get_rid(), PhysicsServer3D::BODY_PARAM_MASS, mass); } real_t PhysicalBone3D::get_mass() const { - return mass; } void PhysicalBone3D::set_weight(real_t p_weight) { - set_mass(p_weight / real_t(GLOBAL_DEF("physics/3d/default_gravity", 9.8))); } real_t PhysicalBone3D::get_weight() const { - return mass * real_t(GLOBAL_DEF("physics/3d/default_gravity", 9.8)); } void PhysicalBone3D::set_friction(real_t p_friction) { - ERR_FAIL_COND(p_friction < 0 || p_friction > 1); friction = p_friction; @@ -2513,12 +2468,10 @@ void PhysicalBone3D::set_friction(real_t p_friction) { } real_t PhysicalBone3D::get_friction() const { - return friction; } void PhysicalBone3D::set_bounce(real_t p_bounce) { - ERR_FAIL_COND(p_bounce < 0 || p_bounce > 1); bounce = p_bounce; @@ -2526,18 +2479,15 @@ void PhysicalBone3D::set_bounce(real_t p_bounce) { } real_t PhysicalBone3D::get_bounce() const { - return bounce; } void PhysicalBone3D::set_gravity_scale(real_t p_gravity_scale) { - gravity_scale = p_gravity_scale; PhysicsServer3D::get_singleton()->body_set_param(get_rid(), PhysicsServer3D::BODY_PARAM_GRAVITY_SCALE, gravity_scale); } real_t PhysicalBone3D::get_gravity_scale() const { - return gravity_scale; } @@ -2584,8 +2534,9 @@ PhysicalBone3D::PhysicalBone3D() : } PhysicalBone3D::~PhysicalBone3D() { - if (joint_data) + if (joint_data) { memdelete(joint_data); + } } void PhysicalBone3D::update_bone_id() { @@ -2614,10 +2565,10 @@ void PhysicalBone3D::update_bone_id() { void PhysicalBone3D::update_offset() { #ifdef TOOLS_ENABLED if (parent_skeleton) { - Transform bone_transform(parent_skeleton->get_global_transform()); - if (-1 != bone_id) + if (-1 != bone_id) { bone_transform *= parent_skeleton->get_bone_global_pose(bone_id); + } if (gizmo_move_joint) { bone_transform *= body_offset; diff --git a/scene/3d/physics_body_3d.h b/scene/3d/physics_body_3d.h index 205052f798..4c58c73942 100644 --- a/scene/3d/physics_body_3d.h +++ b/scene/3d/physics_body_3d.h @@ -38,7 +38,6 @@ #include "skeleton_3d.h" class PhysicsBody3D : public CollisionObject3D { - GDCLASS(PhysicsBody3D, CollisionObject3D); uint32_t collision_layer; @@ -76,7 +75,6 @@ public: }; class StaticBody3D : public PhysicsBody3D { - GDCLASS(StaticBody3D, PhysicsBody3D); Vector3 constant_linear_velocity; @@ -105,7 +103,6 @@ private: }; class RigidBody3D : public PhysicsBody3D { - GDCLASS(RigidBody3D, PhysicsBody3D); public: @@ -138,15 +135,15 @@ protected: bool custom_integrator; struct ShapePair { - int body_shape; int local_shape; bool tagged; bool operator<(const ShapePair &p_sp) const { - if (body_shape == p_sp.body_shape) + if (body_shape == p_sp.body_shape) { return local_shape < p_sp.local_shape; - else + } else { return body_shape < p_sp.body_shape; + } } ShapePair() {} @@ -157,19 +154,16 @@ protected: } }; struct RigidBody3D_RemoveAction { - ObjectID body_id; ShapePair pair; }; struct BodyState { - //int rc; bool in_tree; VSet<ShapePair> shapes; }; struct ContactMonitor { - bool locked; Map<ObjectID, BodyState> body_map; }; @@ -261,7 +255,6 @@ VARIANT_ENUM_CAST(RigidBody3D::Mode); class KinematicCollision3D; class KinematicBody3D : public PhysicsBody3D { - GDCLASS(KinematicBody3D, PhysicsBody3D); public: @@ -338,7 +331,6 @@ public: }; class KinematicCollision3D : public Reference { - GDCLASS(KinematicCollision3D, Reference); KinematicBody3D *owner; @@ -365,7 +357,6 @@ public: }; class PhysicalBone3D : public PhysicsBody3D { - GDCLASS(PhysicalBone3D, PhysicsBody3D); public: diff --git a/scene/3d/physics_joint_3d.cpp b/scene/3d/physics_joint_3d.cpp index b6953fafac..af4d6ae152 100644 --- a/scene/3d/physics_joint_3d.cpp +++ b/scene/3d/physics_joint_3d.cpp @@ -31,10 +31,10 @@ #include "physics_joint_3d.h" void Joint3D::_update_joint(bool p_only_free) { - if (joint.is_valid()) { - if (ba.is_valid() && bb.is_valid()) + if (ba.is_valid() && bb.is_valid()) { PhysicsServer3D::get_singleton()->body_remove_collision_exception(ba, bb); + } PhysicsServer3D::get_singleton()->free(joint); joint = RID(); @@ -42,8 +42,9 @@ void Joint3D::_update_joint(bool p_only_free) { bb = RID(); } - if (p_only_free || !is_inside_tree()) + if (p_only_free || !is_inside_tree()) { return; + } Node *node_a = has_node(get_node_a()) ? get_node(get_node_a()) : (Node *)nullptr; Node *node_b = has_node(get_node_b()) ? get_node(get_node_b()) : (Node *)nullptr; @@ -51,68 +52,68 @@ void Joint3D::_update_joint(bool p_only_free) { PhysicsBody3D *body_a = Object::cast_to<PhysicsBody3D>(node_a); PhysicsBody3D *body_b = Object::cast_to<PhysicsBody3D>(node_b); - if (!body_a && body_b) + if (!body_a && body_b) { SWAP(body_a, body_b); + } - if (!body_a) + if (!body_a) { return; + } joint = _configure_joint(body_a, body_b); - if (!joint.is_valid()) + if (!joint.is_valid()) { return; + } PhysicsServer3D::get_singleton()->joint_set_solver_priority(joint, solver_priority); ba = body_a->get_rid(); - if (body_b) + if (body_b) { bb = body_b->get_rid(); + } PhysicsServer3D::get_singleton()->joint_disable_collisions_between_bodies(joint, exclude_from_collision); } void Joint3D::set_node_a(const NodePath &p_node_a) { - - if (a == p_node_a) + if (a == p_node_a) { return; + } a = p_node_a; _update_joint(); } NodePath Joint3D::get_node_a() const { - return a; } void Joint3D::set_node_b(const NodePath &p_node_b) { - - if (b == p_node_b) + if (b == p_node_b) { return; + } b = p_node_b; _update_joint(); } -NodePath Joint3D::get_node_b() const { +NodePath Joint3D::get_node_b() const { return b; } void Joint3D::set_solver_priority(int p_priority) { - solver_priority = p_priority; - if (joint.is_valid()) + if (joint.is_valid()) { PhysicsServer3D::get_singleton()->joint_set_solver_priority(joint, solver_priority); + } } int Joint3D::get_solver_priority() const { - return solver_priority; } void Joint3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_READY: { _update_joint(); } break; @@ -125,20 +126,18 @@ void Joint3D::_notification(int p_what) { } void Joint3D::set_exclude_nodes_from_collision(bool p_enable) { - - if (exclude_from_collision == p_enable) + if (exclude_from_collision == p_enable) { return; + } exclude_from_collision = p_enable; _update_joint(); } bool Joint3D::get_exclude_nodes_from_collision() const { - return exclude_from_collision; } void Joint3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_node_a", "node"), &Joint3D::set_node_a); ClassDB::bind_method(D_METHOD("get_node_a"), &Joint3D::get_node_a); @@ -159,7 +158,6 @@ void Joint3D::_bind_methods() { } Joint3D::Joint3D() { - exclude_from_collision = true; solver_priority = 1; set_notify_transform(true); @@ -168,7 +166,6 @@ Joint3D::Joint3D() { /////////////////////////////////// void PinJoint3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_param", "param", "value"), &PinJoint3D::set_param); ClassDB::bind_method(D_METHOD("get_param", "param"), &PinJoint3D::get_param); @@ -182,28 +179,28 @@ void PinJoint3D::_bind_methods() { } void PinJoint3D::set_param(Param p_param, float p_value) { - ERR_FAIL_INDEX(p_param, 3); params[p_param] = p_value; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->pin_joint_set_param(get_joint(), PhysicsServer3D::PinJointParam(p_param), p_value); + } } -float PinJoint3D::get_param(Param p_param) const { +float PinJoint3D::get_param(Param p_param) const { ERR_FAIL_INDEX_V(p_param, 3, 0); return params[p_param]; } RID PinJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *body_b) { - Vector3 pinpos = get_global_transform().origin; Vector3 local_a = body_a->get_global_transform().affine_inverse().xform(pinpos); Vector3 local_b; - if (body_b) + if (body_b) { local_b = body_b->get_global_transform().affine_inverse().xform(pinpos); - else + } else { local_b = pinpos; + } RID j = PhysicsServer3D::get_singleton()->joint_create_pin(body_a->get_rid(), local_a, body_b ? body_b->get_rid() : RID(), local_b); for (int i = 0; i < 3; i++) { @@ -213,7 +210,6 @@ RID PinJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *body_b) { } PinJoint3D::PinJoint3D() { - params[PARAM_BIAS] = 0.3; params[PARAM_DAMPING] = 1; params[PARAM_IMPULSE_CLAMP] = 0; @@ -224,27 +220,22 @@ PinJoint3D::PinJoint3D() { /////////////////////////////////// void HingeJoint3D::_set_upper_limit(float p_limit) { - set_param(PARAM_LIMIT_UPPER, Math::deg2rad(p_limit)); } float HingeJoint3D::_get_upper_limit() const { - return Math::rad2deg(get_param(PARAM_LIMIT_UPPER)); } void HingeJoint3D::_set_lower_limit(float p_limit) { - set_param(PARAM_LIMIT_LOWER, Math::deg2rad(p_limit)); } float HingeJoint3D::_get_lower_limit() const { - return Math::rad2deg(get_param(PARAM_LIMIT_LOWER)); } void HingeJoint3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_param", "param", "value"), &HingeJoint3D::set_param); ClassDB::bind_method(D_METHOD("get_param", "param"), &HingeJoint3D::get_param); @@ -286,37 +277,36 @@ void HingeJoint3D::_bind_methods() { } void HingeJoint3D::set_param(Param p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); params[p_param] = p_value; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->hinge_joint_set_param(get_joint(), PhysicsServer3D::HingeJointParam(p_param), p_value); + } update_gizmo(); } -float HingeJoint3D::get_param(Param p_param) const { +float HingeJoint3D::get_param(Param p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return params[p_param]; } void HingeJoint3D::set_flag(Flag p_flag, bool p_value) { - ERR_FAIL_INDEX(p_flag, FLAG_MAX); flags[p_flag] = p_value; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->hinge_joint_set_flag(get_joint(), PhysicsServer3D::HingeJointFlag(p_flag), p_value); + } update_gizmo(); } -bool HingeJoint3D::get_flag(Flag p_flag) const { +bool HingeJoint3D::get_flag(Flag p_flag) const { ERR_FAIL_INDEX_V(p_flag, FLAG_MAX, false); return flags[p_flag]; } RID HingeJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *body_b) { - Transform gt = get_global_transform(); Transform ainv = body_a->get_global_transform().affine_inverse(); @@ -343,7 +333,6 @@ RID HingeJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *body_b) } HingeJoint3D::HingeJoint3D() { - params[PARAM_BIAS] = 0.3; params[PARAM_LIMIT_UPPER] = Math_PI * 0.5; params[PARAM_LIMIT_LOWER] = -Math_PI * 0.5; @@ -362,27 +351,22 @@ HingeJoint3D::HingeJoint3D() { ////////////////////////////////// void SliderJoint3D::_set_upper_limit_angular(float p_limit_angular) { - set_param(PARAM_ANGULAR_LIMIT_UPPER, Math::deg2rad(p_limit_angular)); } float SliderJoint3D::_get_upper_limit_angular() const { - return Math::rad2deg(get_param(PARAM_ANGULAR_LIMIT_UPPER)); } void SliderJoint3D::_set_lower_limit_angular(float p_limit_angular) { - set_param(PARAM_ANGULAR_LIMIT_LOWER, Math::deg2rad(p_limit_angular)); } float SliderJoint3D::_get_lower_limit_angular() const { - return Math::rad2deg(get_param(PARAM_ANGULAR_LIMIT_LOWER)); } void SliderJoint3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_param", "param", "value"), &SliderJoint3D::set_param); ClassDB::bind_method(D_METHOD("get_param", "param"), &SliderJoint3D::get_param); @@ -444,21 +428,20 @@ void SliderJoint3D::_bind_methods() { } void SliderJoint3D::set_param(Param p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); params[p_param] = p_value; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->slider_joint_set_param(get_joint(), PhysicsServer3D::SliderJointParam(p_param), p_value); + } update_gizmo(); } -float SliderJoint3D::get_param(Param p_param) const { +float SliderJoint3D::get_param(Param p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return params[p_param]; } RID SliderJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *body_b) { - Transform gt = get_global_transform(); Transform ainv = body_a->get_global_transform().affine_inverse(); @@ -482,7 +465,6 @@ RID SliderJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *body_b } SliderJoint3D::SliderJoint3D() { - params[PARAM_LINEAR_LIMIT_UPPER] = 1.0; params[PARAM_LINEAR_LIMIT_LOWER] = -1.0; params[PARAM_LINEAR_LIMIT_SOFTNESS] = 1.0; @@ -511,27 +493,22 @@ SliderJoint3D::SliderJoint3D() { ////////////////////////////////// void ConeTwistJoint3D::_set_swing_span(float p_limit_angular) { - set_param(PARAM_SWING_SPAN, Math::deg2rad(p_limit_angular)); } float ConeTwistJoint3D::_get_swing_span() const { - return Math::rad2deg(get_param(PARAM_SWING_SPAN)); } void ConeTwistJoint3D::_set_twist_span(float p_limit_angular) { - set_param(PARAM_TWIST_SPAN, Math::deg2rad(p_limit_angular)); } float ConeTwistJoint3D::_get_twist_span() const { - return Math::rad2deg(get_param(PARAM_TWIST_SPAN)); } void ConeTwistJoint3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_param", "param", "value"), &ConeTwistJoint3D::set_param); ClassDB::bind_method(D_METHOD("get_param", "param"), &ConeTwistJoint3D::get_param); @@ -557,22 +534,21 @@ void ConeTwistJoint3D::_bind_methods() { } void ConeTwistJoint3D::set_param(Param p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); params[p_param] = p_value; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->cone_twist_joint_set_param(get_joint(), PhysicsServer3D::ConeTwistJointParam(p_param), p_value); + } update_gizmo(); } -float ConeTwistJoint3D::get_param(Param p_param) const { +float ConeTwistJoint3D::get_param(Param p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return params[p_param]; } RID ConeTwistJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *body_b) { - Transform gt = get_global_transform(); //Vector3 cone_twistpos = gt.origin; //Vector3 cone_twistdir = gt.basis.get_axis(2); @@ -599,7 +575,6 @@ RID ConeTwistJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *bod } ConeTwistJoint3D::ConeTwistJoint3D() { - params[PARAM_SWING_SPAN] = Math_PI * 0.25; params[PARAM_TWIST_SPAN] = Math_PI; params[PARAM_BIAS] = 0.3; @@ -610,67 +585,54 @@ ConeTwistJoint3D::ConeTwistJoint3D() { ///////////////////////////////////////////////////////////////////// void Generic6DOFJoint3D::_set_angular_hi_limit_x(float p_limit_angular) { - set_param_x(PARAM_ANGULAR_UPPER_LIMIT, Math::deg2rad(p_limit_angular)); } float Generic6DOFJoint3D::_get_angular_hi_limit_x() const { - return Math::rad2deg(get_param_x(PARAM_ANGULAR_UPPER_LIMIT)); } void Generic6DOFJoint3D::_set_angular_lo_limit_x(float p_limit_angular) { - set_param_x(PARAM_ANGULAR_LOWER_LIMIT, Math::deg2rad(p_limit_angular)); } float Generic6DOFJoint3D::_get_angular_lo_limit_x() const { - return Math::rad2deg(get_param_x(PARAM_ANGULAR_LOWER_LIMIT)); } void Generic6DOFJoint3D::_set_angular_hi_limit_y(float p_limit_angular) { - set_param_y(PARAM_ANGULAR_UPPER_LIMIT, Math::deg2rad(p_limit_angular)); } float Generic6DOFJoint3D::_get_angular_hi_limit_y() const { - return Math::rad2deg(get_param_y(PARAM_ANGULAR_UPPER_LIMIT)); } void Generic6DOFJoint3D::_set_angular_lo_limit_y(float p_limit_angular) { - set_param_y(PARAM_ANGULAR_LOWER_LIMIT, Math::deg2rad(p_limit_angular)); } float Generic6DOFJoint3D::_get_angular_lo_limit_y() const { - return Math::rad2deg(get_param_y(PARAM_ANGULAR_LOWER_LIMIT)); } void Generic6DOFJoint3D::_set_angular_hi_limit_z(float p_limit_angular) { - set_param_z(PARAM_ANGULAR_UPPER_LIMIT, Math::deg2rad(p_limit_angular)); } float Generic6DOFJoint3D::_get_angular_hi_limit_z() const { - return Math::rad2deg(get_param_z(PARAM_ANGULAR_UPPER_LIMIT)); } void Generic6DOFJoint3D::_set_angular_lo_limit_z(float p_limit_angular) { - set_param_z(PARAM_ANGULAR_LOWER_LIMIT, Math::deg2rad(p_limit_angular)); } float Generic6DOFJoint3D::_get_angular_lo_limit_z() const { - return Math::rad2deg(get_param_z(PARAM_ANGULAR_LOWER_LIMIT)); } void Generic6DOFJoint3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("_set_angular_hi_limit_x", "angle"), &Generic6DOFJoint3D::_set_angular_hi_limit_x); ClassDB::bind_method(D_METHOD("_get_angular_hi_limit_x"), &Generic6DOFJoint3D::_get_angular_hi_limit_x); @@ -834,86 +796,86 @@ void Generic6DOFJoint3D::_bind_methods() { } void Generic6DOFJoint3D::set_param_x(Param p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); params_x[p_param] = p_value; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(get_joint(), Vector3::AXIS_X, PhysicsServer3D::G6DOFJointAxisParam(p_param), p_value); + } update_gizmo(); } -float Generic6DOFJoint3D::get_param_x(Param p_param) const { +float Generic6DOFJoint3D::get_param_x(Param p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return params_x[p_param]; } void Generic6DOFJoint3D::set_param_y(Param p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); params_y[p_param] = p_value; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(get_joint(), Vector3::AXIS_Y, PhysicsServer3D::G6DOFJointAxisParam(p_param), p_value); + } update_gizmo(); } -float Generic6DOFJoint3D::get_param_y(Param p_param) const { +float Generic6DOFJoint3D::get_param_y(Param p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return params_y[p_param]; } void Generic6DOFJoint3D::set_param_z(Param p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); params_z[p_param] = p_value; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_param(get_joint(), Vector3::AXIS_Z, PhysicsServer3D::G6DOFJointAxisParam(p_param), p_value); + } update_gizmo(); } -float Generic6DOFJoint3D::get_param_z(Param p_param) const { +float Generic6DOFJoint3D::get_param_z(Param p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return params_z[p_param]; } void Generic6DOFJoint3D::set_flag_x(Flag p_flag, bool p_enabled) { - ERR_FAIL_INDEX(p_flag, FLAG_MAX); flags_x[p_flag] = p_enabled; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_flag(get_joint(), Vector3::AXIS_X, PhysicsServer3D::G6DOFJointAxisFlag(p_flag), p_enabled); + } update_gizmo(); } -bool Generic6DOFJoint3D::get_flag_x(Flag p_flag) const { +bool Generic6DOFJoint3D::get_flag_x(Flag p_flag) const { ERR_FAIL_INDEX_V(p_flag, FLAG_MAX, false); return flags_x[p_flag]; } void Generic6DOFJoint3D::set_flag_y(Flag p_flag, bool p_enabled) { - ERR_FAIL_INDEX(p_flag, FLAG_MAX); flags_y[p_flag] = p_enabled; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_flag(get_joint(), Vector3::AXIS_Y, PhysicsServer3D::G6DOFJointAxisFlag(p_flag), p_enabled); + } update_gizmo(); } -bool Generic6DOFJoint3D::get_flag_y(Flag p_flag) const { +bool Generic6DOFJoint3D::get_flag_y(Flag p_flag) const { ERR_FAIL_INDEX_V(p_flag, FLAG_MAX, false); return flags_y[p_flag]; } void Generic6DOFJoint3D::set_flag_z(Flag p_flag, bool p_enabled) { - ERR_FAIL_INDEX(p_flag, FLAG_MAX); flags_z[p_flag] = p_enabled; - if (get_joint().is_valid()) + if (get_joint().is_valid()) { PhysicsServer3D::get_singleton()->generic_6dof_joint_set_flag(get_joint(), Vector3::AXIS_Z, PhysicsServer3D::G6DOFJointAxisFlag(p_flag), p_enabled); + } update_gizmo(); } -bool Generic6DOFJoint3D::get_flag_z(Flag p_flag) const { +bool Generic6DOFJoint3D::get_flag_z(Flag p_flag) const { ERR_FAIL_INDEX_V(p_flag, FLAG_MAX, false); return flags_z[p_flag]; } @@ -927,7 +889,6 @@ void Generic6DOFJoint3D::set_precision(int p_precision) { } RID Generic6DOFJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *body_b) { - Transform gt = get_global_transform(); //Vector3 cone_twistpos = gt.origin; //Vector3 cone_twistdir = gt.basis.get_axis(2); @@ -961,7 +922,6 @@ RID Generic6DOFJoint3D::_configure_joint(PhysicsBody3D *body_a, PhysicsBody3D *b } Generic6DOFJoint3D::Generic6DOFJoint3D() { - set_param_x(PARAM_LINEAR_LOWER_LIMIT, 0); set_param_x(PARAM_LINEAR_UPPER_LIMIT, 0); set_param_x(PARAM_LINEAR_LIMIT_SOFTNESS, 0.7); diff --git a/scene/3d/physics_joint_3d.h b/scene/3d/physics_joint_3d.h index 38a3f314ba..a3225ab01c 100644 --- a/scene/3d/physics_joint_3d.h +++ b/scene/3d/physics_joint_3d.h @@ -35,7 +35,6 @@ #include "scene/3d/physics_body_3d.h" class Joint3D : public Node3D { - GDCLASS(Joint3D, Node3D); RID ba, bb; @@ -77,7 +76,6 @@ public: /////////////////////////////////////////// class PinJoint3D : public Joint3D { - GDCLASS(PinJoint3D, Joint3D); public: @@ -102,7 +100,6 @@ public: VARIANT_ENUM_CAST(PinJoint3D::Param); class HingeJoint3D : public Joint3D { - GDCLASS(HingeJoint3D, Joint3D); public: @@ -150,7 +147,6 @@ VARIANT_ENUM_CAST(HingeJoint3D::Param); VARIANT_ENUM_CAST(HingeJoint3D::Flag); class SliderJoint3D : public Joint3D { - GDCLASS(SliderJoint3D, Joint3D); public: @@ -203,7 +199,6 @@ public: VARIANT_ENUM_CAST(SliderJoint3D::Param); class ConeTwistJoint3D : public Joint3D { - GDCLASS(ConeTwistJoint3D, Joint3D); public: @@ -238,7 +233,6 @@ public: VARIANT_ENUM_CAST(ConeTwistJoint3D::Param); class Generic6DOFJoint3D : public Joint3D { - GDCLASS(Generic6DOFJoint3D, Joint3D); public: diff --git a/scene/3d/position_3d.h b/scene/3d/position_3d.h index 9c806723fb..1c5f05ef95 100644 --- a/scene/3d/position_3d.h +++ b/scene/3d/position_3d.h @@ -34,7 +34,6 @@ #include "scene/3d/node_3d.h" class Position3D : public Node3D { - GDCLASS(Position3D, Node3D); public: diff --git a/scene/3d/proximity_group_3d.cpp b/scene/3d/proximity_group_3d.cpp index 44ffabb655..cdc88abf4c 100644 --- a/scene/3d/proximity_group_3d.cpp +++ b/scene/3d/proximity_group_3d.cpp @@ -33,7 +33,6 @@ #include "core/math/math_funcs.h" void ProximityGroup3D::clear_groups() { - Map<StringName, uint32_t>::Element *E; { @@ -42,7 +41,6 @@ void ProximityGroup3D::clear_groups() { E = groups.front(); int num = 0; while (E && num < size) { - if (E->get() != group_version) { remove_list[num++] = E->key(); }; @@ -50,7 +48,6 @@ void ProximityGroup3D::clear_groups() { E = E->next(); }; for (int i = 0; i < num; i++) { - groups.erase(remove_list[i]); }; }; @@ -61,9 +58,9 @@ void ProximityGroup3D::clear_groups() { }; void ProximityGroup3D::update_groups() { - - if (grid_radius == Vector3(0, 0, 0)) + if (grid_radius == Vector3(0, 0, 0)) { return; + } ++group_version; @@ -77,10 +74,8 @@ void ProximityGroup3D::update_groups() { }; void ProximityGroup3D::add_groups(int *p_cell, String p_base, int p_depth) { - p_base = p_base + "|"; if (grid_radius[p_depth] == 0) { - if (p_depth == 2) { _new_group(p_base); } else { @@ -92,7 +87,6 @@ void ProximityGroup3D::add_groups(int *p_cell, String p_base, int p_depth) { int end = p_cell[p_depth] + grid_radius[p_depth]; for (int i = start; i <= end; i++) { - String gname = p_base + itos(i); if (p_depth == 2) { _new_group(gname); @@ -103,7 +97,6 @@ void ProximityGroup3D::add_groups(int *p_cell, String p_base, int p_depth) { }; void ProximityGroup3D::_new_group(StringName p_name) { - const Map<StringName, uint32_t>::Element *E = groups.find(p_name); if (!E) { add_to_group(p_name); @@ -113,9 +106,7 @@ void ProximityGroup3D::_new_group(StringName p_name) { }; void ProximityGroup3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_EXIT_TREE: ++group_version; clear_groups(); @@ -127,59 +118,47 @@ void ProximityGroup3D::_notification(int p_what) { }; void ProximityGroup3D::broadcast(String p_name, Variant p_params) { - Map<StringName, uint32_t>::Element *E; E = groups.front(); while (E) { - get_tree()->call_group_flags(SceneTree::GROUP_CALL_DEFAULT, E->key(), "_proximity_group_broadcast", p_name, p_params); E = E->next(); }; }; void ProximityGroup3D::_proximity_group_broadcast(String p_name, Variant p_params) { - if (dispatch_mode == MODE_PROXY) { - get_parent()->call(p_name, p_params); } else { - emit_signal("broadcast", p_name, p_params); }; }; void ProximityGroup3D::set_group_name(const String &p_group_name) { - group_name = p_group_name; }; String ProximityGroup3D::get_group_name() const { - return group_name; }; void ProximityGroup3D::set_dispatch_mode(DispatchMode p_mode) { - dispatch_mode = p_mode; }; ProximityGroup3D::DispatchMode ProximityGroup3D::get_dispatch_mode() const { - return dispatch_mode; }; void ProximityGroup3D::set_grid_radius(const Vector3 &p_radius) { - grid_radius = p_radius; }; Vector3 ProximityGroup3D::get_grid_radius() const { - return grid_radius; }; void ProximityGroup3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_group_name", "name"), &ProximityGroup3D::set_group_name); ClassDB::bind_method(D_METHOD("get_group_name"), &ProximityGroup3D::get_group_name); ClassDB::bind_method(D_METHOD("set_dispatch_mode", "mode"), &ProximityGroup3D::set_dispatch_mode); @@ -200,7 +179,6 @@ void ProximityGroup3D::_bind_methods() { }; ProximityGroup3D::ProximityGroup3D() { - group_version = 0; dispatch_mode = MODE_PROXY; diff --git a/scene/3d/proximity_group_3d.h b/scene/3d/proximity_group_3d.h index 751bfbdb52..780c65e92b 100644 --- a/scene/3d/proximity_group_3d.h +++ b/scene/3d/proximity_group_3d.h @@ -34,7 +34,6 @@ #include "node_3d.h" class ProximityGroup3D : public Node3D { - GDCLASS(ProximityGroup3D, Node3D); OBJ_CATEGORY("3D"); diff --git a/scene/3d/ray_cast_3d.cpp b/scene/3d/ray_cast_3d.cpp index 304a5e1254..68f4b3132c 100644 --- a/scene/3d/ray_cast_3d.cpp +++ b/scene/3d/ray_cast_3d.cpp @@ -36,151 +36,149 @@ #include "servers/physics_server_3d.h" void RayCast3D::set_cast_to(const Vector3 &p_point) { - cast_to = p_point; - if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_collisions_hint())) + if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_collisions_hint())) { update_gizmo(); - if (is_inside_tree() && get_tree()->is_debugging_collisions_hint()) + } + if (is_inside_tree() && get_tree()->is_debugging_collisions_hint()) { _update_debug_shape(); + } } Vector3 RayCast3D::get_cast_to() const { - return cast_to; } void RayCast3D::set_collision_mask(uint32_t p_mask) { - collision_mask = p_mask; } uint32_t RayCast3D::get_collision_mask() const { - return collision_mask; } void RayCast3D::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } bool RayCast3D::get_collision_mask_bit(int p_bit) const { - return get_collision_mask() & (1 << p_bit); } bool RayCast3D::is_colliding() const { - return collided; } -Object *RayCast3D::get_collider() const { - if (against.is_null()) +Object *RayCast3D::get_collider() const { + if (against.is_null()) { return nullptr; + } return ObjectDB::get_instance(against); } int RayCast3D::get_collider_shape() const { - return against_shape; } -Vector3 RayCast3D::get_collision_point() const { +Vector3 RayCast3D::get_collision_point() const { return collision_point; } -Vector3 RayCast3D::get_collision_normal() const { +Vector3 RayCast3D::get_collision_normal() const { return collision_normal; } void RayCast3D::set_enabled(bool p_enabled) { - enabled = p_enabled; update_gizmo(); - if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) + if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) { set_physics_process_internal(p_enabled); - if (!p_enabled) + } + if (!p_enabled) { collided = false; + } if (is_inside_tree() && get_tree()->is_debugging_collisions_hint()) { - if (p_enabled) + if (p_enabled) { _update_debug_shape(); - else + } else { _clear_debug_shape(); + } } } bool RayCast3D::is_enabled() const { - return enabled; } void RayCast3D::set_exclude_parent_body(bool p_exclude_parent_body) { - - if (exclude_parent_body == p_exclude_parent_body) + if (exclude_parent_body == p_exclude_parent_body) { return; + } exclude_parent_body = p_exclude_parent_body; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (Object::cast_to<CollisionObject3D>(get_parent())) { - if (exclude_parent_body) + if (exclude_parent_body) { exclude.insert(Object::cast_to<CollisionObject3D>(get_parent())->get_rid()); - else + } else { exclude.erase(Object::cast_to<CollisionObject3D>(get_parent())->get_rid()); + } } } bool RayCast3D::get_exclude_parent_body() const { - return exclude_parent_body; } void RayCast3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - if (enabled && !Engine::get_singleton()->is_editor_hint()) { set_physics_process_internal(true); - if (get_tree()->is_debugging_collisions_hint()) + if (get_tree()->is_debugging_collisions_hint()) { _update_debug_shape(); - } else + } + } else { set_physics_process_internal(false); + } if (Object::cast_to<CollisionObject3D>(get_parent())) { - if (exclude_parent_body) + if (exclude_parent_body) { exclude.insert(Object::cast_to<CollisionObject3D>(get_parent())->get_rid()); - else + } else { exclude.erase(Object::cast_to<CollisionObject3D>(get_parent())->get_rid()); + } } } break; case NOTIFICATION_EXIT_TREE: { - if (enabled) { set_physics_process_internal(false); } - if (debug_shape) + if (debug_shape) { _clear_debug_shape(); + } } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { - - if (!enabled) + if (!enabled) { break; + } bool prev_collision_state = collided; _update_raycast_state(); @@ -205,13 +203,13 @@ void RayCast3D::_update_raycast_state() { Transform gt = get_global_transform(); Vector3 to = cast_to; - if (to == Vector3()) + if (to == Vector3()) { to = Vector3(0, 0.01, 0); + } PhysicsDirectSpaceState3D::RayResult rr; if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, collide_with_bodies, collide_with_areas)) { - collided = true; against = rr.collider_id; collision_point = rr.position; @@ -229,60 +227,52 @@ void RayCast3D::force_raycast_update() { } void RayCast3D::add_exception_rid(const RID &p_rid) { - exclude.insert(p_rid); } void RayCast3D::add_exception(const Object *p_object) { - ERR_FAIL_NULL(p_object); const CollisionObject3D *co = Object::cast_to<CollisionObject3D>(p_object); - if (!co) + if (!co) { return; + } add_exception_rid(co->get_rid()); } void RayCast3D::remove_exception_rid(const RID &p_rid) { - exclude.erase(p_rid); } void RayCast3D::remove_exception(const Object *p_object) { - ERR_FAIL_NULL(p_object); const CollisionObject3D *co = Object::cast_to<CollisionObject3D>(p_object); - if (!co) + if (!co) { return; + } remove_exception_rid(co->get_rid()); } void RayCast3D::clear_exceptions() { - exclude.clear(); } void RayCast3D::set_collide_with_areas(bool p_clip) { - collide_with_areas = p_clip; } bool RayCast3D::is_collide_with_areas_enabled() const { - return collide_with_areas; } void RayCast3D::set_collide_with_bodies(bool p_clip) { - collide_with_bodies = p_clip; } bool RayCast3D::is_collide_with_bodies_enabled() const { - return collide_with_bodies; } void RayCast3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &RayCast3D::set_enabled); ClassDB::bind_method(D_METHOD("is_enabled"), &RayCast3D::is_enabled); @@ -331,7 +321,6 @@ void RayCast3D::_bind_methods() { } void RayCast3D::_create_debug_shape() { - if (!debug_material.is_valid()) { debug_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); @@ -350,16 +339,18 @@ void RayCast3D::_create_debug_shape() { } void RayCast3D::_update_debug_shape() { - - if (!enabled) + if (!enabled) { return; + } - if (!debug_shape) + if (!debug_shape) { _create_debug_shape(); + } MeshInstance3D *mi = static_cast<MeshInstance3D *>(debug_shape); - if (!mi->get_mesh().is_valid()) + if (!mi->get_mesh().is_valid()) { return; + } Ref<ArrayMesh> mesh = mi->get_mesh(); mesh->clear_surfaces(); @@ -377,21 +368,21 @@ void RayCast3D::_update_debug_shape() { } void RayCast3D::_clear_debug_shape() { - - if (!debug_shape) + if (!debug_shape) { return; + } MeshInstance3D *mi = static_cast<MeshInstance3D *>(debug_shape); - if (mi->is_inside_tree()) + if (mi->is_inside_tree()) { mi->queue_delete(); - else + } else { memdelete(mi); + } debug_shape = nullptr; } RayCast3D::RayCast3D() { - enabled = false; collided = false; diff --git a/scene/3d/ray_cast_3d.h b/scene/3d/ray_cast_3d.h index f8bfb7846a..8f617e5491 100644 --- a/scene/3d/ray_cast_3d.h +++ b/scene/3d/ray_cast_3d.h @@ -34,7 +34,6 @@ #include "scene/3d/node_3d.h" class RayCast3D : public Node3D { - GDCLASS(RayCast3D, Node3D); bool enabled; diff --git a/scene/3d/reflection_probe.cpp b/scene/3d/reflection_probe.cpp index 24bf8b43d1..b1f19053d9 100644 --- a/scene/3d/reflection_probe.cpp +++ b/scene/3d/reflection_probe.cpp @@ -31,18 +31,15 @@ #include "reflection_probe.h" void ReflectionProbe::set_intensity(float p_intensity) { - intensity = p_intensity; RS::get_singleton()->reflection_probe_set_intensity(probe, p_intensity); } float ReflectionProbe::get_intensity() const { - return intensity; } void ReflectionProbe::set_interior_ambient(Color p_ambient) { - interior_ambient = p_ambient; RS::get_singleton()->reflection_probe_set_interior_ambient(probe, p_ambient); } @@ -57,33 +54,28 @@ float ReflectionProbe::get_interior_ambient_energy() const { } Color ReflectionProbe::get_interior_ambient() const { - return interior_ambient; } void ReflectionProbe::set_interior_ambient_probe_contribution(float p_contribution) { - interior_ambient_probe_contribution = p_contribution; RS::get_singleton()->reflection_probe_set_interior_ambient_probe_contribution(probe, p_contribution); } float ReflectionProbe::get_interior_ambient_probe_contribution() const { - return interior_ambient_probe_contribution; } void ReflectionProbe::set_max_distance(float p_distance) { - max_distance = p_distance; RS::get_singleton()->reflection_probe_set_max_distance(probe, p_distance); } -float ReflectionProbe::get_max_distance() const { +float ReflectionProbe::get_max_distance() const { return max_distance; } void ReflectionProbe::set_extents(const Vector3 &p_extents) { - extents = p_extents; for (int i = 0; i < 3; i++) { @@ -102,17 +94,15 @@ void ReflectionProbe::set_extents(const Vector3 &p_extents) { _change_notify("extents"); update_gizmo(); } -Vector3 ReflectionProbe::get_extents() const { +Vector3 ReflectionProbe::get_extents() const { return extents; } void ReflectionProbe::set_origin_offset(const Vector3 &p_extents) { - origin_offset = p_extents; for (int i = 0; i < 3; i++) { - if (extents[i] - 0.01 < ABS(origin_offset[i])) { origin_offset[i] = SGN(origin_offset[i]) * (extents[i] - 0.01); } @@ -123,50 +113,45 @@ void ReflectionProbe::set_origin_offset(const Vector3 &p_extents) { _change_notify("origin_offset"); update_gizmo(); } -Vector3 ReflectionProbe::get_origin_offset() const { +Vector3 ReflectionProbe::get_origin_offset() const { return origin_offset; } void ReflectionProbe::set_enable_box_projection(bool p_enable) { - box_projection = p_enable; RS::get_singleton()->reflection_probe_set_enable_box_projection(probe, p_enable); } -bool ReflectionProbe::is_box_projection_enabled() const { +bool ReflectionProbe::is_box_projection_enabled() const { return box_projection; } void ReflectionProbe::set_as_interior(bool p_enable) { - interior = p_enable; RS::get_singleton()->reflection_probe_set_as_interior(probe, interior); _change_notify(); } bool ReflectionProbe::is_set_as_interior() const { - return interior; } void ReflectionProbe::set_enable_shadows(bool p_enable) { - enable_shadows = p_enable; RS::get_singleton()->reflection_probe_set_enable_shadows(probe, p_enable); } -bool ReflectionProbe::are_shadows_enabled() const { +bool ReflectionProbe::are_shadows_enabled() const { return enable_shadows; } void ReflectionProbe::set_cull_mask(uint32_t p_layers) { - cull_mask = p_layers; RS::get_singleton()->reflection_probe_set_cull_mask(probe, p_layers); } -uint32_t ReflectionProbe::get_cull_mask() const { +uint32_t ReflectionProbe::get_cull_mask() const { return cull_mask; } @@ -180,19 +165,17 @@ ReflectionProbe::UpdateMode ReflectionProbe::get_update_mode() const { } AABB ReflectionProbe::get_aabb() const { - AABB aabb; aabb.position = -origin_offset; aabb.size = origin_offset + extents; return aabb; } -Vector<Face3> ReflectionProbe::get_faces(uint32_t p_usage_flags) const { +Vector<Face3> ReflectionProbe::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } void ReflectionProbe::_validate_property(PropertyInfo &property) const { - if (property.name == "interior/ambient_color" || property.name == "interior/ambient_energy" || property.name == "interior/ambient_contrib") { if (!interior) { property.usage = PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL; @@ -201,7 +184,6 @@ void ReflectionProbe::_validate_property(PropertyInfo &property) const { } void ReflectionProbe::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_intensity", "intensity"), &ReflectionProbe::set_intensity); ClassDB::bind_method(D_METHOD("get_intensity"), &ReflectionProbe::get_intensity); @@ -258,7 +240,6 @@ void ReflectionProbe::_bind_methods() { } ReflectionProbe::ReflectionProbe() { - intensity = 1.0; interior_ambient = Color(0, 0, 0); interior_ambient_probe_contribution = 0; @@ -278,6 +259,5 @@ ReflectionProbe::ReflectionProbe() { } ReflectionProbe::~ReflectionProbe() { - RS::get_singleton()->free(probe); } diff --git a/scene/3d/remote_transform_3d.cpp b/scene/3d/remote_transform_3d.cpp index 38792bbb58..95fce6b802 100644 --- a/scene/3d/remote_transform_3d.cpp +++ b/scene/3d/remote_transform_3d.cpp @@ -43,33 +43,37 @@ void RemoteTransform3D::_update_cache() { } void RemoteTransform3D::_update_remote() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (cache.is_null()) + if (cache.is_null()) { return; + } Node3D *n = Object::cast_to<Node3D>(ObjectDB::get_instance(cache)); - if (!n) + if (!n) { return; + } - if (!n->is_inside_tree()) + if (!n->is_inside_tree()) { return; + } //todo make faster if (use_global_coordinates) { - if (update_remote_position && update_remote_rotation && update_remote_scale) { n->set_global_transform(get_global_transform()); } else { Transform our_trans = get_global_transform(); - if (update_remote_rotation) + if (update_remote_rotation) { n->set_rotation(our_trans.basis.get_rotation()); + } - if (update_remote_scale) + if (update_remote_scale) { n->set_scale(our_trans.basis.get_scale()); + } if (update_remote_position) { Transform n_trans = n->get_global_transform(); @@ -85,11 +89,13 @@ void RemoteTransform3D::_update_remote() { } else { Transform our_trans = get_transform(); - if (update_remote_rotation) + if (update_remote_rotation) { n->set_rotation(our_trans.basis.get_rotation()); + } - if (update_remote_scale) + if (update_remote_scale) { n->set_scale(our_trans.basis.get_scale()); + } if (update_remote_position) { Transform n_trans = n->get_transform(); @@ -102,20 +108,17 @@ void RemoteTransform3D::_update_remote() { } void RemoteTransform3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - _update_cache(); } break; case NOTIFICATION_TRANSFORM_CHANGED: { - if (!is_inside_tree()) + if (!is_inside_tree()) { break; + } if (cache.is_valid()) { - _update_remote(); } @@ -124,7 +127,6 @@ void RemoteTransform3D::_notification(int p_what) { } void RemoteTransform3D::set_remote_node(const NodePath &p_remote_node) { - remote_node = p_remote_node; if (is_inside_tree()) { _update_cache(); @@ -135,7 +137,6 @@ void RemoteTransform3D::set_remote_node(const NodePath &p_remote_node) { } NodePath RemoteTransform3D::get_remote_node() const { - return remote_node; } @@ -179,7 +180,6 @@ void RemoteTransform3D::force_update_cache() { } String RemoteTransform3D::get_configuration_warning() const { - if (!has_node(remote_node) || !Object::cast_to<Node3D>(get_node(remote_node))) { return TTR("The \"Remote Path\" property must point to a valid Node3D or Node3D-derived node to work."); } @@ -188,7 +188,6 @@ String RemoteTransform3D::get_configuration_warning() const { } void RemoteTransform3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_remote_node", "path"), &RemoteTransform3D::set_remote_node); ClassDB::bind_method(D_METHOD("get_remote_node"), &RemoteTransform3D::get_remote_node); ClassDB::bind_method(D_METHOD("force_update_cache"), &RemoteTransform3D::force_update_cache); @@ -213,7 +212,6 @@ void RemoteTransform3D::_bind_methods() { } RemoteTransform3D::RemoteTransform3D() { - use_global_coordinates = true; update_remote_position = true; update_remote_rotation = true; diff --git a/scene/3d/skeleton_3d.cpp b/scene/3d/skeleton_3d.cpp index 973822653a..7516cf95b0 100644 --- a/scene/3d/skeleton_3d.cpp +++ b/scene/3d/skeleton_3d.cpp @@ -67,39 +67,37 @@ SkinReference::~SkinReference() { } bool Skeleton3D::_set(const StringName &p_path, const Variant &p_value) { - String path = p_path; - if (!path.begins_with("bones/")) + if (!path.begins_with("bones/")) { return false; + } int which = path.get_slicec('/', 1).to_int(); String what = path.get_slicec('/', 2); if (which == bones.size() && what == "name") { - add_bone(p_value); return true; } ERR_FAIL_INDEX_V(which, bones.size(), false); - if (what == "parent") + if (what == "parent") { set_bone_parent(which, p_value); - else if (what == "rest") + } else if (what == "rest") { set_bone_rest(which, p_value); - else if (what == "enabled") + } else if (what == "enabled") { set_bone_enabled(which, p_value); - else if (what == "pose") + } else if (what == "pose") { set_bone_pose(which, p_value); - else if (what == "bound_children") { + } else if (what == "bound_children") { Array children = p_value; if (is_inside_tree()) { bones.write[which].nodes_bound.clear(); for (int i = 0; i < children.size(); i++) { - NodePath npath = children[i]; ERR_CONTINUE(npath.operator String() == ""); Node *node = get_node(npath); @@ -115,32 +113,31 @@ bool Skeleton3D::_set(const StringName &p_path, const Variant &p_value) { } bool Skeleton3D::_get(const StringName &p_path, Variant &r_ret) const { - String path = p_path; - if (!path.begins_with("bones/")) + if (!path.begins_with("bones/")) { return false; + } int which = path.get_slicec('/', 1).to_int(); String what = path.get_slicec('/', 2); ERR_FAIL_INDEX_V(which, bones.size(), false); - if (what == "name") + if (what == "name") { r_ret = get_bone_name(which); - else if (what == "parent") + } else if (what == "parent") { r_ret = get_bone_parent(which); - else if (what == "rest") + } else if (what == "rest") { r_ret = get_bone_rest(which); - else if (what == "enabled") + } else if (what == "enabled") { r_ret = is_bone_enabled(which); - else if (what == "pose") + } else if (what == "pose") { r_ret = get_bone_pose(which); - else if (what == "bound_children") { + } else if (what == "bound_children") { Array children; for (const List<ObjectID>::Element *E = bones[which].nodes_bound.front(); E; E = E->next()) { - Object *obj = ObjectDB::get_instance(E->get()); ERR_CONTINUE(!obj); Node *node = Object::cast_to<Node>(obj); @@ -150,15 +147,15 @@ bool Skeleton3D::_get(const StringName &p_path, Variant &r_ret) const { } r_ret = children; - } else + } else { return false; + } return true; } -void Skeleton3D::_get_property_list(List<PropertyInfo> *p_list) const { +void Skeleton3D::_get_property_list(List<PropertyInfo> *p_list) const { for (int i = 0; i < bones.size(); i++) { - String prep = "bones/" + itos(i) + "/"; p_list->push_back(PropertyInfo(Variant::STRING, prep + "name")); p_list->push_back(PropertyInfo(Variant::INT, prep + "parent", PROPERTY_HINT_RANGE, "-1," + itos(bones.size() - 1) + ",1")); @@ -170,9 +167,9 @@ void Skeleton3D::_get_property_list(List<PropertyInfo> *p_list) const { } void Skeleton3D::_update_process_order() { - - if (!process_order_dirty) + if (!process_order_dirty) { return; + } Bone *bonesptr = bones.ptrw(); int len = bones.size(); @@ -180,7 +177,6 @@ void Skeleton3D::_update_process_order() { process_order.resize(len); int *order = process_order.ptrw(); for (int i = 0; i < len; i++) { - if (bonesptr[i].parent >= len) { //validate this just in case ERR_PRINT("Bone " + itos(i) + " has invalid parent: " + itos(bonesptr[i].parent)); @@ -197,8 +193,9 @@ void Skeleton3D::_update_process_order() { bool swapped = false; for (int i = 0; i < len; i++) { int parent_idx = bonesptr[order[i]].parent; - if (parent_idx < 0) + if (parent_idx < 0) { continue; //do nothing because it has no parent + } //swap indices int parent_order = bonesptr[parent_idx].sort_index; if (parent_order > i) { @@ -210,8 +207,9 @@ void Skeleton3D::_update_process_order() { } } - if (!swapped) + if (!swapped) { break; + } pass_count++; } @@ -223,11 +221,8 @@ void Skeleton3D::_update_process_order() { } void Skeleton3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_UPDATE_SKELETON: { - RenderingServer *vs = RenderingServer::get_singleton(); Bone *bonesptr = bones.ptrw(); int len = bones.size(); @@ -237,7 +232,6 @@ void Skeleton3D::_notification(int p_what) { const int *order = process_order.ptr(); for (int i = 0; i < len; i++) { - Bone &b = bonesptr[order[i]]; if (b.global_pose_override_amount >= 0.999) { @@ -245,50 +239,38 @@ void Skeleton3D::_notification(int p_what) { } else { if (b.disable_rest) { if (b.enabled) { - Transform pose = b.pose; if (b.custom_pose_enable) { pose = b.custom_pose * pose; } if (b.parent >= 0) { - b.pose_global = bonesptr[b.parent].pose_global * pose; } else { - b.pose_global = pose; } } else { - if (b.parent >= 0) { - b.pose_global = bonesptr[b.parent].pose_global; } else { - b.pose_global = Transform(); } } } else { if (b.enabled) { - Transform pose = b.pose; if (b.custom_pose_enable) { pose = b.custom_pose * pose; } if (b.parent >= 0) { - b.pose_global = bonesptr[b.parent].pose_global * (b.rest * pose); } else { - b.pose_global = b.rest * pose; } } else { - if (b.parent >= 0) { - b.pose_global = bonesptr[b.parent].pose_global * b.rest; } else { - b.pose_global = b.rest; } } @@ -304,7 +286,6 @@ void Skeleton3D::_notification(int p_what) { } for (List<ObjectID>::Element *E = b.nodes_bound.front(); E; E = E->next()) { - Object *obj = ObjectDB::get_instance(E->get()); ERR_CONTINUE(!obj); Node3D *sp = Object::cast_to<Node3D>(obj); @@ -315,7 +296,6 @@ void Skeleton3D::_notification(int p_what) { //update skins for (Set<SkinReference *>::Element *E = skin_bindings.front(); E; E = E->next()) { - const Skin *skin = E->get()->skin.operator->(); RID skeleton = E->get()->skeleton; uint32_t bind_count = skin->get_bind_count(); @@ -328,7 +308,6 @@ void Skeleton3D::_notification(int p_what) { } if (E->get()->skeleton_version != version) { - for (uint32_t i = 0; i < bind_count; i++) { StringName bind_name = skin->get_bind_name(i); @@ -405,7 +384,6 @@ void Skeleton3D::clear_bones_global_pose_override() { } void Skeleton3D::set_bone_global_pose_override(int p_bone, const Transform &p_pose, float p_amount, bool p_persistent) { - ERR_FAIL_INDEX(p_bone, bones.size()); bones.write[p_bone].global_pose_override_amount = p_amount; bones.write[p_bone].global_pose_override = p_pose; @@ -414,20 +392,18 @@ void Skeleton3D::set_bone_global_pose_override(int p_bone, const Transform &p_po } Transform Skeleton3D::get_bone_global_pose(int p_bone) const { - ERR_FAIL_INDEX_V(p_bone, bones.size(), Transform()); - if (dirty) + if (dirty) { const_cast<Skeleton3D *>(this)->notification(NOTIFICATION_UPDATE_SKELETON); + } return bones[p_bone].pose_global; } // skeleton creation api void Skeleton3D::add_bone(const String &p_name) { - ERR_FAIL_COND(p_name == "" || p_name.find(":") != -1 || p_name.find("/") != -1); for (int i = 0; i < bones.size(); i++) { - ERR_FAIL_COND(bones[i].name == p_name); } @@ -439,43 +415,42 @@ void Skeleton3D::add_bone(const String &p_name) { _make_dirty(); update_gizmo(); } -int Skeleton3D::find_bone(const String &p_name) const { +int Skeleton3D::find_bone(const String &p_name) const { for (int i = 0; i < bones.size(); i++) { - - if (bones[i].name == p_name) + if (bones[i].name == p_name) { return i; + } } return -1; } -String Skeleton3D::get_bone_name(int p_bone) const { +String Skeleton3D::get_bone_name(int p_bone) const { ERR_FAIL_INDEX_V(p_bone, bones.size(), ""); return bones[p_bone].name; } bool Skeleton3D::is_bone_parent_of(int p_bone, int p_parent_bone_id) const { - int parent_of_bone = get_bone_parent(p_bone); - if (-1 == parent_of_bone) + if (-1 == parent_of_bone) { return false; + } - if (parent_of_bone == p_parent_bone_id) + if (parent_of_bone == p_parent_bone_id) { return true; + } return is_bone_parent_of(parent_of_bone, p_parent_bone_id); } int Skeleton3D::get_bone_count() const { - return bones.size(); } void Skeleton3D::set_bone_parent(int p_bone, int p_parent) { - ERR_FAIL_INDEX(p_bone, bones.size()); ERR_FAIL_COND(p_parent != -1 && (p_parent < 0)); @@ -485,7 +460,6 @@ void Skeleton3D::set_bone_parent(int p_bone, int p_parent) { } void Skeleton3D::unparent_bone_and_rest(int p_bone) { - ERR_FAIL_INDEX(p_bone, bones.size()); _update_process_order(); @@ -503,80 +477,73 @@ void Skeleton3D::unparent_bone_and_rest(int p_bone) { } void Skeleton3D::set_bone_disable_rest(int p_bone, bool p_disable) { - ERR_FAIL_INDEX(p_bone, bones.size()); bones.write[p_bone].disable_rest = p_disable; } bool Skeleton3D::is_bone_rest_disabled(int p_bone) const { - ERR_FAIL_INDEX_V(p_bone, bones.size(), false); return bones[p_bone].disable_rest; } int Skeleton3D::get_bone_parent(int p_bone) const { - ERR_FAIL_INDEX_V(p_bone, bones.size(), -1); return bones[p_bone].parent; } void Skeleton3D::set_bone_rest(int p_bone, const Transform &p_rest) { - ERR_FAIL_INDEX(p_bone, bones.size()); bones.write[p_bone].rest = p_rest; _make_dirty(); } -Transform Skeleton3D::get_bone_rest(int p_bone) const { +Transform Skeleton3D::get_bone_rest(int p_bone) const { ERR_FAIL_INDEX_V(p_bone, bones.size(), Transform()); return bones[p_bone].rest; } void Skeleton3D::set_bone_enabled(int p_bone, bool p_enabled) { - ERR_FAIL_INDEX(p_bone, bones.size()); bones.write[p_bone].enabled = p_enabled; _make_dirty(); } -bool Skeleton3D::is_bone_enabled(int p_bone) const { +bool Skeleton3D::is_bone_enabled(int p_bone) const { ERR_FAIL_INDEX_V(p_bone, bones.size(), false); return bones[p_bone].enabled; } void Skeleton3D::bind_child_node_to_bone(int p_bone, Node *p_node) { - ERR_FAIL_NULL(p_node); ERR_FAIL_INDEX(p_bone, bones.size()); ObjectID id = p_node->get_instance_id(); for (const List<ObjectID>::Element *E = bones[p_bone].nodes_bound.front(); E; E = E->next()) { - - if (E->get() == id) + if (E->get() == id) { return; // already here + } } bones.write[p_bone].nodes_bound.push_back(id); } -void Skeleton3D::unbind_child_node_from_bone(int p_bone, Node *p_node) { +void Skeleton3D::unbind_child_node_from_bone(int p_bone, Node *p_node) { ERR_FAIL_NULL(p_node); ERR_FAIL_INDEX(p_bone, bones.size()); ObjectID id = p_node->get_instance_id(); bones.write[p_bone].nodes_bound.erase(id); } -void Skeleton3D::get_bound_child_nodes_to_bone(int p_bone, List<Node *> *p_bound) const { +void Skeleton3D::get_bound_child_nodes_to_bone(int p_bone, List<Node *> *p_bound) const { ERR_FAIL_INDEX(p_bone, bones.size()); for (const List<ObjectID>::Element *E = bones[p_bone].nodes_bound.front(); E; E = E->next()) { - Object *obj = ObjectDB::get_instance(E->get()); ERR_CONTINUE(!obj); p_bound->push_back(Object::cast_to<Node>(obj)); @@ -584,7 +551,6 @@ void Skeleton3D::get_bound_child_nodes_to_bone(int p_bone, List<Node *> *p_bound } void Skeleton3D::clear_bones() { - bones.clear(); process_order_dirty = true; version++; @@ -594,7 +560,6 @@ void Skeleton3D::clear_bones() { // posing api void Skeleton3D::set_bone_pose(int p_bone, const Transform &p_pose) { - ERR_FAIL_INDEX(p_bone, bones.size()); bones.write[p_bone].pose = p_pose; @@ -602,14 +567,13 @@ void Skeleton3D::set_bone_pose(int p_bone, const Transform &p_pose) { _make_dirty(); } } -Transform Skeleton3D::get_bone_pose(int p_bone) const { +Transform Skeleton3D::get_bone_pose(int p_bone) const { ERR_FAIL_INDEX_V(p_bone, bones.size(), Transform()); return bones[p_bone].pose; } void Skeleton3D::set_bone_custom_pose(int p_bone, const Transform &p_custom_pose) { - ERR_FAIL_INDEX(p_bone, bones.size()); //ERR_FAIL_COND( !is_inside_scene() ); @@ -620,15 +584,14 @@ void Skeleton3D::set_bone_custom_pose(int p_bone, const Transform &p_custom_pose } Transform Skeleton3D::get_bone_custom_pose(int p_bone) const { - ERR_FAIL_INDEX_V(p_bone, bones.size(), Transform()); return bones[p_bone].custom_pose; } void Skeleton3D::_make_dirty() { - - if (dirty) + if (dirty) { return; + } MessageQueue::get_singleton()->push_notification(this, NOTIFICATION_UPDATE_SKELETON); dirty = true; @@ -641,7 +604,6 @@ int Skeleton3D::get_process_order(int p_idx) { } void Skeleton3D::localize_rests() { - _update_process_order(); for (int i = bones.size() - 1; i >= 0; i--) { @@ -729,14 +691,14 @@ void Skeleton3D::_rebuild_physical_bones_cache() { PhysicalBone3D *parent_pb = _get_physical_bone_parent(i); if (parent_pb != bones[i].physical_bone) { bones.write[i].cache_parent_physical_bone = parent_pb; - if (bones[i].physical_bone) + if (bones[i].physical_bone) { bones[i].physical_bone->_on_bone_parent_changed(); + } } } } void _pb_stop_simulation(Node *p_node) { - for (int i = p_node->get_child_count() - 1; 0 <= i; --i) { _pb_stop_simulation(p_node->get_child(i)); } @@ -755,7 +717,6 @@ void Skeleton3D::physical_bones_stop_simulation() { } void _pb_start_simulation(const Skeleton3D *p_skeleton, Node *p_node, const Vector<int> &p_sim_bones) { - for (int i = p_node->get_child_count() - 1; 0 <= i; --i) { _pb_start_simulation(p_skeleton, p_node->get_child(i), p_sim_bones); } @@ -782,8 +743,9 @@ void Skeleton3D::physical_bones_start_simulation_on(const TypedArray<StringName> int c = 0; for (int i = sim_bones.size() - 1; 0 <= i; --i) { int bone_id = find_bone(p_bones[i]); - if (bone_id != -1) + if (bone_id != -1) { sim_bones.write[c++] = bone_id; + } } sim_bones.resize(c); } @@ -792,7 +754,6 @@ void Skeleton3D::physical_bones_start_simulation_on(const TypedArray<StringName> } void _physical_bones_add_remove_collision_exception(bool p_add, Node *p_node, RID p_exception) { - for (int i = p_node->get_child_count() - 1; 0 <= i; --i) { _physical_bones_add_remove_collision_exception(p_add, p_node->get_child(i), p_exception); } @@ -822,7 +783,6 @@ void Skeleton3D::_skin_changed() { } Ref<SkinReference> Skeleton3D::register_skin(const Ref<Skin> &p_skin) { - for (Set<SkinReference *>::Element *E = skin_bindings.front(); E; E = E->next()) { if (E->get()->skin == p_skin) { return Ref<SkinReference>(E->get()); @@ -883,7 +843,6 @@ Ref<SkinReference> Skeleton3D::register_skin(const Ref<Skin> &p_skin) { } void Skeleton3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_bone", "name"), &Skeleton3D::add_bone); ClassDB::bind_method(D_METHOD("find_bone", "name"), &Skeleton3D::find_bone); ClassDB::bind_method(D_METHOD("get_bone_name", "bone_idx"), &Skeleton3D::get_bone_name); @@ -938,7 +897,6 @@ void Skeleton3D::_bind_methods() { } Skeleton3D::Skeleton3D() { - animate_physical_bones = true; dirty = false; version = 1; @@ -946,7 +904,6 @@ Skeleton3D::Skeleton3D() { } Skeleton3D::~Skeleton3D() { - //some skins may remain bound for (Set<SkinReference *>::Element *E = skin_bindings.front(); E; E = E->next()) { E->get()->skeleton_node = nullptr; diff --git a/scene/3d/skeleton_3d.h b/scene/3d/skeleton_3d.h index 0bccd3f8fc..1e864c1c48 100644 --- a/scene/3d/skeleton_3d.h +++ b/scene/3d/skeleton_3d.h @@ -66,7 +66,6 @@ public: }; class Skeleton3D : public Node3D { - GDCLASS(Skeleton3D, Node3D); private: @@ -77,7 +76,6 @@ private: void _skin_changed(); struct Bone { - String name; bool enabled; @@ -130,13 +128,11 @@ private: // bind helpers Array _get_bound_child_nodes_to_bone(int p_bone) const { - Array bound; List<Node *> children; get_bound_child_nodes_to_bone(p_bone, &children); for (int i = 0; i < children.size(); i++) { - bound.push_back(children[i]); } return bound; diff --git a/scene/3d/skeleton_ik_3d.cpp b/scene/3d/skeleton_ik_3d.cpp index 5c0e48a5df..9023f3c68a 100644 --- a/scene/3d/skeleton_ik_3d.cpp +++ b/scene/3d/skeleton_ik_3d.cpp @@ -55,7 +55,6 @@ FabrikInverseKinematic::ChainItem *FabrikInverseKinematic::ChainItem::add_child( /// Build a chain that starts from the root to tip bool FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain) { - ERR_FAIL_COND_V(-1 == p_task->root_bone, false); Chain &chain(p_task->chain); @@ -75,7 +74,6 @@ bool FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain chain_ids.resize(p_task->skeleton->get_bone_count()); for (int x = p_task->end_effectors.size() - 1; 0 <= x; --x) { - const EndEffector *ee(&p_task->end_effectors[x]); ERR_FAIL_COND_V(p_task->root_bone >= ee->tip_bone, false); ERR_FAIL_INDEX_V(ee->tip_bone, p_task->skeleton->get_bone_count(), false); @@ -84,7 +82,6 @@ bool FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain // Picks all IDs that composing a single chain in reverse order (except the root) BoneId chain_sub_tip(ee->tip_bone); while (chain_sub_tip > p_task->root_bone) { - chain_ids.write[sub_chain_size++] = chain_sub_tip; chain_sub_tip = p_task->skeleton->get_bone_parent(chain_sub_tip); } @@ -95,10 +92,8 @@ bool FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain // For each chain item id will be created a ChainItem if doesn't exists ChainItem *sub_chain(&chain.chain_root); for (int i = sub_chain_size - 1; 0 <= i; --i) { - ChainItem *child_ci(sub_chain->find_child(chain_ids[i])); if (!child_ci) { - child_ci = sub_chain->add_child(chain_ids[i]); child_ci->pb = p_task->skeleton->get_physical_bone(child_ci->bone); @@ -118,8 +113,9 @@ bool FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain } } - if (!middle_chain_item_id) + if (!middle_chain_item_id) { chain.middle_chain_item = nullptr; + } // Initialize current tip chain.tips.write[x].chain_item = sub_chain; @@ -137,9 +133,9 @@ bool FabrikInverseKinematic::build_chain(Task *p_task, bool p_force_simple_chain } void FabrikInverseKinematic::update_chain(const Skeleton3D *p_sk, ChainItem *p_chain_item) { - - if (!p_chain_item) + if (!p_chain_item) { return; + } p_chain_item->initial_transform = p_sk->get_bone_global_pose(p_chain_item->bone); p_chain_item->current_pos = p_chain_item->initial_transform.origin; @@ -151,7 +147,6 @@ void FabrikInverseKinematic::update_chain(const Skeleton3D *p_sk, ChainItem *p_c } void FabrikInverseKinematic::solve_simple(Task *p_task, bool p_solve_magnet) { - real_t distance_to_goal(1e4); real_t previous_distance_to_goal(0); int can_solve(p_task->max_iterations); @@ -167,7 +162,6 @@ void FabrikInverseKinematic::solve_simple(Task *p_task, bool p_solve_magnet) { } void FabrikInverseKinematic::solve_simple_backwards(Chain &r_chain, bool p_solve_magnet) { - if (p_solve_magnet && !r_chain.middle_chain_item) { return; } @@ -200,7 +194,6 @@ void FabrikInverseKinematic::solve_simple_backwards(Chain &r_chain, bool p_solve } void FabrikInverseKinematic::solve_simple_forwards(Chain &r_chain, bool p_solve_magnet) { - if (p_solve_magnet && !r_chain.middle_chain_item) { return; } @@ -212,7 +205,6 @@ void FabrikInverseKinematic::solve_simple_forwards(Chain &r_chain, bool p_solve_ sub_chain_root->current_pos = origin; if (!sub_chain_root->children.empty()) { - ChainItem &child(sub_chain_root->children.write[0]); // Is not tip @@ -231,7 +223,6 @@ void FabrikInverseKinematic::solve_simple_forwards(Chain &r_chain, bool p_solve_ sub_chain_root = &child; } } else { - // Is tip sub_chain_root = nullptr; } @@ -239,7 +230,6 @@ void FabrikInverseKinematic::solve_simple_forwards(Chain &r_chain, bool p_solve_ } FabrikInverseKinematic::Task *FabrikInverseKinematic::create_simple_task(Skeleton3D *p_sk, BoneId root_bone, BoneId tip_bone, const Transform &goal_transform) { - FabrikInverseKinematic::EndEffector ee; ee.tip_bone = tip_bone; @@ -258,8 +248,9 @@ FabrikInverseKinematic::Task *FabrikInverseKinematic::create_simple_task(Skeleto } void FabrikInverseKinematic::free_task(Task *p_task) { - if (p_task) + if (p_task) { memdelete(p_task); + } } void FabrikInverseKinematic::set_goal(Task *p_task, const Transform &p_goal) { @@ -267,12 +258,10 @@ void FabrikInverseKinematic::set_goal(Task *p_task, const Transform &p_goal) { } void FabrikInverseKinematic::make_goal(Task *p_task, const Transform &p_inverse_transf, real_t blending_delta) { - if (blending_delta >= 0.99f) { // Update the end_effector (local transform) without blending p_task->end_effectors.write[0].goal_transform = p_inverse_transf * p_task->goal_global_transform; } else { - // End effector in local transform const Transform end_effector_pose(p_task->skeleton->get_bone_global_pose(p_task->end_effectors.write[0].tip_bone)); @@ -282,7 +271,6 @@ void FabrikInverseKinematic::make_goal(Task *p_task, const Transform &p_inverse_ } void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool override_tip_basis, bool p_use_magnet, const Vector3 &p_magnet_position) { - if (blending_delta <= 0.01f) { return; // Skip solving } @@ -314,7 +302,6 @@ void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool ove new_bone_pose.origin = ci->current_pos; if (!ci->children.empty()) { - /// Rotate basis const Vector3 initial_ori((ci->children[0].initial_transform.origin - ci->initial_transform.origin).normalized()); const Vector3 rot_axis(initial_ori.cross(ci->current_ori).normalized()); @@ -325,38 +312,37 @@ void FabrikInverseKinematic::solve(Task *p_task, real_t blending_delta, bool ove } } else { // Set target orientation to tip - if (override_tip_basis) + if (override_tip_basis) { new_bone_pose.basis = p_task->chain.tips[0].end_effector->goal_transform.basis; - else + } else { new_bone_pose.basis = new_bone_pose.basis * p_task->chain.tips[0].end_effector->goal_transform.basis; + } } p_task->skeleton->set_bone_global_pose_override(ci->bone, new_bone_pose, 1.0, true); - if (!ci->children.empty()) + if (!ci->children.empty()) { ci = &ci->children.write[0]; - else + } else { ci = nullptr; + } } } void SkeletonIK3D::_validate_property(PropertyInfo &property) const { - if (property.name == "root_bone" || property.name == "tip_bone") { - if (skeleton) { - String names("--,"); for (int i = 0; i < skeleton->get_bone_count(); i++) { - if (i > 0) + if (i > 0) { names += ","; + } names += skeleton->get_bone_name(i); } property.hint = PROPERTY_HINT_ENUM; property.hint_string = names; } else { - property.hint = PROPERTY_HINT_NONE; property.hint_string = ""; } @@ -364,7 +350,6 @@ void SkeletonIK3D::_validate_property(PropertyInfo &property) const { } void SkeletonIK3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_root_bone", "root_bone"), &SkeletonIK3D::set_root_bone); ClassDB::bind_method(D_METHOD("get_root_bone"), &SkeletonIK3D::get_root_bone); @@ -421,9 +406,9 @@ void SkeletonIK3D::_notification(int p_what) { reload_chain(); } break; case NOTIFICATION_INTERNAL_PROCESS: { - - if (target_node_override) + if (target_node_override) { reload_goal(); + } _solve_chain(); @@ -537,23 +522,24 @@ void SkeletonIK3D::stop() { } Transform SkeletonIK3D::_get_target_transform() { - - if (!target_node_override && !target_node_path_override.is_empty()) + if (!target_node_override && !target_node_path_override.is_empty()) { target_node_override = Object::cast_to<Node3D>(get_node(target_node_path_override)); + } - if (target_node_override) + if (target_node_override) { return target_node_override->get_global_transform(); - else + } else { return target; + } } void SkeletonIK3D::reload_chain() { - FabrikInverseKinematic::free_task(task); task = nullptr; - if (!skeleton) + if (!skeleton) { return; + } task = FabrikInverseKinematic::create_simple_task(skeleton, skeleton->find_bone(root_bone), skeleton->find_bone(tip_bone), _get_target_transform()); if (task) { @@ -563,15 +549,17 @@ void SkeletonIK3D::reload_chain() { } void SkeletonIK3D::reload_goal() { - if (!task) + if (!task) { return; + } FabrikInverseKinematic::set_goal(task, _get_target_transform()); } void SkeletonIK3D::_solve_chain() { - if (!task) + if (!task) { return; + } FabrikInverseKinematic::solve(task, interpolation, override_tip_basis, use_magnet, magnet_position); } diff --git a/scene/3d/skeleton_ik_3d.h b/scene/3d/skeleton_ik_3d.h index ad2623193b..0d948f13a9 100644 --- a/scene/3d/skeleton_ik_3d.h +++ b/scene/3d/skeleton_ik_3d.h @@ -41,14 +41,12 @@ #include "scene/3d/skeleton_3d.h" class FabrikInverseKinematic { - struct EndEffector { BoneId tip_bone; Transform goal_transform; }; struct ChainItem { - Vector<ChainItem> children; ChainItem *parent_item = nullptr; diff --git a/scene/3d/soft_body_3d.cpp b/scene/3d/soft_body_3d.cpp index 91b8b5c859..a267c57f5e 100644 --- a/scene/3d/soft_body_3d.cpp +++ b/scene/3d/soft_body_3d.cpp @@ -65,7 +65,6 @@ void SoftBodyRenderingServerHandler::prepare(RID p_mesh, int p_surface) { } void SoftBodyRenderingServerHandler::clear() { - if (mesh.is_valid()) { buffer.resize(0); } @@ -116,8 +115,9 @@ SoftBody3D::PinnedPoint SoftBody3D::PinnedPoint::operator=(const PinnedPoint &ob } void SoftBody3D::_update_pickable() { - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } bool pickable = ray_pickable && is_visible_in_tree(); PhysicsServer3D::get_singleton()->soft_body_set_ray_pickable(physics_rid, pickable); } @@ -127,11 +127,9 @@ bool SoftBody3D::_set(const StringName &p_name, const Variant &p_value) { String which = name.get_slicec('/', 0); if ("pinned_points" == which) { - return _set_property_pinned_points_indices(p_value); } else if ("attachments" == which) { - int idx = name.get_slicec('/', 1).to_int(); String what = name.get_slicec('/', 2); @@ -159,7 +157,6 @@ bool SoftBody3D::_get(const StringName &p_name, Variant &r_ret) const { return true; } else if ("attachments" == which) { - int idx = name.get_slicec('/', 1).to_int(); String what = name.get_slicec('/', 2); @@ -170,7 +167,6 @@ bool SoftBody3D::_get(const StringName &p_name, Variant &r_ret) const { } void SoftBody3D::_get_property_list(List<PropertyInfo> *p_list) const { - const int pinned_points_indices_size = pinned_points.size(); p_list->push_back(PropertyInfo(Variant::PACKED_INT32_ARRAY, "pinned_points")); @@ -183,7 +179,6 @@ void SoftBody3D::_get_property_list(List<PropertyInfo> *p_list) const { } bool SoftBody3D::_set_property_pinned_points_indices(const Array &p_indices) { - const int p_indices_size = p_indices.size(); { // Remove the pined points on physics server that will be removed by resize @@ -202,8 +197,9 @@ bool SoftBody3D::_set_property_pinned_points_indices(const Array &p_indices) { for (int i = 0; i < p_indices_size; ++i) { point_index = p_indices.get(i); if (w[i].point_index != point_index) { - if (-1 != w[i].point_index) + if (-1 != w[i].point_index) { pin_point(w[i].point_index, false); + } w[i].point_index = point_index; pin_point(w[i].point_index, true); } @@ -262,9 +258,7 @@ void SoftBody3D::_changed_callback(Object *p_changed, const char *p_prop) { void SoftBody3D::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_WORLD: { - if (Engine::get_singleton()->is_editor_hint()) { - add_change_receptor(this); } @@ -273,12 +267,12 @@ void SoftBody3D::_notification(int p_what) { prepare_physics_server(); } break; case NOTIFICATION_READY: { - if (!parent_collision_ignore.is_empty()) + if (!parent_collision_ignore.is_empty()) { add_collision_exception_with(get_node(parent_collision_ignore)); + } } break; case NOTIFICATION_TRANSFORM_CHANGED: { - if (Engine::get_singleton()->is_editor_hint()) { _reset_points_offsets(); return; @@ -294,12 +288,10 @@ void SoftBody3D::_notification(int p_what) { } break; case NOTIFICATION_VISIBILITY_CHANGED: { - _update_pickable(); } break; case NOTIFICATION_EXIT_WORLD: { - PhysicsServer3D::get_singleton()->soft_body_set_space(physics_rid, RID()); } break; @@ -317,7 +309,6 @@ void SoftBody3D::_notification(int p_what) { } void SoftBody3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_collision_mask", "collision_mask"), &SoftBody3D::set_collision_mask); ClassDB::bind_method(D_METHOD("get_collision_mask"), &SoftBody3D::get_collision_mask); @@ -386,20 +377,21 @@ void SoftBody3D::_bind_methods() { } String SoftBody3D::get_configuration_warning() const { - String warning = MeshInstance3D::get_configuration_warning(); if (get_mesh().is_null()) { - if (!warning.empty()) + if (!warning.empty()) { warning += "\n\n"; + } warning += TTR("This body will be ignored until you set a mesh."); } Transform t = get_transform(); if ((ABS(t.basis.get_axis(0).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(1).length() - 1.0) > 0.05 || ABS(t.basis.get_axis(2).length() - 1.0) > 0.05)) { - if (!warning.empty()) + if (!warning.empty()) { warning += "\n\n"; + } warning += TTR("Size changes to SoftBody3D will be overridden by the physics engine when running.\nChange the size in children collision shapes instead."); } @@ -408,8 +400,9 @@ String SoftBody3D::get_configuration_warning() const { } void SoftBody3D::_update_physics_server() { - if (!simulation_started) + if (!simulation_started) { return; + } _update_cache_pin_points_datas(); // Submit bone attachment @@ -423,11 +416,11 @@ void SoftBody3D::_update_physics_server() { } void SoftBody3D::_draw_soft_mesh() { - if (get_mesh().is_null()) + if (get_mesh().is_null()) { return; + } if (!rendering_server_handler.is_ready()) { - rendering_server_handler.prepare(get_mesh()->get_rid(), 0); /// Necessary in order to render the mesh correctly (Soft body nodes are in global space) @@ -446,24 +439,21 @@ void SoftBody3D::_draw_soft_mesh() { } void SoftBody3D::prepare_physics_server() { - if (Engine::get_singleton()->is_editor_hint()) { - - if (get_mesh().is_valid()) + if (get_mesh().is_valid()) { PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, get_mesh()); - else + } else { PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, nullptr); + } return; } if (get_mesh().is_valid()) { - become_mesh_owner(); PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, get_mesh()); RS::get_singleton()->connect("frame_pre_draw", callable_mp(this, &SoftBody3D::_draw_soft_mesh)); } else { - PhysicsServer3D::get_singleton()->soft_body_set_mesh(physics_rid, nullptr); if (RS::get_singleton()->is_connected("frame_pre_draw", callable_mp(this, &SoftBody3D::_draw_soft_mesh))) { RS::get_singleton()->disconnect("frame_pre_draw", callable_mp(this, &SoftBody3D::_draw_soft_mesh)); @@ -472,8 +462,9 @@ void SoftBody3D::prepare_physics_server() { } void SoftBody3D::become_mesh_owner() { - if (mesh.is_null()) + if (mesh.is_null()) { return; + } if (!mesh_owner) { mesh_owner = true; @@ -513,6 +504,7 @@ void SoftBody3D::set_collision_mask(uint32_t p_mask) { uint32_t SoftBody3D::get_collision_mask() const { return collision_mask; } + void SoftBody3D::set_collision_layer(uint32_t p_layer) { collision_layer = p_layer; PhysicsServer3D::get_singleton()->soft_body_set_collision_layer(physics_rid, p_layer); @@ -524,10 +516,11 @@ uint32_t SoftBody3D::get_collision_layer() const { void SoftBody3D::set_collision_mask_bit(int p_bit, bool p_value) { uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } @@ -537,10 +530,11 @@ bool SoftBody3D::get_collision_mask_bit(int p_bit) const { void SoftBody3D::set_collision_layer_bit(int p_bit, bool p_value) { uint32_t layer = get_collision_layer(); - if (p_value) + if (p_value) { layer |= 1 << p_bit; - else + } else { layer &= ~(1 << p_bit); + } set_collision_layer(layer); } @@ -689,19 +683,16 @@ bool SoftBody3D::is_point_pinned(int p_point_index) const { } void SoftBody3D::set_ray_pickable(bool p_ray_pickable) { - ray_pickable = p_ray_pickable; _update_pickable(); } bool SoftBody3D::is_ray_pickable() const { - return ray_pickable; } SoftBody3D::SoftBody3D() : physics_rid(PhysicsServer3D::get_singleton()->soft_body_create()) { - PhysicsServer3D::get_singleton()->body_attach_object_instance_id(physics_rid, get_instance_id()); } @@ -722,14 +713,14 @@ void SoftBody3D::_make_cache_dirty() { } void SoftBody3D::_update_cache_pin_points_datas() { - if (!pinned_points_cache_dirty) + if (!pinned_points_cache_dirty) { return; + } pinned_points_cache_dirty = false; PinnedPoint *w = pinned_points.ptrw(); for (int i = pinned_points.size() - 1; 0 <= i; --i) { - if (!w[i].spatial_attachment_path.is_empty()) { w[i].spatial_attachment = Object::cast_to<Node3D>(get_node(w[i].spatial_attachment_path)); } @@ -746,7 +737,6 @@ void SoftBody3D::_pin_point_on_physics_server(int p_point_index, bool pin) { void SoftBody3D::_add_pinned_point(int p_point_index, const NodePath &p_spatial_attachment_path) { SoftBody3D::PinnedPoint *pinned_point; if (-1 == _get_pinned_point(p_point_index, pinned_point)) { - // Create new PinnedPoint pp; pp.point_index = p_point_index; @@ -760,7 +750,6 @@ void SoftBody3D::_add_pinned_point(int p_point_index, const NodePath &p_spatial_ pinned_points.push_back(pp); } else { - pinned_point->point_index = p_point_index; pinned_point->spatial_attachment_path = p_spatial_attachment_path; @@ -772,19 +761,20 @@ void SoftBody3D::_add_pinned_point(int p_point_index, const NodePath &p_spatial_ } void SoftBody3D::_reset_points_offsets() { - - if (!Engine::get_singleton()->is_editor_hint()) + if (!Engine::get_singleton()->is_editor_hint()) { return; + } const PinnedPoint *r = pinned_points.ptr(); PinnedPoint *w = pinned_points.ptrw(); for (int i = pinned_points.size() - 1; 0 <= i; --i) { - - if (!r[i].spatial_attachment) + if (!r[i].spatial_attachment) { w[i].spatial_attachment = Object::cast_to<Node3D>(get_node(r[i].spatial_attachment_path)); + } - if (!r[i].spatial_attachment) + if (!r[i].spatial_attachment) { continue; + } w[i].offset = (r[i].spatial_attachment->get_global_transform().affine_inverse() * get_global_transform()).xform(PhysicsServer3D::get_singleton()->soft_body_get_point_global_position(physics_rid, r[i].point_index)); } diff --git a/scene/3d/soft_body_3d.h b/scene/3d/soft_body_3d.h index 485f7427f8..0063e342f2 100644 --- a/scene/3d/soft_body_3d.h +++ b/scene/3d/soft_body_3d.h @@ -36,7 +36,6 @@ class SoftBody3D; class SoftBodyRenderingServerHandler { - friend class SoftBody3D; RID mesh; diff --git a/scene/3d/spring_arm_3d.cpp b/scene/3d/spring_arm_3d.cpp index f61e6eb2a7..9775ecc6c6 100644 --- a/scene/3d/spring_arm_3d.cpp +++ b/scene/3d/spring_arm_3d.cpp @@ -54,7 +54,6 @@ void SpringArm3D::_notification(int p_what) { } void SpringArm3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_hit_length"), &SpringArm3D::get_hit_length); ClassDB::bind_method(D_METHOD("set_length", "length"), &SpringArm3D::set_length); @@ -84,8 +83,9 @@ float SpringArm3D::get_length() const { } void SpringArm3D::set_length(float p_length) { - if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_collisions_hint())) + if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_collisions_hint())) { update_gizmo(); + } spring_length = p_length; } @@ -157,7 +157,6 @@ void SpringArm3D::process_spring() { childs_transform.origin = get_global_transform().origin + cast_direction * (spring_length * motion_delta); for (int i = get_child_count() - 1; 0 <= i; --i) { - Node3D *child = Object::cast_to<Node3D>(get_child(i)); if (child) { childs_transform.basis = child->get_global_transform().basis; diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index 85e5ebc475..3b76cb6499 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -34,14 +34,15 @@ #include "scene/scene_string_names.h" Color SpriteBase3D::_get_color_accum() { - - if (!color_dirty) + if (!color_dirty) { return color_accum; + } - if (parent_sprite) + if (parent_sprite) { color_accum = parent_sprite->_get_color_accum(); - else + } else { color_accum = Color(1, 1, 1, 1); + } color_accum.r *= modulate.r; color_accum.g *= modulate.g; @@ -52,25 +53,23 @@ Color SpriteBase3D::_get_color_accum() { } void SpriteBase3D::_propagate_color_changed() { - - if (color_dirty) + if (color_dirty) { return; + } color_dirty = true; _queue_update(); for (List<SpriteBase3D *>::Element *E = children.front(); E; E = E->next()) { - E->get()->_propagate_color_changed(); } } void SpriteBase3D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - - if (!pending_update) + if (!pending_update) { _im_update(); + } parent_sprite = Object::cast_to<SpriteBase3D>(get_parent()); if (parent_sprite) { @@ -79,9 +78,7 @@ void SpriteBase3D::_notification(int p_what) { } if (p_what == NOTIFICATION_EXIT_TREE) { - if (parent_sprite) { - parent_sprite->children.erase(pI); pI = nullptr; parent_sprite = nullptr; @@ -90,100 +87,89 @@ void SpriteBase3D::_notification(int p_what) { } void SpriteBase3D::set_centered(bool p_center) { - centered = p_center; _queue_update(); } bool SpriteBase3D::is_centered() const { - return centered; } void SpriteBase3D::set_offset(const Point2 &p_offset) { - offset = p_offset; _queue_update(); } -Point2 SpriteBase3D::get_offset() const { +Point2 SpriteBase3D::get_offset() const { return offset; } void SpriteBase3D::set_flip_h(bool p_flip) { - hflip = p_flip; _queue_update(); } -bool SpriteBase3D::is_flipped_h() const { +bool SpriteBase3D::is_flipped_h() const { return hflip; } void SpriteBase3D::set_flip_v(bool p_flip) { - vflip = p_flip; _queue_update(); } -bool SpriteBase3D::is_flipped_v() const { +bool SpriteBase3D::is_flipped_v() const { return vflip; } void SpriteBase3D::set_modulate(const Color &p_color) { - modulate = p_color; _propagate_color_changed(); _queue_update(); } Color SpriteBase3D::get_modulate() const { - return modulate; } void SpriteBase3D::set_pixel_size(float p_amount) { - pixel_size = p_amount; _queue_update(); } -float SpriteBase3D::get_pixel_size() const { +float SpriteBase3D::get_pixel_size() const { return pixel_size; } void SpriteBase3D::set_opacity(float p_amount) { - opacity = p_amount; _queue_update(); } -float SpriteBase3D::get_opacity() const { +float SpriteBase3D::get_opacity() const { return opacity; } void SpriteBase3D::set_axis(Vector3::Axis p_axis) { - ERR_FAIL_INDEX(p_axis, 3); axis = p_axis; _queue_update(); } -Vector3::Axis SpriteBase3D::get_axis() const { +Vector3::Axis SpriteBase3D::get_axis() const { return axis; } void SpriteBase3D::_im_update() { - _draw(); pending_update = false; } void SpriteBase3D::_queue_update() { - - if (pending_update) + if (pending_update) { return; + } triangle_mesh.unref(); update_gizmo(); @@ -193,17 +179,17 @@ void SpriteBase3D::_queue_update() { } AABB SpriteBase3D::get_aabb() const { - return aabb; } -Vector<Face3> SpriteBase3D::get_faces(uint32_t p_usage_flags) const { +Vector<Face3> SpriteBase3D::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } Ref<TriangleMesh> SpriteBase3D::generate_triangle_mesh() const { - if (triangle_mesh.is_valid()) + if (triangle_mesh.is_valid()) { return triangle_mesh; + } Vector<Vector3> faces; faces.resize(6); @@ -211,8 +197,9 @@ Ref<TriangleMesh> SpriteBase3D::generate_triangle_mesh() const { Rect2 final_rect = get_item_rect(); - if (final_rect.size.x == 0 || final_rect.size.y == 0) + if (final_rect.size.x == 0 || final_rect.size.y == 0) { return Ref<TriangleMesh>(); + } float pixel_size = get_pixel_size(); @@ -260,7 +247,6 @@ Ref<TriangleMesh> SpriteBase3D::generate_triangle_mesh() const { } void SpriteBase3D::set_draw_flag(DrawFlags p_flag, bool p_enable) { - ERR_FAIL_INDEX(p_flag, FLAG_MAX); flags[p_flag] = p_enable; _queue_update(); @@ -272,31 +258,26 @@ bool SpriteBase3D::get_draw_flag(DrawFlags p_flag) const { } void SpriteBase3D::set_alpha_cut_mode(AlphaCutMode p_mode) { - ERR_FAIL_INDEX(p_mode, 3); alpha_cut = p_mode; _queue_update(); } SpriteBase3D::AlphaCutMode SpriteBase3D::get_alpha_cut_mode() const { - return alpha_cut; } void SpriteBase3D::set_billboard_mode(StandardMaterial3D::BillboardMode p_mode) { - ERR_FAIL_INDEX(p_mode, 3); billboard_mode = p_mode; _queue_update(); } StandardMaterial3D::BillboardMode SpriteBase3D::get_billboard_mode() const { - return billboard_mode; } void SpriteBase3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_centered", "centered"), &SpriteBase3D::set_centered); ClassDB::bind_method(D_METHOD("is_centered"), &SpriteBase3D::is_centered); @@ -359,7 +340,6 @@ void SpriteBase3D::_bind_methods() { } SpriteBase3D::SpriteBase3D() { - color_dirty = true; centered = true; hflip = false; @@ -367,8 +347,9 @@ SpriteBase3D::SpriteBase3D() { parent_sprite = nullptr; pI = nullptr; - for (int i = 0; i < FLAG_MAX; i++) + for (int i = 0; i < FLAG_MAX; i++) { flags[i] = i == FLAG_TRANSPARENT || i == FLAG_DOUBLE_SIDED; + } alpha_cut = ALPHA_CUT_DISABLED; billboard_mode = StandardMaterial3D::BILLBOARD_DISABLED; @@ -382,46 +363,50 @@ SpriteBase3D::SpriteBase3D() { } SpriteBase3D::~SpriteBase3D() { - RenderingServer::get_singleton()->free(immediate); } /////////////////////////////////////////// void Sprite3D::_draw() { - RID immediate = get_immediate(); RS::get_singleton()->immediate_clear(immediate); - if (!texture.is_valid()) + if (!texture.is_valid()) { return; + } Vector2 tsize = texture->get_size(); - if (tsize.x == 0 || tsize.y == 0) + if (tsize.x == 0 || tsize.y == 0) { return; + } Rect2 base_rect; - if (region) + if (region) { base_rect = region_rect; - else + } else { base_rect = Rect2(0, 0, texture->get_width(), texture->get_height()); + } Size2 frame_size = base_rect.size / Size2(hframes, vframes); Point2 frame_offset = Point2(frame % hframes, frame / hframes); frame_offset *= frame_size; Point2 dest_offset = get_offset(); - if (is_centered()) + if (is_centered()) { dest_offset -= frame_size / 2; + } Rect2 src_rect(base_rect.position + frame_offset, frame_size); Rect2 final_dst_rect(dest_offset, frame_size); Rect2 final_rect; Rect2 final_src_rect; - if (!texture->get_rect_region(final_dst_rect, src_rect, final_rect, final_src_rect)) + if (!texture->get_rect_region(final_dst_rect, src_rect, final_rect, final_src_rect)) { return; + } - if (final_rect.size.x == 0 || final_rect.size.y == 0) + if (final_rect.size.x == 0 || final_rect.size.y == 0) { return; + } Color color = _get_color_accum(); color.a *= get_opacity(); @@ -458,7 +443,6 @@ void Sprite3D::_draw() { SWAP(uvs[2], uvs[3]); } if (is_flipped_v()) { - SWAP(uvs[0], uvs[3]); SWAP(uvs[1], uvs[2]); } @@ -499,7 +483,6 @@ void Sprite3D::_draw() { AABB aabb; for (int i = 0; i < 6; i++) { - static const int index[6] = { 0, 1, 2, 0, 2, 3 }; RS::get_singleton()->immediate_normal(immediate, normal); @@ -527,9 +510,9 @@ void Sprite3D::_texture_changed() { } void Sprite3D::set_texture(const Ref<Texture2D> &p_texture) { - - if (p_texture == texture) + if (p_texture == texture) { return; + } if (texture.is_valid()) { texture->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Sprite3D::_texture_changed)); } @@ -541,26 +524,23 @@ void Sprite3D::set_texture(const Ref<Texture2D> &p_texture) { } Ref<Texture2D> Sprite3D::get_texture() const { - return texture; } void Sprite3D::set_region(bool p_region) { - - if (p_region == region) + if (p_region == region) { return; + } region = p_region; _queue_update(); } bool Sprite3D::is_region() const { - return region; } void Sprite3D::set_region_rect(const Rect2 &p_region_rect) { - bool changed = region_rect != p_region_rect; region_rect = p_region_rect; if (region && changed) { @@ -569,12 +549,10 @@ void Sprite3D::set_region_rect(const Rect2 &p_region_rect) { } Rect2 Sprite3D::get_region_rect() const { - return region_rect; } void Sprite3D::set_frame(int p_frame) { - ERR_FAIL_INDEX(p_frame, int64_t(vframes) * hframes); frame = p_frame; @@ -587,7 +565,6 @@ void Sprite3D::set_frame(int p_frame) { } int Sprite3D::get_frame() const { - return frame; } @@ -603,33 +580,31 @@ Vector2 Sprite3D::get_frame_coords() const { } void Sprite3D::set_vframes(int p_amount) { - ERR_FAIL_COND(p_amount < 1); vframes = p_amount; _queue_update(); _change_notify(); } -int Sprite3D::get_vframes() const { +int Sprite3D::get_vframes() const { return vframes; } void Sprite3D::set_hframes(int p_amount) { - ERR_FAIL_COND(p_amount < 1); hframes = p_amount; _queue_update(); _change_notify(); } -int Sprite3D::get_hframes() const { +int Sprite3D::get_hframes() const { return hframes; } Rect2 Sprite3D::get_item_rect() const { - - if (texture.is_null()) + if (texture.is_null()) { return Rect2(0, 0, 1, 1); + } /* if (texture.is_null()) return CanvasItem::get_item_rect(); @@ -638,7 +613,6 @@ Rect2 Sprite3D::get_item_rect() const { Size2i s; if (region) { - s = region_rect.size; } else { s = texture->get_size(); @@ -646,17 +620,18 @@ Rect2 Sprite3D::get_item_rect() const { } Point2 ofs = get_offset(); - if (is_centered()) + if (is_centered()) { ofs -= s / 2; + } - if (s == Size2(0, 0)) + if (s == Size2(0, 0)) { s = Size2(1, 1); + } return Rect2(ofs, s); } void Sprite3D::_validate_property(PropertyInfo &property) const { - if (property.name == "frame") { property.hint = PROPERTY_HINT_RANGE; property.hint_string = "0," + itos(vframes * hframes - 1) + ",1"; @@ -669,7 +644,6 @@ void Sprite3D::_validate_property(PropertyInfo &property) const { } void Sprite3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_texture", "texture"), &Sprite3D::set_texture); ClassDB::bind_method(D_METHOD("get_texture"), &Sprite3D::get_texture); @@ -705,7 +679,6 @@ void Sprite3D::_bind_methods() { } Sprite3D::Sprite3D() { - region = false; frame = 0; vframes = 1; @@ -715,7 +688,6 @@ Sprite3D::Sprite3D() { //////////////////////////////////////// void AnimatedSprite3D::_draw() { - RID immediate = get_immediate(); RS::get_singleton()->immediate_clear(immediate); @@ -732,11 +704,13 @@ void AnimatedSprite3D::_draw() { } Ref<Texture2D> texture = frames->get_frame(animation, frame); - if (!texture.is_valid()) + if (!texture.is_valid()) { return; //no texuture no life + } Vector2 tsize = texture->get_size(); - if (tsize.x == 0 || tsize.y == 0) + if (tsize.x == 0 || tsize.y == 0) { return; + } Size2i s = tsize; Rect2 src_rect; @@ -744,18 +718,21 @@ void AnimatedSprite3D::_draw() { src_rect.size = s; Point2 ofs = get_offset(); - if (is_centered()) + if (is_centered()) { ofs -= s / 2; + } Rect2 dst_rect(ofs, s); Rect2 final_rect; Rect2 final_src_rect; - if (!texture->get_rect_region(dst_rect, src_rect, final_rect, final_src_rect)) + if (!texture->get_rect_region(dst_rect, src_rect, final_rect, final_src_rect)) { return; + } - if (final_rect.size.x == 0 || final_rect.size.y == 0) + if (final_rect.size.x == 0 || final_rect.size.y == 0) { return; + } Color color = _get_color_accum(); color.a *= get_opacity(); @@ -792,7 +769,6 @@ void AnimatedSprite3D::_draw() { SWAP(uvs[2], uvs[3]); } if (is_flipped_v()) { - SWAP(uvs[0], uvs[3]); SWAP(uvs[1], uvs[2]); } @@ -834,7 +810,6 @@ void AnimatedSprite3D::_draw() { AABB aabb; for (int i = 0; i < 6; i++) { - static const int indices[6] = { 0, 1, 2, 0, 2, 3 @@ -861,11 +836,10 @@ void AnimatedSprite3D::_draw() { } void AnimatedSprite3D::_validate_property(PropertyInfo &property) const { - - if (!frames.is_valid()) + if (!frames.is_valid()) { return; + } if (property.name == "animation") { - property.hint = PROPERTY_HINT_ENUM; List<StringName> names; frames->get_animation_list(&names); @@ -903,27 +877,27 @@ void AnimatedSprite3D::_validate_property(PropertyInfo &property) const { } void AnimatedSprite3D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_INTERNAL_PROCESS: { - - if (frames.is_null()) + if (frames.is_null()) { return; - if (!frames->has_animation(animation)) + } + if (!frames->has_animation(animation)) { return; - if (frame < 0) + } + if (frame < 0) { return; + } float speed = frames->get_animation_speed(animation); - if (speed == 0) + if (speed == 0) { return; //do nothing + } float remaining = get_process_delta_time(); while (remaining) { - if (timeout <= 0) { - timeout = 1.0 / speed; int fc = frames->get_frame_count(animation); @@ -950,12 +924,13 @@ void AnimatedSprite3D::_notification(int p_what) { } void AnimatedSprite3D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { - - if (frames.is_valid()) + if (frames.is_valid()) { frames->disconnect("changed", callable_mp(this, &AnimatedSprite3D::_res_changed)); + } frames = p_frames; - if (frames.is_valid()) + if (frames.is_valid()) { frames->connect("changed", callable_mp(this, &AnimatedSprite3D::_res_changed)); + } if (!frames.is_valid()) { frame = 0; @@ -970,27 +945,28 @@ void AnimatedSprite3D::set_sprite_frames(const Ref<SpriteFrames> &p_frames) { } Ref<SpriteFrames> AnimatedSprite3D::get_sprite_frames() const { - return frames; } void AnimatedSprite3D::set_frame(int p_frame) { - if (!frames.is_valid()) { return; } if (frames->has_animation(animation)) { int limit = frames->get_frame_count(animation); - if (p_frame >= limit) + if (p_frame >= limit) { p_frame = limit - 1; + } } - if (p_frame < 0) + if (p_frame < 0) { p_frame = 0; + } - if (frame == p_frame) + if (frame == p_frame) { return; + } frame = p_frame; _reset_timeout(); @@ -998,36 +974,38 @@ void AnimatedSprite3D::set_frame(int p_frame) { _change_notify("frame"); emit_signal(SceneStringNames::get_singleton()->frame_changed); } -int AnimatedSprite3D::get_frame() const { +int AnimatedSprite3D::get_frame() const { return frame; } Rect2 AnimatedSprite3D::get_item_rect() const { - if (!frames.is_valid() || !frames->has_animation(animation) || frame < 0 || frame >= frames->get_frame_count(animation)) { return Rect2(0, 0, 1, 1); } Ref<Texture2D> t; - if (animation) + if (animation) { t = frames->get_frame(animation, frame); - if (t.is_null()) + } + if (t.is_null()) { return Rect2(0, 0, 1, 1); + } Size2i s = t->get_size(); Point2 ofs = get_offset(); - if (centered) + if (centered) { ofs -= s / 2; + } - if (s == Size2(0, 0)) + if (s == Size2(0, 0)) { s = Size2(1, 1); + } return Rect2(ofs, s); } void AnimatedSprite3D::_res_changed() { - set_frame(frame); _change_notify("frame"); _change_notify("animation"); @@ -1035,40 +1013,37 @@ void AnimatedSprite3D::_res_changed() { } void AnimatedSprite3D::_set_playing(bool p_playing) { - - if (playing == p_playing) + if (playing == p_playing) { return; + } playing = p_playing; _reset_timeout(); set_process_internal(playing); } bool AnimatedSprite3D::_is_playing() const { - return playing; } void AnimatedSprite3D::play(const StringName &p_animation) { - - if (p_animation) + if (p_animation) { set_animation(p_animation); + } _set_playing(true); } void AnimatedSprite3D::stop() { - _set_playing(false); } bool AnimatedSprite3D::is_playing() const { - return is_processing(); } void AnimatedSprite3D::_reset_timeout() { - - if (!playing) + if (!playing) { return; + } if (frames.is_valid() && frames->has_animation(animation)) { float speed = frames->get_animation_speed(animation); @@ -1083,9 +1058,9 @@ void AnimatedSprite3D::_reset_timeout() { } void AnimatedSprite3D::set_animation(const StringName &p_animation) { - - if (animation == p_animation) + if (animation == p_animation) { return; + } animation = p_animation; _reset_timeout(); @@ -1093,13 +1068,12 @@ void AnimatedSprite3D::set_animation(const StringName &p_animation) { _change_notify(); _queue_update(); } -StringName AnimatedSprite3D::get_animation() const { +StringName AnimatedSprite3D::get_animation() const { return animation; } String AnimatedSprite3D::get_configuration_warning() const { - if (frames.is_null()) { return TTR("A SpriteFrames resource must be created or set in the \"Frames\" property in order for AnimatedSprite3D to display frames."); } @@ -1108,7 +1082,6 @@ String AnimatedSprite3D::get_configuration_warning() const { } void AnimatedSprite3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_sprite_frames", "sprite_frames"), &AnimatedSprite3D::set_sprite_frames); ClassDB::bind_method(D_METHOD("get_sprite_frames"), &AnimatedSprite3D::get_sprite_frames); @@ -1134,7 +1107,6 @@ void AnimatedSprite3D::_bind_methods() { } AnimatedSprite3D::AnimatedSprite3D() { - frame = 0; playing = false; animation = "default"; diff --git a/scene/3d/sprite_3d.h b/scene/3d/sprite_3d.h index 64bef41fd8..721bed56f1 100644 --- a/scene/3d/sprite_3d.h +++ b/scene/3d/sprite_3d.h @@ -35,7 +35,6 @@ #include "scene/3d/visual_instance_3d.h" class SpriteBase3D : public GeometryInstance3D { - GDCLASS(SpriteBase3D, GeometryInstance3D); mutable Ref<TriangleMesh> triangle_mesh; //cached @@ -145,7 +144,6 @@ public: }; class Sprite3D : public SpriteBase3D { - GDCLASS(Sprite3D, SpriteBase3D); Ref<Texture2D> texture; @@ -194,7 +192,6 @@ public: }; class AnimatedSprite3D : public SpriteBase3D { - GDCLASS(AnimatedSprite3D, SpriteBase3D); Ref<SpriteFrames> frames; diff --git a/scene/3d/vehicle_body_3d.cpp b/scene/3d/vehicle_body_3d.cpp index 66fcf0e40b..9c6b940b00 100644 --- a/scene/3d/vehicle_body_3d.cpp +++ b/scene/3d/vehicle_body_3d.cpp @@ -79,12 +79,11 @@ public: }; void VehicleWheel3D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - VehicleBody3D *cb = Object::cast_to<VehicleBody3D>(get_parent()); - if (!cb) + if (!cb) { return; + } body = cb; local_xform = get_transform(); cb->wheels.push_back(this); @@ -94,10 +93,10 @@ void VehicleWheel3D::_notification(int p_what) { m_wheelAxleCS = get_transform().basis.get_axis(Vector3::AXIS_X).normalized(); } if (p_what == NOTIFICATION_EXIT_TREE) { - VehicleBody3D *cb = Object::cast_to<VehicleBody3D>(get_parent()); - if (!cb) + if (!cb) { return; + } cb->wheels.erase(this); body = nullptr; } @@ -112,7 +111,6 @@ String VehicleWheel3D::get_configuration_warning() const { } void VehicleWheel3D::_update(PhysicsDirectBodyState3D *s) { - if (m_raycastInfo.m_isInContact) { @@ -145,77 +143,68 @@ void VehicleWheel3D::_update(PhysicsDirectBodyState3D *s) { } void VehicleWheel3D::set_radius(float p_radius) { - m_wheelRadius = p_radius; update_gizmo(); } float VehicleWheel3D::get_radius() const { - return m_wheelRadius; } void VehicleWheel3D::set_suspension_rest_length(float p_length) { - m_suspensionRestLength = p_length; update_gizmo(); } -float VehicleWheel3D::get_suspension_rest_length() const { +float VehicleWheel3D::get_suspension_rest_length() const { return m_suspensionRestLength; } void VehicleWheel3D::set_suspension_travel(float p_length) { - m_maxSuspensionTravelCm = p_length / 0.01; } -float VehicleWheel3D::get_suspension_travel() const { +float VehicleWheel3D::get_suspension_travel() const { return m_maxSuspensionTravelCm * 0.01; } void VehicleWheel3D::set_suspension_stiffness(float p_value) { - m_suspensionStiffness = p_value; } -float VehicleWheel3D::get_suspension_stiffness() const { +float VehicleWheel3D::get_suspension_stiffness() const { return m_suspensionStiffness; } void VehicleWheel3D::set_suspension_max_force(float p_value) { - m_maxSuspensionForce = p_value; } -float VehicleWheel3D::get_suspension_max_force() const { +float VehicleWheel3D::get_suspension_max_force() const { return m_maxSuspensionForce; } void VehicleWheel3D::set_damping_compression(float p_value) { - m_wheelsDampingCompression = p_value; } -float VehicleWheel3D::get_damping_compression() const { +float VehicleWheel3D::get_damping_compression() const { return m_wheelsDampingCompression; } void VehicleWheel3D::set_damping_relaxation(float p_value) { - m_wheelsDampingRelaxation = p_value; } -float VehicleWheel3D::get_damping_relaxation() const { +float VehicleWheel3D::get_damping_relaxation() const { return m_wheelsDampingRelaxation; } void VehicleWheel3D::set_friction_slip(float p_value) { - m_frictionSlip = p_value; } -float VehicleWheel3D::get_friction_slip() const { +float VehicleWheel3D::get_friction_slip() const { return m_frictionSlip; } @@ -232,7 +221,6 @@ bool VehicleWheel3D::is_in_contact() const { } void VehicleWheel3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_radius", "length"), &VehicleWheel3D::set_radius); ClassDB::bind_method(D_METHOD("get_radius"), &VehicleWheel3D::get_radius); @@ -303,65 +291,54 @@ void VehicleWheel3D::_bind_methods() { } void VehicleWheel3D::set_engine_force(float p_engine_force) { - m_engineForce = p_engine_force; } float VehicleWheel3D::get_engine_force() const { - return m_engineForce; } void VehicleWheel3D::set_brake(float p_brake) { - m_brake = p_brake; } -float VehicleWheel3D::get_brake() const { +float VehicleWheel3D::get_brake() const { return m_brake; } void VehicleWheel3D::set_steering(float p_steering) { - m_steering = p_steering; } -float VehicleWheel3D::get_steering() const { +float VehicleWheel3D::get_steering() const { return m_steering; } void VehicleWheel3D::set_use_as_traction(bool p_enable) { - engine_traction = p_enable; } bool VehicleWheel3D::is_used_as_traction() const { - return engine_traction; } void VehicleWheel3D::set_use_as_steering(bool p_enabled) { - steers = p_enabled; } bool VehicleWheel3D::is_used_as_steering() const { - return steers; } float VehicleWheel3D::get_skidinfo() const { - return m_skidInfo; } float VehicleWheel3D::get_rpm() const { - return m_rpm; } VehicleWheel3D::VehicleWheel3D() { - steers = false; engine_traction = false; m_steering = real_t(0.); @@ -389,7 +366,6 @@ VehicleWheel3D::VehicleWheel3D() { } void VehicleBody3D::_update_wheel_transform(VehicleWheel3D &wheel, PhysicsDirectBodyState3D *s) { - wheel.m_raycastInfo.m_isInContact = false; Transform chassisTrans = s->get_transform(); @@ -406,7 +382,6 @@ void VehicleBody3D::_update_wheel_transform(VehicleWheel3D &wheel, PhysicsDirect } void VehicleBody3D::_update_wheel(int p_idx, PhysicsDirectBodyState3D *s) { - VehicleWheel3D &wheel = *wheels[p_idx]; _update_wheel_transform(wheel, s); @@ -431,7 +406,6 @@ void VehicleBody3D::_update_wheel(int p_idx, PhysicsDirectBodyState3D *s) { } real_t VehicleBody3D::_ray_cast(int p_idx, PhysicsDirectBodyState3D *s) { - VehicleWheel3D &wheel = *wheels[p_idx]; _update_wheel_transform(wheel, s); @@ -462,8 +436,9 @@ real_t VehicleBody3D::_ray_cast(int p_idx, PhysicsDirectBodyState3D *s) { wheel.m_raycastInfo.m_contactNormalWS = rr.normal; wheel.m_raycastInfo.m_isInContact = true; - if (rr.collider) + if (rr.collider) { wheel.m_raycastInfo.m_groundObject = Object::cast_to<PhysicsBody3D>(rr.collider); + } real_t hitDistance = param * raylen; wheel.m_raycastInfo.m_suspensionLength = hitDistance - wheel.m_wheelRadius; @@ -514,7 +489,6 @@ real_t VehicleBody3D::_ray_cast(int p_idx, PhysicsDirectBodyState3D *s) { } void VehicleBody3D::_update_suspension(PhysicsDirectBodyState3D *s) { - real_t chassisMass = mass; for (int w_it = 0; w_it < wheels.size(); w_it++) { @@ -560,7 +534,6 @@ void VehicleBody3D::_update_suspension(PhysicsDirectBodyState3D *s) { //bilateral constraint between two dynamic objects void VehicleBody3D::_resolve_single_bilateral(PhysicsDirectBodyState3D *s, const Vector3 &pos1, PhysicsBody3D *body2, const Vector3 &pos2, const Vector3 &normal, real_t &impulse, const real_t p_rollInfluence) { - real_t normalLenSqr = normal.length_squared(); //ERR_FAIL_COND( normalLenSqr < real_t(1.1)); @@ -571,15 +544,17 @@ void VehicleBody3D::_resolve_single_bilateral(PhysicsDirectBodyState3D *s, const Vector3 rel_pos1 = pos1 - s->get_transform().origin; Vector3 rel_pos2; - if (body2) + if (body2) { rel_pos2 = pos2 - body2->get_global_transform().origin; + } //this jacobian entry could be re-used for all iterations Vector3 vel1 = s->get_linear_velocity() + (s->get_angular_velocity()).cross(rel_pos1); // * mPos); Vector3 vel2; - if (body2) + if (body2) { vel2 = body2->get_linear_velocity() + body2->get_angular_velocity().cross(rel_pos2); + } Vector3 vel = vel1 - vel2; @@ -668,15 +643,15 @@ VehicleBody3D::btVehicleWheelContactPoint::btVehicleWheelContactPoint(PhysicsDir } real_t VehicleBody3D::_calc_rolling_friction(btVehicleWheelContactPoint &contactPoint) { - real_t j1 = 0.f; const Vector3 &contactPosWorld = contactPoint.m_frictionPositionWorld; Vector3 rel_pos1 = contactPosWorld - contactPoint.m_s->get_transform().origin; Vector3 rel_pos2; - if (contactPoint.m_body1) + if (contactPoint.m_body1) { rel_pos2 = contactPosWorld - contactPoint.m_body1->get_global_transform().origin; + } real_t maxImpulse = contactPoint.m_maxImpulse; @@ -699,11 +674,11 @@ real_t VehicleBody3D::_calc_rolling_friction(btVehicleWheelContactPoint &contact static const real_t sideFrictionStiffness2 = real_t(1.0); void VehicleBody3D::_update_friction(PhysicsDirectBodyState3D *s) { - //calculate the impulse, so that the wheels don't move sidewards int numWheel = wheels.size(); - if (!numWheel) + if (!numWheel) { return; + } m_forwardWS.resize(numWheel); m_axle.resize(numWheel); @@ -717,13 +692,10 @@ void VehicleBody3D::_update_friction(PhysicsDirectBodyState3D *s) { } { - for (int i = 0; i < wheels.size(); i++) { - VehicleWheel3D &wheelInfo = *wheels[i]; if (wheelInfo.m_raycastInfo.m_isInContact) { - //const btTransform& wheelTrans = getWheelTransformWS( i ); Basis wheelBasis0 = wheelInfo.m_worldTransform.basis; //get_global_transform().basis; @@ -851,7 +823,6 @@ void VehicleBody3D::_update_friction(PhysicsDirectBodyState3D *s) { } void VehicleBody3D::_direct_state_changed(Object *p_state) { - RigidBody3D::_direct_state_changed(p_state); state = Object::cast_to<PhysicsDirectBodyState3D>(p_state); @@ -859,12 +830,10 @@ void VehicleBody3D::_direct_state_changed(Object *p_state) { float step = state->get_step(); for (int i = 0; i < wheels.size(); i++) { - _update_wheel(i, state); } for (int i = 0; i < wheels.size(); i++) { - _ray_cast(i, state); wheels[i]->set_transform(state->get_transform().inverse() * wheels[i]->m_worldTransform); } @@ -872,7 +841,6 @@ void VehicleBody3D::_direct_state_changed(Object *p_state) { _update_suspension(state); for (int i = 0; i < wheels.size(); i++) { - //apply suspension force VehicleWheel3D &wheel = *wheels[i]; @@ -921,49 +889,46 @@ void VehicleBody3D::_direct_state_changed(Object *p_state) { } void VehicleBody3D::set_engine_force(float p_engine_force) { - engine_force = p_engine_force; for (int i = 0; i < wheels.size(); i++) { VehicleWheel3D &wheelInfo = *wheels[i]; - if (wheelInfo.engine_traction) + if (wheelInfo.engine_traction) { wheelInfo.m_engineForce = p_engine_force; + } } } float VehicleBody3D::get_engine_force() const { - return engine_force; } void VehicleBody3D::set_brake(float p_brake) { - brake = p_brake; for (int i = 0; i < wheels.size(); i++) { VehicleWheel3D &wheelInfo = *wheels[i]; wheelInfo.m_brake = p_brake; } } -float VehicleBody3D::get_brake() const { +float VehicleBody3D::get_brake() const { return brake; } void VehicleBody3D::set_steering(float p_steering) { - m_steeringValue = p_steering; for (int i = 0; i < wheels.size(); i++) { VehicleWheel3D &wheelInfo = *wheels[i]; - if (wheelInfo.steers) + if (wheelInfo.steers) { wheelInfo.m_steering = p_steering; + } } } -float VehicleBody3D::get_steering() const { +float VehicleBody3D::get_steering() const { return m_steeringValue; } void VehicleBody3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_engine_force", "engine_force"), &VehicleBody3D::set_engine_force); ClassDB::bind_method(D_METHOD("get_engine_force"), &VehicleBody3D::get_engine_force); @@ -980,7 +945,6 @@ void VehicleBody3D::_bind_methods() { } VehicleBody3D::VehicleBody3D() { - m_pitchControl = 0; m_currentVehicleSpeedKmHour = real_t(0.); m_steeringValue = real_t(0.); diff --git a/scene/3d/vehicle_body_3d.h b/scene/3d/vehicle_body_3d.h index d5e896263d..e76f44acfd 100644 --- a/scene/3d/vehicle_body_3d.h +++ b/scene/3d/vehicle_body_3d.h @@ -36,7 +36,6 @@ class VehicleBody3D; class VehicleWheel3D : public Node3D { - GDCLASS(VehicleWheel3D, Node3D); friend class VehicleBody3D; @@ -152,7 +151,6 @@ public: }; class VehicleBody3D : public RigidBody3D { - GDCLASS(VehicleBody3D, RigidBody3D); float engine_force; diff --git a/scene/3d/velocity_tracker_3d.cpp b/scene/3d/velocity_tracker_3d.cpp index c9b95e6397..db10f3273b 100644 --- a/scene/3d/velocity_tracker_3d.cpp +++ b/scene/3d/velocity_tracker_3d.cpp @@ -32,16 +32,14 @@ #include "core/engine.h" void VelocityTracker3D::set_track_physics_step(bool p_track_physics_step) { - physics_step = p_track_physics_step; } bool VelocityTracker3D::is_tracking_physics_step() const { - return physics_step; } -void VelocityTracker3D::update_position(const Vector3 &p_position) { +void VelocityTracker3D::update_position(const Vector3 &p_position) { PositionHistory ph; ph.position = p_position; if (physics_step) { @@ -59,8 +57,8 @@ void VelocityTracker3D::update_position(const Vector3 &p_position) { position_history.write[0] = ph; } -Vector3 VelocityTracker3D::get_tracked_linear_velocity() const { +Vector3 VelocityTracker3D::get_tracked_linear_velocity() const { Vector3 linear_velocity; float max_time = 1 / 5.0; //maximum time to interpolate a velocity @@ -90,8 +88,9 @@ Vector3 VelocityTracker3D::get_tracked_linear_velocity() const { delta = double(diff) / 1000000.0; } - if (base_time + time_accum + delta > max_time) + if (base_time + time_accum + delta > max_time) { break; + } distance_accum += distance; time_accum += delta; @@ -105,7 +104,6 @@ Vector3 VelocityTracker3D::get_tracked_linear_velocity() const { } void VelocityTracker3D::reset(const Vector3 &p_new_pos) { - PositionHistory ph; ph.position = p_new_pos; if (physics_step) { @@ -119,7 +117,6 @@ void VelocityTracker3D::reset(const Vector3 &p_new_pos) { } void VelocityTracker3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_track_physics_step", "enable"), &VelocityTracker3D::set_track_physics_step); ClassDB::bind_method(D_METHOD("is_tracking_physics_step"), &VelocityTracker3D::is_tracking_physics_step); ClassDB::bind_method(D_METHOD("update_position", "position"), &VelocityTracker3D::update_position); diff --git a/scene/3d/visibility_notifier_3d.cpp b/scene/3d/visibility_notifier_3d.cpp index 2707a0a514..a64b0df1cc 100644 --- a/scene/3d/visibility_notifier_3d.cpp +++ b/scene/3d/visibility_notifier_3d.cpp @@ -37,7 +37,6 @@ #include "scene/scene_string_names.h" void VisibilityNotifier3D::_enter_camera(Camera3D *p_camera) { - ERR_FAIL_COND(cameras.has(p_camera)); cameras.insert(p_camera); if (cameras.size() == 1) { @@ -49,7 +48,6 @@ void VisibilityNotifier3D::_enter_camera(Camera3D *p_camera) { } void VisibilityNotifier3D::_exit_camera(Camera3D *p_camera) { - ERR_FAIL_COND(!cameras.has(p_camera)); cameras.erase(p_camera); @@ -62,9 +60,9 @@ void VisibilityNotifier3D::_exit_camera(Camera3D *p_camera) { } void VisibilityNotifier3D::set_aabb(const AABB &p_aabb) { - - if (aabb == p_aabb) + if (aabb == p_aabb) { return; + } aabb = p_aabb; if (is_inside_world()) { @@ -76,35 +74,28 @@ void VisibilityNotifier3D::set_aabb(const AABB &p_aabb) { } AABB VisibilityNotifier3D::get_aabb() const { - return aabb; } void VisibilityNotifier3D::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_ENTER_WORLD: { - get_world_3d()->_register_notifier(this, get_global_transform().xform(aabb)); } break; case NOTIFICATION_TRANSFORM_CHANGED: { - get_world_3d()->_update_notifier(this, get_global_transform().xform(aabb)); } break; case NOTIFICATION_EXIT_WORLD: { - get_world_3d()->_remove_notifier(this); } break; } } bool VisibilityNotifier3D::is_on_screen() const { - return cameras.size() != 0; } void VisibilityNotifier3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_aabb", "rect"), &VisibilityNotifier3D::set_aabb); ClassDB::bind_method(D_METHOD("get_aabb"), &VisibilityNotifier3D::get_aabb); ClassDB::bind_method(D_METHOD("is_on_screen"), &VisibilityNotifier3D::is_on_screen); @@ -118,7 +109,6 @@ void VisibilityNotifier3D::_bind_methods() { } VisibilityNotifier3D::VisibilityNotifier3D() { - aabb = AABB(Vector3(-1, -1, -1), Vector3(2, 2, 2)); set_notify_transform(true); } @@ -126,9 +116,7 @@ VisibilityNotifier3D::VisibilityNotifier3D() { ////////////////////////////////////// void VisibilityEnabler3D::_screen_enter() { - for (Map<Node *, Variant>::Element *E = nodes.front(); E; E = E->next()) { - _change_node_state(E->key(), true); } @@ -136,9 +124,7 @@ void VisibilityEnabler3D::_screen_enter() { } void VisibilityEnabler3D::_screen_exit() { - for (Map<Node *, Variant>::Element *E = nodes.front(); E; E = E->next()) { - _change_node_state(E->key(), false); } @@ -146,14 +132,12 @@ void VisibilityEnabler3D::_screen_exit() { } void VisibilityEnabler3D::_find_nodes(Node *p_node) { - bool add = false; Variant meta; { RigidBody3D *rb = Object::cast_to<RigidBody3D>(p_node); if (rb && ((rb->get_mode() == RigidBody3D::MODE_CHARACTER || rb->get_mode() == RigidBody3D::MODE_RIGID))) { - add = true; meta = rb->get_mode(); } @@ -167,7 +151,6 @@ void VisibilityEnabler3D::_find_nodes(Node *p_node) { } if (add) { - p_node->connect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &VisibilityEnabler3D::_node_removed), varray(p_node), CONNECT_ONESHOT); nodes[p_node] = meta; _change_node_state(p_node, false); @@ -175,37 +158,38 @@ void VisibilityEnabler3D::_find_nodes(Node *p_node) { for (int i = 0; i < p_node->get_child_count(); i++) { Node *c = p_node->get_child(i); - if (c->get_filename() != String()) + if (c->get_filename() != String()) { continue; //skip, instance + } _find_nodes(c); } } void VisibilityEnabler3D::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { return; + } Node *from = this; //find where current scene starts - while (from->get_parent() && from->get_filename() == String()) + while (from->get_parent() && from->get_filename() == String()) { from = from->get_parent(); + } _find_nodes(from); } if (p_what == NOTIFICATION_EXIT_TREE) { - - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { return; + } for (Map<Node *, Variant>::Element *E = nodes.front(); E; E = E->next()) { - - if (!visible) + if (!visible) { _change_node_state(E->key(), true); + } E->key()->disconnect(SceneStringNames::get_singleton()->tree_exiting, callable_mp(this, &VisibilityEnabler3D::_node_removed)); } @@ -214,35 +198,32 @@ void VisibilityEnabler3D::_notification(int p_what) { } void VisibilityEnabler3D::_change_node_state(Node *p_node, bool p_enabled) { - ERR_FAIL_COND(!nodes.has(p_node)); if (enabler[ENABLER_FREEZE_BODIES]) { RigidBody3D *rb = Object::cast_to<RigidBody3D>(p_node); - if (rb) - + if (rb) { rb->set_sleeping(!p_enabled); + } } if (enabler[ENABLER_PAUSE_ANIMATIONS]) { AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(p_node); if (ap) { - ap->set_active(p_enabled); } } } void VisibilityEnabler3D::_node_removed(Node *p_node) { - - if (!visible) + if (!visible) { _change_node_state(p_node, true); + } nodes.erase(p_node); } void VisibilityEnabler3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_enabler", "enabler", "enabled"), &VisibilityEnabler3D::set_enabler); ClassDB::bind_method(D_METHOD("is_enabler_enabled", "enabler"), &VisibilityEnabler3D::is_enabler_enabled); @@ -255,20 +236,19 @@ void VisibilityEnabler3D::_bind_methods() { } void VisibilityEnabler3D::set_enabler(Enabler p_enabler, bool p_enable) { - ERR_FAIL_INDEX(p_enabler, ENABLER_MAX); enabler[p_enabler] = p_enable; } -bool VisibilityEnabler3D::is_enabler_enabled(Enabler p_enabler) const { +bool VisibilityEnabler3D::is_enabler_enabled(Enabler p_enabler) const { ERR_FAIL_INDEX_V(p_enabler, ENABLER_MAX, false); return enabler[p_enabler]; } VisibilityEnabler3D::VisibilityEnabler3D() { - - for (int i = 0; i < ENABLER_MAX; i++) + for (int i = 0; i < ENABLER_MAX; i++) { enabler[i] = true; + } visible = false; } diff --git a/scene/3d/visibility_notifier_3d.h b/scene/3d/visibility_notifier_3d.h index 19204a6a4e..3864b398f4 100644 --- a/scene/3d/visibility_notifier_3d.h +++ b/scene/3d/visibility_notifier_3d.h @@ -35,7 +35,6 @@ class Camera3D; class VisibilityNotifier3D : public Node3D { - GDCLASS(VisibilityNotifier3D, Node3D); Set<Camera3D *> cameras; @@ -62,7 +61,6 @@ public: }; class VisibilityEnabler3D : public VisibilityNotifier3D { - GDCLASS(VisibilityEnabler3D, VisibilityNotifier3D); public: diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index 4724c88a30..a1c498e8ab 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -35,25 +35,21 @@ #include "skeleton_3d.h" AABB VisualInstance3D::get_transformed_aabb() const { - return get_global_transform().xform(get_aabb()); } void VisualInstance3D::_update_visibility() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _change_notify("visible"); RS::get_singleton()->instance_set_visible(get_instance(), is_visible_in_tree()); } void VisualInstance3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_WORLD: { - // CHECK SKELETON => moving skeleton attaching logic to MeshInstance /* Skeleton *skeleton=Object::cast_to<Skeleton>(get_parent()); @@ -66,42 +62,35 @@ void VisualInstance3D::_notification(int p_what) { } break; case NOTIFICATION_TRANSFORM_CHANGED: { - Transform gt = get_global_transform(); RenderingServer::get_singleton()->instance_set_transform(instance, gt); } break; case NOTIFICATION_EXIT_WORLD: { - RenderingServer::get_singleton()->instance_set_scenario(instance, RID()); RenderingServer::get_singleton()->instance_attach_skeleton(instance, RID()); //RS::get_singleton()->instance_geometry_set_baked_light_sampler(instance, RID() ); } break; case NOTIFICATION_VISIBILITY_CHANGED: { - _update_visibility(); } break; } } RID VisualInstance3D::get_instance() const { - return instance; } RID VisualInstance3D::_get_visual_instance_rid() const { - return instance; } void VisualInstance3D::set_layer_mask(uint32_t p_mask) { - layers = p_mask; RenderingServer::get_singleton()->instance_set_layer_mask(instance, p_mask); } uint32_t VisualInstance3D::get_layer_mask() const { - return layers; } @@ -120,7 +109,6 @@ bool VisualInstance3D::get_layer_mask_bit(int p_layer) const { } void VisualInstance3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("_get_visual_instance_rid"), &VisualInstance3D::_get_visual_instance_rid); ClassDB::bind_method(D_METHOD("set_base", "base"), &VisualInstance3D::set_base); ClassDB::bind_method(D_METHOD("get_base"), &VisualInstance3D::get_base); @@ -136,18 +124,15 @@ void VisualInstance3D::_bind_methods() { } void VisualInstance3D::set_base(const RID &p_base) { - RenderingServer::get_singleton()->instance_set_base(instance, p_base); base = p_base; } RID VisualInstance3D::get_base() const { - return base; } VisualInstance3D::VisualInstance3D() { - instance = RenderingServer::get_singleton()->instance_create(); RenderingServer::get_singleton()->instance_attach_object_instance_id(instance, get_instance_id()); layers = 1; @@ -155,62 +140,51 @@ VisualInstance3D::VisualInstance3D() { } VisualInstance3D::~VisualInstance3D() { - RenderingServer::get_singleton()->free(instance); } void GeometryInstance3D::set_material_override(const Ref<Material> &p_material) { - material_override = p_material; RS::get_singleton()->instance_geometry_set_material_override(get_instance(), p_material.is_valid() ? p_material->get_rid() : RID()); } Ref<Material> GeometryInstance3D::get_material_override() const { - return material_override; } void GeometryInstance3D::set_lod_min_distance(float p_dist) { - lod_min_distance = p_dist; RS::get_singleton()->instance_geometry_set_draw_range(get_instance(), lod_min_distance, lod_max_distance, lod_min_hysteresis, lod_max_hysteresis); } float GeometryInstance3D::get_lod_min_distance() const { - return lod_min_distance; } void GeometryInstance3D::set_lod_max_distance(float p_dist) { - lod_max_distance = p_dist; RS::get_singleton()->instance_geometry_set_draw_range(get_instance(), lod_min_distance, lod_max_distance, lod_min_hysteresis, lod_max_hysteresis); } float GeometryInstance3D::get_lod_max_distance() const { - return lod_max_distance; } void GeometryInstance3D::set_lod_min_hysteresis(float p_dist) { - lod_min_hysteresis = p_dist; RS::get_singleton()->instance_geometry_set_draw_range(get_instance(), lod_min_distance, lod_max_distance, lod_min_hysteresis, lod_max_hysteresis); } float GeometryInstance3D::get_lod_min_hysteresis() const { - return lod_min_hysteresis; } void GeometryInstance3D::set_lod_max_hysteresis(float p_dist) { - lod_max_hysteresis = p_dist; RS::get_singleton()->instance_geometry_set_draw_range(get_instance(), lod_min_distance, lod_max_distance, lod_min_hysteresis, lod_max_hysteresis); } float GeometryInstance3D::get_lod_max_hysteresis() const { - return lod_max_hysteresis; } @@ -262,6 +236,7 @@ bool GeometryInstance3D::_get(const StringName &p_name, Variant &r_ret) const { return false; } + void GeometryInstance3D::_get_property_list(List<PropertyInfo> *p_list) const { List<PropertyInfo> pinfo; RS::get_singleton()->instance_geometry_get_shader_parameter_list(get_instance(), &pinfo); @@ -284,31 +259,26 @@ void GeometryInstance3D::_get_property_list(List<PropertyInfo> *p_list) const { } void GeometryInstance3D::set_cast_shadows_setting(ShadowCastingSetting p_shadow_casting_setting) { - shadow_casting_setting = p_shadow_casting_setting; RS::get_singleton()->instance_geometry_set_cast_shadows_setting(get_instance(), (RS::ShadowCastingSetting)p_shadow_casting_setting); } GeometryInstance3D::ShadowCastingSetting GeometryInstance3D::get_cast_shadows_setting() const { - return shadow_casting_setting; } void GeometryInstance3D::set_extra_cull_margin(float p_margin) { - ERR_FAIL_COND(p_margin < 0); extra_cull_margin = p_margin; RS::get_singleton()->instance_set_extra_visibility_margin(get_instance(), extra_cull_margin); } float GeometryInstance3D::get_extra_cull_margin() const { - return extra_cull_margin; } void GeometryInstance3D::set_shader_instance_uniform(const StringName &p_uniform, const Variant &p_value) { - if (p_value.get_type() == Variant::NIL) { Variant def_value = RS::get_singleton()->instance_geometry_get_shader_parameter_default_value(get_instance(), p_uniform); RS::get_singleton()->instance_geometry_set_shader_parameter(get_instance(), p_uniform, def_value); @@ -320,11 +290,10 @@ void GeometryInstance3D::set_shader_instance_uniform(const StringName &p_uniform } Variant GeometryInstance3D::get_shader_instance_uniform(const StringName &p_uniform) const { - return RS::get_singleton()->instance_geometry_get_shader_parameter(get_instance(), p_uniform); } -void GeometryInstance3D::set_custom_aabb(AABB aabb) { +void GeometryInstance3D::set_custom_aabb(AABB aabb) { RS::get_singleton()->instance_set_custom_aabb(get_instance(), aabb); } @@ -338,7 +307,6 @@ GeometryInstance3D::LightmapScale GeometryInstance3D::get_lightmap_scale() const } void GeometryInstance3D::set_gi_mode(GIMode p_mode) { - switch (p_mode) { case GI_MODE_DISABLED: { RS::get_singleton()->instance_geometry_set_flag(get_instance(), RS::INSTANCE_FLAG_USE_BAKED_LIGHT, false); @@ -363,7 +331,6 @@ GeometryInstance3D::GIMode GeometryInstance3D::get_gi_mode() const { } void GeometryInstance3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_material_override", "material"), &GeometryInstance3D::set_material_override); ClassDB::bind_method(D_METHOD("get_material_override"), &GeometryInstance3D::get_material_override); diff --git a/scene/3d/visual_instance_3d.h b/scene/3d/visual_instance_3d.h index a871c65b6a..195674f62d 100644 --- a/scene/3d/visual_instance_3d.h +++ b/scene/3d/visual_instance_3d.h @@ -37,7 +37,6 @@ #include "scene/resources/material.h" class VisualInstance3D : public Node3D { - GDCLASS(VisualInstance3D, Node3D); OBJ_CATEGORY("3D Visual Nodes"); @@ -81,7 +80,6 @@ public: }; class GeometryInstance3D : public VisualInstance3D { - GDCLASS(GeometryInstance3D, VisualInstance3D); public: diff --git a/scene/3d/voxelizer.cpp b/scene/3d/voxelizer.cpp index f9c3810843..9fc3feb49a 100644 --- a/scene/3d/voxelizer.cpp +++ b/scene/3d/voxelizer.cpp @@ -36,7 +36,6 @@ #include <stdlib.h> static _FORCE_INLINE_ void get_uv_and_normal(const Vector3 &p_pos, const Vector3 *p_vtx, const Vector2 *p_uv, const Vector3 *p_normal, Vector2 &r_uv, Vector3 &r_normal) { - if (p_pos.distance_squared_to(p_vtx[0]) < CMP_EPSILON2) { r_uv = p_uv[0]; r_normal = p_normal[0]; @@ -77,7 +76,6 @@ static _FORCE_INLINE_ void get_uv_and_normal(const Vector3 &p_pos, const Vector3 } void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, const Vector3 *p_vtx, const Vector3 *p_normal, const Vector2 *p_uv, const MaterialCache &p_material, const AABB &p_aabb) { - if (p_level == cell_subdiv) { //plot the face by guessing its albedo and emission value @@ -89,7 +87,6 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co Vector3 normal = plane.normal; for (int i = 0; i < 3; i++) { - Vector3 axis; axis[i] = 1.0; float dot = ABS(normal.dot(axis)); @@ -117,11 +114,9 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co //map to a grid average in the best axis for this face for (int i = 0; i < color_scan_cell_width; i++) { - Vector3 ofs_i = float(i) * t1; for (int j = 0; j < color_scan_cell_width; j++) { - Vector3 ofs_j = float(j) * t2; Vector3 from = p_aabb.position + ofs_i + ofs_j; @@ -147,7 +142,6 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co if (ABS(plane.distance_to(ray_from)) < ABS(plane.distance_to(ray_to))) { intersection = plane.project(ray_from); } else { - intersection = plane.project(ray_to); } } @@ -157,8 +151,9 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co Vector2 uv; Vector3 lnormal; get_uv_and_normal(intersection, p_vtx, p_uv, p_normal, uv, lnormal); - if (lnormal == Vector3()) //just in case normal as nor provided + if (lnormal == Vector3()) { //just in case normal as nor provided lnormal = normal; + } int uv_x = CLAMP(int(Math::fposmod(uv.x, 1.0f) * bake_texture_size), 0, bake_texture_size - 1); int uv_y = CLAMP(int(Math::fposmod(uv.y, 1.0f) * bake_texture_size), 0, bake_texture_size - 1); @@ -188,8 +183,9 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co Vector3 lnormal; Vector2 uv; get_uv_and_normal(inters, p_vtx, p_uv, p_normal, uv, normal); - if (lnormal == Vector3()) //just in case normal as nor provided + if (lnormal == Vector3()) { //just in case normal as nor provided lnormal = normal; + } int uv_x = CLAMP(Math::fposmod(uv.x, 1.0f) * bake_texture_size, 0, bake_texture_size - 1); int uv_y = CLAMP(Math::fposmod(uv.y, 1.0f) * bake_texture_size, 0, bake_texture_size - 1); @@ -210,7 +206,6 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co normal_accum = lnormal * alpha; } else { - float accdiv = 1.0 / (color_scan_cell_width * color_scan_cell_width); alpha *= accdiv; @@ -243,7 +238,6 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co int half = (1 << cell_subdiv) >> (p_level + 1); for (int i = 0; i < 8; i++) { - AABB aabb = p_aabb; aabb.size *= 0.5; @@ -264,8 +258,9 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co nz += half; } //make sure to not plot beyond limits - if (nx < 0 || nx >= axis_cell_size[0] || ny < 0 || ny >= axis_cell_size[1] || nz < 0 || nz >= axis_cell_size[2]) + if (nx < 0 || nx >= axis_cell_size[0] || ny < 0 || ny >= axis_cell_size[1] || nz < 0 || nz >= axis_cell_size[2]) { continue; + } { AABB test_aabb = aabb; @@ -297,11 +292,9 @@ void Voxelizer::_plot_face(int p_idx, int p_level, int p_x, int p_y, int p_z, co } Vector<Color> Voxelizer::_get_bake_texture(Ref<Image> p_image, const Color &p_color_mul, const Color &p_color_add) { - Vector<Color> ret; if (p_image.is_null() || p_image->empty()) { - ret.resize(bake_texture_size * bake_texture_size); for (int i = 0; i < bake_texture_size * bake_texture_size; i++) { ret.write[i] = p_color_add; @@ -335,7 +328,6 @@ Vector<Color> Voxelizer::_get_bake_texture(Ref<Image> p_image, const Color &p_co } Voxelizer::MaterialCache Voxelizer::_get_material_cache(Ref<Material> p_material) { - //this way of obtaining materials is inaccurate and also does not support some compressed formats very well Ref<StandardMaterial3D> mat = p_material; @@ -348,12 +340,10 @@ Voxelizer::MaterialCache Voxelizer::_get_material_cache(Ref<Material> p_material MaterialCache mc; if (mat.is_valid()) { - Ref<Texture2D> albedo_tex = mat->get_texture(StandardMaterial3D::TEXTURE_ALBEDO); Ref<Image> img_albedo; if (albedo_tex.is_valid()) { - img_albedo = albedo_tex->get_data(); mc.albedo = _get_bake_texture(img_albedo, mat->get_albedo(), Color(0, 0, 0)); // albedo texture, color is multiplicative } else { @@ -368,7 +358,6 @@ Voxelizer::MaterialCache Voxelizer::_get_material_cache(Ref<Material> p_material Ref<Image> img_emission; if (emission_tex.is_valid()) { - img_emission = emission_tex->get_data(); } @@ -390,11 +379,10 @@ Voxelizer::MaterialCache Voxelizer::_get_material_cache(Ref<Material> p_material } void Voxelizer::plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, const Vector<Ref<Material>> &p_materials, const Ref<Material> &p_override_material) { - for (int i = 0; i < p_mesh->get_surface_count(); i++) { - - if (p_mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) + if (p_mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) { continue; //only triangles + } Ref<Material> src_material; @@ -426,12 +414,10 @@ void Voxelizer::plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, const Vec } if (index.size()) { - int facecount = index.size() / 3; const int *ir = index.ptr(); for (int j = 0; j < facecount; j++) { - Vector3 vtxs[3]; Vector2 uvs[3]; Vector3 normal[3]; @@ -453,18 +439,17 @@ void Voxelizer::plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, const Vec } //test against original bounds - if (!Geometry::triangle_box_overlap(original_bounds.position + original_bounds.size * 0.5, original_bounds.size * 0.5, vtxs)) + if (!Geometry::triangle_box_overlap(original_bounds.position + original_bounds.size * 0.5, original_bounds.size * 0.5, vtxs)) { continue; + } //plot _plot_face(0, 0, 0, 0, 0, vtxs, normal, uvs, material, po2_bounds); } } else { - int facecount = vertices.size() / 3; for (int j = 0; j < facecount; j++) { - Vector3 vtxs[3]; Vector2 uvs[3]; Vector3 normal[3]; @@ -486,8 +471,9 @@ void Voxelizer::plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, const Vec } //test against original bounds - if (!Geometry::triangle_box_overlap(original_bounds.position + original_bounds.size * 0.5, original_bounds.size * 0.5, vtxs)) + if (!Geometry::triangle_box_overlap(original_bounds.position + original_bounds.size * 0.5, original_bounds.size * 0.5, vtxs)) { continue; + } //plot face _plot_face(0, 0, 0, 0, 0, vtxs, normal, uvs, material, po2_bounds); } @@ -498,7 +484,6 @@ void Voxelizer::plot_mesh(const Transform &p_xform, Ref<Mesh> &p_mesh, const Vec } void Voxelizer::_sort() { - // cells need to be sorted by level and coordinates // it is important that level has more priority (for compute), and that Z has the least, // given it may aid older implementations plot using GPU @@ -507,7 +492,6 @@ void Voxelizer::_sort() { uint32_t cell_count = bake_cells.size(); sorted_cells.resize(cell_count); { - CellSort *sort_cellsp = sorted_cells.ptrw(); const Cell *bake_cellsp = bake_cells.ptr(); @@ -540,7 +524,6 @@ void Voxelizer::_sort() { } { - const CellSort *sort_cellsp = sorted_cells.ptr(); const Cell *bake_cellsp = bake_cells.ptr(); const uint32_t *reverse_mapp = reverse_map.ptr(); @@ -563,9 +546,7 @@ void Voxelizer::_sort() { } void Voxelizer::_fixup_plot(int p_idx, int p_level) { - if (p_level == cell_subdiv) { - leaf_voxel_count++; float alpha = bake_cells[p_idx].alpha; @@ -604,7 +585,6 @@ void Voxelizer::_fixup_plot(int p_idx, int p_level) { }*/ } else { - //go down bake_cells.write[p_idx].emission[0] = 0; @@ -621,11 +601,11 @@ void Voxelizer::_fixup_plot(int p_idx, int p_level) { int children_found = 0; for (int i = 0; i < 8; i++) { - uint32_t child = bake_cells[p_idx].children[i]; - if (child == CHILD_EMPTY) + if (child == CHILD_EMPTY) { continue; + } _fixup_plot(child, p_level + 1); alpha_average += bake_cells[child].alpha; @@ -638,7 +618,6 @@ void Voxelizer::_fixup_plot(int p_idx, int p_level) { } void Voxelizer::begin_bake(int p_subdiv, const AABB &p_bounds) { - sorted = false; original_bounds = p_bounds; cell_subdiv = p_subdiv; @@ -653,9 +632,9 @@ void Voxelizer::begin_bake(int p_subdiv, const AABB &p_bounds) { leaf_voxel_count = 0; for (int i = 0; i < 3; i++) { - - if (i == longest_axis) + if (i == longest_axis) { continue; + } axis_cell_size[i] = axis_cell_size[longest_axis]; float axis_size = po2_bounds.size[longest_axis]; @@ -693,9 +672,11 @@ void Voxelizer::end_bake() { int Voxelizer::get_gi_probe_octree_depth() const { return cell_subdiv; } + Vector3i Voxelizer::get_giprobe_octree_size() const { return Vector3i(axis_cell_size[0], axis_cell_size[1], axis_cell_size[2]); } + int Voxelizer::get_giprobe_cell_count() const { return bake_cells.size(); } @@ -711,7 +692,6 @@ Vector<uint8_t> Voxelizer::get_giprobe_octree_cells() const { uint32_t cell_count = bake_cells.size(); for (uint32_t i = 0; i < cell_count; i++) { - for (uint32_t j = 0; j < 8; j++) { children_cells[i * 8 + j] = cells[i].children[j]; } @@ -720,6 +700,7 @@ Vector<uint8_t> Voxelizer::get_giprobe_octree_cells() const { return data; } + Vector<uint8_t> Voxelizer::get_giprobe_data_cells() const { Vector<uint8_t> data; data.resize((4 * 4) * bake_cells.size()); //8 uint32t values @@ -731,7 +712,6 @@ Vector<uint8_t> Voxelizer::get_giprobe_data_cells() const { uint32_t cell_count = bake_cells.size(); for (uint32_t i = 0; i < cell_count; i++) { - { //position uint32_t x = cells[i].x; @@ -803,7 +783,6 @@ Vector<int> Voxelizer::get_giprobe_level_cell_count() const { /* dt of 1d function using squared distance */ static void edt(float *f, int stride, int n) { - float *d = (float *)alloca(sizeof(float) * n + sizeof(int) * n + sizeof(float) * (n + 1)); int *v = (int *)&(d[n]); float *z = (float *)&v[n]; @@ -827,8 +806,9 @@ static void edt(float *f, int stride, int n) { k = 0; for (int q = 0; q <= n - 1; q++) { - while (z[k + 1] < q) + while (z[k + 1] < q) { k++; + } d[q] = square(q - v[k]) + f[v[k] * stride]; } @@ -840,7 +820,6 @@ static void edt(float *f, int stride, int n) { #undef square Vector<uint8_t> Voxelizer::get_sdf_3d_image() const { - Vector3i octree_size = get_giprobe_octree_size(); uint32_t float_count = octree_size.x * octree_size.y * octree_size.z; @@ -858,7 +837,6 @@ Vector<uint8_t> Voxelizer::get_sdf_3d_image() const { uint32_t cell_count = bake_cells.size(); for (uint32_t i = 0; i < cell_count; i++) { - if (cells[i].level < (cell_subdiv - 1)) { continue; //do not care about this level } @@ -912,9 +890,7 @@ Vector<uint8_t> Voxelizer::get_sdf_3d_image() const { #undef INF void Voxelizer::_debug_mesh(int p_idx, int p_level, const AABB &p_aabb, Ref<MultiMesh> &p_multimesh, int &idx) { - if (p_level == cell_subdiv - 1) { - Vector3 center = p_aabb.position + p_aabb.size * 0.5; Transform xform; xform.origin = center; @@ -928,23 +904,25 @@ void Voxelizer::_debug_mesh(int p_idx, int p_level, const AABB &p_aabb, Ref<Mult idx++; } else { - for (int i = 0; i < 8; i++) { - uint32_t child = bake_cells[p_idx].children[i]; - if (child == CHILD_EMPTY || child >= (uint32_t)max_original_cells) + if (child == CHILD_EMPTY || child >= (uint32_t)max_original_cells) { continue; + } AABB aabb = p_aabb; aabb.size *= 0.5; - if (i & 1) + if (i & 1) { aabb.position.x += aabb.size.x; - if (i & 2) + } + if (i & 2) { aabb.position.y += aabb.size.y; - if (i & 4) + } + if (i & 4) { aabb.position.z += aabb.size.z; + } _debug_mesh(bake_cells[p_idx].children[i], p_level + 1, aabb, p_multimesh, idx); } @@ -952,7 +930,6 @@ void Voxelizer::_debug_mesh(int p_idx, int p_level, const AABB &p_aabb, Ref<Mult } Ref<MultiMesh> Voxelizer::create_debug_multimesh() { - Ref<MultiMesh> mm; mm.instance(); @@ -975,22 +952,20 @@ Ref<MultiMesh> Voxelizer::create_debug_multimesh() { colors.push_back(Color(1, 1, 1, 1)); for (int i = 0; i < 6; i++) { - Vector3 face_points[4]; for (int j = 0; j < 4; j++) { - float v[3]; v[0] = 1.0; v[1] = 1 - 2 * ((j >> 1) & 1); v[2] = v[1] * (1 - 2 * (j & 1)); for (int k = 0; k < 3; k++) { - - if (i < 3) + if (i < 3) { face_points[j][(i + k) % 3] = v[k]; - else + } else { face_points[3 - j][(i + k) % 3] = -v[k]; + } } } @@ -1031,6 +1006,7 @@ Ref<MultiMesh> Voxelizer::create_debug_multimesh() { Transform Voxelizer::get_to_cell_space_xform() const { return to_cell_space; } + Voxelizer::Voxelizer() { sorted = false; color_scan_cell_width = 4; diff --git a/scene/3d/voxelizer.h b/scene/3d/voxelizer.h index 1fde6237a2..3546fd7729 100644 --- a/scene/3d/voxelizer.h +++ b/scene/3d/voxelizer.h @@ -43,7 +43,6 @@ private: }; struct Cell { - uint32_t children[8]; float albedo[3]; //albedo in RGB24 float emission[3]; //accumulated light in 16:16 fixed point (needs to be integer for moving lights fast) diff --git a/scene/3d/world_environment.cpp b/scene/3d/world_environment.cpp index 8dbb709ae4..24071f31f3 100644 --- a/scene/3d/world_environment.cpp +++ b/scene/3d/world_environment.cpp @@ -32,9 +32,7 @@ #include "scene/main/window.h" void WorldEnvironment::_notification(int p_what) { - if (p_what == Node3D::NOTIFICATION_ENTER_WORLD || p_what == Node3D::NOTIFICATION_ENTER_TREE) { - if (environment.is_valid()) { if (get_viewport()->find_world_3d()->get_environment().is_valid()) { WARN_PRINT("World already has an environment (Another WorldEnvironment?), overriding."); @@ -52,7 +50,6 @@ void WorldEnvironment::_notification(int p_what) { } } else if (p_what == Node3D::NOTIFICATION_EXIT_WORLD || p_what == Node3D::NOTIFICATION_EXIT_TREE) { - if (environment.is_valid() && get_viewport()->find_world_3d()->get_environment() == environment) { get_viewport()->find_world_3d()->set_environment(Ref<Environment>()); remove_from_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); @@ -66,7 +63,6 @@ void WorldEnvironment::_notification(int p_what) { } void WorldEnvironment::set_environment(const Ref<Environment> &p_environment) { - if (is_inside_tree() && environment.is_valid() && get_viewport()->find_world_3d()->get_environment() == environment) { get_viewport()->find_world_3d()->set_environment(Ref<Environment>()); remove_from_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); @@ -86,12 +82,10 @@ void WorldEnvironment::set_environment(const Ref<Environment> &p_environment) { } Ref<Environment> WorldEnvironment::get_environment() const { - return environment; } void WorldEnvironment::set_camera_effects(const Ref<CameraEffects> &p_camera_effects) { - if (is_inside_tree() && camera_effects.is_valid() && get_viewport()->find_world_3d()->get_camera_effects() == camera_effects) { get_viewport()->find_world_3d()->set_camera_effects(Ref<CameraEffects>()); remove_from_group("_world_camera_effects_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id())); @@ -111,18 +105,17 @@ void WorldEnvironment::set_camera_effects(const Ref<CameraEffects> &p_camera_eff } Ref<CameraEffects> WorldEnvironment::get_camera_effects() const { - return camera_effects; } String WorldEnvironment::get_configuration_warning() const { - if (!environment.is_valid()) { return TTR("WorldEnvironment requires its \"Environment\" property to contain an Environment to have a visible effect."); } - if (!is_inside_tree()) + if (!is_inside_tree()) { return String(); + } List<Node *> nodes; get_tree()->get_nodes_in_group("_world_environment_" + itos(get_viewport()->find_world_3d()->get_scenario().get_id()), &nodes); @@ -135,7 +128,6 @@ String WorldEnvironment::get_configuration_warning() const { } void WorldEnvironment::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_environment", "env"), &WorldEnvironment::set_environment); ClassDB::bind_method(D_METHOD("get_environment"), &WorldEnvironment::get_environment); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "environment", PROPERTY_HINT_RESOURCE_TYPE, "Environment"), "set_environment", "get_environment"); diff --git a/scene/3d/world_environment.h b/scene/3d/world_environment.h index e4c9fc071d..ddb2af7bd3 100644 --- a/scene/3d/world_environment.h +++ b/scene/3d/world_environment.h @@ -34,7 +34,6 @@ #include "scene/3d/node_3d.h" class WorldEnvironment : public Node { - GDCLASS(WorldEnvironment, Node); Ref<Environment> environment; diff --git a/scene/3d/xr_nodes.cpp b/scene/3d/xr_nodes.cpp index 1b13b64744..f9f6b6905c 100644 --- a/scene/3d/xr_nodes.cpp +++ b/scene/3d/xr_nodes.cpp @@ -55,8 +55,9 @@ void XRCamera3D::_notification(int p_what) { }; String XRCamera3D::get_configuration_warning() const { - if (!is_visible() || !is_inside_tree()) + if (!is_visible() || !is_inside_tree()) { return String(); + } // must be child node of XROrigin3D! XROrigin3D *origin = Object::cast_to<XROrigin3D>(get_parent()); @@ -364,8 +365,9 @@ XRPositionalTracker::TrackerHand XRController3D::get_hand() const { }; String XRController3D::get_configuration_warning() const { - if (!is_visible() || !is_inside_tree()) + if (!is_visible() || !is_inside_tree()) { return String(); + } // must be child node of XROrigin! XROrigin3D *origin = Object::cast_to<XROrigin3D>(get_parent()); @@ -443,7 +445,6 @@ void XRAnchor3D::_notification(int p_what) { }; void XRAnchor3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_anchor_id", "anchor_id"), &XRAnchor3D::set_anchor_id); ClassDB::bind_method(D_METHOD("get_anchor_id"), &XRAnchor3D::get_anchor_id); ADD_PROPERTY(PropertyInfo(Variant::INT, "anchor_id", PROPERTY_HINT_RANGE, "0,32,1"), "set_anchor_id", "get_anchor_id"); @@ -491,8 +492,9 @@ bool XRAnchor3D::get_is_active() const { }; String XRAnchor3D::get_configuration_warning() const { - if (!is_visible() || !is_inside_tree()) + if (!is_visible() || !is_inside_tree()) { return String(); + } // must be child node of XROrigin3D! XROrigin3D *origin = Object::cast_to<XROrigin3D>(get_parent()); @@ -532,11 +534,13 @@ XRAnchor3D::~XRAnchor3D(){ //////////////////////////////////////////////////////////////////////////////////////////////////// String XROrigin3D::get_configuration_warning() const { - if (!is_visible() || !is_inside_tree()) + if (!is_visible() || !is_inside_tree()) { return String(); + } - if (tracked_camera == nullptr) + if (tracked_camera == nullptr) { return TTR("XROrigin3D requires an XRCamera3D child node."); + } return String(); }; diff --git a/scene/3d/xr_nodes.h b/scene/3d/xr_nodes.h index 55dcfe087e..4685328f16 100644 --- a/scene/3d/xr_nodes.h +++ b/scene/3d/xr_nodes.h @@ -44,7 +44,6 @@ XRCamera is a subclass of camera which will register itself with its parent XROrigin and as a result is automatically positioned */ class XRCamera3D : public Camera3D { - GDCLASS(XRCamera3D, Camera3D); protected: @@ -69,7 +68,6 @@ public: */ class XRController3D : public Node3D { - GDCLASS(XRController3D, Node3D); private: @@ -150,7 +148,6 @@ public: This node will automatically locate any camera child nodes and update its position while our XRController3D node will handle tracked controllers. */ class XROrigin3D : public Node3D { - GDCLASS(XROrigin3D, Node3D); private: diff --git a/scene/animation/animation_blend_space_1d.cpp b/scene/animation/animation_blend_space_1d.cpp index 3502f5e961..e426e98def 100644 --- a/scene/animation/animation_blend_space_1d.cpp +++ b/scene/animation/animation_blend_space_1d.cpp @@ -33,6 +33,7 @@ void AnimationNodeBlendSpace1D::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::FLOAT, blend_position)); } + Variant AnimationNodeBlendSpace1D::get_parameter_default_value(const StringName &p_parameter) const { return 0; } @@ -167,7 +168,6 @@ void AnimationNodeBlendSpace1D::remove_blend_point(int p_point) { } int AnimationNodeBlendSpace1D::get_blend_point_count() const { - return blend_points_used; } @@ -220,7 +220,6 @@ void AnimationNodeBlendSpace1D::_add_blend_point(int p_index, const Ref<Animatio } float AnimationNodeBlendSpace1D::process(float p_time, bool p_seek) { - if (blend_points_used == 0) { return 0.0; } @@ -241,7 +240,6 @@ float AnimationNodeBlendSpace1D::process(float p_time, bool p_seek) { // find the closest two points to blend between for (int i = 0; i < blend_points_used; i++) { - float pos = blend_points[i].position; if (pos <= blend_pos) { @@ -276,7 +274,6 @@ float AnimationNodeBlendSpace1D::process(float p_time, bool p_seek) { weights[point_lower] = 1.0; } else { - // we are between two points. // figure out weights, then blend the animations @@ -311,7 +308,6 @@ String AnimationNodeBlendSpace1D::get_caption() const { } AnimationNodeBlendSpace1D::AnimationNodeBlendSpace1D() { - for (int i = 0; i < MAX_BLEND_POINTS; i++) { blend_points[i].name = itos(i); } diff --git a/scene/animation/animation_blend_space_2d.cpp b/scene/animation/animation_blend_space_2d.cpp index ad60249f9a..003a4fad90 100644 --- a/scene/animation/animation_blend_space_2d.cpp +++ b/scene/animation/animation_blend_space_2d.cpp @@ -37,6 +37,7 @@ void AnimationNodeBlendSpace2D::get_parameter_list(List<PropertyInfo> *r_list) c r_list->push_back(PropertyInfo(Variant::INT, closest, PROPERTY_HINT_NONE, "", 0)); r_list->push_back(PropertyInfo(Variant::FLOAT, length_internal, PROPERTY_HINT_NONE, "", 0)); } + Variant AnimationNodeBlendSpace2D::get_parameter_default_value(const StringName &p_parameter) const { if (p_parameter == closest) { return -1; @@ -91,6 +92,7 @@ void AnimationNodeBlendSpace2D::set_blend_point_position(int p_point, const Vect blend_points[p_point].position = p_position; _queue_auto_triangles(); } + void AnimationNodeBlendSpace2D::set_blend_point_node(int p_point, const Ref<AnimationRootNode> &p_node) { ERR_FAIL_INDEX(p_point, blend_points_used); ERR_FAIL_COND(p_node.is_null()); @@ -103,14 +105,17 @@ void AnimationNodeBlendSpace2D::set_blend_point_node(int p_point, const Ref<Anim emit_signal("tree_changed"); } + Vector2 AnimationNodeBlendSpace2D::get_blend_point_position(int p_point) const { ERR_FAIL_INDEX_V(p_point, blend_points_used, Vector2()); return blend_points[p_point].position; } + Ref<AnimationRootNode> AnimationNodeBlendSpace2D::get_blend_point_node(int p_point) const { ERR_FAIL_INDEX_V(p_point, blend_points_used, Ref<AnimationRootNode>()); return blend_points[p_point].node; } + void AnimationNodeBlendSpace2D::remove_blend_point(int p_point) { ERR_FAIL_INDEX(p_point, blend_points_used); @@ -142,12 +147,10 @@ void AnimationNodeBlendSpace2D::remove_blend_point(int p_point) { } int AnimationNodeBlendSpace2D::get_blend_point_count() const { - return blend_points_used; } bool AnimationNodeBlendSpace2D::has_triangle(int p_x, int p_y, int p_z) const { - ERR_FAIL_INDEX_V(p_x, blend_points_used, false); ERR_FAIL_INDEX_V(p_y, blend_points_used, false); ERR_FAIL_INDEX_V(p_z, blend_points_used, false); @@ -168,15 +171,15 @@ bool AnimationNodeBlendSpace2D::has_triangle(int p_x, int p_y, int p_z) const { break; } } - if (all_equal) + if (all_equal) { return true; + } } return false; } void AnimationNodeBlendSpace2D::add_triangle(int p_x, int p_y, int p_z, int p_at_index) { - ERR_FAIL_INDEX(p_x, blend_points_used); ERR_FAIL_INDEX(p_y, blend_points_used); ERR_FAIL_INDEX(p_z, blend_points_used); @@ -208,14 +211,15 @@ void AnimationNodeBlendSpace2D::add_triangle(int p_x, int p_y, int p_z, int p_at triangles.insert(p_at_index, t); } } -int AnimationNodeBlendSpace2D::get_triangle_point(int p_triangle, int p_point) { +int AnimationNodeBlendSpace2D::get_triangle_point(int p_triangle, int p_point) { _update_triangles(); ERR_FAIL_INDEX_V(p_point, 3, -1); ERR_FAIL_INDEX_V(p_triangle, triangles.size(), -1); return triangles[p_triangle].points[p_point]; } + void AnimationNodeBlendSpace2D::remove_triangle(int p_triangle) { ERR_FAIL_INDEX(p_triangle, triangles.size()); @@ -227,7 +231,6 @@ int AnimationNodeBlendSpace2D::get_triangle_count() const { } void AnimationNodeBlendSpace2D::set_min_space(const Vector2 &p_min) { - min_space = p_min; if (min_space.x >= max_space.x) { min_space.x = max_space.x - 1; @@ -236,12 +239,12 @@ void AnimationNodeBlendSpace2D::set_min_space(const Vector2 &p_min) { min_space.y = max_space.y - 1; } } + Vector2 AnimationNodeBlendSpace2D::get_min_space() const { return min_space; } void AnimationNodeBlendSpace2D::set_max_space(const Vector2 &p_max) { - max_space = p_max; if (max_space.x <= min_space.x) { max_space.x = min_space.x + 1; @@ -250,6 +253,7 @@ void AnimationNodeBlendSpace2D::set_max_space(const Vector2 &p_max) { max_space.y = min_space.y + 1; } } + Vector2 AnimationNodeBlendSpace2D::get_max_space() const { return max_space; } @@ -257,6 +261,7 @@ Vector2 AnimationNodeBlendSpace2D::get_max_space() const { void AnimationNodeBlendSpace2D::set_snap(const Vector2 &p_snap) { snap = p_snap; } + Vector2 AnimationNodeBlendSpace2D::get_snap() const { return snap; } @@ -264,6 +269,7 @@ Vector2 AnimationNodeBlendSpace2D::get_snap() const { void AnimationNodeBlendSpace2D::set_x_label(const String &p_label) { x_label = p_label; } + String AnimationNodeBlendSpace2D::get_x_label() const { return x_label; } @@ -271,6 +277,7 @@ String AnimationNodeBlendSpace2D::get_x_label() const { void AnimationNodeBlendSpace2D::set_y_label(const String &p_label) { y_label = p_label; } + String AnimationNodeBlendSpace2D::get_y_label() const { return y_label; } @@ -284,9 +291,9 @@ void AnimationNodeBlendSpace2D::_add_blend_point(int p_index, const Ref<Animatio } void AnimationNodeBlendSpace2D::_set_triangles(const Vector<int> &p_triangles) { - - if (auto_triangles) + if (auto_triangles) { return; + } ERR_FAIL_COND(p_triangles.size() % 3 != 0); for (int i = 0; i < p_triangles.size(); i += 3) { add_triangle(p_triangles[i + 0], p_triangles[i + 1], p_triangles[i + 2]); @@ -294,10 +301,10 @@ void AnimationNodeBlendSpace2D::_set_triangles(const Vector<int> &p_triangles) { } Vector<int> AnimationNodeBlendSpace2D::_get_triangles() const { - Vector<int> t; - if (auto_triangles && trianges_dirty) + if (auto_triangles && trianges_dirty) { return t; + } t.resize(triangles.size() * 3); for (int i = 0; i < triangles.size(); i++) { @@ -318,9 +325,9 @@ void AnimationNodeBlendSpace2D::_queue_auto_triangles() { } void AnimationNodeBlendSpace2D::_update_triangles() { - - if (!auto_triangles || !trianges_dirty) + if (!auto_triangles || !trianges_dirty) { return; + } trianges_dirty = false; triangles.clear(); @@ -344,11 +351,11 @@ void AnimationNodeBlendSpace2D::_update_triangles() { } Vector2 AnimationNodeBlendSpace2D::get_closest_point(const Vector2 &p_point) { - _update_triangles(); - if (triangles.size() == 0) + if (triangles.size() == 0) { return Vector2(); + } Vector2 best_point; bool first = true; @@ -360,7 +367,6 @@ Vector2 AnimationNodeBlendSpace2D::get_closest_point(const Vector2 &p_point) { } if (Geometry::is_point_in_triangle(p_point, points[0], points[1], points[2])) { - return p_point; } @@ -381,7 +387,6 @@ Vector2 AnimationNodeBlendSpace2D::get_closest_point(const Vector2 &p_point) { } void AnimationNodeBlendSpace2D::_blend_triangle(const Vector2 &p_pos, const Vector2 *p_points, float *r_weights) { - if (p_pos.distance_squared_to(p_points[0]) < CMP_EPSILON2) { r_weights[0] = 1; r_weights[1] = 0; @@ -427,7 +432,6 @@ void AnimationNodeBlendSpace2D::_blend_triangle(const Vector2 &p_pos, const Vect } float AnimationNodeBlendSpace2D::process(float p_time, bool p_seek) { - _update_triangles(); Vector2 blend_pos = get_parameter(blend_position); @@ -436,9 +440,9 @@ float AnimationNodeBlendSpace2D::process(float p_time, bool p_seek) { float mind = 0; //time of min distance point if (blend_mode == BLEND_MODE_INTERPOLATED) { - - if (triangles.size() == 0) + if (triangles.size() == 0) { return 0; + } Vector2 best_point; bool first = true; @@ -452,7 +456,6 @@ float AnimationNodeBlendSpace2D::process(float p_time, bool p_seek) { } if (Geometry::is_point_in_triangle(blend_pos, points[0], points[1], points[2])) { - blend_triangle = i; _blend_triangle(blend_pos, points, blend_weights); break; @@ -494,7 +497,6 @@ float AnimationNodeBlendSpace2D::process(float p_time, bool p_seek) { first = true; for (int i = 0; i < blend_points_used; i++) { - bool found = false; for (int j = 0; j < 3; j++) { if (i == triangle_points[j]) { @@ -515,22 +517,18 @@ float AnimationNodeBlendSpace2D::process(float p_time, bool p_seek) { } } } else { - int new_closest = -1; float new_closest_dist = 1e20; for (int i = 0; i < blend_points_used; i++) { - float d = blend_points[i].position.distance_squared_to(blend_pos); if (d < new_closest_dist) { - new_closest = i; new_closest_dist = d; } } if (new_closest != closest && new_closest != -1) { - float from = 0; if (blend_mode == BLEND_MODE_DISCRETE_CARRY && closest != -1) { //see how much animation remains @@ -557,7 +555,6 @@ String AnimationNodeBlendSpace2D::get_caption() const { } void AnimationNodeBlendSpace2D::_validate_property(PropertyInfo &property) const { - if (auto_triangles && property.name == "triangles") { property.usage = 0; } @@ -601,7 +598,6 @@ AnimationNodeBlendSpace2D::BlendMode AnimationNodeBlendSpace2D::get_blend_mode() } void AnimationNodeBlendSpace2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_blend_point", "node", "pos", "at_index"), &AnimationNodeBlendSpace2D::add_blend_point, DEFVAL(-1)); ClassDB::bind_method(D_METHOD("set_blend_point_position", "point", "pos"), &AnimationNodeBlendSpace2D::set_blend_point_position); ClassDB::bind_method(D_METHOD("get_blend_point_position", "point"), &AnimationNodeBlendSpace2D::get_blend_point_position); @@ -666,7 +662,6 @@ void AnimationNodeBlendSpace2D::_bind_methods() { } AnimationNodeBlendSpace2D::AnimationNodeBlendSpace2D() { - for (int i = 0; i < MAX_BLEND_POINTS; i++) { blend_points[i].name = itos(i); } diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp index 570735ad87..56995c0c13 100644 --- a/scene/animation/animation_blend_tree.cpp +++ b/scene/animation/animation_blend_tree.cpp @@ -46,13 +46,12 @@ Vector<String> (*AnimationNodeAnimation::get_editable_animation_list)() = nullpt void AnimationNodeAnimation::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::FLOAT, time, PROPERTY_HINT_NONE, "", 0)); } -void AnimationNodeAnimation::_validate_property(PropertyInfo &property) const { +void AnimationNodeAnimation::_validate_property(PropertyInfo &property) const { if (property.name == "animation" && get_editable_animation_list) { Vector<String> names = get_editable_animation_list(); String anims; for (int i = 0; i < names.size(); i++) { - if (i > 0) { anims += ","; } @@ -66,14 +65,12 @@ void AnimationNodeAnimation::_validate_property(PropertyInfo &property) const { } float AnimationNodeAnimation::process(float p_time, bool p_seek) { - AnimationPlayer *ap = state->player; ERR_FAIL_COND_V(!ap, 0); float time = get_parameter(this->time); if (!ap->has_animation(animation)) { - AnimationNodeBlendTree *tree = Object::cast_to<AnimationNodeBlendTree>(parent); if (tree) { String name = tree->get_node_name(Ref<AnimationNodeAnimation>(this)); @@ -101,13 +98,11 @@ float AnimationNodeAnimation::process(float p_time, bool p_seek) { float anim_size = anim->get_length(); if (anim->has_loop()) { - if (anim_size) { time = Math::fposmod(time, anim_size); } } else if (time > anim_size) { - time = anim_size; } @@ -156,56 +151,50 @@ Variant AnimationNodeOneShot::get_parameter_default_value(const StringName &p_pa } void AnimationNodeOneShot::set_fadein_time(float p_time) { - fade_in = p_time; } void AnimationNodeOneShot::set_fadeout_time(float p_time) { - fade_out = p_time; } float AnimationNodeOneShot::get_fadein_time() const { - return fade_in; } -float AnimationNodeOneShot::get_fadeout_time() const { +float AnimationNodeOneShot::get_fadeout_time() const { return fade_out; } void AnimationNodeOneShot::set_autorestart(bool p_active) { - autorestart = p_active; } -void AnimationNodeOneShot::set_autorestart_delay(float p_time) { +void AnimationNodeOneShot::set_autorestart_delay(float p_time) { autorestart_delay = p_time; } -void AnimationNodeOneShot::set_autorestart_random_delay(float p_time) { +void AnimationNodeOneShot::set_autorestart_random_delay(float p_time) { autorestart_random_delay = p_time; } bool AnimationNodeOneShot::has_autorestart() const { - return autorestart; } -float AnimationNodeOneShot::get_autorestart_delay() const { +float AnimationNodeOneShot::get_autorestart_delay() const { return autorestart_delay; } -float AnimationNodeOneShot::get_autorestart_random_delay() const { +float AnimationNodeOneShot::get_autorestart_random_delay() const { return autorestart_random_delay; } void AnimationNodeOneShot::set_mix_mode(MixMode p_mix) { - mix = p_mix; } -AnimationNodeOneShot::MixMode AnimationNodeOneShot::get_mix_mode() const { +AnimationNodeOneShot::MixMode AnimationNodeOneShot::get_mix_mode() const { return mix; } @@ -218,7 +207,6 @@ bool AnimationNodeOneShot::has_filter() const { } float AnimationNodeOneShot::process(float p_time, bool p_seek) { - bool active = get_parameter(this->active); bool prev_active = get_parameter(this->prev_active); float time = get_parameter(this->time); @@ -247,8 +235,9 @@ float AnimationNodeOneShot::process(float p_time, bool p_seek) { bool os_seek = p_seek; - if (p_seek) + if (p_seek) { time = p_time; + } bool do_start = !prev_active; if (do_start) { @@ -260,20 +249,21 @@ float AnimationNodeOneShot::process(float p_time, bool p_seek) { float blend; if (time < fade_in) { - - if (fade_in > 0) + if (fade_in > 0) { blend = time / fade_in; - else + } else { blend = 0; //wtf + } } else if (!do_start && remaining < fade_out) { - - if (fade_out) + if (fade_out) { blend = (remaining / fade_out); - else + } else { blend = 1.0; - } else + } + } else { blend = 1.0; + } float main_rem; if (mix == MIX_MODE_ADD) { @@ -306,18 +296,16 @@ float AnimationNodeOneShot::process(float p_time, bool p_seek) { return MAX(main_rem, remaining); } -void AnimationNodeOneShot::set_use_sync(bool p_sync) { +void AnimationNodeOneShot::set_use_sync(bool p_sync) { sync = p_sync; } bool AnimationNodeOneShot::is_using_sync() const { - return sync; } void AnimationNodeOneShot::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_fadein_time", "time"), &AnimationNodeOneShot::set_fadein_time); ClassDB::bind_method(D_METHOD("get_fadein_time"), &AnimationNodeOneShot::get_fadein_time); @@ -356,7 +344,6 @@ void AnimationNodeOneShot::_bind_methods() { } AnimationNodeOneShot::AnimationNodeOneShot() { - add_input("in"); add_input("shot"); @@ -381,6 +368,7 @@ AnimationNodeOneShot::AnimationNodeOneShot() { void AnimationNodeAdd2::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::FLOAT, add_amount, PROPERTY_HINT_RANGE, "0,1,0.01")); } + Variant AnimationNodeAdd2::get_parameter_default_value(const StringName &p_parameter) const { return 0; } @@ -388,23 +376,20 @@ Variant AnimationNodeAdd2::get_parameter_default_value(const StringName &p_param String AnimationNodeAdd2::get_caption() const { return "Add2"; } -void AnimationNodeAdd2::set_use_sync(bool p_sync) { +void AnimationNodeAdd2::set_use_sync(bool p_sync) { sync = p_sync; } bool AnimationNodeAdd2::is_using_sync() const { - return sync; } bool AnimationNodeAdd2::has_filter() const { - return true; } float AnimationNodeAdd2::process(float p_time, bool p_seek) { - float amount = get_parameter(add_amount); float rem0 = blend_input(0, p_time, p_seek, 1.0, FILTER_IGNORE, !sync); blend_input(1, p_time, p_seek, amount, FILTER_PASS, !sync); @@ -413,7 +398,6 @@ float AnimationNodeAdd2::process(float p_time, bool p_seek) { } void AnimationNodeAdd2::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeAdd2::set_use_sync); ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeAdd2::is_using_sync); @@ -421,7 +405,6 @@ void AnimationNodeAdd2::_bind_methods() { } AnimationNodeAdd2::AnimationNodeAdd2() { - add_amount = "add_amount"; add_input("in"); add_input("add"); @@ -433,6 +416,7 @@ AnimationNodeAdd2::AnimationNodeAdd2() { void AnimationNodeAdd3::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::FLOAT, add_amount, PROPERTY_HINT_RANGE, "-1,1,0.01")); } + Variant AnimationNodeAdd3::get_parameter_default_value(const StringName &p_parameter) const { return 0; } @@ -440,23 +424,20 @@ Variant AnimationNodeAdd3::get_parameter_default_value(const StringName &p_param String AnimationNodeAdd3::get_caption() const { return "Add3"; } -void AnimationNodeAdd3::set_use_sync(bool p_sync) { +void AnimationNodeAdd3::set_use_sync(bool p_sync) { sync = p_sync; } bool AnimationNodeAdd3::is_using_sync() const { - return sync; } bool AnimationNodeAdd3::has_filter() const { - return true; } float AnimationNodeAdd3::process(float p_time, bool p_seek) { - float amount = get_parameter(add_amount); blend_input(0, p_time, p_seek, MAX(0, -amount), FILTER_PASS, !sync); float rem0 = blend_input(1, p_time, p_seek, 1.0, FILTER_IGNORE, !sync); @@ -466,7 +447,6 @@ float AnimationNodeAdd3::process(float p_time, bool p_seek) { } void AnimationNodeAdd3::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeAdd3::set_use_sync); ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeAdd3::is_using_sync); @@ -474,18 +454,19 @@ void AnimationNodeAdd3::_bind_methods() { } AnimationNodeAdd3::AnimationNodeAdd3() { - add_amount = "add_amount"; add_input("-add"); add_input("in"); add_input("+add"); sync = false; } + ///////////////////////////////////////////// void AnimationNodeBlend2::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::FLOAT, blend_amount, PROPERTY_HINT_RANGE, "0,1,0.01")); } + Variant AnimationNodeBlend2::get_parameter_default_value(const StringName &p_parameter) const { return 0; //for blend amount } @@ -495,7 +476,6 @@ String AnimationNodeBlend2::get_caption() const { } float AnimationNodeBlend2::process(float p_time, bool p_seek) { - float amount = get_parameter(blend_amount); float rem0 = blend_input(0, p_time, p_seek, 1.0 - amount, FILTER_BLEND, !sync); @@ -505,26 +485,24 @@ float AnimationNodeBlend2::process(float p_time, bool p_seek) { } void AnimationNodeBlend2::set_use_sync(bool p_sync) { - sync = p_sync; } bool AnimationNodeBlend2::is_using_sync() const { - return sync; } bool AnimationNodeBlend2::has_filter() const { - return true; } -void AnimationNodeBlend2::_bind_methods() { +void AnimationNodeBlend2::_bind_methods() { ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeBlend2::set_use_sync); ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeBlend2::is_using_sync); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync"), "set_use_sync", "is_using_sync"); } + AnimationNodeBlend2::AnimationNodeBlend2() { blend_amount = "blend_amount"; add_input("in"); @@ -537,6 +515,7 @@ AnimationNodeBlend2::AnimationNodeBlend2() { void AnimationNodeBlend3::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::FLOAT, blend_amount, PROPERTY_HINT_RANGE, "-1,1,0.01")); } + Variant AnimationNodeBlend3::get_parameter_default_value(const StringName &p_parameter) const { return 0; //for blend amount } @@ -546,17 +525,14 @@ String AnimationNodeBlend3::get_caption() const { } void AnimationNodeBlend3::set_use_sync(bool p_sync) { - sync = p_sync; } bool AnimationNodeBlend3::is_using_sync() const { - return sync; } float AnimationNodeBlend3::process(float p_time, bool p_seek) { - float amount = get_parameter(blend_amount); float rem0 = blend_input(0, p_time, p_seek, MAX(0, -amount), FILTER_IGNORE, !sync); float rem1 = blend_input(1, p_time, p_seek, 1.0 - ABS(amount), FILTER_IGNORE, !sync); @@ -566,12 +542,12 @@ float AnimationNodeBlend3::process(float p_time, bool p_seek) { } void AnimationNodeBlend3::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_sync", "enable"), &AnimationNodeBlend3::set_use_sync); ClassDB::bind_method(D_METHOD("is_using_sync"), &AnimationNodeBlend3::is_using_sync); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sync"), "set_use_sync", "is_using_sync"); } + AnimationNodeBlend3::AnimationNodeBlend3() { blend_amount = "blend_amount"; add_input("-blend"); @@ -585,6 +561,7 @@ AnimationNodeBlend3::AnimationNodeBlend3() { void AnimationNodeTimeScale::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::FLOAT, scale, PROPERTY_HINT_RANGE, "0,32,0.01,or_greater")); } + Variant AnimationNodeTimeScale::get_parameter_default_value(const StringName &p_parameter) const { return 1.0; //initial timescale } @@ -594,7 +571,6 @@ String AnimationNodeTimeScale::get_caption() const { } float AnimationNodeTimeScale::process(float p_time, bool p_seek) { - float scale = get_parameter(this->scale); if (p_seek) { return blend_input(0, p_time, true, 1.0, FILTER_IGNORE, false); @@ -605,6 +581,7 @@ float AnimationNodeTimeScale::process(float p_time, bool p_seek) { void AnimationNodeTimeScale::_bind_methods() { } + AnimationNodeTimeScale::AnimationNodeTimeScale() { scale = "scale"; add_input("in"); @@ -615,6 +592,7 @@ AnimationNodeTimeScale::AnimationNodeTimeScale() { void AnimationNodeTimeSeek::get_parameter_list(List<PropertyInfo> *r_list) const { r_list->push_back(PropertyInfo(Variant::FLOAT, seek_pos, PROPERTY_HINT_RANGE, "-1,3600,0.01,or_greater")); } + Variant AnimationNodeTimeSeek::get_parameter_default_value(const StringName &p_parameter) const { return 1.0; //initial timescale } @@ -624,7 +602,6 @@ String AnimationNodeTimeSeek::get_caption() const { } float AnimationNodeTimeSeek::process(float p_time, bool p_seek) { - float seek_pos = get_parameter(this->seek_pos); if (p_seek) { return blend_input(0, p_time, true, 1.0, FILTER_IGNORE, false); @@ -649,7 +626,6 @@ AnimationNodeTimeSeek::AnimationNodeTimeSeek() { ///////////////////////////////////////////////// void AnimationNodeTransition::get_parameter_list(List<PropertyInfo> *r_list) const { - String anims; for (int i = 0; i < enabled_inputs; i++) { if (i > 0) { @@ -664,6 +640,7 @@ void AnimationNodeTransition::get_parameter_list(List<PropertyInfo> *r_list) con r_list->push_back(PropertyInfo(Variant::FLOAT, time, PROPERTY_HINT_NONE, "", 0)); r_list->push_back(PropertyInfo(Variant::FLOAT, prev_xfading, PROPERTY_HINT_NONE, "", 0)); } + Variant AnimationNodeTransition::get_parameter_default_value(const StringName &p_parameter) const { if (p_parameter == time || p_parameter == prev_xfading) { return 0.0; @@ -728,7 +705,6 @@ float AnimationNodeTransition::get_cross_fade_time() const { } float AnimationNodeTransition::process(float p_time, bool p_seek) { - int current = get_parameter(this->current); int prev = get_parameter(this->prev); int prev_current = get_parameter(this->prev_current); @@ -758,13 +734,13 @@ float AnimationNodeTransition::process(float p_time, bool p_seek) { rem = blend_input(current, p_time, p_seek, 1.0, FILTER_IGNORE, false); - if (p_seek) + if (p_seek) { time = p_time; - else + } else { time += p_time; + } if (inputs[current].auto_advance && rem <= xfade) { - set_parameter(this->current, (current + 1) % enabled_inputs); } @@ -776,7 +752,6 @@ float AnimationNodeTransition::process(float p_time, bool p_seek) { rem = blend_input(current, 0, true, 1.0 - blend, FILTER_IGNORE, false); } else { - rem = blend_input(current, p_time, p_seek, 1.0 - blend, FILTER_IGNORE, false); } @@ -800,7 +775,6 @@ float AnimationNodeTransition::process(float p_time, bool p_seek) { } void AnimationNodeTransition::_validate_property(PropertyInfo &property) const { - if (property.name.begins_with("input_")) { String n = property.name.get_slicec('/', 0).get_slicec('_', 1); if (n != "count") { @@ -815,7 +789,6 @@ void AnimationNodeTransition::_validate_property(PropertyInfo &property) const { } void AnimationNodeTransition::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_enabled_inputs", "amount"), &AnimationNodeTransition::set_enabled_inputs); ClassDB::bind_method(D_METHOD("get_enabled_inputs"), &AnimationNodeTransition::get_enabled_inputs); @@ -838,7 +811,6 @@ void AnimationNodeTransition::_bind_methods() { } AnimationNodeTransition::AnimationNodeTransition() { - prev_xfading = "prev_xfading"; prev = "prev"; time = "time"; @@ -869,7 +841,6 @@ AnimationNodeOutput::AnimationNodeOutput() { /////////////////////////////////////////////////////// void AnimationNodeBlendTree::add_node(const StringName &p_name, Ref<AnimationNode> p_node, const Vector2 &p_position) { - ERR_FAIL_COND(nodes.has(p_name)); ERR_FAIL_COND(p_node.is_null()); ERR_FAIL_COND(p_name == SceneStringNames::get_singleton()->output); @@ -889,7 +860,6 @@ void AnimationNodeBlendTree::add_node(const StringName &p_name, Ref<AnimationNod } Ref<AnimationNode> AnimationNodeBlendTree::get_node(const StringName &p_name) const { - ERR_FAIL_COND_V(!nodes.has(p_name), Ref<AnimationNode>()); return nodes[p_name].node; @@ -935,13 +905,13 @@ void AnimationNodeBlendTree::get_child_nodes(List<ChildNode> *r_child_nodes) { bool AnimationNodeBlendTree::has_node(const StringName &p_name) const { return nodes.has(p_name); } -Vector<StringName> AnimationNodeBlendTree::get_node_connection_array(const StringName &p_name) const { +Vector<StringName> AnimationNodeBlendTree::get_node_connection_array(const StringName &p_name) const { ERR_FAIL_COND_V(!nodes.has(p_name), Vector<StringName>()); return nodes[p_name].connections; } -void AnimationNodeBlendTree::remove_node(const StringName &p_name) { +void AnimationNodeBlendTree::remove_node(const StringName &p_name) { ERR_FAIL_COND(!nodes.has(p_name)); ERR_FAIL_COND(p_name == SceneStringNames::get_singleton()->output); //can't delete output @@ -967,7 +937,6 @@ void AnimationNodeBlendTree::remove_node(const StringName &p_name) { } void AnimationNodeBlendTree::rename_node(const StringName &p_name, const StringName &p_new_name) { - ERR_FAIL_COND(!nodes.has(p_name)); ERR_FAIL_COND(nodes.has(p_new_name)); ERR_FAIL_COND(p_name == SceneStringNames::get_singleton()->output); @@ -980,7 +949,6 @@ void AnimationNodeBlendTree::rename_node(const StringName &p_name, const StringN //rename connections for (Map<StringName, Node>::Element *E = nodes.front(); E; E = E->next()) { - for (int i = 0; i < E->get().connections.size(); i++) { if (E->get().connections[i] == p_name) { E->get().connections.write[i] = p_new_name; @@ -994,7 +962,6 @@ void AnimationNodeBlendTree::rename_node(const StringName &p_name, const StringN } void AnimationNodeBlendTree::connect_node(const StringName &p_input_node, int p_input_index, const StringName &p_output_node) { - ERR_FAIL_COND(!nodes.has(p_output_node)); ERR_FAIL_COND(!nodes.has(p_input_node)); ERR_FAIL_COND(p_output_node == SceneStringNames::get_singleton()->output); @@ -1016,7 +983,6 @@ void AnimationNodeBlendTree::connect_node(const StringName &p_input_node, int p_ } void AnimationNodeBlendTree::disconnect_node(const StringName &p_node, int p_input_index) { - ERR_FAIL_COND(!nodes.has(p_node)); Ref<AnimationNode> input = nodes[p_node].node; @@ -1026,7 +992,6 @@ void AnimationNodeBlendTree::disconnect_node(const StringName &p_node, int p_inp } AnimationNodeBlendTree::ConnectionError AnimationNodeBlendTree::can_connect_node(const StringName &p_input_node, int p_input_index, const StringName &p_output_node) const { - if (!nodes.has(p_output_node) || p_output_node == SceneStringNames::get_singleton()->output) { return CONNECTION_ERROR_NO_OUTPUT; } @@ -1061,7 +1026,6 @@ AnimationNodeBlendTree::ConnectionError AnimationNodeBlendTree::can_connect_node } void AnimationNodeBlendTree::get_node_connections(List<NodeConnection> *r_connections) const { - for (Map<StringName, Node>::Element *E = nodes.front(); E; E = E->next()) { for (int i = 0; i < E->get().connections.size(); i++) { StringName output = E->get().connections[i]; @@ -1081,25 +1045,21 @@ String AnimationNodeBlendTree::get_caption() const { } float AnimationNodeBlendTree::process(float p_time, bool p_seek) { - Ref<AnimationNodeOutput> output = nodes[SceneStringNames::get_singleton()->output].node; return _blend_node("output", nodes[SceneStringNames::get_singleton()->output].connections, this, output, p_time, p_seek, 1.0); } void AnimationNodeBlendTree::get_node_list(List<StringName> *r_list) { - for (Map<StringName, Node>::Element *E = nodes.front(); E; E = E->next()) { r_list->push_back(E->key()); } } void AnimationNodeBlendTree::set_graph_offset(const Vector2 &p_graph_offset) { - graph_offset = p_graph_offset; } Vector2 AnimationNodeBlendTree::get_graph_offset() const { - return graph_offset; } @@ -1108,10 +1068,8 @@ Ref<AnimationNode> AnimationNodeBlendTree::get_child_by_name(const StringName &p } bool AnimationNodeBlendTree::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; if (name.begins_with("nodes/")) { - String node_name = name.get_slicec('/', 1); String what = name.get_slicec('/', 2); @@ -1124,14 +1082,12 @@ bool AnimationNodeBlendTree::_set(const StringName &p_name, const Variant &p_val } if (what == "position") { - if (nodes.has(node_name)) { nodes[node_name].position = p_value; } return true; } } else if (name == "node_connections") { - Array conns = p_value; ERR_FAIL_COND_V(conns.size() % 3 != 0, false); @@ -1145,7 +1101,6 @@ bool AnimationNodeBlendTree::_set(const StringName &p_name, const Variant &p_val } bool AnimationNodeBlendTree::_get(const StringName &p_name, Variant &r_ret) const { - String name = p_name; if (name.begins_with("nodes/")) { String node_name = name.get_slicec('/', 1); @@ -1159,7 +1114,6 @@ bool AnimationNodeBlendTree::_get(const StringName &p_name, Variant &r_ret) cons } if (what == "position") { - if (nodes.has(node_name)) { r_ret = nodes[node_name].position; return true; @@ -1185,8 +1139,8 @@ bool AnimationNodeBlendTree::_get(const StringName &p_name, Variant &r_ret) cons return false; } -void AnimationNodeBlendTree::_get_property_list(List<PropertyInfo> *p_list) const { +void AnimationNodeBlendTree::_get_property_list(List<PropertyInfo> *p_list) const { List<StringName> names; for (Map<StringName, Node>::Element *E = nodes.front(); E; E = E->next()) { names.push_back(E->key()); @@ -1209,13 +1163,11 @@ void AnimationNodeBlendTree::_tree_changed() { } void AnimationNodeBlendTree::_node_changed(const StringName &p_node) { - ERR_FAIL_COND(!nodes.has(p_node)); nodes[p_node].connections.resize(nodes[p_node].node->get_input_count()); } void AnimationNodeBlendTree::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_node", "name", "node", "position"), &AnimationNodeBlendTree::add_node, DEFVAL(Vector2())); ClassDB::bind_method(D_METHOD("get_node", "name"), &AnimationNodeBlendTree::get_node); ClassDB::bind_method(D_METHOD("remove_node", "name"), &AnimationNodeBlendTree::remove_node); @@ -1241,7 +1193,6 @@ void AnimationNodeBlendTree::_bind_methods() { } AnimationNodeBlendTree::AnimationNodeBlendTree() { - Ref<AnimationNodeOutput> output; output.instance(); Node n; diff --git a/scene/animation/animation_blend_tree.h b/scene/animation/animation_blend_tree.h index 7ebe3f5444..5c722d00f9 100644 --- a/scene/animation/animation_blend_tree.h +++ b/scene/animation/animation_blend_tree.h @@ -34,7 +34,6 @@ #include "scene/animation/animation_tree.h" class AnimationNodeAnimation : public AnimationRootNode { - GDCLASS(AnimationNodeAnimation, AnimationRootNode); StringName animation; @@ -268,7 +267,6 @@ class AnimationNodeTransition : public AnimationNode { MAX_INPUTS = 32 }; struct InputData { - String name; bool auto_advance; InputData() { auto_advance = false; } diff --git a/scene/animation/animation_cache.cpp b/scene/animation/animation_cache.cpp index ab8be47b4d..abb2cf1b65 100644 --- a/scene/animation/animation_cache.cpp +++ b/scene/animation/animation_cache.cpp @@ -31,7 +31,6 @@ #include "animation_cache.h" void AnimationCache::_node_exit_tree(Node *p_node) { - //it is one shot, so it disconnects upon arrival ERR_FAIL_COND(!connected_nodes.has(p_node)); @@ -39,23 +38,20 @@ void AnimationCache::_node_exit_tree(Node *p_node) { connected_nodes.erase(p_node); for (int i = 0; i < path_cache.size(); i++) { - - if (path_cache[i].node != p_node) + if (path_cache[i].node != p_node) { continue; + } path_cache.write[i].valid = false; //invalidate path cache } } void AnimationCache::_animation_changed() { - _clear_cache(); } void AnimationCache::_clear_cache() { - while (connected_nodes.size()) { - connected_nodes.front()->get()->disconnect("tree_exiting", callable_mp(this, &AnimationCache::_node_exit_tree)); connected_nodes.erase(connected_nodes.front()); } @@ -65,7 +61,6 @@ void AnimationCache::_clear_cache() { } void AnimationCache::_update_cache() { - cache_valid = false; ERR_FAIL_COND(!root); @@ -73,12 +68,10 @@ void AnimationCache::_update_cache() { ERR_FAIL_COND(animation.is_null()); for (int i = 0; i < animation->get_track_count(); i++) { - NodePath np = animation->track_get_path(i); Node *node = root->get_node(np); if (!node) { - path_cache.push_back(Path()); ERR_CONTINUE_MSG(!node, "Invalid track path in animation '" + np + "'."); } @@ -88,7 +81,6 @@ void AnimationCache::_update_cache() { Ref<Resource> res; if (animation->track_get_type(i) == Animation::TYPE_TRANSFORM) { - if (np.get_subname_count() > 1) { path_cache.push_back(Path()); ERR_CONTINUE_MSG(animation->track_get_type(i) == Animation::TYPE_TRANSFORM, "Transform tracks can't have a subpath '" + np + "'."); @@ -97,7 +89,6 @@ void AnimationCache::_update_cache() { Node3D *sp = Object::cast_to<Node3D>(node); if (!sp) { - path_cache.push_back(Path()); ERR_CONTINUE_MSG(!sp, "Transform track not of type Node3D '" + np + "'."); } @@ -108,7 +99,6 @@ void AnimationCache::_update_cache() { Skeleton3D *sk = Object::cast_to<Skeleton3D>(node); if (!sk) { - path_cache.push_back(Path()); ERR_CONTINUE_MSG(!sk, "Property defined in Transform track, but not a Skeleton! '" + np + "'."); } @@ -127,7 +117,6 @@ void AnimationCache::_update_cache() { } else { if (np.get_subname_count() > 0) { - RES res2; Vector<StringName> leftover_subpath; @@ -144,7 +133,6 @@ void AnimationCache::_update_cache() { path.subpath = leftover_subpath; } else { - path.node = node; path.object = node; path.subpath = np.get_subnames(); @@ -152,15 +140,12 @@ void AnimationCache::_update_cache() { } if (animation->track_get_type(i) == Animation::TYPE_VALUE) { - if (np.get_subname_count() == 0) { - path_cache.push_back(Path()); ERR_CONTINUE_MSG(np.get_subname_count() == 0, "Value Track lacks property: " + np + "."); } } else if (animation->track_get_type(i) == Animation::TYPE_METHOD) { - if (path.subpath.size() != 0) { // Trying to call a method of a non-resource path_cache.push_back(Path()); @@ -183,15 +168,16 @@ void AnimationCache::_update_cache() { } void AnimationCache::set_track_transform(int p_idx, const Transform &p_transform) { - - if (cache_dirty) + if (cache_dirty) { _update_cache(); + } ERR_FAIL_COND(!cache_valid); ERR_FAIL_INDEX(p_idx, path_cache.size()); Path &p = path_cache.write[p_idx]; - if (!p.valid) + if (!p.valid) { return; + } ERR_FAIL_COND(!p.node); ERR_FAIL_COND(!p.spatial); @@ -204,49 +190,48 @@ void AnimationCache::set_track_transform(int p_idx, const Transform &p_transform } void AnimationCache::set_track_value(int p_idx, const Variant &p_value) { - - if (cache_dirty) + if (cache_dirty) { _update_cache(); + } ERR_FAIL_COND(!cache_valid); ERR_FAIL_INDEX(p_idx, path_cache.size()); Path &p = path_cache.write[p_idx]; - if (!p.valid) + if (!p.valid) { return; + } ERR_FAIL_COND(!p.object); p.object->set_indexed(p.subpath, p_value); } void AnimationCache::call_track(int p_idx, const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - - if (cache_dirty) + if (cache_dirty) { _update_cache(); + } ERR_FAIL_COND(!cache_valid); ERR_FAIL_INDEX(p_idx, path_cache.size()); Path &p = path_cache.write[p_idx]; - if (!p.valid) + if (!p.valid) { return; + } ERR_FAIL_COND(!p.object); p.object->call(p_method, p_args, p_argcount, r_error); } void AnimationCache::set_all(float p_time, float p_delta) { - - if (cache_dirty) + if (cache_dirty) { _update_cache(); + } ERR_FAIL_COND(!cache_valid); int tc = animation->get_track_count(); for (int i = 0; i < tc; i++) { - switch (animation->track_get_type(i)) { - case Animation::TYPE_TRANSFORM: { - Vector3 loc, scale; Quat rot; animation->transform_track_interpolate(i, p_time, &loc, &rot, &scale); @@ -257,17 +242,14 @@ void AnimationCache::set_all(float p_time, float p_delta) { } break; case Animation::TYPE_VALUE: { - if (animation->value_track_get_update_mode(i) == Animation::UPDATE_CONTINUOUS || (animation->value_track_get_update_mode(i) == Animation::UPDATE_DISCRETE && p_delta == 0)) { Variant v = animation->value_track_interpolate(i, p_time); set_track_value(i, v); } else { - List<int> indices; animation->value_track_get_key_indices(i, p_time, p_delta, &indices); for (List<int>::Element *E = indices.front(); E; E = E->next()) { - Variant v = animation->track_get_key_value(i, E->get()); set_track_value(i, v); } @@ -275,25 +257,20 @@ void AnimationCache::set_all(float p_time, float p_delta) { } break; case Animation::TYPE_METHOD: { - List<int> indices; animation->method_track_get_key_indices(i, p_time, p_delta, &indices); for (List<int>::Element *E = indices.front(); E; E = E->next()) { - Vector<Variant> args = animation->method_track_get_params(i, E->get()); StringName name = animation->method_track_get_name(i, E->get()); Callable::CallError err; if (!args.size()) { - call_track(i, name, nullptr, 0, err); } else { - Vector<const Variant *> argptrs; argptrs.resize(args.size()); for (int j = 0; j < args.size(); j++) { - argptrs.write[j] = &args.write[j]; } @@ -309,29 +286,28 @@ void AnimationCache::set_all(float p_time, float p_delta) { } void AnimationCache::set_animation(const Ref<Animation> &p_animation) { - _clear_cache(); - if (animation.is_valid()) + if (animation.is_valid()) { animation->disconnect("changed", callable_mp(this, &AnimationCache::_animation_changed)); + } animation = p_animation; - if (animation.is_valid()) + if (animation.is_valid()) { animation->connect("changed", callable_mp(this, &AnimationCache::_animation_changed)); + } } void AnimationCache::_bind_methods() { } void AnimationCache::set_root(Node *p_root) { - _clear_cache(); root = p_root; } AnimationCache::AnimationCache() { - root = nullptr; cache_dirty = true; cache_valid = false; diff --git a/scene/animation/animation_cache.h b/scene/animation/animation_cache.h index 23312ca7ec..feff1d364a 100644 --- a/scene/animation/animation_cache.h +++ b/scene/animation/animation_cache.h @@ -35,11 +35,9 @@ #include "scene/resources/animation.h" class AnimationCache : public Object { - GDCLASS(AnimationCache, Object); struct Path { - RES resource; Object *object; Skeleton3D *skeleton; // haxor diff --git a/scene/animation/animation_node_state_machine.cpp b/scene/animation/animation_node_state_machine.cpp index 9f5e06c43d..17ce05f130 100644 --- a/scene/animation/animation_node_state_machine.cpp +++ b/scene/animation/animation_node_state_machine.cpp @@ -33,12 +33,10 @@ ///////////////////////////////////////////////// void AnimationNodeStateMachineTransition::set_switch_mode(SwitchMode p_mode) { - switch_mode = p_mode; } AnimationNodeStateMachineTransition::SwitchMode AnimationNodeStateMachineTransition::get_switch_mode() const { - return switch_mode; } @@ -71,7 +69,6 @@ StringName AnimationNodeStateMachineTransition::get_advance_condition_name() con } void AnimationNodeStateMachineTransition::set_xfade_time(float p_xfade) { - ERR_FAIL_COND(p_xfade < 0); xfade = p_xfade; emit_changed(); @@ -133,7 +130,6 @@ void AnimationNodeStateMachineTransition::_bind_methods() { } AnimationNodeStateMachineTransition::AnimationNodeStateMachineTransition() { - switch_mode = SWITCH_MODE_IMMEDIATE; auto_advance = false; xfade = 0; @@ -144,7 +140,6 @@ AnimationNodeStateMachineTransition::AnimationNodeStateMachineTransition() { //////////////////////////////////////////////////////// void AnimationNodeStateMachinePlayback::travel(const StringName &p_state) { - start_request_travel = true; start_request = p_state; stop_request = false; @@ -155,39 +150,45 @@ void AnimationNodeStateMachinePlayback::start(const StringName &p_state) { start_request = p_state; stop_request = false; } -void AnimationNodeStateMachinePlayback::stop() { +void AnimationNodeStateMachinePlayback::stop() { stop_request = true; } + bool AnimationNodeStateMachinePlayback::is_playing() const { return playing; } + StringName AnimationNodeStateMachinePlayback::get_current_node() const { return current; } + StringName AnimationNodeStateMachinePlayback::get_blend_from_node() const { return fading_from; } + Vector<StringName> AnimationNodeStateMachinePlayback::get_travel_path() const { return path; } + float AnimationNodeStateMachinePlayback::get_current_play_pos() const { return pos_current; } + float AnimationNodeStateMachinePlayback::get_current_length() const { return len_current; } bool AnimationNodeStateMachinePlayback::_travel(AnimationNodeStateMachine *p_state_machine, const StringName &p_travel) { - ERR_FAIL_COND_V(!playing, false); ERR_FAIL_COND_V(!p_state_machine->states.has(p_travel), false); ERR_FAIL_COND_V(!p_state_machine->states.has(current), false); path.clear(); //a new one will be needed - if (current == p_travel) + if (current == p_travel) { return true; //nothing to do + } loops_current = 0; // reset loops, so fade does not happen immediately @@ -219,7 +220,6 @@ bool AnimationNodeStateMachinePlayback::_travel(AnimationNodeStateMachine *p_sta //begin astar bool found_route = false; while (!found_route) { - if (open_list.size() == 0) { return false; //no path found } @@ -229,7 +229,6 @@ bool AnimationNodeStateMachinePlayback::_travel(AnimationNodeStateMachine *p_sta float least_cost = 1e20; for (List<int>::Element *E = open_list.front(); E; E = E->next()) { - float cost = cost_map[p_state_machine->transitions[E->get()].to].distance; cost += p_state_machine->states[p_state_machine->transitions[E->get()].to].position.distance_to(target_pos); @@ -293,7 +292,6 @@ bool AnimationNodeStateMachinePlayback::_travel(AnimationNodeStateMachine *p_sta } float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_state_machine, float p_time, bool p_seek) { - //if not playing and it can restart, then restart if (!playing && start_request == StringName()) { if (!stop_request && p_state_machine->start_node) { @@ -347,7 +345,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st bool do_start = (p_seek && p_time == 0) || play_start || current == StringName(); if (do_start) { - if (p_state_machine->start_node != StringName() && p_seek && p_time == 0) { current = p_state_machine->start_node; } @@ -365,7 +362,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st float fade_blend = 1.0; if (fading_from != StringName()) { - if (!p_state_machine->states.has(fading_from)) { fading_from = StringName(); } else { @@ -382,7 +378,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st float rem = p_state_machine->blend_node(current, p_state_machine->states[current].node, p_time, p_seek, fade_blend, AnimationNode::FILTER_IGNORE, false); if (fading_from != StringName()) { - p_state_machine->blend_node(fading_from, p_state_machine->states[fading_from].node, p_time, p_seek, 1.0 - fade_blend, AnimationNode::FILTER_IGNORE, false); } @@ -407,7 +402,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st AnimationNodeStateMachineTransition::SwitchMode switch_mode = AnimationNodeStateMachineTransition::SWITCH_MODE_IMMEDIATE; if (path.size()) { - for (int i = 0; i < p_state_machine->transitions.size(); i++) { if (p_state_machine->transitions[i].from == current && p_state_machine->transitions[i].to == path[0]) { next_xfade = p_state_machine->transitions[i].transition->get_xfade_time(); @@ -419,7 +413,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st float priority_best = 1e20; int auto_advance_to = -1; for (int i = 0; i < p_state_machine->transitions.size(); i++) { - bool auto_advance = false; if (p_state_machine->transitions[i].transition->has_auto_advance()) { auto_advance = true; @@ -430,7 +423,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st } if (p_state_machine->transitions[i].from == current && auto_advance) { - if (p_state_machine->transitions[i].transition->get_priority() <= priority_best) { priority_best = p_state_machine->transitions[i].transition->get_priority(); auto_advance_to = i; @@ -447,7 +439,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st //if next, see when to transition if (next != StringName()) { - bool goto_next = false; if (switch_mode == AnimationNodeStateMachineTransition::SWITCH_MODE_AT_END) { @@ -492,7 +483,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st //compute time left for transitions by using the end node if (p_state_machine->end_node != StringName() && p_state_machine->end_node != current) { - rem = p_state_machine->blend_node(p_state_machine->end_node, p_state_machine->states[p_state_machine->end_node].node, 0, true, 0, AnimationNode::FILTER_IGNORE, false); } @@ -500,7 +490,6 @@ float AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_st } void AnimationNodeStateMachinePlayback::_bind_methods() { - ClassDB::bind_method(D_METHOD("travel", "to_node"), &AnimationNodeStateMachinePlayback::travel); ClassDB::bind_method(D_METHOD("start", "node"), &AnimationNodeStateMachinePlayback::start); ClassDB::bind_method(D_METHOD("stop"), &AnimationNodeStateMachinePlayback::stop); @@ -542,7 +531,6 @@ void AnimationNodeStateMachine::get_parameter_list(List<PropertyInfo> *r_list) c } Variant AnimationNodeStateMachine::get_parameter_default_value(const StringName &p_parameter) const { - if (p_parameter == playback) { Ref<AnimationNodeStateMachinePlayback> p; p.instance(); @@ -553,7 +541,6 @@ Variant AnimationNodeStateMachine::get_parameter_default_value(const StringName } void AnimationNodeStateMachine::add_node(const StringName &p_name, Ref<AnimationNode> p_node, const Vector2 &p_position) { - ERR_FAIL_COND(states.has(p_name)); ERR_FAIL_COND(p_node.is_null()); ERR_FAIL_COND(String(p_name).find("/") != -1); @@ -571,7 +558,6 @@ void AnimationNodeStateMachine::add_node(const StringName &p_name, Ref<Animation } void AnimationNodeStateMachine::replace_node(const StringName &p_name, Ref<AnimationNode> p_node) { - ERR_FAIL_COND(states.has(p_name) == false); ERR_FAIL_COND(p_node.is_null()); ERR_FAIL_COND(String(p_name).find("/") != -1); @@ -592,7 +578,6 @@ void AnimationNodeStateMachine::replace_node(const StringName &p_name, Ref<Anima } Ref<AnimationNode> AnimationNodeStateMachine::get_node(const StringName &p_name) const { - ERR_FAIL_COND_V(!states.has(p_name), Ref<AnimationNode>()); return states[p_name].node; @@ -628,8 +613,8 @@ void AnimationNodeStateMachine::get_child_nodes(List<ChildNode> *r_child_nodes) bool AnimationNodeStateMachine::has_node(const StringName &p_name) const { return states.has(p_name); } -void AnimationNodeStateMachine::remove_node(const StringName &p_name) { +void AnimationNodeStateMachine::remove_node(const StringName &p_name) { ERR_FAIL_COND(!states.has(p_name)); { @@ -668,7 +653,6 @@ void AnimationNodeStateMachine::remove_node(const StringName &p_name) { } void AnimationNodeStateMachine::rename_node(const StringName &p_name, const StringName &p_new_name) { - ERR_FAIL_COND(!states.has(p_name)); ERR_FAIL_COND(states.has(p_new_name)); @@ -702,7 +686,6 @@ void AnimationNodeStateMachine::rename_node(const StringName &p_name, const Stri } void AnimationNodeStateMachine::get_node_list(List<StringName> *r_nodes) const { - List<StringName> nodes; for (Map<StringName, State>::Element *E = states.front(); E; E = E->next()) { nodes.push_back(E->key()); @@ -715,25 +698,24 @@ void AnimationNodeStateMachine::get_node_list(List<StringName> *r_nodes) const { } bool AnimationNodeStateMachine::has_transition(const StringName &p_from, const StringName &p_to) const { - for (int i = 0; i < transitions.size(); i++) { - if (transitions[i].from == p_from && transitions[i].to == p_to) + if (transitions[i].from == p_from && transitions[i].to == p_to) { return true; + } } return false; } int AnimationNodeStateMachine::find_transition(const StringName &p_from, const StringName &p_to) const { - for (int i = 0; i < transitions.size(); i++) { - if (transitions[i].from == p_from && transitions[i].to == p_to) + if (transitions[i].from == p_from && transitions[i].to == p_to) { return i; + } } return -1; } void AnimationNodeStateMachine::add_transition(const StringName &p_from, const StringName &p_to, const Ref<AnimationNodeStateMachineTransition> &p_transition) { - ERR_FAIL_COND(p_from == p_to); ERR_FAIL_COND(!states.has(p_from)); ERR_FAIL_COND(!states.has(p_to)); @@ -757,23 +739,22 @@ Ref<AnimationNodeStateMachineTransition> AnimationNodeStateMachine::get_transiti ERR_FAIL_INDEX_V(p_transition, transitions.size(), Ref<AnimationNodeStateMachineTransition>()); return transitions[p_transition].transition; } -StringName AnimationNodeStateMachine::get_transition_from(int p_transition) const { +StringName AnimationNodeStateMachine::get_transition_from(int p_transition) const { ERR_FAIL_INDEX_V(p_transition, transitions.size(), StringName()); return transitions[p_transition].from; } -StringName AnimationNodeStateMachine::get_transition_to(int p_transition) const { +StringName AnimationNodeStateMachine::get_transition_to(int p_transition) const { ERR_FAIL_INDEX_V(p_transition, transitions.size(), StringName()); return transitions[p_transition].to; } int AnimationNodeStateMachine::get_transition_count() const { - return transitions.size(); } -void AnimationNodeStateMachine::remove_transition(const StringName &p_from, const StringName &p_to) { +void AnimationNodeStateMachine::remove_transition(const StringName &p_from, const StringName &p_to) { for (int i = 0; i < transitions.size(); i++) { if (transitions[i].from == p_from && transitions[i].to == p_to) { transitions.write[i].transition->disconnect("advance_condition_changed", callable_mp(this, &AnimationNodeStateMachine::_tree_changed)); @@ -788,7 +769,6 @@ void AnimationNodeStateMachine::remove_transition(const StringName &p_from, cons } void AnimationNodeStateMachine::remove_transition_by_index(int p_transition) { - ERR_FAIL_INDEX(p_transition, transitions.size()); transitions.write[p_transition].transition->disconnect("advance_condition_changed", callable_mp(this, &AnimationNodeStateMachine::_tree_changed)); transitions.remove(p_transition); @@ -798,24 +778,20 @@ void AnimationNodeStateMachine::remove_transition_by_index(int p_transition) { } void AnimationNodeStateMachine::set_start_node(const StringName &p_node) { - ERR_FAIL_COND(p_node != StringName() && !states.has(p_node)); start_node = p_node; } String AnimationNodeStateMachine::get_start_node() const { - return start_node; } void AnimationNodeStateMachine::set_end_node(const StringName &p_node) { - ERR_FAIL_COND(p_node != StringName() && !states.has(p_node)); end_node = p_node; } String AnimationNodeStateMachine::get_end_node() const { - return end_node; } @@ -828,7 +804,6 @@ Vector2 AnimationNodeStateMachine::get_graph_offset() const { } float AnimationNodeStateMachine::process(float p_time, bool p_seek) { - Ref<AnimationNodeStateMachinePlayback> playback = get_parameter(this->playback); ERR_FAIL_COND_V(playback.is_null(), 0.0); @@ -847,7 +822,6 @@ Ref<AnimationNode> AnimationNodeStateMachine::get_child_by_name(const StringName } bool AnimationNodeStateMachine::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; if (name.begins_with("states/")) { String node_name = name.get_slicec('/', 1); @@ -862,14 +836,12 @@ bool AnimationNodeStateMachine::_set(const StringName &p_name, const Variant &p_ } if (what == "position") { - if (states.has(node_name)) { states[node_name].position = p_value; } return true; } } else if (name == "transitions") { - Array trans = p_value; ERR_FAIL_COND_V(trans.size() % 3 != 0, false); @@ -892,7 +864,6 @@ bool AnimationNodeStateMachine::_set(const StringName &p_name, const Variant &p_ } bool AnimationNodeStateMachine::_get(const StringName &p_name, Variant &r_ret) const { - String name = p_name; if (name.begins_with("states/")) { String node_name = name.get_slicec('/', 1); @@ -906,7 +877,6 @@ bool AnimationNodeStateMachine::_get(const StringName &p_name, Variant &r_ret) c } if (what == "position") { - if (states.has(node_name)) { r_ret = states[node_name].position; return true; @@ -937,8 +907,8 @@ bool AnimationNodeStateMachine::_get(const StringName &p_name, Variant &r_ret) c return false; } -void AnimationNodeStateMachine::_get_property_list(List<PropertyInfo> *p_list) const { +void AnimationNodeStateMachine::_get_property_list(List<PropertyInfo> *p_list) const { List<StringName> names; for (Map<StringName, State>::Element *E = states.front(); E; E = E->next()) { names.push_back(E->key()); @@ -963,7 +933,6 @@ void AnimationNodeStateMachine::set_node_position(const StringName &p_name, cons } Vector2 AnimationNodeStateMachine::get_node_position(const StringName &p_name) const { - ERR_FAIL_COND_V(!states.has(p_name), Vector2()); return states[p_name].position; } @@ -973,7 +942,6 @@ void AnimationNodeStateMachine::_tree_changed() { } void AnimationNodeStateMachine::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_node", "name", "node", "position"), &AnimationNodeStateMachine::add_node, DEFVAL(Vector2())); ClassDB::bind_method(D_METHOD("replace_node", "name", "node"), &AnimationNodeStateMachine::replace_node); ClassDB::bind_method(D_METHOD("get_node", "name"), &AnimationNodeStateMachine::get_node); @@ -1005,6 +973,5 @@ void AnimationNodeStateMachine::_bind_methods() { } AnimationNodeStateMachine::AnimationNodeStateMachine() { - playback = "playback"; } diff --git a/scene/animation/animation_node_state_machine.h b/scene/animation/animation_node_state_machine.h index 27a4451f08..72fa6f77d0 100644 --- a/scene/animation/animation_node_state_machine.h +++ b/scene/animation/animation_node_state_machine.h @@ -134,7 +134,6 @@ public: }; class AnimationNodeStateMachine : public AnimationRootNode { - GDCLASS(AnimationNodeStateMachine, AnimationRootNode); private: @@ -148,7 +147,6 @@ private: Map<StringName, State> states; struct Transition { - StringName from; StringName to; Ref<AnimationNodeStateMachineTransition> transition; diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 7bac09f839..4e56f1acf0 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -40,7 +40,6 @@ #include "scene/2d/skeleton_2d.h" void AnimatedValuesBackup::update_skeletons() { - for (int i = 0; i < entries.size(); i++) { if (entries[i].bone_idx != -1) { // 3D bone @@ -57,7 +56,6 @@ void AnimatedValuesBackup::update_skeletons() { #endif bool AnimationPlayer::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; if (name.begins_with("playback/play")) { // bw compatibility @@ -65,23 +63,19 @@ bool AnimationPlayer::_set(const StringName &p_name, const Variant &p_value) { set_current_animation(p_value); } else if (name.begins_with("anims/")) { - String which = name.get_slicec('/', 1); add_animation(which, p_value); } else if (name.begins_with("next/")) { - String which = name.get_slicec('/', 1); animation_set_next(which, p_value); } else if (p_name == SceneStringNames::get_singleton()->blend_times) { - Array array = p_value; int len = array.size(); ERR_FAIL_COND_V(len % 3, false); for (int i = 0; i < len / 3; i++) { - StringName from = array[i * 3 + 0]; StringName to = array[i * 3 + 1]; float time = array[i * 3 + 2]; @@ -89,14 +83,14 @@ bool AnimationPlayer::_set(const StringName &p_name, const Variant &p_value) { set_blend_time(from, to, time); } - } else + } else { return false; + } return true; } bool AnimationPlayer::_get(const StringName &p_name, Variant &r_ret) const { - String name = p_name; if (name == "playback/play") { // bw compatibility @@ -104,41 +98,36 @@ bool AnimationPlayer::_get(const StringName &p_name, Variant &r_ret) const { r_ret = get_current_animation(); } else if (name.begins_with("anims/")) { - String which = name.get_slicec('/', 1); r_ret = get_animation(which); } else if (name.begins_with("next/")) { - String which = name.get_slicec('/', 1); r_ret = animation_get_next(which); } else if (name == "blend_times") { - Vector<BlendKey> keys; for (Map<BlendKey, float>::Element *E = blend_times.front(); E; E = E->next()) { - keys.ordered_insert(E->key()); } Array array; for (int i = 0; i < keys.size(); i++) { - array.push_back(keys[i].from); array.push_back(keys[i].to); array.push_back(blend_times[keys[i]]); } r_ret = array; - } else + } else { return false; + } return true; } void AnimationPlayer::_validate_property(PropertyInfo &property) const { - if (property.name == "current_animation") { List<String> names; @@ -149,9 +138,9 @@ void AnimationPlayer::_validate_property(PropertyInfo &property) const { names.push_front("[stop]"); String hint; for (List<String>::Element *E = names.front(); E; E = E->next()) { - - if (E != names.front()) + if (E != names.front()) { hint += ","; + } hint += E->get(); } @@ -160,14 +149,13 @@ void AnimationPlayer::_validate_property(PropertyInfo &property) const { } void AnimationPlayer::_get_property_list(List<PropertyInfo> *p_list) const { - List<PropertyInfo> anim_names; for (Map<StringName, AnimationData>::Element *E = animation_set.front(); E; E = E->next()) { - anim_names.push_back(PropertyInfo(Variant::OBJECT, "anims/" + String(E->key()), PROPERTY_HINT_RESOURCE_TYPE, "Animation", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE)); - if (E->get().next != StringName()) + if (E->get().next != StringName()) { anim_names.push_back(PropertyInfo(Variant::STRING, "next/" + String(E->key()), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); + } } anim_names.sort(); @@ -180,16 +168,12 @@ void AnimationPlayer::_get_property_list(List<PropertyInfo> *p_list) const { } void AnimationPlayer::advance(float p_time) { - _animation_process(p_time); } void AnimationPlayer::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - if (!processing) { //make sure that a previous process state was not saved //only process if "processing" is set @@ -200,39 +184,40 @@ void AnimationPlayer::_notification(int p_what) { clear_caches(); } break; case NOTIFICATION_READY: { - if (!Engine::get_singleton()->is_editor_hint() && animation_set.has(autoplay)) { play(autoplay); _animation_process(0); } } break; case NOTIFICATION_INTERNAL_PROCESS: { - if (animation_process_mode == ANIMATION_PROCESS_PHYSICS) + if (animation_process_mode == ANIMATION_PROCESS_PHYSICS) { break; + } - if (processing) + if (processing) { _animation_process(get_process_delta_time()); + } } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { - - if (animation_process_mode == ANIMATION_PROCESS_IDLE) + if (animation_process_mode == ANIMATION_PROCESS_IDLE) { break; + } - if (processing) + if (processing) { _animation_process(get_physics_process_delta_time()); + } } break; case NOTIFICATION_EXIT_TREE: { - clear_caches(); } break; } } void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim) { - // Already cached? - if (p_anim->node_cache.size() == p_anim->animation->get_track_count()) + if (p_anim->node_cache.size() == p_anim->animation->get_track_count()) { return; + } Node *parent = get_node(root); @@ -243,7 +228,6 @@ void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim) { p_anim->node_cache.resize(a->get_track_count()); for (int i = 0; i < a->get_track_count(); i++) { - p_anim->node_cache.write[i] = nullptr; RES resource; Vector<StringName> leftover_path; @@ -253,26 +237,26 @@ void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim) { int bone_idx = -1; if (a->track_get_path(i).get_subname_count() == 1 && Object::cast_to<Skeleton3D>(child)) { - Skeleton3D *sk = Object::cast_to<Skeleton3D>(child); bone_idx = sk->find_bone(a->track_get_path(i).get_subname(0)); if (bone_idx == -1) { - continue; } } { - if (!child->is_connected("tree_exiting", callable_mp(this, &AnimationPlayer::_node_removed))) + if (!child->is_connected("tree_exiting", callable_mp(this, &AnimationPlayer::_node_removed))) { child->connect("tree_exiting", callable_mp(this, &AnimationPlayer::_node_removed), make_binds(child), CONNECT_ONESHOT); + } } TrackNodeCacheKey key; key.id = id; key.bone_idx = bone_idx; - if (!node_cache_map.has(key)) + if (!node_cache_map.has(key)) { node_cache_map[key] = TrackNodeCache(); + } p_anim->node_cache.write[i] = &node_cache_map[key]; p_anim->node_cache[i]->path = a->track_get_path(i); @@ -305,31 +289,27 @@ void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim) { } if (a->track_get_type(i) == Animation::TYPE_VALUE) { - if (!p_anim->node_cache[i]->property_anim.has(a->track_get_path(i).get_concatenated_subnames())) { - TrackNodeCache::PropertyAnim pa; pa.subpath = leftover_path; pa.object = resource.is_valid() ? (Object *)resource.ptr() : (Object *)child; pa.special = SP_NONE; pa.owner = p_anim->node_cache[i]; if (false && p_anim->node_cache[i]->node_2d) { - - if (leftover_path.size() == 1 && leftover_path[0] == SceneStringNames::get_singleton()->transform_pos) + if (leftover_path.size() == 1 && leftover_path[0] == SceneStringNames::get_singleton()->transform_pos) { pa.special = SP_NODE2D_POS; - else if (leftover_path.size() == 1 && leftover_path[0] == SceneStringNames::get_singleton()->transform_rot) + } else if (leftover_path.size() == 1 && leftover_path[0] == SceneStringNames::get_singleton()->transform_rot) { pa.special = SP_NODE2D_ROT; - else if (leftover_path.size() == 1 && leftover_path[0] == SceneStringNames::get_singleton()->transform_scale) + } else if (leftover_path.size() == 1 && leftover_path[0] == SceneStringNames::get_singleton()->transform_scale) { pa.special = SP_NODE2D_SCALE; + } } p_anim->node_cache[i]->property_anim[a->track_get_path(i).get_concatenated_subnames()] = pa; } } if (a->track_get_type(i) == Animation::TYPE_BEZIER && leftover_path.size()) { - if (!p_anim->node_cache[i]->bezier_anim.has(a->track_get_path(i).get_concatenated_subnames())) { - TrackNodeCache::BezierAnim ba; ba.bezier_property = leftover_path; ba.object = resource.is_valid() ? (Object *)resource.ptr() : (Object *)child; @@ -342,7 +322,6 @@ void AnimationPlayer::_ensure_node_caches(AnimationData *p_anim) { } void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float p_time, float p_delta, float p_interp, bool p_is_current, bool p_seeked, bool p_started) { - _ensure_node_caches(p_anim); ERR_FAIL_COND(p_anim->node_cache.size() != p_anim->animation->get_track_count()); @@ -350,7 +329,6 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float bool can_call = is_inside_tree() && !Engine::get_singleton()->is_editor_hint(); for (int i = 0; i < a->get_track_count(); i++) { - // If an animation changes this animation (or it animates itself) // we need to recreate our animation cache if (p_anim->node_cache.size() != a->get_track_count()) { @@ -359,21 +337,23 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float TrackNodeCache *nc = p_anim->node_cache[i]; - if (!nc) + if (!nc) { continue; // no node cache for this track, skip it + } - if (!a->track_is_enabled(i)) + if (!a->track_is_enabled(i)) { continue; // do nothing if the track is disabled + } - if (a->track_get_key_count(i) == 0) + if (a->track_get_key_count(i) == 0) { continue; // do nothing if track is empty + } switch (a->track_get_type(i)) { - case Animation::TYPE_TRANSFORM: { - - if (!nc->spatial) + if (!nc->spatial) { continue; + } Vector3 loc; Quat rot; @@ -382,8 +362,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float Error err = a->transform_track_interpolate(i, p_time, &loc, &rot, &scale); //ERR_CONTINUE(err!=OK); //used for testing, should be removed - if (err != OK) + if (err != OK) { continue; + } if (nc->accum_pass != accum_pass) { ERR_CONTINUE(cache_update_size >= NODE_CACHE_UPDATE_MAX); @@ -394,7 +375,6 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float nc->scale_accum = scale; } else { - nc->loc_accum = nc->loc_accum.lerp(loc, p_interp); nc->rot_accum = nc->rot_accum.slerp(rot, p_interp); nc->scale_accum = nc->scale_accum.lerp(scale, p_interp); @@ -402,9 +382,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float } break; case Animation::TYPE_VALUE: { - - if (!nc->node) + if (!nc->node) { continue; + } //StringName property=a->track_get_path(i).get_property(); @@ -416,14 +396,14 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float Animation::UpdateMode update_mode = a->value_track_get_update_mode(i); if (update_mode == Animation::UPDATE_CAPTURE) { - if (p_started) { pa->capture = pa->object->get_indexed(pa->subpath); } int key_count = a->track_get_key_count(i); - if (key_count == 0) + if (key_count == 0) { continue; //eeh not worth it + } float first_key_time = a->track_get_key_time(i, 0); float transition = 1.0; @@ -431,8 +411,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float if (first_key_time == 0.0) { //ignore, use for transition - if (key_count == 1) + if (key_count == 1) { continue; //with one key we can't do anything + } transition = a->track_get_key_transition(i, 0); first_key_time = a->track_get_key_time(i, 1); first_key = 1; @@ -461,8 +442,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float Variant value = a->value_track_interpolate(i, p_time); - if (value == Variant()) + if (value == Variant()) { continue; + } //thanks to trigger mode, this should be solved now.. /* @@ -479,15 +461,12 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float } } else if (p_is_current && p_delta != 0) { - List<int> indices; a->value_track_get_key_indices(i, p_time, p_delta, &indices); for (List<int>::Element *F = indices.front(); F; F = F->next()) { - Variant value = a->track_get_key_value(i, F->get()); switch (pa->special) { - case SP_NONE: { bool valid; pa->object->set_indexed(pa->subpath, value, &valid); //you are not speshul @@ -530,21 +509,21 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float } break; case Animation::TYPE_METHOD: { - - if (!nc->node) + if (!nc->node) { continue; + } if (p_delta == 0) { continue; } - if (!p_is_current) + if (!p_is_current) { break; + } List<int> indices; a->method_track_get_key_indices(i, p_time, p_delta, &indices); for (List<int>::Element *E = indices.front(); E; E = E->next()) { - StringName method = a->method_track_get_name(i, E->get()); Vector<Variant> params = a->method_track_get_params(i, E->get()); @@ -581,9 +560,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float } break; case Animation::TYPE_BEZIER: { - - if (!nc->node) + if (!nc->node) { continue; + } Map<StringName, TrackNodeCache::BezierAnim>::Element *E = nc->bezier_anim.find(a->track_get_path(i).get_concatenated_subnames()); ERR_CONTINUE(!E); //should it continue, or create a new one? @@ -602,9 +581,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float } break; case Animation::TYPE_AUDIO: { - - if (!nc->node) + if (!nc->node) { continue; + } if (p_delta == 0) { continue; } @@ -612,8 +591,9 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float if (p_seeked) { //find whathever should be playing int idx = a->track_find_key(i, p_time); - if (idx < 0) + if (idx < 0) { continue; + } Ref<AudioStream> stream = a->audio_track_get_key_stream(i, idx); if (!stream.is_valid()) { @@ -678,7 +658,6 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float nc->audio_start = p_time; } } else if (nc->audio_playing) { - bool loop = a->has_loop(); bool stop = false; @@ -704,22 +683,24 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float } break; case Animation::TYPE_ANIMATION: { - AnimationPlayer *player = Object::cast_to<AnimationPlayer>(nc->node); - if (!player) + if (!player) { continue; + } if (p_delta == 0 || p_seeked) { //seek int idx = a->track_find_key(i, p_time); - if (idx < 0) + if (idx < 0) { continue; + } float pos = a->track_get_key_time(i, idx); StringName anim_name = a->animation_track_get_key_animation(i, idx); - if (String(anim_name) == "[stop]" || !player->has_animation(anim_name)) + if (String(anim_name) == "[stop]" || !player->has_animation(anim_name)) { continue; + } Ref<Animation> anim = player->get_animation(anim_name); @@ -749,7 +730,6 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float StringName anim_name = a->animation_track_get_key_animation(i, idx); if (String(anim_name) == "[stop]" || !player->has_animation(anim_name)) { - if (playing_caches.has(nc)) { playing_caches.erase(nc); player->stop(); @@ -769,7 +749,6 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, float } void AnimationPlayer::_animation_process_data(PlaybackData &cd, float p_delta, float p_blend, bool p_seeked, bool p_started) { - float delta = p_delta * speed_scale * cd.speed_scale; float next_pos = cd.pos + delta; @@ -777,17 +756,16 @@ void AnimationPlayer::_animation_process_data(PlaybackData &cd, float p_delta, f bool loop = cd.from->animation->has_loop(); if (!loop) { - - if (next_pos < 0) + if (next_pos < 0) { next_pos = 0; - else if (next_pos > len) + } else if (next_pos > len) { next_pos = len; + } // fix delta delta = next_pos - cd.pos; if (&cd == &playback.current) { - bool backwards = delta < 0; if (!backwards && cd.pos <= len && next_pos == len /*&& playback.blend.empty()*/) { @@ -804,7 +782,6 @@ void AnimationPlayer::_animation_process_data(PlaybackData &cd, float p_delta, f } } else { - float looped_next_pos = Math::fposmod(next_pos, len); if (looped_next_pos == 0 && next_pos != 0) { // Loop multiples of the length to it, rather than 0 @@ -819,8 +796,8 @@ void AnimationPlayer::_animation_process_data(PlaybackData &cd, float p_delta, f _animation_process_animation(cd.from, cd.pos, delta, p_blend, &cd == &playback.current, p_seeked, p_started); } -void AnimationPlayer::_animation_process2(float p_delta, bool p_started) { +void AnimationPlayer::_animation_process2(float p_delta, bool p_started) { Playback &c = playback; accum_pass++; @@ -832,7 +809,6 @@ void AnimationPlayer::_animation_process2(float p_delta, bool p_started) { List<Blend>::Element *prev = nullptr; for (List<Blend>::Element *E = c.blend.back(); E; E = prev) { - Blend &b = E->get(); float blend = b.blend_left / b.blend_time; _animation_process_data(b.data, p_delta, blend, false, false); @@ -841,7 +817,6 @@ void AnimationPlayer::_animation_process2(float p_delta, bool p_started) { prev = E->prev(); if (b.blend_left < 0) { - c.blend.erase(E); } } @@ -851,7 +826,6 @@ void AnimationPlayer::_animation_update_transforms() { { Transform t; for (int i = 0; i < cache_update_size; i++) { - TrackNodeCache *nc = cache_update[i]; ERR_CONTINUE(nc->accum_pass != accum_pass); @@ -859,11 +833,9 @@ void AnimationPlayer::_animation_update_transforms() { t.origin = nc->loc_accum; t.basis.set_quat_scale(nc->rot_accum, nc->scale_accum); if (nc->skeleton && nc->bone_idx >= 0) { - nc->skeleton->set_bone_pose(nc->bone_idx, t); } else if (nc->spatial) { - nc->spatial->set_transform(t); } } @@ -872,13 +844,11 @@ void AnimationPlayer::_animation_update_transforms() { cache_update_size = 0; for (int i = 0; i < cache_update_prop_size; i++) { - TrackNodeCache::PropertyAnim *pa = cache_update_prop[i]; ERR_CONTINUE(pa->accum_pass != accum_pass); switch (pa->special) { - case SP_NONE: { bool valid; pa->object->set_indexed(pa->subpath, pa->value_accum, &valid); //you are not speshul @@ -921,7 +891,6 @@ void AnimationPlayer::_animation_update_transforms() { cache_update_prop_size = 0; for (int i = 0; i < cache_update_bezier_size; i++) { - TrackNodeCache::BezierAnim *ba = cache_update_bezier[i]; ERR_CONTINUE(ba->accum_pass != accum_pass); @@ -932,9 +901,7 @@ void AnimationPlayer::_animation_update_transforms() { } void AnimationPlayer::_animation_process(float p_delta) { - if (playback.current.from) { - end_reached = false; end_notify = false; _animation_process2(p_delta, playback.started); @@ -950,14 +917,16 @@ void AnimationPlayer::_animation_process(float p_delta) { play(queued.front()->get()); String new_name = playback.assigned; queued.pop_front(); - if (end_notify) + if (end_notify) { emit_signal(SceneStringNames::get_singleton()->animation_changed, old, new_name); + } } else { //stop(); playing = false; _set_process(false); - if (end_notify) + if (end_notify) { emit_signal(SceneStringNames::get_singleton()->animation_finished, playback.assigned); + } } end_reached = false; } @@ -968,7 +937,6 @@ void AnimationPlayer::_animation_process(float p_delta) { } Error AnimationPlayer::add_animation(const StringName &p_name, const Ref<Animation> &p_animation) { - #ifdef DEBUG_ENABLED ERR_FAIL_COND_V_MSG(String(p_name).find("/") != -1 || String(p_name).find(":") != -1 || String(p_name).find(",") != -1 || String(p_name).find("[") != -1, ERR_INVALID_PARAMETER, "Invalid animation name: " + String(p_name) + "."); #endif @@ -976,12 +944,10 @@ Error AnimationPlayer::add_animation(const StringName &p_name, const Ref<Animati ERR_FAIL_COND_V(p_animation.is_null(), ERR_INVALID_PARAMETER); if (animation_set.has(p_name)) { - _unref_anim(animation_set[p_name].animation); animation_set[p_name].animation = p_animation; clear_caches(); } else { - AnimationData ad; ad.animation = p_animation; ad.name = p_name; @@ -994,7 +960,6 @@ Error AnimationPlayer::add_animation(const StringName &p_name, const Ref<Animati } void AnimationPlayer::remove_animation(const StringName &p_name) { - ERR_FAIL_COND(!animation_set.has(p_name)); stop(); @@ -1006,17 +971,14 @@ void AnimationPlayer::remove_animation(const StringName &p_name) { } void AnimationPlayer::_ref_anim(const Ref<Animation> &p_anim) { - Ref<Animation>(p_anim)->connect(SceneStringNames::get_singleton()->tracks_changed, callable_mp(this, &AnimationPlayer::_animation_changed), varray(), CONNECT_REFERENCE_COUNTED); } void AnimationPlayer::_unref_anim(const Ref<Animation> &p_anim) { - Ref<Animation>(p_anim)->disconnect(SceneStringNames::get_singleton()->tracks_changed, callable_mp(this, &AnimationPlayer::_animation_changed)); } void AnimationPlayer::rename_animation(const StringName &p_name, const StringName &p_new_name) { - ERR_FAIL_COND(!animation_set.has(p_name)); ERR_FAIL_COND(String(p_new_name).find("/") != -1 || String(p_new_name).find(":") != -1); ERR_FAIL_COND(animation_set.has(p_new_name)); @@ -1030,7 +992,6 @@ void AnimationPlayer::rename_animation(const StringName &p_name, const StringNam List<BlendKey> to_erase; Map<BlendKey, float> to_insert; for (Map<BlendKey, float>::Element *E = blend_times.front(); E; E = E->next()) { - BlendKey bk = E->key(); BlendKey new_bk = bk; bool erase = false; @@ -1050,7 +1011,6 @@ void AnimationPlayer::rename_animation(const StringName &p_name, const StringNam } while (to_erase.size()) { - blend_times.erase(to_erase.front()->get()); to_erase.pop_front(); } @@ -1060,73 +1020,71 @@ void AnimationPlayer::rename_animation(const StringName &p_name, const StringNam to_insert.erase(to_insert.front()); } - if (autoplay == p_name) + if (autoplay == p_name) { autoplay = p_new_name; + } clear_caches(); _change_notify(); } bool AnimationPlayer::has_animation(const StringName &p_name) const { - return animation_set.has(p_name); } -Ref<Animation> AnimationPlayer::get_animation(const StringName &p_name) const { +Ref<Animation> AnimationPlayer::get_animation(const StringName &p_name) const { ERR_FAIL_COND_V(!animation_set.has(p_name), Ref<Animation>()); const AnimationData &data = animation_set[p_name]; return data.animation; } -void AnimationPlayer::get_animation_list(List<StringName> *p_animations) const { +void AnimationPlayer::get_animation_list(List<StringName> *p_animations) const { List<String> anims; for (Map<StringName, AnimationData>::Element *E = animation_set.front(); E; E = E->next()) { - anims.push_back(E->key()); } anims.sort(); for (List<String>::Element *E = anims.front(); E; E = E->next()) { - p_animations->push_back(E->get()); } } void AnimationPlayer::set_blend_time(const StringName &p_animation1, const StringName &p_animation2, float p_time) { - ERR_FAIL_COND_MSG(p_time < 0, "Blend time cannot be smaller than 0."); BlendKey bk; bk.from = p_animation1; bk.to = p_animation2; - if (p_time == 0) + if (p_time == 0) { blend_times.erase(bk); - else + } else { blend_times[bk] = p_time; + } } float AnimationPlayer::get_blend_time(const StringName &p_animation1, const StringName &p_animation2) const { - BlendKey bk; bk.from = p_animation1; bk.to = p_animation2; - if (blend_times.has(bk)) + if (blend_times.has(bk)) { return blend_times[bk]; - else + } else { return 0; + } } void AnimationPlayer::queue(const StringName &p_name) { - - if (!is_playing()) + if (!is_playing()) { play(p_name); - else + } else { queued.push_back(p_name); + } } Vector<String> AnimationPlayer::get_queue() { @@ -1143,23 +1101,21 @@ void AnimationPlayer::clear_queue() { } void AnimationPlayer::play_backwards(const StringName &p_name, float p_custom_blend) { - play(p_name, p_custom_blend, -1, true); } void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float p_custom_scale, bool p_from_end) { - StringName name = p_name; - if (String(name) == "") + if (String(name) == "") { name = playback.assigned; + } ERR_FAIL_COND_MSG(!animation_set.has(name), "Animation not found: " + name + "."); Playback &c = playback; if (c.current.from) { - float blend_time = 0; // find if it can blend BlendKey bk; @@ -1169,30 +1125,25 @@ void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float if (p_custom_blend >= 0) { blend_time = p_custom_blend; } else if (blend_times.has(bk)) { - blend_time = blend_times[bk]; } else { - bk.from = "*"; if (blend_times.has(bk)) { - blend_time = blend_times[bk]; } else { - bk.from = c.current.from->name; bk.to = "*"; if (blend_times.has(bk)) { - blend_time = blend_times[bk]; } } } - if (p_custom_blend < 0 && blend_time == 0 && default_blend_time) + if (p_custom_blend < 0 && blend_time == 0 && default_blend_time) { blend_time = default_blend_time; + } if (blend_time > 0) { - Blend b; b.data = c.current; b.blend_time = b.blend_left = blend_time; @@ -1223,15 +1174,17 @@ void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float c.seeked = false; c.started = true; - if (!end_reached) + if (!end_reached) { queued.clear(); + } _set_process(true); // always process when starting an animation playing = true; emit_signal(SceneStringNames::get_singleton()->animation_started, c.assigned); - if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) + if (is_inside_tree() && Engine::get_singleton()->is_editor_hint()) { return; // no next in this case + } StringName next = animation_get_next(p_name); if (next != StringName() && animation_set.has(next)) { @@ -1240,12 +1193,10 @@ void AnimationPlayer::play(const StringName &p_name, float p_custom_blend, float } bool AnimationPlayer::is_playing() const { - return playing; } void AnimationPlayer::set_current_animation(const String &p_anim) { - if (p_anim == "[stop]" || p_anim == "") { stop(); } else if (!is_playing() || playback.assigned != p_anim) { @@ -1256,12 +1207,10 @@ void AnimationPlayer::set_current_animation(const String &p_anim) { } String AnimationPlayer::get_current_animation() const { - return (is_playing() ? playback.assigned : ""); } void AnimationPlayer::set_assigned_animation(const String &p_anim) { - if (is_playing()) { play(p_anim); } else { @@ -1273,12 +1222,10 @@ void AnimationPlayer::set_assigned_animation(const String &p_anim) { } String AnimationPlayer::get_assigned_animation() const { - return playback.assigned; } void AnimationPlayer::stop(bool p_reset) { - _stop_playing_caches(); Playback &c = playback; c.blend.clear(); @@ -1293,15 +1240,14 @@ void AnimationPlayer::stop(bool p_reset) { } void AnimationPlayer::set_speed_scale(float p_speed) { - speed_scale = p_speed; } -float AnimationPlayer::get_speed_scale() const { +float AnimationPlayer::get_speed_scale() const { return speed_scale; } -float AnimationPlayer::get_playing_speed() const { +float AnimationPlayer::get_playing_speed() const { if (!playing) { return 0; } @@ -1309,7 +1255,6 @@ float AnimationPlayer::get_playing_speed() const { } void AnimationPlayer::seek(float p_time, bool p_update) { - if (!playback.current.from) { if (playback.assigned) { ERR_FAIL_COND(!animation_set.has(playback.assigned)); @@ -1326,7 +1271,6 @@ void AnimationPlayer::seek(float p_time, bool p_update) { } void AnimationPlayer::seek_delta(float p_time, float p_delta) { - if (!playback.current.from) { if (playback.assigned) { ERR_FAIL_COND(!animation_set.has(playback.assigned)); @@ -1336,31 +1280,28 @@ void AnimationPlayer::seek_delta(float p_time, float p_delta) { } playback.current.pos = p_time - p_delta; - if (speed_scale != 0.0) + if (speed_scale != 0.0) { p_delta /= speed_scale; + } _animation_process(p_delta); //playback.current.pos=p_time; } bool AnimationPlayer::is_valid() const { - return (playback.current.from); } float AnimationPlayer::get_current_animation_position() const { - ERR_FAIL_COND_V(!playback.current.from, 0); return playback.current.pos; } float AnimationPlayer::get_current_animation_length() const { - ERR_FAIL_COND_V(!playback.current.from, 0); return playback.current.from->animation->get_length(); } void AnimationPlayer::_animation_changed() { - clear_caches(); emit_signal("caches_cleared"); if (is_playing()) { @@ -1369,16 +1310,15 @@ void AnimationPlayer::_animation_changed() { } void AnimationPlayer::_stop_playing_caches() { - for (Set<TrackNodeCache *>::Element *E = playing_caches.front(); E; E = E->next()) { - if (E->get()->node && E->get()->audio_playing) { E->get()->node->call("stop"); } if (E->get()->node && E->get()->animation_playing) { AnimationPlayer *player = Object::cast_to<AnimationPlayer>(E->get()->node); - if (!player) + if (!player) { continue; + } player->stop(); } } @@ -1387,18 +1327,15 @@ void AnimationPlayer::_stop_playing_caches() { } void AnimationPlayer::_node_removed(Node *p_node) { - clear_caches(); // nodes contained here ar being removed, clear the caches } void AnimationPlayer::clear_caches() { - _stop_playing_caches(); node_cache_map.clear(); for (Map<StringName, AnimationData>::Element *E = animation_set.front(); E; E = E->next()) { - E->get().node_cache.clear(); } @@ -1408,77 +1345,73 @@ void AnimationPlayer::clear_caches() { } void AnimationPlayer::set_active(bool p_active) { - - if (active == p_active) + if (active == p_active) { return; + } active = p_active; _set_process(processing, true); } bool AnimationPlayer::is_active() const { - return active; } StringName AnimationPlayer::find_animation(const Ref<Animation> &p_animation) const { - for (Map<StringName, AnimationData>::Element *E = animation_set.front(); E; E = E->next()) { - - if (E->get().animation == p_animation) + if (E->get().animation == p_animation) { return E->key(); + } } return ""; } void AnimationPlayer::set_autoplay(const String &p_name) { - if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) + if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) { WARN_PRINT("Setting autoplay after the node has been added to the scene has no effect."); + } autoplay = p_name; } String AnimationPlayer::get_autoplay() const { - return autoplay; } void AnimationPlayer::set_animation_process_mode(AnimationProcessMode p_mode) { - - if (animation_process_mode == p_mode) + if (animation_process_mode == p_mode) { return; + } bool pr = processing; - if (pr) + if (pr) { _set_process(false); + } animation_process_mode = p_mode; - if (pr) + if (pr) { _set_process(true); + } } AnimationPlayer::AnimationProcessMode AnimationPlayer::get_animation_process_mode() const { - return animation_process_mode; } void AnimationPlayer::set_method_call_mode(AnimationMethodCallMode p_mode) { - method_call_mode = p_mode; } AnimationPlayer::AnimationMethodCallMode AnimationPlayer::get_method_call_mode() const { - return method_call_mode; } void AnimationPlayer::_set_process(bool p_process, bool p_force) { - - if (processing == p_process && !p_force) + if (processing == p_process && !p_force) { return; + } switch (animation_process_mode) { - case ANIMATION_PROCESS_PHYSICS: set_physics_process_internal(p_process && active); break; @@ -1493,41 +1426,35 @@ void AnimationPlayer::_set_process(bool p_process, bool p_force) { } void AnimationPlayer::animation_set_next(const StringName &p_animation, const StringName &p_next) { - ERR_FAIL_COND(!animation_set.has(p_animation)); animation_set[p_animation].next = p_next; } StringName AnimationPlayer::animation_get_next(const StringName &p_animation) const { - - if (!animation_set.has(p_animation)) + if (!animation_set.has(p_animation)) { return StringName(); + } return animation_set[p_animation].next; } void AnimationPlayer::set_default_blend_time(float p_default) { - default_blend_time = p_default; } float AnimationPlayer::get_default_blend_time() const { - return default_blend_time; } void AnimationPlayer::set_root(const NodePath &p_root) { - root = p_root; clear_caches(); } NodePath AnimationPlayer::get_root() const { - return root; } void AnimationPlayer::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { - #ifdef TOOLS_ENABLED const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", 0) ? "'" : "\""; #else @@ -1539,7 +1466,6 @@ void AnimationPlayer::get_argument_options(const StringName &p_function, int p_i List<StringName> al; get_animation_list(&al); for (List<StringName>::Element *E = al.front(); E; E = E->next()) { - r_options->push_back(quote_style + String(E->get()) + quote_style); } } @@ -1548,9 +1474,9 @@ void AnimationPlayer::get_argument_options(const StringName &p_function, int p_i #ifdef TOOLS_ENABLED AnimatedValuesBackup AnimationPlayer::backup_animated_values() { - - if (!playback.current.from) + if (!playback.current.from) { return AnimatedValuesBackup(); + } _ensure_node_caches(playback.current.from); @@ -1558,12 +1484,14 @@ AnimatedValuesBackup AnimationPlayer::backup_animated_values() { for (int i = 0; i < playback.current.from->node_cache.size(); i++) { TrackNodeCache *nc = playback.current.from->node_cache[i]; - if (!nc) + if (!nc) { continue; + } if (nc->skeleton) { - if (nc->bone_idx == -1) + if (nc->bone_idx == -1) { continue; + } AnimatedValuesBackup::Entry entry; entry.object = nc->skeleton; @@ -1586,8 +1514,9 @@ AnimatedValuesBackup AnimationPlayer::backup_animated_values() { bool valid; entry.value = E->value().object->get_indexed(E->value().subpath, &valid); entry.bone_idx = -1; - if (valid) + if (valid) { backup.entries.push_back(entry); + } } } } @@ -1597,9 +1526,7 @@ AnimatedValuesBackup AnimationPlayer::backup_animated_values() { } void AnimationPlayer::restore_animated_values(const AnimatedValuesBackup &p_backup) { - for (int i = 0; i < p_backup.entries.size(); i++) { - const AnimatedValuesBackup::Entry *entry = &p_backup.entries[i]; if (entry->bone_idx == -1) { entry->object->set_indexed(entry->subpath, entry->value); @@ -1697,7 +1624,6 @@ void AnimationPlayer::_bind_methods() { } AnimationPlayer::AnimationPlayer() { - accum_pass = 1; cache_update_size = 0; cache_update_prop_size = 0; diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h index d709082f62..1a66665803 100644 --- a/scene/animation/animation_player.h +++ b/scene/animation/animation_player.h @@ -85,7 +85,6 @@ private: }; struct TrackNodeCache { - NodePath path; uint32_t id = 0; RES resource; @@ -108,7 +107,6 @@ private: bool animation_playing = false; struct PropertyAnim { - TrackNodeCache *owner = nullptr; SpecialProperty special = SP_NONE; //small optimization Vector<StringName> subpath; @@ -123,7 +121,6 @@ private: Map<StringName, PropertyAnim> property_anim; struct BezierAnim { - Vector<StringName> bezier_property; TrackNodeCache *owner = nullptr; float bezier_accum = 0.0; @@ -139,16 +136,15 @@ private: }; struct TrackNodeCacheKey { - ObjectID id; int bone_idx; inline bool operator<(const TrackNodeCacheKey &p_right) const { - - if (id == p_right.id) + if (id == p_right.id) { return bone_idx < p_right.bone_idx; - else + } else { return id < p_right.id; + } } }; @@ -175,7 +171,6 @@ private: Map<StringName, AnimationData> animation_set; struct BlendKey { - StringName from; StringName to; bool operator<(const BlendKey &bk) const { return from == bk.from ? String(to) < String(bk.to) : String(from) < String(bk.from); } @@ -184,13 +179,11 @@ private: Map<BlendKey, float> blend_times; struct PlaybackData { - AnimationData *from; float pos; float speed_scale; PlaybackData() { - pos = 0; speed_scale = 1.0; from = nullptr; @@ -198,21 +191,18 @@ private: }; struct Blend { - PlaybackData data; float blend_time; float blend_left; Blend() { - blend_left = 0; blend_time = 0; } }; struct Playback { - List<Blend> blend; PlaybackData current; StringName assigned; @@ -246,12 +236,10 @@ private: // bind helpers Vector<String> _get_animation_list() const { - List<StringName> animations; get_animation_list(&animations); Vector<String> ret; while (animations.size()) { - ret.push_back(animations.front()->get()); animations.pop_front(); } diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index 56e224819f..466536db10 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -73,7 +73,6 @@ Variant AnimationNode::get_parameter(const StringName &p_name) const { } void AnimationNode::get_child_nodes(List<ChildNode> *r_child_nodes) { - if (get_script_instance()) { Dictionary cn = get_script_instance()->call("get_child_nodes"); List<Variant> keys; @@ -88,14 +87,12 @@ void AnimationNode::get_child_nodes(List<ChildNode> *r_child_nodes) { } void AnimationNode::blend_animation(const StringName &p_animation, float p_time, float p_delta, bool p_seeked, float p_blend) { - ERR_FAIL_COND(!state); ERR_FAIL_COND(!state->player->has_animation(p_animation)); Ref<Animation> animation = state->player->get_animation(p_animation); if (animation.is_null()) { - AnimationNodeBlendTree *btree = Object::cast_to<AnimationNodeBlendTree>(parent); if (btree) { String name = btree->get_node_name(Ref<AnimationNodeAnimation>(this)); @@ -120,7 +117,6 @@ void AnimationNode::blend_animation(const StringName &p_animation, float p_time, } float AnimationNode::_pre_process(const StringName &p_base_path, AnimationNode *p_parent, State *p_state, float p_time, bool p_seek, const Vector<StringName> &p_connections) { - base_path = p_base_path; parent = p_parent; connections = p_connections; @@ -176,12 +172,10 @@ float AnimationNode::blend_input(int p_input, float p_time, bool p_seek, float p } float AnimationNode::blend_node(const StringName &p_sub_path, Ref<AnimationNode> p_node, float p_time, bool p_seek, float p_blend, FilterAction p_filter, bool p_optimize) { - return _blend_node(p_sub_path, Vector<StringName>(), this, p_node, p_time, p_seek, p_blend, p_filter, p_optimize); } float AnimationNode::_blend_node(const StringName &p_subpath, const Vector<StringName> &p_connections, AnimationNode *p_new_parent, Ref<AnimationNode> p_node, float p_time, bool p_seek, float p_blend, FilterAction p_filter, bool p_optimize, float *r_max) { - ERR_FAIL_COND_V(!p_node.is_valid(), 0); ERR_FAIL_COND_V(!state, 0); @@ -197,7 +191,6 @@ float AnimationNode::_blend_node(const StringName &p_subpath, const Vector<Strin bool any_valid = false; if (has_filter() && is_filter_enabled() && p_filter != FILTER_IGNORE) { - for (int i = 0; i < blend_count; i++) { blendw[i] = 0.0; //all to zero by default } @@ -217,8 +210,9 @@ float AnimationNode::_blend_node(const StringName &p_subpath, const Vector<Strin case FILTER_PASS: { //values filtered pass, the rest don't for (int i = 0; i < blend_count; i++) { - if (blendw[i] == 0) //not filtered, does not pass + if (blendw[i] == 0) { //not filtered, does not pass continue; + } blendw[i] = blendr[i] * p_blend; if (blendw[i] > CMP_EPSILON) { @@ -228,12 +222,12 @@ float AnimationNode::_blend_node(const StringName &p_subpath, const Vector<Strin } break; case FILTER_STOP: { - //values filtered don't pass, the rest are blended for (int i = 0; i < blend_count; i++) { - if (blendw[i] > 0) //filtered, does not pass + if (blendw[i] > 0) { //filtered, does not pass continue; + } blendw[i] = blendr[i] * p_blend; if (blendw[i] > CMP_EPSILON) { @@ -243,7 +237,6 @@ float AnimationNode::_blend_node(const StringName &p_subpath, const Vector<Strin } break; case FILTER_BLEND: { - //filtered values are blended, the rest are passed without blending for (int i = 0; i < blend_count; i++) { @@ -262,7 +255,6 @@ float AnimationNode::_blend_node(const StringName &p_subpath, const Vector<Strin } } else { for (int i = 0; i < blend_count; i++) { - //regular blend blendw[i] = blendr[i] * p_blend; if (blendw[i] > CMP_EPSILON) { @@ -278,8 +270,9 @@ float AnimationNode::_blend_node(const StringName &p_subpath, const Vector<Strin } } - if (!p_seek && p_optimize && !any_valid) //pointless to go on, all are zero + if (!p_seek && p_optimize && !any_valid) { //pointless to go on, all are zero return 0; + } String new_path; AnimationNode *new_parent; @@ -297,16 +290,15 @@ float AnimationNode::_blend_node(const StringName &p_subpath, const Vector<Strin } int AnimationNode::get_input_count() const { - return inputs.size(); } + String AnimationNode::get_input_name(int p_input) { ERR_FAIL_INDEX_V(p_input, inputs.size(), String()); return inputs[p_input].name; } String AnimationNode::get_caption() const { - if (get_script_instance()) { return get_script_instance()->call("get_caption"); } @@ -338,7 +330,6 @@ void AnimationNode::remove_input(int p_index) { } float AnimationNode::process(float p_time, bool p_seek) { - if (get_script_instance()) { return get_script_instance()->call("process", p_time, p_seek); } @@ -371,7 +362,6 @@ bool AnimationNode::has_filter() const { } Array AnimationNode::_get_filters() const { - Array paths; const NodePath *K = nullptr; @@ -382,6 +372,7 @@ Array AnimationNode::_get_filters() const { return paths; } + void AnimationNode::_set_filters(const Array &p_filters) { filter.clear(); for (int i = 0; i < p_filters.size(); i++) { @@ -403,7 +394,6 @@ Ref<AnimationNode> AnimationNode::get_child_by_name(const StringName &p_name) { } void AnimationNode::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_input_count"), &AnimationNode::get_input_count); ClassDB::bind_method(D_METHOD("get_input_name", "input"), &AnimationNode::get_input_name); @@ -452,7 +442,6 @@ void AnimationNode::_bind_methods() { } AnimationNode::AnimationNode() { - state = nullptr; parent = nullptr; filter_enabled = false; @@ -461,7 +450,6 @@ AnimationNode::AnimationNode() { //////////////////// void AnimationTree::set_tree_root(const Ref<AnimationNode> &p_root) { - if (root.is_valid()) { root->disconnect("tree_changed", callable_mp(this, &AnimationTree::_tree_changed)); } @@ -482,9 +470,9 @@ Ref<AnimationNode> AnimationTree::get_tree_root() const { } void AnimationTree::set_active(bool p_active) { - - if (active == p_active) + if (active == p_active) { return; + } active = p_active; started = active; @@ -492,13 +480,11 @@ void AnimationTree::set_active(bool p_active) { if (process_mode == ANIMATION_PROCESS_IDLE) { set_process_internal(active); } else { - set_physics_process_internal(active); } if (!active && is_inside_tree()) { for (Set<TrackCache *>::Element *E = playing_caches.front(); E; E = E->next()) { - if (ObjectDB::get_instance(E->get()->object_id)) { E->get()->object->call("stop"); } @@ -509,14 +495,13 @@ void AnimationTree::set_active(bool p_active) { } bool AnimationTree::is_active() const { - return active; } void AnimationTree::set_process_mode(AnimationProcessMode p_mode) { - - if (process_mode == p_mode) + if (process_mode == p_mode) { return; + } bool was_active = is_active(); if (was_active) { @@ -539,7 +524,6 @@ void AnimationTree::_node_removed(Node *p_node) { } bool AnimationTree::_update_caches(AnimationPlayer *player) { - setup_pass++; if (!player->has_node(player->get_root())) { @@ -572,7 +556,6 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { } if (!track) { - RES resource; Vector<StringName> leftover_path; Node *child = parent->get_node_and_resource(path, resource, leftover_path); @@ -588,7 +571,6 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { switch (track_type) { case Animation::TYPE_VALUE: { - TrackCacheValue *track_value = memnew(TrackCacheValue); if (resource.is_valid()) { @@ -604,7 +586,6 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { } break; case Animation::TYPE_TRANSFORM: { - Node3D *spatial = Object::cast_to<Node3D>(child); if (!spatial) { @@ -619,11 +600,9 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { track_xform->bone_idx = -1; if (path.get_subname_count() == 1 && Object::cast_to<Skeleton3D>(spatial)) { - Skeleton3D *sk = Object::cast_to<Skeleton3D>(spatial); int bone_idx = sk->find_bone(path.get_subname(0)); if (bone_idx != -1) { - track_xform->skeleton = sk; track_xform->bone_idx = bone_idx; } @@ -636,7 +615,6 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { } break; case Animation::TYPE_METHOD: { - TrackCacheMethod *track_method = memnew(TrackCacheMethod); if (resource.is_valid()) { @@ -651,7 +629,6 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { } break; case Animation::TYPE_BEZIER: { - TrackCacheBezier *track_bezier = memnew(TrackCacheBezier); if (resource.is_valid()) { @@ -666,7 +643,6 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { track = track_bezier; } break; case Animation::TYPE_AUDIO: { - TrackCacheAudio *track_audio = memnew(TrackCacheAudio); track_audio->object = child; @@ -676,7 +652,6 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { } break; case Animation::TYPE_ANIMATION: { - TrackCacheAnimation *track_animation = memnew(TrackCacheAnimation); track_animation->object = child; @@ -732,7 +707,6 @@ bool AnimationTree::_update_caches(AnimationPlayer *player) { } void AnimationTree::_clear_caches() { - const NodePath *K = nullptr; while ((K = track_cache.next(K))) { memdelete(track_cache[*K]); @@ -744,7 +718,6 @@ void AnimationTree::_clear_caches() { } void AnimationTree::_process_graph(float p_delta) { - _update_properties(); //if properties need updating, update them //check all tracks, see if they need modification @@ -774,7 +747,6 @@ void AnimationTree::_process_graph(float p_delta) { } if (last_animation_player != current_animation_player) { - if (last_animation_player.is_valid()) { Object *old_player = ObjectDB::get_instance(last_animation_player); if (old_player) { @@ -826,7 +798,6 @@ void AnimationTree::_process_graph(float p_delta) { //process { - if (started) { //if started, seek root->_pre_process(SceneStringNames::get_singleton()->parameters_base_path, nullptr, &state, 0, true, Vector<StringName>()); @@ -842,11 +813,9 @@ void AnimationTree::_process_graph(float p_delta) { //apply value/transform/bezier blends to track caches and execute method/audio/animation tracks { - bool can_call = is_inside_tree() && !Engine::get_singleton()->is_editor_hint(); for (List<AnimationNode::AnimationState>::Element *E = state.animation_states.front(); E; E = E->next()) { - const AnimationNode::AnimationState &as = E->get(); Ref<Animation> a = as.animation; @@ -855,7 +824,6 @@ void AnimationTree::_process_graph(float p_delta) { bool seeked = as.seeked; for (int i = 0; i < a->get_track_count(); i++) { - NodePath path = a->track_get_path(i); ERR_CONTINUE(!track_cache.has(path)); @@ -874,19 +842,16 @@ void AnimationTree::_process_graph(float p_delta) { float blend = (*as.track_blends)[blend_idx]; - if (blend < CMP_EPSILON) + if (blend < CMP_EPSILON) { continue; //nothing to blend + } switch (track->type) { - case Animation::TYPE_TRANSFORM: { - TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track); if (track->root_motion) { - if (t->process_pass != process_pass) { - t->process_pass = process_pass; t->loc = Vector3(); t->rot = Quat(); @@ -908,7 +873,6 @@ void AnimationTree::_process_graph(float p_delta) { Vector3 scale[2]; if (prev_time > time) { - Error err = a->transform_track_interpolate(i, prev_time, &loc[0], &rot[0], &scale[0]); if (err != OK) { continue; @@ -947,7 +911,6 @@ void AnimationTree::_process_graph(float p_delta) { //ERR_CONTINUE(err!=OK); //used for testing, should be removed if (t->process_pass != process_pass) { - t->process_pass = process_pass; t->loc = loc; t->rot = rot; @@ -955,8 +918,9 @@ void AnimationTree::_process_graph(float p_delta) { t->scale = scale; } - if (err != OK) + if (err != OK) { continue; + } t->loc = t->loc.lerp(loc, blend); if (t->rot_blend_accum == 0) { @@ -972,7 +936,6 @@ void AnimationTree::_process_graph(float p_delta) { } break; case Animation::TYPE_VALUE: { - TrackCacheValue *t = static_cast<TrackCacheValue *>(track); Animation::UpdateMode update_mode = a->value_track_get_update_mode(i); @@ -981,8 +944,9 @@ void AnimationTree::_process_graph(float p_delta) { Variant value = a->value_track_interpolate(i, time); - if (value == Variant()) + if (value == Variant()) { continue; + } if (t->process_pass != process_pass) { t->value = value; @@ -992,12 +956,10 @@ void AnimationTree::_process_graph(float p_delta) { Variant::interpolate(t->value, value, blend, t->value); } else if (delta != 0) { - List<int> indices; a->value_track_get_key_indices(i, time, delta, &indices); for (List<int>::Element *F = indices.front(); F; F = F->next()) { - Variant value = a->track_get_key_value(i, F->get()); t->object->set_indexed(t->subpath, value); } @@ -1005,7 +967,6 @@ void AnimationTree::_process_graph(float p_delta) { } break; case Animation::TYPE_METHOD: { - if (delta == 0) { continue; } @@ -1016,7 +977,6 @@ void AnimationTree::_process_graph(float p_delta) { a->method_track_get_key_indices(i, time, delta, &indices); for (List<int>::Element *F = indices.front(); F; F = F->next()) { - StringName method = a->method_track_get_name(i, F->get()); Vector<Variant> params = a->method_track_get_params(i, F->get()); @@ -1036,7 +996,6 @@ void AnimationTree::_process_graph(float p_delta) { } break; case Animation::TYPE_BEZIER: { - TrackCacheBezier *t = static_cast<TrackCacheBezier *>(track); float bezier = a->bezier_track_interpolate(i, time); @@ -1050,14 +1009,14 @@ void AnimationTree::_process_graph(float p_delta) { } break; case Animation::TYPE_AUDIO: { - TrackCacheAudio *t = static_cast<TrackCacheAudio *>(track); if (seeked) { //find whathever should be playing int idx = a->track_find_key(i, time); - if (idx < 0) + if (idx < 0) { continue; + } Ref<AudioStream> stream = a->audio_track_get_key_stream(i, idx); if (!stream.is_valid()) { @@ -1122,7 +1081,6 @@ void AnimationTree::_process_graph(float p_delta) { t->start = time; } } else if (t->playing) { - bool loop = a->has_loop(); bool stop = false; @@ -1154,25 +1112,27 @@ void AnimationTree::_process_graph(float p_delta) { } } break; case Animation::TYPE_ANIMATION: { - TrackCacheAnimation *t = static_cast<TrackCacheAnimation *>(track); AnimationPlayer *player2 = Object::cast_to<AnimationPlayer>(t->object); - if (!player2) + if (!player2) { continue; + } if (delta == 0 || seeked) { //seek int idx = a->track_find_key(i, time); - if (idx < 0) + if (idx < 0) { continue; + } float pos = a->track_get_key_time(i, idx); StringName anim_name = a->animation_track_get_key_animation(i, idx); - if (String(anim_name) == "[stop]" || !player2->has_animation(anim_name)) + if (String(anim_name) == "[stop]" || !player2->has_animation(anim_name)) { continue; + } Ref<Animation> anim = player2->get_animation(anim_name); @@ -1202,7 +1162,6 @@ void AnimationTree::_process_graph(float p_delta) { StringName anim_name = a->animation_track_get_key_animation(i, idx); if (String(anim_name) == "[stop]" || !player2->has_animation(anim_name)) { - if (playing_caches.has(t)) { playing_caches.erase(t); player2->stop(); @@ -1227,13 +1186,12 @@ void AnimationTree::_process_graph(float p_delta) { const NodePath *K = nullptr; while ((K = track_cache.next(K))) { TrackCache *track = track_cache[*K]; - if (track->process_pass != process_pass) + if (track->process_pass != process_pass) { continue; //not processed, ignore + } switch (track->type) { - case Animation::TYPE_TRANSFORM: { - TrackCacheTransform *t = static_cast<TrackCacheTransform *>(track); Transform xform; @@ -1242,31 +1200,26 @@ void AnimationTree::_process_graph(float p_delta) { xform.basis.set_quat_scale(t->rot, t->scale); if (t->root_motion) { - root_motion_transform = xform; if (t->skeleton && t->bone_idx >= 0) { root_motion_transform = (t->skeleton->get_bone_rest(t->bone_idx) * root_motion_transform) * t->skeleton->get_bone_rest(t->bone_idx).affine_inverse(); } } else if (t->skeleton && t->bone_idx >= 0) { - t->skeleton->set_bone_pose(t->bone_idx, xform); } else { - t->spatial->set_transform(xform); } } break; case Animation::TYPE_VALUE: { - TrackCacheValue *t = static_cast<TrackCacheValue *>(track); t->object->set_indexed(t->subpath, t->value); } break; case Animation::TYPE_BEZIER: { - TrackCacheBezier *t = static_cast<TrackCacheBezier *>(track); t->object->set_indexed(t->subpath, t->value); @@ -1280,12 +1233,10 @@ void AnimationTree::_process_graph(float p_delta) { } void AnimationTree::advance(float p_time) { - _process_graph(p_time); } void AnimationTree::_notification(int p_what) { - if (active && p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS && process_mode == ANIMATION_PROCESS_PHYSICS) { _process_graph(get_physics_process_delta_time()); } @@ -1297,7 +1248,6 @@ void AnimationTree::_notification(int p_what) { if (p_what == NOTIFICATION_EXIT_TREE) { _clear_caches(); if (last_animation_player.is_valid()) { - Object *player = ObjectDB::get_instance(last_animation_player); if (player) { player->disconnect("caches_cleared", callable_mp(this, &AnimationTree::_clear_caches)); @@ -1305,7 +1255,6 @@ void AnimationTree::_notification(int p_what) { } } else if (p_what == NOTIFICATION_ENTER_TREE) { if (last_animation_player.is_valid()) { - Object *player = ObjectDB::get_instance(last_animation_player); if (player) { player->connect("caches_cleared", callable_mp(this, &AnimationTree::_clear_caches)); @@ -1324,11 +1273,10 @@ NodePath AnimationTree::get_animation_player() const { } bool AnimationTree::is_state_invalid() const { - return !state.valid; } -String AnimationTree::get_invalid_state_reason() const { +String AnimationTree::get_invalid_state_reason() const { return state.invalid_reasons; } @@ -1337,7 +1285,6 @@ uint64_t AnimationTree::get_last_process_pass() const { } String AnimationTree::get_configuration_warning() const { - String warning = Node::get_configuration_warning(); if (!root.is_valid()) { @@ -1348,7 +1295,6 @@ String AnimationTree::get_configuration_warning() const { } if (!has_node(animation_player)) { - if (warning != String()) { warning += "\n\n"; } @@ -1402,13 +1348,11 @@ void AnimationTree::_tree_changed() { } void AnimationTree::_update_properties_for_node(const String &p_base_path, Ref<AnimationNode> node) { - if (!property_parent_map.has(p_base_path)) { property_parent_map[p_base_path] = HashMap<StringName, StringName>(); } if (node->get_input_count() && !input_activity_map.has(p_base_path)) { - Vector<Activity> activity; for (int i = 0; i < node->get_input_count(); i++) { Activity a; @@ -1492,6 +1436,7 @@ bool AnimationTree::_get(const StringName &p_name, Variant &r_ret) const { return false; } + void AnimationTree::_get_property_list(List<PropertyInfo> *p_list) const { if (properties_dirty) { const_cast<AnimationTree *>(this)->_update_properties(); @@ -1503,7 +1448,6 @@ void AnimationTree::_get_property_list(List<PropertyInfo> *p_list) const { } void AnimationTree::rename_parameter(const String &p_base, const String &p_new_base) { - //rename values first for (const List<PropertyInfo>::Element *E = properties.front(); E; E = E->next()) { if (E->get().name.begins_with(p_base)) { @@ -1518,7 +1462,6 @@ void AnimationTree::rename_parameter(const String &p_base, const String &p_new_b } float AnimationTree::get_connection_activity(const StringName &p_path, int p_connection) const { - if (!input_activity_map_get.has(p_path)) { return 0; } @@ -1572,7 +1515,6 @@ void AnimationTree::_bind_methods() { } AnimationTree::AnimationTree() { - process_mode = ANIMATION_PROCESS_IDLE; active = false; cache_valid = false; diff --git a/scene/animation/animation_tree.h b/scene/animation/animation_tree.h index d558170f23..8fe01fac8f 100644 --- a/scene/animation/animation_tree.h +++ b/scene/animation/animation_tree.h @@ -52,7 +52,6 @@ public: }; struct Input { - String name; }; @@ -63,7 +62,6 @@ public: friend class AnimationTree; struct AnimationState { - Ref<Animation> animation; float time; float delta; @@ -73,7 +71,6 @@ public: }; struct State { - int track_count; HashMap<NodePath, int> track_map; List<AnimationState> animation_states; @@ -174,7 +171,6 @@ public: private: struct TrackCache { - bool root_motion; uint64_t setup_pass; uint64_t process_pass; @@ -209,19 +205,16 @@ private: }; struct TrackCacheValue : public TrackCache { - Variant value; Vector<StringName> subpath; TrackCacheValue() { type = Animation::TYPE_VALUE; } }; struct TrackCacheMethod : public TrackCache { - TrackCacheMethod() { type = Animation::TYPE_METHOD; } }; struct TrackCacheBezier : public TrackCache { - float value; Vector<StringName> subpath; TrackCacheBezier() { @@ -231,7 +224,6 @@ private: }; struct TrackCacheAudio : public TrackCache { - bool playing; float start; float len; @@ -245,7 +237,6 @@ private: }; struct TrackCacheAnimation : public TrackCache { - bool playing; TrackCacheAnimation() { diff --git a/scene/animation/root_motion_view.cpp b/scene/animation/root_motion_view.cpp index f993127b07..cbf2e4a6ff 100644 --- a/scene/animation/root_motion_view.cpp +++ b/scene/animation/root_motion_view.cpp @@ -76,9 +76,7 @@ bool RootMotionView::get_zero_y() const { } void RootMotionView::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - RS::get_singleton()->immediate_set_material(immediate, StandardMaterial3D::get_material_rid_for_2d(false, true, false, false, false)); first = true; } @@ -87,7 +85,6 @@ void RootMotionView::_notification(int p_what) { Transform transform; if (has_node(path)) { - Node *node = get_node(path); AnimationTree *tree = Object::cast_to<AnimationTree>(node); @@ -129,7 +126,6 @@ void RootMotionView::_notification(int p_what) { RS::get_singleton()->immediate_begin(immediate, RS::PRIMITIVE_LINES); for (int i = -cells_in_radius; i < cells_in_radius; i++) { for (int j = -cells_in_radius; j < cells_in_radius; j++) { - Vector3 from(i * cell_size, 0, j * cell_size); Vector3 from_i((i + 1) * cell_size, 0, j * cell_size); Vector3 from_j(i * cell_size, 0, (j + 1) * cell_size); @@ -161,15 +157,14 @@ void RootMotionView::_notification(int p_what) { } AABB RootMotionView::get_aabb() const { - return AABB(Vector3(-radius, 0, -radius), Vector3(radius * 2, 0.001, radius * 2)); } + Vector<Face3> RootMotionView::get_faces(uint32_t p_usage_flags) const { return Vector<Face3>(); } void RootMotionView::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_animation_path", "path"), &RootMotionView::set_animation_path); ClassDB::bind_method(D_METHOD("get_animation_path"), &RootMotionView::get_animation_path); diff --git a/scene/animation/tween.cpp b/scene/animation/tween.cpp index b826907a3a..854db5fee2 100644 --- a/scene/animation/tween.cpp +++ b/scene/animation/tween.cpp @@ -33,7 +33,6 @@ #include "core/method_bind_ext.gen.inc" void Tween::_add_pending_command(StringName p_key, const Variant &p_arg1, const Variant &p_arg2, const Variant &p_arg3, const Variant &p_arg4, const Variant &p_arg5, const Variant &p_arg6, const Variant &p_arg7, const Variant &p_arg8, const Variant &p_arg9, const Variant &p_arg10) { - // Add a new pending command and reference it pending_commands.push_back(PendingCommand()); PendingCommand &cmd = pending_commands.back()->get(); @@ -43,57 +42,66 @@ void Tween::_add_pending_command(StringName p_key, const Variant &p_arg1, const // Determine command argument count int &count = cmd.args; - if (p_arg10.get_type() != Variant::NIL) + if (p_arg10.get_type() != Variant::NIL) { count = 10; - else if (p_arg9.get_type() != Variant::NIL) + } else if (p_arg9.get_type() != Variant::NIL) { count = 9; - else if (p_arg8.get_type() != Variant::NIL) + } else if (p_arg8.get_type() != Variant::NIL) { count = 8; - else if (p_arg7.get_type() != Variant::NIL) + } else if (p_arg7.get_type() != Variant::NIL) { count = 7; - else if (p_arg6.get_type() != Variant::NIL) + } else if (p_arg6.get_type() != Variant::NIL) { count = 6; - else if (p_arg5.get_type() != Variant::NIL) + } else if (p_arg5.get_type() != Variant::NIL) { count = 5; - else if (p_arg4.get_type() != Variant::NIL) + } else if (p_arg4.get_type() != Variant::NIL) { count = 4; - else if (p_arg3.get_type() != Variant::NIL) + } else if (p_arg3.get_type() != Variant::NIL) { count = 3; - else if (p_arg2.get_type() != Variant::NIL) + } else if (p_arg2.get_type() != Variant::NIL) { count = 2; - else if (p_arg1.get_type() != Variant::NIL) + } else if (p_arg1.get_type() != Variant::NIL) { count = 1; - else + } else { count = 0; + } // Add the specified arguments to the command - if (count > 0) + if (count > 0) { cmd.arg[0] = p_arg1; - if (count > 1) + } + if (count > 1) { cmd.arg[1] = p_arg2; - if (count > 2) + } + if (count > 2) { cmd.arg[2] = p_arg3; - if (count > 3) + } + if (count > 3) { cmd.arg[3] = p_arg4; - if (count > 4) + } + if (count > 4) { cmd.arg[4] = p_arg5; - if (count > 5) + } + if (count > 5) { cmd.arg[5] = p_arg6; - if (count > 6) + } + if (count > 6) { cmd.arg[6] = p_arg7; - if (count > 7) + } + if (count > 7) { cmd.arg[7] = p_arg8; - if (count > 8) + } + if (count > 8) { cmd.arg[8] = p_arg9; - if (count > 9) + } + if (count > 9) { cmd.arg[9] = p_arg10; + } } void Tween::_process_pending_commands() { - // For each pending command... for (List<PendingCommand>::Element *E = pending_commands.front(); E; E = E->next()) { - // Get the command PendingCommand &cmd = E->get(); Callable::CallError err; @@ -121,7 +129,6 @@ void Tween::_process_pending_commands() { } bool Tween::_set(const StringName &p_name, const Variant &p_value) { - // Set the correct attribute based on the given name String name = p_name; if (name == "playback/speed" || name == "speed") { // Backwards compatibility @@ -140,7 +147,6 @@ bool Tween::_set(const StringName &p_name, const Variant &p_value) { } bool Tween::_get(const StringName &p_name, Variant &r_ret) const { - // Get the correct attribute based on the given name String name = p_name; if (name == "playback/speed") { // Backwards compatibility @@ -168,7 +174,6 @@ void Tween::_get_property_list(List<PropertyInfo> *p_list) const { void Tween::_notification(int p_what) { // What notification did we receive? switch (p_what) { - case NOTIFICATION_ENTER_TREE: { // Are we not already active? if (!is_active()) { @@ -185,26 +190,30 @@ void Tween::_notification(int p_what) { case NOTIFICATION_INTERNAL_PROCESS: { // Are we processing during physics time? - if (tween_process_mode == TWEEN_PROCESS_PHYSICS) + if (tween_process_mode == TWEEN_PROCESS_PHYSICS) { // Do nothing since we aren't aligned with physics when we should be break; + } // Should we update? - if (is_active()) + if (is_active()) { // Update the tweens _tween_process(get_process_delta_time()); + } } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { // Are we processing during 'regular' time? - if (tween_process_mode == TWEEN_PROCESS_IDLE) + if (tween_process_mode == TWEEN_PROCESS_IDLE) { // Do nothing since we would only process during idle time break; + } // Should we update? - if (is_active()) + if (is_active()) { // Update the tweens _tween_process(get_physics_process_delta_time()); + } } break; case NOTIFICATION_EXIT_TREE: { @@ -289,7 +298,6 @@ void Tween::_bind_methods() { } Variant Tween::_get_initial_val(const InterpolateData &p_data) const { - // What type of data are we interpolating? switch (p_data.type) { case INTER_PROPERTY: @@ -353,8 +361,9 @@ Variant Tween::_get_final_val(const InterpolateData &p_data) const { // If we're looking at an INT value, instead convert it to a FLOAT // This is better for interpolation - if (final_val.get_type() == Variant::INT) + if (final_val.get_type() == Variant::INT) { final_val = final_val.operator real_t(); + } return final_val; } @@ -366,7 +375,6 @@ Variant Tween::_get_final_val(const InterpolateData &p_data) const { } Variant &Tween::_get_delta_val(InterpolateData &p_data) { - // What kind of data are we interpolating? switch (p_data.type) { case INTER_PROPERTY: @@ -396,8 +404,9 @@ Variant &Tween::_get_delta_val(InterpolateData &p_data) { // If we're looking at an INT value, instead convert it to a FLOAT // This is better for interpolation - if (final_val.get_type() == Variant::INT) + if (final_val.get_type() == Variant::INT) { final_val = final_val.operator real_t(); + } // Calculate the delta based on the initial value and the final value _calc_delta_val(p_data.initial_val, final_val, p_data.delta_val); @@ -411,8 +420,9 @@ Variant &Tween::_get_delta_val(InterpolateData &p_data) { // If we're looking at an INT value, instead convert it to a FLOAT // This is better for interpolation - if (initial_val.get_type() == Variant::INT) + if (initial_val.get_type() == Variant::INT) { initial_val = initial_val.operator real_t(); + } // Calculate the delta based on the initial value and the final value _calc_delta_val(initial_val, p_data.final_val, p_data.delta_val); @@ -438,7 +448,6 @@ Variant Tween::_run_equation(InterpolateData &p_data) { // What type of data are we interpolating? switch (initial_val.get_type()) { - case Variant::BOOL: // Run the boolean specific equation (checking if it is at least 0.5) result = (_run_equation(p_data.trans_type, p_data.ease_type, p_data.elapsed - p_data.delay, initial_val, delta_val, p_data.duration)) >= 0.5; @@ -613,14 +622,12 @@ Variant Tween::_run_equation(InterpolateData &p_data) { } bool Tween::_apply_tween_value(InterpolateData &p_data, Variant &value) { - // Get the object we want to apply the new value to Object *object = ObjectDB::get_instance(p_data.id); ERR_FAIL_COND_V(object == nullptr, false); // What kind of data are we mutating? switch (p_data.type) { - case INTER_PROPERTY: case FOLLOW_PROPERTY: case TARGETING_PROPERTY: { @@ -663,8 +670,9 @@ void Tween::_tween_process(float p_delta) { _process_pending_commands(); // If the scale is 0, make no progress on the tweens - if (speed_scale == 0) + if (speed_scale == 0) { return; + } // Update the delta and whether we are pending an update p_delta *= speed_scale; @@ -687,8 +695,9 @@ void Tween::_tween_process(float p_delta) { } // If we are all finished, we can reset all of the tweens - if (repeats_finished) + if (repeats_finished) { reset_all(); + } } // Are all of the tweens complete? @@ -696,7 +705,6 @@ void Tween::_tween_process(float p_delta) { // For each tween we wish to interpolate... for (List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) { - // Get the data from it InterpolateData &data = E->get(); @@ -704,20 +712,22 @@ void Tween::_tween_process(float p_delta) { all_finished = all_finished && data.finish; // Is the data not active or already finished? No need to go any further - if (!data.active || data.finish) + if (!data.active || data.finish) { continue; + } // Get the target object for this interpolation Object *object = ObjectDB::get_instance(data.id); - if (object == nullptr) + if (object == nullptr) { continue; + } // Are we still delaying this tween? bool prev_delaying = data.elapsed <= data.delay; data.elapsed += p_delta; - if (data.elapsed < data.delay) + if (data.elapsed < data.delay) { continue; - else if (prev_delaying) { + } else if (prev_delaying) { // We can apply the tween's value to the data and emit that the tween has started _apply_tween_value(data, data.initial_val); emit_signal("tween_started", object, NodePath(Vector<StringName>(), data.key, false)); @@ -790,8 +800,9 @@ void Tween::_tween_process(float p_delta) { emit_signal("tween_completed", object, NodePath(Vector<StringName>(), data.key, false)); // If we are not repeating the tween, remove it - if (!repeat) + if (!repeat) { call_deferred("_remove_by_uid", data.uid); + } } else if (!repeat) { // Check whether all tweens are finished all_finished = all_finished && data.finish; @@ -821,8 +832,9 @@ bool Tween::is_active() const { void Tween::set_active(bool p_active) { // Do nothing if it's the same active mode that we currently are - if (is_active() == p_active) + if (is_active() == p_active) { return; + } // Depending on physics or idle, set processing switch (tween_process_mode) { @@ -852,7 +864,6 @@ float Tween::get_speed_scale() const { } void Tween::start() { - ERR_FAIL_COND_MSG(!is_inside_tree(), "Tween was not added to the SceneTree!"); // Are there any pending updates? @@ -873,8 +884,9 @@ void Tween::reset(Object *p_object, StringName p_key) { // Get the target object InterpolateData &data = E->get(); Object *object = ObjectDB::get_instance(data.id); - if (object == nullptr) + if (object == nullptr) { continue; + } // Do we have the correct object and key? if (object == p_object && (data.concatenated_key == p_key || p_key == "")) { @@ -883,8 +895,9 @@ void Tween::reset(Object *p_object, StringName p_key) { data.finish = false; // Also apply the initial state if there isn't a delay - if (data.delay == 0) + if (data.delay == 0) { _apply_tween_value(data, data.initial_val); + } } } pending_update--; @@ -900,8 +913,9 @@ void Tween::reset_all() { data.finish = false; // If there isn't a delay, apply the value to the object - if (data.delay == 0) + if (data.delay == 0) { _apply_tween_value(data, data.initial_val); + } } pending_update--; } @@ -910,17 +924,18 @@ void Tween::stop(Object *p_object, StringName p_key) { // Find the tween that has the given target object and string key pending_update++; for (List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) { - // Get the object the tween is targeting InterpolateData &data = E->get(); Object *object = ObjectDB::get_instance(data.id); - if (object == nullptr) + if (object == nullptr) { continue; + } // Is this the correct object and does it have the given key? - if (object == p_object && (data.concatenated_key == p_key || p_key == "")) + if (object == p_object && (data.concatenated_key == p_key || p_key == "")) { // Disable the tween data.active = false; + } } pending_update--; } @@ -950,12 +965,14 @@ void Tween::resume(Object *p_object, StringName p_key) { // Grab the object InterpolateData &data = E->get(); Object *object = ObjectDB::get_instance(data.id); - if (object == nullptr) + if (object == nullptr) { continue; + } // If the object and string key match, activate it - if (object == p_object && (data.concatenated_key == p_key || p_key == "")) + if (object == p_object && (data.concatenated_key == p_key || p_key == "")) { data.active = true; + } } pending_update--; } @@ -988,8 +1005,9 @@ void Tween::remove(Object *p_object, StringName p_key) { // Get the target object InterpolateData &data = E->get(); Object *object = ObjectDB::get_instance(data.id); - if (object == nullptr) + if (object == nullptr) { continue; + } // If the target object and string key match, queue it for removal if (object == p_object && (data.concatenated_key == p_key || p_key == "")) { @@ -1090,9 +1108,10 @@ real_t Tween::tell() const { for (const List<InterpolateData>::Element *E = interpolates.front(); E; E = E->next()) { // Get the data and figure out if it's position is further along than the previous ones const InterpolateData &data = E->get(); - if (data.elapsed > pos) + if (data.elapsed > pos) { // Save it if so pos = data.elapsed; + } } pending_update--; return pos; @@ -1112,9 +1131,10 @@ real_t Tween::get_runtime() const { // Get the tween data and see if it's runtime is greater than the previous tweens const InterpolateData &data = E->get(); real_t t = data.delay + data.duration; - if (t > runtime) + if (t > runtime) { // This is the longest running tween runtime = t; + } } pending_update--; @@ -1123,7 +1143,6 @@ real_t Tween::get_runtime() const { } bool Tween::_calc_delta_val(const Variant &p_initial_val, const Variant &p_final_val, Variant &p_delta_val) { - // Get the initial, final, and delta values const Variant &initial_val = p_initial_val; const Variant &final_val = p_final_val; @@ -1131,7 +1150,6 @@ bool Tween::_calc_delta_val(const Variant &p_initial_val, const Variant &p_final // What kind of data are we interpolating? switch (initial_val.get_type()) { - case Variant::BOOL: // We'll treat booleans just like integers case Variant::INT: @@ -1263,7 +1281,6 @@ bool Tween::_calc_delta_val(const Variant &p_initial_val, const Variant &p_final } void Tween::_build_interpolation(InterpolateType p_interpolation_type, Object *p_object, NodePath *p_property, StringName *p_method, Variant p_initial_val, Variant p_final_val, real_t p_duration, TransitionType p_trans_type, EaseType p_ease_type, real_t p_delay) { - // TODO: Add initialization+implementation for remaining interpolation types // TODO: Fix this method's organization to take advantage of the type @@ -1322,8 +1339,9 @@ void Tween::_build_interpolation(InterpolateType p_interpolation_type, Object *p } // Is there not a valid delta? - if (!_calc_delta_val(data.initial_val, data.final_val, data.delta_val)) + if (!_calc_delta_val(data.initial_val, data.final_val, data.delta_val)) { return; + } // Add this interpolation to the total _push_interpolate_data(data); @@ -1341,14 +1359,17 @@ void Tween::interpolate_property(Object *p_object, NodePath p_property, Variant // If no initial value given, grab the initial value from the object // TODO: Is this documented? This is very useful and removes a lot of clutter from tweens! - if (p_initial_val.get_type() == Variant::NIL) + if (p_initial_val.get_type() == Variant::NIL) { p_initial_val = p_object->get_indexed(p_property.get_subnames()); + } // Convert any integers into REALs as they are better for interpolation - if (p_initial_val.get_type() == Variant::INT) + if (p_initial_val.get_type() == Variant::INT) { p_initial_val = p_initial_val.operator real_t(); - if (p_final_val.get_type() == Variant::INT) + } + if (p_final_val.get_type() == Variant::INT) { p_final_val = p_final_val.operator real_t(); + } // Build the interpolation data _build_interpolation(INTER_PROPERTY, p_object, &p_property, nullptr, p_initial_val, p_final_val, p_duration, p_trans_type, p_ease_type, p_delay); @@ -1362,10 +1383,12 @@ void Tween::interpolate_method(Object *p_object, StringName p_method, Variant p_ } // Convert any integers into REALs as they are better for interpolation - if (p_initial_val.get_type() == Variant::INT) + if (p_initial_val.get_type() == Variant::INT) { p_initial_val = p_initial_val.operator real_t(); - if (p_final_val.get_type() == Variant::INT) + } + if (p_final_val.get_type() == Variant::INT) { p_final_val = p_final_val.operator real_t(); + } // Build the interpolation data _build_interpolation(INTER_METHOD, p_object, nullptr, &p_method, p_initial_val, p_final_val, p_duration, p_trans_type, p_ease_type, p_delay); @@ -1404,18 +1427,19 @@ void Tween::interpolate_callback(Object *p_object, real_t p_duration, String p_c // Add arguments to the interpolation int args = 0; - if (p_arg5.get_type() != Variant::NIL) + if (p_arg5.get_type() != Variant::NIL) { args = 5; - else if (p_arg4.get_type() != Variant::NIL) + } else if (p_arg4.get_type() != Variant::NIL) { args = 4; - else if (p_arg3.get_type() != Variant::NIL) + } else if (p_arg3.get_type() != Variant::NIL) { args = 3; - else if (p_arg2.get_type() != Variant::NIL) + } else if (p_arg2.get_type() != Variant::NIL) { args = 2; - else if (p_arg1.get_type() != Variant::NIL) + } else if (p_arg1.get_type() != Variant::NIL) { args = 1; - else + } else { args = 0; + } data.args = args; data.arg[0] = p_arg1; @@ -1461,18 +1485,19 @@ void Tween::interpolate_deferred_callback(Object *p_object, real_t p_duration, S // Collect arguments for the callback int args = 0; - if (p_arg5.get_type() != Variant::NIL) + if (p_arg5.get_type() != Variant::NIL) { args = 5; - else if (p_arg4.get_type() != Variant::NIL) + } else if (p_arg4.get_type() != Variant::NIL) { args = 4; - else if (p_arg3.get_type() != Variant::NIL) + } else if (p_arg3.get_type() != Variant::NIL) { args = 3; - else if (p_arg2.get_type() != Variant::NIL) + } else if (p_arg2.get_type() != Variant::NIL) { args = 2; - else if (p_arg1.get_type() != Variant::NIL) + } else if (p_arg1.get_type() != Variant::NIL) { args = 1; - else + } else { args = 0; + } data.args = args; data.arg[0] = p_arg1; @@ -1498,12 +1523,14 @@ void Tween::follow_property(Object *p_object, NodePath p_property, Variant p_ini // If no initial value is given, grab it from the source object // TODO: Is this documented? It's really helpful for decluttering tweens - if (p_initial_val.get_type() == Variant::NIL) + if (p_initial_val.get_type() == Variant::NIL) { p_initial_val = p_object->get_indexed(p_property.get_subnames()); + } // Convert initial INT values to FLOAT as they are better for interpolation - if (p_initial_val.get_type() == Variant::INT) + if (p_initial_val.get_type() == Variant::INT) { p_initial_val = p_initial_val.operator real_t(); + } // Confirm the source and target objects are valid ERR_FAIL_COND(p_object == nullptr); @@ -1529,8 +1556,9 @@ void Tween::follow_property(Object *p_object, NodePath p_property, Variant p_ini ERR_FAIL_COND(!target_prop_valid); // Convert target INT to FLOAT since it is better for interpolation - if (target_val.get_type() == Variant::INT) + if (target_val.get_type() == Variant::INT) { target_val = target_val.operator real_t(); + } // Verify that the target value and initial value are the same type ERR_FAIL_COND(target_val.get_type() != p_initial_val.get_type()); @@ -1565,8 +1593,9 @@ void Tween::follow_method(Object *p_object, StringName p_method, Variant p_initi return; } // Convert initial INT values to FLOAT as they are better for interpolation - if (p_initial_val.get_type() == Variant::INT) + if (p_initial_val.get_type() == Variant::INT) { p_initial_val = p_initial_val.operator real_t(); + } // Verify the source and target objects are valid ERR_FAIL_COND(p_object == nullptr); @@ -1592,8 +1621,9 @@ void Tween::follow_method(Object *p_object, StringName p_method, Variant p_initi ERR_FAIL_COND(error.error != Callable::CallError::CALL_OK); // Convert target INT values to FLOAT as they are better for interpolation - if (target_val.get_type() == Variant::INT) + if (target_val.get_type() == Variant::INT) { target_val = target_val.operator real_t(); + } ERR_FAIL_COND(target_val.get_type() != p_initial_val.get_type()); // Make the new InterpolateData for the method follow @@ -1630,8 +1660,9 @@ void Tween::targeting_property(Object *p_object, NodePath p_property, Object *p_ p_initial_property = p_initial_property.get_as_property_path(); // Convert the initial INT values to FLOAT as they are better for Interpolation - if (p_final_val.get_type() == Variant::INT) + if (p_final_val.get_type() == Variant::INT) { p_final_val = p_final_val.operator real_t(); + } // Verify both objects are valid ERR_FAIL_COND(p_object == nullptr); @@ -1657,8 +1688,9 @@ void Tween::targeting_property(Object *p_object, NodePath p_property, Object *p_ ERR_FAIL_COND(!initial_prop_valid); // Convert the initial INT value to FLOAT as it is better for interpolation - if (initial_val.get_type() == Variant::INT) + if (initial_val.get_type() == Variant::INT) { initial_val = initial_val.operator real_t(); + } ERR_FAIL_COND(initial_val.get_type() != p_final_val.get_type()); // Build the InterpolateData object @@ -1698,8 +1730,9 @@ void Tween::targeting_method(Object *p_object, StringName p_method, Object *p_in } // Convert final INT values to FLOAT as they are better for interpolation - if (p_final_val.get_type() == Variant::INT) + if (p_final_val.get_type() == Variant::INT) { p_final_val = p_final_val.operator real_t(); + } // Make sure the given objects are valid ERR_FAIL_COND(p_object == nullptr); @@ -1725,8 +1758,9 @@ void Tween::targeting_method(Object *p_object, StringName p_method, Object *p_in ERR_FAIL_COND(error.error != Callable::CallError::CALL_OK); // Convert initial INT values to FLOAT as they aer better for interpolation - if (initial_val.get_type() == Variant::INT) + if (initial_val.get_type() == Variant::INT) { initial_val = initial_val.operator real_t(); + } ERR_FAIL_COND(initial_val.get_type() != p_final_val.get_type()); // Build the new InterpolateData object diff --git a/scene/animation/tween.h b/scene/animation/tween.h index f74df50f68..668870c526 100644 --- a/scene/animation/tween.h +++ b/scene/animation/tween.h @@ -34,7 +34,6 @@ #include "scene/main/node.h" class Tween : public Node { - GDCLASS(Tween, Node); public: diff --git a/scene/audio/audio_stream_player.cpp b/scene/audio/audio_stream_player.cpp index f612944a62..48f70e88cb 100644 --- a/scene/audio/audio_stream_player.cpp +++ b/scene/audio/audio_stream_player.cpp @@ -33,7 +33,6 @@ #include "core/engine.h" void AudioStreamPlayer::_mix_to_bus(const AudioFrame *p_frames, int p_amount) { - int bus_index = AudioServer::get_singleton()->thread_find_bus_index(bus); AudioFrame *targets[4] = { nullptr, nullptr, nullptr, nullptr }; @@ -57,8 +56,9 @@ void AudioStreamPlayer::_mix_to_bus(const AudioFrame *p_frames, int p_amount) { } for (int c = 0; c < 4; c++) { - if (!targets[c]) + if (!targets[c]) { break; + } for (int i = 0; i < p_amount; i++) { targets[c][i] += p_frames[i]; } @@ -66,7 +66,6 @@ void AudioStreamPlayer::_mix_to_bus(const AudioFrame *p_frames, int p_amount) { } void AudioStreamPlayer::_mix_internal(bool p_fadeout) { - //get data AudioFrame *buffer = mix_buffer.ptrw(); int buffer_size = mix_buffer.size(); @@ -95,7 +94,6 @@ void AudioStreamPlayer::_mix_internal(bool p_fadeout) { } void AudioStreamPlayer::_mix_audio() { - if (use_fadeout) { _mix_to_bus(fadeout_buffer.ptr(), fadeout_buffer.size()); use_fadeout = false; @@ -122,7 +120,6 @@ void AudioStreamPlayer::_mix_audio() { if (setseek >= 0.0 && !stop_has_priority) { if (stream_playback->is_playing()) { - //fade out to avoid pops _mix_internal(true); } @@ -138,9 +135,7 @@ void AudioStreamPlayer::_mix_audio() { } void AudioStreamPlayer::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { - AudioServer::get_singleton()->add_callback(_mix_audios, this); if (autoplay && !Engine::get_singleton()->is_editor_hint()) { play(); @@ -148,7 +143,6 @@ void AudioStreamPlayer::_notification(int p_what) { } if (p_what == NOTIFICATION_INTERNAL_PROCESS) { - if (!active || (setseek < 0 && !stream_playback->is_playing())) { active = false; set_process_internal(false); @@ -157,7 +151,6 @@ void AudioStreamPlayer::_notification(int p_what) { } if (p_what == NOTIFICATION_EXIT_TREE) { - AudioServer::get_singleton()->remove_callback(_mix_audios, this); } @@ -174,7 +167,6 @@ void AudioStreamPlayer::_notification(int p_what) { } void AudioStreamPlayer::set_stream(Ref<AudioStream> p_stream) { - AudioServer::get_singleton()->lock(); if (active && stream_playback.is_valid() && !stream_paused) { @@ -222,16 +214,14 @@ void AudioStreamPlayer::set_stream(Ref<AudioStream> p_stream) { } Ref<AudioStream> AudioStreamPlayer::get_stream() const { - return stream; } void AudioStreamPlayer::set_volume_db(float p_volume) { - volume_db = p_volume; } -float AudioStreamPlayer::get_volume_db() const { +float AudioStreamPlayer::get_volume_db() const { return volume_db; } @@ -239,12 +229,12 @@ void AudioStreamPlayer::set_pitch_scale(float p_pitch_scale) { ERR_FAIL_COND(p_pitch_scale <= 0.0); pitch_scale = p_pitch_scale; } + float AudioStreamPlayer::get_pitch_scale() const { return pitch_scale; } void AudioStreamPlayer::play(float p_from_pos) { - if (stream_playback.is_valid()) { //mix_volume_db = volume_db; do not reset volume ramp here, can cause clicks setseek = p_from_pos; @@ -255,14 +245,12 @@ void AudioStreamPlayer::play(float p_from_pos) { } void AudioStreamPlayer::seek(float p_seconds) { - if (stream_playback.is_valid()) { setseek = p_seconds; } } void AudioStreamPlayer::stop() { - if (stream_playback.is_valid() && active) { setstop = true; stop_has_priority = true; @@ -270,7 +258,6 @@ void AudioStreamPlayer::stop() { } bool AudioStreamPlayer::is_playing() const { - if (stream_playback.is_valid()) { return active && !setstop; //&& stream_playback->is_playing(); } @@ -279,7 +266,6 @@ bool AudioStreamPlayer::is_playing() const { } float AudioStreamPlayer::get_playback_position() { - if (stream_playback.is_valid()) { return stream_playback->get_playback_position(); } @@ -288,14 +274,13 @@ float AudioStreamPlayer::get_playback_position() { } void AudioStreamPlayer::set_bus(const StringName &p_bus) { - //if audio is active, must lock this AudioServer::get_singleton()->lock(); bus = p_bus; AudioServer::get_singleton()->unlock(); } -StringName AudioStreamPlayer::get_bus() const { +StringName AudioStreamPlayer::get_bus() const { for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { if (AudioServer::get_singleton()->get_bus_name(i) == bus) { return bus; @@ -305,38 +290,34 @@ StringName AudioStreamPlayer::get_bus() const { } void AudioStreamPlayer::set_autoplay(bool p_enable) { - autoplay = p_enable; } -bool AudioStreamPlayer::is_autoplay_enabled() { +bool AudioStreamPlayer::is_autoplay_enabled() { return autoplay; } void AudioStreamPlayer::set_mix_target(MixTarget p_target) { - mix_target = p_target; } AudioStreamPlayer::MixTarget AudioStreamPlayer::get_mix_target() const { - return mix_target; } void AudioStreamPlayer::_set_playing(bool p_enable) { - - if (p_enable) + if (p_enable) { play(); - else + } else { stop(); + } } -bool AudioStreamPlayer::_is_active() const { +bool AudioStreamPlayer::_is_active() const { return active; } void AudioStreamPlayer::set_stream_paused(bool p_pause) { - if (p_pause != stream_paused) { stream_paused = p_pause; stream_paused_fade = p_pause; @@ -344,18 +325,16 @@ void AudioStreamPlayer::set_stream_paused(bool p_pause) { } bool AudioStreamPlayer::get_stream_paused() const { - return stream_paused; } void AudioStreamPlayer::_validate_property(PropertyInfo &property) const { - if (property.name == "bus") { - String options; for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { - if (i > 0) + if (i > 0) { options += ","; + } String name = AudioServer::get_singleton()->get_bus_name(i); options += name; } @@ -365,7 +344,6 @@ void AudioStreamPlayer::_validate_property(PropertyInfo &property) const { } void AudioStreamPlayer::_bus_layout_changed() { - _change_notify(); } @@ -374,7 +352,6 @@ Ref<AudioStreamPlayback> AudioStreamPlayer::get_stream_playback() { } void AudioStreamPlayer::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_stream", "stream"), &AudioStreamPlayer::set_stream); ClassDB::bind_method(D_METHOD("get_stream"), &AudioStreamPlayer::get_stream); @@ -425,7 +402,6 @@ void AudioStreamPlayer::_bind_methods() { } AudioStreamPlayer::AudioStreamPlayer() { - mix_volume_db = 0; pitch_scale = 1.0; volume_db = 0; diff --git a/scene/audio/audio_stream_player.h b/scene/audio/audio_stream_player.h index 0f6d855d0e..6769f1bb48 100644 --- a/scene/audio/audio_stream_player.h +++ b/scene/audio/audio_stream_player.h @@ -35,7 +35,6 @@ #include "servers/audio/audio_stream.h" class AudioStreamPlayer : public Node { - GDCLASS(AudioStreamPlayer, Node); public: diff --git a/scene/debugger/scene_debugger.cpp b/scene/debugger/scene_debugger.cpp index 8cb63c4ab5..0222585948 100644 --- a/scene/debugger/scene_debugger.cpp +++ b/scene/debugger/scene_debugger.cpp @@ -48,8 +48,9 @@ void SceneDebugger::deinitialize() { #ifdef DEBUG_ENABLED if (LiveEditor::singleton) { // Should be removed automatically when deiniting debugger, but just in case - if (EngineDebugger::has_capture("scene")) + if (EngineDebugger::has_capture("scene")) { EngineDebugger::unregister_message_capture("scene"); + } memdelete(LiveEditor::singleton); LiveEditor::singleton = nullptr; } @@ -59,11 +60,13 @@ void SceneDebugger::deinitialize() { #ifdef DEBUG_ENABLED Error SceneDebugger::parse_message(void *p_user, const String &p_msg, const Array &p_args, bool &r_captured) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return ERR_UNCONFIGURED; + } LiveEditor *live_editor = LiveEditor::get_singleton(); - if (!live_editor) + if (!live_editor) { return ERR_UNCONFIGURED; + } r_captured = true; if (p_msg == "request_scene_tree") { // Scene tree @@ -193,8 +196,9 @@ void SceneDebugger::_save_node(ObjectID id, const String &p_path) { void SceneDebugger::_send_object_id(ObjectID p_id, int p_max_size) { SceneDebuggerObject obj(p_id); - if (obj.id.is_null()) + if (obj.id.is_null()) { return; + } Array arr; obj.serialize(arr); @@ -202,10 +206,10 @@ void SceneDebugger::_send_object_id(ObjectID p_id, int p_max_size) { } void SceneDebugger::_set_object_property(ObjectID p_id, const String &p_property, const Variant &p_value) { - Object *obj = ObjectDB::get_instance(p_id); - if (!obj) + if (!obj) { return; + } String prop_name = p_property; if (p_property.begins_with("Members/")) { @@ -218,17 +222,20 @@ void SceneDebugger::_set_object_property(ObjectID p_id, const String &p_property void SceneDebugger::add_to_cache(const String &p_filename, Node *p_node) { LiveEditor *debugger = LiveEditor::get_singleton(); - if (!debugger) + if (!debugger) { return; + } if (EngineDebugger::get_script_debugger() && p_filename != String()) { debugger->live_scene_edit_cache[p_filename].insert(p_node); } } + void SceneDebugger::remove_from_cache(const String &p_filename, Node *p_node) { LiveEditor *debugger = LiveEditor::get_singleton(); - if (!debugger) + if (!debugger) { return; + } Map<String, Set<Node *>> &edit_cache = debugger->live_scene_edit_cache; Map<String, Set<Node *>>::Element *E = edit_cache.find(p_filename); @@ -243,7 +250,6 @@ void SceneDebugger::remove_from_cache(const String &p_filename, Node *p_node) { Map<Node *, Map<ObjectID, Node *>>::Element *F = remove_list.find(p_node); if (F) { for (Map<ObjectID, Node *>::Element *G = F->get().front(); G; G = G->next()) { - memdelete(G->get()); } remove_list.erase(F); @@ -254,8 +260,9 @@ void SceneDebugger::remove_from_cache(const String &p_filename, Node *p_node) { SceneDebuggerObject::SceneDebuggerObject(ObjectID p_id) { id = ObjectID(); Object *obj = ObjectDB::get_instance(p_id); - if (!obj) + if (!obj) { return; + } id = p_id; class_name = obj->get_class(); @@ -403,7 +410,6 @@ void SceneDebuggerObject::deserialize(const Array &p_arr) { Array props = p_arr[2]; for (int i = 0; i < props.size(); i++) { - CHECK_TYPE(props[i], ARRAY); Array prop = props[i]; @@ -485,8 +491,9 @@ LiveEditor *LiveEditor::get_singleton() { void LiveEditor::_send_tree() { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Array arr; // Encoded as a flat list depth fist. @@ -496,42 +503,44 @@ void LiveEditor::_send_tree() { } void LiveEditor::_node_path_func(const NodePath &p_path, int p_id) { - live_edit_node_path_cache[p_id] = p_path; } void LiveEditor::_res_path_func(const String &p_path, int p_id) { - live_edit_resource_cache[p_id] = p_path; } void LiveEditor::_node_set_func(int p_id, const StringName &p_prop, const Variant &p_value) { - SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } - if (!live_edit_node_path_cache.has(p_id)) + if (!live_edit_node_path_cache.has(p_id)) { return; + } NodePath np = live_edit_node_path_cache[p_id]; Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(np)) + if (!n->has_node(np)) { continue; + } Node *n2 = n->get_node(np); n2->set(p_prop, p_value); @@ -539,110 +548,126 @@ void LiveEditor::_node_set_func(int p_id, const StringName &p_prop, const Varian } void LiveEditor::_node_set_res_func(int p_id, const StringName &p_prop, const String &p_value) { - RES r = ResourceLoader::load(p_value); - if (!r.is_valid()) + if (!r.is_valid()) { return; + } _node_set_func(p_id, p_prop, r); } + void LiveEditor::_node_call_func(int p_id, const StringName &p_method, VARIANT_ARG_DECLARE) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; - if (!live_edit_node_path_cache.has(p_id)) + } + if (!live_edit_node_path_cache.has(p_id)) { return; + } NodePath np = live_edit_node_path_cache[p_id]; Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(np)) + if (!n->has_node(np)) { continue; + } Node *n2 = n->get_node(np); n2->call(p_method, VARIANT_ARG_PASS); } } -void LiveEditor::_res_set_func(int p_id, const StringName &p_prop, const Variant &p_value) { - if (!live_edit_resource_cache.has(p_id)) +void LiveEditor::_res_set_func(int p_id, const StringName &p_prop, const Variant &p_value) { + if (!live_edit_resource_cache.has(p_id)) { return; + } String resp = live_edit_resource_cache[p_id]; - if (!ResourceCache::has(resp)) + if (!ResourceCache::has(resp)) { return; + } RES r = ResourceCache::get(resp); - if (!r.is_valid()) + if (!r.is_valid()) { return; + } r->set(p_prop, p_value); } -void LiveEditor::_res_set_res_func(int p_id, const StringName &p_prop, const String &p_value) { +void LiveEditor::_res_set_res_func(int p_id, const StringName &p_prop, const String &p_value) { RES r = ResourceLoader::load(p_value); - if (!r.is_valid()) + if (!r.is_valid()) { return; + } _res_set_func(p_id, p_prop, r); } -void LiveEditor::_res_call_func(int p_id, const StringName &p_method, VARIANT_ARG_DECLARE) { - if (!live_edit_resource_cache.has(p_id)) +void LiveEditor::_res_call_func(int p_id, const StringName &p_method, VARIANT_ARG_DECLARE) { + if (!live_edit_resource_cache.has(p_id)) { return; + } String resp = live_edit_resource_cache[p_id]; - if (!ResourceCache::has(resp)) + if (!ResourceCache::has(resp)) { return; + } RES r = ResourceCache::get(resp); - if (!r.is_valid()) + if (!r.is_valid()) { return; + } r->call(p_method, VARIANT_ARG_PASS); } void LiveEditor::_root_func(const NodePath &p_scene_path, const String &p_scene_from) { - live_edit_root = p_scene_path; live_edit_scene = p_scene_from; } void LiveEditor::_create_node_func(const NodePath &p_parent, const String &p_type, const String &p_name) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_parent)) + if (!n->has_node(p_parent)) { continue; + } Node *n2 = n->get_node(p_parent); Node *no = Object::cast_to<Node>(ClassDB::instance(p_type)); @@ -654,33 +679,39 @@ void LiveEditor::_create_node_func(const NodePath &p_parent, const String &p_typ n2->add_child(no); } } + void LiveEditor::_instance_node_func(const NodePath &p_parent, const String &p_path, const String &p_name) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Ref<PackedScene> ps = ResourceLoader::load(p_path); - if (!ps.is_valid()) + if (!ps.is_valid()) { return; + } Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_parent)) + if (!n->has_node(p_parent)) { continue; + } Node *n2 = n->get_node(p_parent); Node *no = ps->instance(); @@ -692,30 +723,35 @@ void LiveEditor::_instance_node_func(const NodePath &p_parent, const String &p_p n2->add_child(no); } } + void LiveEditor::_remove_node_func(const NodePath &p_at) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F;) { - Set<Node *>::Element *N = F->next(); Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *n2 = n->get_node(p_at); memdelete(n2); @@ -723,30 +759,35 @@ void LiveEditor::_remove_node_func(const NodePath &p_at) { F = N; } } + void LiveEditor::_remove_and_keep_node_func(const NodePath &p_at, ObjectID p_keep_id) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F;) { - Set<Node *>::Element *N = F->next(); Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *n2 = n->get_node(p_at); @@ -757,41 +798,48 @@ void LiveEditor::_remove_and_keep_node_func(const NodePath &p_at, ObjectID p_kee F = N; } } + void LiveEditor::_restore_node_func(ObjectID p_id, const NodePath &p_at, int p_at_pos) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F;) { - Set<Node *>::Element *N = F->next(); Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *n2 = n->get_node(p_at); Map<Node *, Map<ObjectID, Node *>>::Element *EN = live_edit_remove_list.find(n); - if (!EN) + if (!EN) { continue; + } Map<ObjectID, Node *>::Element *FN = EN->get().find(p_id); - if (!FN) + if (!FN) { continue; + } n2->add_child(FN->get()); EN->get().erase(FN); @@ -803,73 +851,86 @@ void LiveEditor::_restore_node_func(ObjectID p_id, const NodePath &p_at, int p_a F = N; } } + void LiveEditor::_duplicate_node_func(const NodePath &p_at, const String &p_new_name) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *n2 = n->get_node(p_at); Node *dup = n2->duplicate(Node::DUPLICATE_SIGNALS | Node::DUPLICATE_GROUPS | Node::DUPLICATE_SCRIPTS); - if (!dup) + if (!dup) { continue; + } dup->set_name(p_new_name); n2->get_parent()->add_child(dup); } } + void LiveEditor::_reparent_node_func(const NodePath &p_at, const NodePath &p_new_place, const String &p_new_name, int p_at_pos) { SceneTree *scene_tree = SceneTree::get_singleton(); - if (!scene_tree) + if (!scene_tree) { return; + } Node *base = nullptr; - if (scene_tree->root->has_node(live_edit_root)) + if (scene_tree->root->has_node(live_edit_root)) { base = scene_tree->root->get_node(live_edit_root); + } Map<String, Set<Node *>>::Element *E = live_scene_edit_cache.find(live_edit_scene); - if (!E) + if (!E) { return; //scene not editable + } for (Set<Node *>::Element *F = E->get().front(); F; F = F->next()) { - Node *n = F->get(); - if (base && !base->is_a_parent_of(n)) + if (base && !base->is_a_parent_of(n)) { continue; + } - if (!n->has_node(p_at)) + if (!n->has_node(p_at)) { continue; + } Node *nfrom = n->get_node(p_at); - if (!n->has_node(p_new_place)) + if (!n->has_node(p_new_place)) { continue; + } Node *nto = n->get_node(p_new_place); nfrom->get_parent()->remove_child(nfrom); nfrom->set_name(p_new_name); nto->add_child(nfrom); - if (p_at_pos >= 0) + if (p_at_pos >= 0) { nto->move_child(nfrom, p_at_pos); + } } } diff --git a/scene/debugger/scene_debugger.h b/scene/debugger/scene_debugger.h index e8521d6a20..a2bafde039 100644 --- a/scene/debugger/scene_debugger.h +++ b/scene/debugger/scene_debugger.h @@ -39,7 +39,6 @@ class Script; class SceneDebugger { - public: static void initialize(); static void deinitialize(); @@ -59,7 +58,6 @@ public: #ifdef DEBUG_ENABLED class SceneDebuggerObject { - private: void _parse_script_properties(Script *p_script, ScriptInstance *p_instance); @@ -77,7 +75,6 @@ public: }; class SceneDebuggerTree { - public: struct RemoteNode { int child_count; @@ -104,7 +101,6 @@ public: }; class LiveEditor { - private: friend class SceneDebugger; Map<int, NodePath> live_edit_node_path_cache; diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index 1cdc6f8057..d8229b5f43 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -35,26 +35,27 @@ #include "scene/scene_string_names.h" void BaseButton::_unpress_group() { - - if (!button_group.is_valid()) + if (!button_group.is_valid()) { return; + } if (toggle_mode) { status.pressed = true; } for (Set<BaseButton *>::Element *E = button_group->buttons.front(); E; E = E->next()) { - if (E->get() == this) + if (E->get() == this) { continue; + } E->get()->set_pressed(false); } } void BaseButton::_gui_input(Ref<InputEvent> p_event) { - - if (status.disabled) // no interaction with disabled button + if (status.disabled) { // no interaction with disabled button return; + } Ref<InputEventMouseButton> mouse_button = p_event; bool ui_accept = p_event->is_action("ui_accept") && !p_event->is_echo(); @@ -78,9 +79,7 @@ void BaseButton::_gui_input(Ref<InputEvent> p_event) { } void BaseButton::_notification(int p_what) { - if (p_what == NOTIFICATION_MOUSE_ENTER) { - status.hovering = true; update(); } @@ -90,7 +89,6 @@ void BaseButton::_notification(int p_what) { update(); } if (p_what == NOTIFICATION_DRAG_BEGIN || p_what == NOTIFICATION_SCROLL_BEGIN) { - if (status.press_attempt) { status.press_attempt = false; update(); @@ -98,13 +96,11 @@ void BaseButton::_notification(int p_what) { } if (p_what == NOTIFICATION_FOCUS_ENTER) { - status.hovering = true; update(); } if (p_what == NOTIFICATION_FOCUS_EXIT) { - if (status.press_attempt) { status.press_attempt = false; status.hovering = false; @@ -116,7 +112,6 @@ void BaseButton::_notification(int p_what) { } if (p_what == NOTIFICATION_EXIT_TREE || (p_what == NOTIFICATION_VISIBILITY_CHANGED && !is_visible_in_tree())) { - if (!toggle_mode) { status.pressed = false; } @@ -127,7 +122,6 @@ void BaseButton::_notification(int p_what) { } void BaseButton::_pressed() { - if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_pressed); } @@ -136,7 +130,6 @@ void BaseButton::_pressed() { } void BaseButton::_toggled(bool p_pressed) { - if (get_script_instance()) { get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, p_pressed); } @@ -145,7 +138,6 @@ void BaseButton::_toggled(bool p_pressed) { } void BaseButton::on_action_event(Ref<InputEvent> p_event) { - if (p_event->is_pressed()) { status.press_attempt = true; status.pressing_inside = true; @@ -194,8 +186,9 @@ void BaseButton::toggled(bool p_pressed) { } void BaseButton::set_disabled(bool p_disabled) { - if (status.disabled == p_disabled) + if (status.disabled == p_disabled) { return; + } status.disabled = p_disabled; if (p_disabled) { @@ -210,16 +203,16 @@ void BaseButton::set_disabled(bool p_disabled) { } bool BaseButton::is_disabled() const { - return status.disabled; } void BaseButton::set_pressed(bool p_pressed) { - - if (!toggle_mode) + if (!toggle_mode) { return; - if (status.pressed == p_pressed) + } + if (status.pressed == p_pressed) { return; + } _change_notify("pressed"); status.pressed = p_pressed; @@ -232,29 +225,26 @@ void BaseButton::set_pressed(bool p_pressed) { } bool BaseButton::is_pressing() const { - return status.press_attempt; } bool BaseButton::is_pressed() const { - return toggle_mode ? status.pressed : status.press_attempt; } bool BaseButton::is_hovered() const { - return status.hovering; } BaseButton::DrawMode BaseButton::get_draw_mode() const { - if (status.disabled) { return DRAW_DISABLED; }; if (!status.press_attempt && status.hovering) { - if (status.pressed) + if (status.pressed) { return DRAW_HOVER_PRESSED; + } return DRAW_HOVER; } else { @@ -262,66 +252,57 @@ BaseButton::DrawMode BaseButton::get_draw_mode() const { bool pressing; if (status.press_attempt) { - pressing = (status.pressing_inside || keep_pressed_outside); - if (status.pressed) + if (status.pressed) { pressing = !pressing; + } } else { - pressing = status.pressed; } - if (pressing) + if (pressing) { return DRAW_PRESSED; - else + } else { return DRAW_NORMAL; + } } return DRAW_NORMAL; } void BaseButton::set_toggle_mode(bool p_on) { - toggle_mode = p_on; } bool BaseButton::is_toggle_mode() const { - return toggle_mode; } void BaseButton::set_shortcut_in_tooltip(bool p_on) { - shortcut_in_tooltip = p_on; } bool BaseButton::is_shortcut_in_tooltip_enabled() const { - return shortcut_in_tooltip; } void BaseButton::set_action_mode(ActionMode p_mode) { - action_mode = p_mode; } BaseButton::ActionMode BaseButton::get_action_mode() const { - return action_mode; } void BaseButton::set_button_mask(int p_mask) { - button_mask = p_mask; } int BaseButton::get_button_mask() const { - return button_mask; } void BaseButton::set_enabled_focus_mode(FocusMode p_mode) { - enabled_focus_mode = p_mode; if (!status.disabled) { set_focus_mode(p_mode); @@ -329,22 +310,18 @@ void BaseButton::set_enabled_focus_mode(FocusMode p_mode) { } Control::FocusMode BaseButton::get_enabled_focus_mode() const { - return enabled_focus_mode; } void BaseButton::set_keep_pressed_outside(bool p_on) { - keep_pressed_outside = p_on; } bool BaseButton::is_keep_pressed_outside() const { - return keep_pressed_outside; } void BaseButton::set_shortcut(const Ref<ShortCut> &p_shortcut) { - shortcut = p_shortcut; set_process_unhandled_input(shortcut.is_valid()); } @@ -354,15 +331,12 @@ Ref<ShortCut> BaseButton::get_shortcut() const { } void BaseButton::_unhandled_input(Ref<InputEvent> p_event) { - if (!is_disabled() && is_visible_in_tree() && !p_event->is_echo() && shortcut.is_valid() && shortcut->is_shortcut(p_event)) { - on_action_event(p_event); } } String BaseButton::get_tooltip(const Point2 &p_pos) const { - String tooltip = Control::get_tooltip(p_pos); if (shortcut_in_tooltip && shortcut.is_valid() && shortcut->is_valid()) { String text = shortcut->get_name() + " (" + shortcut->get_as_text() + ")"; @@ -375,7 +349,6 @@ String BaseButton::get_tooltip(const Point2 &p_pos) const { } void BaseButton::set_button_group(const Ref<ButtonGroup> &p_group) { - if (button_group.is_valid()) { button_group->buttons.erase(this); } @@ -390,12 +363,10 @@ void BaseButton::set_button_group(const Ref<ButtonGroup> &p_group) { } Ref<ButtonGroup> BaseButton::get_button_group() const { - return button_group; } void BaseButton::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &BaseButton::_gui_input); ClassDB::bind_method(D_METHOD("_unhandled_input"), &BaseButton::_unhandled_input); ClassDB::bind_method(D_METHOD("set_pressed", "pressed"), &BaseButton::set_pressed); @@ -452,7 +423,6 @@ void BaseButton::_bind_methods() { } BaseButton::BaseButton() { - toggle_mode = false; shortcut_in_tooltip = true; keep_pressed_outside = false; @@ -468,21 +438,18 @@ BaseButton::BaseButton() { } BaseButton::~BaseButton() { - if (button_group.is_valid()) { button_group->buttons.erase(this); } } void ButtonGroup::get_buttons(List<BaseButton *> *r_buttons) { - for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) { r_buttons->push_back(E->get()); } } Array ButtonGroup::_get_buttons() { - Array btns; for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) { btns.push_back(E->get()); @@ -492,22 +459,20 @@ Array ButtonGroup::_get_buttons() { } BaseButton *ButtonGroup::get_pressed_button() { - for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) { - if (E->get()->is_pressed()) + if (E->get()->is_pressed()) { return E->get(); + } } return nullptr; } void ButtonGroup::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_pressed_button"), &ButtonGroup::get_pressed_button); ClassDB::bind_method(D_METHOD("get_buttons"), &ButtonGroup::_get_buttons); } ButtonGroup::ButtonGroup() { - set_local_to_scene(true); } diff --git a/scene/gui/base_button.h b/scene/gui/base_button.h index 21757488a6..05a975e266 100644 --- a/scene/gui/base_button.h +++ b/scene/gui/base_button.h @@ -36,7 +36,6 @@ class ButtonGroup; class BaseButton : public Control { - GDCLASS(BaseButton, Control); public: @@ -55,7 +54,6 @@ private: ActionMode action_mode; struct Status { - bool pressed; bool hovering; bool press_attempt; @@ -136,7 +134,6 @@ VARIANT_ENUM_CAST(BaseButton::DrawMode) VARIANT_ENUM_CAST(BaseButton::ActionMode) class ButtonGroup : public Resource { - GDCLASS(ButtonGroup, Resource); friend class BaseButton; Set<BaseButton *> buttons; diff --git a/scene/gui/box_container.cpp b/scene/gui/box_container.cpp index 0da6e0fdfa..75d04dba61 100644 --- a/scene/gui/box_container.cpp +++ b/scene/gui/box_container.cpp @@ -33,14 +33,12 @@ #include "margin_container.h" struct _MinSizeCache { - int min_size; bool will_stretch; int final_size; }; void BoxContainer::_resort() { - /** First pass, determine minimum size AND amount of stretchable elements */ Size2i new_size = get_size(); @@ -56,10 +54,12 @@ void BoxContainer::_resort() { for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible_in_tree()) + if (!c || !c->is_visible_in_tree()) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } Size2i size = c->get_combined_minimum_size(); _MinSizeCache msc; @@ -84,8 +84,9 @@ void BoxContainer::_resort() { children_count++; } - if (children_count == 0) + if (children_count == 0) { return; + } int stretch_max = (vertical ? new_size.height : new_size.width) - (children_count - 1) * sep; int stretch_diff = stretch_max - stretch_min; @@ -105,12 +106,13 @@ void BoxContainer::_resort() { bool refit_successful = true; //assume refit-test will go well for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible_in_tree()) + if (!c || !c->is_visible_in_tree()) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } ERR_FAIL_COND(!min_size_cache.has(c)); _MinSizeCache &msc = min_size_cache[c]; @@ -134,8 +136,9 @@ void BoxContainer::_resort() { } } - if (refit_successful) //uf refit went well, break + if (refit_successful) { //uf refit went well, break break; + } } /** Final pass, draw and stretch elements **/ @@ -158,19 +161,21 @@ void BoxContainer::_resort() { int idx = 0; for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible_in_tree()) + if (!c || !c->is_visible_in_tree()) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } _MinSizeCache &msc = min_size_cache[c]; - if (first) + if (first) { first = false; - else + } else { ofs += sep; + } int from = ofs; int to = ofs + msc.final_size; @@ -187,10 +192,8 @@ void BoxContainer::_resort() { Rect2 rect; if (vertical) { - rect = Rect2(0, from, new_size.width, size); } else { - rect = Rect2(from, 0, size, new_size.height); } @@ -202,7 +205,6 @@ void BoxContainer::_resort() { } Size2 BoxContainer::get_minimum_size() const { - /* Calculate MINIMUM SIZE */ Size2i minimum; @@ -212,10 +214,12 @@ Size2 BoxContainer::get_minimum_size() const { for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } if (!c->is_visible()) { continue; @@ -247,15 +251,11 @@ Size2 BoxContainer::get_minimum_size() const { } void BoxContainer::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_SORT_CHILDREN: { - _resort(); } break; case NOTIFICATION_THEME_CHANGED: { - minimum_size_changed(); } break; } @@ -271,28 +271,27 @@ BoxContainer::AlignMode BoxContainer::get_alignment() const { } void BoxContainer::add_spacer(bool p_begin) { - Control *c = memnew(Control); c->set_mouse_filter(MOUSE_FILTER_PASS); //allow spacer to pass mouse events - if (vertical) + if (vertical) { c->set_v_size_flags(SIZE_EXPAND_FILL); - else + } else { c->set_h_size_flags(SIZE_EXPAND_FILL); + } add_child(c); - if (p_begin) + if (p_begin) { move_child(c, 0); + } } BoxContainer::BoxContainer(bool p_vertical) { - vertical = p_vertical; align = ALIGN_BEGIN; } void BoxContainer::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_spacer", "begin"), &BoxContainer::add_spacer); ClassDB::bind_method(D_METHOD("get_alignment"), &BoxContainer::get_alignment); ClassDB::bind_method(D_METHOD("set_alignment", "alignment"), &BoxContainer::set_alignment); @@ -305,7 +304,6 @@ void BoxContainer::_bind_methods() { } MarginContainer *VBoxContainer::add_margin_child(const String &p_label, Control *p_control, bool p_expand) { - Label *l = memnew(Label); l->set_text(p_label); add_child(l); @@ -313,8 +311,9 @@ MarginContainer *VBoxContainer::add_margin_child(const String &p_label, Control mc->add_theme_constant_override("margin_left", 0); mc->add_child(p_control); add_child(mc); - if (p_expand) + if (p_expand) { mc->set_v_size_flags(SIZE_EXPAND_FILL); + } return mc; } diff --git a/scene/gui/box_container.h b/scene/gui/box_container.h index 0d7deda364..cc6f6349df 100644 --- a/scene/gui/box_container.h +++ b/scene/gui/box_container.h @@ -34,7 +34,6 @@ #include "scene/gui/container.h" class BoxContainer : public Container { - GDCLASS(BoxContainer, Container); public: @@ -67,7 +66,6 @@ public: }; class HBoxContainer : public BoxContainer { - GDCLASS(HBoxContainer, BoxContainer); public: @@ -77,7 +75,6 @@ public: class MarginContainer; class VBoxContainer : public BoxContainer { - GDCLASS(VBoxContainer, BoxContainer); public: diff --git a/scene/gui/button.cpp b/scene/gui/button.cpp index 1f8487c173..e400801b66 100644 --- a/scene/gui/button.cpp +++ b/scene/gui/button.cpp @@ -34,24 +34,25 @@ #include "servers/rendering_server.h" Size2 Button::get_minimum_size() const { - Size2 minsize = get_theme_font("font")->get_string_size(xl_text); - if (clip_text) + if (clip_text) { minsize.width = 0; + } if (!expand_icon) { Ref<Texture2D> _icon; - if (icon.is_null() && has_theme_icon("icon")) + if (icon.is_null() && has_theme_icon("icon")) { _icon = Control::get_theme_icon("icon"); - else + } else { _icon = icon; + } if (!_icon.is_null()) { - minsize.height = MAX(minsize.height, _icon->get_height()); minsize.width += _icon->get_width(); - if (xl_text != "") + if (xl_text != "") { minsize.width += get_theme_constant("hseparation"); + } } } @@ -59,21 +60,17 @@ Size2 Button::get_minimum_size() const { } void Button::_set_internal_margin(Margin p_margin, float p_value) { - _internal_margin[p_margin] = p_value; } void Button::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_TRANSLATION_CHANGED: { - xl_text = tr(text); minimum_size_changed(); update(); } break; case NOTIFICATION_DRAW: { - RID ci = get_canvas_item(); Size2 size = get_size(); Color color; @@ -83,82 +80,88 @@ void Button::_notification(int p_what) { switch (get_draw_mode()) { case DRAW_NORMAL: { - style = get_theme_stylebox("normal"); - if (!flat) + if (!flat) { style->draw(ci, Rect2(Point2(0, 0), size)); + } color = get_theme_color("font_color"); - if (has_theme_color("icon_color_normal")) + if (has_theme_color("icon_color_normal")) { color_icon = get_theme_color("icon_color_normal"); + } } break; case DRAW_HOVER_PRESSED: { - if (has_theme_stylebox("hover_pressed") && has_theme_stylebox_override("hover_pressed")) { style = get_theme_stylebox("hover_pressed"); - if (!flat) + if (!flat) { style->draw(ci, Rect2(Point2(0, 0), size)); - if (has_theme_color("font_color_hover_pressed")) + } + if (has_theme_color("font_color_hover_pressed")) { color = get_theme_color("font_color_hover_pressed"); - else + } else { color = get_theme_color("font_color"); - if (has_theme_color("icon_color_hover_pressed")) + } + if (has_theme_color("icon_color_hover_pressed")) { color_icon = get_theme_color("icon_color_hover_pressed"); + } break; } [[fallthrough]]; } case DRAW_PRESSED: { - style = get_theme_stylebox("pressed"); - if (!flat) + if (!flat) { style->draw(ci, Rect2(Point2(0, 0), size)); - if (has_theme_color("font_color_pressed")) + } + if (has_theme_color("font_color_pressed")) { color = get_theme_color("font_color_pressed"); - else + } else { color = get_theme_color("font_color"); - if (has_theme_color("icon_color_pressed")) + } + if (has_theme_color("icon_color_pressed")) { color_icon = get_theme_color("icon_color_pressed"); + } } break; case DRAW_HOVER: { - style = get_theme_stylebox("hover"); - if (!flat) + if (!flat) { style->draw(ci, Rect2(Point2(0, 0), size)); + } color = get_theme_color("font_color_hover"); - if (has_theme_color("icon_color_hover")) + if (has_theme_color("icon_color_hover")) { color_icon = get_theme_color("icon_color_hover"); + } } break; case DRAW_DISABLED: { - style = get_theme_stylebox("disabled"); - if (!flat) + if (!flat) { style->draw(ci, Rect2(Point2(0, 0), size)); + } color = get_theme_color("font_color_disabled"); - if (has_theme_color("icon_color_disabled")) + if (has_theme_color("icon_color_disabled")) { color_icon = get_theme_color("icon_color_disabled"); + } } break; } if (has_focus()) { - Ref<StyleBox> style2 = get_theme_stylebox("focus"); style2->draw(ci, Rect2(Point2(), size)); } Ref<Font> font = get_theme_font("font"); Ref<Texture2D> _icon; - if (icon.is_null() && has_theme_icon("icon")) + if (icon.is_null() && has_theme_icon("icon")) { _icon = Control::get_theme_icon("icon"); - else + } else { _icon = icon; + } Rect2 icon_region = Rect2(); if (!_icon.is_null()) { - int valign = size.height - style->get_minimum_size().y; if (is_disabled()) { color_icon.a = 0.4; @@ -172,8 +175,9 @@ void Button::_notification(int p_what) { if (expand_icon) { Size2 _size = get_size() - style->get_offset() * 2; _size.width -= get_theme_constant("hseparation") + icon_ofs_region; - if (!clip_text) + if (!clip_text) { _size.width -= get_theme_font("font")->get_string_size(xl_text).width; + } float icon_width = _icon->get_width() * _size.height / _icon->get_height(); float icon_height = _size.height; @@ -209,8 +213,9 @@ void Button::_notification(int p_what) { text_ofs.y += style->get_offset().y; } break; case ALIGN_CENTER: { - if (text_ofs.x < 0) + if (text_ofs.x < 0) { text_ofs.x = 0; + } text_ofs += icon_ofs; text_ofs += style->get_offset(); } break; @@ -235,24 +240,24 @@ void Button::_notification(int p_what) { } void Button::set_text(const String &p_text) { - - if (text == p_text) + if (text == p_text) { return; + } text = p_text; xl_text = tr(p_text); update(); _change_notify("text"); minimum_size_changed(); } -String Button::get_text() const { +String Button::get_text() const { return text; } void Button::set_icon(const Ref<Texture2D> &p_icon) { - - if (icon == p_icon) + if (icon == p_icon) { return; + } icon = p_icon; update(); _change_notify("icon"); @@ -260,59 +265,49 @@ void Button::set_icon(const Ref<Texture2D> &p_icon) { } Ref<Texture2D> Button::get_icon() const { - return icon; } void Button::set_expand_icon(bool p_expand_icon) { - expand_icon = p_expand_icon; update(); minimum_size_changed(); } bool Button::is_expand_icon() const { - return expand_icon; } void Button::set_flat(bool p_flat) { - flat = p_flat; update(); _change_notify("flat"); } bool Button::is_flat() const { - return flat; } void Button::set_clip_text(bool p_clip_text) { - clip_text = p_clip_text; update(); minimum_size_changed(); } bool Button::get_clip_text() const { - return clip_text; } void Button::set_text_align(TextAlign p_align) { - align = p_align; update(); } Button::TextAlign Button::get_text_align() const { - return align; } void Button::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_text", "text"), &Button::set_text); ClassDB::bind_method(D_METHOD("get_text"), &Button::get_text); ClassDB::bind_method(D_METHOD("set_button_icon", "texture"), &Button::set_icon); @@ -339,7 +334,6 @@ void Button::_bind_methods() { } Button::Button(const String &p_text) { - flat = false; clip_text = false; expand_icon = false; diff --git a/scene/gui/button.h b/scene/gui/button.h index 3135b98578..e757badd3e 100644 --- a/scene/gui/button.h +++ b/scene/gui/button.h @@ -34,7 +34,6 @@ #include "scene/gui/base_button.h" class Button : public BaseButton { - GDCLASS(Button, BaseButton); public: diff --git a/scene/gui/center_container.cpp b/scene/gui/center_container.cpp index 64d6885bc8..f8f9bec3d7 100644 --- a/scene/gui/center_container.cpp +++ b/scene/gui/center_container.cpp @@ -31,19 +31,21 @@ #include "center_container.h" Size2 CenterContainer::get_minimum_size() const { - - if (use_top_left) + if (use_top_left) { return Size2(); + } Size2 ms; for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; - if (!c->is_visible()) + } + if (!c->is_visible()) { continue; + } Size2 minsize = c->get_combined_minimum_size(); ms.width = MAX(ms.width, minsize.width); ms.height = MAX(ms.height, minsize.height); @@ -53,7 +55,6 @@ Size2 CenterContainer::get_minimum_size() const { } void CenterContainer::set_use_top_left(bool p_enable) { - if (use_top_left == p_enable) { return; } @@ -65,22 +66,20 @@ void CenterContainer::set_use_top_left(bool p_enable) { } bool CenterContainer::is_using_top_left() const { - return use_top_left; } void CenterContainer::_notification(int p_what) { - if (p_what == NOTIFICATION_SORT_CHILDREN) { - Size2 size = get_size(); for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } Size2 minsize = c->get_combined_minimum_size(); Point2 ofs = use_top_left ? (-minsize * 0.5).floor() : ((size - minsize) / 2.0).floor(); @@ -90,7 +89,6 @@ void CenterContainer::_notification(int p_what) { } void CenterContainer::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_use_top_left", "enable"), &CenterContainer::set_use_top_left); ClassDB::bind_method(D_METHOD("is_using_top_left"), &CenterContainer::is_using_top_left); @@ -98,6 +96,5 @@ void CenterContainer::_bind_methods() { } CenterContainer::CenterContainer() { - use_top_left = false; } diff --git a/scene/gui/center_container.h b/scene/gui/center_container.h index 98733f384d..ae9f87db16 100644 --- a/scene/gui/center_container.h +++ b/scene/gui/center_container.h @@ -34,7 +34,6 @@ #include "scene/gui/container.h" class CenterContainer : public Container { - GDCLASS(CenterContainer, Container); bool use_top_left; diff --git a/scene/gui/check_box.cpp b/scene/gui/check_box.cpp index 470450e3ed..df6f38f65d 100644 --- a/scene/gui/check_box.cpp +++ b/scene/gui/check_box.cpp @@ -39,19 +39,22 @@ Size2 CheckBox::get_icon_size() const { Ref<Texture2D> radio_unchecked = Control::get_theme_icon("radio_unchecked"); Size2 tex_size = Size2(0, 0); - if (!checked.is_null()) + if (!checked.is_null()) { tex_size = Size2(checked->get_width(), checked->get_height()); - if (!unchecked.is_null()) + } + if (!unchecked.is_null()) { tex_size = Size2(MAX(tex_size.width, unchecked->get_width()), MAX(tex_size.height, unchecked->get_height())); - if (!radio_checked.is_null()) + } + if (!radio_checked.is_null()) { tex_size = Size2(MAX(tex_size.width, radio_checked->get_width()), MAX(tex_size.height, radio_checked->get_height())); - if (!radio_unchecked.is_null()) + } + if (!radio_unchecked.is_null()) { tex_size = Size2(MAX(tex_size.width, radio_unchecked->get_width()), MAX(tex_size.height, radio_unchecked->get_height())); + } return tex_size; } Size2 CheckBox::get_minimum_size() const { - Size2 minsize = Button::get_minimum_size(); Size2 tex_size = get_icon_size(); minsize.width += tex_size.width; @@ -65,12 +68,9 @@ Size2 CheckBox::get_minimum_size() const { } void CheckBox::_notification(int p_what) { - if (p_what == NOTIFICATION_THEME_CHANGED) { - _set_internal_margin(MARGIN_LEFT, get_icon_size().width); } else if (p_what == NOTIFICATION_DRAW) { - RID ci = get_canvas_item(); Ref<Texture2D> on = Control::get_theme_icon(is_radio() ? "radio_checked" : "checked"); @@ -81,15 +81,15 @@ void CheckBox::_notification(int p_what) { ofs.x = sb->get_margin(MARGIN_LEFT); ofs.y = int((get_size().height - get_icon_size().height) / 2) + get_theme_constant("check_vadjust"); - if (is_pressed()) + if (is_pressed()) { on->draw(ci, ofs); - else + } else { off->draw(ci, ofs); + } } } bool CheckBox::is_radio() { - return get_button_group().is_valid(); } diff --git a/scene/gui/check_box.h b/scene/gui/check_box.h index 7c8f8c11d6..58f7cce55e 100644 --- a/scene/gui/check_box.h +++ b/scene/gui/check_box.h @@ -36,7 +36,6 @@ @author Mariano Suligoy <marianognu.esyrpg@gmail.com> */ class CheckBox : public Button { - GDCLASS(CheckBox, Button); protected: diff --git a/scene/gui/check_button.cpp b/scene/gui/check_button.cpp index 96484424f8..1ddc730dd1 100644 --- a/scene/gui/check_button.cpp +++ b/scene/gui/check_button.cpp @@ -34,25 +34,26 @@ #include "servers/rendering_server.h" Size2 CheckButton::get_icon_size() const { - Ref<Texture2D> on = Control::get_theme_icon(is_disabled() ? "on_disabled" : "on"); Ref<Texture2D> off = Control::get_theme_icon(is_disabled() ? "off_disabled" : "off"); Size2 tex_size = Size2(0, 0); - if (!on.is_null()) + if (!on.is_null()) { tex_size = Size2(on->get_width(), on->get_height()); - if (!off.is_null()) + } + if (!off.is_null()) { tex_size = Size2(MAX(tex_size.width, off->get_width()), MAX(tex_size.height, off->get_height())); + } return tex_size; } Size2 CheckButton::get_minimum_size() const { - Size2 minsize = Button::get_minimum_size(); Size2 tex_size = get_icon_size(); minsize.width += tex_size.width; - if (get_text().length() > 0) + if (get_text().length() > 0) { minsize.width += get_theme_constant("hseparation"); + } Ref<StyleBox> sb = get_theme_stylebox("normal"); minsize.height = MAX(minsize.height, tex_size.height + sb->get_margin(MARGIN_TOP) + sb->get_margin(MARGIN_BOTTOM)); @@ -60,12 +61,9 @@ Size2 CheckButton::get_minimum_size() const { } void CheckButton::_notification(int p_what) { - if (p_what == NOTIFICATION_THEME_CHANGED) { - _set_internal_margin(MARGIN_RIGHT, get_icon_size().width); } else if (p_what == NOTIFICATION_DRAW) { - RID ci = get_canvas_item(); Ref<Texture2D> on = Control::get_theme_icon(is_disabled() ? "on_disabled" : "on"); @@ -78,15 +76,15 @@ void CheckButton::_notification(int p_what) { ofs.x = get_size().width - (tex_size.width + sb->get_margin(MARGIN_RIGHT)); ofs.y = (get_size().height - tex_size.height) / 2 + get_theme_constant("check_vadjust"); - if (is_pressed()) + if (is_pressed()) { on->draw(ci, ofs); - else + } else { off->draw(ci, ofs); + } } } CheckButton::CheckButton() { - set_toggle_mode(true); set_text_align(ALIGN_LEFT); diff --git a/scene/gui/check_button.h b/scene/gui/check_button.h index 3599c26a4c..8bbad0b4b3 100644 --- a/scene/gui/check_button.h +++ b/scene/gui/check_button.h @@ -36,7 +36,6 @@ @author Juan Linietsky <reduzio@gmail.com> */ class CheckButton : public Button { - GDCLASS(CheckButton, Button); protected: diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 63878a0b26..88710289c7 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -41,17 +41,14 @@ #include "scene/main/window.h" void ColorPicker::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_THEME_CHANGED: { - btn_pick->set_icon(get_theme_icon("screen_picker", "ColorPicker")); bt_add_preset->set_icon(get_theme_icon("add_preset")); _update_controls(); } break; case NOTIFICATION_ENTER_TREE: { - btn_pick->set_icon(get_theme_icon("screen_picker", "ColorPicker")); bt_add_preset->set_icon(get_theme_icon("add_preset")); @@ -68,40 +65,40 @@ void ColorPicker::_notification(int p_what) { #endif } break; case NOTIFICATION_PARENTED: { - - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { set_margin((Margin)i, get_theme_constant("margin")); + } } break; case NOTIFICATION_VISIBILITY_CHANGED: { - Popup *p = Object::cast_to<Popup>(get_parent()); - if (p) + if (p) { p->set_size(Size2(get_combined_minimum_size().width + get_theme_constant("margin") * 2, get_combined_minimum_size().height + get_theme_constant("margin") * 2)); + } } break; case NOTIFICATION_WM_CLOSE_REQUEST: { - - if (screen != nullptr && screen->is_visible()) + if (screen != nullptr && screen->is_visible()) { screen->hide(); + } } break; } } void ColorPicker::set_focus_on_line_edit() { - c_text->call_deferred("grab_focus"); } void ColorPicker::_update_controls() { - const char *rgb[3] = { "R", "G", "B" }; const char *hsv[3] = { "H", "S", "V" }; if (hsv_mode_enabled) { - for (int i = 0; i < 3; i++) + for (int i = 0; i < 3; i++) { labels[i]->set_text(hsv[i]); + } } else { - for (int i = 0; i < 3; i++) + for (int i = 0; i < 3; i++) { labels[i]->set_text(rgb[i]); + } } if (hsv_mode_enabled) { @@ -127,7 +124,6 @@ void ColorPicker::_update_controls() { } void ColorPicker::_set_pick_color(const Color &p_color, bool p_update_sliders) { - color = p_color; if (color != last_hsv) { h = color.get_h(); @@ -136,38 +132,37 @@ void ColorPicker::_set_pick_color(const Color &p_color, bool p_update_sliders) { last_hsv = color; } - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _update_color(p_update_sliders); } void ColorPicker::set_pick_color(const Color &p_color) { - _set_pick_color(p_color, true); //because setters can't have more arguments } void ColorPicker::set_edit_alpha(bool p_show) { - edit_alpha = p_show; _update_controls(); - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _update_color(); sample->update(); } bool ColorPicker::is_editing_alpha() const { - return edit_alpha; } void ColorPicker::_value_changed(double) { - - if (updating) + if (updating) { return; + } if (hsv_mode_enabled) { color.set_hsv(scroll[0]->get_value() / 360.0, @@ -185,28 +180,28 @@ void ColorPicker::_value_changed(double) { } void ColorPicker::_html_entered(const String &p_html) { - - if (updating || text_is_constructor || !c_text->is_visible()) + if (updating || text_is_constructor || !c_text->is_visible()) { return; + } float last_alpha = color.a; color = Color::html(p_html); - if (!is_editing_alpha()) + if (!is_editing_alpha()) { color.a = last_alpha; + } - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } set_pick_color(color); emit_signal("color_changed", color); } void ColorPicker::_update_color(bool p_update_sliders) { - updating = true; if (p_update_sliders) { - if (hsv_mode_enabled) { for (int i = 0; i < 4; i++) { scroll[i]->set_step(1.0); @@ -225,8 +220,9 @@ void ColorPicker::_update_color(bool p_update_sliders) { if (raw_mode_enabled) { scroll[i]->set_step(0.01); scroll[i]->set_max(100); - if (i == 3) + if (i == 3) { scroll[i]->set_max(1); + } scroll[i]->set_value(color.components[i]); } else { scroll[i]->set_step(1); @@ -266,7 +262,6 @@ void ColorPicker::_update_presets() { } void ColorPicker::_text_type_toggled() { - text_is_constructor = !text_is_constructor; if (text_is_constructor) { text_type->set_text(""); @@ -283,12 +278,10 @@ void ColorPicker::_text_type_toggled() { } Color ColorPicker::get_pick_color() const { - return color; } void ColorPicker::add_preset(const Color &p_color) { - if (presets.find(p_color)) { presets.move_to_back(presets.find(p_color)); } else { @@ -305,7 +298,6 @@ void ColorPicker::add_preset(const Color &p_color) { } void ColorPicker::erase_preset(const Color &p_color) { - if (presets.find(p_color)) { presets.erase(presets.find(p_color)); preset->update(); @@ -320,7 +312,6 @@ void ColorPicker::erase_preset(const Color &p_color) { } PackedColorArray ColorPicker::get_presets() const { - PackedColorArray arr; arr.resize(presets.size()); for (int i = 0; i < presets.size(); i++) { @@ -330,42 +321,44 @@ PackedColorArray ColorPicker::get_presets() const { } void ColorPicker::set_hsv_mode(bool p_enabled) { - - if (hsv_mode_enabled == p_enabled || raw_mode_enabled) + if (hsv_mode_enabled == p_enabled || raw_mode_enabled) { return; + } hsv_mode_enabled = p_enabled; - if (btn_hsv->is_pressed() != p_enabled) + if (btn_hsv->is_pressed() != p_enabled) { btn_hsv->set_pressed(p_enabled); + } - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _update_controls(); _update_color(); } bool ColorPicker::is_hsv_mode() const { - return hsv_mode_enabled; } void ColorPicker::set_raw_mode(bool p_enabled) { - - if (raw_mode_enabled == p_enabled || hsv_mode_enabled) + if (raw_mode_enabled == p_enabled || hsv_mode_enabled) { return; + } raw_mode_enabled = p_enabled; - if (btn_raw->is_pressed() != p_enabled) + if (btn_raw->is_pressed() != p_enabled) { btn_raw->set_pressed(p_enabled); + } - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _update_controls(); _update_color(); } bool ColorPicker::is_raw_mode() const { - return raw_mode_enabled; } @@ -381,10 +374,11 @@ void ColorPicker::_update_text_value() { bool visible = true; if (text_is_constructor) { String t = "Color(" + String::num(color.r) + ", " + String::num(color.g) + ", " + String::num(color.b); - if (edit_alpha && color.a < 1) + if (edit_alpha && color.a < 1) { t += ", " + String::num(color.a) + ")"; - else + } else { t += ")"; + } c_text->set_text(t); } @@ -414,8 +408,9 @@ void ColorPicker::_sample_draw() { } void ColorPicker::_hsv_draw(int p_which, Control *c) { - if (!c) + if (!c) { return; + } if (p_which == 0) { Vector<Point2> points; points.push_back(Vector2()); @@ -458,7 +453,6 @@ void ColorPicker::_hsv_draw(int p_which, Control *c) { } void ColorPicker::_uv_input(const Ref<InputEvent> &p_event) { - Ref<InputEventMouseButton> bev = p_event; if (bev.is_valid()) { @@ -472,8 +466,9 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &p_event) { last_hsv = color; set_pick_color(color); _update_color(); - if (!deferred_mode_enabled) + if (!deferred_mode_enabled) { emit_signal("color_changed", color); + } } else if (deferred_mode_enabled && !bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) { emit_signal("color_changed", color); changing_color = false; @@ -485,8 +480,9 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mev = p_event; if (mev.is_valid()) { - if (!changing_color) + if (!changing_color) { return; + } float x = CLAMP((float)mev->get_position().x, 0, uv_edit->get_size().width); float y = CLAMP((float)mev->get_position().y, 0, uv_edit->get_size().height); s = x / uv_edit->get_size().width; @@ -495,17 +491,16 @@ void ColorPicker::_uv_input(const Ref<InputEvent> &p_event) { last_hsv = color; set_pick_color(color); _update_color(); - if (!deferred_mode_enabled) + if (!deferred_mode_enabled) { emit_signal("color_changed", color); + } } } void ColorPicker::_w_input(const Ref<InputEvent> &p_event) { - Ref<InputEventMouseButton> bev = p_event; if (bev.is_valid()) { - if (bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) { changing_color = true; float y = CLAMP((float)bev->get_position().y, 0, w_edit->get_size().height); @@ -517,31 +512,32 @@ void ColorPicker::_w_input(const Ref<InputEvent> &p_event) { last_hsv = color; set_pick_color(color); _update_color(); - if (!deferred_mode_enabled) + if (!deferred_mode_enabled) { emit_signal("color_changed", color); - else if (!bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) + } else if (!bev->is_pressed() && bev->get_button_index() == BUTTON_LEFT) { emit_signal("color_changed", color); + } } Ref<InputEventMouseMotion> mev = p_event; if (mev.is_valid()) { - - if (!changing_color) + if (!changing_color) { return; + } float y = CLAMP((float)mev->get_position().y, 0, w_edit->get_size().height); h = y / w_edit->get_size().height; color.set_hsv(h, s, v, color.a); last_hsv = color; set_pick_color(color); _update_color(); - if (!deferred_mode_enabled) + if (!deferred_mode_enabled) { emit_signal("color_changed", color); + } } } void ColorPicker::_preset_input(const Ref<InputEvent> &p_event) { - Ref<InputEventMouseButton> bev = p_event; if (bev.is_valid()) { @@ -569,19 +565,18 @@ void ColorPicker::_preset_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mev = p_event; if (mev.is_valid()) { - int index = mev->get_position().x * presets.size(); if (preset->get_size().x != 0) { index /= preset->get_size().x; } - if (index < 0 || index >= presets.size()) + if (index < 0 || index >= presets.size()) { return; + } preset->set_tooltip(vformat(RTR("Color: #%s\nLMB: Set color\nRMB: Remove preset"), presets[index].to_html(presets[index].a < 1))); } } void ColorPicker::_screen_input(const Ref<InputEvent> &p_event) { - Ref<InputEventMouseButton> bev = p_event; if (bev.is_valid() && bev->get_button_index() == BUTTON_LEFT && !bev->is_pressed()) { emit_signal("color_changed", color); @@ -591,12 +586,12 @@ void ColorPicker::_screen_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mev = p_event; if (mev.is_valid()) { Viewport *r = get_tree()->get_root(); - if (!r->get_visible_rect().has_point(Point2(mev->get_global_position().x, mev->get_global_position().y))) + if (!r->get_visible_rect().has_point(Point2(mev->get_global_position().x, mev->get_global_position().y))) { return; + } Ref<Image> img = r->get_texture()->get_data(); if (img.is_valid() && !img->empty()) { - Vector2 ofs = mev->get_global_position() - r->get_visible_rect().get_position(); Color c = img->get_pixel(ofs.x, r->get_visible_rect().size.height - ofs.y); @@ -648,15 +643,17 @@ void ColorPicker::_focus_enter() { void ColorPicker::_focus_exit() { for (int i = 0; i < 4; i++) { - if (!values[i]->get_line_edit()->get_menu()->is_visible()) + if (!values[i]->get_line_edit()->get_menu()->is_visible()) { values[i]->get_line_edit()->select(0, 0); + } } c_text->select(0, 0); } void ColorPicker::_html_focus_exit() { - if (c_text->get_menu()->is_visible()) + if (c_text->get_menu()->is_visible()) { return; + } _html_entered(c_text->get_text()); _focus_exit(); } @@ -688,7 +685,6 @@ bool ColorPicker::are_presets_visible() const { } void ColorPicker::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_pick_color", "color"), &ColorPicker::set_pick_color); ClassDB::bind_method(D_METHOD("get_pick_color"), &ColorPicker::get_pick_color); ClassDB::bind_method(D_METHOD("set_hsv_mode"), &ColorPicker::set_hsv_mode); @@ -722,7 +718,6 @@ void ColorPicker::_bind_methods() { ColorPicker::ColorPicker() : BoxContainer(true) { - updating = true; edit_alpha = true; text_is_constructor = false; @@ -779,7 +774,6 @@ ColorPicker::ColorPicker() : vbr->set_h_size_flags(SIZE_EXPAND_FILL); for (int i = 0; i < 4; i++) { - HBoxContainer *hbc = memnew(HBoxContainer); labels[i] = memnew(Label()); @@ -826,13 +820,11 @@ ColorPicker::ColorPicker() : text_type->set_text("#"); text_type->set_tooltip(TTR("Switch between hexadecimal and code values.")); if (Engine::get_singleton()->is_editor_hint()) { - #ifdef TOOLS_ENABLED text_type->set_custom_minimum_size(Size2(28 * EDSCALE, 0)); // Adjust for the width of the "Script" icon. #endif text_type->connect("pressed", callable_mp(this, &ColorPicker::_text_type_toggled)); } else { - text_type->set_flat(true); text_type->set_mouse_filter(MOUSE_FILTER_IGNORE); } @@ -873,19 +865,16 @@ ColorPicker::ColorPicker() : ///////////////// void ColorPickerButton::_color_changed(const Color &p_color) { - color = p_color; update(); emit_signal("color_changed", color); } void ColorPickerButton::_modal_closed() { - emit_signal("popup_closed"); } void ColorPickerButton::pressed() { - _update_picker(); popup->set_as_minsize(); @@ -904,7 +893,6 @@ void ColorPickerButton::pressed() { if (i & 1) { cp_rect.position.x = get_screen_position().x; } else { - cp_rect.position.x = get_screen_position().x - MAX(0, (cp_rect.size.x - get_size().x)); } @@ -918,10 +906,8 @@ void ColorPickerButton::pressed() { } void ColorPickerButton::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_DRAW: { - const Ref<StyleBox> normal = get_theme_stylebox("normal"); const Rect2 r = Rect2(normal->get_offset(), get_size() - normal->get_minimum_size()); draw_texture_rect(Control::get_theme_icon("bg", "ColorPickerButton"), r, true); @@ -933,9 +919,9 @@ void ColorPickerButton::_notification(int p_what) { } } break; case NOTIFICATION_WM_CLOSE_REQUEST: { - - if (popup) + if (popup) { popup->hide(); + } } break; } @@ -947,7 +933,6 @@ void ColorPickerButton::_notification(int p_what) { } void ColorPickerButton::set_pick_color(const Color &p_color) { - color = p_color; if (picker) { picker->set_pick_color(p_color); @@ -955,13 +940,12 @@ void ColorPickerButton::set_pick_color(const Color &p_color) { update(); } -Color ColorPickerButton::get_pick_color() const { +Color ColorPickerButton::get_pick_color() const { return color; } void ColorPickerButton::set_edit_alpha(bool p_show) { - edit_alpha = p_show; if (picker) { picker->set_edit_alpha(p_show); @@ -969,18 +953,15 @@ void ColorPickerButton::set_edit_alpha(bool p_show) { } bool ColorPickerButton::is_editing_alpha() const { - return edit_alpha; } ColorPicker *ColorPickerButton::get_picker() { - _update_picker(); return picker; } PopupPanel *ColorPickerButton::get_popup() { - _update_picker(); return popup; } @@ -1004,7 +985,6 @@ void ColorPickerButton::_update_picker() { } void ColorPickerButton::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_pick_color", "color"), &ColorPickerButton::set_pick_color); ClassDB::bind_method(D_METHOD("get_pick_color"), &ColorPickerButton::get_pick_color); ClassDB::bind_method(D_METHOD("get_picker"), &ColorPickerButton::get_picker); @@ -1020,7 +1000,6 @@ void ColorPickerButton::_bind_methods() { } ColorPickerButton::ColorPickerButton() { - // Initialization is now done deferred, // this improves performance in the inspector as the color picker // can be expensive to initialize. diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h index dde2f37135..31ae92f4e4 100644 --- a/scene/gui/color_picker.h +++ b/scene/gui/color_picker.h @@ -44,7 +44,6 @@ #include "scene/gui/tool_button.h" class ColorPicker : public BoxContainer { - GDCLASS(ColorPicker, BoxContainer); private: @@ -139,7 +138,6 @@ public: }; class ColorPickerButton : public Button { - GDCLASS(ColorPickerButton, Button); PopupPanel *popup; diff --git a/scene/gui/color_rect.cpp b/scene/gui/color_rect.cpp index 61260e153c..627e589c02 100644 --- a/scene/gui/color_rect.cpp +++ b/scene/gui/color_rect.cpp @@ -31,25 +31,21 @@ #include "color_rect.h" void ColorRect::set_frame_color(const Color &p_color) { - color = p_color; update(); } Color ColorRect::get_frame_color() const { - return color; } void ColorRect::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { draw_rect(Rect2(Point2(), get_size()), color); } } void ColorRect::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_frame_color", "color"), &ColorRect::set_frame_color); ClassDB::bind_method(D_METHOD("get_frame_color"), &ColorRect::get_frame_color); @@ -57,6 +53,5 @@ void ColorRect::_bind_methods() { } ColorRect::ColorRect() { - color = Color(1, 1, 1); } diff --git a/scene/gui/container.cpp b/scene/gui/container.cpp index 41f33bb719..18a84ce348 100644 --- a/scene/gui/container.cpp +++ b/scene/gui/container.cpp @@ -33,7 +33,6 @@ #include "scene/scene_string_names.h" void Container::_child_minsize_changed() { - //Size2 ms = get_combined_minimum_size(); //if (ms.width > get_size().width || ms.height > get_size().height) { minimum_size_changed(); @@ -41,12 +40,12 @@ void Container::_child_minsize_changed() { } void Container::add_child_notify(Node *p_child) { - Control::add_child_notify(p_child); Control *control = Object::cast_to<Control>(p_child); - if (!control) + if (!control) { return; + } control->connect("size_flags_changed", callable_mp(this, &Container::queue_sort)); control->connect("minimum_size_changed", callable_mp(this, &Container::_child_minsize_changed)); @@ -57,23 +56,23 @@ void Container::add_child_notify(Node *p_child) { } void Container::move_child_notify(Node *p_child) { - Control::move_child_notify(p_child); - if (!Object::cast_to<Control>(p_child)) + if (!Object::cast_to<Control>(p_child)) { return; + } minimum_size_changed(); queue_sort(); } void Container::remove_child_notify(Node *p_child) { - Control::remove_child_notify(p_child); Control *control = Object::cast_to<Control>(p_child); - if (!control) + if (!control) { return; + } control->disconnect("size_flags_changed", callable_mp(this, &Container::queue_sort)); control->disconnect("minimum_size_changed", callable_mp(this, &Container::_child_minsize_changed)); @@ -84,9 +83,9 @@ void Container::remove_child_notify(Node *p_child) { } void Container::_sort_children() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } notification(NOTIFICATION_SORT_CHILDREN); emit_signal(SceneStringNames::get_singleton()->sort_children); @@ -94,7 +93,6 @@ void Container::_sort_children() { } void Container::fit_child_in_rect(Control *p_child, const Rect2 &p_rect) { - ERR_FAIL_COND(!p_child); ERR_FAIL_COND(p_child->get_parent() != this); @@ -123,8 +121,9 @@ void Container::fit_child_in_rect(Control *p_child, const Rect2 &p_rect) { } } - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { p_child->set_anchor(Margin(i), ANCHOR_BEGIN); + } p_child->set_position(r.position); p_child->set_size(r.size); @@ -133,35 +132,31 @@ void Container::fit_child_in_rect(Control *p_child, const Rect2 &p_rect) { } void Container::queue_sort() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (pending_sort) + if (pending_sort) { return; + } MessageQueue::get_singleton()->push_call(this, "_sort_children"); pending_sort = true; } void Container::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { pending_sort = false; queue_sort(); } break; case NOTIFICATION_RESIZED: { - queue_sort(); } break; case NOTIFICATION_THEME_CHANGED: { - queue_sort(); } break; case NOTIFICATION_VISIBILITY_CHANGED: { - if (is_visible_in_tree()) { queue_sort(); } @@ -170,7 +165,6 @@ void Container::_notification(int p_what) { } String Container::get_configuration_warning() const { - String warning = Control::get_configuration_warning(); if (get_class() == "Container" && get_script().is_null()) { @@ -183,7 +177,6 @@ String Container::get_configuration_warning() const { } void Container::_bind_methods() { - ClassDB::bind_method(D_METHOD("_sort_children"), &Container::_sort_children); ClassDB::bind_method(D_METHOD("queue_sort"), &Container::queue_sort); @@ -194,7 +187,6 @@ void Container::_bind_methods() { } Container::Container() { - pending_sort = false; // All containers should let mouse events pass by default. set_mouse_filter(MOUSE_FILTER_PASS); diff --git a/scene/gui/container.h b/scene/gui/container.h index 0b736d9790..c8db5ee28f 100644 --- a/scene/gui/container.h +++ b/scene/gui/container.h @@ -34,7 +34,6 @@ #include "scene/gui/control.h" class Container : public Control { - GDCLASS(Container, Control); bool pending_sort; diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index b710ba4803..96aaec6ae9 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -49,7 +49,6 @@ #ifdef TOOLS_ENABLED Dictionary Control::_edit_get_state() const { - Dictionary s; s["rotation"] = get_rotation(); s["scale"] = get_scale(); @@ -70,7 +69,6 @@ Dictionary Control::_edit_get_state() const { } void Control::_edit_set_state(const Dictionary &p_state) { - Dictionary state = p_state; set_rotation(state["rotation"]); @@ -162,37 +160,36 @@ Size2 Control::_edit_get_minimum_size() const { #endif void Control::set_custom_minimum_size(const Size2 &p_custom) { - - if (p_custom == data.custom_minimum_size) + if (p_custom == data.custom_minimum_size) { return; + } data.custom_minimum_size = p_custom; minimum_size_changed(); } Size2 Control::get_custom_minimum_size() const { - return data.custom_minimum_size; } void Control::_update_minimum_size_cache() { - Size2 minsize = get_minimum_size(); minsize.x = MAX(minsize.x, data.custom_minimum_size.x); minsize.y = MAX(minsize.y, data.custom_minimum_size.y); bool size_changed = false; - if (data.minimum_size_cache != minsize) + if (data.minimum_size_cache != minsize) { size_changed = true; + } data.minimum_size_cache = minsize; data.minimum_size_valid = true; - if (size_changed) + if (size_changed) { minimum_size_changed(); + } } Size2 Control::get_combined_minimum_size() const { - if (!data.minimum_size_valid) { const_cast<Control *>(this)->_update_minimum_size_cache(); } @@ -200,7 +197,6 @@ Size2 Control::get_combined_minimum_size() const { } Transform2D Control::_get_internal_transform() const { - Transform2D rot_scale; rot_scale.set_rotation_and_scale(data.rotation, data.scale); Transform2D offset; @@ -210,14 +206,12 @@ Transform2D Control::_get_internal_transform() const { } bool Control::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; if (!name.begins_with("custom")) { return false; } if (p_value.get_type() == Variant::NIL) { - if (name.begins_with("custom_icons/")) { String dname = name.get_slicec('/', 1); if (data.icon_override.has(dname)) { @@ -254,8 +248,9 @@ bool Control::_set(const StringName &p_name, const Variant &p_value) { String dname = name.get_slicec('/', 1); data.constant_override.erase(dname); notification(NOTIFICATION_THEME_CHANGED); - } else + } else { return false; + } } else { if (name.begins_with("custom_icons/")) { @@ -276,16 +271,17 @@ bool Control::_set(const StringName &p_name, const Variant &p_value) { } else if (name.begins_with("custom_constants/")) { String dname = name.get_slicec('/', 1); add_theme_constant_override(dname, p_value); - } else + } else { return false; + } } return true; } void Control::_update_minimum_size() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } Size2 minsize = get_combined_minimum_size(); if (minsize.x > data.size_cache.x || @@ -302,7 +298,6 @@ void Control::_update_minimum_size() { } bool Control::_get(const StringName &p_name, Variant &r_ret) const { - String sname = p_name; if (!sname.begins_with("custom")) { @@ -332,13 +327,14 @@ bool Control::_get(const StringName &p_name, Variant &r_ret) const { String name = sname.get_slicec('/', 1); r_ret = data.constant_override.has(name) ? Variant(data.constant_override[name]) : Variant(); - } else + } else { return false; + } return true; } -void Control::_get_property_list(List<PropertyInfo> *p_list) const { +void Control::_get_property_list(List<PropertyInfo> *p_list) const { Ref<Theme> theme = Theme::get_default(); /* Using the default theme since the properties below are meant for editor only if (data.theme.is_valid()) { @@ -353,10 +349,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { List<StringName> names; theme->get_icon_list(get_class_name(), &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { - uint32_t hint = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.icon_override.has(E->get())) + if (data.icon_override.has(E->get())) { hint |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } p_list->push_back(PropertyInfo(Variant::OBJECT, "custom_icons/" + E->get(), PROPERTY_HINT_RESOURCE_TYPE, "Texture2D", hint)); } @@ -365,10 +361,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { List<StringName> names; theme->get_shader_list(get_class_name(), &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { - uint32_t hint = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.shader_override.has(E->get())) + if (data.shader_override.has(E->get())) { hint |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } p_list->push_back(PropertyInfo(Variant::OBJECT, "custom_shaders/" + E->get(), PROPERTY_HINT_RESOURCE_TYPE, "Shader,VisualShader", hint)); } @@ -377,10 +373,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { List<StringName> names; theme->get_stylebox_list(get_class_name(), &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { - uint32_t hint = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.style_override.has(E->get())) + if (data.style_override.has(E->get())) { hint |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } p_list->push_back(PropertyInfo(Variant::OBJECT, "custom_styles/" + E->get(), PROPERTY_HINT_RESOURCE_TYPE, "StyleBox", hint)); } @@ -389,10 +385,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { List<StringName> names; theme->get_font_list(get_class_name(), &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { - uint32_t hint = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.font_override.has(E->get())) + if (data.font_override.has(E->get())) { hint |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } p_list->push_back(PropertyInfo(Variant::OBJECT, "custom_fonts/" + E->get(), PROPERTY_HINT_RESOURCE_TYPE, "Font", hint)); } @@ -401,10 +397,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { List<StringName> names; theme->get_color_list(get_class_name(), &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { - uint32_t hint = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.color_override.has(E->get())) + if (data.color_override.has(E->get())) { hint |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } p_list->push_back(PropertyInfo(Variant::COLOR, "custom_colors/" + E->get(), PROPERTY_HINT_NONE, "", hint)); } @@ -413,10 +409,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { List<StringName> names; theme->get_constant_list(get_class_name(), &names); for (List<StringName>::Element *E = names.front(); E; E = E->next()) { - uint32_t hint = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.constant_override.has(E->get())) + if (data.constant_override.has(E->get())) { hint |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } p_list->push_back(PropertyInfo(Variant::INT, "custom_constants/" + E->get(), PROPERTY_HINT_RANGE, "-16384,16384", hint)); } @@ -424,19 +420,16 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { } Control *Control::get_parent_control() const { - return data.parent; } void Control::_resize(const Size2 &p_size) { - _size_changed(); } //moved theme configuration here, so controls can set up even if still not inside active scene void Control::add_child_notify(Node *p_child) { - Control *child_c = Object::cast_to<Control>(p_child); if (child_c && child_c->data.theme.is_null() && (data.theme_owner || data.theme_owner_window)) { @@ -451,7 +444,6 @@ void Control::add_child_notify(Node *p_child) { } void Control::remove_child_notify(Node *p_child) { - Control *child_c = Object::cast_to<Control>(p_child); if (child_c && (child_c->data.theme_owner || child_c->data.theme_owner_window) && child_c->data.theme.is_null()) { @@ -466,7 +458,6 @@ void Control::remove_child_notify(Node *p_child) { } void Control::_update_canvas_item_transform() { - Transform2D xform = _get_internal_transform(); xform[2] += get_position(); @@ -474,24 +465,19 @@ void Control::_update_canvas_item_transform() { } void Control::_notification(int p_notification) { - switch (p_notification) { - case NOTIFICATION_ENTER_TREE: { - } break; case NOTIFICATION_POST_ENTER_TREE: { data.minimum_size_valid = false; _size_changed(); } break; case NOTIFICATION_EXIT_TREE: { - get_viewport()->_gui_remove_control(this); } break; case NOTIFICATION_ENTER_CANVAS: { - data.parent = Object::cast_to<Control>(get_parent()); Node *parent = this; //meh @@ -499,11 +485,11 @@ void Control::_notification(int p_notification) { bool subwindow = false; while (parent) { - parent = parent->get_parent(); - if (!parent) + if (!parent) { break; + } CanvasItem *ci = Object::cast_to<CanvasItem>(parent); if (ci && ci->is_set_as_toplevel()) { @@ -516,7 +502,6 @@ void Control::_notification(int p_notification) { if (parent_control) { break; } else if (ci) { - } else { break; } @@ -536,7 +521,6 @@ void Control::_notification(int p_notification) { data.parent_canvas_item = get_parent_item(); if (data.parent_canvas_item) { - data.parent_canvas_item->connect("item_rect_changed", callable_mp(this, &Control::_size_changed)); } else { //connect viewport @@ -544,9 +528,7 @@ void Control::_notification(int p_notification) { } } break; case NOTIFICATION_EXIT_CANVAS: { - if (data.parent_canvas_item) { - data.parent_canvas_item->disconnect("item_rect_changed", callable_mp(this, &Control::_size_changed)); data.parent_canvas_item = nullptr; } else if (!is_set_as_toplevel()) { @@ -566,8 +548,9 @@ void Control::_notification(int p_notification) { case NOTIFICATION_MOVED_IN_PARENT: { // some parents need to know the order of the childrens to draw (like TabContainer) // update if necessary - if (data.parent) + if (data.parent) { data.parent->update(); + } update(); if (data.RI) { @@ -576,11 +559,9 @@ void Control::_notification(int p_notification) { } break; case NOTIFICATION_RESIZED: { - emit_signal(SceneStringNames::get_singleton()->resized); } break; case NOTIFICATION_DRAW: { - _update_canvas_item_transform(); RenderingServer::get_singleton()->canvas_item_set_custom_rect(get_canvas_item(), !data.disable_visibility_clip, Rect2(Point2(), get_size())); RenderingServer::get_singleton()->canvas_item_set_clip(get_canvas_item(), data.clip_contents); @@ -588,35 +569,29 @@ void Control::_notification(int p_notification) { } break; case NOTIFICATION_MOUSE_ENTER: { - emit_signal(SceneStringNames::get_singleton()->mouse_entered); } break; case NOTIFICATION_MOUSE_EXIT: { - emit_signal(SceneStringNames::get_singleton()->mouse_exited); } break; case NOTIFICATION_FOCUS_ENTER: { - emit_signal(SceneStringNames::get_singleton()->focus_entered); update(); } break; case NOTIFICATION_FOCUS_EXIT: { - emit_signal(SceneStringNames::get_singleton()->focus_exited); update(); } break; case NOTIFICATION_THEME_CHANGED: { - minimum_size_changed(); update(); } break; case NOTIFICATION_VISIBILITY_CHANGED: { - if (!is_visible_in_tree()) { - - if (get_viewport() != nullptr) + if (get_viewport() != nullptr) { get_viewport()->_gui_hid_control(this); + } //remove key focus @@ -630,14 +605,13 @@ void Control::_notification(int p_notification) { } bool Control::clips_input() const { - if (get_script_instance()) { return get_script_instance()->call(SceneStringNames::get_singleton()->_clips_input); } return false; } -bool Control::has_point(const Point2 &p_point) const { +bool Control::has_point(const Point2 &p_point) const { if (get_script_instance()) { Variant v = p_point; const Variant *p = &v; @@ -655,15 +629,14 @@ bool Control::has_point(const Point2 &p_point) const { } void Control::set_drag_forwarding(Control *p_target) { - - if (p_target) + if (p_target) { data.drag_owner = p_target->get_instance_id(); - else + } else { data.drag_owner = ObjectID(); + } } Variant Control::get_drag_data(const Point2 &p_point) { - if (data.drag_owner.is_valid()) { Object *obj = ObjectDB::get_instance(data.drag_owner); if (obj) { @@ -677,15 +650,15 @@ Variant Control::get_drag_data(const Point2 &p_point) { const Variant *p = &v; Callable::CallError ce; Variant ret = get_script_instance()->call(SceneStringNames::get_singleton()->get_drag_data, &p, 1, ce); - if (ce.error == Callable::CallError::CALL_OK) + if (ce.error == Callable::CallError::CALL_OK) { return ret; + } } return Variant(); } bool Control::can_drop_data(const Point2 &p_point, const Variant &p_data) const { - if (data.drag_owner.is_valid()) { Object *obj = ObjectDB::get_instance(data.drag_owner); if (obj) { @@ -699,14 +672,15 @@ bool Control::can_drop_data(const Point2 &p_point, const Variant &p_data) const const Variant *p[2] = { &v, &p_data }; Callable::CallError ce; Variant ret = get_script_instance()->call(SceneStringNames::get_singleton()->can_drop_data, p, 2, ce); - if (ce.error == Callable::CallError::CALL_OK) + if (ce.error == Callable::CallError::CALL_OK) { return ret; + } } return Variant(); } -void Control::drop_data(const Point2 &p_point, const Variant &p_data) { +void Control::drop_data(const Point2 &p_point, const Variant &p_data) { if (data.drag_owner.is_valid()) { Object *obj = ObjectDB::get_instance(data.drag_owner); if (obj) { @@ -721,13 +695,13 @@ void Control::drop_data(const Point2 &p_point, const Variant &p_data) { const Variant *p[2] = { &v, &p_data }; Callable::CallError ce; Variant ret = get_script_instance()->call(SceneStringNames::get_singleton()->drop_data, p, 2, ce); - if (ce.error == Callable::CallError::CALL_OK) + if (ce.error == Callable::CallError::CALL_OK) { return; + } } } void Control::force_drag(const Variant &p_data, Control *p_control) { - ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND(p_data.get_type() == Variant::NIL); @@ -735,34 +709,30 @@ void Control::force_drag(const Variant &p_data, Control *p_control) { } void Control::set_drag_preview(Control *p_control) { - ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND(!get_viewport()->gui_is_dragging()); get_viewport()->_gui_set_drag_preview(this, p_control); } Size2 Control::get_minimum_size() const { - ScriptInstance *si = const_cast<Control *>(this)->get_script_instance(); if (si) { - Callable::CallError ce; Variant s = si->call(SceneStringNames::get_singleton()->_get_minimum_size, nullptr, 0, ce); - if (ce.error == Callable::CallError::CALL_OK) + if (ce.error == Callable::CallError::CALL_OK) { return s; + } } return Size2(); } template <class T> bool Control::_find_theme_item(Control *p_theme_owner, Window *p_theme_owner_window, T &r_ret, T (Theme::*get_func)(const StringName &, const StringName &) const, bool (Theme::*has_func)(const StringName &, const StringName &) const, const StringName &p_name, const StringName &p_type) { - // try with custom themes Control *theme_owner = p_theme_owner; Window *theme_owner_window = p_theme_owner_window; while (theme_owner || theme_owner_window) { - StringName class_name = p_type; while (class_name != StringName()) { @@ -792,7 +762,6 @@ bool Control::_find_theme_item(Control *p_theme_owner, Window *p_theme_owner_win theme_owner = parent_w->theme_owner; theme_owner_window = parent_w->theme_owner_window; } else { - theme_owner = nullptr; theme_owner_window = nullptr; } @@ -802,13 +771,11 @@ bool Control::_find_theme_item(Control *p_theme_owner, Window *p_theme_owner_win } bool Control::_has_theme_item(Control *p_theme_owner, Window *p_theme_owner_window, bool (Theme::*has_func)(const StringName &, const StringName &) const, const StringName &p_name, const StringName &p_type) { - // try with custom themes Control *theme_owner = p_theme_owner; Window *theme_owner_window = p_theme_owner_window; while (theme_owner || theme_owner_window) { - StringName class_name = p_type; while (class_name != StringName()) { @@ -836,7 +803,6 @@ bool Control::_has_theme_item(Control *p_theme_owner, Window *p_theme_owner_wind theme_owner = parent_w->theme_owner; theme_owner_window = parent_w->theme_owner_window; } else { - theme_owner = nullptr; theme_owner_window = nullptr; } @@ -846,12 +812,11 @@ bool Control::_has_theme_item(Control *p_theme_owner, Window *p_theme_owner_wind } Ref<Texture2D> Control::get_theme_icon(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { - const Ref<Texture2D> *tex = data.icon_override.getptr(p_name); - if (tex) + if (tex) { return *tex; + } } StringName type = p_type ? p_type : get_class_name(); @@ -860,7 +825,6 @@ Ref<Texture2D> Control::get_theme_icon(const StringName &p_name, const StringNam } Ref<Texture2D> Control::get_icons(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - Ref<Texture2D> icon; if (_find_theme_item(p_theme_owner, p_theme_owner_window, icon, &Theme::get_icon, &Theme::has_icon, p_name, p_type)) { @@ -877,12 +841,11 @@ Ref<Texture2D> Control::get_icons(Control *p_theme_owner, Window *p_theme_owner_ } Ref<Shader> Control::get_theme_shader(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { - const Ref<Shader> *sdr = data.shader_override.getptr(p_name); - if (sdr) + if (sdr) { return *sdr; + } } StringName type = p_type ? p_type : get_class_name(); @@ -891,7 +854,6 @@ Ref<Shader> Control::get_theme_shader(const StringName &p_name, const StringName } Ref<Shader> Control::get_shaders(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - Ref<Shader> shader; if (_find_theme_item(p_theme_owner, p_theme_owner_window, shader, &Theme::get_shader, &Theme::has_shader, p_name, p_type)) { @@ -908,11 +870,11 @@ Ref<Shader> Control::get_shaders(Control *p_theme_owner, Window *p_theme_owner_w } Ref<StyleBox> Control::get_theme_stylebox(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { const Ref<StyleBox> *style = data.style_override.getptr(p_name); - if (style) + if (style) { return *style; + } } StringName type = p_type ? p_type : get_class_name(); @@ -921,7 +883,6 @@ Ref<StyleBox> Control::get_theme_stylebox(const StringName &p_name, const String } Ref<StyleBox> Control::get_styleboxs(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - Ref<StyleBox> stylebox; if (_find_theme_item(p_theme_owner, p_theme_owner_window, stylebox, &Theme::get_stylebox, &Theme::has_stylebox, p_name, p_type)) { @@ -938,11 +899,11 @@ Ref<StyleBox> Control::get_styleboxs(Control *p_theme_owner, Window *p_theme_own } Ref<Font> Control::get_theme_font(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { const Ref<Font> *font = data.font_override.getptr(p_name); - if (font) + if (font) { return *font; + } } StringName type = p_type ? p_type : get_class_name(); @@ -951,7 +912,6 @@ Ref<Font> Control::get_theme_font(const StringName &p_name, const StringName &p_ } Ref<Font> Control::get_fonts(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - Ref<Font> font; if (_find_theme_item(p_theme_owner, p_theme_owner_window, font, &Theme::get_font, &Theme::has_font, p_name, p_type)) { @@ -968,11 +928,11 @@ Ref<Font> Control::get_fonts(Control *p_theme_owner, Window *p_theme_owner_windo } Color Control::get_theme_color(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { const Color *color = data.color_override.getptr(p_name); - if (color) + if (color) { return *color; + } } StringName type = p_type ? p_type : get_class_name(); @@ -981,7 +941,6 @@ Color Control::get_theme_color(const StringName &p_name, const StringName &p_typ } Color Control::get_colors(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - Color color; if (_find_theme_item(p_theme_owner, p_theme_owner_window, color, &Theme::get_color, &Theme::has_color, p_name, p_type)) { @@ -997,11 +956,11 @@ Color Control::get_colors(Control *p_theme_owner, Window *p_theme_owner_window, } int Control::get_theme_constant(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { const int *constant = data.constant_override.getptr(p_name); - if (constant) + if (constant) { return *constant; + } } StringName type = p_type ? p_type : get_class_name(); @@ -1010,7 +969,6 @@ int Control::get_theme_constant(const StringName &p_name, const StringName &p_ty } int Control::get_constants(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - int constant; if (_find_theme_item(p_theme_owner, p_theme_owner_window, constant, &Theme::get_constant, &Theme::has_constant, p_name, p_type)) { @@ -1026,46 +984,40 @@ int Control::get_constants(Control *p_theme_owner, Window *p_theme_owner_window, } bool Control::has_theme_icon_override(const StringName &p_name) const { - const Ref<Texture2D> *tex = data.icon_override.getptr(p_name); return tex != nullptr; } bool Control::has_theme_shader_override(const StringName &p_name) const { - const Ref<Shader> *sdr = data.shader_override.getptr(p_name); return sdr != nullptr; } bool Control::has_theme_stylebox_override(const StringName &p_name) const { - const Ref<StyleBox> *style = data.style_override.getptr(p_name); return style != nullptr; } bool Control::has_theme_font_override(const StringName &p_name) const { - const Ref<Font> *font = data.font_override.getptr(p_name); return font != nullptr; } bool Control::has_theme_color_override(const StringName &p_name) const { - const Color *color = data.color_override.getptr(p_name); return color != nullptr; } bool Control::has_theme_constant_override(const StringName &p_name) const { - const int *constant = data.constant_override.getptr(p_name); return constant != nullptr; } bool Control::has_theme_icon(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { - if (has_theme_icon_override(p_name)) + if (has_theme_icon_override(p_name)) { return true; + } } StringName type = p_type ? p_type : get_class_name(); @@ -1074,7 +1026,6 @@ bool Control::has_theme_icon(const StringName &p_name, const StringName &p_type) } bool Control::has_icons(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - if (_has_theme_item(p_theme_owner, p_theme_owner_window, &Theme::has_icon, p_name, p_type)) { return true; } @@ -1088,18 +1039,18 @@ bool Control::has_icons(Control *p_theme_owner, Window *p_theme_owner_window, co } bool Control::has_theme_shader(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { - if (has_theme_shader_override(p_name)) + if (has_theme_shader_override(p_name)) { return true; + } } StringName type = p_type ? p_type : get_class_name(); return has_shaders(data.theme_owner, data.theme_owner_window, p_name, type); } -bool Control::has_shaders(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { +bool Control::has_shaders(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { if (_has_theme_item(p_theme_owner, p_theme_owner_window, &Theme::has_shader, p_name, p_type)) { return true; } @@ -1113,10 +1064,10 @@ bool Control::has_shaders(Control *p_theme_owner, Window *p_theme_owner_window, } bool Control::has_theme_stylebox(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { - if (has_theme_stylebox_override(p_name)) + if (has_theme_stylebox_override(p_name)) { return true; + } } StringName type = p_type ? p_type : get_class_name(); @@ -1125,7 +1076,6 @@ bool Control::has_theme_stylebox(const StringName &p_name, const StringName &p_t } bool Control::has_styleboxs(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - if (_has_theme_item(p_theme_owner, p_theme_owner_window, &Theme::has_stylebox, p_name, p_type)) { return true; } @@ -1139,18 +1089,18 @@ bool Control::has_styleboxs(Control *p_theme_owner, Window *p_theme_owner_window } bool Control::has_theme_font(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { - if (has_theme_font_override(p_name)) + if (has_theme_font_override(p_name)) { return true; + } } StringName type = p_type ? p_type : get_class_name(); return has_fonts(data.theme_owner, data.theme_owner_window, p_name, type); } -bool Control::has_fonts(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { +bool Control::has_fonts(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { if (_has_theme_item(p_theme_owner, p_theme_owner_window, &Theme::has_font, p_name, p_type)) { return true; } @@ -1164,18 +1114,18 @@ bool Control::has_fonts(Control *p_theme_owner, Window *p_theme_owner_window, co } bool Control::has_theme_color(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { - if (has_theme_color_override(p_name)) + if (has_theme_color_override(p_name)) { return true; + } } StringName type = p_type ? p_type : get_class_name(); return has_colors(data.theme_owner, data.theme_owner_window, p_name, type); } -bool Control::has_colors(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { +bool Control::has_colors(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { if (_has_theme_item(p_theme_owner, p_theme_owner_window, &Theme::has_color, p_name, p_type)) { return true; } @@ -1189,10 +1139,10 @@ bool Control::has_colors(Control *p_theme_owner, Window *p_theme_owner_window, c } bool Control::has_theme_constant(const StringName &p_name, const StringName &p_type) const { - if (p_type == StringName() || p_type == get_class_name()) { - if (has_theme_constant_override(p_name)) + if (has_theme_constant_override(p_name)) { return true; + } } StringName type = p_type ? p_type : get_class_name(); @@ -1201,7 +1151,6 @@ bool Control::has_theme_constant(const StringName &p_name, const StringName &p_t } bool Control::has_constants(Control *p_theme_owner, Window *p_theme_owner_window, const StringName &p_name, const StringName &p_type) { - if (_has_theme_item(p_theme_owner, p_theme_owner_window, &Theme::has_constant, p_name, p_type)) { return true; } @@ -1215,8 +1164,9 @@ bool Control::has_constants(Control *p_theme_owner, Window *p_theme_owner_window } Rect2 Control::get_parent_anchorable_rect() const { - if (!is_inside_tree()) + if (!is_inside_tree()) { return Rect2(); + } Rect2 parent_rect; if (data.parent_canvas_item) { @@ -1229,18 +1179,15 @@ Rect2 Control::get_parent_anchorable_rect() const { } Size2 Control::get_parent_area_size() const { - return get_parent_anchorable_rect().size; } void Control::_size_changed() { - Rect2 parent_rect = get_parent_anchorable_rect(); float margin_pos[4]; for (int i = 0; i < 4; i++) { - float area = parent_rect.size[i & 1]; margin_pos[i] = data.margin[i] + (data.anchor[i] * area); } @@ -1293,7 +1240,6 @@ void Control::_size_changed() { } void Control::set_anchor(Margin p_margin, float p_anchor, bool p_keep_margin, bool p_push_opposite_anchor) { - ERR_FAIL_INDEX((int)p_margin, 4); Rect2 parent_rect = get_parent_anchorable_rect(); @@ -1334,13 +1280,11 @@ void Control::_set_anchor(Margin p_margin, float p_anchor) { } void Control::set_anchor_and_margin(Margin p_margin, float p_anchor, float p_pos, bool p_push_opposite_anchor) { - set_anchor(p_margin, p_anchor, false, p_push_opposite_anchor); set_margin(p_margin, p_pos); } void Control::set_anchors_preset(LayoutPreset p_preset, bool p_keep_margins) { - ERR_FAIL_INDEX((int)p_preset, 16); //Left @@ -1457,7 +1401,6 @@ void Control::set_anchors_preset(LayoutPreset p_preset, bool p_keep_margins) { } void Control::set_margins_preset(LayoutPreset p_preset, LayoutPresetMode p_resize_mode, int p_margin) { - ERR_FAIL_INDEX((int)p_preset, 16); ERR_FAIL_INDEX((int)p_resize_mode, 4); @@ -1594,14 +1537,12 @@ void Control::set_anchors_and_margins_preset(LayoutPreset p_preset, LayoutPreset } float Control::get_anchor(Margin p_margin) const { - ERR_FAIL_INDEX_V(int(p_margin), 4, 0.0); return data.anchor[p_margin]; } void Control::_change_notify_margins() { - // this avoids sending the whole object data again on a change _change_notify("margin_left"); _change_notify("margin_top"); @@ -1612,7 +1553,6 @@ void Control::_change_notify_margins() { } void Control::set_margin(Margin p_margin, float p_value) { - ERR_FAIL_INDEX((int)p_margin, 4); data.margin[p_margin] = p_value; @@ -1620,37 +1560,32 @@ void Control::set_margin(Margin p_margin, float p_value) { } void Control::set_begin(const Size2 &p_point) { - data.margin[0] = p_point.x; data.margin[1] = p_point.y; _size_changed(); } void Control::set_end(const Size2 &p_point) { - data.margin[2] = p_point.x; data.margin[3] = p_point.y; _size_changed(); } float Control::get_margin(Margin p_margin) const { - ERR_FAIL_INDEX_V((int)p_margin, 4, 0); return data.margin[p_margin]; } Size2 Control::get_begin() const { - return Size2(data.margin[0], data.margin[1]); } -Size2 Control::get_end() const { +Size2 Control::get_end() const { return Size2(data.margin[2], data.margin[3]); } Point2 Control::get_global_position() const { - return get_global_transform().get_origin(); } @@ -1670,11 +1605,9 @@ void Control::_set_global_position(const Point2 &p_point) { } void Control::set_global_position(const Point2 &p_point, bool p_keep_margins) { - Transform2D inv; if (data.parent_canvas_item) { - inv = data.parent_canvas_item->get_global_transform().affine_inverse(); } @@ -1682,7 +1615,6 @@ void Control::set_global_position(const Point2 &p_point, bool p_keep_margins) { } void Control::_compute_anchors(Rect2 p_rect, const float p_margins[4], float (&r_anchors)[4]) { - Size2 parent_rect_size = get_parent_anchorable_rect().size; ERR_FAIL_COND(parent_rect_size.x == 0.0); ERR_FAIL_COND(parent_rect_size.y == 0.0); @@ -1694,7 +1626,6 @@ void Control::_compute_anchors(Rect2 p_rect, const float p_margins[4], float (&r } void Control::_compute_margins(Rect2 p_rect, const float p_anchors[4], float (&r_margins)[4]) { - Size2 parent_rect_size = get_parent_anchorable_rect().size; r_margins[0] = p_rect.position.x - (p_anchors[0] * parent_rect_size.x); r_margins[1] = p_rect.position.y - (p_anchors[1] * parent_rect_size.y); @@ -1724,13 +1655,14 @@ void Control::_set_size(const Size2 &p_size) { } void Control::set_size(const Size2 &p_size, bool p_keep_margins) { - Size2 new_size = p_size; Size2 min = get_combined_minimum_size(); - if (new_size.x < min.x) + if (new_size.x < min.x) { new_size.x = min.x; - if (new_size.y < min.y) + } + if (new_size.y < min.y) { new_size.y = min.y; + } if (p_keep_margins) { _compute_anchors(Rect2(data.pos_cache, new_size), data.margin, data.anchor); @@ -1745,22 +1677,18 @@ void Control::set_size(const Size2 &p_size, bool p_keep_margins) { } Size2 Control::get_position() const { - return data.pos_cache; } Size2 Control::get_size() const { - return data.size_cache; } Rect2 Control::get_global_rect() const { - return Rect2(get_global_position(), get_size()); } Rect2 Control::get_screen_rect() const { - ERR_FAIL_COND_V(!is_inside_tree(), Rect2()); Rect2 r(get_global_position(), get_size()); @@ -1781,17 +1709,14 @@ Rect2 Control::get_window_rect() const { } Rect2 Control::get_rect() const { - return Rect2(get_position(), get_size()); } Rect2 Control::get_anchorable_rect() const { - return Rect2(Point2(), get_size()); } void Control::add_theme_icon_override(const StringName &p_name, const Ref<Texture2D> &p_icon) { - if (data.icon_override.has(p_name)) { data.icon_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed)); } @@ -1809,7 +1734,6 @@ void Control::add_theme_icon_override(const StringName &p_name, const Ref<Textur } void Control::add_theme_shader_override(const StringName &p_name, const Ref<Shader> &p_shader) { - if (data.shader_override.has(p_name)) { data.shader_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed)); } @@ -1825,8 +1749,8 @@ void Control::add_theme_shader_override(const StringName &p_name, const Ref<Shad } notification(NOTIFICATION_THEME_CHANGED); } -void Control::add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style) { +void Control::add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style) { if (data.style_override.has(p_name)) { data.style_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed)); } @@ -1844,7 +1768,6 @@ void Control::add_theme_style_override(const StringName &p_name, const Ref<Style } void Control::add_theme_font_override(const StringName &p_name, const Ref<Font> &p_font) { - if (data.font_override.has(p_name)) { data.font_override[p_name]->disconnect("changed", callable_mp(this, &Control::_override_changed)); } @@ -1860,46 +1783,45 @@ void Control::add_theme_font_override(const StringName &p_name, const Ref<Font> } notification(NOTIFICATION_THEME_CHANGED); } -void Control::add_theme_color_override(const StringName &p_name, const Color &p_color) { +void Control::add_theme_color_override(const StringName &p_name, const Color &p_color) { data.color_override[p_name] = p_color; notification(NOTIFICATION_THEME_CHANGED); } -void Control::add_theme_constant_override(const StringName &p_name, int p_constant) { +void Control::add_theme_constant_override(const StringName &p_name, int p_constant) { data.constant_override[p_name] = p_constant; notification(NOTIFICATION_THEME_CHANGED); } void Control::set_focus_mode(FocusMode p_focus_mode) { - ERR_FAIL_INDEX((int)p_focus_mode, 3); - if (is_inside_tree() && p_focus_mode == FOCUS_NONE && data.focus_mode != FOCUS_NONE && has_focus()) + if (is_inside_tree() && p_focus_mode == FOCUS_NONE && data.focus_mode != FOCUS_NONE && has_focus()) { release_focus(); + } data.focus_mode = p_focus_mode; } static Control *_next_control(Control *p_from) { - - if (p_from->is_set_as_toplevel()) + if (p_from->is_set_as_toplevel()) { return nullptr; // can't go above + } Control *parent = Object::cast_to<Control>(p_from->get_parent()); if (!parent) { - return nullptr; } int next = p_from->get_index(); ERR_FAIL_INDEX_V(next, parent->get_child_count(), nullptr); for (int i = (next + 1); i < parent->get_child_count(); i++) { - Control *c = Object::cast_to<Control>(parent->get_child(i)); - if (!c || !c->is_visible_in_tree() || c->is_set_as_toplevel()) + if (!c || !c->is_visible_in_tree() || c->is_set_as_toplevel()) { continue; + } return c; } @@ -1909,11 +1831,9 @@ static Control *_next_control(Control *p_from) { } Control *Control::find_next_valid_focus() const { - Control *from = const_cast<Control *>(this); while (true) { - // If the focus property is manually overwritten, attempt to use it. if (!data.focus_next.is_empty()) { @@ -1925,8 +1845,9 @@ Control *Control::find_next_valid_focus() const { } else { return nullptr; } - if (c->is_visible() && c->get_focus_mode() != FOCUS_NONE) + if (c->is_visible() && c->get_focus_mode() != FOCUS_NONE) { return c; + } } // find next child @@ -1934,7 +1855,6 @@ Control *Control::find_next_valid_focus() const { Control *next_child = nullptr; for (int i = 0; i < from->get_child_count(); i++) { - Control *c = Object::cast_to<Control>(from->get_child(i)); if (!c || !c->is_visible_in_tree() || c->is_set_as_toplevel()) { continue; @@ -1945,56 +1865,56 @@ Control *Control::find_next_valid_focus() const { } if (!next_child) { - next_child = _next_control(from); if (!next_child) { //nothing else.. go up and find either window or subwindow next_child = const_cast<Control *>(this); while (next_child && !next_child->is_set_as_toplevel()) { - next_child = cast_to<Control>(next_child->get_parent()); } if (!next_child) { - next_child = const_cast<Control *>(this); while (next_child) { - - if (next_child->data.RI) + if (next_child->data.RI) { break; + } next_child = next_child->get_parent_control(); } } } } - if (next_child == this) // no next control-> + if (next_child == this) { // no next control-> return (get_focus_mode() == FOCUS_ALL) ? next_child : nullptr; + } if (next_child) { - if (next_child->get_focus_mode() == FOCUS_ALL) + if (next_child->get_focus_mode() == FOCUS_ALL) { return next_child; + } from = next_child; - } else + } else { break; + } } return nullptr; } static Control *_prev_control(Control *p_from) { - Control *child = nullptr; for (int i = p_from->get_child_count() - 1; i >= 0; i--) { - Control *c = Object::cast_to<Control>(p_from->get_child(i)); - if (!c || !c->is_visible_in_tree() || c->is_set_as_toplevel()) + if (!c || !c->is_visible_in_tree() || c->is_set_as_toplevel()) { continue; + } child = c; break; } - if (!child) + if (!child) { return p_from; + } //no prev in parent, try the same in parent return _prev_control(child); @@ -2004,7 +1924,6 @@ Control *Control::find_prev_valid_focus() const { Control *from = const_cast<Control *>(this); while (true) { - // If the focus property is manually overwritten, attempt to use it. if (!data.focus_prev.is_empty()) { @@ -2016,8 +1935,9 @@ Control *Control::find_prev_valid_focus() const { } else { return nullptr; } - if (c->is_visible() && c->get_focus_mode() != FOCUS_NONE) + if (c->is_visible() && c->get_focus_mode() != FOCUS_NONE) { return c; + } } // find prev child @@ -2025,15 +1945,12 @@ Control *Control::find_prev_valid_focus() const { Control *prev_child = nullptr; if (from->is_set_as_toplevel() || !Object::cast_to<Control>(from->get_parent())) { - //find last of the children prev_child = _prev_control(from); } else { - for (int i = (from->get_index() - 1); i >= 0; i--) { - Control *c = Object::cast_to<Control>(from->get_parent()->get_child(i)); if (!c || !c->is_visible_in_tree() || c->is_set_as_toplevel()) { @@ -2045,19 +1962,19 @@ Control *Control::find_prev_valid_focus() const { } if (!prev_child) { - prev_child = Object::cast_to<Control>(from->get_parent()); } else { - prev_child = _prev_control(prev_child); } } - if (prev_child == this) // no prev control-> + if (prev_child == this) { // no prev control-> return (get_focus_mode() == FOCUS_ALL) ? prev_child : nullptr; + } - if (prev_child->get_focus_mode() == FOCUS_ALL) + if (prev_child->get_focus_mode() == FOCUS_ALL) { return prev_child; + } from = prev_child; } @@ -2066,16 +1983,14 @@ Control *Control::find_prev_valid_focus() const { } Control::FocusMode Control::get_focus_mode() const { - return data.focus_mode; } -bool Control::has_focus() const { +bool Control::has_focus() const { return is_inside_tree() && get_viewport()->_gui_control_has_focus(this); } void Control::grab_focus() { - ERR_FAIL_COND(!is_inside_tree()); if (data.focus_mode == FOCUS_NONE) { @@ -2087,40 +2002,38 @@ void Control::grab_focus() { } void Control::release_focus() { - ERR_FAIL_COND(!is_inside_tree()); - if (!has_focus()) + if (!has_focus()) { return; + } get_viewport()->_gui_remove_focus(); update(); } bool Control::is_toplevel_control() const { - return is_inside_tree() && (!data.parent_canvas_item && !data.RI && is_set_as_toplevel()); } void Control::_propagate_theme_changed(Node *p_at, Control *p_owner, Window *p_owner_window, bool p_assign) { - Control *c = Object::cast_to<Control>(p_at); - if (c && c != p_owner && c->data.theme.is_valid()) // has a theme, this can't be propagated + if (c && c != p_owner && c->data.theme.is_valid()) { // has a theme, this can't be propagated return; + } Window *w = c == nullptr ? Object::cast_to<Window>(p_at) : nullptr; - if (w && w != p_owner_window && w->theme.is_valid()) // has a theme, this can't be propagated + if (w && w != p_owner_window && w->theme.is_valid()) { // has a theme, this can't be propagated return; + } for (int i = 0; i < p_at->get_child_count(); i++) { - CanvasItem *child = Object::cast_to<CanvasItem>(p_at->get_child(i)); if (child) { _propagate_theme_changed(child, p_owner, p_owner_window, p_assign); } else { - Window *window = Object::cast_to<Window>(p_at->get_child(i)); if (window) { _propagate_theme_changed(window, p_owner, p_owner_window, p_assign); @@ -2129,7 +2042,6 @@ void Control::_propagate_theme_changed(Node *p_at, Control *p_owner, Window *p_o } if (c) { - if (p_assign) { c->data.theme_owner = p_owner; c->data.theme_owner_window = p_owner_window; @@ -2139,7 +2051,6 @@ void Control::_propagate_theme_changed(Node *p_at, Control *p_owner, Window *p_o } if (w) { - if (p_assign) { w->theme_owner = p_owner; w->theme_owner_window = p_owner_window; @@ -2150,14 +2061,13 @@ void Control::_propagate_theme_changed(Node *p_at, Control *p_owner, Window *p_o } void Control::_theme_changed() { - _propagate_theme_changed(this, this, nullptr, false); } void Control::set_theme(const Ref<Theme> &p_theme) { - - if (data.theme == p_theme) + if (data.theme == p_theme) { return; + } if (data.theme.is_valid()) { data.theme->disconnect("changed", callable_mp(this, &Control::_theme_changed)); @@ -2165,12 +2075,10 @@ void Control::set_theme(const Ref<Theme> &p_theme) { data.theme = p_theme; if (!p_theme.is_null()) { - data.theme_owner = this; data.theme_owner_window = nullptr; _propagate_theme_changed(this, this, nullptr); } else { - Control *parent_c = Object::cast_to<Control>(get_parent()); if (parent_c && (parent_c->data.theme_owner || parent_c->data.theme_owner_window)) { @@ -2191,26 +2099,24 @@ void Control::set_theme(const Ref<Theme> &p_theme) { } void Control::accept_event() { - - if (is_inside_tree()) + if (is_inside_tree()) { get_viewport()->_gui_accept_event(); + } } Ref<Theme> Control::get_theme() const { - return data.theme; } void Control::set_tooltip(const String &p_tooltip) { - data.tooltip = p_tooltip; update_configuration_warning(); } String Control::get_tooltip(const Point2 &p_pos) const { - return data.tooltip; } + Control *Control::make_custom_tooltip(const String &p_text) const { if (get_script_instance()) { return const_cast<Control *>(this)->call("_make_custom_tooltip", p_text); @@ -2219,75 +2125,64 @@ Control *Control::make_custom_tooltip(const String &p_text) const { } void Control::set_default_cursor_shape(CursorShape p_shape) { - ERR_FAIL_INDEX(int(p_shape), CURSOR_MAX); data.default_cursor = p_shape; } Control::CursorShape Control::get_default_cursor_shape() const { - return data.default_cursor; } -Control::CursorShape Control::get_cursor_shape(const Point2 &p_pos) const { +Control::CursorShape Control::get_cursor_shape(const Point2 &p_pos) const { return data.default_cursor; } Transform2D Control::get_transform() const { - Transform2D xform = _get_internal_transform(); xform[2] += get_position(); return xform; } String Control::_get_tooltip() const { - return data.tooltip; } void Control::set_focus_neighbour(Margin p_margin, const NodePath &p_neighbour) { - ERR_FAIL_INDEX((int)p_margin, 4); data.focus_neighbour[p_margin] = p_neighbour; } NodePath Control::get_focus_neighbour(Margin p_margin) const { - ERR_FAIL_INDEX_V((int)p_margin, 4, NodePath()); return data.focus_neighbour[p_margin]; } void Control::set_focus_next(const NodePath &p_next) { - data.focus_next = p_next; } NodePath Control::get_focus_next() const { - return data.focus_next; } void Control::set_focus_previous(const NodePath &p_prev) { - data.focus_prev = p_prev; } NodePath Control::get_focus_previous() const { - return data.focus_prev; } #define MAX_NEIGHBOUR_SEARCH_COUNT 512 Control *Control::_get_focus_neighbour(Margin p_margin, int p_count) { - ERR_FAIL_INDEX_V((int)p_margin, 4, nullptr); - if (p_count >= MAX_NEIGHBOUR_SEARCH_COUNT) + if (p_count >= MAX_NEIGHBOUR_SEARCH_COUNT) { return nullptr; + } if (!data.focus_neighbour[p_margin].is_empty()) { - Control *c = nullptr; Node *n = get_node(data.focus_neighbour[p_margin]); if (n) { @@ -2297,12 +2192,15 @@ Control *Control::_get_focus_neighbour(Margin p_margin, int p_count) { return nullptr; } bool valid = true; - if (!c->is_visible()) + if (!c->is_visible()) { valid = false; - if (c->get_focus_mode() == FOCUS_NONE) + } + if (c->get_focus_mode() == FOCUS_NONE) { valid = false; - if (valid) + } + if (valid) { return c; + } c = c->_get_focus_neighbour(p_margin, p_count + 1); return c; @@ -2332,26 +2230,27 @@ Control *Control::_get_focus_neighbour(Margin p_margin, int p_count) { float maxd = -1e7; for (int i = 0; i < 4; i++) { - float d = vdir.dot(points[i]); - if (d > maxd) + if (d > maxd) { maxd = d; + } } Node *base = this; while (base) { - Control *c = Object::cast_to<Control>(base); if (c) { - if (c->data.RI) + if (c->data.RI) { break; + } } base = base->get_parent(); } - if (!base) + if (!base) { return nullptr; + } _window_find_focus_neighbour(vdir, base, points, maxd, dist, &result); @@ -2359,14 +2258,13 @@ Control *Control::_get_focus_neighbour(Margin p_margin, int p_count) { } void Control::_window_find_focus_neighbour(const Vector2 &p_dir, Node *p_at, const Point2 *p_points, float p_min, float &r_closest_dist, Control **r_closest) { - - if (Object::cast_to<Viewport>(p_at)) + if (Object::cast_to<Viewport>(p_at)) { return; //bye + } Control *c = Object::cast_to<Control>(p_at); if (c && c != this && c->get_focus_mode() == FOCUS_ALL && c->is_visible_in_tree()) { - Point2 points[4]; Transform2D xform = c->get_global_transform(); @@ -2379,21 +2277,18 @@ void Control::_window_find_focus_neighbour(const Vector2 &p_dir, Node *p_at, con float min = 1e7; for (int i = 0; i < 4; i++) { - float d = p_dir.dot(points[i]); - if (d < min) + if (d < min) { min = d; + } } if (min > (p_min - CMP_EPSILON)) { - for (int i = 0; i < 4; i++) { - Vector2 la = p_points[i]; Vector2 lb = p_points[(i + 1) % 4]; for (int j = 0; j < 4; j++) { - Vector2 fa = points[j]; Vector2 fb = points[(j + 1) % 4]; @@ -2410,19 +2305,19 @@ void Control::_window_find_focus_neighbour(const Vector2 &p_dir, Node *p_at, con } for (int i = 0; i < p_at->get_child_count(); i++) { - Node *child = p_at->get_child(i); Control *childc = Object::cast_to<Control>(child); - if (childc && childc->data.RI) + if (childc && childc->data.RI) { continue; //subwindow, ignore + } _window_find_focus_neighbour(p_dir, p_at->get_child(i), p_points, p_min, r_closest_dist, r_closest); } } void Control::set_h_size_flags(int p_flags) { - - if (data.h_size_flags == p_flags) + if (data.h_size_flags == p_flags) { return; + } data.h_size_flags = p_flags; emit_signal(SceneStringNames::get_singleton()->size_flags_changed); } @@ -2430,47 +2325,47 @@ void Control::set_h_size_flags(int p_flags) { int Control::get_h_size_flags() const { return data.h_size_flags; } -void Control::set_v_size_flags(int p_flags) { - if (data.v_size_flags == p_flags) +void Control::set_v_size_flags(int p_flags) { + if (data.v_size_flags == p_flags) { return; + } data.v_size_flags = p_flags; emit_signal(SceneStringNames::get_singleton()->size_flags_changed); } void Control::set_stretch_ratio(float p_ratio) { - - if (data.expand == p_ratio) + if (data.expand == p_ratio) { return; + } data.expand = p_ratio; emit_signal(SceneStringNames::get_singleton()->size_flags_changed); } float Control::get_stretch_ratio() const { - return data.expand; } void Control::grab_click_focus() { - ERR_FAIL_COND(!is_inside_tree()); get_viewport()->_gui_grab_click_focus(this); } void Control::minimum_size_changed() { - - if (!is_inside_tree() || data.block_minimum_size_adjust) + if (!is_inside_tree() || data.block_minimum_size_adjust) { return; + } Control *invalidate = this; //invalidate cache upwards while (invalidate && invalidate->data.minimum_size_valid) { invalidate->data.minimum_size_valid = false; - if (invalidate->is_set_as_toplevel()) + if (invalidate->is_set_as_toplevel()) { break; // do not go further up + } if (!invalidate->data.parent && get_parent()) { Window *parent_window = Object::cast_to<Window>(get_parent()); if (parent_window && parent_window->is_wrapping_controls()) { @@ -2480,11 +2375,13 @@ void Control::minimum_size_changed() { invalidate = invalidate->data.parent; } - if (!is_visible_in_tree()) + if (!is_visible_in_tree()) { return; + } - if (data.updating_last_minimum_size) + if (data.updating_last_minimum_size) { return; + } data.updating_last_minimum_size = true; @@ -2496,19 +2393,16 @@ int Control::get_v_size_flags() const { } void Control::set_mouse_filter(MouseFilter p_filter) { - ERR_FAIL_INDEX(p_filter, 3); data.mouse_filter = p_filter; update_configuration_warning(); } Control::MouseFilter Control::get_mouse_filter() const { - return data.mouse_filter; } Control *Control::get_focus_owner() const { - ERR_FAIL_COND_V(!is_inside_tree(), nullptr); return get_viewport()->_gui_get_focus_owner(); } @@ -2533,7 +2427,6 @@ bool Control::is_text_field() const { } void Control::set_rotation(float p_radians) { - data.rotation = p_radians; update(); _notify_transform(); @@ -2541,7 +2434,6 @@ void Control::set_rotation(float p_radians) { } float Control::get_rotation() const { - return data.rotation; } @@ -2554,14 +2446,12 @@ float Control::get_rotation_degrees() const { } void Control::_override_changed() { - notification(NOTIFICATION_THEME_CHANGED); emit_signal(SceneStringNames::get_singleton()->theme_changed); minimum_size_changed(); // overrides are likely to affect minimum size } void Control::set_pivot_offset(const Vector2 &p_pivot) { - data.pivot_offset = p_pivot; update(); _notify_transform(); @@ -2569,39 +2459,38 @@ void Control::set_pivot_offset(const Vector2 &p_pivot) { } Vector2 Control::get_pivot_offset() const { - return data.pivot_offset; } void Control::set_scale(const Vector2 &p_scale) { - data.scale = p_scale; // Avoid having 0 scale values, can lead to errors in physics and rendering. - if (data.scale.x == 0) + if (data.scale.x == 0) { data.scale.x = CMP_EPSILON; - if (data.scale.y == 0) + } + if (data.scale.y == 0) { data.scale.y = CMP_EPSILON; + } update(); _notify_transform(); } -Vector2 Control::get_scale() const { +Vector2 Control::get_scale() const { return data.scale; } Control *Control::get_root_parent_control() const { - const CanvasItem *ci = this; const Control *root = this; while (ci) { - const Control *c = Object::cast_to<Control>(ci); if (c) { root = c; - if (c->data.RI || c->is_toplevel_control()) + if (c->data.RI || c->is_toplevel_control()) { break; + } } ci = ci->get_parent_item(); @@ -2615,23 +2504,19 @@ void Control::set_block_minimum_size_adjust(bool p_block) { } bool Control::is_minimum_size_adjust_blocked() const { - return data.block_minimum_size_adjust; } void Control::set_disable_visibility_clip(bool p_ignore) { - data.disable_visibility_clip = p_ignore; update(); } bool Control::is_visibility_clip_disabled() const { - return data.disable_visibility_clip; } void Control::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { - #ifdef TOOLS_ENABLED const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", 0) ? "'" : "\""; #else @@ -2674,18 +2559,15 @@ String Control::get_configuration_warning() const { } void Control::set_clip_contents(bool p_clip) { - data.clip_contents = p_clip; update(); } bool Control::is_clipping_contents() { - return data.clip_contents; } void Control::set_h_grow_direction(GrowDirection p_direction) { - ERR_FAIL_INDEX((int)p_direction, 3); data.h_grow = p_direction; @@ -2693,24 +2575,21 @@ void Control::set_h_grow_direction(GrowDirection p_direction) { } Control::GrowDirection Control::get_h_grow_direction() const { - return data.h_grow; } void Control::set_v_grow_direction(GrowDirection p_direction) { - ERR_FAIL_INDEX((int)p_direction, 3); data.v_grow = p_direction; _size_changed(); } -Control::GrowDirection Control::get_v_grow_direction() const { +Control::GrowDirection Control::get_v_grow_direction() const { return data.v_grow; } void Control::_bind_methods() { - //ClassDB::bind_method(D_METHOD("_window_resize_event"),&Control::_window_resize_event); ClassDB::bind_method(D_METHOD("_update_minimum_size"), &Control::_update_minimum_size); @@ -2983,8 +2862,8 @@ void Control::_bind_methods() { BIND_VMETHOD(MethodInfo(Variant::BOOL, "has_point", PropertyInfo(Variant::VECTOR2, "point"))); } -Control::Control() { +Control::Control() { data.parent = nullptr; data.mouse_filter = MOUSE_FILTER_STOP; diff --git a/scene/gui/control.h b/scene/gui/control.h index d02fea20a6..10d6ad168f 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -44,7 +44,6 @@ class Label; class Panel; class Control : public CanvasItem { - GDCLASS(Control, CanvasItem); OBJ_CATEGORY("GUI Nodes"); @@ -132,17 +131,16 @@ public: private: struct CComparator { - bool operator()(const Control *p_a, const Control *p_b) const { - if (p_a->get_canvas_layer() == p_b->get_canvas_layer()) + if (p_a->get_canvas_layer() == p_b->get_canvas_layer()) { return p_b->is_greater_than(p_a); + } return p_a->get_canvas_layer() < p_b->get_canvas_layer(); } }; struct Data { - Point2 pos_cache; Size2 size_cache; Size2 minimum_size_cache; diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp index 5654219a3e..c6897fc684 100644 --- a/scene/gui/dialogs.cpp +++ b/scene/gui/dialogs.cpp @@ -55,11 +55,9 @@ void AcceptDialog::_parent_focused() { } void AcceptDialog::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_VISIBILITY_CHANGED: { if (is_visible()) { - get_ok()->grab_focus(); _update_child_rects(); parent_visible = get_parent_visible_window(); @@ -98,20 +96,18 @@ void AcceptDialog::_notification(int p_what) { } void AcceptDialog::_text_entered(const String &p_text) { - _ok_pressed(); } void AcceptDialog::_ok_pressed() { - - if (hide_on_ok) + if (hide_on_ok) { set_visible(false); + } ok_pressed(); emit_signal("confirmed"); } void AcceptDialog::_cancel_pressed() { - Window *parent_window = parent_visible; if (parent_visible) { parent_visible->disconnect("focus_entered", callable_mp(this, &AcceptDialog::_parent_focused)); @@ -130,11 +126,10 @@ void AcceptDialog::_cancel_pressed() { } String AcceptDialog::get_text() const { - return label->get_text(); } -void AcceptDialog::set_text(String p_text) { +void AcceptDialog::set_text(String p_text) { label->set_text(p_text); child_controls_changed(); if (is_visible()) { @@ -143,33 +138,30 @@ void AcceptDialog::set_text(String p_text) { } void AcceptDialog::set_hide_on_ok(bool p_hide) { - hide_on_ok = p_hide; } -bool AcceptDialog::get_hide_on_ok() const { +bool AcceptDialog::get_hide_on_ok() const { return hide_on_ok; } void AcceptDialog::set_autowrap(bool p_autowrap) { - label->set_autowrap(p_autowrap); } -bool AcceptDialog::has_autowrap() { +bool AcceptDialog::has_autowrap() { return label->has_autowrap(); } void AcceptDialog::register_text_enter(Node *p_line_edit) { - ERR_FAIL_NULL(p_line_edit); LineEdit *line_edit = Object::cast_to<LineEdit>(p_line_edit); - if (line_edit) + if (line_edit) { line_edit->connect("text_entered", callable_mp(this, &AcceptDialog::_text_entered)); + } } void AcceptDialog::_update_child_rects() { - Size2 label_size = label->get_minimum_size(); if (label->get_text().empty()) { label_size.height = 0; @@ -183,11 +175,13 @@ void AcceptDialog::_update_child_rects() { for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; + } - if (c == hbc || c == label || c == bg || c->is_set_as_toplevel()) + if (c == hbc || c == label || c == bg || c->is_set_as_toplevel()) { continue; + } c->set_position(cpos); c->set_size(csize); @@ -204,17 +198,18 @@ void AcceptDialog::_update_child_rects() { } Size2 AcceptDialog::_get_contents_minimum_size() const { - int margin = hbc->get_theme_constant("margin", "Dialogs"); Size2 minsize = label->get_combined_minimum_size(); for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; + } - if (c == hbc || c == label || c->is_set_as_toplevel()) + if (c == hbc || c == label || c->is_set_as_toplevel()) { continue; + } Size2 cminsize = c->get_combined_minimum_size(); minsize.x = MAX(cminsize.x, minsize.x); @@ -233,20 +228,17 @@ Size2 AcceptDialog::_get_contents_minimum_size() const { } void AcceptDialog::_custom_action(const String &p_action) { - emit_signal("custom_action", p_action); custom_action(p_action); } Button *AcceptDialog::add_button(const String &p_text, bool p_right, const String &p_action) { - Button *button = memnew(Button); button->set_text(p_text); if (p_right) { hbc->add_child(button); hbc->add_spacer(); } else { - hbc->add_child(button); hbc->move_child(button, 0); hbc->add_spacer(true); @@ -260,17 +252,16 @@ Button *AcceptDialog::add_button(const String &p_text, bool p_right, const Strin } Button *AcceptDialog::add_cancel(const String &p_cancel) { - String c = p_cancel; - if (p_cancel == "") + if (p_cancel == "") { c = RTR("Cancel"); + } Button *b = swap_ok_cancel ? add_button(c, true) : add_button(c); b->connect("pressed", callable_mp(this, &AcceptDialog::_cancel_pressed)); return b; } void AcceptDialog::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_ok"), &AcceptDialog::get_ok); ClassDB::bind_method(D_METHOD("get_label"), &AcceptDialog::get_label); ClassDB::bind_method(D_METHOD("set_hide_on_ok", "enabled"), &AcceptDialog::set_hide_on_ok); @@ -295,12 +286,10 @@ void AcceptDialog::_bind_methods() { bool AcceptDialog::swap_ok_cancel = false; void AcceptDialog::set_swap_ok_cancel(bool p_swap) { - swap_ok_cancel = p_swap; } AcceptDialog::AcceptDialog() { - parent_visible = nullptr; set_wrap_controls(true); @@ -344,17 +333,14 @@ AcceptDialog::~AcceptDialog() { // ConfirmationDialog void ConfirmationDialog::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_cancel"), &ConfirmationDialog::get_cancel); } Button *ConfirmationDialog::get_cancel() { - return cancel; } ConfirmationDialog::ConfirmationDialog() { - set_title(RTR("Please Confirm...")); #ifdef TOOLS_ENABLED set_min_size(Size2(200, 70) * EDSCALE); diff --git a/scene/gui/dialogs.h b/scene/gui/dialogs.h index b68b4297d7..5d7b6272bf 100644 --- a/scene/gui/dialogs.h +++ b/scene/gui/dialogs.h @@ -42,7 +42,6 @@ class LineEdit; class AcceptDialog : public Window { - GDCLASS(AcceptDialog, Window); Window *parent_visible; @@ -98,7 +97,6 @@ public: }; class ConfirmationDialog : public AcceptDialog { - GDCLASS(ConfirmationDialog, AcceptDialog); Button *cancel; diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index a449d680a8..be6b542ae1 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -45,7 +45,6 @@ VBoxContainer *FileDialog::get_vbox() { } void FileDialog::_theme_changed() { - Color font_color = vbox->get_theme_color("font_color", "ToolButton"); Color font_color_hover = vbox->get_theme_color("font_color_hover", "ToolButton"); Color font_color_pressed = vbox->get_theme_color("font_color_pressed", "ToolButton"); @@ -64,15 +63,12 @@ void FileDialog::_theme_changed() { } void FileDialog::_notification(int p_what) { - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { if (!is_visible()) { - set_process_unhandled_input(false); } } if (p_what == NOTIFICATION_ENTER_TREE) { - dir_up->set_icon(vbox->get_theme_icon("parent_folder", "FileDialog")); refresh->set_icon(vbox->get_theme_icon("reload", "FileDialog")); show_hidden->set_icon(vbox->get_theme_icon("toggle_hidden", "FileDialog")); @@ -81,18 +77,13 @@ void FileDialog::_notification(int p_what) { } void FileDialog::_unhandled_input(const Ref<InputEvent> &p_event) { - Ref<InputEventKey> k = p_event; if (k.is_valid() && has_focus()) { - if (k->is_pressed()) { - bool handled = true; switch (k->get_keycode()) { - case KEY_H: { - if (k->get_command()) { set_show_hidden_files(!show_hidden_files); } else { @@ -101,11 +92,9 @@ void FileDialog::_unhandled_input(const Ref<InputEvent> &p_event) { } break; case KEY_F5: { - invalidate(); } break; case KEY_BACKSPACE: { - _dir_entered(".."); } break; default: { @@ -113,24 +102,22 @@ void FileDialog::_unhandled_input(const Ref<InputEvent> &p_event) { } } - if (handled) + if (handled) { set_input_as_handled(); + } } } } void FileDialog::set_enable_multiple_selection(bool p_enable) { - tree->set_select_mode(p_enable ? Tree::SELECT_MULTI : Tree::SELECT_SINGLE); }; Vector<String> FileDialog::get_selected_files() const { - Vector<String> list; TreeItem *item = tree->get_root(); while ((item = tree->get_next_selected(item))) { - list.push_back(dir_access->get_current_dir().plus_file(item->get_text(0))); }; @@ -138,7 +125,6 @@ Vector<String> FileDialog::get_selected_files() const { }; void FileDialog::update_dir() { - dir->set_text(dir_access->get_current_dir(false)); if (drives->is_visible()) { @@ -150,7 +136,6 @@ void FileDialog::update_dir() { } void FileDialog::_dir_entered(String p_dir) { - dir_access->change_dir(p_dir); file->set_text(""); invalidate(); @@ -158,7 +143,6 @@ void FileDialog::_dir_entered(String p_dir) { } void FileDialog::_file_entered(const String &p_file) { - _action_pressed(); } @@ -169,16 +153,16 @@ void FileDialog::_save_confirm_pressed() { } void FileDialog::_post_popup() { - ConfirmationDialog::_post_popup(); if (invalidated) { update_file_list(); invalidated = false; } - if (mode == FILE_MODE_SAVE_FILE) + if (mode == FILE_MODE_SAVE_FILE) { file->grab_focus(); - else + } else { tree->grab_focus(); + } set_process_unhandled_input(true); @@ -192,15 +176,12 @@ void FileDialog::_post_popup() { } void FileDialog::_action_pressed() { - if (mode == FILE_MODE_OPEN_FILES) { - TreeItem *ti = tree->get_next_selected(nullptr); String fbase = dir_access->get_current_dir(); Vector<String> files; while (ti) { - files.push_back(fbase.plus_file(ti->get_text(0))); ti = tree->get_next_selected(ti); } @@ -219,7 +200,6 @@ void FileDialog::_action_pressed() { emit_signal("file_selected", f); hide(); } else if (mode == FILE_MODE_OPEN_ANY || mode == FILE_MODE_OPEN_DIR) { - String path = dir_access->get_current_dir(); path = path.replace("\\", "/"); @@ -236,7 +216,6 @@ void FileDialog::_action_pressed() { } if (mode == FILE_MODE_SAVE_FILE) { - bool valid = false; if (filter->get_selected() == filter->get_item_count() - 1) { @@ -244,29 +223,27 @@ void FileDialog::_action_pressed() { } else if (filters.size() > 1 && filter->get_selected() == 0) { // match all filters for (int i = 0; i < filters.size(); i++) { - String flt = filters[i].get_slice(";", 0); for (int j = 0; j < flt.get_slice_count(","); j++) { - String str = flt.get_slice(",", j).strip_edges(); if (f.match(str)) { valid = true; break; } } - if (valid) + if (valid) { break; + } } } else { int idx = filter->get_selected(); - if (filters.size() > 1) + if (filters.size() > 1) { idx--; + } if (idx >= 0 && idx < filters.size()) { - String flt = filters[idx].get_slice(";", 0); int filterSliceCount = flt.get_slice_count(","); for (int j = 0; j < filterSliceCount; j++) { - String str = (flt.get_slice(",", j).strip_edges()); if (f.match(str)) { valid = true; @@ -286,7 +263,6 @@ void FileDialog::_action_pressed() { } if (!valid) { - exterr->popup_centered(Size2(250, 80)); return; } @@ -295,7 +271,6 @@ void FileDialog::_action_pressed() { confirm_save->set_text(RTR("File Exists, Overwrite?")); confirm_save->popup_centered(Size2(200, 80)); } else { - emit_signal("file_selected", f); hide(); } @@ -303,27 +278,28 @@ void FileDialog::_action_pressed() { } void FileDialog::_cancel_pressed() { - file->set_text(""); invalidate(); hide(); } bool FileDialog::_is_open_should_be_disabled() { - - if (mode == FILE_MODE_OPEN_ANY || mode == FILE_MODE_SAVE_FILE) + if (mode == FILE_MODE_OPEN_ANY || mode == FILE_MODE_SAVE_FILE) { return false; + } TreeItem *ti = tree->get_next_selected(tree->get_root()); while (ti) { TreeItem *prev_ti = ti; ti = tree->get_next_selected(tree->get_root()); - if (ti == prev_ti) + if (ti == prev_ti) { break; + } } // We have something that we can't select? - if (!ti) + if (!ti) { return mode != FILE_MODE_OPEN_DIR; // In "Open folder" mode, having nothing selected picks the current folder. + } Dictionary d = ti->get_metadata(0); @@ -333,14 +309,12 @@ bool FileDialog::_is_open_should_be_disabled() { } void FileDialog::_go_up() { - dir_access->change_dir(".."); update_file_list(); update_dir(); } void FileDialog::deselect_items() { - // Clear currently selected items in file manager. tree->deselect_all(); @@ -349,7 +323,6 @@ void FileDialog::deselect_items() { get_ok()->set_disabled(_is_open_should_be_disabled()); switch (mode) { - case FILE_MODE_OPEN_FILE: case FILE_MODE_OPEN_FILES: get_ok()->set_text(RTR("Open")); @@ -370,14 +343,13 @@ void FileDialog::_tree_multi_selected(Object *p_object, int p_cell, bool p_selec } void FileDialog::_tree_selected() { - TreeItem *ti = tree->get_selected(); - if (!ti) + if (!ti) { return; + } Dictionary d = ti->get_metadata(0); if (!d["dir"]) { - file->set_text(d["name"]); } else if (mode == FILE_MODE_OPEN_DIR) { get_ok()->set_text(RTR("Select This Folder")); @@ -387,22 +359,21 @@ void FileDialog::_tree_selected() { } void FileDialog::_tree_item_activated() { - TreeItem *ti = tree->get_selected(); - if (!ti) + if (!ti) { return; + } Dictionary d = ti->get_metadata(0); if (d["dir"]) { - dir_access->change_dir(d["name"]); - if (mode == FILE_MODE_OPEN_FILE || mode == FILE_MODE_OPEN_FILES || mode == FILE_MODE_OPEN_DIR || mode == FILE_MODE_OPEN_ANY) + if (mode == FILE_MODE_OPEN_FILE || mode == FILE_MODE_OPEN_FILES || mode == FILE_MODE_OPEN_DIR || mode == FILE_MODE_OPEN_ANY) { file->set_text(""); + } call_deferred("_update_file_list"); call_deferred("_update_dir"); } else { - _action_pressed(); } } @@ -410,8 +381,9 @@ void FileDialog::_tree_item_activated() { void FileDialog::update_file_name() { int idx = filter->get_selected() - 1; if ((idx == -1 && filter->get_item_count() == 2) || (filter->get_item_count() > 2 && idx >= 0 && idx < filter->get_item_count() - 2)) { - if (idx == -1) + if (idx == -1) { idx += 1; + } String filter_str = filters[idx]; String file_str = file->get_text(); String base_name = file_str.get_basename(); @@ -421,7 +393,6 @@ void FileDialog::update_file_name() { } void FileDialog::update_file_list() { - tree->clear(); // Scroll back to the top after opening a directory @@ -439,17 +410,18 @@ void FileDialog::update_file_list() { String item; while ((item = dir_access->get_next()) != "") { - - if (item == "." || item == "..") + if (item == "." || item == "..") { continue; + } is_hidden = dir_access->current_is_hidden(); if (show_hidden_files || !is_hidden) { - if (!dir_access->current_is_dir()) + if (!dir_access->current_is_dir()) { files.push_back(item); - else + } else { dirs.push_back(item); + } } } @@ -475,28 +447,24 @@ void FileDialog::update_file_list() { List<String> patterns; // build filter if (filter->get_selected() == filter->get_item_count() - 1) { - // match all } else if (filters.size() > 1 && filter->get_selected() == 0) { // match all filters for (int i = 0; i < filters.size(); i++) { - String f = filters[i].get_slice(";", 0); for (int j = 0; j < f.get_slice_count(","); j++) { - patterns.push_back(f.get_slice(",", j).strip_edges()); } } } else { int idx = filter->get_selected(); - if (filters.size() > 1) + if (filters.size() > 1) { idx--; + } if (idx >= 0 && idx < filters.size()) { - String f = filters[idx].get_slice(";", 0); for (int j = 0; j < f.get_slice_count(","); j++) { - patterns.push_back(f.get_slice(",", j).strip_edges()); } } @@ -505,12 +473,10 @@ void FileDialog::update_file_list() { String base_dir = dir_access->get_current_dir(); while (!files.empty()) { - bool match = patterns.empty(); String match_str; for (List<String>::Element *E = patterns.front(); E; E = E->next()) { - if (files.front()->get().matchn(E->get())) { match_str = E->get(); match = true; @@ -523,7 +489,6 @@ void FileDialog::update_file_list() { ti->set_text(0, files.front()->get()); if (get_icon_func) { - Ref<Texture2D> icon = get_icon_func(base_dir.plus_file(files.front()->get())); ti->set_icon(0, icon); } @@ -537,25 +502,25 @@ void FileDialog::update_file_list() { d["dir"] = false; ti->set_metadata(0, d); - if (file->get_text() == files.front()->get() || match_str == files.front()->get()) + if (file->get_text() == files.front()->get() || match_str == files.front()->get()) { ti->select(0); + } } files.pop_front(); } - if (tree->get_root() && tree->get_root()->get_children() && tree->get_selected() == nullptr) + if (tree->get_root() && tree->get_root()->get_children() && tree->get_selected() == nullptr) { tree->get_root()->get_children()->select(0); + } } void FileDialog::_filter_selected(int) { - update_file_name(); update_file_list(); } void FileDialog::update_filters() { - filter->clear(); if (filters.size() > 1) { @@ -565,37 +530,38 @@ void FileDialog::update_filters() { for (int i = 0; i < MIN(max_filters, filters.size()); i++) { String flt = filters[i].get_slice(";", 0).strip_edges(); - if (i > 0) + if (i > 0) { all_filters += ", "; + } all_filters += flt; } - if (max_filters < filters.size()) + if (max_filters < filters.size()) { all_filters += ", ..."; + } filter->add_item(RTR("All Recognized") + " (" + all_filters + ")"); } for (int i = 0; i < filters.size(); i++) { - String flt = filters[i].get_slice(";", 0).strip_edges(); String desc = filters[i].get_slice(";", 1).strip_edges(); - if (desc.length()) + if (desc.length()) { filter->add_item(String(tr(desc)) + " (" + flt + ")"); - else + } else { filter->add_item("(" + flt + ")"); + } } filter->add_item(RTR("All Files (*)")); } void FileDialog::clear_filters() { - filters.clear(); update_filters(); invalidate(); } -void FileDialog::add_filter(const String &p_filter) { +void FileDialog::add_filter(const String &p_filter) { filters.push_back(p_filter); update_filters(); invalidate(); @@ -612,45 +578,44 @@ Vector<String> FileDialog::get_filters() const { } String FileDialog::get_current_dir() const { - return dir->get_text(); } -String FileDialog::get_current_file() const { +String FileDialog::get_current_file() const { return file->get_text(); } -String FileDialog::get_current_path() const { +String FileDialog::get_current_path() const { return dir->get_text().plus_file(file->get_text()); } -void FileDialog::set_current_dir(const String &p_dir) { +void FileDialog::set_current_dir(const String &p_dir) { dir_access->change_dir(p_dir); update_dir(); invalidate(); } -void FileDialog::set_current_file(const String &p_file) { +void FileDialog::set_current_file(const String &p_file) { file->set_text(p_file); update_dir(); invalidate(); int lp = p_file.find_last("."); if (lp != -1) { file->select(0, lp); - if (file->is_inside_tree() && !get_tree()->is_node_being_edited(file)) + if (file->is_inside_tree() && !get_tree()->is_node_being_edited(file)) { file->grab_focus(); + } } } -void FileDialog::set_current_path(const String &p_path) { - if (!p_path.size()) +void FileDialog::set_current_path(const String &p_path) { + if (!p_path.size()) { return; + } int pos = MAX(p_path.find_last("/"), p_path.find_last("\\")); if (pos == -1) { - set_current_file(p_path); } else { - String dir = p_path.substr(0, pos); String file = p_path.substr(pos + 1, p_path.length()); set_current_dir(dir); @@ -667,40 +632,43 @@ bool FileDialog::is_mode_overriding_title() const { } void FileDialog::set_file_mode(FileMode p_mode) { - ERR_FAIL_INDEX((int)p_mode, 5); mode = p_mode; switch (mode) { - case FILE_MODE_OPEN_FILE: get_ok()->set_text(RTR("Open")); - if (mode_overrides_title) + if (mode_overrides_title) { set_title(RTR("Open a File")); + } makedir->hide(); break; case FILE_MODE_OPEN_FILES: get_ok()->set_text(RTR("Open")); - if (mode_overrides_title) + if (mode_overrides_title) { set_title(RTR("Open File(s)")); + } makedir->hide(); break; case FILE_MODE_OPEN_DIR: get_ok()->set_text(RTR("Select Current Folder")); - if (mode_overrides_title) + if (mode_overrides_title) { set_title(RTR("Open a Directory")); + } makedir->show(); break; case FILE_MODE_OPEN_ANY: get_ok()->set_text(RTR("Open")); - if (mode_overrides_title) + if (mode_overrides_title) { set_title(RTR("Open a File or Directory")); + } makedir->show(); break; case FILE_MODE_SAVE_FILE: get_ok()->set_text(RTR("Save")); - if (mode_overrides_title) + if (mode_overrides_title) { set_title(RTR("Save a File")); + } makedir->show(); break; } @@ -713,27 +681,23 @@ void FileDialog::set_file_mode(FileMode p_mode) { } FileDialog::FileMode FileDialog::get_file_mode() const { - return mode; } void FileDialog::set_access(Access p_access) { - ERR_FAIL_INDEX(p_access, 3); - if (access == p_access) + if (access == p_access) { return; + } memdelete(dir_access); switch (p_access) { case ACCESS_FILESYSTEM: { - dir_access = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); } break; case ACCESS_RESOURCES: { - dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES); } break; case ACCESS_USERDATA: { - dir_access = DirAccess::create(DirAccess::ACCESS_USERDATA); } break; } @@ -745,7 +709,6 @@ void FileDialog::set_access(Access p_access) { } void FileDialog::invalidate() { - if (is_visible()) { update_file_list(); invalidated = false; @@ -755,12 +718,10 @@ void FileDialog::invalidate() { } FileDialog::Access FileDialog::get_access() const { - return access; } void FileDialog::_make_dir_confirm() { - Error err = dir_access->make_dir(makedirname->get_text()); if (err == OK) { dir_access->change_dir(makedirname->get_text()); @@ -774,13 +735,11 @@ void FileDialog::_make_dir_confirm() { } void FileDialog::_make_dir() { - makedialog->popup_centered(Size2(250, 80)); makedirname->grab_focus(); } void FileDialog::_select_drive(int p_idx) { - String d = drives->get_item_text(p_idx); dir_access->change_dir(d); file->set_text(""); @@ -789,7 +748,6 @@ void FileDialog::_select_drive(int p_idx) { } void FileDialog::_update_drives() { - int dc = dir_access->get_drive_count(); if (dc == 0 || access != ACCESS_FILESYSTEM) { drives->hide(); @@ -814,7 +772,6 @@ void FileDialog::_update_drives() { bool FileDialog::default_show_hidden_files = false; void FileDialog::_bind_methods() { - ClassDB::bind_method(D_METHOD("_unhandled_input"), &FileDialog::_unhandled_input); ClassDB::bind_method(D_METHOD("_cancel_pressed"), &FileDialog::_cancel_pressed); @@ -884,7 +841,6 @@ void FileDialog::set_default_show_hidden_files(bool p_show) { } FileDialog::FileDialog() { - show_hidden_files = default_show_hidden_files; mode_overrides_title = true; @@ -997,13 +953,14 @@ FileDialog::FileDialog() { set_hide_on_ok(false); invalidated = true; - if (register_func) + if (register_func) { register_func(this); + } } FileDialog::~FileDialog() { - - if (unregister_func) + if (unregister_func) { unregister_func(this); + } memdelete(dir_access); } diff --git a/scene/gui/file_dialog.h b/scene/gui/file_dialog.h index ac0e733abc..8bc536d576 100644 --- a/scene/gui/file_dialog.h +++ b/scene/gui/file_dialog.h @@ -40,7 +40,6 @@ #include "scene/gui/tree.h" class FileDialog : public ConfirmationDialog { - GDCLASS(FileDialog, ConfirmationDialog); public: diff --git a/scene/gui/gradient_edit.cpp b/scene/gui/gradient_edit.cpp index a6ed3d8de9..ecd4ad17ea 100644 --- a/scene/gui/gradient_edit.cpp +++ b/scene/gui/gradient_edit.cpp @@ -73,8 +73,9 @@ int GradientEdit::_get_point_from_pos(int x) { } void GradientEdit::_show_color_picker() { - if (grabbed == -1) + if (grabbed == -1) { return; + } picker->set_pick_color(points[grabbed].color); Size2 minsize = popup->get_contents_minimum_size(); bool show_above = false; @@ -93,11 +94,9 @@ GradientEdit::~GradientEdit() { } void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { - Ref<InputEventKey> k = p_event; if (k.is_valid() && k->is_pressed() && k->get_keycode() == KEY_DELETE && grabbed != -1) { - points.remove(grabbed); grabbed = -1; grabbing = false; @@ -129,7 +128,6 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { //Hold alt key to duplicate selected color if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed() && mb->get_alt()) { - int x = mb->get_position().x; grabbed = _get_point_from_pos(x); @@ -154,7 +152,6 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { //select if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed()) { - update(); int x = mb->get_position().x; int total_w = get_size().width - get_size().height - SPACING; @@ -182,12 +179,12 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { int pos = -1; for (int i = 0; i < points.size(); i++) { - if (points[i].offset < newPoint.offset) + if (points[i].offset < newPoint.offset) { pos = i; + } } if (pos == -1) { - prev.color = Color(0, 0, 0); prev.offset = 0; if (points.size()) { @@ -197,7 +194,6 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { next.offset = 1.0; } } else { - if (pos == points.size() - 1) { next.color = Color(1, 1, 1); next.offset = 1.0; @@ -222,7 +218,6 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { } if (mb.is_valid() && mb->get_button_index() == 1 && !mb->is_pressed()) { - if (grabbing) { grabbing = false; emit_signal("ramp_changed"); @@ -233,7 +228,6 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid() && grabbing) { - int total_w = get_size().width - get_size().height - SPACING; int x = mm->get_position().x; @@ -256,24 +250,25 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { if (temp_ofs < smallest_ofs) { smallest_ofs = temp_ofs; nearest_point = i; - if (found) + if (found) { break; + } found = true; } } } if (found) { - if (points[nearest_point].offset < newofs) + if (points[nearest_point].offset < newofs) { newofs = points[nearest_point].offset + 0.00001; - else + } else { newofs = points[nearest_point].offset - 0.00001; + } newofs = CLAMP(newofs, 0, 1); } } bool valid = true; for (int i = 0; i < points.size(); i++) { - if (points[i].offset == newofs && i != grabbed) { valid = false; break; @@ -300,19 +295,18 @@ void GradientEdit::_gui_input(const Ref<InputEvent> &p_event) { } void GradientEdit::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { if (!picker->is_connected("color_changed", callable_mp(this, &GradientEdit::_color_changed))) { picker->connect("color_changed", callable_mp(this, &GradientEdit::_color_changed)); } } if (p_what == NOTIFICATION_DRAW) { - int w = get_size().x; int h = get_size().y; - if (w == 0 || h == 0) + if (w == 0 || h == 0) { return; //Safety check. We have division by 'h'. And in any case there is nothing to draw with such size + } int total_w = get_size().width - get_size().height - SPACING; @@ -322,20 +316,21 @@ void GradientEdit::_notification(int p_what) { //Draw color ramp Gradient::Point prev; prev.offset = 0; - if (points.size() == 0) + if (points.size() == 0) { prev.color = Color(0, 0, 0); //Draw black rectangle if we have no points - else + } else { prev.color = points[0].color; //Extend color of first point to the beginning. + } for (int i = -1; i < points.size(); i++) { - Gradient::Point next; //If there is no next point if (i + 1 == points.size()) { - if (points.size() == 0) + if (points.size() == 0) { next.color = Color(0, 0, 0); //Draw black rectangle if we have no points - else + } else { next.color = points[i].color; //Extend color of last point to the end. + } next.offset = 1; } else { next = points[i + 1]; @@ -362,7 +357,6 @@ void GradientEdit::_notification(int p_what) { //Draw point markers for (int i = 0; i < points.size(); i++) { - Color col = points[i].color.contrasted(); col.a = 0.9; @@ -397,7 +391,6 @@ void GradientEdit::_notification(int p_what) { //Draw borders around color ramp if in focus if (has_focus()) { - draw_line(Vector2(-1, -1), Vector2(total_w + 1, -1), Color(1, 1, 1, 0.6)); draw_line(Vector2(total_w + 1, -1), Vector2(total_w + 1, h + 1), Color(1, 1, 1, 0.6)); draw_line(Vector2(total_w + 1, h + 1), Vector2(-1, h + 1), Color(1, 1, 1, 0.6)); @@ -406,7 +399,6 @@ void GradientEdit::_notification(int p_what) { } if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (!is_visible()) { grabbing = false; } @@ -435,21 +427,19 @@ void GradientEdit::_draw_checker(int x, int y, int w, int h) { } Size2 GradientEdit::get_minimum_size() const { - return Vector2(0, 16); } void GradientEdit::_color_changed(const Color &p_color) { - - if (grabbed == -1) + if (grabbed == -1) { return; + } points.write[grabbed].color = p_color; update(); emit_signal("ramp_changed"); } void GradientEdit::set_ramp(const Vector<float> &p_offsets, const Vector<Color> &p_colors) { - ERR_FAIL_COND(p_offsets.size() != p_colors.size()); points.clear(); for (int i = 0; i < p_offsets.size(); i++) { @@ -465,21 +455,24 @@ void GradientEdit::set_ramp(const Vector<float> &p_offsets, const Vector<Color> Vector<float> GradientEdit::get_offsets() const { Vector<float> ret; - for (int i = 0; i < points.size(); i++) + for (int i = 0; i < points.size(); i++) { ret.push_back(points[i].offset); + } return ret; } Vector<Color> GradientEdit::get_colors() const { Vector<Color> ret; - for (int i = 0; i < points.size(); i++) + for (int i = 0; i < points.size(); i++) { ret.push_back(points[i].color); + } return ret; } void GradientEdit::set_points(Vector<Gradient::Point> &p_points) { - if (points.size() != p_points.size()) + if (points.size() != p_points.size()) { grabbed = -1; + } points.clear(); points = p_points; } diff --git a/scene/gui/gradient_edit.h b/scene/gui/gradient_edit.h index a38a3dde47..376837b66c 100644 --- a/scene/gui/gradient_edit.h +++ b/scene/gui/gradient_edit.h @@ -37,7 +37,6 @@ #include "scene/resources/gradient.h" class GradientEdit : public Control { - GDCLASS(GradientEdit, Control); PopupPanel *popup; diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp index 0bf67df9b4..5489638125 100644 --- a/scene/gui/graph_edit.cpp +++ b/scene/gui/graph_edit.cpp @@ -44,19 +44,17 @@ #define MAX_ZOOM (1 * ZOOM_SCALE * ZOOM_SCALE * ZOOM_SCALE) bool GraphEditFilter::has_point(const Point2 &p_point) const { - return ge->_filter_input(p_point); } GraphEditFilter::GraphEditFilter(GraphEdit *p_edit) { - ge = p_edit; } Error GraphEdit::connect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port) { - - if (is_node_connected(p_from, p_from_port, p_to, p_to_port)) + if (is_node_connected(p_from, p_from_port, p_to, p_to_port)) { return OK; + } Connection c; c.from = p_from; c.from_port = p_from_port; @@ -72,22 +70,18 @@ Error GraphEdit::connect_node(const StringName &p_from, int p_from_port, const S } bool GraphEdit::is_node_connected(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port) { - for (List<Connection>::Element *E = connections.front(); E; E = E->next()) { - - if (E->get().from == p_from && E->get().from_port == p_from_port && E->get().to == p_to && E->get().to_port == p_to_port) + if (E->get().from == p_from && E->get().from_port == p_from_port && E->get().to == p_to && E->get().to_port == p_to_port) { return true; + } } return false; } void GraphEdit::disconnect_node(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port) { - for (List<Connection>::Element *E = connections.front(); E; E = E->next()) { - if (E->get().from == p_from && E->get().from_port == p_from_port && E->get().to == p_to && E->get().to_port == p_to_port) { - connections.erase(E); top_layer->update(); update(); @@ -98,17 +92,14 @@ void GraphEdit::disconnect_node(const StringName &p_from, int p_from_port, const } bool GraphEdit::clips_input() const { - return true; } void GraphEdit::get_connection_list(List<Connection> *r_connections) const { - *r_connections = connections; } void GraphEdit::set_scroll_ofs(const Vector2 &p_ofs) { - setting_scroll_ofs = true; h_scroll->set_value(p_ofs.x); v_scroll->set_value(p_ofs.y); @@ -117,12 +108,10 @@ void GraphEdit::set_scroll_ofs(const Vector2 &p_ofs) { } Vector2 GraphEdit::get_scroll_ofs() const { - return Vector2(h_scroll->get_value(), v_scroll->get_value()); } void GraphEdit::_scroll_moved(double) { - if (!awaiting_scroll_offset_update) { call_deferred("_update_scroll_offset"); awaiting_scroll_offset_update = true; @@ -136,14 +125,13 @@ void GraphEdit::_scroll_moved(double) { } void GraphEdit::_update_scroll_offset() { - set_block_minimum_size_adjust(true); for (int i = 0; i < get_child_count(); i++) { - GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (!gn) + if (!gn) { continue; + } Point2 pos = gn->get_offset() * zoom; pos -= Point2(h_scroll->get_value(), v_scroll->get_value()); @@ -159,9 +147,9 @@ void GraphEdit::_update_scroll_offset() { } void GraphEdit::_update_scroll() { - - if (updating) + if (updating) { return; + } updating = true; @@ -169,10 +157,10 @@ void GraphEdit::_update_scroll() { Rect2 screen; for (int i = 0; i < get_child_count(); i++) { - GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (!gn) + if (!gn) { continue; + } Rect2 r; r.position = gn->get_offset() * zoom; @@ -186,19 +174,21 @@ void GraphEdit::_update_scroll() { h_scroll->set_min(screen.position.x); h_scroll->set_max(screen.position.x + screen.size.x); h_scroll->set_page(get_size().x); - if (h_scroll->get_max() - h_scroll->get_min() <= h_scroll->get_page()) + if (h_scroll->get_max() - h_scroll->get_min() <= h_scroll->get_page()) { h_scroll->hide(); - else + } else { h_scroll->show(); + } v_scroll->set_min(screen.position.y); v_scroll->set_max(screen.position.y + screen.size.y); v_scroll->set_page(get_size().y); - if (v_scroll->get_max() - v_scroll->get_min() <= v_scroll->get_page()) + if (v_scroll->get_max() - v_scroll->get_min() <= v_scroll->get_page()) { v_scroll->hide(); - else + } else { v_scroll->show(); + } Size2 hmin = h_scroll->get_combined_minimum_size(); Size2 vmin = v_scroll->get_combined_minimum_size(); @@ -218,7 +208,6 @@ void GraphEdit::_update_scroll() { } void GraphEdit::_graph_node_raised(Node *p_gn) { - GraphNode *gn = Object::cast_to<GraphNode>(p_gn); ERR_FAIL_COND(!gn); if (gn->is_comment()) { @@ -241,7 +230,6 @@ void GraphEdit::_graph_node_raised(Node *p_gn) { } void GraphEdit::_graph_node_moved(Node *p_gn) { - GraphNode *gn = Object::cast_to<GraphNode>(p_gn); ERR_FAIL_COND(!gn); top_layer->update(); @@ -250,7 +238,6 @@ void GraphEdit::_graph_node_moved(Node *p_gn) { } void GraphEdit::add_child_notify(Node *p_child) { - Control::add_child_notify(p_child); top_layer->call_deferred("raise"); //top layer always on top! @@ -266,7 +253,6 @@ void GraphEdit::add_child_notify(Node *p_child) { } void GraphEdit::remove_child_notify(Node *p_child) { - Control::remove_child_notify(p_child); if (is_inside_tree()) { top_layer->call_deferred("raise"); //top layer always on top! @@ -279,7 +265,6 @@ void GraphEdit::remove_child_notify(Node *p_child) { } void GraphEdit::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { port_grab_distance_horizontal = get_theme_constant("port_grab_distance_horizontal"); port_grab_distance_vertical = get_theme_constant("port_grab_distance_vertical"); @@ -304,7 +289,6 @@ void GraphEdit::_notification(int p_what) { v_scroll->set_anchor_and_margin(MARGIN_BOTTOM, ANCHOR_END, 0); } if (p_what == NOTIFICATION_DRAW) { - draw_style_box(get_theme_stylebox("bg"), Rect2(Point2(), get_size())); if (is_using_snap()) { @@ -322,26 +306,26 @@ void GraphEdit::_notification(int p_what) { Color grid_major = get_theme_color("grid_major"); for (int i = from.x; i < from.x + len.x; i++) { - Color color; - if (ABS(i) % 10 == 0) + if (ABS(i) % 10 == 0) { color = grid_major; - else + } else { color = grid_minor; + } float base_ofs = i * snap * zoom - offset.x * zoom; draw_line(Vector2(base_ofs, 0), Vector2(base_ofs, get_size().height), color); } for (int i = from.y; i < from.y + len.y; i++) { - Color color; - if (ABS(i) % 10 == 0) + if (ABS(i) % 10 == 0) { color = grid_major; - else + } else { color = grid_minor; + } float base_ofs = i * snap * zoom - offset.y * zoom; draw_line(Vector2(0, base_ofs), Vector2(get_size().width, base_ofs), color); @@ -356,24 +340,22 @@ void GraphEdit::_notification(int p_what) { } bool GraphEdit::_filter_input(const Point2 &p_point) { - Ref<Texture2D> port = get_theme_icon("port", "GraphNode"); for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (!gn) + if (!gn) { continue; + } for (int j = 0; j < gn->get_connection_output_count(); j++) { - Vector2 pos = gn->get_connection_output_position(j) + gn->get_position(); - if (is_in_hot_zone(pos, p_point)) + if (is_in_hot_zone(pos, p_point)) { return true; + } } for (int j = 0; j < gn->get_connection_input_count(); j++) { - Vector2 pos = gn->get_connection_input_position(j) + gn->get_position(); if (is_in_hot_zone(pos, p_point)) { return true; @@ -385,32 +367,25 @@ bool GraphEdit::_filter_input(const Point2 &p_point) { } void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { - Ref<InputEventMouseButton> mb = p_ev; if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) { - Ref<Texture2D> port = get_theme_icon("port", "GraphNode"); Vector2 mpos(mb->get_position().x, mb->get_position().y); for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (!gn) + if (!gn) { continue; + } for (int j = 0; j < gn->get_connection_output_count(); j++) { - Vector2 pos = gn->get_connection_output_position(j) + gn->get_position(); if (is_in_hot_zone(pos, mpos)) { - if (valid_left_disconnect_types.has(gn->get_connection_output_type(j))) { //check disconnect for (List<Connection>::Element *E = connections.front(); E; E = E->next()) { - if (E->get().from == gn->get_name() && E->get().from_port == j) { - Node *to = get_node(String(E->get().to)); if (Object::cast_to<GraphNode>(to)) { - connecting_from = E->get().to; connecting_index = E->get().to_port; connecting_out = false; @@ -445,19 +420,14 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { } for (int j = 0; j < gn->get_connection_input_count(); j++) { - Vector2 pos = gn->get_connection_input_position(j) + gn->get_position(); if (is_in_hot_zone(pos, mpos)) { - if (right_disconnects || valid_right_disconnect_types.has(gn->get_connection_input_type(j))) { //check disconnect for (List<Connection>::Element *E = connections.front(); E; E = E->next()) { - if (E->get().to == gn->get_name() && E->get().to_port == j) { - Node *fr = get_node(String(E->get().from)); if (Object::cast_to<GraphNode>(fr)) { - connecting_from = E->get().from; connecting_index = E->get().from_port; connecting_out = true; @@ -496,7 +466,6 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseMotion> mm = p_ev; if (mm.is_valid() && connecting) { - connecting_to = mm->get_position(); connecting_target = false; top_layer->update(); @@ -504,18 +473,16 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { Ref<Texture2D> port = get_theme_icon("port", "GraphNode"); Vector2 mpos = mm->get_position(); for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (!gn) + if (!gn) { continue; + } if (!connecting_out) { for (int j = 0; j < gn->get_connection_output_count(); j++) { - Vector2 pos = gn->get_connection_output_position(j) + gn->get_position(); int type = gn->get_connection_output_type(j); if ((type == connecting_type || valid_connection_types.has(ConnType(type, connecting_type))) && is_in_hot_zone(pos, mpos)) { - connecting_target = true; connecting_to = pos; connecting_target_to = gn->get_name(); @@ -524,9 +491,7 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { } } } else { - for (int j = 0; j < gn->get_connection_input_count(); j++) { - Vector2 pos = gn->get_connection_input_position(j) + gn->get_position(); int type = gn->get_connection_input_type(j); if ((type == connecting_type || valid_connection_types.has(ConnType(type, connecting_type))) && is_in_hot_zone(pos, mpos)) { @@ -542,9 +507,7 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { } if (mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) { - if (connecting && connecting_target) { - String from = connecting_from; int from_slot = connecting_index; String to = connecting_target_to; @@ -557,7 +520,6 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { emit_signal("connection_request", from, from_slot, to, to_slot); } else if (!just_disconnected) { - String from = connecting_from; int from_slot = connecting_index; Vector2 ofs = Vector2(mb->get_position().x, mb->get_position().y); @@ -577,16 +539,17 @@ void GraphEdit::_top_layer_input(const Ref<InputEvent> &p_ev) { } bool GraphEdit::_check_clickable_control(Control *p_control, const Vector2 &pos) { - - if (p_control->is_set_as_toplevel() || !p_control->is_visible()) + if (p_control->is_set_as_toplevel() || !p_control->is_visible()) { return false; + } if (!p_control->has_point(pos) || p_control->get_mouse_filter() == MOUSE_FILTER_IGNORE) { //test children for (int i = 0; i < p_control->get_child_count(); i++) { Control *subchild = Object::cast_to<Control>(p_control->get_child(i)); - if (!subchild) + if (!subchild) { continue; + } if (_check_clickable_control(subchild, pos - subchild->get_position())) { return true; } @@ -599,23 +562,25 @@ bool GraphEdit::_check_clickable_control(Control *p_control, const Vector2 &pos) } bool GraphEdit::is_in_hot_zone(const Vector2 &pos, const Vector2 &p_mouse_pos) { - if (!Rect2(pos.x - port_grab_distance_horizontal, pos.y - port_grab_distance_vertical, port_grab_distance_horizontal * 2, port_grab_distance_vertical * 2).has_point(p_mouse_pos)) + if (!Rect2(pos.x - port_grab_distance_horizontal, pos.y - port_grab_distance_vertical, port_grab_distance_horizontal * 2, port_grab_distance_vertical * 2).has_point(p_mouse_pos)) { return false; + } for (int i = 0; i < get_child_count(); i++) { Control *child = Object::cast_to<Control>(get_child(i)); - if (!child) + if (!child) { continue; + } Rect2 rect = child->get_rect(); if (rect.has_point(p_mouse_pos)) { - //check sub-controls Vector2 subpos = p_mouse_pos - rect.position; for (int j = 0; j < child->get_child_count(); j++) { Control *subchild = Object::cast_to<Control>(child->get_child(j)); - if (!subchild) + if (!subchild) { continue; + } if (_check_clickable_control(subchild, subpos - subchild->get_position())) { return false; @@ -640,7 +605,6 @@ static _FORCE_INLINE_ Vector2 _bezier_interp(real_t t, Vector2 start, Vector2 co } void GraphEdit::_bake_segment2d(Vector<Vector2> &points, Vector<Color> &colors, float p_begin, float p_end, const Vector2 &p_a, const Vector2 &p_out, const Vector2 &p_b, const Vector2 &p_in, int p_depth, int p_min_depth, int p_max_depth, float p_tol, const Color &p_color, const Color &p_to_color, int &lines) const { - float mp = p_begin + (p_end - p_begin) * 0.5; Vector2 beg = _bezier_interp(p_begin, p_a, p_a + p_out, p_b + p_in, p_b); Vector2 mid = _bezier_interp(mp, p_a, p_a + p_out, p_b + p_in, p_b); @@ -651,7 +615,6 @@ void GraphEdit::_bake_segment2d(Vector<Vector2> &points, Vector<Color> &colors, float dp = Math::rad2deg(Math::acos(na.dot(nb))); if (p_depth >= p_min_depth && (dp < p_tol || p_depth >= p_max_depth)) { - points.push_back((beg + end) * 0.5); colors.push_back(p_color.lerp(p_to_color, mp)); lines++; @@ -662,7 +625,6 @@ void GraphEdit::_bake_segment2d(Vector<Vector2> &points, Vector<Color> &colors, } void GraphEdit::_draw_cos_line(CanvasItem *p_where, const Vector2 &p_from, const Vector2 &p_to, const Color &p_color, const Color &p_to_color) { - //cubic bezier code float diff = p_to.x - p_from.x; float cp_offset; @@ -696,12 +658,10 @@ void GraphEdit::_draw_cos_line(CanvasItem *p_where, const Vector2 &p_from, const } void GraphEdit::_connections_layer_draw() { - Color activity_color = get_theme_color("activity"); //draw connections List<List<Connection>::Element *> to_erase; for (List<Connection>::Element *E = connections.front(); E; E = E->next()) { - NodePath fromnp(E->get().from); Node *from = get_node(fromnp); @@ -750,20 +710,19 @@ void GraphEdit::_connections_layer_draw() { } void GraphEdit::_top_layer_draw() { - _update_scroll(); if (connecting) { - Node *fromn = get_node(connecting_from); ERR_FAIL_COND(!fromn); GraphNode *from = Object::cast_to<GraphNode>(fromn); ERR_FAIL_COND(!from); Vector2 pos; - if (connecting_out) + if (connecting_out) { pos = from->get_connection_output_position(connecting_index); - else + } else { pos = from->get_connection_input_position(connecting_index); + } pos += from->get_position(); Vector2 topos; @@ -790,19 +749,17 @@ void GraphEdit::_top_layer_draw() { } void GraphEdit::set_selected(Node *p_child) { - for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (!gn) + if (!gn) { continue; + } gn->set_selected(gn == p_child); } } void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { - Ref<InputEventMouseMotion> mm = p_ev; if (mm.is_valid() && (mm->get_button_mask() & BUTTON_MASK_MIDDLE || (mm->get_button_mask() & BUTTON_MASK_LEFT && Input::get_singleton()->is_key_pressed(KEY_SPACE)))) { h_scroll->set_value(h_scroll->get_value() - mm->get_relative().x); @@ -810,7 +767,6 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { } if (mm.is_valid() && dragging) { - just_selected = true; // TODO: Remove local mouse pos hack if/when InputEventMouseMotion is fixed to support floats //drag_accum+=Vector2(mm->get_relative().x,mm->get_relative().y); @@ -818,7 +774,6 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { for (int i = get_child_count() - 1; i >= 0; i--) { GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); if (gn && gn->is_selected()) { - Vector2 pos = (gn->get_drag_from() * zoom + drag_accum) / zoom; // Snapping can be toggled temporarily by holding down Ctrl. @@ -842,19 +797,20 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { ABS(box_selecting_from.y - box_selecting_to.y)); for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (!gn) + if (!gn) { continue; + } Rect2 r = gn->get_rect(); r.size *= zoom; bool in_box = r.intersects(box_selecting_rect); - if (in_box) + if (in_box) { gn->set_selected(box_selection_mode_additive); - else + } else { gn->set_selected(previus_selected.find(gn) != nullptr); + } } top_layer->update(); @@ -862,15 +818,14 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMouseButton> b = p_ev; if (b.is_valid()) { - if (b->get_button_index() == BUTTON_RIGHT && b->is_pressed()) { if (box_selecting) { box_selecting = false; for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (!gn) + if (!gn) { continue; + } gn->set_selected(previus_selected.find(gn) != nullptr); } @@ -894,20 +849,21 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { if (gn) { Rect2 r = gn->get_rect(); r.size *= zoom; - if (r.has_point(get_local_mouse_position())) + if (r.has_point(get_local_mouse_position())) { gn->set_selected(false); + } } } } if (drag_accum != Vector2()) { - emit_signal("_begin_node_move"); for (int i = get_child_count() - 1; i >= 0; i--) { GraphNode *gn = Object::cast_to<GraphNode>(get_child(i)); - if (gn && gn->is_selected()) + if (gn && gn->is_selected()) { gn->set_drag(false); + } } emit_signal("_end_node_move"); @@ -921,16 +877,15 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { } if (b->get_button_index() == BUTTON_LEFT && b->is_pressed()) { - GraphNode *gn = nullptr; for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn_selected = Object::cast_to<GraphNode>(get_child(i)); if (gn_selected) { - if (gn_selected->is_resizing()) + if (gn_selected->is_resizing()) { continue; + } if (gn_selected->has_point(gn_selected->get_local_mouse_position())) { gn = gn_selected; @@ -940,9 +895,9 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { } if (gn) { - - if (_filter_input(b->get_position())) + if (_filter_input(b->get_position())) { return; + } dragging = true; drag_accum = Vector2(); @@ -967,17 +922,21 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { gn->set_selected(true); for (int i = 0; i < get_child_count(); i++) { GraphNode *o_gn = Object::cast_to<GraphNode>(get_child(i)); - if (!o_gn) + if (!o_gn) { continue; - if (o_gn->is_selected()) + } + if (o_gn->is_selected()) { o_gn->set_drag(true); + } } } else { - if (_filter_input(b->get_position())) + if (_filter_input(b->get_position())) { return; - if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) + } + if (Input::get_singleton()->is_key_pressed(KEY_SPACE)) { return; + } box_selecting = true; box_selecting_from = get_local_mouse_position(); @@ -985,10 +944,10 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { box_selection_mode_additive = true; previus_selected.clear(); for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn2 = Object::cast_to<GraphNode>(get_child(i)); - if (!gn2 || !gn2->is_selected()) + if (!gn2 || !gn2->is_selected()) { continue; + } previus_selected.push_back(gn2); } @@ -996,10 +955,10 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { box_selection_mode_additive = false; previus_selected.clear(); for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn2 = Object::cast_to<GraphNode>(get_child(i)); - if (!gn2 || !gn2->is_selected()) + if (!gn2 || !gn2->is_selected()) { continue; + } previus_selected.push_back(gn2); } @@ -1007,10 +966,10 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { box_selection_mode_additive = true; previus_selected.clear(); for (int i = get_child_count() - 1; i >= 0; i--) { - GraphNode *gn2 = Object::cast_to<GraphNode>(get_child(i)); - if (!gn2) + if (!gn2) { continue; + } if (gn2->is_selected()) { emit_signal("node_unselected", gn2); } @@ -1052,7 +1011,6 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { Ref<InputEventKey> k = p_ev; if (k.is_valid()) { - if (k->get_keycode() == KEY_D && k->is_pressed() && k->get_command()) { emit_signal("duplicate_nodes_request"); accept_event(); @@ -1076,24 +1034,19 @@ void GraphEdit::_gui_input(const Ref<InputEvent> &p_ev) { Ref<InputEventMagnifyGesture> magnify_gesture = p_ev; if (magnify_gesture.is_valid()) { - set_zoom_custom(zoom * magnify_gesture->get_factor(), magnify_gesture->get_position()); } Ref<InputEventPanGesture> pan_gesture = p_ev; if (pan_gesture.is_valid()) { - h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() * pan_gesture->get_delta().x / 8); v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * pan_gesture->get_delta().y / 8); } } void GraphEdit::set_connection_activity(const StringName &p_from, int p_from_port, const StringName &p_to, int p_to_port, float p_activity) { - for (List<Connection>::Element *E = connections.front(); E; E = E->next()) { - if (E->get().from == p_from && E->get().from_port == p_from_port && E->get().to == p_to && E->get().to_port == p_to_port) { - if (Math::is_equal_approx(E->get().activity, p_activity)) { //update only if changed top_layer->update(); @@ -1106,22 +1059,20 @@ void GraphEdit::set_connection_activity(const StringName &p_from, int p_from_por } void GraphEdit::clear_connections() { - connections.clear(); update(); connections_layer->update(); } void GraphEdit::set_zoom(float p_zoom) { - set_zoom_custom(p_zoom, get_size() / 2); } void GraphEdit::set_zoom_custom(float p_zoom, const Vector2 &p_center) { - p_zoom = CLAMP(p_zoom, MIN_ZOOM, MAX_ZOOM); - if (zoom == p_zoom) + if (zoom == p_zoom) { return; + } zoom_minus->set_disabled(zoom == MIN_ZOOM); zoom_plus->set_disabled(zoom == MAX_ZOOM); @@ -1135,7 +1086,6 @@ void GraphEdit::set_zoom_custom(float p_zoom, const Vector2 &p_center) { connections_layer->update(); if (is_visible_in_tree()) { - Vector2 ofs = sbofs * zoom - p_center; h_scroll->set_value(ofs.x); v_scroll->set_value(ofs.y); @@ -1149,37 +1099,30 @@ float GraphEdit::get_zoom() const { } void GraphEdit::set_right_disconnects(bool p_enable) { - right_disconnects = p_enable; } bool GraphEdit::is_right_disconnects_enabled() const { - return right_disconnects; } void GraphEdit::add_valid_right_disconnect_type(int p_type) { - valid_right_disconnect_types.insert(p_type); } void GraphEdit::remove_valid_right_disconnect_type(int p_type) { - valid_right_disconnect_types.erase(p_type); } void GraphEdit::add_valid_left_disconnect_type(int p_type) { - valid_left_disconnect_types.insert(p_type); } void GraphEdit::remove_valid_left_disconnect_type(int p_type) { - valid_left_disconnect_types.erase(p_type); } Array GraphEdit::_get_connection_list() const { - List<Connection> conns; get_connection_list(&conns); Array arr; @@ -1195,21 +1138,18 @@ Array GraphEdit::_get_connection_list() const { } void GraphEdit::_zoom_minus() { - set_zoom(zoom / ZOOM_SCALE); } -void GraphEdit::_zoom_reset() { +void GraphEdit::_zoom_reset() { set_zoom(1); } void GraphEdit::_zoom_plus() { - set_zoom(zoom * ZOOM_SCALE); } void GraphEdit::add_valid_connection_type(int p_type, int p_with_type) { - ConnType ct; ct.type_a = p_type; ct.type_b = p_with_type; @@ -1218,7 +1158,6 @@ void GraphEdit::add_valid_connection_type(int p_type, int p_with_type) { } void GraphEdit::remove_valid_connection_type(int p_type, int p_with_type) { - ConnType ct; ct.type_a = p_type; ct.type_b = p_with_type; @@ -1227,7 +1166,6 @@ void GraphEdit::remove_valid_connection_type(int p_type, int p_with_type) { } bool GraphEdit::is_valid_connection_type(int p_type, int p_with_type) const { - ConnType ct; ct.type_a = p_type; ct.type_b = p_with_type; @@ -1236,33 +1174,29 @@ bool GraphEdit::is_valid_connection_type(int p_type, int p_with_type) const { } void GraphEdit::set_use_snap(bool p_enable) { - snap_button->set_pressed(p_enable); update(); } bool GraphEdit::is_using_snap() const { - return snap_button->is_pressed(); } int GraphEdit::get_snap() const { - return snap_amount->get_value(); } void GraphEdit::set_snap(int p_snap) { - ERR_FAIL_COND(p_snap < 5); snap_amount->set_value(p_snap); update(); } + void GraphEdit::_snap_toggled() { update(); } void GraphEdit::_snap_value_changed(double) { - update(); } @@ -1271,7 +1205,6 @@ HBoxContainer *GraphEdit::get_zoom_hbox() { } void GraphEdit::_bind_methods() { - ClassDB::bind_method(D_METHOD("connect_node", "from", "from_port", "to", "to_port"), &GraphEdit::connect_node); ClassDB::bind_method(D_METHOD("is_node_connected", "from", "from_port", "to", "to_port"), &GraphEdit::is_node_connected); ClassDB::bind_method(D_METHOD("disconnect_node", "from", "from_port", "to", "to_port"), &GraphEdit::disconnect_node); diff --git a/scene/gui/graph_edit.h b/scene/gui/graph_edit.h index f675f8c7f3..8cfc5d32b9 100644 --- a/scene/gui/graph_edit.h +++ b/scene/gui/graph_edit.h @@ -42,7 +42,6 @@ class GraphEdit; class GraphEditFilter : public Control { - GDCLASS(GraphEditFilter, Control); friend class GraphEdit; @@ -54,7 +53,6 @@ public: }; class GraphEdit : public Control { - GDCLASS(GraphEdit, Control); public: @@ -142,7 +140,6 @@ private: bool lines_on_bg; struct ConnType { - union { struct { uint32_t type_a; diff --git a/scene/gui/graph_node.cpp b/scene/gui/graph_node.cpp index 5dbc5bc50d..b6a96238dc 100644 --- a/scene/gui/graph_node.cpp +++ b/scene/gui/graph_node.cpp @@ -33,31 +33,33 @@ #include "core/method_bind_ext.gen.inc" bool GraphNode::_set(const StringName &p_name, const Variant &p_value) { - - if (!p_name.operator String().begins_with("slot/")) + if (!p_name.operator String().begins_with("slot/")) { return false; + } int idx = p_name.operator String().get_slice("/", 1).to_int(); String what = p_name.operator String().get_slice("/", 2); Slot si; - if (slot_info.has(idx)) + if (slot_info.has(idx)) { si = slot_info[idx]; + } - if (what == "left_enabled") + if (what == "left_enabled") { si.enable_left = p_value; - else if (what == "left_type") + } else if (what == "left_type") { si.type_left = p_value; - else if (what == "left_color") + } else if (what == "left_color") { si.color_left = p_value; - else if (what == "right_enabled") + } else if (what == "right_enabled") { si.enable_right = p_value; - else if (what == "right_type") + } else if (what == "right_type") { si.type_right = p_value; - else if (what == "right_color") + } else if (what == "right_color") { si.color_right = p_value; - else + } else { return false; + } set_slot(idx, si.enable_left, si.type_left, si.color_left, si.enable_right, si.type_right, si.color_right); update(); @@ -65,7 +67,6 @@ bool GraphNode::_set(const StringName &p_name, const Variant &p_value) { } bool GraphNode::_get(const StringName &p_name, Variant &r_ret) const { - if (!p_name.operator String().begins_with("slot/")) { return false; } @@ -74,33 +75,36 @@ bool GraphNode::_get(const StringName &p_name, Variant &r_ret) const { String what = p_name.operator String().get_slice("/", 2); Slot si; - if (slot_info.has(idx)) + if (slot_info.has(idx)) { si = slot_info[idx]; + } - if (what == "left_enabled") + if (what == "left_enabled") { r_ret = si.enable_left; - else if (what == "left_type") + } else if (what == "left_type") { r_ret = si.type_left; - else if (what == "left_color") + } else if (what == "left_color") { r_ret = si.color_left; - else if (what == "right_enabled") + } else if (what == "right_enabled") { r_ret = si.enable_right; - else if (what == "right_type") + } else if (what == "right_type") { r_ret = si.type_right; - else if (what == "right_color") + } else if (what == "right_color") { r_ret = si.color_right; - else + } else { return false; + } return true; } -void GraphNode::_get_property_list(List<PropertyInfo> *p_list) const { +void GraphNode::_get_property_list(List<PropertyInfo> *p_list) const { int idx = 0; for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || c->is_set_as_toplevel()) + if (!c || c->is_set_as_toplevel()) { continue; + } String base = "slot/" + itos(idx) + "/"; @@ -116,7 +120,6 @@ void GraphNode::_get_property_list(List<PropertyInfo> *p_list) const { } void GraphNode::_resort() { - int sep = get_theme_constant("separation"); Ref<StyleBox> sb = get_theme_stylebox("frame"); bool first = true; @@ -125,20 +128,23 @@ void GraphNode::_resort() { for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } Size2i size = c->get_combined_minimum_size(); minsize.y += size.y; minsize.x = MAX(minsize.x, size.x); - if (first) + if (first) { first = false; - else + } else { minsize.y += sep; + } } int vofs = 0; @@ -147,10 +153,12 @@ void GraphNode::_resort() { cache_y.clear(); for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } Size2i size = c->get_combined_minimum_size(); @@ -167,7 +175,6 @@ void GraphNode::_resort() { } bool GraphNode::has_point(const Point2 &p_point) const { - if (comment) { Ref<StyleBox> comment = get_theme_stylebox("comment"); Ref<Texture2D> resizer = get_theme_icon("resizer"); @@ -188,17 +195,14 @@ bool GraphNode::has_point(const Point2 &p_point) const { } void GraphNode::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_DRAW: { - Ref<StyleBox> sb; if (comment) { sb = get_theme_stylebox(selected ? "commentfocus" : "comment"); } else { - sb = get_theme_stylebox(selected ? "selectedframe" : "frame"); } @@ -223,10 +227,8 @@ void GraphNode::_notification(int p_what) { switch (overlay) { case OVERLAY_DISABLED: { - } break; case OVERLAY_BREAKPOINT: { - draw_style_box(get_theme_stylebox("breakpoint"), Rect2(Point2(), get_size())); } break; case OVERLAY_POSITION: { @@ -237,8 +239,9 @@ void GraphNode::_notification(int p_what) { int w = get_size().width - sb->get_minimum_size().x; - if (show_close) + if (show_close) { w -= close->get_width(); + } draw_string(title_font, Point2(sb->get_margin(MARGIN_LEFT) + title_h_offset, -title_font->get_height() + title_font->get_ascent() + title_offset), title, title_color, w); if (show_close) { @@ -251,11 +254,12 @@ void GraphNode::_notification(int p_what) { } for (Map<int, Slot>::Element *E = slot_info.front(); E; E = E->next()) { - - if (E->key() < 0 || E->key() >= cache_y.size()) + if (E->key() < 0 || E->key() >= cache_y.size()) { continue; - if (!slot_info.has(E->key())) + } + if (!slot_info.has(E->key())) { continue; + } const Slot &s = slot_info[E->key()]; //left if (s.enable_left) { @@ -280,19 +284,16 @@ void GraphNode::_notification(int p_what) { } break; case NOTIFICATION_SORT_CHILDREN: { - _resort(); } break; case NOTIFICATION_THEME_CHANGED: { - minimum_size_changed(); } break; } } void GraphNode::set_slot(int p_idx, bool p_enable_left, int p_type_left, const Color &p_color_left, bool p_enable_right, int p_type_right, const Color &p_color_right, const Ref<Texture2D> &p_custom_left, const Ref<Texture2D> &p_custom_right) { - ERR_FAIL_COND(p_idx < 0); if (!p_enable_left && p_type_left == 0 && p_color_left == Color(1, 1, 1, 1) && !p_enable_right && p_type_right == 0 && p_color_right == Color(1, 1, 1, 1)) { @@ -315,61 +316,60 @@ void GraphNode::set_slot(int p_idx, bool p_enable_left, int p_type_left, const C } void GraphNode::clear_slot(int p_idx) { - slot_info.erase(p_idx); update(); connpos_dirty = true; } -void GraphNode::clear_all_slots() { +void GraphNode::clear_all_slots() { slot_info.clear(); update(); connpos_dirty = true; } -bool GraphNode::is_slot_enabled_left(int p_idx) const { - if (!slot_info.has(p_idx)) +bool GraphNode::is_slot_enabled_left(int p_idx) const { + if (!slot_info.has(p_idx)) { return false; + } return slot_info[p_idx].enable_left; } int GraphNode::get_slot_type_left(int p_idx) const { - - if (!slot_info.has(p_idx)) + if (!slot_info.has(p_idx)) { return 0; + } return slot_info[p_idx].type_left; } Color GraphNode::get_slot_color_left(int p_idx) const { - - if (!slot_info.has(p_idx)) + if (!slot_info.has(p_idx)) { return Color(1, 1, 1, 1); + } return slot_info[p_idx].color_left; } bool GraphNode::is_slot_enabled_right(int p_idx) const { - - if (!slot_info.has(p_idx)) + if (!slot_info.has(p_idx)) { return false; + } return slot_info[p_idx].enable_right; } int GraphNode::get_slot_type_right(int p_idx) const { - - if (!slot_info.has(p_idx)) + if (!slot_info.has(p_idx)) { return 0; + } return slot_info[p_idx].type_right; } Color GraphNode::get_slot_color_right(int p_idx) const { - - if (!slot_info.has(p_idx)) + if (!slot_info.has(p_idx)) { return Color(1, 1, 1, 1); + } return slot_info[p_idx].color_right; } Size2 GraphNode::get_minimum_size() const { - Ref<Font> title_font = get_theme_font("title_font"); int sep = get_theme_constant("separation"); @@ -384,31 +384,33 @@ Size2 GraphNode::get_minimum_size() const { } for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } Size2i size = c->get_combined_minimum_size(); minsize.y += size.y; minsize.x = MAX(minsize.x, size.x); - if (first) + if (first) { first = false; - else + } else { minsize.y += sep; + } } return minsize + sb->get_minimum_size(); } void GraphNode::set_title(const String &p_title) { - - if (title == p_title) + if (title == p_title) { return; + } title = p_title; update(); _change_notify("title"); @@ -416,19 +418,16 @@ void GraphNode::set_title(const String &p_title) { } String GraphNode::get_title() const { - return title; } void GraphNode::set_offset(const Vector2 &p_offset) { - offset = p_offset; emit_signal("offset_changed"); update(); } Vector2 GraphNode::get_offset() const { - return offset; } @@ -442,10 +441,11 @@ bool GraphNode::is_selected() { } void GraphNode::set_drag(bool p_drag) { - if (p_drag) + if (p_drag) { drag_from = get_offset(); - else + } else { emit_signal("dragged", drag_from, get_offset()); //useful for undo/redo + } } Vector2 GraphNode::get_drag_from() { @@ -453,17 +453,15 @@ Vector2 GraphNode::get_drag_from() { } void GraphNode::set_show_close_button(bool p_enable) { - show_close = p_enable; update(); } -bool GraphNode::is_close_button_visible() const { +bool GraphNode::is_close_button_visible() const { return show_close; } void GraphNode::_connpos_update() { - int edgeofs = get_theme_constant("port_offset"); int sep = get_theme_constant("separation"); @@ -476,10 +474,12 @@ void GraphNode::_connpos_update() { for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } Size2i size = c->get_combined_minimum_size(); @@ -487,7 +487,6 @@ void GraphNode::_connpos_update() { int h = size.y; if (slot_info.has(idx)) { - if (slot_info[idx].enable_left) { ConnCache cc; cc.pos = Point2i(edgeofs, y + h / 2); @@ -504,8 +503,9 @@ void GraphNode::_connpos_update() { } } - if (vofs > 0) + if (vofs > 0) { vofs += sep; + } vofs += size.y; idx++; } @@ -514,24 +514,25 @@ void GraphNode::_connpos_update() { } int GraphNode::get_connection_input_count() { - - if (connpos_dirty) + if (connpos_dirty) { _connpos_update(); + } return conn_input_cache.size(); } -int GraphNode::get_connection_output_count() { - if (connpos_dirty) +int GraphNode::get_connection_output_count() { + if (connpos_dirty) { _connpos_update(); + } return conn_output_cache.size(); } Vector2 GraphNode::get_connection_input_position(int p_idx) { - - if (connpos_dirty) + if (connpos_dirty) { _connpos_update(); + } ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), Vector2()); Vector2 pos = conn_input_cache[p_idx].pos; @@ -541,27 +542,27 @@ Vector2 GraphNode::get_connection_input_position(int p_idx) { } int GraphNode::get_connection_input_type(int p_idx) { - - if (connpos_dirty) + if (connpos_dirty) { _connpos_update(); + } ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), 0); return conn_input_cache[p_idx].type; } Color GraphNode::get_connection_input_color(int p_idx) { - - if (connpos_dirty) + if (connpos_dirty) { _connpos_update(); + } ERR_FAIL_INDEX_V(p_idx, conn_input_cache.size(), Color()); return conn_input_cache[p_idx].color; } Vector2 GraphNode::get_connection_output_position(int p_idx) { - - if (connpos_dirty) + if (connpos_dirty) { _connpos_update(); + } ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), Vector2()); Vector2 pos = conn_output_cache[p_idx].pos; @@ -571,32 +572,29 @@ Vector2 GraphNode::get_connection_output_position(int p_idx) { } int GraphNode::get_connection_output_type(int p_idx) { - - if (connpos_dirty) + if (connpos_dirty) { _connpos_update(); + } ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), 0); return conn_output_cache[p_idx].type; } Color GraphNode::get_connection_output_color(int p_idx) { - - if (connpos_dirty) + if (connpos_dirty) { _connpos_update(); + } ERR_FAIL_INDEX_V(p_idx, conn_output_cache.size(), Color()); return conn_output_cache[p_idx].color; } void GraphNode::_gui_input(const Ref<InputEvent> &p_ev) { - Ref<InputEventMouseButton> mb = p_ev; if (mb.is_valid()) { - ERR_FAIL_COND_MSG(get_parent_control() == nullptr, "GraphNode must be the child of a GraphEdit node."); if (mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - Vector2 mpos = Vector2(mb->get_position().x, mb->get_position().y); if (close_rect.size != Size2() && close_rect.has_point(mpos)) { //send focus to parent @@ -609,7 +607,6 @@ void GraphNode::_gui_input(const Ref<InputEvent> &p_ev) { Ref<Texture2D> resizer = get_theme_icon("resizer"); if (resizable && mpos.x > get_size().x - resizer->get_width() && mpos.y > get_size().y - resizer->get_height()) { - resizing = true; resizing_from = mpos; resizing_from_size = get_size(); @@ -636,40 +633,33 @@ void GraphNode::_gui_input(const Ref<InputEvent> &p_ev) { } void GraphNode::set_overlay(Overlay p_overlay) { - overlay = p_overlay; update(); } GraphNode::Overlay GraphNode::get_overlay() const { - return overlay; } void GraphNode::set_comment(bool p_enable) { - comment = p_enable; update(); } bool GraphNode::is_comment() const { - return comment; } void GraphNode::set_resizable(bool p_enable) { - resizable = p_enable; update(); } bool GraphNode::is_resizable() const { - return resizable; } void GraphNode::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_title", "title"), &GraphNode::set_title); ClassDB::bind_method(D_METHOD("get_title"), &GraphNode::get_title); ClassDB::bind_method(D_METHOD("_gui_input"), &GraphNode::_gui_input); @@ -732,7 +722,6 @@ void GraphNode::_bind_methods() { } GraphNode::GraphNode() { - overlay = OVERLAY_DISABLED; show_close = false; connpos_dirty = true; diff --git a/scene/gui/graph_node.h b/scene/gui/graph_node.h index a3eb8ed152..6372833e6f 100644 --- a/scene/gui/graph_node.h +++ b/scene/gui/graph_node.h @@ -34,7 +34,6 @@ #include "scene/gui/container.h" class GraphNode : public Container { - GDCLASS(GraphNode, Container); public: diff --git a/scene/gui/grid_container.cpp b/scene/gui/grid_container.cpp index 16f6fd0111..2f37461c4d 100644 --- a/scene/gui/grid_container.cpp +++ b/scene/gui/grid_container.cpp @@ -31,11 +31,8 @@ #include "grid_container.h" void GridContainer::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_SORT_CHILDREN: { - Map<int, int> col_minw; // Max of min_width of all controls in each col (indexed by col). Map<int, int> row_minh; // Max of min_height of all controls in each row (indexed by row). Set<int> col_expanded; // Columns which have the SIZE_EXPAND flag set. @@ -50,22 +47,25 @@ void GridContainer::_notification(int p_what) { int valid_controls_index = 0; for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible_in_tree()) + if (!c || !c->is_visible_in_tree()) { continue; + } int row = valid_controls_index / columns; int col = valid_controls_index % columns; valid_controls_index++; Size2i ms = c->get_combined_minimum_size(); - if (col_minw.has(col)) + if (col_minw.has(col)) { col_minw[col] = MAX(col_minw[col], ms.width); - else + } else { col_minw[col] = ms.width; - if (row_minh.has(row)) + } + if (row_minh.has(row)) { row_minh[row] = MAX(row_minh[row], ms.height); - else + } else { row_minh[row] = ms.height; + } if (c->get_h_size_flags() & SIZE_EXPAND) { col_expanded.insert(col); @@ -83,13 +83,15 @@ void GridContainer::_notification(int p_what) { // Evaluate the remaining space for expanded columns/rows. Size2 remaining_space = get_size(); for (Map<int, int>::Element *E = col_minw.front(); E; E = E->next()) { - if (!col_expanded.has(E->key())) + if (!col_expanded.has(E->key())) { remaining_space.width -= E->get(); + } } for (Map<int, int>::Element *E = row_minh.front(); E; E = E->next()) { - if (!row_expanded.has(E->key())) + if (!row_expanded.has(E->key())) { remaining_space.height -= E->get(); + } } remaining_space.height -= vsep * MAX(max_row - 1, 0); remaining_space.width -= hsep * MAX(max_col - 1, 0); @@ -146,16 +148,18 @@ void GridContainer::_notification(int p_what) { valid_controls_index = 0; for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible_in_tree()) + if (!c || !c->is_visible_in_tree()) { continue; + } int row = valid_controls_index / columns; int col = valid_controls_index % columns; valid_controls_index++; if (col == 0) { col_ofs = 0; - if (row > 0) + if (row > 0) { row_ofs += (row_expanded.has(row - 1) ? row_expand : row_minh[row - 1]) + vsep; + } } Point2 p(col_ofs, row_ofs); @@ -168,14 +172,12 @@ void GridContainer::_notification(int p_what) { } break; case NOTIFICATION_THEME_CHANGED: { - minimum_size_changed(); } break; } } void GridContainer::set_columns(int p_columns) { - ERR_FAIL_COND(p_columns < 1); columns = p_columns; queue_sort(); @@ -183,12 +185,10 @@ void GridContainer::set_columns(int p_columns) { } int GridContainer::get_columns() const { - return columns; } void GridContainer::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_columns", "columns"), &GridContainer::set_columns); ClassDB::bind_method(D_METHOD("get_columns"), &GridContainer::get_columns); @@ -196,7 +196,6 @@ void GridContainer::_bind_methods() { } Size2 GridContainer::get_minimum_size() const { - Map<int, int> col_minw; Map<int, int> row_minh; @@ -208,24 +207,26 @@ Size2 GridContainer::get_minimum_size() const { int valid_controls_index = 0; for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible()) + if (!c || !c->is_visible()) { continue; + } int row = valid_controls_index / columns; int col = valid_controls_index % columns; valid_controls_index++; Size2i ms = c->get_combined_minimum_size(); - if (col_minw.has(col)) + if (col_minw.has(col)) { col_minw[col] = MAX(col_minw[col], ms.width); - else + } else { col_minw[col] = ms.width; + } - if (row_minh.has(row)) + if (row_minh.has(row)) { row_minh[row] = MAX(row_minh[row], ms.height); - else + } else { row_minh[row] = ms.height; + } max_col = MAX(col, max_col); max_row = MAX(row, max_row); } diff --git a/scene/gui/grid_container.h b/scene/gui/grid_container.h index 0ed8863196..0a1bd6751a 100644 --- a/scene/gui/grid_container.h +++ b/scene/gui/grid_container.h @@ -34,7 +34,6 @@ #include "scene/gui/container.h" class GridContainer : public Container { - GDCLASS(GridContainer, Container); int columns; diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index 47a5ac68d2..54150d130d 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -33,7 +33,6 @@ #include "core/project_settings.h" void ItemList::add_item(const String &p_item, const Ref<Texture2D> &p_texture, bool p_selectable) { - Item item; item.icon = p_texture; item.icon_transposed = false; @@ -52,7 +51,6 @@ void ItemList::add_item(const String &p_item, const Ref<Texture2D> &p_texture, b } void ItemList::add_icon_item(const Ref<Texture2D> &p_item, bool p_selectable) { - Item item; item.icon = p_item; item.icon_transposed = false; @@ -71,7 +69,6 @@ void ItemList::add_icon_item(const Ref<Texture2D> &p_item, bool p_selectable) { } void ItemList::set_item_text(int p_idx, const String &p_text) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].text = p_text; @@ -80,7 +77,6 @@ void ItemList::set_item_text(int p_idx, const String &p_text) { } String ItemList::get_item_text(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), String()); return items[p_idx].text; } @@ -96,7 +92,6 @@ bool ItemList::is_item_tooltip_enabled(int p_idx) const { } void ItemList::set_item_tooltip(int p_idx, const String &p_tooltip) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].tooltip = p_tooltip; @@ -105,13 +100,11 @@ void ItemList::set_item_tooltip(int p_idx, const String &p_tooltip) { } String ItemList::get_item_tooltip(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), String()); return items[p_idx].tooltip; } void ItemList::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].icon = p_icon; @@ -120,14 +113,12 @@ void ItemList::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) { } Ref<Texture2D> ItemList::get_item_icon(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Ref<Texture2D>()); return items[p_idx].icon; } void ItemList::set_item_icon_transposed(int p_idx, const bool p_transposed) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].icon_transposed = p_transposed; @@ -136,14 +127,12 @@ void ItemList::set_item_icon_transposed(int p_idx, const bool p_transposed) { } bool ItemList::is_item_icon_transposed(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), false); return items[p_idx].icon_transposed; } void ItemList::set_item_icon_region(int p_idx, const Rect2 &p_region) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].icon_region = p_region; @@ -152,14 +141,12 @@ void ItemList::set_item_icon_region(int p_idx, const Rect2 &p_region) { } Rect2 ItemList::get_item_icon_region(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Rect2()); return items[p_idx].icon_region; } void ItemList::set_item_icon_modulate(int p_idx, const Color &p_modulate) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].icon_modulate = p_modulate; @@ -167,70 +154,61 @@ void ItemList::set_item_icon_modulate(int p_idx, const Color &p_modulate) { } Color ItemList::get_item_icon_modulate(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Color()); return items[p_idx].icon_modulate; } void ItemList::set_item_custom_bg_color(int p_idx, const Color &p_custom_bg_color) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].custom_bg = p_custom_bg_color; } Color ItemList::get_item_custom_bg_color(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Color()); return items[p_idx].custom_bg; } void ItemList::set_item_custom_fg_color(int p_idx, const Color &p_custom_fg_color) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].custom_fg = p_custom_fg_color; } Color ItemList::get_item_custom_fg_color(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Color()); return items[p_idx].custom_fg; } void ItemList::set_item_tag_icon(int p_idx, const Ref<Texture2D> &p_tag_icon) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].tag_icon = p_tag_icon; update(); shape_changed = true; } -Ref<Texture2D> ItemList::get_item_tag_icon(int p_idx) const { +Ref<Texture2D> ItemList::get_item_tag_icon(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, items.size(), Ref<Texture2D>()); return items[p_idx].tag_icon; } void ItemList::set_item_selectable(int p_idx, bool p_selectable) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].selectable = p_selectable; } bool ItemList::is_item_selectable(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), false); return items[p_idx].selectable; } void ItemList::set_item_disabled(int p_idx, bool p_disabled) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].disabled = p_disabled; @@ -238,13 +216,11 @@ void ItemList::set_item_disabled(int p_idx, bool p_disabled) { } bool ItemList::is_item_disabled(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), false); return items[p_idx].disabled; } void ItemList::set_item_metadata(int p_idx, const Variant &p_metadata) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].metadata = p_metadata; @@ -253,16 +229,14 @@ void ItemList::set_item_metadata(int p_idx, const Variant &p_metadata) { } Variant ItemList::get_item_metadata(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Variant()); return items[p_idx].metadata; } -void ItemList::select(int p_idx, bool p_single) { +void ItemList::select(int p_idx, bool p_single) { ERR_FAIL_INDEX(p_idx, items.size()); if (p_single || select_mode == SELECT_SINGLE) { - if (!items[p_idx].selectable || items[p_idx].disabled) { return; } @@ -274,15 +248,14 @@ void ItemList::select(int p_idx, bool p_single) { current = p_idx; ensure_selected_visible = false; } else { - if (items[p_idx].selectable && !items[p_idx].disabled) { items.write[p_idx].selected = true; } } update(); } -void ItemList::unselect(int p_idx) { +void ItemList::unselect(int p_idx) { ERR_FAIL_INDEX(p_idx, items.size()); if (select_mode != SELECT_MULTI) { @@ -295,12 +268,11 @@ void ItemList::unselect(int p_idx) { } void ItemList::unselect_all() { - - if (items.size() < 1) + if (items.size() < 1) { return; + } for (int i = 0; i < items.size(); i++) { - items.write[i].selected = false; } current = -1; @@ -308,7 +280,6 @@ void ItemList::unselect_all() { } bool ItemList::is_selected(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), false); return items[p_idx].selected; @@ -317,21 +288,19 @@ bool ItemList::is_selected(int p_idx) const { void ItemList::set_current(int p_current) { ERR_FAIL_INDEX(p_current, items.size()); - if (select_mode == SELECT_SINGLE) + if (select_mode == SELECT_SINGLE) { select(p_current, true); - else { + } else { current = p_current; update(); } } int ItemList::get_current() const { - return current; } void ItemList::move_item(int p_from_idx, int p_to_idx) { - ERR_FAIL_INDEX(p_from_idx, items.size()); ERR_FAIL_INDEX(p_to_idx, items.size()); @@ -348,11 +317,10 @@ void ItemList::move_item(int p_from_idx, int p_to_idx) { } int ItemList::get_item_count() const { - return items.size(); } -void ItemList::remove_item(int p_idx) { +void ItemList::remove_item(int p_idx) { ERR_FAIL_INDEX(p_idx, items.size()); items.remove(p_idx); @@ -362,7 +330,6 @@ void ItemList::remove_item(int p_idx) { } void ItemList::clear() { - items.clear(); current = -1; ensure_selected_visible = false; @@ -372,65 +339,58 @@ void ItemList::clear() { } void ItemList::set_fixed_column_width(int p_size) { - ERR_FAIL_COND(p_size < 0); fixed_column_width = p_size; update(); shape_changed = true; } -int ItemList::get_fixed_column_width() const { +int ItemList::get_fixed_column_width() const { return fixed_column_width; } void ItemList::set_same_column_width(bool p_enable) { - same_column_width = p_enable; update(); shape_changed = true; } -bool ItemList::is_same_column_width() const { +bool ItemList::is_same_column_width() const { return same_column_width; } void ItemList::set_max_text_lines(int p_lines) { - ERR_FAIL_COND(p_lines < 1); max_text_lines = p_lines; update(); shape_changed = true; } -int ItemList::get_max_text_lines() const { +int ItemList::get_max_text_lines() const { return max_text_lines; } void ItemList::set_max_columns(int p_amount) { - ERR_FAIL_COND(p_amount < 0); max_columns = p_amount; update(); shape_changed = true; } -int ItemList::get_max_columns() const { +int ItemList::get_max_columns() const { return max_columns; } void ItemList::set_select_mode(SelectMode p_mode) { - select_mode = p_mode; update(); } ItemList::SelectMode ItemList::get_select_mode() const { - return select_mode; } void ItemList::set_icon_mode(IconMode p_mode) { - ERR_FAIL_INDEX((int)p_mode, 2); icon_mode = p_mode; update(); @@ -438,28 +398,27 @@ void ItemList::set_icon_mode(IconMode p_mode) { } ItemList::IconMode ItemList::get_icon_mode() const { - return icon_mode; } void ItemList::set_fixed_icon_size(const Size2 &p_size) { - fixed_icon_size = p_size; update(); } Size2 ItemList::get_fixed_icon_size() const { - return fixed_icon_size; } -Size2 ItemList::Item::get_icon_size() const { - if (icon.is_null()) +Size2 ItemList::Item::get_icon_size() const { + if (icon.is_null()) { return Size2(); + } Size2 size_result = Size2(icon_region.size).abs(); - if (icon_region.size.x == 0 || icon_region.size.y == 0) + if (icon_region.size.x == 0 || icon_region.size.y == 0) { size_result = icon->get_size(); + } if (icon_transposed) { Size2 size_tmp = size_result; @@ -471,7 +430,6 @@ Size2 ItemList::Item::get_icon_size() const { } void ItemList::_gui_input(const Ref<InputEvent> &p_event) { - double prev_scroll = scroll_bar->get_value(); Ref<InputEventMouseMotion> mm = p_event; @@ -483,7 +441,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (defer_select_single >= 0 && mb.is_valid() && mb->get_button_index() == BUTTON_LEFT && !mb->is_pressed()) { - select(defer_select_single, true); emit_signal("multi_selected", defer_select_single, true); @@ -492,7 +449,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { } if (mb.is_valid() && (mb->get_button_index() == BUTTON_LEFT || (allow_rmb_select && mb->get_button_index() == BUTTON_RIGHT)) && mb->is_pressed()) { - search_string = ""; //any mousepress cancels Vector2 pos = mb->get_position(); Ref<StyleBox> bg = get_theme_stylebox("bg"); @@ -502,7 +458,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { int closest = -1; for (int i = 0; i < items.size(); i++) { - Rect2 rc = items[i].rect_cache; if (i % current_columns == current_columns - 1) { rc.size.width = get_size().width; //not right but works @@ -515,7 +470,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { } if (closest != -1) { - int i = closest; if (select_mode == SELECT_MULTI && items[i].selected && mb->get_command()) { @@ -523,7 +477,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { emit_signal("multi_selected", i, false); } else if (select_mode == SELECT_MULTI && mb->get_shift() && current >= 0 && current < items.size() && current != i) { - int from = current; int to = i; if (i < current) { @@ -532,23 +485,21 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { for (int j = from; j <= to; j++) { bool selected = !items[j].selected; select(j, false); - if (selected) + if (selected) { emit_signal("multi_selected", j, true); + } } if (mb->get_button_index() == BUTTON_RIGHT) { - emit_signal("item_rmb_selected", i, get_local_mouse_position()); } } else { - if (!mb->is_doubleclick() && !mb->get_command() && select_mode == SELECT_MULTI && items[i].selectable && !items[i].disabled && items[i].selected && mb->get_button_index() == BUTTON_LEFT) { defer_select_single = i; return; } if (items[i].selected && mb->get_button_index() == BUTTON_RIGHT) { - emit_signal("item_rmb_selected", i, get_local_mouse_position()); } else { bool selected = items[i].selected; @@ -558,15 +509,14 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { if (!selected || allow_reselect) { if (select_mode == SELECT_SINGLE) { emit_signal("item_selected", i); - } else + } else { emit_signal("multi_selected", i, true); + } } if (mb->get_button_index() == BUTTON_RIGHT) { - emit_signal("item_rmb_selected", i, get_local_mouse_position()); } else if (/*select_mode==SELECT_SINGLE &&*/ mb->is_doubleclick()) { - emit_signal("item_activated", i); } } @@ -584,28 +534,21 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { emit_signal("nothing_selected"); } if (mb.is_valid() && mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) { - scroll_bar->set_value(scroll_bar->get_value() - scroll_bar->get_page() * mb->get_factor() / 8); } if (mb.is_valid() && mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed()) { - scroll_bar->set_value(scroll_bar->get_value() + scroll_bar->get_page() * mb->get_factor() / 8); } if (p_event->is_pressed() && items.size() > 0) { if (p_event->is_action("ui_up")) { - if (search_string != "") { - uint64_t now = OS::get_singleton()->get_ticks_msec(); uint64_t diff = now - search_time_msec; if (diff < uint64_t(ProjectSettings::get_singleton()->get("gui/timers/incremental_search_max_interval_msec")) * 2) { - for (int i = current - 1; i >= 0; i--) { - if (items[i].text.begins_with(search_string)) { - set_current(i); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { @@ -629,18 +572,13 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { accept_event(); } } else if (p_event->is_action("ui_down")) { - if (search_string != "") { - uint64_t now = OS::get_singleton()->get_ticks_msec(); uint64_t diff = now - search_time_msec; if (diff < uint64_t(ProjectSettings::get_singleton()->get("gui/timers/incremental_search_max_interval_msec")) * 2) { - for (int i = current + 1; i < items.size(); i++) { - if (items[i].text.begins_with(search_string)) { - set_current(i); ensure_current_is_visible(); if (select_mode == SELECT_SINGLE) { @@ -663,7 +601,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { accept_event(); } } else if (p_event->is_action("ui_page_up")) { - search_string = ""; //any mousepress cancels for (int i = 4; i > 0; i--) { @@ -678,7 +615,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { } } } else if (p_event->is_action("ui_page_down")) { - search_string = ""; //any mousepress cancels for (int i = 4; i > 0; i--) { @@ -694,7 +630,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { } } } else if (p_event->is_action("ui_left")) { - search_string = ""; //any mousepress cancels if (current % current_columns != 0) { @@ -706,7 +641,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { accept_event(); } } else if (p_event->is_action("ui_right")) { - search_string = ""; //any mousepress cancels if (current % current_columns != (current_columns - 1) && current + 1 < items.size()) { @@ -720,7 +654,6 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { } else if (p_event->is_action("ui_cancel")) { search_string = ""; } else if (p_event->is_action("ui_select") && select_mode == SELECT_MULTI) { - if (current >= 0 && current < items.size()) { if (items[current].selectable && !items[current].disabled && !items[current].selected) { select(current, false); @@ -737,11 +670,9 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { emit_signal("item_activated", current); } } else { - Ref<InputEventKey> k = p_event; if (k.is_valid() && k->get_unicode()) { - uint64_t now = OS::get_singleton()->get_ticks_msec(); uint64_t diff = now - search_time_msec; uint64_t max_interval = uint64_t(GLOBAL_DEF("gui/timers/incremental_search_max_interval_msec", 2000)); @@ -751,19 +682,22 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { search_string = ""; } - if (String::chr(k->get_unicode()) != search_string) + if (String::chr(k->get_unicode()) != search_string) { search_string += String::chr(k->get_unicode()); + } for (int i = current + 1; i <= items.size(); i++) { if (i == items.size()) { - if (current == 0 || current == -1) + if (current == 0 || current == -1) { break; - else + } else { i = 0; + } } - if (i == current) + if (i == current) { break; + } if (items[i].text.findn(search_string) == 0) { set_current(i); @@ -780,22 +714,20 @@ void ItemList::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventPanGesture> pan_gesture = p_event; if (pan_gesture.is_valid()) { - scroll_bar->set_value(scroll_bar->get_value() + scroll_bar->get_page() * pan_gesture->get_delta().y / 8); } - if (scroll_bar->get_value() != prev_scroll) + if (scroll_bar->get_value() != prev_scroll) { accept_event(); //accept event if scroll changed + } } void ItemList::ensure_current_is_visible() { - ensure_selected_visible = true; update(); } static Rect2 _adjust_to_max_size(Size2 p_size, Size2 p_max_size) { - Size2 size = p_max_size; int tex_width = p_size.width * size.height / p_size.height; int tex_height = size.height; @@ -812,14 +744,12 @@ static Rect2 _adjust_to_max_size(Size2 p_size, Size2 p_max_size) { } void ItemList::_notification(int p_what) { - if (p_what == NOTIFICATION_RESIZED) { shape_changed = true; update(); } if (p_what == NOTIFICATION_DRAW) { - Ref<StyleBox> bg = get_theme_stylebox("bg"); int mw = scroll_bar->get_minimum_size().x; @@ -865,15 +795,12 @@ void ItemList::_notification(int p_what) { } if (shape_changed) { - float max_column_width = 0; //1- compute item minimum sizes for (int i = 0; i < items.size(); i++) { - Size2 minsize; if (items[i].icon.is_valid()) { - if (fixed_icon_size.x > 0 && fixed_icon_size.y > 0) { minsize = fixed_icon_size * icon_scale; } else { @@ -890,7 +817,6 @@ void ItemList::_notification(int p_what) { } if (items[i].text != "") { - Size2 s = font->get_string_size(items[i].text); //s.width=MIN(s.width,fixed_column_width); @@ -908,8 +834,9 @@ void ItemList::_notification(int p_what) { } } - if (fixed_column_width > 0) + if (fixed_column_width > 0) { minsize.x = fixed_column_width; + } max_column_width = MAX(max_column_width, minsize.x); // elements need to adapt to the selected size @@ -923,8 +850,9 @@ void ItemList::_notification(int p_what) { //2-attempt best fit current_columns = 0x7FFFFFFF; - if (max_columns > 0) + if (max_columns > 0) { current_columns = max_columns; + } while (true) { //repeat until all fits @@ -934,7 +862,6 @@ void ItemList::_notification(int p_what) { int max_h = 0; separators.clear(); for (int i = 0; i < items.size(); i++) { - if (current_columns > 1 && items[i].rect_cache.size.width + ofs.x > fit_size) { //went past current_columns = MAX(col, 1); @@ -942,16 +869,17 @@ void ItemList::_notification(int p_what) { break; } - if (same_column_width) + if (same_column_width) { items.write[i].rect_cache.size.x = max_column_width; + } items.write[i].rect_cache.position = ofs; max_h = MAX(max_h, items[i].rect_cache.size.y); ofs.x += items[i].rect_cache.size.x + hseparation; col++; if (col == current_columns) { - - if (i < items.size() - 1) + if (i < items.size() - 1) { separators.push_back(ofs.y + max_h + vseparation / 2); + } for (int j = i; j >= 0 && col > 0; j--, col--) { items.write[j].rect_cache.size.y = max_h; @@ -971,8 +899,9 @@ void ItemList::_notification(int p_what) { if (all_fit) { float page = MAX(0, size.height - bg->get_minimum_size().height); float max = MAX(page, ofs.y + max_h); - if (auto_height) + if (auto_height) { auto_height_value = ofs.y + max_h + bg->get_minimum_size().height; + } scroll_bar->set_max(max); scroll_bar->set_page(page); if (max <= page) { @@ -981,8 +910,9 @@ void ItemList::_notification(int p_what) { } else { scroll_bar->show(); - if (do_autoscroll_to_bottom) + if (do_autoscroll_to_bottom) { scroll_bar->set_value(max); + } } break; } @@ -994,7 +924,6 @@ void ItemList::_notification(int p_what) { //ensure_selected_visible needs to be checked before we draw the list. if (ensure_selected_visible && current >= 0 && current < items.size()) { - Rect2 r = items[current].rect_cache; int from = scroll_bar->get_value(); int to = from + scroll_bar->get_page(); @@ -1035,14 +964,15 @@ void ItemList::_notification(int p_what) { } for (int i = first_item_visible; i < items.size(); i++) { - Rect2 rcache = items[i].rect_cache; - if (rcache.position.y > clip.position.y + clip.size.y) + if (rcache.position.y > clip.position.y + clip.size.y) { break; // done + } - if (!clip.intersects(rcache)) + if (!clip.intersects(rcache)) { continue; + } if (current_columns == 1) { rcache.size.width = width - rcache.position.x; @@ -1073,7 +1003,6 @@ void ItemList::_notification(int p_what) { Vector2 text_ofs; if (items[i].icon.is_valid()) { - Size2 icon_size; //= _adjust_to_max_size(items[i].get_icon_size(),fixed_icon_size) * icon_scale; @@ -1088,7 +1017,6 @@ void ItemList::_notification(int p_what) { Point2 pos = items[i].rect_cache.position + icon_ofs + base_ofs; if (icon_mode == ICON_MODE_TOP) { - pos.x += Math::floor((items[i].rect_cache.size.width - icon_size.width) / 2); pos.y += MIN( Math::floor((items[i].rect_cache.size.height - icon_size.height) / 2), @@ -1096,7 +1024,6 @@ void ItemList::_notification(int p_what) { text_ofs.y = icon_size.height + icon_margin; text_ofs.y += items[i].rect_cache.size.height - items[i].min_rect_cache.size.height; } else { - pos.y += Math::floor((items[i].rect_cache.size.height - icon_size.height) / 2); text_ofs.x = icon_size.width + icon_margin; } @@ -1110,8 +1037,9 @@ void ItemList::_notification(int p_what) { } Color modulate = items[i].icon_modulate; - if (items[i].disabled) + if (items[i].disabled) { modulate.a *= 0.5; + } // If the icon is transposed, we have to switch the size so that it is drawn correctly if (items[i].icon_transposed) { @@ -1125,41 +1053,40 @@ void ItemList::_notification(int p_what) { } if (items[i].tag_icon.is_valid()) { - draw_texture(items[i].tag_icon, items[i].rect_cache.position + base_ofs); } if (items[i].text != "") { - int max_len = -1; Vector2 size2 = font->get_string_size(items[i].text); - if (fixed_column_width) + if (fixed_column_width) { max_len = fixed_column_width; - else if (same_column_width) + } else if (same_column_width) { max_len = items[i].rect_cache.size.x; - else + } else { max_len = size2.x; + } Color modulate = items[i].selected ? font_color_selected : (items[i].custom_fg != Color() ? items[i].custom_fg : font_color); - if (items[i].disabled) + if (items[i].disabled) { modulate.a *= 0.5; + } if (icon_mode == ICON_MODE_TOP && max_text_lines > 0) { - int ss = items[i].text.length(); float ofs = 0; int line = 0; for (int j = 0; j <= ss; j++) { - int cs = j < ss ? font->get_char_size(items[i].text[j], items[i].text[j + 1]).x : 0; if (ofs + cs > max_len || j == ss) { line_limit_cache.write[line] = j; line_size_cache.write[line] = ofs; line++; ofs = 0; - if (line >= max_text_lines) + if (line >= max_text_lines) { break; + } } else { ofs += cs; } @@ -1175,21 +1102,21 @@ void ItemList::_notification(int p_what) { FontDrawer drawer(font, Color(1, 1, 1)); for (int j = 0; j < ss; j++) { - if (j == line_limit_cache[line]) { line++; ofs = 0; - if (line >= max_text_lines) + if (line >= max_text_lines) { break; + } } ofs += drawer.draw_char(get_canvas_item(), text_ofs + Vector2(ofs + (max_len - line_size_cache[line]) / 2, line * (font_height + line_separation)).floor(), items[i].text[j], items[i].text[j + 1], modulate); } //special multiline mode } else { - - if (fixed_column_width > 0) + if (fixed_column_width > 0) { size2.x = MIN(size2.x, fixed_column_width); + } if (icon_mode == ICON_MODE_TOP) { text_ofs.x += (items[i].rect_cache.size.width - size2.x) / 2; @@ -1207,7 +1134,6 @@ void ItemList::_notification(int p_what) { } if (select_mode == SELECT_MULTI && i == current) { - Rect2 r = rcache; r.position += base_ofs; r.position.y -= vseparation / 2; @@ -1235,8 +1161,9 @@ void ItemList::_notification(int p_what) { } for (int i = first_visible_separator; i < separators.size(); i++) { - if (separators[i] > clip.position.y + clip.size.y) + if (separators[i] > clip.position.y + clip.size.y) { break; // done + } const int y = base_ofs.y + separators[i]; draw_line(Vector2(bg->get_margin(MARGIN_LEFT), y), Vector2(width, y), guide_color); @@ -1249,7 +1176,6 @@ void ItemList::_scroll_changed(double) { } int ItemList::get_item_at_position(const Point2 &p_pos, bool p_exact) const { - Vector2 pos = p_pos; Ref<StyleBox> bg = get_theme_stylebox("bg"); pos -= bg->get_offset(); @@ -1259,7 +1185,6 @@ int ItemList::get_item_at_position(const Point2 &p_pos, bool p_exact) const { int closest_dist = 0x7FFFFFFF; for (int i = 0; i < items.size(); i++) { - Rect2 rc = items[i].rect_cache; if (i % current_columns == current_columns - 1) { rc.size.width = get_size().width - rc.position.x; //make sure you can still select the last item when clicking past the column @@ -1281,9 +1206,9 @@ int ItemList::get_item_at_position(const Point2 &p_pos, bool p_exact) const { } bool ItemList::is_pos_at_end_of_items(const Point2 &p_pos) const { - - if (items.empty()) + if (items.empty()) { return true; + } Vector2 pos = p_pos; Ref<StyleBox> bg = get_theme_stylebox("bg"); @@ -1295,7 +1220,6 @@ bool ItemList::is_pos_at_end_of_items(const Point2 &p_pos) const { } String ItemList::get_tooltip(const Point2 &p_pos) const { - int closest = get_item_at_position(p_pos, true); if (closest != -1) { @@ -1314,7 +1238,6 @@ String ItemList::get_tooltip(const Point2 &p_pos) const { } void ItemList::sort_items_by_text() { - items.sort(); update(); shape_changed = true; @@ -1330,7 +1253,6 @@ void ItemList::sort_items_by_text() { } int ItemList::find_metadata(const Variant &p_metadata) const { - for (int i = 0; i < items.size(); i++) { if (items[i].metadata == p_metadata) { return i; @@ -1341,22 +1263,18 @@ int ItemList::find_metadata(const Variant &p_metadata) const { } void ItemList::set_allow_rmb_select(bool p_allow) { - allow_rmb_select = p_allow; } bool ItemList::get_allow_rmb_select() const { - return allow_rmb_select; } void ItemList::set_allow_reselect(bool p_allow) { - allow_reselect = p_allow; } bool ItemList::get_allow_reselect() const { - return allow_reselect; } @@ -1383,20 +1301,19 @@ Vector<int> ItemList::get_selected_items() { bool ItemList::is_anything_selected() { for (int i = 0; i < items.size(); i++) { - if (items[i].selected) + if (items[i].selected) { return true; + } } return false; } void ItemList::_set_items(const Array &p_items) { - ERR_FAIL_COND(p_items.size() % 3); clear(); for (int i = 0; i < p_items.size(); i += 3) { - String text = p_items[i + 0]; Ref<Texture2D> icon = p_items[i + 1]; bool disabled = p_items[i + 2]; @@ -1408,10 +1325,8 @@ void ItemList::_set_items(const Array &p_items) { } Array ItemList::_get_items() const { - Array items; for (int i = 0; i < get_item_count(); i++) { - items.push_back(get_item_text(i)); items.push_back(get_item_icon(i)); items.push_back(is_item_disabled(i)); @@ -1421,7 +1336,6 @@ Array ItemList::_get_items() const { } Size2 ItemList::get_minimum_size() const { - if (auto_height) { return Size2(0, auto_height_value); } @@ -1429,24 +1343,20 @@ Size2 ItemList::get_minimum_size() const { } void ItemList::set_autoscroll_to_bottom(const bool p_enable) { - do_autoscroll_to_bottom = p_enable; } void ItemList::set_auto_height(bool p_enable) { - auto_height = p_enable; shape_changed = true; update(); } bool ItemList::has_auto_height() const { - return auto_height; } void ItemList::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_item", "text", "icon", "selectable"), &ItemList::add_item, DEFVAL(Variant()), DEFVAL(true)); ClassDB::bind_method(D_METHOD("add_icon_item", "icon", "selectable"), &ItemList::add_icon_item, DEFVAL(true)); @@ -1581,7 +1491,6 @@ void ItemList::_bind_methods() { } ItemList::ItemList() { - current = -1; select_mode = SELECT_SINGLE; diff --git a/scene/gui/item_list.h b/scene/gui/item_list.h index da9851dd7d..4cdef40184 100644 --- a/scene/gui/item_list.h +++ b/scene/gui/item_list.h @@ -35,7 +35,6 @@ #include "scene/gui/scroll_bar.h" class ItemList : public Control { - GDCLASS(ItemList, Control); public: @@ -51,7 +50,6 @@ public: private: struct Item { - Ref<Texture2D> icon; bool icon_transposed; Rect2i icon_region; diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp index 7490101ee3..f49acc1b96 100644 --- a/scene/gui/label.cpp +++ b/scene/gui/label.cpp @@ -35,7 +35,6 @@ #include "core/translation.h" void Label::set_autowrap(bool p_autowrap) { - if (autowrap == p_autowrap) { return; } @@ -48,34 +47,31 @@ void Label::set_autowrap(bool p_autowrap) { minimum_size_changed(); } } -bool Label::has_autowrap() const { +bool Label::has_autowrap() const { return autowrap; } void Label::set_uppercase(bool p_uppercase) { - uppercase = p_uppercase; word_cache_dirty = true; update(); } -bool Label::is_uppercase() const { +bool Label::is_uppercase() const { return uppercase; } int Label::get_line_height() const { - return get_theme_font("font")->get_height(); } void Label::_notification(int p_what) { - if (p_what == NOTIFICATION_TRANSLATION_CHANGED) { - String new_text = tr(text); - if (new_text == xl_text) + if (new_text == xl_text) { return; //nothing new + } xl_text = new_text; regenerate_word_cache(); @@ -83,13 +79,13 @@ void Label::_notification(int p_what) { } if (p_what == NOTIFICATION_DRAW) { - if (clip) { RenderingServer::get_singleton()->canvas_item_set_clip(get_canvas_item(), true); } - if (word_cache_dirty) + if (word_cache_dirty) { regenerate_word_cache(); + } RID ci = get_canvas_item(); @@ -126,9 +122,7 @@ void Label::_notification(int p_what) { } if (lines_visible > 0) { - switch (valign) { - case VALIGN_TOP: { //nothing } break; @@ -155,22 +149,25 @@ void Label::_notification(int p_what) { } WordCache *wc = word_cache; - if (!wc) + if (!wc) { return; + } int line = 0; int line_to = lines_skipped + (lines_visible > 0 ? lines_visible : 1); FontDrawer drawer(font, font_outline_modulate); while (wc) { /* handle lines not meant to be drawn quickly */ - if (line >= line_to) + if (line >= line_to) { break; + } if (line < lines_skipped) { - - while (wc && wc->char_pos >= 0) + while (wc && wc->char_pos >= 0) { wc = wc->next; - if (wc) + } + if (wc) { wc = wc->next; + } line++; continue; } @@ -190,7 +187,6 @@ void Label::_notification(int p_what) { int taken = 0; int spaces = 0; while (to && to->char_pos >= 0) { - taken += to->pixel_width; if (to != from && to->space_count) { spaces += to->space_count; @@ -203,18 +199,14 @@ void Label::_notification(int p_what) { float x_ofs = 0; switch (align) { - case ALIGN_FILL: case ALIGN_LEFT: { - x_ofs = style->get_offset().x; } break; case ALIGN_CENTER: { - x_ofs = int(size.width - (taken + spaces * space_w)) / 2; } break; case ALIGN_RIGHT: { - x_ofs = int(size.width - style->get_margin(MARGIN_RIGHT) - (taken + spaces * space_w)); } break; } @@ -224,11 +216,9 @@ void Label::_notification(int p_what) { y_ofs += vbegin + line * vsep; while (from != to) { - // draw a word int pos = from->char_pos; if (from->char_pos < 0) { - ERR_PRINT("BUG"); return; } @@ -236,17 +226,14 @@ void Label::_notification(int p_what) { /* spacing */ x_ofs += space_w * from->space_count; if (can_fill && align == ALIGN_FILL && spaces) { - x_ofs += int((size.width - (taken + space_w * spaces)) / spaces); } } if (font_color_shadow.a > 0) { - int chars_total_shadow = chars_total; //save chars drawn float x_ofs_shadow = x_ofs; for (int i = 0; i < from->word_len; i++) { - if (visible_chars < 0 || chars_total_shadow < visible_chars) { CharType c = xl_text[i + pos]; CharType n = xl_text[i + pos + 1]; @@ -267,7 +254,6 @@ void Label::_notification(int p_what) { } } for (int i = 0; i < from->word_len; i++) { - if (visible_chars < 0 || chars_total < visible_chars) { CharType c = xl_text[i + pos]; CharType n = xl_text[i + pos + 1]; @@ -289,18 +275,15 @@ void Label::_notification(int p_what) { } if (p_what == NOTIFICATION_THEME_CHANGED) { - word_cache_dirty = true; update(); } if (p_what == NOTIFICATION_RESIZED) { - word_cache_dirty = true; } } Size2 Label::get_minimum_size() const { - Size2 min_style = get_theme_stylebox("normal")->get_minimum_size(); // don't want to mutable everything @@ -308,79 +291,78 @@ Size2 Label::get_minimum_size() const { const_cast<Label *>(this)->regenerate_word_cache(); } - if (autowrap) + if (autowrap) { return Size2(1, clip ? 1 : minsize.height) + min_style; - else { + } else { Size2 ms = minsize; - if (clip) + if (clip) { ms.width = 1; + } return ms + min_style; } } int Label::get_longest_line_width() const { - Ref<Font> font = get_theme_font("font"); real_t max_line_width = 0; real_t line_width = 0; for (int i = 0; i < xl_text.size(); i++) { - CharType current = xl_text[i]; - if (uppercase) + if (uppercase) { current = String::char_uppercase(current); + } if (current < 32) { - if (current == '\n') { - - if (line_width > max_line_width) + if (line_width > max_line_width) { max_line_width = line_width; + } line_width = 0; } } else { - real_t char_width = font->get_char_size(current, xl_text[i + 1]).width; line_width += char_width; } } - if (line_width > max_line_width) + if (line_width > max_line_width) { max_line_width = line_width; + } // ceiling to ensure autowrapping does not cut text return Math::ceil(max_line_width); } int Label::get_line_count() const { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return 1; - if (word_cache_dirty) + } + if (word_cache_dirty) { const_cast<Label *>(this)->regenerate_word_cache(); + } return line_count; } int Label::get_visible_line_count() const { - int line_spacing = get_theme_constant("line_spacing"); int font_h = get_theme_font("font")->get_height() + line_spacing; int lines_visible = (get_size().height - get_theme_stylebox("normal")->get_minimum_size().height + line_spacing) / font_h; - if (lines_visible > line_count) + if (lines_visible > line_count) { lines_visible = line_count; + } - if (max_lines_visible >= 0 && lines_visible > max_lines_visible) + if (max_lines_visible >= 0 && lines_visible > max_lines_visible) { lines_visible = max_lines_visible; + } return lines_visible; } void Label::regenerate_word_cache() { - while (word_cache) { - WordCache *current = word_cache; word_cache = current->next; memdelete(current); @@ -408,11 +390,11 @@ void Label::regenerate_word_cache() { WordCache *last = nullptr; for (int i = 0; i <= xl_text.length(); i++) { - CharType current = i < xl_text.length() ? xl_text[i] : L' '; //always a space at the end, so the algo works - if (uppercase) + if (uppercase) { current = String::char_uppercase(current); + } // ranges taken from http://www.unicodemap.org/ // if your language is not well supported, consider helping improve @@ -423,7 +405,6 @@ void Label::regenerate_word_cache() { real_t char_width = 0; if (current < 33) { - if (current_word_size > 0) { WordCache *wc = memnew(WordCache); if (word_cache) { @@ -509,8 +490,9 @@ void Label::regenerate_word_cache() { } } - if (!autowrap) + if (!autowrap) { minsize.width = width; + } if (max_lines_visible > 0 && line_count > max_lines_visible) { minsize.height = (font->get_height() * max_lines_visible) + (line_spacing * (max_lines_visible - 1)); @@ -526,60 +508,53 @@ void Label::regenerate_word_cache() { } void Label::set_align(Align p_align) { - ERR_FAIL_INDEX((int)p_align, 4); align = p_align; update(); } Label::Align Label::get_align() const { - return align; } void Label::set_valign(VAlign p_align) { - ERR_FAIL_INDEX((int)p_align, 4); valign = p_align; update(); } Label::VAlign Label::get_valign() const { - return valign; } void Label::set_text(const String &p_string) { - - if (text == p_string) + if (text == p_string) { return; + } text = p_string; xl_text = tr(p_string); word_cache_dirty = true; - if (percent_visible < 1) + if (percent_visible < 1) { visible_chars = get_total_character_count() * percent_visible; + } update(); } void Label::set_clip_text(bool p_clip) { - clip = p_clip; update(); minimum_size_changed(); } bool Label::is_clipping_text() const { - return clip; } String Label::get_text() const { - return text; } void Label::set_visible_characters(int p_amount) { - visible_chars = p_amount; if (get_total_character_count() > 0) { percent_visible = (float)p_amount / (float)total_char_cache; @@ -589,19 +564,15 @@ void Label::set_visible_characters(int p_amount) { } int Label::get_visible_characters() const { - return visible_chars; } void Label::set_percent_visible(float p_percent) { - if (p_percent < 0 || p_percent >= 1) { - visible_chars = -1; percent_visible = 1; } else { - visible_chars = get_total_character_count() * p_percent; percent_visible = p_percent; } @@ -610,42 +581,36 @@ void Label::set_percent_visible(float p_percent) { } float Label::get_percent_visible() const { - return percent_visible; } void Label::set_lines_skipped(int p_lines) { - lines_skipped = p_lines; update(); } int Label::get_lines_skipped() const { - return lines_skipped; } void Label::set_max_lines_visible(int p_lines) { - max_lines_visible = p_lines; update(); } int Label::get_max_lines_visible() const { - return max_lines_visible; } int Label::get_total_character_count() const { - - if (word_cache_dirty) + if (word_cache_dirty) { const_cast<Label *>(this)->regenerate_word_cache(); + } return total_char_cache; } void Label::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_align", "align"), &Label::set_align); ClassDB::bind_method(D_METHOD("get_align"), &Label::get_align); ClassDB::bind_method(D_METHOD("set_valign", "valign"), &Label::set_valign); @@ -700,9 +665,7 @@ Label::Label(const String &p_text) { } Label::~Label() { - while (word_cache) { - WordCache *current = word_cache; word_cache = current->next; memdelete(current); diff --git a/scene/gui/label.h b/scene/gui/label.h index 0f84b01604..670db69dce 100644 --- a/scene/gui/label.h +++ b/scene/gui/label.h @@ -34,7 +34,6 @@ #include "scene/gui/control.h" class Label : public Control { - GDCLASS(Label, Control); public: @@ -68,7 +67,6 @@ private: int get_longest_line_width() const; struct WordCache { - enum { CHAR_NEWLINE = -1, CHAR_WRAPLINE = -2 diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index bb177ae0e7..e3c75491f7 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -43,16 +43,13 @@ #endif #include "scene/main/window.h" static bool _is_text_char(CharType c) { - return !is_symbol(c); } void LineEdit::_gui_input(Ref<InputEvent> p_event) { - Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { - if (b->is_pressed() && b->get_button_index() == BUTTON_RIGHT && context_menu_enabled) { menu->set_position(get_global_transform().xform(get_local_mouse_position())); menu->set_size(Vector2(1, 1)); @@ -63,12 +60,12 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { return; } - if (b->get_button_index() != BUTTON_LEFT) + if (b->get_button_index() != BUTTON_LEFT) { return; + } _reset_caret_blink_timer(); if (b->is_pressed()) { - accept_event(); //don't pass event further when clicked on text field if (!text.empty() && is_editable() && _is_over_clear_button(b->get_position())) { clear_button_status.press_attempt = true; @@ -81,14 +78,11 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { set_cursor_at_pixel_pos(b->get_position().x); if (b->get_shift()) { - selection_fill_at_cursor(); selection.creating = true; } else { - if (b->is_doubleclick() && selecting_enabled) { - selection.enabled = true; selection.begin = 0; selection.end = text.length(); @@ -98,12 +92,10 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { selection.drag_attempt = false; if ((cursor_pos < selection.begin) || (cursor_pos > selection.end) || !selection.enabled) { - deselect(); selection.cursor_start = cursor_pos; selection.creating = true; } else if (selection.enabled) { - selection.drag_attempt = true; } } @@ -111,7 +103,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { update(); } else { - if (!text.empty() && is_editable() && clear_button_enabled) { bool press_attempt = clear_button_status.press_attempt; clear_button_status.press_attempt = false; @@ -127,8 +118,9 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { selection.creating = false; selection.doubleclick = false; - if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) { DisplayServer::get_singleton()->virtual_keyboard_show(text, get_global_rect(), max_length); + } } update(); @@ -137,7 +129,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseMotion> m = p_event; if (m.is_valid()) { - if (!text.empty() && is_editable() && clear_button_enabled) { bool last_press_inside = clear_button_status.pressing_inside; clear_button_status.pressing_inside = clear_button_status.press_attempt && _is_over_clear_button(m->get_position()); @@ -147,7 +138,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { } if (m->get_button_mask() & BUTTON_LEFT) { - if (selection.creating) { set_cursor_at_pixel_pos(m->get_position().x); selection_fill_at_cursor(); @@ -158,9 +148,9 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventKey> k = p_event; if (k.is_valid()) { - - if (!k->is_pressed()) + if (!k->is_pressed()) { return; + } #ifdef APPLE_STYLE_KEYS if (k->get_control() && !k->get_shift() && !k->get_alt() && !k->get_command()) { @@ -202,11 +192,9 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { unsigned int code = k->get_keycode(); if (k->get_command() && is_shortcut_keys_enabled()) { - bool handled = true; switch (code) { - case (KEY_X): { // CUT. if (editable) { @@ -224,7 +212,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { case (KEY_V): { // PASTE. if (editable) { - paste_text(); } @@ -243,7 +230,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { case (KEY_U): { // Delete from start to cursor. if (editable) { - deselect(); text = text.substr(cursor_pos, text.length() - cursor_pos); update_cached_width(); @@ -256,7 +242,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { case (KEY_Y): { // PASTE (Yank for unix users). if (editable) { - paste_text(); } @@ -264,7 +249,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { case (KEY_K): { // Delete from cursor_pos to end. if (editable) { - deselect(); text = text.substr(0, cursor_pos); _text_changed(); @@ -300,23 +284,21 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { _reset_caret_blink_timer(); if (!k->get_metakey()) { - bool handled = true; switch (code) { - case KEY_KP_ENTER: case KEY_ENTER: { - emit_signal("text_entered", text); - if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) { DisplayServer::get_singleton()->virtual_keyboard_hide(); + } } break; case KEY_BACKSPACE: { - - if (!editable) + if (!editable) { break; + } if (selection.enabled) { selection_delete(); @@ -337,8 +319,9 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { while (cc > 0) { bool ischar = _is_text_char(text[cc - 1]); - if (prev_char && !ischar) + if (prev_char && !ischar) { break; + } prev_char = ischar; cc--; @@ -380,7 +363,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { if (k->get_command()) { set_cursor_position(0); } else if (k->get_alt()) { - #else if (k->get_alt()) { handled = false; @@ -393,8 +375,9 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { while (cc > 0) { bool ischar = _is_text_char(text[cc - 1]); - if (prev_char && !ischar) + if (prev_char && !ischar) { break; + } prev_char = ischar; cc--; @@ -448,8 +431,9 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { while (cc < text.length()) { bool ischar = _is_text_char(text[cc]); - if (prev_char && !ischar) + if (prev_char && !ischar) { break; + } prev_char = ischar; cc++; @@ -465,25 +449,25 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { } break; case KEY_UP: { - shift_selection_check_pre(k->get_shift()); - if (get_cursor_position() == 0) + if (get_cursor_position() == 0) { handled = false; + } set_cursor_position(0); shift_selection_check_post(k->get_shift()); } break; case KEY_DOWN: { - shift_selection_check_pre(k->get_shift()); - if (get_cursor_position() == text.length()) + if (get_cursor_position() == text.length()) { handled = false; + } set_cursor_position(text.length()); shift_selection_check_post(k->get_shift()); } break; case KEY_DELETE: { - - if (!editable) + if (!editable) { break; + } if (k->get_shift() && !k->get_command() && !k->get_alt()) { cut_text(); @@ -497,8 +481,9 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { int text_len = text.length(); - if (cursor_pos == text_len) + if (cursor_pos == text_len) { break; // Nothing to do. + } #ifdef APPLE_STYLE_KEYS if (k->get_alt()) { @@ -513,11 +498,11 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { bool prev_char = false; while (cc < text.length()) { - bool ischar = _is_text_char(text[cc]); - if (prev_char && !ischar) + if (prev_char && !ischar) { break; + } prev_char = ischar; cc++; } @@ -538,7 +523,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { [[fallthrough]]; } case KEY_HOME: { - shift_selection_check_pre(k->get_shift()); set_cursor_position(0); shift_selection_check_post(k->get_shift()); @@ -551,7 +535,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { [[fallthrough]]; } case KEY_END: { - shift_selection_check_pre(k->get_shift()); set_cursor_position(text.length()); shift_selection_check_post(k->get_shift()); @@ -568,7 +551,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { } break; default: { - handled = false; } break; } @@ -577,7 +559,6 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { accept_event(); } else if (!k->get_command()) { if (k->get_unicode() >= 32 && k->get_keycode() != KEY_DELETE) { - if (editable) { selection_delete(); CharType ucodestr[2] = { (CharType)k->get_unicode(), 0 }; @@ -602,19 +583,16 @@ void LineEdit::_gui_input(Ref<InputEvent> p_event) { } void LineEdit::set_align(Align p_align) { - ERR_FAIL_INDEX((int)p_align, 4); align = p_align; update(); } LineEdit::Align LineEdit::get_align() const { - return align; } Variant LineEdit::get_drag_data(const Point2 &p_point) { - if (selection.drag_attempt && selection.enabled) { String t = text.substr(selection.begin, selection.end - selection.begin); Label *l = memnew(Label); @@ -625,20 +603,21 @@ Variant LineEdit::get_drag_data(const Point2 &p_point) { return Variant(); } -bool LineEdit::can_drop_data(const Point2 &p_point, const Variant &p_data) const { +bool LineEdit::can_drop_data(const Point2 &p_point, const Variant &p_data) const { return p_data.get_type() == Variant::STRING; } -void LineEdit::drop_data(const Point2 &p_point, const Variant &p_data) { +void LineEdit::drop_data(const Point2 &p_point, const Variant &p_data) { if (p_data.get_type() == Variant::STRING) { set_cursor_at_pixel_pos(p_point.x); int selected = selection.end - selection.begin; Ref<Font> font = get_theme_font("font"); if (font != nullptr) { - for (int i = selection.begin; i < selection.end; i++) + for (int i = selection.begin; i < selection.end; i++) { cached_width -= font->get_char_size(pass ? secret_character[0] : text[i]).width; + } } text.erase(selection.begin, selected); @@ -666,7 +645,6 @@ bool LineEdit::_is_over_clear_button(const Point2 &p_pos) const { } void LineEdit::_notification(int p_what) { - switch (p_what) { #ifdef TOOLS_ENABLED case NOTIFICATION_ENTER_TREE: { @@ -681,7 +659,6 @@ void LineEdit::_notification(int p_what) { } break; #endif case NOTIFICATION_RESIZED: { - window_pos = 0; set_cursor_position(get_cursor_position()); @@ -702,7 +679,6 @@ void LineEdit::_notification(int p_what) { update(); } break; case NOTIFICATION_DRAW: { - if ((!has_focus() && !menu->has_focus()) || !window_has_focus) { draw_caret = false; } @@ -726,7 +702,6 @@ void LineEdit::_notification(int p_what) { style->draw(ci, Rect2(Point2(), size)); if (has_focus()) { - get_theme_stylebox("focus")->draw(ci, Rect2(Point2(), size)); } @@ -735,21 +710,18 @@ void LineEdit::_notification(int p_what) { int cached_text_width = using_placeholder ? cached_placeholder_width : cached_width; switch (align) { - case ALIGN_FILL: case ALIGN_LEFT: { - x_ofs = style->get_offset().x; } break; case ALIGN_CENTER: { - - if (window_pos != 0) + if (window_pos != 0) { x_ofs = style->get_offset().x; - else + } else { x_ofs = MAX(style->get_margin(MARGIN_LEFT), int(size.width - (cached_text_width)) / 2); + } } break; case ALIGN_RIGHT: { - x_ofs = MAX(style->get_margin(MARGIN_LEFT), int(size.width - style->get_margin(MARGIN_RIGHT) - (cached_text_width))); } break; } @@ -769,8 +741,9 @@ void LineEdit::_notification(int p_what) { const String &t = using_placeholder ? placeholder_translated : text; // Draw placeholder color. - if (using_placeholder) + if (using_placeholder) { font_color.a *= placeholder_alpha; + } bool display_clear_icon = !using_placeholder && is_editable() && clear_button_enabled; if (right_icon.is_valid() || display_clear_icon) { @@ -800,24 +773,26 @@ void LineEdit::_notification(int p_what) { int caret_height = font->get_height() > y_area ? y_area : font->get_height(); FontDrawer drawer(font, Color(1, 1, 1)); while (true) { - // End of string, break. - if (char_ofs >= t.length()) + if (char_ofs >= t.length()) { break; + } if (char_ofs == cursor_pos) { if (ime_text.length() > 0) { int ofs = 0; while (true) { - if (ofs >= ime_text.length()) + if (ofs >= ime_text.length()) { break; + } CharType cchar = (pass && !text.empty()) ? secret_character[0] : ime_text[ofs]; CharType next = (pass && !text.empty()) ? secret_character[0] : ime_text[ofs + 1]; int im_char_width = font->get_char_size(cchar, next).width; - if ((x_ofs + im_char_width) > ofs_max) + if ((x_ofs + im_char_width) > ofs_max) { break; + } bool selected = ofs >= ime_selection.x && ofs < ime_selection.x + ime_selection.y; if (selected) { @@ -839,13 +814,15 @@ void LineEdit::_notification(int p_what) { int char_width = font->get_char_size(cchar, next).width; // End of widget, break. - if ((x_ofs + char_width) > ofs_max) + if ((x_ofs + char_width) > ofs_max) { break; + } bool selected = selection.enabled && char_ofs >= selection.begin && char_ofs < selection.end; - if (selected) + if (selected) { RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2(x_ofs, y_ofs), Size2(char_width, caret_height)), selection_color); + } int yofs = y_ofs + (caret_height - font->get_height()) / 2; drawer.draw_char(ci, Point2(x_ofs, yofs + font_ascent), cchar, next, selected ? font_color_selected : font_color); @@ -868,15 +845,17 @@ void LineEdit::_notification(int p_what) { if (ime_text.length() > 0) { int ofs = 0; while (true) { - if (ofs >= ime_text.length()) + if (ofs >= ime_text.length()) { break; + } CharType cchar = (pass && !text.empty()) ? secret_character[0] : ime_text[ofs]; CharType next = (pass && !text.empty()) ? secret_character[0] : ime_text[ofs + 1]; int im_char_width = font->get_char_size(cchar, next).width; - if ((x_ofs + im_char_width) > ofs_max) + if ((x_ofs + im_char_width) > ofs_max) { break; + } bool selected = ofs >= ime_selection.x && ofs < ime_selection.x + ime_selection.y; if (selected) { @@ -926,7 +905,6 @@ void LineEdit::_notification(int p_what) { } } break; case NOTIFICATION_FOCUS_ENTER: { - if (caret_blink_enabled) { caret_blink_timer->start(); } else { @@ -939,12 +917,12 @@ void LineEdit::_notification(int p_what) { DisplayServer::get_singleton()->window_set_ime_position(get_global_position() + cursor_pos, get_viewport()->get_window_id()); } - if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) { DisplayServer::get_singleton()->virtual_keyboard_show(text, get_global_rect(), max_length); + } } break; case NOTIFICATION_FOCUS_EXIT: { - if (caret_blink_enabled) { caret_blink_timer->stop(); } @@ -956,12 +934,12 @@ void LineEdit::_notification(int p_what) { ime_text = ""; ime_selection = Point2(); - if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) { DisplayServer::get_singleton()->virtual_keyboard_hide(); + } } break; case MainLoop::NOTIFICATION_OS_IME_UPDATE: { - if (has_focus()) { ime_text = DisplayServer::get_singleton()->ime_get_text(); ime_selection = DisplayServer::get_singleton()->ime_get_selection(); @@ -972,14 +950,12 @@ void LineEdit::_notification(int p_what) { } void LineEdit::copy_text() { - if (selection.enabled && !pass) { DisplayServer::get_singleton()->clipboard_set(text.substr(selection.begin, selection.end - selection.begin)); } } void LineEdit::cut_text() { - if (selection.enabled && !pass) { DisplayServer::get_singleton()->clipboard_set(text.substr(selection.begin, selection.end - selection.begin)); selection_delete(); @@ -987,15 +963,14 @@ void LineEdit::cut_text() { } void LineEdit::paste_text() { - // Strip escape characters like \n and \t as they can't be displayed on LineEdit. String paste_buffer = DisplayServer::get_singleton()->clipboard_get().strip_escapes(); if (paste_buffer != "") { - int prev_len = text.length(); - if (selection.enabled) + if (selection.enabled) { selection_delete(); + } append_at_cursor(paste_buffer); if (!text_changed_dirty) { @@ -1023,8 +998,9 @@ void LineEdit::undo() { window_pos = op.window_pos; set_cursor_position(op.cursor_pos); - if (expand_to_text_length) + if (expand_to_text_length) { minimum_size_changed(); + } _emit_text_change(); } @@ -1043,29 +1019,29 @@ void LineEdit::redo() { window_pos = op.window_pos; set_cursor_position(op.cursor_pos); - if (expand_to_text_length) + if (expand_to_text_length) { minimum_size_changed(); + } _emit_text_change(); } void LineEdit::shift_selection_check_pre(bool p_shift) { - if (!selection.enabled && p_shift) { selection.cursor_start = cursor_pos; } - if (!p_shift) + if (!p_shift) { deselect(); + } } void LineEdit::shift_selection_check_post(bool p_shift) { - - if (p_shift) + if (p_shift) { selection_fill_at_cursor(); + } } void LineEdit::set_cursor_at_pixel_pos(int p_x) { - Ref<Font> font = get_theme_font("font"); int ofs = window_pos; Ref<StyleBox> style = get_theme_stylebox("normal"); @@ -1075,33 +1051,31 @@ void LineEdit::set_cursor_at_pixel_pos(int p_x) { int r_icon_width = Control::get_theme_icon("clear")->get_width(); switch (align) { - case ALIGN_FILL: case ALIGN_LEFT: { - pixel_ofs = int(style->get_offset().x); } break; case ALIGN_CENTER: { - - if (window_pos != 0) + if (window_pos != 0) { pixel_ofs = int(style->get_offset().x); - else + } else { pixel_ofs = int(size.width - (cached_width)) / 2; + } - if (display_clear_icon) + if (display_clear_icon) { pixel_ofs -= int(r_icon_width / 2 + style->get_margin(MARGIN_RIGHT)); + } } break; case ALIGN_RIGHT: { - pixel_ofs = int(size.width - style->get_margin(MARGIN_RIGHT) - (cached_width)); - if (display_clear_icon) + if (display_clear_icon) { pixel_ofs -= int(r_icon_width + style->get_margin(MARGIN_RIGHT)); + } } break; } while (ofs < text.length()) { - int char_w = 0; if (font != nullptr) { char_w = font->get_char_size(pass ? secret_character[0] : text[ofs]).width; @@ -1119,7 +1093,6 @@ void LineEdit::set_cursor_at_pixel_pos(int p_x) { } int LineEdit::get_cursor_pixel_pos() { - Ref<Font> font = get_theme_font("font"); int ofs = window_pos; Ref<StyleBox> style = get_theme_stylebox("normal"); @@ -1129,28 +1102,27 @@ int LineEdit::get_cursor_pixel_pos() { int r_icon_width = Control::get_theme_icon("clear")->get_width(); switch (align) { - case ALIGN_FILL: case ALIGN_LEFT: { - pixel_ofs = int(style->get_offset().x); } break; case ALIGN_CENTER: { - - if (window_pos != 0) + if (window_pos != 0) { pixel_ofs = int(style->get_offset().x); - else + } else { pixel_ofs = int(size.width - (cached_width)) / 2; + } - if (display_clear_icon) + if (display_clear_icon) { pixel_ofs -= int(r_icon_width / 2 + style->get_margin(MARGIN_RIGHT)); + } } break; case ALIGN_RIGHT: { - pixel_ofs = int(size.width - style->get_margin(MARGIN_RIGHT) - (cached_width)); - if (display_clear_icon) + if (display_clear_icon) { pixel_ofs -= int(r_icon_width + style->get_margin(MARGIN_RIGHT)); + } } break; } @@ -1210,9 +1182,9 @@ void LineEdit::_toggle_draw_caret() { } void LineEdit::delete_char() { - - if ((text.length() <= 0) || (cursor_pos == 0)) + if ((text.length() <= 0) || (cursor_pos == 0)) { return; + } Ref<Font> font = get_theme_font("font"); if (font != nullptr) { @@ -1231,12 +1203,12 @@ void LineEdit::delete_char() { } void LineEdit::delete_text(int p_from_column, int p_to_column) { - if (text.size() > 0) { Ref<Font> font = get_theme_font("font"); if (font != nullptr) { - for (int i = p_from_column; i < p_to_column; i++) + for (int i = p_from_column; i < p_to_column; i++) { cached_width -= font->get_char_size(pass ? secret_character[0] : text[i]).width; + } } } else { cached_width = 0; @@ -1246,11 +1218,9 @@ void LineEdit::delete_text(int p_from_column, int p_to_column) { cursor_pos -= CLAMP(cursor_pos - p_from_column, 0, p_to_column - p_from_column); if (cursor_pos >= text.length()) { - cursor_pos = text.length(); } if (window_pos > cursor_pos) { - window_pos = cursor_pos; } @@ -1267,7 +1237,6 @@ void LineEdit::delete_text(int p_from_column, int p_to_column) { } void LineEdit::set_text(String p_text) { - clear_internal(); append_at_cursor(p_text); @@ -1281,18 +1250,15 @@ void LineEdit::set_text(String p_text) { } void LineEdit::clear() { - clear_internal(); _text_changed(); } String LineEdit::get_text() const { - return text; } void LineEdit::set_placeholder(String p_text) { - placeholder = p_text; placeholder_translated = tr(placeholder); update_placeholder_width(); @@ -1300,33 +1266,30 @@ void LineEdit::set_placeholder(String p_text) { } String LineEdit::get_placeholder() const { - return placeholder; } void LineEdit::set_placeholder_alpha(float p_alpha) { - placeholder_alpha = p_alpha; update(); } float LineEdit::get_placeholder_alpha() const { - return placeholder_alpha; } void LineEdit::set_cursor_position(int p_pos) { - - if (p_pos > (int)text.length()) + if (p_pos > (int)text.length()) { p_pos = text.length(); + } - if (p_pos < 0) + if (p_pos < 0) { p_pos = 0; + } cursor_pos = p_pos; if (!is_inside_tree()) { - window_pos = cursor_pos; return; } @@ -1346,16 +1309,15 @@ void LineEdit::set_cursor_position(int p_pos) { window_width -= r_icon->get_width(); } - if (window_width < 0) + if (window_width < 0) { return; + } int wp = window_pos; if (font.is_valid()) { - int accum_width = 0; for (int i = cursor_pos; i >= window_pos; i--) { - if (i >= text.length()) { // Do not do this, because if the cursor is at the end, its just fine that it takes no space. // accum_width = font->get_char_size(' ').width; @@ -1366,33 +1328,33 @@ void LineEdit::set_cursor_position(int p_pos) { accum_width += font->get_char_size(text[i], i + 1 < text.length() ? text[i + 1] : 0).width; // Anything should do. } } - if (accum_width > window_width) + if (accum_width > window_width) { break; + } wp = i; } } - if (wp != window_pos) + if (wp != window_pos) { set_window_pos(wp); + } } update(); } int LineEdit::get_cursor_position() const { - return cursor_pos; } void LineEdit::set_window_pos(int p_pos) { - window_pos = p_pos; - if (window_pos < 0) + if (window_pos < 0) { window_pos = 0; + } } void LineEdit::append_at_cursor(String p_text) { - if ((max_length <= 0) || (text.length() + p_text.length() <= max_length)) { String pre = text.substr(0, cursor_pos); String post = text.substr(cursor_pos, text.length() - cursor_pos); @@ -1405,7 +1367,6 @@ void LineEdit::append_at_cursor(String p_text) { } void LineEdit::clear_internal() { - deselect(); _clear_undo_stack(); cached_width = 0; @@ -1417,7 +1378,6 @@ void LineEdit::clear_internal() { } Size2 LineEdit::get_minimum_size() const { - Ref<StyleBox> style = get_theme_stylebox("normal"); Ref<Font> font = get_theme_font("font"); @@ -1448,7 +1408,6 @@ Size2 LineEdit::get_minimum_size() const { } void LineEdit::deselect() { - selection.begin = 0; selection.end = 0; selection.cursor_start = 0; @@ -1459,28 +1418,27 @@ void LineEdit::deselect() { } void LineEdit::selection_delete() { - - if (selection.enabled) + if (selection.enabled) { delete_text(selection.begin, selection.end); + } deselect(); } void LineEdit::set_max_length(int p_max_length) { - ERR_FAIL_COND(p_max_length < 0); max_length = p_max_length; set_text(text); } int LineEdit::get_max_length() const { - return max_length; } void LineEdit::selection_fill_at_cursor() { - if (!selecting_enabled) + if (!selecting_enabled) { return; + } selection.begin = cursor_pos; selection.end = selection.cursor_start; @@ -1495,11 +1453,13 @@ void LineEdit::selection_fill_at_cursor() { } void LineEdit::select_all() { - if (!selecting_enabled) + if (!selecting_enabled) { return; + } - if (!text.length()) + if (!text.length()) { return; + } selection.begin = 0; selection.end = text.length(); @@ -1508,9 +1468,9 @@ void LineEdit::select_all() { } void LineEdit::set_editable(bool p_editable) { - - if (editable == p_editable) + if (editable == p_editable) { return; + } editable = p_editable; _generate_context_menu(); @@ -1520,24 +1480,20 @@ void LineEdit::set_editable(bool p_editable) { } bool LineEdit::is_editable() const { - return editable; } void LineEdit::set_secret(bool p_secret) { - pass = p_secret; update_cached_width(); update(); } bool LineEdit::is_secret() const { - return pass; } void LineEdit::set_secret_character(const String &p_string) { - // An empty string as the secret character would crash the engine. // It also wouldn't make sense to use multiple characters as the secret character. ERR_FAIL_COND_MSG(p_string.length() != 1, "Secret character must be exactly one character long (" + itos(p_string.length()) + " characters given)."); @@ -1552,8 +1508,9 @@ String LineEdit::get_secret_character() const { } void LineEdit::select(int p_from, int p_to) { - if (!selecting_enabled) + if (!selecting_enabled) { return; + } if (p_from == 0 && p_to == 0) { deselect(); @@ -1561,15 +1518,19 @@ void LineEdit::select(int p_from, int p_to) { } int len = text.length(); - if (p_from < 0) + if (p_from < 0) { p_from = 0; - if (p_from > len) + } + if (p_from > len) { p_from = len; - if (p_to < 0 || p_to > len) + } + if (p_to < 0 || p_to > len) { p_to = len; + } - if (p_from >= p_to) + if (p_from >= p_to) { return; + } selection.enabled = true; selection.begin = p_from; @@ -1580,12 +1541,10 @@ void LineEdit::select(int p_from, int p_to) { } bool LineEdit::is_text_field() const { - return true; } void LineEdit::menu_option(int p_option) { - switch (p_option) { case MENU_CUT: { if (editable) { @@ -1593,7 +1552,6 @@ void LineEdit::menu_option(int p_option) { } } break; case MENU_COPY: { - copy_text(); } break; case MENU_PASTE: { @@ -1642,7 +1600,6 @@ void LineEdit::_editor_settings_changed() { } void LineEdit::set_expand_to_text_length(bool p_enabled) { - expand_to_text_length = p_enabled; minimum_size_changed(); set_window_pos(0); @@ -1678,8 +1635,9 @@ bool LineEdit::is_shortcut_keys_enabled() const { void LineEdit::set_selecting_enabled(bool p_enabled) { selecting_enabled = p_enabled; - if (!selecting_enabled) + if (!selecting_enabled) { deselect(); + } _generate_context_menu(); } @@ -1702,8 +1660,9 @@ Ref<Texture2D> LineEdit::get_right_icon() { } void LineEdit::_text_changed() { - if (expand_to_text_length) + if (expand_to_text_length) { minimum_size_changed(); + } _emit_text_change(); _clear_redo(); @@ -1769,14 +1728,17 @@ void LineEdit::_create_undo_state() { void LineEdit::_generate_context_menu() { // Reorganize context menu. menu->clear(); - if (editable) + if (editable) { menu->add_item(RTR("Cut"), MENU_CUT, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_X : 0); + } menu->add_item(RTR("Copy"), MENU_COPY, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_C : 0); - if (editable) + if (editable) { menu->add_item(RTR("Paste"), MENU_PASTE, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_V : 0); + } menu->add_separator(); - if (is_selecting_enabled()) + if (is_selecting_enabled()) { menu->add_item(RTR("Select All"), MENU_SELECT_ALL, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_A : 0); + } if (editable) { menu->add_item(RTR("Clear"), MENU_CLEAR); menu->add_separator(); @@ -1786,7 +1748,6 @@ void LineEdit::_generate_context_menu() { } void LineEdit::_bind_methods() { - ClassDB::bind_method(D_METHOD("_text_changed"), &LineEdit::_text_changed); ClassDB::bind_method(D_METHOD("set_align", "align"), &LineEdit::set_align); @@ -1873,7 +1834,6 @@ void LineEdit::_bind_methods() { } LineEdit::LineEdit() { - undo_stack_pos = nullptr; _create_undo_state(); align = ALIGN_LEFT; diff --git a/scene/gui/line_edit.h b/scene/gui/line_edit.h index 938974453a..d31a5cb8d8 100644 --- a/scene/gui/line_edit.h +++ b/scene/gui/line_edit.h @@ -35,7 +35,6 @@ #include "scene/gui/popup_menu.h" class LineEdit : public Control { - GDCLASS(LineEdit, Control); public: @@ -94,7 +93,6 @@ private: Ref<Texture2D> right_icon; struct Selection { - int begin; int end; int cursor_start; diff --git a/scene/gui/link_button.cpp b/scene/gui/link_button.cpp index 098e8297ad..f8c8bd4caf 100644 --- a/scene/gui/link_button.cpp +++ b/scene/gui/link_button.cpp @@ -31,7 +31,6 @@ #include "link_button.h" void LinkButton::set_text(const String &p_text) { - text = p_text; update(); minimum_size_changed(); @@ -42,58 +41,48 @@ String LinkButton::get_text() const { } void LinkButton::set_underline_mode(UnderlineMode p_underline_mode) { - underline_mode = p_underline_mode; update(); } LinkButton::UnderlineMode LinkButton::get_underline_mode() const { - return underline_mode; } Size2 LinkButton::get_minimum_size() const { - return get_theme_font("font")->get_string_size(text); } void LinkButton::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_DRAW: { - RID ci = get_canvas_item(); Size2 size = get_size(); Color color; bool do_underline = false; switch (get_draw_mode()) { - case DRAW_NORMAL: { - color = get_theme_color("font_color"); do_underline = underline_mode == UNDERLINE_MODE_ALWAYS; } break; case DRAW_HOVER_PRESSED: case DRAW_PRESSED: { - - if (has_theme_color("font_color_pressed")) + if (has_theme_color("font_color_pressed")) { color = get_theme_color("font_color_pressed"); - else + } else { color = get_theme_color("font_color"); + } do_underline = underline_mode != UNDERLINE_MODE_NEVER; } break; case DRAW_HOVER: { - color = get_theme_color("font_color_hover"); do_underline = underline_mode != UNDERLINE_MODE_NEVER; } break; case DRAW_DISABLED: { - color = get_theme_color("font_color_disabled"); do_underline = underline_mode == UNDERLINE_MODE_ALWAYS; @@ -101,7 +90,6 @@ void LinkButton::_notification(int p_what) { } if (has_focus()) { - Ref<StyleBox> style = get_theme_stylebox("focus"); style->draw(ci, Rect2(Point2(), size)); } @@ -123,7 +111,6 @@ void LinkButton::_notification(int p_what) { } void LinkButton::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_text", "text"), &LinkButton::set_text); ClassDB::bind_method(D_METHOD("get_text"), &LinkButton::get_text); diff --git a/scene/gui/link_button.h b/scene/gui/link_button.h index 3bef25e249..ee37a29f9d 100644 --- a/scene/gui/link_button.h +++ b/scene/gui/link_button.h @@ -35,7 +35,6 @@ #include "scene/resources/bit_map.h" class LinkButton : public BaseButton { - GDCLASS(LinkButton, BaseButton); public: diff --git a/scene/gui/margin_container.cpp b/scene/gui/margin_container.cpp index 1cd4ff4ff8..0299065f77 100644 --- a/scene/gui/margin_container.cpp +++ b/scene/gui/margin_container.cpp @@ -31,7 +31,6 @@ #include "margin_container.h" Size2 MarginContainer::get_minimum_size() const { - int margin_left = get_theme_constant("margin_left"); int margin_top = get_theme_constant("margin_top"); int margin_right = get_theme_constant("margin_right"); @@ -40,20 +39,24 @@ Size2 MarginContainer::get_minimum_size() const { Size2 max; for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; - if (!c->is_visible()) + } + if (!c->is_visible()) { continue; + } Size2 s = c->get_combined_minimum_size(); - if (s.width > max.width) + if (s.width > max.width) { max.width = s.width; - if (s.height > max.height) + } + if (s.height > max.height) { max.height = s.height; + } } max.width += (margin_left + margin_right); @@ -63,10 +66,8 @@ Size2 MarginContainer::get_minimum_size() const { } void MarginContainer::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_SORT_CHILDREN: { - int margin_left = get_theme_constant("margin_left"); int margin_top = get_theme_constant("margin_top"); int margin_right = get_theme_constant("margin_right"); @@ -75,12 +76,13 @@ void MarginContainer::_notification(int p_what) { Size2 s = get_size(); for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } int w = s.width - margin_left - margin_right; int h = s.height - margin_top - margin_bottom; @@ -88,7 +90,6 @@ void MarginContainer::_notification(int p_what) { } } break; case NOTIFICATION_THEME_CHANGED: { - minimum_size_changed(); } break; } diff --git a/scene/gui/menu_button.cpp b/scene/gui/menu_button.cpp index a7d1f64e93..aa69fb39e7 100644 --- a/scene/gui/menu_button.cpp +++ b/scene/gui/menu_button.cpp @@ -34,25 +34,25 @@ #include "scene/main/window.h" void MenuButton::_unhandled_key_input(Ref<InputEvent> p_event) { - - if (disable_shortcuts) + if (disable_shortcuts) { return; + } if (p_event->is_pressed() && !p_event->is_echo() && (Object::cast_to<InputEventKey>(p_event.ptr()) || Object::cast_to<InputEventJoypadButton>(p_event.ptr()) || Object::cast_to<InputEventAction>(*p_event))) { - - if (!get_parent() || !is_visible_in_tree() || is_disabled()) + if (!get_parent() || !is_visible_in_tree() || is_disabled()) { return; + } //bool global_only = (get_viewport()->get_modal_stack_top() && !get_viewport()->get_modal_stack_top()->is_a_parent_of(this)); //if (popup->activate_item_by_event(p_event, global_only)) // accept_event(); - if (popup->activate_item_by_event(p_event, false)) + if (popup->activate_item_by_event(p_event, false)) { accept_event(); + } } } void MenuButton::pressed() { - { Window *w = Object::cast_to<Window>(get_viewport()); if (w && !w->is_embedding_subwindows()) { @@ -75,39 +75,31 @@ void MenuButton::pressed() { } void MenuButton::_gui_input(Ref<InputEvent> p_event) { - BaseButton::_gui_input(p_event); } PopupMenu *MenuButton::get_popup() const { - return popup; } void MenuButton::_set_items(const Array &p_items) { - popup->set("items", p_items); } Array MenuButton::_get_items() const { - return popup->get("items"); } void MenuButton::set_switch_on_hover(bool p_enabled) { - switch_on_hover = p_enabled; } bool MenuButton::is_switch_on_hover() { - return switch_on_hover; } void MenuButton::_notification(int p_what) { - if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - if (!is_visible_in_tree()) { popup->hide(); } @@ -115,7 +107,6 @@ void MenuButton::_notification(int p_what) { } void MenuButton::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_popup"), &MenuButton::get_popup); ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &MenuButton::_unhandled_key_input); ClassDB::bind_method(D_METHOD("_set_items"), &MenuButton::_set_items); @@ -131,12 +122,10 @@ void MenuButton::_bind_methods() { } void MenuButton::set_disable_shortcuts(bool p_disabled) { - disable_shortcuts = p_disabled; } MenuButton::MenuButton() { - switch_on_hover = false; set_flat(true); set_toggle_mode(true); diff --git a/scene/gui/menu_button.h b/scene/gui/menu_button.h index 9abd11632f..0cd161c1f0 100644 --- a/scene/gui/menu_button.h +++ b/scene/gui/menu_button.h @@ -35,7 +35,6 @@ #include "scene/gui/popup_menu.h" class MenuButton : public Button { - GDCLASS(MenuButton, Button); bool clicked; diff --git a/scene/gui/nine_patch_rect.cpp b/scene/gui/nine_patch_rect.cpp index cf10c4cfbd..bc71ae94f5 100644 --- a/scene/gui/nine_patch_rect.cpp +++ b/scene/gui/nine_patch_rect.cpp @@ -33,11 +33,10 @@ #include "servers/rendering_server.h" void NinePatchRect::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - - if (texture.is_null()) + if (texture.is_null()) { return; + } Rect2 rect = Rect2(Point2(), get_size()); Rect2 src_rect = region_rect; @@ -50,11 +49,10 @@ void NinePatchRect::_notification(int p_what) { } Size2 NinePatchRect::get_minimum_size() const { - return Size2(margin[MARGIN_LEFT] + margin[MARGIN_RIGHT], margin[MARGIN_TOP] + margin[MARGIN_BOTTOM]); } -void NinePatchRect::_bind_methods() { +void NinePatchRect::_bind_methods() { ClassDB::bind_method(D_METHOD("set_texture", "texture"), &NinePatchRect::set_texture); ClassDB::bind_method(D_METHOD("get_texture"), &NinePatchRect::get_texture); ClassDB::bind_method(D_METHOD("set_patch_margin", "margin", "value"), &NinePatchRect::set_patch_margin); @@ -89,9 +87,9 @@ void NinePatchRect::_bind_methods() { } void NinePatchRect::set_texture(const Ref<Texture2D> &p_tex) { - - if (texture == p_tex) + if (texture == p_tex) { return; + } texture = p_tex; update(); /* @@ -104,12 +102,10 @@ void NinePatchRect::set_texture(const Ref<Texture2D> &p_tex) { } Ref<Texture2D> NinePatchRect::get_texture() const { - return texture; } void NinePatchRect::set_patch_margin(Margin p_margin, int p_size) { - ERR_FAIL_INDEX((int)p_margin, 4); margin[p_margin] = p_size; update(); @@ -131,15 +127,14 @@ void NinePatchRect::set_patch_margin(Margin p_margin, int p_size) { } int NinePatchRect::get_patch_margin(Margin p_margin) const { - ERR_FAIL_INDEX_V((int)p_margin, 4, 0); return margin[p_margin]; } void NinePatchRect::set_region_rect(const Rect2 &p_region_rect) { - - if (region_rect == p_region_rect) + if (region_rect == p_region_rect) { return; + } region_rect = p_region_rect; @@ -148,18 +143,15 @@ void NinePatchRect::set_region_rect(const Rect2 &p_region_rect) { } Rect2 NinePatchRect::get_region_rect() const { - return region_rect; } void NinePatchRect::set_draw_center(bool p_enabled) { - draw_center = p_enabled; update(); } bool NinePatchRect::is_draw_center_enabled() const { - return draw_center; } @@ -173,18 +165,15 @@ NinePatchRect::AxisStretchMode NinePatchRect::get_h_axis_stretch_mode() const { } void NinePatchRect::set_v_axis_stretch_mode(AxisStretchMode p_mode) { - axis_v = p_mode; update(); } NinePatchRect::AxisStretchMode NinePatchRect::get_v_axis_stretch_mode() const { - return axis_v; } NinePatchRect::NinePatchRect() { - margin[MARGIN_LEFT] = 0; margin[MARGIN_RIGHT] = 0; margin[MARGIN_BOTTOM] = 0; diff --git a/scene/gui/nine_patch_rect.h b/scene/gui/nine_patch_rect.h index 0ef7f6b299..23a40fb64b 100644 --- a/scene/gui/nine_patch_rect.h +++ b/scene/gui/nine_patch_rect.h @@ -34,7 +34,6 @@ #include "scene/gui/control.h" class NinePatchRect : public Control { - GDCLASS(NinePatchRect, Control); public: diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index a03d6d0cdc..e7de0f0912 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -33,7 +33,6 @@ #include "core/print_string.h" Size2 OptionButton::get_minimum_size() const { - Size2 minsize = Button::get_minimum_size(); if (has_theme_icon("arrow")) { @@ -51,12 +50,11 @@ Size2 OptionButton::get_minimum_size() const { } void OptionButton::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_DRAW: { - - if (!has_theme_icon("arrow")) + if (!has_theme_icon("arrow")) { return; + } RID ci = get_canvas_item(); Ref<Texture2D> arrow = Control::get_theme_icon("arrow"); @@ -83,13 +81,11 @@ void OptionButton::_notification(int p_what) { arrow->draw(ci, ofs, clr); } break; case NOTIFICATION_THEME_CHANGED: { - if (has_theme_icon("arrow")) { _set_internal_margin(MARGIN_RIGHT, Control::get_theme_icon("arrow")->get_width()); } } break; case NOTIFICATION_VISIBILITY_CHANGED: { - if (!is_visible_in_tree()) { popup->hide(); } @@ -102,12 +98,10 @@ void OptionButton::_focused(int p_which) { } void OptionButton::_selected(int p_which) { - _select(p_which, true); } void OptionButton::pressed() { - Size2 size = get_size(); popup->set_position(get_screen_position() + Size2(0, size.height * get_global_transform().get_scale().y)); popup->set_size(Size2(size.width, 0)); @@ -115,105 +109,96 @@ void OptionButton::pressed() { } void OptionButton::add_icon_item(const Ref<Texture2D> &p_icon, const String &p_label, int p_id) { - popup->add_icon_radio_check_item(p_icon, p_label, p_id); - if (popup->get_item_count() == 1) + if (popup->get_item_count() == 1) { select(0); + } } -void OptionButton::add_item(const String &p_label, int p_id) { +void OptionButton::add_item(const String &p_label, int p_id) { popup->add_radio_check_item(p_label, p_id); - if (popup->get_item_count() == 1) + if (popup->get_item_count() == 1) { select(0); + } } void OptionButton::set_item_text(int p_idx, const String &p_text) { - popup->set_item_text(p_idx, p_text); - if (current == p_idx) + if (current == p_idx) { set_text(p_text); + } } -void OptionButton::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) { +void OptionButton::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) { popup->set_item_icon(p_idx, p_icon); - if (current == p_idx) + if (current == p_idx) { set_icon(p_icon); + } } -void OptionButton::set_item_id(int p_idx, int p_id) { +void OptionButton::set_item_id(int p_idx, int p_id) { popup->set_item_id(p_idx, p_id); } void OptionButton::set_item_metadata(int p_idx, const Variant &p_metadata) { - popup->set_item_metadata(p_idx, p_metadata); } void OptionButton::set_item_disabled(int p_idx, bool p_disabled) { - popup->set_item_disabled(p_idx, p_disabled); } String OptionButton::get_item_text(int p_idx) const { - return popup->get_item_text(p_idx); } Ref<Texture2D> OptionButton::get_item_icon(int p_idx) const { - return popup->get_item_icon(p_idx); } int OptionButton::get_item_id(int p_idx) const { - return popup->get_item_id(p_idx); } int OptionButton::get_item_index(int p_id) const { - return popup->get_item_index(p_id); } Variant OptionButton::get_item_metadata(int p_idx) const { - return popup->get_item_metadata(p_idx); } bool OptionButton::is_item_disabled(int p_idx) const { - return popup->is_item_disabled(p_idx); } int OptionButton::get_item_count() const { - return popup->get_item_count(); } void OptionButton::add_separator() { - popup->add_separator(); } void OptionButton::clear() { - popup->clear(); set_text(""); current = -1; } void OptionButton::_select(int p_which, bool p_emit) { - - if (p_which < 0) + if (p_which < 0) { return; - if (p_which == current) + } + if (p_which == current) { return; + } ERR_FAIL_INDEX(p_which, popup->get_item_count()); for (int i = 0; i < popup->get_item_count(); i++) { - popup->set_item_checked(i, i == p_which); } @@ -221,57 +206,53 @@ void OptionButton::_select(int p_which, bool p_emit) { set_text(popup->get_item_text(current)); set_icon(popup->get_item_icon(current)); - if (is_inside_tree() && p_emit) + if (is_inside_tree() && p_emit) { emit_signal("item_selected", current); + } } void OptionButton::_select_int(int p_which) { - - if (p_which < 0 || p_which >= popup->get_item_count()) + if (p_which < 0 || p_which >= popup->get_item_count()) { return; + } _select(p_which, false); } void OptionButton::select(int p_idx) { - _select(p_idx, false); } int OptionButton::get_selected() const { - return current; } int OptionButton::get_selected_id() const { - int idx = get_selected(); - if (idx < 0) + if (idx < 0) { return 0; + } return get_item_id(current); } -Variant OptionButton::get_selected_metadata() const { +Variant OptionButton::get_selected_metadata() const { int idx = get_selected(); - if (idx < 0) + if (idx < 0) { return Variant(); + } return get_item_metadata(current); } void OptionButton::remove_item(int p_idx) { - popup->remove_item(p_idx); } PopupMenu *OptionButton::get_popup() const { - return popup; } Array OptionButton::_get_items() const { - Array items; for (int i = 0; i < get_item_count(); i++) { - items.push_back(get_item_text(i)); items.push_back(get_item_icon(i)); items.push_back(is_item_disabled(i)); @@ -281,13 +262,12 @@ Array OptionButton::_get_items() const { return items; } -void OptionButton::_set_items(const Array &p_items) { +void OptionButton::_set_items(const Array &p_items) { ERR_FAIL_COND(p_items.size() % 5); clear(); for (int i = 0; i < p_items.size(); i += 5) { - String text = p_items[i + 0]; Ref<Texture2D> icon = p_items[i + 1]; bool disabled = p_items[i + 2]; @@ -303,12 +283,10 @@ void OptionButton::_set_items(const Array &p_items) { } void OptionButton::get_translatable_strings(List<String> *p_strings) const { - popup->get_translatable_strings(p_strings); } void OptionButton::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_item", "label", "id"), &OptionButton::add_item, DEFVAL(-1)); ClassDB::bind_method(D_METHOD("add_icon_item", "texture", "label", "id"), &OptionButton::add_icon_item, DEFVAL(-1)); ClassDB::bind_method(D_METHOD("set_item_text", "idx", "text"), &OptionButton::set_item_text); @@ -345,7 +323,6 @@ void OptionButton::_bind_methods() { } OptionButton::OptionButton() { - current = -1; set_toggle_mode(true); set_text_align(ALIGN_LEFT); diff --git a/scene/gui/option_button.h b/scene/gui/option_button.h index 9658e1fea8..69a94a34f3 100644 --- a/scene/gui/option_button.h +++ b/scene/gui/option_button.h @@ -35,7 +35,6 @@ #include "scene/gui/popup_menu.h" class OptionButton : public Button { - GDCLASS(OptionButton, Button); PopupMenu *popup; diff --git a/scene/gui/panel.cpp b/scene/gui/panel.cpp index a17d0eb9c6..d8d9beca2b 100644 --- a/scene/gui/panel.cpp +++ b/scene/gui/panel.cpp @@ -33,9 +33,7 @@ #include "core/print_string.h" void Panel::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - RID ci = get_canvas_item(); Ref<StyleBox> style = mode == MODE_BACKGROUND ? get_theme_stylebox("panel") : get_theme_stylebox("panel_fg"); style->draw(ci, Rect2(Point2(), get_size())); @@ -46,6 +44,7 @@ void Panel::set_mode(Mode p_mode) { mode = p_mode; update(); } + Panel::Mode Panel::get_mode() const { return mode; } diff --git a/scene/gui/panel.h b/scene/gui/panel.h index 75e266b6a6..a68c3d3f0c 100644 --- a/scene/gui/panel.h +++ b/scene/gui/panel.h @@ -34,7 +34,6 @@ #include "scene/gui/control.h" class Panel : public Control { - GDCLASS(Panel, Control); public: diff --git a/scene/gui/panel_container.cpp b/scene/gui/panel_container.cpp index 62b9296409..9abdfac009 100644 --- a/scene/gui/panel_container.cpp +++ b/scene/gui/panel_container.cpp @@ -31,56 +31,57 @@ #include "panel_container.h" Size2 PanelContainer::get_minimum_size() const { - Ref<StyleBox> style; - if (has_theme_stylebox("panel")) + if (has_theme_stylebox("panel")) { style = get_theme_stylebox("panel"); - else + } else { style = get_theme_stylebox("panel", "PanelContainer"); + } Size2 ms; for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible()) + if (!c || !c->is_visible()) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } Size2 minsize = c->get_combined_minimum_size(); ms.width = MAX(ms.width, minsize.width); ms.height = MAX(ms.height, minsize.height); } - if (style.is_valid()) + if (style.is_valid()) { ms += style->get_minimum_size(); + } return ms; } void PanelContainer::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - RID ci = get_canvas_item(); Ref<StyleBox> style; - if (has_theme_stylebox("panel")) + if (has_theme_stylebox("panel")) { style = get_theme_stylebox("panel"); - else + } else { style = get_theme_stylebox("panel", "PanelContainer"); + } style->draw(ci, Rect2(Point2(), get_size())); } if (p_what == NOTIFICATION_SORT_CHILDREN) { - Ref<StyleBox> style; - if (has_theme_stylebox("panel")) + if (has_theme_stylebox("panel")) { style = get_theme_stylebox("panel"); - else + } else { style = get_theme_stylebox("panel", "PanelContainer"); + } Size2 size = get_size(); Point2 ofs; @@ -90,12 +91,13 @@ void PanelContainer::_notification(int p_what) { } for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible_in_tree()) + if (!c || !c->is_visible_in_tree()) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } fit_child_in_rect(c, Rect2(ofs, size)); } diff --git a/scene/gui/panel_container.h b/scene/gui/panel_container.h index 5623c3484b..b68bc223dc 100644 --- a/scene/gui/panel_container.h +++ b/scene/gui/panel_container.h @@ -34,7 +34,6 @@ #include "scene/gui/container.h" class PanelContainer : public Container { - GDCLASS(PanelContainer, Container); protected: diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp index 6edafc65a0..5fc5f9b669 100644 --- a/scene/gui/popup.cpp +++ b/scene/gui/popup.cpp @@ -42,15 +42,13 @@ void Popup::_input_from_window(const Ref<InputEvent> &p_event) { } void Popup::_parent_focused() { - _close_pressed(); } -void Popup::_notification(int p_what) { +void Popup::_notification(int p_what) { switch (p_what) { case NOTIFICATION_VISIBILITY_CHANGED: { if (is_visible()) { - parent_visible = get_parent_visible_window(); if (parent_visible) { parent_visible->connect("focus_entered", callable_mp(this, &Popup::_parent_focused)); @@ -79,7 +77,6 @@ void Popup::_notification(int p_what) { } void Popup::_close_pressed() { - Window *parent_window = parent_visible; if (parent_visible) { parent_visible->disconnect("focus_entered", callable_mp(this, &Popup::_parent_focused)); @@ -98,8 +95,8 @@ void Popup::_close_pressed() { void Popup::set_as_minsize() { set_size(get_contents_minimum_size()); } -void Popup::_bind_methods() { +void Popup::_bind_methods() { ADD_SIGNAL(MethodInfo("popup_hide")); } @@ -133,7 +130,6 @@ Rect2i Popup::_popup_adjust_rect() const { } Popup::Popup() { - parent_visible = nullptr; set_wrap_controls(true); @@ -149,18 +145,19 @@ Popup::~Popup() { } Size2 PopupPanel::_get_contents_minimum_size() const { - Ref<StyleBox> p = get_theme_stylebox("panel", get_class_name()); Size2 ms; for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || c == panel) + if (!c || c == panel) { continue; + } - if (c->is_set_as_toplevel()) + if (c->is_set_as_toplevel()) { continue; + } Size2 cms = c->get_combined_minimum_size(); ms.x = MAX(cms.x, ms.x); @@ -171,7 +168,6 @@ Size2 PopupPanel::_get_contents_minimum_size() const { } void PopupPanel::_update_child_rects() { - Ref<StyleBox> p = get_theme_stylebox("panel", get_class_name()); Vector2 cpos(p->get_offset()); @@ -179,11 +175,13 @@ void PopupPanel::_update_child_rects() { for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; + } - if (c->is_set_as_toplevel()) + if (c->is_set_as_toplevel()) { continue; + } if (c == panel) { c->set_position(Vector2()); @@ -196,21 +194,17 @@ void PopupPanel::_update_child_rects() { } void PopupPanel::_notification(int p_what) { - if (p_what == NOTIFICATION_THEME_CHANGED) { panel->add_theme_style_override("panel", get_theme_stylebox("panel", get_class_name())); } else if (p_what == NOTIFICATION_READY || p_what == NOTIFICATION_ENTER_TREE) { - panel->add_theme_style_override("panel", get_theme_stylebox("panel", get_class_name())); _update_child_rects(); } else if (p_what == NOTIFICATION_WM_SIZE_CHANGED) { - _update_child_rects(); } } PopupPanel::PopupPanel() { - panel = memnew(Panel); add_child(panel); } diff --git a/scene/gui/popup.h b/scene/gui/popup.h index 6cd2b4028f..0e32d55cb6 100644 --- a/scene/gui/popup.h +++ b/scene/gui/popup.h @@ -34,7 +34,6 @@ #include "scene/main/window.h" class Popup : public Window { - GDCLASS(Popup, Window); Window *parent_visible; @@ -56,7 +55,6 @@ public: }; class PopupPanel : public Popup { - GDCLASS(PopupPanel, Popup); Panel *panel; diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 9c48801ec1..b439d85983 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -38,18 +38,17 @@ #include "scene/gui/control.h" String PopupMenu::_get_accel_text(int p_item) const { - ERR_FAIL_INDEX_V(p_item, items.size(), String()); - if (items[p_item].shortcut.is_valid()) + if (items[p_item].shortcut.is_valid()) { return items[p_item].shortcut->get_as_text(); - else if (items[p_item].accel) + } else if (items[p_item].accel) { return keycode_get_string(items[p_item].accel); + } return String(); } Size2 PopupMenu::_get_contents_minimum_size() const { - int vseparation = get_theme_constant("vseparation"); int hseparation = get_theme_constant("hseparation"); @@ -64,37 +63,36 @@ Size2 PopupMenu::_get_contents_minimum_size() const { bool has_check = false; for (int i = 0; i < items.size(); i++) { - Size2 size; if (!items[i].icon.is_null()) { - Size2 icon_size = items[i].icon->get_size(); size.height = MAX(icon_size.height, font_h); icon_w = MAX(icon_size.width + hseparation, icon_w); } else { - size.height = font_h; } size.width += items[i].h_ofs; - if (items[i].checkable_type) + if (items[i].checkable_type) { has_check = true; + } String text = items[i].xl_text; size.width += font->get_string_size(text).width; - if (i > 0) + if (i > 0) { size.height += vseparation; + } if (items[i].accel || (items[i].shortcut.is_valid() && items[i].shortcut->is_valid())) { - int accel_w = hseparation * 2; accel_w += font->get_string_size(_get_accel_text(i)).width; accel_max_w = MAX(accel_w, accel_max_w); } - if (items[i].submenu != "") + if (items[i].submenu != "") { size.width += get_theme_icon("submenu")->get_width(); + } max_w = MAX(max_w, size.width); @@ -102,39 +100,38 @@ Size2 PopupMenu::_get_contents_minimum_size() const { } minsize.width += max_w + icon_w + accel_max_w; - if (has_check) + if (has_check) { minsize.width += check_w; + } return minsize; } int PopupMenu::_get_mouse_over(const Point2 &p_over) const { - - if (p_over.x < 0 || p_over.x >= get_size().width) + if (p_over.x < 0 || p_over.x >= get_size().width) { return -1; + } Ref<StyleBox> style = get_theme_stylebox("panel"); Point2 ofs = style->get_offset(); - if (ofs.y > p_over.y) + if (ofs.y > p_over.y) { return -1; + } Ref<Font> font = get_theme_font("font"); int vseparation = get_theme_constant("vseparation"); float font_h = font->get_height(); for (int i = 0; i < items.size(); i++) { - ofs.y += vseparation; float h; if (!items[i].icon.is_null()) { - Size2 icon_size = items[i].icon->get_size(); h = MAX(icon_size.height, font_h); } else { - h = font_h; } @@ -148,13 +145,13 @@ int PopupMenu::_get_mouse_over(const Point2 &p_over) const { } void PopupMenu::_activate_submenu(int over) { - Node *n = get_node(items[over].submenu); ERR_FAIL_COND_MSG(!n, "Item subnode does not exist: " + items[over].submenu + "."); Popup *pm = Object::cast_to<Popup>(n); ERR_FAIL_COND_MSG(!pm, "Item subnode is not a Popup: " + items[over].submenu + "."); - if (pm->is_visible()) + if (pm->is_visible()) { return; //already visible! + } Point2 p = get_position(); Rect2 pr(p, get_size()); @@ -163,8 +160,9 @@ void PopupMenu::_activate_submenu(int over) { Point2 pos = p + Point2(get_size().width, items[over]._ofs_cache - style->get_offset().y); Size2 size = pm->get_size(); // fix pos - if (pos.x + size.width > get_parent_rect().size.width) + if (pos.x + size.width > get_parent_rect().size.width) { pos.x = p.x - size.width; + } pm->set_position(pos); // pm->set_scale(get_global_transform().get_scale()); @@ -172,7 +170,6 @@ void PopupMenu::_activate_submenu(int over) { PopupMenu *pum = Object::cast_to<PopupMenu>(pm); if (pum) { - pr.position -= pum->get_position(); pum->clear_autohide_areas(); pum->add_autohide_area(Rect2(pr.position.x, pr.position.y, pr.size.x, items[over]._ofs_cache)); @@ -184,18 +181,17 @@ void PopupMenu::_activate_submenu(int over) { } void PopupMenu::_submenu_timeout() { - //if (!has_focus()) { // return; //do not activate if not has focus //} - if (mouse_over == submenu_over) + if (mouse_over == submenu_over) { _activate_submenu(mouse_over); + } submenu_over = -1; } void PopupMenu::_scroll(float p_factor, const Point2 &p_over) { - int vseparation = get_theme_constant("vseparation"); Ref<Font> font = get_theme_font("font"); @@ -226,20 +222,18 @@ void PopupMenu::_scroll(float p_factor, const Point2 &p_over) { } void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { - if (p_event->is_action("ui_down") && p_event->is_pressed()) { - int search_from = mouse_over + 1; - if (search_from >= items.size()) + if (search_from >= items.size()) { search_from = 0; + } for (int i = search_from; i < items.size(); i++) { - - if (i < 0 || i >= items.size()) + if (i < 0 || i >= items.size()) { continue; + } if (!items[i].separator && !items[i].disabled) { - mouse_over = i; emit_signal("id_focused", i); control->update(); @@ -248,18 +242,17 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { } } } else if (p_event->is_action("ui_up") && p_event->is_pressed()) { - int search_from = mouse_over - 1; - if (search_from < 0) + if (search_from < 0) { search_from = items.size() - 1; + } for (int i = search_from; i >= 0; i--) { - - if (i >= items.size()) + if (i >= items.size()) { continue; + } if (!items[i].separator && !items[i].disabled) { - mouse_over = i; emit_signal("id_focused", i); control->update(); @@ -268,22 +261,18 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { } } } else if (p_event->is_action("ui_left") && p_event->is_pressed()) { - Node *n = get_parent(); if (n && Object::cast_to<PopupMenu>(n)) { hide(); set_input_as_handled(); } } else if (p_event->is_action("ui_right") && p_event->is_pressed()) { - if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator && items[mouse_over].submenu != "" && submenu_over != mouse_over) { _activate_submenu(mouse_over); set_input_as_handled(); } } else if (p_event->is_action("ui_accept") && p_event->is_pressed()) { - if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator) { - if (items[mouse_over].submenu != "" && submenu_over != mouse_over) { _activate_submenu(mouse_over); } else { @@ -296,25 +285,21 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { - - if (b->is_pressed()) + if (b->is_pressed()) { return; + } int button_idx = b->get_button_index(); switch (button_idx) { - case BUTTON_WHEEL_DOWN: { - _scroll(-b->get_factor(), b->get_position()); } break; case BUTTON_WHEEL_UP: { - _scroll(b->get_factor(), b->get_position()); } break; default: { // Allow activating item by releasing the LMB or any that was down when the popup appeared if (button_idx == BUTTON_LEFT || (initial_button_mask & (1 << (button_idx - 1)))) { - bool was_during_grabbed_click = during_grabbed_click; during_grabbed_click = false; initial_button_mask = 0; @@ -332,11 +317,11 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { break; //non-activable } - if (items[over].separator || items[over].disabled) + if (items[over].separator || items[over].disabled) { break; + } if (items[over].submenu != "") { - _activate_submenu(over); return; } @@ -351,17 +336,15 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> m = p_event; if (m.is_valid()) { - if (invalidated_click) { moved += m->get_relative(); - if (moved.length() > 4) + if (moved.length() > 4) { invalidated_click = false; + } } for (List<Rect2>::Element *E = autohide_areas.front(); E; E = E->next()) { - if (!Rect2(Point2(), get_size()).has_point(m->get_position()) && E->get().has_point(m->get_position())) { - _close_pressed(); return; } @@ -395,7 +378,6 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventKey> k = p_event; if (allow_search && k.is_valid() && k->get_unicode() && k->is_pressed()) { - uint64_t now = OS::get_singleton()->get_ticks_msec(); uint64_t diff = now - search_time_msec; uint64_t max_interval = uint64_t(GLOBAL_DEF("gui/timers/incremental_search_max_interval_msec", 2000)); @@ -405,19 +387,22 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { search_string = ""; } - if (String::chr(k->get_unicode()) != search_string) + if (String::chr(k->get_unicode()) != search_string) { search_string += String::chr(k->get_unicode()); + } for (int i = mouse_over + 1; i <= items.size(); i++) { if (i == items.size()) { - if (mouse_over <= 0) + if (mouse_over <= 0) { break; - else + } else { i = 0; + } } - if (i == mouse_over) + if (i == mouse_over) { break; + } if (items[i].text.findn(search_string) == 0) { mouse_over = i; @@ -431,7 +416,6 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) { } void PopupMenu::_draw() { - RID ci = control->get_canvas_item(); Size2 size = get_size(); @@ -460,39 +444,39 @@ void PopupMenu::_draw() { float icon_ofs = 0.0; bool has_check = false; for (int i = 0; i < items.size(); i++) { - - if (!items[i].icon.is_null()) + if (!items[i].icon.is_null()) { icon_ofs = MAX(items[i].icon->get_size().width, icon_ofs); + } - if (items[i].checkable_type) + if (items[i].checkable_type) { has_check = true; + } } - if (icon_ofs > 0.0) + if (icon_ofs > 0.0) { icon_ofs += hseparation; + } float check_ofs = 0.0; - if (has_check) + if (has_check) { check_ofs = MAX(get_theme_icon("checked")->get_width(), get_theme_icon("radio_checked")->get_width()) + hseparation; + } for (int i = 0; i < items.size(); i++) { - - if (i > 0) + if (i > 0) { ofs.y += vseparation; + } Point2 item_ofs = ofs; Size2 icon_size; float h; if (!items[i].icon.is_null()) { - icon_size = items[i].icon->get_size(); h = MAX(icon_size.height, font_h); } else { - h = font_h; } if (i == mouse_over) { - hover->draw(ci, Rect2(item_ofs + Point2(-hseparation, -vseparation / 2), Size2(get_size().width - style->get_minimum_size().width + hseparation * 2, h + vseparation))); } @@ -500,7 +484,6 @@ void PopupMenu::_draw() { item_ofs.x += items[i].h_ofs; if (items[i].separator) { - int sep_h = separator->get_center_size().height + separator->get_minimum_size().height; if (text != String()) { int ss = font->get_string_size(text).width; @@ -535,13 +518,11 @@ void PopupMenu::_draw() { item_ofs.y += font->get_ascent(); if (items[i].separator) { - if (text != String()) { int center = (get_size().width - font->get_string_size(text).width) / 2; font->draw(ci, Point2(center, item_ofs.y + Math::floor((h - font_h) / 2.0)), text, font_color_disabled); } } else { - item_ofs.x += icon_ofs + check_ofs; font->draw(ci, item_ofs + Point2(0, Math::floor((h - font_h) / 2.0)), text, items[i].disabled ? font_color_disabled : (i == mouse_over ? font_color_hover : font_color)); } @@ -560,11 +541,8 @@ void PopupMenu::_draw() { } void PopupMenu::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - PopupMenu *pm = Object::cast_to<PopupMenu>(get_parent()); if (pm) { // Inherit submenu's popup delay time from parent menu @@ -573,7 +551,6 @@ void PopupMenu::_notification(int p_what) { } } break; case NOTIFICATION_TRANSLATION_CHANGED: { - for (int i = 0; i < items.size(); i++) { items.write[i].xl_text = tr(items[i].text); } @@ -582,23 +559,19 @@ void PopupMenu::_notification(int p_what) { control->update(); } break; case NOTIFICATION_WM_MOUSE_ENTER: { - //grab_focus(); } break; case NOTIFICATION_WM_MOUSE_EXIT: { - if (mouse_over >= 0 && (items[mouse_over].submenu == "" || submenu_over != -1)) { mouse_over = -1; control->update(); } } break; case NOTIFICATION_POST_POPUP: { - initial_button_mask = Input::get_singleton()->get_mouse_button_mask(); during_grabbed_click = (bool)initial_button_mask; } break; case NOTIFICATION_WM_SIZE_CHANGED: { - } break; case NOTIFICATION_INTERNAL_PROCESS: { //only used when using operating system windows @@ -607,7 +580,6 @@ void PopupMenu::_notification(int p_what) { mouse_pos -= get_position(); for (List<Rect2>::Element *E = autohide_areas.front(); E; E = E->next()) { - if (!Rect2(Point2(), get_size()).has_point(mouse_pos) && E->get().has_point(mouse_pos)) { _close_pressed(); return; @@ -616,7 +588,6 @@ void PopupMenu::_notification(int p_what) { } } break; case NOTIFICATION_VISIBILITY_CHANGED: { - if (!is_visible()) { if (mouse_over >= 0) { mouse_over = -1; @@ -624,16 +595,19 @@ void PopupMenu::_notification(int p_what) { } for (int i = 0; i < items.size(); i++) { - if (items[i].submenu == "") + if (items[i].submenu == "") { continue; + } Node *n = get_node(items[i].submenu); - if (!n) + if (!n) { continue; + } PopupMenu *pm = Object::cast_to<PopupMenu>(n); - if (!pm || !pm->is_visible()) + if (!pm || !pm->is_visible()) { continue; + } pm->hide(); } @@ -659,7 +633,6 @@ void PopupMenu::_notification(int p_what) { item.accel = p_accel; void PopupMenu::add_item(const String &p_label, int p_id, uint32_t p_accel) { - Item item; ITEM_SETUP_WITH_ACCEL(p_label, p_id, p_accel); items.push_back(item); @@ -668,7 +641,6 @@ void PopupMenu::add_item(const String &p_label, int p_id, uint32_t p_accel) { } void PopupMenu::add_icon_item(const Ref<Texture2D> &p_icon, const String &p_label, int p_id, uint32_t p_accel) { - Item item; ITEM_SETUP_WITH_ACCEL(p_label, p_id, p_accel); item.icon = p_icon; @@ -678,7 +650,6 @@ void PopupMenu::add_icon_item(const Ref<Texture2D> &p_icon, const String &p_labe } void PopupMenu::add_check_item(const String &p_label, int p_id, uint32_t p_accel) { - Item item; ITEM_SETUP_WITH_ACCEL(p_label, p_id, p_accel); item.checkable_type = Item::CHECKABLE_TYPE_CHECK_BOX; @@ -688,7 +659,6 @@ void PopupMenu::add_check_item(const String &p_label, int p_id, uint32_t p_accel } void PopupMenu::add_icon_check_item(const Ref<Texture2D> &p_icon, const String &p_label, int p_id, uint32_t p_accel) { - Item item; ITEM_SETUP_WITH_ACCEL(p_label, p_id, p_accel); item.icon = p_icon; @@ -699,7 +669,6 @@ void PopupMenu::add_icon_check_item(const Ref<Texture2D> &p_icon, const String & } void PopupMenu::add_radio_check_item(const String &p_label, int p_id, uint32_t p_accel) { - Item item; ITEM_SETUP_WITH_ACCEL(p_label, p_id, p_accel); item.checkable_type = Item::CHECKABLE_TYPE_RADIO_BUTTON; @@ -709,7 +678,6 @@ void PopupMenu::add_radio_check_item(const String &p_label, int p_id, uint32_t p } void PopupMenu::add_icon_radio_check_item(const Ref<Texture2D> &p_icon, const String &p_label, int p_id, uint32_t p_accel) { - Item item; ITEM_SETUP_WITH_ACCEL(p_label, p_id, p_accel); item.icon = p_icon; @@ -720,7 +688,6 @@ void PopupMenu::add_icon_radio_check_item(const Ref<Texture2D> &p_icon, const St } void PopupMenu::add_multistate_item(const String &p_label, int p_max_states, int p_default_state, int p_id, uint32_t p_accel) { - Item item; ITEM_SETUP_WITH_ACCEL(p_label, p_id, p_accel); item.max_states = p_max_states; @@ -740,7 +707,6 @@ void PopupMenu::add_multistate_item(const String &p_label, int p_max_states, int item.shortcut_is_global = p_global; void PopupMenu::add_shortcut(const Ref<ShortCut> &p_shortcut, int p_id, bool p_global) { - Item item; ITEM_SETUP_WITH_SHORTCUT(p_shortcut, p_id, p_global); items.push_back(item); @@ -749,7 +715,6 @@ void PopupMenu::add_shortcut(const Ref<ShortCut> &p_shortcut, int p_id, bool p_g } void PopupMenu::add_icon_shortcut(const Ref<Texture2D> &p_icon, const Ref<ShortCut> &p_shortcut, int p_id, bool p_global) { - Item item; ITEM_SETUP_WITH_SHORTCUT(p_shortcut, p_id, p_global); item.icon = p_icon; @@ -759,7 +724,6 @@ void PopupMenu::add_icon_shortcut(const Ref<Texture2D> &p_icon, const Ref<ShortC } void PopupMenu::add_check_shortcut(const Ref<ShortCut> &p_shortcut, int p_id, bool p_global) { - Item item; ITEM_SETUP_WITH_SHORTCUT(p_shortcut, p_id, p_global); item.checkable_type = Item::CHECKABLE_TYPE_CHECK_BOX; @@ -769,7 +733,6 @@ void PopupMenu::add_check_shortcut(const Ref<ShortCut> &p_shortcut, int p_id, bo } void PopupMenu::add_icon_check_shortcut(const Ref<Texture2D> &p_icon, const Ref<ShortCut> &p_shortcut, int p_id, bool p_global) { - Item item; ITEM_SETUP_WITH_SHORTCUT(p_shortcut, p_id, p_global); item.icon = p_icon; @@ -780,7 +743,6 @@ void PopupMenu::add_icon_check_shortcut(const Ref<Texture2D> &p_icon, const Ref< } void PopupMenu::add_radio_check_shortcut(const Ref<ShortCut> &p_shortcut, int p_id, bool p_global) { - Item item; ITEM_SETUP_WITH_SHORTCUT(p_shortcut, p_id, p_global); item.checkable_type = Item::CHECKABLE_TYPE_RADIO_BUTTON; @@ -790,7 +752,6 @@ void PopupMenu::add_radio_check_shortcut(const Ref<ShortCut> &p_shortcut, int p_ } void PopupMenu::add_icon_radio_check_shortcut(const Ref<Texture2D> &p_icon, const Ref<ShortCut> &p_shortcut, int p_id, bool p_global) { - Item item; ITEM_SETUP_WITH_SHORTCUT(p_shortcut, p_id, p_global); item.icon = p_icon; @@ -801,7 +762,6 @@ void PopupMenu::add_icon_radio_check_shortcut(const Ref<Texture2D> &p_icon, cons } void PopupMenu::add_submenu_item(const String &p_label, const String &p_submenu, int p_id) { - Item item; item.text = p_label; item.xl_text = tr(p_label); @@ -818,7 +778,6 @@ void PopupMenu::add_submenu_item(const String &p_label, const String &p_submenu, /* Methods to modify existing items. */ void PopupMenu::set_item_text(int p_idx, const String &p_text) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].text = p_text; items.write[p_idx].xl_text = tr(p_text); @@ -826,16 +785,16 @@ void PopupMenu::set_item_text(int p_idx, const String &p_text) { control->update(); child_controls_changed(); } -void PopupMenu::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) { +void PopupMenu::set_item_icon(int p_idx, const Ref<Texture2D> &p_icon) { ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].icon = p_icon; control->update(); child_controls_changed(); } -void PopupMenu::set_item_checked(int p_idx, bool p_checked) { +void PopupMenu::set_item_checked(int p_idx, bool p_checked) { ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].checked = p_checked; @@ -843,8 +802,8 @@ void PopupMenu::set_item_checked(int p_idx, bool p_checked) { control->update(); child_controls_changed(); } -void PopupMenu::set_item_id(int p_idx, int p_id) { +void PopupMenu::set_item_id(int p_idx, int p_id) { ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].id = p_id; @@ -853,7 +812,6 @@ void PopupMenu::set_item_id(int p_idx, int p_id) { } void PopupMenu::set_item_accelerator(int p_idx, uint32_t p_accel) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].accel = p_accel; @@ -862,7 +820,6 @@ void PopupMenu::set_item_accelerator(int p_idx, uint32_t p_accel) { } void PopupMenu::set_item_metadata(int p_idx, const Variant &p_meta) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].metadata = p_meta; control->update(); @@ -870,7 +827,6 @@ void PopupMenu::set_item_metadata(int p_idx, const Variant &p_meta) { } void PopupMenu::set_item_disabled(int p_idx, bool p_disabled) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].disabled = p_disabled; control->update(); @@ -878,7 +834,6 @@ void PopupMenu::set_item_disabled(int p_idx, bool p_disabled) { } void PopupMenu::set_item_submenu(int p_idx, const String &p_submenu) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].submenu = p_submenu; control->update(); @@ -886,7 +841,6 @@ void PopupMenu::set_item_submenu(int p_idx, const String &p_submenu) { } void PopupMenu::toggle_item_checked(int p_idx) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].checked = !items[p_idx].checked; control->update(); @@ -894,82 +848,71 @@ void PopupMenu::toggle_item_checked(int p_idx) { } String PopupMenu::get_item_text(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), ""); return items[p_idx].text; } int PopupMenu::get_item_idx_from_text(const String &text) const { - for (int idx = 0; idx < items.size(); idx++) { - if (items[idx].text == text) + if (items[idx].text == text) { return idx; + } } return -1; } Ref<Texture2D> PopupMenu::get_item_icon(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Ref<Texture2D>()); return items[p_idx].icon; } uint32_t PopupMenu::get_item_accelerator(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), 0); return items[p_idx].accel; } Variant PopupMenu::get_item_metadata(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Variant()); return items[p_idx].metadata; } bool PopupMenu::is_item_disabled(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), false); return items[p_idx].disabled; } bool PopupMenu::is_item_checked(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), false); return items[p_idx].checked; } int PopupMenu::get_item_id(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), 0); return items[p_idx].id; } int PopupMenu::get_item_index(int p_id) const { - for (int i = 0; i < items.size(); i++) { - - if (items[i].id == p_id) + if (items[i].id == p_id) { return i; + } } return -1; } String PopupMenu::get_item_submenu(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), ""); return items[p_idx].submenu; } String PopupMenu::get_item_tooltip(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), ""); return items[p_idx].tooltip; } Ref<ShortCut> PopupMenu::get_item_shortcut(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), Ref<ShortCut>()); return items[p_idx].shortcut; } @@ -980,7 +923,6 @@ int PopupMenu::get_item_state(int p_idx) const { } void PopupMenu::set_item_as_separator(int p_idx, bool p_separator) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].separator = p_separator; control->update(); @@ -992,21 +934,18 @@ bool PopupMenu::is_item_separator(int p_idx) const { } void PopupMenu::set_item_as_checkable(int p_idx, bool p_checkable) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].checkable_type = p_checkable ? Item::CHECKABLE_TYPE_CHECK_BOX : Item::CHECKABLE_TYPE_NONE; control->update(); } void PopupMenu::set_item_as_radio_checkable(int p_idx, bool p_radio_checkable) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].checkable_type = p_radio_checkable ? Item::CHECKABLE_TYPE_RADIO_BUTTON : Item::CHECKABLE_TYPE_NONE; control->update(); } void PopupMenu::set_item_tooltip(int p_idx, const String &p_tooltip) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].tooltip = p_tooltip; control->update(); @@ -1028,7 +967,6 @@ void PopupMenu::set_item_shortcut(int p_idx, const Ref<ShortCut> &p_shortcut, bo } void PopupMenu::set_item_h_offset(int p_idx, int p_offset) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].h_ofs = p_offset; control->update(); @@ -1036,29 +974,27 @@ void PopupMenu::set_item_h_offset(int p_idx, int p_offset) { } void PopupMenu::set_item_multistate(int p_idx, int p_state) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].state = p_state; control->update(); } void PopupMenu::set_item_shortcut_disabled(int p_idx, bool p_disabled) { - ERR_FAIL_INDEX(p_idx, items.size()); items.write[p_idx].shortcut_is_disabled = p_disabled; control->update(); } void PopupMenu::toggle_item_multistate(int p_idx) { - ERR_FAIL_INDEX(p_idx, items.size()); if (0 >= items[p_idx].max_states) { return; } ++items.write[p_idx].state; - if (items.write[p_idx].max_states <= items[p_idx].state) + if (items.write[p_idx].max_states <= items[p_idx].state) { items.write[p_idx].state = 0; + } control->update(); } @@ -1074,43 +1010,45 @@ bool PopupMenu::is_item_radio_checkable(int p_idx) const { } bool PopupMenu::is_item_shortcut_disabled(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, items.size(), false); return items[p_idx].shortcut_is_disabled; } int PopupMenu::get_current_index() const { - return mouse_over; } int PopupMenu::get_item_count() const { - return items.size(); } bool PopupMenu::activate_item_by_event(const Ref<InputEvent> &p_event, bool p_for_global_only) { - uint32_t code = 0; Ref<InputEventKey> k = p_event; if (k.is_valid()) { code = k->get_keycode(); - if (code == 0) + if (code == 0) { code = k->get_unicode(); - if (k->get_control()) + } + if (k->get_control()) { code |= KEY_MASK_CTRL; - if (k->get_alt()) + } + if (k->get_alt()) { code |= KEY_MASK_ALT; - if (k->get_metakey()) + } + if (k->get_metakey()) { code |= KEY_MASK_META; - if (k->get_shift()) + } + if (k->get_shift()) { code |= KEY_MASK_SHIFT; + } } for (int i = 0; i < items.size(); i++) { - if (is_item_disabled(i) || items[i].shortcut_is_disabled) + if (is_item_disabled(i) || items[i].shortcut_is_disabled) { continue; + } if (items[i].shortcut.is_valid() && items[i].shortcut->is_shortcut(p_event) && (items[i].shortcut_is_global || !p_for_global_only)) { activate_item(i); @@ -1124,12 +1062,14 @@ bool PopupMenu::activate_item_by_event(const Ref<InputEvent> &p_event, bool p_fo if (items[i].submenu != "") { Node *n = get_node(items[i].submenu); - if (!n) + if (!n) { continue; + } PopupMenu *pm = Object::cast_to<PopupMenu>(n); - if (!pm) + if (!pm) { continue; + } if (pm->activate_item_by_event(p_event, p_for_global_only)) { return true; @@ -1140,7 +1080,6 @@ bool PopupMenu::activate_item_by_event(const Ref<InputEvent> &p_event, bool p_fo } void PopupMenu::activate_item(int p_item) { - ERR_FAIL_INDEX(p_item, items.size()); ERR_FAIL_COND(items[p_item].separator); int id = items[p_item].id >= 0 ? items[p_item].id : p_item; @@ -1153,13 +1092,16 @@ void PopupMenu::activate_item(int p_item) { // with hide_on_item_selection enabled if (items[p_item].checkable_type) { - if (!hide_on_checkable_item_selection || !pop->is_hide_on_checkable_item_selection()) + if (!hide_on_checkable_item_selection || !pop->is_hide_on_checkable_item_selection()) { break; + } } else if (0 < items[p_item].max_states) { - if (!hide_on_multistate_item_selection || !pop->is_hide_on_multistate_item_selection()) + if (!hide_on_multistate_item_selection || !pop->is_hide_on_multistate_item_selection()) { break; - } else if (!hide_on_item_selection || !pop->is_hide_on_item_selection()) + } + } else if (!hide_on_item_selection || !pop->is_hide_on_item_selection()) { break; + } pop->hide(); next = next->get_parent(); @@ -1172,13 +1114,16 @@ void PopupMenu::activate_item(int p_item) { bool need_hide = true; if (items[p_item].checkable_type) { - if (!hide_on_checkable_item_selection) + if (!hide_on_checkable_item_selection) { need_hide = false; + } } else if (0 < items[p_item].max_states) { - if (!hide_on_multistate_item_selection) + if (!hide_on_multistate_item_selection) { need_hide = false; - } else if (!hide_on_item_selection) + } + } else if (!hide_on_item_selection) { need_hide = false; + } emit_signal("id_pressed", id); emit_signal("index_pressed", p_item); @@ -1189,7 +1134,6 @@ void PopupMenu::activate_item(int p_item) { } void PopupMenu::remove_item(int p_idx) { - ERR_FAIL_INDEX(p_idx, items.size()); if (items[p_idx].shortcut.is_valid()) { @@ -1202,7 +1146,6 @@ void PopupMenu::remove_item(int p_idx) { } void PopupMenu::add_separator(const String &p_text) { - Item sep; sep.separator = true; sep.id = -1; @@ -1215,7 +1158,6 @@ void PopupMenu::add_separator(const String &p_text) { } void PopupMenu::clear() { - for (int i = 0; i < items.size(); i++) { if (items[i].shortcut.is_valid()) { _unref_shortcut(items[i].shortcut); @@ -1228,10 +1170,8 @@ void PopupMenu::clear() { } Array PopupMenu::_get_items() const { - Array items; for (int i = 0; i < get_item_count(); i++) { - items.push_back(get_item_text(i)); items.push_back(get_item_icon(i)); // For compatibility, use false/true for no/checkbox and integers for other values @@ -1251,7 +1191,6 @@ Array PopupMenu::_get_items() const { } void PopupMenu::_ref_shortcut(Ref<ShortCut> p_sc) { - if (!shortcut_refcount.has(p_sc)) { shortcut_refcount[p_sc] = 1; p_sc->connect("changed", callable_mp((CanvasItem *)this, &CanvasItem::update)); @@ -1261,7 +1200,6 @@ void PopupMenu::_ref_shortcut(Ref<ShortCut> p_sc) { } void PopupMenu::_unref_shortcut(Ref<ShortCut> p_sc) { - ERR_FAIL_COND(!shortcut_refcount.has(p_sc)); shortcut_refcount[p_sc]--; if (shortcut_refcount[p_sc] == 0) { @@ -1271,12 +1209,10 @@ void PopupMenu::_unref_shortcut(Ref<ShortCut> p_sc) { } void PopupMenu::_set_items(const Array &p_items) { - ERR_FAIL_COND(p_items.size() % 10); clear(); for (int i = 0; i < p_items.size(); i += 10) { - String text = p_items[i + 0]; Ref<Texture2D> icon = p_items[i + 1]; // For compatibility, use false/true for no/checkbox and integers for other values @@ -1313,87 +1249,74 @@ void PopupMenu::_set_items(const Array &p_items) { // Hide on item selection determines whether or not the popup will close after item selection void PopupMenu::set_hide_on_item_selection(bool p_enabled) { - hide_on_item_selection = p_enabled; } bool PopupMenu::is_hide_on_item_selection() const { - return hide_on_item_selection; } void PopupMenu::set_hide_on_checkable_item_selection(bool p_enabled) { - hide_on_checkable_item_selection = p_enabled; } bool PopupMenu::is_hide_on_checkable_item_selection() const { - return hide_on_checkable_item_selection; } void PopupMenu::set_hide_on_multistate_item_selection(bool p_enabled) { - hide_on_multistate_item_selection = p_enabled; } bool PopupMenu::is_hide_on_multistate_item_selection() const { - return hide_on_multistate_item_selection; } void PopupMenu::set_submenu_popup_delay(float p_time) { - - if (p_time <= 0) + if (p_time <= 0) { p_time = 0.01; + } submenu_timer->set_wait_time(p_time); } float PopupMenu::get_submenu_popup_delay() const { - return submenu_timer->get_wait_time(); } void PopupMenu::set_allow_search(bool p_allow) { - allow_search = p_allow; } bool PopupMenu::get_allow_search() const { - return allow_search; } String PopupMenu::get_tooltip(const Point2 &p_pos) const { - int over = _get_mouse_over(p_pos); - if (over < 0 || over >= items.size()) + if (over < 0 || over >= items.size()) { return ""; + } return items[over].tooltip; } void PopupMenu::set_parent_rect(const Rect2 &p_rect) { - parent_rect = p_rect; } void PopupMenu::get_translatable_strings(List<String> *p_strings) const { - for (int i = 0; i < items.size(); i++) { - - if (items[i].xl_text != "") + if (items[i].xl_text != "") { p_strings->push_back(items[i].xl_text); + } } } void PopupMenu::add_autohide_area(const Rect2 &p_area) { - autohide_areas.push_back(p_area); } void PopupMenu::clear_autohide_areas() { - autohide_areas.clear(); } @@ -1406,7 +1329,6 @@ void PopupMenu::take_mouse_focus() { } void PopupMenu::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &PopupMenu::_gui_input); ClassDB::bind_method(D_METHOD("add_item", "label", "id", "accel"), &PopupMenu::add_item, DEFVAL(-1), DEFVAL(0)); @@ -1501,14 +1423,12 @@ void PopupMenu::_bind_methods() { } void PopupMenu::popup(const Rect2 &p_bounds) { - moved = Vector2(); invalidated_click = true; Popup::popup(p_bounds); } PopupMenu::PopupMenu() { - control = memnew(Control); add_child(control); diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h index d5c1015863..d03a14d6e4 100644 --- a/scene/gui/popup_menu.h +++ b/scene/gui/popup_menu.h @@ -35,7 +35,6 @@ #include "scene/gui/shortcut.h" class PopupMenu : public Popup { - GDCLASS(PopupMenu, Popup); struct Item { diff --git a/scene/gui/progress_bar.cpp b/scene/gui/progress_bar.cpp index 362c45453d..9246f1723d 100644 --- a/scene/gui/progress_bar.cpp +++ b/scene/gui/progress_bar.cpp @@ -31,7 +31,6 @@ #include "progress_bar.h" Size2 ProgressBar::get_minimum_size() const { - Ref<StyleBox> bg = get_theme_stylebox("bg"); Ref<StyleBox> fg = get_theme_stylebox("fg"); Ref<Font> font = get_theme_font("font"); @@ -49,9 +48,7 @@ Size2 ProgressBar::get_minimum_size() const { } void ProgressBar::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - Ref<StyleBox> bg = get_theme_stylebox("bg"); Ref<StyleBox> fg = get_theme_stylebox("fg"); Ref<Font> font = get_theme_font("font"); @@ -62,7 +59,6 @@ void ProgressBar::_notification(int p_what) { int mp = fg->get_minimum_size().width; int p = r * (get_size().width - mp); if (p > 0) { - draw_style_box(fg, Rect2(Point2(), Size2(p + fg->get_minimum_size().width, get_size().height))); } @@ -74,18 +70,15 @@ void ProgressBar::_notification(int p_what) { } void ProgressBar::set_percent_visible(bool p_visible) { - percent_visible = p_visible; update(); } bool ProgressBar::is_percent_visible() const { - return percent_visible; } void ProgressBar::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_percent_visible", "visible"), &ProgressBar::set_percent_visible); ClassDB::bind_method(D_METHOD("is_percent_visible"), &ProgressBar::is_percent_visible); ADD_GROUP("Percent", "percent_"); @@ -93,7 +86,6 @@ void ProgressBar::_bind_methods() { } ProgressBar::ProgressBar() { - set_v_size_flags(0); set_step(0.01); percent_visible = true; diff --git a/scene/gui/progress_bar.h b/scene/gui/progress_bar.h index 371d0370f6..d8eba921a3 100644 --- a/scene/gui/progress_bar.h +++ b/scene/gui/progress_bar.h @@ -34,7 +34,6 @@ #include "scene/gui/range.h" class ProgressBar : public Range { - GDCLASS(ProgressBar, Range); bool percent_visible; diff --git a/scene/gui/range.cpp b/scene/gui/range.cpp index ab2f64e1b4..59e26d9e38 100644 --- a/scene/gui/range.cpp +++ b/scene/gui/range.cpp @@ -44,7 +44,6 @@ String Range::get_configuration_warning() const { } void Range::_value_changed_notify() { - _value_changed(shared->val); emit_signal("value_changed", shared->val); update(); @@ -52,53 +51,57 @@ void Range::_value_changed_notify() { } void Range::Shared::emit_value_changed() { - for (Set<Range *>::Element *E = owners.front(); E; E = E->next()) { Range *r = E->get(); - if (!r->is_inside_tree()) + if (!r->is_inside_tree()) { continue; + } r->_value_changed_notify(); } } void Range::_changed_notify(const char *p_what) { - emit_signal("changed"); update(); _change_notify(p_what); } void Range::Shared::emit_changed(const char *p_what) { - for (Set<Range *>::Element *E = owners.front(); E; E = E->next()) { Range *r = E->get(); - if (!r->is_inside_tree()) + if (!r->is_inside_tree()) { continue; + } r->_changed_notify(p_what); } } void Range::set_value(double p_val) { - - if (shared->step > 0) + if (shared->step > 0) { p_val = Math::round(p_val / shared->step) * shared->step; + } - if (_rounded_values) + if (_rounded_values) { p_val = Math::round(p_val); + } - if (!shared->allow_greater && p_val > shared->max - shared->page) + if (!shared->allow_greater && p_val > shared->max - shared->page) { p_val = shared->max - shared->page; + } - if (!shared->allow_lesser && p_val < shared->min) + if (!shared->allow_lesser && p_val < shared->min) { p_val = shared->min; + } - if (shared->val == p_val) + if (shared->val == p_val) { return; + } shared->val = p_val; shared->emit_value_changed(); } + void Range::set_min(double p_min) { shared->min = p_min; set_value(shared->val); @@ -107,19 +110,20 @@ void Range::set_min(double p_min) { update_configuration_warning(); } + void Range::set_max(double p_max) { shared->max = p_max; set_value(shared->val); shared->emit_changed("max"); } -void Range::set_step(double p_step) { +void Range::set_step(double p_step) { shared->step = p_step; shared->emit_changed("step"); } -void Range::set_page(double p_page) { +void Range::set_page(double p_page) { shared->page = p_page; set_value(shared->val); @@ -127,37 +131,33 @@ void Range::set_page(double p_page) { } double Range::get_value() const { - return shared->val; } -double Range::get_min() const { +double Range::get_min() const { return shared->min; } -double Range::get_max() const { +double Range::get_max() const { return shared->max; } -double Range::get_step() const { +double Range::get_step() const { return shared->step; } -double Range::get_page() const { +double Range::get_page() const { return shared->page; } void Range::set_as_ratio(double p_value) { - double v; if (shared->exp_ratio && get_min() >= 0) { - double exp_min = get_min() == 0 ? 0.0 : Math::log(get_min()) / Math::log((double)2); double exp_max = Math::log(get_max()) / Math::log((double)2); v = Math::pow(2, exp_min + (exp_max - exp_min) * p_value); } else { - double percent = (get_max() - get_min()) * p_value; if (get_step() > 0) { double steps = round(percent / get_step()); @@ -169,12 +169,11 @@ void Range::set_as_ratio(double p_value) { v = CLAMP(v, get_min(), get_max()); set_value(v); } -double Range::get_as_ratio() const { +double Range::get_as_ratio() const { ERR_FAIL_COND_V_MSG(Math::is_equal_approx(get_max(), get_min()), 0.0, "Cannot get ratio when minimum and maximum value are equal."); if (shared->exp_ratio && get_min() >= 0) { - double exp_min = get_min() == 0 ? 0.0 : Math::log(get_min()) / Math::log((double)2); double exp_max = Math::log(get_max()) / Math::log((double)2); float value = CLAMP(get_value(), shared->min, shared->max); @@ -183,21 +182,18 @@ double Range::get_as_ratio() const { return CLAMP((v - exp_min) / (exp_max - exp_min), 0, 1); } else { - float value = CLAMP(get_value(), shared->min, shared->max); return CLAMP((value - get_min()) / (get_max() - get_min()), 0, 1); } } void Range::_share(Node *p_range) { - Range *r = Object::cast_to<Range>(p_range); ERR_FAIL_COND(!r); share(r); } void Range::share(Range *p_range) { - ERR_FAIL_NULL(p_range); p_range->_ref_shared(shared); @@ -206,7 +202,6 @@ void Range::share(Range *p_range) { } void Range::unshare() { - Shared *nshared = memnew(Shared); nshared->min = shared->min; nshared->max = shared->max; @@ -221,9 +216,9 @@ void Range::unshare() { } void Range::_ref_shared(Shared *p_shared) { - - if (shared && p_shared == shared) + if (shared && p_shared == shared) { return; + } _unref_shared(); shared = p_shared; @@ -231,7 +226,6 @@ void Range::_ref_shared(Shared *p_shared) { } void Range::_unref_shared() { - if (shared) { shared->owners.erase(this); if (shared->owners.size() == 0) { @@ -242,7 +236,6 @@ void Range::_unref_shared() { } void Range::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_value"), &Range::get_value); ClassDB::bind_method(D_METHOD("get_min"), &Range::get_min); ClassDB::bind_method(D_METHOD("get_max"), &Range::get_max); @@ -283,49 +276,40 @@ void Range::_bind_methods() { } void Range::set_use_rounded_values(bool p_enable) { - _rounded_values = p_enable; } bool Range::is_using_rounded_values() const { - return _rounded_values; } void Range::set_exp_ratio(bool p_enable) { - shared->exp_ratio = p_enable; update_configuration_warning(); } bool Range::is_ratio_exp() const { - return shared->exp_ratio; } void Range::set_allow_greater(bool p_allow) { - shared->allow_greater = p_allow; } bool Range::is_greater_allowed() const { - return shared->allow_greater; } void Range::set_allow_lesser(bool p_allow) { - shared->allow_lesser = p_allow; } bool Range::is_lesser_allowed() const { - return shared->allow_lesser; } Range::Range() { - shared = memnew(Shared); shared->min = 0; shared->max = 100; @@ -341,6 +325,5 @@ Range::Range() { } Range::~Range() { - _unref_shared(); } diff --git a/scene/gui/range.h b/scene/gui/range.h index 819d76941b..fe43985d0d 100644 --- a/scene/gui/range.h +++ b/scene/gui/range.h @@ -34,7 +34,6 @@ #include "scene/gui/control.h" class Range : public Control { - GDCLASS(Range, Control); struct Shared { diff --git a/scene/gui/reference_rect.cpp b/scene/gui/reference_rect.cpp index 0765e5d882..27c57c684a 100644 --- a/scene/gui/reference_rect.cpp +++ b/scene/gui/reference_rect.cpp @@ -33,13 +33,13 @@ #include "core/engine.h" void ReferenceRect::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; - if (Engine::get_singleton()->is_editor_hint() || !editor_only) + } + if (Engine::get_singleton()->is_editor_hint() || !editor_only) { draw_rect(Rect2(Point2(), get_size()), border_color, false); + } } } diff --git a/scene/gui/reference_rect.h b/scene/gui/reference_rect.h index c25c54f271..db2f4269f3 100644 --- a/scene/gui/reference_rect.h +++ b/scene/gui/reference_rect.h @@ -34,7 +34,6 @@ #include "scene/gui/control.h" class ReferenceRect : public Control { - GDCLASS(ReferenceRect, Control); Color border_color; bool editor_only; diff --git a/scene/gui/rich_text_effect.cpp b/scene/gui/rich_text_effect.cpp index 0f5926ea1c..2628e5ab0f 100644 --- a/scene/gui/rich_text_effect.cpp +++ b/scene/gui/rich_text_effect.cpp @@ -64,7 +64,6 @@ RichTextEffect::RichTextEffect() { } void CharFXTransform::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_relative_index"), &CharFXTransform::get_relative_index); ClassDB::bind_method(D_METHOD("set_relative_index", "index"), &CharFXTransform::set_relative_index); diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index a6c0c99bdb..a57408b83b 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -46,16 +46,12 @@ #endif RichTextLabel::Item *RichTextLabel::_get_next_item(Item *p_item, bool p_free) { - if (p_free) { - if (p_item->subitems.size()) { - return p_item->subitems.front()->get(); } else if (!p_item->parent) { return nullptr; } else if (p_item->E->next()) { - return p_item->E->next()->get(); } else { //go up until something with a next is found @@ -63,20 +59,19 @@ RichTextLabel::Item *RichTextLabel::_get_next_item(Item *p_item, bool p_free) { p_item = p_item->parent; } - if (p_item->parent) + if (p_item->parent) { return p_item->E->next()->get(); - else + } else { return nullptr; + } } } else { if (p_item->subitems.size() && p_item->type != ITEM_TABLE) { - return p_item->subitems.front()->get(); } else if (p_item->type == ITEM_FRAME) { return nullptr; } else if (p_item->E->next()) { - return p_item->E->next()->get(); } else { //go up until something with a next is found @@ -84,10 +79,11 @@ RichTextLabel::Item *RichTextLabel::_get_next_item(Item *p_item, bool p_free) { p_item = p_item->parent; } - if (p_item->type != ITEM_FRAME) + if (p_item->type != ITEM_FRAME) { return p_item->E->next()->get(); - else + } else { return nullptr; + } } } @@ -96,14 +92,11 @@ RichTextLabel::Item *RichTextLabel::_get_next_item(Item *p_item, bool p_free) { RichTextLabel::Item *RichTextLabel::_get_prev_item(Item *p_item, bool p_free) { if (p_free) { - if (p_item->subitems.size()) { - return p_item->subitems.back()->get(); } else if (!p_item->parent) { return nullptr; } else if (p_item->E->prev()) { - return p_item->E->prev()->get(); } else { //go back until something with a prev is found @@ -111,20 +104,19 @@ RichTextLabel::Item *RichTextLabel::_get_prev_item(Item *p_item, bool p_free) { p_item = p_item->parent; } - if (p_item->parent) + if (p_item->parent) { return p_item->E->prev()->get(); - else + } else { return nullptr; + } } } else { if (p_item->subitems.size() && p_item->type != ITEM_TABLE) { - return p_item->subitems.back()->get(); } else if (p_item->type == ITEM_FRAME) { return nullptr; } else if (p_item->E->prev()) { - return p_item->E->prev()->get(); } else { //go back until something with a prev is found @@ -132,10 +124,11 @@ RichTextLabel::Item *RichTextLabel::_get_prev_item(Item *p_item, bool p_free) { p_item = p_item->parent; } - if (p_item->type != ITEM_FRAME) + if (p_item->type != ITEM_FRAME) { return p_item->E->prev()->get(); - else + } else { return nullptr; + } } } @@ -148,17 +141,18 @@ Rect2 RichTextLabel::_get_text_rect() { } int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int &y, int p_width, int p_line, ProcessMode p_mode, const Ref<Font> &p_base_font, const Color &p_base_color, const Color &p_font_color_shadow, bool p_shadow_as_outline, const Point2 &shadow_ofs, const Point2i &p_click_pos, Item **r_click_item, int *r_click_char, bool *r_outside, int p_char_count) { - ERR_FAIL_INDEX_V((int)p_mode, 3, 0); RID ci; - if (r_outside) + if (r_outside) { *r_outside = false; + } if (p_mode == PROCESS_DRAW) { ci = get_canvas_item(); - if (r_click_item) + if (r_click_item) { *r_click_item = nullptr; + } } Line &l = p_frame->lines.write[p_line]; Item *it = l.from; @@ -172,7 +166,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & int height = get_size().y; if (p_mode != PROCESS_CACHE) { - ERR_FAIL_INDEX_V(line, l.offset_caches.size(), 0); line_ofs = l.offset_caches[line]; } @@ -191,14 +184,16 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & int spaces_size = 0; int align_ofs = 0; - if (p_mode != PROCESS_CACHE && align != ALIGN_FILL) + if (p_mode != PROCESS_CACHE && align != ALIGN_FILL) { wofs += line_ofs; + } int begin = wofs; Ref<Font> cfont = _find_font(it); - if (cfont.is_null()) + if (cfont.is_null()) { cfont = p_base_font; + } //line height should be the font height for the first time, this ensures that an empty line will never have zero height and successive newlines are displayed int line_height = cfont->get_height(); @@ -328,18 +323,14 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & int fh = 0; while (it) { - switch (it->type) { - case ITEM_ALIGN: { - ItemAlign *align_it = static_cast<ItemAlign *>(it); align = align_it->align; } break; case ITEM_INDENT: { - if (it != l.from) { ItemIndent *indent_it = static_cast<ItemIndent *>(it); @@ -351,12 +342,12 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } break; case ITEM_TEXT: { - ItemText *text = static_cast<ItemText *>(it); Ref<Font> font = _find_font(it); - if (font.is_null()) + if (font.is_null()) { font = p_base_font; + } const CharType *c = text->text.c_str(); const CharType *cf = c; @@ -399,7 +390,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & rchar = 0; FontDrawer drawer(font, Color(1, 1, 1)); while (*c) { - int end = 0; int w = 0; int fw = 0; @@ -412,7 +402,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & line_descent = line < l.descent_caches.size() ? l.descent_caches[line] : 1; } while (c[end] != 0 && !(end && c[end - 1] == ' ' && c[end] != ' ')) { - int cw = font->get_char_size(c[end], c[end + 1]).width; if (c[end] == '\t') { cw = tab_size * font->get_char_size(' ').width; @@ -446,14 +435,12 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } { - int ofs = 0 - backtrack; for (int i = 0; i < end; i++) { int pofs = wofs + ofs; if (p_mode == PROCESS_POINTER && r_click_char && p_click_pos.y >= p_ofs.y + y && p_click_pos.y <= p_ofs.y + y + lh) { - int cw = font->get_char_size(c[i], c[i + 1]).x; if (c[i] == '\t') { @@ -461,7 +448,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } if (p_click_pos.x - cw / 2 > p_ofs.x + align_ofs + pofs) { - rchar = int((&c[i]) - cf); } @@ -473,7 +459,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & CharType fx_char = c[i]; if (selection.active) { - int cofs = (&c[i]) - cf; if ((text->index > selection.from->index || (text->index == selection.from->index && cofs >= selection.from_char)) && (text->index < selection.to->index || (text->index == selection.to->index && cofs <= selection.to_char))) { selected = true; @@ -498,7 +483,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & const bool previously_visible = visible; for (int j = 0; j < fx_stack.size(); j++) { - ItemFX *item_fx = fx_stack[j]; if (item_fx->type == ITEM_CUSTOMFX && custom_fx_ok) { @@ -567,11 +551,11 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & w += font->get_char_size(c[i], c[i + 1]).x; } - if (c[i] == '\t') + if (c[i] == '\t') { visible = false; + } if (visible) { - if (selected) { cw = font->get_char_size(fx_char, c[i + 1]).x; draw_rect(Rect2(p_ofs.x + pofs, p_ofs.y + y, cw, lh), selection_bg); @@ -636,27 +620,30 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } break; case ITEM_IMAGE: { - lh = 0; - if (p_mode != PROCESS_CACHE) + if (p_mode != PROCESS_CACHE) { lh = line < l.height_caches.size() ? l.height_caches[line] : 1; - else + } else { l.char_count += 1; //images count as chars too + } ItemImage *img = static_cast<ItemImage *>(it); Ref<Font> font = _find_font(it); - if (font.is_null()) + if (font.is_null()) { font = p_base_font; + } - if (p_mode == PROCESS_POINTER && r_click_char) + if (p_mode == PROCESS_POINTER && r_click_char) { *r_click_char = 0; + } ENSURE_WIDTH(img->size.width); bool visible = visible_characters < 0 || (p_char_count < visible_characters && YRANGE_VISIBLE(y + lh - font->get_descent() - img->size.height, img->size.height)); - if (visible) + if (visible) { line_is_blank = false; + } if (p_mode == PROCESS_DRAW && visible) { img->image->draw_rect(ci, Rect2(p_ofs + Point2(align_ofs + wofs, y + lh - font->get_descent() - img->size.height), img->size)); @@ -668,7 +655,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } break; case ITEM_NEWLINE: { - lh = 0; if (p_mode != PROCESS_CACHE) { @@ -678,7 +664,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } break; case ITEM_TABLE: { - lh = 0; ItemTable *table = static_cast<ItemTable *>(it); int hseparation = get_theme_constant("table_hseparation"); @@ -690,7 +675,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & Point2 shadow_ofs2(get_theme_constant("shadow_offset_x"), get_theme_constant("shadow_offset_y")); if (p_mode == PROCESS_CACHE) { - int idx = 0; //set minimums to zero for (int i = 0; i < table->columns.size(); i++) { @@ -710,7 +694,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & int ly = 0; for (int i = 0; i < frame->lines.size(); i++) { - _process_line(frame, Point2(), ly, available_width, i, PROCESS_CACHE, cfont, Color(), font_color_shadow, use_outline, shadow_ofs2); table->columns.write[column].min_width = MAX(table->columns[column].min_width, frame->lines[i].minimum_width); table->columns.write[column].max_width = MAX(table->columns[column].max_width, frame->lines[i].maximum_width); @@ -726,17 +709,20 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & for (int i = 0; i < table->columns.size(); i++) { remaining_width -= table->columns[i].min_width; - if (table->columns[i].max_width > table->columns[i].min_width) + if (table->columns[i].max_width > table->columns[i].min_width) { table->columns.write[i].expand = true; - if (table->columns[i].expand) + } + if (table->columns[i].expand) { total_ratio += table->columns[i].expand_ratio; + } } //assign actual widths for (int i = 0; i < table->columns.size(); i++) { table->columns.write[i].width = table->columns[i].min_width; - if (table->columns[i].expand && total_ratio > 0) + if (table->columns[i].expand && total_ratio > 0) { table->columns.write[i].width += table->columns[i].expand_ratio * remaining_width / total_ratio; + } table->total_width += table->columns[i].width + hseparation; } @@ -746,8 +732,9 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & table_need_fit = false; //fit slim for (int i = 0; i < table->columns.size(); i++) { - if (!table->columns[i].expand) + if (!table->columns[i].expand) { continue; + } int dif = table->columns[i].width - table->columns[i].max_width; if (dif > 0) { table_need_fit = true; @@ -782,7 +769,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & int column = idx % table->columns.size(); for (int i = 0; i < frame->lines.size(); i++) { - int ly = 0; _process_line(frame, Point2(), ly, table->columns[column].width, i, PROCESS_CACHE, cfont, Color(), font_color_shadow, use_outline, shadow_ofs2); frame->lines.write[i].height_cache = ly; //actual height @@ -810,11 +796,11 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & int lines_ofs = p_ofs.y + offset.y + draw_ofs.y; bool visible = lines_ofs < get_size().height && lines_ofs + lines_h >= 0; - if (visible) + if (visible) { line_is_blank = false; + } for (int i = 0; i < frame->lines.size(); i++) { - if (visible) { if (p_mode == PROCESS_DRAW) { nonblank_line_count += _process_line(frame, p_ofs + offset + draw_ofs + Vector2(0, yofs), ly, table->columns[column].width, i, PROCESS_DRAW, cfont, ccolor, font_color_shadow, use_outline, shadow_ofs2); @@ -836,7 +822,6 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & offset.x += table->columns[column].width + hseparation; if (column == table->columns.size() - 1) { - offset.y += row_height + vseparation; offset.x = hseparation; row_height = 0; @@ -863,11 +848,11 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & it = _get_next_item(it); if (it && (p_line + 1 < p_frame->lines.size()) && p_frame->lines[p_line + 1].from == it) { - if (p_mode == PROCESS_POINTER && r_click_item && p_click_pos.y >= p_ofs.y + y && p_click_pos.y <= p_ofs.y + y + lh) { //went to next line, but pointer was on the previous one - if (r_outside) + if (r_outside) { *r_outside = true; + } *r_click_item = itp; *r_click_char = rchar; RETURN; @@ -888,14 +873,15 @@ int RichTextLabel::_process_line(ItemFrame *p_frame, const Vector2 &p_ofs, int & } void RichTextLabel::_scroll_changed(double) { - - if (updating_scroll || !scroll_active) + if (updating_scroll || !scroll_active) { return; + } - if (scroll_follow && vscroll->get_value() >= (vscroll->get_max() - vscroll->get_page())) + if (scroll_follow && vscroll->get_value() >= (vscroll->get_max() - vscroll->get_page())) { scroll_following = true; - else + } else { scroll_following = false; + } scroll_updated = true; @@ -903,13 +889,11 @@ void RichTextLabel::_scroll_changed(double) { } void RichTextLabel::_update_scroll() { - int total_height = get_content_height(); bool exceeds = total_height > get_size().height && scroll_active; if (exceeds != scroll_visible) { - if (exceeds) { scroll_visible = true; scroll_w = vscroll->get_combined_minimum_size().width; @@ -961,9 +945,7 @@ void RichTextLabel::_update_fx(RichTextLabel::ItemFrame *p_frame, float p_delta_ } void RichTextLabel::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_MOUSE_EXIT: { if (meta_hovering) { meta_hovering = nullptr; @@ -973,27 +955,24 @@ void RichTextLabel::_notification(int p_what) { } } break; case NOTIFICATION_RESIZED: { - main->first_invalid_line = 0; //invalidate ALL update(); } break; case NOTIFICATION_ENTER_TREE: { - - if (bbcode != "") + if (bbcode != "") { set_bbcode(bbcode); + } main->first_invalid_line = 0; //invalidate ALL update(); } break; case NOTIFICATION_THEME_CHANGED: { - update(); } break; case NOTIFICATION_DRAW: { - _validate_line_caches(main); _update_scroll(); @@ -1017,15 +996,16 @@ void RichTextLabel::_notification(int p_what) { int from_line = 0; int total_chars = 0; while (from_line < main->lines.size()) { - - if (main->lines[from_line].height_accum_cache + _get_text_rect().get_position().y >= ofs) + if (main->lines[from_line].height_accum_cache + _get_text_rect().get_position().y >= ofs) { break; + } total_chars += main->lines[from_line].char_count; from_line++; } - if (from_line >= main->lines.size()) + if (from_line >= main->lines.size()) { break; //nothing to draw + } int y = (main->lines[from_line].height_accum_cache - main->lines[from_line].height_cache) - ofs; Ref<Font> base_font = get_theme_font("normal_font"); Color base_color = get_theme_color("default_color"); @@ -1035,7 +1015,6 @@ void RichTextLabel::_notification(int p_what) { visible_line_count = 0; while (y < size.height && from_line < main->lines.size()) { - visible_line_count += _process_line(main, text_rect.get_position(), y, text_rect.get_size().width - scroll_w, from_line, PROCESS_DRAW, base_font, base_color, font_color_shadow, use_outline, shadow_ofs, Point2i(), nullptr, nullptr, nullptr, total_chars); total_chars += main->lines[from_line].char_count; @@ -1052,9 +1031,9 @@ void RichTextLabel::_notification(int p_what) { } void RichTextLabel::_find_click(ItemFrame *p_frame, const Point2i &p_click, Item **r_click_item, int *r_click_char, bool *r_outside) { - - if (r_click_item) + if (r_click_item) { *r_click_item = nullptr; + } Rect2 text_rect = _get_text_rect(); int ofs = vscroll->get_value(); @@ -1066,57 +1045,61 @@ void RichTextLabel::_find_click(ItemFrame *p_frame, const Point2i &p_click, Item int from_line = 0; while (from_line < p_frame->lines.size()) { - - if (p_frame->lines[from_line].height_accum_cache >= ofs) + if (p_frame->lines[from_line].height_accum_cache >= ofs) { break; + } from_line++; } - if (from_line >= p_frame->lines.size()) + if (from_line >= p_frame->lines.size()) { return; + } int y = (p_frame->lines[from_line].height_accum_cache - p_frame->lines[from_line].height_cache) - ofs; Ref<Font> base_font = get_theme_font("normal_font"); Color base_color = get_theme_color("default_color"); while (y < text_rect.get_size().height && from_line < p_frame->lines.size()) { - _process_line(p_frame, text_rect.get_position(), y, text_rect.get_size().width - scroll_w, from_line, PROCESS_POINTER, base_font, base_color, font_color_shadow, use_outline, shadow_ofs, p_click, r_click_item, r_click_char, r_outside); - if (r_click_item && *r_click_item) + if (r_click_item && *r_click_item) { return; + } from_line++; } } Control::CursorShape RichTextLabel::get_cursor_shape(const Point2 &p_pos) const { - - if (!underline_meta) + if (!underline_meta) { return CURSOR_ARROW; + } - if (selection.click) + if (selection.click) { return CURSOR_IBEAM; + } - if (main->first_invalid_line < main->lines.size()) + if (main->first_invalid_line < main->lines.size()) { return CURSOR_ARROW; //invalid + } int line = 0; Item *item = nullptr; bool outside; ((RichTextLabel *)(this))->_find_click(main, p_pos, &item, &line, &outside); - if (item && !outside && ((RichTextLabel *)(this))->_find_meta(item, nullptr)) + if (item && !outside && ((RichTextLabel *)(this))->_find_meta(item, nullptr)) { return CURSOR_POINTING_HAND; + } return CURSOR_ARROW; } void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { - Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { - if (main->first_invalid_line < main->lines.size()) + if (main->first_invalid_line < main->lines.size()) { return; + } if (b->get_button_index() == BUTTON_LEFT) { if (b->is_pressed() && !b->is_doubleclick()) { @@ -1128,9 +1111,7 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { _find_click(main, b->get_position(), &item, &line, &outside); if (item) { - if (selection.enabled) { - selection.click = item; selection.click_char = line; @@ -1147,7 +1128,6 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { } } } else if (b->is_pressed() && b->is_doubleclick() && selection.enabled) { - //doubleclick: select word int line = 0; Item *item = nullptr; @@ -1156,17 +1136,14 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { _find_click(main, b->get_position(), &item, &line, &outside); while (item && item->type != ITEM_TEXT) { - item = _get_next_item(item, true); } if (item && item->type == ITEM_TEXT) { - String itext = static_cast<ItemText *>(item)->text; int beg, end; if (select_word(itext, line, beg, end)) { - selection.from = item; selection.to = item; selection.from_char = beg; @@ -1176,7 +1153,6 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { } } } else if (!b->is_pressed()) { - selection.click = nullptr; if (!b->is_doubleclick() && !scroll_updated) { @@ -1187,7 +1163,6 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { _find_click(main, b->get_position(), &item, &line, &outside); if (item) { - Variant meta; if (!outside && _find_meta(item, &meta)) { //meta clicked @@ -1200,21 +1175,22 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { } if (b->get_button_index() == BUTTON_WHEEL_UP) { - if (scroll_active) + if (scroll_active) { vscroll->set_value(vscroll->get_value() - vscroll->get_page() * b->get_factor() * 0.5 / 8); + } } if (b->get_button_index() == BUTTON_WHEEL_DOWN) { - if (scroll_active) + if (scroll_active) { vscroll->set_value(vscroll->get_value() + vscroll->get_page() * b->get_factor() * 0.5 / 8); + } } } Ref<InputEventPanGesture> pan_gesture = p_event; if (pan_gesture.is_valid()) { - - if (scroll_active) - + if (scroll_active) { vscroll->set_value(vscroll->get_value() + vscroll->get_page() * pan_gesture->get_delta().y * 0.5 / 8); + } return; } @@ -1226,42 +1202,36 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { bool handled = false; switch (k->get_keycode()) { case KEY_PAGEUP: { - if (vscroll->is_visible_in_tree()) { vscroll->set_value(vscroll->get_value() - vscroll->get_page()); handled = true; } } break; case KEY_PAGEDOWN: { - if (vscroll->is_visible_in_tree()) { vscroll->set_value(vscroll->get_value() + vscroll->get_page()); handled = true; } } break; case KEY_UP: { - if (vscroll->is_visible_in_tree()) { vscroll->set_value(vscroll->get_value() - get_theme_font("normal_font")->get_height()); handled = true; } } break; case KEY_DOWN: { - if (vscroll->is_visible_in_tree()) { vscroll->set_value(vscroll->get_value() + get_theme_font("normal_font")->get_height()); handled = true; } } break; case KEY_HOME: { - if (vscroll->is_visible_in_tree()) { vscroll->set_value(0); handled = true; } } break; case KEY_END: { - if (vscroll->is_visible_in_tree()) { vscroll->set_value(vscroll->get_max()); handled = true; @@ -1269,7 +1239,6 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { } break; case KEY_INSERT: case KEY_C: { - if (k->get_command()) { selection_copy(); handled = true; @@ -1278,16 +1247,18 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { } break; } - if (handled) + if (handled) { accept_event(); + } } } Ref<InputEventMouseMotion> m = p_event; if (m.is_valid()) { - if (main->first_invalid_line < main->lines.size()) + if (main->first_invalid_line < main->lines.size()) { return; + } int line = 0; Item *item = nullptr; @@ -1295,9 +1266,9 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { _find_click(main, m->get_position(), &item, &line, &outside); if (selection.click) { - - if (!item) + if (!item) { return; // do not update + } selection.from = selection.click; selection.from_char = selection.click_char; @@ -1306,13 +1277,12 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { selection.to_char = line; bool swap = false; - if (selection.from->index > selection.to->index) + if (selection.from->index > selection.to->index) { swap = true; - else if (selection.from->index == selection.to->index) { - if (selection.from_char > selection.to_char) + } else if (selection.from->index == selection.to->index) { + if (selection.from_char > selection.to_char) { swap = true; - else if (selection.from_char == selection.to_char) { - + } else if (selection.from_char == selection.to_char) { selection.active = false; return; } @@ -1347,13 +1317,10 @@ void RichTextLabel::_gui_input(Ref<InputEvent> p_event) { } Ref<Font> RichTextLabel::_find_font(Item *p_item) { - Item *fontitem = p_item; while (fontitem) { - if (fontitem->type == ITEM_FONT) { - ItemFont *fi = static_cast<ItemFont *>(fontitem); return fi->font; } @@ -1365,28 +1332,26 @@ Ref<Font> RichTextLabel::_find_font(Item *p_item) { } int RichTextLabel::_find_margin(Item *p_item, const Ref<Font> &p_base_font) { - Item *item = p_item; int margin = 0; while (item) { - if (item->type == ITEM_INDENT) { - Ref<Font> font = _find_font(item); - if (font.is_null()) + if (font.is_null()) { font = p_base_font; + } ItemIndent *indent = static_cast<ItemIndent *>(item); margin += indent->level * tab_size * font->get_char_size(' ').width; } else if (item->type == ITEM_LIST) { - Ref<Font> font = _find_font(item); - if (font.is_null()) + if (font.is_null()) { font = p_base_font; + } } item = item->parent; @@ -1396,13 +1361,10 @@ int RichTextLabel::_find_margin(Item *p_item, const Ref<Font> &p_base_font) { } RichTextLabel::Align RichTextLabel::_find_align(Item *p_item) { - Item *item = p_item; while (item) { - if (item->type == ITEM_ALIGN) { - ItemAlign *align = static_cast<ItemAlign *>(item); return align->align; } @@ -1414,13 +1376,10 @@ RichTextLabel::Align RichTextLabel::_find_align(Item *p_item) { } Color RichTextLabel::_find_color(Item *p_item, const Color &p_default_color) { - Item *item = p_item; while (item) { - if (item->type == ITEM_COLOR) { - ItemColor *color = static_cast<ItemColor *>(item); return color->color; } @@ -1432,13 +1391,10 @@ Color RichTextLabel::_find_color(Item *p_item, const Color &p_default_color) { } bool RichTextLabel::_find_underline(Item *p_item) { - Item *item = p_item; while (item) { - if (item->type == ITEM_UNDERLINE) { - return true; } @@ -1449,13 +1405,10 @@ bool RichTextLabel::_find_underline(Item *p_item) { } bool RichTextLabel::_find_strikethrough(Item *p_item) { - Item *item = p_item; while (item) { - if (item->type == ITEM_STRIKETHROUGH) { - return true; } @@ -1466,7 +1419,6 @@ bool RichTextLabel::_find_strikethrough(Item *p_item) { } bool RichTextLabel::_find_by_type(Item *p_item, ItemType p_type) { - ERR_FAIL_INDEX_V((int)p_type, 19, false); Item *item = p_item; @@ -1495,14 +1447,14 @@ bool RichTextLabel::_find_meta(Item *p_item, Variant *r_meta, ItemMeta **r_item) Item *item = p_item; while (item) { - if (item->type == ITEM_META) { - ItemMeta *meta = static_cast<ItemMeta *>(item); - if (r_meta) + if (r_meta) { *r_meta = meta->meta; - if (r_item) + } + if (r_item) { *r_item = meta; + } return true; } @@ -1513,16 +1465,17 @@ bool RichTextLabel::_find_meta(Item *p_item, Variant *r_meta, ItemMeta **r_item) } bool RichTextLabel::_find_layout_subitem(Item *from, Item *to) { - if (from && from != to) { - if (from->type != ITEM_FONT && from->type != ITEM_COLOR && from->type != ITEM_UNDERLINE && from->type != ITEM_STRIKETHROUGH) + if (from->type != ITEM_FONT && from->type != ITEM_COLOR && from->type != ITEM_UNDERLINE && from->type != ITEM_STRIKETHROUGH) { return true; + } for (List<Item *>::Element *E = from->subitems.front(); E; E = E->next()) { bool layout = _find_layout_subitem(E->get(), to); - if (layout) + if (layout) { return true; + } } } @@ -1530,9 +1483,9 @@ bool RichTextLabel::_find_layout_subitem(Item *from, Item *to) { } void RichTextLabel::_validate_line_caches(ItemFrame *p_frame) { - - if (p_frame->first_invalid_line == p_frame->lines.size()) + if (p_frame->first_invalid_line == p_frame->lines.size()) { return; + } //validate invalid lines Size2 size = get_size(); @@ -1547,67 +1500,64 @@ void RichTextLabel::_validate_line_caches(ItemFrame *p_frame) { Ref<Font> base_font = get_theme_font("normal_font"); for (int i = p_frame->first_invalid_line; i < p_frame->lines.size(); i++) { - int y = 0; _process_line(p_frame, text_rect.get_position(), y, text_rect.get_size().width - scroll_w, i, PROCESS_CACHE, base_font, Color(), font_color_shadow, use_outline, shadow_ofs); p_frame->lines.write[i].height_cache = y; p_frame->lines.write[i].height_accum_cache = y; - if (i > 0) + if (i > 0) { p_frame->lines.write[i].height_accum_cache += p_frame->lines[i - 1].height_accum_cache; + } } int total_height = 0; - if (p_frame->lines.size()) + if (p_frame->lines.size()) { total_height = p_frame->lines[p_frame->lines.size() - 1].height_accum_cache + get_theme_stylebox("normal")->get_minimum_size().height; + } main->first_invalid_line = p_frame->lines.size(); updating_scroll = true; vscroll->set_max(total_height); vscroll->set_page(size.height); - if (scroll_follow && scroll_following) + if (scroll_follow && scroll_following) { vscroll->set_value(total_height - size.height); + } updating_scroll = false; } void RichTextLabel::_invalidate_current_line(ItemFrame *p_frame) { - if (p_frame->lines.size() - 1 <= p_frame->first_invalid_line) { - p_frame->first_invalid_line = p_frame->lines.size() - 1; update(); } } void RichTextLabel::add_text(const String &p_text) { - - if (current->type == ITEM_TABLE) + if (current->type == ITEM_TABLE) { return; //can't add anything here + } int pos = 0; while (pos < p_text.length()) { - int end = p_text.find("\n", pos); String line; bool eol = false; if (end == -1) { - end = p_text.length(); } else { - eol = true; } - if (pos == 0 && end == p_text.length()) + if (pos == 0 && end == p_text.length()) { line = p_text; - else + } else { line = p_text.substr(pos, end - pos); + } if (line.length() > 0) { - if (current->subitems.size() && current->subitems.back()->get()->type == ITEM_TEXT) { //append text condition! ItemText *ti = static_cast<ItemText *>(current->subitems.back()->get()); @@ -1623,13 +1573,13 @@ void RichTextLabel::add_text(const String &p_text) { } if (eol) { - ItemNewline *item = memnew(ItemNewline); item->line = current_frame->lines.size(); _add_item(item, false); current_frame->lines.resize(current_frame->lines.size() + 1); - if (item->type != ITEM_NEWLINE) + if (item->type != ITEM_NEWLINE) { current_frame->lines.write[current_frame->lines.size() - 1].from = item; + } _invalidate_current_line(current_frame); } @@ -1638,13 +1588,13 @@ void RichTextLabel::add_text(const String &p_text) { } void RichTextLabel::_add_item(Item *p_item, bool p_enter, bool p_ensure_newline) { - p_item->parent = current; p_item->E = current->subitems.push_back(p_item); p_item->index = current_idx++; - if (p_enter) + if (p_enter) { current = p_item; + } if (p_ensure_newline) { Item *from = current_frame->lines[current_frame->lines.size() - 1].from; @@ -1668,15 +1618,15 @@ void RichTextLabel::_add_item(Item *p_item, bool p_enter, bool p_ensure_newline) } void RichTextLabel::_remove_item(Item *p_item, const int p_line, const int p_subitem_line) { - int size = p_item->subitems.size(); if (size == 0) { p_item->parent->subitems.erase(p_item); if (p_item->type == ITEM_NEWLINE) { current_frame->lines.remove(p_line); for (int i = p_subitem_line; i < current->subitems.size(); i++) { - if (current->subitems[i]->line > 0) + if (current->subitems[i]->line > 0) { current->subitems[i]->line--; + } } } } else { @@ -1687,9 +1637,9 @@ void RichTextLabel::_remove_item(Item *p_item, const int p_line, const int p_sub } void RichTextLabel::add_image(const Ref<Texture2D> &p_image, const int p_width, const int p_height) { - - if (current->type == ITEM_TABLE) + if (current->type == ITEM_TABLE) { return; + } ERR_FAIL_COND(p_image.is_null()); ItemImage *item = memnew(ItemImage); @@ -1723,9 +1673,9 @@ void RichTextLabel::add_image(const Ref<Texture2D> &p_image, const int p_width, } void RichTextLabel::add_newline() { - - if (current->type == ITEM_TABLE) + if (current->type == ITEM_TABLE) { return; + } ItemNewline *item = memnew(ItemNewline); item->line = current_frame->lines.size(); _add_item(item, false); @@ -1734,9 +1684,9 @@ void RichTextLabel::add_newline() { } bool RichTextLabel::remove_line(const int p_line) { - - if (p_line >= current_frame->lines.size() || p_line < 0) + if (p_line >= current_frame->lines.size() || p_line < 0) { return false; + } int i = 0; while (i < current->subitems.size() && current->subitems[i]->line < p_line) { @@ -1747,8 +1697,9 @@ bool RichTextLabel::remove_line(const int p_line) { while (i < current->subitems.size()) { was_newline = current->subitems[i]->type == ITEM_NEWLINE; _remove_item(current->subitems[i], current->subitems[i]->line, p_line); - if (was_newline) + if (was_newline) { break; + } } if (!was_newline) { @@ -1758,8 +1709,9 @@ bool RichTextLabel::remove_line(const int p_line) { } } - if (p_line == 0 && current->subitems.size() > 0) + if (p_line == 0 && current->subitems.size() > 0) { main->lines.write[0].from = main; + } main->first_invalid_line = 0; @@ -1767,7 +1719,6 @@ bool RichTextLabel::remove_line(const int p_line) { } void RichTextLabel::push_font(const Ref<Font> &p_font) { - ERR_FAIL_COND(current->type == ITEM_TABLE); ERR_FAIL_COND(p_font.is_null()); ItemFont *item = memnew(ItemFont); @@ -1812,7 +1763,6 @@ void RichTextLabel::push_mono() { } void RichTextLabel::push_color(const Color &p_color) { - ERR_FAIL_COND(current->type == ITEM_TABLE); ItemColor *item = memnew(ItemColor); @@ -1821,7 +1771,6 @@ void RichTextLabel::push_color(const Color &p_color) { } void RichTextLabel::push_underline() { - ERR_FAIL_COND(current->type == ITEM_TABLE); ItemUnderline *item = memnew(ItemUnderline); @@ -1829,7 +1778,6 @@ void RichTextLabel::push_underline() { } void RichTextLabel::push_strikethrough() { - ERR_FAIL_COND(current->type == ITEM_TABLE); ItemStrikethrough *item = memnew(ItemStrikethrough); @@ -1837,7 +1785,6 @@ void RichTextLabel::push_strikethrough() { } void RichTextLabel::push_align(Align p_align) { - ERR_FAIL_COND(current->type == ITEM_TABLE); ItemAlign *item = memnew(ItemAlign); @@ -1846,7 +1793,6 @@ void RichTextLabel::push_align(Align p_align) { } void RichTextLabel::push_indent(int p_level) { - ERR_FAIL_COND(current->type == ITEM_TABLE); ERR_FAIL_COND(p_level < 0); @@ -1856,7 +1802,6 @@ void RichTextLabel::push_indent(int p_level) { } void RichTextLabel::push_list(ListType p_list) { - ERR_FAIL_COND(current->type == ITEM_TABLE); ERR_FAIL_INDEX(p_list, 3); @@ -1867,7 +1812,6 @@ void RichTextLabel::push_list(ListType p_list) { } void RichTextLabel::push_meta(const Variant &p_meta) { - ERR_FAIL_COND(current->type == ITEM_TABLE); ItemMeta *item = memnew(ItemMeta); @@ -1876,7 +1820,6 @@ void RichTextLabel::push_meta(const Variant &p_meta) { } void RichTextLabel::push_table(int p_columns) { - ERR_FAIL_COND(p_columns < 1); ItemTable *item = memnew(ItemTable); @@ -1933,7 +1876,6 @@ void RichTextLabel::push_customfx(Ref<RichTextEffect> p_custom_effect, Dictionar } void RichTextLabel::set_table_column_expand(int p_column, bool p_expand, int p_ratio) { - ERR_FAIL_COND(current->type != ITEM_TABLE); ItemTable *table = static_cast<ItemTable *>(current); ERR_FAIL_INDEX(p_column, table->columns.size()); @@ -1942,7 +1884,6 @@ void RichTextLabel::set_table_column_expand(int p_column, bool p_expand, int p_r } void RichTextLabel::push_cell() { - ERR_FAIL_COND(current->type != ITEM_TABLE); ItemFrame *item = memnew(ItemFrame); @@ -1957,7 +1898,6 @@ void RichTextLabel::push_cell() { } int RichTextLabel::get_current_table_column() const { - ERR_FAIL_COND_V(current->type != ITEM_TABLE, -1); ItemTable *table = static_cast<ItemTable *>(current); @@ -1966,7 +1906,6 @@ int RichTextLabel::get_current_table_column() const { } void RichTextLabel::pop() { - ERR_FAIL_COND(!current->parent); if (current->type == ITEM_FRAME) { current_frame = static_cast<ItemFrame *>(current)->parent_frame; @@ -1975,7 +1914,6 @@ void RichTextLabel::pop() { } void RichTextLabel::clear() { - main->_clear_children(); current = main; current_frame = main; @@ -1993,77 +1931,66 @@ void RichTextLabel::clear() { } void RichTextLabel::set_tab_size(int p_spaces) { - tab_size = p_spaces; main->first_invalid_line = 0; update(); } int RichTextLabel::get_tab_size() const { - return tab_size; } void RichTextLabel::set_meta_underline(bool p_underline) { - underline_meta = p_underline; update(); } bool RichTextLabel::is_meta_underlined() const { - return underline_meta; } void RichTextLabel::set_override_selected_font_color(bool p_override_selected_font_color) { - override_selected_font_color = p_override_selected_font_color; } bool RichTextLabel::is_overriding_selected_font_color() const { - return override_selected_font_color; } void RichTextLabel::set_offset(int p_pixel) { - vscroll->set_value(p_pixel); } void RichTextLabel::set_scroll_active(bool p_active) { - - if (scroll_active == p_active) + if (scroll_active == p_active) { return; + } scroll_active = p_active; update(); } bool RichTextLabel::is_scroll_active() const { - return scroll_active; } void RichTextLabel::set_scroll_follow(bool p_follow) { - scroll_follow = p_follow; - if (!vscroll->is_visible_in_tree() || vscroll->get_value() >= (vscroll->get_max() - vscroll->get_page())) + if (!vscroll->is_visible_in_tree() || vscroll->get_value() >= (vscroll->get_max() - vscroll->get_page())) { scroll_following = true; + } } bool RichTextLabel::is_scroll_following() const { - return scroll_follow; } Error RichTextLabel::parse_bbcode(const String &p_bbcode) { - clear(); return append_bbcode(p_bbcode); } Error RichTextLabel::append_bbcode(const String &p_bbcode) { - int pos = 0; List<String> tag_stack; @@ -2083,18 +2010,19 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { set_process_internal(false); while (pos < p_bbcode.length()) { - int brk_pos = p_bbcode.find("[", pos); - if (brk_pos < 0) + if (brk_pos < 0) { brk_pos = p_bbcode.length(); + } if (brk_pos > pos) { add_text(p_bbcode.substr(pos, brk_pos - pos)); } - if (brk_pos == p_bbcode.length()) + if (brk_pos == p_bbcode.length()) { break; //nothing else to add + } int brk_end = p_bbcode.find("]", brk_pos + 1); @@ -2108,15 +2036,17 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { Vector<String> split_tag_block = tag.split(" ", false); String bbcode = !split_tag_block.empty() ? split_tag_block[0] : ""; if (tag.begins_with("/") && tag_stack.size()) { - bool tag_ok = tag_stack.size() && tag_stack.front()->get() == tag.substr(1, tag.length()); - if (tag_stack.front()->get() == "b") + if (tag_stack.front()->get() == "b") { in_bold = false; - if (tag_stack.front()->get() == "i") + } + if (tag_stack.front()->get() == "i") { in_italics = false; - if (tag_stack.front()->get() == "indent") + } + if (tag_stack.front()->get() == "indent") { indent_level--; + } if (!tag_ok) { add_text("[" + tag); @@ -2126,108 +2056,99 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { tag_stack.pop_front(); pos = brk_end + 1; - if (tag != "/img") + if (tag != "/img") { pop(); + } } else if (tag == "b") { - //use bold font in_bold = true; - if (in_italics) + if (in_italics) { push_font(bold_italics_font); - else + } else { push_font(bold_font); + } pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "i") { - //use italics font in_italics = true; - if (in_bold) + if (in_bold) { push_font(bold_italics_font); - else + } else { push_font(italics_font); + } pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "code") { - //use monospace font push_font(mono_font); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag.begins_with("table=")) { - int columns = tag.substr(6, tag.length()).to_int(); - if (columns < 1) + if (columns < 1) { columns = 1; + } push_table(columns); pos = brk_end + 1; tag_stack.push_front("table"); } else if (tag == "cell") { - push_cell(); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag.begins_with("cell=")) { - int ratio = tag.substr(5, tag.length()).to_int(); - if (ratio < 1) + if (ratio < 1) { ratio = 1; + } set_table_column_expand(get_current_table_column(), true, ratio); push_cell(); pos = brk_end + 1; tag_stack.push_front("cell"); } else if (tag == "u") { - //use underline push_underline(); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "s") { - //use strikethrough push_strikethrough(); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "center") { - push_align(ALIGN_CENTER); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "fill") { - push_align(ALIGN_FILL); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "right") { - push_align(ALIGN_RIGHT); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "ul") { - push_list(LIST_DOTS); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "ol") { - push_list(LIST_NUMBERS); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "indent") { - indent_level++; push_indent(indent_level); pos = brk_end + 1; tag_stack.push_front(tag); } else if (tag == "url") { - int end = p_bbcode.find("[", brk_end); - if (end == -1) + if (end == -1) { end = p_bbcode.length(); + } String url = p_bbcode.substr(brk_end + 1, end - brk_end - 1); push_meta(url); @@ -2235,27 +2156,26 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { tag_stack.push_front(tag); } else if (tag.begins_with("url=")) { - String url = tag.substr(4, tag.length()); push_meta(url); pos = brk_end + 1; tag_stack.push_front("url"); } else if (tag == "img") { - int end = p_bbcode.find("[", brk_end); - if (end == -1) + if (end == -1) { end = p_bbcode.length(); + } String image = p_bbcode.substr(brk_end + 1, end - brk_end - 1); Ref<Texture2D> texture = ResourceLoader::load(image, "Texture2D"); - if (texture.is_valid()) + if (texture.is_valid()) { add_image(texture); + } pos = end; tag_stack.push_front(tag); } else if (tag.begins_with("img=")) { - int width = 0; int height = 0; @@ -2269,72 +2189,74 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { } int end = p_bbcode.find("[", brk_end); - if (end == -1) + if (end == -1) { end = p_bbcode.length(); + } String image = p_bbcode.substr(brk_end + 1, end - brk_end - 1); Ref<Texture2D> texture = ResourceLoader::load(image, "Texture"); - if (texture.is_valid()) + if (texture.is_valid()) { add_image(texture, width, height); + } pos = end; tag_stack.push_front("img"); } else if (tag.begins_with("color=")) { - String col = tag.substr(6, tag.length()); Color color; - if (col.begins_with("#")) + if (col.begins_with("#")) { color = Color::html(col); - else if (col == "aqua") + } else if (col == "aqua") { color = Color(0, 1, 1); - else if (col == "black") + } else if (col == "black") { color = Color(0, 0, 0); - else if (col == "blue") + } else if (col == "blue") { color = Color(0, 0, 1); - else if (col == "fuchsia") + } else if (col == "fuchsia") { color = Color(1, 0, 1); - else if (col == "gray" || col == "grey") + } else if (col == "gray" || col == "grey") { color = Color(0.5, 0.5, 0.5); - else if (col == "green") + } else if (col == "green") { color = Color(0, 0.5, 0); - else if (col == "lime") + } else if (col == "lime") { color = Color(0, 1, 0); - else if (col == "maroon") + } else if (col == "maroon") { color = Color(0.5, 0, 0); - else if (col == "navy") + } else if (col == "navy") { color = Color(0, 0, 0.5); - else if (col == "olive") + } else if (col == "olive") { color = Color(0.5, 0.5, 0); - else if (col == "purple") + } else if (col == "purple") { color = Color(0.5, 0, 0.5); - else if (col == "red") + } else if (col == "red") { color = Color(1, 0, 0); - else if (col == "silver") + } else if (col == "silver") { color = Color(0.75, 0.75, 0.75); - else if (col == "teal") + } else if (col == "teal") { color = Color(0, 0.5, 0.5); - else if (col == "white") + } else if (col == "white") { color = Color(1, 1, 1); - else if (col == "yellow") + } else if (col == "yellow") { color = Color(1, 1, 0); - else + } else { color = base_color; + } push_color(color); pos = brk_end + 1; tag_stack.push_front("color"); } else if (tag.begins_with("font=")) { - String fnt = tag.substr(5, tag.length()); Ref<Font> font = ResourceLoader::load(fnt, "Font"); - if (font.is_valid()) + if (font.is_valid()) { push_font(font); - else + } else { push_font(normal_font); + } pos = brk_end + 1; tag_stack.push_front("font"); @@ -2480,25 +2402,23 @@ Error RichTextLabel::append_bbcode(const String &p_bbcode) { } void RichTextLabel::scroll_to_line(int p_line) { - ERR_FAIL_INDEX(p_line, main->lines.size()); _validate_line_caches(main); vscroll->set_value(main->lines[p_line].height_accum_cache - main->lines[p_line].height_cache); } int RichTextLabel::get_line_count() const { - return current_frame->lines.size(); } int RichTextLabel::get_visible_line_count() const { - if (!is_visible()) + if (!is_visible()) { return 0; + } return visible_line_count; } void RichTextLabel::set_selection_enabled(bool p_enabled) { - selection.enabled = p_enabled; if (!p_enabled) { if (selection.active) { @@ -2512,7 +2432,6 @@ void RichTextLabel::set_selection_enabled(bool p_enabled) { } bool RichTextLabel::search(const String &p_string, bool p_from_selection, bool p_search_previous) { - ERR_FAIL_COND_V(!selection.enabled, false); Item *it = main; int charidx = 0; @@ -2523,9 +2442,7 @@ bool RichTextLabel::search(const String &p_string, bool p_from_selection, bool p } while (it) { - if (it->type == ITEM_TEXT) { - ItemText *t = static_cast<ItemText *>(it); int sp = t->text.findn(p_string, charidx); if (sp != -1) { @@ -2560,10 +2477,11 @@ bool RichTextLabel::search(const String &p_string, bool p_from_selection, bool p } } - if (p_search_previous) + if (p_search_previous) { it = _get_prev_item(it, true); - else + } else { it = _get_next_item(it, true); + } charidx = 0; } @@ -2571,18 +2489,16 @@ bool RichTextLabel::search(const String &p_string, bool p_from_selection, bool p } void RichTextLabel::selection_copy() { - - if (!selection.active || !selection.enabled) + if (!selection.active || !selection.enabled) { return; + } String text; RichTextLabel::Item *item = selection.from; while (item) { - if (item->type == ITEM_TEXT) { - String itext = static_cast<ItemText *>(item)->text; if (item == selection.from && item == selection.to) { text += itext.substr(selection.from_char, selection.to_char - selection.from_char + 1); @@ -2597,8 +2513,9 @@ void RichTextLabel::selection_copy() { } else if (item->type == ITEM_NEWLINE) { text += "\n"; } - if (item == selection.to) + if (item == selection.to) { break; + } item = _get_next_item(item, true); } @@ -2609,34 +2526,32 @@ void RichTextLabel::selection_copy() { } bool RichTextLabel::is_selection_enabled() const { - return selection.enabled; } void RichTextLabel::set_bbcode(const String &p_bbcode) { bbcode = p_bbcode; - if (is_inside_tree() && use_bbcode) + if (is_inside_tree() && use_bbcode) { parse_bbcode(p_bbcode); - else { // raw text + } else { // raw text clear(); add_text(p_bbcode); } } String RichTextLabel::get_bbcode() const { - return bbcode; } void RichTextLabel::set_use_bbcode(bool p_enable) { - if (use_bbcode == p_enable) + if (use_bbcode == p_enable) { return; + } use_bbcode = p_enable; set_bbcode(bbcode); } bool RichTextLabel::is_using_bbcode() const { - return use_bbcode; } @@ -2663,14 +2578,11 @@ void RichTextLabel::set_text(const String &p_string) { } void RichTextLabel::set_percent_visible(float p_percent) { - if (p_percent < 0 || p_percent >= 1) { - visible_characters = -1; percent_visible = 1; } else { - visible_characters = get_total_character_count() * p_percent; percent_visible = p_percent; } @@ -2711,13 +2623,13 @@ void RichTextLabel::install_effect(const Variant effect) { int RichTextLabel::get_content_height() { int total_height = 0; - if (main->lines.size()) + if (main->lines.size()) { total_height = main->lines[main->lines.size() - 1].height_accum_cache + get_theme_stylebox("normal")->get_minimum_size().height; + } return total_height; } void RichTextLabel::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &RichTextLabel::_gui_input); ClassDB::bind_method(D_METHOD("get_text"), &RichTextLabel::get_text); ClassDB::bind_method(D_METHOD("add_text", "text"), &RichTextLabel::add_text); @@ -2856,11 +2768,12 @@ void RichTextLabel::set_visible_characters(int p_visible) { int RichTextLabel::get_visible_characters() const { return visible_characters; } -int RichTextLabel::get_total_character_count() const { +int RichTextLabel::get_total_character_count() const { int tc = 0; - for (int i = 0; i < current_frame->lines.size(); i++) + for (int i = 0; i < current_frame->lines.size(); i++) { tc += current_frame->lines[i].char_count; + } return tc; } @@ -2871,7 +2784,6 @@ void RichTextLabel::set_fixed_size_to_width(int p_width) { } Size2 RichTextLabel::get_minimum_size() const { - if (fixed_width != -1) { const_cast<RichTextLabel *>(this)->_validate_line_caches(main); return Size2(fixed_width, const_cast<RichTextLabel *>(this)->get_content_height()); @@ -2882,8 +2794,9 @@ Size2 RichTextLabel::get_minimum_size() const { Ref<RichTextEffect> RichTextLabel::_get_custom_effect_by_code(String p_bbcode_identifier) { for (int i = 0; i < custom_effects.size(); i++) { - if (!custom_effects[i].is_valid()) + if (!custom_effects[i].is_valid()) { continue; + } if (custom_effects[i]->get_bbcode() == p_bbcode_identifier) { return custom_effects[i]; @@ -2953,7 +2866,6 @@ Dictionary RichTextLabel::parse_expressions_for_values(Vector<String> p_expressi } RichTextLabel::RichTextLabel() { - main = memnew(ItemFrame); main->index = 0; current = main; diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index 7f2b5facb9..019edf5d45 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -35,7 +35,6 @@ #include "scene/gui/scroll_bar.h" class RichTextLabel : public Control { - GDCLASS(RichTextLabel, Control); public: @@ -84,7 +83,6 @@ private: struct Item; struct Line { - Item *from; Vector<int> offset_caches; Vector<int> height_caches; @@ -352,7 +350,6 @@ private: }; struct Selection { - Item *click; int click_char; diff --git a/scene/gui/scroll_bar.cpp b/scene/gui/scroll_bar.cpp index 1c63c25e28..e7950bec98 100644 --- a/scene/gui/scroll_bar.cpp +++ b/scene/gui/scroll_bar.cpp @@ -38,12 +38,10 @@ bool ScrollBar::focus_by_default = false; void ScrollBar::set_can_focus_by_default(bool p_can_focus) { - focus_by_default = p_can_focus; } void ScrollBar::_gui_input(Ref<InputEvent> p_event) { - Ref<InputEventMouseMotion> m = p_event; if (!m.is_valid() || drag.active) { emit_signal("scrolling"); @@ -55,22 +53,20 @@ void ScrollBar::_gui_input(Ref<InputEvent> p_event) { accept_event(); if (b->get_button_index() == BUTTON_WHEEL_DOWN && b->is_pressed()) { - set_value(get_value() + get_page() / 4.0); accept_event(); } if (b->get_button_index() == BUTTON_WHEEL_UP && b->is_pressed()) { - set_value(get_value() - get_page() / 4.0); accept_event(); } - if (b->get_button_index() != BUTTON_LEFT) + if (b->get_button_index() != BUTTON_LEFT) { return; + } if (b->is_pressed()) { - double ofs = orientation == VERTICAL ? b->get_position().y : b->get_position().x; Ref<Texture2D> decr = get_theme_icon("decrement"); Ref<Texture2D> incr = get_theme_icon("increment"); @@ -82,13 +78,11 @@ void ScrollBar::_gui_input(Ref<InputEvent> p_event) { double total = orientation == VERTICAL ? get_size().height : get_size().width; if (ofs < decr_size) { - set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); return; } if (ofs > total - incr_size) { - set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); return; } @@ -96,7 +90,6 @@ void ScrollBar::_gui_input(Ref<InputEvent> p_event) { ofs -= decr_size; if (ofs < grabber_ofs) { - if (scrolling) { target_scroll = CLAMP(target_scroll - get_page(), get_min(), get_max() - get_page()); } else { @@ -115,7 +108,6 @@ void ScrollBar::_gui_input(Ref<InputEvent> p_event) { ofs -= grabber_ofs; if (ofs < grabber_size) { - drag.active = true; drag.pos_at_click = grabber_ofs + ofs; drag.value_at_click = get_as_ratio(); @@ -136,18 +128,15 @@ void ScrollBar::_gui_input(Ref<InputEvent> p_event) { } } else { - drag.active = false; update(); } } if (m.is_valid()) { - accept_event(); if (drag.active) { - double ofs = orientation == VERTICAL ? m->get_position().y : m->get_position().x; Ref<Texture2D> decr = get_theme_icon("decrement"); @@ -158,7 +147,6 @@ void ScrollBar::_gui_input(Ref<InputEvent> p_event) { set_as_ratio(drag.value_at_click + diff); } else { - double ofs = orientation == VERTICAL ? m->get_position().y : m->get_position().x; Ref<Texture2D> decr = get_theme_icon("decrement"); Ref<Texture2D> incr = get_theme_icon("increment"); @@ -170,20 +158,16 @@ void ScrollBar::_gui_input(Ref<InputEvent> p_event) { HighlightStatus new_hilite; if (ofs < decr_size) { - new_hilite = HIGHLIGHT_DECR; } else if (ofs > total - incr_size) { - new_hilite = HIGHLIGHT_INCR; } else { - new_hilite = HIGHLIGHT_RANGE; } if (new_hilite != highlight) { - highlight = new_hilite; update(); } @@ -191,47 +175,42 @@ void ScrollBar::_gui_input(Ref<InputEvent> p_event) { } if (p_event->is_pressed()) { - if (p_event->is_action("ui_left")) { - - if (orientation != HORIZONTAL) + if (orientation != HORIZONTAL) { return; + } set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); } else if (p_event->is_action("ui_right")) { - - if (orientation != HORIZONTAL) + if (orientation != HORIZONTAL) { return; + } set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); } else if (p_event->is_action("ui_up")) { - - if (orientation != VERTICAL) + if (orientation != VERTICAL) { return; + } set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); } else if (p_event->is_action("ui_down")) { - - if (orientation != VERTICAL) + if (orientation != VERTICAL) { return; + } set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); } else if (p_event->is_action("ui_home")) { - set_value(get_min()); } else if (p_event->is_action("ui_end")) { - set_value(get_max()); } } } void ScrollBar::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - RID ci = get_canvas_item(); Ref<Texture2D> decr = highlight == HIGHLIGHT_DECR ? get_theme_icon("decrement_highlight") : get_theme_icon("decrement"); @@ -239,47 +218,49 @@ void ScrollBar::_notification(int p_what) { Ref<StyleBox> bg = has_focus() ? get_theme_stylebox("scroll_focus") : get_theme_stylebox("scroll"); Ref<StyleBox> grabber; - if (drag.active) + if (drag.active) { grabber = get_theme_stylebox("grabber_pressed"); - else if (highlight == HIGHLIGHT_RANGE) + } else if (highlight == HIGHLIGHT_RANGE) { grabber = get_theme_stylebox("grabber_highlight"); - else + } else { grabber = get_theme_stylebox("grabber"); + } Point2 ofs; decr->draw(ci, Point2()); - if (orientation == HORIZONTAL) + if (orientation == HORIZONTAL) { ofs.x += decr->get_width(); - else + } else { ofs.y += decr->get_height(); + } Size2 area = get_size(); - if (orientation == HORIZONTAL) + if (orientation == HORIZONTAL) { area.width -= incr->get_width() + decr->get_width(); - else + } else { area.height -= incr->get_height() + decr->get_height(); + } bg->draw(ci, Rect2(ofs, area)); - if (orientation == HORIZONTAL) + if (orientation == HORIZONTAL) { ofs.width += area.width; - else + } else { ofs.height += area.height; + } incr->draw(ci, ofs); Rect2 grabber_rect; if (orientation == HORIZONTAL) { - grabber_rect.size.width = get_grabber_size(); grabber_rect.size.height = get_size().height; grabber_rect.position.y = 0; grabber_rect.position.x = get_grabber_offset() + decr->get_width() + bg->get_margin(MARGIN_LEFT); } else { - grabber_rect.size.width = get_size().width; grabber_rect.size.height = get_grabber_size(); grabber_rect.position.y = get_grabber_offset() + decr->get_height() + bg->get_margin(MARGIN_TOP); @@ -290,7 +271,6 @@ void ScrollBar::_notification(int p_what) { } if (p_what == NOTIFICATION_ENTER_TREE) { - if (has_node(drag_node_path)) { Node *n = get_node(drag_node_path); drag_node = Object::cast_to<Control>(n); @@ -302,7 +282,6 @@ void ScrollBar::_notification(int p_what) { } } if (p_what == NOTIFICATION_EXIT_TREE) { - if (drag_node) { drag_node->disconnect("gui_input", callable_mp(this, &ScrollBar::_drag_node_input)); drag_node->disconnect("tree_exiting", callable_mp(this, &ScrollBar::_drag_node_exit)); @@ -312,7 +291,6 @@ void ScrollBar::_notification(int p_what) { } if (p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS) { - if (scrolling) { if (get_value() != target_scroll) { double target = target_scroll - get_value(); @@ -332,16 +310,13 @@ void ScrollBar::_notification(int p_what) { } } else if (drag_node_touching) { - if (drag_node_touching_deaccel) { - Vector2 pos = Vector2(orientation == HORIZONTAL ? get_value() : 0, orientation == VERTICAL ? get_value() : 0); pos += drag_node_speed * get_physics_process_delta_time(); bool turnoff = false; if (orientation == HORIZONTAL) { - if (pos.x < 0) { pos.x = 0; turnoff = true; @@ -365,7 +340,6 @@ void ScrollBar::_notification(int p_what) { drag_node_speed.x = sgn_x * val_x; } else { - if (pos.y < 0) { pos.y = 0; turnoff = true; @@ -395,9 +369,7 @@ void ScrollBar::_notification(int p_what) { } } else { - if (time_since_motion == 0 || time_since_motion > 0.1) { - Vector2 diff = drag_node_accum - last_drag_node_accum; last_drag_node_accum = drag_node_accum; drag_node_speed = diff / get_physics_process_delta_time(); @@ -409,24 +381,22 @@ void ScrollBar::_notification(int p_what) { } if (p_what == NOTIFICATION_MOUSE_EXIT) { - highlight = HIGHLIGHT_NONE; update(); } } double ScrollBar::get_grabber_min_size() const { - Ref<StyleBox> grabber = get_theme_stylebox("grabber"); Size2 gminsize = grabber->get_minimum_size() + grabber->get_center_size(); return (orientation == VERTICAL) ? gminsize.height : gminsize.width; } double ScrollBar::get_grabber_size() const { - float range = get_max() - get_min(); - if (range <= 0) + if (range <= 0) { return 0; + } float page = (get_page() > 0) ? get_page() : 0; /* @@ -464,17 +434,14 @@ double ScrollBar::get_area_size() const { } double ScrollBar::get_area_offset() const { - double ofs = 0; if (orientation == VERTICAL) { - ofs += get_theme_stylebox("hscroll")->get_margin(MARGIN_TOP); ofs += get_theme_icon("decrement")->get_height(); } if (orientation == HORIZONTAL) { - ofs += get_theme_stylebox("hscroll")->get_margin(MARGIN_LEFT); ofs += get_theme_icon("decrement")->get_width(); } @@ -483,31 +450,28 @@ double ScrollBar::get_area_offset() const { } double ScrollBar::get_click_pos(const Point2 &p_pos) const { - float pos = (orientation == VERTICAL) ? p_pos.y : p_pos.x; pos -= get_area_offset(); float area = get_area_size(); - if (area == 0) + if (area == 0) { return 0; - else + } else { return pos / area; + } } double ScrollBar::get_grabber_offset() const { - return (get_area_size()) * get_as_ratio(); } Size2 ScrollBar::get_minimum_size() const { - Ref<Texture2D> incr = get_theme_icon("increment"); Ref<Texture2D> decr = get_theme_icon("decrement"); Ref<StyleBox> bg = get_theme_stylebox("scroll"); Size2 minsize; if (orientation == VERTICAL) { - minsize.width = MAX(incr->get_size().width, (bg->get_minimum_size() + bg->get_center_size()).width); minsize.height += incr->get_size().height; minsize.height += decr->get_size().height; @@ -516,7 +480,6 @@ Size2 ScrollBar::get_minimum_size() const { } if (orientation == HORIZONTAL) { - minsize.height = MAX(incr->get_size().height, (bg->get_center_size() + bg->get_minimum_size()).height); minsize.width += incr->get_size().width; minsize.width += decr->get_size().width; @@ -528,17 +491,14 @@ Size2 ScrollBar::get_minimum_size() const { } void ScrollBar::set_custom_step(float p_custom_step) { - custom_step = p_custom_step; } float ScrollBar::get_custom_step() const { - return custom_step; } void ScrollBar::_drag_node_exit() { - if (drag_node) { drag_node->disconnect("gui_input", callable_mp(this, &ScrollBar::_drag_node_input)); } @@ -546,16 +506,14 @@ void ScrollBar::_drag_node_exit() { } void ScrollBar::_drag_node_input(const Ref<InputEvent> &p_input) { - Ref<InputEventMouseButton> mb = p_input; if (mb.is_valid()) { - - if (mb->get_button_index() != 1) + if (mb->get_button_index() != 1) { return; + } if (mb->is_pressed()) { - drag_node_speed = Vector2(); drag_node_accum = Vector2(); last_drag_node_accum = Vector2(); @@ -570,9 +528,7 @@ void ScrollBar::_drag_node_input(const Ref<InputEvent> &p_input) { } } else { - if (drag_node_touching) { - if (drag_node_speed == Vector2()) { drag_node_touching_deaccel = false; drag_node_touching = false; @@ -587,19 +543,19 @@ void ScrollBar::_drag_node_input(const Ref<InputEvent> &p_input) { Ref<InputEventMouseMotion> mm = p_input; if (mm.is_valid()) { - if (drag_node_touching && !drag_node_touching_deaccel) { - Vector2 motion = Vector2(mm->get_relative().x, mm->get_relative().y); drag_node_accum -= motion; Vector2 diff = drag_node_from + drag_node_accum; - if (orientation == HORIZONTAL) + if (orientation == HORIZONTAL) { set_value(diff.x); + } - if (orientation == VERTICAL) + if (orientation == VERTICAL) { set_value(diff.y); + } time_since_motion = 0; } @@ -607,9 +563,7 @@ void ScrollBar::_drag_node_input(const Ref<InputEvent> &p_input) { } void ScrollBar::set_drag_node(const NodePath &p_path) { - if (is_inside_tree()) { - if (drag_node) { drag_node->disconnect("gui_input", callable_mp(this, &ScrollBar::_drag_node_input)); drag_node->disconnect("tree_exiting", callable_mp(this, &ScrollBar::_drag_node_exit)); @@ -620,7 +574,6 @@ void ScrollBar::set_drag_node(const NodePath &p_path) { drag_node_path = p_path; if (is_inside_tree()) { - if (has_node(p_path)) { Node *n = get_node(p_path); drag_node = Object::cast_to<Control>(n); @@ -634,7 +587,6 @@ void ScrollBar::set_drag_node(const NodePath &p_path) { } NodePath ScrollBar::get_drag_node() const { - return drag_node_path; } @@ -647,7 +599,6 @@ bool ScrollBar::is_smooth_scroll_enabled() const { } void ScrollBar::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &ScrollBar::_gui_input); ClassDB::bind_method(D_METHOD("set_custom_step", "step"), &ScrollBar::set_custom_step); ClassDB::bind_method(D_METHOD("get_custom_step"), &ScrollBar::get_custom_step); @@ -658,7 +609,6 @@ void ScrollBar::_bind_methods() { } ScrollBar::ScrollBar(Orientation p_orientation) { - orientation = p_orientation; highlight = HIGHLIGHT_NONE; custom_step = -1; @@ -674,8 +624,9 @@ ScrollBar::ScrollBar(Orientation p_orientation) { target_scroll = 0; smooth_scroll_enabled = false; - if (focus_by_default) + if (focus_by_default) { set_focus_mode(FOCUS_ALL); + } set_step(0); } diff --git a/scene/gui/scroll_bar.h b/scene/gui/scroll_bar.h index ee5e7140cf..d2641b14f3 100644 --- a/scene/gui/scroll_bar.h +++ b/scene/gui/scroll_bar.h @@ -34,7 +34,6 @@ #include "scene/gui/range.h" class ScrollBar : public Range { - GDCLASS(ScrollBar, Range); enum HighlightStatus { @@ -53,7 +52,6 @@ class ScrollBar : public Range { HighlightStatus highlight; struct Drag { - bool active; float pos_at_click; float value_at_click; @@ -111,7 +109,6 @@ public: }; class HScrollBar : public ScrollBar { - GDCLASS(HScrollBar, ScrollBar); public: @@ -120,7 +117,6 @@ public: }; class VScrollBar : public ScrollBar { - GDCLASS(VScrollBar, ScrollBar); public: diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index fb17adf96e..b72b913af0 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -33,24 +33,24 @@ #include "scene/main/window.h" bool ScrollContainer::clips_input() const { - return true; } Size2 ScrollContainer::get_minimum_size() const { - Ref<StyleBox> sb = get_theme_stylebox("bg"); Size2 min_size; for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; - if (c == h_scroll || c == v_scroll) + } + if (c == h_scroll || c == v_scroll) { continue; + } Size2 minsize = c->get_combined_minimum_size(); if (!scroll_h) { @@ -88,14 +88,12 @@ void ScrollContainer::_cancel_drag() { } void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) { - double prev_v_scroll = v_scroll->get_value(); double prev_h_scroll = h_scroll->get_value(); Ref<InputEventMouseButton> mb = p_gui_input; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) { // only horizontal is enabled, scroll horizontally if (h_scroll->is_visible() && (!v_scroll->is_visible() || mb->get_shift())) { @@ -126,17 +124,19 @@ void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) { } } - if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) + if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) { accept_event(); //accept event if scroll changed + } - if (!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id()))) + if (!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id()))) { return; + } - if (mb->get_button_index() != BUTTON_LEFT) + if (mb->get_button_index() != BUTTON_LEFT) { return; + } if (mb->is_pressed()) { - if (drag_touching) { _cancel_drag(); } @@ -156,11 +156,9 @@ void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) { } else { if (drag_touching) { - if (drag_speed == Vector2()) { _cancel_drag(); } else { - drag_touching_deaccel = true; } } @@ -170,9 +168,7 @@ void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) { Ref<InputEventMouseMotion> mm = p_gui_input; if (mm.is_valid()) { - if (drag_touching && !drag_touching_deaccel) { - Vector2 motion = Vector2(mm->get_relative().x, mm->get_relative().y); drag_accum -= motion; @@ -186,14 +182,16 @@ void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) { drag_accum = -motion; } Vector2 diff = drag_from + drag_accum; - if (scroll_h) + if (scroll_h) { h_scroll->set_value(diff.x); - else + } else { drag_accum.x = 0; - if (scroll_v) + } + if (scroll_v) { v_scroll->set_value(diff.y); - else + } else { drag_accum.y = 0; + } time_since_motion = 0; } } @@ -201,7 +199,6 @@ void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) { Ref<InputEventPanGesture> pan_gesture = p_gui_input; if (pan_gesture.is_valid()) { - if (h_scroll->is_visible_in_tree()) { h_scroll->set_value(h_scroll->get_value() + h_scroll->get_page() * pan_gesture->get_delta().x / 8); } @@ -210,12 +207,12 @@ void ScrollContainer::_gui_input(const Ref<InputEvent> &p_gui_input) { } } - if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) + if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) { accept_event(); //accept event if scroll changed + } } void ScrollContainer::_update_scrollbar_position() { - Size2 hmin = h_scroll->get_combined_minimum_size(); Size2 vmin = v_scroll->get_combined_minimum_size(); @@ -234,7 +231,6 @@ void ScrollContainer::_update_scrollbar_position() { } void ScrollContainer::_ensure_focused_visible(Control *p_control) { - if (!follow_focus) { return; } @@ -259,19 +255,15 @@ void ScrollContainer::_ensure_focused_visible(Control *p_control) { } void ScrollContainer::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - call_deferred("_update_scrollbar_position"); }; if (p_what == NOTIFICATION_READY) { - get_viewport()->connect("gui_focus_changed", callable_mp(this, &ScrollContainer::_ensure_focused_visible)); } if (p_what == NOTIFICATION_SORT_CHILDREN) { - child_max_size = Size2(0, 0); Size2 size = get_size(); Point2 ofs; @@ -280,21 +272,25 @@ void ScrollContainer::_notification(int p_what) { size -= sb->get_minimum_size(); ofs += sb->get_offset(); - if (h_scroll->is_visible_in_tree() && h_scroll->get_parent() == this) //scrolls may have been moved out for reasons + if (h_scroll->is_visible_in_tree() && h_scroll->get_parent() == this) { //scrolls may have been moved out for reasons size.y -= h_scroll->get_minimum_size().y; + } - if (v_scroll->is_visible_in_tree() && v_scroll->get_parent() == this) //scrolls may have been moved out for reasons + if (v_scroll->is_visible_in_tree() && v_scroll->get_parent() == this) { //scrolls may have been moved out for reasons size.x -= v_scroll->get_minimum_size().x; + } for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; - if (c == h_scroll || c == v_scroll) + } + if (c == h_scroll || c == v_scroll) { continue; + } Size2 minsize = c->get_combined_minimum_size(); child_max_size.x = MAX(child_max_size.x, minsize.x); child_max_size.y = MAX(child_max_size.y, minsize.y); @@ -302,17 +298,19 @@ void ScrollContainer::_notification(int p_what) { Rect2 r = Rect2(-scroll, minsize); if (!scroll_h || (!h_scroll->is_visible_in_tree() && c->get_h_size_flags() & SIZE_EXPAND)) { r.position.x = 0; - if (c->get_h_size_flags() & SIZE_EXPAND) + if (c->get_h_size_flags() & SIZE_EXPAND) { r.size.width = MAX(size.width, minsize.width); - else + } else { r.size.width = minsize.width; + } } if (!scroll_v || (!v_scroll->is_visible_in_tree() && c->get_v_size_flags() & SIZE_EXPAND)) { r.position.y = 0; - if (c->get_v_size_flags() & SIZE_EXPAND) + if (c->get_v_size_flags() & SIZE_EXPAND) { r.size.height = MAX(size.height, minsize.height); - else + } else { r.size.height = minsize.height; + } } r.position += ofs; fit_child_in_rect(c, r); @@ -322,7 +320,6 @@ void ScrollContainer::_notification(int p_what) { }; if (p_what == NOTIFICATION_DRAW) { - Ref<StyleBox> sb = get_theme_stylebox("bg"); draw_style_box(sb, Rect2(Vector2(), get_size())); @@ -330,11 +327,8 @@ void ScrollContainer::_notification(int p_what) { } if (p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS) { - if (drag_touching) { - if (drag_touching_deaccel) { - Vector2 pos = Vector2(h_scroll->get_value(), v_scroll->get_value()); pos += drag_speed * get_physics_process_delta_time(); @@ -359,10 +353,12 @@ void ScrollContainer::_notification(int p_what) { turnoff_v = true; } - if (scroll_h) + if (scroll_h) { h_scroll->set_value(pos.x); - if (scroll_v) + } + if (scroll_v) { v_scroll->set_value(pos.y); + } float sgn_x = drag_speed.x < 0 ? -1 : 1; float val_x = Math::abs(drag_speed.x); @@ -387,9 +383,7 @@ void ScrollContainer::_notification(int p_what) { } } else { - if (time_since_motion == 0 || time_since_motion > 0.1) { - Vector2 diff = drag_accum - last_drag_accum; last_drag_accum = drag_accum; drag_speed = diff / get_physics_process_delta_time(); @@ -402,7 +396,6 @@ void ScrollContainer::_notification(int p_what) { }; void ScrollContainer::update_scrollbars() { - Size2 size = get_size(); Ref<StyleBox> sb = get_theme_stylebox("bg"); size -= sb->get_minimum_size(); @@ -422,11 +415,9 @@ void ScrollContainer::update_scrollbars() { bool hide_scroll_h = !scroll_h || min.width <= size.width; if (hide_scroll_v) { - v_scroll->hide(); scroll.y = 0; } else { - v_scroll->show(); v_scroll->set_max(min.height); if (hide_scroll_h) { @@ -439,11 +430,9 @@ void ScrollContainer::update_scrollbars() { } if (hide_scroll_h) { - h_scroll->hide(); scroll.x = 0; } else { - h_scroll->show(); h_scroll->set_max(min.width); if (hide_scroll_v) { @@ -461,7 +450,6 @@ void ScrollContainer::update_scrollbars() { } void ScrollContainer::_scroll_moved(float) { - scroll.x = h_scroll->get_value(); scroll.y = v_scroll->get_value(); queue_sort(); @@ -480,7 +468,6 @@ void ScrollContainer::set_enable_h_scroll(bool p_enable) { } bool ScrollContainer::is_h_scroll_enabled() const { - return scroll_h; } @@ -495,26 +482,23 @@ void ScrollContainer::set_enable_v_scroll(bool p_enable) { } bool ScrollContainer::is_v_scroll_enabled() const { - return scroll_v; } int ScrollContainer::get_v_scroll() const { - return v_scroll->get_value(); } -void ScrollContainer::set_v_scroll(int p_pos) { +void ScrollContainer::set_v_scroll(int p_pos) { v_scroll->set_value(p_pos); _cancel_drag(); } int ScrollContainer::get_h_scroll() const { - return h_scroll->get_value(); } -void ScrollContainer::set_h_scroll(int p_pos) { +void ScrollContainer::set_h_scroll(int p_pos) { h_scroll->set_value(p_pos); _cancel_drag(); } @@ -536,40 +520,39 @@ void ScrollContainer::set_follow_focus(bool p_follow) { } String ScrollContainer::get_configuration_warning() const { - int found = 0; for (int i = 0; i < get_child_count(); i++) { - Control *c = Object::cast_to<Control>(get_child(i)); - if (!c) + if (!c) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; - if (c == h_scroll || c == v_scroll) + } + if (c == h_scroll || c == v_scroll) { continue; + } found++; } - if (found != 1) + if (found != 1) { return TTR("ScrollContainer is intended to work with a single child control.\nUse a container as child (VBox, HBox, etc.), or a Control and set the custom minimum size manually."); - else + } else { return ""; + } } HScrollBar *ScrollContainer::get_h_scrollbar() { - return h_scroll; } VScrollBar *ScrollContainer::get_v_scrollbar() { - return v_scroll; } void ScrollContainer::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &ScrollContainer::_gui_input); ClassDB::bind_method(D_METHOD("set_enable_h_scroll", "enable"), &ScrollContainer::set_enable_h_scroll); ClassDB::bind_method(D_METHOD("is_h_scroll_enabled"), &ScrollContainer::is_h_scroll_enabled); @@ -604,7 +587,6 @@ void ScrollContainer::_bind_methods() { }; ScrollContainer::ScrollContainer() { - h_scroll = memnew(HScrollBar); h_scroll->set_name("_h_scroll"); add_child(h_scroll); diff --git a/scene/gui/scroll_container.h b/scene/gui/scroll_container.h index 6423b36fcc..321e0e2c5a 100644 --- a/scene/gui/scroll_container.h +++ b/scene/gui/scroll_container.h @@ -36,7 +36,6 @@ #include "scroll_bar.h" class ScrollContainer : public Container { - GDCLASS(ScrollContainer, Container); HScrollBar *h_scroll; diff --git a/scene/gui/separator.cpp b/scene/gui/separator.cpp index 75c4b7cce9..4f7e5720b8 100644 --- a/scene/gui/separator.cpp +++ b/scene/gui/separator.cpp @@ -31,7 +31,6 @@ #include "separator.h" Size2 Separator::get_minimum_size() const { - Size2 ms(3, 3); if (orientation == VERTICAL) { ms.x = get_theme_constant("separation"); @@ -42,20 +41,15 @@ Size2 Separator::get_minimum_size() const { } void Separator::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_DRAW: { - Size2i size = get_size(); Ref<StyleBox> style = get_theme_stylebox("separator"); Size2i ssize = style->get_minimum_size() + style->get_center_size(); if (orientation == VERTICAL) { - style->draw(get_canvas_item(), Rect2((size.x - ssize.x) / 2, 0, ssize.x, size.y)); } else { - style->draw(get_canvas_item(), Rect2(0, (size.y - ssize.y) / 2, size.x, ssize.y)); } @@ -70,11 +64,9 @@ Separator::~Separator() { } HSeparator::HSeparator() { - orientation = HORIZONTAL; } VSeparator::VSeparator() { - orientation = VERTICAL; } diff --git a/scene/gui/separator.h b/scene/gui/separator.h index 9a64d6ba99..f7e5ef2c6b 100644 --- a/scene/gui/separator.h +++ b/scene/gui/separator.h @@ -33,7 +33,6 @@ #include "scene/gui/control.h" class Separator : public Control { - GDCLASS(Separator, Control); protected: @@ -48,7 +47,6 @@ public: }; class VSeparator : public Separator { - GDCLASS(VSeparator, Separator); public: @@ -56,7 +54,6 @@ public: }; class HSeparator : public Separator { - GDCLASS(HSeparator, Separator); public: diff --git a/scene/gui/shortcut.cpp b/scene/gui/shortcut.cpp index 262d8076f3..9f5b9c40c2 100644 --- a/scene/gui/shortcut.cpp +++ b/scene/gui/shortcut.cpp @@ -33,36 +33,31 @@ #include "core/os/keyboard.h" void ShortCut::set_shortcut(const Ref<InputEvent> &p_shortcut) { - shortcut = p_shortcut; emit_changed(); } Ref<InputEvent> ShortCut::get_shortcut() const { - return shortcut; } bool ShortCut::is_shortcut(const Ref<InputEvent> &p_event) const { - return shortcut.is_valid() && shortcut->shortcut_match(p_event); } String ShortCut::get_as_text() const { - - if (shortcut.is_valid()) + if (shortcut.is_valid()) { return shortcut->as_text(); - else + } else { return "None"; + } } bool ShortCut::is_valid() const { - return shortcut.is_valid(); } void ShortCut::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_shortcut", "event"), &ShortCut::set_shortcut); ClassDB::bind_method(D_METHOD("get_shortcut"), &ShortCut::get_shortcut); diff --git a/scene/gui/shortcut.h b/scene/gui/shortcut.h index b22c3441c5..063d4e43dc 100644 --- a/scene/gui/shortcut.h +++ b/scene/gui/shortcut.h @@ -35,7 +35,6 @@ #include "core/resource.h" class ShortCut : public Resource { - GDCLASS(ShortCut, Resource); Ref<InputEvent> shortcut; diff --git a/scene/gui/slider.cpp b/scene/gui/slider.cpp index 910d5f8230..3dd5e022f0 100644 --- a/scene/gui/slider.cpp +++ b/scene/gui/slider.cpp @@ -32,21 +32,20 @@ #include "core/os/keyboard.h" Size2 Slider::get_minimum_size() const { - Ref<StyleBox> style = get_theme_stylebox("slider"); Size2i ss = style->get_minimum_size() + style->get_center_size(); Ref<Texture2D> grabber = get_theme_icon("grabber"); Size2i rs = grabber->get_size(); - if (orientation == HORIZONTAL) + if (orientation == HORIZONTAL) { return Size2i(ss.width, MAX(ss.height, rs.height)); - else + } else { return Size2i(MAX(ss.width, rs.width), ss.height); + } } void Slider::_gui_input(Ref<InputEvent> p_event) { - if (!editable) { return; } @@ -55,7 +54,6 @@ void Slider::_gui_input(Ref<InputEvent> p_event) { if (mb.is_valid()) { if (mb->get_button_index() == BUTTON_LEFT) { - if (mb->is_pressed()) { Ref<Texture2D> grabber = get_theme_icon(mouse_inside || has_focus() ? "grabber_highlight" : "grabber"); grab.pos = orientation == VERTICAL ? mb->get_position().y : mb->get_position().x; @@ -63,10 +61,11 @@ void Slider::_gui_input(Ref<InputEvent> p_event) { double grab_width = (double)grabber->get_size().width; double grab_height = (double)grabber->get_size().height; double max = orientation == VERTICAL ? get_size().height - grab_height : get_size().width - grab_width; - if (orientation == VERTICAL) + if (orientation == VERTICAL) { set_as_ratio(1 - (((double)grab.pos - (grab_height / 2.0)) / max)); - else + } else { set_as_ratio(((double)grab.pos - (grab_width / 2.0)) / max); + } grab.active = true; grab.uvalue = get_as_ratio(); } else { @@ -85,53 +84,51 @@ void Slider::_gui_input(Ref<InputEvent> p_event) { if (mm.is_valid()) { if (grab.active) { - Size2i size = get_size(); Ref<Texture2D> grabber = get_theme_icon("grabber"); float motion = (orientation == VERTICAL ? mm->get_position().y : mm->get_position().x) - grab.pos; - if (orientation == VERTICAL) + if (orientation == VERTICAL) { motion = -motion; + } float areasize = orientation == VERTICAL ? size.height - grabber->get_size().height : size.width - grabber->get_size().width; - if (areasize <= 0) + if (areasize <= 0) { return; + } float umotion = motion / float(areasize); set_as_ratio(grab.uvalue + umotion); } } if (!mm.is_valid() && !mb.is_valid()) { - if (p_event->is_action_pressed("ui_left", true)) { - - if (orientation != HORIZONTAL) + if (orientation != HORIZONTAL) { return; + } set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); accept_event(); } else if (p_event->is_action_pressed("ui_right", true)) { - - if (orientation != HORIZONTAL) + if (orientation != HORIZONTAL) { return; + } set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); accept_event(); } else if (p_event->is_action_pressed("ui_up", true)) { - - if (orientation != VERTICAL) + if (orientation != VERTICAL) { return; + } set_value(get_value() + (custom_step >= 0 ? custom_step : get_step())); accept_event(); } else if (p_event->is_action_pressed("ui_down", true)) { - - if (orientation != VERTICAL) + if (orientation != VERTICAL) { return; + } set_value(get_value() - (custom_step >= 0 ? custom_step : get_step())); accept_event(); } else if (p_event->is_action("ui_home") && p_event->is_pressed()) { - set_value(get_min()); accept_event(); } else if (p_event->is_action("ui_end") && p_event->is_pressed()) { - set_value(get_max()); accept_event(); } @@ -139,26 +136,21 @@ void Slider::_gui_input(Ref<InputEvent> p_event) { } void Slider::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_THEME_CHANGED: { - minimum_size_changed(); update(); } break; case NOTIFICATION_MOUSE_ENTER: { - mouse_inside = true; update(); } break; case NOTIFICATION_MOUSE_EXIT: { - mouse_inside = false; update(); } break; case NOTIFICATION_VISIBILITY_CHANGED: // fallthrough case NOTIFICATION_EXIT_TREE: { - mouse_inside = false; grab.active = false; } break; @@ -173,7 +165,6 @@ void Slider::_notification(int p_what) { double ratio = Math::is_nan(get_as_ratio()) ? 0 : get_as_ratio(); if (orientation == VERTICAL) { - int widget_width = style->get_minimum_size().width + style->get_center_size().width; float areasize = size.height - grabber->get_size().height; style->draw(ci, Rect2i(Point2i(size.width / 2 - widget_width / 2, 0), Size2i(widget_width, size.height))); @@ -182,15 +173,15 @@ void Slider::_notification(int p_what) { if (ticks > 1) { int grabber_offset = (grabber->get_size().height / 2 - tick->get_height() / 2); for (int i = 0; i < ticks; i++) { - if (!ticks_on_borders && (i == 0 || i + 1 == ticks)) + if (!ticks_on_borders && (i == 0 || i + 1 == ticks)) { continue; + } int ofs = (i * areasize / (ticks - 1)) + grabber_offset; tick->draw(ci, Point2i((size.width - widget_width) / 2, ofs)); } } grabber->draw(ci, Point2i(size.width / 2 - grabber->get_size().width / 2, size.height - ratio * areasize - grabber->get_size().height)); } else { - int widget_height = style->get_minimum_size().height + style->get_center_size().height; float areasize = size.width - grabber->get_size().width; @@ -200,8 +191,9 @@ void Slider::_notification(int p_what) { if (ticks > 1) { int grabber_offset = (grabber->get_size().width / 2 - tick->get_width() / 2); for (int i = 0; i < ticks; i++) { - if ((!ticks_on_borders) && ((i == 0) || ((i + 1) == ticks))) + if ((!ticks_on_borders) && ((i == 0) || ((i + 1) == ticks))) { continue; + } int ofs = (i * areasize / (ticks - 1)) + grabber_offset; tick->draw(ci, Point2i(ofs, (size.height - widget_height) / 2)); } @@ -214,23 +206,19 @@ void Slider::_notification(int p_what) { } void Slider::set_custom_step(float p_custom_step) { - custom_step = p_custom_step; } float Slider::get_custom_step() const { - return custom_step; } void Slider::set_ticks(int p_count) { - ticks = p_count; update(); } int Slider::get_ticks() const { - return ticks; } @@ -244,28 +232,23 @@ void Slider::set_ticks_on_borders(bool _tob) { } void Slider::set_editable(bool p_editable) { - editable = p_editable; update(); } bool Slider::is_editable() const { - return editable; } void Slider::set_scrollable(bool p_scrollable) { - scrollable = p_scrollable; } bool Slider::is_scrollable() const { - return scrollable; } void Slider::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &Slider::_gui_input); ClassDB::bind_method(D_METHOD("set_ticks", "count"), &Slider::set_ticks); ClassDB::bind_method(D_METHOD("get_ticks"), &Slider::get_ticks); diff --git a/scene/gui/slider.h b/scene/gui/slider.h index 1248044ec4..6f8f7cc7d8 100644 --- a/scene/gui/slider.h +++ b/scene/gui/slider.h @@ -34,7 +34,6 @@ #include "scene/gui/range.h" class Slider : public Range { - GDCLASS(Slider, Range); struct Grab { @@ -78,7 +77,6 @@ public: }; class HSlider : public Slider { - GDCLASS(HSlider, Slider); public: @@ -87,7 +85,6 @@ public: }; class VSlider : public Slider { - GDCLASS(VSlider, Slider); public: diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index 94628f7cea..3670f13705 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -34,24 +34,23 @@ #include "core/math/expression.h" Size2 SpinBox::get_minimum_size() const { - Size2 ms = line_edit->get_combined_minimum_size(); ms.width += last_w; return ms; } void SpinBox::_value_changed(double) { - String value = String::num(get_value(), Math::range_step_decimals(get_step())); - if (prefix != "") + if (prefix != "") { value = prefix + " " + value; - if (suffix != "") + } + if (suffix != "") { value += " " + suffix; + } line_edit->set_text(value); } void SpinBox::_text_entered(const String &p_string) { - Ref<Expression> expr; expr.instance(); // Ignore the prefix and suffix in the expression @@ -68,7 +67,6 @@ void SpinBox::_text_entered(const String &p_string) { } LineEdit *SpinBox::get_line_edit() { - return line_edit; } @@ -76,9 +74,7 @@ void SpinBox::_line_edit_input(const Ref<InputEvent> &p_event) { } void SpinBox::_range_click_timeout() { - if (!drag.enabled && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { - bool up = get_local_mouse_position().y < (get_size().height / 2); set_value(get_value() + (up ? get_step() : -get_step())); @@ -94,7 +90,6 @@ void SpinBox::_range_click_timeout() { } void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { - if (!is_editable()) { return; } @@ -102,13 +97,10 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid() && mb->is_pressed()) { - bool up = mb->get_position().y < (get_size().height / 2); switch (mb->get_button_index()) { - case BUTTON_LEFT: { - line_edit->grab_focus(); set_value(get_value() + (up ? get_step() : -get_step())); @@ -121,20 +113,17 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { drag.capture_pos = mb->get_position(); } break; case BUTTON_RIGHT: { - line_edit->grab_focus(); set_value((up ? get_max() : get_min())); } break; case BUTTON_WHEEL_UP: { if (line_edit->has_focus()) { - set_value(get_value() + get_step() * mb->get_factor()); accept_event(); } } break; case BUTTON_WHEEL_DOWN: { if (line_edit->has_focus()) { - set_value(get_value() - get_step() * mb->get_factor()); accept_event(); } @@ -143,7 +132,6 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { } if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - //set_default_cursor_shape(CURSOR_ARROW); range_click_timer->stop(); @@ -158,14 +146,11 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid() && mm->get_button_mask() & BUTTON_MASK_LEFT) { - if (drag.enabled) { - drag.diff_y += mm->get_relative().y; float diff_y = -0.01 * Math::pow(ABS(drag.diff_y), 1.8f) * SGN(drag.diff_y); set_value(CLAMP(drag.base_val + get_step() * diff_y, get_min(), get_max())); } else if (drag.allowed && drag.capture_pos.distance_to(mm->get_position()) > 2) { - Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); drag.enabled = true; drag.base_val = get_value(); @@ -175,16 +160,15 @@ void SpinBox::_gui_input(const Ref<InputEvent> &p_event) { } void SpinBox::_line_edit_focus_exit() { - // discontinue because the focus_exit was caused by right-click context menu - if (line_edit->get_menu()->is_visible()) + if (line_edit->get_menu()->is_visible()) { return; + } _text_entered(line_edit->get_text()); } inline void SpinBox::_adjust_width_for_icon(const Ref<Texture2D> &icon) { - int w = icon->get_width(); if (w != last_w) { line_edit->set_margin(MARGIN_RIGHT, -w); @@ -193,9 +177,7 @@ inline void SpinBox::_adjust_width_for_icon(const Ref<Texture2D> &icon) { } void SpinBox::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - Ref<Texture2D> updown = get_theme_icon("updown"); _adjust_width_for_icon(updown); @@ -206,48 +188,39 @@ void SpinBox::_notification(int p_what) { updown->draw(ci, Point2i(size.width - updown->get_width(), (size.height - updown->get_height()) / 2)); } else if (p_what == NOTIFICATION_FOCUS_EXIT) { - //_value_changed(0); } else if (p_what == NOTIFICATION_ENTER_TREE) { - _adjust_width_for_icon(get_theme_icon("updown")); _value_changed(0); } else if (p_what == NOTIFICATION_THEME_CHANGED) { - call_deferred("minimum_size_changed"); get_line_edit()->call_deferred("minimum_size_changed"); } } void SpinBox::set_align(LineEdit::Align p_align) { - line_edit->set_align(p_align); } LineEdit::Align SpinBox::get_align() const { - return line_edit->get_align(); } void SpinBox::set_suffix(const String &p_suffix) { - suffix = p_suffix; _value_changed(0); } String SpinBox::get_suffix() const { - return suffix; } void SpinBox::set_prefix(const String &p_prefix) { - prefix = p_prefix; _value_changed(0); } String SpinBox::get_prefix() const { - return prefix; } @@ -256,7 +229,6 @@ void SpinBox::set_editable(bool p_editable) { } bool SpinBox::is_editable() const { - return line_edit->is_editable(); } @@ -265,7 +237,6 @@ void SpinBox::apply() { } void SpinBox::_bind_methods() { - //ClassDB::bind_method(D_METHOD("_value_changed"),&SpinBox::_value_changed); ClassDB::bind_method(D_METHOD("_gui_input"), &SpinBox::_gui_input); ClassDB::bind_method(D_METHOD("set_align", "align"), &SpinBox::set_align); @@ -286,7 +257,6 @@ void SpinBox::_bind_methods() { } SpinBox::SpinBox() { - last_w = 0; line_edit = memnew(LineEdit); add_child(line_edit); diff --git a/scene/gui/spin_box.h b/scene/gui/spin_box.h index d3a3d8fe3d..3200480cf5 100644 --- a/scene/gui/spin_box.h +++ b/scene/gui/spin_box.h @@ -36,7 +36,6 @@ #include "scene/main/timer.h" class SpinBox : public Range { - GDCLASS(SpinBox, Range); LineEdit *line_edit; diff --git a/scene/gui/split_container.cpp b/scene/gui/split_container.cpp index de892a4fb9..5c60153d91 100644 --- a/scene/gui/split_container.cpp +++ b/scene/gui/split_container.cpp @@ -34,18 +34,20 @@ #include "margin_container.h" Control *SplitContainer::_getch(int p_idx) const { - int idx = 0; for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); - if (!c || !c->is_visible_in_tree()) + if (!c || !c->is_visible_in_tree()) { continue; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { continue; + } - if (idx == p_idx) + if (idx == p_idx) { return c; + } idx++; } @@ -119,7 +121,6 @@ void SplitContainer::_resort() { } Size2 SplitContainer::get_minimum_size() const { - /* Calculate MINIMUM SIZE */ Size2i minimum; @@ -128,26 +129,24 @@ Size2 SplitContainer::get_minimum_size() const { sep = (dragger_visibility != DRAGGER_HIDDEN_COLLAPSED) ? MAX(sep, vertical ? g->get_height() : g->get_width()) : 0; for (int i = 0; i < 2; i++) { - - if (!_getch(i)) + if (!_getch(i)) { break; + } if (i == 1) { - - if (vertical) + if (vertical) { minimum.height += sep; - else + } else { minimum.width += sep; + } } Size2 ms = _getch(i)->get_combined_minimum_size(); if (vertical) { - minimum.height += ms.height; minimum.width = MAX(minimum.width, ms.width); } else { - minimum.width += ms.width; minimum.height = MAX(minimum.height, ms.height); } @@ -157,80 +156,71 @@ Size2 SplitContainer::get_minimum_size() const { } void SplitContainer::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_SORT_CHILDREN: { - _resort(); } break; case NOTIFICATION_MOUSE_EXIT: { - mouse_inside = false; - if (get_theme_constant("autohide")) + if (get_theme_constant("autohide")) { update(); + } } break; case NOTIFICATION_DRAW: { - - if (!_getch(0) || !_getch(1)) + if (!_getch(0) || !_getch(1)) { return; + } - if (collapsed || (!dragging && !mouse_inside && get_theme_constant("autohide"))) + if (collapsed || (!dragging && !mouse_inside && get_theme_constant("autohide"))) { return; + } - if (dragger_visibility != DRAGGER_VISIBLE) + if (dragger_visibility != DRAGGER_VISIBLE) { return; + } int sep = dragger_visibility != DRAGGER_HIDDEN_COLLAPSED ? get_theme_constant("separation") : 0; Ref<Texture2D> tex = get_theme_icon("grabber"); Size2 size = get_size(); - if (vertical) + if (vertical) { draw_texture(tex, Point2i((size.x - tex->get_width()) / 2, middle_sep + (sep - tex->get_height()) / 2)); - else + } else { draw_texture(tex, Point2i(middle_sep + (sep - tex->get_width()) / 2, (size.y - tex->get_height()) / 2)); + } } break; case NOTIFICATION_THEME_CHANGED: { - minimum_size_changed(); } break; } } void SplitContainer::_gui_input(const Ref<InputEvent> &p_event) { - - if (collapsed || !_getch(0) || !_getch(1) || dragger_visibility != DRAGGER_VISIBLE) + if (collapsed || !_getch(0) || !_getch(1) || dragger_visibility != DRAGGER_VISIBLE) { return; + } Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->get_button_index() == BUTTON_LEFT) { - if (mb->is_pressed()) { - int sep = get_theme_constant("separation"); if (vertical) { - if (mb->get_position().y > middle_sep && mb->get_position().y < middle_sep + sep) { - dragging = true; drag_from = mb->get_position().y; drag_ofs = split_offset; } } else { - if (mb->get_position().x > middle_sep && mb->get_position().x < middle_sep + sep) { - dragging = true; drag_from = mb->get_position().x; drag_ofs = split_offset; } } } else { - dragging = false; } } @@ -239,22 +229,23 @@ void SplitContainer::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - bool mouse_inside_state = false; - if (vertical) + if (vertical) { mouse_inside_state = mm->get_position().y > middle_sep && mm->get_position().y < middle_sep + get_theme_constant("separation"); - else + } else { mouse_inside_state = mm->get_position().x > middle_sep && mm->get_position().x < middle_sep + get_theme_constant("separation"); + } if (mouse_inside != mouse_inside_state) { - mouse_inside = mouse_inside_state; - if (get_theme_constant("autohide")) + if (get_theme_constant("autohide")) { update(); + } } - if (!dragging) + if (!dragging) { return; + } split_offset = drag_ofs + ((vertical ? mm->get_position().y : mm->get_position().x) - drag_from); should_clamp_split_offset = true; @@ -264,22 +255,21 @@ void SplitContainer::_gui_input(const Ref<InputEvent> &p_event) { } Control::CursorShape SplitContainer::get_cursor_shape(const Point2 &p_pos) const { - - if (dragging) + if (dragging) { return (vertical ? CURSOR_VSPLIT : CURSOR_HSPLIT); + } if (!collapsed && _getch(0) && _getch(1) && dragger_visibility == DRAGGER_VISIBLE) { - int sep = get_theme_constant("separation"); if (vertical) { - - if (p_pos.y > middle_sep && p_pos.y < middle_sep + sep) + if (p_pos.y > middle_sep && p_pos.y < middle_sep + sep) { return CURSOR_VSPLIT; + } } else { - - if (p_pos.x > middle_sep && p_pos.x < middle_sep + sep) + if (p_pos.x > middle_sep && p_pos.x < middle_sep + sep) { return CURSOR_HSPLIT; + } } } @@ -287,9 +277,9 @@ Control::CursorShape SplitContainer::get_cursor_shape(const Point2 &p_pos) const } void SplitContainer::set_split_offset(int p_offset) { - - if (split_offset == p_offset) + if (split_offset == p_offset) { return; + } split_offset = p_offset; @@ -297,7 +287,6 @@ void SplitContainer::set_split_offset(int p_offset) { } int SplitContainer::get_split_offset() const { - return split_offset; } @@ -308,33 +297,29 @@ void SplitContainer::clamp_split_offset() { } void SplitContainer::set_collapsed(bool p_collapsed) { - - if (collapsed == p_collapsed) + if (collapsed == p_collapsed) { return; + } collapsed = p_collapsed; queue_sort(); } void SplitContainer::set_dragger_visibility(DraggerVisibility p_visibility) { - dragger_visibility = p_visibility; queue_sort(); update(); } SplitContainer::DraggerVisibility SplitContainer::get_dragger_visibility() const { - return dragger_visibility; } bool SplitContainer::is_collapsed() const { - return collapsed; } void SplitContainer::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &SplitContainer::_gui_input); ClassDB::bind_method(D_METHOD("set_split_offset", "offset"), &SplitContainer::set_split_offset); @@ -359,7 +344,6 @@ void SplitContainer::_bind_methods() { } SplitContainer::SplitContainer(bool p_vertical) { - mouse_inside = false; split_offset = 0; should_clamp_split_offset = false; diff --git a/scene/gui/split_container.h b/scene/gui/split_container.h index d759c6ad35..6dbd316a46 100644 --- a/scene/gui/split_container.h +++ b/scene/gui/split_container.h @@ -34,7 +34,6 @@ #include "scene/gui/container.h" class SplitContainer : public Container { - GDCLASS(SplitContainer, Container); public: @@ -86,7 +85,6 @@ public: VARIANT_ENUM_CAST(SplitContainer::DraggerVisibility); class HSplitContainer : public SplitContainer { - GDCLASS(HSplitContainer, SplitContainer); public: @@ -95,7 +93,6 @@ public: }; class VSplitContainer : public SplitContainer { - GDCLASS(VSplitContainer, SplitContainer); public: diff --git a/scene/gui/subviewport_container.cpp b/scene/gui/subviewport_container.cpp index 7252a43651..4e1ad2ae05 100644 --- a/scene/gui/subviewport_container.cpp +++ b/scene/gui/subviewport_container.cpp @@ -34,15 +34,15 @@ #include "scene/main/viewport.h" Size2 SubViewportContainer::get_minimum_size() const { - - if (stretch) + if (stretch) { return Size2(); + } Size2 ms; for (int i = 0; i < get_child_count(); i++) { - SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); - if (!c) + if (!c) { continue; + } Size2 minsize = c->get_size(); ms.width = MAX(ms.width, minsize.width); @@ -53,33 +53,32 @@ Size2 SubViewportContainer::get_minimum_size() const { } void SubViewportContainer::set_stretch(bool p_enable) { - stretch = p_enable; queue_sort(); update(); } bool SubViewportContainer::is_stretch_enabled() const { - return stretch; } void SubViewportContainer::set_stretch_shrink(int p_shrink) { - ERR_FAIL_COND(p_shrink < 1); - if (shrink == p_shrink) + if (shrink == p_shrink) { return; + } shrink = p_shrink; - if (!stretch) + if (!stretch) { return; + } for (int i = 0; i < get_child_count(); i++) { - SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); - if (!c) + if (!c) { continue; + } c->set_size(get_size() / shrink); } @@ -88,64 +87,62 @@ void SubViewportContainer::set_stretch_shrink(int p_shrink) { } int SubViewportContainer::get_stretch_shrink() const { - return shrink; } void SubViewportContainer::_notification(int p_what) { - if (p_what == NOTIFICATION_RESIZED) { - - if (!stretch) + if (!stretch) { return; + } for (int i = 0; i < get_child_count(); i++) { - SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); - if (!c) + if (!c) { continue; + } c->set_size(get_size() / shrink); } } if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_VISIBILITY_CHANGED) { - for (int i = 0; i < get_child_count(); i++) { - SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); - if (!c) + if (!c) { continue; + } - if (is_visible_in_tree()) + if (is_visible_in_tree()) { c->set_update_mode(SubViewport::UPDATE_ALWAYS); - else + } else { c->set_update_mode(SubViewport::UPDATE_DISABLED); + } c->set_handle_input_locally(false); //do not handle input locally here } } if (p_what == NOTIFICATION_DRAW) { - for (int i = 0; i < get_child_count(); i++) { - SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); - if (!c) + if (!c) { continue; + } - if (stretch) + if (stretch) { draw_texture_rect(c->get_texture(), Rect2(Vector2(), get_size())); - else + } else { draw_texture_rect(c->get_texture(), Rect2(Vector2(), c->get_size())); + } } } } void SubViewportContainer::_input(const Ref<InputEvent> &p_event) { - - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { return; + } Transform2D xform = get_global_transform(); @@ -158,19 +155,19 @@ void SubViewportContainer::_input(const Ref<InputEvent> &p_event) { Ref<InputEvent> ev = p_event->xformed_by(xform.affine_inverse()); for (int i = 0; i < get_child_count(); i++) { - SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); - if (!c || c->is_input_disabled()) + if (!c || c->is_input_disabled()) { continue; + } c->input(ev); } } void SubViewportContainer::_unhandled_input(const Ref<InputEvent> &p_event) { - - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { return; + } Transform2D xform = get_global_transform(); @@ -183,17 +180,16 @@ void SubViewportContainer::_unhandled_input(const Ref<InputEvent> &p_event) { Ref<InputEvent> ev = p_event->xformed_by(xform.affine_inverse()); for (int i = 0; i < get_child_count(); i++) { - SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); - if (!c || c->is_input_disabled()) + if (!c || c->is_input_disabled()) { continue; + } c->unhandled_input(ev); } } void SubViewportContainer::_bind_methods() { - ClassDB::bind_method(D_METHOD("_unhandled_input", "event"), &SubViewportContainer::_unhandled_input); ClassDB::bind_method(D_METHOD("_input", "event"), &SubViewportContainer::_input); ClassDB::bind_method(D_METHOD("set_stretch", "enable"), &SubViewportContainer::set_stretch); @@ -207,7 +203,6 @@ void SubViewportContainer::_bind_methods() { } SubViewportContainer::SubViewportContainer() { - stretch = false; shrink = 1; set_process_input(true); diff --git a/scene/gui/subviewport_container.h b/scene/gui/subviewport_container.h index 13b711f838..fc4c9f925a 100644 --- a/scene/gui/subviewport_container.h +++ b/scene/gui/subviewport_container.h @@ -34,7 +34,6 @@ #include "scene/gui/container.h" class SubViewportContainer : public Container { - GDCLASS(SubViewportContainer, Container); bool stretch; diff --git a/scene/gui/tab_container.cpp b/scene/gui/tab_container.cpp index 3a128cf8e6..97b8362214 100644 --- a/scene/gui/tab_container.cpp +++ b/scene/gui/tab_container.cpp @@ -36,9 +36,9 @@ #include "scene/gui/texture_rect.h" int TabContainer::_get_top_margin() const { - - if (!tabs_visible) + if (!tabs_visible) { return 0; + } // Respect the minimum tab height. Ref<StyleBox> tab_bg = get_theme_stylebox("tab_bg"); @@ -53,14 +53,15 @@ int TabContainer::_get_top_margin() const { Vector<Control *> tabs = _get_tabs(); for (int i = 0; i < tabs.size(); i++) { - Control *c = tabs[i]; - if (!c->has_meta("_tab_icon")) + if (!c->has_meta("_tab_icon")) { continue; + } Ref<Texture2D> tex = c->get_meta("_tab_icon"); - if (!tex.is_valid()) + if (!tex.is_valid()) { continue; + } content_height = MAX(content_height, tex->get_size().height); } @@ -68,17 +69,16 @@ int TabContainer::_get_top_margin() const { } void TabContainer::_gui_input(const Ref<InputEvent> &p_event) { - Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - Point2 pos(mb->get_position().x, mb->get_position().y); Size2 size = get_size(); // Click must be on tabs in the tab header area. - if (pos.x < tabs_ofs_cache || pos.y > _get_top_margin()) + if (pos.x < tabs_ofs_cache || pos.y > _get_top_margin()) { return; + } // Handle menu button. Ref<Texture2D> menu = get_theme_icon("menu"); @@ -95,8 +95,9 @@ void TabContainer::_gui_input(const Ref<InputEvent> &p_event) { } // Do not activate tabs when tabs is empty. - if (get_tab_count() == 0) + if (get_tab_count() == 0) { return; + } Vector<Control *> tabs = _get_tabs(); @@ -144,13 +145,11 @@ void TabContainer::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - Point2 pos(mm->get_position().x, mm->get_position().y); Size2 size = get_size(); // Mouse must be on tabs in the tab header area. if (pos.x < tabs_ofs_cache || pos.y > _get_top_margin()) { - if (menu_hovered || highlight_arrow > -1) { menu_hovered = false; highlight_arrow = -1; @@ -161,7 +160,6 @@ void TabContainer::_gui_input(const Ref<InputEvent> &p_event) { Ref<Texture2D> menu = get_theme_icon("menu"); if (popup) { - if (pos.x >= size.width - menu->get_width()) { if (!menu_hovered) { menu_hovered = true; @@ -194,13 +192,11 @@ void TabContainer::_gui_input(const Ref<InputEvent> &p_event) { Ref<Texture2D> increment = get_theme_icon("increment"); Ref<Texture2D> decrement = get_theme_icon("decrement"); if (pos.x >= size.width - increment->get_width() - popup_ofs) { - if (highlight_arrow != 1) { highlight_arrow = 1; update(); } } else if (pos.x >= size.width - increment->get_width() - decrement->get_width() - popup_ofs) { - if (highlight_arrow != 0) { highlight_arrow = 0; update(); @@ -213,16 +209,12 @@ void TabContainer::_gui_input(const Ref<InputEvent> &p_event) { } void TabContainer::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_TRANSLATION_CHANGED: { - minimum_size_changed(); update(); } break; case NOTIFICATION_RESIZED: { - Vector<Control *> tabs = _get_tabs(); int side_margin = get_theme_constant("side_margin"); Ref<Texture2D> menu = get_theme_icon("menu"); @@ -231,12 +223,15 @@ void TabContainer::_notification(int p_what) { int header_width = get_size().width - side_margin * 2; // Find the width of the header area. - if (popup) + if (popup) { header_width -= menu->get_width(); - if (buttons_visible_cache) + } + if (buttons_visible_cache) { header_width -= increment->get_width() + decrement->get_width(); - if (popup || buttons_visible_cache) + } + if (popup || buttons_visible_cache) { header_width += side_margin; + } // Find the width of all tabs after first_tab_cache. int all_tabs_width = 0; @@ -249,15 +244,15 @@ void TabContainer::_notification(int p_what) { for (int i = first_tab_cache - 1; i >= 0; i--) { int tab_width = _get_tab_width(i); - if (all_tabs_width + tab_width > header_width) + if (all_tabs_width + tab_width > header_width) { break; + } all_tabs_width += tab_width; first_tab_cache--; } } break; case NOTIFICATION_DRAW: { - RID canvas = get_canvas_item(); Size2 size = get_size(); @@ -289,8 +284,9 @@ void TabContainer::_notification(int p_what) { int header_x = side_margin; int header_width = size.width - side_margin * 2; int header_height = _get_top_margin(); - if (popup) + if (popup) { header_width -= menu->get_width(); + } // Check if all tabs would fit into the header area. int all_tabs_width = 0; @@ -327,8 +323,9 @@ void TabContainer::_notification(int p_what) { continue; } int tab_width = _get_tab_width(i); - if (all_tabs_width + tab_width > header_width && tab_widths.size() > 0) + if (all_tabs_width + tab_width > header_width && tab_widths.size() > 0) { break; + } all_tabs_width += tab_width; tab_widths.push_back(tab_width); } @@ -387,8 +384,9 @@ void TabContainer::_notification(int p_what) { if (icon.is_valid()) { int y = y_center - (icon->get_height() / 2); icon->draw(canvas, Point2i(x_content, y)); - if (text != "") + if (text != "") { x_content += icon->get_width() + icon_text_distance; + } } } @@ -404,15 +402,15 @@ void TabContainer::_notification(int p_what) { x = get_size().width; if (popup) { x -= menu->get_width(); - if (menu_hovered) + if (menu_hovered) { menu_hl->draw(get_canvas_item(), Size2(x, (header_height - menu_hl->get_height()) / 2)); - else + } else { menu->draw(get_canvas_item(), Size2(x, (header_height - menu->get_height()) / 2)); + } } // Draw the navigation buttons. if (buttons_visible_cache) { - x -= increment->get_width(); if (last_tab_cache < tabs.size() - 1) { draw_texture(highlight_arrow == 1 ? increment_hl : increment, Point2(x, (header_height - increment->get_height()) / 2)); @@ -429,7 +427,6 @@ void TabContainer::_notification(int p_what) { } } break; case NOTIFICATION_THEME_CHANGED: { - minimum_size_changed(); call_deferred("_on_theme_changed"); // Wait until all changed theme. } break; @@ -451,11 +448,11 @@ void TabContainer::_on_mouse_exited() { } int TabContainer::_get_tab_width(int p_index) const { - ERR_FAIL_INDEX_V(p_index, get_tab_count(), 0); Control *control = Object::cast_to<Control>(_get_tabs()[p_index]); - if (!control || control->is_set_as_toplevel() || get_tab_hidden(p_index)) + if (!control || control->is_set_as_toplevel() || get_tab_hidden(p_index)) { return 0; + } // Get the width of the text displayed on the tab. Ref<Font> font = get_theme_font("font"); @@ -467,8 +464,9 @@ int TabContainer::_get_tab_width(int p_index) const { Ref<Texture2D> icon = control->get_meta("_tab_icon"); if (icon.is_valid()) { width += icon->get_width(); - if (text != "") + if (text != "") { width += get_theme_constant("hseparation"); + } } } @@ -488,13 +486,12 @@ int TabContainer::_get_tab_width(int p_index) const { } Vector<Control *> TabContainer::_get_tabs() const { - Vector<Control *> controls; for (int i = 0; i < get_child_count(); i++) { - Control *control = Object::cast_to<Control>(get_child(i)); - if (!control || control->is_toplevel_control()) + if (!control || control->is_toplevel_control()) { continue; + } controls.push_back(control); } @@ -502,25 +499,25 @@ Vector<Control *> TabContainer::_get_tabs() const { } void TabContainer::_child_renamed_callback() { - update(); } void TabContainer::add_child_notify(Node *p_child) { - Container::add_child_notify(p_child); Control *c = Object::cast_to<Control>(p_child); - if (!c) + if (!c) { return; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { return; + } bool first = false; - if (get_tab_count() != 1) + if (get_tab_count() != 1) { c->hide(); - else { + } else { c->show(); //call_deferred("set_current_tab",0); first = true; @@ -528,8 +525,9 @@ void TabContainer::add_child_notify(Node *p_child) { previous = 0; } c->set_anchors_and_margins_preset(Control::PRESET_WIDE); - if (tabs_visible) + if (tabs_visible) { c->set_margin(MARGIN_TOP, _get_top_margin()); + } Ref<StyleBox> sb = get_theme_stylebox("panel"); c->set_margin(Margin(MARGIN_TOP), c->get_margin(Margin(MARGIN_TOP)) + sb->get_margin(Margin(MARGIN_TOP))); c->set_margin(Margin(MARGIN_LEFT), c->get_margin(Margin(MARGIN_LEFT)) + sb->get_margin(Margin(MARGIN_LEFT))); @@ -538,17 +536,16 @@ void TabContainer::add_child_notify(Node *p_child) { update(); p_child->connect("renamed", callable_mp(this, &TabContainer::_child_renamed_callback)); - if (first && is_inside_tree()) + if (first && is_inside_tree()) { emit_signal("tab_changed", current); + } } int TabContainer::get_tab_count() const { - return _get_tabs().size(); } void TabContainer::set_current_tab(int p_current) { - ERR_FAIL_INDEX(p_current, get_tab_count()); int pending_previous = current; @@ -557,27 +554,28 @@ void TabContainer::set_current_tab(int p_current) { Ref<StyleBox> sb = get_theme_stylebox("panel"); Vector<Control *> tabs = _get_tabs(); for (int i = 0; i < tabs.size(); i++) { - Control *c = tabs[i]; if (i == current) { c->show(); c->set_anchors_and_margins_preset(Control::PRESET_WIDE); - if (tabs_visible) + if (tabs_visible) { c->set_margin(MARGIN_TOP, _get_top_margin()); + } c->set_margin(Margin(MARGIN_TOP), c->get_margin(Margin(MARGIN_TOP)) + sb->get_margin(Margin(MARGIN_TOP))); c->set_margin(Margin(MARGIN_LEFT), c->get_margin(Margin(MARGIN_LEFT)) + sb->get_margin(Margin(MARGIN_LEFT))); c->set_margin(Margin(MARGIN_RIGHT), c->get_margin(Margin(MARGIN_RIGHT)) - sb->get_margin(Margin(MARGIN_RIGHT))); c->set_margin(Margin(MARGIN_BOTTOM), c->get_margin(Margin(MARGIN_BOTTOM)) - sb->get_margin(Margin(MARGIN_BOTTOM))); - } else + } else { c->hide(); + } } _change_notify("current_tab"); - if (pending_previous == current) + if (pending_previous == current) { emit_signal("tab_selected", current); - else { + } else { previous = pending_previous; emit_signal("tab_selected", current); emit_signal("tab_changed", current); @@ -587,35 +585,32 @@ void TabContainer::set_current_tab(int p_current) { } int TabContainer::get_current_tab() const { - return current; } int TabContainer::get_previous_tab() const { - return previous; } Control *TabContainer::get_tab_control(int p_idx) const { - Vector<Control *> tabs = _get_tabs(); - if (p_idx >= 0 && p_idx < tabs.size()) + if (p_idx >= 0 && p_idx < tabs.size()) { return tabs[p_idx]; - else + } else { return nullptr; + } } Control *TabContainer::get_current_tab_control() const { - Vector<Control *> tabs = _get_tabs(); - if (current >= 0 && current < tabs.size()) + if (current >= 0 && current < tabs.size()) { return tabs[current]; - else + } else { return nullptr; + } } void TabContainer::remove_child_notify(Node *p_child) { - Container::remove_child_notify(p_child); call_deferred("_update_current_tab"); @@ -626,25 +621,27 @@ void TabContainer::remove_child_notify(Node *p_child) { } void TabContainer::_update_current_tab() { - int tc = get_tab_count(); - if (current >= tc) + if (current >= tc) { current = tc - 1; - if (current < 0) + } + if (current < 0) { current = 0; - else + } else { set_current_tab(current); + } } Variant TabContainer::get_drag_data(const Point2 &p_point) { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return Variant(); + } int tab_over = get_tab_idx_at_point(p_point); - if (tab_over < 0) + if (tab_over < 0) { return Variant(); + } HBoxContainer *drag_preview = memnew(HBoxContainer); @@ -666,16 +663,16 @@ Variant TabContainer::get_drag_data(const Point2 &p_point) { } bool TabContainer::can_drop_data(const Point2 &p_point, const Variant &p_data) const { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return false; + } Dictionary d = p_data; - if (!d.has("type")) + if (!d.has("type")) { return false; + } if (String(d["type"]) == "tabc_element") { - NodePath from_path = d["from_path"]; NodePath to_path = get_path(); if (from_path == to_path) { @@ -693,24 +690,25 @@ bool TabContainer::can_drop_data(const Point2 &p_point, const Variant &p_data) c } void TabContainer::drop_data(const Point2 &p_point, const Variant &p_data) { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return; + } int hover_now = get_tab_idx_at_point(p_point); Dictionary d = p_data; - if (!d.has("type")) + if (!d.has("type")) { return; + } if (String(d["type"]) == "tabc_element") { - int tab_from_id = d["tabc_element"]; NodePath from_path = d["from_path"]; NodePath to_path = get_path(); if (from_path == to_path) { - if (hover_now < 0) + if (hover_now < 0) { hover_now = get_tab_count() - 1; + } move_child(get_tab_control(tab_from_id), hover_now); set_current_tab(hover_now); } else if (get_tabs_rearrange_group() != -1) { @@ -721,8 +719,9 @@ void TabContainer::drop_data(const Point2 &p_point, const Variant &p_data) { Control *moving_tabc = from_tabc->get_tab_control(tab_from_id); from_tabc->remove_child(moving_tabc); add_child(moving_tabc); - if (hover_now < 0) + if (hover_now < 0) { hover_now = get_tab_count() - 1; + } move_child(moving_tabc, hover_now); set_current_tab(hover_now); emit_signal("tab_changed", hover_now); @@ -733,13 +732,14 @@ void TabContainer::drop_data(const Point2 &p_point, const Variant &p_data) { } int TabContainer::get_tab_idx_at_point(const Point2 &p_point) const { - - if (get_tab_count() == 0) + if (get_tab_count() == 0) { return -1; + } // must be on tabs in the tab header area. - if (p_point.x < tabs_ofs_cache || p_point.y > _get_top_margin()) + if (p_point.x < tabs_ofs_cache || p_point.y > _get_top_margin()) { return -1; + } Size2 size = get_size(); int right_ofs = 0; @@ -772,7 +772,6 @@ int TabContainer::get_tab_idx_at_point(const Point2 &p_point) const { } void TabContainer::set_tab_align(TabAlign p_align) { - ERR_FAIL_INDEX(p_align, 3); align = p_align; update(); @@ -781,25 +780,24 @@ void TabContainer::set_tab_align(TabAlign p_align) { } TabContainer::TabAlign TabContainer::get_tab_align() const { - return align; } void TabContainer::set_tabs_visible(bool p_visible) { - - if (p_visible == tabs_visible) + if (p_visible == tabs_visible) { return; + } tabs_visible = p_visible; Vector<Control *> tabs = _get_tabs(); for (int i = 0; i < tabs.size(); i++) { - Control *c = tabs[i]; - if (p_visible) + if (p_visible) { c->set_margin(MARGIN_TOP, _get_top_margin()); - else + } else { c->set_margin(MARGIN_TOP, 0); + } } update(); @@ -807,17 +805,14 @@ void TabContainer::set_tabs_visible(bool p_visible) { } bool TabContainer::are_tabs_visible() const { - return tabs_visible; } Control *TabContainer::_get_tab(int p_idx) const { - return get_tab_control(p_idx); } void TabContainer::set_tab_title(int p_tab, const String &p_title) { - Control *child = _get_tab(p_tab); ERR_FAIL_COND(!child); child->set_meta("_tab_name", p_title); @@ -825,34 +820,33 @@ void TabContainer::set_tab_title(int p_tab, const String &p_title) { } String TabContainer::get_tab_title(int p_tab) const { - Control *child = _get_tab(p_tab); ERR_FAIL_COND_V(!child, ""); - if (child->has_meta("_tab_name")) + if (child->has_meta("_tab_name")) { return child->get_meta("_tab_name"); - else + } else { return child->get_name(); + } } void TabContainer::set_tab_icon(int p_tab, const Ref<Texture2D> &p_icon) { - Control *child = _get_tab(p_tab); ERR_FAIL_COND(!child); child->set_meta("_tab_icon", p_icon); update(); } -Ref<Texture2D> TabContainer::get_tab_icon(int p_tab) const { +Ref<Texture2D> TabContainer::get_tab_icon(int p_tab) const { Control *child = _get_tab(p_tab); ERR_FAIL_COND_V(!child, Ref<Texture2D>()); - if (child->has_meta("_tab_icon")) + if (child->has_meta("_tab_icon")) { return child->get_meta("_tab_icon"); - else + } else { return Ref<Texture2D>(); + } } void TabContainer::set_tab_disabled(int p_tab, bool p_disabled) { - Control *child = _get_tab(p_tab); ERR_FAIL_COND(!child); child->set_meta("_tab_disabled", p_disabled); @@ -860,17 +854,16 @@ void TabContainer::set_tab_disabled(int p_tab, bool p_disabled) { } bool TabContainer::get_tab_disabled(int p_tab) const { - Control *child = _get_tab(p_tab); ERR_FAIL_COND_V(!child, false); - if (child->has_meta("_tab_disabled")) + if (child->has_meta("_tab_disabled")) { return child->get_meta("_tab_disabled"); - else + } else { return false; + } } void TabContainer::set_tab_hidden(int p_tab, bool p_hidden) { - Control *child = _get_tab(p_tab); ERR_FAIL_COND(!child); child->set_meta("_tab_hidden", p_hidden); @@ -890,43 +883,42 @@ void TabContainer::set_tab_hidden(int p_tab, bool p_hidden) { } bool TabContainer::get_tab_hidden(int p_tab) const { - Control *child = _get_tab(p_tab); ERR_FAIL_COND_V(!child, false); - if (child->has_meta("_tab_hidden")) + if (child->has_meta("_tab_hidden")) { return child->get_meta("_tab_hidden"); - else + } else { return false; + } } void TabContainer::get_translatable_strings(List<String> *p_strings) const { - Vector<Control *> tabs = _get_tabs(); for (int i = 0; i < tabs.size(); i++) { - Control *c = tabs[i]; - if (!c->has_meta("_tab_name")) + if (!c->has_meta("_tab_name")) { continue; + } String name = c->get_meta("_tab_name"); - if (name != "") + if (name != "") { p_strings->push_back(name); + } } } Size2 TabContainer::get_minimum_size() const { - Size2 ms; Vector<Control *> tabs = _get_tabs(); for (int i = 0; i < tabs.size(); i++) { - Control *c = tabs[i]; - if (!c->is_visible_in_tree() && !use_hidden_tabs_for_min_size) + if (!c->is_visible_in_tree() && !use_hidden_tabs_for_min_size) { continue; + } Size2 cms = c->get_combined_minimum_size(); ms.x = MAX(ms.x, cms.x); @@ -966,6 +958,7 @@ void TabContainer::set_drag_to_rearrange_enabled(bool p_enabled) { bool TabContainer::get_drag_to_rearrange_enabled() const { return drag_to_rearrange_enabled; } + void TabContainer::set_tabs_rearrange_group(int p_group_id) { tabs_rearrange_group = p_group_id; } @@ -983,7 +976,6 @@ bool TabContainer::get_use_hidden_tabs_for_min_size() const { } void TabContainer::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &TabContainer::_gui_input); ClassDB::bind_method(D_METHOD("get_tab_count"), &TabContainer::get_tab_count); ClassDB::bind_method(D_METHOD("set_current_tab", "tab_idx"), &TabContainer::set_current_tab); @@ -1030,7 +1022,6 @@ void TabContainer::_bind_methods() { } TabContainer::TabContainer() { - first_tab_cache = 0; last_tab_cache = 0; buttons_visible_cache = false; diff --git a/scene/gui/tab_container.h b/scene/gui/tab_container.h index 38c029475c..e8cde74c83 100644 --- a/scene/gui/tab_container.h +++ b/scene/gui/tab_container.h @@ -34,7 +34,6 @@ #include "scene/gui/container.h" #include "scene/gui/popup.h" class TabContainer : public Container { - GDCLASS(TabContainer, Container); public: diff --git a/scene/gui/tabs.cpp b/scene/gui/tabs.cpp index b856d3ab3a..8f71aa7cab 100644 --- a/scene/gui/tabs.cpp +++ b/scene/gui/tabs.cpp @@ -36,7 +36,6 @@ #include "scene/gui/texture_rect.h" Size2 Tabs::get_minimum_size() const { - Ref<StyleBox> tab_bg = get_theme_stylebox("tab_bg"); Ref<StyleBox> tab_fg = get_theme_stylebox("tab_fg"); Ref<StyleBox> tab_disabled = get_theme_stylebox("tab_disabled"); @@ -45,22 +44,23 @@ Size2 Tabs::get_minimum_size() const { Size2 ms(0, MAX(MAX(tab_bg->get_minimum_size().height, tab_fg->get_minimum_size().height), tab_disabled->get_minimum_size().height) + font->get_height()); for (int i = 0; i < tabs.size(); i++) { - Ref<Texture2D> tex = tabs[i].icon; if (tex.is_valid()) { ms.height = MAX(ms.height, tex->get_size().height); - if (tabs[i].text != "") + if (tabs[i].text != "") { ms.width += get_theme_constant("hseparation"); + } } ms.width += Math::ceil(font->get_string_size(tabs[i].xl_text).width); - if (tabs[i].disabled) + if (tabs[i].disabled) { ms.width += tab_disabled->get_minimum_size().width; - else if (current == i) + } else if (current == i) { ms.width += tab_fg->get_minimum_size().width; - else + } else { ms.width += tab_bg->get_minimum_size().width; + } if (tabs[i].right_button.is_valid()) { Ref<Texture2D> rb = tabs[i].right_button; @@ -84,16 +84,13 @@ Size2 Tabs::get_minimum_size() const { } void Tabs::_gui_input(const Ref<InputEvent> &p_event) { - Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - Point2 pos = mm->get_position(); highlight_arrow = -1; if (buttons_visible) { - Ref<Texture2D> incr = get_theme_icon("increment"); Ref<Texture2D> decr = get_theme_icon("decrement"); @@ -114,9 +111,7 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - if (mb->is_pressed() && mb->get_button_index() == BUTTON_WHEEL_UP && !mb->get_command()) { - if (scrolling_enabled && buttons_visible) { if (offset > 0) { offset--; @@ -135,7 +130,6 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } if (rb_pressing && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - if (rb_hover != -1) { //pressed emit_signal("right_button_pressed", rb_hover); @@ -146,7 +140,6 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } if (cb_pressing && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - if (cb_hover != -1) { //pressed emit_signal("tab_close", cb_hover); @@ -157,12 +150,10 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } if (mb->is_pressed() && (mb->get_button_index() == BUTTON_LEFT || (select_with_rmb && mb->get_button_index() == BUTTON_RIGHT))) { - // clicks Point2 pos(mb->get_position().x, mb->get_position().y); if (buttons_visible) { - Ref<Texture2D> incr = get_theme_icon("increment"); Ref<Texture2D> decr = get_theme_icon("decrement"); @@ -185,7 +176,6 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { int found = -1; for (int i = offset; i < tabs.size(); i++) { - if (tabs[i].rb_rect.has_point(pos)) { rb_pressing = true; update(); @@ -207,7 +197,6 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } if (found != -1) { - set_current_tab(found); emit_signal("tab_clicked", found); } @@ -216,9 +205,7 @@ void Tabs::_gui_input(const Ref<InputEvent> &p_event) { } void Tabs::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_TRANSLATION_CHANGED: { for (int i = 0; i < tabs.size(); ++i) { tabs.write[i].xl_text = tr(tabs[i].text); @@ -249,7 +236,6 @@ void Tabs::_notification(int p_what) { int mw = 0; for (int i = 0; i < tabs.size(); i++) { - tabs.write[i].ofs_cache = mw; mw += get_tab_width(i); } @@ -274,7 +260,6 @@ void Tabs::_notification(int p_what) { missing_right = false; for (int i = offset; i < tabs.size(); i++) { - tabs.write[i].ofs_cache = w; int lsize = tabs[i].size_cache; @@ -309,10 +294,10 @@ void Tabs::_notification(int p_what) { Size2i sb_ms = sb->get_minimum_size(); Ref<Texture2D> icon = tabs[i].icon; if (icon.is_valid()) { - icon->draw(ci, Point2i(w, sb->get_margin(MARGIN_TOP) + ((sb_rect.size.y - sb_ms.y) - icon->get_height()) / 2)); - if (tabs[i].text != "") + if (tabs[i].text != "") { w += icon->get_width() + get_theme_constant("hseparation"); + } } font->draw(ci, Point2i(w, sb->get_margin(MARGIN_TOP) + ((sb_rect.size.y - sb_ms.y) - font->get_height()) / 2 + font->get_ascent()), tabs[i].xl_text, col, tabs[i].size_text); @@ -320,7 +305,6 @@ void Tabs::_notification(int p_what) { w += tabs[i].size_text; if (tabs[i].right_button.is_valid()) { - Ref<StyleBox> style = get_theme_stylebox("button"); Ref<Texture2D> rb = tabs[i].right_button; @@ -332,10 +316,11 @@ void Tabs::_notification(int p_what) { rb_rect.position.y = sb->get_margin(MARGIN_TOP) + ((sb_rect.size.y - sb_ms.y) - (rb_rect.size.y)) / 2; if (rb_hover == i) { - if (rb_pressing) + if (rb_pressing) { get_theme_stylebox("button_pressed")->draw(ci, rb_rect); - else + } else { style->draw(ci, rb_rect); + } } rb->draw(ci, Point2i(w + style->get_margin(MARGIN_LEFT), rb_rect.position.y + style->get_margin(MARGIN_TOP))); @@ -344,7 +329,6 @@ void Tabs::_notification(int p_what) { } if (cb_displaypolicy == CLOSE_BUTTON_SHOW_ALWAYS || (cb_displaypolicy == CLOSE_BUTTON_SHOW_ACTIVE_ONLY && i == current)) { - Ref<StyleBox> style = get_theme_stylebox("button"); Ref<Texture2D> cb = close; @@ -356,10 +340,11 @@ void Tabs::_notification(int p_what) { cb_rect.position.y = sb->get_margin(MARGIN_TOP) + ((sb_rect.size.y - sb_ms.y) - (cb_rect.size.y)) / 2; if (!tabs[i].disabled && cb_hover == i) { - if (cb_pressing) + if (cb_pressing) { get_theme_stylebox("button_pressed")->draw(ci, cb_rect); - else + } else { style->draw(ci, cb_rect); + } } cb->draw(ci, Point2i(w + style->get_margin(MARGIN_LEFT), cb_rect.position.y + style->get_margin(MARGIN_TOP))); @@ -371,18 +356,19 @@ void Tabs::_notification(int p_what) { } if (offset > 0 || missing_right) { - int vofs = (get_size().height - incr->get_size().height) / 2; - if (offset > 0) + if (offset > 0) { draw_texture(highlight_arrow == 0 ? decr_hl : decr, Point2(limit, vofs)); - else + } else { draw_texture(decr, Point2(limit, vofs), Color(1, 1, 1, 0.5)); + } - if (missing_right) + if (missing_right) { draw_texture(highlight_arrow == 1 ? incr_hl : incr, Point2(limit + decr->get_size().width, vofs)); - else + } else { draw_texture(incr, Point2(limit + decr->get_size().width, vofs), Color(1, 1, 1, 0.5)); + } buttons_visible = true; } else { @@ -393,14 +379,13 @@ void Tabs::_notification(int p_what) { } int Tabs::get_tab_count() const { - return tabs.size(); } void Tabs::set_current_tab(int p_current) { - - if (current == p_current) + if (current == p_current) { return; + } ERR_FAIL_INDEX(p_current, get_tab_count()); current = p_current; @@ -413,7 +398,6 @@ void Tabs::set_current_tab(int p_current) { } int Tabs::get_current_tab() const { - return current; } @@ -430,7 +414,6 @@ bool Tabs::get_offset_buttons_visible() const { } void Tabs::set_tab_title(int p_tab, const String &p_title) { - ERR_FAIL_INDEX(p_tab, tabs.size()); tabs.write[p_tab].text = p_title; tabs.write[p_tab].xl_text = tr(p_title); @@ -439,13 +422,11 @@ void Tabs::set_tab_title(int p_tab, const String &p_title) { } String Tabs::get_tab_title(int p_tab) const { - ERR_FAIL_INDEX_V(p_tab, tabs.size(), ""); return tabs[p_tab].text; } void Tabs::set_tab_icon(int p_tab, const Ref<Texture2D> &p_icon) { - ERR_FAIL_INDEX(p_tab, tabs.size()); tabs.write[p_tab].icon = p_icon; update(); @@ -453,39 +434,35 @@ void Tabs::set_tab_icon(int p_tab, const Ref<Texture2D> &p_icon) { } Ref<Texture2D> Tabs::get_tab_icon(int p_tab) const { - ERR_FAIL_INDEX_V(p_tab, tabs.size(), Ref<Texture2D>()); return tabs[p_tab].icon; } void Tabs::set_tab_disabled(int p_tab, bool p_disabled) { - ERR_FAIL_INDEX(p_tab, tabs.size()); tabs.write[p_tab].disabled = p_disabled; update(); } -bool Tabs::get_tab_disabled(int p_tab) const { +bool Tabs::get_tab_disabled(int p_tab) const { ERR_FAIL_INDEX_V(p_tab, tabs.size(), false); return tabs[p_tab].disabled; } void Tabs::set_tab_right_button(int p_tab, const Ref<Texture2D> &p_right_button) { - ERR_FAIL_INDEX(p_tab, tabs.size()); tabs.write[p_tab].right_button = p_right_button; _update_cache(); update(); minimum_size_changed(); } -Ref<Texture2D> Tabs::get_tab_right_button(int p_tab) const { +Ref<Texture2D> Tabs::get_tab_right_button(int p_tab) const { ERR_FAIL_INDEX_V(p_tab, tabs.size(), Ref<Texture2D>()); return tabs[p_tab].right_button; } void Tabs::_update_hover() { - if (!is_inside_tree()) { return; } @@ -495,7 +472,6 @@ void Tabs::_update_hover() { int hover_now = -1; int hover_buttons = -1; for (int i = offset; i < tabs.size(); i++) { - Rect2 rect = get_tab_rect(i); if (rect.has_point(pos)) { hover_now = i; @@ -552,7 +528,6 @@ void Tabs::_update_cache() { m_width = MAX((limit - size_fixed) / count_resize, min_width); } for (int i = offset; i < tabs.size(); i++) { - Ref<StyleBox> sb; if (tabs[i].disabled) { sb = tab_disabled; @@ -587,7 +562,6 @@ void Tabs::_update_cache() { } void Tabs::_on_mouse_exited() { - rb_hover = -1; cb_hover = -1; hover = -1; @@ -596,7 +570,6 @@ void Tabs::_on_mouse_exited() { } void Tabs::add_tab(const String &p_str, const Ref<Texture2D> &p_icon) { - Tab t; t.text = p_str; t.xl_text = tr(p_str); @@ -620,33 +593,36 @@ void Tabs::clear_tabs() { } void Tabs::remove_tab(int p_idx) { - ERR_FAIL_INDEX(p_idx, tabs.size()); tabs.remove(p_idx); - if (current >= p_idx) + if (current >= p_idx) { current--; + } _update_cache(); call_deferred("_update_hover"); update(); minimum_size_changed(); - if (current < 0) + if (current < 0) { current = 0; - if (current >= tabs.size()) + } + if (current >= tabs.size()) { current = tabs.size() - 1; + } _ensure_no_over_offset(); } Variant Tabs::get_drag_data(const Point2 &p_point) { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return Variant(); + } int tab_over = get_tab_idx_at_point(p_point); - if (tab_over < 0) + if (tab_over < 0) { return Variant(); + } HBoxContainer *drag_preview = memnew(HBoxContainer); @@ -672,16 +648,16 @@ Variant Tabs::get_drag_data(const Point2 &p_point) { } bool Tabs::can_drop_data(const Point2 &p_point, const Variant &p_data) const { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return false; + } Dictionary d = p_data; - if (!d.has("type")) + if (!d.has("type")) { return false; + } if (String(d["type"]) == "tab_element") { - NodePath from_path = d["from_path"]; NodePath to_path = get_path(); if (from_path == to_path) { @@ -699,24 +675,25 @@ bool Tabs::can_drop_data(const Point2 &p_point, const Variant &p_data) const { } void Tabs::drop_data(const Point2 &p_point, const Variant &p_data) { - - if (!drag_to_rearrange_enabled) + if (!drag_to_rearrange_enabled) { return; + } int hover_now = get_tab_idx_at_point(p_point); Dictionary d = p_data; - if (!d.has("type")) + if (!d.has("type")) { return; + } if (String(d["type"]) == "tab_element") { - int tab_from_id = d["tab_element"]; NodePath from_path = d["from_path"]; NodePath to_path = get_path(); if (from_path == to_path) { - if (hover_now < 0) + if (hover_now < 0) { hover_now = get_tab_count() - 1; + } move_tab(tab_from_id, hover_now); emit_signal("reposition_active_tab_request", hover_now); set_current_tab(hover_now); @@ -725,11 +702,13 @@ void Tabs::drop_data(const Point2 &p_point, const Variant &p_data) { Node *from_node = get_node(from_path); Tabs *from_tabs = Object::cast_to<Tabs>(from_node); if (from_tabs && from_tabs->get_tabs_rearrange_group() == get_tabs_rearrange_group()) { - if (tab_from_id >= from_tabs->get_tab_count()) + if (tab_from_id >= from_tabs->get_tab_count()) { return; + } Tab moving_tab = from_tabs->tabs[tab_from_id]; - if (hover_now < 0) + if (hover_now < 0) { hover_now = get_tab_count(); + } tabs.insert(hover_now, moving_tab); from_tabs->remove_tab(tab_from_id); set_current_tab(hover_now); @@ -742,10 +721,8 @@ void Tabs::drop_data(const Point2 &p_point, const Variant &p_data) { } int Tabs::get_tab_idx_at_point(const Point2 &p_point) const { - int hover_now = -1; for (int i = offset; i < tabs.size(); i++) { - Rect2 rect = get_tab_rect(i); if (rect.has_point(p_point)) { hover_now = i; @@ -756,21 +733,19 @@ int Tabs::get_tab_idx_at_point(const Point2 &p_point) const { } void Tabs::set_tab_align(TabAlign p_align) { - ERR_FAIL_INDEX(p_align, ALIGN_MAX); tab_align = p_align; update(); } Tabs::TabAlign Tabs::get_tab_align() const { - return tab_align; } void Tabs::move_tab(int from, int to) { - - if (from == to) + if (from == to) { return; + } ERR_FAIL_INDEX(from, tabs.size()); ERR_FAIL_INDEX(to, tabs.size()); @@ -784,7 +759,6 @@ void Tabs::move_tab(int from, int to) { } int Tabs::get_tab_width(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, tabs.size(), 0); Ref<StyleBox> tab_bg = get_theme_stylebox("tab_bg"); @@ -797,18 +771,20 @@ int Tabs::get_tab_width(int p_idx) const { Ref<Texture2D> tex = tabs[p_idx].icon; if (tex.is_valid()) { x += tex->get_width(); - if (tabs[p_idx].text != "") + if (tabs[p_idx].text != "") { x += get_theme_constant("hseparation"); + } } x += Math::ceil(font->get_string_size(tabs[p_idx].xl_text).width); - if (tabs[p_idx].disabled) + if (tabs[p_idx].disabled) { x += tab_disabled->get_minimum_size().width; - else if (current == p_idx) + } else if (current == p_idx) { x += tab_fg->get_minimum_size().width; - else + } else { x += tab_bg->get_minimum_size().width; + } if (tabs[p_idx].right_button.is_valid()) { Ref<Texture2D> rb = tabs[p_idx].right_button; @@ -826,9 +802,9 @@ int Tabs::get_tab_width(int p_idx) const { } void Tabs::_ensure_no_over_offset() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } Ref<Texture2D> incr = get_theme_icon("increment"); Ref<Texture2D> decr = get_theme_icon("decrement"); @@ -836,10 +812,8 @@ void Tabs::_ensure_no_over_offset() { int limit = get_size().width - incr->get_width() - decr->get_width(); while (offset > 0) { - int total_w = 0; for (int i = offset - 1; i < tabs.size(); i++) { - total_w += tabs[i].size_cache; } @@ -853,12 +827,13 @@ void Tabs::_ensure_no_over_offset() { } void Tabs::ensure_tab_visible(int p_idx) { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (tabs.size() == 0) + if (tabs.size() == 0) { return; + } ERR_FAIL_INDEX(p_idx, tabs.size()); if (p_idx == offset) { @@ -886,20 +861,17 @@ void Tabs::ensure_tab_visible(int p_idx) { } Rect2 Tabs::get_tab_rect(int p_tab) const { - ERR_FAIL_INDEX_V(p_tab, tabs.size(), Rect2()); return Rect2(tabs[p_tab].ofs_cache, 0, tabs[p_tab].size_cache, get_size().height); } void Tabs::set_tab_close_display_policy(CloseButtonDisplayPolicy p_policy) { - ERR_FAIL_INDEX(p_policy, CLOSE_BUTTON_MAX); cb_displaypolicy = p_policy; update(); } Tabs::CloseButtonDisplayPolicy Tabs::get_tab_close_display_policy() const { - return cb_displaypolicy; } @@ -922,6 +894,7 @@ void Tabs::set_drag_to_rearrange_enabled(bool p_enabled) { bool Tabs::get_drag_to_rearrange_enabled() const { return drag_to_rearrange_enabled; } + void Tabs::set_tabs_rearrange_group(int p_group_id) { tabs_rearrange_group = p_group_id; } @@ -939,7 +912,6 @@ bool Tabs::get_select_with_rmb() const { } void Tabs::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &Tabs::_gui_input); ClassDB::bind_method(D_METHOD("_update_hover"), &Tabs::_update_hover); ClassDB::bind_method(D_METHOD("get_tab_count"), &Tabs::get_tab_count); @@ -997,7 +969,6 @@ void Tabs::_bind_methods() { } Tabs::Tabs() { - current = 0; tab_align = ALIGN_CENTER; rb_hover = -1; diff --git a/scene/gui/tabs.h b/scene/gui/tabs.h index 3170acb46f..8757f70ebe 100644 --- a/scene/gui/tabs.h +++ b/scene/gui/tabs.h @@ -34,7 +34,6 @@ #include "scene/gui/control.h" class Tabs : public Control { - GDCLASS(Tabs, Control); public: @@ -56,7 +55,6 @@ public: private: struct Tab { - String text; String xl_text; Ref<Texture2D> icon; diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index e986e350f3..52aee8f089 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -45,12 +45,10 @@ #define TAB_PIXELS inline bool _is_symbol(CharType c) { - return is_symbol(c); } static bool _is_text_char(CharType c) { - return !is_symbol(c); } @@ -59,7 +57,6 @@ static bool _is_whitespace(CharType c) { } static bool _is_char(CharType c) { - return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; } @@ -92,38 +89,41 @@ static bool _is_pair_symbol(CharType c) { } static CharType _get_right_pair_symbol(CharType c) { - if (c == '"') + if (c == '"') { return '"'; - if (c == '\'') + } + if (c == '\'') { return '\''; - if (c == '(') + } + if (c == '(') { return ')'; - if (c == '[') + } + if (c == '[') { return ']'; - if (c == '{') + } + if (c == '{') { return '}'; + } return 0; } static int _find_first_non_whitespace_column_of_line(const String &line) { int left = 0; - while (left < line.length() && _is_whitespace(line[left])) + while (left < line.length() && _is_whitespace(line[left])) { left++; + } return left; } void TextEdit::Text::set_font(const Ref<Font> &p_font) { - font = p_font; } void TextEdit::Text::set_indent_size(int p_indent_size) { - indent_size = p_indent_size; } void TextEdit::Text::_update_line_cache(int p_line) const { - int w = 0; int len = text[p_line].data.length(); @@ -144,9 +144,9 @@ void TextEdit::Text::_update_line_cache(int p_line) const { text.write[p_line].region_info.clear(); for (int i = 0; i < len; i++) { - - if (!_is_symbol(str[i])) + if (!_is_symbol(str[i])) { continue; + } if (str[i] == '\\') { i++; // Skip quoted anything. continue; @@ -155,7 +155,6 @@ void TextEdit::Text::_update_line_cache(int p_line) const { int left = len - i; for (int j = 0; j < color_regions->size(); j++) { - const ColorRegion &cr = color_regions->operator[](j); /* BEGIN */ @@ -177,7 +176,6 @@ void TextEdit::Text::_update_line_cache(int p_line) const { } if (match) { - ColorRegionInfo cri; cri.end = false; cri.region = j; @@ -204,7 +202,6 @@ void TextEdit::Text::_update_line_cache(int p_line) const { } if (match) { - ColorRegionInfo cri; cri.end = true; cri.region = j; @@ -219,7 +216,6 @@ void TextEdit::Text::_update_line_cache(int p_line) const { } const Map<int, TextEdit::Text::ColorRegionInfo> &TextEdit::Text::get_color_region_info(int p_line) const { - static Map<int, ColorRegionInfo> cri; ERR_FAIL_INDEX_V(p_line, text.size(), cri); @@ -231,7 +227,6 @@ const Map<int, TextEdit::Text::ColorRegionInfo> &TextEdit::Text::get_color_regio } int TextEdit::Text::get_line_width(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), -1); if (text[p_line].width_cache == -1) { @@ -242,28 +237,24 @@ int TextEdit::Text::get_line_width(int p_line) const { } void TextEdit::Text::set_line_wrap_amount(int p_line, int p_wrap_amount) const { - ERR_FAIL_INDEX(p_line, text.size()); text.write[p_line].wrap_amount_cache = p_wrap_amount; } int TextEdit::Text::get_line_wrap_amount(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), -1); return text[p_line].wrap_amount_cache; } void TextEdit::Text::clear_width_cache() { - for (int i = 0; i < text.size(); i++) { text.write[i].width_cache = -1; } } void TextEdit::Text::clear_wrap_cache() { - for (int i = 0; i < text.size(); i++) { text.write[i].wrap_amount_cache = -1; } @@ -276,7 +267,6 @@ void TextEdit::Text::clear_info_icons() { } void TextEdit::Text::clear() { - text.clear(); insert(0, ""); } @@ -286,14 +276,14 @@ int TextEdit::Text::get_max_width(bool p_exclude_hidden) const { int max = 0; for (int i = 0; i < text.size(); i++) { - if (!p_exclude_hidden || !is_hidden(i)) + if (!p_exclude_hidden || !is_hidden(i)) { max = MAX(max, get_line_width(i)); + } } return max; } void TextEdit::Text::set(int p_line, const String &p_text) { - ERR_FAIL_INDEX(p_line, text.size()); text.write[p_line].width_cache = -1; @@ -302,7 +292,6 @@ void TextEdit::Text::set(int p_line, const String &p_text) { } void TextEdit::Text::insert(int p_at, const String &p_text) { - Line line; line.marked = false; line.safe = false; @@ -315,32 +304,29 @@ void TextEdit::Text::insert(int p_at, const String &p_text) { line.data = p_text; text.insert(p_at, line); } -void TextEdit::Text::remove(int p_at) { +void TextEdit::Text::remove(int p_at) { text.remove(p_at); } int TextEdit::Text::get_char_width(CharType c, CharType next_c, int px) const { - int tab_w = font->get_char_size(' ').width * indent_size; int w = 0; if (c == '\t') { - int left = px % tab_w; - if (left == 0) + if (left == 0) { w = tab_w; - else + } else { w = tab_w - px % tab_w; // Is right. + } } else { - w = font->get_char_size(c, next_c).width; } return w; } void TextEdit::_update_scrollbars() { - Size2 size = get_size(); Size2 hmin = h_scroll->get_combined_minimum_size(); Size2 vmin = v_scroll->get_combined_minimum_size(); @@ -360,8 +346,9 @@ void TextEdit::_update_scrollbars() { int visible_width = size.width - cache.style_normal->get_minimum_size().width; int total_width = text.get_max_width(true) + vmin.x; - if (line_numbers) + if (line_numbers) { total_width += cache.line_number_w; + } if (draw_breakpoint_gutter || draw_bookmark_gutter) { total_width += cache.breakpoint_gutter_width; @@ -384,11 +371,9 @@ void TextEdit::_update_scrollbars() { // Thanks yessopie for this clever bit of logic. if (total_rows <= visible_rows && total_width <= visible_width) { - use_hscroll = false; use_vscroll = false; } else { - if (total_rows > visible_rows && total_width <= visible_width) { use_hscroll = false; } @@ -401,7 +386,6 @@ void TextEdit::_update_scrollbars() { updating_scrolls = true; if (use_vscroll) { - v_scroll->show(); v_scroll->set_max(total_rows + get_visible_rows_offset()); v_scroll->set_page(visible_rows + get_visible_rows_offset()); @@ -413,7 +397,6 @@ void TextEdit::_update_scrollbars() { set_v_scroll(get_v_scroll()); } else { - cursor.line_ofs = 0; cursor.wrap_ofs = 0; v_scroll->set_value(0); @@ -421,18 +404,17 @@ void TextEdit::_update_scrollbars() { } if (use_hscroll && !is_wrap_enabled()) { - h_scroll->show(); h_scroll->set_max(total_width); h_scroll->set_page(visible_width); - if (cursor.x_ofs > (total_width - visible_width)) + if (cursor.x_ofs > (total_width - visible_width)) { cursor.x_ofs = (total_width - visible_width); + } if (fabs(h_scroll->get_value() - (double)cursor.x_ofs) >= 1) { h_scroll->set_value(cursor.x_ofs); } } else { - cursor.x_ofs = 0; h_scroll->set_value(0); h_scroll->hide(); @@ -442,7 +424,6 @@ void TextEdit::_update_scrollbars() { } void TextEdit::_click_selection_held() { - // Warning: is_mouse_button_pressed(BUTTON_LEFT) returns false for double+ clicks, so this doesn't work for MODE_WORD // and MODE_LINE. However, moving the mouse triggers _gui_input, which calls these functions too, so that's not a huge problem. // I'm unsure if there's an actual fix that doesn't have a ton of side effects. @@ -597,7 +578,6 @@ void TextEdit::_update_minimap_click() { } void TextEdit::_update_minimap_drag() { - if (!can_drag_minimap) { return; } @@ -614,14 +594,15 @@ void TextEdit::_update_minimap_drag() { } void TextEdit::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_ENTER_TREE: { _update_caches(); - if (cursor_changed_dirty) + if (cursor_changed_dirty) { MessageQueue::get_singleton()->push_call(this, "_cursor_changed_emit"); - if (text_changed_dirty) + } + if (text_changed_dirty) { MessageQueue::get_singleton()->push_call(this, "_text_changed_emit"); + } _update_wrap_at(); } break; case NOTIFICATION_RESIZED: { @@ -718,7 +699,6 @@ void TextEdit::_notification(int p_what) { }; if (line_numbers) { - line_number_char_count = cache.line_number_w; cache.line_number_w = (cache.line_number_w + 1) * cache.font->get_char_size('0').width; } else { @@ -738,8 +718,9 @@ void TextEdit::_notification(int p_what) { cache.style_readonly->draw(ci, Rect2(Point2(), size)); draw_caret = false; } - if (has_focus()) + if (has_focus()) { cache.style_focus->draw(ci, Rect2(Point2(), size)); + } int ascent = cache.font->get_ascent(); @@ -778,7 +759,6 @@ void TextEdit::_notification(int p_what) { bool brace_close_mismatch = false; if (brace_matching_enabled && cursor.line >= 0 && cursor.line < text.size() && cursor.column >= 0) { - if (cursor.column < text[cursor.line].length()) { // Check for open. CharType c = text[cursor.line][cursor.column]; @@ -793,14 +773,11 @@ void TextEdit::_notification(int p_what) { } if (closec != 0) { - int stack = 1; for (int i = cursor.line; i < text.size(); i++) { - int from = i == cursor.line ? cursor.column + 1 : 0; for (int j = from; j < text[i].length(); j++) { - CharType cc = text[i][j]; // Ignore any brackets inside a string. if (cc == '"' || cc == '\'') { @@ -824,10 +801,11 @@ void TextEdit::_notification(int p_what) { } } } while (cc != quotation); - } else if (cc == c) + } else if (cc == c) { stack++; - else if (cc == closec) + } else if (cc == closec) { stack--; + } if (stack == 0) { brace_open_match_line = i; @@ -837,12 +815,14 @@ void TextEdit::_notification(int p_what) { break; } } - if (brace_open_match_line != -1) + if (brace_open_match_line != -1) { break; + } } - if (!brace_open_matching) + if (!brace_open_matching) { brace_open_mismatch = true; + } } } @@ -859,14 +839,11 @@ void TextEdit::_notification(int p_what) { } if (closec != 0) { - int stack = 1; for (int i = cursor.line; i >= 0; i--) { - int from = i == cursor.line ? cursor.column - 2 : text[i].length() - 1; for (int j = from; j >= 0; j--) { - CharType cc = text[i][j]; // Ignore any brackets inside a string. if (cc == '"' || cc == '\'') { @@ -890,10 +867,11 @@ void TextEdit::_notification(int p_what) { } } } while (cc != quotation); - } else if (cc == c) + } else if (cc == c) { stack++; - else if (cc == closec) + } else if (cc == closec) { stack--; + } if (stack == 0) { brace_close_match_line = i; @@ -903,12 +881,14 @@ void TextEdit::_notification(int p_what) { break; } } - if (brace_close_match_line != -1) + if (brace_close_match_line != -1) { break; + } } - if (!brace_close_matching) + if (!brace_close_matching) { brace_close_mismatch = true; + } } } } @@ -957,7 +937,6 @@ void TextEdit::_notification(int p_what) { Color viewport_color = (cache.background_color.get_v() < 0.5) ? Color(1, 1, 1, 0.1) : Color(0, 0, 0, 0.1); RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2((xmargin_end + 2), viewport_offset_y, cache.minimap_width, viewport_height), viewport_color); for (int i = 0; i < minimap_draw_amount; i++) { - minimap_line++; if (minimap_line < 0 || minimap_line >= (int)text.size()) { @@ -992,8 +971,9 @@ void TextEdit::_notification(int p_what) { for (int line_wrap_index = 0; line_wrap_index < line_wrap_amount + 1; line_wrap_index++) { if (line_wrap_index != 0) { i++; - if (i >= minimap_draw_amount) + if (i >= minimap_draw_amount) { break; + } } const String &str = wrap_rows[line_wrap_index]; @@ -1078,11 +1058,11 @@ void TextEdit::_notification(int p_what) { // draw main text int line = first_visible_line; for (int i = 0; i < draw_amount; i++) { - line++; - if (line < 0 || line >= (int)text.size()) + if (line < 0 || line >= (int)text.size()) { continue; + } while (is_line_hidden(line)) { line++; @@ -1091,8 +1071,9 @@ void TextEdit::_notification(int p_what) { } } - if (line < 0 || line >= (int)text.size()) + if (line < 0 || line >= (int)text.size()) { continue; + } const String &fullstr = text[line]; @@ -1112,8 +1093,9 @@ void TextEdit::_notification(int p_what) { for (int line_wrap_index = 0; line_wrap_index < line_wrap_amount + 1; line_wrap_index++) { if (line_wrap_index != 0) { i++; - if (i >= draw_amount) + if (i >= draw_amount) { break; + } } const String &str = wrap_rows[line_wrap_index]; @@ -1122,8 +1104,9 @@ void TextEdit::_notification(int p_what) { indent_px = 0; } - if (line_wrap_index > 0) + if (line_wrap_index > 0) { last_wrap_column += wrap_rows[line_wrap_index - 1].length(); + } int char_margin = xmargin_beg - cursor.x_ofs; char_margin += indent_px; @@ -1138,19 +1121,22 @@ void TextEdit::_notification(int p_what) { int ofs_y = (i * get_row_height() + cache.line_spacing / 2) + ofs_readonly; ofs_y -= cursor.wrap_ofs * get_row_height(); - if (smooth_scroll_enabled) + if (smooth_scroll_enabled) { ofs_y += (-get_v_scroll_offset()) * get_row_height(); + } // Check if line contains highlighted word. int highlighted_text_col = -1; int search_text_col = -1; int highlighted_word_col = -1; - if (!search_text.empty()) + if (!search_text.empty()) { search_text_col = _get_column_pos_of_word(search_text, str, search_flags, 0); + } - if (highlighted_text.length() != 0 && highlighted_text != search_text) + if (highlighted_text.length() != 0 && highlighted_text != search_text) { highlighted_text_col = _get_column_pos_of_word(highlighted_text, str, SEARCH_MATCH_CASE | SEARCH_WHOLE_WORDS, 0); + } if (select_identifiers_enabled && highlighted_word.length() != 0) { if (_is_char(highlighted_word[0]) || highlighted_word[0] == '.') { @@ -1286,7 +1272,6 @@ void TextEdit::_notification(int p_what) { // Loop through characters in one line. int j = 0; for (; j < str.length(); j++) { - if (syntax_coloring) { if (color_map.has(last_wrap_column + j)) { current_color = color_map[last_wrap_column + j].color; @@ -1307,7 +1292,6 @@ void TextEdit::_notification(int p_what) { // Line highlighting handle horizontal clipping. if (line == cursor.line && cursor_wrap_index == line_wrap_index && highlight_current_line) { - if (j == str.length() - 1) { // End of line when last char is skipped. RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(xmargin_beg + ofs_x, ofs_y, xmargin_end - (char_ofs + char_margin + char_w), get_row_height()), cache.current_line_color); @@ -1327,8 +1311,9 @@ void TextEdit::_notification(int p_what) { if (search_text_col != -1) { // If we are at the end check for new search result on same line. - if (j >= search_text_col + search_text.length()) + if (j >= search_text_col + search_text.length()) { search_text_col = _get_column_pos_of_word(search_text, str, search_flags, j); + } in_search_result = j >= search_text_col && j < search_text_col + search_text.length(); @@ -1365,15 +1350,16 @@ void TextEdit::_notification(int p_what) { RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y), Size2i(char_w, 1)), border_color); RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y + get_row_height() - 1), Size2i(char_w, 1)), border_color); - if (j == search_text_col) + if (j == search_text_col) { RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + ofs_x, ofs_y), Size2i(1, get_row_height())), border_color); - if (j == search_text_col + search_text.length() - 1) + } + if (j == search_text_col + search_text.length() - 1) { RenderingServer::get_singleton()->canvas_item_add_rect(ci, Rect2(Point2i(char_ofs + char_margin + char_w + ofs_x - 1, ofs_y), Size2i(1, get_row_height())), border_color); + } } if (highlight_all_occurrences && !only_whitespaces_highlighted) { if (highlighted_text_col != -1) { - // If we are at the end check for new word on same line. if (j > highlighted_text_col + highlighted_text.length()) { highlighted_text_col = _get_column_pos_of_word(highlighted_text, str, SEARCH_MATCH_CASE | SEARCH_WHOLE_WORDS, j); @@ -1403,23 +1389,22 @@ void TextEdit::_notification(int p_what) { int yofs = ofs_y + (get_row_height() - cache.font->get_height()) / 2; if ((brace_open_match_line == line && brace_open_match_column == last_wrap_column + j) || (cursor.column == last_wrap_column + j && cursor.line == line && cursor_wrap_index == line_wrap_index && (brace_open_matching || brace_open_mismatch))) { - - if (brace_open_mismatch) + if (brace_open_mismatch) { color = cache.brace_mismatch_color; + } drawer.draw_char(ci, Point2i(char_ofs + char_margin + ofs_x, yofs + ascent), '_', str[j + 1], in_selection && override_selected_font_color ? cache.font_color_selected : color); } if ((brace_close_match_line == line && brace_close_match_column == last_wrap_column + j) || (cursor.column == last_wrap_column + j + 1 && cursor.line == line && cursor_wrap_index == line_wrap_index && (brace_close_matching || brace_close_mismatch))) { - - if (brace_close_mismatch) + if (brace_close_mismatch) { color = cache.brace_mismatch_color; + } drawer.draw_char(ci, Point2i(char_ofs + char_margin + ofs_x, yofs + ascent), '_', str[j + 1], in_selection && override_selected_font_color ? cache.font_color_selected : color); } } if (cursor.column == last_wrap_column + j && cursor.line == line && cursor_wrap_index == line_wrap_index) { - cursor_pos = Point2i(char_ofs + char_margin + ofs_x, ofs_y); cursor_pos.y += (get_row_height() - cache.font->get_height()) / 2; @@ -1432,15 +1417,17 @@ void TextEdit::_notification(int p_what) { if (ime_text.length() > 0) { int ofs = 0; while (true) { - if (ofs >= ime_text.length()) + if (ofs >= ime_text.length()) { break; + } CharType cchar = ime_text[ofs]; CharType next = ime_text[ofs + 1]; int im_char_width = cache.font->get_char_size(cchar, next).width; - if ((char_ofs + char_margin + im_char_width) >= xmargin_end) + if ((char_ofs + char_margin + im_char_width) >= xmargin_end) { break; + } bool selected = ofs >= ime_selection.x && ofs < ime_selection.x + ime_selection.y; if (selected) { @@ -1516,7 +1503,6 @@ void TextEdit::_notification(int p_what) { } if (cursor.column == (last_wrap_column + j) && cursor.line == line && cursor_wrap_index == line_wrap_index && (char_ofs + char_margin) >= xmargin_beg) { - cursor_pos = Point2i(char_ofs + char_margin + ofs_x, ofs_y); cursor_pos.y += (get_row_height() - cache.font->get_height()) / 2; @@ -1527,15 +1513,17 @@ void TextEdit::_notification(int p_what) { if (ime_text.length() > 0) { int ofs = 0; while (true) { - if (ofs >= ime_text.length()) + if (ofs >= ime_text.length()) { break; + } CharType cchar = ime_text[ofs]; CharType next = ime_text[ofs + 1]; int im_char_width = cache.font->get_char_size(cchar, next).width; - if ((char_ofs + char_margin + im_char_width) >= xmargin_end) + if ((char_ofs + char_margin + im_char_width) >= xmargin_end) { break; + } bool selected = ofs >= ime_selection.x && ofs < ime_selection.x + ime_selection.y; if (selected) { @@ -1594,8 +1582,9 @@ void TextEdit::_notification(int p_what) { if (completion_options_size < 50) { for (int i = 0; i < completion_options_size; i++) { int w2 = MIN(cache.font->get_string_size(completion_options[i].display).x, cmax_width); - if (w2 > w) + if (w2 > w) { w = w2; + } } } else { w = cmax_width; @@ -1623,8 +1612,9 @@ void TextEdit::_notification(int p_what) { completion_rect.size.width = w + 2; completion_rect.size.height = h; - if (completion_options_size <= maxlines) + if (completion_options_size <= maxlines) { scrollw = 0; + } draw_style_box(csb, Rect2(completion_rect.position - csb->get_offset(), completion_rect.size + csb->get_minimum_size() + Size2(scrollw, 0))); @@ -1636,7 +1626,6 @@ void TextEdit::_notification(int p_what) { draw_rect(Rect2(completion_rect.position + Vector2(icon_area_size.x + icon_hsep, 0), Size2(MIN(nofs, completion_rect.size.width - (icon_area_size.x + icon_hsep)), completion_rect.size.height)), cache.completion_existing_color); for (int i = 0; i < lines; i++) { - int l = line_from + i; ERR_CONTINUE(l < 0 || l >= completion_options_size); Color text_color = cache.completion_font_color; @@ -1688,7 +1677,6 @@ void TextEdit::_notification(int p_what) { } if (show_hint) { - Ref<StyleBox> sb = get_theme_stylebox("panel", "TooltipPanel"); Ref<Font> font = cache.font; Color font_color = get_theme_color("font_color", "TooltipLabel"); @@ -1698,7 +1686,6 @@ void TextEdit::_notification(int p_what) { int offset = 0; int spacing = 0; for (int i = 0; i < sc; i++) { - String l = completion_hint.get_slice("\n", i); int len = font->get_string_size(l).x; max_w = MAX(len, max_w); @@ -1756,7 +1743,6 @@ void TextEdit::_notification(int p_what) { } } break; case NOTIFICATION_FOCUS_ENTER: { - if (caret_blink_enabled) { caret_blink_timer->start(); } else { @@ -1769,11 +1755,11 @@ void TextEdit::_notification(int p_what) { DisplayServer::get_singleton()->window_set_ime_position(get_global_position() + cursor_pos, get_viewport()->get_window_id()); } - if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) { DisplayServer::get_singleton()->virtual_keyboard_show(get_text(), get_global_rect()); + } } break; case NOTIFICATION_FOCUS_EXIT: { - if (caret_blink_enabled) { caret_blink_timer->stop(); } @@ -1785,11 +1771,11 @@ void TextEdit::_notification(int p_what) { ime_text = ""; ime_selection = Point2(); - if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) + if (DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_VIRTUAL_KEYBOARD)) { DisplayServer::get_singleton()->virtual_keyboard_hide(); + } } break; case MainLoop::NOTIFICATION_OS_IME_UPDATE: { - if (has_focus()) { ime_text = DisplayServer::get_singleton()->ime_get_text(); ime_selection = DisplayServer::get_singleton()->ime_get_selection(); @@ -1800,7 +1786,6 @@ void TextEdit::_notification(int p_what) { } void TextEdit::_consume_pair_symbol(CharType ch) { - int cursor_position_to_move = cursor_get_column() + 1; CharType ch_single[2] = { ch, 0 }; @@ -1808,7 +1793,6 @@ void TextEdit::_consume_pair_symbol(CharType ch) { CharType ch_pair[3] = { ch, _get_right_pair_symbol(ch), 0 }; if (is_selection_active()) { - int new_column, new_line; begin_complex_operation(); @@ -1817,8 +1801,9 @@ void TextEdit::_consume_pair_symbol(CharType ch) { &new_line, &new_column); int to_col_offset = 0; - if (get_selection_from_line() == get_selection_to_line()) + if (get_selection_from_line() == get_selection_to_line()) { to_col_offset = 1; + } _insert_text(get_selection_to_line(), get_selection_to_column() + to_col_offset, @@ -1907,11 +1892,9 @@ void TextEdit::_consume_pair_symbol(CharType ch) { } void TextEdit::_consume_backspace_for_pair_symbol(int prev_line, int prev_column) { - bool remove_right_symbol = false; if (cursor.column < text[cursor.line].length() && cursor.column > 0) { - CharType left_char = text[cursor.line][cursor.column - 1]; CharType right_char = text[cursor.line][cursor.column]; @@ -1927,20 +1910,24 @@ void TextEdit::_consume_backspace_for_pair_symbol(int prev_line, int prev_column } void TextEdit::backspace_at_cursor() { - if (readonly) + if (readonly) { return; + } - if (cursor.column == 0 && cursor.line == 0) + if (cursor.column == 0 && cursor.line == 0) { return; + } int prev_line = cursor.column ? cursor.line : cursor.line - 1; int prev_column = cursor.column ? (cursor.column - 1) : (text[cursor.line - 1].length()); - if (is_line_hidden(cursor.line)) + if (is_line_hidden(cursor.line)) { set_line_as_hidden(prev_line, true); + } if (is_line_set_as_breakpoint(cursor.line)) { - if (!text.is_breakpoint(prev_line)) + if (!text.is_breakpoint(prev_line)) { emit_signal("breakpoint_toggled", prev_line); + } set_line_as_breakpoint(prev_line, true); } @@ -1985,7 +1972,6 @@ void TextEdit::backspace_at_cursor() { } void TextEdit::indent_right() { - int start_line; int end_line; @@ -2016,8 +2002,9 @@ void TextEdit::indent_right() { int spaces_to_add = _calculate_spaces_till_next_right_indent(left); // Since we will add this much spaces we want move whole selection and cursor by this much. selection_offset = spaces_to_add; - for (int j = 0; j < spaces_to_add; j++) + for (int j = 0; j < spaces_to_add; j++) { line_text = ' ' + line_text; + } } else { line_text = '\t' + line_text; } @@ -2034,7 +2021,6 @@ void TextEdit::indent_right() { } void TextEdit::indent_left() { - int start_line; int end_line; @@ -2095,8 +2081,9 @@ void TextEdit::indent_left() { int TextEdit::_calculate_spaces_till_next_left_indent(int column) { int spaces_till_indent = column % indent_size; - if (spaces_till_indent == 0) + if (spaces_till_indent == 0) { spaces_till_indent = indent_size; + } return spaces_till_indent; } @@ -2105,7 +2092,6 @@ int TextEdit::_calculate_spaces_till_next_right_indent(int column) { } void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) const { - float rows = p_mouse.y; rows -= cache.style_normal->get_margin(MARGIN_TOP); rows /= get_row_height(); @@ -2115,25 +2101,24 @@ void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) co int wrap_index = 0; if (is_wrap_enabled() || is_hiding_enabled()) { - int f_ofs = num_lines_from_rows(first_vis_line, cursor.wrap_ofs, rows + (1 * SGN(rows)), wrap_index) - 1; - if (rows < 0) + if (rows < 0) { row = first_vis_line - f_ofs; - else + } else { row = first_vis_line + f_ofs; + } } - if (row < 0) + if (row < 0) { row = 0; // TODO. + } int col = 0; if (row >= text.size()) { - row = text.size() - 1; col = text[row].size(); } else { - int colx = p_mouse.x - (cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width + cache.info_gutter_width); colx += cursor.x_ofs; col = get_char_pos_for_line(colx, row, wrap_index); @@ -2144,8 +2129,9 @@ void TextEdit::_get_mouse_pos(const Point2i &p_mouse, int &r_row, int &r_col) co for (int i = 0; i < wrap_index + 1; i++) { row_end_col += rows2[i].length(); } - if (col >= row_end_col) + if (col >= row_end_col) { col -= 1; + } } } @@ -2192,7 +2178,6 @@ Vector2i TextEdit::_get_cursor_pixel_pos() { } void TextEdit::_get_minimap_mouse_row(const Point2i &p_mouse, int &r_row) const { - float rows = p_mouse.y; rows -= cache.style_normal->get_margin(MARGIN_TOP); rows /= (minimap_char_size.y + minimap_line_spacing); @@ -2226,7 +2211,6 @@ void TextEdit::_get_minimap_mouse_row(const Point2i &p_mouse, int &r_row) const int wrap_index = 0; if (is_wrap_enabled() || is_hiding_enabled()) { - int f_ofs = num_lines_from_rows(minimap_line, cursor.wrap_ofs, rows + (1 * SGN(rows)), wrap_index) - 1; if (rows < 0) { row = minimap_line - f_ofs; @@ -2247,7 +2231,6 @@ void TextEdit::_get_minimap_mouse_row(const Point2i &p_mouse, int &r_row) const } void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { - double prev_v_scroll = v_scroll->get_value(); double prev_h_scroll = h_scroll->get_value(); @@ -2255,9 +2238,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { if (mb.is_valid()) { if (completion_active && completion_rect.has_point(mb->get_position())) { - - if (!mb->is_pressed()) + if (!mb->is_pressed()) { return; + } if (mb->get_button_index() == BUTTON_WHEEL_UP) { if (completion_index > 0) { @@ -2267,7 +2250,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } if (mb->get_button_index() == BUTTON_WHEEL_DOWN) { - if (completion_index < completion_options.size() - 1) { completion_index++; completion_current = completion_options[completion_index]; @@ -2276,13 +2258,13 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (mb->get_button_index() == BUTTON_LEFT) { - completion_index = CLAMP(completion_line_ofs + (mb->get_position().y - completion_rect.position.y) / get_row_height(), 0, completion_options.size() - 1); completion_current = completion_options[completion_index]; update(); - if (mb->is_doubleclick()) + if (mb->is_doubleclick()) { _confirm_completion(); + } } return; } else { @@ -2291,7 +2273,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (mb->is_pressed()) { - if (mb->get_button_index() == BUTTON_WHEEL_UP && !mb->get_command()) { if (mb->get_shift()) { h_scroll->set_value(h_scroll->get_value() - (100 * mb->get_factor())); @@ -2313,7 +2294,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { h_scroll->set_value(h_scroll->get_value() + (100 * mb->get_factor())); } if (mb->get_button_index() == BUTTON_LEFT) { - _reset_caret_blink_timer(); int row, col; @@ -2341,7 +2321,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { // Toggle fold on gutter click if can. if (draw_fold_gutter) { - int left_margin = cache.style_normal->get_margin(MARGIN_LEFT); int gutter_left = left_margin + cache.breakpoint_gutter_width + cache.line_number_w + cache.info_gutter_width; if (mb->get_position().x > gutter_left - 6 && mb->get_position().x <= gutter_left + cache.fold_gutter_width - 3) { @@ -2379,7 +2358,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { cursor_set_column(col); if (mb->get_shift() && (cursor.column != prev_col || cursor.line != prev_line)) { - if (!selection.active) { selection.active = true; selection.selecting_mode = Selection::MODE_POINTER; @@ -2399,9 +2377,7 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { selection.selecting_column = prev_col; update(); } else { - if (cursor.line < selection.selecting_line || (cursor.line == selection.selecting_line && cursor.column < selection.selecting_column)) { - if (selection.shiftclick_left) { SWAP(selection.from_column, selection.to_column); SWAP(selection.from_line, selection.to_line); @@ -2411,7 +2387,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { selection.from_line = cursor.line; } else if (cursor.line > selection.selecting_line || (cursor.line == selection.selecting_line && cursor.column > selection.selecting_column)) { - if (!selection.shiftclick_left) { SWAP(selection.from_column, selection.to_column); SWAP(selection.from_line, selection.to_line); @@ -2428,7 +2403,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } else { - selection.active = false; selection.selecting_mode = Selection::MODE_POINTER; selection.selecting_line = row; @@ -2436,13 +2410,11 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (!mb->is_doubleclick() && (OS::get_singleton()->get_ticks_msec() - last_dblclk) < 600 && cursor.line == prev_line) { - // Triple-click select line. selection.selecting_mode = Selection::MODE_LINE; _update_selection_mode_line(); last_dblclk = 0; } else if (mb->is_doubleclick() && text[cursor.line].length()) { - // Double-click select word. selection.selecting_mode = Selection::MODE_WORD; _update_selection_mode_word(); @@ -2453,7 +2425,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (mb->get_button_index() == BUTTON_RIGHT && context_menu_enabled) { - _reset_caret_blink_timer(); int row, col; @@ -2461,7 +2432,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { if (is_right_click_moving_caret()) { if (is_selection_active()) { - int from_line = get_selection_from_line(); int to_line = get_selection_to_line(); int from_column = get_selection_from_column(); @@ -2485,7 +2455,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { grab_focus(); } } else { - if (mb->get_button_index() == BUTTON_LEFT) { if (mb->get_command() && highlighted_word != String()) { int row, col; @@ -2508,7 +2477,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { const Ref<InputEventPanGesture> pan_gesture = p_gui_input; if (pan_gesture.is_valid()) { - const real_t delta = pan_gesture->get_delta().y; if (delta < 0) { _scroll_up(-delta); @@ -2516,8 +2484,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { _scroll_down(delta); } h_scroll->set_value(h_scroll->get_value() + pan_gesture->get_delta().x * 100); - if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) + if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) { accept_event(); // Accept event if scroll changed. + } return; } @@ -2525,10 +2494,8 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { Ref<InputEventMouseMotion> mm = p_gui_input; if (mm.is_valid()) { - if (select_identifiers_enabled) { if (!dragging_minimap && !dragging_selection && mm->get_command() && mm->get_button_mask() == 0) { - String new_word = get_word_at_pos(mm->get_position()); if (new_word != highlighted_word) { emit_signal("symbol_validate", new_word); @@ -2566,13 +2533,13 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } - if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) + if (v_scroll->get_value() != prev_v_scroll || h_scroll->get_value() != prev_h_scroll) { accept_event(); // Accept event if scroll changed. + } Ref<InputEventKey> k = p_gui_input; if (k.is_valid()) { - k = k->duplicate(); // It will be modified later on. #ifdef OSX_ENABLED @@ -2582,7 +2549,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { #endif if (select_identifiers_enabled) { - if (k->is_pressed() && !dragging_minimap && !dragging_selection) { emit_signal("symbol_validate", get_word_at_pos(get_local_mouse_position())); } else { @@ -2591,22 +2557,23 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } - if (!k->is_pressed()) + if (!k->is_pressed()) { return; + } if (completion_active) { - if (readonly) + if (readonly) { return; + } bool valid = true; - if (k->get_command() || k->get_metakey()) + if (k->get_command() || k->get_metakey()) { valid = false; + } if (valid) { - if (!k->get_alt()) { if (k->get_keycode() == KEY_UP) { - if (completion_index > 0) { completion_index--; } else { @@ -2620,7 +2587,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (k->get_keycode() == KEY_DOWN) { - if (completion_index < completion_options.size() - 1) { completion_index++; } else { @@ -2634,10 +2600,10 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (k->get_keycode() == KEY_PAGEUP) { - completion_index -= get_theme_constant("completion_lines"); - if (completion_index < 0) + if (completion_index < 0) { completion_index = 0; + } completion_current = completion_options[completion_index]; update(); accept_event(); @@ -2645,10 +2611,10 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (k->get_keycode() == KEY_PAGEDOWN) { - completion_index += get_theme_constant("completion_lines"); - if (completion_index >= completion_options.size()) + if (completion_index >= completion_options.size()) { completion_index = completion_options.size() - 1; + } completion_current = completion_options[completion_index]; update(); accept_event(); @@ -2656,7 +2622,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (k->get_keycode() == KEY_HOME && completion_index > 0) { - completion_index = 0; completion_current = completion_options[completion_index]; update(); @@ -2665,7 +2630,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (k->get_keycode() == KEY_END && completion_index < completion_options.size() - 1) { - completion_index = completion_options.size() - 1; completion_current = completion_options[completion_index]; update(); @@ -2674,14 +2638,12 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (k->get_keycode() == KEY_KP_ENTER || k->get_keycode() == KEY_ENTER || k->get_keycode() == KEY_TAB) { - _confirm_completion(); accept_event(); return; } if (k->get_keycode() == KEY_BACKSPACE) { - _reset_caret_blink_timer(); backspace_at_cursor(); @@ -2697,14 +2659,12 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (k->get_unicode() > 32) { - _reset_caret_blink_timer(); const CharType chr[2] = { (CharType)k->get_unicode(), 0 }; if (auto_brace_completion_enabled && _is_pair_symbol(chr[0])) { _consume_pair_symbol(chr[0]); } else { - // Remove the old character if in insert mode. if (insert_mode) { begin_complex_operation(); @@ -2735,11 +2695,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { // Some remaps for duplicate functions. if (k->get_command() && !k->get_shift() && !k->get_alt() && !k->get_metakey() && k->get_keycode() == KEY_INSERT) { - k->set_keycode(KEY_C); } if (!k->get_command() && k->get_shift() && !k->get_alt() && !k->get_metakey() && k->get_keycode() == KEY_INSERT) { - k->set_keycode(KEY_V); k->set_command(true); k->set_shift(false); @@ -2782,13 +2740,11 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { // Stuff to do when selection is active. if (!readonly && selection.active) { - bool clear = false; bool unselect = false; bool dobreak = false; switch (k->get_keycode()) { - case KEY_TAB: { if (k->get_shift()) { indent_left(); @@ -2826,16 +2782,19 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { case KEY_HOME: case KEY_END: // Ignore arrows if any modifiers are held (shift = selecting, others may be used for editor hotkeys). - if (k->get_command() || k->get_shift() || k->get_alt()) + if (k->get_command() || k->get_shift() || k->get_alt()) { break; + } unselect = true; break; default: - if (k->get_unicode() >= 32 && !k->get_command() && !k->get_alt() && !k->get_metakey()) + if (k->get_unicode() >= 32 && !k->get_command() && !k->get_alt() && !k->get_metakey()) { clear = true; - if (auto_brace_completion_enabled && _is_pair_left_symbol(k->get_unicode())) + } + if (auto_brace_completion_enabled && _is_pair_left_symbol(k->get_unicode())) { clear = false; + } } if (unselect) { @@ -2844,7 +2803,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { update(); } if (clear) { - if (!dobreak) { begin_complex_operation(); } @@ -2855,8 +2813,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { cursor_set_column(selection.from_column); update(); } - if (dobreak) + if (dobreak) { return; + } } selection.selecting_text = false; @@ -2866,12 +2825,11 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { // Special keycode test. switch (k->get_keycode()) { - case KEY_KP_ENTER: case KEY_ENTER: { - - if (readonly) + if (readonly) { break; + } String ins = "\n"; @@ -2901,8 +2859,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } - if (is_folded(cursor.line)) + if (is_folded(cursor.line)) { unfold_line(cursor.line); + } bool brace_indent = false; @@ -2931,7 +2890,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (indent_char_found && cri_map.has(i) && (color_regions[cri_map[i].region].begin_key == "#" || color_regions[cri_map[i].region].begin_key == "//")) { - should_indent = true; break; } else if (indent_char_found && !_is_whitespace(c)) { @@ -2991,11 +2949,13 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } break; case KEY_TAB: { - if (k->get_command()) + if (k->get_command()) { break; // Avoid tab when command. + } - if (readonly) + if (readonly) { break; + } if (is_selection_active()) { if (k->get_shift()) { @@ -3005,7 +2965,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } else { if (k->get_shift()) { - // Simple unindent. int cc = cursor.column; const String &line = text[cursor.line]; @@ -3013,23 +2972,26 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { int left = _find_first_non_whitespace_column_of_line(line); cc = MIN(cc, left); - while (cc < indent_size && cc < left && line[cc] == ' ') + while (cc < indent_size && cc < left && line[cc] == ' ') { cc++; + } if (cc > 0 && cc <= text[cursor.line].length()) { if (text[cursor.line][cc - 1] == '\t') { // Tabs unindentation. _remove_text(cursor.line, cc - 1, cursor.line, cc); - if (cursor.column >= left) + if (cursor.column >= left) { cursor_set_column(MAX(0, cursor.column - 1)); + } update(); } else { // Spaces unindentation. int spaces_to_remove = _calculate_spaces_till_next_left_indent(cc); if (spaces_to_remove > 0) { _remove_text(cursor.line, cc - spaces_to_remove, cursor.line, cc); - if (cursor.column > left - spaces_to_remove) // Inside text? + if (cursor.column > left - spaces_to_remove) { // Inside text? cursor_set_column(MAX(0, cursor.column - spaces_to_remove)); + } update(); } } @@ -3043,8 +3005,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { // Insert only as much spaces as needed till next indentation level. int spaces_to_add = _calculate_spaces_till_next_right_indent(cursor.column); String indent_to_insert = String(); - for (int i = 0; i < spaces_to_add; i++) + for (int i = 0; i < spaces_to_add; i++) { indent_to_insert = ' ' + indent_to_insert; + } _insert_text_at_cursor(indent_to_insert); } else { _insert_text_at_cursor("\t"); @@ -3054,8 +3017,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } break; case KEY_BACKSPACE: { - if (readonly) + if (readonly) { break; + } #ifdef APPLE_STYLE_KEYS if (k->get_alt() && cursor.column > 1) { @@ -3110,8 +3074,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { _remove_text(cursor.line, 0, cursor.line, cursor_current_column); #endif } else { - if (cursor.line > 0 && is_line_hidden(cursor.line - 1)) + if (cursor.line > 0 && is_line_hidden(cursor.line - 1)) { unfold_line(cursor.line - 1); + } backspace_at_cursor(); } @@ -3124,15 +3089,15 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { [[fallthrough]]; } case KEY_LEFT: { - - if (k->get_shift()) + if (k->get_shift()) { _pre_shift_selection(); #ifdef APPLE_STYLE_KEYS - else + } else { #else - else if (!k->get_alt()) + } else if (!k->get_alt()) { #endif deselect(); + } #ifdef APPLE_STYLE_KEYS if (k->get_command()) { @@ -3169,8 +3134,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { while (cc > 0) { bool ischar = _is_text_char(text[cursor.line][cc - 1]); - if (prev_char && !ischar) + if (prev_char && !ischar) { break; + } prev_char = ischar; cc--; @@ -3179,7 +3145,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } else if (cursor.column == 0) { - if (cursor.line > 0) { cursor_set_line(cursor.line - num_lines_from(CLAMP(cursor.line - 1, 0, text.size() - 1), -1)); cursor_set_column(text[cursor.line].length()); @@ -3188,8 +3153,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { cursor_set_column(cursor_get_column() - 1); } - if (k->get_shift()) + if (k->get_shift()) { _post_shift_selection(); + } } break; case KEY_KP_6: { @@ -3200,15 +3166,15 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { [[fallthrough]]; } case KEY_RIGHT: { - - if (k->get_shift()) + if (k->get_shift()) { _pre_shift_selection(); #ifdef APPLE_STYLE_KEYS - else + } else { #else - else if (!k->get_alt()) + } else if (!k->get_alt()) { #endif deselect(); + } #ifdef APPLE_STYLE_KEYS if (k->get_command()) { @@ -3231,8 +3197,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { while (cc < text[cursor.line].length()) { bool ischar = _is_text_char(text[cursor.line][cc]); - if (prev_char && !ischar) + if (prev_char && !ischar) { break; + } prev_char = ischar; cc++; } @@ -3240,7 +3207,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } else if (cursor.column == text[cursor.line].length()) { - if (cursor.line < text.size() - 1) { cursor_set_line(cursor_get_line() + num_lines_from(CLAMP(cursor.line + 1, 0, text.size() - 1), 1), true, false); cursor_set_column(0); @@ -3249,8 +3215,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { cursor_set_column(cursor_get_column() + 1); } - if (k->get_shift()) + if (k->get_shift()) { _post_shift_selection(); + } } break; case KEY_KP_8: { @@ -3261,7 +3228,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { [[fallthrough]]; } case KEY_UP: { - if (k->get_alt()) { keycode_handled = false; break; @@ -3281,7 +3247,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { #ifdef APPLE_STYLE_KEYS if (k->get_command()) { - cursor_set_line(0); } else #endif @@ -3301,8 +3266,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } - if (k->get_shift()) + if (k->get_shift()) { _post_shift_selection(); + } _cancel_code_hint(); } break; @@ -3314,7 +3280,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { [[fallthrough]]; } case KEY_DOWN: { - if (k->get_alt()) { keycode_handled = false; break; @@ -3349,15 +3314,16 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } - if (k->get_shift()) + if (k->get_shift()) { _post_shift_selection(); + } _cancel_code_hint(); } break; case KEY_DELETE: { - - if (readonly) + if (readonly) { break; + } if (k->get_shift() && !k->get_command() && !k->get_alt() && is_shortcut_keys_enabled()) { cut(); @@ -3366,8 +3332,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { int curline_len = text[cursor.line].length(); - if (cursor.line == text.size() - 1 && cursor.column == curline_len) + if (cursor.line == text.size() - 1 && cursor.column == curline_len) { break; // Nothing to do. + } int next_line = cursor.column < curline_len ? cursor.line : cursor.line + 1; int next_column; @@ -3448,14 +3415,14 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { else if (k->get_command() || k->get_control()) deselect(); #else - if (k->get_shift()) + if (k->get_shift()) { _pre_shift_selection(); + } if (k->get_command()) { cursor_set_line(0); cursor_set_column(0); } else { - // Move cursor column to start of wrapped row and then to start of text. Vector<String> rows = get_wrap_rows_text(cursor.line); int wi = get_cursor_wrap_index(); @@ -3468,24 +3435,27 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { int current_line_whitespace_len = 0; while (current_line_whitespace_len < text[cursor.line].length()) { CharType c = text[cursor.line][current_line_whitespace_len]; - if (c != '\t' && c != ' ') + if (c != '\t' && c != ' ') { break; + } current_line_whitespace_len++; } - if (cursor_get_column() == current_line_whitespace_len) + if (cursor_get_column() == current_line_whitespace_len) { cursor_set_column(0); - else + } else { cursor_set_column(current_line_whitespace_len); + } } else { cursor_set_column(row_start_col); } } - if (k->get_shift()) + if (k->get_shift()) { _post_shift_selection(); - else if (k->get_command() || k->get_control()) + } else if (k->get_command() || k->get_control()) { deselect(); + } _cancel_completion(); completion_hint = ""; #endif @@ -3509,11 +3479,13 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { else if (k->get_command() || k->get_control()) deselect(); #else - if (k->get_shift()) + if (k->get_shift()) { _pre_shift_selection(); + } - if (k->get_command()) + if (k->get_command()) { cursor_set_line(get_last_unhidden_line(), true, false, 9999); + } // Move cursor column to end of wrapped row and then to end of text. Vector<String> rows = get_wrap_rows_text(cursor.line); @@ -3528,10 +3500,11 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { cursor_set_column(row_end_col); } - if (k->get_shift()) + if (k->get_shift()) { _post_shift_selection(); - else if (k->get_command() || k->get_control()) + } else if (k->get_command() || k->get_control()) { deselect(); + } _cancel_completion(); completion_hint = ""; @@ -3545,16 +3518,17 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { [[fallthrough]]; } case KEY_PAGEUP: { - - if (k->get_shift()) + if (k->get_shift()) { _pre_shift_selection(); + } int wi; int n_line = cursor.line - num_lines_from_rows(cursor.line, get_cursor_wrap_index(), -get_visible_rows(), wi) + 1; cursor_set_line(n_line, true, false, wi); - if (k->get_shift()) + if (k->get_shift()) { _post_shift_selection(); + } _cancel_completion(); completion_hint = ""; @@ -3568,23 +3542,23 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { [[fallthrough]]; } case KEY_PAGEDOWN: { - - if (k->get_shift()) + if (k->get_shift()) { _pre_shift_selection(); + } int wi; int n_line = cursor.line + num_lines_from_rows(cursor.line, get_cursor_wrap_index(), get_visible_rows(), wi) - 1; cursor_set_line(n_line, true, false, wi); - if (k->get_shift()) + if (k->get_shift()) { _post_shift_selection(); + } _cancel_completion(); completion_hint = ""; } break; case KEY_A: { - #ifndef APPLE_STYLE_KEYS if (!k->get_control() || k->get_shift() || k->get_alt()) { keycode_handled = false; @@ -3624,7 +3598,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } } break; case KEY_E: { - if (!k->get_control() || k->get_command() || k->get_alt()) { keycode_handled = false; break; @@ -3660,7 +3633,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } break; case KEY_C: { - if (!k->get_command() || k->get_shift() || k->get_alt()) { keycode_handled = false; break; @@ -3672,7 +3644,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } break; case KEY_Z: { - if (readonly) { break; } @@ -3683,14 +3654,14 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } if (is_shortcut_keys_enabled()) { - if (k->get_shift()) + if (k->get_shift()) { redo(); - else + } else { undo(); + } } } break; case KEY_Y: { - if (readonly) { break; } @@ -3744,13 +3715,13 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } break; default: { - keycode_handled = false; } break; } - if (keycode_handled) + if (keycode_handled) { accept_event(); + } if (k->get_keycode() == KEY_INSERT) { set_insert_mode(!insert_mode); @@ -3761,9 +3732,9 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { if (!keycode_handled && !k->get_command()) { // For German keyboards. if (k->get_unicode() >= 32) { - - if (readonly) + if (readonly) { return; + } // Remove the old character if in insert mode and no selection. if (insert_mode && !had_selection) { @@ -3802,7 +3773,6 @@ void TextEdit::_gui_input(const Ref<InputEvent> &p_gui_input) { } void TextEdit::_scroll_up(real_t p_delta) { - if (scrolling && smooth_scroll_enabled && SGN(target_v_scroll - v_scroll->get_value()) != SGN(-p_delta)) { scrolling = false; minimap_clicked = false; @@ -3830,7 +3800,6 @@ void TextEdit::_scroll_up(real_t p_delta) { } void TextEdit::_scroll_down(real_t p_delta) { - if (scrolling && smooth_scroll_enabled && SGN(target_v_scroll - v_scroll->get_value()) != SGN(p_delta)) { scrolling = false; minimap_clicked = false; @@ -3859,9 +3828,7 @@ void TextEdit::_scroll_down(real_t p_delta) { } void TextEdit::_pre_shift_selection() { - if (!selection.active || selection.selecting_mode == Selection::MODE_NONE) { - selection.selecting_line = cursor.line; selection.selecting_column = cursor.column; selection.active = true; @@ -3871,9 +3838,7 @@ void TextEdit::_pre_shift_selection() { } void TextEdit::_post_shift_selection() { - if (selection.active && selection.selecting_mode == Selection::MODE_SHIFT) { - select(selection.selecting_line, selection.selecting_column, cursor.line, cursor.column); update(); } @@ -3924,7 +3889,6 @@ void TextEdit::_scroll_lines_down() { /**** TEXT EDIT CORE API ****/ void TextEdit::_base_insert_text(int p_line, int p_char, const String &p_text, int &r_end_line, int &r_end_column) { - // Save for undo. ERR_FAIL_INDEX(p_line, text.size()); ERR_FAIL_COND(p_char < 0); @@ -3942,16 +3906,17 @@ void TextEdit::_base_insert_text(int p_line, int p_char, const String &p_text, i int lines = substrings.size() - 1; for (; i < text.size(); i++) { if (text.is_breakpoint(i)) { - if ((i - lines < p_line || !text.is_breakpoint(i - lines)) || (i - lines == p_line && !shift_first_line)) + if ((i - lines < p_line || !text.is_breakpoint(i - lines)) || (i - lines == p_line && !shift_first_line)) { emit_signal("breakpoint_toggled", i); - if (i + lines >= text.size() || !text.is_breakpoint(i + lines)) + } + if (i + lines >= text.size() || !text.is_breakpoint(i + lines)) { emit_signal("breakpoint_toggled", i + lines); + } } } /* STEP 3: Add spaces if the char is greater than the end of the line. */ while (p_char > text[p_line].length()) { - text.set(p_line, text[p_line] + String::chr(' ')); } @@ -3964,15 +3929,12 @@ void TextEdit::_base_insert_text(int p_line, int p_char, const String &p_text, i // Insert the substrings. if (j == 0) { - text.set(p_line, preinsert_text + substrings[j]); } else { - text.insert(p_line + j, substrings[j]); } if (j == substrings.size() - 1) { - text.set(p_line + j, text[p_line + j] + postinsert_text); } } @@ -3995,15 +3957,15 @@ void TextEdit::_base_insert_text(int p_line, int p_char, const String &p_text, i r_end_column = text[r_end_line].length() - postinsert_text.length(); if (!text_changed_dirty && !setting_text) { - if (is_inside_tree()) + if (is_inside_tree()) { MessageQueue::get_singleton()->push_call(this, "_text_changed_emit"); + } text_changed_dirty = true; } _line_edited_from(p_line); } String TextEdit::_base_get_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column) const { - ERR_FAIL_INDEX_V(p_from_line, text.size(), String()); ERR_FAIL_INDEX_V(p_from_column, text[p_from_line].length() + 1, String()); ERR_FAIL_INDEX_V(p_to_line, text.size(), String()); @@ -4014,12 +3976,12 @@ String TextEdit::_base_get_text(int p_from_line, int p_from_column, int p_to_lin String ret; for (int i = p_from_line; i <= p_to_line; i++) { - int begin = (i == p_from_line) ? p_from_column : 0; int end = (i == p_to_line) ? p_to_column : text[i].length(); - if (i > p_from_line) + if (i > p_from_line) { ret += "\n"; + } ret += text[i].substr(begin, end - begin); } @@ -4027,7 +3989,6 @@ String TextEdit::_base_get_text(int p_from_line, int p_from_column, int p_to_lin } void TextEdit::_base_remove_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column) { - ERR_FAIL_INDEX(p_from_line, text.size()); ERR_FAIL_INDEX(p_from_column, text[p_from_line].length() + 1); ERR_FAIL_INDEX(p_to_line, text.size()); @@ -4042,10 +4003,12 @@ void TextEdit::_base_remove_text(int p_from_line, int p_from_column, int p_to_li for (int i = p_from_line + 1; i < text.size(); i++) { if (text.is_breakpoint(i)) { - if (i + lines >= text.size() || !text.is_breakpoint(i + lines)) + if (i + lines >= text.size() || !text.is_breakpoint(i + lines)) { emit_signal("breakpoint_toggled", i); - if (i > p_to_line && (i - lines < 0 || !text.is_breakpoint(i - lines))) + } + if (i > p_to_line && (i - lines < 0 || !text.is_breakpoint(i - lines))) { emit_signal("breakpoint_toggled", i - lines); + } } } @@ -4057,17 +4020,18 @@ void TextEdit::_base_remove_text(int p_from_line, int p_from_column, int p_to_li text.set_line_wrap_amount(p_from_line, -1); if (!text_changed_dirty && !setting_text) { - if (is_inside_tree()) + if (is_inside_tree()) { MessageQueue::get_singleton()->push_call(this, "_text_changed_emit"); + } text_changed_dirty = true; } _line_edited_from(p_from_line); } void TextEdit::_insert_text(int p_line, int p_char, const String &p_text, int *r_end_line, int *r_end_char) { - - if (!setting_text && idle_detect->is_inside_tree()) + if (!setting_text && idle_detect->is_inside_tree()) { idle_detect->start(); + } if (undo_enabled) { _clear_redo(); @@ -4075,13 +4039,16 @@ void TextEdit::_insert_text(int p_line, int p_char, const String &p_text, int *r int retline, retchar; _base_insert_text(p_line, p_char, p_text, retline, retchar); - if (r_end_line) + if (r_end_line) { *r_end_line = retline; - if (r_end_char) + } + if (r_end_char) { *r_end_char = retchar; + } - if (!undo_enabled) + if (!undo_enabled) { return; + } /* UNDO!! */ TextOperation op; @@ -4119,9 +4086,9 @@ void TextEdit::_insert_text(int p_line, int p_char, const String &p_text, int *r } void TextEdit::_remove_text(int p_from_line, int p_from_column, int p_to_line, int p_to_column) { - - if (!setting_text && idle_detect->is_inside_tree()) + if (!setting_text && idle_detect->is_inside_tree()) { idle_detect->start(); + } String text; if (undo_enabled) { @@ -4131,8 +4098,9 @@ void TextEdit::_remove_text(int p_from_line, int p_from_column, int p_to_line, i _base_remove_text(p_from_line, p_from_column, p_to_line, p_to_column); - if (!undo_enabled) + if (!undo_enabled) { return; + } /* UNDO! */ TextOperation op; @@ -4168,7 +4136,6 @@ void TextEdit::_remove_text(int p_from_line, int p_from_column, int p_to_line, i } void TextEdit::_insert_text_at_cursor(const String &p_text) { - int new_column, new_line; _insert_text(cursor.line, cursor.column, p_text, &new_line, &new_column); _update_scrollbars(); @@ -4195,13 +4162,12 @@ void TextEdit::_line_edited_from(int p_line) { } int TextEdit::get_char_count() { - int totalsize = 0; for (int i = 0; i < text.size(); i++) { - - if (i > 0) + if (i > 0) { totalsize++; // Include \n. + } totalsize += text[i].length(); } @@ -4209,7 +4175,6 @@ int TextEdit::get_char_count() { } Size2 TextEdit::get_minimum_size() const { - return cache.style_normal->get_minimum_size(); } @@ -4225,14 +4190,17 @@ int TextEdit::_get_control_height() const { void TextEdit::_generate_context_menu() { // Reorganize context menu. menu->clear(); - if (!readonly) + if (!readonly) { menu->add_item(RTR("Cut"), MENU_CUT, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_X : 0); + } menu->add_item(RTR("Copy"), MENU_COPY, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_C : 0); - if (!readonly) + if (!readonly) { menu->add_item(RTR("Paste"), MENU_PASTE, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_V : 0); + } menu->add_separator(); - if (is_selecting_enabled()) + if (is_selecting_enabled()) { menu->add_item(RTR("Select All"), MENU_SELECT_ALL, is_shortcut_keys_enabled() ? KEY_MASK_CMD | KEY_A : 0); + } if (!readonly) { menu->add_item(RTR("Clear"), MENU_CLEAR); menu->add_separator(); @@ -4250,11 +4218,11 @@ int TextEdit::_get_minimap_visible_rows() const { } int TextEdit::get_total_visible_rows() const { - // Returns the total amount of rows we need in the editor. // This skips hidden lines and counts each wrapping of a line. - if (!is_hiding_enabled() && !is_wrap_enabled()) + if (!is_hiding_enabled() && !is_wrap_enabled()) { return text.size(); + } int total_rows = 0; for (int i = 0; i < text.size(); i++) { @@ -4267,22 +4235,21 @@ int TextEdit::get_total_visible_rows() const { } void TextEdit::_update_wrap_at() { - wrap_at = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width - cache.minimap_width - wrap_right_offset; update_cursor_wrap_offset(); text.clear_wrap_cache(); for (int i = 0; i < text.size(); i++) { // Update all values that wrap. - if (!line_wraps(i)) + if (!line_wraps(i)) { continue; + } Vector<String> rows = get_wrap_rows_text(i); text.set_line_wrap_amount(i, rows.size() - 1); } } void TextEdit::adjust_viewport_to_cursor() { - // Make sure cursor is visible on the screen. scrolling = false; minimap_clicked = false; @@ -4304,19 +4271,22 @@ void TextEdit::adjust_viewport_to_cursor() { } int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width - cache.minimap_width; - if (v_scroll->is_visible_in_tree()) + if (v_scroll->is_visible_in_tree()) { visible_width -= v_scroll->get_combined_minimum_size().width; + } visible_width -= 20; // Give it a little more space. if (!is_wrap_enabled()) { // Adjust x offset. int cursor_x = get_column_x_offset(cursor.column, text[cursor.line]); - if (cursor_x > (cursor.x_ofs + visible_width)) + if (cursor_x > (cursor.x_ofs + visible_width)) { cursor.x_ofs = cursor_x - visible_width + 1; + } - if (cursor_x < cursor.x_ofs) + if (cursor_x < cursor.x_ofs) { cursor.x_ofs = cursor_x; + } } else { cursor.x_ofs = 0; } @@ -4326,29 +4296,32 @@ void TextEdit::adjust_viewport_to_cursor() { } void TextEdit::center_viewport_to_cursor() { - // Move viewport so the cursor is in the center of the screen. scrolling = false; minimap_clicked = false; - if (is_line_hidden(cursor.line)) + if (is_line_hidden(cursor.line)) { unfold_line(cursor.line); + } set_line_as_center_visible(cursor.line, get_cursor_wrap_index()); int visible_width = get_size().width - cache.style_normal->get_minimum_size().width - cache.line_number_w - cache.breakpoint_gutter_width - cache.fold_gutter_width - cache.info_gutter_width - cache.minimap_width; - if (v_scroll->is_visible_in_tree()) + if (v_scroll->is_visible_in_tree()) { visible_width -= v_scroll->get_combined_minimum_size().width; + } visible_width -= 20; // Give it a little more space. if (is_wrap_enabled()) { // Center x offset. int cursor_x = get_column_x_offset_for_line(cursor.column, cursor.line); - if (cursor_x > (cursor.x_ofs + visible_width)) + if (cursor_x > (cursor.x_ofs + visible_width)) { cursor.x_ofs = cursor_x - visible_width + 1; + } - if (cursor_x < cursor.x_ofs) + if (cursor_x < cursor.x_ofs) { cursor.x_ofs = cursor_x; + } } else { cursor.x_ofs = 0; } @@ -4368,18 +4341,18 @@ void TextEdit::update_cursor_wrap_offset() { } bool TextEdit::line_wraps(int line) const { - ERR_FAIL_INDEX_V(line, text.size(), 0); - if (!is_wrap_enabled()) + if (!is_wrap_enabled()) { return false; + } return text.get_line_width(line) > wrap_at; } int TextEdit::times_line_wraps(int line) const { - ERR_FAIL_INDEX_V(line, text.size(), 0); - if (!line_wraps(line)) + if (!line_wraps(line)) { return 0; + } int wrap_amount = text.get_line_wrap_amount(line); if (wrap_amount == -1) { @@ -4393,7 +4366,6 @@ int TextEdit::times_line_wraps(int line) const { } Vector<String> TextEdit::get_wrap_rows_text(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), Vector<String>()); Vector<String> lines; @@ -4466,16 +4438,15 @@ Vector<String> TextEdit::get_wrap_rows_text(int p_line) const { } int TextEdit::get_cursor_wrap_index() const { - return get_line_wrap_index_at_col(cursor.line, cursor.column); } int TextEdit::get_line_wrap_index_at_col(int p_line, int p_column) const { - ERR_FAIL_INDEX_V(p_line, text.size(), 0); - if (!line_wraps(p_line)) + if (!line_wraps(p_line)) { return 0; + } // Loop through wraps in the line text until we get to the column. int wrap_index = 0; @@ -4485,43 +4456,50 @@ int TextEdit::get_line_wrap_index_at_col(int p_line, int p_column) const { wrap_index = i; String s = rows[wrap_index]; col += s.length(); - if (col > p_column) + if (col > p_column) { break; + } } return wrap_index; } void TextEdit::cursor_set_column(int p_col, bool p_adjust_viewport) { - if (p_col < 0) + if (p_col < 0) { p_col = 0; + } cursor.column = p_col; - if (cursor.column > get_line(cursor.line).length()) + if (cursor.column > get_line(cursor.line).length()) { cursor.column = get_line(cursor.line).length(); + } cursor.last_fit_x = get_column_x_offset_for_line(cursor.column, cursor.line); - if (p_adjust_viewport) + if (p_adjust_viewport) { adjust_viewport_to_cursor(); + } if (!cursor_changed_dirty) { - if (is_inside_tree()) + if (is_inside_tree()) { MessageQueue::get_singleton()->push_call(this, "_cursor_changed_emit"); + } cursor_changed_dirty = true; } } void TextEdit::cursor_set_line(int p_row, bool p_adjust_viewport, bool p_can_be_hidden, int p_wrap_index) { - - if (setting_row) + if (setting_row) { return; + } setting_row = true; - if (p_row < 0) + if (p_row < 0) { p_row = 0; + } - if (p_row >= text.size()) + if (p_row >= text.size()) { p_row = text.size() - 1; + } if (!p_can_be_hidden) { if (is_line_hidden(CLAMP(p_row, 0, text.size() - 1))) { @@ -4547,30 +4525,31 @@ void TextEdit::cursor_set_line(int p_row, bool p_adjust_viewport, bool p_can_be_ for (int i = 0; i < p_wrap_index + 1; i++) { row_end_col += rows[i].length(); } - if (n_col >= row_end_col) + if (n_col >= row_end_col) { n_col -= 1; + } } cursor.column = n_col; - if (p_adjust_viewport) + if (p_adjust_viewport) { adjust_viewport_to_cursor(); + } setting_row = false; if (!cursor_changed_dirty) { - if (is_inside_tree()) + if (is_inside_tree()) { MessageQueue::get_singleton()->push_call(this, "_cursor_changed_emit"); + } cursor_changed_dirty = true; } } int TextEdit::cursor_get_column() const { - return cursor.column; } int TextEdit::cursor_get_line() const { - return cursor.line; } @@ -4624,14 +4603,14 @@ void TextEdit::_v_scroll_input() { } void TextEdit::_scroll_moved(double p_to_val) { - - if (updating_scrolls) + if (updating_scrolls) { return; + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { cursor.x_ofs = h_scroll->get_value(); + } if (v_scroll->is_visible_in_tree()) { - // Set line ofs and wrap ofs. int v_scroll_i = floor(get_v_scroll()); int sc = 0; @@ -4640,8 +4619,9 @@ void TextEdit::_scroll_moved(double p_to_val) { if (!is_line_hidden(n_line)) { sc++; sc += times_line_wraps(n_line); - if (sc > v_scroll_i) + if (sc > v_scroll_i) { break; + } } } n_line = MIN(n_line, text.size() - 1); @@ -4656,27 +4636,26 @@ void TextEdit::_scroll_moved(double p_to_val) { } int TextEdit::get_row_height() const { - return cache.font->get_height() + cache.line_spacing; } int TextEdit::get_char_pos_for_line(int p_px, int p_line, int p_wrap_index) const { - ERR_FAIL_INDEX_V(p_line, text.size(), 0); if (line_wraps(p_line)) { - int line_wrap_amount = times_line_wraps(p_line); int wrap_offset_px = get_indent_level(p_line) * cache.font->get_char_size(' ').width; if (wrap_offset_px >= wrap_at) { wrap_offset_px = 0; } - if (p_wrap_index > line_wrap_amount) + if (p_wrap_index > line_wrap_amount) { p_wrap_index = line_wrap_amount; - if (p_wrap_index > 0) + } + if (p_wrap_index > 0) { p_px -= wrap_offset_px; - else + } else { p_wrap_index = 0; + } Vector<String> rows = get_wrap_rows_text(p_line); int c_pos = get_char_pos_for(p_px, rows[p_wrap_index]); for (int i = 0; i < p_wrap_index; i++) { @@ -4686,17 +4665,14 @@ int TextEdit::get_char_pos_for_line(int p_px, int p_line, int p_wrap_index) cons return c_pos; } else { - return get_char_pos_for(p_px, text[p_line]); } } int TextEdit::get_column_x_offset_for_line(int p_char, int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), 0); if (line_wraps(p_line)) { - int n_char = p_char; int col = 0; Vector<String> rows = get_wrap_rows_text(p_line); @@ -4705,8 +4681,9 @@ int TextEdit::get_column_x_offset_for_line(int p_char, int p_line) const { wrap_index = i; String s = rows[wrap_index]; col += s.length(); - if (col > p_char) + if (col > p_char) { break; + } n_char -= s.length(); } int px = get_column_x_offset(n_char, rows[wrap_index]); @@ -4715,27 +4692,26 @@ int TextEdit::get_column_x_offset_for_line(int p_char, int p_line) const { if (wrap_offset_px >= wrap_at) { wrap_offset_px = 0; } - if (wrap_index != 0) + if (wrap_index != 0) { px += wrap_offset_px; + } return px; } else { - return get_column_x_offset(p_char, text[p_line]); } } int TextEdit::get_char_pos_for(int p_px, String p_str) const { - int px = 0; int c = 0; while (c < p_str.length()) { - int w = text.get_char_width(p_str[c], p_str[c + 1], px); - if (p_px < (px + w / 2)) + if (p_px < (px + w / 2)) { break; + } px += w; c++; } @@ -4744,13 +4720,12 @@ int TextEdit::get_char_pos_for(int p_px, String p_str) const { } int TextEdit::get_column_x_offset(int p_char, String p_str) const { - int px = 0; for (int i = 0; i < p_char; i++) { - - if (i >= p_str.length()) + if (i >= p_str.length()) { break; + } px += text.get_char_width(p_str[i], p_str[i + 1], px); } @@ -4759,9 +4734,7 @@ int TextEdit::get_column_x_offset(int p_char, String p_str) const { } void TextEdit::insert_text_at_cursor(const String &p_text) { - if (selection.active) { - cursor_set_line(selection.from_line); cursor_set_column(selection.from_column); @@ -4775,15 +4748,15 @@ void TextEdit::insert_text_at_cursor(const String &p_text) { } Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const { - if (highlighted_word != String()) + if (highlighted_word != String()) { return CURSOR_POINTING_HAND; + } int gutter = cache.style_normal->get_margin(MARGIN_LEFT) + cache.line_number_w + cache.breakpoint_gutter_width + cache.fold_gutter_width + cache.info_gutter_width; if ((completion_active && completion_rect.has_point(p_pos))) { return CURSOR_ARROW; } if (p_pos.x < gutter) { - int row, col; _get_mouse_pos(p_pos, row, col); int left_margin = cache.style_normal->get_margin(MARGIN_LEFT); @@ -4804,10 +4777,11 @@ Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const { // Fold icon. if (draw_fold_gutter && p_pos.x > gutter_left + cache.line_number_w - 6 && p_pos.x <= gutter_left + cache.line_number_w + cache.fold_gutter_width - 3) { - if (is_folded(row) || can_fold(row)) + if (is_folded(row) || can_fold(row)) { return CURSOR_POINTING_HAND; - else + } else { return CURSOR_ARROW; + } } return CURSOR_ARROW; @@ -4833,7 +4807,6 @@ Control::CursorShape TextEdit::get_cursor_shape(const Point2 &p_pos) const { } void TextEdit::set_text(String p_text) { - setting_text = true; if (!undo_enabled) { _clear(); @@ -4862,72 +4835,67 @@ String TextEdit::get_text() { String longthing; int len = text.size(); for (int i = 0; i < len; i++) { - longthing += text[i]; - if (i != len - 1) + if (i != len - 1) { longthing += "\n"; + } } return longthing; }; String TextEdit::get_text_for_lookup_completion() { - int row, col; _get_mouse_pos(get_local_mouse_position(), row, col); String longthing; int len = text.size(); for (int i = 0; i < len; i++) { - if (i == row) { longthing += text[i].substr(0, col); longthing += String::chr(0xFFFF); // Not unicode, represents the cursor. longthing += text[i].substr(col, text[i].size()); } else { - longthing += text[i]; } - if (i != len - 1) + if (i != len - 1) { longthing += "\n"; + } } return longthing; } String TextEdit::get_text_for_completion() { - String longthing; int len = text.size(); for (int i = 0; i < len; i++) { - if (i == cursor.line) { longthing += text[i].substr(0, cursor.column); longthing += String::chr(0xFFFF); // Not unicode, represents the cursor. longthing += text[i].substr(cursor.column, text[i].size()); } else { - longthing += text[i]; } - if (i != len - 1) + if (i != len - 1) { longthing += "\n"; + } } return longthing; }; String TextEdit::get_line(int line) const { - - if (line < 0 || line >= text.size()) + if (line < 0 || line >= text.size()) { return ""; + } return text[line]; }; void TextEdit::_clear() { - clear_undo_history(); text.clear(); cursor.column = 0; @@ -4940,16 +4908,15 @@ void TextEdit::_clear() { } void TextEdit::clear() { - setting_text = true; _clear(); setting_text = false; }; void TextEdit::set_readonly(bool p_readonly) { - - if (readonly == p_readonly) + if (readonly == p_readonly) { return; + } readonly = p_readonly; _generate_context_menu(); @@ -4984,27 +4951,22 @@ void TextEdit::set_readonly(bool p_readonly) { } bool TextEdit::is_readonly() const { - return readonly; } void TextEdit::set_wrap_enabled(bool p_wrap_enabled) { - wrap_enabled = p_wrap_enabled; } bool TextEdit::is_wrap_enabled() const { - return wrap_enabled; } void TextEdit::set_max_chars(int p_max_chars) { - max_chars = p_max_chars; } int TextEdit::get_max_chars() const { - return max_chars; } @@ -5027,7 +4989,6 @@ void TextEdit::_toggle_draw_caret() { } void TextEdit::_update_caches() { - cache.style_normal = get_theme_stylebox("normal"); cache.style_focus = get_theme_stylebox("focus"); cache.style_readonly = get_theme_stylebox("read_only"); @@ -5095,7 +5056,6 @@ void TextEdit::_set_syntax_highlighting(SyntaxHighlighter *p_syntax_highlighter) } int TextEdit::_is_line_in_region(int p_line) { - // Do we have in cache? if (color_region_cache.has(p_line)) { return color_region_cache[p_line]; @@ -5153,7 +5113,6 @@ Map<int, TextEdit::Text::ColorRegionInfo> TextEdit::_get_line_color_region_info( } void TextEdit::clear_colors() { - keywords.clear(); member_keywords.clear(); color_regions.clear(); @@ -5164,7 +5123,6 @@ void TextEdit::clear_colors() { } void TextEdit::add_keyword_color(const String &p_keyword, const Color &p_color) { - keywords[p_keyword] = p_color; syntax_highlighting_cache.clear(); update(); @@ -5175,13 +5133,11 @@ bool TextEdit::has_keyword_color(String p_keyword) const { } Color TextEdit::get_keyword_color(String p_keyword) const { - ERR_FAIL_COND_V(!keywords.has(p_keyword), Color()); return keywords[p_keyword]; } void TextEdit::add_color_region(const String &p_begin_key, const String &p_end_key, const Color &p_color, bool p_line_only) { - color_regions.push_back(ColorRegion(p_begin_key, p_end_key, p_color, p_line_only)); syntax_highlighting_cache.clear(); text.clear_width_cache(); @@ -5209,13 +5165,11 @@ void TextEdit::clear_member_keywords() { } void TextEdit::set_syntax_coloring(bool p_enabled) { - syntax_coloring = p_enabled; update(); } bool TextEdit::is_syntax_coloring_enabled() const { - return syntax_coloring; } @@ -5224,9 +5178,7 @@ void TextEdit::set_auto_indent(bool p_auto_indent) { } void TextEdit::cut() { - if (!selection.active) { - String clipboard = text[cursor.line]; DisplayServer::get_singleton()->clipboard_set(clipboard); cursor_set_line(cursor.line); @@ -5244,7 +5196,6 @@ void TextEdit::cut() { cut_copy_line = clipboard; } else { - String clipboard = _base_get_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column); DisplayServer::get_singleton()->clipboard_set(clipboard); @@ -5260,11 +5211,8 @@ void TextEdit::cut() { } void TextEdit::copy() { - if (!selection.active) { - if (text[cursor.line].length() != 0) { - String clipboard = _base_get_text(cursor.line, 0, cursor.line, text[cursor.line].length()); DisplayServer::get_singleton()->clipboard_set(clipboard); cut_copy_line = clipboard; @@ -5277,12 +5225,10 @@ void TextEdit::copy() { } void TextEdit::paste() { - String clipboard = DisplayServer::get_singleton()->clipboard_get(); begin_complex_operation(); if (selection.active) { - selection.active = false; selection.selecting_mode = Selection::MODE_NONE; _remove_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column); @@ -5290,7 +5236,6 @@ void TextEdit::paste() { cursor_set_column(selection.from_column); } else if (!cut_copy_line.empty() && cut_copy_line == clipboard) { - cursor_set_column(0); String ins = "\n"; clipboard += ins; @@ -5303,11 +5248,13 @@ void TextEdit::paste() { } void TextEdit::select_all() { - if (!selecting_enabled) + if (!selecting_enabled) { return; + } - if (text.size() == 1 && text[0].length() == 0) + if (text.size() == 1 && text[0].length() == 0) { return; + } selection.active = true; selection.from_line = 0; selection.from_column = 0; @@ -5323,32 +5270,38 @@ void TextEdit::select_all() { } void TextEdit::deselect() { - selection.active = false; update(); } void TextEdit::select(int p_from_line, int p_from_column, int p_to_line, int p_to_column) { - if (!selecting_enabled) + if (!selecting_enabled) { return; + } - if (p_from_line < 0) + if (p_from_line < 0) { p_from_line = 0; - else if (p_from_line >= text.size()) + } else if (p_from_line >= text.size()) { p_from_line = text.size() - 1; - if (p_from_column >= text[p_from_line].length()) + } + if (p_from_column >= text[p_from_line].length()) { p_from_column = text[p_from_line].length(); - if (p_from_column < 0) + } + if (p_from_column < 0) { p_from_column = 0; + } - if (p_to_line < 0) + if (p_to_line < 0) { p_to_line = 0; - else if (p_to_line >= text.size()) + } else if (p_to_line >= text.size()) { p_to_line = text.size() - 1; - if (p_to_column >= text[p_to_line].length()) + } + if (p_to_column >= text[p_to_line].length()) { p_to_column = text[p_to_line].length(); - if (p_to_column < 0) + } + if (p_to_column < 0) { p_to_column = 0; + } selection.from_line = p_from_line; selection.from_column = p_from_column; @@ -5358,89 +5311,86 @@ void TextEdit::select(int p_from_line, int p_from_column, int p_to_line, int p_t selection.active = true; if (selection.from_line == selection.to_line) { - if (selection.from_column == selection.to_column) { - selection.active = false; } else if (selection.from_column > selection.to_column) { - selection.shiftclick_left = false; SWAP(selection.from_column, selection.to_column); } else { - selection.shiftclick_left = true; } } else if (selection.from_line > selection.to_line) { - selection.shiftclick_left = false; SWAP(selection.from_line, selection.to_line); SWAP(selection.from_column, selection.to_column); } else { - selection.shiftclick_left = true; } update(); } + void TextEdit::swap_lines(int line1, int line2) { String tmp = get_line(line1); String tmp2 = get_line(line2); set_line(line2, tmp); set_line(line1, tmp2); } -bool TextEdit::is_selection_active() const { +bool TextEdit::is_selection_active() const { return selection.active; } -int TextEdit::get_selection_from_line() const { +int TextEdit::get_selection_from_line() const { ERR_FAIL_COND_V(!selection.active, -1); return selection.from_line; } -int TextEdit::get_selection_from_column() const { +int TextEdit::get_selection_from_column() const { ERR_FAIL_COND_V(!selection.active, -1); return selection.from_column; } -int TextEdit::get_selection_to_line() const { +int TextEdit::get_selection_to_line() const { ERR_FAIL_COND_V(!selection.active, -1); return selection.to_line; } -int TextEdit::get_selection_to_column() const { +int TextEdit::get_selection_to_column() const { ERR_FAIL_COND_V(!selection.active, -1); return selection.to_column; } String TextEdit::get_selection_text() const { - - if (!selection.active) + if (!selection.active) { return ""; + } return _base_get_text(selection.from_line, selection.from_column, selection.to_line, selection.to_column); } String TextEdit::get_word_under_cursor() const { - int prev_cc = cursor.column; while (prev_cc > 0) { bool is_char = _is_text_char(text[cursor.line][prev_cc - 1]); - if (!is_char) + if (!is_char) { break; + } --prev_cc; } int next_cc = cursor.column; while (next_cc < text[cursor.line].length()) { bool is_char = _is_text_char(text[cursor.line][next_cc]); - if (!is_char) + if (!is_char) { break; + } ++next_cc; } - if (prev_cc == cursor.column || next_cc == cursor.column) + if (prev_cc == cursor.column || next_cc == cursor.column) { return ""; + } return text[cursor.line].substr(prev_cc, next_cc - prev_cc); } @@ -5500,7 +5450,6 @@ int TextEdit::_get_column_pos_of_word(const String &p_key, const String &p_searc } Vector<int> TextEdit::_search_bind(const String &p_key, uint32_t p_search_flags, int p_from_line, int p_from_column) const { - int col, line; if (search(p_key, p_search_flags, p_from_line, p_from_column, line, col)) { Vector<int> result; @@ -5510,15 +5459,14 @@ Vector<int> TextEdit::_search_bind(const String &p_key, uint32_t p_search_flags, return result; } else { - return Vector<int>(); } } bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_line, int p_from_column, int &r_line, int &r_column) const { - - if (p_key.length() == 0) + if (p_key.length() == 0) { return false; + } ERR_FAIL_INDEX_V(p_from_line, text.size(), false); ERR_FAIL_INDEX_V(p_from_column, text[p_from_line].length() + 1, false); @@ -5528,7 +5476,6 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l int pos = -1; for (int i = 0; i < text.size() + 1; i++) { - if (line < 0) { line = text.size() - 1; } @@ -5539,7 +5486,6 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l String text_line = text[line]; int from_column = 0; if (line == p_from_line) { - if (i == text.size()) { // Wrapped. @@ -5550,15 +5496,15 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l } } else { - from_column = p_from_column; } } else { - if (p_search_flags & SEARCH_BACKWARDS) + if (p_search_flags & SEARCH_BACKWARDS) { from_column = text_line.length() - 1; - else + } else { from_column = 0; + } } pos = -1; @@ -5567,7 +5513,6 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l int last_pos = -1; while (true) { - if (p_search_flags & SEARCH_BACKWARDS) { while ((last_pos = (p_search_flags & SEARCH_MATCH_CASE) ? text_line.rfind(p_key, pos_from) : text_line.rfindn(p_key, pos_from)) != -1) { if (last_pos <= from_column) { @@ -5593,10 +5538,11 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l if (pos != -1 && (p_search_flags & SEARCH_WHOLE_WORDS)) { // Validate for whole words. - if (pos > 0 && _is_text_char(text_line[pos - 1])) + if (pos > 0 && _is_text_char(text_line[pos - 1])) { is_match = false; - else if (pos + p_key.length() < text_line.length() && _is_text_char(text_line[pos + p_key.length()])) + } else if (pos + p_key.length() < text_line.length() && _is_text_char(text_line[pos + p_key.length()])) { is_match = false; + } } if (pos_from == -1) { @@ -5611,13 +5557,15 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l pos = -1; } - if (pos != -1) + if (pos != -1) { break; + } - if (p_search_flags & SEARCH_BACKWARDS) + if (p_search_flags & SEARCH_BACKWARDS) { line--; - else + } else { line++; + } } if (pos == -1) { @@ -5633,19 +5581,16 @@ bool TextEdit::search(const String &p_key, uint32_t p_search_flags, int p_from_l } void TextEdit::_cursor_changed_emit() { - emit_signal("cursor_changed"); cursor_changed_dirty = false; } void TextEdit::_text_changed_emit() { - emit_signal("text_changed"); text_changed_dirty = false; } void TextEdit::set_line_as_marked(int p_line, bool p_marked) { - ERR_FAIL_INDEX(p_line, text.size()); text.set_marked(p_line, p_marked); update(); @@ -5674,72 +5619,69 @@ void TextEdit::clear_executing_line() { } bool TextEdit::is_line_set_as_bookmark(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), false); return text.is_bookmark(p_line); } void TextEdit::set_line_as_bookmark(int p_line, bool p_bookmark) { - ERR_FAIL_INDEX(p_line, text.size()); text.set_bookmark(p_line, p_bookmark); update(); } void TextEdit::get_bookmarks(List<int> *p_bookmarks) const { - for (int i = 0; i < text.size(); i++) { - if (text.is_bookmark(i)) + if (text.is_bookmark(i)) { p_bookmarks->push_back(i); + } } } Array TextEdit::get_bookmarks_array() const { - Array arr; for (int i = 0; i < text.size(); i++) { - if (text.is_bookmark(i)) + if (text.is_bookmark(i)) { arr.append(i); + } } return arr; } bool TextEdit::is_line_set_as_breakpoint(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), false); return text.is_breakpoint(p_line); } void TextEdit::set_line_as_breakpoint(int p_line, bool p_breakpoint) { - ERR_FAIL_INDEX(p_line, text.size()); text.set_breakpoint(p_line, p_breakpoint); update(); } void TextEdit::get_breakpoints(List<int> *p_breakpoints) const { - for (int i = 0; i < text.size(); i++) { - if (text.is_breakpoint(i)) + if (text.is_breakpoint(i)) { p_breakpoints->push_back(i); + } } } Array TextEdit::get_breakpoints_array() const { - Array arr; for (int i = 0; i < text.size(); i++) { - if (text.is_breakpoint(i)) + if (text.is_breakpoint(i)) { arr.append(i); + } } return arr; } void TextEdit::remove_breakpoints() { for (int i = 0; i < text.size(); i++) { - if (text.is_breakpoint(i)) + if (text.is_breakpoint(i)) { /* Should "breakpoint_toggled" be fired when breakpoints are removed this way? */ text.set_breakpoint(i, false); + } } } @@ -5755,21 +5697,19 @@ void TextEdit::clear_info_icons() { } void TextEdit::set_line_as_hidden(int p_line, bool p_hidden) { - ERR_FAIL_INDEX(p_line, text.size()); - if (is_hiding_enabled() || !p_hidden) + if (is_hiding_enabled() || !p_hidden) { text.set_hidden(p_line, p_hidden); + } update(); } bool TextEdit::is_line_hidden(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), false); return text.is_hidden(p_line); } void TextEdit::fold_all_lines() { - for (int i = 0; i < text.size(); i++) { fold_line(i); } @@ -5778,7 +5718,6 @@ void TextEdit::fold_all_lines() { } void TextEdit::unhide_all_lines() { - for (int i = 0; i < text.size(); i++) { text.set_hidden(i, false); } @@ -5787,12 +5726,12 @@ void TextEdit::unhide_all_lines() { } int TextEdit::num_lines_from(int p_line_from, int visible_amount) const { - // Returns the number of lines (hidden and unhidden) from p_line_from to (p_line_from + visible_amount of unhidden lines). ERR_FAIL_INDEX_V(p_line_from, text.size(), ABS(visible_amount)); - if (!is_hiding_enabled()) + if (!is_hiding_enabled()) { return ABS(visible_amount); + } int num_visible = 0; int num_total = 0; @@ -5802,8 +5741,9 @@ int TextEdit::num_lines_from(int p_line_from, int visible_amount) const { if (!is_line_hidden(i)) { num_visible++; } - if (num_visible >= visible_amount) + if (num_visible >= visible_amount) { break; + } } } else { visible_amount = ABS(visible_amount); @@ -5812,22 +5752,23 @@ int TextEdit::num_lines_from(int p_line_from, int visible_amount) const { if (!is_line_hidden(i)) { num_visible++; } - if (num_visible >= visible_amount) + if (num_visible >= visible_amount) { break; + } } } return num_total; } int TextEdit::num_lines_from_rows(int p_line_from, int p_wrap_index_from, int visible_amount, int &wrap_index) const { - // Returns the number of lines (hidden and unhidden) from (p_line_from + p_wrap_index_from) row to (p_line_from + visible_amount of unhidden and wrapped rows). // Wrap index is set to the wrap index of the last line. wrap_index = 0; ERR_FAIL_INDEX_V(p_line_from, text.size(), ABS(visible_amount)); - if (!is_hiding_enabled() && !is_wrap_enabled()) + if (!is_hiding_enabled() && !is_wrap_enabled()) { return ABS(visible_amount); + } int num_visible = 0; int num_total = 0; @@ -5843,8 +5784,9 @@ int TextEdit::num_lines_from_rows(int p_line_from, int p_wrap_index_from, int vi num_visible++; num_visible += times_line_wraps(i); } - if (num_visible >= visible_amount) + if (num_visible >= visible_amount) { break; + } } wrap_index = times_line_wraps(MIN(i, text.size() - 1)) - (num_visible - visible_amount); } else { @@ -5857,8 +5799,9 @@ int TextEdit::num_lines_from_rows(int p_line_from, int p_wrap_index_from, int vi num_visible++; num_visible += times_line_wraps(i); } - if (num_visible >= visible_amount) + if (num_visible >= visible_amount) { break; + } } wrap_index = (num_visible - visible_amount); } @@ -5867,10 +5810,10 @@ int TextEdit::num_lines_from_rows(int p_line_from, int p_wrap_index_from, int vi } int TextEdit::get_last_unhidden_line() const { - // Returns the last line in the text that is not hidden. - if (!is_hiding_enabled()) + if (!is_hiding_enabled()) { return text.size() - 1; + } int last_line; for (last_line = text.size() - 1; last_line > 0; last_line--) { @@ -5882,7 +5825,6 @@ int TextEdit::get_last_unhidden_line() const { } int TextEdit::get_indent_level(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), 0); // Counts number of tabs and spaces before line starts. @@ -5902,7 +5844,6 @@ int TextEdit::get_indent_level(int p_line) const { } bool TextEdit::is_line_comment(int p_line) const { - // Checks to see if this line is the start of a comment. ERR_FAIL_INDEX_V(p_line, text.size(), false); @@ -5923,26 +5864,32 @@ bool TextEdit::is_line_comment(int p_line) const { } bool TextEdit::can_fold(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), false); - if (!is_hiding_enabled()) + if (!is_hiding_enabled()) { return false; - if (p_line + 1 >= text.size()) + } + if (p_line + 1 >= text.size()) { return false; - if (text[p_line].strip_edges().size() == 0) + } + if (text[p_line].strip_edges().size() == 0) { return false; - if (is_folded(p_line)) + } + if (is_folded(p_line)) { return false; - if (is_line_hidden(p_line)) + } + if (is_line_hidden(p_line)) { return false; - if (is_line_comment(p_line)) + } + if (is_line_comment(p_line)) { return false; + } int start_indent = get_indent_level(p_line); for (int i = p_line + 1; i < text.size(); i++) { - if (text[i].strip_edges().size() == 0) + if (text[i].strip_edges().size() == 0) { continue; + } int next_indent = get_indent_level(i); if (is_line_comment(i)) { continue; @@ -5957,10 +5904,10 @@ bool TextEdit::can_fold(int p_line) const { } bool TextEdit::is_folded(int p_line) const { - ERR_FAIL_INDEX_V(p_line, text.size(), false); - if (p_line + 1 >= text.size()) + if (p_line + 1 >= text.size()) { return false; + } return !is_line_hidden(p_line) && is_line_hidden(p_line + 1); } @@ -5976,12 +5923,13 @@ Vector<int> TextEdit::get_folded_lines() const { } void TextEdit::fold_line(int p_line) { - ERR_FAIL_INDEX(p_line, text.size()); - if (!is_hiding_enabled()) + if (!is_hiding_enabled()) { return; - if (!can_fold(p_line)) + } + if (!can_fold(p_line)) { return; + } // Hide lines below this one. int start_indent = get_indent_level(p_line); @@ -6022,15 +5970,16 @@ void TextEdit::fold_line(int p_line) { } void TextEdit::unfold_line(int p_line) { - ERR_FAIL_INDEX(p_line, text.size()); - if (!is_folded(p_line) && !is_line_hidden(p_line)) + if (!is_folded(p_line) && !is_line_hidden(p_line)) { return; + } int fold_start; for (fold_start = p_line; fold_start > 0; fold_start--) { - if (is_folded(fold_start)) + if (is_folded(fold_start)) { break; + } } fold_start = is_folded(fold_start) ? fold_start : p_line; @@ -6046,45 +5995,42 @@ void TextEdit::unfold_line(int p_line) { } void TextEdit::toggle_fold_line(int p_line) { - ERR_FAIL_INDEX(p_line, text.size()); - if (!is_folded(p_line)) + if (!is_folded(p_line)) { fold_line(p_line); - else + } else { unfold_line(p_line); + } } int TextEdit::get_line_count() const { - return text.size(); } void TextEdit::_do_text_op(const TextOperation &p_op, bool p_reverse) { - ERR_FAIL_COND(p_op.type == TextOperation::TYPE_NONE); bool insert = p_op.type == TextOperation::TYPE_INSERT; - if (p_reverse) + if (p_reverse) { insert = !insert; + } if (insert) { - int check_line; int check_column; _base_insert_text(p_op.from_line, p_op.from_column, p_op.text, check_line, check_column); ERR_FAIL_COND(check_line != p_op.to_line); // BUG. ERR_FAIL_COND(check_column != p_op.to_column); // BUG. } else { - _base_remove_text(p_op.from_line, p_op.from_column, p_op.to_line, p_op.to_column); } } void TextEdit::_clear_redo() { - - if (undo_stack_pos == nullptr) + if (undo_stack_pos == nullptr) { return; // Nothing to clear. + } _push_current_op(); @@ -6096,27 +6042,28 @@ void TextEdit::_clear_redo() { } void TextEdit::undo() { - _push_current_op(); if (undo_stack_pos == nullptr) { - - if (!undo_stack.size()) + if (!undo_stack.size()) { return; // Nothing to undo. + } undo_stack_pos = undo_stack.back(); - } else if (undo_stack_pos == undo_stack.front()) + } else if (undo_stack_pos == undo_stack.front()) { return; // At the bottom of the undo stack. - else + } else { undo_stack_pos = undo_stack_pos->prev(); + } deselect(); TextOperation op = undo_stack_pos->get(); _do_text_op(op, true); - if (op.type != TextOperation::TYPE_INSERT && (op.from_line != op.to_line || op.to_column != op.from_column + 1)) + if (op.type != TextOperation::TYPE_INSERT && (op.from_line != op.to_line || op.to_column != op.from_column + 1)) { select(op.from_line, op.from_column, op.to_line, op.to_column); + } current_op.version = op.prev_version; if (undo_stack_pos->get().chain_backward) { @@ -6145,11 +6092,11 @@ void TextEdit::undo() { } void TextEdit::redo() { - _push_current_op(); - if (undo_stack_pos == nullptr) + if (undo_stack_pos == nullptr) { return; // Nothing to do. + } deselect(); @@ -6157,15 +6104,15 @@ void TextEdit::redo() { _do_text_op(op, false); current_op.version = op.version; if (undo_stack_pos->get().chain_forward) { - while (true) { ERR_BREAK(!undo_stack_pos->next()); undo_stack_pos = undo_stack_pos->next(); op = undo_stack_pos->get(); _do_text_op(op, false); current_op.version = op.version; - if (undo_stack_pos->get().chain_backward) + if (undo_stack_pos->get().chain_backward) { break; + } } } @@ -6177,7 +6124,6 @@ void TextEdit::redo() { } void TextEdit::clear_undo_history() { - saved_version = 0; current_op.type = TextOperation::TYPE_NONE; undo_stack_pos = nullptr; @@ -6190,7 +6136,6 @@ void TextEdit::begin_complex_operation() { } void TextEdit::end_complex_operation() { - _push_current_op(); ERR_FAIL_COND(undo_stack.size() == 0); @@ -6203,9 +6148,9 @@ void TextEdit::end_complex_operation() { } void TextEdit::_push_current_op() { - - if (current_op.type == TextOperation::TYPE_NONE) + if (current_op.type == TextOperation::TYPE_NONE) { return; // Nothing to do. + } if (next_operation_is_complex) { current_op.chain_forward = true; @@ -6244,28 +6189,23 @@ void TextEdit::set_indent_size(const int p_size) { } int TextEdit::get_indent_size() { - return indent_size; } void TextEdit::set_draw_tabs(bool p_draw) { - draw_tabs = p_draw; update(); } bool TextEdit::is_drawing_tabs() const { - return draw_tabs; } void TextEdit::set_draw_spaces(bool p_draw) { - draw_spaces = p_draw; } bool TextEdit::is_drawing_spaces() const { - return draw_spaces; } @@ -6295,19 +6235,17 @@ uint32_t TextEdit::get_version() const { } uint32_t TextEdit::get_saved_version() const { - return saved_version; } void TextEdit::tag_saved_version() { - saved_version = get_version(); } double TextEdit::get_scroll_pos_for_line(int p_line, int p_wrap_index) const { - - if (!is_wrap_enabled() && !is_hiding_enabled()) + if (!is_wrap_enabled() && !is_hiding_enabled()) { return p_line; + } // Count the number of visible lines up to this line. double new_line_scroll_pos = 0; @@ -6323,12 +6261,10 @@ double TextEdit::get_scroll_pos_for_line(int p_line, int p_wrap_index) const { } void TextEdit::set_line_as_first_visible(int p_line, int p_wrap_index) { - set_v_scroll(get_scroll_pos_for_line(p_line, p_wrap_index)); } void TextEdit::set_line_as_center_visible(int p_line, int p_wrap_index) { - int visible_rows = get_visible_rows(); int wi; int first_line = p_line - num_lines_from_rows(p_line, p_wrap_index, -visible_rows / 2, wi) + 1; @@ -6337,7 +6273,6 @@ void TextEdit::set_line_as_center_visible(int p_line, int p_wrap_index) { } void TextEdit::set_line_as_last_visible(int p_line, int p_wrap_index) { - int wi; int first_line = p_line - num_lines_from_rows(p_line, p_wrap_index, -get_visible_rows() - 1, wi) + 1; @@ -6345,12 +6280,10 @@ void TextEdit::set_line_as_last_visible(int p_line, int p_wrap_index) { } int TextEdit::get_first_visible_line() const { - return CLAMP(cursor.line_ofs, 0, text.size() - 1); } int TextEdit::get_last_visible_line() const { - int first_vis_line = get_first_visible_line(); int last_vis_line = 0; int wi; @@ -6360,7 +6293,6 @@ int TextEdit::get_last_visible_line() const { } int TextEdit::get_last_visible_line_wrap_index() const { - int first_vis_line = get_first_visible_line(); int wi; num_lines_from_rows(first_vis_line, cursor.wrap_ofs, get_visible_rows() + 1, wi); @@ -6368,7 +6300,6 @@ int TextEdit::get_last_visible_line_wrap_index() const { } double TextEdit::get_visible_rows_offset() const { - double total = _get_control_height(); total /= (double)get_row_height(); total = total - floor(total); @@ -6377,31 +6308,27 @@ double TextEdit::get_visible_rows_offset() const { } double TextEdit::get_v_scroll_offset() const { - double val = get_v_scroll() - floor(get_v_scroll()); return CLAMP(val, 0, 1); } double TextEdit::get_v_scroll() const { - return v_scroll->get_value(); } void TextEdit::set_v_scroll(double p_scroll) { - v_scroll->set_value(p_scroll); int max_v_scroll = v_scroll->get_max() - v_scroll->get_page(); - if (p_scroll >= max_v_scroll - 1.0) + if (p_scroll >= max_v_scroll - 1.0) { _scroll_moved(v_scroll->get_value()); + } } int TextEdit::get_h_scroll() const { - return h_scroll->get_value(); } void TextEdit::set_h_scroll(int p_scroll) { - if (p_scroll < 0) { p_scroll = 0; } @@ -6409,36 +6336,31 @@ void TextEdit::set_h_scroll(int p_scroll) { } void TextEdit::set_smooth_scroll_enabled(bool p_enable) { - v_scroll->set_smooth_scroll_enabled(p_enable); smooth_scroll_enabled = p_enable; } bool TextEdit::is_smooth_scroll_enabled() const { - return smooth_scroll_enabled; } void TextEdit::set_v_scroll_speed(float p_speed) { - v_scroll_speed = p_speed; } float TextEdit::get_v_scroll_speed() const { - return v_scroll_speed; } void TextEdit::set_completion(bool p_enabled, const Vector<String> &p_prefixes) { - completion_prefixes.clear(); completion_enabled = p_enabled; - for (int i = 0; i < p_prefixes.size(); i++) + for (int i = 0; i < p_prefixes.size(); i++) { completion_prefixes.insert(p_prefixes[i]); + } } void TextEdit::_confirm_completion() { - begin_complex_operation(); _remove_text(cursor.line, cursor.column - completion_base.length(), cursor.line, cursor.column); @@ -6456,7 +6378,6 @@ void TextEdit::_confirm_completion() { } if (last_completion_char == '(') { - if (next_char == last_completion_char) { _base_remove_text(cursor.line, cursor.column - 1, cursor.line, cursor.column); } else if (auto_brace_completion_enabled) { @@ -6464,7 +6385,6 @@ void TextEdit::_confirm_completion() { cursor.column--; } } else if (last_completion_char == ')' && next_char == '(') { - _base_remove_text(cursor.line, cursor.column - 2, cursor.line, cursor.column); if (line[cursor.column + 1] != ')') { cursor.column--; @@ -6481,15 +6401,14 @@ void TextEdit::_confirm_completion() { } void TextEdit::_cancel_code_hint() { - completion_hint = ""; update(); } void TextEdit::_cancel_completion() { - - if (!completion_active) + if (!completion_active) { return; + } completion_active = false; completion_forced = false; @@ -6497,12 +6416,10 @@ void TextEdit::_cancel_completion() { } static bool _is_completable(CharType c) { - return !_is_symbol(c) || c == '"' || c == '\''; } void TextEdit::_update_completion_candidates() { - String l = text[cursor.line]; int cofs = CLAMP(cursor.column, 0, l.length()); @@ -6518,8 +6435,9 @@ void TextEdit::_update_completion_candidates() { while (c >= 0) { if (l[c] == '"' || l[c] == '\'') { inquote = !inquote; - if (first_quote == -1) + if (first_quote == -1) { first_quote = c; + } restore_quotes = 0; } else if (restore_quotes == 0 && l[c] == '$') { restore_quotes = 1; @@ -6536,13 +6454,13 @@ void TextEdit::_update_completion_candidates() { // No completion here. cancel = true; } else if (inquote && first_quote != -1) { - s = l.substr(first_quote, cofs - first_quote); } else if (cofs > 0 && l[cofs - 1] == ' ') { int kofs = cofs - 1; String kw; - while (kofs >= 0 && l[kofs] == ' ') + while (kofs >= 0 && l[kofs] == ' ') { kofs--; + } while (kofs >= 0 && l[kofs] > 32 && _is_completable(l[kofs])) { kw = String::chr(l[kofs]) + kw; @@ -6552,11 +6470,11 @@ void TextEdit::_update_completion_candidates() { pre_keyword = keywords.has(kw); } else { - while (cofs > 0 && l[cofs - 1] > 32 && (l[cofs - 1] == '/' || _is_completable(l[cofs - 1]))) { s = String::chr(l[cofs - 1]) + s; - if (l[cofs - 1] == '\'' || l[cofs - 1] == '"' || l[cofs - 1] == '$') + if (l[cofs - 1] == '\'' || l[cofs - 1] == '"' || l[cofs - 1] == '$') { break; + } cofs--; } @@ -6569,11 +6487,13 @@ void TextEdit::_update_completion_candidates() { update(); bool prev_is_prefix = false; - if (cofs > 0 && completion_prefixes.has(String::chr(l[cofs - 1]))) + if (cofs > 0 && completion_prefixes.has(String::chr(l[cofs - 1]))) { prev_is_prefix = true; + } // Check with one space before prefix, to allow indent. - if (cofs > 1 && l[cofs - 1] == ' ' && completion_prefixes.has(String::chr(l[cofs - 2]))) + if (cofs > 1 && l[cofs - 1] == ' ' && completion_prefixes.has(String::chr(l[cofs - 2]))) { prev_is_prefix = true; + } if (cancel || (!pre_keyword && s == "" && (cofs == 0 || !prev_is_prefix))) { // None to complete, cancel. @@ -6610,7 +6530,6 @@ void TextEdit::_update_completion_candidates() { } else if (s.length() == 0) { completion_options.push_back(option); } else { - // This code works the same as: /* if (option.display.begins_with(s)) { @@ -6685,7 +6604,6 @@ void TextEdit::_update_completion_candidates() { } void TextEdit::query_code_comple() { - String l = text[cursor.line]; int ofs = CLAMP(cursor.column, 0, l.length()); @@ -6693,8 +6611,9 @@ void TextEdit::query_code_comple() { int c = ofs - 1; while (c >= 0) { - if (l[c] == '"' || l[c] == '\'') + if (l[c] == '"' || l[c] == '\'') { inquote = !inquote; + } c--; } @@ -6717,22 +6636,21 @@ void TextEdit::query_code_comple() { } if (!ignored) { - if (ofs > 0 && (inquote || _is_completable(l[ofs - 1]) || completion_prefixes.has(String::chr(l[ofs - 1])))) + if (ofs > 0 && (inquote || _is_completable(l[ofs - 1]) || completion_prefixes.has(String::chr(l[ofs - 1])))) { emit_signal("request_completion"); - else if (ofs > 1 && l[ofs - 1] == ' ' && completion_prefixes.has(String::chr(l[ofs - 2]))) // Make it work with a space too, it's good enough. + } else if (ofs > 1 && l[ofs - 1] == ' ' && completion_prefixes.has(String::chr(l[ofs - 2]))) { // Make it work with a space too, it's good enough. emit_signal("request_completion"); + } } } void TextEdit::set_code_hint(const String &p_hint) { - completion_hint = p_hint; completion_hint_offset = -0xFFFF; update(); } void TextEdit::code_complete(const List<ScriptCodeCompletionOption> &p_strings, bool p_forced) { - completion_sources = p_strings; completion_active = true; completion_forced = p_forced; @@ -6742,16 +6660,15 @@ void TextEdit::code_complete(const List<ScriptCodeCompletionOption> &p_strings, } String TextEdit::get_word_at_pos(const Vector2 &p_pos) const { - int row, col; _get_mouse_pos(p_pos, row, col); String s = text[row]; - if (s.length() == 0) + if (s.length() == 0) { return ""; + } int beg, end; if (select_word(s, col, beg, end)) { - bool inside_quotes = false; CharType selected_quote = '\0'; int qbegin = 0, qend = 0; @@ -6781,18 +6698,18 @@ String TextEdit::get_word_at_pos(const Vector2 &p_pos) const { } String TextEdit::get_tooltip(const Point2 &p_pos) const { - - if (!tooltip_obj) + if (!tooltip_obj) { return Control::get_tooltip(p_pos); + } int row, col; _get_mouse_pos(p_pos, row, col); String s = text[row]; - if (s.length() == 0) + if (s.length() == 0) { return Control::get_tooltip(p_pos); + } int beg, end; if (select_word(s, col, beg, end)) { - String tt = tooltip_obj->call(tooltip_func, s.substr(beg, end - beg), tooltip_ud); return tt; @@ -6802,15 +6719,15 @@ String TextEdit::get_tooltip(const Point2 &p_pos) const { } void TextEdit::set_tooltip_request_func(Object *p_obj, const StringName &p_function, const Variant &p_udata) { - tooltip_obj = p_obj; tooltip_func = p_function; tooltip_ud = p_udata; } void TextEdit::set_line(int line, String new_text) { - if (line < 0 || line > text.size()) + if (line < 0 || line > text.size()) { return; + } _remove_text(line, 0, line, text[line].length()); _insert_text(line, 0, new_text); if (cursor.line == line) { @@ -6840,13 +6757,11 @@ void TextEdit::insert_at(const String &p_text, int at) { } void TextEdit::set_show_line_numbers(bool p_show) { - line_numbers = p_show; update(); } void TextEdit::set_line_numbers_zero_padded(bool p_zero_padded) { - line_numbers_zero_padded = p_zero_padded; update(); } @@ -6952,8 +6867,9 @@ int TextEdit::get_minimap_width() const { } void TextEdit::set_hiding_enabled(bool p_enabled) { - if (!p_enabled) + if (!p_enabled) { unhide_all_lines(); + } hiding_enabled = p_enabled; update(); } @@ -6972,12 +6888,10 @@ bool TextEdit::is_highlight_current_line_enabled() const { } bool TextEdit::is_text_field() const { - return true; } void TextEdit::menu_option(int p_option) { - switch (p_option) { case MENU_CUT: { if (!readonly) { @@ -7015,12 +6929,10 @@ void TextEdit::set_highlighted_word(const String &new_word) { } void TextEdit::set_select_identifiers_on_hover(bool p_enable) { - select_identifiers_enabled = p_enable; } bool TextEdit::is_selecting_identifiers_on_hover_enabled() const { - return select_identifiers_enabled; } @@ -7041,8 +6953,9 @@ void TextEdit::set_shortcut_keys_enabled(bool p_enabled) { void TextEdit::set_selecting_enabled(bool p_enabled) { selecting_enabled = p_enabled; - if (!selecting_enabled) + if (!selecting_enabled) { deselect(); + } _generate_context_menu(); } @@ -7060,7 +6973,6 @@ PopupMenu *TextEdit::get_menu() const { } void TextEdit::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &TextEdit::_gui_input); ClassDB::bind_method(D_METHOD("_cursor_changed_emit"), &TextEdit::_cursor_changed_emit); ClassDB::bind_method(D_METHOD("_text_changed_emit"), &TextEdit::_text_changed_emit); @@ -7250,7 +7162,6 @@ void TextEdit::_bind_methods() { } TextEdit::TextEdit() { - setting_row = false; draw_tabs = false; draw_spaces = false; @@ -7496,10 +7407,10 @@ Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int } if (in_region == -1 && !in_keyword && is_char && !prev_is_char) { - int to = j; - while (to < str.length() && _is_text_char(str[to])) + while (to < str.length() && _is_text_char(str[to])) { to++; + } uint32_t hash = String::hash(&str[j], to - j); StrRange range(&str[j], to - j); @@ -7528,7 +7439,6 @@ Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int } if (!in_function_name && in_word && !in_keyword) { - int k = j; while (k < str.length() && !_is_symbol(str[k]) && str[k] != '\t' && str[k] != ' ') { k++; @@ -7560,18 +7470,19 @@ Map<int, TextEdit::HighlighterInfo> TextEdit::_get_line_syntax_highlighting(int in_member_variable = false; } - if (in_region >= 0) + if (in_region >= 0) { color = color_regions[in_region].color; - else if (in_keyword) + } else if (in_keyword) { color = keyword_color; - else if (in_member_variable) + } else if (in_member_variable) { color = cache.member_variable_color; - else if (in_function_name) + } else if (in_function_name) { color = cache.function_color; - else if (is_symbol) + } else if (is_symbol) { color = cache.symbol_color; - else if (is_number) + } else if (is_number) { color = cache.number_color; + } prev_is_char = is_char; prev_is_number = is_number; diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h index ac8eb5da1d..689199b6c2 100644 --- a/scene/gui/text_edit.h +++ b/scene/gui/text_edit.h @@ -39,7 +39,6 @@ class SyntaxHighlighter; class TextEdit : public Control { - GDCLASS(TextEdit, Control); public: @@ -48,7 +47,6 @@ public: }; struct ColorRegion { - Color color; String begin_key; String end_key; @@ -66,7 +64,6 @@ public: class Text { public: struct ColorRegionInfo { - int region; bool end; ColorRegionInfo() { @@ -168,7 +165,6 @@ private: } cursor; struct Selection { - enum Mode { MODE_NONE, @@ -207,7 +203,6 @@ private: } selection; struct Cache { - Ref<Texture2D> tab_icon; Ref<Texture2D> space_icon; Ref<Texture2D> can_fold_icon; @@ -256,7 +251,6 @@ private: int info_gutter_width; int minimap_width; Cache() { - row_height = 0; line_spacing = 0; line_number_w = 0; @@ -271,7 +265,6 @@ private: Map<int, Map<int, HighlighterInfo>> syntax_highlighting_cache; struct TextOperation { - enum Type { TYPE_NONE, TYPE_INSERT, diff --git a/scene/gui/texture_button.cpp b/scene/gui/texture_button.cpp index 5f2e4cf58e..6e86f0f299 100644 --- a/scene/gui/texture_button.cpp +++ b/scene/gui/texture_button.cpp @@ -33,33 +33,34 @@ #include <stdlib.h> Size2 TextureButton::get_minimum_size() const { - Size2 rscale = Control::get_minimum_size(); if (!expand) { if (normal.is_null()) { if (pressed.is_null()) { - if (hover.is_null()) - if (click_mask.is_null()) + if (hover.is_null()) { + if (click_mask.is_null()) { rscale = Size2(); - else + } else { rscale = click_mask->get_size(); - else + } + } else { rscale = hover->get_size(); - } else + } + } else { rscale = pressed->get_size(); + } - } else + } else { rscale = normal->get_size(); + } } return rscale.abs(); } bool TextureButton::has_point(const Point2 &p_point) const { - if (click_mask.is_valid()) { - Point2 point = p_point; Rect2 rect = Rect2(); Size2 mask_size = click_mask->get_size(); @@ -116,9 +117,7 @@ bool TextureButton::has_point(const Point2 &p_point) const { } void TextureButton::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_DRAW: { DrawMode draw_mode = get_draw_mode(); @@ -126,40 +125,44 @@ void TextureButton::_notification(int p_what) { switch (draw_mode) { case DRAW_NORMAL: { - - if (normal.is_valid()) + if (normal.is_valid()) { texdraw = normal; + } } break; case DRAW_HOVER_PRESSED: case DRAW_PRESSED: { - if (pressed.is_null()) { if (hover.is_null()) { - if (normal.is_valid()) + if (normal.is_valid()) { texdraw = normal; - } else + } + } else { texdraw = hover; + } - } else + } else { texdraw = pressed; + } } break; case DRAW_HOVER: { - if (hover.is_null()) { - if (pressed.is_valid() && is_pressed()) + if (pressed.is_valid() && is_pressed()) { texdraw = pressed; - else if (normal.is_valid()) + } else if (normal.is_valid()) { texdraw = normal; - } else + } + } else { texdraw = hover; + } } break; case DRAW_DISABLED: { - if (disabled.is_null()) { - if (normal.is_valid()) + if (normal.is_valid()) { texdraw = normal; - } else + } + } else { texdraw = disabled; + } } break; } @@ -232,7 +235,6 @@ void TextureButton::_notification(int p_what) { } void TextureButton::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_normal_texture", "texture"), &TextureButton::set_normal_texture); ClassDB::bind_method(D_METHOD("set_pressed_texture", "texture"), &TextureButton::set_pressed_texture); ClassDB::bind_method(D_METHOD("set_hover_texture", "texture"), &TextureButton::set_hover_texture); @@ -271,61 +273,56 @@ void TextureButton::_bind_methods() { } void TextureButton::set_normal_texture(const Ref<Texture2D> &p_normal) { - normal = p_normal; update(); minimum_size_changed(); } void TextureButton::set_pressed_texture(const Ref<Texture2D> &p_pressed) { - pressed = p_pressed; update(); } -void TextureButton::set_hover_texture(const Ref<Texture2D> &p_hover) { +void TextureButton::set_hover_texture(const Ref<Texture2D> &p_hover) { hover = p_hover; update(); } -void TextureButton::set_disabled_texture(const Ref<Texture2D> &p_disabled) { +void TextureButton::set_disabled_texture(const Ref<Texture2D> &p_disabled) { disabled = p_disabled; update(); } -void TextureButton::set_click_mask(const Ref<BitMap> &p_click_mask) { +void TextureButton::set_click_mask(const Ref<BitMap> &p_click_mask) { click_mask = p_click_mask; update(); } Ref<Texture2D> TextureButton::get_normal_texture() const { - return normal; } -Ref<Texture2D> TextureButton::get_pressed_texture() const { +Ref<Texture2D> TextureButton::get_pressed_texture() const { return pressed; } -Ref<Texture2D> TextureButton::get_hover_texture() const { +Ref<Texture2D> TextureButton::get_hover_texture() const { return hover; } -Ref<Texture2D> TextureButton::get_disabled_texture() const { +Ref<Texture2D> TextureButton::get_disabled_texture() const { return disabled; } -Ref<BitMap> TextureButton::get_click_mask() const { +Ref<BitMap> TextureButton::get_click_mask() const { return click_mask; } Ref<Texture2D> TextureButton::get_focused_texture() const { - return focused; }; void TextureButton::set_focused_texture(const Ref<Texture2D> &p_focused) { - focused = p_focused; }; diff --git a/scene/gui/texture_button.h b/scene/gui/texture_button.h index 43b10a8e8b..a1e66203d3 100644 --- a/scene/gui/texture_button.h +++ b/scene/gui/texture_button.h @@ -34,7 +34,6 @@ #include "scene/gui/base_button.h" #include "scene/resources/bit_map.h" class TextureButton : public BaseButton { - GDCLASS(TextureButton, BaseButton); public: diff --git a/scene/gui/texture_progress.cpp b/scene/gui/texture_progress.cpp index 0dd43e4a35..484b14d11c 100644 --- a/scene/gui/texture_progress.cpp +++ b/scene/gui/texture_progress.cpp @@ -33,19 +33,16 @@ #include "core/engine.h" void TextureProgress::set_under_texture(const Ref<Texture2D> &p_texture) { - under = p_texture; update(); minimum_size_changed(); } Ref<Texture2D> TextureProgress::get_under_texture() const { - return under; } void TextureProgress::set_over_texture(const Ref<Texture2D> &p_texture) { - over = p_texture; update(); if (under.is_null()) { @@ -54,7 +51,6 @@ void TextureProgress::set_over_texture(const Ref<Texture2D> &p_texture) { } Ref<Texture2D> TextureProgress::get_over_texture() const { - return over; } @@ -81,28 +77,26 @@ bool TextureProgress::get_nine_patch_stretch() const { } Size2 TextureProgress::get_minimum_size() const { - - if (nine_patch_stretch) + if (nine_patch_stretch) { return Size2(stretch_margin[MARGIN_LEFT] + stretch_margin[MARGIN_RIGHT], stretch_margin[MARGIN_TOP] + stretch_margin[MARGIN_BOTTOM]); - else if (under.is_valid()) + } else if (under.is_valid()) { return under->get_size(); - else if (over.is_valid()) + } else if (over.is_valid()) { return over->get_size(); - else if (progress.is_valid()) + } else if (progress.is_valid()) { return progress->get_size(); + } return Size2(1, 1); } void TextureProgress::set_progress_texture(const Ref<Texture2D> &p_texture) { - progress = p_texture; update(); minimum_size_changed(); } Ref<Texture2D> TextureProgress::get_progress_texture() const { - return progress; } @@ -134,13 +128,16 @@ Color TextureProgress::get_tint_over() const { } Point2 TextureProgress::unit_val_to_uv(float val) { - if (progress.is_null()) + if (progress.is_null()) { return Point2(); + } - if (val < 0) + if (val < 0) { val += 1; - if (val > 1) + } + if (val > 1) { val -= 1; + } Point2 p = get_relative_center(); @@ -158,40 +155,46 @@ Point2 TextureProgress::unit_val_to_uv(float val) { for (int edge = 0; edge < 4; edge++) { if (edge == 0) { - if (dir.x > 0) + if (dir.x > 0) { continue; + } cq = -(edgeLeft - p.x); dir.x *= 2.0 * cq; cp = -dir.x; } else if (edge == 1) { - if (dir.x < 0) + if (dir.x < 0) { continue; + } cq = (edgeRight - p.x); dir.x *= 2.0 * cq; cp = dir.x; } else if (edge == 2) { - if (dir.y > 0) + if (dir.y > 0) { continue; + } cq = -(edgeBottom - p.y); dir.y *= 2.0 * cq; cp = -dir.y; } else if (edge == 3) { - if (dir.y < 0) + if (dir.y < 0) { continue; + } cq = (edgeTop - p.y); dir.y *= 2.0 * cq; cp = dir.y; } cr = cq / cp; - if (cr >= 0 && cr < t1) + if (cr >= 0 && cr < t1) { t1 = cr; + } } return (p + t1 * dir); } Point2 TextureProgress::get_relative_center() { - if (progress.is_null()) + if (progress.is_null()) { return Point2(); + } Point2 p = progress->get_size() / 2; p += rad_center_off; p.x /= progress->get_width(); @@ -306,9 +309,7 @@ void TextureProgress::draw_nine_patch_stretched(const Ref<Texture2D> &p_texture, void TextureProgress::_notification(int p_what) { const float corners[12] = { -0.125, -0.375, -0.625, -0.875, 0.125, 0.375, 0.625, 0.875, 1.125, 1.375, 1.625, 1.875 }; switch (p_what) { - case NOTIFICATION_DRAW: { - 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, tint_under); @@ -320,8 +321,9 @@ void TextureProgress::_notification(int p_what) { draw_nine_patch_stretched(over, FILL_LEFT_TO_RIGHT, 1.0, tint_over); } } else { - if (under.is_valid()) + if (under.is_valid()) { draw_texture(under, Point2(), tint_under); + } if (progress.is_valid()) { Size2 s = progress->get_size(); switch (mode) { @@ -344,8 +346,9 @@ void TextureProgress::_notification(int p_what) { case FILL_CLOCKWISE: case FILL_COUNTER_CLOCKWISE: case FILL_CLOCKWISE_AND_COUNTER_CLOCKWISE: { - if (nine_patch_stretch) + if (nine_patch_stretch) { s = get_size(); + } float val = get_as_ratio() * rad_max_degrees / 360; if (val == 1) { @@ -367,9 +370,11 @@ void TextureProgress::_notification(int p_what) { pts.append(end); float from = MIN(start, end); float to = MAX(start, end); - for (int i = 0; i < 12; i++) - if (corners[i] > from && corners[i] < to) + for (int i = 0; i < 12; i++) { + if (corners[i] > from && corners[i] < to) { pts.append(corners[i]); + } + } pts.sort(); Vector<Point2> uvs; Vector<Point2> points; @@ -377,8 +382,9 @@ void TextureProgress::_notification(int p_what) { points.push_back(Point2(s.x * get_relative_center().x, s.y * get_relative_center().y)); for (int i = 0; i < pts.size(); i++) { Point2 uv = unit_val_to_uv(pts[i]); - if (uvs.find(uv) >= 0) + if (uvs.find(uv) >= 0) { continue; + } uvs.push_back(uv); points.push_back(Point2(uv.x * s.x, uv.y * s.y)); } @@ -389,10 +395,11 @@ void TextureProgress::_notification(int p_what) { if (Engine::get_singleton()->is_editor_hint()) { Point2 p; - if (nine_patch_stretch) + if (nine_patch_stretch) { p = get_size(); - else + } else { p = progress->get_size(); + } p.x *= get_relative_center().x; p.y *= get_relative_center().y; @@ -413,10 +420,10 @@ void TextureProgress::_notification(int p_what) { 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()) + if (over.is_valid()) { draw_texture(over, Point2(), tint_over); + } } - } break; } } @@ -432,10 +439,12 @@ int TextureProgress::get_fill_mode() { } void TextureProgress::set_radial_initial_angle(float p_angle) { - while (p_angle > 360) + while (p_angle > 360) { p_angle -= 360; - while (p_angle < 0) + } + while (p_angle < 0) { p_angle += 360; + } rad_init_angle = p_angle; update(); } @@ -463,7 +472,6 @@ Point2 TextureProgress::get_radial_center_offset() { } void TextureProgress::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_under_texture", "tex"), &TextureProgress::set_under_texture); ClassDB::bind_method(D_METHOD("get_under_texture"), &TextureProgress::get_under_texture); diff --git a/scene/gui/texture_progress.h b/scene/gui/texture_progress.h index e05f89aa3e..e56454f866 100644 --- a/scene/gui/texture_progress.h +++ b/scene/gui/texture_progress.h @@ -34,7 +34,6 @@ #include "scene/gui/range.h" class TextureProgress : public Range { - GDCLASS(TextureProgress, Range); Ref<Texture2D> under; diff --git a/scene/gui/texture_rect.cpp b/scene/gui/texture_rect.cpp index 92f3c5b5d9..58e7249284 100644 --- a/scene/gui/texture_rect.cpp +++ b/scene/gui/texture_rect.cpp @@ -33,9 +33,7 @@ #include "servers/rendering_server.h" void TextureRect::_notification(int p_what) { - if (p_what == NOTIFICATION_DRAW) { - if (texture.is_null()) { return; } @@ -116,7 +114,6 @@ void TextureRect::_notification(int p_what) { } Size2 TextureRect::get_minimum_size() const { - if (!expand && !texture.is_null()) { return texture->get_size(); } else { @@ -125,7 +122,6 @@ Size2 TextureRect::get_minimum_size() const { } void TextureRect::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_texture", "texture"), &TextureRect::set_texture); ClassDB::bind_method(D_METHOD("get_texture"), &TextureRect::get_texture); ClassDB::bind_method(D_METHOD("set_expand", "enable"), &TextureRect::set_expand); @@ -154,7 +150,6 @@ void TextureRect::_bind_methods() { } void TextureRect::_texture_changed() { - if (texture.is_valid()) { update(); minimum_size_changed(); @@ -162,7 +157,6 @@ void TextureRect::_texture_changed() { } void TextureRect::set_texture(const Ref<Texture2D> &p_tex) { - if (p_tex == texture) { return; } @@ -182,57 +176,47 @@ void TextureRect::set_texture(const Ref<Texture2D> &p_tex) { } Ref<Texture2D> TextureRect::get_texture() const { - return texture; } void TextureRect::set_expand(bool p_expand) { - expand = p_expand; update(); minimum_size_changed(); } bool TextureRect::has_expand() const { - return expand; } void TextureRect::set_stretch_mode(StretchMode p_mode) { - stretch_mode = p_mode; update(); } TextureRect::StretchMode TextureRect::get_stretch_mode() const { - return stretch_mode; } void TextureRect::set_flip_h(bool p_flip) { - hflip = p_flip; update(); } bool TextureRect::is_flipped_h() const { - return hflip; } void TextureRect::set_flip_v(bool p_flip) { - vflip = p_flip; update(); } bool TextureRect::is_flipped_v() const { - return vflip; } TextureRect::TextureRect() { - expand = false; hflip = false; vflip = false; diff --git a/scene/gui/texture_rect.h b/scene/gui/texture_rect.h index 77a2828fd4..727ab95776 100644 --- a/scene/gui/texture_rect.h +++ b/scene/gui/texture_rect.h @@ -34,7 +34,6 @@ #include "scene/gui/control.h" class TextureRect : public Control { - GDCLASS(TextureRect, Control); public: diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index 4a550727fc..45fcb448f8 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -47,9 +47,9 @@ #include <limits.h> void TreeItem::move_to_top() { - - if (!parent || parent->children == this) + if (!parent || parent->children == this) { return; //already on top + } TreeItem *prev = get_prev(); prev->next = next; next = parent->children; @@ -57,13 +57,15 @@ void TreeItem::move_to_top() { } void TreeItem::move_to_bottom() { - if (!parent || !next) + if (!parent || !next) { return; + } TreeItem *prev = get_prev(); TreeItem *last = next; - while (last->next) + while (last->next) { last = last->next; + } if (prev) { prev->next = next; @@ -75,54 +77,48 @@ void TreeItem::move_to_bottom() { } Size2 TreeItem::Cell::get_icon_size() const { - - if (icon.is_null()) + if (icon.is_null()) { return Size2(); - if (icon_region == Rect2i()) + } + if (icon_region == Rect2i()) { return icon->get_size(); - else + } else { return icon_region.size; + } } void TreeItem::Cell::draw_icon(const RID &p_where, const Point2 &p_pos, const Size2 &p_size, const Color &p_color) const { - - if (icon.is_null()) + if (icon.is_null()) { return; + } Size2i dsize = (p_size == Size2()) ? icon->get_size() : p_size; if (icon_region == Rect2i()) { - icon->draw_rect_region(p_where, Rect2(p_pos, dsize), Rect2(Point2(), icon->get_size()), p_color); } else { - icon->draw_rect_region(p_where, Rect2(p_pos, dsize), icon_region, p_color); } } void TreeItem::_changed_notify(int p_cell) { - tree->item_changed(p_cell, this); } void TreeItem::_changed_notify() { - tree->item_changed(-1, this); } void TreeItem::_cell_selected(int p_cell) { - tree->item_selected(p_cell, this); } void TreeItem::_cell_deselected(int p_cell) { - tree->item_deselected(p_cell, this); } /* cell mode */ void TreeItem::set_cell_mode(int p_column, TreeCellMode p_mode) { - ERR_FAIL_INDEX(p_column, cells.size()); Cell &c = cells.write[p_column]; c.mode = p_mode; @@ -138,32 +134,27 @@ void TreeItem::set_cell_mode(int p_column, TreeCellMode p_mode) { } TreeItem::TreeCellMode TreeItem::get_cell_mode(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), TreeItem::CELL_MODE_STRING); return cells[p_column].mode; } /* check mode */ void TreeItem::set_checked(int p_column, bool p_checked) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].checked = p_checked; _changed_notify(p_column); } bool TreeItem::is_checked(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].checked; } void TreeItem::set_text(int p_column, String p_text) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].text = p_text; if (cells[p_column].mode == TreeItem::CELL_MODE_RANGE) { - Vector<String> strings = p_text.split(","); cells.write[p_column].min = INT_MAX; cells.write[p_column].max = INT_MIN; @@ -181,13 +172,11 @@ void TreeItem::set_text(int p_column, String p_text) { } String TreeItem::get_text(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), ""); return cells[p_column].text; } void TreeItem::set_suffix(int p_column, String p_suffix) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].suffix = p_suffix; @@ -195,91 +184,82 @@ void TreeItem::set_suffix(int p_column, String p_suffix) { } String TreeItem::get_suffix(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), ""); return cells[p_column].suffix; } void TreeItem::set_icon(int p_column, const Ref<Texture2D> &p_icon) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].icon = p_icon; _changed_notify(p_column); } Ref<Texture2D> TreeItem::get_icon(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Ref<Texture2D>()); return cells[p_column].icon; } void TreeItem::set_icon_region(int p_column, const Rect2 &p_icon_region) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].icon_region = p_icon_region; _changed_notify(p_column); } Rect2 TreeItem::get_icon_region(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Rect2()); return cells[p_column].icon_region; } void TreeItem::set_icon_modulate(int p_column, const Color &p_modulate) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].icon_color = p_modulate; _changed_notify(p_column); } Color TreeItem::get_icon_modulate(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Color()); return cells[p_column].icon_color; } void TreeItem::set_icon_max_width(int p_column, int p_max) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].icon_max_w = p_max; _changed_notify(p_column); } int TreeItem::get_icon_max_width(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), 0); return cells[p_column].icon_max_w; } /* range works for mode number or mode combo */ void TreeItem::set_range(int p_column, double p_value) { - ERR_FAIL_INDEX(p_column, cells.size()); - if (cells[p_column].step > 0) + if (cells[p_column].step > 0) { p_value = Math::stepify(p_value, cells[p_column].step); - if (p_value < cells[p_column].min) + } + if (p_value < cells[p_column].min) { p_value = cells[p_column].min; - if (p_value > cells[p_column].max) + } + if (p_value > cells[p_column].max) { p_value = cells[p_column].max; + } cells.write[p_column].val = p_value; _changed_notify(p_column); } double TreeItem::get_range(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), 0); return cells[p_column].val; } bool TreeItem::is_range_exponential(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].expr; } -void TreeItem::set_range_config(int p_column, double p_min, double p_max, double p_step, bool p_exp) { +void TreeItem::set_range_config(int p_column, double p_min, double p_max, double p_step, bool p_exp) { ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].min = p_min; cells.write[p_column].max = p_max; @@ -289,7 +269,6 @@ void TreeItem::set_range_config(int p_column, double p_min, double p_max, double } void TreeItem::get_range_config(int p_column, double &r_min, double &r_max, double &r_step) const { - ERR_FAIL_INDEX(p_column, cells.size()); r_min = cells[p_column].min; r_max = cells[p_column].max; @@ -297,20 +276,17 @@ void TreeItem::get_range_config(int p_column, double &r_min, double &r_max, doub } void TreeItem::set_metadata(int p_column, const Variant &p_meta) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].meta = p_meta; } Variant TreeItem::get_metadata(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Variant()); return cells[p_column].meta; } void TreeItem::set_custom_draw(int p_column, Object *p_object, const StringName &p_callback) { - ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_NULL(p_object); @@ -319,25 +295,21 @@ void TreeItem::set_custom_draw(int p_column, Object *p_object, const StringName } void TreeItem::set_collapsed(bool p_collapsed) { - - if (collapsed == p_collapsed || !tree) + if (collapsed == p_collapsed || !tree) { return; + } collapsed = p_collapsed; TreeItem *ci = tree->selected_item; if (ci) { - while (ci && ci != this) { - ci = ci->parent; } if (ci) { // collapsing cursor/selected, move it! if (tree->select_mode == Tree::SELECT_MULTI) { - tree->selected_item = this; emit_signal("cell_selected"); } else { - select(tree->selected_col); } @@ -350,7 +322,6 @@ void TreeItem::set_collapsed(bool p_collapsed) { } bool TreeItem::is_collapsed() { - return collapsed; } @@ -364,40 +335,36 @@ int TreeItem::get_custom_minimum_height() const { } TreeItem *TreeItem::get_next() { - return next; } TreeItem *TreeItem::get_prev() { - - if (!parent || parent->children == this) + if (!parent || parent->children == this) { return nullptr; + } TreeItem *prev = parent->children; - while (prev && prev->next != this) + while (prev && prev->next != this) { prev = prev->next; + } return prev; } TreeItem *TreeItem::get_parent() { - return parent; } TreeItem *TreeItem::get_children() { - return children; } TreeItem *TreeItem::get_prev_visible(bool p_wrap) { - TreeItem *current = this; TreeItem *prev = current->get_prev(); if (!prev) { - current = current->parent; if (current == tree->root && tree->hide_root) { return nullptr; @@ -414,14 +381,14 @@ TreeItem *TreeItem::get_prev_visible(bool p_wrap) { } } } else { - current = prev; while (!current->collapsed && current->children) { //go to the very end current = current->children; - while (current->next) + while (current->next) { current = current->next; + } } } @@ -429,28 +396,24 @@ TreeItem *TreeItem::get_prev_visible(bool p_wrap) { } TreeItem *TreeItem::get_next_visible(bool p_wrap) { - TreeItem *current = this; if (!current->collapsed && current->children) { - current = current->children; } else if (current->next) { - current = current->next; } else { - while (current && !current->next) { - current = current->parent; } if (!current) { - if (p_wrap) + if (p_wrap) { return tree->root; - else + } else { return nullptr; + } } else { current = current->next; } @@ -460,14 +423,11 @@ TreeItem *TreeItem::get_next_visible(bool p_wrap) { } void TreeItem::remove_child(TreeItem *p_item) { - ERR_FAIL_NULL(p_item); TreeItem **c = &children; while (*c) { - if ((*c) == p_item) { - TreeItem *aux = *c; *c = (*c)->next; @@ -483,55 +443,51 @@ void TreeItem::remove_child(TreeItem *p_item) { } void TreeItem::set_selectable(int p_column, bool p_selectable) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].selectable = p_selectable; } bool TreeItem::is_selectable(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].selectable; } bool TreeItem::is_selected(int p_column) { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].selectable && cells[p_column].selected; } void TreeItem::set_as_cursor(int p_column) { - ERR_FAIL_INDEX(p_column, cells.size()); - if (!tree) + if (!tree) { return; - if (tree->select_mode != Tree::SELECT_MULTI) + } + if (tree->select_mode != Tree::SELECT_MULTI) { return; + } tree->selected_item = this; tree->selected_col = p_column; tree->update(); } void TreeItem::select(int p_column) { - ERR_FAIL_INDEX(p_column, cells.size()); _cell_selected(p_column); } void TreeItem::deselect(int p_column) { - ERR_FAIL_INDEX(p_column, cells.size()); _cell_deselected(p_column); } void TreeItem::add_button(int p_column, const Ref<Texture2D> &p_button, int p_id, bool p_disabled, const String &p_tooltip) { - ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_COND(!p_button.is_valid()); TreeItem::Cell::Button button; button.texture = p_button; - if (p_id < 0) + if (p_id < 0) { p_id = cells[p_column].buttons.size(); + } button.id = p_id; button.disabled = p_disabled; button.tooltip = p_tooltip; @@ -540,27 +496,29 @@ void TreeItem::add_button(int p_column, const Ref<Texture2D> &p_button, int p_id } int TreeItem::get_button_count(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), -1); return cells[p_column].buttons.size(); } + Ref<Texture2D> TreeItem::get_button(int p_column, int p_idx) const { ERR_FAIL_INDEX_V(p_column, cells.size(), Ref<Texture2D>()); ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), Ref<Texture2D>()); return cells[p_column].buttons[p_idx].texture; } + String TreeItem::get_button_tooltip(int p_column, int p_idx) const { ERR_FAIL_INDEX_V(p_column, cells.size(), String()); ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), String()); return cells[p_column].buttons[p_idx].tooltip; } + int TreeItem::get_button_id(int p_column, int p_idx) const { ERR_FAIL_INDEX_V(p_column, cells.size(), -1); ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), -1); return cells[p_column].buttons[p_idx].id; } -void TreeItem::erase_button(int p_column, int p_idx) { +void TreeItem::erase_button(int p_column, int p_idx) { ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); cells.write[p_column].buttons.remove(p_idx); @@ -568,19 +526,17 @@ void TreeItem::erase_button(int p_column, int p_idx) { } int TreeItem::get_button_by_id(int p_column, int p_id) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), -1); for (int i = 0; i < cells[p_column].buttons.size(); i++) { - - if (cells[p_column].buttons[i].id == p_id) + if (cells[p_column].buttons[i].id == p_id) { return i; + } } return -1; } void TreeItem::set_button(int p_column, int p_idx, const Ref<Texture2D> &p_button) { - ERR_FAIL_COND(p_button.is_null()); ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); @@ -589,7 +545,6 @@ void TreeItem::set_button(int p_column, int p_idx, const Ref<Texture2D> &p_butto } void TreeItem::set_button_color(int p_column, int p_idx, const Color &p_color) { - ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); cells.write[p_column].buttons.write[p_idx].color = p_color; @@ -597,7 +552,6 @@ void TreeItem::set_button_color(int p_column, int p_idx, const Color &p_color) { } void TreeItem::set_button_disabled(int p_column, int p_idx, bool p_disabled) { - ERR_FAIL_INDEX(p_column, cells.size()); ERR_FAIL_INDEX(p_idx, cells[p_column].buttons.size()); @@ -606,7 +560,6 @@ void TreeItem::set_button_disabled(int p_column, int p_idx, bool p_disabled) { } bool TreeItem::is_button_disabled(int p_column, int p_idx) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); ERR_FAIL_INDEX_V(p_idx, cells[p_column].buttons.size(), false); @@ -614,34 +567,32 @@ bool TreeItem::is_button_disabled(int p_column, int p_idx) const { } void TreeItem::set_editable(int p_column, bool p_editable) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].editable = p_editable; _changed_notify(p_column); } bool TreeItem::is_editable(int p_column) { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].editable; } void TreeItem::set_custom_color(int p_column, const Color &p_color) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_color = true; cells.write[p_column].color = p_color; _changed_notify(p_column); } -Color TreeItem::get_custom_color(int p_column) const { +Color TreeItem::get_custom_color(int p_column) const { ERR_FAIL_INDEX_V(p_column, cells.size(), Color()); - if (!cells[p_column].custom_color) + if (!cells[p_column].custom_color) { return Color(); + } return cells[p_column].color; } -void TreeItem::clear_custom_color(int p_column) { +void TreeItem::clear_custom_color(int p_column) { ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_color = false; cells.write[p_column].color = Color(); @@ -649,19 +600,16 @@ void TreeItem::clear_custom_color(int p_column) { } void TreeItem::set_tooltip(int p_column, const String &p_tooltip) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].tooltip = p_tooltip; } String TreeItem::get_tooltip(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), ""); return cells[p_column].tooltip; } void TreeItem::set_custom_bg_color(int p_column, const Color &p_color, bool p_bg_outline) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_bg_color = true; cells.write[p_column].custom_bg_outline = p_bg_outline; @@ -670,7 +618,6 @@ void TreeItem::set_custom_bg_color(int p_column, const Color &p_color, bool p_bg } void TreeItem::clear_custom_bg_color(int p_column) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_bg_color = false; cells.write[p_column].bg_color = Color(); @@ -678,21 +625,19 @@ void TreeItem::clear_custom_bg_color(int p_column) { } Color TreeItem::get_custom_bg_color(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), Color()); - if (!cells[p_column].custom_bg_color) + if (!cells[p_column].custom_bg_color) { return Color(); + } return cells[p_column].bg_color; } void TreeItem::set_custom_as_button(int p_column, bool p_button) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].custom_button = p_button; } bool TreeItem::is_custom_set_as_button(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].custom_button; } @@ -709,20 +654,17 @@ TreeItem::TextAlign TreeItem::get_text_align(int p_column) const { } void TreeItem::set_expand_right(int p_column, bool p_enable) { - ERR_FAIL_INDEX(p_column, cells.size()); cells.write[p_column].expand_right = p_enable; _changed_notify(p_column); } bool TreeItem::get_expand_right(int p_column) const { - ERR_FAIL_INDEX_V(p_column, cells.size(), false); return cells[p_column].expand_right; } void TreeItem::set_disable_folding(bool p_disable) { - disable_folding = p_disable; _changed_notify(0); } @@ -732,7 +674,6 @@ bool TreeItem::is_folding_disabled() const { } Variant TreeItem::_call_recursive_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 1) { r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; r_error.argument = 0; @@ -769,7 +710,6 @@ void TreeItem::call_recursive(const StringName &p_method, const Variant **p_args } void TreeItem::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_cell_mode", "column", "mode"), &TreeItem::set_cell_mode); ClassDB::bind_method(D_METHOD("get_cell_mode", "column"), &TreeItem::get_cell_mode); @@ -887,10 +827,8 @@ void TreeItem::_bind_methods() { } void TreeItem::clear_children() { - TreeItem *c = children; while (c) { - TreeItem *aux = c; c = c->get_next(); aux->parent = nullptr; // so it won't try to recursively autoremove from me in here @@ -901,7 +839,6 @@ void TreeItem::clear_children() { }; TreeItem::TreeItem(Tree *p_tree) { - tree = p_tree; collapsed = false; disable_folding = false; @@ -913,14 +850,13 @@ TreeItem::TreeItem(Tree *p_tree) { } TreeItem::~TreeItem() { - clear_children(); - if (parent) + if (parent) { parent->remove_child(this); + } if (tree && tree->root == this) { - tree->root = nullptr; } @@ -933,14 +869,17 @@ TreeItem::~TreeItem() { tree->cache.hover_item = nullptr; } - if (tree && tree->selected_item == this) + if (tree && tree->selected_item == this) { tree->selected_item = nullptr; + } - if (tree && tree->drop_mode_over == this) + if (tree && tree->drop_mode_over == this) { tree->drop_mode_over = nullptr; + } - if (tree && tree->single_select_defer == this) + if (tree && tree->single_select_defer == this) { tree->single_select_defer = nullptr; + } if (tree && tree->edited_item == this) { tree->edited_item = nullptr; @@ -956,7 +895,6 @@ TreeItem::~TreeItem() { /**********************************************/ void Tree::update_cache() { - cache.font = get_theme_font("font"); cache.tb_font = get_theme_font("title_button_font"); cache.bg = get_theme_stylebox("bg"); @@ -1001,45 +939,42 @@ void Tree::update_cache() { } int Tree::compute_item_height(TreeItem *p_item) const { - - if (p_item == root && hide_root) + if (p_item == root && hide_root) { return 0; + } ERR_FAIL_COND_V(cache.font.is_null(), 0); int height = cache.font->get_height(); for (int i = 0; i < columns.size(); i++) { - for (int j = 0; j < p_item->cells[i].buttons.size(); j++) { - Size2i s; // = cache.button_pressed->get_minimum_size(); s += p_item->cells[i].buttons[j].texture->get_size(); - if (s.height > height) + if (s.height > height) { height = s.height; + } } switch (p_item->cells[i].mode) { - case TreeItem::CELL_MODE_CHECK: { - int check_icon_h = cache.checked->get_height(); - if (height < check_icon_h) + if (height < check_icon_h) { height = check_icon_h; + } [[fallthrough]]; } case TreeItem::CELL_MODE_STRING: case TreeItem::CELL_MODE_CUSTOM: case TreeItem::CELL_MODE_ICON: { - Ref<Texture2D> icon = p_item->cells[i].icon; if (!icon.is_null()) { - Size2i s = p_item->cells[i].get_icon_size(); if (p_item->cells[i].icon_max_w > 0 && s.width > p_item->cells[i].icon_max_w) { s.height = s.height * p_item->cells[i].icon_max_w / s.width; } - if (s.height > height) + if (s.height > height) { height = s.height; + } } if (p_item->cells[i].mode == TreeItem::CELL_MODE_CUSTOM && p_item->cells[i].custom_button) { height += cache.custom_button->get_minimum_size().height; @@ -1051,8 +986,9 @@ int Tree::compute_item_height(TreeItem *p_item) const { } } int item_min_height = p_item->get_custom_minimum_height(); - if (height < item_min_height) + if (height < item_min_height) { height = item_min_height; + } height += cache.vseparation; @@ -1060,7 +996,6 @@ int Tree::compute_item_height(TreeItem *p_item) const { } int Tree::get_item_height(TreeItem *p_item) const { - int height = compute_item_height(p_item); height += cache.vseparation; @@ -1069,7 +1004,6 @@ int Tree::get_item_height(TreeItem *p_item) const { TreeItem *c = p_item->children; while (c) { - height += get_item_height(c); c = c->next; @@ -1080,14 +1014,14 @@ int Tree::get_item_height(TreeItem *p_item) const { } void Tree::draw_item_rect(const TreeItem::Cell &p_cell, const Rect2i &p_rect, const Color &p_color, const Color &p_icon_color) { - ERR_FAIL_COND(cache.font.is_null()); Rect2i rect = p_rect; Ref<Font> font = cache.font; String text = p_cell.text; - if (p_cell.suffix != String()) + if (p_cell.suffix != String()) { text += " " + p_cell.suffix; + } int w = 0; if (!p_cell.icon.is_null()) { @@ -1130,9 +1064,9 @@ void Tree::draw_item_rect(const TreeItem::Cell &p_cell, const Rect2i &p_rect, co } int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 &p_draw_size, TreeItem *p_item) { - - if (p_pos.y - cache.offset.y > (p_draw_size.height)) + if (p_pos.y - cache.offset.y > (p_draw_size.height)) { return -1; //draw no more! + } RID ci = get_canvas_item(); @@ -1148,7 +1082,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 bool skip = (p_item == root && hide_root); if (!skip && (p_pos.y + label_h - cache.offset.y) > 0) { - //draw separation. //if (p_item->get_parent()!=root || !hide_root) @@ -1160,7 +1093,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 int ofs = p_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); int skip2 = 0; for (int i = 0; i < columns.size(); i++) { - if (skip2) { skip2--; continue; @@ -1169,22 +1101,18 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 int w = get_column_width(i); if (i == 0) { - w -= ofs; if (w <= 0) { - ofs = get_column_width(0); continue; } } else { - ofs += cache.hseparation; w -= cache.hseparation; } if (p_item->cells[i].expand_right) { - int plus = 1; while (i + plus < columns.size() && !p_item->cells[i + plus].editable && p_item->cells[i + plus].mode == TreeItem::CELL_MODE_STRING && p_item->cells[i + plus].text == "" && p_item->cells[i + plus].icon.is_null()) { w += get_column_width(i + plus); @@ -1197,8 +1125,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 for (int j = p_item->cells[i].buttons.size() - 1; j >= 0; j--) { Ref<Texture2D> b = p_item->cells[i].buttons[j].texture; Size2 s = b->get_size() + cache.button_pressed->get_minimum_size(); - if (s.height < label_h) + if (s.height < label_h) { s.height = label_h; + } Point2i o = Point2i(ofs + w - s.width, p_pos.y) - cache.offset + p_draw_ofs; @@ -1227,15 +1156,15 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } if (i == 0) { - if (p_item->cells[0].selected && select_mode == SELECT_ROW) { Rect2i row_rect = Rect2i(Point2i(cache.bg->get_margin(MARGIN_LEFT), item_rect.position.y), Size2i(get_size().width - cache.bg->get_minimum_size().width, item_rect.size.y)); //Rect2 r = Rect2i(row_rect.pos,row_rect.size); //r.grow(cache.selected->get_margin(MARGIN_LEFT)); - if (has_focus()) + if (has_focus()) { cache.selected_focus->draw(ci, row_rect); - else + } else { cache.selected->draw(ci, row_rect); + } } } @@ -1259,7 +1188,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } if (p_item->cells[i].custom_bg_color) { - Rect2 r = cell_rect; if (i == 0) { r.position.x = p_draw_ofs.x; @@ -1279,7 +1207,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } if (drop_mode_flags && drop_mode_over == p_item) { - Rect2 r = cell_rect; if (drop_mode_section == -1 || drop_mode_section == 0) { @@ -1303,13 +1230,10 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 text_pos.y += Math::floor((item_rect.size.y - font->get_height()) / 2) + font_ascent; switch (p_item->cells[i].mode) { - case TreeItem::CELL_MODE_STRING: { - draw_item_rect(p_item->cells[i], item_rect, col, icon_col); } break; case TreeItem::CELL_MODE_CHECK: { - Ref<Texture2D> checked = cache.checked; Ref<Texture2D> unchecked = cache.unchecked; Point2i check_ofs = item_rect.position; @@ -1333,9 +1257,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } break; case TreeItem::CELL_MODE_RANGE: { if (p_item->cells[i].text != "") { - - if (!p_item->cells[i].editable) + if (!p_item->cells[i].editable) { break; + } int option = (int)p_item->cells[i].val; @@ -1352,8 +1276,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } } - if (p_item->cells[i].suffix != String()) + if (p_item->cells[i].suffix != String()) { s += " " + p_item->cells[i].suffix; + } Ref<Texture2D> downarrow = cache.select_arrow; @@ -1365,18 +1290,19 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 downarrow->draw(ci, arrow_pos); } else { - Ref<Texture2D> updown = cache.updown; String valtext = String::num(p_item->cells[i].val, Math::range_step_decimals(p_item->cells[i].step)); - if (p_item->cells[i].suffix != String()) + if (p_item->cells[i].suffix != String()) { valtext += " " + p_item->cells[i].suffix; + } font->draw(ci, text_pos, valtext, col, item_rect.size.x - updown->get_width()); - if (!p_item->cells[i].editable) + if (!p_item->cells[i].editable) { break; + } Point2i updown_pos = item_rect.position; updown_pos.x += item_rect.size.x - updown->get_width(); @@ -1387,9 +1313,9 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } break; case TreeItem::CELL_MODE_ICON: { - - if (p_item->cells[i].icon.is_null()) + if (p_item->cells[i].icon.is_null()) { break; + } Size2i icon_size = p_item->cells[i].get_icon_size(); if (p_item->cells[i].icon_max_w > 0 && icon_size.width > p_item->cells[i].icon_max_w) { icon_size.height = icon_size.height * p_item->cells[i].icon_max_w / icon_size.width; @@ -1403,16 +1329,14 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } break; case TreeItem::CELL_MODE_CUSTOM: { - if (p_item->cells[i].custom_draw_obj.is_valid()) { - Object *cdo = ObjectDB::get_instance(p_item->cells[i].custom_draw_obj); - if (cdo) + if (cdo) { cdo->call(p_item->cells[i].custom_draw_callback, p_item, Rect2(item_rect)); + } } if (!p_item->cells[i].editable) { - draw_item_rect(p_item->cells[i], item_rect, col, icon_col); break; } @@ -1449,19 +1373,17 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } if (i == 0) { - ofs = get_column_width(0); } else { - ofs += w + bw; } if (select_mode == SELECT_MULTI && selected_item == p_item && selected_col == i) { - - if (has_focus()) + if (has_focus()) { cache.cursor->draw(ci, cell_rect); - else + } else { cache.cursor_unfocus->draw(ci, cell_rect); + } } } @@ -1470,7 +1392,6 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 Ref<Texture2D> arrow; if (p_item->collapsed) { - arrow = cache.arrow_collapsed; } else { arrow = cache.arrow; @@ -1495,14 +1416,14 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 int prev_ofs = children_pos.y - cache.offset.y + p_draw_ofs.y; while (c) { - if (cache.draw_relationship_lines > 0 && (!hide_root || c->parent != root)) { int root_ofs = children_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); int parent_ofs = p_pos.x + ((p_item->disable_folding || hide_folding) ? cache.hseparation : cache.item_margin); Point2i root_pos = Point2i(root_ofs, children_pos.y + label_h / 2) - cache.offset + p_draw_ofs; - if (c->get_children() != nullptr) + if (c->get_children() != nullptr) { root_pos -= Point2i(cache.arrow->get_width(), 0); + } float line_width = 1.0; #ifdef TOOLS_ENABLED @@ -1546,11 +1467,11 @@ int Tree::draw_item(const Point2i &p_pos, const Point2 &p_draw_ofs, const Size2 } int Tree::_count_selected_items(TreeItem *p_from) const { - int count = 0; for (int i = 0; i < columns.size(); i++) { - if (p_from->is_selected(i)) + if (p_from->is_selected(i)) { count++; + } } if (p_from->get_children()) { @@ -1563,8 +1484,8 @@ int Tree::_count_selected_items(TreeItem *p_from) const { return count; } -void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev, bool *r_in_range, bool p_force_deselect) { +void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev, bool *r_in_range, bool p_force_deselect) { TreeItem::Cell &selected_cell = p_selected->cells.write[p_col]; bool switched = false; @@ -1576,14 +1497,13 @@ void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_c bool emitted_row = false; for (int i = 0; i < columns.size(); i++) { - TreeItem::Cell &c = p_current->cells.write[i]; - if (!c.selectable) + if (!c.selectable) { continue; + } if (select_mode == SELECT_ROW) { - if (p_selected == p_current && (!c.selected || allow_reselect)) { c.selected = true; selected_item = p_selected; @@ -1598,45 +1518,40 @@ void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_c */ } else if (c.selected) { - c.selected = false; //p_current->deselected_signal.call(p_col); } } else if (select_mode == SELECT_SINGLE || select_mode == SELECT_MULTI) { - if (!r_in_range && &selected_cell == &c) { - if (!selected_cell.selected || allow_reselect) { - selected_cell.selected = true; selected_item = p_selected; selected_col = i; emit_signal("cell_selected"); - if (select_mode == SELECT_MULTI) + if (select_mode == SELECT_MULTI) { emit_signal("multi_selected", p_current, i, true); - else if (select_mode == SELECT_SINGLE) + } else if (select_mode == SELECT_SINGLE) { emit_signal("item_selected"); + } } else if (select_mode == SELECT_MULTI && (selected_item != p_selected || selected_col != i)) { - selected_item = p_selected; selected_col = i; emit_signal("cell_selected"); } } else { - if (r_in_range && *r_in_range && !p_force_deselect) { - if (!c.selected && c.selectable) { c.selected = true; emit_signal("multi_selected", p_current, i, true); } } else if (!r_in_range || p_force_deselect) { - if (select_mode == SELECT_MULTI && c.selected) + if (select_mode == SELECT_MULTI && c.selected) { emit_signal("multi_selected", p_current, i, false); + } c.selected = false; } //p_current->deselected_signal.call(p_col); @@ -1651,21 +1566,17 @@ void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_c TreeItem *c = p_current->children; while (c) { - select_single_item(p_selected, c, p_col, p_prev, r_in_range, p_current->is_collapsed() || p_force_deselect); c = c->next; } } Rect2 Tree::search_item_rect(TreeItem *p_from, TreeItem *p_item) { - return Rect2(); } void Tree::_range_click_timeout() { - if (range_item_last && !range_drag_enabled && Input::get_singleton()->is_mouse_button_pressed(BUTTON_LEFT)) { - Point2 pos = get_local_mouse_position() - cache.bg->get_offset(); if (show_column_titles) { pos.y -= _get_title_button_height(); @@ -1692,8 +1603,9 @@ void Tree::_range_click_timeout() { range_click_timer->start(); } - if (!click_handled) + if (!click_handled) { range_click_timer->stop(); + } if (propagate_mouse_activated) { emit_signal("item_activated"); @@ -1706,7 +1618,6 @@ void Tree::_range_click_timeout() { } int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool p_doubleclick, TreeItem *p_item, int p_button, const Ref<InputEventWithModifiers> &p_mod) { - int item_h = compute_item_height(p_item) + cache.vseparation; bool skip = (p_item == root && hide_root); @@ -1719,9 +1630,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } if (!p_item->disable_folding && !hide_folding && (p_pos.x >= x_ofs && p_pos.x < (x_ofs + cache.item_margin))) { - - if (p_item->children) + if (p_item->children) { p_item->set_collapsed(!p_item->is_collapsed()); + } return -1; //handled! } @@ -1732,11 +1643,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool int col_ofs = 0; int col_width = 0; for (int i = 0; i < columns.size(); i++) { - col_width = get_column_width(i); if (p_item->cells[i].expand_right) { - int plus = 1; while (i + plus < columns.size() && !p_item->cells[i + plus].editable && p_item->cells[i + plus].mode == TreeItem::CELL_MODE_STRING && p_item->cells[i + plus].text == "" && p_item->cells[i + plus].icon.is_null()) { col_width += cache.hseparation; @@ -1755,16 +1664,15 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool break; } - if (col == -1) + if (col == -1) { return -1; - else if (col == 0) { + } else if (col == 0) { int margin = x_ofs + cache.item_margin; //-cache.hseparation; //int lm = cache.bg->get_margin(MARGIN_LEFT); col_width -= margin; col_ofs += margin; x -= margin; } else { - col_width -= cache.hseparation; x -= cache.hseparation; } @@ -1815,9 +1723,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } if (select_mode == SELECT_MULTI && p_mod->get_command() && c.selectable) { - if (!c.selected || p_button == BUTTON_RIGHT) { - p_item->select(col); emit_signal("multi_selected", p_item, col, true); if (p_button == BUTTON_RIGHT) { @@ -1826,18 +1732,14 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool //p_item->selected_signal.call(col); } else { - p_item->deselect(col); emit_signal("multi_selected", p_item, col, false); //p_item->deselected_signal.call(col); } } else { - if (c.selectable) { - if (select_mode == SELECT_MULTI && p_mod->get_shift() && selected_item && selected_item != p_item) { - bool inrange = false; select_single_item(p_item, root, col, selected_item, &inrange); @@ -1845,14 +1747,12 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool emit_signal("item_rmb_selected", get_local_mouse_position()); } } else { - int icount = _count_selected_items(root); if (select_mode == SELECT_MULTI && icount > 1 && p_button != BUTTON_RIGHT) { single_select_defer = p_item; single_select_defer_column = col; } else { - if (p_button != BUTTON_RIGHT || !c.selected) { select_single_item(p_item, root, col); } @@ -1873,8 +1773,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } } - if (!c.editable) + if (!c.editable) { return -1; // if cell is not editable, don't bother + } /* editing */ @@ -1882,7 +1783,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool String editor_text = c.text; switch (c.mode) { - case TreeItem::CELL_MODE_STRING: { //nothing in particular @@ -1892,7 +1792,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } break; case TreeItem::CELL_MODE_CHECK: { - bring_up_editor = false; //checkboxes are not edited with editor if (force_edit_checkbox_only_on_checkbox) { if (x < cache.checked->get_width()) { @@ -1913,7 +1812,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool popup_menu->clear(); for (int i = 0; i < c.text.get_slice_count(","); i++) { - String s = c.text.get_slicec(',', i); popup_menu->add_item(s.get_slicec(':', 0), s.get_slicec(':', 1).empty() ? i : s.get_slicec(':', 1).to_int()); } @@ -1926,16 +1824,12 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool //} bring_up_editor = false; } else { - if (x >= (col_width - item_h / 2)) { - /* touching the combo */ bool up = p_pos.y < (item_h / 2); if (p_button == BUTTON_LEFT) { - if (range_click_timer->get_time_left() == 0) { - range_item_last = p_item; range_up_last = up; @@ -1944,7 +1838,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool range_click_timer->start(); } else if (up != range_up_last) { - return -1; // break. avoid changing direction on mouse held } @@ -1953,15 +1846,12 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool item_edited(col, p_item); } else if (p_button == BUTTON_RIGHT) { - p_item->set_range(col, (up ? c.max : c.min)); item_edited(col, p_item); } else if (p_button == BUTTON_WHEEL_UP) { - p_item->set_range(col, c.val + c.step); item_edited(col, p_item); } else if (p_button == BUTTON_WHEEL_DOWN) { - p_item->set_range(col, c.val - c.step); item_edited(col, p_item); } @@ -1970,10 +1860,10 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool bring_up_editor = false; } else { - editor_text = String::num(p_item->cells[col].val, Math::range_step_decimals(p_item->cells[col].step)); - if (select_mode == SELECT_MULTI && get_tree()->get_event_count() == focus_in_id) + if (select_mode == SELECT_MULTI && get_tree()->get_event_count() == focus_in_id) { bring_up_editor = false; + } } } click_handled = true; @@ -2001,8 +1891,9 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } break; }; - if (!bring_up_editor || p_button != BUTTON_LEFT) + if (!bring_up_editor || p_button != BUTTON_LEFT) { return -1; + } click_handled = true; popup_edited_item = p_item; @@ -2014,7 +1905,6 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool return -1; //select } else { - Point2i new_pos = p_pos; if (!skip) { @@ -2029,11 +1919,11 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool TreeItem *c = p_item->children; while (c) { - int child_h = propagate_mouse_event(new_pos, x_ofs, y_ofs, p_doubleclick, c, p_button, p_mod); - if (child_h < 0) + if (child_h < 0) { return -1; // break, stop propagating, no need to anymore + } new_pos.y -= child_h; y_ofs += child_h; @@ -2050,47 +1940,46 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, bool } void Tree::_text_editor_modal_close() { - if (Input::get_singleton()->is_key_pressed(KEY_ESCAPE) || Input::get_singleton()->is_key_pressed(KEY_KP_ENTER) || Input::get_singleton()->is_key_pressed(KEY_ENTER)) { - return; } - if (value_editor->has_point(value_editor->get_local_mouse_position())) + if (value_editor->has_point(value_editor->get_local_mouse_position())) { return; + } _text_editor_enter(text_editor->get_text()); } void Tree::_text_editor_enter(String p_text) { - popup_editor->hide(); - if (!popup_edited_item) + if (!popup_edited_item) { return; + } - if (popup_edited_item_col < 0 || popup_edited_item_col > columns.size()) + if (popup_edited_item_col < 0 || popup_edited_item_col > columns.size()) { return; + } TreeItem::Cell &c = popup_edited_item->cells.write[popup_edited_item_col]; switch (c.mode) { - case TreeItem::CELL_MODE_STRING: { - c.text = p_text; //popup_edited_item->edited_signal.call( popup_edited_item_col ); } break; case TreeItem::CELL_MODE_RANGE: { - c.val = p_text.to_double(); - if (c.step > 0) + if (c.step > 0) { c.val = Math::stepify(c.val, c.step); - if (c.val < c.min) + } + if (c.val < c.min) { c.val = c.min; - else if (c.val > c.max) + } else if (c.val > c.max) { c.val = c.max; + } //popup_edited_item->edited_signal.call( popup_edited_item_col ); } break; @@ -2104,7 +1993,6 @@ void Tree::_text_editor_enter(String p_text) { } void Tree::value_editor_changed(double p_value) { - if (updating_value_editor) { return; } @@ -2119,12 +2007,13 @@ void Tree::value_editor_changed(double p_value) { } void Tree::popup_select(int p_option) { - - if (!popup_edited_item) + if (!popup_edited_item) { return; + } - if (popup_edited_item_col < 0 || popup_edited_item_col > columns.size()) + if (popup_edited_item_col < 0 || popup_edited_item_col > columns.size()) { return; + } popup_edited_item->cells.write[popup_edited_item_col].val = p_option; //popup_edited_item->edited_signal.call( popup_edited_item_col ); @@ -2152,7 +2041,6 @@ void Tree::_go_left() { selected_col--; emit_signal("cell_selected"); } else { - selected_item->select(selected_col - 1); } } @@ -2174,7 +2062,6 @@ void Tree::_go_right() { selected_col++; emit_signal("cell_selected"); } else { - selected_item->select(selected_col + 1); } } @@ -2189,7 +2076,6 @@ void Tree::_go_up() { prev = get_last_item(); selected_col = 0; } else { - prev = selected_item->get_prev_visible(); if (last_keypress != 0) { //incr search next @@ -2203,19 +2089,20 @@ void Tree::_go_up() { } if (select_mode == SELECT_MULTI) { - - if (!prev) + if (!prev) { return; + } selected_item = prev; emit_signal("cell_selected"); update(); } else { - int col = selected_col < 0 ? 0 : selected_col; - while (prev && !prev->cells[col].selectable) + while (prev && !prev->cells[col].selectable) { prev = prev->get_prev_visible(); - if (!prev) + } + if (!prev) { return; // do nothing.. + } prev->select(col); } @@ -2226,12 +2113,10 @@ void Tree::_go_up() { void Tree::_go_down() { TreeItem *next = nullptr; if (!selected_item) { - if (root) { next = hide_root ? root->get_next_visible() : root; } } else { - next = selected_item->get_next_visible(); if (last_keypress != 0) { @@ -2246,7 +2131,6 @@ void Tree::_go_down() { } if (select_mode == SELECT_MULTI) { - if (!next) { return; } @@ -2255,11 +2139,11 @@ void Tree::_go_down() { emit_signal("cell_selected"); update(); } else { - int col = selected_col < 0 ? 0 : selected_col; - while (next && !next->cells[col].selectable) + while (next && !next->cells[col].selectable) { next = next->get_next_visible(); + } if (!next) { return; // do nothing.. } @@ -2271,14 +2155,13 @@ void Tree::_go_down() { } void Tree::_gui_input(Ref<InputEvent> p_event) { - Ref<InputEventKey> k = p_event; bool is_command = k.is_valid() && k->get_command(); if (p_event->is_action("ui_right") && p_event->is_pressed()) { - - if (!cursor_can_exit_tree) + if (!cursor_can_exit_tree) { accept_event(); + } if (!selected_item || select_mode == SELECT_ROW || selected_col > (columns.size() - 1)) { return; @@ -2294,9 +2177,9 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { _go_right(); } } else if (p_event->is_action("ui_left") && p_event->is_pressed()) { - - if (!cursor_can_exit_tree) + if (!cursor_can_exit_tree) { accept_event(); + } if (!selected_item || select_mode == SELECT_ROW || selected_col < 0) { return; @@ -2314,51 +2197,50 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } } else if (p_event->is_action("ui_up") && p_event->is_pressed() && !is_command) { - - if (!cursor_can_exit_tree) + if (!cursor_can_exit_tree) { accept_event(); + } _go_up(); } else if (p_event->is_action("ui_down") && p_event->is_pressed() && !is_command) { - - if (!cursor_can_exit_tree) + if (!cursor_can_exit_tree) { accept_event(); + } _go_down(); } else if (p_event->is_action("ui_page_down") && p_event->is_pressed()) { - - if (!cursor_can_exit_tree) + if (!cursor_can_exit_tree) { accept_event(); + } TreeItem *next = nullptr; - if (!selected_item) + if (!selected_item) { return; + } next = selected_item; for (int i = 0; i < 10; i++) { - TreeItem *_n = next->get_next_visible(); if (_n) { next = _n; } else { - break; } } - if (next == selected_item) + if (next == selected_item) { return; + } if (select_mode == SELECT_MULTI) { - selected_item = next; emit_signal("cell_selected"); update(); } else { - - while (next && !next->cells[selected_col].selectable) + while (next && !next->cells[selected_col].selectable) { next = next->get_next_visible(); + } if (!next) { return; // do nothing.. } @@ -2367,37 +2249,36 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { ensure_cursor_is_visible(); } else if (p_event->is_action("ui_page_up") && p_event->is_pressed()) { - - if (!cursor_can_exit_tree) + if (!cursor_can_exit_tree) { accept_event(); + } TreeItem *prev = nullptr; - if (!selected_item) + if (!selected_item) { return; + } prev = selected_item; for (int i = 0; i < 10; i++) { - TreeItem *_n = prev->get_prev_visible(); if (_n) { prev = _n; } else { - break; } } - if (prev == selected_item) + if (prev == selected_item) { return; + } if (select_mode == SELECT_MULTI) { - selected_item = prev; emit_signal("cell_selected"); update(); } else { - - while (prev && !prev->cells[selected_col].selectable) + while (prev && !prev->cells[selected_col].selectable) { prev = prev->get_prev_visible(); + } if (!prev) { return; // do nothing.. } @@ -2405,7 +2286,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } ensure_cursor_is_visible(); } else if (p_event->is_action("ui_accept") && p_event->is_pressed()) { - if (selected_item) { //bring up editor if possible if (!edit_selected()) { @@ -2415,10 +2295,10 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } accept_event(); } else if (p_event->is_action("ui_select") && p_event->is_pressed()) { - if (select_mode == SELECT_MULTI) { - if (!selected_item) + if (!selected_item) { return; + } if (selected_item->is_selected(selected_col)) { selected_item->deselect(selected_col); emit_signal("multi_selected", selected_item, selected_col, false); @@ -2432,34 +2312,38 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { if (k.is_valid()) { // Incremental search - if (!k->is_pressed()) + if (!k->is_pressed()) { return; - if (k->get_command() || (k->get_shift() && k->get_unicode() == 0) || k->get_metakey()) + } + if (k->get_command() || (k->get_shift() && k->get_unicode() == 0) || k->get_metakey()) { return; - if (!root) + } + if (!root) { return; + } - if (hide_root && !root->get_next_visible()) + if (hide_root && !root->get_next_visible()) { return; + } if (k->get_unicode() > 0) { - _do_incr_search(String::chr(k->get_unicode())); accept_event(); return; } else { - if (k->get_keycode() != KEY_SHIFT) + if (k->get_keycode() != KEY_SHIFT) { last_keypress = 0; + } } } Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - - if (cache.font.is_null()) // avoid a strange case that may corrupt stuff + if (cache.font.is_null()) { // avoid a strange case that may corrupt stuff update_cache(); + } Ref<StyleBox> bg = cache.bg; @@ -2476,10 +2360,8 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pos.x += cache.offset.x; int len = 0; for (int i = 0; i < columns.size(); i++) { - len += get_column_width(i); if (pos.x < len) { - cache.hover_type = Cache::CLICK_TITLE; cache.hover_index = i; update(); @@ -2490,16 +2372,16 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } if (root) { - Point2 mpos = mm->get_position(); mpos -= cache.bg->get_offset(); mpos.y -= _get_title_button_height(); if (mpos.y >= 0) { - - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { mpos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { mpos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, mpos, col, h, section); @@ -2535,7 +2417,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { //range drag if (!range_drag_enabled) { - Vector2 cpos = mm->get_position(); if (cpos.distance_to(pressing_pos) > 2) { range_drag_enabled = true; @@ -2544,7 +2425,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_CAPTURED); } } else { - const TreeItem::Cell &c = popup_edited_item->cells[popup_edited_item_col]; float diff_y = -mm->get_relative().y; diff_y = Math::pow(ABS(diff_y), 1.8f) * SGN(diff_y); @@ -2556,7 +2436,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } if (drag_touching && !drag_touching_deaccel) { - drag_accum -= mm->get_relative().y; v_scroll->set_value(drag_from + drag_accum); drag_speed = -mm->get_speed().y; @@ -2566,13 +2445,12 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { - if (cache.font.is_null()) // avoid a strange case that may corrupt stuff + if (cache.font.is_null()) { // avoid a strange case that may corrupt stuff update_cache(); + } if (!b->is_pressed()) { - if (b->get_button_index() == BUTTON_LEFT) { - Point2 pos = b->get_position() - cache.bg->get_offset(); if (show_column_titles) { pos.y -= _get_title_button_height(); @@ -2581,7 +2459,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pos.x += cache.offset.x; int len = 0; for (int i = 0; i < columns.size(); i++) { - len += get_column_width(i); if (pos.x < len) { emit_signal("column_title_pressed", i); @@ -2599,9 +2476,7 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { range_click_timer->stop(); if (pressing_for_editor) { - if (range_drag_enabled) { - range_drag_enabled = false; Input::get_singleton()->set_mouse_mode(Input::MOUSE_MODE_VISIBLE); warp_mouse(range_drag_capture_pos); @@ -2630,13 +2505,11 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { cache.click_column = 0; if (drag_touching) { - if (drag_speed == 0) { drag_touching_deaccel = false; drag_touching = false; set_physics_process_internal(false); } else { - drag_touching_deaccel = true; } } @@ -2645,8 +2518,9 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { return; } - if (range_drag_enabled) + if (range_drag_enabled) { return; + } switch (b->get_button_index()) { case BUTTON_RIGHT: @@ -2663,10 +2537,8 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pos.x += cache.offset.x; int len = 0; for (int i = 0; i < columns.size(); i++) { - len += get_column_width(i); if (pos.x < len) { - cache.click_type = Cache::CLICK_TITLE; cache.click_index = i; //cache.click_id=; @@ -2697,8 +2569,9 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { pressing_pos = b->get_position(); } - if (b->get_button_index() == BUTTON_RIGHT) + if (b->get_button_index() == BUTTON_RIGHT) { break; + } if (drag_touching) { set_physics_process_internal(false); @@ -2720,8 +2593,9 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } if (b->get_button_index() == BUTTON_LEFT) { - if (get_item_at_position(b->get_position()) == nullptr && !b->get_shift() && !b->get_control() && !b->get_command()) + if (get_item_at_position(b->get_position()) == nullptr && !b->get_shift() && !b->get_control() && !b->get_command()) { emit_signal("nothing_selected"); + } } } @@ -2732,7 +2606,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } break; case BUTTON_WHEEL_UP: { - double prev_value = v_scroll->get_value(); v_scroll->set_value(v_scroll->get_value() - v_scroll->get_page() * b->get_factor() / 8); if (v_scroll->get_value() != prev_value) { @@ -2741,7 +2614,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } break; case BUTTON_WHEEL_DOWN: { - double prev_value = v_scroll->get_value(); v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * b->get_factor() / 8); if (v_scroll->get_value() != prev_value) { @@ -2754,7 +2626,6 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { Ref<InputEventPanGesture> pan_gesture = p_event; if (pan_gesture.is_valid()) { - double prev_v = v_scroll->get_value(); v_scroll->set_value(v_scroll->get_value() + v_scroll->get_page() * pan_gesture->get_delta().y / 8); @@ -2768,15 +2639,15 @@ void Tree::_gui_input(Ref<InputEvent> p_event) { } bool Tree::edit_selected() { - TreeItem *s = get_selected(); ERR_FAIL_COND_V_MSG(!s, false, "No item selected."); ensure_cursor_is_visible(); int col = get_selected_column(); ERR_FAIL_INDEX_V_MSG(col, columns.size(), false, "No item column selected."); - if (!s->cells[col].editable) + if (!s->cells[col].editable) { return false; + } Rect2 rect = s->get_meta("__focus_rect"); popup_edited_item = s; @@ -2785,12 +2656,10 @@ bool Tree::edit_selected() { const TreeItem::Cell &c = s->cells[col]; if (c.mode == TreeItem::CELL_MODE_CHECK) { - s->set_checked(col, !c.checked); item_edited(col, s); return true; } else if (c.mode == TreeItem::CELL_MODE_CUSTOM) { - edited_item = s; edited_col = col; custom_popup_rect = Rect2i(get_global_position() + rect.position, rect.size); @@ -2799,10 +2668,8 @@ bool Tree::edit_selected() { return true; } else if (c.mode == TreeItem::CELL_MODE_RANGE && c.text != "") { - popup_menu->clear(); for (int i = 0; i < c.text.get_slice_count(","); i++) { - String s2 = c.text.get_slicec(',', i); popup_menu->add_item(s2.get_slicec(':', 0), s2.get_slicec(':', 1).empty() ? i : s2.get_slicec(':', 1).to_int()); } @@ -2815,7 +2682,6 @@ bool Tree::edit_selected() { return true; } else if (c.mode == TreeItem::CELL_MODE_STRING || c.mode == TreeItem::CELL_MODE_RANGE) { - Rect2 popup_rect; Vector2 ofs(0, (text_editor->get_size().height - rect.size.height) / 2); @@ -2829,7 +2695,6 @@ bool Tree::edit_selected() { text_editor->select_all(); if (c.mode == TreeItem::CELL_MODE_RANGE) { - popup_rect.size.y += value_editor->get_minimum_size().height; value_editor->show(); @@ -2858,12 +2723,11 @@ bool Tree::edit_selected() { } Size2 Tree::get_internal_min_size() const { - Size2i size = cache.bg->get_offset(); - if (root) + if (root) { size.height += get_item_height(root); + } for (int i = 0; i < columns.size(); i++) { - size.width += columns[i].min_width; } @@ -2871,13 +2735,11 @@ Size2 Tree::get_internal_min_size() const { } void Tree::update_scrollbars() { - Size2 size = get_size(); int tbh; if (show_column_titles) { tbh = _get_title_button_height(); } else { - tbh = 0; } @@ -2893,11 +2755,9 @@ void Tree::update_scrollbars() { Size2 min = get_internal_min_size(); if (min.height < size.height - hmin.height) { - v_scroll->hide(); cache.offset.y = 0; } else { - v_scroll->show(); v_scroll->set_max(min.height); v_scroll->set_page(size.height - hmin.height - tbh); @@ -2905,11 +2765,9 @@ void Tree::update_scrollbars() { } if (min.width < size.width - vmin.width) { - h_scroll->hide(); cache.offset.x = 0; } else { - h_scroll->show(); h_scroll->set_max(min.width); h_scroll->set_page(size.width - vmin.width); @@ -2918,19 +2776,15 @@ void Tree::update_scrollbars() { } int Tree::_get_title_button_height() const { - ERR_FAIL_COND_V(cache.font.is_null() || cache.title_button.is_null(), 0); return show_column_titles ? cache.font->get_height() + cache.title_button->get_minimum_size().height : 0; } void Tree::_notification(int p_what) { - if (p_what == NOTIFICATION_FOCUS_ENTER) { - focus_in_id = get_tree()->get_event_count(); } if (p_what == NOTIFICATION_MOUSE_EXIT) { - if (cache.hover_type != Cache::CLICK_NONE) { cache.hover_type = Cache::CLICK_NONE; update(); @@ -2938,23 +2792,19 @@ void Tree::_notification(int p_what) { } if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { - drag_touching = false; } if (p_what == NOTIFICATION_ENTER_TREE) { - update_cache(); } if (p_what == NOTIFICATION_DRAG_END) { - drop_mode_flags = 0; scrolling = false; set_physics_process_internal(false); update(); } if (p_what == NOTIFICATION_DRAG_BEGIN) { - single_select_defer = nullptr; if (cache.scroll_speed > 0) { scrolling = true; @@ -2962,11 +2812,8 @@ void Tree::_notification(int p_what) { } } if (p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS) { - if (drag_touching) { - if (drag_touching_deaccel) { - float pos = v_scroll->get_value(); pos += drag_speed * get_physics_process_delta_time(); @@ -3025,7 +2872,6 @@ void Tree::_notification(int p_what) { } if (p_what == NOTIFICATION_DRAW) { - update_cache(); update_scrollbars(); RID ci = get_canvas_item(); @@ -3050,16 +2896,13 @@ void Tree::_notification(int p_what) { draw_size.y -= tbh; if (root) { - draw_item(Point2(), draw_ofs, draw_size, root); } if (show_column_titles) { - //title buttons int ofs2 = cache.bg->get_margin(MARGIN_LEFT); for (int i = 0; i < columns.size(); i++) { - Ref<StyleBox> sb = (cache.click_type == Cache::CLICK_TITLE && cache.click_index == i) ? cache.title_button_pressed : ((cache.hover_type == Cache::CLICK_TITLE && cache.hover_index == i) ? cache.title_button_hover : cache.title_button); Ref<Font> f = cache.tb_font; Rect2 tbrect = Rect2(ofs2 - cache.offset.x, bg->get_margin(MARGIN_TOP), get_column_width(i), tbh); @@ -3077,7 +2920,6 @@ void Tree::_notification(int p_what) { } if (p_what == NOTIFICATION_RESIZED || p_what == NOTIFICATION_TRANSFORM_CHANGED) { - if (popup_edited_item != nullptr) { Rect2 rect = popup_edited_item->get_meta("__focus_rect"); Vector2 ofs(0, (text_editor->get_size().height - rect.size.height) / 2); @@ -3093,18 +2935,15 @@ void Tree::_notification(int p_what) { } Size2 Tree::get_minimum_size() const { - return Size2(1, 1); } TreeItem *Tree::create_item(TreeItem *p_parent, int p_idx) { - ERR_FAIL_COND_V(blocked > 0, nullptr); TreeItem *ti = nullptr; if (p_parent) { - // Append or insert a new item to the given parent. ti = memnew(TreeItem(this)); ERR_FAIL_COND_V(!ti, nullptr); @@ -3123,14 +2962,14 @@ TreeItem *Tree::create_item(TreeItem *p_parent, int p_idx) { c = c->next; } - if (prev) + if (prev) { prev->next = ti; - else + } else { p_parent->children = ti; + } ti->parent = p_parent; } else { - if (!root) { // No root exists, make the given item the new root. ti = memnew(TreeItem(this)); @@ -3148,61 +2987,56 @@ TreeItem *Tree::create_item(TreeItem *p_parent, int p_idx) { } TreeItem *Tree::get_root() { - return root; } -TreeItem *Tree::get_last_item() { +TreeItem *Tree::get_last_item() { TreeItem *last = root; while (last) { - - if (last->next) + if (last->next) { last = last->next; - else if (last->children) + } else if (last->children) { last = last->children; - else + } else { break; + } } return last; } void Tree::item_edited(int p_column, TreeItem *p_item, bool p_lmb) { - edited_item = p_item; edited_col = p_column; - if (p_lmb) + if (p_lmb) { emit_signal("item_edited"); - else + } else { emit_signal("item_rmb_edited"); + } } void Tree::item_changed(int p_column, TreeItem *p_item) { - update(); } void Tree::item_selected(int p_column, TreeItem *p_item) { - if (select_mode == SELECT_MULTI) { - - if (!p_item->cells[p_column].selectable) + if (!p_item->cells[p_column].selectable) { return; + } p_item->cells.write[p_column].selected = true; //emit_signal("multi_selected",p_item,p_column,true); - NO this is for TreeItem::select selected_col = p_column; } else { - select_single_item(p_item, root, p_column); } update(); } void Tree::item_deselected(int p_column, TreeItem *p_item) { - if (select_mode == SELECT_MULTI || select_mode == SELECT_SINGLE) { p_item->cells.write[p_column].selected = false; } @@ -3210,17 +3044,14 @@ void Tree::item_deselected(int p_column, TreeItem *p_item) { } void Tree::set_select_mode(SelectMode p_mode) { - select_mode = p_mode; } Tree::SelectMode Tree::get_select_mode() const { - return select_mode; } void Tree::deselect_all() { - TreeItem *item = get_next_selected(get_root()); while (item) { item->deselect(selected_col); @@ -3236,12 +3067,10 @@ void Tree::deselect_all() { } bool Tree::is_anything_selected() { - return (selected_item != nullptr); } void Tree::clear() { - ERR_FAIL_COND(blocked > 0); if (pressing_for_editor) { @@ -3266,27 +3095,25 @@ void Tree::clear() { }; void Tree::set_hide_root(bool p_enabled) { - hide_root = p_enabled; update(); } bool Tree::is_root_hidden() const { - return hide_root; } void Tree::set_column_min_width(int p_column, int p_min_width) { - ERR_FAIL_INDEX(p_column, columns.size()); - if (p_min_width < 1) + if (p_min_width < 1) { return; + } columns.write[p_column].min_width = p_min_width; update(); } -void Tree::set_column_expand(int p_column, bool p_expand) { +void Tree::set_column_expand(int p_column, bool p_expand) { ERR_FAIL_INDEX(p_column, columns.size()); columns.write[p_column].expand = p_expand; @@ -3294,87 +3121,80 @@ void Tree::set_column_expand(int p_column, bool p_expand) { } TreeItem *Tree::get_selected() const { - return selected_item; } int Tree::get_selected_column() const { - return selected_col; } TreeItem *Tree::get_edited() const { - return edited_item; } int Tree::get_edited_column() const { - return edited_col; } TreeItem *Tree::get_next_selected(TreeItem *p_item) { - /* if (!p_item) return nullptr; */ - if (!root) + if (!root) { return nullptr; + } while (true) { - if (!p_item) { p_item = root; } else { - if (p_item->children) { - p_item = p_item->children; } else if (p_item->next) { - p_item = p_item->next; } else { - while (!p_item->next) { - p_item = p_item->parent; - if (p_item == nullptr) + if (p_item == nullptr) { return nullptr; + } } p_item = p_item->next; } } - for (int i = 0; i < columns.size(); i++) - if (p_item->cells[i].selected) + for (int i = 0; i < columns.size(); i++) { + if (p_item->cells[i].selected) { return p_item; + } + } } return nullptr; } int Tree::get_column_width(int p_column) const { - ERR_FAIL_INDEX_V(p_column, columns.size(), -1); - if (!columns[p_column].expand) + if (!columns[p_column].expand) { return columns[p_column].min_width; + } Ref<StyleBox> bg = cache.bg; int expand_area = get_size().width - (bg->get_margin(MARGIN_LEFT) + bg->get_margin(MARGIN_RIGHT)); - if (v_scroll->is_visible_in_tree()) + if (v_scroll->is_visible_in_tree()) { expand_area -= v_scroll->get_combined_minimum_size().width; + } int expanding_columns = 0; int expanding_total = 0; for (int i = 0; i < columns.size(); i++) { - if (!columns[i].expand) { expand_area -= columns[i].min_width; } else { @@ -3383,8 +3203,9 @@ int Tree::get_column_width(int p_column) const { } } - if (expand_area < expanding_total) + if (expand_area < expanding_total) { return columns[p_column].min_width; + } ERR_FAIL_COND_V(expanding_columns == 0, -1); // shouldn't happen @@ -3392,56 +3213,52 @@ int Tree::get_column_width(int p_column) const { } void Tree::propagate_set_columns(TreeItem *p_item) { - p_item->cells.resize(columns.size()); TreeItem *c = p_item->get_children(); while (c) { - propagate_set_columns(c); c = c->get_next(); } } void Tree::set_columns(int p_columns) { - ERR_FAIL_COND(p_columns < 1); ERR_FAIL_COND(blocked > 0); columns.resize(p_columns); - if (root) + if (root) { propagate_set_columns(root); - if (selected_col >= p_columns) + } + if (selected_col >= p_columns) { selected_col = p_columns - 1; + } update(); } int Tree::get_columns() const { - return columns.size(); } void Tree::_scroll_moved(float) { - update(); } Rect2 Tree::get_custom_popup_rect() const { - return custom_popup_rect; } int Tree::get_item_offset(TreeItem *p_item) const { - TreeItem *it = root; int ofs = _get_title_button_height(); - if (!it) + if (!it) { return 0; + } while (true) { - - if (it == p_item) + if (it == p_item) { return ofs; + } ofs += compute_item_height(it); if (it != root || !hide_root) { @@ -3449,19 +3266,16 @@ int Tree::get_item_offset(TreeItem *p_item) const { } if (it->children && !it->collapsed) { - it = it->children; } else if (it->next) { - it = it->next; } else { - while (!it->next) { - it = it->parent; - if (it == nullptr) + if (it == nullptr) { return 0; + } } it = it->next; @@ -3518,12 +3332,10 @@ void Tree::ensure_cursor_is_visible() { } int Tree::get_pressed_button() const { - return pressed_button; } Rect2 Tree::get_item_rect(TreeItem *p_item, int p_column) const { - ERR_FAIL_NULL_V(p_item, Rect2()); ERR_FAIL_COND_V(p_item->tree != this, Rect2()); if (p_column != -1) { @@ -3540,7 +3352,6 @@ Rect2 Tree::get_item_rect(TreeItem *p_item, int p_column) const { r.position.x = 0; r.size.x = get_size().width; } else { - int accum = 0; for (int i = 0; i < p_column; i++) { accum += get_column_width(i); @@ -3553,43 +3364,38 @@ Rect2 Tree::get_item_rect(TreeItem *p_item, int p_column) const { } void Tree::set_column_titles_visible(bool p_show) { - show_column_titles = p_show; update(); } bool Tree::are_column_titles_visible() const { - return show_column_titles; } void Tree::set_column_title(int p_column, const String &p_title) { - ERR_FAIL_INDEX(p_column, columns.size()); columns.write[p_column].title = p_title; update(); } String Tree::get_column_title(int p_column) const { - ERR_FAIL_INDEX_V(p_column, columns.size(), ""); return columns[p_column].title; } Point2 Tree::get_scroll() const { - Point2 ofs; - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { ofs.x = h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { ofs.y = v_scroll->get_value(); + } return ofs; } void Tree::scroll_to_item(TreeItem *p_item) { - if (!is_visible_in_tree()) { - // hack to work around crash in get_item_rect() if Tree is not in tree. return; } @@ -3607,38 +3413,40 @@ void Tree::scroll_to_item(TreeItem *p_item) { } TreeItem *Tree::_search_item_text(TreeItem *p_at, const String &p_find, int *r_col, bool p_selectable, bool p_backwards) { - TreeItem *from = p_at; while (p_at) { - for (int i = 0; i < columns.size(); i++) { if (p_at->get_text(i).findn(p_find) == 0 && (!p_selectable || p_at->is_selectable(i))) { - if (r_col) + if (r_col) { *r_col = i; + } return p_at; } } - if (p_backwards) + if (p_backwards) { p_at = p_at->get_prev_visible(true); - else + } else { p_at = p_at->get_next_visible(true); + } - if ((p_at) == from) + if ((p_at) == from) { break; + } } return nullptr; } TreeItem *Tree::search_item_text(const String &p_find, int *r_col, bool p_selectable) { - TreeItem *from = get_selected(); - if (!from) + if (!from) { from = root; - if (!from) + } + if (!from) { return nullptr; + } return _search_item_text(from->get_next_visible(true), p_find, r_col, p_selectable); } @@ -3655,33 +3463,31 @@ TreeItem *Tree::get_item_with_text(const String &p_find) const { } void Tree::_do_incr_search(const String &p_add) { - uint64_t time = OS::get_singleton()->get_ticks_usec() / 1000; // convert to msec uint64_t diff = time - last_keypress; - if (diff > uint64_t(GLOBAL_DEF("gui/timers/incremental_search_max_interval_msec", 2000))) + if (diff > uint64_t(GLOBAL_DEF("gui/timers/incremental_search_max_interval_msec", 2000))) { incr_search = p_add; - else if (incr_search != p_add) + } else if (incr_search != p_add) { incr_search += p_add; + } last_keypress = time; int col; TreeItem *item = search_item_text(incr_search, &col, true); - if (!item) + if (!item) { return; + } item->select(col); ensure_cursor_is_visible(); } TreeItem *Tree::_find_item_at_pos(TreeItem *p_item, const Point2 &p_pos, int &r_column, int &h, int §ion) const { - Point2 pos = p_pos; if (root != p_item || !hide_root) { - h = compute_item_height(p_item) + cache.vseparation; if (pos.y < h) { - if (drop_mode_flags == DROP_MODE_ON_ITEM) { section = 0; } else if (drop_mode_flags == DROP_MODE_INBETWEEN) { @@ -3695,7 +3501,6 @@ TreeItem *Tree::_find_item_at_pos(TreeItem *p_item, const Point2 &p_pos, int &r_ } for (int i = 0; i < columns.size(); i++) { - int w = get_column_width(i); if (pos.x < w) { r_column = i; @@ -3707,26 +3512,25 @@ TreeItem *Tree::_find_item_at_pos(TreeItem *p_item, const Point2 &p_pos, int &r_ return nullptr; } else { - pos.y -= h; } } else { - h = 0; } - if (p_item->is_collapsed()) + if (p_item->is_collapsed()) { return nullptr; // do not try children, it's collapsed + } TreeItem *n = p_item->get_children(); while (n) { - int ch; TreeItem *r = _find_item_at_pos(n, pos, r_column, ch, section); pos.y -= ch; h += ch; - if (r) + if (r) { return r; + } n = n->get_next(); } @@ -3734,19 +3538,20 @@ TreeItem *Tree::_find_item_at_pos(TreeItem *p_item, const Point2 &p_pos, int &r_ } int Tree::get_column_at_position(const Point2 &p_pos) const { - if (root) { - Point2 pos = p_pos; pos -= cache.bg->get_offset(); pos.y -= _get_title_button_height(); - if (pos.y < 0) + if (pos.y < 0) { return -1; + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { pos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { pos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, pos, col, h, section); @@ -3760,19 +3565,20 @@ int Tree::get_column_at_position(const Point2 &p_pos) const { } int Tree::get_drop_section_at_position(const Point2 &p_pos) const { - if (root) { - Point2 pos = p_pos; pos -= cache.bg->get_offset(); pos.y -= _get_title_button_height(); - if (pos.y < 0) + if (pos.y < 0) { return -100; + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { pos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { pos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, pos, col, h, section); @@ -3784,26 +3590,27 @@ int Tree::get_drop_section_at_position(const Point2 &p_pos) const { return -100; } -TreeItem *Tree::get_item_at_position(const Point2 &p_pos) const { +TreeItem *Tree::get_item_at_position(const Point2 &p_pos) const { if (root) { - Point2 pos = p_pos; pos -= cache.bg->get_offset(); pos.y -= _get_title_button_height(); - if (pos.y < 0) + if (pos.y < 0) { return nullptr; + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { pos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { pos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, pos, col, h, section); if (it) { - return it; } } @@ -3812,30 +3619,31 @@ TreeItem *Tree::get_item_at_position(const Point2 &p_pos) const { } String Tree::get_tooltip(const Point2 &p_pos) const { - if (root) { - Point2 pos = p_pos; pos -= cache.bg->get_offset(); pos.y -= _get_title_button_height(); - if (pos.y < 0) + if (pos.y < 0) { return Control::get_tooltip(p_pos); + } - if (h_scroll->is_visible_in_tree()) + if (h_scroll->is_visible_in_tree()) { pos.x += h_scroll->get_value(); - if (v_scroll->is_visible_in_tree()) + } + if (v_scroll->is_visible_in_tree()) { pos.y += v_scroll->get_value(); + } int col, h, section; TreeItem *it = _find_item_at_pos(root, pos, col, h, section); if (it) { - const TreeItem::Cell &c = it->cells[col]; int col_width = get_column_width(col); - for (int i = 0; i < col; i++) + for (int i = 0; i < col; i++) { pos.x -= get_column_width(i); + } for (int j = c.buttons.size() - 1; j >= 0; j--) { Ref<Texture2D> b = c.buttons[j].texture; @@ -3849,10 +3657,11 @@ String Tree::get_tooltip(const Point2 &p_pos) const { col_width -= size.width; } String ret; - if (it->get_tooltip(col) == "") + if (it->get_tooltip(col) == "") { ret = it->get_text(col); - else + } else { ret = it->get_tooltip(col); + } return ret; } } @@ -3861,12 +3670,10 @@ String Tree::get_tooltip(const Point2 &p_pos) const { } void Tree::set_cursor_can_exit_tree(bool p_enable) { - cursor_can_exit_tree = p_enable; } bool Tree::can_cursor_exit_tree() const { - return cursor_can_exit_tree; } @@ -3876,13 +3683,13 @@ void Tree::set_hide_folding(bool p_hide) { } bool Tree::is_folding_hidden() const { - return hide_folding; } void Tree::set_drop_mode_flags(int p_flags) { - if (drop_mode_flags == p_flags) + if (drop_mode_flags == p_flags) { return; + } drop_mode_flags = p_flags; if (drop_mode_flags == 0) { drop_mode_over = nullptr; @@ -3892,27 +3699,22 @@ void Tree::set_drop_mode_flags(int p_flags) { } int Tree::get_drop_mode_flags() const { - return drop_mode_flags; } void Tree::set_edit_checkbox_cell_only_when_checkbox_is_pressed(bool p_enable) { - force_edit_checkbox_only_on_checkbox = p_enable; } bool Tree::get_edit_checkbox_cell_only_when_checkbox_is_pressed() const { - return force_edit_checkbox_only_on_checkbox; } void Tree::set_allow_rmb_select(bool p_allow) { - allow_rmb_select = p_allow; } bool Tree::get_allow_rmb_select() const { - return allow_rmb_select; } @@ -3921,12 +3723,10 @@ void Tree::set_allow_reselect(bool p_allow) { } bool Tree::get_allow_reselect() const { - return allow_reselect; } void Tree::_bind_methods() { - ClassDB::bind_method(D_METHOD("_gui_input"), &Tree::_gui_input); ClassDB::bind_method(D_METHOD("clear"), &Tree::clear); @@ -4014,7 +3814,6 @@ void Tree::_bind_methods() { } Tree::Tree() { - selected_col = 0; columns.resize(1); selected_item = nullptr; @@ -4118,7 +3917,6 @@ Tree::Tree() { } Tree::~Tree() { - if (root) { memdelete(root); } diff --git a/scene/gui/tree.h b/scene/gui/tree.h index 3c67a79558..46842e78a0 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -40,7 +40,6 @@ class Tree; class TreeItem : public Object { - GDCLASS(TreeItem, Object); public: @@ -63,7 +62,6 @@ private: friend class Tree; struct Cell { - TreeCellMode mode; Ref<Texture2D> icon; @@ -111,7 +109,6 @@ private: Vector<Button> buttons; Cell() { - custom_draw_obj = ObjectID(); custom_button = false; mode = TreeItem::CELL_MODE_STRING; @@ -293,7 +290,6 @@ VARIANT_ENUM_CAST(TreeItem::TextAlign); class VBoxContainer; class Tree : public Control { - GDCLASS(Tree, Control); public: @@ -350,7 +346,6 @@ private: int drop_mode_flags; struct ColumnInfo { - int min_width; bool expand; String title; @@ -404,7 +399,6 @@ private: void propagate_set_columns(TreeItem *p_item); struct Cache { - Ref<Font> font; Ref<Font> tb_font; Ref<StyleBox> bg; diff --git a/scene/gui/video_player.cpp b/scene/gui/video_player.cpp index ac1e4a5629..881df06d8f 100644 --- a/scene/gui/video_player.cpp +++ b/scene/gui/video_player.cpp @@ -35,7 +35,6 @@ #include "servers/audio_server.h" int VideoPlayer::sp_get_channel_count() const { - if (playback.is_null()) { return 0; } @@ -44,7 +43,6 @@ int VideoPlayer::sp_get_channel_count() const { } bool VideoPlayer::mix(AudioFrame *p_buffer, int p_frames) { - // Check the amount resampler can really handle. // If it cannot, wait "wait_resampler_phase_limit" times. // This mechanism contributes to smoother pause/unpause operation. @@ -59,7 +57,6 @@ bool VideoPlayer::mix(AudioFrame *p_buffer, int p_frames) { // Called from main thread (eg VideoStreamPlaybackWebm::update) int VideoPlayer::_audio_mix_callback(void *p_udata, const float *p_data, int p_frames) { - ERR_FAIL_NULL_V(p_udata, 0); ERR_FAIL_NULL_V(p_data, 0); @@ -79,14 +76,12 @@ int VideoPlayer::_audio_mix_callback(void *p_udata, const float *p_data, int p_f } void VideoPlayer::_mix_audios(void *p_self) { - ERR_FAIL_NULL(p_self); reinterpret_cast<VideoPlayer *>(p_self)->_mix_audio(); } // Called from audio thread void VideoPlayer::_mix_audio() { - if (!stream.is_valid()) { return; } @@ -98,8 +93,9 @@ void VideoPlayer::_mix_audio() { int buffer_size = mix_buffer.size(); // Resample - if (!mix(buffer, buffer_size)) + if (!mix(buffer, buffer_size)) { return; + } AudioFrame vol = AudioFrame(volume, volume); @@ -110,7 +106,6 @@ void VideoPlayer::_mix_audio() { ERR_FAIL_COND(!target); for (int j = 0; j < buffer_size; j++) { - target[j] += buffer[j] * vol; } @@ -123,7 +118,6 @@ void VideoPlayer::_mix_audio() { } for (int j = 0; j < buffer_size; j++) { - AudioFrame frame = buffer[j] * vol; for (int k = 0; k < cc; k++) { targets[k][j] += frame; @@ -133,11 +127,8 @@ void VideoPlayer::_mix_audio() { } void VideoPlayer::_notification(int p_notification) { - switch (p_notification) { - case NOTIFICATION_ENTER_TREE: { - AudioServer::get_singleton()->add_callback(_mix_audios, this); if (stream.is_valid() && autoplay && !Engine::get_singleton()->is_editor_hint()) { @@ -147,25 +138,25 @@ void VideoPlayer::_notification(int p_notification) { } break; case NOTIFICATION_EXIT_TREE: { - AudioServer::get_singleton()->remove_callback(_mix_audios, this); } break; case NOTIFICATION_INTERNAL_PROCESS: { - bus_index = AudioServer::get_singleton()->thread_find_bus_index(bus); - if (stream.is_null() || paused || playback.is_null() || !playback->is_playing()) + if (stream.is_null() || paused || playback.is_null() || !playback->is_playing()) { return; + } double audio_time = USEC_TO_SEC(OS::get_singleton()->get_ticks_usec()); double delta = last_audio_time == 0 ? 0 : audio_time - last_audio_time; last_audio_time = audio_time; - if (delta == 0) + if (delta == 0) { return; + } playback->update(delta); // playback->is_playing() returns false in the last video frame @@ -176,11 +167,12 @@ void VideoPlayer::_notification(int p_notification) { } break; case NOTIFICATION_DRAW: { - - if (texture.is_null()) + if (texture.is_null()) { return; - if (texture->get_width() == 0) + } + if (texture->get_width() == 0) { return; + } Size2 s = expand ? get_size() : texture->get_size(); draw_texture_rect(texture, Rect2(Point2(), s), false); @@ -190,27 +182,24 @@ void VideoPlayer::_notification(int p_notification) { }; Size2 VideoPlayer::get_minimum_size() const { - - if (!expand && !texture.is_null()) + if (!expand && !texture.is_null()) { return texture->get_size(); - else + } else { return Size2(); + } } void VideoPlayer::set_expand(bool p_expand) { - expand = p_expand; update(); minimum_size_changed(); } bool VideoPlayer::has_expand() const { - return expand; } void VideoPlayer::set_stream(const Ref<VideoStream> &p_stream) { - stop(); AudioServer::get_singleton()->lock(); mix_buffer.resize(AudioServer::get_singleton()->thread_get_mix_buffer_size()); @@ -232,14 +221,16 @@ void VideoPlayer::set_stream(const Ref<VideoStream> &p_stream) { const int channels = playback->get_channels(); AudioServer::get_singleton()->lock(); - if (channels > 0) + if (channels > 0) { resampler.setup(channels, playback->get_mix_rate(), AudioServer::get_singleton()->get_mix_rate(), buffering_ms, 0); - else + } else { resampler.clear(); + } AudioServer::get_singleton()->unlock(); - if (channels > 0) + if (channels > 0) { playback->set_mix_callback(_audio_mix_callback, this); + } } else { texture.unref(); @@ -256,15 +247,14 @@ void VideoPlayer::set_stream(const Ref<VideoStream> &p_stream) { }; Ref<VideoStream> VideoPlayer::get_stream() const { - return stream; }; void VideoPlayer::play() { - ERR_FAIL_COND(!is_inside_tree()); - if (playback.is_null()) + if (playback.is_null()) { return; + } playback->stop(); playback->play(); set_process_internal(true); @@ -274,11 +264,12 @@ void VideoPlayer::play() { }; void VideoPlayer::stop() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; - if (playback.is_null()) + } + if (playback.is_null()) { return; + } playback->stop(); // AudioServer::get_singleton()->stream_set_active(stream_rid,false); @@ -288,15 +279,14 @@ void VideoPlayer::stop() { }; bool VideoPlayer::is_playing() const { - - if (playback.is_null()) + if (playback.is_null()) { return false; + } return playback->is_playing(); }; void VideoPlayer::set_paused(bool p_paused) { - paused = p_paused; if (playback.is_valid()) { playback->set_paused(p_paused); @@ -306,17 +296,14 @@ void VideoPlayer::set_paused(bool p_paused) { }; bool VideoPlayer::is_paused() const { - return paused; } void VideoPlayer::set_buffering_msec(int p_msec) { - buffering_ms = p_msec; } int VideoPlayer::get_buffering_msec() const { - return buffering_ms; } @@ -325,76 +312,70 @@ void VideoPlayer::set_audio_track(int p_track) { } int VideoPlayer::get_audio_track() const { - return audio_track; } void VideoPlayer::set_volume(float p_vol) { - volume = p_vol; }; float VideoPlayer::get_volume() const { - return volume; }; void VideoPlayer::set_volume_db(float p_db) { - - if (p_db < -79) + if (p_db < -79) { set_volume(0); - else + } else { set_volume(Math::db2linear(p_db)); + } }; float VideoPlayer::get_volume_db() const { - - if (volume == 0) + if (volume == 0) { return -80; - else + } else { return Math::linear2db(volume); + } }; String VideoPlayer::get_stream_name() const { - - if (stream.is_null()) + if (stream.is_null()) { return "<No Stream>"; + } return stream->get_name(); }; float VideoPlayer::get_stream_position() const { - - if (playback.is_null()) + if (playback.is_null()) { return 0; + } return playback->get_playback_position(); }; void VideoPlayer::set_stream_position(float p_position) { - - if (playback.is_valid()) + if (playback.is_valid()) { playback->seek(p_position); + } } Ref<Texture2D> VideoPlayer::get_video_texture() const { - - if (playback.is_valid()) + if (playback.is_valid()) { return playback->get_texture(); + } return Ref<Texture2D>(); } void VideoPlayer::set_autoplay(bool p_enable) { - autoplay = p_enable; }; bool VideoPlayer::has_autoplay() const { - return autoplay; }; void VideoPlayer::set_bus(const StringName &p_bus) { - //if audio is active, must lock this AudioServer::get_singleton()->lock(); bus = p_bus; @@ -402,7 +383,6 @@ void VideoPlayer::set_bus(const StringName &p_bus) { } StringName VideoPlayer::get_bus() const { - for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { if (AudioServer::get_singleton()->get_bus_name(i) == bus) { return bus; @@ -412,13 +392,12 @@ StringName VideoPlayer::get_bus() const { } void VideoPlayer::_validate_property(PropertyInfo &p_property) const { - if (p_property.name == "bus") { - String options; for (int i = 0; i < AudioServer::get_singleton()->get_bus_count(); i++) { - if (i > 0) + if (i > 0) { options += ","; + } String name = AudioServer::get_singleton()->get_bus_name(i); options += name; } @@ -428,7 +407,6 @@ void VideoPlayer::_validate_property(PropertyInfo &p_property) const { } void VideoPlayer::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_stream", "stream"), &VideoPlayer::set_stream); ClassDB::bind_method(D_METHOD("get_stream"), &VideoPlayer::get_stream); @@ -485,7 +463,6 @@ void VideoPlayer::_bind_methods() { } VideoPlayer::VideoPlayer() { - volume = 1; loops = false; paused = false; @@ -506,7 +483,6 @@ VideoPlayer::VideoPlayer() { }; VideoPlayer::~VideoPlayer() { - // if (stream_rid.is_valid()) // AudioServer::get_singleton()->free(stream_rid); resampler.clear(); //Not necessary here, but make in consistent with other "stream_player" classes diff --git a/scene/gui/video_player.h b/scene/gui/video_player.h index 78e7fa05f8..551c079b3c 100644 --- a/scene/gui/video_player.h +++ b/scene/gui/video_player.h @@ -37,11 +37,9 @@ #include "servers/audio_server.h" class VideoPlayer : public Control { - GDCLASS(VideoPlayer, Control); struct Output { - AudioFrame vol; int bus_index; Viewport *viewport; //pointer only used for reference to previous mix diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index e91826d44b..524ff346d1 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -48,7 +48,6 @@ Map<CanvasItemMaterial::MaterialKey, CanvasItemMaterial::ShaderData> CanvasItemM CanvasItemMaterial::ShaderNames *CanvasItemMaterial::shader_names = nullptr; void CanvasItemMaterial::init_shaders() { - dirty_materials = memnew(SelfList<CanvasItemMaterial>::List); shader_names = memnew(ShaderNames); @@ -59,19 +58,18 @@ void CanvasItemMaterial::init_shaders() { } void CanvasItemMaterial::finish_shaders() { - memdelete(dirty_materials); memdelete(shader_names); dirty_materials = nullptr; } void CanvasItemMaterial::_update_shader() { - dirty_materials->remove(&element); MaterialKey mk = _compute_key(); - if (mk.key == current_key.key) + if (mk.key == current_key.key) { return; //no update required in the end + } if (shader_map.has(current_key)) { shader_map[current_key].users--; @@ -85,7 +83,6 @@ void CanvasItemMaterial::_update_shader() { current_key = mk; if (shader_map.has(mk)) { - RS::get_singleton()->material_set_shader(_get_material(), shader_map[mk].shader); shader_map[mk].users++; return; @@ -129,7 +126,6 @@ void CanvasItemMaterial::_update_shader() { code += ";\n"; if (particles_animation) { - code += "uniform int particles_anim_h_frames;\n"; code += "uniform int particles_anim_v_frames;\n"; code += "uniform bool particles_anim_loop;\n"; @@ -165,17 +161,14 @@ void CanvasItemMaterial::_update_shader() { } void CanvasItemMaterial::flush_changes() { - MutexLock lock(material_mutex); while (dirty_materials->first()) { - dirty_materials->first()->self()->_update_shader(); } } void CanvasItemMaterial::_queue_shader_change() { - MutexLock lock(material_mutex); if (!element.in_list()) { @@ -184,13 +177,12 @@ void CanvasItemMaterial::_queue_shader_change() { } bool CanvasItemMaterial::_is_shader_dirty() const { - MutexLock lock(material_mutex); return element.in_list(); } -void CanvasItemMaterial::set_blend_mode(BlendMode p_blend_mode) { +void CanvasItemMaterial::set_blend_mode(BlendMode p_blend_mode) { blend_mode = p_blend_mode; _queue_shader_change(); } @@ -200,13 +192,11 @@ CanvasItemMaterial::BlendMode CanvasItemMaterial::get_blend_mode() const { } void CanvasItemMaterial::set_light_mode(LightMode p_light_mode) { - light_mode = p_light_mode; _queue_shader_change(); } CanvasItemMaterial::LightMode CanvasItemMaterial::get_light_mode() const { - return light_mode; } @@ -221,34 +211,29 @@ bool CanvasItemMaterial::get_particles_animation() const { } void CanvasItemMaterial::set_particles_anim_h_frames(int p_frames) { - particles_anim_h_frames = p_frames; RS::get_singleton()->material_set_param(_get_material(), shader_names->particles_anim_h_frames, p_frames); } int CanvasItemMaterial::get_particles_anim_h_frames() const { - return particles_anim_h_frames; } -void CanvasItemMaterial::set_particles_anim_v_frames(int p_frames) { +void CanvasItemMaterial::set_particles_anim_v_frames(int p_frames) { particles_anim_v_frames = p_frames; RS::get_singleton()->material_set_param(_get_material(), shader_names->particles_anim_v_frames, p_frames); } int CanvasItemMaterial::get_particles_anim_v_frames() const { - return particles_anim_v_frames; } void CanvasItemMaterial::set_particles_anim_loop(bool p_loop) { - particles_anim_loop = p_loop; RS::get_singleton()->material_set_param(_get_material(), shader_names->particles_anim_loop, particles_anim_loop); } bool CanvasItemMaterial::get_particles_anim_loop() const { - return particles_anim_loop; } @@ -259,18 +244,15 @@ void CanvasItemMaterial::_validate_property(PropertyInfo &property) const { } RID CanvasItemMaterial::get_shader_rid() const { - ERR_FAIL_COND_V(!shader_map.has(current_key), RID()); return shader_map[current_key].shader; } Shader::Mode CanvasItemMaterial::get_shader_mode() const { - return Shader::MODE_CANVAS_ITEM; } void CanvasItemMaterial::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_blend_mode", "blend_mode"), &CanvasItemMaterial::set_blend_mode); ClassDB::bind_method(D_METHOD("get_blend_mode"), &CanvasItemMaterial::get_blend_mode); @@ -310,7 +292,6 @@ void CanvasItemMaterial::_bind_methods() { CanvasItemMaterial::CanvasItemMaterial() : element(this) { - blend_mode = BLEND_MODE_MIX; light_mode = LIGHT_MODE_NORMAL; particles_animation = false; @@ -325,7 +306,6 @@ CanvasItemMaterial::CanvasItemMaterial() : } CanvasItemMaterial::~CanvasItemMaterial() { - MutexLock lock(material_mutex); if (shader_map.has(current_key)) { @@ -356,15 +336,16 @@ Transform2D CanvasItem::_edit_get_transform() const { #endif bool CanvasItem::is_visible_in_tree() const { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return false; + } const CanvasItem *p = this; while (p) { - if (!p->visible) + if (!p->visible) { return false; + } if (p->window && !p->window->is_visible()) { return false; } @@ -375,54 +356,56 @@ bool CanvasItem::is_visible_in_tree() const { } void CanvasItem::_propagate_visibility_changed(bool p_visible) { - if (p_visible && first_draw) { //avoid propagating it twice first_draw = false; } notification(NOTIFICATION_VISIBILITY_CHANGED); - if (p_visible) + if (p_visible) { update(); //todo optimize - else + } else { emit_signal(SceneStringNames::get_singleton()->hide); + } _block(); for (int i = 0; i < get_child_count(); i++) { - CanvasItem *c = Object::cast_to<CanvasItem>(get_child(i)); - if (c && c->visible) //should the toplevels stop propagation? i think so but.. + if (c && c->visible) { //should the toplevels stop propagation? i think so but.. c->_propagate_visibility_changed(p_visible); + } } _unblock(); } void CanvasItem::show() { - - if (visible) + if (visible) { return; + } visible = true; RenderingServer::get_singleton()->canvas_item_set_visible(canvas_item, true); - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _propagate_visibility_changed(true); _change_notify("visible"); } void CanvasItem::hide() { - - if (!visible) + if (!visible) { return; + } visible = false; RenderingServer::get_singleton()->canvas_item_set_visible(canvas_item, false); - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _propagate_visibility_changed(false); _change_notify("visible"); @@ -434,7 +417,6 @@ CanvasItem *CanvasItem::get_current_item_drawn() { } void CanvasItem::_update_callback() { - if (!is_inside_tree()) { pending_update = false; return; @@ -462,13 +444,13 @@ void CanvasItem::_update_callback() { } Transform2D CanvasItem::get_global_transform_with_canvas() const { - - if (canvas_layer) + if (canvas_layer) { return canvas_layer->get_transform() * get_global_transform(); - else if (is_inside_tree()) + } else if (is_inside_tree()) { return get_viewport()->get_canvas_transform() * get_global_transform(); - else + } else { return get_global_transform(); + } } Transform2D CanvasItem::get_screen_transform() const { @@ -491,12 +473,12 @@ Transform2D CanvasItem::get_global_transform() const { ERR_FAIL_COND_V(!is_inside_tree(), get_transform()); #endif if (global_invalid) { - const CanvasItem *pi = get_parent_item(); - if (pi) + if (pi) { global_transform = pi->get_global_transform() * get_transform(); - else + } else { global_transform = get_transform(); + } global_invalid = false; } @@ -505,26 +487,24 @@ Transform2D CanvasItem::get_global_transform() const { } void CanvasItem::_toplevel_raise_self() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (canvas_layer) + if (canvas_layer) { RenderingServer::get_singleton()->canvas_item_set_draw_index(canvas_item, canvas_layer->get_sort_index()); - else + } else { RenderingServer::get_singleton()->canvas_item_set_draw_index(canvas_item, get_viewport()->gui_get_canvas_sort_index()); + } } void CanvasItem::_enter_canvas() { - if ((!Object::cast_to<CanvasItem>(get_parent())) || toplevel) { - Node *n = this; canvas_layer = nullptr; while (n) { - canvas_layer = Object::cast_to<CanvasLayer>(n); if (canvas_layer) { break; @@ -536,25 +516,26 @@ void CanvasItem::_enter_canvas() { } RID canvas; - if (canvas_layer) + if (canvas_layer) { canvas = canvas_layer->get_canvas(); - else + } else { canvas = get_viewport()->find_world_2d()->get_canvas(); + } RenderingServer::get_singleton()->canvas_item_set_parent(canvas_item, canvas); group = "root_canvas" + itos(canvas.get_id()); add_to_group(group); - if (canvas_layer) + if (canvas_layer) { canvas_layer->reset_sort_index(); - else + } else { get_viewport()->gui_reset_canvas_sort_index(); + } get_tree()->call_group_flags(SceneTree::GROUP_CALL_UNIQUE, group, "_toplevel_raise_self"); } else { - CanvasItem *parent = get_parent_item(); canvas_layer = parent->canvas_layer; RenderingServer::get_singleton()->canvas_item_set_parent(canvas_item, parent->get_canvas_item()); @@ -568,7 +549,6 @@ void CanvasItem::_enter_canvas() { } void CanvasItem::_exit_canvas() { - notification(NOTIFICATION_EXIT_CANVAS, true); //reverse the notification RenderingServer::get_singleton()->canvas_item_set_parent(canvas_item, RID()); canvas_layer = nullptr; @@ -576,10 +556,8 @@ void CanvasItem::_exit_canvas() { } void CanvasItem::_notification(int p_what) { - switch (p_what) { case NOTIFICATION_ENTER_TREE: { - _update_texture_filter_changed(false); _update_texture_repeat_changed(false); @@ -587,8 +565,9 @@ void CanvasItem::_notification(int p_what) { Node *parent = get_parent(); if (parent) { CanvasItem *ci = Object::cast_to<CanvasItem>(parent); - if (ci) + if (ci) { C = ci->children_items.push_back(this); + } if (!ci) { //look for a window Viewport *viewport = nullptr; @@ -615,9 +594,9 @@ void CanvasItem::_notification(int p_what) { } } break; case NOTIFICATION_MOVED_IN_PARENT: { - - if (!is_inside_tree()) + if (!is_inside_tree()) { break; + } if (group != "") { get_tree()->call_group_flags(SceneTree::GROUP_CALL_UNIQUE, group, "_toplevel_raise_self"); @@ -629,8 +608,9 @@ void CanvasItem::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { - if (xform_change.in_list()) + if (xform_change.in_list()) { get_tree()->xform_change_list.remove(&xform_change); + } _exit_canvas(); if (C) { Object::cast_to<CanvasItem>(get_parent())->children_items.erase(C); @@ -643,41 +623,38 @@ void CanvasItem::_notification(int p_what) { } break; case NOTIFICATION_DRAW: case NOTIFICATION_TRANSFORM_CHANGED: { - } break; case NOTIFICATION_VISIBILITY_CHANGED: { - emit_signal(SceneStringNames::get_singleton()->visibility_changed); } break; } } void CanvasItem::set_visible(bool p_visible) { - - if (p_visible) + if (p_visible) { show(); - else + } else { hide(); + } } void CanvasItem::_window_visibility_changed() { - if (visible) { _propagate_visibility_changed(window->is_visible()); } } bool CanvasItem::is_visible() const { - return visible; } void CanvasItem::update() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; - if (pending_update) + } + if (pending_update) { return; + } pending_update = true; @@ -685,22 +662,22 @@ void CanvasItem::update() { } void CanvasItem::set_modulate(const Color &p_modulate) { - - if (modulate == p_modulate) + if (modulate == p_modulate) { return; + } modulate = p_modulate; RenderingServer::get_singleton()->canvas_item_set_modulate(canvas_item, modulate); } -Color CanvasItem::get_modulate() const { +Color CanvasItem::get_modulate() const { return modulate; } void CanvasItem::set_as_toplevel(bool p_toplevel) { - - if (toplevel == p_toplevel) + if (toplevel == p_toplevel) { return; + } if (!is_inside_tree()) { toplevel = p_toplevel; @@ -713,61 +690,57 @@ void CanvasItem::set_as_toplevel(bool p_toplevel) { } bool CanvasItem::is_set_as_toplevel() const { - return toplevel; } CanvasItem *CanvasItem::get_parent_item() const { - - if (toplevel) + if (toplevel) { return nullptr; + } return Object::cast_to<CanvasItem>(get_parent()); } void CanvasItem::set_self_modulate(const Color &p_self_modulate) { - - if (self_modulate == p_self_modulate) + if (self_modulate == p_self_modulate) { return; + } self_modulate = p_self_modulate; RenderingServer::get_singleton()->canvas_item_set_self_modulate(canvas_item, self_modulate); } -Color CanvasItem::get_self_modulate() const { +Color CanvasItem::get_self_modulate() const { return self_modulate; } void CanvasItem::set_light_mask(int p_light_mask) { - - if (light_mask == p_light_mask) + if (light_mask == p_light_mask) { return; + } light_mask = p_light_mask; RS::get_singleton()->canvas_item_set_light_mask(canvas_item, p_light_mask); } int CanvasItem::get_light_mask() const { - return light_mask; } void CanvasItem::item_rect_changed(bool p_size_changed) { - - if (p_size_changed) + if (p_size_changed) { update(); + } emit_signal(SceneStringNames::get_singleton()->item_rect_changed); } void CanvasItem::draw_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, float p_width) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); RenderingServer::get_singleton()->canvas_item_add_line(canvas_item, p_from, p_to, p_color, p_width); } void CanvasItem::draw_polyline(const Vector<Point2> &p_points, const Color &p_color, float p_width) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); Vector<Color> colors; @@ -776,14 +749,12 @@ void CanvasItem::draw_polyline(const Vector<Point2> &p_points, const Color &p_co } void CanvasItem::draw_polyline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); RenderingServer::get_singleton()->canvas_item_add_polyline(canvas_item, p_points, p_colors, p_width); } void CanvasItem::draw_arc(const Vector2 &p_center, float p_radius, float p_start_angle, float p_end_angle, int p_point_count, const Color &p_color, float p_width) { - Vector<Point2> points; points.resize(p_point_count); const float delta_angle = p_end_angle - p_start_angle; @@ -796,7 +767,6 @@ void CanvasItem::draw_arc(const Vector2 &p_center, float p_radius, float p_start } void CanvasItem::draw_multiline(const Vector<Point2> &p_points, const Color &p_color, float p_width) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); Vector<Color> colors; @@ -805,14 +775,12 @@ void CanvasItem::draw_multiline(const Vector<Point2> &p_points, const Color &p_c } void CanvasItem::draw_multiline_colors(const Vector<Point2> &p_points, const Vector<Color> &p_colors, float p_width) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); RenderingServer::get_singleton()->canvas_item_add_multiline(canvas_item, p_points, p_colors, p_width); } void CanvasItem::draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_filled, float p_width) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); if (p_filled) { @@ -859,14 +827,12 @@ void CanvasItem::draw_rect(const Rect2 &p_rect, const Color &p_color, bool p_fil } void CanvasItem::draw_circle(const Point2 &p_pos, float p_radius, const Color &p_color) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); RenderingServer::get_singleton()->canvas_item_add_circle(canvas_item, p_pos, p_radius, p_color); } void CanvasItem::draw_texture(const Ref<Texture2D> &p_texture, const Point2 &p_pos, const Color &p_modulate, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_texture.is_null()); @@ -875,14 +841,13 @@ void CanvasItem::draw_texture(const Ref<Texture2D> &p_texture, const Point2 &p_p } void CanvasItem::draw_texture_rect(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_texture.is_null()); p_texture->draw_rect(canvas_item, p_rect, p_tile, p_modulate, p_transpose, p_normal_map, p_specular_map, p_specular_color_shininess, RS::CanvasItemTextureFilter(p_texture_filter), RS::CanvasItemTextureRepeat(p_texture_repeat)); } -void CanvasItem::draw_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, bool p_clip_uv, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { +void CanvasItem::draw_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, bool p_clip_uv, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_texture.is_null()); p_texture->draw_rect_region(canvas_item, p_rect, p_src_rect, p_modulate, p_transpose, p_normal_map, p_specular_map, p_specular_color_shininess, RS::CanvasItemTextureFilter(p_texture_filter), RS::CanvasItemTextureRepeat(p_texture_repeat), p_clip_uv); @@ -895,8 +860,8 @@ void CanvasItem::draw_style_box(const Ref<StyleBox> &p_style_box, const Rect2 &p p_style_box->draw(canvas_item, p_rect); } -void CanvasItem::draw_primitive(const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, Ref<Texture2D> p_texture, float p_width, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { +void CanvasItem::draw_primitive(const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, Ref<Texture2D> p_texture, float p_width, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); RID rid = p_texture.is_valid() ? p_texture->get_rid() : RID(); @@ -905,8 +870,8 @@ void CanvasItem::draw_primitive(const Vector<Point2> &p_points, const Vector<Col RenderingServer::get_singleton()->canvas_item_add_primitive(canvas_item, p_points, p_colors, p_uvs, rid, p_width, rid_normal, rid_specular, p_specular_color_shininess, RS::CanvasItemTextureFilter(p_texture_filter), RS::CanvasItemTextureRepeat(p_texture_repeat)); } -void CanvasItem::draw_set_transform(const Point2 &p_offset, float p_rot, const Size2 &p_scale) { +void CanvasItem::draw_set_transform(const Point2 &p_offset, float p_rot, const Size2 &p_scale) { ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); Transform2D xform(p_rot, p_offset); @@ -915,14 +880,12 @@ void CanvasItem::draw_set_transform(const Point2 &p_offset, float p_rot, const S } void CanvasItem::draw_set_transform_matrix(const Transform2D &p_matrix) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); RenderingServer::get_singleton()->canvas_item_add_set_transform(canvas_item, p_matrix); } void CanvasItem::draw_polygon(const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, Ref<Texture2D> p_texture, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); RID rid = p_texture.is_valid() ? p_texture->get_rid() : RID(); @@ -933,7 +896,6 @@ void CanvasItem::draw_polygon(const Vector<Point2> &p_points, const Vector<Color } void CanvasItem::draw_colored_polygon(const Vector<Point2> &p_points, const Color &p_color, const Vector<Point2> &p_uvs, Ref<Texture2D> p_texture, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); Vector<Color> colors; @@ -946,7 +908,6 @@ void CanvasItem::draw_colored_polygon(const Vector<Point2> &p_points, const Colo } void CanvasItem::draw_mesh(const Ref<Mesh> &p_mesh, const Ref<Texture2D> &p_texture, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, const Transform2D &p_transform, const Color &p_modulate, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { - ERR_FAIL_COND(p_mesh.is_null()); RID texture_rid = p_texture.is_valid() ? p_texture->get_rid() : RID(); RID normal_map_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); @@ -954,8 +915,8 @@ void CanvasItem::draw_mesh(const Ref<Mesh> &p_mesh, const Ref<Texture2D> &p_text RenderingServer::get_singleton()->canvas_item_add_mesh(canvas_item, p_mesh->get_rid(), p_transform, p_modulate, texture_rid, normal_map_rid, specular_map_rid, p_specular_color_shininess, RS::CanvasItemTextureFilter(p_texture_filter), RS::CanvasItemTextureRepeat(p_texture_repeat)); } -void CanvasItem::draw_multimesh(const Ref<MultiMesh> &p_multimesh, const Ref<Texture2D> &p_texture, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { +void CanvasItem::draw_multimesh(const Ref<MultiMesh> &p_multimesh, const Ref<Texture2D> &p_texture, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, TextureFilter p_texture_filter, TextureRepeat p_texture_repeat) { ERR_FAIL_COND(p_multimesh.is_null()); RID texture_rid = p_texture.is_valid() ? p_texture->get_rid() : RID(); RID normal_map_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); @@ -965,7 +926,6 @@ void CanvasItem::draw_multimesh(const Ref<MultiMesh> &p_multimesh, const Ref<Tex } void CanvasItem::draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_text, const Color &p_modulate, int p_clip_w) { - ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_font.is_null()); @@ -973,7 +933,6 @@ void CanvasItem::draw_string(const Ref<Font> &p_font, const Point2 &p_pos, const } float CanvasItem::draw_char(const Ref<Font> &p_font, const Point2 &p_pos, const String &p_char, const String &p_next, const Color &p_modulate) { - ERR_FAIL_COND_V_MSG(!drawing, 0, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND_V(p_char.length() != 1, 0); @@ -986,7 +945,6 @@ float CanvasItem::draw_char(const Ref<Font> &p_font, const Point2 &p_pos, const } void CanvasItem::_notify_transform(CanvasItem *p_node) { - /* This check exists to avoid re-propagating the transform * notification down the tree on dirty nodes. It provides * optimization by avoiding redundancy (nodes are dirty, will get the @@ -1001,38 +959,37 @@ void CanvasItem::_notify_transform(CanvasItem *p_node) { if (p_node->notify_transform && !p_node->xform_change.in_list()) { if (!p_node->block_transform_notify) { - if (p_node->is_inside_tree()) + if (p_node->is_inside_tree()) { get_tree()->xform_change_list.add(&p_node->xform_change); + } } } for (List<CanvasItem *>::Element *E = p_node->children_items.front(); E; E = E->next()) { - CanvasItem *ci = E->get(); - if (ci->toplevel) + if (ci->toplevel) { continue; + } _notify_transform(ci); } } Rect2 CanvasItem::get_viewport_rect() const { - ERR_FAIL_COND_V(!is_inside_tree(), Rect2()); return get_viewport()->get_visible_rect(); } RID CanvasItem::get_canvas() const { - ERR_FAIL_COND_V(!is_inside_tree(), RID()); - if (canvas_layer) + if (canvas_layer) { return canvas_layer->get_canvas(); - else + } else { return get_viewport()->find_world_2d()->get_canvas(); + } } ObjectID CanvasItem::get_canvas_layer_instance_id() const { - if (canvas_layer) { return canvas_layer->get_instance_id(); } else { @@ -1041,7 +998,6 @@ ObjectID CanvasItem::get_canvas_layer_instance_id() const { } CanvasItem *CanvasItem::get_toplevel() const { - CanvasItem *ci = const_cast<CanvasItem *>(this); while (!ci->toplevel && Object::cast_to<CanvasItem>(ci->get_parent())) { ci = Object::cast_to<CanvasItem>(ci->get_parent()); @@ -1051,7 +1007,6 @@ CanvasItem *CanvasItem::get_toplevel() const { } Ref<World2D> CanvasItem::get_world_2d() const { - ERR_FAIL_COND_V(!is_inside_tree(), Ref<World2D>()); CanvasItem *tl = get_toplevel(); @@ -1064,7 +1019,6 @@ Ref<World2D> CanvasItem::get_world_2d() const { } RID CanvasItem::get_viewport_rid() const { - ERR_FAIL_COND_V(!is_inside_tree(), RID()); return get_viewport()->get_viewport_rid(); } @@ -1074,51 +1028,45 @@ void CanvasItem::set_block_transform_notify(bool p_enable) { } bool CanvasItem::is_block_transform_notify_enabled() const { - return block_transform_notify; } void CanvasItem::set_draw_behind_parent(bool p_enable) { - - if (behind == p_enable) + if (behind == p_enable) { return; + } behind = p_enable; RenderingServer::get_singleton()->canvas_item_set_draw_behind_parent(canvas_item, behind); } bool CanvasItem::is_draw_behind_parent_enabled() const { - return behind; } void CanvasItem::set_material(const Ref<Material> &p_material) { - material = p_material; RID rid; - if (material.is_valid()) + if (material.is_valid()) { rid = material->get_rid(); + } RS::get_singleton()->canvas_item_set_material(canvas_item, rid); _change_notify(); //properties for material exposed } void CanvasItem::set_use_parent_material(bool p_use_parent_material) { - use_parent_material = p_use_parent_material; RS::get_singleton()->canvas_item_set_use_parent_material(canvas_item, p_use_parent_material); } bool CanvasItem::get_use_parent_material() const { - return use_parent_material; } Ref<Material> CanvasItem::get_material() const { - return material; } Vector2 CanvasItem::make_canvas_position_local(const Vector2 &screen_point) const { - ERR_FAIL_COND_V(!is_inside_tree(), screen_point); Transform2D local_matrix = (get_canvas_transform() * get_global_transform()).affine_inverse(); @@ -1127,7 +1075,6 @@ Vector2 CanvasItem::make_canvas_position_local(const Vector2 &screen_point) cons } Ref<InputEvent> CanvasItem::make_input_local(const Ref<InputEvent> &p_event) const { - ERR_FAIL_COND_V(p_event.is_null(), p_event); ERR_FAIL_COND_V(!is_inside_tree(), p_event); @@ -1135,13 +1082,11 @@ Ref<InputEvent> CanvasItem::make_input_local(const Ref<InputEvent> &p_event) con } Vector2 CanvasItem::get_global_mouse_position() const { - ERR_FAIL_COND_V(!get_viewport(), Vector2()); return get_canvas_transform().affine_inverse().xform(get_viewport()->get_mouse_position()); } Vector2 CanvasItem::get_local_mouse_position() const { - ERR_FAIL_COND_V(!get_viewport(), Vector2()); return get_global_transform().affine_inverse().xform(get_global_mouse_position()); @@ -1159,7 +1104,6 @@ void CanvasItem::force_update_transform() { } void CanvasItem::_bind_methods() { - ClassDB::bind_method(D_METHOD("_toplevel_raise_self"), &CanvasItem::_toplevel_raise_self); ClassDB::bind_method(D_METHOD("_update_callback"), &CanvasItem::_update_callback); @@ -1316,23 +1260,21 @@ void CanvasItem::_bind_methods() { } Transform2D CanvasItem::get_canvas_transform() const { - ERR_FAIL_COND_V(!is_inside_tree(), Transform2D()); - if (canvas_layer) + if (canvas_layer) { return canvas_layer->get_transform(); - else if (Object::cast_to<CanvasItem>(get_parent())) + } else if (Object::cast_to<CanvasItem>(get_parent())) { return Object::cast_to<CanvasItem>(get_parent())->get_canvas_transform(); - else + } else { return get_viewport()->get_canvas_transform(); + } } Transform2D CanvasItem::get_viewport_transform() const { - ERR_FAIL_COND_V(!is_inside_tree(), Transform2D()); if (canvas_layer) { - if (get_viewport()) { return get_viewport()->get_final_transform() * canvas_layer->get_transform(); } else { @@ -1353,8 +1295,9 @@ bool CanvasItem::is_local_transform_notification_enabled() const { } void CanvasItem::set_notify_transform(bool p_enable) { - if (notify_transform == p_enable) + if (notify_transform == p_enable) { return; + } notify_transform = p_enable; @@ -1369,15 +1312,14 @@ bool CanvasItem::is_transform_notification_enabled() const { } int CanvasItem::get_canvas_layer() const { - - if (canvas_layer) + if (canvas_layer) { return canvas_layer->get_layer(); - else + } else { return 0; + } } void CanvasItem::_update_texture_filter_changed(bool p_propagate) { - if (!is_inside_tree()) { return; } @@ -1434,7 +1376,6 @@ CanvasItem::TextureFilter CanvasItem::get_texture_filter() const { } void CanvasItem::_update_texture_repeat_changed(bool p_propagate) { - if (!is_inside_tree()) { return; } @@ -1488,7 +1429,6 @@ CanvasItem::TextureRepeat CanvasItem::get_texture_repeat() const { CanvasItem::CanvasItem() : xform_change(this) { - window = nullptr; canvas_item = RenderingServer::get_singleton()->canvas_item_create(); visible = true; @@ -1515,6 +1455,5 @@ CanvasItem::CanvasItem() : } CanvasItem::~CanvasItem() { - RenderingServer::get_singleton()->free(canvas_item); } diff --git a/scene/main/canvas_item.h b/scene/main/canvas_item.h index 805659376a..31edd424a1 100644 --- a/scene/main/canvas_item.h +++ b/scene/main/canvas_item.h @@ -45,7 +45,6 @@ class Font; class StyleBox; class CanvasItemMaterial : public Material { - GDCLASS(CanvasItemMaterial, Material); public: @@ -66,7 +65,6 @@ public: private: union MaterialKey { - struct { uint32_t blend_mode : 4; uint32_t light_mode : 4; @@ -99,7 +97,6 @@ private: MaterialKey current_key; _FORCE_INLINE_ MaterialKey _compute_key() const { - MaterialKey mk; mk.key = 0; mk.blend_mode = blend_mode; @@ -162,7 +159,6 @@ VARIANT_ENUM_CAST(CanvasItemMaterial::BlendMode) VARIANT_ENUM_CAST(CanvasItemMaterial::LightMode) class CanvasItem : public Node { - GDCLASS(CanvasItem, Node); public: @@ -247,11 +243,13 @@ private: protected: _FORCE_INLINE_ void _notify_transform() { - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _notify_transform(this); - if (!block_transform_notify && notify_local_transform) + if (!block_transform_notify && notify_local_transform) { notification(NOTIFICATION_LOCAL_TRANSFORM_CHANGED); + } } void item_rect_changed(bool p_size_changed = true); diff --git a/scene/main/canvas_layer.cpp b/scene/main/canvas_layer.cpp index c1caa943e3..46cfb968f8 100644 --- a/scene/main/canvas_layer.cpp +++ b/scene/main/canvas_layer.cpp @@ -32,40 +32,37 @@ #include "viewport.h" void CanvasLayer::set_layer(int p_xform) { - layer = p_xform; - if (viewport.is_valid()) + if (viewport.is_valid()) { RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_index()); + } } int CanvasLayer::get_layer() const { - return layer; } void CanvasLayer::set_transform(const Transform2D &p_xform) { - transform = p_xform; locrotscale_dirty = true; - if (viewport.is_valid()) + if (viewport.is_valid()) { RenderingServer::get_singleton()->viewport_set_canvas_transform(viewport, canvas, transform); + } } Transform2D CanvasLayer::get_transform() const { - return transform; } void CanvasLayer::_update_xform() { - transform.set_rotation_and_scale(rot, scale); transform.set_origin(ofs); - if (viewport.is_valid()) + if (viewport.is_valid()) { RenderingServer::get_singleton()->viewport_set_canvas_transform(viewport, canvas, transform); + } } void CanvasLayer::_update_locrotscale() { - ofs = transform.elements[2]; rot = transform.get_rotation(); scale = transform.get_scale(); @@ -73,74 +70,68 @@ void CanvasLayer::_update_locrotscale() { } void CanvasLayer::set_offset(const Vector2 &p_offset) { - - if (locrotscale_dirty) + if (locrotscale_dirty) { _update_locrotscale(); + } ofs = p_offset; _update_xform(); } Vector2 CanvasLayer::get_offset() const { - - if (locrotscale_dirty) + if (locrotscale_dirty) { const_cast<CanvasLayer *>(this)->_update_locrotscale(); + } return ofs; } void CanvasLayer::set_rotation(real_t p_radians) { - - if (locrotscale_dirty) + if (locrotscale_dirty) { _update_locrotscale(); + } rot = p_radians; _update_xform(); } real_t CanvasLayer::get_rotation() const { - - if (locrotscale_dirty) + if (locrotscale_dirty) { const_cast<CanvasLayer *>(this)->_update_locrotscale(); + } return rot; } void CanvasLayer::set_rotation_degrees(real_t p_degrees) { - set_rotation(Math::deg2rad(p_degrees)); } real_t CanvasLayer::get_rotation_degrees() const { - return Math::rad2deg(get_rotation()); } void CanvasLayer::set_scale(const Vector2 &p_scale) { - - if (locrotscale_dirty) + if (locrotscale_dirty) { _update_locrotscale(); + } scale = p_scale; _update_xform(); } Vector2 CanvasLayer::get_scale() const { - - if (locrotscale_dirty) + if (locrotscale_dirty) { const_cast<CanvasLayer *>(this)->_update_locrotscale(); + } return scale; } void CanvasLayer::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - if (custom_viewport && ObjectDB::get_instance(custom_viewport_id)) { - vp = custom_viewport; } else { vp = Node::get_viewport(); @@ -157,7 +148,6 @@ void CanvasLayer::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { - vp->_canvas_layer_remove(this); RenderingServer::get_singleton()->viewport_remove_canvas(viewport, canvas); viewport = RID(); @@ -165,25 +155,24 @@ void CanvasLayer::_notification(int p_what) { } break; case NOTIFICATION_MOVED_IN_PARENT: { - - if (is_inside_tree()) + if (is_inside_tree()) { RenderingServer::get_singleton()->viewport_set_canvas_stacking(viewport, canvas, layer, get_index()); + } } break; } } Size2 CanvasLayer::get_viewport_size() const { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return Size2(1, 1); + } Rect2 r = vp->get_visible_rect(); return r.size; } RID CanvasLayer::get_viewport() const { - return viewport; } @@ -204,11 +193,11 @@ void CanvasLayer::set_custom_viewport(Node *p_viewport) { } if (is_inside_tree()) { - - if (custom_viewport) + if (custom_viewport) { vp = custom_viewport; - else + } else { vp = Node::get_viewport(); + } vp->_canvas_layer_add(this); viewport = vp->get_viewport_rid(); @@ -220,7 +209,6 @@ void CanvasLayer::set_custom_viewport(Node *p_viewport) { } Node *CanvasLayer::get_custom_viewport() const { - return custom_viewport; } @@ -229,12 +217,10 @@ void CanvasLayer::reset_sort_index() { } int CanvasLayer::get_sort_index() { - return sort_index++; } RID CanvasLayer::get_canvas() const { - return canvas; } @@ -261,7 +247,6 @@ float CanvasLayer::get_follow_viewport_scale() const { } void CanvasLayer::_update_follow_viewport(bool p_force_exit) { - if (!is_inside_tree()) { return; } @@ -273,7 +258,6 @@ void CanvasLayer::_update_follow_viewport(bool p_force_exit) { } void CanvasLayer::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_layer", "layer"), &CanvasLayer::set_layer); ClassDB::bind_method(D_METHOD("get_layer"), &CanvasLayer::get_layer); @@ -319,7 +303,6 @@ void CanvasLayer::_bind_methods() { } CanvasLayer::CanvasLayer() { - vp = nullptr; scale = Vector2(1, 1); rot = 0; @@ -334,6 +317,5 @@ CanvasLayer::CanvasLayer() { } CanvasLayer::~CanvasLayer() { - RS::get_singleton()->free(canvas); } diff --git a/scene/main/canvas_layer.h b/scene/main/canvas_layer.h index 91ddbca3b9..0c68b1ab69 100644 --- a/scene/main/canvas_layer.h +++ b/scene/main/canvas_layer.h @@ -36,7 +36,6 @@ class Viewport; class CanvasLayer : public Node { - GDCLASS(CanvasLayer, Node); bool locrotscale_dirty; diff --git a/scene/main/http_request.cpp b/scene/main/http_request.cpp index dc0da015ac..82ee4dde50 100644 --- a/scene/main/http_request.cpp +++ b/scene/main/http_request.cpp @@ -34,12 +34,10 @@ void HTTPRequest::_redirect_request(const String &p_new_url) { } Error HTTPRequest::_request() { - return client->connect_to_host(url, port, use_ssl, validate_ssl); } Error HTTPRequest::_parse_url(const String &p_url) { - url = p_url; use_ssl = false; @@ -85,7 +83,6 @@ Error HTTPRequest::_parse_url(const String &p_url) { } Error HTTPRequest::request(const String &p_url, const Vector<String> &p_custom_headers, bool p_ssl_validate_domain, HTTPClient::Method p_method, const String &p_request_data) { - ERR_FAIL_COND_V(!is_inside_tree(), ERR_UNCONFIGURED); ERR_FAIL_COND_V_MSG(requesting, ERR_BUSY, "HTTPRequest is processing a request. Wait for completion or cancel it before attempting a new one."); @@ -97,8 +94,9 @@ Error HTTPRequest::request(const String &p_url, const Vector<String> &p_custom_h method = p_method; Error err = _parse_url(p_url); - if (err) + if (err) { return err; + } validate_ssl = p_ssl_validate_domain; @@ -109,7 +107,6 @@ Error HTTPRequest::request(const String &p_url, const Vector<String> &p_custom_h requesting = true; if (use_threads) { - thread_done = false; thread_request_quit = false; client->set_blocking_mode(true); @@ -129,7 +126,6 @@ Error HTTPRequest::request(const String &p_url, const Vector<String> &p_custom_h } void HTTPRequest::_thread_func(void *p_userdata) { - HTTPRequest *hr = (HTTPRequest *)p_userdata; Error err = hr->_request(); @@ -138,10 +134,10 @@ void HTTPRequest::_thread_func(void *p_userdata) { hr->call_deferred("_request_done", RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); } else { while (!hr->thread_request_quit) { - bool exit = hr->_update_connection(); - if (exit) + if (exit) { break; + } OS::get_singleton()->delay_usec(1); } } @@ -150,11 +146,11 @@ void HTTPRequest::_thread_func(void *p_userdata) { } void HTTPRequest::cancel_request() { - timer->stop(); - if (!requesting) + if (!requesting) { return; + } if (!use_threads) { set_process_internal(false); @@ -178,7 +174,6 @@ void HTTPRequest::cancel_request() { } bool HTTPRequest::_handle_response(bool *ret_value) { - if (!client->has_response()) { call_deferred("_request_done", RESULT_NO_RESPONSE, 0, PackedStringArray(), PackedByteArray()); *ret_value = true; @@ -199,7 +194,6 @@ bool HTTPRequest::_handle_response(bool *ret_value) { // Handle redirect if (max_redirects >= 0 && redirections >= max_redirects) { - call_deferred("_request_done", RESULT_REDIRECT_LIMIT_REACHED, response_code, response_headers, PackedByteArray()); *ret_value = true; return true; @@ -243,7 +237,6 @@ bool HTTPRequest::_handle_response(bool *ret_value) { } bool HTTPRequest::_update_connection() { - switch (client->get_status()) { case HTTPClient::STATUS_DISCONNECTED: { call_deferred("_request_done", RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); @@ -265,23 +258,20 @@ bool HTTPRequest::_update_connection() { return false; } break; // Connecting to IP case HTTPClient::STATUS_CANT_CONNECT: { - call_deferred("_request_done", RESULT_CANT_CONNECT, 0, PackedStringArray(), PackedByteArray()); return true; } break; case HTTPClient::STATUS_CONNECTED: { - if (request_sent) { - if (!got_response) { - // No body bool ret_value; - if (_handle_response(&ret_value)) + if (_handle_response(&ret_value)) { return ret_value; + } call_deferred("_request_done", RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); return true; @@ -315,16 +305,14 @@ bool HTTPRequest::_update_connection() { } break; // Request in progress case HTTPClient::STATUS_BODY: { - if (!got_response) { - bool ret_value; - if (_handle_response(&ret_value)) + if (_handle_response(&ret_value)) { return ret_value; + } if (!client->is_response_chunked() && client->get_response_body_length() == 0) { - call_deferred("_request_done", RESULT_SUCCESS, response_code, response_headers, PackedByteArray()); return true; } @@ -341,7 +329,6 @@ bool HTTPRequest::_update_connection() { if (download_to_file != String()) { file = FileAccess::open(download_to_file, FileAccess::WRITE); if (!file) { - call_deferred("_request_done", RESULT_DOWNLOAD_FILE_CANT_OPEN, response_code, response_headers, PackedByteArray()); return true; } @@ -370,7 +357,6 @@ bool HTTPRequest::_update_connection() { } if (body_len >= 0) { - if (downloaded == body_len) { call_deferred("_request_done", RESULT_SUCCESS, response_code, response_headers, body); return true; @@ -397,20 +383,17 @@ bool HTTPRequest::_update_connection() { } void HTTPRequest::_request_done(int p_status, int p_code, const PackedStringArray &headers, const PackedByteArray &p_data) { - cancel_request(); emit_signal("request_completed", p_status, p_code, headers, p_data); } void HTTPRequest::_notification(int p_what) { - if (p_what == NOTIFICATION_INTERNAL_PROCESS) { - - if (use_threads) + if (use_threads) { return; + } bool done = _update_connection(); if (done) { - set_process_internal(false); // cancel_request(); called from _request done now } @@ -424,42 +407,35 @@ void HTTPRequest::_notification(int p_what) { } void HTTPRequest::set_use_threads(bool p_use) { - ERR_FAIL_COND(get_http_client_status() != HTTPClient::STATUS_DISCONNECTED); use_threads = p_use; } bool HTTPRequest::is_using_threads() const { - return use_threads; } void HTTPRequest::set_body_size_limit(int p_bytes) { - ERR_FAIL_COND(get_http_client_status() != HTTPClient::STATUS_DISCONNECTED); body_size_limit = p_bytes; } int HTTPRequest::get_body_size_limit() const { - return body_size_limit; } void HTTPRequest::set_download_file(const String &p_file) { - ERR_FAIL_COND(get_http_client_status() != HTTPClient::STATUS_DISCONNECTED); download_to_file = p_file; } String HTTPRequest::get_download_file() const { - return download_to_file; } void HTTPRequest::set_download_chunk_size(int p_chunk_size) { - ERR_FAIL_COND(get_http_client_status() != HTTPClient::STATUS_DISCONNECTED); client->set_read_chunk_size(p_chunk_size); @@ -474,42 +450,36 @@ HTTPClient::Status HTTPRequest::get_http_client_status() const { } void HTTPRequest::set_max_redirects(int p_max) { - max_redirects = p_max; } int HTTPRequest::get_max_redirects() const { - return max_redirects; } int HTTPRequest::get_downloaded_bytes() const { - return downloaded; } + int HTTPRequest::get_body_size() const { return body_len; } void HTTPRequest::set_timeout(int p_timeout) { - ERR_FAIL_COND(p_timeout < 0); timeout = p_timeout; } int HTTPRequest::get_timeout() { - return timeout; } void HTTPRequest::_timeout() { - cancel_request(); call_deferred("_request_done", RESULT_TIMEOUT, 0, PackedStringArray(), PackedByteArray()); } void HTTPRequest::_bind_methods() { - ClassDB::bind_method(D_METHOD("request", "url", "custom_headers", "ssl_validate_domain", "method", "request_data"), &HTTPRequest::request, DEFVAL(PackedStringArray()), DEFVAL(true), DEFVAL(HTTPClient::METHOD_GET), DEFVAL(String())); ClassDB::bind_method(D_METHOD("cancel_request"), &HTTPRequest::cancel_request); @@ -565,7 +535,6 @@ void HTTPRequest::_bind_methods() { } HTTPRequest::HTTPRequest() { - thread = nullptr; port = 80; @@ -593,6 +562,7 @@ HTTPRequest::HTTPRequest() { } HTTPRequest::~HTTPRequest() { - if (file) + if (file) { memdelete(file); + } } diff --git a/scene/main/http_request.h b/scene/main/http_request.h index a3d95cd652..1409965d45 100644 --- a/scene/main/http_request.h +++ b/scene/main/http_request.h @@ -38,7 +38,6 @@ #include "scene/main/timer.h" class HTTPRequest : public Node { - GDCLASS(HTTPRequest, Node); public: diff --git a/scene/main/instance_placeholder.cpp b/scene/main/instance_placeholder.cpp index 062b221c84..ca8d5a2ca0 100644 --- a/scene/main/instance_placeholder.cpp +++ b/scene/main/instance_placeholder.cpp @@ -34,7 +34,6 @@ #include "scene/resources/packed_scene.h" bool InstancePlaceholder::_set(const StringName &p_name, const Variant &p_value) { - PropSet ps; ps.name = p_name; ps.value = p_value; @@ -43,7 +42,6 @@ bool InstancePlaceholder::_set(const StringName &p_name, const Variant &p_value) } bool InstancePlaceholder::_get(const StringName &p_name, Variant &r_ret) const { - for (const List<PropSet>::Element *E = stored_values.front(); E; E = E->next()) { if (E->get().name == p_name) { r_ret = E->get().value; @@ -54,7 +52,6 @@ bool InstancePlaceholder::_get(const StringName &p_name, Variant &r_ret) const { } void InstancePlaceholder::_get_property_list(List<PropertyInfo> *p_list) const { - for (const List<PropSet>::Element *E = stored_values.front(); E; E = E->next()) { PropertyInfo pi; pi.name = E->get().name; @@ -66,34 +63,35 @@ void InstancePlaceholder::_get_property_list(List<PropertyInfo> *p_list) const { } void InstancePlaceholder::set_instance_path(const String &p_name) { - path = p_name; } String InstancePlaceholder::get_instance_path() const { - return path; } Node *InstancePlaceholder::create_instance(bool p_replace, const Ref<PackedScene> &p_custom_scene) { - ERR_FAIL_COND_V(!is_inside_tree(), nullptr); Node *base = get_parent(); - if (!base) + if (!base) { return nullptr; + } Ref<PackedScene> ps; - if (p_custom_scene.is_valid()) + if (p_custom_scene.is_valid()) { ps = p_custom_scene; - else + } else { ps = ResourceLoader::load(path, "PackedScene"); + } - if (!ps.is_valid()) + if (!ps.is_valid()) { return nullptr; + } Node *scene = ps->instance(); - if (!scene) + if (!scene) { return nullptr; + } scene->set_name(get_name()); int pos = get_index(); @@ -113,24 +111,24 @@ Node *InstancePlaceholder::create_instance(bool p_replace, const Ref<PackedScene } Dictionary InstancePlaceholder::get_stored_values(bool p_with_order) { - Dictionary ret; PackedStringArray order; for (List<PropSet>::Element *E = stored_values.front(); E; E = E->next()) { ret[E->get().name] = E->get().value; - if (p_with_order) + if (p_with_order) { order.push_back(E->get().name); + } }; - if (p_with_order) + if (p_with_order) { ret[".order"] = order; + } return ret; }; void InstancePlaceholder::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_stored_values", "with_order"), &InstancePlaceholder::get_stored_values, DEFVAL(false)); ClassDB::bind_method(D_METHOD("create_instance", "replace", "custom_scene"), &InstancePlaceholder::create_instance, DEFVAL(false), DEFVAL(Variant())); ClassDB::bind_method(D_METHOD("get_instance_path"), &InstancePlaceholder::get_instance_path); diff --git a/scene/main/instance_placeholder.h b/scene/main/instance_placeholder.h index 9f7b84716d..ec1f8a9b09 100644 --- a/scene/main/instance_placeholder.h +++ b/scene/main/instance_placeholder.h @@ -36,7 +36,6 @@ class PackedScene; class InstancePlaceholder : public Node { - GDCLASS(InstancePlaceholder, Node); String path; diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 3d56b51e26..ad4d3c54be 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -51,22 +51,16 @@ VARIANT_ENUM_CAST(Node::PauseMode); int Node::orphan_node_count = 0; void Node::_notification(int p_notification) { - switch (p_notification) { - case NOTIFICATION_PROCESS: { - if (get_script_instance()) { - Variant time = get_process_delta_time(); const Variant *ptr[1] = { &time }; get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_process, ptr, 1); } } break; case NOTIFICATION_PHYSICS_PROCESS: { - if (get_script_instance()) { - Variant time = get_physics_process_delta_time(); const Variant *ptr[1] = { &time }; get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_physics_process, ptr, 1); @@ -78,21 +72,24 @@ void Node::_notification(int p_notification) { ERR_FAIL_COND(!get_tree()); if (data.pause_mode == PAUSE_MODE_INHERIT) { - - if (data.parent) + if (data.parent) { data.pause_owner = data.parent->data.pause_owner; - else + } else { data.pause_owner = nullptr; + } } else { data.pause_owner = this; } - if (data.input) + if (data.input) { add_to_group("_vp_input" + itos(get_viewport()->get_instance_id())); - if (data.unhandled_input) + } + if (data.unhandled_input) { add_to_group("_vp_unhandled_input" + itos(get_viewport()->get_instance_id())); - if (data.unhandled_key_input) + } + if (data.unhandled_key_input) { add_to_group("_vp_unhandled_key_input" + itos(get_viewport()->get_instance_id())); + } get_tree()->node_count++; orphan_node_count--; @@ -105,12 +102,15 @@ void Node::_notification(int p_notification) { get_tree()->node_count--; orphan_node_count++; - if (data.input) + if (data.input) { remove_from_group("_vp_input" + itos(get_viewport()->get_instance_id())); - if (data.unhandled_input) + } + if (data.unhandled_input) { remove_from_group("_vp_unhandled_input" + itos(get_viewport()->get_instance_id())); - if (data.unhandled_key_input) + } + if (data.unhandled_key_input) { remove_from_group("_vp_unhandled_key_input" + itos(get_viewport()->get_instance_id())); + } data.pause_owner = nullptr; if (data.path_cache) { @@ -119,16 +119,13 @@ void Node::_notification(int p_notification) { } } break; case NOTIFICATION_PATH_CHANGED: { - if (data.path_cache) { memdelete(data.path_cache); data.path_cache = nullptr; } } break; case NOTIFICATION_READY: { - if (get_script_instance()) { - if (get_script_instance()->has_method(SceneStringNames::get_singleton()->_input)) { set_process_input(true); } @@ -157,22 +154,18 @@ void Node::_notification(int p_notification) { data.in_constructor = false; } break; case NOTIFICATION_PREDELETE: { - set_owner(nullptr); while (data.owned.size()) { - data.owned.front()->get()->set_owner(nullptr); } if (data.parent) { - data.parent->remove_child(this); } // kill children as cleanly as possible while (data.children.size()) { - Node *child = data.children[data.children.size() - 1]; //begin from the end because its faster and more consistent with creation remove_child(child); memdelete(child); @@ -183,11 +176,9 @@ void Node::_notification(int p_notification) { } void Node::_propagate_ready() { - data.ready_notified = true; data.blocked++; for (int i = 0; i < data.children.size(); i++) { - data.children[i]->_propagate_ready(); } data.blocked--; @@ -208,13 +199,13 @@ void Node::_propagate_enter_tree() { data.tree = data.parent->data.tree; data.depth = data.parent->data.depth + 1; } else { - data.depth = 1; } data.viewport = Object::cast_to<Viewport>(this); - if (!data.viewport && data.parent) + if (!data.viewport && data.parent) { data.viewport = data.parent->data.viewport; + } data.inside_tree = true; @@ -225,7 +216,6 @@ void Node::_propagate_enter_tree() { notification(NOTIFICATION_ENTER_TREE); if (get_script_instance()) { - get_script_instance()->call_multilevel_reversed(SceneStringNames::get_singleton()->_enter_tree, nullptr, 0); } @@ -237,9 +227,9 @@ void Node::_propagate_enter_tree() { //block while adding children for (int i = 0; i < data.children.size(); i++) { - - if (!data.children[i]->is_inside_tree()) // could have been added in enter_tree + if (!data.children[i]->is_inside_tree()) { // could have been added in enter_tree data.children[i]->_propagate_enter_tree(); + } } data.blocked--; @@ -251,7 +241,6 @@ void Node::_propagate_enter_tree() { } void Node::_propagate_after_exit_tree() { - data.blocked++; for (int i = 0; i < data.children.size(); i++) { data.children[i]->_propagate_after_exit_tree(); @@ -261,7 +250,6 @@ void Node::_propagate_after_exit_tree() { } void Node::_propagate_exit_tree() { - //block while removing children #ifdef DEBUG_ENABLED @@ -270,21 +258,20 @@ void Node::_propagate_exit_tree() { data.blocked++; for (int i = data.children.size() - 1; i >= 0; i--) { - data.children[i]->_propagate_exit_tree(); } data.blocked--; if (get_script_instance()) { - get_script_instance()->call_multilevel(SceneStringNames::get_singleton()->_exit_tree, nullptr, 0); } emit_signal(SceneStringNames::get_singleton()->tree_exiting); notification(NOTIFICATION_EXIT_TREE, true); - if (data.tree) + if (data.tree) { data.tree->node_removed(this); + } // exit groups @@ -295,8 +282,9 @@ void Node::_propagate_exit_tree() { data.viewport = nullptr; - if (data.tree) + if (data.tree) { data.tree->tree_changed(); + } data.inside_tree = false; data.ready_notified = false; @@ -305,7 +293,6 @@ void Node::_propagate_exit_tree() { } void Node::move_child(Node *p_child, int p_pos) { - ERR_FAIL_NULL(p_child); ERR_FAIL_INDEX_MSG(p_pos, data.children.size() + 1, "Invalid new child position: " + itos(p_pos) + "."); ERR_FAIL_COND_MSG(p_child->data.parent != this, "Child is not a child of this node."); @@ -313,11 +300,13 @@ void Node::move_child(Node *p_child, int p_pos) { // Specifying one place beyond the end // means the same as moving to the last position - if (p_pos == data.children.size()) + if (p_pos == data.children.size()) { p_pos--; + } - if (p_child->data.pos == p_pos) + if (p_child->data.pos == p_pos) { return; //do nothing + } int motion_from = MIN(p_pos, p_child->data.pos); int motion_to = MAX(p_pos, p_child->data.pos); @@ -332,7 +321,6 @@ void Node::move_child(Node *p_child, int p_pos) { data.blocked++; //new pos first for (int i = motion_from; i <= motion_to; i++) { - data.children[i]->data.pos = i; } // notification second @@ -341,94 +329,94 @@ void Node::move_child(Node *p_child, int p_pos) { data.children[i]->notification(NOTIFICATION_MOVED_IN_PARENT); } for (const Map<StringName, GroupData>::Element *E = p_child->data.grouped.front(); E; E = E->next()) { - if (E->get().group) + if (E->get().group) { E->get().group->changed = true; + } } data.blocked--; } void Node::raise() { - - if (!data.parent) + if (!data.parent) { return; + } data.parent->move_child(this, data.parent->data.children.size() - 1); } void Node::add_child_notify(Node *p_child) { - // to be used when not wanted } void Node::remove_child_notify(Node *p_child) { - // to be used when not wanted } void Node::move_child_notify(Node *p_child) { - // to be used when not wanted } void Node::set_physics_process(bool p_process) { - - if (data.physics_process == p_process) + if (data.physics_process == p_process) { return; + } data.physics_process = p_process; - if (data.physics_process) + if (data.physics_process) { add_to_group("physics_process", false); - else + } else { remove_from_group("physics_process"); + } _change_notify("physics_process"); } bool Node::is_physics_processing() const { - return data.physics_process; } void Node::set_physics_process_internal(bool p_process_internal) { - - if (data.physics_process_internal == p_process_internal) + if (data.physics_process_internal == p_process_internal) { return; + } data.physics_process_internal = p_process_internal; - if (data.physics_process_internal) + if (data.physics_process_internal) { add_to_group("physics_process_internal", false); - else + } else { remove_from_group("physics_process_internal"); + } _change_notify("physics_process_internal"); } bool Node::is_physics_processing_internal() const { - return data.physics_process_internal; } void Node::set_pause_mode(PauseMode p_mode) { - - if (data.pause_mode == p_mode) + if (data.pause_mode == p_mode) { return; + } bool prev_inherits = data.pause_mode == PAUSE_MODE_INHERIT; data.pause_mode = p_mode; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; //pointless - if ((data.pause_mode == PAUSE_MODE_INHERIT) == prev_inherits) + } + if ((data.pause_mode == PAUSE_MODE_INHERIT) == prev_inherits) { return; ///nothing changed + } Node *owner = nullptr; if (data.pause_mode == PAUSE_MODE_INHERIT) { - - if (data.parent) + if (data.parent) { owner = data.parent->data.pause_owner; + } } else { owner = this; } @@ -437,40 +425,34 @@ void Node::set_pause_mode(PauseMode p_mode) { } Node::PauseMode Node::get_pause_mode() const { - return data.pause_mode; } void Node::_propagate_pause_owner(Node *p_owner) { - - if (this != p_owner && data.pause_mode != PAUSE_MODE_INHERIT) + if (this != p_owner && data.pause_mode != PAUSE_MODE_INHERIT) { return; + } data.pause_owner = p_owner; for (int i = 0; i < data.children.size(); i++) { - data.children[i]->_propagate_pause_owner(p_owner); } } void Node::set_network_master(int p_peer_id, bool p_recursive) { - data.network_master = p_peer_id; if (p_recursive) { for (int i = 0; i < data.children.size(); i++) { - data.children[i]->set_network_master(p_peer_id, true); } } } int Node::get_network_master() const { - return data.network_master; } bool Node::is_network_master() const { - ERR_FAIL_COND_V(!is_inside_tree(), false); return get_multiplayer()->get_network_unique_id() == data.network_master; @@ -479,7 +461,6 @@ bool Node::is_network_master() const { /***** RPC CONFIG ********/ uint16_t Node::rpc_config(const StringName &p_method, MultiplayerAPI::RPCMode p_mode) { - uint16_t mid = get_node_rpc_method_id(p_method); if (mid == UINT16_MAX) { // It's new @@ -496,7 +477,6 @@ uint16_t Node::rpc_config(const StringName &p_method, MultiplayerAPI::RPCMode p_ } uint16_t Node::rset_config(const StringName &p_property, MultiplayerAPI::RPCMode p_mode) { - uint16_t pid = get_node_rset_property_id(p_property); if (pid == UINT16_MAX) { // It's new @@ -515,13 +495,13 @@ uint16_t Node::rset_config(const StringName &p_property, MultiplayerAPI::RPCMode /***** RPC FUNCTIONS ********/ void Node::rpc(const StringName &p_method, VARIANT_ARG_DECLARE) { - VARIANT_ARGPTRS; int argc = 0; for (int i = 0; i < VARIANT_ARG_MAX; i++) { - if (argptr[i]->get_type() == Variant::NIL) + if (argptr[i]->get_type() == Variant::NIL) { break; + } argc++; } @@ -529,13 +509,13 @@ void Node::rpc(const StringName &p_method, VARIANT_ARG_DECLARE) { } void Node::rpc_id(int p_peer_id, const StringName &p_method, VARIANT_ARG_DECLARE) { - VARIANT_ARGPTRS; int argc = 0; for (int i = 0; i < VARIANT_ARG_MAX; i++) { - if (argptr[i]->get_type() == Variant::NIL) + if (argptr[i]->get_type() == Variant::NIL) { break; + } argc++; } @@ -543,13 +523,13 @@ void Node::rpc_id(int p_peer_id, const StringName &p_method, VARIANT_ARG_DECLARE } void Node::rpc_unreliable(const StringName &p_method, VARIANT_ARG_DECLARE) { - VARIANT_ARGPTRS; int argc = 0; for (int i = 0; i < VARIANT_ARG_MAX; i++) { - if (argptr[i]->get_type() == Variant::NIL) + if (argptr[i]->get_type() == Variant::NIL) { break; + } argc++; } @@ -557,13 +537,13 @@ void Node::rpc_unreliable(const StringName &p_method, VARIANT_ARG_DECLARE) { } void Node::rpc_unreliable_id(int p_peer_id, const StringName &p_method, VARIANT_ARG_DECLARE) { - VARIANT_ARGPTRS; int argc = 0; for (int i = 0; i < VARIANT_ARG_MAX; i++) { - if (argptr[i]->get_type() == Variant::NIL) + if (argptr[i]->get_type() == Variant::NIL) { break; + } argc++; } @@ -571,7 +551,6 @@ void Node::rpc_unreliable_id(int p_peer_id, const StringName &p_method, VARIANT_ } Variant Node::_rpc_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 1) { r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; r_error.argument = 1; @@ -594,7 +573,6 @@ Variant Node::_rpc_bind(const Variant **p_args, int p_argcount, Callable::CallEr } Variant Node::_rpc_id_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 2) { r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; r_error.argument = 2; @@ -625,7 +603,6 @@ Variant Node::_rpc_id_bind(const Variant **p_args, int p_argcount, Callable::Cal } Variant Node::_rpc_unreliable_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 1) { r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; r_error.argument = 1; @@ -648,7 +625,6 @@ Variant Node::_rpc_unreliable_bind(const Variant **p_args, int p_argcount, Calla } Variant Node::_rpc_unreliable_id_bind(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - if (p_argcount < 2) { r_error.error = Callable::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; r_error.argument = 2; @@ -690,31 +666,29 @@ void Node::rsetp(int p_peer_id, bool p_unreliable, const StringName &p_property, /******** RSET *********/ void Node::rset(const StringName &p_property, const Variant &p_value) { - rsetp(0, false, p_property, p_value); } void Node::rset_id(int p_peer_id, const StringName &p_property, const Variant &p_value) { - rsetp(p_peer_id, false, p_property, p_value); } void Node::rset_unreliable(const StringName &p_property, const Variant &p_value) { - rsetp(0, true, p_property, p_value); } void Node::rset_unreliable_id(int p_peer_id, const StringName &p_property, const Variant &p_value) { - rsetp(p_peer_id, true, p_property, p_value); } //////////// end of rpc Ref<MultiplayerAPI> Node::get_multiplayer() const { - if (multiplayer.is_valid()) + if (multiplayer.is_valid()) { return multiplayer; - if (!is_inside_tree()) + } + if (!is_inside_tree()) { return Ref<MultiplayerAPI>(); + } return get_tree()->get_multiplayer(); } @@ -723,7 +697,6 @@ Ref<MultiplayerAPI> Node::get_custom_multiplayer() const { } void Node::set_custom_multiplayer(Ref<MultiplayerAPI> p_multiplayer) { - multiplayer = p_multiplayer; } @@ -742,8 +715,9 @@ StringName Node::get_node_rpc_method(const uint16_t p_rpc_method_id) const { // Make sure this is a node generated ID. if (((1 << 15) & p_rpc_method_id) > 0) { int mid = (~(1 << 15)) & p_rpc_method_id; - if (mid < data.rpc_methods.size()) + if (mid < data.rpc_methods.size()) { return data.rpc_methods[mid].name; + } } return StringName(); } @@ -752,8 +726,9 @@ MultiplayerAPI::RPCMode Node::get_node_rpc_mode_by_id(const uint16_t p_rpc_metho // Make sure this is a node generated ID. if (((1 << 15) & p_rpc_method_id) > 0) { int mid = (~(1 << 15)) & p_rpc_method_id; - if (mid < data.rpc_methods.size()) + if (mid < data.rpc_methods.size()) { return data.rpc_methods[mid].mode; + } } return MultiplayerAPI::RPC_MODE_DISABLED; } @@ -777,8 +752,9 @@ StringName Node::get_node_rset_property(const uint16_t p_rset_property_id) const // Make sure this is a node generated ID. if (((1 << 15) & p_rset_property_id) > 0) { int mid = (~(1 << 15)) & p_rset_property_id; - if (mid < data.rpc_properties.size()) + if (mid < data.rpc_properties.size()) { return data.rpc_properties[mid].name; + } } return StringName(); } @@ -786,8 +762,9 @@ StringName Node::get_node_rset_property(const uint16_t p_rset_property_id) const MultiplayerAPI::RPCMode Node::get_node_rset_mode_by_id(const uint16_t p_rset_property_id) const { if (((1 << 15) & p_rset_property_id) > 0) { int mid = (~(1 << 15)) & p_rset_property_id; - if (mid < data.rpc_properties.size()) + if (mid < data.rpc_properties.size()) { return data.rpc_properties[mid].mode; + } } return MultiplayerAPI::RPC_MODE_DISABLED; } @@ -833,25 +810,27 @@ bool Node::can_process_notification(int p_what) const { } bool Node::can_process() const { - ERR_FAIL_COND_V(!is_inside_tree(), false); if (get_tree()->is_paused()) { - - if (data.pause_mode == PAUSE_MODE_STOP) + if (data.pause_mode == PAUSE_MODE_STOP) { return false; - if (data.pause_mode == PAUSE_MODE_PROCESS) + } + if (data.pause_mode == PAUSE_MODE_PROCESS) { return true; + } if (data.pause_mode == PAUSE_MODE_INHERIT) { - - if (!data.pause_owner) + if (!data.pause_owner) { return false; //clearly no pause owner by default + } - if (data.pause_owner->data.pause_mode == PAUSE_MODE_PROCESS) + if (data.pause_owner->data.pause_mode == PAUSE_MODE_PROCESS) { return true; + } - if (data.pause_owner->data.pause_mode == PAUSE_MODE_STOP) + if (data.pause_owner->data.pause_mode == PAUSE_MODE_STOP) { return false; + } } } @@ -859,58 +838,58 @@ bool Node::can_process() const { } float Node::get_physics_process_delta_time() const { - - if (data.tree) + if (data.tree) { return data.tree->get_physics_process_time(); - else + } else { return 0; + } } float Node::get_process_delta_time() const { - - if (data.tree) + if (data.tree) { return data.tree->get_idle_process_time(); - else + } else { return 0; + } } void Node::set_process(bool p_idle_process) { - - if (data.idle_process == p_idle_process) + if (data.idle_process == p_idle_process) { return; + } data.idle_process = p_idle_process; - if (data.idle_process) + if (data.idle_process) { add_to_group("idle_process", false); - else + } else { remove_from_group("idle_process"); + } _change_notify("idle_process"); } bool Node::is_processing() const { - return data.idle_process; } void Node::set_process_internal(bool p_idle_process_internal) { - - if (data.idle_process_internal == p_idle_process_internal) + if (data.idle_process_internal == p_idle_process_internal) { return; + } data.idle_process_internal = p_idle_process_internal; - if (data.idle_process_internal) + if (data.idle_process_internal) { add_to_group("idle_process_internal", false); - else + } else { remove_from_group("idle_process_internal"); + } _change_notify("idle_process_internal"); } bool Node::is_processing_internal() const { - return data.idle_process_internal; } @@ -940,23 +919,24 @@ void Node::set_process_priority(int p_priority) { } int Node::get_process_priority() const { - return data.process_priority; } void Node::set_process_input(bool p_enable) { - - if (p_enable == data.input) + if (p_enable == data.input) { return; + } data.input = p_enable; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (p_enable) + if (p_enable) { add_to_group("_vp_input" + itos(get_viewport()->get_instance_id())); - else + } else { remove_from_group("_vp_input" + itos(get_viewport()->get_instance_id())); + } } bool Node::is_processing_input() const { @@ -964,17 +944,19 @@ bool Node::is_processing_input() const { } void Node::set_process_unhandled_input(bool p_enable) { - - if (p_enable == data.unhandled_input) + if (p_enable == data.unhandled_input) { return; + } data.unhandled_input = p_enable; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (p_enable) + if (p_enable) { add_to_group("_vp_unhandled_input" + itos(get_viewport()->get_instance_id())); - else + } else { remove_from_group("_vp_unhandled_input" + itos(get_viewport()->get_instance_id())); + } } bool Node::is_processing_unhandled_input() const { @@ -982,17 +964,19 @@ bool Node::is_processing_unhandled_input() const { } void Node::set_process_unhandled_key_input(bool p_enable) { - - if (p_enable == data.unhandled_key_input) + if (p_enable == data.unhandled_key_input) { return; + } data.unhandled_key_input = p_enable; - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } - if (p_enable) + if (p_enable) { add_to_group("_vp_unhandled_key_input" + itos(get_viewport()->get_instance_id())); - else + } else { remove_from_group("_vp_unhandled_key_input" + itos(get_viewport()->get_instance_id())); + } } bool Node::is_processing_unhandled_key_input() const { @@ -1000,12 +984,10 @@ bool Node::is_processing_unhandled_key_input() const { } StringName Node::get_name() const { - return data.name; } void Node::_set_name_nocheck(const StringName &p_name) { - data.name = p_name; } @@ -1023,7 +1005,6 @@ bool Node::_validate_node_name(String &p_name) { } void Node::set_name(const String &p_name) { - String name = p_name; _validate_node_name(name); @@ -1031,14 +1012,12 @@ void Node::set_name(const String &p_name) { data.name = name; if (data.parent) { - data.parent->_validate_child_name(this); } propagate_notification(NOTIFICATION_PATH_CHANGED); if (is_inside_tree()) { - emit_signal("renamed"); get_tree()->node_renamed(this); get_tree()->tree_changed(); @@ -1053,13 +1032,11 @@ void Node::init_node_hrcr() { } void Node::set_human_readable_collision_renaming(bool p_enabled) { - node_hrcr = p_enabled; } #ifdef TOOLS_ENABLED String Node::validate_child_name(Node *p_child) { - StringName name = p_child->data.name; _generate_serial_child_name(p_child, name); return name; @@ -1067,11 +1044,9 @@ String Node::validate_child_name(Node *p_child) { #endif void Node::_validate_child_name(Node *p_child, bool p_force_human_readable) { - /* Make sure the name is unique */ if (node_hrcr || p_force_human_readable) { - //this approach to autoset node names is human readable but very slow //it's turned on while running in the editor @@ -1080,7 +1055,6 @@ void Node::_validate_child_name(Node *p_child, bool p_force_human_readable) { p_child->data.name = name; } else { - //this approach to autoset node names is fast but not as readable //it's the default and reserves the '@' character for unique names. @@ -1095,8 +1069,9 @@ void Node::_validate_child_name(Node *p_child, bool p_force_human_readable) { int cc = data.children.size(); for (int i = 0; i < cc; i++) { - if (children[i] == p_child) + if (children[i] == p_child) { continue; + } if (children[i]->data.name == p_child->data.name) { unique = false; break; @@ -1105,7 +1080,6 @@ void Node::_validate_child_name(Node *p_child, bool p_force_human_readable) { } if (!unique) { - ERR_FAIL_COND(!node_hrcr_count.ref()); String name = "@" + String(p_child->get_name()) + "@" + itos(node_hrcr_count.get()); p_child->data.name = name; @@ -1115,7 +1089,6 @@ void Node::_validate_child_name(Node *p_child, bool p_force_human_readable) { // Return s + 1 as if it were an integer String increase_numeric_string(const String &s) { - String res = s; bool carry = res.length() > 0; @@ -1140,7 +1113,6 @@ String increase_numeric_string(const String &s) { } void Node::_generate_serial_child_name(const Node *p_child, StringName &name) const { - if (name == StringName()) { //no name and a new nade is needed, create one. @@ -1165,7 +1137,6 @@ void Node::_generate_serial_child_name(const Node *p_child, StringName &name) co const Node *const *children_ptr = data.children.ptr(); { - bool exists = false; for (int i = 0; i < cc; i++) { @@ -1252,7 +1223,6 @@ void Node::_add_child_nocheck(Node *p_child, const StringName &p_name) { } void Node::add_child(Node *p_child, bool p_legible_unique_name) { - ERR_FAIL_NULL(p_child); ERR_FAIL_COND_MSG(p_child == this, "Can't add child '" + p_child->get_name() + "' to itself."); // adding to itself! ERR_FAIL_COND_MSG(p_child->data.parent, "Can't add child '" + p_child->get_name() + "' to '" + get_name() + "', already has a parent '" + p_child->data.parent->get_name() + "'."); //Fail if node has a parent @@ -1265,7 +1235,6 @@ void Node::add_child(Node *p_child, bool p_legible_unique_name) { } void Node::add_child_below_node(Node *p_node, Node *p_child, bool p_legible_unique_name) { - ERR_FAIL_NULL(p_node); ERR_FAIL_NULL(p_child); @@ -1279,16 +1248,12 @@ void Node::add_child_below_node(Node *p_node, Node *p_child, bool p_legible_uniq } void Node::_propagate_validate_owner() { - if (data.owner) { - bool found = false; Node *parent = data.parent; while (parent) { - if (parent == data.owner) { - found = true; break; } @@ -1297,20 +1262,17 @@ void Node::_propagate_validate_owner() { } if (!found) { - data.owner->data.owned.erase(data.OW); data.owner = nullptr; } } for (int i = 0; i < data.children.size(); i++) { - data.children[i]->_propagate_validate_owner(); } } void Node::remove_child(Node *p_child) { - ERR_FAIL_NULL(p_child); ERR_FAIL_COND_MSG(data.blocked > 0, "Parent node is busy setting up children, remove_node() failed. Consider using call_deferred(\"remove_child\", child) instead."); @@ -1326,9 +1288,7 @@ void Node::remove_child(Node *p_child) { if (idx == -1) { //maybe removed while unparenting or something and index was not updated, so just in case the above fails, try this. for (int i = 0; i < child_count; i++) { - if (children[i] == p_child) { - idx = i; break; } @@ -1353,7 +1313,6 @@ void Node::remove_child(Node *p_child) { children = data.children.ptrw(); for (int i = idx; i < child_count; i++) { - children[i]->data.pos = i; children[i]->notification(NOTIFICATION_MOVED_IN_PARENT); } @@ -1370,31 +1329,29 @@ void Node::remove_child(Node *p_child) { } int Node::get_child_count() const { - return data.children.size(); } -Node *Node::get_child(int p_index) const { +Node *Node::get_child(int p_index) const { ERR_FAIL_INDEX_V(p_index, data.children.size(), nullptr); return data.children[p_index]; } Node *Node::_get_child_by_name(const StringName &p_name) const { - int cc = data.children.size(); Node *const *cd = data.children.ptr(); for (int i = 0; i < cc; i++) { - if (cd[i]->data.name == p_name) + if (cd[i]->data.name == p_name) { return cd[i]; + } } return nullptr; } Node *Node::get_node_or_null(const NodePath &p_path) const { - if (p_path.is_empty()) { return nullptr; } @@ -1407,14 +1364,13 @@ Node *Node::get_node_or_null(const NodePath &p_path) const { if (!p_path.is_absolute()) { current = const_cast<Node *>(this); //start from this } else { - root = const_cast<Node *>(this); - while (root->data.parent) + while (root->data.parent) { root = root->data.parent; //start from root + } } for (int i = 0; i < p_path.get_name_count(); i++) { - StringName name = p_path.get_name(i); Node *next = nullptr; @@ -1424,25 +1380,23 @@ Node *Node::get_node_or_null(const NodePath &p_path) const { } else if (name == SceneStringNames::get_singleton()->doubledot) { // .. - if (current == nullptr || !current->data.parent) + if (current == nullptr || !current->data.parent) { return nullptr; + } next = current->data.parent; } else if (current == nullptr) { - - if (name == root->get_name()) + if (name == root->get_name()) { next = root; + } } else { - next = nullptr; for (int j = 0; j < current->data.children.size(); j++) { - Node *child = current->data.children[j]; if (child->data.name == name) { - next = child; break; } @@ -1458,49 +1412,48 @@ Node *Node::get_node_or_null(const NodePath &p_path) const { } Node *Node::get_node(const NodePath &p_path) const { - Node *node = get_node_or_null(p_path); ERR_FAIL_COND_V_MSG(!node, nullptr, "Node not found: " + p_path + "."); return node; } bool Node::has_node(const NodePath &p_path) const { - return get_node_or_null(p_path) != nullptr; } Node *Node::find_node(const String &p_mask, bool p_recursive, bool p_owned) const { - Node *const *cptr = data.children.ptr(); int ccount = data.children.size(); for (int i = 0; i < ccount; i++) { - if (p_owned && !cptr[i]->data.owner) + if (p_owned && !cptr[i]->data.owner) { continue; - if (cptr[i]->data.name.operator String().match(p_mask)) + } + if (cptr[i]->data.name.operator String().match(p_mask)) { return cptr[i]; + } - if (!p_recursive) + if (!p_recursive) { continue; + } Node *ret = cptr[i]->find_node(p_mask, true, p_owned); - if (ret) + if (ret) { return ret; + } } return nullptr; } Node *Node::get_parent() const { - return data.parent; } Node *Node::find_parent(const String &p_mask) const { - Node *p = data.parent; while (p) { - - if (p->data.name.operator String().match(p_mask)) + if (p->data.name.operator String().match(p_mask)) { return p; + } p = p->data.parent; } @@ -1508,13 +1461,12 @@ Node *Node::find_parent(const String &p_mask) const { } bool Node::is_a_parent_of(const Node *p_node) const { - ERR_FAIL_NULL_V(p_node, false); Node *p = p_node->data.parent; while (p) { - - if (p == this) + if (p == this) { return true; + } p = p->data.parent; } @@ -1522,7 +1474,6 @@ bool Node::is_a_parent_of(const Node *p_node) const { } bool Node::is_greater_than(const Node *p_node) const { - ERR_FAIL_NULL_V(p_node, false); ERR_FAIL_COND_V(!data.inside_tree, false); ERR_FAIL_COND_V(!p_node->data.inside_tree, false); @@ -1565,7 +1516,6 @@ bool Node::is_greater_than(const Node *p_node) const { bool res; while (true) { - // using -2 since out-of-tree or nonroot nodes have -1 int this_idx = (idx >= data.depth) ? -2 : this_stack[idx]; int that_idx = (idx >= p_node->data.depth) ? -2 : that_stack[idx]; @@ -1587,18 +1537,19 @@ bool Node::is_greater_than(const Node *p_node) const { } void Node::get_owned_by(Node *p_by, List<Node *> *p_owned) { - - if (data.owner == p_by) + if (data.owner == p_by) { p_owned->push_back(this); + } - for (int i = 0; i < get_child_count(); i++) + for (int i = 0; i < get_child_count(); i++) { get_child(i)->get_owned_by(p_by, p_owned); + } } void Node::_set_owner_nocheck(Node *p_owner) { - - if (data.owner == p_owner) + if (data.owner == p_owner) { return; + } ERR_FAIL_COND(data.owner); data.owner = p_owner; @@ -1607,9 +1558,7 @@ void Node::_set_owner_nocheck(Node *p_owner) { } void Node::set_owner(Node *p_owner) { - if (data.owner) { - data.owner->data.owned.erase(data.OW); data.OW = nullptr; data.owner = nullptr; @@ -1617,14 +1566,14 @@ void Node::set_owner(Node *p_owner) { ERR_FAIL_COND(p_owner == this); - if (!p_owner) + if (!p_owner) { return; + } Node *check = this->get_parent(); bool owner_valid = false; while (check) { - if (check == p_owner) { owner_valid = true; break; @@ -1637,22 +1586,21 @@ void Node::set_owner(Node *p_owner) { _set_owner_nocheck(p_owner); } -Node *Node::get_owner() const { +Node *Node::get_owner() const { return data.owner; } Node *Node::find_common_parent_with(const Node *p_node) const { - - if (this == p_node) + if (this == p_node) { return const_cast<Node *>(p_node); + } Set<const Node *> visited; const Node *n = this; while (n) { - visited.insert(n); n = n->data.parent; } @@ -1660,31 +1608,31 @@ Node *Node::find_common_parent_with(const Node *p_node) const { const Node *common_parent = p_node; while (common_parent) { - - if (visited.has(common_parent)) + if (visited.has(common_parent)) { break; + } common_parent = common_parent->data.parent; } - if (!common_parent) + if (!common_parent) { return nullptr; + } return const_cast<Node *>(common_parent); } NodePath Node::get_path_to(const Node *p_node) const { - ERR_FAIL_NULL_V(p_node, NodePath()); - if (this == p_node) + if (this == p_node) { return NodePath("."); + } Set<const Node *> visited; const Node *n = this; while (n) { - visited.insert(n); n = n->data.parent; } @@ -1692,9 +1640,9 @@ NodePath Node::get_path_to(const Node *p_node) const { const Node *common_parent = p_node; while (common_parent) { - - if (visited.has(common_parent)) + if (visited.has(common_parent)) { break; + } common_parent = common_parent->data.parent; } @@ -1707,7 +1655,6 @@ NodePath Node::get_path_to(const Node *p_node) const { n = p_node; while (n != common_parent) { - path.push_back(n->get_name()); n = n->data.parent; } @@ -1716,7 +1663,6 @@ NodePath Node::get_path_to(const Node *p_node) const { StringName up = String(".."); while (n != common_parent) { - path.push_back(up); n = n->data.parent; } @@ -1727,11 +1673,11 @@ NodePath Node::get_path_to(const Node *p_node) const { } NodePath Node::get_path() const { - ERR_FAIL_COND_V_MSG(!is_inside_tree(), NodePath(), "Cannot get path of node as it is not in a scene tree."); - if (data.path_cache) + if (data.path_cache) { return *data.path_cache; + } const Node *n = this; @@ -1750,16 +1696,15 @@ NodePath Node::get_path() const { } bool Node::is_in_group(const StringName &p_identifier) const { - return data.grouped.has(p_identifier); } void Node::add_to_group(const StringName &p_identifier, bool p_persistent) { - ERR_FAIL_COND(!p_identifier.operator String().length()); - if (data.grouped.has(p_identifier)) + if (data.grouped.has(p_identifier)) { return; + } GroupData gd; @@ -1775,21 +1720,20 @@ void Node::add_to_group(const StringName &p_identifier, bool p_persistent) { } void Node::remove_from_group(const StringName &p_identifier) { - ERR_FAIL_COND(!data.grouped.has(p_identifier)); Map<StringName, GroupData>::Element *E = data.grouped.find(p_identifier); ERR_FAIL_COND(!E); - if (data.tree) + if (data.tree) { data.tree->remove_from_group(E->key(), this); + } data.grouped.erase(E); } Array Node::_get_groups() const { - Array groups; List<GroupInfo> gi; get_groups(&gi); @@ -1801,7 +1745,6 @@ Array Node::_get_groups() const { } void Node::get_groups(List<GroupInfo> *p_groups) const { - for (const Map<StringName, GroupData>::Element *E = data.grouped.front(); E; E = E->next()) { GroupInfo gi; gi.name = E->key(); @@ -1811,7 +1754,6 @@ void Node::get_groups(List<GroupInfo> *p_groups) const { } int Node::get_persistent_group_count() const { - int count = 0; for (const Map<StringName, GroupData>::Element *E = data.grouped.front(); E; E = E->next()) { @@ -1822,8 +1764,8 @@ int Node::get_persistent_group_count() const { return count; } -void Node::_print_tree_pretty(const String &prefix, const bool last) { +void Node::_print_tree_pretty(const String &prefix, const bool last) { String new_prefix = last ? String::utf8(" â”–â•´") : String::utf8(" â” â•´"); print_line(prefix + new_prefix + String(get_name())); for (int i = 0; i < data.children.size(); i++) { @@ -1837,21 +1779,19 @@ void Node::print_tree_pretty() { } void Node::print_tree() { - _print_tree(this); } void Node::_print_tree(const Node *p_node) { print_line(String(p_node->get_path_to(this))); - for (int i = 0; i < data.children.size(); i++) + for (int i = 0; i < data.children.size(); i++) { data.children[i]->_print_tree(p_node); + } } void Node::_propagate_reverse_notification(int p_notification) { - data.blocked++; for (int i = data.children.size() - 1; i >= 0; i--) { - data.children[i]->_propagate_reverse_notification(p_notification); } @@ -1860,71 +1800,70 @@ void Node::_propagate_reverse_notification(int p_notification) { } void Node::_propagate_deferred_notification(int p_notification, bool p_reverse) { - ERR_FAIL_COND(!is_inside_tree()); data.blocked++; - if (!p_reverse) + if (!p_reverse) { MessageQueue::get_singleton()->push_notification(this, p_notification); + } for (int i = 0; i < data.children.size(); i++) { - data.children[i]->_propagate_deferred_notification(p_notification, p_reverse); } - if (p_reverse) + if (p_reverse) { MessageQueue::get_singleton()->push_notification(this, p_notification); + } data.blocked--; } void Node::propagate_notification(int p_notification) { - data.blocked++; notification(p_notification); for (int i = 0; i < data.children.size(); i++) { - data.children[i]->propagate_notification(p_notification); } data.blocked--; } void Node::propagate_call(const StringName &p_method, const Array &p_args, const bool p_parent_first) { - data.blocked++; - if (p_parent_first && has_method(p_method)) + if (p_parent_first && has_method(p_method)) { callv(p_method, p_args); + } for (int i = 0; i < data.children.size(); i++) { data.children[i]->propagate_call(p_method, p_args, p_parent_first); } - if (!p_parent_first && has_method(p_method)) + if (!p_parent_first && has_method(p_method)) { callv(p_method, p_args); + } data.blocked--; } void Node::_propagate_replace_owner(Node *p_owner, Node *p_by_owner) { - if (get_owner() == p_owner) + if (get_owner() == p_owner) { set_owner(p_by_owner); + } data.blocked++; - for (int i = 0; i < data.children.size(); i++) + for (int i = 0; i < data.children.size(); i++) { data.children[i]->_propagate_replace_owner(p_owner, p_by_owner); + } data.blocked--; } int Node::get_index() const { - return data.pos; } void Node::remove_and_skip() { - ERR_FAIL_COND(!data.parent); Node *new_owner = get_owner(); @@ -1932,12 +1871,12 @@ void Node::remove_and_skip() { List<Node *> children; while (true) { - bool clear = true; for (int i = 0; i < data.children.size(); i++) { Node *c_node = data.children[i]; - if (!c_node->get_owner()) + if (!c_node->get_owner()) { continue; + } remove_child(c_node); c_node->_propagate_replace_owner(this, nullptr); @@ -1946,12 +1885,12 @@ void Node::remove_and_skip() { break; } - if (clear) + if (clear) { break; + } } while (!children.empty()) { - Node *c_node = children.front()->get(); data.parent->add_child(c_node); c_node->_propagate_replace_owner(nullptr, new_owner); @@ -1962,20 +1901,18 @@ void Node::remove_and_skip() { } void Node::set_filename(const String &p_filename) { - data.filename = p_filename; } -String Node::get_filename() const { +String Node::get_filename() const { return data.filename; } void Node::set_editor_description(const String &p_editor_description) { - set_meta("_editor_description_", p_editor_description); } -String Node::get_editor_description() const { +String Node::get_editor_description() const { if (has_meta("_editor_description_")) { return get_meta("_editor_description_"); } else { @@ -1984,7 +1921,6 @@ String Node::get_editor_description() const { } void Node::set_editable_instance(Node *p_node, bool p_editable) { - ERR_FAIL_NULL(p_node); ERR_FAIL_COND(!is_a_parent_of(p_node)); NodePath p = get_path_to(p_node); @@ -1999,75 +1935,65 @@ void Node::set_editable_instance(Node *p_node, bool p_editable) { } bool Node::is_editable_instance(const Node *p_node) const { - - if (!p_node) + if (!p_node) { return false; //easier, null is never editable :) + } ERR_FAIL_COND_V(!is_a_parent_of(p_node), false); NodePath p = get_path_to(p_node); return data.editable_instances.has(p); } void Node::set_editable_instances(const HashMap<NodePath, int> &p_editable_instances) { - data.editable_instances = p_editable_instances; } HashMap<NodePath, int> Node::get_editable_instances() const { - return data.editable_instances; } void Node::set_scene_instance_state(const Ref<SceneState> &p_state) { - data.instance_state = p_state; } Ref<SceneState> Node::get_scene_instance_state() const { - return data.instance_state; } void Node::set_scene_inherited_state(const Ref<SceneState> &p_state) { - data.inherited_state = p_state; } Ref<SceneState> Node::get_scene_inherited_state() const { - return data.inherited_state; } void Node::set_scene_instance_load_placeholder(bool p_enable) { - data.use_placeholder = p_enable; } bool Node::get_scene_instance_load_placeholder() const { - return data.use_placeholder; } Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const { - Node *node = nullptr; bool instanced = false; if (Object::cast_to<InstancePlaceholder>(this)) { - const InstancePlaceholder *ip = Object::cast_to<const InstancePlaceholder>(this); InstancePlaceholder *nip = memnew(InstancePlaceholder); nip->set_instance_path(ip->get_instance_path()); node = nip; } else if ((p_flags & DUPLICATE_USE_INSTANCING) && get_filename() != String()) { - Ref<PackedScene> res = ResourceLoader::load(get_filename()); ERR_FAIL_COND_V(res.is_null(), nullptr); PackedScene::GenEditState ges = PackedScene::GEN_EDIT_STATE_DISABLED; #ifdef TOOLS_ENABLED - if (p_flags & DUPLICATE_FROM_EDITOR) + if (p_flags & DUPLICATE_FROM_EDITOR) { ges = PackedScene::GEN_EDIT_STATE_INSTANCE; + } #endif node = res->instance(ges); ERR_FAIL_COND_V(!node, nullptr); @@ -2075,12 +2001,12 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const instanced = true; } else { - Object *obj = ClassDB::instance(get_class()); ERR_FAIL_COND_V(!obj, nullptr); node = Object::cast_to<Node>(obj); - if (!node) + if (!node) { memdelete(obj); + } ERR_FAIL_COND_V(!node, nullptr); } @@ -2100,13 +2026,13 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const for (List<const Node *>::Element *N = node_tree.front(); N; N = N->next()) { for (int i = 0; i < N->get()->get_child_count(); ++i) { - Node *descendant = N->get()->get_child(i); // Skip nodes not really belonging to the instanced hierarchy; they'll be processed normally later // but remember non-instanced nodes that are hidden below instanced ones if (descendant->data.owner != this) { - if (descendant->get_parent() && descendant->get_parent() != this && descendant->get_parent()->data.owner == this && descendant->data.owner != descendant->get_parent()) + if (descendant->get_parent() && descendant->get_parent() != this && descendant->get_parent()->data.owner == this && descendant->data.owner != descendant->get_parent()) { hidden_roots.push_back(descendant); + } continue; } @@ -2116,7 +2042,6 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const } for (List<const Node *>::Element *N = node_tree.front(); N; N = N->next()) { - Node *current_node = node->get_node(get_path_to(N->get())); ERR_CONTINUE(!current_node); @@ -2132,24 +2057,23 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const N->get()->get_property_list(&plist); for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { - - if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) + if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) { continue; + } String name = E->get().name; - if (name == script_property_name) + if (name == script_property_name) { continue; + } Variant value = N->get()->get(name).duplicate(true); if (E->get().usage & PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE) { - Resource *res = Object::cast_to<Resource>(value); if (res) { // Duplicate only if it's a resource current_node->set(name, res->duplicate()); } } else { - current_node->set(name, value); } } @@ -2160,18 +2084,19 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const } #ifdef TOOLS_ENABLED - if ((p_flags & DUPLICATE_FROM_EDITOR) && r_duplimap) + if ((p_flags & DUPLICATE_FROM_EDITOR) && r_duplimap) { r_duplimap->insert(this, node); + } #endif if (p_flags & DUPLICATE_GROUPS) { List<GroupInfo> gi; get_groups(&gi); for (List<GroupInfo>::Element *E = gi.front(); E; E = E->next()) { - #ifdef TOOLS_ENABLED - if ((p_flags & DUPLICATE_FROM_EDITOR) && !E->get().persistent) + if ((p_flags & DUPLICATE_FROM_EDITOR) && !E->get().persistent) { continue; + } #endif node->add_to_group(E->get().name, E->get().persistent); @@ -2179,15 +2104,15 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const } for (int i = 0; i < get_child_count(); i++) { - - if (get_child(i)->data.parent_owned) + if (get_child(i)->data.parent_owned) { continue; - if (instanced && get_child(i)->data.owner == this) + } + if (instanced && get_child(i)->data.owner == this) { continue; //part of instance + } Node *dup = get_child(i)->_duplicate(p_flags, r_duplimap); if (!dup) { - memdelete(node); return nullptr; } @@ -2199,17 +2124,14 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const } for (List<const Node *>::Element *E = hidden_roots.front(); E; E = E->next()) { - Node *parent = node->get_node(get_path_to(E->get()->data.parent)); if (!parent) { - memdelete(node); return nullptr; } Node *dup = E->get()->_duplicate(p_flags, r_duplimap); if (!dup) { - memdelete(node); return nullptr; } @@ -2218,7 +2140,6 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const int pos = E->get()->get_index(); if (pos < parent->get_child_count() - 1) { - parent->move_child(dup, pos); } } @@ -2227,7 +2148,6 @@ Node *Node::_duplicate(int p_flags, Map<const Node *, Node *> *r_duplimap) const } Node *Node::duplicate(int p_flags) const { - Node *dupe = _duplicate(p_flags); if (dupe && (p_flags & DUPLICATE_SIGNALS)) { @@ -2239,7 +2159,6 @@ Node *Node::duplicate(int p_flags) const { #ifdef TOOLS_ENABLED Node *Node::duplicate_from_editor(Map<const Node *, Node *> &r_duplimap) const { - Node *dupe = _duplicate(DUPLICATE_SIGNALS | DUPLICATE_GROUPS | DUPLICATE_SCRIPTS | DUPLICATE_USE_INSTANCING | DUPLICATE_FROM_EDITOR, &r_duplimap); // Duplication of signals must happen after all the node descendants have been copied, @@ -2252,20 +2171,18 @@ Node *Node::duplicate_from_editor(Map<const Node *, Node *> &r_duplimap) const { #endif void Node::_duplicate_and_reown(Node *p_new_parent, const Map<Node *, Node *> &p_reown_map) const { - - if (get_owner() != get_parent()->get_owner()) + if (get_owner() != get_parent()->get_owner()) { return; + } Node *node = nullptr; if (get_filename() != "") { - Ref<PackedScene> res = ResourceLoader::load(get_filename()); ERR_FAIL_COND_MSG(res.is_null(), "Cannot load scene: " + get_filename()); node = res->instance(); ERR_FAIL_COND(!node); } else { - Object *obj = ClassDB::instance(get_class()); ERR_FAIL_COND_MSG(!obj, "Node: Could not duplicate: " + String(get_class()) + "."); node = Object::cast_to<Node>(obj); @@ -2280,9 +2197,9 @@ void Node::_duplicate_and_reown(Node *p_new_parent, const Map<Node *, Node *> &p get_property_list(&plist); for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { - - if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) + if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) { continue; + } String name = E->get().name; Variant value = get(name).duplicate(true); @@ -2293,16 +2210,18 @@ void Node::_duplicate_and_reown(Node *p_new_parent, const Map<Node *, Node *> &p List<GroupInfo> groups; get_groups(&groups); - for (List<GroupInfo>::Element *E = groups.front(); E; E = E->next()) + for (List<GroupInfo>::Element *E = groups.front(); E; E = E->next()) { node->add_to_group(E->get().name, E->get().persistent); + } node->set_name(get_name()); p_new_parent->add_child(node); Node *owner = get_owner(); - if (p_reown_map.has(owner)) + if (p_reown_map.has(owner)) { owner = p_reown_map[owner]; + } if (owner) { NodePath p = get_path_to(owner); @@ -2315,7 +2234,6 @@ void Node::_duplicate_and_reown(Node *p_new_parent, const Map<Node *, Node *> &p } for (int i = 0; i < get_child_count(); i++) { - get_child(i)->_duplicate_and_reown(node, p_reown_map); } } @@ -2324,15 +2242,14 @@ void Node::_duplicate_and_reown(Node *p_new_parent, const Map<Node *, Node *> &p // because re-targeting of connections from some descendant to another is not possible // if the emitter node comes later in tree order than the receiver void Node::_duplicate_signals(const Node *p_original, Node *p_copy) const { - - if (this != p_original && (get_owner() != p_original && get_owner() != p_original->get_owner())) + if (this != p_original && (get_owner() != p_original && get_owner() != p_original->get_owner())) { return; + } List<Connection> conns; get_all_signal_connections(&conns); for (List<Connection>::Element *E = conns.front(); E; E = E->next()) { - if (E->get().flags & CONNECT_PERSIST) { //user connected NodePath p = p_original->get_path_to(this); @@ -2350,8 +2267,9 @@ void Node::_duplicate_signals(const Node *p_original, Node *p_copy) const { // of the duplicated and not yet parented hierarchy then at least try to connect // to the same target as the original - if (p_copy->has_node(ptarget)) + if (p_copy->has_node(ptarget)) { copytarget = p_copy->get_node(ptarget); + } if (copy && copytarget) { const Callable copy_callable = Callable(copytarget, E->get().callable.get_method()); @@ -2368,7 +2286,6 @@ void Node::_duplicate_signals(const Node *p_original, Node *p_copy) const { } Node *Node::duplicate_and_reown(const Map<Node *, Node *> &p_reown_map) const { - ERR_FAIL_COND_V(get_filename() != "", nullptr); Object *obj = ClassDB::instance(get_class()); @@ -2386,9 +2303,9 @@ Node *Node::duplicate_and_reown(const Map<Node *, Node *> &p_reown_map) const { get_property_list(&plist); for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { - - if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) + if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) { continue; + } String name = E->get().name; node->set(name, get(name)); } @@ -2396,11 +2313,11 @@ Node *Node::duplicate_and_reown(const Map<Node *, Node *> &p_reown_map) const { List<GroupInfo> groups; get_groups(&groups); - for (List<GroupInfo>::Element *E = groups.front(); E; E = E->next()) + for (List<GroupInfo>::Element *E = groups.front(); E; E = E->next()) { node->add_to_group(E->get().name, E->get().persistent); + } for (int i = 0; i < get_child_count(); i++) { - get_child(i)->_duplicate_and_reown(node, p_reown_map); } @@ -2412,24 +2329,21 @@ Node *Node::duplicate_and_reown(const Map<Node *, Node *> &p_reown_map) const { } static void find_owned_by(Node *p_by, Node *p_node, List<Node *> *p_owned) { - - if (p_node->get_owner() == p_by) + if (p_node->get_owner() == p_by) { p_owned->push_back(p_node); + } for (int i = 0; i < p_node->get_child_count(); i++) { - find_owned_by(p_by, p_node->get_child(i), p_owned); } } struct _NodeReplaceByPair { - String name; Variant value; }; void Node::replace_by(Node *p_node, bool p_keep_data) { - ERR_FAIL_NULL(p_node); ERR_FAIL_COND(p_node->data.parent); @@ -2440,15 +2354,14 @@ void Node::replace_by(Node *p_node, bool p_keep_data) { List<_NodeReplaceByPair> replace_data; if (p_keep_data) { - List<PropertyInfo> plist; get_property_list(&plist); for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { - _NodeReplaceByPair rd; - if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) + if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) { continue; + } rd.name = E->get().name; rd.value = get(rd.name); } @@ -2456,29 +2369,29 @@ void Node::replace_by(Node *p_node, bool p_keep_data) { List<GroupInfo> groups; get_groups(&groups); - for (List<GroupInfo>::Element *E = groups.front(); E; E = E->next()) + for (List<GroupInfo>::Element *E = groups.front(); E; E = E->next()) { p_node->add_to_group(E->get().name, E->get().persistent); + } } _replace_connections_target(p_node); if (data.owner) { - for (int i = 0; i < get_child_count(); i++) + for (int i = 0; i < get_child_count(); i++) { find_owned_by(data.owner, get_child(i), &owned_by_owner); + } } Node *parent = data.parent; int pos_in_parent = data.pos; if (data.parent) { - parent->remove_child(this); parent->add_child(p_node); parent->move_child(p_node, pos_in_parent); } while (get_child_count()) { - Node *child = get_child(0); remove_child(child); if (!child->is_owned_by_parent()) { @@ -2488,27 +2401,26 @@ void Node::replace_by(Node *p_node, bool p_keep_data) { } p_node->set_owner(owner); - for (int i = 0; i < owned.size(); i++) + for (int i = 0; i < owned.size(); i++) { owned[i]->set_owner(p_node); + } - for (int i = 0; i < owned_by_owner.size(); i++) + for (int i = 0; i < owned_by_owner.size(); i++) { owned_by_owner[i]->set_owner(owner); + } p_node->set_filename(get_filename()); for (List<_NodeReplaceByPair>::Element *E = replace_data.front(); E; E = E->next()) { - p_node->set(E->get().name, E->get().value); } } void Node::_replace_connections_target(Node *p_new_target) { - List<Connection> cl; get_signals_connected_to_this(&cl); for (List<Connection>::Element *E = cl.front(); E; E = E->next()) { - Connection &c = E->get(); if (c.flags & CONNECT_PERSIST) { @@ -2521,41 +2433,45 @@ void Node::_replace_connections_target(Node *p_new_target) { } Vector<Variant> Node::make_binds(VARIANT_ARG_DECLARE) { - Vector<Variant> ret; - if (p_arg1.get_type() == Variant::NIL) + if (p_arg1.get_type() == Variant::NIL) { return ret; - else + } else { ret.push_back(p_arg1); + } - if (p_arg2.get_type() == Variant::NIL) + if (p_arg2.get_type() == Variant::NIL) { return ret; - else + } else { ret.push_back(p_arg2); + } - if (p_arg3.get_type() == Variant::NIL) + if (p_arg3.get_type() == Variant::NIL) { return ret; - else + } else { ret.push_back(p_arg3); + } - if (p_arg4.get_type() == Variant::NIL) + if (p_arg4.get_type() == Variant::NIL) { return ret; - else + } else { ret.push_back(p_arg4); + } - if (p_arg5.get_type() == Variant::NIL) + if (p_arg5.get_type() == Variant::NIL) { return ret; - else + } else { ret.push_back(p_arg5); + } return ret; } bool Node::has_node_and_resource(const NodePath &p_path) const { - - if (!has_node(p_path)) + if (!has_node(p_path)) { return false; + } RES res; Vector<StringName> leftover_path; Node *node = get_node_and_resource(p_path, res, leftover_path, false); @@ -2564,21 +2480,22 @@ bool Node::has_node_and_resource(const NodePath &p_path) const { } Array Node::_get_node_and_resource(const NodePath &p_path) { - RES res; Vector<StringName> leftover_path; Node *node = get_node_and_resource(p_path, res, leftover_path, false); Array result; - if (node) + if (node) { result.push_back(node); - else + } else { result.push_back(Variant()); + } - if (res.is_valid()) + if (res.is_valid()) { result.push_back(res); - else + } else { result.push_back(Variant()); + } result.push_back(NodePath(Vector<StringName>(), leftover_path, false)); @@ -2586,15 +2503,14 @@ Array Node::_get_node_and_resource(const NodePath &p_path) { } Node *Node::get_node_and_resource(const NodePath &p_path, RES &r_res, Vector<StringName> &r_leftover_subpath, bool p_last_is_property) const { - Node *node = get_node(p_path); r_res = RES(); r_leftover_subpath = Vector<StringName>(); - if (!node) + if (!node) { return nullptr; + } if (p_path.get_subname_count()) { - int j = 0; // If not p_last_is_property, we shouldn't consider the last one as part of the resource for (; j < p_path.get_subname_count() - (int)p_last_is_property; j++) { @@ -2622,7 +2538,6 @@ Node *Node::get_node_and_resource(const NodePath &p_path, RES &r_res, Vector<Str } void Node::_set_tree(SceneTree *p_tree) { - SceneTree *tree_changed_a = nullptr; SceneTree *tree_changed_b = nullptr; @@ -2637,7 +2552,6 @@ void Node::_set_tree(SceneTree *p_tree) { data.tree = p_tree; if (data.tree) { - _propagate_enter_tree(); if (!data.parent || data.parent->data.ready_notified) { // No parent (root) or parent ready _propagate_ready(); //reverse_notification(NOTIFICATION_READY); @@ -2646,21 +2560,24 @@ void Node::_set_tree(SceneTree *p_tree) { tree_changed_b = data.tree; } - if (tree_changed_a) + if (tree_changed_a) { tree_changed_a->tree_changed(); - if (tree_changed_b) + } + if (tree_changed_b) { tree_changed_b->tree_changed(); + } } #ifdef DEBUG_ENABLED static void _Node_debug_sn(Object *p_obj) { - Node *n = Object::cast_to<Node>(p_obj); - if (!n) + if (!n) { return; + } - if (n->is_inside_tree()) + if (n->is_inside_tree()) { return; + } Node *p = n; while (p->get_parent()) { @@ -2668,28 +2585,26 @@ static void _Node_debug_sn(Object *p_obj) { } String path; - if (p == n) + if (p == n) { path = n->get_name(); - else + } else { path = String(p->get_name()) + "/" + p->get_path_to(n); + } print_line(itos(p_obj->get_instance_id()) + " - Stray Node: " + path + " (Type: " + n->get_class() + ")"); } #endif // DEBUG_ENABLED void Node::_print_stray_nodes() { - print_stray_nodes(); } void Node::print_stray_nodes() { - #ifdef DEBUG_ENABLED ObjectDB::debug_objects(_Node_debug_sn); #endif } void Node::queue_delete() { - if (is_inside_tree()) { get_tree()->queue_delete(this); } else { @@ -2698,25 +2613,23 @@ void Node::queue_delete() { } TypedArray<Node> Node::_get_children() const { - TypedArray<Node> arr; int cc = get_child_count(); arr.resize(cc); - for (int i = 0; i < cc; i++) + for (int i = 0; i < cc; i++) { arr[i] = get_child(i); + } return arr; } void Node::set_import_path(const NodePath &p_import_path) { - #ifdef TOOLS_ENABLED data.import_path = p_import_path; #endif } NodePath Node::get_import_path() const { - #ifdef TOOLS_ENABLED return data.import_path; #else @@ -2725,15 +2638,15 @@ NodePath Node::get_import_path() const { } static void _add_nodes_to_options(const Node *p_base, const Node *p_node, List<String> *r_options) { - #ifdef TOOLS_ENABLED const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", 0) ? "'" : "\""; #else const String quote_style = "\""; #endif - if (p_node != p_base && !p_node->get_owner()) + if (p_node != p_base && !p_node->get_owner()) { return; + } String n = p_base->get_path_to(p_node); r_options->push_back(quote_style + n + quote_style); for (int i = 0; i < p_node->get_child_count(); i++) { @@ -2742,17 +2655,14 @@ static void _add_nodes_to_options(const Node *p_base, const Node *p_node, List<S } void Node::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { - String pf = p_function; if ((pf == "has_node" || pf == "get_node") && p_idx == 0) { - _add_nodes_to_options(this, this, r_options); } Object::get_argument_options(p_function, p_idx, r_options); } void Node::clear_internal_tree_resource_paths() { - clear_internal_resource_paths(); for (int i = 0; i < data.children.size(); i++) { data.children[i]->clear_internal_tree_resource_paths(); @@ -2760,7 +2670,6 @@ void Node::clear_internal_tree_resource_paths() { } String Node::get_configuration_warning() const { - if (get_script_instance() && get_script_instance()->get_script().is_valid() && get_script_instance()->get_script()->is_tool() && get_script_instance()->has_method("_get_configuration_warning")) { return get_script_instance()->call("_get_configuration_warning"); @@ -2769,10 +2678,10 @@ String Node::get_configuration_warning() const { } void Node::update_configuration_warning() { - #ifdef TOOLS_ENABLED - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } if (get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root() == this || get_tree()->get_edited_scene_root()->is_a_parent_of(this))) { get_tree()->emit_signal(SceneStringNames::get_singleton()->node_configuration_warning_changed, this); } @@ -2788,7 +2697,6 @@ void Node::set_display_folded(bool p_folded) { } bool Node::is_displayed_folded() const { - return data.display_folded; } @@ -2797,7 +2705,6 @@ void Node::request_ready() { } void Node::_bind_methods() { - GLOBAL_DEF("node/name_num_separator", 0); ProjectSettings::get_singleton()->set_custom_property_info("node/name_num_separator", PropertyInfo(Variant::INT, "node/name_num_separator", PROPERTY_HINT_ENUM, "None,Space,Underscore,Dash")); GLOBAL_DEF("node/name_casing", NAME_CASING_PASCAL_CASE); @@ -3011,7 +2918,6 @@ String Node::_get_name_num_separator() { } Node::Node() { - data.pos = -1; data.depth = -1; data.blocked = 0; @@ -3045,7 +2951,6 @@ Node::Node() { } Node::~Node() { - data.grouped.clear(); data.owned.clear(); data.children.clear(); diff --git a/scene/main/node.h b/scene/main/node.h index 1c1b7bbd7a..d1665d1236 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -43,7 +43,6 @@ class Viewport; class SceneState; class Node : public Object { - GDCLASS(Node, Object); OBJ_CATEGORY("Nodes"); @@ -67,12 +66,10 @@ public: }; struct Comparator { - bool operator()(const Node *p_a, const Node *p_b) const { return p_b->is_greater_than(p_a); } }; struct ComparatorWithPriority { - bool operator()(const Node *p_a, const Node *p_b) const { return p_b->data.process_priority == p_a->data.process_priority ? p_b->is_greater_than(p_a) : p_b->data.process_priority > p_a->data.process_priority; } }; @@ -80,7 +77,6 @@ public: private: struct GroupData { - bool persistent; SceneTree::Group *group; GroupData() { persistent = false; } @@ -92,7 +88,6 @@ private: }; struct Data { - String filename; Ref<SceneState> instance_state; Ref<SceneState> inherited_state; @@ -305,7 +300,6 @@ public: bool is_in_group(const StringName &p_identifier) const; struct GroupInfo { - StringName name; bool persistent; }; diff --git a/scene/main/resource_preloader.cpp b/scene/main/resource_preloader.cpp index 43a61834eb..c1d4435687 100644 --- a/scene/main/resource_preloader.cpp +++ b/scene/main/resource_preloader.cpp @@ -31,7 +31,6 @@ #include "resource_preloader.h" void ResourcePreloader::_set_resources(const Array &p_data) { - resources.clear(); ERR_FAIL_COND(p_data.size() != 2); @@ -41,7 +40,6 @@ void ResourcePreloader::_set_resources(const Array &p_data) { ERR_FAIL_COND(names.size() != resdata.size()); for (int i = 0; i < resdata.size(); i++) { - String name = names[i]; RES resource = resdata[i]; ERR_CONTINUE(!resource.is_valid()); @@ -52,7 +50,6 @@ void ResourcePreloader::_set_resources(const Array &p_data) { } Array ResourcePreloader::_get_resources() const { - Vector<String> names; Array arr; arr.resize(resources.size()); @@ -66,7 +63,6 @@ Array ResourcePreloader::_get_resources() const { int i = 0; for (Set<String>::Element *E = sorted_names.front(); E; E = E->next()) { - names.set(i, E->get()); arr[i] = resources[E->get()]; i++; @@ -79,15 +75,12 @@ Array ResourcePreloader::_get_resources() const { } void ResourcePreloader::add_resource(const StringName &p_name, const RES &p_resource) { - ERR_FAIL_COND(p_resource.is_null()); if (resources.has(p_name)) { - StringName new_name; int idx = 2; while (true) { - new_name = p_name.operator String() + " " + itos(idx); if (resources.has(new_name)) { idx++; @@ -99,18 +92,16 @@ void ResourcePreloader::add_resource(const StringName &p_name, const RES &p_reso add_resource(new_name, p_resource); } else { - resources[p_name] = p_resource; } } void ResourcePreloader::remove_resource(const StringName &p_name) { - ERR_FAIL_COND(!resources.has(p_name)); resources.erase(p_name); } -void ResourcePreloader::rename_resource(const StringName &p_from_name, const StringName &p_to_name) { +void ResourcePreloader::rename_resource(const StringName &p_from_name, const StringName &p_to_name) { ERR_FAIL_COND(!resources.has(p_from_name)); RES res = resources[p_from_name]; @@ -120,17 +111,15 @@ void ResourcePreloader::rename_resource(const StringName &p_from_name, const Str } bool ResourcePreloader::has_resource(const StringName &p_name) const { - return resources.has(p_name); } -RES ResourcePreloader::get_resource(const StringName &p_name) const { +RES ResourcePreloader::get_resource(const StringName &p_name) const { ERR_FAIL_COND_V(!resources.has(p_name), RES()); return resources[p_name]; } Vector<String> ResourcePreloader::_get_resource_list() const { - Vector<String> res; res.resize(resources.size()); int i = 0; @@ -142,15 +131,12 @@ Vector<String> ResourcePreloader::_get_resource_list() const { } void ResourcePreloader::get_resource_list(List<StringName> *p_list) { - for (Map<StringName, RES>::Element *E = resources.front(); E; E = E->next()) { - p_list->push_back(E->key()); } } void ResourcePreloader::_bind_methods() { - ClassDB::bind_method(D_METHOD("_set_resources"), &ResourcePreloader::_set_resources); ClassDB::bind_method(D_METHOD("_get_resources"), &ResourcePreloader::_get_resources); diff --git a/scene/main/resource_preloader.h b/scene/main/resource_preloader.h index 9ad219dd92..580dc35a57 100644 --- a/scene/main/resource_preloader.h +++ b/scene/main/resource_preloader.h @@ -34,7 +34,6 @@ #include "scene/main/node.h" class ResourcePreloader : public Node { - GDCLASS(ResourcePreloader, Node); Map<StringName, RES> resources; diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 94be22ccd2..a0e10f30c0 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -56,7 +56,6 @@ #include <stdio.h> void SceneTreeTimer::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_time_left", "time"), &SceneTreeTimer::set_time_left); ClassDB::bind_method(D_METHOD("get_time_left"), &SceneTreeTimer::get_time_left); @@ -74,7 +73,6 @@ float SceneTreeTimer::get_time_left() const { } void SceneTreeTimer::set_pause_mode_process(bool p_pause_mode_process) { - process_pause = p_pause_mode_process; } @@ -83,7 +81,6 @@ bool SceneTreeTimer::is_pause_mode_process() { } void SceneTreeTimer::release_connections() { - List<Connection> connections; get_all_signal_connections(&connections); @@ -99,33 +96,29 @@ SceneTreeTimer::SceneTreeTimer() { } void SceneTree::tree_changed() { - tree_version++; emit_signal(tree_changed_name); } void SceneTree::node_added(Node *p_node) { - emit_signal(node_added_name, p_node); } void SceneTree::node_removed(Node *p_node) { - if (current_scene == p_node) { current_scene = nullptr; } emit_signal(node_removed_name, p_node); - if (call_lock > 0) + if (call_lock > 0) { call_skip.insert(p_node); + } } void SceneTree::node_renamed(Node *p_node) { - emit_signal(node_renamed_name, p_node); } SceneTree::Group *SceneTree::add_to_group(const StringName &p_group, Node *p_node) { - Map<StringName, Group>::Element *E = group_map.find(p_group); if (!E) { E = group_map.insert(p_group, Group()); @@ -139,26 +132,25 @@ SceneTree::Group *SceneTree::add_to_group(const StringName &p_group, Node *p_nod } void SceneTree::remove_from_group(const StringName &p_group, Node *p_node) { - Map<StringName, Group>::Element *E = group_map.find(p_group); ERR_FAIL_COND(!E); E->get().nodes.erase(p_node); - if (E->get().nodes.empty()) + if (E->get().nodes.empty()) { group_map.erase(E); + } } void SceneTree::make_group_changed(const StringName &p_group) { Map<StringName, Group>::Element *E = group_map.find(p_group); - if (E) + if (E) { E->get().changed = true; + } } void SceneTree::flush_transform_notifications() { - SelfList<Node> *n = xform_change_list.first(); while (n) { - Node *node = n->self(); SelfList<Node> *nx = n->next(); xform_change_list.remove(n); @@ -168,16 +160,15 @@ void SceneTree::flush_transform_notifications() { } void SceneTree::_flush_ugc() { - ugc_locked = true; while (unique_group_calls.size()) { - Map<UGCall, Vector<Variant>>::Element *E = unique_group_calls.front(); Variant v[VARIANT_ARG_MAX]; - for (int i = 0; i < E->get().size(); i++) + for (int i = 0; i < E->get().size(); i++) { v[i] = E->get()[i]; + } call_group_flags(GROUP_CALL_REALTIME, E->key().group, E->key().call, v[0], v[1], v[2], v[3], v[4]); @@ -188,11 +179,12 @@ void SceneTree::_flush_ugc() { } void SceneTree::_update_group_order(Group &g, bool p_use_priority) { - - if (!g.changed) + if (!g.changed) { return; - if (g.nodes.empty()) + } + if (g.nodes.empty()) { return; + } Node **nodes = g.nodes.ptrw(); int node_count = g.nodes.size(); @@ -208,31 +200,33 @@ void SceneTree::_update_group_order(Group &g, bool p_use_priority) { } void SceneTree::call_group_flags(uint32_t p_call_flags, const StringName &p_group, const StringName &p_function, VARIANT_ARG_DECLARE) { - Map<StringName, Group>::Element *E = group_map.find(p_group); - if (!E) + if (!E) { return; + } Group &g = E->get(); - if (g.nodes.empty()) + if (g.nodes.empty()) { return; + } if (p_call_flags & GROUP_CALL_UNIQUE && !(p_call_flags & GROUP_CALL_REALTIME)) { - ERR_FAIL_COND(ugc_locked); UGCall ug; ug.call = p_function; ug.group = p_group; - if (unique_group_calls.has(ug)) + if (unique_group_calls.has(ug)) { return; + } VARIANT_ARGPTRS; Vector<Variant> args; for (int i = 0; i < VARIANT_ARG_MAX; i++) { - if (argptr[i]->get_type() == Variant::NIL) + if (argptr[i]->get_type() == Variant::NIL) { break; + } args.push_back(*argptr[i]); } @@ -249,51 +243,55 @@ void SceneTree::call_group_flags(uint32_t p_call_flags, const StringName &p_grou call_lock++; if (p_call_flags & GROUP_CALL_REVERSE) { - for (int i = node_count - 1; i >= 0; i--) { - - if (call_lock && call_skip.has(nodes[i])) + if (call_lock && call_skip.has(nodes[i])) { continue; + } if (p_call_flags & GROUP_CALL_REALTIME) { - if (p_call_flags & GROUP_CALL_MULTILEVEL) + if (p_call_flags & GROUP_CALL_MULTILEVEL) { nodes[i]->call_multilevel(p_function, VARIANT_ARG_PASS); - else + } else { nodes[i]->call(p_function, VARIANT_ARG_PASS); - } else + } + } else { MessageQueue::get_singleton()->push_call(nodes[i], p_function, VARIANT_ARG_PASS); + } } } else { - for (int i = 0; i < node_count; i++) { - - if (call_lock && call_skip.has(nodes[i])) + if (call_lock && call_skip.has(nodes[i])) { continue; + } if (p_call_flags & GROUP_CALL_REALTIME) { - if (p_call_flags & GROUP_CALL_MULTILEVEL) + if (p_call_flags & GROUP_CALL_MULTILEVEL) { nodes[i]->call_multilevel(p_function, VARIANT_ARG_PASS); - else + } else { nodes[i]->call(p_function, VARIANT_ARG_PASS); - } else + } + } else { MessageQueue::get_singleton()->push_call(nodes[i], p_function, VARIANT_ARG_PASS); + } } } call_lock--; - if (call_lock == 0) + if (call_lock == 0) { call_skip.clear(); + } } void SceneTree::notify_group_flags(uint32_t p_call_flags, const StringName &p_group, int p_notification) { - Map<StringName, Group>::Element *E = group_map.find(p_group); - if (!E) + if (!E) { return; + } Group &g = E->get(); - if (g.nodes.empty()) + if (g.nodes.empty()) { return; + } _update_group_order(g); @@ -304,45 +302,47 @@ void SceneTree::notify_group_flags(uint32_t p_call_flags, const StringName &p_gr call_lock++; if (p_call_flags & GROUP_CALL_REVERSE) { - for (int i = node_count - 1; i >= 0; i--) { - - if (call_lock && call_skip.has(nodes[i])) + if (call_lock && call_skip.has(nodes[i])) { continue; + } - if (p_call_flags & GROUP_CALL_REALTIME) + if (p_call_flags & GROUP_CALL_REALTIME) { nodes[i]->notification(p_notification); - else + } else { MessageQueue::get_singleton()->push_notification(nodes[i], p_notification); + } } } else { - for (int i = 0; i < node_count; i++) { - - if (call_lock && call_skip.has(nodes[i])) + if (call_lock && call_skip.has(nodes[i])) { continue; + } - if (p_call_flags & GROUP_CALL_REALTIME) + if (p_call_flags & GROUP_CALL_REALTIME) { nodes[i]->notification(p_notification); - else + } else { MessageQueue::get_singleton()->push_notification(nodes[i], p_notification); + } } } call_lock--; - if (call_lock == 0) + if (call_lock == 0) { call_skip.clear(); + } } void SceneTree::set_group_flags(uint32_t p_call_flags, const StringName &p_group, const String &p_name, const Variant &p_value) { - Map<StringName, Group>::Element *E = group_map.find(p_group); - if (!E) + if (!E) { return; + } Group &g = E->get(); - if (g.nodes.empty()) + if (g.nodes.empty()) { return; + } _update_group_order(g); @@ -353,35 +353,36 @@ void SceneTree::set_group_flags(uint32_t p_call_flags, const StringName &p_group call_lock++; if (p_call_flags & GROUP_CALL_REVERSE) { - for (int i = node_count - 1; i >= 0; i--) { - - if (call_lock && call_skip.has(nodes[i])) + if (call_lock && call_skip.has(nodes[i])) { continue; + } - if (p_call_flags & GROUP_CALL_REALTIME) + if (p_call_flags & GROUP_CALL_REALTIME) { nodes[i]->set(p_name, p_value); - else + } else { MessageQueue::get_singleton()->push_set(nodes[i], p_name, p_value); + } } } else { - for (int i = 0; i < node_count; i++) { - - if (call_lock && call_skip.has(nodes[i])) + if (call_lock && call_skip.has(nodes[i])) { continue; + } - if (p_call_flags & GROUP_CALL_REALTIME) + if (p_call_flags & GROUP_CALL_REALTIME) { nodes[i]->set(p_name, p_value); - else + } else { MessageQueue::get_singleton()->push_set(nodes[i], p_name, p_value); + } } } call_lock--; - if (call_lock == 0) + if (call_lock == 0) { call_skip.clear(); + } } void SceneTree::call_group(const StringName &p_group, const StringName &p_function, VARIANT_ARG_DECLARE) { @@ -389,12 +390,10 @@ void SceneTree::call_group(const StringName &p_group, const StringName &p_functi } void SceneTree::notify_group(const StringName &p_group, int p_notification) { - notify_group_flags(0, p_group, p_notification); } void SceneTree::set_group(const StringName &p_group, const String &p_name, const Variant &p_value) { - set_group_flags(0, p_group, p_name, p_value); } @@ -405,7 +404,6 @@ void SceneTree::init() { } bool SceneTree::iteration(float p_time) { - root_lock++; current_frame++; @@ -432,7 +430,6 @@ bool SceneTree::iteration(float p_time) { } bool SceneTree::idle(float p_time) { - //print_line("ram: "+itos(OS::get_singleton()->get_static_memory_usage())+" sram: "+itos(OS::get_singleton()->get_dynamic_memory_usage())); //print_line("node count: "+itos(get_node_count())); //print_line("TEXTURE RAM: "+itos(RS::get_singleton()->get_render_info(RS::INFO_TEXTURE_MEM_USED))); @@ -470,7 +467,6 @@ bool SceneTree::idle(float p_time) { List<Ref<SceneTreeTimer>>::Element *L = timers.back(); //last element for (List<Ref<SceneTreeTimer>>::Element *E = timers.front(); E;) { - List<Ref<SceneTreeTimer>>::Element *N = E->next(); if (pause && !E->get()->is_pause_mode_process()) { if (E == L) { @@ -509,7 +505,6 @@ bool SceneTree::idle(float p_time) { cpath = fallback->get_path(); } if (cpath != env_path) { - if (env_path != String()) { fallback = ResourceLoader::load(env_path); if (fallback.is_null()) { @@ -529,7 +524,6 @@ bool SceneTree::idle(float p_time) { } void SceneTree::finish() { - _flush_delete_queue(); _flush_ugc(); @@ -553,7 +547,6 @@ void SceneTree::finish() { } void SceneTree::quit(int p_exit_code) { - if (p_exit_code >= 0) { // Override the exit code if a positive argument is given (the default is `-1`). // This is a shorthand for calling `set_exit_code()` on the OS singleton then quitting. @@ -564,11 +557,11 @@ void SceneTree::quit(int p_exit_code) { } void SceneTree::_main_window_close() { - if (accept_quit) { _quit = true; } } + void SceneTree::_main_window_go_back() { if (quit_on_go_back) { _quit = true; @@ -583,9 +576,7 @@ void SceneTree::_main_window_focus_in() { } void SceneTree::_notification(int p_notification) { - switch (p_notification) { - case NOTIFICATION_TRANSLATION_CHANGED: { if (!Engine::get_singleton()->is_editor_hint()) { get_root()->propagate_notification(p_notification); @@ -597,7 +588,6 @@ void SceneTree::_notification(int p_notification) { case NOTIFICATION_CRASH: case NOTIFICATION_APP_RESUMED: case NOTIFICATION_APP_PAUSED: { - get_root()->propagate_notification(p_notification); } break; @@ -607,89 +597,74 @@ void SceneTree::_notification(int p_notification) { }; void SceneTree::set_auto_accept_quit(bool p_enable) { - accept_quit = p_enable; } void SceneTree::set_quit_on_go_back(bool p_enable) { - quit_on_go_back = p_enable; } #ifdef TOOLS_ENABLED bool SceneTree::is_node_being_edited(const Node *p_node) const { - return Engine::get_singleton()->is_editor_hint() && edited_scene_root && (edited_scene_root->is_a_parent_of(p_node) || edited_scene_root == p_node); } #endif #ifdef DEBUG_ENABLED void SceneTree::set_debug_collisions_hint(bool p_enabled) { - debug_collisions_hint = p_enabled; } bool SceneTree::is_debugging_collisions_hint() const { - return debug_collisions_hint; } void SceneTree::set_debug_navigation_hint(bool p_enabled) { - debug_navigation_hint = p_enabled; } bool SceneTree::is_debugging_navigation_hint() const { - return debug_navigation_hint; } #endif void SceneTree::set_debug_collisions_color(const Color &p_color) { - debug_collisions_color = p_color; } Color SceneTree::get_debug_collisions_color() const { - return debug_collisions_color; } void SceneTree::set_debug_collision_contact_color(const Color &p_color) { - debug_collision_contact_color = p_color; } Color SceneTree::get_debug_collision_contact_color() const { - return debug_collision_contact_color; } void SceneTree::set_debug_navigation_color(const Color &p_color) { - debug_navigation_color = p_color; } Color SceneTree::get_debug_navigation_color() const { - return debug_navigation_color; } void SceneTree::set_debug_navigation_disabled_color(const Color &p_color) { - debug_navigation_disabled_color = p_color; } Color SceneTree::get_debug_navigation_disabled_color() const { - return debug_navigation_disabled_color; } Ref<Material> SceneTree::get_debug_navigation_material() { - - if (navigation_material.is_valid()) + if (navigation_material.is_valid()) { return navigation_material; + } Ref<StandardMaterial3D> line_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); line_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); @@ -704,9 +679,9 @@ Ref<Material> SceneTree::get_debug_navigation_material() { } Ref<Material> SceneTree::get_debug_navigation_disabled_material() { - - if (navigation_disabled_material.is_valid()) + if (navigation_disabled_material.is_valid()) { return navigation_disabled_material; + } Ref<StandardMaterial3D> line_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); line_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); @@ -719,10 +694,11 @@ Ref<Material> SceneTree::get_debug_navigation_disabled_material() { return navigation_disabled_material; } -Ref<Material> SceneTree::get_debug_collision_material() { - if (collision_material.is_valid()) +Ref<Material> SceneTree::get_debug_collision_material() { + if (collision_material.is_valid()) { return collision_material; + } Ref<StandardMaterial3D> line_material = Ref<StandardMaterial3D>(memnew(StandardMaterial3D)); line_material->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); @@ -737,9 +713,9 @@ Ref<Material> SceneTree::get_debug_collision_material() { } Ref<ArrayMesh> SceneTree::get_debug_contact_mesh() { - - if (debug_contact_mesh.is_valid()) + if (debug_contact_mesh.is_valid()) { return debug_contact_mesh; + } debug_contact_mesh = Ref<ArrayMesh>(memnew(ArrayMesh)); @@ -773,12 +749,14 @@ Ref<ArrayMesh> SceneTree::get_debug_contact_mesh() { /* clang-format on */ Vector<int> indices; - for (int i = 0; i < 8 * 3; i++) + for (int i = 0; i < 8 * 3; i++) { indices.push_back(diamond_faces[i]); + } Vector<Vector3> vertices; - for (int i = 0; i < 6; i++) + for (int i = 0; i < 6; i++) { vertices.push_back(diamond[i] * 0.1); + } Array arr; arr.resize(Mesh::ARRAY_MAX); @@ -792,30 +770,31 @@ Ref<ArrayMesh> SceneTree::get_debug_contact_mesh() { } void SceneTree::set_pause(bool p_enabled) { - - if (p_enabled == pause) + if (p_enabled == pause) { return; + } pause = p_enabled; NavigationServer3D::get_singleton()->set_active(!p_enabled); PhysicsServer3D::get_singleton()->set_active(!p_enabled); PhysicsServer2D::get_singleton()->set_active(!p_enabled); - if (get_root()) + if (get_root()) { get_root()->propagate_notification(p_enabled ? Node::NOTIFICATION_PAUSED : Node::NOTIFICATION_UNPAUSED); + } } bool SceneTree::is_paused() const { - return pause; } void SceneTree::_notify_group_pause(const StringName &p_group, int p_notification) { - Map<StringName, Group>::Element *E = group_map.find(p_group); - if (!E) + if (!E) { return; + } Group &g = E->get(); - if (g.nodes.empty()) + if (g.nodes.empty()) { return; + } _update_group_order(g, p_notification == Node::NOTIFICATION_PROCESS || p_notification == Node::NOTIFICATION_INTERNAL_PROCESS || p_notification == Node::NOTIFICATION_PHYSICS_PROCESS || p_notification == Node::NOTIFICATION_INTERNAL_PHYSICS_PROCESS); @@ -829,23 +808,26 @@ void SceneTree::_notify_group_pause(const StringName &p_group, int p_notificatio call_lock++; for (int i = 0; i < node_count; i++) { - Node *n = nodes[i]; - if (call_lock && call_skip.has(n)) + if (call_lock && call_skip.has(n)) { continue; + } - if (!n->can_process()) + if (!n->can_process()) { continue; - if (!n->can_process_notification(p_notification)) + } + if (!n->can_process_notification(p_notification)) { continue; + } n->notification(p_notification); //ERR_FAIL_COND(node_count != g.nodes.size()); } call_lock--; - if (call_lock == 0) + if (call_lock == 0) { call_skip.clear(); + } } /* @@ -857,16 +839,18 @@ void SceneMainLoop::_update_listener_2d() { } } + */ void SceneTree::_call_input_pause(const StringName &p_group, const StringName &p_method, const Ref<InputEvent> &p_input, Viewport *p_viewport) { - Map<StringName, Group>::Element *E = group_map.find(p_group); - if (!E) + if (!E) { return; + } Group &g = E->get(); - if (g.nodes.empty()) + if (g.nodes.empty()) { return; + } _update_group_order(g); @@ -883,27 +867,30 @@ void SceneTree::_call_input_pause(const StringName &p_group, const StringName &p call_lock++; for (int i = node_count - 1; i >= 0; i--) { - - if (p_viewport->is_input_handled()) + if (p_viewport->is_input_handled()) { break; + } Node *n = nodes[i]; - if (call_lock && call_skip.has(n)) + if (call_lock && call_skip.has(n)) { continue; + } - if (!n->can_process()) + if (!n->can_process()) { continue; + } n->call_multilevel(p_method, (const Variant **)v, 1); //ERR_FAIL_COND(node_count != g.nodes.size()); } call_lock--; - if (call_lock == 0) + if (call_lock == 0) { call_skip.clear(); + } } -Variant SceneTree::_call_group_flags(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { +Variant SceneTree::_call_group_flags(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { r_error.error = Callable::CallError::CALL_OK; ERR_FAIL_COND_V(p_argcount < 3, Variant()); @@ -917,7 +904,6 @@ Variant SceneTree::_call_group_flags(const Variant **p_args, int p_argcount, Cal Variant v[VARIANT_ARG_MAX]; for (int i = 0; i < MIN(p_argcount - 3, 5); i++) { - v[i] = *p_args[i + 3]; } @@ -926,7 +912,6 @@ Variant SceneTree::_call_group_flags(const Variant **p_args, int p_argcount, Cal } Variant SceneTree::_call_group(const Variant **p_args, int p_argcount, Callable::CallError &r_error) { - r_error.error = Callable::CallError::CALL_OK; ERR_FAIL_COND_V(p_argcount < 2, Variant()); @@ -938,7 +923,6 @@ Variant SceneTree::_call_group(const Variant **p_args, int p_argcount, Callable: Variant v[VARIANT_ARG_MAX]; for (int i = 0; i < MIN(p_argcount - 2, 5); i++) { - v[i] = *p_args[i + 2]; } @@ -947,31 +931,30 @@ Variant SceneTree::_call_group(const Variant **p_args, int p_argcount, Callable: } int64_t SceneTree::get_frame() const { - return current_frame; } -int64_t SceneTree::get_event_count() const { +int64_t SceneTree::get_event_count() const { return current_event; } Array SceneTree::_get_nodes_in_group(const StringName &p_group) { - Array ret; Map<StringName, Group>::Element *E = group_map.find(p_group); - if (!E) + if (!E) { return ret; + } _update_group_order(E->get()); //update order just in case int nc = E->get().nodes.size(); - if (nc == 0) + if (nc == 0) { return ret; + } ret.resize(nc); Node **ptr = E->get().nodes.ptrw(); for (int i = 0; i < nc; i++) { - ret[i] = ptr[i]; } @@ -979,32 +962,30 @@ Array SceneTree::_get_nodes_in_group(const StringName &p_group) { } bool SceneTree::has_group(const StringName &p_identifier) const { - return group_map.has(p_identifier); } -void SceneTree::get_nodes_in_group(const StringName &p_group, List<Node *> *p_list) { +void SceneTree::get_nodes_in_group(const StringName &p_group, List<Node *> *p_list) { Map<StringName, Group>::Element *E = group_map.find(p_group); - if (!E) + if (!E) { return; + } _update_group_order(E->get()); //update order just in case int nc = E->get().nodes.size(); - if (nc == 0) + if (nc == 0) { return; + } Node **ptr = E->get().nodes.ptrw(); for (int i = 0; i < nc; i++) { - p_list->push_back(ptr[i]); } } void SceneTree::_flush_delete_queue() { - _THREAD_SAFE_METHOD_ while (delete_queue.size()) { - Object *obj = ObjectDB::get_instance(delete_queue.front()->get()); if (obj) { memdelete(obj); @@ -1014,7 +995,6 @@ void SceneTree::_flush_delete_queue() { } void SceneTree::queue_delete(Object *p_object) { - _THREAD_SAFE_METHOD_ ERR_FAIL_NULL(p_object); p_object->_is_queued_for_deletion = true; @@ -1022,7 +1002,6 @@ void SceneTree::queue_delete(Object *p_object) { } int SceneTree::get_node_count() const { - return node_count; } @@ -1033,7 +1012,6 @@ void SceneTree::set_edited_scene_root(Node *p_node) { } Node *SceneTree::get_edited_scene_root() const { - #ifdef TOOLS_ENABLED return edited_scene_root; #else @@ -1042,18 +1020,15 @@ Node *SceneTree::get_edited_scene_root() const { } void SceneTree::set_current_scene(Node *p_scene) { - ERR_FAIL_COND(p_scene && p_scene->get_parent() != root); current_scene = p_scene; } Node *SceneTree::get_current_scene() const { - return current_scene; } void SceneTree::_change_scene(Node *p_to) { - if (current_scene) { memdelete(current_scene); current_scene = nullptr; @@ -1075,8 +1050,9 @@ void SceneTree::_change_scene(Node *p_to) { Error SceneTree::change_scene(const String &p_path) { Ref<PackedScene> new_scene = ResourceLoader::load(p_path); - if (new_scene.is_null()) + if (new_scene.is_null()) { return ERR_CANT_OPEN; + } return change_scene_to(new_scene); } @@ -1099,13 +1075,11 @@ Error SceneTree::reload_current_scene() { } void SceneTree::add_current_scene(Node *p_current) { - current_scene = p_current; root->add_child(p_current); } Ref<SceneTreeTimer> SceneTree::create_timer(float p_delay_sec, bool p_process_pause) { - Ref<SceneTreeTimer> stt; stt.instance(); stt->set_pause_mode_process(p_process_pause); @@ -1115,27 +1089,22 @@ Ref<SceneTreeTimer> SceneTree::create_timer(float p_delay_sec, bool p_process_pa } void SceneTree::_network_peer_connected(int p_id) { - emit_signal("network_peer_connected", p_id); } void SceneTree::_network_peer_disconnected(int p_id) { - emit_signal("network_peer_disconnected", p_id); } void SceneTree::_connected_to_server() { - emit_signal("connected_to_server"); } void SceneTree::_connection_failed() { - emit_signal("connection_failed"); } void SceneTree::_server_disconnected() { - emit_signal("server_disconnected"); } @@ -1173,17 +1142,14 @@ void SceneTree::set_multiplayer(Ref<MultiplayerAPI> p_multiplayer) { } void SceneTree::set_network_peer(const Ref<NetworkedMultiplayerPeer> &p_network_peer) { - multiplayer->set_network_peer(p_network_peer); } Ref<NetworkedMultiplayerPeer> SceneTree::get_network_peer() const { - return multiplayer->get_network_peer(); } bool SceneTree::is_network_server() const { - return multiplayer->is_network_server(); } @@ -1192,12 +1158,10 @@ bool SceneTree::has_network_peer() const { } int SceneTree::get_network_unique_id() const { - return multiplayer->get_network_unique_id(); } Vector<int> SceneTree::get_network_connected_peers() const { - return multiplayer->get_network_connected_peers(); } @@ -1214,7 +1178,6 @@ bool SceneTree::is_refusing_new_network_connections() const { } void SceneTree::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_root"), &SceneTree::get_root); ClassDB::bind_method(D_METHOD("has_group", "name"), &SceneTree::has_group); @@ -1327,7 +1290,6 @@ SceneTree::IdleCallback SceneTree::idle_callbacks[SceneTree::MAX_IDLE_CALLBACKS] int SceneTree::idle_callback_count = 0; void SceneTree::_call_idle_callbacks() { - for (int i = 0; i < idle_callback_count; i++) { idle_callbacks[i](); } @@ -1339,7 +1301,6 @@ void SceneTree::add_idle_callback(IdleCallback p_callback) { } void SceneTree::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { - if (p_function == "change_scene") { DirAccessRef dir_access = DirAccess::create(DirAccess::ACCESS_RESOURCES); List<String> directories; @@ -1371,9 +1332,9 @@ void SceneTree::get_argument_options(const StringName &p_function, int p_idx, Li } SceneTree::SceneTree() { - - if (singleton == nullptr) + if (singleton == nullptr) { singleton = this; + } _quit = false; accept_quit = true; quit_on_go_back = true; @@ -1410,8 +1371,9 @@ SceneTree::SceneTree() { root = memnew(Window); root->set_name("root"); - if (!root->get_world_3d().is_valid()) + if (!root->get_world_3d().is_valid()) { root->set_world_3d(Ref<World3D>(memnew(World3D))); + } // Initialize network state multiplayer_poll = true; @@ -1436,8 +1398,9 @@ SceneTree::SceneTree() { ResourceLoader::get_recognized_extensions_for_type("Environment", &exts); String ext_hint; for (List<String>::Element *E = exts.front(); E; E = E->next()) { - if (ext_hint != String()) + if (ext_hint != String()) { ext_hint += ","; + } ext_hint += "*." + E->get(); } //get path @@ -1479,6 +1442,7 @@ SceneTree::~SceneTree() { memdelete(root); } - if (singleton == this) + if (singleton == this) { singleton = nullptr; + } } diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index 319b5a7e74..57b6b4dcfa 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -70,7 +70,6 @@ public: }; class SceneTree : public MainLoop { - _THREAD_SAFE_CLASS_ GDCLASS(SceneTree, MainLoop); @@ -80,7 +79,6 @@ public: private: struct Group { - Vector<Node *> nodes; //uint64_t last_tree_version; bool changed; @@ -119,7 +117,6 @@ private: Node *edited_scene_root; #endif struct UGCall { - StringName group; StringName call; diff --git a/scene/main/shader_globals_override.cpp b/scene/main/shader_globals_override.cpp index 272cea8f2b..726dcb58de 100644 --- a/scene/main/shader_globals_override.cpp +++ b/scene/main/shader_globals_override.cpp @@ -35,7 +35,6 @@ #include "scene/scene_string_names.h" StringName *ShaderGlobalsOverride::_remap(const StringName &p_name) const { - StringName *r = param_remaps.getptr(p_name); if (!r) { //not cached, do caching @@ -49,8 +48,8 @@ StringName *ShaderGlobalsOverride::_remap(const StringName &p_name) const { return r; } -bool ShaderGlobalsOverride::_set(const StringName &p_name, const Variant &p_value) { +bool ShaderGlobalsOverride::_set(const StringName &p_name, const Variant &p_value) { StringName *r = _remap(p_name); if (r) { @@ -75,7 +74,6 @@ bool ShaderGlobalsOverride::_set(const StringName &p_name, const Variant &p_valu } bool ShaderGlobalsOverride::_get(const StringName &p_name, Variant &r_ret) const { - StringName *r = _remap(p_name); if (r) { @@ -90,7 +88,6 @@ bool ShaderGlobalsOverride::_get(const StringName &p_name, Variant &r_ret) const } void ShaderGlobalsOverride::_get_property_list(List<PropertyInfo> *p_list) const { - Vector<StringName> variables; variables = RS::get_singleton()->global_variable_get_list(); for (int i = 0; i < variables.size(); i++) { @@ -198,7 +195,6 @@ void ShaderGlobalsOverride::_get_property_list(List<PropertyInfo> *p_list) const pinfo.hint_string = "Cubemap"; } break; default: { - } break; } @@ -221,7 +217,6 @@ void ShaderGlobalsOverride::_get_property_list(List<PropertyInfo> *p_list) const } void ShaderGlobalsOverride::_activate() { - List<Node *> nodes; get_tree()->get_nodes_in_group(SceneStringNames::get_singleton()->shader_overrides_group_active, &nodes); if (nodes.size() == 0) { @@ -242,14 +237,11 @@ void ShaderGlobalsOverride::_activate() { } void ShaderGlobalsOverride::_notification(int p_what) { - if (p_what == Node3D::NOTIFICATION_ENTER_TREE) { - add_to_group(SceneStringNames::get_singleton()->shader_overrides_group); _activate(); } else if (p_what == Node3D::NOTIFICATION_EXIT_TREE) { - if (active) { //remove overrides const StringName *K = nullptr; @@ -269,7 +261,6 @@ void ShaderGlobalsOverride::_notification(int p_what) { } String ShaderGlobalsOverride::get_configuration_warning() const { - if (!active) { return TTR("ShaderGlobalsOverride is not active because another node of the same type is in the scene."); } @@ -278,7 +269,6 @@ String ShaderGlobalsOverride::get_configuration_warning() const { } void ShaderGlobalsOverride::_bind_methods() { - ClassDB::bind_method(D_METHOD("_activate"), &ShaderGlobalsOverride::_activate); } diff --git a/scene/main/shader_globals_override.h b/scene/main/shader_globals_override.h index d470e6a7dc..51420e00cf 100644 --- a/scene/main/shader_globals_override.h +++ b/scene/main/shader_globals_override.h @@ -34,7 +34,6 @@ #include "scene/3d/node_3d.h" class ShaderGlobalsOverride : public Node { - GDCLASS(ShaderGlobalsOverride, Node); struct Override { diff --git a/scene/main/timer.cpp b/scene/main/timer.cpp index 7cab4028b8..fb55892b54 100644 --- a/scene/main/timer.cpp +++ b/scene/main/timer.cpp @@ -33,45 +33,47 @@ #include "core/engine.h" void Timer::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_READY: { - if (autostart) { #ifdef TOOLS_ENABLED - if (Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root() == this || get_tree()->get_edited_scene_root()->is_a_parent_of(this))) + if (Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && (get_tree()->get_edited_scene_root() == this || get_tree()->get_edited_scene_root()->is_a_parent_of(this))) { break; + } #endif start(); autostart = false; } } break; case NOTIFICATION_INTERNAL_PROCESS: { - if (timer_process_mode == TIMER_PROCESS_PHYSICS || !is_processing_internal()) + if (timer_process_mode == TIMER_PROCESS_PHYSICS || !is_processing_internal()) { return; + } time_left -= get_process_delta_time(); if (time_left < 0) { - if (!one_shot) + if (!one_shot) { time_left += wait_time; - else + } else { stop(); + } emit_signal("timeout"); } } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { - if (timer_process_mode == TIMER_PROCESS_IDLE || !is_physics_processing_internal()) + if (timer_process_mode == TIMER_PROCESS_IDLE || !is_physics_processing_internal()) { return; + } time_left -= get_physics_process_delta_time(); if (time_left < 0) { - if (!one_shot) + if (!one_shot) { time_left += wait_time; - else + } else { stop(); + } emit_signal("timeout"); } @@ -83,31 +85,28 @@ void Timer::set_wait_time(float p_time) { ERR_FAIL_COND_MSG(p_time <= 0, "Time should be greater than zero."); wait_time = p_time; } -float Timer::get_wait_time() const { +float Timer::get_wait_time() const { return wait_time; } void Timer::set_one_shot(bool p_one_shot) { - one_shot = p_one_shot; } -bool Timer::is_one_shot() const { +bool Timer::is_one_shot() const { return one_shot; } void Timer::set_autostart(bool p_start) { - autostart = p_start; } -bool Timer::has_autostart() const { +bool Timer::has_autostart() const { return autostart; } void Timer::start(float p_time) { - ERR_FAIL_COND_MSG(!is_inside_tree(), "Timer was not added to the SceneTree. Either add it or set autostart to true."); if (p_time > 0) { @@ -124,8 +123,9 @@ void Timer::stop() { } void Timer::set_paused(bool p_paused) { - if (paused == p_paused) + if (paused == p_paused) { return; + } paused = p_paused; _set_process(processing); @@ -140,14 +140,13 @@ bool Timer::is_stopped() const { } float Timer::get_time_left() const { - return time_left > 0 ? time_left : 0; } void Timer::set_timer_process_mode(TimerProcessMode p_mode) { - - if (timer_process_mode == p_mode) + if (timer_process_mode == p_mode) { return; + } switch (timer_process_mode) { case TIMER_PROCESS_PHYSICS: @@ -167,7 +166,6 @@ void Timer::set_timer_process_mode(TimerProcessMode p_mode) { } Timer::TimerProcessMode Timer::get_timer_process_mode() const { - return timer_process_mode; } @@ -184,7 +182,6 @@ void Timer::_set_process(bool p_process, bool p_force) { } void Timer::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_wait_time", "time_sec"), &Timer::set_wait_time); ClassDB::bind_method(D_METHOD("get_wait_time"), &Timer::get_wait_time); diff --git a/scene/main/timer.h b/scene/main/timer.h index 044566738e..61abf04f59 100644 --- a/scene/main/timer.h +++ b/scene/main/timer.h @@ -34,7 +34,6 @@ #include "scene/main/node.h" class Timer : public Node { - GDCLASS(Timer, Node); float wait_time; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 58024dab38..8544d67ecc 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -56,7 +56,6 @@ #include "servers/physics_server_2d.h" void ViewportTexture::setup_local_to_scene() { - if (vp) { vp->viewport_textures.erase(this); } @@ -87,9 +86,9 @@ void ViewportTexture::setup_local_to_scene() { } void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) { - - if (path == p_path) + if (path == p_path) { return; + } path = p_path; @@ -99,27 +98,25 @@ void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) { } NodePath ViewportTexture::get_viewport_path_in_scene() const { - return path; } int ViewportTexture::get_width() const { - ERR_FAIL_COND_V_MSG(!vp, 0, "Viewport Texture must be set to use it."); return vp->size.width; } -int ViewportTexture::get_height() const { +int ViewportTexture::get_height() const { ERR_FAIL_COND_V_MSG(!vp, 0, "Viewport Texture must be set to use it."); return vp->size.height; } -Size2 ViewportTexture::get_size() const { +Size2 ViewportTexture::get_size() const { ERR_FAIL_COND_V_MSG(!vp, Size2(), "Viewport Texture must be set to use it."); return vp->size; } -RID ViewportTexture::get_rid() const { +RID ViewportTexture::get_rid() const { //ERR_FAIL_COND_V_MSG(!vp, RID(), "Viewport Texture must be set to use it."); if (proxy.is_null()) { proxy_ph = RS::get_singleton()->texture_2d_placeholder_create(); @@ -129,17 +126,15 @@ RID ViewportTexture::get_rid() const { } bool ViewportTexture::has_alpha() const { - return false; } -Ref<Image> ViewportTexture::get_data() const { +Ref<Image> ViewportTexture::get_data() const { ERR_FAIL_COND_V_MSG(!vp, Ref<Image>(), "Viewport Texture must be set to use it."); return RS::get_singleton()->texture_2d_get(vp->texture_rid); } void ViewportTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_viewport_path_in_scene", "path"), &ViewportTexture::set_viewport_path_in_scene); ClassDB::bind_method(D_METHOD("get_viewport_path_in_scene"), &ViewportTexture::get_viewport_path_in_scene); @@ -147,13 +142,11 @@ void ViewportTexture::_bind_methods() { } ViewportTexture::ViewportTexture() { - vp = nullptr; set_local_to_scene(true); } ViewportTexture::~ViewportTexture() { - if (vp) { vp->viewport_textures.erase(this); } @@ -169,7 +162,6 @@ ViewportTexture::~ViewportTexture() { ///////////////////////////////////// class TooltipPanel : public PopupPanel { - GDCLASS(TooltipPanel, PopupPanel); public: @@ -177,7 +169,6 @@ public: }; class TooltipLabel : public Label { - GDCLASS(TooltipLabel, Label); public: @@ -185,7 +176,6 @@ public: }; Viewport::GUI::GUI() { - embed_subwindows_hint = false; embedding_subwindows = false; @@ -206,9 +196,9 @@ Viewport::GUI::GUI() { ///////////////////////////////////// void Viewport::update_worlds() { - - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } Rect2 abstracted_rect = Rect2(Vector2(), get_visible_rect().size); Rect2 xformed_rect = (global_canvas_transform * canvas_transform).affine_inverse().xform(abstracted_rect); @@ -219,7 +209,6 @@ void Viewport::update_worlds() { } void Viewport::_collision_object_input_event(CollisionObject3D *p_object, Camera3D *p_camera, const Ref<InputEvent> &p_input_event, const Vector3 &p_pos, const Vector3 &p_normal, int p_shape) { - Transform object_transform = p_object->get_global_transform(); Transform camera_transform = p_camera->get_global_transform(); ObjectID id = p_object->get_instance_id(); @@ -238,14 +227,12 @@ void Viewport::_collision_object_input_event(CollisionObject3D *p_object, Camera } void Viewport::_sub_window_update_order() { - for (int i = 0; i < gui.sub_windows.size(); i++) { RS::get_singleton()->canvas_item_set_draw_index(gui.sub_windows[i].canvas_item, i); } } void Viewport::_sub_window_register(Window *p_window) { - ERR_FAIL_COND(!is_inside_tree()); for (int i = 0; i < gui.sub_windows.size(); i++) { ERR_FAIL_COND(gui.sub_windows[i].window == p_window); @@ -268,7 +255,6 @@ void Viewport::_sub_window_register(Window *p_window) { } void Viewport::_sub_window_update(Window *p_window) { - int index = -1; for (int i = 0; i < gui.sub_windows.size(); i++) { if (gui.sub_windows[i].window == p_window) { @@ -313,7 +299,6 @@ void Viewport::_sub_window_update(Window *p_window) { } void Viewport::_sub_window_grab_focus(Window *p_window) { - if (p_window == nullptr) { //release current focus if (gui.subwindow_focused) { @@ -385,7 +370,6 @@ void Viewport::_sub_window_grab_focus(Window *p_window) { } void Viewport::_sub_window_remove(Window *p_window) { - for (int i = 0; i < gui.sub_windows.size(); i++) { if (gui.sub_windows[i].window == p_window) { RS::get_singleton()->free(gui.sub_windows[i].canvas_item); @@ -407,7 +391,6 @@ void Viewport::_sub_window_remove(Window *p_window) { gui.subwindow_focused->_event_callback(DisplayServer::WINDOW_EVENT_FOCUS_OUT); if (parent_visible && parent_visible != this) { - gui.subwindow_focused = parent_visible; gui.subwindow_focused->_event_callback(DisplayServer::WINDOW_EVENT_FOCUS_IN); } else { @@ -444,11 +427,8 @@ void Viewport::_own_world_3d_changed() { } void Viewport::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - gui.embedding_subwindows = gui.embed_subwindows_hint; if (get_parent()) { @@ -491,28 +471,28 @@ void Viewport::_notification(int p_what) { if (listeners.size() && !listener) { Listener3D *first = nullptr; for (Set<Listener3D *>::Element *E = listeners.front(); E; E = E->next()) { - if (first == nullptr || first->is_greater_than(E->get())) { first = E->get(); } } - if (first) + if (first) { first->make_current(); + } } if (cameras.size() && !camera) { //there are cameras but no current camera, pick first in tree and make it current Camera3D *first = nullptr; for (Set<Camera3D *>::Element *E = cameras.front(); E; E = E->next()) { - if (first == nullptr || first->is_greater_than(E->get())) { first = E->get(); } } - if (first) + if (first) { first->make_current(); + } } #endif @@ -522,10 +502,10 @@ void Viewport::_notification(int p_what) { } break; case NOTIFICATION_EXIT_TREE: { - _gui_cancel_tooltip(); - if (world_2d.is_valid()) + if (world_2d.is_valid()) { world_2d->_remove_viewport(this); + } RenderingServer::get_singleton()->viewport_set_scenario(viewport, RID()); RenderingServer::get_singleton()->viewport_remove_canvas(viewport, current_canvas); @@ -548,7 +528,6 @@ void Viewport::_notification(int p_what) { } break; case NOTIFICATION_INTERNAL_PROCESS: { - if (gui.tooltip_timer >= 0) { gui.tooltip_timer -= get_process_delta_time(); if (gui.tooltip_timer < 0) { @@ -558,9 +537,7 @@ void Viewport::_notification(int p_what) { } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { - if (get_tree()->is_debugging_collisions_hint() && contact_2d_debug.is_valid()) { - RenderingServer::get_singleton()->canvas_item_clear(contact_2d_debug); RenderingServer::get_singleton()->canvas_item_set_draw_index(contact_2d_debug, 0xFFFFF); //very high index @@ -569,13 +546,11 @@ void Viewport::_notification(int p_what) { Color ccol = get_tree()->get_debug_collision_contact_color(); for (int i = 0; i < point_count; i++) { - RenderingServer::get_singleton()->canvas_item_add_rect(contact_2d_debug, Rect2(points[i] - Vector2(2, 2), Vector2(5, 5)), ccol); } } if (get_tree()->is_debugging_collisions_hint() && contact_3d_debug_multimesh.is_valid()) { - Vector<Vector3> points = PhysicsServer3D::get_singleton()->space_get_contacts(find_world_3d()->get_space()); int point_count = PhysicsServer3D::get_singleton()->space_get_contact_count(find_world_3d()->get_space()); @@ -583,7 +558,6 @@ void Viewport::_notification(int p_what) { } if (physics_object_picking && (to_screen_rect == Rect2i() || Input::get_singleton()->get_mouse_mode() != Input::MOUSE_MODE_CAPTURED)) { - #ifndef _3D_DISABLED Vector2 last_pos(1e20, 1e20); CollisionObject3D *last_object = nullptr; @@ -621,7 +595,6 @@ void Viewport::_notification(int p_what) { } while (physics_picking_events.size()) { - Ref<InputEvent> ev = physics_picking_events.front()->get(); physics_picking_events.pop_front(); @@ -631,7 +604,6 @@ void Viewport::_notification(int p_what) { Ref<InputEventMouseMotion> mm = ev; if (mm.is_valid()) { - pos = mm->get_position(); is_mouse = true; @@ -647,7 +619,6 @@ void Viewport::_notification(int p_what) { Ref<InputEventMouseButton> mb = ev; if (mb.is_valid()) { - pos = mb->get_position(); is_mouse = true; @@ -715,7 +686,6 @@ void Viewport::_notification(int p_what) { int rc = ss2d->intersect_point_on_canvas(point, canvas_layer_id, res, 64, Set<RID>(), 0xFFFFFFFF, true, true, true); for (int i = 0; i < rc; i++) { - if (res[i].collider_id.is_valid() && res[i].collider) { CollisionObject2D *co = Object::cast_to<CollisionObject2D>(res[i].collider); if (co) { @@ -750,7 +720,6 @@ void Viewport::_notification(int p_what) { if (E->get() != frame) { Object *o = ObjectDB::get_instance(E->key()); if (o) { - CollisionObject2D *co = Object::cast_to<CollisionObject2D>(o); if (co) { co->_mouse_exit(); @@ -771,7 +740,6 @@ void Viewport::_notification(int p_what) { bool captured = false; if (physics_object_capture.is_valid()) { - CollisionObject3D *co = Object::cast_to<CollisionObject3D>(ObjectDB::get_instance(physics_object_capture)); if (co && camera) { _collision_object_input_event(co, camera, ev, Vector3(), Vector3(), 0); @@ -788,7 +756,6 @@ void Viewport::_notification(int p_what) { if (captured) { //none } else if (pos == last_pos) { - if (last_id.is_valid()) { if (ObjectDB::get_instance(last_id) && last_object) { //good, exists @@ -799,22 +766,17 @@ void Viewport::_notification(int p_what) { } } } else { - if (camera) { - Vector3 from = camera->project_ray_origin(pos); Vector3 dir = camera->project_ray_normal(pos); PhysicsDirectSpaceState3D *space = PhysicsServer3D::get_singleton()->space_get_direct_state(find_world_3d()->get_space()); if (space) { - bool col = space->intersect_ray(from, from + dir * 10000, result, Set<RID>(), 0xFFFFFFFF, true, true, true); ObjectID new_collider; if (col) { - CollisionObject3D *co = Object::cast_to<CollisionObject3D>(result.collider); if (co) { - _collision_object_input_event(co, camera, ev, result.position, result.normal, result.shape); last_object = co; last_id = result.collider_id; @@ -826,9 +788,7 @@ void Viewport::_notification(int p_what) { } if (is_mouse && new_collider != physics_object_over) { - if (physics_object_over.is_valid()) { - CollisionObject3D *co = Object::cast_to<CollisionObject3D>(ObjectDB::get_instance(physics_object_over)); if (co) { co->_mouse_exit(); @@ -836,7 +796,6 @@ void Viewport::_notification(int p_what) { } if (new_collider.is_valid()) { - CollisionObject3D *co = Object::cast_to<CollisionObject3D>(ObjectDB::get_instance(new_collider)); if (co) { co->_mouse_enter(); @@ -857,7 +816,6 @@ void Viewport::_notification(int p_what) { } break; case NOTIFICATION_WM_MOUSE_EXIT: case NOTIFICATION_WM_FOCUS_OUT: { - _drop_physics_mouseover(); if (gui.mouse_focus && !gui.forced_mouse_focus) { @@ -868,21 +826,21 @@ void Viewport::_notification(int p_what) { } RID Viewport::get_viewport_rid() const { - return viewport; } void Viewport::update_canvas_items() { - if (!is_inside_tree()) + if (!is_inside_tree()) { return; + } _update_canvas_items(this); } void Viewport::_set_size(const Size2i &p_size, const Size2i &p_size_2d_override, const Rect2i &p_to_screen_rect, const Transform2D &p_stretch_transform, bool p_allocated) { - - if (size == p_size && size_allocated == p_allocated && stretch_transform == p_stretch_transform && p_size_2d_override == size_2d_override && to_screen_rect != p_to_screen_rect) + if (size == p_size && size_allocated == p_allocated && stretch_transform == p_stretch_transform && p_size_2d_override == size_2d_override && to_screen_rect != p_to_screen_rect) { return; + } size = p_size; size_allocated = p_allocated; @@ -905,15 +863,16 @@ void Viewport::_set_size(const Size2i &p_size, const Size2i &p_size_2d_override, Size2i Viewport::_get_size() const { return size; } + Size2i Viewport::_get_size_2d_override() const { return size_2d_override; } + bool Viewport::_is_size_allocated() const { return size_allocated; } Rect2 Viewport::get_visible_rect() const { - Rect2 r; if (size == Size2()) { @@ -933,7 +892,6 @@ void Viewport::_update_listener() { } void Viewport::_update_listener_2d() { - /* if (is_inside_tree() && audio_listener && (!get_parent() || (Object::cast_to<Control>(get_parent()) && Object::cast_to<Control>(get_parent())->is_visible_in_tree()))) SpatialSound2DServer::get_singleton()->listener_set_space(internal_listener_2d, find_world_2d()->get_sound_space()); @@ -943,23 +901,22 @@ void Viewport::_update_listener_2d() { } void Viewport::set_as_audio_listener(bool p_enable) { - - if (p_enable == audio_listener) + if (p_enable == audio_listener) { return; + } audio_listener = p_enable; _update_listener(); } bool Viewport::is_audio_listener() const { - return audio_listener; } void Viewport::set_as_audio_listener_2d(bool p_enable) { - - if (p_enable == audio_listener_2d) + if (p_enable == audio_listener_2d) { return; + } audio_listener_2d = p_enable; @@ -967,7 +924,6 @@ void Viewport::set_as_audio_listener_2d(bool p_enable) { } bool Viewport::is_audio_listener_2d() const { - return audio_listener_2d; } @@ -1004,7 +960,6 @@ Transform2D Viewport::get_canvas_transform_override() const { } void Viewport::set_canvas_transform(const Transform2D &p_transform) { - canvas_transform = p_transform; if (!override_canvas_transform) { @@ -1013,26 +968,22 @@ void Viewport::set_canvas_transform(const Transform2D &p_transform) { } Transform2D Viewport::get_canvas_transform() const { - return canvas_transform; } void Viewport::_update_global_transform() { - Transform2D sxform = stretch_transform * global_canvas_transform; RenderingServer::get_singleton()->viewport_set_global_canvas_transform(viewport, sxform); } void Viewport::set_global_canvas_transform(const Transform2D &p_transform) { - global_canvas_transform = p_transform; _update_global_transform(); } Transform2D Viewport::get_global_canvas_transform() const { - return global_canvas_transform; } @@ -1040,11 +991,11 @@ void Viewport::_listener_transform_changed_notify() { } void Viewport::_listener_set(Listener3D *p_listener) { - #ifndef _3D_DISABLED - if (listener == p_listener) + if (listener == p_listener) { return; + } listener = p_listener; @@ -1054,13 +1005,11 @@ void Viewport::_listener_set(Listener3D *p_listener) { } bool Viewport::_listener_add(Listener3D *p_listener) { - listeners.insert(p_listener); return listeners.size() == 1; } void Viewport::_listener_remove(Listener3D *p_listener) { - listeners.erase(p_listener); if (listener == p_listener) { listener = nullptr; @@ -1069,16 +1018,17 @@ void Viewport::_listener_remove(Listener3D *p_listener) { #ifndef _3D_DISABLED void Viewport::_listener_make_next_current(Listener3D *p_exclude) { - if (listeners.size() > 0) { for (Set<Listener3D *>::Element *E = listeners.front(); E; E = E->next()) { - - if (p_exclude == E->get()) + if (p_exclude == E->get()) { continue; - if (!E->get()->is_inside_tree()) + } + if (!E->get()->is_inside_tree()) { continue; - if (listener != nullptr) + } + if (listener != nullptr) { return; + } E->get()->make_current(); } @@ -1093,17 +1043,16 @@ void Viewport::_listener_make_next_current(Listener3D *p_exclude) { #endif void Viewport::_camera_transform_changed_notify() { - #ifndef _3D_DISABLED #endif } void Viewport::_camera_set(Camera3D *p_camera) { - #ifndef _3D_DISABLED - if (camera == p_camera) + if (camera == p_camera) { return; + } if (camera) { camera->notification(Camera3D::NOTIFICATION_LOST_CURRENT); @@ -1112,10 +1061,11 @@ void Viewport::_camera_set(Camera3D *p_camera) { camera = p_camera; if (!camera_override) { - if (camera) + if (camera) { RenderingServer::get_singleton()->viewport_attach_camera(viewport, camera->get_camera()); - else + } else { RenderingServer::get_singleton()->viewport_attach_camera(viewport, RID()); + } } if (camera) { @@ -1128,13 +1078,11 @@ void Viewport::_camera_set(Camera3D *p_camera) { } bool Viewport::_camera_add(Camera3D *p_camera) { - cameras.insert(p_camera); return cameras.size() == 1; } void Viewport::_camera_remove(Camera3D *p_camera) { - cameras.erase(p_camera); if (camera == p_camera) { camera->notification(Camera3D::NOTIFICATION_LOST_CURRENT); @@ -1144,15 +1092,16 @@ void Viewport::_camera_remove(Camera3D *p_camera) { #ifndef _3D_DISABLED void Viewport::_camera_make_next_current(Camera3D *p_exclude) { - for (Set<Camera3D *>::Element *E = cameras.front(); E; E = E->next()) { - - if (p_exclude == E->get()) + if (p_exclude == E->get()) { continue; - if (!E->get()->is_inside_tree()) + } + if (!E->get()->is_inside_tree()) { continue; - if (camera != nullptr) + } + if (camera != nullptr) { return; + } E->get()->make_current(); } @@ -1160,29 +1109,26 @@ void Viewport::_camera_make_next_current(Camera3D *p_exclude) { #endif void Viewport::_canvas_layer_add(CanvasLayer *p_canvas_layer) { - canvas_layers.insert(p_canvas_layer); } void Viewport::_canvas_layer_remove(CanvasLayer *p_canvas_layer) { - canvas_layers.erase(p_canvas_layer); } void Viewport::set_transparent_background(bool p_enable) { - transparent_bg = p_enable; RS::get_singleton()->viewport_set_transparent_background(viewport, p_enable); } bool Viewport::has_transparent_background() const { - return transparent_bg; } void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) { - if (world_2d == p_world_2d) + if (world_2d == p_world_2d) { return; + } if (parent && parent->find_world_2d() == p_world_2d) { WARN_PRINT("Unable to use parent world_3d as world_2d"); @@ -1194,9 +1140,9 @@ void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) { RenderingServer::get_singleton()->viewport_remove_canvas(viewport, current_canvas); } - if (p_world_2d.is_valid()) + if (p_world_2d.is_valid()) { world_2d = p_world_2d; - else { + } else { WARN_PRINT("Invalid world_3d"); world_2d = Ref<World2D>(memnew(World2D)); } @@ -1211,21 +1157,20 @@ void Viewport::set_world_2d(const Ref<World2D> &p_world_2d) { } Ref<World2D> Viewport::find_world_2d() const { - - if (world_2d.is_valid()) + if (world_2d.is_valid()) { return world_2d; - else if (parent) + } else if (parent) { return parent->find_world_2d(); - else + } else { return Ref<World2D>(); + } } void Viewport::_propagate_enter_world(Node *p_node) { - if (p_node != this) { - - if (!p_node->is_inside_tree()) //may not have entered scene yet + if (!p_node->is_inside_tree()) { //may not have entered scene yet return; + } #ifndef _3D_DISABLED if (Object::cast_to<Node3D>(p_node) || Object::cast_to<WorldEnvironment>(p_node)) { @@ -1234,9 +1179,9 @@ void Viewport::_propagate_enter_world(Node *p_node) { #endif Viewport *v = Object::cast_to<Viewport>(p_node); if (v) { - - if (v->world_3d.is_valid() || v->own_world_3d.is_valid()) + if (v->world_3d.is_valid() || v->own_world_3d.is_valid()) { return; + } } #ifndef _3D_DISABLED } @@ -1244,28 +1189,26 @@ void Viewport::_propagate_enter_world(Node *p_node) { } for (int i = 0; i < p_node->get_child_count(); i++) { - _propagate_enter_world(p_node->get_child(i)); } } void Viewport::_propagate_viewport_notification(Node *p_node, int p_what) { - p_node->notification(p_what); for (int i = 0; i < p_node->get_child_count(); i++) { Node *c = p_node->get_child(i); - if (Object::cast_to<Viewport>(c)) + if (Object::cast_to<Viewport>(c)) { continue; + } _propagate_viewport_notification(c, p_what); } } void Viewport::_propagate_exit_world(Node *p_node) { - if (p_node != this) { - - if (!p_node->is_inside_tree()) //may have exited scene already + if (!p_node->is_inside_tree()) { //may have exited scene already return; + } #ifndef _3D_DISABLED if (Object::cast_to<Node3D>(p_node) || Object::cast_to<WorldEnvironment>(p_node)) { @@ -1274,9 +1217,9 @@ void Viewport::_propagate_exit_world(Node *p_node) { #endif Viewport *v = Object::cast_to<Viewport>(p_node); if (v) { - - if (v->world_3d.is_valid() || v->own_world_3d.is_valid()) + if (v->world_3d.is_valid() || v->own_world_3d.is_valid()) { return; + } } #ifndef _3D_DISABLED } @@ -1284,18 +1227,18 @@ void Viewport::_propagate_exit_world(Node *p_node) { } for (int i = 0; i < p_node->get_child_count(); i++) { - _propagate_exit_world(p_node->get_child(i)); } } void Viewport::set_world_3d(const Ref<World3D> &p_world_3d) { - - if (world_3d == p_world_3d) + if (world_3d == p_world_3d) { return; + } - if (is_inside_tree()) + if (is_inside_tree()) { _propagate_exit_world(this); + } if (own_world_3d.is_valid() && world_3d.is_valid()) { world_3d->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Viewport::_own_world_3d_changed)); @@ -1312,8 +1255,9 @@ void Viewport::set_world_3d(const Ref<World3D> &p_world_3d) { } } - if (is_inside_tree()) + if (is_inside_tree()) { _propagate_enter_world(this); + } if (is_inside_tree()) { RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario()); @@ -1323,29 +1267,26 @@ void Viewport::set_world_3d(const Ref<World3D> &p_world_3d) { } Ref<World3D> Viewport::get_world_3d() const { - return world_3d; } Ref<World2D> Viewport::get_world_2d() const { - return world_2d; } Ref<World3D> Viewport::find_world_3d() const { - - if (own_world_3d.is_valid()) + if (own_world_3d.is_valid()) { return own_world_3d; - else if (world_3d.is_valid()) + } else if (world_3d.is_valid()) { return world_3d; - else if (parent) + } else if (parent) { return parent->find_world_3d(); - else + } else { return Ref<World3D>(); + } } Listener3D *Viewport::get_listener() const { - return listener; } @@ -1354,7 +1295,6 @@ Camera3D *Viewport::get_camera() const { } void Viewport::enable_camera_override(bool p_enable) { - #ifndef _3D_DISABLED if (p_enable == camera_override) { return; @@ -1399,8 +1339,9 @@ Transform Viewport::get_camera_override_transform() const { void Viewport::set_camera_override_perspective(float p_fovy_degrees, float p_z_near, float p_z_far) { if (camera_override) { if (camera_override.fov == p_fovy_degrees && camera_override.z_near == p_z_near && - camera_override.z_far == p_z_far && camera_override.projection == CameraOverrideData::PROJECTION_PERSPECTIVE) + camera_override.z_far == p_z_far && camera_override.projection == CameraOverrideData::PROJECTION_PERSPECTIVE) { return; + } camera_override.fov = p_fovy_degrees; camera_override.z_near = p_z_near; @@ -1414,8 +1355,9 @@ void Viewport::set_camera_override_perspective(float p_fovy_degrees, float p_z_n void Viewport::set_camera_override_orthogonal(float p_size, float p_z_near, float p_z_far) { if (camera_override) { if (camera_override.size == p_size && camera_override.z_near == p_z_near && - camera_override.z_far == p_z_far && camera_override.projection == CameraOverrideData::PROJECTION_ORTHOGONAL) + camera_override.z_far == p_z_far && camera_override.projection == CameraOverrideData::PROJECTION_ORTHOGONAL) { return; + } camera_override.size = p_size; camera_override.z_near = p_z_near; @@ -1427,16 +1369,15 @@ void Viewport::set_camera_override_orthogonal(float p_size, float p_z_near, floa } Transform2D Viewport::get_final_transform() const { - return stretch_transform * global_canvas_transform; } void Viewport::_update_canvas_items(Node *p_node) { if (p_node != this) { - Viewport *vp = Object::cast_to<Viewport>(p_node); - if (vp) + if (vp) { return; + } CanvasItem *ci = Object::cast_to<CanvasItem>(p_node); if (ci) { @@ -1452,49 +1393,45 @@ void Viewport::_update_canvas_items(Node *p_node) { } Ref<ViewportTexture> Viewport::get_texture() const { - return default_texture; } void Viewport::set_shadow_atlas_size(int p_size) { - - if (shadow_atlas_size == p_size) + if (shadow_atlas_size == p_size) { return; + } shadow_atlas_size = p_size; RS::get_singleton()->viewport_set_shadow_atlas_size(viewport, p_size); } int Viewport::get_shadow_atlas_size() const { - return shadow_atlas_size; } void Viewport::set_shadow_atlas_quadrant_subdiv(int p_quadrant, ShadowAtlasQuadrantSubdiv p_subdiv) { - ERR_FAIL_INDEX(p_quadrant, 4); ERR_FAIL_INDEX(p_subdiv, SHADOW_ATLAS_QUADRANT_SUBDIV_MAX); - if (shadow_atlas_quadrant_subdiv[p_quadrant] == p_subdiv) + if (shadow_atlas_quadrant_subdiv[p_quadrant] == p_subdiv) { return; + } shadow_atlas_quadrant_subdiv[p_quadrant] = p_subdiv; static const int subdiv[SHADOW_ATLAS_QUADRANT_SUBDIV_MAX] = { 0, 1, 4, 16, 64, 256, 1024 }; RS::get_singleton()->viewport_set_shadow_atlas_quadrant_subdivision(viewport, p_quadrant, subdiv[p_subdiv]); } -Viewport::ShadowAtlasQuadrantSubdiv Viewport::get_shadow_atlas_quadrant_subdiv(int p_quadrant) const { +Viewport::ShadowAtlasQuadrantSubdiv Viewport::get_shadow_atlas_quadrant_subdiv(int p_quadrant) const { ERR_FAIL_INDEX_V(p_quadrant, 4, SHADOW_ATLAS_QUADRANT_SUBDIV_DISABLED); return shadow_atlas_quadrant_subdiv[p_quadrant]; } Transform2D Viewport::_get_input_pre_xform() const { - Transform2D pre_xf; if (to_screen_rect.size.x != 0 && to_screen_rect.size.y != 0) { - pre_xf.elements[2] = -to_screen_rect.position; pre_xf.scale(size / to_screen_rect.size); } @@ -1503,27 +1440,24 @@ Transform2D Viewport::_get_input_pre_xform() const { } Ref<InputEvent> Viewport::_make_input_local(const Ref<InputEvent> &ev) { - Transform2D ai = get_final_transform().affine_inverse() * _get_input_pre_xform(); return ev->xformed_by(ai); } Vector2 Viewport::get_mouse_position() const { - return gui.last_mouse_pos; } void Viewport::warp_mouse(const Vector2 &p_pos) { - Vector2 gpos = (get_final_transform().affine_inverse() * _get_input_pre_xform()).affine_inverse().xform(p_pos); Input::get_singleton()->warp_mouse_position(gpos); } void Viewport::_gui_sort_roots() { - - if (!gui.roots_order_dirty) + if (!gui.roots_order_dirty) { return; + } gui.roots.sort_custom<Control::CComparator>(); @@ -1531,7 +1465,6 @@ void Viewport::_gui_sort_roots() { } void Viewport::_gui_cancel_tooltip() { - gui.tooltip = nullptr; gui.tooltip_timer = -1; if (gui.tooltip_popup) { @@ -1542,26 +1475,27 @@ void Viewport::_gui_cancel_tooltip() { } String Viewport::_gui_get_tooltip(Control *p_control, const Vector2 &p_pos, Control **r_which) { - Vector2 pos = p_pos; String tooltip; while (p_control) { - tooltip = p_control->get_tooltip(pos); if (r_which) { *r_which = p_control; } - if (tooltip != String()) + if (tooltip != String()) { break; + } pos = p_control->get_transform().xform(pos); - if (p_control->data.mouse_filter == Control::MOUSE_FILTER_STOP) + if (p_control->data.mouse_filter == Control::MOUSE_FILTER_STOP) { break; - if (p_control->is_set_as_toplevel()) + } + if (p_control->is_set_as_toplevel()) { break; + } p_control = p_control->get_parent_control(); } @@ -1570,7 +1504,6 @@ String Viewport::_gui_get_tooltip(Control *p_control, const Vector2 &p_pos, Cont } void Viewport::_gui_show_tooltip() { - if (!gui.tooltip) { return; } @@ -1578,8 +1511,9 @@ void Viewport::_gui_show_tooltip() { Control *which = nullptr; String tooltip = _gui_get_tooltip(gui.tooltip, gui.tooltip->get_global_transform().xform_inv(gui.tooltip_pos), &which); tooltip = tooltip.strip_edges(); - if (tooltip.length() == 0) + if (tooltip.length() == 0) { return; // bye + } if (gui.tooltip_popup) { memdelete(gui.tooltip_popup); @@ -1621,15 +1555,17 @@ void Viewport::_gui_show_tooltip() { Rect2i vr = gui.tooltip_popup->get_parent_visible_window()->get_usable_parent_rect(); - if (r.size.x + r.position.x > vr.size.x + vr.position.x) + if (r.size.x + r.position.x > vr.size.x + vr.position.x) { r.position.x = vr.position.x + vr.size.x - r.size.x; - else if (r.position.x < vr.position.x) + } else if (r.position.x < vr.position.x) { r.position.x = vr.position.x; + } - if (r.size.y + r.position.y > vr.size.y + vr.position.y) + if (r.size.y + r.position.y > vr.size.y + vr.position.y) { r.position.y = vr.position.y + vr.size.y - r.size.y; - else if (r.position.y < vr.position.y) + } else if (r.position.y < vr.position.y) { r.position.y = vr.position.y; + } gui.tooltip_popup->set_position(r.position); gui.tooltip_popup->set_size(r.size); @@ -1639,7 +1575,6 @@ void Viewport::_gui_show_tooltip() { } void Viewport::_gui_call_input(Control *p_control, const Ref<InputEvent> &p_input) { - //_block(); Ref<InputEvent> ev = p_input; @@ -1659,32 +1594,36 @@ void Viewport::_gui_call_input(Control *p_control, const Ref<InputEvent> &p_inpu CanvasItem *ci = p_control; while (ci) { - Control *control = Object::cast_to<Control>(ci); if (control) { - if (control->data.mouse_filter != Control::MOUSE_FILTER_IGNORE) { control->emit_signal(SceneStringNames::get_singleton()->gui_input, ev); //signal should be first, so it's possible to override an event (and then accept it) } - if (gui.key_event_accepted) + if (gui.key_event_accepted) { break; - if (!control->is_inside_tree()) + } + if (!control->is_inside_tree()) { break; + } if (control->data.mouse_filter != Control::MOUSE_FILTER_IGNORE) { control->call_multilevel(SceneStringNames::get_singleton()->_gui_input, ev); } - if (!control->is_inside_tree() || control->is_set_as_toplevel()) + if (!control->is_inside_tree() || control->is_set_as_toplevel()) { break; - if (gui.key_event_accepted) + } + if (gui.key_event_accepted) { break; - if (!cant_stop_me_now && control->data.mouse_filter == Control::MOUSE_FILTER_STOP && ismouse) + } + if (!cant_stop_me_now && control->data.mouse_filter == Control::MOUSE_FILTER_STOP && ismouse) { break; + } } - if (ci->is_set_as_toplevel()) + if (ci->is_set_as_toplevel()) { break; + } ev = ev->xformed_by(ci->get_transform()); //transform event upwards ci = ci->get_parent_item(); @@ -1694,64 +1633,67 @@ void Viewport::_gui_call_input(Control *p_control, const Ref<InputEvent> &p_inpu } void Viewport::_gui_call_notification(Control *p_control, int p_what) { - CanvasItem *ci = p_control; while (ci) { - Control *control = Object::cast_to<Control>(ci); if (control) { - if (control->data.mouse_filter != Control::MOUSE_FILTER_IGNORE) { control->notification(p_what); } - if (!control->is_inside_tree()) + if (!control->is_inside_tree()) { break; + } - if (!control->is_inside_tree() || control->is_set_as_toplevel()) + if (!control->is_inside_tree() || control->is_set_as_toplevel()) { break; - if (control->data.mouse_filter == Control::MOUSE_FILTER_STOP) + } + if (control->data.mouse_filter == Control::MOUSE_FILTER_STOP) { break; + } } - if (ci->is_set_as_toplevel()) + if (ci->is_set_as_toplevel()) { break; + } ci = ci->get_parent_item(); } //_unblock(); } -Control *Viewport::_gui_find_control(const Point2 &p_global) { +Control *Viewport::_gui_find_control(const Point2 &p_global) { //aca va subwindows _gui_sort_roots(); for (List<Control *>::Element *E = gui.roots.back(); E; E = E->prev()) { - Control *sw = E->get(); - if (!sw->is_visible_in_tree()) + if (!sw->is_visible_in_tree()) { continue; + } Transform2D xform; CanvasItem *pci = sw->get_parent_item(); - if (pci) + if (pci) { xform = pci->get_global_transform_with_canvas(); - else + } else { xform = sw->get_canvas_transform(); + } Control *ret = _gui_find_control_at_pos(sw, p_global, xform, gui.focus_inv_xform); - if (ret) + if (ret) { return ret; + } } return nullptr; } Control *Viewport::_gui_find_control_at_pos(CanvasItem *p_node, const Point2 &p_global, const Transform2D &p_xform, Transform2D &r_inv_xform) { - - if (Object::cast_to<Viewport>(p_node)) + if (Object::cast_to<Viewport>(p_node)) { return nullptr; + } if (!p_node->is_visible()) { //return _find_next_visible_control_at_pos(p_node,p_global,r_inv_xform); @@ -1760,27 +1702,29 @@ Control *Viewport::_gui_find_control_at_pos(CanvasItem *p_node, const Point2 &p_ Transform2D matrix = p_xform * p_node->get_transform(); // matrix.basis_determinant() == 0.0f implies that node does not exist on scene - if (matrix.basis_determinant() == 0.0f) + if (matrix.basis_determinant() == 0.0f) { return nullptr; + } Control *c = Object::cast_to<Control>(p_node); if (!c || !c->clips_input() || c->has_point(matrix.affine_inverse().xform(p_global))) { - for (int i = p_node->get_child_count() - 1; i >= 0; i--) { - CanvasItem *ci = Object::cast_to<CanvasItem>(p_node->get_child(i)); - if (!ci || ci->is_set_as_toplevel()) + if (!ci || ci->is_set_as_toplevel()) { continue; + } Control *ret = _gui_find_control_at_pos(ci, p_global, matrix, r_inv_xform); - if (ret) + if (ret) { return ret; + } } } - if (!c) + if (!c) { return nullptr; + } matrix.affine_invert(); @@ -1788,19 +1732,17 @@ Control *Viewport::_gui_find_control_at_pos(CanvasItem *p_node, const Point2 &p_ if (c->data.mouse_filter != Control::MOUSE_FILTER_IGNORE && c->has_point(matrix.xform(p_global)) && (!gui.drag_preview || (c != gui.drag_preview && !gui.drag_preview->is_a_parent_of(c)))) { r_inv_xform = matrix; return c; - } else + } else { return nullptr; + } } bool Viewport::_gui_drop(Control *p_at_control, Point2 p_at_pos, bool p_just_check) { - { //attempt grab, try parent controls too CanvasItem *ci = p_at_control; while (ci) { - Control *control = Object::cast_to<Control>(ci); if (control) { - if (control->can_drop_data(p_at_pos, gui.drag_data)) { if (!p_just_check) { control->drop_data(p_at_pos, gui.drag_data); @@ -1809,14 +1751,16 @@ bool Viewport::_gui_drop(Control *p_at_control, Point2 p_at_pos, bool p_just_che return true; } - if (control->data.mouse_filter == Control::MOUSE_FILTER_STOP) + if (control->data.mouse_filter == Control::MOUSE_FILTER_STOP) { break; + } } p_at_pos = ci->get_transform().xform(p_at_pos); - if (ci->is_set_as_toplevel()) + if (ci->is_set_as_toplevel()) { break; + } ci = ci->get_parent_item(); } @@ -1826,7 +1770,6 @@ bool Viewport::_gui_drop(Control *p_at_control, Point2 p_at_pos, bool p_just_che } void Viewport::_gui_input_event(Ref<InputEvent> p_event) { - ERR_FAIL_COND(p_event.is_null()); //? @@ -1839,19 +1782,15 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid()) { - gui.key_event_accepted = false; Point2 mpos = mb->get_position(); if (mb->is_pressed()) { - Size2 pos = mpos; if (gui.mouse_focus_mask) { - //do not steal mouse focus and stuff while a focus mask exists gui.mouse_focus_mask |= 1 << (mb->get_button_index() - 1); //add the button to the mask } else { - bool is_handled = false; if (is_handled) { @@ -1892,7 +1831,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { #ifdef DEBUG_ENABLED if (EngineDebugger::get_singleton() && gui.mouse_focus) { - Array arr; arr.push_back(gui.mouse_focus->get_path()); arr.push_back(gui.mouse_focus->get_class()); @@ -1903,7 +1841,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { if (mb->get_button_index() == BUTTON_LEFT) { //assign focus CanvasItem *ci = gui.mouse_focus; while (ci) { - Control *control = Object::cast_to<Control>(ci); if (control) { if (control->get_focus_mode() != Control::FOCUS_NONE) { @@ -1913,12 +1850,14 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { break; } - if (control->data.mouse_filter == Control::MOUSE_FILTER_STOP) + if (control->data.mouse_filter == Control::MOUSE_FILTER_STOP) { break; + } } - if (ci->is_set_as_toplevel()) + if (ci->is_set_as_toplevel()) { break; + } ci = ci->get_parent_item(); } @@ -1931,7 +1870,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { set_input_as_handled(); if (gui.drag_data.get_type() != Variant::NIL && mb->get_button_index() == BUTTON_LEFT) { - //alternate drop use (when using force_drag(), as proposed by #5342 if (gui.mouse_focus) { _gui_drop(gui.mouse_focus, pos, false); @@ -1952,9 +1890,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { //gui.tooltip_popup->hide(); } else { - if (gui.drag_data.get_type() != Variant::NIL && mb->get_button_index() == BUTTON_LEFT) { - if (gui.drag_mouse_over) { _gui_drop(gui.drag_mouse_over, gui.drag_mouse_over_pos, false); } @@ -2009,7 +1945,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - gui.key_event_accepted = false; Point2 mpos = mm->get_position(); @@ -2019,22 +1954,17 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { // D&D if (!gui.drag_attempted && gui.mouse_focus && mm->get_button_mask() & BUTTON_MASK_LEFT) { - gui.drag_accum += mm->get_relative(); float len = gui.drag_accum.length(); if (len > 10) { - { //attempt grab, try parent controls too CanvasItem *ci = gui.mouse_focus; while (ci) { - Control *control = Object::cast_to<Control>(ci); if (control) { - gui.dragging = true; gui.drag_data = control->get_drag_data(control->get_global_transform_with_canvas().affine_inverse().xform(mpos) - gui.drag_accum); if (gui.drag_data.get_type() != Variant::NIL) { - gui.mouse_focus = nullptr; gui.forced_mouse_focus = false; gui.mouse_focus_mask = 0; @@ -2048,12 +1978,14 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { gui.dragging = false; } - if (control->data.mouse_filter == Control::MOUSE_FILTER_STOP) + if (control->data.mouse_filter == Control::MOUSE_FILTER_STOP) { break; + } } - if (ci->is_set_as_toplevel()) + if (ci->is_set_as_toplevel()) { break; + } ci = ci->get_parent_item(); } @@ -2061,7 +1993,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { gui.drag_attempted = true; if (gui.drag_data.get_type() != Variant::NIL) { - _propagate_viewport_notification(this, NOTIFICATION_DRAG_BEGIN); } } @@ -2072,12 +2003,10 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { //recompute focus_inv_xform again here } else { - over = _gui_find_control(mpos); } if (over != gui.mouse_over) { - if (gui.mouse_over) { _gui_call_notification(gui.mouse_over, Control::NOTIFICATION_MOUSE_EXIT); } @@ -2094,7 +2023,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { DisplayServer::CursorShape ds_cursor_shape = (DisplayServer::CursorShape)Input::get_singleton()->get_default_cursor_shape(); if (over) { - Transform2D localizer = over->get_global_transform_with_canvas().affine_inverse(); Size2 pos = localizer.xform(mpos); Vector2 speed = localizer.basis_xform(mm->get_speed()); @@ -2117,14 +2045,13 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { if (can_tooltip && gui.tooltip) { String tooltip = _gui_get_tooltip(over, gui.tooltip->get_global_transform().xform_inv(mpos)); - if (tooltip.length() == 0) + if (tooltip.length() == 0) { _gui_cancel_tooltip(); - else if (gui.tooltip_label) { + } else if (gui.tooltip_label) { if (tooltip == gui.tooltip_label->get_text()) { is_tooltip_shown = true; } } else { - Variant t = gui.tooltip_popup->call("get_tooltip_text"); if (t.get_type() == Variant::STRING) { @@ -2135,12 +2062,12 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { is_tooltip_shown = true; //well, nothing to compare against, likely using custom control, so if it changes there is nothing we can do } } - } else + } else { _gui_cancel_tooltip(); + } } if (can_tooltip && !is_tooltip_shown) { - gui.tooltip = over; gui.tooltip_pos = over->get_screen_transform().xform(pos); //(parent_xform * get_transform()).affine_inverse().xform(pos); gui.tooltip_timer = gui.tooltip_delay; @@ -2158,12 +2085,15 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { while (c) { cursor_shape = c->get_cursor_shape(cpos); cpos = c->get_transform().xform(cpos); - if (cursor_shape != Control::CURSOR_ARROW) + if (cursor_shape != Control::CURSOR_ARROW) { break; - if (c->data.mouse_filter == Control::MOUSE_FILTER_STOP) + } + if (c->data.mouse_filter == Control::MOUSE_FILTER_STOP) { break; - if (c->is_set_as_toplevel()) + } + if (c->is_set_as_toplevel()) { break; + } c = c->get_parent_control(); } } @@ -2263,7 +2193,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { gui.drag_mouse_over_pos = localizer.xform(viewport_pos); if (mm->get_button_mask() & BUTTON_MASK_LEFT) { - bool can_drop = _gui_drop(gui.drag_mouse_over, gui.drag_mouse_over_pos, true); if (!can_drop) { @@ -2284,15 +2213,11 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { Ref<InputEventScreenTouch> touch_event = p_event; if (touch_event.is_valid()) { - Size2 pos = touch_event->get_position(); if (touch_event->is_pressed()) { - Control *over = _gui_find_control(pos); if (over) { - if (over->can_process()) { - touch_event = touch_event->xformed_by(Transform2D()); //make a copy if (over == gui.mouse_focus) { pos = gui.focus_inv_xform.xform(pos); @@ -2306,9 +2231,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { return; } } else if (touch_event->get_index() == 0 && gui.last_mouse_focus) { - if (gui.last_mouse_focus->can_process()) { - touch_event = touch_event->xformed_by(Transform2D()); //make a copy touch_event->set_position(gui.focus_inv_xform.xform(pos)); @@ -2321,7 +2244,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { Ref<InputEventGesture> gesture_event = p_event; if (gesture_event.is_valid()) { - gui.key_event_accepted = false; _gui_cancel_tooltip(); @@ -2330,9 +2252,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { Control *over = _gui_find_control(pos); if (over) { - if (over->can_process()) { - gesture_event = gesture_event->xformed_by(Transform2D()); //make a copy if (over == gui.mouse_focus) { pos = gui.focus_inv_xform.xform(pos); @@ -2349,15 +2269,12 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { Ref<InputEventScreenDrag> drag_event = p_event; if (drag_event.is_valid()) { - Control *over = gui.mouse_focus; if (!over) { over = _gui_find_control(drag_event->get_position()); } if (over) { - if (over->can_process()) { - Transform2D localizer = over->get_global_transform_with_canvas().affine_inverse(); Size2 pos = localizer.xform(drag_event->get_position()); Vector2 speed = localizer.basis_xform(drag_event->get_speed()); @@ -2378,22 +2295,20 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { } if (mm.is_null() && mb.is_null() && p_event->is_action_type()) { - if (gui.key_focus && !gui.key_focus->is_visible_in_tree()) { gui.key_focus->release_focus(); } if (gui.key_focus) { - gui.key_event_accepted = false; if (gui.key_focus->can_process()) { gui.key_focus->call_multilevel(SceneStringNames::get_singleton()->_gui_input, p_event); - if (gui.key_focus) //maybe lost it + if (gui.key_focus) { //maybe lost it gui.key_focus->emit_signal(SceneStringNames::get_singleton()->gui_input, p_event); + } } if (gui.key_event_accepted) { - set_input_as_handled(); return; } @@ -2414,32 +2329,26 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { Input *input = Input::get_singleton(); if (p_event->is_action_pressed("ui_focus_next") && input->is_action_just_pressed("ui_focus_next")) { - next = from->find_next_valid_focus(); } if (p_event->is_action_pressed("ui_focus_prev") && input->is_action_just_pressed("ui_focus_prev")) { - next = from->find_prev_valid_focus(); } if (!mods && p_event->is_action_pressed("ui_up") && input->is_action_just_pressed("ui_up")) { - next = from->_get_focus_neighbour(MARGIN_TOP); } if (!mods && p_event->is_action_pressed("ui_left") && input->is_action_just_pressed("ui_left")) { - next = from->_get_focus_neighbour(MARGIN_LEFT); } if (!mods && p_event->is_action_pressed("ui_right") && input->is_action_just_pressed("ui_right")) { - next = from->_get_focus_neighbour(MARGIN_RIGHT); } if (!mods && p_event->is_action_pressed("ui_down") && input->is_action_just_pressed("ui_down")) { - next = from->_get_focus_neighbour(MARGIN_BOTTOM); } @@ -2452,7 +2361,6 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { } List<Control *>::Element *Viewport::_gui_add_root_control(Control *p_control) { - gui.roots_order_dirty = true; return gui.roots.push_back(p_control); } @@ -2462,7 +2370,6 @@ void Viewport::_gui_set_root_order_dirty() { } void Viewport::_gui_force_drag(Control *p_base, const Variant &p_data, Control *p_control) { - ERR_FAIL_COND_MSG(p_data.get_type() == Variant::NIL, "Drag data must be a value."); gui.dragging = true; @@ -2475,7 +2382,6 @@ void Viewport::_gui_force_drag(Control *p_base, const Variant &p_data, Control * } void Viewport::_gui_set_drag_preview(Control *p_base, Control *p_control) { - ERR_FAIL_NULL(p_control); ERR_FAIL_COND(!Object::cast_to<Control>((Object *)p_control)); ERR_FAIL_COND(p_control->is_inside_tree()); @@ -2493,35 +2399,35 @@ void Viewport::_gui_set_drag_preview(Control *p_base, Control *p_control) { } void Viewport::_gui_remove_root_control(List<Control *>::Element *RI) { - gui.roots.erase(RI); } void Viewport::_gui_unfocus_control(Control *p_control) { - if (gui.key_focus == p_control) { gui.key_focus->release_focus(); } } void Viewport::_gui_hid_control(Control *p_control) { - if (gui.mouse_focus == p_control) { _drop_mouse_focus(); } - if (gui.key_focus == p_control) + if (gui.key_focus == p_control) { _gui_remove_focus(); - if (gui.mouse_over == p_control) + } + if (gui.mouse_over == p_control) { gui.mouse_over = nullptr; - if (gui.drag_mouse_over == p_control) + } + if (gui.drag_mouse_over == p_control) { gui.drag_mouse_over = nullptr; - if (gui.tooltip == p_control) + } + if (gui.tooltip == p_control) { _gui_cancel_tooltip(); + } } void Viewport::_gui_remove_control(Control *p_control) { - if (gui.mouse_focus == p_control) { gui.mouse_focus = nullptr; gui.forced_mouse_focus = false; @@ -2530,18 +2436,21 @@ void Viewport::_gui_remove_control(Control *p_control) { if (gui.last_mouse_focus == p_control) { gui.last_mouse_focus = nullptr; } - if (gui.key_focus == p_control) + if (gui.key_focus == p_control) { gui.key_focus = nullptr; - if (gui.mouse_over == p_control) + } + if (gui.mouse_over == p_control) { gui.mouse_over = nullptr; - if (gui.drag_mouse_over == p_control) + } + if (gui.drag_mouse_over == p_control) { gui.drag_mouse_over = nullptr; - if (gui.tooltip == p_control) + } + if (gui.tooltip == p_control) { gui.tooltip = nullptr; + } } void Viewport::_gui_remove_focus() { - if (gui.key_focus) { Node *f = gui.key_focus; gui.key_focus = nullptr; @@ -2550,15 +2459,14 @@ void Viewport::_gui_remove_focus() { } bool Viewport::_gui_control_has_focus(const Control *p_control) { - return gui.key_focus == p_control; } void Viewport::_gui_control_grab_focus(Control *p_control) { - //no need for change - if (gui.key_focus && gui.key_focus == p_control) + if (gui.key_focus && gui.key_focus == p_control) { return; + } get_tree()->call_group_flags(SceneTree::GROUP_CALL_REALTIME, "_viewports", "_gui_remove_focus"); gui.key_focus = p_control; emit_signal("gui_focus_changed", p_control); @@ -2567,14 +2475,13 @@ void Viewport::_gui_control_grab_focus(Control *p_control) { } void Viewport::_gui_accept_event() { - gui.key_event_accepted = true; - if (is_inside_tree()) + if (is_inside_tree()) { set_input_as_handled(); + } } void Viewport::_drop_mouse_focus() { - Control *c = gui.mouse_focus; int mask = gui.mouse_focus_mask; gui.mouse_focus = nullptr; @@ -2582,7 +2489,6 @@ void Viewport::_drop_mouse_focus() { gui.mouse_focus_mask = 0; for (int i = 0; i < 3; i++) { - if (mask & (1 << i)) { Ref<InputEventMouseButton> mb; mb.instance(); @@ -2596,7 +2502,6 @@ void Viewport::_drop_mouse_focus() { } void Viewport::_drop_physics_mouseover() { - physics_has_last_mousepos = false; while (physics_2d_mouseover.size()) { @@ -2622,18 +2527,15 @@ void Viewport::_drop_physics_mouseover() { } Control *Viewport::_gui_get_focus_owner() { - return gui.key_focus; } void Viewport::_gui_grab_click_focus(Control *p_control) { - gui.mouse_click_grabber = p_control; call_deferred("_post_gui_grab_click_focus"); } void Viewport::_post_gui_grab_click_focus() { - Control *focus_grabber = gui.mouse_click_grabber; if (!focus_grabber) { // Redundant grab requests were made @@ -2642,17 +2544,15 @@ void Viewport::_post_gui_grab_click_focus() { gui.mouse_click_grabber = nullptr; if (gui.mouse_focus) { - - if (gui.mouse_focus == focus_grabber) + if (gui.mouse_focus == focus_grabber) { return; + } int mask = gui.mouse_focus_mask; Point2 click = gui.mouse_focus->get_global_transform_with_canvas().affine_inverse().xform(gui.last_mouse_pos); for (int i = 0; i < 3; i++) { - if (mask & (1 << i)) { - Ref<InputEventMouseButton> mb; mb.instance(); @@ -2670,9 +2570,7 @@ void Viewport::_post_gui_grab_click_focus() { click = gui.mouse_focus->get_global_transform_with_canvas().affine_inverse().xform(gui.last_mouse_pos); for (int i = 0; i < 3; i++) { - if (mask & (1 << i)) { - Ref<InputEventMouseButton> mb; mb.instance(); @@ -2690,7 +2588,6 @@ void Viewport::_post_gui_grab_click_focus() { /////////////////////////////// void Viewport::input_text(const String &p_text) { - if (gui.subwindow_focused) { gui.subwindow_focused->input_text(p_text); return; @@ -2700,8 +2597,8 @@ void Viewport::input_text(const String &p_text) { gui.key_focus->call("set_text", p_text); } } -Viewport::SubWindowResize Viewport::_sub_window_get_resize_margin(Window *p_subwindow, const Point2 &p_point) { +Viewport::SubWindowResize Viewport::_sub_window_get_resize_margin(Window *p_subwindow, const Point2 &p_point) { if (p_subwindow->get_flag(Window::FLAG_BORDERLESS)) { return SUB_WINDOW_RESIZE_DISABLED; } @@ -2764,15 +2661,13 @@ Viewport::SubWindowResize Viewport::_sub_window_get_resize_margin(Window *p_subw return SUB_WINDOW_RESIZE_DISABLED; } -bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { +bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { if (gui.subwindow_drag != SUB_WINDOW_DRAG_DISABLED) { - ERR_FAIL_COND_V(gui.subwindow_focused == nullptr, false); Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - if (gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE) { if (gui.subwindow_drag_close_rect.has_point(mb->get_position())) { //close window @@ -2787,7 +2682,6 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - if (gui.subwindow_drag == SUB_WINDOW_DRAG_MOVE) { Vector2 diff = mm->get_position() - gui.subwindow_drag_from; Rect2i new_rect(gui.subwindow_drag_pos + diff, gui.subwindow_focused->get_size()); @@ -2813,7 +2707,6 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { switch (gui.subwindow_resize_mode) { case SUB_WINDOW_RESIZE_TOP_LEFT: { - diff.x = MIN(diff.x, limit.x); diff.y = MIN(diff.y, limit.y); r.position += diff; @@ -2879,7 +2772,6 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { //if the event is a mouse button, we need to check whether another window was clicked if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) { - bool click_on_window = false; for (int i = gui.sub_windows.size() - 1; i >= 0; i--) { SubWindow &sw = gui.sub_windows.write[i]; @@ -2896,7 +2788,6 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { title_bar.size.y = title_height; if (title_bar.has_point(mb->get_position())) { - click_on_window = true; int close_h_ofs = sw.window->get_theme_constant("close_h_ofs"); @@ -2913,12 +2804,10 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { } if (close_rect.has_point(mb->get_position())) { - gui.subwindow_drag = SUB_WINDOW_DRAG_CLOSE; gui.subwindow_drag_close_inside = true; //starts inside gui.subwindow_drag_close_rect = close_rect; } else { - gui.subwindow_drag = SUB_WINDOW_DRAG_MOVE; } @@ -2958,13 +2847,10 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { } if (gui.subwindow_focused) { - Ref<InputEventMouseMotion> mm = p_event; if (mm.is_valid()) { - SubWindowResize resize = _sub_window_get_resize_margin(gui.subwindow_focused, mm->get_position()); if (resize != SUB_WINDOW_RESIZE_DISABLED) { - DisplayServer::CursorShape shapes[SUB_WINDOW_RESIZE_MAX] = { DisplayServer::CURSOR_ARROW, DisplayServer::CURSOR_FDIAGSIZE, @@ -3003,11 +2889,11 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) { } void Viewport::input(const Ref<InputEvent> &p_event, bool p_local_coords) { - ERR_FAIL_COND(!is_inside_tree()); - if (disable_input) + if (disable_input) { return; + } if (Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_a_parent_of(this)) { return; @@ -3038,11 +2924,11 @@ void Viewport::input(const Ref<InputEvent> &p_event, bool p_local_coords) { } void Viewport::unhandled_input(const Ref<InputEvent> &p_event, bool p_local_coords) { - ERR_FAIL_COND(!is_inside_tree()); - if (disable_input) + if (disable_input) { return; + } if (Engine::get_singleton()->is_editor_hint() && get_tree()->get_edited_scene_root() && get_tree()->get_edited_scene_root()->is_a_parent_of(this)) { return; @@ -3063,7 +2949,6 @@ void Viewport::unhandled_input(const Ref<InputEvent> &p_event, bool p_local_coor } if (physics_object_picking && !is_input_handled()) { - if (Input::get_singleton()->get_mouse_mode() != Input::MOUSE_MODE_CAPTURED && (Object::cast_to<InputEventMouseButton>(*ev) || Object::cast_to<InputEventMouseMotion>(*ev) || @@ -3078,12 +2963,13 @@ void Viewport::unhandled_input(const Ref<InputEvent> &p_event, bool p_local_coor } void Viewport::set_use_own_world_3d(bool p_world_3d) { - - if (p_world_3d == own_world_3d.is_valid()) + if (p_world_3d == own_world_3d.is_valid()) { return; + } - if (is_inside_tree()) + if (is_inside_tree()) { _propagate_exit_world(this); + } if (!p_world_3d) { own_world_3d = Ref<World3D>(); @@ -3099,8 +2985,9 @@ void Viewport::set_use_own_world_3d(bool p_world_3d) { } } - if (is_inside_tree()) + if (is_inside_tree()) { _propagate_enter_world(this); + } if (is_inside_tree()) { RenderingServer::get_singleton()->viewport_set_scenario(viewport, find_world_3d()->get_scenario()); @@ -3110,12 +2997,10 @@ void Viewport::set_use_own_world_3d(bool p_world_3d) { } bool Viewport::is_using_own_world_3d() const { - return own_world_3d.is_valid(); } void Viewport::set_physics_object_picking(bool p_enable) { - physics_object_picking = p_enable; if (!physics_object_picking) { physics_picking_events.clear(); @@ -3123,18 +3008,15 @@ void Viewport::set_physics_object_picking(bool p_enable) { } bool Viewport::get_physics_object_picking() { - return physics_object_picking; } Vector2 Viewport::get_camera_coords(const Vector2 &p_viewport_coords) const { - Transform2D xf = get_final_transform(); return xf.xform(p_viewport_coords); } Vector2 Viewport::get_camera_rect_size() const { - return size; } @@ -3143,7 +3025,6 @@ void Viewport::set_disable_input(bool p_disable) { } bool Viewport::is_input_disabled() const { - return disable_input; } @@ -3166,61 +3047,55 @@ String Viewport::get_configuration_warning() const { void Viewport::gui_reset_canvas_sort_index() { gui.canvas_sort_index = 0; } -int Viewport::gui_get_canvas_sort_index() { +int Viewport::gui_get_canvas_sort_index() { return gui.canvas_sort_index++; } void Viewport::set_msaa(MSAA p_msaa) { - ERR_FAIL_INDEX(p_msaa, MSAA_MAX); - if (msaa == p_msaa) + if (msaa == p_msaa) { return; + } msaa = p_msaa; RS::get_singleton()->viewport_set_msaa(viewport, RS::ViewportMSAA(p_msaa)); } Viewport::MSAA Viewport::get_msaa() const { - return msaa; } void Viewport::set_screen_space_aa(ScreenSpaceAA p_screen_space_aa) { - ERR_FAIL_INDEX(p_screen_space_aa, SCREEN_SPACE_AA_MAX); - if (screen_space_aa == p_screen_space_aa) + if (screen_space_aa == p_screen_space_aa) { return; + } screen_space_aa = p_screen_space_aa; RS::get_singleton()->viewport_set_screen_space_aa(viewport, RS::ViewportScreenSpaceAA(p_screen_space_aa)); } Viewport::ScreenSpaceAA Viewport::get_screen_space_aa() const { - return screen_space_aa; } -void Viewport::set_debug_draw(DebugDraw p_debug_draw) { +void Viewport::set_debug_draw(DebugDraw p_debug_draw) { debug_draw = p_debug_draw; RS::get_singleton()->viewport_set_debug_draw(viewport, RS::ViewportDebugDraw(p_debug_draw)); } Viewport::DebugDraw Viewport::get_debug_draw() const { - return debug_draw; } int Viewport::get_render_info(RenderInfo p_info) { - return RS::get_singleton()->viewport_get_render_info(viewport, RS::ViewportRenderInfo(p_info)); } void Viewport::set_snap_controls_to_pixels(bool p_enable) { - snap_controls_to_pixels = p_enable; } bool Viewport::is_snap_controls_to_pixels_enabled() const { - return snap_controls_to_pixels; } @@ -3296,6 +3171,7 @@ void Viewport::set_default_canvas_item_texture_repeat(DefaultCanvasItemTextureRe default_canvas_item_texture_repeat = p_repeat; _propagate_update_default_repeat(this); } + Viewport::DefaultCanvasItemTextureRepeat Viewport::get_default_canvas_item_texture_repeat() const { return default_canvas_item_texture_repeat; } @@ -3338,9 +3214,11 @@ Viewport *Viewport::get_parent_viewport() const { void Viewport::set_embed_subwindows_hint(bool p_embed) { gui.embed_subwindows_hint = p_embed; } + bool Viewport::get_embed_subwindows_hint() const { return gui.embed_subwindows_hint; } + bool Viewport::is_embedding_subwindows() const { return gui.embed_subwindows_hint; } @@ -3362,7 +3240,6 @@ void Viewport::pass_mouse_focus_to(Viewport *p_viewport, Control *p_control) { } void Viewport::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_world_2d", "world_2d"), &Viewport::set_world_2d); ClassDB::bind_method(D_METHOD("get_world_2d"), &Viewport::get_world_2d); ClassDB::bind_method(D_METHOD("find_world_2d"), &Viewport::find_world_2d); @@ -3544,7 +3421,6 @@ void Viewport::_bind_methods() { } Viewport::Viewport() { - world_2d = Ref<World2D>(memnew(World2D)); viewport = RenderingServer::get_singleton()->viewport_create(); @@ -3629,7 +3505,6 @@ Viewport::Viewport() { } Viewport::~Viewport() { - //erase itself from viewport textures for (Set<ViewportTexture *>::Element *E = viewport_textures.front(); E; E = E->next()) { E->get()->vp = nullptr; @@ -3652,21 +3527,20 @@ bool SubViewport::is_using_xr() { void SubViewport::set_size(const Size2i &p_size) { _set_size(p_size, _get_size_2d_override(), Rect2i(), _stretch_transform(), true); } + Size2i SubViewport::get_size() const { return _get_size(); } void SubViewport::set_size_2d_override(const Size2i &p_size) { - _set_size(_get_size(), p_size, Rect2i(), _stretch_transform(), true); } -Size2i SubViewport::get_size_2d_override() const { +Size2i SubViewport::get_size_2d_override() const { return _get_size_2d_override(); } void SubViewport::set_size_2d_override_stretch(bool p_enable) { - if (p_enable == size_2d_override_stretch) { return; } @@ -3674,28 +3548,26 @@ void SubViewport::set_size_2d_override_stretch(bool p_enable) { size_2d_override_stretch = p_enable; _set_size(_get_size(), _get_size_2d_override(), Rect2i(), _stretch_transform(), true); } -bool SubViewport::is_size_2d_override_stretch_enabled() const { +bool SubViewport::is_size_2d_override_stretch_enabled() const { return size_2d_override_stretch; } void SubViewport::set_update_mode(UpdateMode p_mode) { - update_mode = p_mode; RS::get_singleton()->viewport_set_update_mode(get_viewport_rid(), RS::ViewportUpdateMode(p_mode)); } -SubViewport::UpdateMode SubViewport::get_update_mode() const { +SubViewport::UpdateMode SubViewport::get_update_mode() const { return update_mode; } void SubViewport::set_clear_mode(ClearMode p_mode) { - clear_mode = p_mode; RS::get_singleton()->viewport_set_clear_mode(get_viewport_rid(), RS::ViewportClearMode(p_mode)); } -SubViewport::ClearMode SubViewport::get_clear_mode() const { +SubViewport::ClearMode SubViewport::get_clear_mode() const { return clear_mode; } @@ -3704,7 +3576,6 @@ DisplayServer::WindowID SubViewport::get_window_id() const { } Transform2D SubViewport::_stretch_transform() { - Transform2D transform = Transform2D(); Size2i view_size_2d_override = _get_size_2d_override(); if (size_2d_override_stretch && view_size_2d_override.width > 0 && view_size_2d_override.height > 0) { @@ -3716,7 +3587,6 @@ Transform2D SubViewport::_stretch_transform() { } void SubViewport::_notification(int p_what) { - if (p_what == NOTIFICATION_ENTER_TREE) { RS::get_singleton()->viewport_set_active(get_viewport_rid(), true); } diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 7da57347fd..4536b558f9 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -51,7 +51,6 @@ class Viewport; class CollisionObject3D; class ViewportTexture : public Texture2D { - GDCLASS(ViewportTexture, Texture2D); NodePath path; @@ -85,7 +84,6 @@ public: }; class Viewport : public Node { - GDCLASS(Viewport, Node); public: @@ -236,7 +234,6 @@ private: bool physics_has_last_mousepos; Vector2 physics_last_mousepos; struct { - bool alt; bool control; bool shift; @@ -579,7 +576,6 @@ public: }; class SubViewport : public Viewport { - GDCLASS(SubViewport, Viewport); public: diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 19954299de..6565f02503 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -43,20 +43,22 @@ void Window::set_title(const String &p_title) { embedder->_sub_window_update(this); } else if (window_id != DisplayServer::INVALID_WINDOW_ID) { - DisplayServer::get_singleton()->window_set_title(p_title, window_id); } } + String Window::get_title() const { return title; } void Window::set_current_screen(int p_screen) { current_screen = p_screen; - if (window_id == DisplayServer::INVALID_WINDOW_ID) + if (window_id == DisplayServer::INVALID_WINDOW_ID) { return; + } DisplayServer::get_singleton()->window_set_current_screen(p_screen, window_id); } + int Window::get_current_screen() const { if (window_id != DisplayServer::INVALID_WINDOW_ID) { current_screen = DisplayServer::get_singleton()->window_get_current_screen(window_id); @@ -65,17 +67,16 @@ int Window::get_current_screen() const { } void Window::set_position(const Point2i &p_position) { - position = p_position; if (embedder) { embedder->_sub_window_update(this); } else if (window_id != DisplayServer::INVALID_WINDOW_ID) { - DisplayServer::get_singleton()->window_set_position(p_position, window_id); } } + Point2i Window::get_position() const { return position; } @@ -84,13 +85,12 @@ void Window::set_size(const Size2i &p_size) { size = p_size; _update_window_size(); } -Size2i Window::get_size() const { +Size2i Window::get_size() const { return size; } Size2i Window::get_real_size() const { - if (window_id != DisplayServer::INVALID_WINDOW_ID) { return DisplayServer::get_singleton()->window_get_real_size(window_id); } @@ -128,20 +128,17 @@ Size2i Window::get_min_size() const { } void Window::set_mode(Mode p_mode) { - mode = p_mode; if (embedder) { embedder->_sub_window_update(this); } else if (window_id != DisplayServer::INVALID_WINDOW_ID) { - DisplayServer::get_singleton()->window_set_mode(DisplayServer::WindowMode(p_mode), window_id); } } Window::Mode Window::get_mode() const { - if (window_id != DisplayServer::INVALID_WINDOW_ID) { mode = (Mode)DisplayServer::get_singleton()->window_get_mode(window_id); } @@ -156,7 +153,6 @@ void Window::set_flag(Flags p_flag, bool p_enabled) { embedder->_sub_window_update(this); } else if (window_id != DisplayServer::INVALID_WINDOW_ID) { - DisplayServer::get_singleton()->window_set_flag(DisplayServer::WindowFlags(p_flag), p_enabled, window_id); } } @@ -181,8 +177,8 @@ void Window::request_attention() { DisplayServer::get_singleton()->window_request_attention(window_id); } } -void Window::move_to_foreground() { +void Window::move_to_foreground() { if (embedder) { embedder->_sub_window_grab_focus(this); @@ -207,6 +203,7 @@ void Window::set_ime_active(bool p_active) { DisplayServer::get_singleton()->window_set_ime_active(p_active, window_id); } } + void Window::set_ime_position(const Point2i &p_pos) { if (window_id != DisplayServer::INVALID_WINDOW_ID) { DisplayServer::get_singleton()->window_set_ime_position(p_pos, window_id); @@ -251,8 +248,8 @@ void Window::_make_window() { RS::get_singleton()->viewport_set_update_mode(get_viewport_rid(), RS::VIEWPORT_UPDATE_WHEN_VISIBLE); } -void Window::_update_from_window() { +void Window::_update_from_window() { ERR_FAIL_COND(window_id == DisplayServer::INVALID_WINDOW_ID); mode = (Mode)DisplayServer::get_singleton()->window_get_mode(window_id); for (int i = 0; i < FLAG_MAX; i++) { @@ -283,7 +280,6 @@ void Window::_clear_window() { } void Window::_rect_changed_callback(const Rect2i &p_callback) { - //we must always accept this as the truth if (size == p_callback.size && position == p_callback.position) { return; @@ -309,7 +305,6 @@ void Window::_propagate_window_notification(Node *p_node, int p_notification) { } void Window::_event_callback(DisplayServer::WindowEvent p_event) { - switch (p_event) { case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: { _propagate_window_notification(this, NOTIFICATION_WM_MOUSE_ENTER); @@ -351,12 +346,12 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) { void Window::show() { set_visible(true); } + void Window::hide() { set_visible(false); } void Window::set_visible(bool p_visible) { - if (visible == p_visible) { return; } @@ -473,12 +468,12 @@ void Window::set_transient(bool p_transient) { _clear_transient(); } } + bool Window::is_transient() const { return transient; } void Window::set_exclusive(bool p_exclusive) { - if (exclusive == p_exclusive) { return; } @@ -506,7 +501,6 @@ bool Window::is_visible() const { } void Window::_update_window_size() { - Size2i size_limit; if (wrap_controls) { size_limit = get_contents_minimum_size(); @@ -535,6 +529,7 @@ void Window::_update_window_size() { //update the viewport _update_viewport_size(); } + void Window::_update_viewport_size() { //update the viewport part @@ -545,12 +540,10 @@ void Window::_update_viewport_size() { float font_oversampling = 1.0; if (content_scale_mode == CONTENT_SCALE_MODE_DISABLED || content_scale_size.x == 0 || content_scale_size.y == 0) { - stretch_transform = Transform2D(); final_size = size; } else { - //actual screen video mode Size2 video_mode = size; Size2 desired_res = content_scale_size; @@ -569,7 +562,6 @@ void Window::_update_viewport_size() { // screen ratio is smaller vertically if (content_scale_aspect == CONTENT_SCALE_ASPECT_KEEP_HEIGHT || content_scale_aspect == CONTENT_SCALE_ASPECT_EXPAND) { - //will stretch horizontally viewport_size.x = desired_res.y * video_mode_aspect; viewport_size.y = desired_res.y; @@ -584,7 +576,6 @@ void Window::_update_viewport_size() { } else { //screen ratio is smaller horizontally if (content_scale_aspect == CONTENT_SCALE_ASPECT_KEEP_WIDTH || content_scale_aspect == CONTENT_SCALE_ASPECT_EXPAND) { - //will stretch horizontally viewport_size.x = desired_res.x; viewport_size.y = desired_res.x / video_mode_aspect; @@ -622,14 +613,12 @@ void Window::_update_viewport_size() { //_update_font_oversampling(1.0); } break; case CONTENT_SCALE_MODE_OBJECTS: { - final_size = screen_size; final_size_override = viewport_size; attach_to_screen_rect = Rect2(margin, screen_size); font_oversampling = screen_size.x / viewport_size.x; } break; case CONTENT_SCALE_MODE_PIXELS: { - final_size = viewport_size; attach_to_screen_rect = Rect2(margin, screen_size); @@ -652,12 +641,10 @@ void Window::_update_viewport_size() { } if (window_id == DisplayServer::MAIN_WINDOW_ID) { - if (!use_font_oversampling) { font_oversampling = 1.0; } if (DynamicFontAtSize::font_oversampling != font_oversampling) { - DynamicFontAtSize::font_oversampling = font_oversampling; DynamicFont::update_oversampling(); } @@ -679,11 +666,9 @@ void Window::_update_window_callbacks() { } Viewport *Window::_get_embedder() const { - Viewport *vp = get_parent_viewport(); while (vp) { - if (vp->is_embedding_subwindows()) { return vp; } @@ -699,10 +684,8 @@ Viewport *Window::_get_embedder() const { void Window::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE) { - bool embedded = false; { - embedder = _get_embedder(); if (embedder) { @@ -757,29 +740,24 @@ void Window::_notification(int p_what) { } if (p_what == NOTIFICATION_READY) { - if (wrap_controls) { _update_child_controls(); } } if (p_what == NOTIFICATION_EXIT_TREE) { - if (transient) { _clear_transient(); } if (!is_embedded() && window_id != DisplayServer::INVALID_WINDOW_ID) { - if (window_id == DisplayServer::MAIN_WINDOW_ID) { - RS::get_singleton()->viewport_set_update_mode(get_viewport_rid(), RS::VIEWPORT_UPDATE_DISABLED); _update_window_callbacks(); } else { _clear_window(); } } else { - if (embedder) { embedder->_sub_window_remove(this); embedder = nullptr; @@ -807,6 +785,7 @@ void Window::set_content_scale_mode(ContentScaleMode p_mode) { content_scale_mode = p_mode; _update_viewport_size(); } + Window::ContentScaleMode Window::get_content_scale_mode() const { return content_scale_mode; } @@ -815,6 +794,7 @@ void Window::set_content_scale_aspect(ContentScaleAspect p_aspect) { content_scale_aspect = p_aspect; _update_viewport_size(); } + Window::ContentScaleAspect Window::get_content_scale_aspect() const { return content_scale_aspect; } @@ -826,6 +806,7 @@ void Window::set_use_font_oversampling(bool p_oversampling) { use_font_oversampling = p_oversampling; _update_viewport_size(); } + bool Window::is_using_font_oversampling() const { return use_font_oversampling; } @@ -861,8 +842,8 @@ Size2 Window::_get_contents_minimum_size() const { return max; } -void Window::_update_child_controls() { +void Window::_update_child_controls() { if (!updating_child_controls) { return; } @@ -871,8 +852,8 @@ void Window::_update_child_controls() { updating_child_controls = false; } -void Window::child_controls_changed() { +void Window::child_controls_changed() { if (!is_inside_tree() || !visible || updating_child_controls) { return; } @@ -882,8 +863,9 @@ void Window::child_controls_changed() { } void Window::_window_input(const Ref<InputEvent> &p_ev) { - if (Engine::get_singleton()->is_editor_hint() && (Object::cast_to<InputEventJoypadButton>(p_ev.ptr()) || Object::cast_to<InputEventJoypadMotion>(*p_ev))) + if (Engine::get_singleton()->is_editor_hint() && (Object::cast_to<InputEventJoypadButton>(p_ev.ptr()) || Object::cast_to<InputEventJoypadMotion>(*p_ev))) { return; //avoid joy input on editor + } if (EngineDebugger::is_active()) { //quit from game window using F8 @@ -905,15 +887,16 @@ void Window::_window_input(const Ref<InputEvent> &p_ev) { unhandled_input(p_ev); } } + void Window::_window_input_text(const String &p_text) { input_text(p_text); } + void Window::_window_drop_files(const Vector<String> &p_files) { emit_signal("files_dropped", p_files, current_screen); } Viewport *Window::get_parent_viewport() const { - if (get_parent()) { return get_parent()->get_viewport(); } else { @@ -922,7 +905,6 @@ Viewport *Window::get_parent_viewport() const { } Window *Window::get_parent_visible_window() const { - Viewport *vp = get_parent_viewport(); Window *window = nullptr; while (vp) { @@ -940,7 +922,6 @@ Window *Window::get_parent_visible_window() const { } void Window::popup_on_parent(const Rect2i &p_parent_rect) { - ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND_MSG(window_id == DisplayServer::MAIN_WINDOW_ID, "Can't popup the main window."); @@ -958,7 +939,6 @@ void Window::popup_on_parent(const Rect2i &p_parent_rect) { } void Window::popup_centered_clamped(const Size2i &p_size, float p_fallback_ratio) { - ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND_MSG(window_id == DisplayServer::MAIN_WINDOW_ID, "Can't popup the main window."); @@ -1009,7 +989,6 @@ void Window::popup_centered(const Size2i &p_minsize) { } void Window::popup_centered_ratio(float p_ratio) { - ERR_FAIL_COND(!is_inside_tree()); ERR_FAIL_COND_MSG(window_id == DisplayServer::MAIN_WINDOW_ID, "Can't popup the main window."); @@ -1032,7 +1011,6 @@ void Window::popup_centered_ratio(float p_ratio) { } void Window::popup(const Rect2i &p_screen_rect) { - emit_signal("about_to_popup"); if (p_screen_rect != Rect2i()) { @@ -1074,7 +1052,6 @@ Rect2i Window::get_usable_parent_rect() const { if (is_embedded()) { parent = _get_embedder()->get_visible_rect(); } else { - const Window *w = is_visible() ? this : get_parent_visible_window(); //find a parent that can contain us ERR_FAIL_COND_V(!w, Rect2()); @@ -1085,7 +1062,6 @@ Rect2i Window::get_usable_parent_rect() const { } void Window::add_child_notify(Node *p_child) { - Control *child_c = Object::cast_to<Control>(p_child); if (child_c && child_c->data.theme.is_null() && (theme_owner || theme_owner_window)) { @@ -1104,7 +1080,6 @@ void Window::add_child_notify(Node *p_child) { } void Window::remove_child_notify(Node *p_child) { - Control *child_c = Object::cast_to<Control>(p_child); if (child_c && (child_c->data.theme_owner || child_c->data.theme_owner_window) && child_c->data.theme.is_null()) { @@ -1123,19 +1098,17 @@ void Window::remove_child_notify(Node *p_child) { } void Window::set_theme(const Ref<Theme> &p_theme) { - - if (theme == p_theme) + if (theme == p_theme) { return; + } theme = p_theme; if (!p_theme.is_null()) { - theme_owner = nullptr; theme_owner_window = this; Control::_propagate_theme_changed(this, nullptr, this); } else { - Control *parent_c = cast_to<Control>(get_parent()); if (parent_c && (parent_c->data.theme_owner || parent_c->data.theme_owner_window)) { Control::_propagate_theme_changed(this, parent_c->data.theme_owner, parent_c->data.theme_owner_window); @@ -1149,6 +1122,7 @@ void Window::set_theme(const Ref<Theme> &p_theme) { } } } + Ref<Theme> Window::get_theme() const { return theme; } @@ -1157,22 +1131,27 @@ Ref<Texture2D> Window::get_theme_icon(const StringName &p_name, const StringName StringName type = p_type ? p_type : get_class_name(); return Control::get_icons(theme_owner, theme_owner_window, p_name, type); } + Ref<Shader> Window::get_theme_shader(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::get_shaders(theme_owner, theme_owner_window, p_name, type); } + Ref<StyleBox> Window::get_theme_stylebox(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::get_styleboxs(theme_owner, theme_owner_window, p_name, type); } + Ref<Font> Window::get_theme_font(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::get_fonts(theme_owner, theme_owner_window, p_name, type); } + Color Window::get_theme_color(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::get_colors(theme_owner, theme_owner_window, p_name, type); } + int Window::get_theme_constant(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::get_constants(theme_owner, theme_owner_window, p_name, type); @@ -1182,22 +1161,27 @@ bool Window::has_theme_icon(const StringName &p_name, const StringName &p_type) StringName type = p_type ? p_type : get_class_name(); return Control::has_icons(theme_owner, theme_owner_window, p_name, type); } + bool Window::has_theme_shader(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::has_shaders(theme_owner, theme_owner_window, p_name, type); } + bool Window::has_theme_stylebox(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::has_styleboxs(theme_owner, theme_owner_window, p_name, type); } + bool Window::has_theme_font(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::has_fonts(theme_owner, theme_owner_window, p_name, type); } + bool Window::has_theme_color(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::has_colors(theme_owner, theme_owner_window, p_name, type); } + bool Window::has_theme_constant(const StringName &p_name, const StringName &p_type) const { StringName type = p_type ? p_type : get_class_name(); return Control::has_constants(theme_owner, theme_owner_window, p_name, type); @@ -1240,7 +1224,6 @@ Rect2i Window::get_parent_rect() const { } void Window::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_title", "title"), &Window::set_title); ClassDB::bind_method(D_METHOD("get_title"), &Window::get_title); @@ -1402,5 +1385,6 @@ Window::Window() { content_scale_aspect = CONTENT_SCALE_ASPECT_IGNORE; RS::get_singleton()->viewport_set_update_mode(get_viewport_rid(), RS::VIEWPORT_UPDATE_DISABLED); } + Window::~Window() { } diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 24f92bdc20..5588d1bd97 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -235,7 +235,6 @@ static Ref<ResourceFormatSaverShader> resource_saver_shader; static Ref<ResourceFormatLoaderShader> resource_loader_shader; void register_scene_types() { - SceneStringNames::create(); OS::get_singleton()->yield(); //may take time to init @@ -922,7 +921,6 @@ void register_scene_types() { } void unregister_scene_types() { - SceneDebugger::deinitialize(); clear_default_theme(); diff --git a/scene/resources/animation.cpp b/scene/resources/animation.cpp index c5806ee7b3..c9fc68233d 100644 --- a/scene/resources/animation.cpp +++ b/scene/resources/animation.cpp @@ -36,38 +36,28 @@ #define ANIM_MIN_LENGTH 0.001 bool Animation::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; if (name.begins_with("tracks/")) { - int track = name.get_slicec('/', 1).to_int(); String what = name.get_slicec('/', 2); if (tracks.size() == track && what == "type") { - String type = p_value; if (type == "transform") { - add_track(TYPE_TRANSFORM); } else if (type == "value") { - add_track(TYPE_VALUE); } else if (type == "method") { - add_track(TYPE_METHOD); } else if (type == "bezier") { - add_track(TYPE_BEZIER); } else if (type == "audio") { - add_track(TYPE_AUDIO); } else if (type == "animation") { - add_track(TYPE_ANIMATION); } else { - return false; } @@ -76,20 +66,18 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { ERR_FAIL_INDEX_V(track, tracks.size(), false); - if (what == "path") + if (what == "path") { track_set_path(track, p_value); - else if (what == "interp") + } else if (what == "interp") { track_set_interpolation_type(track, InterpolationType(p_value.operator int())); - else if (what == "loop_wrap") + } else if (what == "loop_wrap") { track_set_interpolation_loop_wrap(track, p_value); - else if (what == "imported") + } else if (what == "imported") { track_set_imported(track, p_value); - else if (what == "enabled") + } else if (what == "enabled") { track_set_enabled(track, p_value); - else if (what == "keys" || what == "key_values") { - + } else if (what == "keys" || what == "key_values") { if (track_get_type(track) == TYPE_TRANSFORM) { - TransformTrack *tt = static_cast<TransformTrack *>(tracks[track]); Vector<float> values = p_value; int vcount = values.size(); @@ -100,7 +88,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { tt->transforms.resize(vcount / 12); for (int i = 0; i < (vcount / 12); i++) { - TKey<TransformKey> &tk = tt->transforms.write[i]; const float *ofs = &r[i * 12]; tk.time = ofs[0]; @@ -121,7 +108,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { } } else if (track_get_type(track) == TYPE_VALUE) { - ValueTrack *vt = static_cast<ValueTrack *>(tracks[track]); Dictionary d = p_value; ERR_FAIL_COND_V(!d.has("times"), false); @@ -133,10 +119,11 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { if (d.has("update")) { int um = d["update"]; - if (um < 0) + if (um < 0) { um = 0; - else if (um > 3) + } else if (um > 3) { um = 3; + } vt->update_mode = UpdateMode(um); } @@ -146,7 +133,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { ERR_FAIL_COND_V(times.size() != values.size(), false); if (times.size()) { - int valcount = times.size(); const float *rt = times.ptr(); @@ -154,20 +140,17 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { vt->values.resize(valcount); for (int i = 0; i < valcount; i++) { - vt->values.write[i].time = rt[i]; vt->values.write[i].value = values[i]; } if (d.has("transitions")) { - Vector<float> transitions = d["transitions"]; ERR_FAIL_COND_V(transitions.size() != valcount, false); const float *rtr = transitions.ptr(); for (int i = 0; i < valcount; i++) { - vt->values.write[i].transition = rtr[i]; } } @@ -176,9 +159,9 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { return true; } else if (track_get_type(track) == TYPE_METHOD) { - - while (track_get_key_count(track)) + while (track_get_key_count(track)) { track_remove_key(track, 0); //well shouldn't be set anyway + } Dictionary d = p_value; ERR_FAIL_COND_V(!d.has("times"), false); @@ -190,31 +173,26 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { ERR_FAIL_COND_V(times.size() != values.size(), false); if (times.size()) { - int valcount = times.size(); const float *rt = times.ptr(); for (int i = 0; i < valcount; i++) { - track_insert_key(track, rt[i], values[i]); } if (d.has("transitions")) { - Vector<float> transitions = d["transitions"]; ERR_FAIL_COND_V(transitions.size() != valcount, false); const float *rtr = transitions.ptr(); for (int i = 0; i < valcount; i++) { - track_set_key_transition(track, i, rtr[i]); } } } } else if (track_get_type(track) == TYPE_BEZIER) { - BezierTrack *bt = static_cast<BezierTrack *>(tracks[track]); Dictionary d = p_value; ERR_FAIL_COND_V(!d.has("times"), false); @@ -226,7 +204,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { ERR_FAIL_COND_V(times.size() * 5 != values.size(), false); if (times.size()) { - int valcount = times.size(); const float *rt = times.ptr(); @@ -235,7 +212,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { bt->values.resize(valcount); for (int i = 0; i < valcount; i++) { - bt->values.write[i].time = rt[i]; bt->values.write[i].transition = 0; //unused in bezier bt->values.write[i].value.value = rv[i * 5 + 0]; @@ -248,7 +224,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { return true; } else if (track_get_type(track) == TYPE_AUDIO) { - AudioTrack *ad = static_cast<AudioTrack *>(tracks[track]); Dictionary d = p_value; ERR_FAIL_COND_V(!d.has("times"), false); @@ -260,7 +235,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { ERR_FAIL_COND_V(clips.size() != times.size(), false); if (times.size()) { - int valcount = times.size(); const float *rt = times.ptr(); @@ -268,14 +242,16 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { ad->values.clear(); for (int i = 0; i < valcount; i++) { - Dictionary d2 = clips[i]; - if (!d2.has("start_offset")) + if (!d2.has("start_offset")) { continue; - if (!d2.has("end_offset")) + } + if (!d2.has("end_offset")) { continue; - if (!d2.has("stream")) + } + if (!d2.has("stream")) { continue; + } TKey<AudioKey> ak; ak.time = rt[i]; @@ -289,7 +265,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { return true; } else if (track_get_type(track) == TYPE_ANIMATION) { - AnimationTrack *an = static_cast<AnimationTrack *>(tracks[track]); Dictionary d = p_value; ERR_FAIL_COND_V(!d.has("times"), false); @@ -301,7 +276,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { ERR_FAIL_COND_V(clips.size() != times.size(), false); if (times.size()) { - int valcount = times.size(); const float *rt = times.ptr(); @@ -310,7 +284,6 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { an->values.resize(valcount); for (int i = 0; i < valcount; i++) { - TKey<StringName> ak; ak.time = rt[i]; ak.value = rc[i]; @@ -322,33 +295,31 @@ bool Animation::_set(const StringName &p_name, const Variant &p_value) { } else { return false; } - } else + } else { return false; - } else + } + } else { return false; + } return true; } bool Animation::_get(const StringName &p_name, Variant &r_ret) const { - String name = p_name; - if (name == "length") + if (name == "length") { r_ret = length; - else if (name == "loop") + } else if (name == "loop") { r_ret = loop; - else if (name == "step") + } else if (name == "step") { r_ret = step; - else if (name.begins_with("tracks/")) { - + } else if (name.begins_with("tracks/")) { int track = name.get_slicec('/', 1).to_int(); String what = name.get_slicec('/', 2); ERR_FAIL_INDEX_V(track, tracks.size(), false); if (what == "type") { - switch (track_get_type(track)) { - case TYPE_TRANSFORM: r_ret = "transform"; break; @@ -371,20 +342,18 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { return true; - } else if (what == "path") + } else if (what == "path") { r_ret = track_get_path(track); - else if (what == "interp") + } else if (what == "interp") { r_ret = track_get_interpolation_type(track); - else if (what == "loop_wrap") + } else if (what == "loop_wrap") { r_ret = track_get_interpolation_loop_wrap(track); - else if (what == "imported") + } else if (what == "imported") { r_ret = track_is_imported(track); - else if (what == "enabled") + } else if (what == "enabled") { r_ret = track_is_enabled(track); - else if (what == "keys") { - + } else if (what == "keys") { if (track_get_type(track) == TYPE_TRANSFORM) { - Vector<float> keys; int kk = track_get_key_count(track); keys.resize(kk * 12); @@ -393,7 +362,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { int idx = 0; for (int i = 0; i < track_get_key_count(track); i++) { - Vector3 loc; Quat rot; Vector3 scale; @@ -419,7 +387,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { return true; } else if (track_get_type(track) == TYPE_VALUE) { - const ValueTrack *vt = static_cast<const ValueTrack *>(tracks[track]); Dictionary d; @@ -442,7 +409,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { const TKey<Variant> *vls = vt->values.ptr(); for (int i = 0; i < kk; i++) { - wti[idx] = vls[i].time; wtr[idx] = vls[i].transition; key_values[idx] = vls[i].value; @@ -461,7 +427,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { return true; } else if (track_get_type(track) == TYPE_METHOD) { - Dictionary d; Vector<float> key_times; @@ -479,7 +444,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { int idx = 0; for (int i = 0; i < track_get_key_count(track); i++) { - wti[idx] = track_get_key_time(track, i); wtr[idx] = track_get_key_transition(track, i); key_values[idx] = track_get_key_value(track, i); @@ -497,7 +461,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { return true; } else if (track_get_type(track) == TYPE_BEZIER) { - const BezierTrack *bt = static_cast<const BezierTrack *>(tracks[track]); Dictionary d; @@ -518,7 +481,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { const TKey<BezierKey> *vls = bt->values.ptr(); for (int i = 0; i < kk; i++) { - wti[idx] = vls[i].time; wpo[idx * 5 + 0] = vls[i].value.value; wpo[idx * 5 + 1] = vls[i].value.in_handle.x; @@ -535,7 +497,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { return true; } else if (track_get_type(track) == TYPE_AUDIO) { - const AudioTrack *ad = static_cast<const AudioTrack *>(tracks[track]); Dictionary d; @@ -554,7 +515,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { const TKey<AudioKey> *vls = ad->values.ptr(); for (int i = 0; i < kk; i++) { - wti[idx] = vls[i].time; Dictionary clip; clip["start_offset"] = vls[i].value.start_offset; @@ -571,7 +531,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { return true; } else if (track_get_type(track) == TYPE_ANIMATION) { - const AnimationTrack *an = static_cast<const AnimationTrack *>(tracks[track]); Dictionary d; @@ -590,7 +549,6 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { const TKey<StringName> *vls = an->values.ptr(); for (int i = 0; i < kk; i++) { - wti[i] = vls[i].time; wcl[i] = vls[i].value; } @@ -602,17 +560,18 @@ bool Animation::_get(const StringName &p_name, Variant &r_ret) const { return true; } - } else + } else { return false; - } else + } + } else { return false; + } return true; } void Animation::_get_property_list(List<PropertyInfo> *p_list) const { for (int i = 0; i < tracks.size(); i++) { - p_list->push_back(PropertyInfo(Variant::STRING, "tracks/" + itos(i) + "/type", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); p_list->push_back(PropertyInfo(Variant::NODE_PATH, "tracks/" + itos(i) + "/path", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); p_list->push_back(PropertyInfo(Variant::INT, "tracks/" + itos(i) + "/interp", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); @@ -624,44 +583,36 @@ void Animation::_get_property_list(List<PropertyInfo> *p_list) const { } int Animation::add_track(TrackType p_type, int p_at_pos) { - - if (p_at_pos < 0 || p_at_pos >= tracks.size()) + if (p_at_pos < 0 || p_at_pos >= tracks.size()) { p_at_pos = tracks.size(); + } switch (p_type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = memnew(TransformTrack); tracks.insert(p_at_pos, tt); } break; case TYPE_VALUE: { - tracks.insert(p_at_pos, memnew(ValueTrack)); } break; case TYPE_METHOD: { - tracks.insert(p_at_pos, memnew(MethodTrack)); } break; case TYPE_BEZIER: { - tracks.insert(p_at_pos, memnew(BezierTrack)); } break; case TYPE_AUDIO: { - tracks.insert(p_at_pos, memnew(AudioTrack)); } break; case TYPE_ANIMATION: { - tracks.insert(p_at_pos, memnew(AnimationTrack)); } break; default: { - ERR_PRINT("Unknown track type"); } } @@ -671,44 +622,36 @@ int Animation::add_track(TrackType p_type, int p_at_pos) { } void Animation::remove_track(int p_track) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); _clear(tt->transforms); } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); _clear(vt->values); } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); _clear(mt->methods); } break; case TYPE_BEZIER: { - BezierTrack *bz = static_cast<BezierTrack *>(t); _clear(bz->values); } break; case TYPE_AUDIO: { - AudioTrack *ad = static_cast<AudioTrack *>(t); _clear(ad->values); } break; case TYPE_ANIMATION: { - AnimationTrack *an = static_cast<AnimationTrack *>(t); _clear(an->values); @@ -722,18 +665,15 @@ void Animation::remove_track(int p_track) { } int Animation::get_track_count() const { - return tracks.size(); } Animation::TrackType Animation::track_get_type(int p_track) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), TYPE_TRANSFORM); return tracks[p_track]->type; } void Animation::track_set_path(int p_track, const NodePath &p_path) { - ERR_FAIL_INDEX(p_track, tracks.size()); tracks[p_track]->path = p_path; emit_changed(); @@ -741,23 +681,20 @@ void Animation::track_set_path(int p_track, const NodePath &p_path) { } NodePath Animation::track_get_path(int p_track) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), NodePath()); return tracks[p_track]->path; } int Animation::find_track(const NodePath &p_path) const { - for (int i = 0; i < tracks.size(); i++) { - - if (tracks[i]->path == p_path) + if (tracks[i]->path == p_path) { return i; + } }; return -1; }; void Animation::track_set_interpolation_type(int p_track, InterpolationType p_interp) { - ERR_FAIL_INDEX(p_track, tracks.size()); ERR_FAIL_INDEX(p_interp, 3); tracks[p_track]->interpolation = p_interp; @@ -765,7 +702,6 @@ void Animation::track_set_interpolation_type(int p_track, InterpolationType p_in } Animation::InterpolationType Animation::track_get_interpolation_type(int p_track) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), INTERPOLATION_NEAREST); return tracks[p_track]->interpolation; } @@ -777,7 +713,6 @@ void Animation::track_set_interpolation_loop_wrap(int p_track, bool p_enable) { } bool Animation::track_get_interpolation_loop_wrap(int p_track) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), INTERPOLATION_NEAREST); return tracks[p_track]->loop_wrap; } @@ -808,23 +743,20 @@ int Animation::_insert_pos(float p_time, T& p_keys) { } } + */ template <class T, class V> int Animation::_insert(float p_time, T &p_keys, const V &p_value) { - int idx = p_keys.size(); while (true) { - // Condition for replacement. if (idx > 0 && Math::is_equal_approx(p_keys[idx - 1].time, p_time)) { - p_keys.write[idx - 1] = p_value; return idx - 1; // Condition for insert. } else if (idx == 0 || p_keys[idx - 1].time < p_time) { - p_keys.insert(idx, p_value); return idx; } @@ -837,12 +769,10 @@ int Animation::_insert(float p_time, T &p_keys, const V &p_value) { template <class T> void Animation::_clear(T &p_keys) { - p_keys.clear(); } Error Animation::transform_track_get_key(int p_track, int p_key, Vector3 *r_loc, Quat *r_rot, Vector3 *r_scale) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), ERR_INVALID_PARAMETER); Track *t = tracks[p_track]; @@ -850,18 +780,20 @@ Error Animation::transform_track_get_key(int p_track, int p_key, Vector3 *r_loc, ERR_FAIL_COND_V(t->type != TYPE_TRANSFORM, ERR_INVALID_PARAMETER); ERR_FAIL_INDEX_V(p_key, tt->transforms.size(), ERR_INVALID_PARAMETER); - if (r_loc) + if (r_loc) { *r_loc = tt->transforms[p_key].value.loc; - if (r_rot) + } + if (r_rot) { *r_rot = tt->transforms[p_key].value.rot; - if (r_scale) + } + if (r_scale) { *r_scale = tt->transforms[p_key].value.scale; + } return OK; } int Animation::transform_track_insert_key(int p_track, float p_time, const Vector3 &p_loc, const Quat &p_rot, const Vector3 &p_scale) { - ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_TRANSFORM, -1); @@ -880,55 +812,47 @@ int Animation::transform_track_insert_key(int p_track, float p_time, const Vecto } void Animation::track_remove_key_at_position(int p_track, float p_pos) { - int idx = track_find_key(p_track, p_pos, true); ERR_FAIL_COND(idx < 0); track_remove_key(p_track, idx); } void Animation::track_remove_key(int p_track, int p_idx) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; switch (t->type) { case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); ERR_FAIL_INDEX(p_idx, tt->transforms.size()); tt->transforms.remove(p_idx); } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); ERR_FAIL_INDEX(p_idx, vt->values.size()); vt->values.remove(p_idx); } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); ERR_FAIL_INDEX(p_idx, mt->methods.size()); mt->methods.remove(p_idx); } break; case TYPE_BEZIER: { - BezierTrack *bz = static_cast<BezierTrack *>(t); ERR_FAIL_INDEX(p_idx, bz->values.size()); bz->values.remove(p_idx); } break; case TYPE_AUDIO: { - AudioTrack *ad = static_cast<AudioTrack *>(t); ERR_FAIL_INDEX(p_idx, ad->values.size()); ad->values.remove(p_idx); } break; case TYPE_ANIMATION: { - AnimationTrack *an = static_cast<AnimationTrack *>(t); ERR_FAIL_INDEX(p_idx, an->values.size()); an->values.remove(p_idx); @@ -940,74 +864,79 @@ void Animation::track_remove_key(int p_track, int p_idx) { } int Animation::track_find_key(int p_track, float p_time, bool p_exact) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; switch (t->type) { case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); int k = _find(tt->transforms, p_time); - if (k < 0 || k >= tt->transforms.size()) + if (k < 0 || k >= tt->transforms.size()) { return -1; - if (tt->transforms[k].time != p_time && p_exact) + } + if (tt->transforms[k].time != p_time && p_exact) { return -1; + } return k; } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); int k = _find(vt->values, p_time); - if (k < 0 || k >= vt->values.size()) + if (k < 0 || k >= vt->values.size()) { return -1; - if (vt->values[k].time != p_time && p_exact) + } + if (vt->values[k].time != p_time && p_exact) { return -1; + } return k; } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); int k = _find(mt->methods, p_time); - if (k < 0 || k >= mt->methods.size()) + if (k < 0 || k >= mt->methods.size()) { return -1; - if (mt->methods[k].time != p_time && p_exact) + } + if (mt->methods[k].time != p_time && p_exact) { return -1; + } return k; } break; case TYPE_BEZIER: { - BezierTrack *bt = static_cast<BezierTrack *>(t); int k = _find(bt->values, p_time); - if (k < 0 || k >= bt->values.size()) + if (k < 0 || k >= bt->values.size()) { return -1; - if (bt->values[k].time != p_time && p_exact) + } + if (bt->values[k].time != p_time && p_exact) { return -1; + } return k; } break; case TYPE_AUDIO: { - AudioTrack *at = static_cast<AudioTrack *>(t); int k = _find(at->values, p_time); - if (k < 0 || k >= at->values.size()) + if (k < 0 || k >= at->values.size()) { return -1; - if (at->values[k].time != p_time && p_exact) + } + if (at->values[k].time != p_time && p_exact) { return -1; + } return k; } break; case TYPE_ANIMATION: { - AnimationTrack *at = static_cast<AnimationTrack *>(t); int k = _find(at->values, p_time); - if (k < 0 || k >= at->values.size()) + if (k < 0 || k >= at->values.size()) { return -1; - if (at->values[k].time != p_time && p_exact) + } + if (at->values[k].time != p_time && p_exact) { return -1; + } return k; } break; @@ -1017,33 +946,32 @@ int Animation::track_find_key(int p_track, float p_time, bool p_exact) const { } void Animation::track_insert_key(int p_track, float p_time, const Variant &p_key, float p_transition) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - Dictionary d = p_key; Vector3 loc; - if (d.has("location")) + if (d.has("location")) { loc = d["location"]; + } Quat rot; - if (d.has("rotation")) + if (d.has("rotation")) { rot = d["rotation"]; + } Vector3 scale; - if (d.has("scale")) + if (d.has("scale")) { scale = d["scale"]; + } int idx = transform_track_insert_key(p_track, p_time, loc, rot, scale); track_set_key_transition(p_track, idx, p_transition); } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); TKey<Variant> k; @@ -1054,7 +982,6 @@ void Animation::track_insert_key(int p_track, float p_time, const Variant &p_key } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); ERR_FAIL_COND(p_key.get_type() != Variant::DICTIONARY); @@ -1074,7 +1001,6 @@ void Animation::track_insert_key(int p_track, float p_time, const Variant &p_key } break; case TYPE_BEZIER: { - BezierTrack *bt = static_cast<BezierTrack *>(t); Array arr = p_key; @@ -1091,7 +1017,6 @@ void Animation::track_insert_key(int p_track, float p_time, const Variant &p_key } break; case TYPE_AUDIO: { - AudioTrack *at = static_cast<AudioTrack *>(t); Dictionary k = p_key; @@ -1108,7 +1033,6 @@ void Animation::track_insert_key(int p_track, float p_time, const Variant &p_key } break; case TYPE_ANIMATION: { - AnimationTrack *at = static_cast<AnimationTrack *>(t); TKey<StringName> ak; @@ -1124,40 +1048,32 @@ void Animation::track_insert_key(int p_track, float p_time, const Variant &p_key } int Animation::track_get_key_count(int p_track) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); return tt->transforms.size(); } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); return vt->values.size(); } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); return mt->methods.size(); } break; case TYPE_BEZIER: { - BezierTrack *bt = static_cast<BezierTrack *>(t); return bt->values.size(); } break; case TYPE_AUDIO: { - AudioTrack *at = static_cast<AudioTrack *>(t); return at->values.size(); } break; case TYPE_ANIMATION: { - AnimationTrack *at = static_cast<AnimationTrack *>(t); return at->values.size(); } break; @@ -1167,14 +1083,11 @@ int Animation::track_get_key_count(int p_track) const { } Variant Animation::track_get_key_value(int p_track, int p_key_idx) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), Variant()); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, tt->transforms.size(), Variant()); @@ -1186,14 +1099,12 @@ Variant Animation::track_get_key_value(int p_track, int p_key_idx) const { return d; } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, vt->values.size(), Variant()); return vt->values[p_key_idx].value; } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, mt->methods.size(), Variant()); Dictionary d; @@ -1203,7 +1114,6 @@ Variant Animation::track_get_key_value(int p_track, int p_key_idx) const { } break; case TYPE_BEZIER: { - BezierTrack *bt = static_cast<BezierTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, bt->values.size(), Variant()); @@ -1218,7 +1128,6 @@ Variant Animation::track_get_key_value(int p_track, int p_key_idx) const { } break; case TYPE_AUDIO: { - AudioTrack *at = static_cast<AudioTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, at->values.size(), Variant()); @@ -1230,7 +1139,6 @@ Variant Animation::track_get_key_value(int p_track, int p_key_idx) const { } break; case TYPE_ANIMATION: { - AnimationTrack *at = static_cast<AnimationTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, at->values.size(), Variant()); @@ -1243,48 +1151,40 @@ Variant Animation::track_get_key_value(int p_track, int p_key_idx) const { } float Animation::track_get_key_time(int p_track, int p_key_idx) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, tt->transforms.size(), -1); return tt->transforms[p_key_idx].time; } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, vt->values.size(), -1); return vt->values[p_key_idx].time; } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, mt->methods.size(), -1); return mt->methods[p_key_idx].time; } break; case TYPE_BEZIER: { - BezierTrack *bt = static_cast<BezierTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, bt->values.size(), -1); return bt->values[p_key_idx].time; } break; case TYPE_AUDIO: { - AudioTrack *at = static_cast<AudioTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, at->values.size(), -1); return at->values[p_key_idx].time; } break; case TYPE_ANIMATION: { - AnimationTrack *at = static_cast<AnimationTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, at->values.size(), -1); return at->values[p_key_idx].time; @@ -1296,14 +1196,11 @@ float Animation::track_get_key_time(int p_track, int p_key_idx) const { } void Animation::track_set_key_time(int p_track, int p_key_idx, float p_time) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); ERR_FAIL_INDEX(p_key_idx, tt->transforms.size()); TKey<TransformKey> key = tt->transforms[p_key_idx]; @@ -1313,7 +1210,6 @@ void Animation::track_set_key_time(int p_track, int p_key_idx, float p_time) { return; } case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); ERR_FAIL_INDEX(p_key_idx, vt->values.size()); TKey<Variant> key = vt->values[p_key_idx]; @@ -1323,7 +1219,6 @@ void Animation::track_set_key_time(int p_track, int p_key_idx, float p_time) { return; } case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); ERR_FAIL_INDEX(p_key_idx, mt->methods.size()); MethodKey key = mt->methods[p_key_idx]; @@ -1333,7 +1228,6 @@ void Animation::track_set_key_time(int p_track, int p_key_idx, float p_time) { return; } case TYPE_BEZIER: { - BezierTrack *bt = static_cast<BezierTrack *>(t); ERR_FAIL_INDEX(p_key_idx, bt->values.size()); TKey<BezierKey> key = bt->values[p_key_idx]; @@ -1343,7 +1237,6 @@ void Animation::track_set_key_time(int p_track, int p_key_idx, float p_time) { return; } case TYPE_AUDIO: { - AudioTrack *at = static_cast<AudioTrack *>(t); ERR_FAIL_INDEX(p_key_idx, at->values.size()); TKey<AudioKey> key = at->values[p_key_idx]; @@ -1353,7 +1246,6 @@ void Animation::track_set_key_time(int p_track, int p_key_idx, float p_time) { return; } case TYPE_ANIMATION: { - AnimationTrack *at = static_cast<AnimationTrack *>(t); ERR_FAIL_INDEX(p_key_idx, at->values.size()); TKey<StringName> key = at->values[p_key_idx]; @@ -1368,42 +1260,34 @@ void Animation::track_set_key_time(int p_track, int p_key_idx, float p_time) { } float Animation::track_get_key_transition(int p_track, int p_key_idx) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, tt->transforms.size(), -1); return tt->transforms[p_key_idx].transition; } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, vt->values.size(), -1); return vt->values[p_key_idx].transition; } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); ERR_FAIL_INDEX_V(p_key_idx, mt->methods.size(), -1); return mt->methods[p_key_idx].transition; } break; case TYPE_BEZIER: { - return 1; //bezier does not really use transitions } break; case TYPE_AUDIO: { - return 1; //audio does not really use transitions } break; case TYPE_ANIMATION: { - return 1; //animation does not really use transitions } break; } @@ -1412,29 +1296,28 @@ float Animation::track_get_key_transition(int p_track, int p_key_idx) const { } void Animation::track_set_key_value(int p_track, int p_key_idx, const Variant &p_value) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); ERR_FAIL_INDEX(p_key_idx, tt->transforms.size()); Dictionary d = p_value; - if (d.has("location")) + if (d.has("location")) { tt->transforms.write[p_key_idx].value.loc = d["location"]; - if (d.has("rotation")) + } + if (d.has("rotation")) { tt->transforms.write[p_key_idx].value.rot = d["rotation"]; - if (d.has("scale")) + } + if (d.has("scale")) { tt->transforms.write[p_key_idx].value.scale = d["scale"]; + } } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); ERR_FAIL_INDEX(p_key_idx, vt->values.size()); @@ -1442,20 +1325,20 @@ void Animation::track_set_key_value(int p_track, int p_key_idx, const Variant &p } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); ERR_FAIL_INDEX(p_key_idx, mt->methods.size()); Dictionary d = p_value; - if (d.has("method")) + if (d.has("method")) { mt->methods.write[p_key_idx].method = d["method"]; - if (d.has("args")) + } + if (d.has("args")) { mt->methods.write[p_key_idx].params = d["args"]; + } } break; case TYPE_BEZIER: { - BezierTrack *bt = static_cast<BezierTrack *>(t); ERR_FAIL_INDEX(p_key_idx, bt->values.size()); @@ -1470,7 +1353,6 @@ void Animation::track_set_key_value(int p_track, int p_key_idx, const Variant &p } break; case TYPE_AUDIO: { - AudioTrack *at = static_cast<AudioTrack *>(t); ERR_FAIL_INDEX(p_key_idx, at->values.size()); @@ -1485,7 +1367,6 @@ void Animation::track_set_key_value(int p_track, int p_key_idx, const Variant &p } break; case TYPE_ANIMATION: { - AnimationTrack *at = static_cast<AnimationTrack *>(t); ERR_FAIL_INDEX(p_key_idx, at->values.size()); @@ -1498,27 +1379,22 @@ void Animation::track_set_key_value(int p_track, int p_key_idx, const Variant &p } void Animation::track_set_key_transition(int p_track, int p_key_idx, float p_transition) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; switch (t->type) { - case TYPE_TRANSFORM: { - TransformTrack *tt = static_cast<TransformTrack *>(t); ERR_FAIL_INDEX(p_key_idx, tt->transforms.size()); tt->transforms.write[p_key_idx].transition = p_transition; } break; case TYPE_VALUE: { - ValueTrack *vt = static_cast<ValueTrack *>(t); ERR_FAIL_INDEX(p_key_idx, vt->values.size()); vt->values.write[p_key_idx].transition = p_transition; } break; case TYPE_METHOD: { - MethodTrack *mt = static_cast<MethodTrack *>(t); ERR_FAIL_INDEX(p_key_idx, mt->methods.size()); mt->methods.write[p_key_idx].transition = p_transition; @@ -1536,42 +1412,43 @@ void Animation::track_set_key_transition(int p_track, int p_key_idx, float p_tra template <class K> int Animation::_find(const Vector<K> &p_keys, float p_time) const { - int len = p_keys.size(); - if (len == 0) + if (len == 0) { return -2; + } int low = 0; int high = len - 1; int middle = 0; #ifdef DEBUG_ENABLED - if (low > high) + if (low > high) { ERR_PRINT("low > high, this may be a bug"); + } #endif const K *keys = &p_keys[0]; while (low <= high) { - middle = (low + high) / 2; if (Math::is_equal_approx(p_time, keys[middle].time)) { //match return middle; - } else if (p_time < keys[middle].time) + } else if (p_time < keys[middle].time) { high = middle - 1; //search low end of array - else + } else { low = middle + 1; //search high end of array + } } - if (keys[middle].time > p_time) + if (keys[middle].time > p_time) { middle--; + } return middle; } Animation::TransformKey Animation::_interpolate(const Animation::TransformKey &p_a, const Animation::TransformKey &p_b, float p_c) const { - TransformKey ret; ret.loc = _interpolate(p_a.loc, p_b.loc, p_c); ret.rot = _interpolate(p_a.rot, p_b.rot, p_c); @@ -1581,27 +1458,24 @@ Animation::TransformKey Animation::_interpolate(const Animation::TransformKey &p } Vector3 Animation::_interpolate(const Vector3 &p_a, const Vector3 &p_b, float p_c) const { - return p_a.lerp(p_b, p_c); } -Quat Animation::_interpolate(const Quat &p_a, const Quat &p_b, float p_c) const { +Quat Animation::_interpolate(const Quat &p_a, const Quat &p_b, float p_c) const { return p_a.slerp(p_b, p_c); } -Variant Animation::_interpolate(const Variant &p_a, const Variant &p_b, float p_c) const { +Variant Animation::_interpolate(const Variant &p_a, const Variant &p_b, float p_c) const { Variant dst; Variant::interpolate(p_a, p_b, p_c, dst); return dst; } float Animation::_interpolate(const float &p_a, const float &p_b, float p_c) const { - return p_a * (1.0 - p_c) + p_b * p_c; } Animation::TransformKey Animation::_cubic_interpolate(const Animation::TransformKey &p_pre_a, const Animation::TransformKey &p_a, const Animation::TransformKey &p_b, const Animation::TransformKey &p_post_b, float p_c) const { - Animation::TransformKey tk; tk.loc = p_a.loc.cubic_interpolate(p_b.loc, p_pre_a.loc, p_post_b.loc, p_c); @@ -1610,16 +1484,16 @@ Animation::TransformKey Animation::_cubic_interpolate(const Animation::Transform return tk; } -Vector3 Animation::_cubic_interpolate(const Vector3 &p_pre_a, const Vector3 &p_a, const Vector3 &p_b, const Vector3 &p_post_b, float p_c) const { +Vector3 Animation::_cubic_interpolate(const Vector3 &p_pre_a, const Vector3 &p_a, const Vector3 &p_b, const Vector3 &p_post_b, float p_c) const { return p_a.cubic_interpolate(p_b, p_pre_a, p_post_b, p_c); } -Quat Animation::_cubic_interpolate(const Quat &p_pre_a, const Quat &p_a, const Quat &p_b, const Quat &p_post_b, float p_c) const { +Quat Animation::_cubic_interpolate(const Quat &p_pre_a, const Quat &p_a, const Quat &p_b, const Quat &p_post_b, float p_c) const { return p_a.cubic_slerp(p_b, p_pre_a, p_post_b, p_c); } -Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a, const Variant &p_b, const Variant &p_post_b, float p_c) const { +Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a, const Variant &p_b, const Variant &p_post_b, float p_c) const { Variant::Type type_a = p_a.get_type(); Variant::Type type_b = p_b.get_type(); Variant::Type type_pa = p_pre_a.get_type(); @@ -1650,14 +1524,11 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a (-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t3); } else if ((vformat & (vformat - 1))) { - return p_a; //can't interpolate, mix of types } switch (type_a) { - case Variant::VECTOR2: { - Vector2 a = p_a; Vector2 b = p_b; Vector2 pa = p_pre_a; @@ -1666,7 +1537,6 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a return a.cubic_interpolate(b, pa, pb, p_c); } case Variant::RECT2: { - Rect2 a = p_a; Rect2 b = p_b; Rect2 pa = p_pre_a; @@ -1677,7 +1547,6 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a a.size.cubic_interpolate(b.size, pa.size, pb.size, p_c)); } case Variant::VECTOR3: { - Vector3 a = p_a; Vector3 b = p_b; Vector3 pa = p_pre_a; @@ -1686,7 +1555,6 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a return a.cubic_interpolate(b, pa, pb, p_c); } case Variant::QUAT: { - Quat a = p_a; Quat b = p_b; Quat pa = p_pre_a; @@ -1695,7 +1563,6 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a return a.cubic_slerp(b, pa, pb, p_c); } case Variant::AABB: { - AABB a = p_a; AABB b = p_b; AABB pa = p_pre_a; @@ -1706,31 +1573,31 @@ Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a a.size.cubic_interpolate(b.size, pa.size, pb.size, p_c)); } default: { - return _interpolate(p_a, p_b, p_c); } } } -float Animation::_cubic_interpolate(const float &p_pre_a, const float &p_a, const float &p_b, const float &p_post_b, float p_c) const { +float Animation::_cubic_interpolate(const float &p_pre_a, const float &p_a, const float &p_b, const float &p_post_b, float p_c) const { return _interpolate(p_a, p_b, p_c); } template <class T> T Animation::_interpolate(const Vector<TKey<T>> &p_keys, float p_time, InterpolationType p_interp, bool p_loop_wrap, bool *p_ok) const { - int len = _find(p_keys, length) + 1; // try to find last key (there may be more past the end) if (len <= 0) { // (-1 or -2 returned originally) (plus one above) // meaning no keys, or only key time is larger than length - if (p_ok) + if (p_ok) { *p_ok = false; + } return T(); } else if (len == 1) { // one key found (0+1), return it - if (p_ok) + if (p_ok) { *p_ok = true; + } return p_keys[0].value; } @@ -1746,28 +1613,27 @@ T Animation::_interpolate(const Vector<TKey<T>> &p_keys, float p_time, Interpola if (loop && p_loop_wrap) { // loop if (idx >= 0) { - if ((idx + 1) < len) { - next = idx + 1; float delta = p_keys[next].time - p_keys[idx].time; float from = p_time - p_keys[idx].time; - if (Math::is_zero_approx(delta)) + if (Math::is_zero_approx(delta)) { c = 0; - else + } else { c = from / delta; + } } else { - next = 0; float delta = (length - p_keys[idx].time) + p_keys[next].time; float from = p_time - p_keys[idx].time; - if (Math::is_zero_approx(delta)) + if (Math::is_zero_approx(delta)) { c = 0; - else + } else { c = from / delta; + } } } else { @@ -1775,51 +1641,53 @@ T Animation::_interpolate(const Vector<TKey<T>> &p_keys, float p_time, Interpola idx = len - 1; next = 0; float endtime = (length - p_keys[idx].time); - if (endtime < 0) // may be keys past the end + if (endtime < 0) { // may be keys past the end endtime = 0; + } float delta = endtime + p_keys[next].time; float from = endtime + p_time; - if (Math::is_zero_approx(delta)) + if (Math::is_zero_approx(delta)) { c = 0; - else + } else { c = from / delta; + } } } else { // no loop if (idx >= 0) { - if ((idx + 1) < len) { - next = idx + 1; float delta = p_keys[next].time - p_keys[idx].time; float from = p_time - p_keys[idx].time; - if (Math::is_zero_approx(delta)) + if (Math::is_zero_approx(delta)) { c = 0; - else + } else { c = from / delta; + } } else { - next = idx; } } else { - // only allow extending first key to anim start if looping - if (loop) + if (loop) { idx = next = 0; - else + } else { result = false; + } } } - if (p_ok) + if (p_ok) { *p_ok = result; - if (!result) + } + if (!result) { return T(); + } float tr = p_keys[idx].transition; @@ -1829,27 +1697,25 @@ T Animation::_interpolate(const Vector<TKey<T>> &p_keys, float p_time, Interpola } if (tr != 1.0) { - c = Math::ease(c, tr); } switch (p_interp) { - case INTERPOLATION_NEAREST: { - return p_keys[idx].value; } break; case INTERPOLATION_LINEAR: { - return _interpolate(p_keys[idx].value, p_keys[next].value, c); } break; case INTERPOLATION_CUBIC: { int pre = idx - 1; - if (pre < 0) + if (pre < 0) { pre = 0; + } int post = next + 1; - if (post >= len) + if (post >= len) { post = next; + } return _cubic_interpolate(p_keys[pre].value, p_keys[idx].value, p_keys[next].value, p_keys[post].value, c); @@ -1862,7 +1728,6 @@ T Animation::_interpolate(const Vector<TKey<T>> &p_keys, float p_time, Interpola } Error Animation::transform_track_interpolate(int p_track, float p_time, Vector3 *r_loc, Quat *r_rot, Vector3 *r_scale) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), ERR_INVALID_PARAMETER); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_TRANSFORM, ERR_INVALID_PARAMETER); @@ -1873,23 +1738,26 @@ Error Animation::transform_track_interpolate(int p_track, float p_time, Vector3 TransformKey tk = _interpolate(tt->transforms, p_time, tt->interpolation, tt->loop_wrap, &ok); - if (!ok) + if (!ok) { return ERR_UNAVAILABLE; + } - if (r_loc) + if (r_loc) { *r_loc = tk.loc; + } - if (r_rot) + if (r_rot) { *r_rot = tk.rot; + } - if (r_scale) + if (r_scale) { *r_scale = tk.scale; + } return OK; } Variant Animation::value_track_interpolate(int p_track, float p_time) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), 0); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_VALUE, Variant()); @@ -1900,7 +1768,6 @@ Variant Animation::value_track_interpolate(int p_track, float p_time) const { Variant res = _interpolate(vt->values, p_time, (vt->update_mode == UPDATE_CONTINUOUS || vt->update_mode == UPDATE_CAPTURE) ? vt->interpolation : INTERPOLATION_NEAREST, vt->loop_wrap, &ok); if (ok) { - return res; } @@ -1908,9 +1775,9 @@ Variant Animation::value_track_interpolate(int p_track, float p_time) const { } void Animation::_value_track_get_key_indices_in_range(const ValueTrack *vt, float from_time, float to_time, List<int> *p_indices) const { - - if (from_time != length && to_time == length) + if (from_time != length && to_time == length) { to_time = length * 1.001; //include a little more if at the end + } int to = _find(vt->values, to_time); if (to >= 0 && from_time == to_time && vt->values[to].time == from_time) { @@ -1921,29 +1788,30 @@ void Animation::_value_track_get_key_indices_in_range(const ValueTrack *vt, floa // can't really send the events == time, will be sent in the next frame. // if event>=len then it will probably never be requested by the anim player. - if (to >= 0 && vt->values[to].time >= to_time) + if (to >= 0 && vt->values[to].time >= to_time) { to--; + } - if (to < 0) + if (to < 0) { return; // not bother + } int from = _find(vt->values, from_time); // position in the right first event.+ - if (from < 0 || vt->values[from].time < from_time) + if (from < 0 || vt->values[from].time < from_time) { from++; + } int max = vt->values.size(); for (int i = from; i <= to; i++) { - ERR_CONTINUE(i < 0 || i >= max); // shouldn't happen p_indices->push_back(i); } } void Animation::value_track_get_key_indices(int p_track, float p_time, float p_delta, List<int> *p_indices) const { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_VALUE); @@ -1953,11 +1821,11 @@ void Animation::value_track_get_key_indices(int p_track, float p_time, float p_d float from_time = p_time - p_delta; float to_time = p_time; - if (from_time > to_time) + if (from_time > to_time) { SWAP(from_time, to_time); + } if (loop) { - from_time = Math::fposmod(from_time, length); to_time = Math::fposmod(to_time, length); @@ -1968,23 +1836,25 @@ void Animation::value_track_get_key_indices(int p_track, float p_time, float p_d return; } } else { - - if (from_time < 0) + if (from_time < 0) { from_time = 0; - if (from_time > length) + } + if (from_time > length) { from_time = length; + } - if (to_time < 0) + if (to_time < 0) { to_time = 0; - if (to_time > length) + } + if (to_time > length) { to_time = length; + } } _value_track_get_key_indices_in_range(vt, from_time, to_time, p_indices); } void Animation::value_track_set_update_mode(int p_track, UpdateMode p_mode) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_VALUE); @@ -1995,7 +1865,6 @@ void Animation::value_track_set_update_mode(int p_track, UpdateMode p_mode) { } Animation::UpdateMode Animation::value_track_get_update_mode(int p_track) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), UPDATE_CONTINUOUS); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_VALUE, UPDATE_CONTINUOUS); @@ -2006,97 +1875,93 @@ Animation::UpdateMode Animation::value_track_get_update_mode(int p_track) const template <class T> void Animation::_track_get_key_indices_in_range(const Vector<T> &p_array, float from_time, float to_time, List<int> *p_indices) const { - - if (from_time != length && to_time == length) + if (from_time != length && to_time == length) { to_time = length * 1.01; //include a little more if at the end + } int to = _find(p_array, to_time); // can't really send the events == time, will be sent in the next frame. // if event>=len then it will probably never be requested by the anim player. - if (to >= 0 && p_array[to].time >= to_time) + if (to >= 0 && p_array[to].time >= to_time) { to--; + } - if (to < 0) + if (to < 0) { return; // not bother + } int from = _find(p_array, from_time); // position in the right first event.+ - if (from < 0 || p_array[from].time < from_time) + if (from < 0 || p_array[from].time < from_time) { from++; + } int max = p_array.size(); for (int i = from; i <= to; i++) { - ERR_CONTINUE(i < 0 || i >= max); // shouldn't happen p_indices->push_back(i); } } void Animation::track_get_key_indices_in_range(int p_track, float p_time, float p_delta, List<int> *p_indices) const { - ERR_FAIL_INDEX(p_track, tracks.size()); const Track *t = tracks[p_track]; float from_time = p_time - p_delta; float to_time = p_time; - if (from_time > to_time) + if (from_time > to_time) { SWAP(from_time, to_time); + } if (loop) { - - if (from_time > length || from_time < 0) + if (from_time > length || from_time < 0) { from_time = Math::fposmod(from_time, length); + } - if (to_time > length || to_time < 0) + if (to_time > length || to_time < 0) { to_time = Math::fposmod(to_time, length); + } if (from_time > to_time) { // handle loop by splitting switch (t->type) { - case TYPE_TRANSFORM: { - const TransformTrack *tt = static_cast<const TransformTrack *>(t); _track_get_key_indices_in_range(tt->transforms, from_time, length, p_indices); _track_get_key_indices_in_range(tt->transforms, 0, to_time, p_indices); } break; case TYPE_VALUE: { - const ValueTrack *vt = static_cast<const ValueTrack *>(t); _track_get_key_indices_in_range(vt->values, from_time, length, p_indices); _track_get_key_indices_in_range(vt->values, 0, to_time, p_indices); } break; case TYPE_METHOD: { - const MethodTrack *mt = static_cast<const MethodTrack *>(t); _track_get_key_indices_in_range(mt->methods, from_time, length, p_indices); _track_get_key_indices_in_range(mt->methods, 0, to_time, p_indices); } break; case TYPE_BEZIER: { - const BezierTrack *bz = static_cast<const BezierTrack *>(t); _track_get_key_indices_in_range(bz->values, from_time, length, p_indices); _track_get_key_indices_in_range(bz->values, 0, to_time, p_indices); } break; case TYPE_AUDIO: { - const AudioTrack *ad = static_cast<const AudioTrack *>(t); _track_get_key_indices_in_range(ad->values, from_time, length, p_indices); _track_get_key_indices_in_range(ad->values, 0, to_time, p_indices); } break; case TYPE_ANIMATION: { - const AnimationTrack *an = static_cast<const AnimationTrack *>(t); _track_get_key_indices_in_range(an->values, from_time, length, p_indices); _track_get_key_indices_in_range(an->values, 0, to_time, p_indices); @@ -2106,52 +1971,48 @@ void Animation::track_get_key_indices_in_range(int p_track, float p_time, float return; } } else { - - if (from_time < 0) + if (from_time < 0) { from_time = 0; - if (from_time > length) + } + if (from_time > length) { from_time = length; + } - if (to_time < 0) + if (to_time < 0) { to_time = 0; - if (to_time > length) + } + if (to_time > length) { to_time = length; + } } switch (t->type) { - case TYPE_TRANSFORM: { - const TransformTrack *tt = static_cast<const TransformTrack *>(t); _track_get_key_indices_in_range(tt->transforms, from_time, to_time, p_indices); } break; case TYPE_VALUE: { - const ValueTrack *vt = static_cast<const ValueTrack *>(t); _track_get_key_indices_in_range(vt->values, from_time, to_time, p_indices); } break; case TYPE_METHOD: { - const MethodTrack *mt = static_cast<const MethodTrack *>(t); _track_get_key_indices_in_range(mt->methods, from_time, to_time, p_indices); } break; case TYPE_BEZIER: { - const BezierTrack *bz = static_cast<const BezierTrack *>(t); _track_get_key_indices_in_range(bz->values, from_time, to_time, p_indices); } break; case TYPE_AUDIO: { - const AudioTrack *ad = static_cast<const AudioTrack *>(t); _track_get_key_indices_in_range(ad->values, from_time, to_time, p_indices); } break; case TYPE_ANIMATION: { - const AnimationTrack *an = static_cast<const AnimationTrack *>(t); _track_get_key_indices_in_range(an->values, from_time, to_time, p_indices); @@ -2160,38 +2021,39 @@ void Animation::track_get_key_indices_in_range(int p_track, float p_time, float } void Animation::_method_track_get_key_indices_in_range(const MethodTrack *mt, float from_time, float to_time, List<int> *p_indices) const { - - if (from_time != length && to_time == length) + if (from_time != length && to_time == length) { to_time = length * 1.01; //include a little more if at the end + } int to = _find(mt->methods, to_time); // can't really send the events == time, will be sent in the next frame. // if event>=len then it will probably never be requested by the anim player. - if (to >= 0 && mt->methods[to].time >= to_time) + if (to >= 0 && mt->methods[to].time >= to_time) { to--; + } - if (to < 0) + if (to < 0) { return; // not bother + } int from = _find(mt->methods, from_time); // position in the right first event.+ - if (from < 0 || mt->methods[from].time < from_time) + if (from < 0 || mt->methods[from].time < from_time) { from++; + } int max = mt->methods.size(); for (int i = from; i <= to; i++) { - ERR_CONTINUE(i < 0 || i >= max); // shouldn't happen p_indices->push_back(i); } } void Animation::method_track_get_key_indices(int p_track, float p_time, float p_delta, List<int> *p_indices) const { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_METHOD); @@ -2201,16 +2063,18 @@ void Animation::method_track_get_key_indices(int p_track, float p_time, float p_ float from_time = p_time - p_delta; float to_time = p_time; - if (from_time > to_time) + if (from_time > to_time) { SWAP(from_time, to_time); + } if (loop) { - - if (from_time > length || from_time < 0) + if (from_time > length || from_time < 0) { from_time = Math::fposmod(from_time, length); + } - if (to_time > length || to_time < 0) + if (to_time > length || to_time < 0) { to_time = Math::fposmod(to_time, length); + } if (from_time > to_time) { // handle loop by splitting @@ -2219,22 +2083,25 @@ void Animation::method_track_get_key_indices(int p_track, float p_time, float p_ return; } } else { - - if (from_time < 0) + if (from_time < 0) { from_time = 0; - if (from_time > length) + } + if (from_time > length) { from_time = length; + } - if (to_time < 0) + if (to_time < 0) { to_time = 0; - if (to_time > length) + } + if (to_time > length) { to_time = length; + } } _method_track_get_key_indices_in_range(mt, from_time, to_time, p_indices); } -Vector<Variant> Animation::method_track_get_params(int p_track, int p_key_idx) const { +Vector<Variant> Animation::method_track_get_params(int p_track, int p_key_idx) const { ERR_FAIL_INDEX_V(p_track, tracks.size(), Vector<Variant>()); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_METHOD, Vector<Variant>()); @@ -2247,8 +2114,8 @@ Vector<Variant> Animation::method_track_get_params(int p_track, int p_key_idx) c return mk.params; } -StringName Animation::method_track_get_name(int p_track, int p_key_idx) const { +StringName Animation::method_track_get_name(int p_track, int p_key_idx) const { ERR_FAIL_INDEX_V(p_track, tracks.size(), StringName()); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_METHOD, StringName()); @@ -2261,7 +2128,6 @@ StringName Animation::method_track_get_name(int p_track, int p_key_idx) const { } int Animation::bezier_track_insert_key(int p_track, float p_time, float p_value, const Vector2 &p_in_handle, const Vector2 &p_out_handle) { - ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_BEZIER, -1); @@ -2288,7 +2154,6 @@ int Animation::bezier_track_insert_key(int p_track, float p_time, float p_value, } void Animation::bezier_track_set_key_value(int p_track, int p_index, float p_value) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_BEZIER); @@ -2302,7 +2167,6 @@ void Animation::bezier_track_set_key_value(int p_track, int p_index, float p_val } void Animation::bezier_track_set_key_in_handle(int p_track, int p_index, const Vector2 &p_handle) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_BEZIER); @@ -2317,8 +2181,8 @@ void Animation::bezier_track_set_key_in_handle(int p_track, int p_index, const V } emit_changed(); } -void Animation::bezier_track_set_key_out_handle(int p_track, int p_index, const Vector2 &p_handle) { +void Animation::bezier_track_set_key_out_handle(int p_track, int p_index, const Vector2 &p_handle) { ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_BEZIER); @@ -2333,8 +2197,8 @@ void Animation::bezier_track_set_key_out_handle(int p_track, int p_index, const } emit_changed(); } -float Animation::bezier_track_get_key_value(int p_track, int p_index) const { +float Animation::bezier_track_get_key_value(int p_track, int p_index) const { ERR_FAIL_INDEX_V(p_track, tracks.size(), 0); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_BEZIER, 0); @@ -2345,8 +2209,8 @@ float Animation::bezier_track_get_key_value(int p_track, int p_index) const { return bt->values[p_index].value.value; } -Vector2 Animation::bezier_track_get_key_in_handle(int p_track, int p_index) const { +Vector2 Animation::bezier_track_get_key_in_handle(int p_track, int p_index) const { ERR_FAIL_INDEX_V(p_track, tracks.size(), Vector2()); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_BEZIER, Vector2()); @@ -2357,8 +2221,8 @@ Vector2 Animation::bezier_track_get_key_in_handle(int p_track, int p_index) cons return bt->values[p_index].value.in_handle; } -Vector2 Animation::bezier_track_get_key_out_handle(int p_track, int p_index) const { +Vector2 Animation::bezier_track_get_key_out_handle(int p_track, int p_index) const { ERR_FAIL_INDEX_V(p_track, tracks.size(), Vector2()); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_BEZIER, Vector2()); @@ -2428,7 +2292,6 @@ float Animation::bezier_track_interpolate(int p_track, float p_time) const { //narrow high and low as much as possible for (int i = 0; i < iterations; i++) { - middle = (low + high) / 2; Vector2 interp = _bezier_interp(middle, start, start_out, end_in, end); @@ -2449,7 +2312,6 @@ float Animation::bezier_track_interpolate(int p_track, float p_time) const { } int Animation::audio_track_insert_key(int p_track, float p_time, const RES &p_stream, float p_start_offset, float p_end_offset) { - ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_AUDIO, -1); @@ -2460,11 +2322,13 @@ int Animation::audio_track_insert_key(int p_track, float p_time, const RES &p_st k.time = p_time; k.value.stream = p_stream; k.value.start_offset = p_start_offset; - if (k.value.start_offset < 0) + if (k.value.start_offset < 0) { k.value.start_offset = 0; + } k.value.end_offset = p_end_offset; - if (k.value.end_offset < 0) + if (k.value.end_offset < 0) { k.value.end_offset = 0; + } int key = _insert(p_time, at->values, k); @@ -2474,7 +2338,6 @@ int Animation::audio_track_insert_key(int p_track, float p_time, const RES &p_st } void Animation::audio_track_set_key_stream(int p_track, int p_key, const RES &p_stream) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_AUDIO); @@ -2489,7 +2352,6 @@ void Animation::audio_track_set_key_stream(int p_track, int p_key, const RES &p_ } void Animation::audio_track_set_key_start_offset(int p_track, int p_key, float p_offset) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_AUDIO); @@ -2498,8 +2360,9 @@ void Animation::audio_track_set_key_start_offset(int p_track, int p_key, float p ERR_FAIL_INDEX(p_key, at->values.size()); - if (p_offset < 0) + if (p_offset < 0) { p_offset = 0; + } at->values.write[p_key].value.start_offset = p_offset; @@ -2507,7 +2370,6 @@ void Animation::audio_track_set_key_start_offset(int p_track, int p_key, float p } void Animation::audio_track_set_key_end_offset(int p_track, int p_key, float p_offset) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_AUDIO); @@ -2516,8 +2378,9 @@ void Animation::audio_track_set_key_end_offset(int p_track, int p_key, float p_o ERR_FAIL_INDEX(p_key, at->values.size()); - if (p_offset < 0) + if (p_offset < 0) { p_offset = 0; + } at->values.write[p_key].value.end_offset = p_offset; @@ -2525,7 +2388,6 @@ void Animation::audio_track_set_key_end_offset(int p_track, int p_key, float p_o } RES Animation::audio_track_get_key_stream(int p_track, int p_key) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), RES()); const Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_AUDIO, RES()); @@ -2536,8 +2398,8 @@ RES Animation::audio_track_get_key_stream(int p_track, int p_key) const { return at->values[p_key].value.stream; } -float Animation::audio_track_get_key_start_offset(int p_track, int p_key) const { +float Animation::audio_track_get_key_start_offset(int p_track, int p_key) const { ERR_FAIL_INDEX_V(p_track, tracks.size(), 0); const Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_AUDIO, 0); @@ -2548,8 +2410,8 @@ float Animation::audio_track_get_key_start_offset(int p_track, int p_key) const return at->values[p_key].value.start_offset; } -float Animation::audio_track_get_key_end_offset(int p_track, int p_key) const { +float Animation::audio_track_get_key_end_offset(int p_track, int p_key) const { ERR_FAIL_INDEX_V(p_track, tracks.size(), 0); const Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_AUDIO, 0); @@ -2564,7 +2426,6 @@ float Animation::audio_track_get_key_end_offset(int p_track, int p_key) const { // int Animation::animation_track_insert_key(int p_track, float p_time, const StringName &p_animation) { - ERR_FAIL_INDEX_V(p_track, tracks.size(), -1); Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_ANIMATION, -1); @@ -2583,7 +2444,6 @@ int Animation::animation_track_insert_key(int p_track, float p_time, const Strin } void Animation::animation_track_set_key_animation(int p_track, int p_key, const StringName &p_animation) { - ERR_FAIL_INDEX(p_track, tracks.size()); Track *t = tracks[p_track]; ERR_FAIL_COND(t->type != TYPE_ANIMATION); @@ -2598,7 +2458,6 @@ void Animation::animation_track_set_key_animation(int p_track, int p_key, const } StringName Animation::animation_track_get_key_animation(int p_track, int p_key) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), StringName()); const Track *t = tracks[p_track]; ERR_FAIL_COND_V(t->type != TYPE_ANIMATION, StringName()); @@ -2611,57 +2470,49 @@ StringName Animation::animation_track_get_key_animation(int p_track, int p_key) } void Animation::set_length(float p_length) { - if (p_length < ANIM_MIN_LENGTH) { p_length = ANIM_MIN_LENGTH; } length = p_length; emit_changed(); } -float Animation::get_length() const { +float Animation::get_length() const { return length; } void Animation::set_loop(bool p_enabled) { - loop = p_enabled; emit_changed(); } -bool Animation::has_loop() const { +bool Animation::has_loop() const { return loop; } void Animation::track_set_imported(int p_track, bool p_imported) { - ERR_FAIL_INDEX(p_track, tracks.size()); tracks[p_track]->imported = p_imported; } bool Animation::track_is_imported(int p_track) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), false); return tracks[p_track]->imported; } void Animation::track_set_enabled(int p_track, bool p_enabled) { - ERR_FAIL_INDEX(p_track, tracks.size()); tracks[p_track]->enabled = p_enabled; emit_changed(); } bool Animation::track_is_enabled(int p_track) const { - ERR_FAIL_INDEX_V(p_track, tracks.size(), false); return tracks[p_track]->enabled; } void Animation::track_move_up(int p_track) { - if (p_track >= 0 && p_track < (tracks.size() - 1)) { - SWAP(tracks.write[p_track], tracks.write[p_track + 1]); } @@ -2670,9 +2521,7 @@ void Animation::track_move_up(int p_track) { } void Animation::track_move_down(int p_track) { - if (p_track > 0 && p_track < tracks.size()) { - SWAP(tracks.write[p_track], tracks.write[p_track - 1]); } @@ -2681,11 +2530,11 @@ void Animation::track_move_down(int p_track) { } void Animation::track_move_to(int p_track, int p_to_index) { - ERR_FAIL_INDEX(p_track, tracks.size()); ERR_FAIL_INDEX(p_to_index, tracks.size() + 1); - if (p_track == p_to_index || p_track == p_to_index - 1) + if (p_track == p_to_index || p_track == p_to_index - 1) { return; + } Track *track = tracks.get(p_track); tracks.remove(p_track); @@ -2697,11 +2546,11 @@ void Animation::track_move_to(int p_track, int p_to_index) { } void Animation::track_swap(int p_track, int p_with_track) { - ERR_FAIL_INDEX(p_track, tracks.size()); ERR_FAIL_INDEX(p_with_track, tracks.size()); - if (p_track == p_with_track) + if (p_track == p_with_track) { return; + } SWAP(tracks.write[p_track], tracks.write[p_with_track]); emit_changed(); @@ -2709,13 +2558,11 @@ void Animation::track_swap(int p_track, int p_with_track) { } void Animation::set_step(float p_step) { - step = p_step; emit_changed(); } float Animation::get_step() const { - return step; } @@ -2737,7 +2584,6 @@ void Animation::copy_track(int p_track, Ref<Animation> p_to_animation) { } void Animation::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_track", "type", "at_position"), &Animation::add_track, DEFVAL(-1)); ClassDB::bind_method(D_METHOD("remove_track", "track_idx"), &Animation::remove_track); ClassDB::bind_method(D_METHOD("get_track_count"), &Animation::get_track_count); @@ -2847,9 +2693,9 @@ void Animation::_bind_methods() { } void Animation::clear() { - - for (int i = 0; i < tracks.size(); i++) + for (int i = 0; i < tracks.size(); i++) { memdelete(tracks[i]); + } tracks.clear(); loop = false; length = 1; @@ -2858,7 +2704,6 @@ void Animation::clear() { } bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, const TKey<TransformKey> &t1, const TKey<TransformKey> &t2, float p_alowed_linear_err, float p_alowed_angular_err, float p_max_optimizable_angle, const Vector3 &p_norm) { - real_t c = (t1.time - t0.time) / (t2.time - t0.time); real_t t[3] = { -1, -1, -1 }; @@ -2876,7 +2721,6 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons } } else { - Vector3 pd = (v2 - v0); float d0 = pd.dot(v0); float d1 = pd.dot(v1); @@ -2892,8 +2736,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons return false; //beyond allowed error for colinearity } - if (p_norm != Vector3() && Math::acos(pd.normalized().dot(p_norm)) > p_alowed_angular_err) + if (p_norm != Vector3() && Math::acos(pd.normalized().dot(p_norm)) > p_alowed_angular_err) { return false; + } t[0] = (d1 - d0) / (d2 - d0); } @@ -2908,12 +2753,11 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons //localize both to rotation from q0 if (q0.is_equal_approx(q2)) { - - if (!q0.is_equal_approx(q1)) + if (!q0.is_equal_approx(q1)) { return false; + } } else { - Quat r02 = (q0.inverse() * q2).normalized(); Quat r01 = (q0.inverse() * q1).normalized(); @@ -2923,8 +2767,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons r02.get_axis_angle(v02, a02); r01.get_axis_angle(v01, a01); - if (Math::abs(a02) > p_max_optimizable_angle) + if (Math::abs(a02) > p_max_optimizable_angle) { return false; + } if (v01.dot(v02) < 0) { //make sure both rotations go the same way to compare @@ -2944,8 +2789,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons } real_t tr = a01 / a02; - if (tr < 0 || tr > 1) + if (tr < 0 || tr > 1) { return false; //rotating too much or too less + } t[1] = tr; } @@ -2965,7 +2811,6 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons } } else { - Vector3 pd = (v2 - v0); float d0 = pd.dot(v0); float d1 = pd.dot(v1); @@ -2987,10 +2832,8 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons bool erase = false; if (t[0] == -1 && t[1] == -1 && t[2] == -1) { - erase = true; } else { - erase = true; real_t lt = -1; for (int j = 0; j < 3; j++) { @@ -2999,8 +2842,9 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons lt = t[j]; //official t //validate rest for (int k = j + 1; k < 3; k++) { - if (t[k] == -1) + if (t[k] == -1) { continue; + } if (Math::abs(lt - t[k]) > p_alowed_linear_err) { erase = false; @@ -3014,7 +2858,6 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons ERR_FAIL_COND_V(lt == -1, false); if (erase) { - if (Math::abs(lt - c) > p_alowed_linear_err) { //todo, evaluate changing the transition if this fails? //this could be done as a second pass and would be @@ -3028,7 +2871,6 @@ bool Animation::_transform_track_optimize_key(const TKey<TransformKey> &t0, cons } void Animation::_transform_track_optimize(int p_idx, float p_allowed_linear_err, float p_allowed_angular_err, float p_max_optimizable_angle) { - ERR_FAIL_INDEX(p_idx, tracks.size()); ERR_FAIL_COND(tracks[p_idx]->type != TYPE_TRANSFORM); TransformTrack *tt = static_cast<TransformTrack *>(tracks[p_idx]); @@ -3038,7 +2880,6 @@ void Animation::_transform_track_optimize(int p_idx, float p_allowed_linear_err, Vector3 norm; for (int i = 1; i < tt->transforms.size() - 1; i++) { - TKey<TransformKey> &t0 = tt->transforms.write[i - 1]; TKey<TransformKey> &t1 = tt->transforms.write[i]; TKey<TransformKey> &t2 = tt->transforms.write[i + 1]; @@ -3054,7 +2895,6 @@ void Animation::_transform_track_optimize(int p_idx, float p_allowed_linear_err, } if (erase) { - if (!prev_erased) { first_erased = t1; prev_erased = true; @@ -3071,23 +2911,21 @@ void Animation::_transform_track_optimize(int p_idx, float p_allowed_linear_err, } void Animation::optimize(float p_allowed_linear_err, float p_allowed_angular_err, float p_max_optimizable_angle) { - for (int i = 0; i < tracks.size(); i++) { - - if (tracks[i]->type == TYPE_TRANSFORM) + if (tracks[i]->type == TYPE_TRANSFORM) { _transform_track_optimize(i, p_allowed_linear_err, p_allowed_angular_err, p_max_optimizable_angle); + } } } Animation::Animation() { - step = 0.1; loop = false; length = 1; } Animation::~Animation() { - - for (int i = 0; i < tracks.size(); i++) + for (int i = 0; i < tracks.size(); i++) { memdelete(tracks[i]); + } } diff --git a/scene/resources/animation.h b/scene/resources/animation.h index e4e5177a8c..722a400fd6 100644 --- a/scene/resources/animation.h +++ b/scene/resources/animation.h @@ -34,7 +34,6 @@ #include "core/resource.h" class Animation : public Resource { - GDCLASS(Animation, Resource); RES_BASE_EXTENSION("anim"); @@ -64,7 +63,6 @@ public: private: struct Track { - TrackType type; InterpolationType interpolation; bool loop_wrap; @@ -81,7 +79,6 @@ private: }; struct Key { - float transition; float time; // time in secs Key() { @@ -93,12 +90,10 @@ private: // transform key holds either Vector3 or Quaternion template <class T> struct TKey : public Key { - T value; }; struct TransformKey { - Vector3 loc; Quat rot; Vector3 scale; @@ -107,7 +102,6 @@ private: /* TRANSFORM TRACK */ struct TransformTrack : public Track { - Vector<TKey<TransformKey>> transforms; TransformTrack() { type = TYPE_TRANSFORM; } @@ -116,7 +110,6 @@ private: /* PROPERTY VALUE TRACK */ struct ValueTrack : public Track { - UpdateMode update_mode; bool update_on_seek; Vector<TKey<Variant>> values; @@ -130,13 +123,11 @@ private: /* METHOD TRACK */ struct MethodKey : public Key { - StringName method; Vector<Variant> params; }; struct MethodTrack : public Track { - Vector<MethodKey> methods; MethodTrack() { type = TYPE_METHOD; } }; @@ -150,7 +141,6 @@ private: }; struct BezierTrack : public Track { - Vector<TKey<BezierKey>> values; BezierTrack() { @@ -171,7 +161,6 @@ private: }; struct AudioTrack : public Track { - Vector<TKey<AudioKey>> values; AudioTrack() { @@ -182,7 +171,6 @@ private: /* AUDIO TRACK */ struct AnimationTrack : public Track { - Vector<TKey<StringName>> values; AnimationTrack() { @@ -246,25 +234,21 @@ private: } Vector<int> _value_track_get_key_indices(int p_track, float p_time, float p_delta) const { - List<int> idxs; value_track_get_key_indices(p_track, p_time, p_delta, &idxs); Vector<int> idxr; for (List<int>::Element *E = idxs.front(); E; E = E->next()) { - idxr.push_back(E->get()); } return idxr; } Vector<int> _method_track_get_key_indices(int p_track, float p_time, float p_delta) const { - List<int> idxs; method_track_get_key_indices(p_track, p_time, p_delta, &idxs); Vector<int> idxr; for (List<int>::Element *E = idxs.front(); E; E = E->next()) { - idxr.push_back(E->get()); } return idxr; diff --git a/scene/resources/audio_stream_sample.cpp b/scene/resources/audio_stream_sample.cpp index fdf5e2c2d0..f02e7987a9 100644 --- a/scene/resources/audio_stream_sample.cpp +++ b/scene/resources/audio_stream_sample.cpp @@ -34,7 +34,6 @@ #include "core/os/file_access.h" void AudioStreamPlaybackSample::start(float p_from_pos) { - if (base->format == AudioStreamSample::FORMAT_IMA_ADPCM) { //no seeking in IMA_ADPCM for (int i = 0; i < 2; i++) { @@ -57,28 +56,25 @@ void AudioStreamPlaybackSample::start(float p_from_pos) { } void AudioStreamPlaybackSample::stop() { - active = false; } bool AudioStreamPlaybackSample::is_playing() const { - return active; } int AudioStreamPlaybackSample::get_loop_count() const { - return 0; } float AudioStreamPlaybackSample::get_playback_position() const { - return float(offset >> MIX_FRAC_BITS) / base->mix_rate; } -void AudioStreamPlaybackSample::seek(float p_time) { - if (base->format == AudioStreamSample::FORMAT_IMA_ADPCM) +void AudioStreamPlaybackSample::seek(float p_time) { + if (base->format == AudioStreamSample::FORMAT_IMA_ADPCM) { return; //no seeking in ima-adpcm + } float max = base->get_length(); if (p_time < 0) { @@ -92,22 +88,20 @@ void AudioStreamPlaybackSample::seek(float p_time) { template <class Depth, bool is_stereo, bool is_ima_adpcm> void AudioStreamPlaybackSample::do_resample(const Depth *p_src, AudioFrame *p_dst, int64_t &offset, int32_t &increment, uint32_t amount, IMA_ADPCM_State *ima_adpcm) { - // this function will be compiled branchless by any decent compiler int32_t final, final_r, next, next_r; while (amount) { amount--; int64_t pos = offset >> MIX_FRAC_BITS; - if (is_stereo && !is_ima_adpcm) + if (is_stereo && !is_ima_adpcm) { pos <<= 1; + } if (is_ima_adpcm) { - int64_t sample_pos = pos + ima_adpcm[0].window_ofs; while (sample_pos > ima_adpcm[0].last_nibble) { - static const int16_t _ima_adpcm_step_table[89] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, @@ -126,7 +120,6 @@ void AudioStreamPlaybackSample::do_resample(const Depth *p_src, AudioFrame *p_ds }; for (int i = 0; i < (is_stereo ? 2 : 1); i++) { - int16_t nibble, diff, step; ima_adpcm[i].last_nibble++; @@ -138,30 +131,36 @@ void AudioStreamPlaybackSample::do_resample(const Depth *p_src, AudioFrame *p_ds step = _ima_adpcm_step_table[ima_adpcm[i].step_index]; ima_adpcm[i].step_index += _ima_adpcm_index_table[nibble]; - if (ima_adpcm[i].step_index < 0) + if (ima_adpcm[i].step_index < 0) { ima_adpcm[i].step_index = 0; - if (ima_adpcm[i].step_index > 88) + } + if (ima_adpcm[i].step_index > 88) { ima_adpcm[i].step_index = 88; + } diff = step >> 3; - if (nibble & 1) + if (nibble & 1) { diff += step >> 2; - if (nibble & 2) + } + if (nibble & 2) { diff += step >> 1; - if (nibble & 4) + } + if (nibble & 4) { diff += step; - if (nibble & 8) + } + if (nibble & 8) { diff = -diff; + } ima_adpcm[i].predictor += diff; - if (ima_adpcm[i].predictor < -0x8000) + if (ima_adpcm[i].predictor < -0x8000) { ima_adpcm[i].predictor = -0x8000; - else if (ima_adpcm[i].predictor > 0x7FFF) + } else if (ima_adpcm[i].predictor > 0x7FFF) { ima_adpcm[i].predictor = 0x7FFF; + } /* store loop if there */ if (ima_adpcm[i].last_nibble == ima_adpcm[i].loop_pos) { - ima_adpcm[i].loop_step_index = ima_adpcm[i].step_index; ima_adpcm[i].loop_predictor = ima_adpcm[i].predictor; } @@ -177,17 +176,18 @@ void AudioStreamPlaybackSample::do_resample(const Depth *p_src, AudioFrame *p_ds } else { final = p_src[pos]; - if (is_stereo) + if (is_stereo) { final_r = p_src[pos + 1]; + } if (sizeof(Depth) == 1) { /* conditions will not exist anymore when compiled! */ final <<= 8; - if (is_stereo) + if (is_stereo) { final_r <<= 8; + } } if (is_stereo) { - next = p_src[pos + 2]; next_r = p_src[pos + 3]; } else { @@ -196,15 +196,17 @@ void AudioStreamPlaybackSample::do_resample(const Depth *p_src, AudioFrame *p_ds if (sizeof(Depth) == 1) { next <<= 8; - if (is_stereo) + if (is_stereo) { next_r <<= 8; + } } int32_t frac = int64_t(offset & MIX_FRAC_MASK); final = final + ((next - final) * frac >> MIX_FRAC_BITS); - if (is_stereo) + if (is_stereo) { final_r = final_r + ((next_r - final_r) * frac >> MIX_FRAC_BITS); + } } if (!is_stereo) { @@ -220,7 +222,6 @@ void AudioStreamPlaybackSample::do_resample(const Depth *p_src, AudioFrame *p_ds } void AudioStreamPlaybackSample::mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) { - if (!base->data || !active) { for (int i = 0; i < p_frames; i++) { p_buffer[i] = AudioFrame(0, 0); @@ -279,7 +280,6 @@ void AudioStreamPlaybackSample::mix(AudioFrame *p_buffer, float p_rate_scale, in AudioFrame *dst_buff = p_buffer; if (format == AudioStreamSample::FORMAT_IMA_ADPCM) { - if (loop_format != AudioStreamSample::LOOP_DISABLED) { ima_adpcm[0].loop_pos = loop_begin_fp >> MIX_FRAC_BITS; ima_adpcm[1].loop_pos = loop_begin_fp >> MIX_FRAC_BITS; @@ -288,7 +288,6 @@ void AudioStreamPlaybackSample::mix(AudioFrame *p_buffer, float p_rate_scale, in } while (todo > 0) { - int64_t limit = 0; int32_t target = 0, aux = 0; @@ -311,7 +310,6 @@ void AudioStreamPlaybackSample::mix(AudioFrame *p_buffer, float p_rate_scale, in } else { /* check for sample not reaching beginning */ if (offset < 0) { - active = false; break; } @@ -343,7 +341,6 @@ void AudioStreamPlaybackSample::mix(AudioFrame *p_buffer, float p_rate_scale, in } else { /* no loop, check for end of sample */ if (offset >= length_fp) { - active = false; break; } @@ -369,24 +366,26 @@ void AudioStreamPlaybackSample::mix(AudioFrame *p_buffer, float p_rate_scale, in switch (base->format) { case AudioStreamSample::FORMAT_8_BITS: { - - if (is_stereo) + if (is_stereo) { do_resample<int8_t, true, false>((int8_t *)data, dst_buff, offset, increment, target, ima_adpcm); - else + } else { do_resample<int8_t, false, false>((int8_t *)data, dst_buff, offset, increment, target, ima_adpcm); + } } break; case AudioStreamSample::FORMAT_16_BITS: { - if (is_stereo) + if (is_stereo) { do_resample<int16_t, true, false>((int16_t *)data, dst_buff, offset, increment, target, ima_adpcm); - else + } else { do_resample<int16_t, false, false>((int16_t *)data, dst_buff, offset, increment, target, ima_adpcm); + } } break; case AudioStreamSample::FORMAT_IMA_ADPCM: { - if (is_stereo) + if (is_stereo) { do_resample<int8_t, true, true>((int8_t *)data, dst_buff, offset, increment, target, ima_adpcm); - else + } else { do_resample<int8_t, false, true>((int8_t *)data, dst_buff, offset, increment, target, ima_adpcm); + } } break; } @@ -404,7 +403,6 @@ void AudioStreamPlaybackSample::mix(AudioFrame *p_buffer, float p_rate_scale, in } AudioStreamPlaybackSample::AudioStreamPlaybackSample() { - active = false; offset = 0; sign = 1; @@ -413,62 +411,55 @@ AudioStreamPlaybackSample::AudioStreamPlaybackSample() { ///////////////////// void AudioStreamSample::set_format(Format p_format) { - format = p_format; } AudioStreamSample::Format AudioStreamSample::get_format() const { - return format; } void AudioStreamSample::set_loop_mode(LoopMode p_loop_mode) { - loop_mode = p_loop_mode; } -AudioStreamSample::LoopMode AudioStreamSample::get_loop_mode() const { +AudioStreamSample::LoopMode AudioStreamSample::get_loop_mode() const { return loop_mode; } void AudioStreamSample::set_loop_begin(int p_frame) { - loop_begin = p_frame; } -int AudioStreamSample::get_loop_begin() const { +int AudioStreamSample::get_loop_begin() const { return loop_begin; } void AudioStreamSample::set_loop_end(int p_frame) { - loop_end = p_frame; } -int AudioStreamSample::get_loop_end() const { +int AudioStreamSample::get_loop_end() const { return loop_end; } void AudioStreamSample::set_mix_rate(int p_hz) { - ERR_FAIL_COND(p_hz == 0); mix_rate = p_hz; } -int AudioStreamSample::get_mix_rate() const { +int AudioStreamSample::get_mix_rate() const { return mix_rate; } -void AudioStreamSample::set_stereo(bool p_enable) { +void AudioStreamSample::set_stereo(bool p_enable) { stereo = p_enable; } -bool AudioStreamSample::is_stereo() const { +bool AudioStreamSample::is_stereo() const { return stereo; } float AudioStreamSample::get_length() const { - int len = data_bytes; switch (format) { case AudioStreamSample::FORMAT_8_BITS: @@ -490,7 +481,6 @@ float AudioStreamSample::get_length() const { } void AudioStreamSample::set_data(const Vector<uint8_t> &p_data) { - AudioServer::get_singleton()->lock(); if (data) { memfree(data); @@ -500,7 +490,6 @@ void AudioStreamSample::set_data(const Vector<uint8_t> &p_data) { int datalen = p_data.size(); if (datalen) { - const uint8_t *r = p_data.ptr(); int alloc_len = datalen + DATA_PAD * 2; data = memalloc(alloc_len); //alloc with some padding for interpolation @@ -512,14 +501,13 @@ void AudioStreamSample::set_data(const Vector<uint8_t> &p_data) { AudioServer::get_singleton()->unlock(); } -Vector<uint8_t> AudioStreamSample::get_data() const { +Vector<uint8_t> AudioStreamSample::get_data() const { Vector<uint8_t> pv; if (data) { pv.resize(data_bytes); { - uint8_t *w = pv.ptrw(); uint8_t *dataptr = (uint8_t *)data; copymem(w, dataptr + DATA_PAD, data_bytes); @@ -610,7 +598,6 @@ Error AudioStreamSample::save_to_wav(const String &p_path) { } Ref<AudioStreamPlayback> AudioStreamSample::instance_playback() { - Ref<AudioStreamPlaybackSample> sample; sample.instance(); sample->base = Ref<AudioStreamSample>(this); @@ -618,12 +605,10 @@ Ref<AudioStreamPlayback> AudioStreamSample::instance_playback() { } String AudioStreamSample::get_stream_name() const { - return ""; } void AudioStreamSample::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_data", "data"), &AudioStreamSample::set_data); ClassDB::bind_method(D_METHOD("get_data"), &AudioStreamSample::get_data); diff --git a/scene/resources/audio_stream_sample.h b/scene/resources/audio_stream_sample.h index 0b46bc1c75..2bd358117c 100644 --- a/scene/resources/audio_stream_sample.h +++ b/scene/resources/audio_stream_sample.h @@ -36,7 +36,6 @@ class AudioStreamSample; class AudioStreamPlaybackSample : public AudioStreamPlayback { - GDCLASS(AudioStreamPlaybackSample, AudioStreamPlayback); enum { MIX_FRAC_BITS = 13, @@ -45,7 +44,6 @@ class AudioStreamPlaybackSample : public AudioStreamPlayback { }; struct IMA_ADPCM_State { - int16_t step_index; int32_t predictor; /* values at loop point */ diff --git a/scene/resources/bit_map.cpp b/scene/resources/bit_map.cpp index d45f36dfd1..10f0de8ff8 100644 --- a/scene/resources/bit_map.cpp +++ b/scene/resources/bit_map.cpp @@ -33,7 +33,6 @@ #include "core/io/image_loader.h" void BitMap::create(const Size2 &p_size) { - ERR_FAIL_COND(p_size.width < 1); ERR_FAIL_COND(p_size.height < 1); @@ -44,7 +43,6 @@ void BitMap::create(const Size2 &p_size) { } void BitMap::create_from_image_alpha(const Ref<Image> &p_image, float p_threshold) { - ERR_FAIL_COND(p_image.is_null() || p_image->empty()); Ref<Image> img = p_image->duplicate(); img->convert(Image::FORMAT_LA8); @@ -56,7 +54,6 @@ void BitMap::create_from_image_alpha(const Ref<Image> &p_image, float p_threshol uint8_t *w = bitmask.ptrw(); for (int i = 0; i < width * height; i++) { - int bbyte = i / 8; int bbit = i % 8; if (r[i * 2 + 1] / 255.0 > p_threshold) { @@ -66,24 +63,22 @@ void BitMap::create_from_image_alpha(const Ref<Image> &p_image, float p_threshol } void BitMap::set_bit_rect(const Rect2 &p_rect, bool p_value) { - Rect2i current = Rect2i(0, 0, width, height).clip(p_rect); uint8_t *data = bitmask.ptrw(); for (int i = current.position.x; i < current.position.x + current.size.x; i++) { - for (int j = current.position.y; j < current.position.y + current.size.y; j++) { - int ofs = width * j + i; int bbyte = ofs / 8; int bbit = ofs % 8; uint8_t b = data[bbyte]; - if (p_value) + if (p_value) { b |= (1 << bbit); - else + } else { b &= ~(1 << bbit); + } data[bbyte] = b; } @@ -91,7 +86,6 @@ void BitMap::set_bit_rect(const Rect2 &p_rect, bool p_value) { } int BitMap::get_true_bit_count() const { - int ds = bitmask.size(); const uint8_t *d = bitmask.ptr(); int c = 0; @@ -99,7 +93,6 @@ int BitMap::get_true_bit_count() const { //fast, almost branchless version for (int i = 0; i < ds; i++) { - c += (d[i] & (1 << 7)) >> 7; c += (d[i] & (1 << 6)) >> 6; c += (d[i] & (1 << 5)) >> 5; @@ -114,7 +107,6 @@ int BitMap::get_true_bit_count() const { } void BitMap::set_bit(const Point2 &p_pos, bool p_value) { - int x = p_pos.x; int y = p_pos.y; @@ -127,16 +119,16 @@ void BitMap::set_bit(const Point2 &p_pos, bool p_value) { uint8_t b = bitmask[bbyte]; - if (p_value) + if (p_value) { b |= (1 << bbit); - else + } else { b &= ~(1 << bbit); + } bitmask.write[bbyte] = b; } bool BitMap::get_bit(const Point2 &p_pos) const { - int x = Math::fast_ftoi(p_pos.x); int y = Math::fast_ftoi(p_pos.y); ERR_FAIL_INDEX_V(x, width, false); @@ -150,12 +142,10 @@ bool BitMap::get_bit(const Point2 &p_pos) const { } Size2 BitMap::get_size() const { - return Size2(width, height); } void BitMap::_set_data(const Dictionary &p_d) { - ERR_FAIL_COND(!p_d.has("size")); ERR_FAIL_COND(!p_d.has("data")); @@ -164,7 +154,6 @@ void BitMap::_set_data(const Dictionary &p_d) { } Dictionary BitMap::_get_data() const { - Dictionary d; d["size"] = get_size(); d["data"] = bitmask; @@ -172,7 +161,6 @@ Dictionary BitMap::_get_data() const { } Vector<Vector2> BitMap::_march_square(const Rect2i &rect, const Point2i &start) const { - int stepx = 0; int stepy = 0; int prevx = 0; @@ -209,7 +197,6 @@ Vector<Vector2> BitMap::_march_square(const Rect2i &rect, const Point2i &start) } switch (sv) { - case 1: case 5: case 13: @@ -354,8 +341,9 @@ static float perpendicular_distance(const Vector2 &i, const Vector2 &start, cons } static Vector<Vector2> rdp(const Vector<Vector2> &v, float optimization) { - if (v.size() < 3) + if (v.size() < 3) { return v; + } int index = -1; float dist = 0; @@ -368,7 +356,6 @@ static Vector<Vector2> rdp(const Vector<Vector2> &v, float optimization) { } } if (dist > optimization) { - Vector<Vector2> left, right; left.resize(index); for (int i = 0; i < index; i++) { @@ -424,7 +411,6 @@ struct FillBitsStackEntry { }; static void fill_bits(const BitMap *p_src, Ref<BitMap> &p_map, const Point2i &p_pos, const Rect2i &rect) { - // Using a custom stack to work iteratively to avoid stack overflow on big bitmaps Vector<FillBitsStackEntry> stack; // Tracking size since we won't be shrinking the stack vector @@ -453,15 +439,17 @@ static void fill_bits(const BitMap *p_src, Ref<BitMap> &p_map, const Point2i &p_ continue; } - if (i < rect.position.x || i >= rect.position.x + rect.size.x) + if (i < rect.position.x || i >= rect.position.x + rect.size.x) { continue; - if (j < rect.position.y || j >= rect.position.y + rect.size.y) + } + if (j < rect.position.y || j >= rect.position.y + rect.size.y) { continue; + } - if (p_map->get_bit(Vector2(i, j))) + if (p_map->get_bit(Vector2(i, j))) { continue; - else if (p_src->get_bit(Vector2(i, j))) { + } else if (p_src->get_bit(Vector2(i, j))) { p_map->set_bit(Vector2(i, j), true); FillBitsStackEntry se = { pos, i, j }; @@ -494,7 +482,6 @@ static void fill_bits(const BitMap *p_src, Ref<BitMap> &p_map, const Point2i &p_ } Vector<Vector<Vector2>> BitMap::clip_opaque_to_polygons(const Rect2 &p_rect, float p_epsilon) const { - Rect2i r = Rect2i(0, 0, width, height).clip(p_rect); print_verbose("BitMap: Rect: " + r); @@ -507,7 +494,6 @@ Vector<Vector<Vector2>> BitMap::clip_opaque_to_polygons(const Rect2 &p_rect, flo for (int i = r.position.y; i < r.position.y + r.size.height; i++) { for (int j = r.position.x; j < r.position.x + r.size.width; j++) { if (!fill->get_bit(Point2(j, i)) && get_bit(Point2(j, i))) { - fill_bits(this, fill, Point2i(j, i), r); Vector<Vector2> polygon = _march_square(r, Point2i(j, i)); @@ -529,7 +515,6 @@ Vector<Vector<Vector2>> BitMap::clip_opaque_to_polygons(const Rect2 &p_rect, flo } void BitMap::grow_mask(int p_pixels, const Rect2 &p_rect) { - if (p_pixels == 0) { return; } @@ -546,35 +531,38 @@ void BitMap::grow_mask(int p_pixels, const Rect2 &p_rect) { for (int i = r.position.y; i < r.position.y + r.size.height; i++) { for (int j = r.position.x; j < r.position.x + r.size.width; j++) { - if (bit_value == get_bit(Point2(j, i))) + if (bit_value == get_bit(Point2(j, i))) { continue; + } bool found = false; for (int y = i - p_pixels; y <= i + p_pixels; y++) { for (int x = j - p_pixels; x <= j + p_pixels; x++) { - bool outside = false; if ((x < p_rect.position.x) || (x >= p_rect.position.x + p_rect.size.x) || (y < p_rect.position.y) || (y >= p_rect.position.y + p_rect.size.y)) { // outside of rectangle counts as bit not set - if (!bit_value) + if (!bit_value) { outside = true; - else + } else { continue; + } } float d = Point2(j, i).distance_to(Point2(x, y)) - CMP_EPSILON; - if (d > p_pixels) + if (d > p_pixels) { continue; + } if (outside || (bit_value == copy->get_bit(Point2(x, y)))) { found = true; break; } } - if (found) + if (found) { break; + } } if (found) { @@ -585,12 +573,10 @@ void BitMap::grow_mask(int p_pixels, const Rect2 &p_rect) { } void BitMap::shrink_mask(int p_pixels, const Rect2 &p_rect) { - grow_mask(-p_pixels, p_rect); } Array BitMap::_opaque_to_polygons_bind(const Rect2 &p_rect, float p_epsilon) const { - Vector<Vector<Vector2>> result = clip_opaque_to_polygons(p_rect, p_epsilon); // Convert result to bindable types @@ -598,7 +584,6 @@ Array BitMap::_opaque_to_polygons_bind(const Rect2 &p_rect, float p_epsilon) con Array result_array; result_array.resize(result.size()); for (int i = 0; i < result.size(); i++) { - const Vector<Vector2> &polygon = result[i]; PackedVector2Array polygon_array; @@ -618,7 +603,6 @@ Array BitMap::_opaque_to_polygons_bind(const Rect2 &p_rect, float p_epsilon) con } void BitMap::resize(const Size2 &p_new_size) { - Ref<BitMap> new_bitmap; new_bitmap.instance(); new_bitmap->create(p_new_size); @@ -636,7 +620,6 @@ void BitMap::resize(const Size2 &p_new_size) { } Ref<Image> BitMap::convert_to_image() const { - Ref<Image> image; image.instance(); image->create(width, height, false, Image::FORMAT_L8); @@ -649,8 +632,8 @@ Ref<Image> BitMap::convert_to_image() const { return image; } -void BitMap::blit(const Vector2 &p_pos, const Ref<BitMap> &p_bitmap) { +void BitMap::blit(const Vector2 &p_pos, const Ref<BitMap> &p_bitmap) { int x = p_pos.x; int y = p_pos.y; int w = p_bitmap->get_size().width; @@ -660,10 +643,12 @@ void BitMap::blit(const Vector2 &p_pos, const Ref<BitMap> &p_bitmap) { for (int j = 0; j < h; j++) { int px = x + i; int py = y + j; - if (px < 0 || px >= width) + if (px < 0 || px >= width) { continue; - if (py < 0 || py >= height) + } + if (py < 0 || py >= height) { continue; + } if (p_bitmap->get_bit(Vector2(i, j))) { set_bit(Vector2(x, y), true); } @@ -672,7 +657,6 @@ void BitMap::blit(const Vector2 &p_pos, const Ref<BitMap> &p_bitmap) { } void BitMap::_bind_methods() { - ClassDB::bind_method(D_METHOD("create", "size"), &BitMap::create); ClassDB::bind_method(D_METHOD("create_from_image_alpha", "image", "threshold"), &BitMap::create_from_image_alpha, DEFVAL(0.1)); @@ -694,7 +678,6 @@ void BitMap::_bind_methods() { } BitMap::BitMap() { - width = 0; height = 0; } diff --git a/scene/resources/bit_map.h b/scene/resources/bit_map.h index 05313a0cff..59f3b4dc3c 100644 --- a/scene/resources/bit_map.h +++ b/scene/resources/bit_map.h @@ -36,7 +36,6 @@ #include "core/resource.h" class BitMap : public Resource { - GDCLASS(BitMap, Resource); OBJ_SAVE_TYPE(BitMap); diff --git a/scene/resources/box_shape_3d.cpp b/scene/resources/box_shape_3d.cpp index 64c821a011..69339faf76 100644 --- a/scene/resources/box_shape_3d.cpp +++ b/scene/resources/box_shape_3d.cpp @@ -32,7 +32,6 @@ #include "servers/physics_server_3d.h" Vector<Vector3> BoxShape3D::get_debug_mesh_lines() { - Vector<Vector3> lines; AABB aabb; aabb.position = -get_extents(); @@ -53,13 +52,11 @@ real_t BoxShape3D::get_enclosing_radius() const { } void BoxShape3D::_update_shape() { - PhysicsServer3D::get_singleton()->shape_set_data(get_shape(), extents); Shape3D::_update_shape(); } void BoxShape3D::set_extents(const Vector3 &p_extents) { - extents = p_extents; _update_shape(); notify_change_to_owners(); @@ -67,12 +64,10 @@ void BoxShape3D::set_extents(const Vector3 &p_extents) { } Vector3 BoxShape3D::get_extents() const { - return extents; } void BoxShape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_extents", "extents"), &BoxShape3D::set_extents); ClassDB::bind_method(D_METHOD("get_extents"), &BoxShape3D::get_extents); @@ -81,6 +76,5 @@ void BoxShape3D::_bind_methods() { BoxShape3D::BoxShape3D() : Shape3D(PhysicsServer3D::get_singleton()->shape_create(PhysicsServer3D::SHAPE_BOX)) { - set_extents(Vector3(1, 1, 1)); } diff --git a/scene/resources/box_shape_3d.h b/scene/resources/box_shape_3d.h index a93fd8d33a..e00b523815 100644 --- a/scene/resources/box_shape_3d.h +++ b/scene/resources/box_shape_3d.h @@ -34,7 +34,6 @@ #include "scene/resources/shape_3d.h" class BoxShape3D : public Shape3D { - GDCLASS(BoxShape3D, Shape3D); Vector3 extents; diff --git a/scene/resources/capsule_shape_2d.cpp b/scene/resources/capsule_shape_2d.cpp index 5a3282478c..0e784e04ff 100644 --- a/scene/resources/capsule_shape_2d.cpp +++ b/scene/resources/capsule_shape_2d.cpp @@ -34,57 +34,51 @@ #include "servers/rendering_server.h" Vector<Vector2> CapsuleShape2D::_get_points() const { - Vector<Vector2> points; for (int i = 0; i < 24; i++) { Vector2 ofs = Vector2(0, (i > 6 && i <= 18) ? -get_height() * 0.5 : get_height() * 0.5); points.push_back(Vector2(Math::sin(i * Math_PI * 2 / 24.0), Math::cos(i * Math_PI * 2 / 24.0)) * get_radius() + ofs); - if (i == 6 || i == 18) + if (i == 6 || i == 18) { points.push_back(Vector2(Math::sin(i * Math_PI * 2 / 24.0), Math::cos(i * Math_PI * 2 / 24.0)) * get_radius() - ofs); + } } return points; } bool CapsuleShape2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - return Geometry::is_point_in_polygon(p_point, _get_points()); } void CapsuleShape2D::_update_shape() { - PhysicsServer2D::get_singleton()->shape_set_data(get_rid(), Vector2(radius, height)); emit_changed(); } void CapsuleShape2D::set_radius(real_t p_radius) { - radius = p_radius; _update_shape(); } real_t CapsuleShape2D::get_radius() const { - return radius; } void CapsuleShape2D::set_height(real_t p_height) { - height = p_height; - if (height < 0) + if (height < 0) { height = 0; + } _update_shape(); } real_t CapsuleShape2D::get_height() const { - return height; } void CapsuleShape2D::draw(const RID &p_to_rid, const Color &p_color) { - Vector<Vector2> points = _get_points(); Vector<Color> col; col.push_back(p_color); @@ -92,7 +86,6 @@ void CapsuleShape2D::draw(const RID &p_to_rid, const Color &p_color) { } Rect2 CapsuleShape2D::get_rect() const { - Vector2 he = Point2(get_radius(), get_radius() + get_height() * 0.5); Rect2 rect; rect.position = -he; @@ -105,7 +98,6 @@ real_t CapsuleShape2D::get_enclosing_radius() const { } void CapsuleShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_radius", "radius"), &CapsuleShape2D::set_radius); ClassDB::bind_method(D_METHOD("get_radius"), &CapsuleShape2D::get_radius); @@ -118,7 +110,6 @@ void CapsuleShape2D::_bind_methods() { CapsuleShape2D::CapsuleShape2D() : Shape2D(PhysicsServer2D::get_singleton()->capsule_shape_create()) { - radius = 10; height = 20; _update_shape(); diff --git a/scene/resources/capsule_shape_3d.cpp b/scene/resources/capsule_shape_3d.cpp index da3ffcb306..28fc0d470c 100644 --- a/scene/resources/capsule_shape_3d.cpp +++ b/scene/resources/capsule_shape_3d.cpp @@ -32,7 +32,6 @@ #include "servers/physics_server_3d.h" Vector<Vector3> CapsuleShape3D::get_debug_mesh_lines() { - float radius = get_radius(); float height = get_height(); @@ -40,7 +39,6 @@ Vector<Vector3> CapsuleShape3D::get_debug_mesh_lines() { Vector3 d(0, height * 0.5, 0); for (int i = 0; i < 360; i++) { - float ra = Math::deg2rad((float)i); float rb = Math::deg2rad((float)i + 1); Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius; @@ -53,7 +51,6 @@ Vector<Vector3> CapsuleShape3D::get_debug_mesh_lines() { points.push_back(Vector3(b.x, 0, b.y) - d); if (i % 90 == 0) { - points.push_back(Vector3(a.x, 0, a.y) + d); points.push_back(Vector3(a.x, 0, a.y) - d); } @@ -74,7 +71,6 @@ real_t CapsuleShape3D::get_enclosing_radius() const { } void CapsuleShape3D::_update_shape() { - Dictionary d; d["radius"] = radius; d["height"] = height; @@ -83,7 +79,6 @@ void CapsuleShape3D::_update_shape() { } void CapsuleShape3D::set_radius(float p_radius) { - radius = p_radius; _update_shape(); notify_change_to_owners(); @@ -91,12 +86,10 @@ void CapsuleShape3D::set_radius(float p_radius) { } float CapsuleShape3D::get_radius() const { - return radius; } void CapsuleShape3D::set_height(float p_height) { - height = p_height; _update_shape(); notify_change_to_owners(); @@ -104,12 +97,10 @@ void CapsuleShape3D::set_height(float p_height) { } float CapsuleShape3D::get_height() const { - return height; } void CapsuleShape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_radius", "radius"), &CapsuleShape3D::set_radius); ClassDB::bind_method(D_METHOD("get_radius"), &CapsuleShape3D::get_radius); ClassDB::bind_method(D_METHOD("set_height", "height"), &CapsuleShape3D::set_height); @@ -121,7 +112,6 @@ void CapsuleShape3D::_bind_methods() { CapsuleShape3D::CapsuleShape3D() : Shape3D(PhysicsServer3D::get_singleton()->shape_create(PhysicsServer3D::SHAPE_CAPSULE)) { - radius = 1.0; height = 1.0; _update_shape(); diff --git a/scene/resources/capsule_shape_3d.h b/scene/resources/capsule_shape_3d.h index dca7a6c983..5892f97709 100644 --- a/scene/resources/capsule_shape_3d.h +++ b/scene/resources/capsule_shape_3d.h @@ -34,7 +34,6 @@ #include "scene/resources/shape_3d.h" class CapsuleShape3D : public Shape3D { - GDCLASS(CapsuleShape3D, Shape3D); float radius; float height; diff --git a/scene/resources/circle_shape_2d.cpp b/scene/resources/circle_shape_2d.cpp index afb7597280..dc1bf3b185 100644 --- a/scene/resources/circle_shape_2d.cpp +++ b/scene/resources/circle_shape_2d.cpp @@ -34,29 +34,24 @@ #include "servers/rendering_server.h" bool CircleShape2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - return p_point.length() < get_radius() + p_tolerance; } void CircleShape2D::_update_shape() { - PhysicsServer2D::get_singleton()->shape_set_data(get_rid(), radius); emit_changed(); } void CircleShape2D::set_radius(real_t p_radius) { - radius = p_radius; _update_shape(); } real_t CircleShape2D::get_radius() const { - return radius; } void CircleShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_radius", "radius"), &CircleShape2D::set_radius); ClassDB::bind_method(D_METHOD("get_radius"), &CircleShape2D::get_radius); @@ -75,10 +70,8 @@ real_t CircleShape2D::get_enclosing_radius() const { } void CircleShape2D::draw(const RID &p_to_rid, const Color &p_color) { - Vector<Vector2> points; for (int i = 0; i < 24; i++) { - points.push_back(Vector2(Math::cos(i * Math_PI * 2 / 24.0), Math::sin(i * Math_PI * 2 / 24.0)) * get_radius()); } @@ -89,7 +82,6 @@ void CircleShape2D::draw(const RID &p_to_rid, const Color &p_color) { CircleShape2D::CircleShape2D() : Shape2D(PhysicsServer2D::get_singleton()->circle_shape_create()) { - radius = 10; _update_shape(); } diff --git a/scene/resources/concave_polygon_shape_2d.cpp b/scene/resources/concave_polygon_shape_2d.cpp index c8fec3b72d..2154633111 100644 --- a/scene/resources/concave_polygon_shape_2d.cpp +++ b/scene/resources/concave_polygon_shape_2d.cpp @@ -34,39 +34,38 @@ #include "servers/rendering_server.h" bool ConcavePolygonShape2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - Vector<Vector2> s = get_segments(); int len = s.size(); - if (len == 0 || (len % 2) == 1) + if (len == 0 || (len % 2) == 1) { return false; + } const Vector2 *r = s.ptr(); for (int i = 0; i < len; i += 2) { Vector2 closest = Geometry::get_closest_point_to_segment_2d(p_point, &r[i]); - if (p_point.distance_to(closest) < p_tolerance) + if (p_point.distance_to(closest) < p_tolerance) { return true; + } } return false; } void ConcavePolygonShape2D::set_segments(const Vector<Vector2> &p_segments) { - PhysicsServer2D::get_singleton()->shape_set_data(get_rid(), p_segments); emit_changed(); } Vector<Vector2> ConcavePolygonShape2D::get_segments() const { - return PhysicsServer2D::get_singleton()->shape_get_data(get_rid()); } void ConcavePolygonShape2D::draw(const RID &p_to_rid, const Color &p_color) { - Vector<Vector2> s = get_segments(); int len = s.size(); - if (len == 0 || (len % 2) == 1) + if (len == 0 || (len % 2) == 1) { return; + } const Vector2 *r = s.ptr(); for (int i = 0; i < len; i += 2) { @@ -75,20 +74,21 @@ void ConcavePolygonShape2D::draw(const RID &p_to_rid, const Color &p_color) { } Rect2 ConcavePolygonShape2D::get_rect() const { - Vector<Vector2> s = get_segments(); int len = s.size(); - if (len == 0) + if (len == 0) { return Rect2(); + } Rect2 rect; const Vector2 *r = s.ptr(); for (int i = 0; i < len; i++) { - if (i == 0) + if (i == 0) { rect.position = r[i]; - else + } else { rect.expand_to(r[i]); + } } return rect; @@ -105,7 +105,6 @@ real_t ConcavePolygonShape2D::get_enclosing_radius() const { } void ConcavePolygonShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_segments", "segments"), &ConcavePolygonShape2D::set_segments); ClassDB::bind_method(D_METHOD("get_segments"), &ConcavePolygonShape2D::get_segments); diff --git a/scene/resources/concave_polygon_shape_3d.cpp b/scene/resources/concave_polygon_shape_3d.cpp index 42e06a49b6..7315945c03 100644 --- a/scene/resources/concave_polygon_shape_3d.cpp +++ b/scene/resources/concave_polygon_shape_3d.cpp @@ -33,7 +33,6 @@ #include "servers/physics_server_3d.h" Vector<Vector3> ConcavePolygonShape3D::get_debug_mesh_lines() { - Set<DrawEdge> edges; Vector<Vector3> data = get_faces(); @@ -43,9 +42,7 @@ Vector<Vector3> ConcavePolygonShape3D::get_debug_mesh_lines() { const Vector3 *r = data.ptr(); for (int i = 0; i < datalen; i += 3) { - for (int j = 0; j < 3; j++) { - DrawEdge de(r[i + j], r[i + ((j + 1) % 3)]); edges.insert(de); } @@ -55,7 +52,6 @@ Vector<Vector3> ConcavePolygonShape3D::get_debug_mesh_lines() { points.resize(edges.size() * 2); int idx = 0; for (Set<DrawEdge>::Element *E = edges.front(); E; E = E->next()) { - points.write[idx + 0] = E->get().a; points.write[idx + 1] = E->get().b; idx += 2; @@ -79,18 +75,15 @@ void ConcavePolygonShape3D::_update_shape() { } void ConcavePolygonShape3D::set_faces(const Vector<Vector3> &p_faces) { - PhysicsServer3D::get_singleton()->shape_set_data(get_shape(), p_faces); notify_change_to_owners(); } Vector<Vector3> ConcavePolygonShape3D::get_faces() const { - return PhysicsServer3D::get_singleton()->shape_get_data(get_shape()); } void ConcavePolygonShape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_faces", "faces"), &ConcavePolygonShape3D::set_faces); ClassDB::bind_method(D_METHOD("get_faces"), &ConcavePolygonShape3D::get_faces); ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR3_ARRAY, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "set_faces", "get_faces"); @@ -98,6 +91,5 @@ void ConcavePolygonShape3D::_bind_methods() { ConcavePolygonShape3D::ConcavePolygonShape3D() : Shape3D(PhysicsServer3D::get_singleton()->shape_create(PhysicsServer3D::SHAPE_CONCAVE_POLYGON)) { - //set_planes(Vector3(1,1,1)); } diff --git a/scene/resources/concave_polygon_shape_3d.h b/scene/resources/concave_polygon_shape_3d.h index b4e96c662f..c268ed9f37 100644 --- a/scene/resources/concave_polygon_shape_3d.h +++ b/scene/resources/concave_polygon_shape_3d.h @@ -34,18 +34,17 @@ #include "scene/resources/shape_3d.h" class ConcavePolygonShape3D : public Shape3D { - GDCLASS(ConcavePolygonShape3D, Shape3D); struct DrawEdge { - Vector3 a; Vector3 b; bool operator<(const DrawEdge &p_edge) const { - if (a == p_edge.a) + if (a == p_edge.a) { return b < p_edge.b; - else + } else { return a < p_edge.a; + } } DrawEdge(const Vector3 &p_a = Vector3(), const Vector3 &p_b = Vector3()) { diff --git a/scene/resources/convex_polygon_shape_2d.cpp b/scene/resources/convex_polygon_shape_2d.cpp index 6b1ddec507..7df7c3ac72 100644 --- a/scene/resources/convex_polygon_shape_2d.cpp +++ b/scene/resources/convex_polygon_shape_2d.cpp @@ -35,12 +35,10 @@ #include "servers/rendering_server.h" bool ConvexPolygonShape2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - return Geometry::is_point_in_polygon(p_point, points); } void ConvexPolygonShape2D::_update_shape() { - Vector<Vector2> final_points = points; if (Geometry::is_polygon_clockwise(final_points)) { //needs to be counter clockwise final_points.invert(); @@ -50,26 +48,22 @@ void ConvexPolygonShape2D::_update_shape() { } void ConvexPolygonShape2D::set_point_cloud(const Vector<Vector2> &p_points) { - Vector<Point2> hull = Geometry::convex_hull_2d(p_points); ERR_FAIL_COND(hull.size() < 3); set_points(hull); } void ConvexPolygonShape2D::set_points(const Vector<Vector2> &p_points) { - points = p_points; _update_shape(); } Vector<Vector2> ConvexPolygonShape2D::get_points() const { - return points; } void ConvexPolygonShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_point_cloud", "point_cloud"), &ConvexPolygonShape2D::set_point_cloud); ClassDB::bind_method(D_METHOD("set_points", "points"), &ConvexPolygonShape2D::set_points); ClassDB::bind_method(D_METHOD("get_points"), &ConvexPolygonShape2D::get_points); @@ -78,20 +72,19 @@ void ConvexPolygonShape2D::_bind_methods() { } void ConvexPolygonShape2D::draw(const RID &p_to_rid, const Color &p_color) { - Vector<Color> col; col.push_back(p_color); RenderingServer::get_singleton()->canvas_item_add_polygon(p_to_rid, points, col); } Rect2 ConvexPolygonShape2D::get_rect() const { - Rect2 rect; for (int i = 0; i < points.size(); i++) { - if (i == 0) + if (i == 0) { rect.position = points[i]; - else + } else { rect.expand_to(points[i]); + } } return rect; diff --git a/scene/resources/convex_polygon_shape_3d.cpp b/scene/resources/convex_polygon_shape_3d.cpp index ec9ab68015..e52df73663 100644 --- a/scene/resources/convex_polygon_shape_3d.cpp +++ b/scene/resources/convex_polygon_shape_3d.cpp @@ -33,11 +33,9 @@ #include "servers/physics_server_3d.h" Vector<Vector3> ConvexPolygonShape3D::get_debug_mesh_lines() { - Vector<Vector3> points = get_points(); if (points.size() > 3) { - Vector<Vector3> varr = Variant(points); Geometry::MeshData md; Error err = QuickHull::build(varr, md); @@ -66,25 +64,21 @@ real_t ConvexPolygonShape3D::get_enclosing_radius() const { } void ConvexPolygonShape3D::_update_shape() { - PhysicsServer3D::get_singleton()->shape_set_data(get_shape(), points); Shape3D::_update_shape(); } void ConvexPolygonShape3D::set_points(const Vector<Vector3> &p_points) { - points = p_points; _update_shape(); notify_change_to_owners(); } Vector<Vector3> ConvexPolygonShape3D::get_points() const { - return points; } void ConvexPolygonShape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_points", "points"), &ConvexPolygonShape3D::set_points); ClassDB::bind_method(D_METHOD("get_points"), &ConvexPolygonShape3D::get_points); diff --git a/scene/resources/convex_polygon_shape_3d.h b/scene/resources/convex_polygon_shape_3d.h index 51e4c8eb0b..0e3dde47a5 100644 --- a/scene/resources/convex_polygon_shape_3d.h +++ b/scene/resources/convex_polygon_shape_3d.h @@ -34,7 +34,6 @@ #include "scene/resources/shape_3d.h" class ConvexPolygonShape3D : public Shape3D { - GDCLASS(ConvexPolygonShape3D, Shape3D); Vector<Vector3> points; diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp index ae705a47e8..de076670cf 100644 --- a/scene/resources/curve.cpp +++ b/scene/resources/curve.cpp @@ -58,10 +58,11 @@ int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent, T // Add a point and preserve order // Curve bounds is in 0..1 - if (p_pos.x > MAX_X) + if (p_pos.x > MAX_X) { p_pos.x = MAX_X; - else if (p_pos.x < MIN_X) + } else if (p_pos.x < MIN_X) { p_pos.x = MIN_X; + } int ret = -1; @@ -83,7 +84,6 @@ int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent, T } } else { - int i = get_index(p_pos.x); if (i == 0 && p_pos.x < _points[0].pos.x) { @@ -106,7 +106,6 @@ int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent, T } int Curve::get_index(real_t offset) const { - // Lower-bound float binary search int imin = 0; @@ -130,13 +129,13 @@ int Curve::get_index(real_t offset) const { } // Will happen if the offset is out of bounds - if (offset > _points[imax].pos.x) + if (offset > _points[imax].pos.x) { return imax; + } return imin; } void Curve::clean_dupes() { - bool dirty = false; for (int i = 1; i < _points.size(); ++i) { @@ -148,8 +147,9 @@ void Curve::clean_dupes() { } } - if (dirty) + if (dirty) { mark_dirty(); + } } void Curve::set_point_left_tangent(int i, real_t tangent) { @@ -237,8 +237,9 @@ int Curve::set_point_offset(int p_index, float offset) { _points.write[i].right_tangent = p.right_tangent; _points.write[i].left_mode = p.left_mode; _points.write[i].right_mode = p.right_mode; - if (p_index != i) + if (p_index != i) { update_auto_tangents(p_index); + } update_auto_tangents(i); return i; } @@ -254,7 +255,6 @@ Curve::Point Curve::get_point(int p_index) const { } void Curve::update_auto_tangents(int i) { - Point &p = _points.write[i]; if (i > 0) { @@ -305,26 +305,29 @@ void Curve::set_max_value(float p_max) { } real_t Curve::interpolate(real_t offset) const { - if (_points.size() == 0) + if (_points.size() == 0) { return 0; - if (_points.size() == 1) + } + if (_points.size() == 1) { return _points[0].pos.y; + } int i = get_index(offset); - if (i == _points.size() - 1) + if (i == _points.size() - 1) { return _points[i].pos.y; + } real_t local = offset - _points[i].pos.x; - if (i == 0 && local <= 0) + if (i == 0 && local <= 0) { return _points[0].pos.y; + } return interpolate_local_nocheck(i, local); } real_t Curve::interpolate_local_nocheck(int index, real_t local_offset) const { - const Point a = _points[index]; const Point b = _points[index + 1]; @@ -344,8 +347,9 @@ real_t Curve::interpolate_local_nocheck(int index, real_t local_offset) const { // Control points are chosen at equal distances real_t d = b.pos.x - a.pos.x; - if (Math::abs(d) <= CMP_EPSILON) + if (Math::abs(d) <= CMP_EPSILON) { return b.pos.y; + } local_offset /= d; d /= 3.0; real_t yac = a.pos.y + d * a.right_tangent; @@ -362,13 +366,11 @@ void Curve::mark_dirty() { } Array Curve::get_data() const { - Array output; const unsigned int ELEMS = 5; output.resize(_points.size() * ELEMS); for (int j = 0; j < _points.size(); ++j) { - const Point p = _points[j]; int i = j * ELEMS; @@ -406,7 +408,6 @@ void Curve::set_data(Array input) { _points.resize(input.size() / ELEMS); for (int j = 0; j < _points.size(); ++j) { - Point &p = _points.write[j]; int i = j * ELEMS; @@ -457,8 +458,9 @@ real_t Curve::interpolate_baked(real_t offset) { // Special cases if the cache is too small if (_baked_cache.size() == 0) { - if (_points.size() == 0) + if (_points.size() == 0) { return 0; + } return _points[0].pos.y; } else if (_baked_cache.size() == 1) { return _baked_cache[0]; @@ -486,7 +488,6 @@ real_t Curve::interpolate_baked(real_t offset) { void Curve::ensure_default_setup(float p_min, float p_max) { if (_points.size() == 0 && _min_value == 0 && _max_value == 1) { - add_point(Vector2(0, 1)); add_point(Vector2(1, 1)); set_min_value(p_min); @@ -495,7 +496,6 @@ void Curve::ensure_default_setup(float p_min, float p_max) { } void Curve::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_point_count"), &Curve::get_point_count); ClassDB::bind_method(D_METHOD("add_point", "position", "left_tangent", "right_tangent", "left_mode", "right_mode"), &Curve::add_point, DEFVAL(0), DEFVAL(0), DEFVAL(TANGENT_FREE), DEFVAL(TANGENT_FREE)); ClassDB::bind_method(D_METHOD("remove_point", "index"), &Curve::remove_point); @@ -537,54 +537,51 @@ void Curve::_bind_methods() { } int Curve2D::get_point_count() const { - return points.size(); } -void Curve2D::add_point(const Vector2 &p_pos, const Vector2 &p_in, const Vector2 &p_out, int p_atpos) { +void Curve2D::add_point(const Vector2 &p_pos, const Vector2 &p_in, const Vector2 &p_out, int p_atpos) { Point n; n.pos = p_pos; n.in = p_in; n.out = p_out; - if (p_atpos >= 0 && p_atpos < points.size()) + if (p_atpos >= 0 && p_atpos < points.size()) { points.insert(p_atpos, n); - else + } else { points.push_back(n); + } baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } void Curve2D::set_point_position(int p_index, const Vector2 &p_pos) { - ERR_FAIL_INDEX(p_index, points.size()); points.write[p_index].pos = p_pos; baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } -Vector2 Curve2D::get_point_position(int p_index) const { +Vector2 Curve2D::get_point_position(int p_index) const { ERR_FAIL_INDEX_V(p_index, points.size(), Vector2()); return points[p_index].pos; } void Curve2D::set_point_in(int p_index, const Vector2 &p_in) { - ERR_FAIL_INDEX(p_index, points.size()); points.write[p_index].in = p_in; baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } -Vector2 Curve2D::get_point_in(int p_index) const { +Vector2 Curve2D::get_point_in(int p_index) const { ERR_FAIL_INDEX_V(p_index, points.size(), Vector2()); return points[p_index].in; } void Curve2D::set_point_out(int p_index, const Vector2 &p_out) { - ERR_FAIL_INDEX(p_index, points.size()); points.write[p_index].out = p_out; @@ -593,13 +590,11 @@ void Curve2D::set_point_out(int p_index, const Vector2 &p_out) { } Vector2 Curve2D::get_point_out(int p_index) const { - ERR_FAIL_INDEX_V(p_index, points.size(), Vector2()); return points[p_index].out; } void Curve2D::remove_point(int p_index) { - ERR_FAIL_INDEX(p_index, points.size()); points.remove(p_index); baked_cache_dirty = true; @@ -615,14 +610,14 @@ void Curve2D::clear_points() { } Vector2 Curve2D::interpolate(int p_index, float p_offset) const { - int pc = points.size(); ERR_FAIL_COND_V(pc == 0, Vector2()); - if (p_index >= pc - 1) + if (p_index >= pc - 1) { return points[pc - 1].pos; - else if (p_index < 0) + } else if (p_index < 0) { return points[0].pos; + } Vector2 p0 = points[p_index].pos; Vector2 p1 = p0 + points[p_index].out; @@ -633,17 +628,16 @@ Vector2 Curve2D::interpolate(int p_index, float p_offset) const { } Vector2 Curve2D::interpolatef(real_t p_findex) const { - - if (p_findex < 0) + if (p_findex < 0) { p_findex = 0; - else if (p_findex >= points.size()) + } else if (p_findex >= points.size()) { p_findex = points.size(); + } return interpolate((int)p_findex, Math::fmod(p_findex, (real_t)1.0)); } void Curve2D::_bake_segment2d(Map<float, Vector2> &r_bake, float p_begin, float p_end, const Vector2 &p_a, const Vector2 &p_out, const Vector2 &p_b, const Vector2 &p_in, int p_depth, int p_max_depth, float p_tol) const { - float mp = p_begin + (p_end - p_begin) * 0.5; Vector2 beg = _bezier_interp(p_begin, p_a, p_a + p_out, p_b + p_in, p_b); Vector2 mid = _bezier_interp(mp, p_a, p_a + p_out, p_b + p_in, p_b); @@ -654,7 +648,6 @@ void Curve2D::_bake_segment2d(Map<float, Vector2> &r_bake, float p_begin, float float dp = na.dot(nb); if (dp < Math::cos(Math::deg2rad(p_tol))) { - r_bake[mp] = mid; } @@ -665,9 +658,9 @@ void Curve2D::_bake_segment2d(Map<float, Vector2> &r_bake, float p_begin, float } void Curve2D::_bake() const { - - if (!baked_cache_dirty) + if (!baked_cache_dirty) { return; + } baked_max_ofs = 0; baked_cache_dirty = false; @@ -678,7 +671,6 @@ void Curve2D::_bake() const { } if (points.size() == 1) { - baked_point_cache.resize(1); baked_point_cache.set(0, points[0].pos); return; @@ -690,15 +682,14 @@ void Curve2D::_bake() const { pointlist.push_back(pos); //start always from origin for (int i = 0; i < points.size() - 1; i++) { - float step = 0.1; // at least 10 substeps ought to be enough? float p = 0; while (p < 1.0) { - float np = p + step; - if (np > 1.0) + if (np > 1.0) { np = 1.0; + } Vector2 npp = _bezier_interp(np, points[i].pos, points[i].pos + points[i].out, points[i + 1].pos + points[i + 1].in, points[i + 1].pos); float d = pos.distance_to(npp); @@ -713,14 +704,14 @@ void Curve2D::_bake() const { float mid = low + (hi - low) * 0.5; for (int j = 0; j < iterations; j++) { - npp = _bezier_interp(mid, points[i].pos, points[i].pos + points[i].out, points[i + 1].pos + points[i + 1].in, points[i + 1].pos); d = pos.distance_to(npp); - if (bake_interval < d) + if (bake_interval < d) { hi = mid; - else + } else { low = mid; + } mid = low + (hi - low) * 0.5; } @@ -728,7 +719,6 @@ void Curve2D::_bake() const { p = mid; pointlist.push_back(pos); } else { - p = np; } } @@ -745,38 +735,41 @@ void Curve2D::_bake() const { int idx = 0; for (List<Vector2>::Element *E = pointlist.front(); E; E = E->next()) { - w[idx] = E->get(); idx++; } } float Curve2D::get_baked_length() const { - - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } return baked_max_ofs; } -Vector2 Curve2D::interpolate_baked(float p_offset, bool p_cubic) const { - if (baked_cache_dirty) +Vector2 Curve2D::interpolate_baked(float p_offset, bool p_cubic) const { + if (baked_cache_dirty) { _bake(); + } //validate// int pc = baked_point_cache.size(); ERR_FAIL_COND_V_MSG(pc == 0, Vector2(), "No points in Curve2D."); - if (pc == 1) + if (pc == 1) { return baked_point_cache.get(0); + } int bpc = baked_point_cache.size(); const Vector2 *r = baked_point_cache.ptr(); - if (p_offset < 0) + if (p_offset < 0) { return r[0]; - if (p_offset >= baked_max_ofs) + } + if (p_offset >= baked_max_ofs) { return r[bpc - 1]; + } int idx = Math::floor((double)p_offset / (double)bake_interval); float frac = Math::fmod(p_offset, (float)bake_interval); @@ -784,14 +777,14 @@ Vector2 Curve2D::interpolate_baked(float p_offset, bool p_cubic) const { if (idx >= bpc - 1) { return r[bpc - 1]; } else if (idx == bpc - 2) { - if (frac > 0) + if (frac > 0) { frac /= Math::fmod(baked_max_ofs, bake_interval); + } } else { frac /= bake_interval; } if (p_cubic) { - Vector2 pre = idx > 0 ? r[idx - 1] : r[idx]; Vector2 post = (idx < (bpc - 2)) ? r[idx + 2] : r[idx + 1]; return r[idx].cubic_interpolate(r[idx + 1], pre, post, frac); @@ -801,37 +794,37 @@ Vector2 Curve2D::interpolate_baked(float p_offset, bool p_cubic) const { } PackedVector2Array Curve2D::get_baked_points() const { - - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } return baked_point_cache; } void Curve2D::set_bake_interval(float p_tolerance) { - bake_interval = p_tolerance; baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } float Curve2D::get_bake_interval() const { - return bake_interval; } Vector2 Curve2D::get_closest_point(const Vector2 &p_to_point) const { // Brute force method - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } //validate// int pc = baked_point_cache.size(); ERR_FAIL_COND_V_MSG(pc == 0, Vector2(), "No points in Curve2D."); - if (pc == 1) + if (pc == 1) { return baked_point_cache.get(0); + } const Vector2 *r = baked_point_cache.ptr(); @@ -859,15 +852,17 @@ Vector2 Curve2D::get_closest_point(const Vector2 &p_to_point) const { float Curve2D::get_closest_offset(const Vector2 &p_to_point) const { // Brute force method - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } //validate// int pc = baked_point_cache.size(); ERR_FAIL_COND_V_MSG(pc == 0, 0.0f, "No points in Curve2D."); - if (pc == 1) + if (pc == 1) { return 0.0f; + } const Vector2 *r = baked_point_cache.ptr(); @@ -896,7 +891,6 @@ float Curve2D::get_closest_offset(const Vector2 &p_to_point) const { } Dictionary Curve2D::_get_data() const { - Dictionary dc; PackedVector2Array d; @@ -904,7 +898,6 @@ Dictionary Curve2D::_get_data() const { Vector2 *w = d.ptrw(); for (int i = 0; i < points.size(); i++) { - w[i * 3 + 0] = points[i].in; w[i * 3 + 1] = points[i].out; w[i * 3 + 2] = points[i].pos; @@ -914,8 +907,8 @@ Dictionary Curve2D::_get_data() const { return dc; } -void Curve2D::_set_data(const Dictionary &p_data) { +void Curve2D::_set_data(const Dictionary &p_data) { ERR_FAIL_COND(!p_data.has("points")); PackedVector2Array rp = p_data["points"]; @@ -925,7 +918,6 @@ void Curve2D::_set_data(const Dictionary &p_data) { const Vector2 *r = rp.ptr(); for (int i = 0; i < points.size(); i++) { - points.write[i].in = r[i * 3 + 0]; points.write[i].out = r[i * 3 + 1]; points.write[i].pos = r[i * 3 + 2]; @@ -935,7 +927,6 @@ void Curve2D::_set_data(const Dictionary &p_data) { } PackedVector2Array Curve2D::tessellate(int p_max_stages, float p_tolerance) const { - PackedVector2Array tess; if (points.size() == 0) { @@ -947,7 +938,6 @@ PackedVector2Array Curve2D::tessellate(int p_max_stages, float p_tolerance) cons int pc = 1; for (int i = 0; i < points.size() - 1; i++) { - _bake_segment2d(midpoints.write[i], 0, 1, points[i].pos, points[i].out, points[i + 1].pos, points[i + 1].in, 0, p_max_stages, p_tolerance); pc++; pc += midpoints[i].size(); @@ -959,9 +949,7 @@ PackedVector2Array Curve2D::tessellate(int p_max_stages, float p_tolerance) cons int pidx = 0; for (int i = 0; i < points.size() - 1; i++) { - for (Map<float, Vector2>::Element *E = midpoints[i].front(); E; E = E->next()) { - pidx++; bpw[pidx] = E->get(); } @@ -974,7 +962,6 @@ PackedVector2Array Curve2D::tessellate(int p_max_stages, float p_tolerance) cons } void Curve2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_point_count"), &Curve2D::get_point_count); ClassDB::bind_method(D_METHOD("add_point", "position", "in", "out", "at_position"), &Curve2D::add_point, DEFVAL(Vector2()), DEFVAL(Vector2()), DEFVAL(-1)); ClassDB::bind_method(D_METHOD("set_point_position", "idx", "position"), &Curve2D::set_point_position); @@ -1022,67 +1009,64 @@ Curve2D::Curve2D() { /***********************************************************************************/ int Curve3D::get_point_count() const { - return points.size(); } -void Curve3D::add_point(const Vector3 &p_pos, const Vector3 &p_in, const Vector3 &p_out, int p_atpos) { +void Curve3D::add_point(const Vector3 &p_pos, const Vector3 &p_in, const Vector3 &p_out, int p_atpos) { Point n; n.pos = p_pos; n.in = p_in; n.out = p_out; - if (p_atpos >= 0 && p_atpos < points.size()) + if (p_atpos >= 0 && p_atpos < points.size()) { points.insert(p_atpos, n); - else + } else { points.push_back(n); + } baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } -void Curve3D::set_point_position(int p_index, const Vector3 &p_pos) { +void Curve3D::set_point_position(int p_index, const Vector3 &p_pos) { ERR_FAIL_INDEX(p_index, points.size()); points.write[p_index].pos = p_pos; baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } -Vector3 Curve3D::get_point_position(int p_index) const { +Vector3 Curve3D::get_point_position(int p_index) const { ERR_FAIL_INDEX_V(p_index, points.size(), Vector3()); return points[p_index].pos; } void Curve3D::set_point_tilt(int p_index, float p_tilt) { - ERR_FAIL_INDEX(p_index, points.size()); points.write[p_index].tilt = p_tilt; baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } -float Curve3D::get_point_tilt(int p_index) const { +float Curve3D::get_point_tilt(int p_index) const { ERR_FAIL_INDEX_V(p_index, points.size(), 0); return points[p_index].tilt; } void Curve3D::set_point_in(int p_index, const Vector3 &p_in) { - ERR_FAIL_INDEX(p_index, points.size()); points.write[p_index].in = p_in; baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } -Vector3 Curve3D::get_point_in(int p_index) const { +Vector3 Curve3D::get_point_in(int p_index) const { ERR_FAIL_INDEX_V(p_index, points.size(), Vector3()); return points[p_index].in; } void Curve3D::set_point_out(int p_index, const Vector3 &p_out) { - ERR_FAIL_INDEX(p_index, points.size()); points.write[p_index].out = p_out; @@ -1091,13 +1075,11 @@ void Curve3D::set_point_out(int p_index, const Vector3 &p_out) { } Vector3 Curve3D::get_point_out(int p_index) const { - ERR_FAIL_INDEX_V(p_index, points.size(), Vector3()); return points[p_index].out; } void Curve3D::remove_point(int p_index) { - ERR_FAIL_INDEX(p_index, points.size()); points.remove(p_index); baked_cache_dirty = true; @@ -1105,7 +1087,6 @@ void Curve3D::remove_point(int p_index) { } void Curve3D::clear_points() { - if (!points.empty()) { points.clear(); baked_cache_dirty = true; @@ -1114,14 +1095,14 @@ void Curve3D::clear_points() { } Vector3 Curve3D::interpolate(int p_index, float p_offset) const { - int pc = points.size(); ERR_FAIL_COND_V(pc == 0, Vector3()); - if (p_index >= pc - 1) + if (p_index >= pc - 1) { return points[pc - 1].pos; - else if (p_index < 0) + } else if (p_index < 0) { return points[0].pos; + } Vector3 p0 = points[p_index].pos; Vector3 p1 = p0 + points[p_index].out; @@ -1132,17 +1113,16 @@ Vector3 Curve3D::interpolate(int p_index, float p_offset) const { } Vector3 Curve3D::interpolatef(real_t p_findex) const { - - if (p_findex < 0) + if (p_findex < 0) { p_findex = 0; - else if (p_findex >= points.size()) + } else if (p_findex >= points.size()) { p_findex = points.size(); + } return interpolate((int)p_findex, Math::fmod(p_findex, (real_t)1.0)); } void Curve3D::_bake_segment3d(Map<float, Vector3> &r_bake, float p_begin, float p_end, const Vector3 &p_a, const Vector3 &p_out, const Vector3 &p_b, const Vector3 &p_in, int p_depth, int p_max_depth, float p_tol) const { - float mp = p_begin + (p_end - p_begin) * 0.5; Vector3 beg = _bezier_interp(p_begin, p_a, p_a + p_out, p_b + p_in, p_b); Vector3 mid = _bezier_interp(mp, p_a, p_a + p_out, p_b + p_in, p_b); @@ -1153,7 +1133,6 @@ void Curve3D::_bake_segment3d(Map<float, Vector3> &r_bake, float p_begin, float float dp = na.dot(nb); if (dp < Math::cos(Math::deg2rad(p_tol))) { - r_bake[mp] = mid; } if (p_depth < p_max_depth) { @@ -1163,9 +1142,9 @@ void Curve3D::_bake_segment3d(Map<float, Vector3> &r_bake, float p_begin, float } void Curve3D::_bake() const { - - if (!baked_cache_dirty) + if (!baked_cache_dirty) { return; + } baked_max_ofs = 0; baked_cache_dirty = false; @@ -1178,18 +1157,17 @@ void Curve3D::_bake() const { } if (points.size() == 1) { - baked_point_cache.resize(1); baked_point_cache.set(0, points[0].pos); baked_tilt_cache.resize(1); baked_tilt_cache.set(0, points[0].tilt); if (up_vector_enabled) { - baked_up_vector_cache.resize(1); baked_up_vector_cache.set(0, Vector3(0, 1, 0)); - } else + } else { baked_up_vector_cache.resize(0); + } return; } @@ -1199,15 +1177,14 @@ void Curve3D::_bake() const { pointlist.push_back(Plane(pos, points[0].tilt)); for (int i = 0; i < points.size() - 1; i++) { - float step = 0.1; // at least 10 substeps ought to be enough? float p = 0; while (p < 1.0) { - float np = p + step; - if (np > 1.0) + if (np > 1.0) { np = 1.0; + } Vector3 npp = _bezier_interp(np, points[i].pos, points[i].pos + points[i].out, points[i + 1].pos + points[i + 1].in, points[i + 1].pos); float d = pos.distance_to(npp); @@ -1222,14 +1199,14 @@ void Curve3D::_bake() const { float mid = low + (hi - low) * 0.5; for (int j = 0; j < iterations; j++) { - npp = _bezier_interp(mid, points[i].pos, points[i].pos + points[i].out, points[i + 1].pos + points[i + 1].in, points[i + 1].pos); d = pos.distance_to(npp); - if (bake_interval < d) + if (bake_interval < d) { hi = mid; - else + } else { low = mid; + } mid = low + (hi - low) * 0.5; } @@ -1240,7 +1217,6 @@ void Curve3D::_bake() const { post.d = Math::lerp(points[i].tilt, points[i + 1].tilt, mid); pointlist.push_back(post); } else { - p = np; } } @@ -1272,7 +1248,6 @@ void Curve3D::_bake() const { Vector3 prev_forward = Vector3(0, 0, 1); for (List<Plane>::Element *E = pointlist.front(); E; E = E->next()) { - w[idx] = E->get().normal; wt[idx] = E->get().d; @@ -1296,8 +1271,9 @@ void Curve3D::_bake() const { up = forward.cross(sideways).normalized(); } - if (idx == 1) + if (idx == 1) { up_write[0] = up; + } up_write[idx] = up; @@ -1310,31 +1286,35 @@ void Curve3D::_bake() const { } float Curve3D::get_baked_length() const { - - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } return baked_max_ofs; } -Vector3 Curve3D::interpolate_baked(float p_offset, bool p_cubic) const { - if (baked_cache_dirty) +Vector3 Curve3D::interpolate_baked(float p_offset, bool p_cubic) const { + if (baked_cache_dirty) { _bake(); + } //validate// int pc = baked_point_cache.size(); ERR_FAIL_COND_V_MSG(pc == 0, Vector3(), "No points in Curve3D."); - if (pc == 1) + if (pc == 1) { return baked_point_cache.get(0); + } int bpc = baked_point_cache.size(); const Vector3 *r = baked_point_cache.ptr(); - if (p_offset < 0) + if (p_offset < 0) { return r[0]; - if (p_offset >= baked_max_ofs) + } + if (p_offset >= baked_max_ofs) { return r[bpc - 1]; + } int idx = Math::floor((double)p_offset / (double)bake_interval); float frac = Math::fmod(p_offset, bake_interval); @@ -1342,14 +1322,14 @@ Vector3 Curve3D::interpolate_baked(float p_offset, bool p_cubic) const { if (idx >= bpc - 1) { return r[bpc - 1]; } else if (idx == bpc - 2) { - if (frac > 0) + if (frac > 0) { frac /= Math::fmod(baked_max_ofs, bake_interval); + } } else { frac /= bake_interval; } if (p_cubic) { - Vector3 pre = idx > 0 ? r[idx - 1] : r[idx]; Vector3 post = (idx < (bpc - 2)) ? r[idx + 2] : r[idx + 1]; return r[idx].cubic_interpolate(r[idx + 1], pre, post, frac); @@ -1359,24 +1339,27 @@ Vector3 Curve3D::interpolate_baked(float p_offset, bool p_cubic) const { } float Curve3D::interpolate_baked_tilt(float p_offset) const { - - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } //validate// int pc = baked_tilt_cache.size(); ERR_FAIL_COND_V_MSG(pc == 0, 0, "No tilts in Curve3D."); - if (pc == 1) + if (pc == 1) { return baked_tilt_cache.get(0); + } int bpc = baked_tilt_cache.size(); const real_t *r = baked_tilt_cache.ptr(); - if (p_offset < 0) + if (p_offset < 0) { return r[0]; - if (p_offset >= baked_max_ofs) + } + if (p_offset >= baked_max_ofs) { return r[bpc - 1]; + } int idx = Math::floor((double)p_offset / (double)bake_interval); float frac = Math::fmod(p_offset, bake_interval); @@ -1384,8 +1367,9 @@ float Curve3D::interpolate_baked_tilt(float p_offset) const { if (idx >= bpc - 1) { return r[bpc - 1]; } else if (idx == bpc - 2) { - if (frac > 0) + if (frac > 0) { frac /= Math::fmod(baked_max_ofs, bake_interval); + } } else { frac /= bake_interval; } @@ -1394,17 +1378,18 @@ float Curve3D::interpolate_baked_tilt(float p_offset) const { } Vector3 Curve3D::interpolate_baked_up_vector(float p_offset, bool p_apply_tilt) const { - - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } //validate// // curve may not have baked up vectors int count = baked_up_vector_cache.size(); ERR_FAIL_COND_V_MSG(count == 0, Vector3(0, 1, 0), "No up vectors in Curve3D."); - if (count == 1) + if (count == 1) { return baked_up_vector_cache.get(0); + } const Vector3 *r = baked_up_vector_cache.ptr(); const Vector3 *rp = baked_point_cache.ptr(); @@ -1415,8 +1400,9 @@ Vector3 Curve3D::interpolate_baked_up_vector(float p_offset, bool p_apply_tilt) int idx = Math::floor((double)offset / (double)bake_interval); float frac = Math::fmod(offset, bake_interval) / bake_interval; - if (idx == count - 1) + if (idx == count - 1) { return p_apply_tilt ? r[idx].rotated((rp[idx] - rp[idx - 1]).normalized(), rt[idx]) : r[idx]; + } Vector3 forward = (rp[idx + 1] - rp[idx]).normalized(); Vector3 up = r[idx]; @@ -1429,34 +1415,35 @@ Vector3 Curve3D::interpolate_baked_up_vector(float p_offset, bool p_apply_tilt) Vector3 axis = up.cross(up1); - if (axis.length_squared() < CMP_EPSILON2) + if (axis.length_squared() < CMP_EPSILON2) { axis = forward; - else + } else { axis.normalize(); + } return up.rotated(axis, up.angle_to(up1) * frac); } PackedVector3Array Curve3D::get_baked_points() const { - - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } return baked_point_cache; } PackedFloat32Array Curve3D::get_baked_tilts() const { - - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } return baked_tilt_cache; } PackedVector3Array Curve3D::get_baked_up_vectors() const { - - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } return baked_up_vector_cache; } @@ -1464,15 +1451,17 @@ PackedVector3Array Curve3D::get_baked_up_vectors() const { Vector3 Curve3D::get_closest_point(const Vector3 &p_to_point) const { // Brute force method - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } //validate// int pc = baked_point_cache.size(); ERR_FAIL_COND_V_MSG(pc == 0, Vector3(), "No points in Curve3D."); - if (pc == 1) + if (pc == 1) { return baked_point_cache.get(0); + } const Vector3 *r = baked_point_cache.ptr(); @@ -1500,15 +1489,17 @@ Vector3 Curve3D::get_closest_point(const Vector3 &p_to_point) const { float Curve3D::get_closest_offset(const Vector3 &p_to_point) const { // Brute force method - if (baked_cache_dirty) + if (baked_cache_dirty) { _bake(); + } //validate// int pc = baked_point_cache.size(); ERR_FAIL_COND_V_MSG(pc == 0, 0.0f, "No points in Curve3D."); - if (pc == 1) + if (pc == 1) { return 0.0f; + } const Vector3 *r = baked_point_cache.ptr(); @@ -1537,31 +1528,26 @@ float Curve3D::get_closest_offset(const Vector3 &p_to_point) const { } void Curve3D::set_bake_interval(float p_tolerance) { - bake_interval = p_tolerance; baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } float Curve3D::get_bake_interval() const { - return bake_interval; } void Curve3D::set_up_vector_enabled(bool p_enable) { - up_vector_enabled = p_enable; baked_cache_dirty = true; emit_signal(CoreStringNames::get_singleton()->changed); } bool Curve3D::is_up_vector_enabled() const { - return up_vector_enabled; } Dictionary Curve3D::_get_data() const { - Dictionary dc; PackedVector3Array d; @@ -1572,7 +1558,6 @@ Dictionary Curve3D::_get_data() const { real_t *wt = t.ptrw(); for (int i = 0; i < points.size(); i++) { - w[i * 3 + 0] = points[i].in; w[i * 3 + 1] = points[i].out; w[i * 3 + 2] = points[i].pos; @@ -1584,8 +1569,8 @@ Dictionary Curve3D::_get_data() const { return dc; } -void Curve3D::_set_data(const Dictionary &p_data) { +void Curve3D::_set_data(const Dictionary &p_data) { ERR_FAIL_COND(!p_data.has("points")); ERR_FAIL_COND(!p_data.has("tilts")); @@ -1598,7 +1583,6 @@ void Curve3D::_set_data(const Dictionary &p_data) { const real_t *rt = rtl.ptr(); for (int i = 0; i < points.size(); i++) { - points.write[i].in = r[i * 3 + 0]; points.write[i].out = r[i * 3 + 1]; points.write[i].pos = r[i * 3 + 2]; @@ -1609,7 +1593,6 @@ void Curve3D::_set_data(const Dictionary &p_data) { } PackedVector3Array Curve3D::tessellate(int p_max_stages, float p_tolerance) const { - PackedVector3Array tess; if (points.size() == 0) { @@ -1621,7 +1604,6 @@ PackedVector3Array Curve3D::tessellate(int p_max_stages, float p_tolerance) cons int pc = 1; for (int i = 0; i < points.size() - 1; i++) { - _bake_segment3d(midpoints.write[i], 0, 1, points[i].pos, points[i].out, points[i + 1].pos, points[i + 1].in, 0, p_max_stages, p_tolerance); pc++; pc += midpoints[i].size(); @@ -1633,9 +1615,7 @@ PackedVector3Array Curve3D::tessellate(int p_max_stages, float p_tolerance) cons int pidx = 0; for (int i = 0; i < points.size() - 1; i++) { - for (Map<float, Vector3>::Element *E = midpoints[i].front(); E; E = E->next()) { - pidx++; bpw[pidx] = E->get(); } @@ -1648,7 +1628,6 @@ PackedVector3Array Curve3D::tessellate(int p_max_stages, float p_tolerance) cons } void Curve3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_point_count"), &Curve3D::get_point_count); ClassDB::bind_method(D_METHOD("add_point", "position", "in", "out", "at_position"), &Curve3D::add_point, DEFVAL(Vector3()), DEFVAL(Vector3()), DEFVAL(-1)); ClassDB::bind_method(D_METHOD("set_point_position", "idx", "position"), &Curve3D::set_point_position); diff --git a/scene/resources/curve.h b/scene/resources/curve.h index 7dcbf1ceff..57ddaf897d 100644 --- a/scene/resources/curve.h +++ b/scene/resources/curve.h @@ -68,7 +68,6 @@ public: real_t p_right = 0, TangentMode p_left_mode = TANGENT_FREE, TangentMode p_right_mode = TANGENT_FREE) { - pos = p_pos; left_tangent = p_left; right_tangent = p_right; @@ -149,11 +148,9 @@ private: VARIANT_ENUM_CAST(Curve::TangentMode) class Curve2D : public Resource { - GDCLASS(Curve2D, Resource); struct Point { - Vector2 in; Vector2 out; Vector2 pos; @@ -162,7 +159,6 @@ class Curve2D : public Resource { Vector<Point> points; struct BakedPoint { - float ofs; Vector2 point; }; @@ -212,11 +208,9 @@ public: }; class Curve3D : public Resource { - GDCLASS(Curve3D, Resource); struct Point { - Vector3 in; Vector3 out; Vector3 pos; @@ -228,7 +222,6 @@ class Curve3D : public Resource { Vector<Point> points; struct BakedPoint { - float ofs; Vector3 point; }; diff --git a/scene/resources/cylinder_shape_3d.cpp b/scene/resources/cylinder_shape_3d.cpp index 19f0542818..44786d6025 100644 --- a/scene/resources/cylinder_shape_3d.cpp +++ b/scene/resources/cylinder_shape_3d.cpp @@ -32,7 +32,6 @@ #include "servers/physics_server_3d.h" Vector<Vector3> CylinderShape3D::get_debug_mesh_lines() { - float radius = get_radius(); float height = get_height(); @@ -40,7 +39,6 @@ Vector<Vector3> CylinderShape3D::get_debug_mesh_lines() { Vector3 d(0, height * 0.5, 0); for (int i = 0; i < 360; i++) { - float ra = Math::deg2rad((float)i); float rb = Math::deg2rad((float)i + 1); Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * radius; @@ -53,7 +51,6 @@ Vector<Vector3> CylinderShape3D::get_debug_mesh_lines() { points.push_back(Vector3(b.x, 0, b.y) - d); if (i % 90 == 0) { - points.push_back(Vector3(a.x, 0, a.y) + d); points.push_back(Vector3(a.x, 0, a.y) - d); } @@ -67,7 +64,6 @@ real_t CylinderShape3D::get_enclosing_radius() const { } void CylinderShape3D::_update_shape() { - Dictionary d; d["radius"] = radius; d["height"] = height; @@ -76,7 +72,6 @@ void CylinderShape3D::_update_shape() { } void CylinderShape3D::set_radius(float p_radius) { - radius = p_radius; _update_shape(); notify_change_to_owners(); @@ -84,12 +79,10 @@ void CylinderShape3D::set_radius(float p_radius) { } float CylinderShape3D::get_radius() const { - return radius; } void CylinderShape3D::set_height(float p_height) { - height = p_height; _update_shape(); notify_change_to_owners(); @@ -97,12 +90,10 @@ void CylinderShape3D::set_height(float p_height) { } float CylinderShape3D::get_height() const { - return height; } void CylinderShape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_radius", "radius"), &CylinderShape3D::set_radius); ClassDB::bind_method(D_METHOD("get_radius"), &CylinderShape3D::get_radius); ClassDB::bind_method(D_METHOD("set_height", "height"), &CylinderShape3D::set_height); @@ -114,7 +105,6 @@ void CylinderShape3D::_bind_methods() { CylinderShape3D::CylinderShape3D() : Shape3D(PhysicsServer3D::get_singleton()->shape_create(PhysicsServer3D::SHAPE_CYLINDER)) { - radius = 1.0; height = 2.0; _update_shape(); diff --git a/scene/resources/cylinder_shape_3d.h b/scene/resources/cylinder_shape_3d.h index 7b37f733e0..23d206cbab 100644 --- a/scene/resources/cylinder_shape_3d.h +++ b/scene/resources/cylinder_shape_3d.h @@ -34,7 +34,6 @@ #include "scene/resources/shape_3d.h" class CylinderShape3D : public Shape3D { - GDCLASS(CylinderShape3D, Shape3D); float radius; float height; diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index a1e8bf51bd..67617a946f 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -45,13 +45,11 @@ static float scale = 1; template <class T> static Ref<StyleBoxTexture> make_stylebox(T p_src, float p_left, float p_top, float p_right, float p_botton, float p_margin_left = -1, float p_margin_top = -1, float p_margin_right = -1, float p_margin_botton = -1, bool p_draw_center = true) { - Ref<ImageTexture> texture; if (tex_cache->has(p_src)) { texture = (*tex_cache)[p_src]; } else { - texture = Ref<ImageTexture>(memnew(ImageTexture)); Ref<Image> img = memnew(Image(p_src)); @@ -89,7 +87,6 @@ static Ref<StyleBoxTexture> make_stylebox(T p_src, float p_left, float p_top, fl } static Ref<StyleBoxTexture> sb_expand(Ref<StyleBoxTexture> p_sbox, float p_left, float p_top, float p_right, float p_botton) { - p_sbox->set_expand_margin_size(MARGIN_LEFT, p_left * scale); p_sbox->set_expand_margin_size(MARGIN_TOP, p_top * scale); p_sbox->set_expand_margin_size(MARGIN_RIGHT, p_right * scale); @@ -99,7 +96,6 @@ static Ref<StyleBoxTexture> sb_expand(Ref<StyleBoxTexture> p_sbox, float p_left, template <class T> static Ref<Texture2D> make_icon(T p_src) { - Ref<ImageTexture> texture(memnew(ImageTexture)); Ref<Image> img = memnew(Image(p_src)); if (scale > 1) { @@ -121,7 +117,6 @@ static Ref<Texture2D> make_icon(T p_src) { } static Ref<BitmapFont> make_font(int p_height, int p_ascent, int p_charcount, const int *p_char_rects, int p_kerning_count, const int *p_kernings, int p_w, int p_h, const unsigned char *p_img) { - Ref<BitmapFont> font(memnew(BitmapFont)); Ref<Image> image = memnew(Image(p_img)); @@ -131,7 +126,6 @@ static Ref<BitmapFont> make_font(int p_height, int p_ascent, int p_charcount, co font->add_texture(tex); for (int i = 0; i < p_charcount; i++) { - const int *c = &p_char_rects[i * 8]; int chr = c[0]; @@ -147,7 +141,6 @@ static Ref<BitmapFont> make_font(int p_height, int p_ascent, int p_charcount, co } for (int i = 0; i < p_kerning_count; i++) { - font->add_kerning_pair(p_kernings[i * 3 + 0], p_kernings[i * 3 + 1], p_kernings[i * 3 + 2]); } @@ -158,7 +151,6 @@ static Ref<BitmapFont> make_font(int p_height, int p_ascent, int p_charcount, co } static Ref<StyleBox> make_empty_stylebox(float p_margin_left = -1, float p_margin_top = -1, float p_margin_right = -1, float p_margin_botton = -1) { - Ref<StyleBox> style(memnew(StyleBoxEmpty)); style->set_default_margin(MARGIN_LEFT, p_margin_left * scale); @@ -170,7 +162,6 @@ static Ref<StyleBox> make_empty_stylebox(float p_margin_left = -1, float p_margi } void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const Ref<Font> &large_font, Ref<Texture2D> &default_icon, Ref<StyleBox> &default_style, float p_scale) { - scale = p_scale; tex_cache = memnew(TexCacheMap); @@ -779,8 +770,9 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const // TooltipPanel Ref<StyleBoxTexture> style_tt = make_stylebox(tooltip_bg_png, 4, 4, 4, 4); - for (int i = 0; i < 4; i++) + for (int i = 0; i < 4; i++) { style_tt->set_expand_margin_size((Margin)i, 4 * scale); + } theme->set_stylebox("panel", "TooltipPanel", style_tt); @@ -867,7 +859,6 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const } void make_default_theme(bool p_hidpi, Ref<Font> p_font) { - Ref<Theme> t; t.instance(); @@ -891,7 +882,6 @@ void make_default_theme(bool p_hidpi, Ref<Font> p_font) { } void clear_default_theme() { - Theme::set_project_default(nullptr); Theme::set_default(nullptr); Theme::set_default_icon(nullptr); diff --git a/scene/resources/dynamic_font.cpp b/scene/resources/dynamic_font.cpp index 442151de36..3b4e4b73f8 100644 --- a/scene/resources/dynamic_font.cpp +++ b/scene/resources/dynamic_font.cpp @@ -46,7 +46,6 @@ bool DynamicFontData::CacheID::operator<(CacheID right) const { } Ref<DynamicFontAtSize> DynamicFontData::_get_dynamic_font_at_size(CacheID p_cache_id) { - if (size_cache.has(p_cache_id)) { return Ref<DynamicFontAtSize>(size_cache[p_cache_id]); } @@ -65,13 +64,11 @@ Ref<DynamicFontAtSize> DynamicFontData::_get_dynamic_font_at_size(CacheID p_cach } void DynamicFontData::set_font_ptr(const uint8_t *p_font_mem, int p_font_mem_size) { - font_mem = p_font_mem; font_mem_size = p_font_mem_size; } void DynamicFontData::set_font_path(const String &p_path) { - font_path = p_path; } @@ -80,7 +77,6 @@ String DynamicFontData::get_font_path() const { } void DynamicFontData::set_force_autohinter(bool p_force) { - force_autohinter = p_force; } @@ -103,7 +99,6 @@ void DynamicFontData::_bind_methods() { } DynamicFontData::DynamicFontData() { - antialiased = true; force_autohinter = false; hinting = DynamicFontData::HINTING_NORMAL; @@ -118,7 +113,6 @@ DynamicFontData::~DynamicFontData() { HashMap<String, Vector<uint8_t>> DynamicFontAtSize::_fontdata; Error DynamicFontAtSize::_load() { - int error = FT_Init_FreeType(&library); ERR_FAIL_COND_V_MSG(error != 0, ERR_CANT_CREATE, "Error initializing FreeType."); @@ -127,11 +121,9 @@ Error DynamicFontAtSize::_load() { if (OS::get_singleton()->get_name() == "Android" && font->font_mem == nullptr && font->font_path != String()) { // cache font only once for each font->font_path if (_fontdata.has(font->font_path)) { - font->set_font_ptr(_fontdata[font->font_path].ptr(), _fontdata[font->font_path].size()); } else { - FileAccess *f = FileAccess::open(font->font_path, FileAccess::READ); if (!f) { FT_Done_FreeType(library); @@ -149,7 +141,6 @@ Error DynamicFontAtSize::_load() { } if (font->font_mem == nullptr && font->font_path != String()) { - FileAccess *f = FileAccess::open(font->font_path, FileAccess::READ); if (!f) { FT_Done_FreeType(library); @@ -170,7 +161,6 @@ Error DynamicFontAtSize::_load() { fargs.stream = &stream; error = FT_Open_Face(library, &fargs, 0, &face); } else if (font->font_mem) { - memset(&stream, 0, sizeof(FT_StreamRec)); stream.base = (unsigned char *)font->font_mem; stream.size = font->font_mem_size; @@ -192,12 +182,10 @@ Error DynamicFontAtSize::_load() { //error = FT_New_Face( library, src_path.utf8().get_data(),0,&face ); if (error == FT_Err_Unknown_File_Format) { - FT_Done_FreeType(library); ERR_FAIL_V_MSG(ERR_FILE_CANT_OPEN, "Unknown font format."); } else if (error) { - FT_Done_FreeType(library); ERR_FAIL_V_MSG(ERR_FILE_CANT_OPEN, "Error loading font."); } @@ -232,26 +220,22 @@ Error DynamicFontAtSize::_load() { float DynamicFontAtSize::font_oversampling = 1.0; float DynamicFontAtSize::get_height() const { - return ascent + descent; } float DynamicFontAtSize::get_ascent() const { - return ascent; } -float DynamicFontAtSize::get_descent() const { +float DynamicFontAtSize::get_descent() const { return descent; } float DynamicFontAtSize::get_underline_position() const { - return underline_position; } float DynamicFontAtSize::get_underline_thickness() const { - return underline_thickness; } @@ -260,20 +244,20 @@ const Pair<const DynamicFontAtSize::Character *, DynamicFontAtSize *> DynamicFon ERR_FAIL_COND_V(!chr, (Pair<const Character *, DynamicFontAtSize *>(nullptr, nullptr))); if (!chr->found) { - //not found, try in fallbacks for (int i = 0; i < p_fallbacks.size(); i++) { - DynamicFontAtSize *fb = const_cast<DynamicFontAtSize *>(p_fallbacks[i].ptr()); - if (!fb->valid) + if (!fb->valid) { continue; + } fb->_update_char(p_char); const Character *fallback_chr = fb->char_map.getptr(p_char); ERR_CONTINUE(!fallback_chr); - if (!fallback_chr->found) + if (!fallback_chr->found) { continue; + } return Pair<const Character *, DynamicFontAtSize *>(fallback_chr, fb); } @@ -288,9 +272,9 @@ const Pair<const DynamicFontAtSize::Character *, DynamicFontAtSize *> DynamicFon } Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const Vector<Ref<DynamicFontAtSize>> &p_fallbacks) const { - - if (!valid) + if (!valid) { return Size2(1, 1); + } const_cast<DynamicFontAtSize *>(this)->_update_char(p_char); Pair<const Character *, DynamicFontAtSize *> char_pair_with_font = _find_char_with_font(p_char, p_fallbacks); @@ -307,9 +291,9 @@ Size2 DynamicFontAtSize::get_char_size(CharType p_char, CharType p_next, const V } float DynamicFontAtSize::draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_char, CharType p_next, const Color &p_modulate, const Vector<Ref<DynamicFontAtSize>> &p_fallbacks, bool p_advance_only, bool p_outline) const { - - if (!valid) + if (!valid) { return 0; + } const_cast<DynamicFontAtSize *>(this)->_update_char(p_char); @@ -358,20 +342,20 @@ float DynamicFontAtSize::draw_char(RID p_canvas_item, const Point2 &p_pos, CharT } unsigned long DynamicFontAtSize::_ft_stream_io(FT_Stream stream, unsigned long offset, unsigned char *buffer, unsigned long count) { - FileAccess *f = (FileAccess *)stream->descriptor.pointer; if (f->get_position() != offset) { f->seek(offset); } - if (count == 0) + if (count == 0) { return 0; + } return f->get_buffer(buffer, count); } -void DynamicFontAtSize::_ft_stream_close(FT_Stream stream) { +void DynamicFontAtSize::_ft_stream_close(FT_Stream stream) { FileAccess *f = (FileAccess *)stream->descriptor.pointer; f->close(); memdelete(f); @@ -397,27 +381,27 @@ DynamicFontAtSize::TexturePosition DynamicFontAtSize::_find_texture_pos_for_glyp int mh = p_height; for (int i = 0; i < textures.size(); i++) { - const CharTexture &ct = textures[i]; - if (ct.texture->get_format() != p_image_format) + if (ct.texture->get_format() != p_image_format) { continue; + } - if (mw > ct.texture_size || mh > ct.texture_size) //too big for this texture + if (mw > ct.texture_size || mh > ct.texture_size) { //too big for this texture continue; + } ret.y = 0x7FFFFFFF; ret.x = 0; for (int j = 0; j < ct.texture_size - mw; j++) { - int max_y = 0; for (int k = j; k < j + mw; k++) { - int y = ct.offsets[k]; - if (y > max_y) + if (y > max_y) { max_y = y; + } } if (max_y < ret.y) { @@ -426,8 +410,9 @@ DynamicFontAtSize::TexturePosition DynamicFontAtSize::_find_texture_pos_for_glyp } } - if (ret.y == 0x7FFFFFFF || ret.y + mh > ct.texture_size) + if (ret.y == 0x7FFFFFFF || ret.y + mh > ct.texture_size) { continue; //fail, could not fit it here + } ret.index = i; break; @@ -439,10 +424,12 @@ DynamicFontAtSize::TexturePosition DynamicFontAtSize::_find_texture_pos_for_glyp ret.y = 0; int texsize = MAX(id.size * oversampling * 8, 256); - if (mw > texsize) + if (mw > texsize) { texsize = mw; //special case, adapt to it? - if (mh > texsize) + } + if (mh > texsize) { texsize = mh; //special case, adapt to it? + } texsize = next_power_of_2(texsize); @@ -461,8 +448,9 @@ DynamicFontAtSize::TexturePosition DynamicFontAtSize::_find_texture_pos_for_glyp } } tex.offsets.resize(texsize); - for (int i = 0; i < texsize; i++) //zero offsets + for (int i = 0; i < texsize; i++) { //zero offsets tex.offsets.write[i] = 0; + } textures.push_back(tex); ret.index = textures.size() - 1; @@ -496,7 +484,6 @@ DynamicFontAtSize::Character DynamicFontAtSize::_bitmap_to_character(FT_Bitmap b for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { - int ofs = ((i + tex_pos.y + rect_margin) * tex.texture_size + j + tex_pos.x + rect_margin) * color_size; ERR_FAIL_COND_V(ofs >= tex.imgdata.size(), Character::not_found()); switch (bitmap.pixel_mode) { @@ -528,7 +515,6 @@ DynamicFontAtSize::Character DynamicFontAtSize::_bitmap_to_character(FT_Bitmap b //blit to image and texture { - Ref<Image> img = memnew(Image(tex.texture_size, tex.texture_size, 0, require_format, tex.imgdata)); if (tex.texture.is_null()) { @@ -562,23 +548,28 @@ DynamicFontAtSize::Character DynamicFontAtSize::_bitmap_to_character(FT_Bitmap b DynamicFontAtSize::Character DynamicFontAtSize::_make_outline_char(CharType p_char) { Character ret = Character::not_found(); - if (FT_Load_Char(face, p_char, FT_LOAD_NO_BITMAP | (font->force_autohinter ? FT_LOAD_FORCE_AUTOHINT : 0)) != 0) + if (FT_Load_Char(face, p_char, FT_LOAD_NO_BITMAP | (font->force_autohinter ? FT_LOAD_FORCE_AUTOHINT : 0)) != 0) { return ret; + } FT_Stroker stroker; - if (FT_Stroker_New(library, &stroker) != 0) + if (FT_Stroker_New(library, &stroker) != 0) { return ret; + } FT_Stroker_Set(stroker, (int)(id.outline_size * oversampling * 64.0), FT_STROKER_LINECAP_BUTT, FT_STROKER_LINEJOIN_ROUND, 0); FT_Glyph glyph; FT_BitmapGlyph glyph_bitmap; - if (FT_Get_Glyph(face->glyph, &glyph) != 0) + if (FT_Get_Glyph(face->glyph, &glyph) != 0) { goto cleanup_stroker; - if (FT_Glyph_Stroke(&glyph, stroker, 1) != 0) + } + if (FT_Glyph_Stroke(&glyph, stroker, 1) != 0) { goto cleanup_glyph; - if (FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, nullptr, 1) != 0) + } + if (FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, nullptr, 1) != 0) { goto cleanup_glyph; + } glyph_bitmap = (FT_BitmapGlyph)glyph; ret = _bitmap_to_character(glyph_bitmap->bitmap, glyph_bitmap->top, glyph_bitmap->left, glyph->advance.x / 65536.0); @@ -591,9 +582,9 @@ cleanup_stroker: } void DynamicFontAtSize::_update_char(CharType p_char) { - - if (char_map.has(p_char)) + if (char_map.has(p_char)) { return; + } _THREAD_SAFE_METHOD_ @@ -630,16 +621,18 @@ void DynamicFontAtSize::_update_char(CharType p_char) { character = _make_outline_char(p_char); } else { error = FT_Render_Glyph(face->glyph, font->antialiased ? FT_RENDER_MODE_NORMAL : FT_RENDER_MODE_MONO); - if (!error) + if (!error) { character = _bitmap_to_character(slot->bitmap, slot->bitmap_top, slot->bitmap_left, slot->advance.x / 64.0); + } } char_map[p_char] = character; } void DynamicFontAtSize::update_oversampling() { - if (oversampling == font_oversampling || !valid) + if (oversampling == font_oversampling || !valid) { return; + } FT_Done_FreeType(library); textures.clear(); @@ -650,7 +643,6 @@ void DynamicFontAtSize::update_oversampling() { } DynamicFontAtSize::DynamicFontAtSize() { - valid = false; rect_margin = 1; ascent = 1; @@ -661,7 +653,6 @@ DynamicFontAtSize::DynamicFontAtSize() { } DynamicFontAtSize::~DynamicFontAtSize() { - if (valid) { FT_Done_FreeType(library); } @@ -672,7 +663,6 @@ DynamicFontAtSize::~DynamicFontAtSize() { ///////////////////////// void DynamicFont::_reload_cache() { - ERR_FAIL_COND(cache_id.size < 1); if (!data.is_valid()) { data_at_size.unref(); @@ -694,8 +684,9 @@ void DynamicFont::_reload_cache() { for (int i = 0; i < fallbacks.size(); i++) { fallback_data_at_size.write[i] = fallbacks.write[i]->_get_dynamic_font_at_size(cache_id); - if (outline_cache_id.outline_size > 0) + if (outline_cache_id.outline_size > 0) { fallback_outline_data_at_size.write[i] = fallbacks.write[i]->_get_dynamic_font_at_size(outline_cache_id); + } } emit_changed(); @@ -703,7 +694,6 @@ void DynamicFont::_reload_cache() { } void DynamicFont::set_font_data(const Ref<DynamicFontData> &p_data) { - data = p_data; _reload_cache(); @@ -712,27 +702,26 @@ void DynamicFont::set_font_data(const Ref<DynamicFontData> &p_data) { } Ref<DynamicFontData> DynamicFont::get_font_data() const { - return data; } void DynamicFont::set_size(int p_size) { - - if (cache_id.size == p_size) + if (cache_id.size == p_size) { return; + } cache_id.size = p_size; outline_cache_id.size = p_size; _reload_cache(); } int DynamicFont::get_size() const { - return cache_id.size; } void DynamicFont::set_outline_size(int p_size) { - if (outline_cache_id.outline_size == p_size) + if (outline_cache_id.outline_size == p_size) { return; + } ERR_FAIL_COND(p_size < 0 || p_size > UINT8_MAX); outline_cache_id.outline_size = p_size; _reload_cache(); @@ -755,31 +744,28 @@ Color DynamicFont::get_outline_color() const { } bool DynamicFontData::is_antialiased() const { - return antialiased; } void DynamicFontData::set_antialiased(bool p_antialiased) { - - if (antialiased == p_antialiased) + if (antialiased == p_antialiased) { return; + } antialiased = p_antialiased; } DynamicFontData::Hinting DynamicFontData::get_hinting() const { - return hinting; } void DynamicFontData::set_hinting(Hinting p_hinting) { - - if (hinting == p_hinting) + if (hinting == p_hinting) { return; + } hinting = p_hinting; } int DynamicFont::get_spacing(int p_type) const { - if (p_type == SPACING_TOP) { return spacing_top; } else if (p_type == SPACING_BOTTOM) { @@ -794,7 +780,6 @@ int DynamicFont::get_spacing(int p_type) const { } void DynamicFont::set_spacing(int p_type, int p_value) { - if (p_type == SPACING_TOP) { spacing_top = p_value; } else if (p_type == SPACING_BOTTOM) { @@ -810,61 +795,61 @@ void DynamicFont::set_spacing(int p_type, int p_value) { } float DynamicFont::get_height() const { - - if (!data_at_size.is_valid()) + if (!data_at_size.is_valid()) { return 1; + } return data_at_size->get_height() + spacing_top + spacing_bottom; } float DynamicFont::get_ascent() const { - - if (!data_at_size.is_valid()) + if (!data_at_size.is_valid()) { return 1; + } return data_at_size->get_ascent() + spacing_top; } float DynamicFont::get_descent() const { - - if (!data_at_size.is_valid()) + if (!data_at_size.is_valid()) { return 1; + } return data_at_size->get_descent() + spacing_bottom; } float DynamicFont::get_underline_position() const { - - if (!data_at_size.is_valid()) + if (!data_at_size.is_valid()) { return 2; + } return data_at_size->get_underline_position(); } float DynamicFont::get_underline_thickness() const { - - if (!data_at_size.is_valid()) + if (!data_at_size.is_valid()) { return 1; + } return data_at_size->get_underline_thickness(); } Size2 DynamicFont::get_char_size(CharType p_char, CharType p_next) const { - - if (!data_at_size.is_valid()) + if (!data_at_size.is_valid()) { return Size2(1, 1); + } Size2 ret = data_at_size->get_char_size(p_char, p_next, fallback_data_at_size); - if (p_char == ' ') + if (p_char == ' ') { ret.width += spacing_space + spacing_char; - else if (p_next) + } else if (p_next) { ret.width += spacing_char; + } return ret; } bool DynamicFont::is_distance_field_hint() const { - return false; } @@ -875,8 +860,9 @@ bool DynamicFont::has_outline() const { float DynamicFont::draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_char, CharType p_next, const Color &p_modulate, bool p_outline) const { const Ref<DynamicFontAtSize> &font_at_size = p_outline && outline_cache_id.outline_size > 0 ? outline_data_at_size : data_at_size; - if (!font_at_size.is_valid()) + if (!font_at_size.is_valid()) { return 0; + } const Vector<Ref<DynamicFontAtSize>> &fallbacks = p_outline && outline_cache_id.outline_size > 0 ? fallback_outline_data_at_size : fallback_data_at_size; Color color = p_outline && outline_cache_id.outline_size > 0 ? p_modulate * outline_color : p_modulate; @@ -887,7 +873,6 @@ float DynamicFont::draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_ } void DynamicFont::set_fallback(int p_idx, const Ref<DynamicFontData> &p_data) { - ERR_FAIL_COND(p_data.is_null()); ERR_FAIL_INDEX(p_idx, fallbacks.size()); fallbacks.write[p_idx] = p_data; @@ -895,12 +880,12 @@ void DynamicFont::set_fallback(int p_idx, const Ref<DynamicFontData> &p_data) { } void DynamicFont::add_fallback(const Ref<DynamicFontData> &p_data) { - ERR_FAIL_COND(p_data.is_null()); fallbacks.push_back(p_data); fallback_data_at_size.push_back(fallbacks.write[fallbacks.size() - 1]->_get_dynamic_font_at_size(cache_id)); //const.. - if (outline_cache_id.outline_size > 0) + if (outline_cache_id.outline_size > 0) { fallback_outline_data_at_size.push_back(fallbacks.write[fallbacks.size() - 1]->_get_dynamic_font_at_size(outline_cache_id)); + } _change_notify(); emit_changed(); @@ -910,14 +895,14 @@ void DynamicFont::add_fallback(const Ref<DynamicFontData> &p_data) { int DynamicFont::get_fallback_count() const { return fallbacks.size(); } -Ref<DynamicFontData> DynamicFont::get_fallback(int p_idx) const { +Ref<DynamicFontData> DynamicFont::get_fallback(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, fallbacks.size(), Ref<DynamicFontData>()); return fallbacks[p_idx]; } -void DynamicFont::remove_fallback(int p_idx) { +void DynamicFont::remove_fallback(int p_idx) { ERR_FAIL_INDEX(p_idx, fallbacks.size()); fallbacks.remove(p_idx); fallback_data_at_size.remove(p_idx); @@ -926,7 +911,6 @@ void DynamicFont::remove_fallback(int p_idx) { } bool DynamicFont::_set(const StringName &p_name, const Variant &p_value) { - String str = p_name; if (str.begins_with("fallback/")) { int idx = str.get_slicec('/', 1).to_int(); @@ -952,7 +936,6 @@ bool DynamicFont::_set(const StringName &p_name, const Variant &p_value) { } bool DynamicFont::_get(const StringName &p_name, Variant &r_ret) const { - String str = p_name; if (str.begins_with("fallback/")) { int idx = str.get_slicec('/', 1).to_int(); @@ -968,8 +951,8 @@ bool DynamicFont::_get(const StringName &p_name, Variant &r_ret) const { return false; } -void DynamicFont::_get_property_list(List<PropertyInfo> *p_list) const { +void DynamicFont::_get_property_list(List<PropertyInfo> *p_list) const { for (int i = 0; i < fallbacks.size(); i++) { p_list->push_back(PropertyInfo(Variant::OBJECT, "fallback/" + itos(i), PROPERTY_HINT_RESOURCE_TYPE, "DynamicFontData")); } @@ -978,7 +961,6 @@ void DynamicFont::_get_property_list(List<PropertyInfo> *p_list) const { } void DynamicFont::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_font_data", "data"), &DynamicFont::set_font_data); ClassDB::bind_method(D_METHOD("get_font_data"), &DynamicFont::get_font_data); @@ -1024,7 +1006,6 @@ SelfList<DynamicFont>::List *DynamicFont::dynamic_fonts = nullptr; DynamicFont::DynamicFont() : font_list(this) { - valid = false; cache_id.size = 16; outline_cache_id.size = 16; @@ -1053,14 +1034,12 @@ void DynamicFont::finish_dynamic_fonts() { } void DynamicFont::update_oversampling() { - Vector<Ref<DynamicFont>> changed; { MutexLock lock(dynamic_font_mutex); SelfList<DynamicFont> *E = dynamic_fonts->first(); while (E) { - if (E->self()->data_at_size.is_valid()) { E->self()->data_at_size->update_oversampling(); @@ -1093,36 +1072,35 @@ void DynamicFont::update_oversampling() { ///////////////////////// RES ResourceFormatLoaderDynamicFont::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { - - if (r_error) + if (r_error) { *r_error = ERR_FILE_CANT_OPEN; + } Ref<DynamicFontData> dfont; dfont.instance(); dfont->set_font_path(p_path); - if (r_error) + if (r_error) { *r_error = OK; + } return dfont; } void ResourceFormatLoaderDynamicFont::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back("ttf"); p_extensions->push_back("otf"); } bool ResourceFormatLoaderDynamicFont::handles_type(const String &p_type) const { - return (p_type == "DynamicFontData"); } String ResourceFormatLoaderDynamicFont::get_resource_type(const String &p_path) const { - String el = p_path.get_extension().to_lower(); - if (el == "ttf" || el == "otf") + if (el == "ttf" || el == "otf") { return "DynamicFontData"; + } return ""; } diff --git a/scene/resources/dynamic_font.h b/scene/resources/dynamic_font.h index 2fa1951d27..08ad20a92d 100644 --- a/scene/resources/dynamic_font.h +++ b/scene/resources/dynamic_font.h @@ -47,7 +47,6 @@ class DynamicFontAtSize; class DynamicFont; class DynamicFontData : public Resource { - GDCLASS(DynamicFontData, Resource); public: @@ -109,7 +108,6 @@ public: VARIANT_ENUM_CAST(DynamicFontData::Hinting); class DynamicFontAtSize : public Reference { - GDCLASS(DynamicFontAtSize, Reference); _THREAD_SAFE_CLASS_ @@ -130,7 +128,6 @@ class DynamicFontAtSize : public Reference { bool valid; struct CharTexture { - Vector<uint8_t> imgdata; int texture_size; Vector<int> offsets; @@ -140,7 +137,6 @@ class DynamicFontAtSize : public Reference { Vector<CharTexture> textures; struct Character { - bool found; int texture_idx; Rect2 rect; @@ -206,7 +202,6 @@ public: /////////////// class DynamicFont : public Font { - GDCLASS(DynamicFont, Font); public: diff --git a/scene/resources/environment.cpp b/scene/resources/environment.cpp index abbe579307..80ee0c148d 100644 --- a/scene/resources/environment.cpp +++ b/scene/resources/environment.cpp @@ -34,60 +34,57 @@ #include "texture.h" RID Environment::get_rid() const { - return environment; } void Environment::set_background(BGMode p_bg) { - bg_mode = p_bg; RS::get_singleton()->environment_set_background(environment, RS::EnvironmentBG(p_bg)); _change_notify(); } void Environment::set_sky(const Ref<Sky> &p_sky) { - bg_sky = p_sky; RID sb_rid; - if (bg_sky.is_valid()) + if (bg_sky.is_valid()) { sb_rid = bg_sky->get_rid(); + } RS::get_singleton()->environment_set_sky(environment, sb_rid); } void Environment::set_sky_custom_fov(float p_scale) { - bg_sky_custom_fov = p_scale; RS::get_singleton()->environment_set_sky_custom_fov(environment, p_scale); } -void Environment::set_bg_color(const Color &p_color) { +void Environment::set_bg_color(const Color &p_color) { bg_color = p_color; RS::get_singleton()->environment_set_bg_color(environment, p_color); } -void Environment::set_bg_energy(float p_energy) { +void Environment::set_bg_energy(float p_energy) { bg_energy = p_energy; RS::get_singleton()->environment_set_bg_energy(environment, p_energy); } -void Environment::set_canvas_max_layer(int p_max_layer) { +void Environment::set_canvas_max_layer(int p_max_layer) { bg_canvas_max_layer = p_max_layer; RS::get_singleton()->environment_set_canvas_max_layer(environment, p_max_layer); } -void Environment::set_ambient_light_color(const Color &p_color) { +void Environment::set_ambient_light_color(const Color &p_color) { ambient_color = p_color; RS::get_singleton()->environment_set_ambient_light(environment, ambient_color, RS::EnvironmentAmbientSource(ambient_source), ambient_energy, ambient_sky_contribution, RS::EnvironmentReflectionSource(reflection_source), ao_color); } -void Environment::set_ambient_light_energy(float p_energy) { +void Environment::set_ambient_light_energy(float p_energy) { ambient_energy = p_energy; RS::get_singleton()->environment_set_ambient_light(environment, ambient_color, RS::EnvironmentAmbientSource(ambient_source), ambient_energy, ambient_sky_contribution, RS::EnvironmentReflectionSource(reflection_source), ao_color); } -void Environment::set_ambient_light_sky_contribution(float p_energy) { +void Environment::set_ambient_light_sky_contribution(float p_energy) { ambient_sky_contribution = p_energy; RS::get_singleton()->environment_set_ambient_light(environment, ambient_color, RS::EnvironmentAmbientSource(ambient_source), ambient_energy, ambient_sky_contribution, RS::EnvironmentReflectionSource(reflection_source), ao_color); } @@ -108,25 +105,25 @@ void Environment::set_ambient_source(AmbientSource p_source) { Environment::AmbientSource Environment::get_ambient_source() const { return ambient_source; } + void Environment::set_reflection_source(ReflectionSource p_source) { reflection_source = p_source; RS::get_singleton()->environment_set_ambient_light(environment, ambient_color, RS::EnvironmentAmbientSource(ambient_source), ambient_energy, ambient_sky_contribution, RS::EnvironmentReflectionSource(reflection_source), ao_color); } + Environment::ReflectionSource Environment::get_reflection_source() const { return reflection_source; } Environment::BGMode Environment::get_background() const { - return bg_mode; } -Ref<Sky> Environment::get_sky() const { +Ref<Sky> Environment::get_sky() const { return bg_sky; } float Environment::get_sky_custom_fov() const { - return bg_sky_custom_fov; } @@ -136,176 +133,157 @@ void Environment::set_sky_rotation(const Vector3 &p_rotation) { } Vector3 Environment::get_sky_rotation() const { - return sky_rotation; } Color Environment::get_bg_color() const { - return bg_color; } -float Environment::get_bg_energy() const { +float Environment::get_bg_energy() const { return bg_energy; } -int Environment::get_canvas_max_layer() const { +int Environment::get_canvas_max_layer() const { return bg_canvas_max_layer; } -Color Environment::get_ambient_light_color() const { +Color Environment::get_ambient_light_color() const { return ambient_color; } -float Environment::get_ambient_light_energy() const { +float Environment::get_ambient_light_energy() const { return ambient_energy; } -float Environment::get_ambient_light_sky_contribution() const { +float Environment::get_ambient_light_sky_contribution() const { return ambient_sky_contribution; } -int Environment::get_camera_feed_id() const { +int Environment::get_camera_feed_id() const { return camera_feed_id; } void Environment::set_tonemapper(ToneMapper p_tone_mapper) { - tone_mapper = p_tone_mapper; RS::get_singleton()->environment_set_tonemap(environment, RS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey); } Environment::ToneMapper Environment::get_tonemapper() const { - return tone_mapper; } void Environment::set_tonemap_exposure(float p_exposure) { - tonemap_exposure = p_exposure; RS::get_singleton()->environment_set_tonemap(environment, RS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey); } float Environment::get_tonemap_exposure() const { - return tonemap_exposure; } void Environment::set_tonemap_white(float p_white) { - tonemap_white = p_white; RS::get_singleton()->environment_set_tonemap(environment, RS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey); } -float Environment::get_tonemap_white() const { +float Environment::get_tonemap_white() const { return tonemap_white; } void Environment::set_tonemap_auto_exposure(bool p_enabled) { - tonemap_auto_exposure = p_enabled; RS::get_singleton()->environment_set_tonemap(environment, RS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey); _change_notify(); } -bool Environment::get_tonemap_auto_exposure() const { +bool Environment::get_tonemap_auto_exposure() const { return tonemap_auto_exposure; } void Environment::set_tonemap_auto_exposure_max(float p_auto_exposure_max) { - tonemap_auto_exposure_max = p_auto_exposure_max; RS::get_singleton()->environment_set_tonemap(environment, RS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey); } -float Environment::get_tonemap_auto_exposure_max() const { +float Environment::get_tonemap_auto_exposure_max() const { return tonemap_auto_exposure_max; } void Environment::set_tonemap_auto_exposure_min(float p_auto_exposure_min) { - tonemap_auto_exposure_min = p_auto_exposure_min; RS::get_singleton()->environment_set_tonemap(environment, RS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey); } -float Environment::get_tonemap_auto_exposure_min() const { +float Environment::get_tonemap_auto_exposure_min() const { return tonemap_auto_exposure_min; } void Environment::set_tonemap_auto_exposure_speed(float p_auto_exposure_speed) { - tonemap_auto_exposure_speed = p_auto_exposure_speed; RS::get_singleton()->environment_set_tonemap(environment, RS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey); } -float Environment::get_tonemap_auto_exposure_speed() const { +float Environment::get_tonemap_auto_exposure_speed() const { return tonemap_auto_exposure_speed; } void Environment::set_tonemap_auto_exposure_grey(float p_auto_exposure_grey) { - tonemap_auto_exposure_grey = p_auto_exposure_grey; RS::get_singleton()->environment_set_tonemap(environment, RS::EnvironmentToneMapper(tone_mapper), tonemap_exposure, tonemap_white, tonemap_auto_exposure, tonemap_auto_exposure_min, tonemap_auto_exposure_max, tonemap_auto_exposure_speed, tonemap_auto_exposure_grey); } -float Environment::get_tonemap_auto_exposure_grey() const { +float Environment::get_tonemap_auto_exposure_grey() const { return tonemap_auto_exposure_grey; } void Environment::set_adjustment_enable(bool p_enable) { - adjustment_enabled = p_enable; RS::get_singleton()->environment_set_adjustment(environment, adjustment_enabled, adjustment_brightness, adjustment_contrast, adjustment_saturation, adjustment_color_correction.is_valid() ? adjustment_color_correction->get_rid() : RID()); _change_notify(); } bool Environment::is_adjustment_enabled() const { - return adjustment_enabled; } void Environment::set_adjustment_brightness(float p_brightness) { - adjustment_brightness = p_brightness; RS::get_singleton()->environment_set_adjustment(environment, adjustment_enabled, adjustment_brightness, adjustment_contrast, adjustment_saturation, adjustment_color_correction.is_valid() ? adjustment_color_correction->get_rid() : RID()); } -float Environment::get_adjustment_brightness() const { +float Environment::get_adjustment_brightness() const { return adjustment_brightness; } void Environment::set_adjustment_contrast(float p_contrast) { - adjustment_contrast = p_contrast; RS::get_singleton()->environment_set_adjustment(environment, adjustment_enabled, adjustment_brightness, adjustment_contrast, adjustment_saturation, adjustment_color_correction.is_valid() ? adjustment_color_correction->get_rid() : RID()); } -float Environment::get_adjustment_contrast() const { +float Environment::get_adjustment_contrast() const { return adjustment_contrast; } void Environment::set_adjustment_saturation(float p_saturation) { - adjustment_saturation = p_saturation; RS::get_singleton()->environment_set_adjustment(environment, adjustment_enabled, adjustment_brightness, adjustment_contrast, adjustment_saturation, adjustment_color_correction.is_valid() ? adjustment_color_correction->get_rid() : RID()); } -float Environment::get_adjustment_saturation() const { +float Environment::get_adjustment_saturation() const { return adjustment_saturation; } void Environment::set_adjustment_color_correction(const Ref<Texture2D> &p_ramp) { - adjustment_color_correction = p_ramp; RS::get_singleton()->environment_set_adjustment(environment, adjustment_enabled, adjustment_brightness, adjustment_contrast, adjustment_saturation, adjustment_color_correction.is_valid() ? adjustment_color_correction->get_rid() : RID()); } -Ref<Texture2D> Environment::get_adjustment_color_correction() const { +Ref<Texture2D> Environment::get_adjustment_color_correction() const { return adjustment_color_correction; } void Environment::_validate_property(PropertyInfo &property) const { - if (property.name == "sky" || property.name == "sky_custom_fov" || property.name == "sky_rotation" || property.name == "ambient_light/sky_contribution") { if (bg_mode != BG_SKY && ambient_source != AMBIENT_SOURCE_SKY && reflection_source != REFLECTION_SOURCE_SKY) { property.usage = PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL; @@ -387,409 +365,364 @@ void Environment::_validate_property(PropertyInfo &property) const { } void Environment::set_ssr_enabled(bool p_enable) { - ssr_enabled = p_enable; RS::get_singleton()->environment_set_ssr(environment, ssr_enabled, ssr_max_steps, ssr_fade_in, ssr_fade_out, ssr_depth_tolerance); _change_notify(); } bool Environment::is_ssr_enabled() const { - return ssr_enabled; } void Environment::set_ssr_max_steps(int p_steps) { - ssr_max_steps = p_steps; RS::get_singleton()->environment_set_ssr(environment, ssr_enabled, ssr_max_steps, ssr_fade_in, ssr_fade_out, ssr_depth_tolerance); } -int Environment::get_ssr_max_steps() const { +int Environment::get_ssr_max_steps() const { return ssr_max_steps; } void Environment::set_ssr_fade_in(float p_fade_in) { - ssr_fade_in = p_fade_in; RS::get_singleton()->environment_set_ssr(environment, ssr_enabled, ssr_max_steps, ssr_fade_in, ssr_fade_out, ssr_depth_tolerance); } -float Environment::get_ssr_fade_in() const { +float Environment::get_ssr_fade_in() const { return ssr_fade_in; } void Environment::set_ssr_fade_out(float p_fade_out) { - ssr_fade_out = p_fade_out; RS::get_singleton()->environment_set_ssr(environment, ssr_enabled, ssr_max_steps, ssr_fade_in, ssr_fade_out, ssr_depth_tolerance); } -float Environment::get_ssr_fade_out() const { +float Environment::get_ssr_fade_out() const { return ssr_fade_out; } void Environment::set_ssr_depth_tolerance(float p_depth_tolerance) { - ssr_depth_tolerance = p_depth_tolerance; RS::get_singleton()->environment_set_ssr(environment, ssr_enabled, ssr_max_steps, ssr_fade_in, ssr_fade_out, ssr_depth_tolerance); } -float Environment::get_ssr_depth_tolerance() const { +float Environment::get_ssr_depth_tolerance() const { return ssr_depth_tolerance; } void Environment::set_ssao_enabled(bool p_enable) { - ssao_enabled = p_enable; RS::get_singleton()->environment_set_ssao(environment, ssao_enabled, ssao_radius, ssao_intensity, ssao_bias, ssao_direct_light_affect, ssao_ao_channel_affect, RS::EnvironmentSSAOBlur(ssao_blur), ssao_edge_sharpness); _change_notify(); } bool Environment::is_ssao_enabled() const { - return ssao_enabled; } void Environment::set_ssao_radius(float p_radius) { - ssao_radius = p_radius; RS::get_singleton()->environment_set_ssao(environment, ssao_enabled, ssao_radius, ssao_intensity, ssao_bias, ssao_direct_light_affect, ssao_ao_channel_affect, RS::EnvironmentSSAOBlur(ssao_blur), ssao_edge_sharpness); } -float Environment::get_ssao_radius() const { +float Environment::get_ssao_radius() const { return ssao_radius; } void Environment::set_ssao_intensity(float p_intensity) { - ssao_intensity = p_intensity; RS::get_singleton()->environment_set_ssao(environment, ssao_enabled, ssao_radius, ssao_intensity, ssao_bias, ssao_direct_light_affect, ssao_ao_channel_affect, RS::EnvironmentSSAOBlur(ssao_blur), ssao_edge_sharpness); } float Environment::get_ssao_intensity() const { - return ssao_intensity; } void Environment::set_ssao_bias(float p_bias) { - ssao_bias = p_bias; RS::get_singleton()->environment_set_ssao(environment, ssao_enabled, ssao_radius, ssao_intensity, ssao_bias, ssao_direct_light_affect, ssao_ao_channel_affect, RS::EnvironmentSSAOBlur(ssao_blur), ssao_edge_sharpness); } -float Environment::get_ssao_bias() const { +float Environment::get_ssao_bias() const { return ssao_bias; } void Environment::set_ssao_direct_light_affect(float p_direct_light_affect) { - ssao_direct_light_affect = p_direct_light_affect; RS::get_singleton()->environment_set_ssao(environment, ssao_enabled, ssao_radius, ssao_intensity, ssao_bias, ssao_direct_light_affect, ssao_ao_channel_affect, RS::EnvironmentSSAOBlur(ssao_blur), ssao_edge_sharpness); } -float Environment::get_ssao_direct_light_affect() const { +float Environment::get_ssao_direct_light_affect() const { return ssao_direct_light_affect; } void Environment::set_ssao_ao_channel_affect(float p_ao_channel_affect) { - ssao_ao_channel_affect = p_ao_channel_affect; RS::get_singleton()->environment_set_ssao(environment, ssao_enabled, ssao_radius, ssao_intensity, ssao_bias, ssao_direct_light_affect, ssao_ao_channel_affect, RS::EnvironmentSSAOBlur(ssao_blur), ssao_edge_sharpness); } -float Environment::get_ssao_ao_channel_affect() const { +float Environment::get_ssao_ao_channel_affect() const { return ssao_ao_channel_affect; } void Environment::set_ao_color(const Color &p_color) { - ao_color = p_color; RS::get_singleton()->environment_set_ambient_light(environment, ambient_color, RS::EnvironmentAmbientSource(ambient_source), ambient_energy, ambient_sky_contribution, RS::EnvironmentReflectionSource(reflection_source), ao_color); } Color Environment::get_ao_color() const { - return ao_color; } void Environment::set_ssao_blur(SSAOBlur p_blur) { - ssao_blur = p_blur; RS::get_singleton()->environment_set_ssao(environment, ssao_enabled, ssao_radius, ssao_intensity, ssao_bias, ssao_direct_light_affect, ssao_ao_channel_affect, RS::EnvironmentSSAOBlur(ssao_blur), ssao_edge_sharpness); } -Environment::SSAOBlur Environment::get_ssao_blur() const { +Environment::SSAOBlur Environment::get_ssao_blur() const { return ssao_blur; } void Environment::set_ssao_edge_sharpness(float p_edge_sharpness) { - ssao_edge_sharpness = p_edge_sharpness; RS::get_singleton()->environment_set_ssao(environment, ssao_enabled, ssao_radius, ssao_intensity, ssao_bias, ssao_direct_light_affect, ssao_ao_channel_affect, RS::EnvironmentSSAOBlur(ssao_blur), ssao_edge_sharpness); } float Environment::get_ssao_edge_sharpness() const { - return ssao_edge_sharpness; } void Environment::set_glow_enabled(bool p_enabled) { - glow_enabled = p_enabled; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); _change_notify(); } bool Environment::is_glow_enabled() const { - return glow_enabled; } void Environment::set_glow_level(int p_level, bool p_enabled) { - ERR_FAIL_INDEX(p_level, RS::MAX_GLOW_LEVELS); - if (p_enabled) + if (p_enabled) { glow_levels |= (1 << p_level); - else + } else { glow_levels &= ~(1 << p_level); + } RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); } -bool Environment::is_glow_level_enabled(int p_level) const { +bool Environment::is_glow_level_enabled(int p_level) const { ERR_FAIL_INDEX_V(p_level, RS::MAX_GLOW_LEVELS, false); return glow_levels & (1 << p_level); } void Environment::set_glow_intensity(float p_intensity) { - glow_intensity = p_intensity; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); } -float Environment::get_glow_intensity() const { +float Environment::get_glow_intensity() const { return glow_intensity; } void Environment::set_glow_strength(float p_strength) { - glow_strength = p_strength; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); } -float Environment::get_glow_strength() const { +float Environment::get_glow_strength() const { return glow_strength; } void Environment::set_glow_mix(float p_mix) { - glow_mix = p_mix; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); } -float Environment::get_glow_mix() const { +float Environment::get_glow_mix() const { return glow_mix; } void Environment::set_glow_bloom(float p_threshold) { - glow_bloom = p_threshold; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); } -float Environment::get_glow_bloom() const { +float Environment::get_glow_bloom() const { return glow_bloom; } void Environment::set_glow_blend_mode(GlowBlendMode p_mode) { - glow_blend_mode = p_mode; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); _change_notify(); } -Environment::GlowBlendMode Environment::get_glow_blend_mode() const { +Environment::GlowBlendMode Environment::get_glow_blend_mode() const { return glow_blend_mode; } void Environment::set_glow_hdr_bleed_threshold(float p_threshold) { - glow_hdr_bleed_threshold = p_threshold; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); } -float Environment::get_glow_hdr_bleed_threshold() const { +float Environment::get_glow_hdr_bleed_threshold() const { return glow_hdr_bleed_threshold; } void Environment::set_glow_hdr_luminance_cap(float p_amount) { - glow_hdr_luminance_cap = p_amount; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); } -float Environment::get_glow_hdr_luminance_cap() const { +float Environment::get_glow_hdr_luminance_cap() const { return glow_hdr_luminance_cap; } void Environment::set_glow_hdr_bleed_scale(float p_scale) { - glow_hdr_bleed_scale = p_scale; RS::get_singleton()->environment_set_glow(environment, glow_enabled, glow_levels, glow_intensity, glow_strength, glow_mix, glow_bloom, RS::EnvironmentGlowBlendMode(glow_blend_mode), glow_hdr_bleed_threshold, glow_hdr_bleed_threshold, glow_hdr_luminance_cap); } -float Environment::get_glow_hdr_bleed_scale() const { +float Environment::get_glow_hdr_bleed_scale() const { return glow_hdr_bleed_scale; } void Environment::set_fog_enabled(bool p_enabled) { - fog_enabled = p_enabled; RS::get_singleton()->environment_set_fog(environment, fog_enabled, fog_color, fog_sun_color, fog_sun_amount); _change_notify(); } bool Environment::is_fog_enabled() const { - return fog_enabled; } void Environment::set_fog_color(const Color &p_color) { - fog_color = p_color; RS::get_singleton()->environment_set_fog(environment, fog_enabled, fog_color, fog_sun_color, fog_sun_amount); } -Color Environment::get_fog_color() const { +Color Environment::get_fog_color() const { return fog_color; } void Environment::set_fog_sun_color(const Color &p_color) { - fog_sun_color = p_color; RS::get_singleton()->environment_set_fog(environment, fog_enabled, fog_color, fog_sun_color, fog_sun_amount); } -Color Environment::get_fog_sun_color() const { +Color Environment::get_fog_sun_color() const { return fog_sun_color; } void Environment::set_fog_sun_amount(float p_amount) { - fog_sun_amount = p_amount; RS::get_singleton()->environment_set_fog(environment, fog_enabled, fog_color, fog_sun_color, fog_sun_amount); } -float Environment::get_fog_sun_amount() const { +float Environment::get_fog_sun_amount() const { return fog_sun_amount; } void Environment::set_fog_depth_enabled(bool p_enabled) { - fog_depth_enabled = p_enabled; RS::get_singleton()->environment_set_fog_depth(environment, fog_depth_enabled, fog_depth_begin, fog_depth_end, fog_depth_curve, fog_transmit_enabled, fog_transmit_curve); } -bool Environment::is_fog_depth_enabled() const { +bool Environment::is_fog_depth_enabled() const { return fog_depth_enabled; } void Environment::set_fog_depth_begin(float p_distance) { - fog_depth_begin = p_distance; RS::get_singleton()->environment_set_fog_depth(environment, fog_depth_enabled, fog_depth_begin, fog_depth_end, fog_depth_curve, fog_transmit_enabled, fog_transmit_curve); } -float Environment::get_fog_depth_begin() const { +float Environment::get_fog_depth_begin() const { return fog_depth_begin; } void Environment::set_fog_depth_end(float p_distance) { - fog_depth_end = p_distance; RS::get_singleton()->environment_set_fog_depth(environment, fog_depth_enabled, fog_depth_begin, fog_depth_end, fog_depth_curve, fog_transmit_enabled, fog_transmit_curve); } float Environment::get_fog_depth_end() const { - return fog_depth_end; } void Environment::set_fog_depth_curve(float p_curve) { - fog_depth_curve = p_curve; RS::get_singleton()->environment_set_fog_depth(environment, fog_depth_enabled, fog_depth_begin, fog_depth_end, fog_depth_curve, fog_transmit_enabled, fog_transmit_curve); } -float Environment::get_fog_depth_curve() const { +float Environment::get_fog_depth_curve() const { return fog_depth_curve; } void Environment::set_fog_transmit_enabled(bool p_enabled) { - fog_transmit_enabled = p_enabled; RS::get_singleton()->environment_set_fog_depth(environment, fog_depth_enabled, fog_depth_begin, fog_depth_end, fog_depth_curve, fog_transmit_enabled, fog_transmit_curve); } -bool Environment::is_fog_transmit_enabled() const { +bool Environment::is_fog_transmit_enabled() const { return fog_transmit_enabled; } void Environment::set_fog_transmit_curve(float p_curve) { - fog_transmit_curve = p_curve; RS::get_singleton()->environment_set_fog_depth(environment, fog_depth_enabled, fog_depth_begin, fog_depth_end, fog_depth_curve, fog_transmit_enabled, fog_transmit_curve); } -float Environment::get_fog_transmit_curve() const { +float Environment::get_fog_transmit_curve() const { return fog_transmit_curve; } void Environment::set_fog_height_enabled(bool p_enabled) { - fog_height_enabled = p_enabled; RS::get_singleton()->environment_set_fog_height(environment, fog_height_enabled, fog_height_min, fog_height_max, fog_height_curve); } -bool Environment::is_fog_height_enabled() const { +bool Environment::is_fog_height_enabled() const { return fog_height_enabled; } void Environment::set_fog_height_min(float p_distance) { - fog_height_min = p_distance; RS::get_singleton()->environment_set_fog_height(environment, fog_height_enabled, fog_height_min, fog_height_max, fog_height_curve); } -float Environment::get_fog_height_min() const { +float Environment::get_fog_height_min() const { return fog_height_min; } void Environment::set_fog_height_max(float p_distance) { - fog_height_max = p_distance; RS::get_singleton()->environment_set_fog_height(environment, fog_height_enabled, fog_height_min, fog_height_max, fog_height_curve); } -float Environment::get_fog_height_max() const { +float Environment::get_fog_height_max() const { return fog_height_max; } void Environment::set_fog_height_curve(float p_distance) { - fog_height_curve = p_distance; RS::get_singleton()->environment_set_fog_height(environment, fog_height_enabled, fog_height_min, fog_height_max, fog_height_curve); } -float Environment::get_fog_height_curve() const { +float Environment::get_fog_height_curve() const { return fog_height_curve; } @@ -813,7 +746,6 @@ bool Environment::_set(const StringName &p_name, const Variant &p_value) { #endif void Environment::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_background", "mode"), &Environment::set_background); ClassDB::bind_method(D_METHOD("set_sky", "sky"), &Environment::set_sky); ClassDB::bind_method(D_METHOD("set_sky_custom_fov", "scale"), &Environment::set_sky_custom_fov); @@ -1118,7 +1050,6 @@ void Environment::_bind_methods() { } Environment::Environment() { - environment = RS::get_singleton()->environment_create(); bg_mode = BG_CLEAR_COLOR; @@ -1200,84 +1131,72 @@ Environment::Environment() { } Environment::~Environment() { - RS::get_singleton()->free(environment); } ////////////////////// void CameraEffects::set_dof_blur_far_enabled(bool p_enable) { - dof_blur_far_enabled = p_enable; RS::get_singleton()->camera_effects_set_dof_blur(camera_effects, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_near_enabled, dof_blur_near_distance, dof_blur_near_transition, dof_blur_amount); } bool CameraEffects::is_dof_blur_far_enabled() const { - return dof_blur_far_enabled; } void CameraEffects::set_dof_blur_far_distance(float p_distance) { - dof_blur_far_distance = p_distance; RS::get_singleton()->camera_effects_set_dof_blur(camera_effects, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_near_enabled, dof_blur_near_distance, dof_blur_near_transition, dof_blur_amount); } -float CameraEffects::get_dof_blur_far_distance() const { +float CameraEffects::get_dof_blur_far_distance() const { return dof_blur_far_distance; } void CameraEffects::set_dof_blur_far_transition(float p_distance) { - dof_blur_far_transition = p_distance; RS::get_singleton()->camera_effects_set_dof_blur(camera_effects, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_near_enabled, dof_blur_near_distance, dof_blur_near_transition, dof_blur_amount); } -float CameraEffects::get_dof_blur_far_transition() const { +float CameraEffects::get_dof_blur_far_transition() const { return dof_blur_far_transition; } void CameraEffects::set_dof_blur_near_enabled(bool p_enable) { - dof_blur_near_enabled = p_enable; RS::get_singleton()->camera_effects_set_dof_blur(camera_effects, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_near_enabled, dof_blur_near_distance, dof_blur_near_transition, dof_blur_amount); _change_notify(); } bool CameraEffects::is_dof_blur_near_enabled() const { - return dof_blur_near_enabled; } void CameraEffects::set_dof_blur_near_distance(float p_distance) { - dof_blur_near_distance = p_distance; RS::get_singleton()->camera_effects_set_dof_blur(camera_effects, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_near_enabled, dof_blur_near_distance, dof_blur_near_transition, dof_blur_amount); } float CameraEffects::get_dof_blur_near_distance() const { - return dof_blur_near_distance; } void CameraEffects::set_dof_blur_near_transition(float p_distance) { - dof_blur_near_transition = p_distance; RS::get_singleton()->camera_effects_set_dof_blur(camera_effects, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_near_enabled, dof_blur_near_distance, dof_blur_near_transition, dof_blur_amount); } float CameraEffects::get_dof_blur_near_transition() const { - return dof_blur_near_transition; } void CameraEffects::set_dof_blur_amount(float p_amount) { - dof_blur_amount = p_amount; RS::get_singleton()->camera_effects_set_dof_blur(camera_effects, dof_blur_far_enabled, dof_blur_far_distance, dof_blur_far_transition, dof_blur_near_enabled, dof_blur_near_distance, dof_blur_near_transition, dof_blur_amount); } -float CameraEffects::get_dof_blur_amount() const { +float CameraEffects::get_dof_blur_amount() const { return dof_blur_amount; } @@ -1304,7 +1223,6 @@ RID CameraEffects::get_rid() const { } void CameraEffects::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_dof_blur_far_enabled", "enabled"), &CameraEffects::set_dof_blur_far_enabled); ClassDB::bind_method(D_METHOD("is_dof_blur_far_enabled"), &CameraEffects::is_dof_blur_far_enabled); @@ -1346,7 +1264,6 @@ void CameraEffects::_bind_methods() { } CameraEffects::CameraEffects() { - camera_effects = RS::get_singleton()->camera_effects_create(); dof_blur_far_enabled = false; @@ -1364,6 +1281,5 @@ CameraEffects::CameraEffects() { } CameraEffects::~CameraEffects() { - RS::get_singleton()->free(camera_effects); } diff --git a/scene/resources/environment.h b/scene/resources/environment.h index f0ea8489ff..b8caa59aab 100644 --- a/scene/resources/environment.h +++ b/scene/resources/environment.h @@ -37,7 +37,6 @@ #include "servers/rendering_server.h" class Environment : public Resource { - GDCLASS(Environment, Resource); public: @@ -369,7 +368,6 @@ VARIANT_ENUM_CAST(Environment::GlowBlendMode) VARIANT_ENUM_CAST(Environment::SSAOBlur) class CameraEffects : public Resource { - GDCLASS(CameraEffects, Resource); private: diff --git a/scene/resources/font.cpp b/scene/resources/font.cpp index 51c2ff389a..1878b174e8 100644 --- a/scene/resources/font.cpp +++ b/scene/resources/font.cpp @@ -65,11 +65,11 @@ void Font::draw(RID p_canvas_item, const Point2 &p_pos, const String &p_text, co int chars_drawn = 0; bool with_outline = has_outline(); for (int i = 0; i < p_text.length(); i++) { - int width = get_char_size(p_text[i]).width; - if (p_clip_w >= 0 && (ofs.x + width) > p_clip_w) + if (p_clip_w >= 0 && (ofs.x + width) > p_clip_w) { break; //clip + } ofs.x += draw_char(p_canvas_item, p_pos + ofs, p_text[i], p_text[i + 1], with_outline ? p_outline_modulate : p_modulate, with_outline); ++chars_drawn; @@ -84,12 +84,10 @@ void Font::draw(RID p_canvas_item, const Point2 &p_pos, const String &p_text, co } void Font::update_changes() { - emit_changed(); } void Font::_bind_methods() { - ClassDB::bind_method(D_METHOD("draw", "canvas_item", "position", "string", "modulate", "clip_w", "outline_modulate"), &Font::draw, DEFVAL(Color(1, 1, 1)), DEFVAL(-1), DEFVAL(Color(1, 1, 1))); ClassDB::bind_method(D_METHOD("get_ascent"), &Font::get_ascent); ClassDB::bind_method(D_METHOD("get_descent"), &Font::get_descent); @@ -108,30 +106,27 @@ Font::Font() { ///////////////////////////////////////////////////////////////// void BitmapFont::_set_chars(const Vector<int> &p_chars) { - int len = p_chars.size(); //char 1 charsize 1 texture, 4 rect, 2 align, advance 1 ERR_FAIL_COND(len % 9); - if (!len) + if (!len) { return; //none to do + } int chars = len / 9; const int *r = p_chars.ptr(); for (int i = 0; i < chars; i++) { - const int *data = &r[i * 9]; add_char(data[0], data[1], Rect2(data[2], data[3], data[4], data[5]), Size2(data[6], data[7]), data[8]); } } Vector<int> BitmapFont::_get_chars() const { - Vector<int> chars; const CharType *key = nullptr; while ((key = char_map.next(key))) { - const Character *c = char_map.getptr(*key); ERR_FAIL_COND_V(!c, Vector<int>()); chars.push_back(*key); @@ -150,26 +145,23 @@ Vector<int> BitmapFont::_get_chars() const { } void BitmapFont::_set_kernings(const Vector<int> &p_kernings) { - int len = p_kernings.size(); ERR_FAIL_COND(len % 3); - if (!len) + if (!len) { return; + } const int *r = p_kernings.ptr(); for (int i = 0; i < len / 3; i++) { - const int *data = &r[i * 3]; add_kerning_pair(data[0], data[1], data[2]); } } Vector<int> BitmapFont::_get_kernings() const { - Vector<int> kernings; for (Map<KerningPairKey, int>::Element *E = kerning_map.front(); E; E = E->next()) { - kernings.push_back(E->key().A); kernings.push_back(E->key().B); kernings.push_back(E->get()); @@ -179,7 +171,6 @@ Vector<int> BitmapFont::_get_kernings() const { } void BitmapFont::_set_textures(const Vector<Variant> &p_textures) { - textures.clear(); for (int i = 0; i < p_textures.size(); i++) { Ref<Texture2D> tex = p_textures[i]; @@ -189,10 +180,10 @@ void BitmapFont::_set_textures(const Vector<Variant> &p_textures) { } Vector<Variant> BitmapFont::_get_textures() const { - Vector<Variant> rtextures; - for (int i = 0; i < textures.size(); i++) + for (int i = 0; i < textures.size(); i++) { rtextures.push_back(textures[i]); + } return rtextures; } @@ -207,7 +198,6 @@ Error BitmapFont::create_from_fnt(const String &p_file) { clear(); while (true) { - String line = f->get_line(); int delimiter = line.find(" "); @@ -215,59 +205,62 @@ Error BitmapFont::create_from_fnt(const String &p_file) { int pos = delimiter + 1; Map<String, String> keys; - while (pos < line.size() && line[pos] == ' ') + while (pos < line.size() && line[pos] == ' ') { pos++; + } while (pos < line.size()) { - int eq = line.find("=", pos); - if (eq == -1) + if (eq == -1) { break; + } String key = line.substr(pos, eq - pos); int end = -1; String value; if (line[eq + 1] == '"') { end = line.find("\"", eq + 2); - if (end == -1) + if (end == -1) { break; + } value = line.substr(eq + 2, end - 1 - eq - 1); pos = end + 1; } else { end = line.find(" ", eq + 1); - if (end == -1) + if (end == -1) { end = line.size(); + } value = line.substr(eq + 1, end - eq); pos = end; } - while (pos < line.size() && line[pos] == ' ') + while (pos < line.size() && line[pos] == ' ') { pos++; + } keys[key] = value; } if (type == "info") { - - if (keys.has("face")) + if (keys.has("face")) { set_name(keys["face"]); + } /* if (keys.has("size")) font->set_height(keys["size"].to_int()); */ } else if (type == "common") { - - if (keys.has("lineHeight")) + if (keys.has("lineHeight")) { set_height(keys["lineHeight"].to_int()); - if (keys.has("base")) + } + if (keys.has("base")) { set_ascent(keys["base"].to_int()); + } } else if (type == "page") { - if (keys.has("file")) { - String base_dir = p_file.get_base_dir(); String file = base_dir.plus_file(keys["file"]); Ref<Texture2D> tex = ResourceLoader::load(file); @@ -278,55 +271,66 @@ Error BitmapFont::create_from_fnt(const String &p_file) { } } } else if (type == "char") { - CharType idx = 0; - if (keys.has("id")) + if (keys.has("id")) { idx = keys["id"].to_int(); + } Rect2 rect; - if (keys.has("x")) + if (keys.has("x")) { rect.position.x = keys["x"].to_int(); - if (keys.has("y")) + } + if (keys.has("y")) { rect.position.y = keys["y"].to_int(); - if (keys.has("width")) + } + if (keys.has("width")) { rect.size.width = keys["width"].to_int(); - if (keys.has("height")) + } + if (keys.has("height")) { rect.size.height = keys["height"].to_int(); + } Point2 ofs; - if (keys.has("xoffset")) + if (keys.has("xoffset")) { ofs.x = keys["xoffset"].to_int(); - if (keys.has("yoffset")) + } + if (keys.has("yoffset")) { ofs.y = keys["yoffset"].to_int(); + } int texture = 0; - if (keys.has("page")) + if (keys.has("page")) { texture = keys["page"].to_int(); + } int advance = -1; - if (keys.has("xadvance")) + if (keys.has("xadvance")) { advance = keys["xadvance"].to_int(); + } add_char(idx, texture, rect, ofs, advance); } else if (type == "kerning") { - CharType first = 0, second = 0; int k = 0; - if (keys.has("first")) + if (keys.has("first")) { first = keys["first"].to_int(); - if (keys.has("second")) + } + if (keys.has("second")) { second = keys["second"].to_int(); - if (keys.has("amount")) + } + if (keys.has("amount")) { k = keys["amount"].to_int(); + } add_kerning_pair(first, second, -k); } - if (f->eof_reached()) + if (f->eof_reached()) { break; + } } memdelete(f); @@ -335,67 +339,57 @@ Error BitmapFont::create_from_fnt(const String &p_file) { } void BitmapFont::set_height(float p_height) { - height = p_height; } -float BitmapFont::get_height() const { +float BitmapFont::get_height() const { return height; } void BitmapFont::set_ascent(float p_ascent) { - ascent = p_ascent; } -float BitmapFont::get_ascent() const { +float BitmapFont::get_ascent() const { return ascent; } -float BitmapFont::get_descent() const { +float BitmapFont::get_descent() const { return height - ascent; } float BitmapFont::get_underline_position() const { - return 2; } float BitmapFont::get_underline_thickness() const { - return 1; } void BitmapFont::add_texture(const Ref<Texture2D> &p_texture) { - ERR_FAIL_COND_MSG(p_texture.is_null(), "It's not a reference to a valid Texture object."); textures.push_back(p_texture); } int BitmapFont::get_texture_count() const { - return textures.size(); }; Ref<Texture2D> BitmapFont::get_texture(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, textures.size(), Ref<Texture2D>()); return textures[p_idx]; }; int BitmapFont::get_character_count() const { - return char_map.size(); }; Vector<CharType> BitmapFont::get_char_keys() const { - Vector<CharType> chars; chars.resize(char_map.size()); const CharType *ct = nullptr; int count = 0; while ((ct = char_map.next(ct))) { - chars.write[count++] = *ct; }; @@ -403,7 +397,6 @@ Vector<CharType> BitmapFont::get_char_keys() const { }; BitmapFont::Character BitmapFont::get_character(CharType p_char) const { - if (!char_map.has(p_char)) { ERR_FAIL_V(Character()); }; @@ -412,9 +405,9 @@ BitmapFont::Character BitmapFont::get_character(CharType p_char) const { }; void BitmapFont::add_char(CharType p_char, int p_texture_idx, const Rect2 &p_rect, const Size2 &p_align, float p_advance) { - - if (p_advance < 0) + if (p_advance < 0) { p_advance = p_rect.size.width; + } Character c; c.rect = p_rect; @@ -427,22 +420,18 @@ void BitmapFont::add_char(CharType p_char, int p_texture_idx, const Rect2 &p_rec } void BitmapFont::add_kerning_pair(CharType p_A, CharType p_B, int p_kerning) { - KerningPairKey kpk; kpk.A = p_A; kpk.B = p_B; if (p_kerning == 0 && kerning_map.has(kpk)) { - kerning_map.erase(kpk); } else { - kerning_map[kpk] = p_kerning; } } Vector<BitmapFont::KerningPairKey> BitmapFont::get_kerning_pair_keys() const { - Vector<BitmapFont::KerningPairKey> ret; ret.resize(kerning_map.size()); int i = 0; @@ -455,31 +444,28 @@ Vector<BitmapFont::KerningPairKey> BitmapFont::get_kerning_pair_keys() const { } int BitmapFont::get_kerning_pair(CharType p_A, CharType p_B) const { - KerningPairKey kpk; kpk.A = p_A; kpk.B = p_B; const Map<KerningPairKey, int>::Element *E = kerning_map.find(kpk); - if (E) + if (E) { return E->get(); + } return 0; } void BitmapFont::set_distance_field_hint(bool p_distance_field) { - distance_field_hint = p_distance_field; emit_changed(); } bool BitmapFont::is_distance_field_hint() const { - return distance_field_hint; } void BitmapFont::clear() { - height = 1; ascent = 0; char_map.clear(); @@ -489,16 +475,15 @@ void BitmapFont::clear() { } Size2 Font::get_string_size(const String &p_string) const { - float w = 0; int l = p_string.length(); - if (l == 0) + if (l == 0) { return Size2(0, get_height()); + } const CharType *sptr = &p_string[0]; for (int i = 0; i < l; i++) { - w += get_char_size(sptr[i], sptr[i + 1]).width; } @@ -506,12 +491,12 @@ Size2 Font::get_string_size(const String &p_string) const { } Size2 Font::get_wordwrap_string_size(const String &p_string, float p_width) const { - ERR_FAIL_COND_V(p_width <= 0, Vector2(0, get_height())); int l = p_string.length(); - if (l == 0) + if (l == 0) { return Size2(p_width, get_height()); + } float line_w = 0; float h = 0; @@ -537,7 +522,6 @@ Size2 Font::get_wordwrap_string_size(const String &p_string, float p_width) cons } void BitmapFont::set_fallback(const Ref<BitmapFont> &p_fallback) { - for (Ref<BitmapFont> fallback_child = p_fallback; fallback_child != nullptr; fallback_child = fallback_child->get_fallback()) { ERR_FAIL_COND_MSG(fallback_child == this, "Can't set as fallback one of its parents to prevent crashes due to recursive loop."); } @@ -546,17 +530,16 @@ void BitmapFont::set_fallback(const Ref<BitmapFont> &p_fallback) { } Ref<BitmapFont> BitmapFont::get_fallback() const { - return fallback; } float BitmapFont::draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_char, CharType p_next, const Color &p_modulate, bool p_outline) const { - const Character *c = char_map.getptr(p_char); if (!c) { - if (fallback.is_valid()) + if (fallback.is_valid()) { return fallback->draw_char(p_canvas_item, p_pos, p_char, p_next, p_modulate, p_outline); + } return 0; } @@ -573,26 +556,24 @@ float BitmapFont::draw_char(RID p_canvas_item, const Point2 &p_pos, CharType p_c } Size2 BitmapFont::get_char_size(CharType p_char, CharType p_next) const { - const Character *c = char_map.getptr(p_char); if (!c) { - if (fallback.is_valid()) + if (fallback.is_valid()) { return fallback->get_char_size(p_char, p_next); + } return Size2(); } Size2 ret(c->advance, c->rect.size.y); if (p_next) { - KerningPairKey kpk; kpk.A = p_char; kpk.B = p_next; const Map<KerningPairKey, int>::Element *E = kerning_map.find(kpk); if (E) { - ret.width -= E->get(); } } @@ -601,7 +582,6 @@ Size2 BitmapFont::get_char_size(CharType p_char, CharType p_next) const { } void BitmapFont::_bind_methods() { - ClassDB::bind_method(D_METHOD("create_from_fnt", "path"), &BitmapFont::create_from_fnt); ClassDB::bind_method(D_METHOD("set_height", "px"), &BitmapFont::set_height); @@ -645,21 +625,19 @@ void BitmapFont::_bind_methods() { } BitmapFont::BitmapFont() { - clear(); } BitmapFont::~BitmapFont() { - clear(); } //////////// RES ResourceFormatLoaderBMFont::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { - - if (r_error) + if (r_error) { *r_error = ERR_FILE_CANT_OPEN; + } Ref<BitmapFont> font; font.instance(); @@ -667,8 +645,9 @@ RES ResourceFormatLoaderBMFont::load(const String &p_path, const String &p_origi Error err = font->create_from_fnt(p_path); if (err) { - if (r_error) + if (r_error) { *r_error = err; + } return RES(); } @@ -676,19 +655,17 @@ RES ResourceFormatLoaderBMFont::load(const String &p_path, const String &p_origi } void ResourceFormatLoaderBMFont::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back("fnt"); } bool ResourceFormatLoaderBMFont::handles_type(const String &p_type) const { - return (p_type == "BitmapFont"); } String ResourceFormatLoaderBMFont::get_resource_type(const String &p_path) const { - String el = p_path.get_extension().to_lower(); - if (el == "fnt") + if (el == "fnt") { return "BitmapFont"; + } return ""; } diff --git a/scene/resources/font.h b/scene/resources/font.h index 54b1eaa1b9..14312308bb 100644 --- a/scene/resources/font.h +++ b/scene/resources/font.h @@ -36,7 +36,6 @@ #include "scene/resources/texture.h" class Font : public Resource { - GDCLASS(Font, Resource); protected: @@ -106,7 +105,6 @@ public: }; class BitmapFont : public Font { - GDCLASS(BitmapFont, Font); RES_BASE_EXTENSION("font"); @@ -114,7 +112,6 @@ class BitmapFont : public Font { public: struct Character { - int texture_idx; Rect2 rect; float v_align; @@ -128,7 +125,6 @@ public: }; struct KerningPairKey { - union { struct { uint32_t A, B; diff --git a/scene/resources/gradient.cpp b/scene/resources/gradient.cpp index 7bce04beaf..d271c906ff 100644 --- a/scene/resources/gradient.cpp +++ b/scene/resources/gradient.cpp @@ -52,7 +52,6 @@ Gradient::~Gradient() { } void Gradient::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_point", "offset", "color"), &Gradient::add_point); ClassDB::bind_method(D_METHOD("remove_point", "offset"), &Gradient::remove_point); @@ -104,8 +103,9 @@ void Gradient::set_offsets(const Vector<float> &p_offsets) { } void Gradient::set_colors(const Vector<Color> &p_colors) { - if (points.size() < p_colors.size()) + if (points.size() < p_colors.size()) { is_sorted = false; + } points.resize(p_colors.size()); for (int i = 0; i < points.size(); i++) { points.write[i].color = p_colors[i]; @@ -118,7 +118,6 @@ Vector<Gradient::Point> &Gradient::get_points() { } void Gradient::add_point(float p_offset, const Color &p_color) { - Point p; p.offset = p_offset; p.color = p_color; @@ -129,7 +128,6 @@ void Gradient::add_point(float p_offset, const Color &p_color) { } void Gradient::remove_point(int p_index) { - ERR_FAIL_INDEX(p_index, points.size()); ERR_FAIL_COND(points.size() <= 2); points.remove(p_index); @@ -143,10 +141,10 @@ void Gradient::set_points(Vector<Gradient::Point> &p_points) { } void Gradient::set_offset(int pos, const float offset) { - ERR_FAIL_COND(pos < 0); - if (points.size() <= pos) + if (points.size() <= pos) { points.resize(pos + 1); + } points.write[pos].offset = offset; is_sorted = false; emit_signal(CoreStringNames::get_singleton()->changed); diff --git a/scene/resources/gradient.h b/scene/resources/gradient.h index 573749ea7e..d40dcc8d44 100644 --- a/scene/resources/gradient.h +++ b/scene/resources/gradient.h @@ -39,7 +39,6 @@ class Gradient : public Resource { public: struct Point { - float offset; Color color; bool operator<(const Point &p_ponit) const { @@ -77,9 +76,9 @@ public: Vector<Color> get_colors() const; _FORCE_INLINE_ Color get_color_at_offset(float p_offset) { - - if (points.empty()) + if (points.empty()) { return Color(0, 0, 0, 1); + } if (!is_sorted) { points.sort(); @@ -92,8 +91,9 @@ public: int middle = 0; #ifdef DEBUG_ENABLED - if (low > high) + if (low > high) { ERR_PRINT("low > high, this may be a bug"); + } #endif while (low <= high) { @@ -114,10 +114,12 @@ public: } int first = middle; int second = middle + 1; - if (second >= points.size()) + if (second >= points.size()) { return points[points.size() - 1].color; - if (first < 0) + } + if (first < 0) { return points[0].color; + } const Point &pointFirst = points[first]; const Point &pointSecond = points[second]; return pointFirst.color.lerp(pointSecond.color, (p_offset - pointFirst.offset) / (pointSecond.offset - pointFirst.offset)); diff --git a/scene/resources/height_map_shape_3d.cpp b/scene/resources/height_map_shape_3d.cpp index 33b6063299..e112c6b436 100644 --- a/scene/resources/height_map_shape_3d.cpp +++ b/scene/resources/height_map_shape_3d.cpp @@ -35,7 +35,6 @@ Vector<Vector3> HeightMapShape3D::get_debug_mesh_lines() { Vector<Vector3> points; if ((map_width != 0) && (map_depth != 0)) { - // This will be slow for large maps... // also we'll have to figure out how well bullet centers this shape... @@ -81,7 +80,6 @@ real_t HeightMapShape3D::get_enclosing_radius() const { } void HeightMapShape3D::_update_shape() { - Dictionary d; d["width"] = map_width; d["depth"] = map_depth; @@ -161,11 +159,13 @@ void HeightMapShape3D::set_map_data(PackedFloat32Array p_new) { min_height = val; max_height = val; } else { - if (min_height > val) + if (min_height > val) { min_height = val; + } - if (max_height < val) + if (max_height < val) { max_height = val; + } } } @@ -193,7 +193,6 @@ void HeightMapShape3D::_bind_methods() { HeightMapShape3D::HeightMapShape3D() : Shape3D(PhysicsServer3D::get_singleton()->shape_create(PhysicsServer3D::SHAPE_HEIGHTMAP)) { - map_width = 2; map_depth = 2; map_data.resize(map_width * map_depth); diff --git a/scene/resources/line_shape_2d.cpp b/scene/resources/line_shape_2d.cpp index 71d4f79e48..802ccaaee6 100644 --- a/scene/resources/line_shape_2d.cpp +++ b/scene/resources/line_shape_2d.cpp @@ -34,21 +34,20 @@ #include "servers/rendering_server.h" bool LineShape2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - Vector2 point = get_distance() * get_normal(); Vector2 l[2][2] = { { point - get_normal().tangent() * 100, point + get_normal().tangent() * 100 }, { point, point + get_normal() * 30 } }; for (int i = 0; i < 2; i++) { Vector2 closest = Geometry::get_closest_point_to_segment_2d(p_point, l[i]); - if (p_point.distance_to(closest) < p_tolerance) + if (p_point.distance_to(closest) < p_tolerance) { return true; + } } return false; } void LineShape2D::_update_shape() { - Array arr; arr.push_back(normal); arr.push_back(distance); @@ -57,28 +56,24 @@ void LineShape2D::_update_shape() { } void LineShape2D::set_normal(const Vector2 &p_normal) { - normal = p_normal; _update_shape(); } void LineShape2D::set_distance(real_t p_distance) { - distance = p_distance; _update_shape(); } Vector2 LineShape2D::get_normal() const { - return normal; } -real_t LineShape2D::get_distance() const { +real_t LineShape2D::get_distance() const { return distance; } void LineShape2D::draw(const RID &p_to_rid, const Color &p_color) { - Vector2 point = get_distance() * get_normal(); Vector2 l1[2] = { point - get_normal().tangent() * 100, point + get_normal().tangent() * 100 }; @@ -86,8 +81,8 @@ void LineShape2D::draw(const RID &p_to_rid, const Color &p_color) { Vector2 l2[2] = { point, point + get_normal() * 30 }; RS::get_singleton()->canvas_item_add_line(p_to_rid, l2[0], l2[1], p_color, 3); } -Rect2 LineShape2D::get_rect() const { +Rect2 LineShape2D::get_rect() const { Vector2 point = get_distance() * get_normal(); Vector2 l1[2] = { point - get_normal().tangent() * 100, point + get_normal().tangent() * 100 }; @@ -105,7 +100,6 @@ real_t LineShape2D::get_enclosing_radius() const { } void LineShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_normal", "normal"), &LineShape2D::set_normal); ClassDB::bind_method(D_METHOD("get_normal"), &LineShape2D::get_normal); @@ -118,7 +112,6 @@ void LineShape2D::_bind_methods() { LineShape2D::LineShape2D() : Shape2D(PhysicsServer2D::get_singleton()->line_shape_create()) { - normal = Vector2(0, 1); distance = 0; _update_shape(); diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp index 137657d239..1e95a35726 100644 --- a/scene/resources/material.cpp +++ b/scene/resources/material.cpp @@ -39,28 +39,27 @@ #include "scene/scene_string_names.h" void Material::set_next_pass(const Ref<Material> &p_pass) { - for (Ref<Material> pass_child = p_pass; pass_child != nullptr; pass_child = pass_child->get_next_pass()) { ERR_FAIL_COND_MSG(pass_child == this, "Can't set as next_pass one of its parents to prevent crashes due to recursive loop."); } - if (next_pass == p_pass) + if (next_pass == p_pass) { return; + } next_pass = p_pass; RID next_pass_rid; - if (next_pass.is_valid()) + if (next_pass.is_valid()) { next_pass_rid = next_pass->get_rid(); + } RS::get_singleton()->material_set_next_pass(material, next_pass_rid); } Ref<Material> Material::get_next_pass() const { - return next_pass; } void Material::set_render_priority(int p_priority) { - ERR_FAIL_COND(p_priority < RENDER_PRIORITY_MIN); ERR_FAIL_COND(p_priority > RENDER_PRIORITY_MAX); render_priority = p_priority; @@ -68,23 +67,20 @@ void Material::set_render_priority(int p_priority) { } int Material::get_render_priority() const { - return render_priority; } RID Material::get_rid() const { - return material; } -void Material::_validate_property(PropertyInfo &property) const { +void Material::_validate_property(PropertyInfo &property) const { if (!_can_do_next_pass() && property.name == "next_pass") { property.usage = 0; } } void Material::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_next_pass", "next_pass"), &Material::set_next_pass); ClassDB::bind_method(D_METHOD("get_next_pass"), &Material::get_next_pass); @@ -99,22 +95,18 @@ void Material::_bind_methods() { } Material::Material() { - material = RenderingServer::get_singleton()->material_create(); render_priority = 0; } Material::~Material() { - RenderingServer::get_singleton()->free(material); } /////////////////////////////////// bool ShaderMaterial::_set(const StringName &p_name, const Variant &p_value) { - if (shader.is_valid()) { - StringName pr = shader->remap_param(p_name); if (!pr) { String n = p_name; @@ -135,9 +127,7 @@ bool ShaderMaterial::_set(const StringName &p_name, const Variant &p_value) { } bool ShaderMaterial::_get(const StringName &p_name, Variant &r_ret) const { - if (shader.is_valid()) { - StringName pr = shader->remap_param(p_name); if (!pr) { String n = p_name; @@ -159,16 +149,13 @@ bool ShaderMaterial::_get(const StringName &p_name, Variant &r_ret) const { } void ShaderMaterial::_get_property_list(List<PropertyInfo> *p_list) const { - if (!shader.is_null()) { - shader->get_param_list(p_list); } } bool ShaderMaterial::property_can_revert(const String &p_name) { if (shader.is_valid()) { - StringName pr = shader->remap_param(p_name); if (pr) { Variant default_value = RenderingServer::get_singleton()->shader_get_param_default(shader->get_rid(), pr); @@ -192,7 +179,6 @@ Variant ShaderMaterial::property_get_revert(const String &p_name) { } void ShaderMaterial::set_shader(const Ref<Shader> &p_shader) { - // Only connect/disconnect the signal when running in the editor. // This can be a slow operation, and `_change_notify()` (which is called by `_shader_changed()`) // does nothing in non-editor builds anyway. See GH-34741 for details. @@ -217,17 +203,14 @@ void ShaderMaterial::set_shader(const Ref<Shader> &p_shader) { } Ref<Shader> ShaderMaterial::get_shader() const { - return shader; } void ShaderMaterial::set_shader_param(const StringName &p_param, const Variant &p_value) { - RS::get_singleton()->material_set_param(_get_material(), p_param, p_value); } Variant ShaderMaterial::get_shader_param(const StringName &p_param) const { - return RS::get_singleton()->material_get_param(_get_material(), p_param); } @@ -236,7 +219,6 @@ void ShaderMaterial::_shader_changed() { } void ShaderMaterial::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_shader", "shader"), &ShaderMaterial::set_shader); ClassDB::bind_method(D_METHOD("get_shader"), &ShaderMaterial::get_shader); ClassDB::bind_method(D_METHOD("set_shader_param", "param", "value"), &ShaderMaterial::set_shader_param); @@ -248,7 +230,6 @@ void ShaderMaterial::_bind_methods() { } void ShaderMaterial::get_argument_options(const StringName &p_function, int p_idx, List<String> *r_options) const { - #ifdef TOOLS_ENABLED const String quote_style = EDITOR_DEF("text_editor/completion/use_single_quotes", 0) ? "'" : "\""; #else @@ -257,7 +238,6 @@ void ShaderMaterial::get_argument_options(const StringName &p_function, int p_id String f = p_function.operator String(); if ((f == "get_shader_param" || f == "set_shader_param") && p_idx == 0) { - if (shader.is_valid()) { List<PropertyInfo> pl; shader->get_param_list(&pl); @@ -270,15 +250,15 @@ void ShaderMaterial::get_argument_options(const StringName &p_function, int p_id } bool ShaderMaterial::_can_do_next_pass() const { - return shader.is_valid() && shader->get_mode() == Shader::MODE_SPATIAL; } Shader::Mode ShaderMaterial::get_shader_mode() const { - if (shader.is_valid()) + if (shader.is_valid()) { return shader->get_mode(); - else + } else { return Shader::MODE_SPATIAL; + } } ShaderMaterial::ShaderMaterial() { @@ -295,7 +275,6 @@ Map<BaseMaterial3D::MaterialKey, BaseMaterial3D::ShaderData> BaseMaterial3D::sha BaseMaterial3D::ShaderNames *BaseMaterial3D::shader_names = nullptr; void BaseMaterial3D::init_shaders() { - dirty_materials = memnew(SelfList<BaseMaterial3D>::List); shader_names = memnew(ShaderNames); @@ -375,7 +354,6 @@ void BaseMaterial3D::init_shaders() { Ref<StandardMaterial3D> BaseMaterial3D::materials_for_2d[BaseMaterial3D::MAX_MATERIALS_FOR_2D]; void BaseMaterial3D::finish_shaders() { - for (int i = 0; i < MAX_MATERIALS_FOR_2D; i++) { materials_for_2d[i].unref(); } @@ -387,12 +365,12 @@ void BaseMaterial3D::finish_shaders() { } void BaseMaterial3D::_update_shader() { - dirty_materials->remove(&element); MaterialKey mk = _compute_key(); - if (mk == current_key) + if (mk == current_key) { return; //no update required in the end + } if (shader_map.has(current_key)) { shader_map[current_key].users--; @@ -406,7 +384,6 @@ void BaseMaterial3D::_update_shader() { current_key = mk; if (shader_map.has(mk)) { - RS::get_singleton()->material_set_shader(_get_material(), shader_map[mk].shader); shader_map[mk].users++; return; @@ -606,7 +583,6 @@ void BaseMaterial3D::_update_shader() { } if (features[FEATURE_EMISSION]) { - code += "uniform sampler2D texture_emission : hint_black_albedo," + texfilter_str + ";\n"; code += "uniform vec4 emission : hint_color;\n"; code += "uniform float emission_energy;\n"; @@ -649,13 +625,11 @@ void BaseMaterial3D::_update_shader() { } if (features[FEATURE_SUBSURFACE_SCATTERING]) { - code += "uniform float subsurface_scattering_strength : hint_range(0,1);\n"; code += "uniform sampler2D texture_subsurface_scattering : hint_white," + texfilter_str + ";\n"; } if (features[FEATURE_SUBSURFACE_TRANSMITTANCE]) { - code += "uniform vec4 transmittance_color : hint_color;\n"; code += "uniform float transmittance_depth;\n"; code += "uniform sampler2D texture_subsurface_transmittance : hint_white," + texfilter_str + ";\n"; @@ -664,7 +638,6 @@ void BaseMaterial3D::_update_shader() { } if (features[FEATURE_BACKLIGHT]) { - code += "uniform vec4 backlight : hint_color;\n"; code += "uniform sampler2D texture_backlight : hint_black," + texfilter_str + ";\n"; } @@ -702,18 +675,15 @@ void BaseMaterial3D::_update_shader() { code += "void vertex() {\n"; if (flags[FLAG_SRGB_VERTEX_COLOR]) { - code += "\tif (!OUTPUT_IS_SRGB) {\n"; code += "\t\tCOLOR.rgb = mix( pow((COLOR.rgb + vec3(0.055)) * (1.0 / (1.0 + 0.055)), vec3(2.4)), COLOR.rgb* (1.0 / 12.92), lessThan(COLOR.rgb,vec3(0.04045)) );\n"; code += "\t}\n"; } if (flags[FLAG_USE_POINT_SIZE]) { - code += "\tPOINT_SIZE=point_size;\n"; } if (shading_mode == SHADING_MODE_PER_VERTEX) { - code += "\tROUGHNESS=roughness;\n"; } @@ -723,10 +693,8 @@ void BaseMaterial3D::_update_shader() { switch (billboard_mode) { case BILLBOARD_DISABLED: { - } break; case BILLBOARD_ENABLED: { - code += "\tMODELVIEW_MATRIX = INV_CAMERA_MATRIX * mat4(CAMERA_MATRIX[0],CAMERA_MATRIX[1],CAMERA_MATRIX[2],WORLD_MATRIX[3]);\n"; if (flags[FLAG_BILLBOARD_KEEP_SCALE]) { @@ -734,7 +702,6 @@ void BaseMaterial3D::_update_shader() { } } break; case BILLBOARD_FIXED_Y: { - code += "\tMODELVIEW_MATRIX = INV_CAMERA_MATRIX * mat4(CAMERA_MATRIX[0],WORLD_MATRIX[1],vec4(normalize(cross(CAMERA_MATRIX[0].xyz,WORLD_MATRIX[1].xyz)), 0.0),WORLD_MATRIX[3]);\n"; if (flags[FLAG_BILLBOARD_KEEP_SCALE]) { @@ -744,7 +711,6 @@ void BaseMaterial3D::_update_shader() { } } break; case BILLBOARD_PARTICLES: { - //make billboard code += "\tmat4 mat_world = mat4(normalize(CAMERA_MATRIX[0])*length(WORLD_MATRIX[0]),normalize(CAMERA_MATRIX[1])*length(WORLD_MATRIX[0]),normalize(CAMERA_MATRIX[2])*length(WORLD_MATRIX[2]),WORLD_MATRIX[3]);\n"; //rotate by rotation @@ -768,7 +734,6 @@ void BaseMaterial3D::_update_shader() { } if (flags[FLAG_FIXED_SIZE]) { - code += "\tif (PROJECTION_MATRIX[3][3] != 0.0) {\n"; //orthogonal matrix, try to do about the same //with viewport size @@ -803,7 +768,6 @@ void BaseMaterial3D::_update_shader() { } if (flags[FLAG_UV1_USE_TRIPLANAR]) { - code += "\tuv1_power_normal=pow(abs(NORMAL),vec3(uv1_blend_sharpness));\n"; code += "\tuv1_power_normal/=dot(uv1_power_normal,vec3(1.0));\n"; code += "\tuv1_triplanar_pos = VERTEX * uv1_scale + uv1_offset;\n"; @@ -811,7 +775,6 @@ void BaseMaterial3D::_update_shader() { } if (flags[FLAG_UV2_USE_TRIPLANAR]) { - code += "\tuv2_power_normal=pow(abs(NORMAL), vec3(uv2_blend_sharpness));\n"; code += "\tuv2_power_normal/=dot(uv2_power_normal,vec3(1.0));\n"; code += "\tuv2_triplanar_pos = VERTEX * uv2_scale + uv2_offset;\n"; @@ -992,7 +955,6 @@ void BaseMaterial3D::_update_shader() { } if (features[FEATURE_REFRACTION]) { - if (features[FEATURE_NORMAL_MAPPING]) { code += "\tvec3 ref_normal = normalize( mix(NORMAL,TANGENT * NORMALMAP.x + BINORMAL * NORMALMAP.y + NORMAL * NORMALMAP.z,NORMALMAP_DEPTH) );\n"; } else { @@ -1023,7 +985,6 @@ void BaseMaterial3D::_update_shader() { if (distance_fade != DISTANCE_FADE_DISABLED) { if ((distance_fade == DISTANCE_FADE_OBJECT_DITHER || distance_fade == DISTANCE_FADE_PIXEL_DITHER)) { - if (!RenderingServer::get_singleton()->is_low_end()) { code += "\t{\n"; if (distance_fade == DISTANCE_FADE_OBJECT_DITHER) { @@ -1097,7 +1058,6 @@ void BaseMaterial3D::_update_shader() { } if (features[FEATURE_AMBIENT_OCCLUSION]) { - if (!orm) { if (flags[FLAG_AO_ON_UV2]) { if (flags[FLAG_UV2_USE_TRIPLANAR]) { @@ -1120,7 +1080,6 @@ void BaseMaterial3D::_update_shader() { } if (features[FEATURE_SUBSURFACE_SCATTERING]) { - if (flags[FLAG_UV1_USE_TRIPLANAR]) { code += "\tfloat sss_tex = triplanar_texture(texture_subsurface_scattering,uv1_power_normal,uv1_triplanar_pos).r;\n"; } else { @@ -1130,7 +1089,6 @@ void BaseMaterial3D::_update_shader() { } if (features[FEATURE_SUBSURFACE_TRANSMITTANCE]) { - if (flags[FLAG_UV1_USE_TRIPLANAR]) { code += "\tvec4 trans_color_tex = triplanar_texture(texture_subsurface_transmittance,uv1_power_normal,uv1_triplanar_pos);\n"; } else { @@ -1153,7 +1111,6 @@ void BaseMaterial3D::_update_shader() { } if (features[FEATURE_DETAIL]) { - bool triplanar = (flags[FLAG_UV1_USE_TRIPLANAR] && detail_uv == DETAIL_UV_1) || (flags[FLAG_UV2_USE_TRIPLANAR] && detail_uv == DETAIL_UV_2); if (triplanar) { @@ -1168,7 +1125,6 @@ void BaseMaterial3D::_update_shader() { } if (flags[FLAG_UV1_USE_TRIPLANAR]) { - code += "\tvec4 detail_mask_tex = triplanar_texture(texture_detail_mask,uv1_power_normal,uv1_triplanar_pos);\n"; } else { code += "\tvec4 detail_mask_tex = texture(texture_detail_mask,base_uv);\n"; @@ -1208,17 +1164,14 @@ void BaseMaterial3D::_update_shader() { } void BaseMaterial3D::flush_changes() { - MutexLock lock(material_mutex); while (dirty_materials->first()) { - dirty_materials->first()->self()->_update_shader(); } } void BaseMaterial3D::_queue_shader_change() { - MutexLock lock(material_mutex); if (!element.in_list()) { @@ -1227,167 +1180,144 @@ void BaseMaterial3D::_queue_shader_change() { } bool BaseMaterial3D::_is_shader_dirty() const { - MutexLock lock(material_mutex); return element.in_list(); } -void BaseMaterial3D::set_albedo(const Color &p_albedo) { +void BaseMaterial3D::set_albedo(const Color &p_albedo) { albedo = p_albedo; RS::get_singleton()->material_set_param(_get_material(), shader_names->albedo, p_albedo); } Color BaseMaterial3D::get_albedo() const { - return albedo; } void BaseMaterial3D::set_specular(float p_specular) { - specular = p_specular; RS::get_singleton()->material_set_param(_get_material(), shader_names->specular, p_specular); } float BaseMaterial3D::get_specular() const { - return specular; } void BaseMaterial3D::set_roughness(float p_roughness) { - roughness = p_roughness; RS::get_singleton()->material_set_param(_get_material(), shader_names->roughness, p_roughness); } float BaseMaterial3D::get_roughness() const { - return roughness; } void BaseMaterial3D::set_metallic(float p_metallic) { - metallic = p_metallic; RS::get_singleton()->material_set_param(_get_material(), shader_names->metallic, p_metallic); } float BaseMaterial3D::get_metallic() const { - return metallic; } void BaseMaterial3D::set_emission(const Color &p_emission) { - emission = p_emission; RS::get_singleton()->material_set_param(_get_material(), shader_names->emission, p_emission); } -Color BaseMaterial3D::get_emission() const { +Color BaseMaterial3D::get_emission() const { return emission; } void BaseMaterial3D::set_emission_energy(float p_emission_energy) { - emission_energy = p_emission_energy; RS::get_singleton()->material_set_param(_get_material(), shader_names->emission_energy, p_emission_energy); } -float BaseMaterial3D::get_emission_energy() const { +float BaseMaterial3D::get_emission_energy() const { return emission_energy; } void BaseMaterial3D::set_normal_scale(float p_normal_scale) { - normal_scale = p_normal_scale; RS::get_singleton()->material_set_param(_get_material(), shader_names->normal_scale, p_normal_scale); } -float BaseMaterial3D::get_normal_scale() const { +float BaseMaterial3D::get_normal_scale() const { return normal_scale; } void BaseMaterial3D::set_rim(float p_rim) { - rim = p_rim; RS::get_singleton()->material_set_param(_get_material(), shader_names->rim, p_rim); } -float BaseMaterial3D::get_rim() const { +float BaseMaterial3D::get_rim() const { return rim; } void BaseMaterial3D::set_rim_tint(float p_rim_tint) { - rim_tint = p_rim_tint; RS::get_singleton()->material_set_param(_get_material(), shader_names->rim_tint, p_rim_tint); } -float BaseMaterial3D::get_rim_tint() const { +float BaseMaterial3D::get_rim_tint() const { return rim_tint; } void BaseMaterial3D::set_ao_light_affect(float p_ao_light_affect) { - ao_light_affect = p_ao_light_affect; RS::get_singleton()->material_set_param(_get_material(), shader_names->ao_light_affect, p_ao_light_affect); } -float BaseMaterial3D::get_ao_light_affect() const { +float BaseMaterial3D::get_ao_light_affect() const { return ao_light_affect; } void BaseMaterial3D::set_clearcoat(float p_clearcoat) { - clearcoat = p_clearcoat; RS::get_singleton()->material_set_param(_get_material(), shader_names->clearcoat, p_clearcoat); } float BaseMaterial3D::get_clearcoat() const { - return clearcoat; } void BaseMaterial3D::set_clearcoat_gloss(float p_clearcoat_gloss) { - clearcoat_gloss = p_clearcoat_gloss; RS::get_singleton()->material_set_param(_get_material(), shader_names->clearcoat_gloss, p_clearcoat_gloss); } float BaseMaterial3D::get_clearcoat_gloss() const { - return clearcoat_gloss; } void BaseMaterial3D::set_anisotropy(float p_anisotropy) { - anisotropy = p_anisotropy; RS::get_singleton()->material_set_param(_get_material(), shader_names->anisotropy, p_anisotropy); } -float BaseMaterial3D::get_anisotropy() const { +float BaseMaterial3D::get_anisotropy() const { return anisotropy; } void BaseMaterial3D::set_heightmap_scale(float p_heightmap_scale) { - heightmap_scale = p_heightmap_scale; RS::get_singleton()->material_set_param(_get_material(), shader_names->heightmap_scale, p_heightmap_scale); } float BaseMaterial3D::get_heightmap_scale() const { - return heightmap_scale; } void BaseMaterial3D::set_subsurface_scattering_strength(float p_subsurface_scattering_strength) { - subsurface_scattering_strength = p_subsurface_scattering_strength; RS::get_singleton()->material_set_param(_get_material(), shader_names->subsurface_scattering_strength, subsurface_scattering_strength); } float BaseMaterial3D::get_subsurface_scattering_strength() const { - return subsurface_scattering_strength; } @@ -1404,6 +1334,7 @@ void BaseMaterial3D::set_transmittance_depth(float p_depth) { transmittance_depth = p_depth; RS::get_singleton()->material_set_param(_get_material(), shader_names->transmittance_depth, p_depth); } + float BaseMaterial3D::get_transmittance_depth() const { return transmittance_depth; } @@ -1412,6 +1343,7 @@ void BaseMaterial3D::set_transmittance_curve(float p_curve) { transmittance_curve = p_curve; RS::get_singleton()->material_set_param(_get_material(), shader_names->transmittance_curve, p_curve); } + float BaseMaterial3D::get_transmittance_curve() const { return transmittance_curve; } @@ -1420,70 +1352,65 @@ void BaseMaterial3D::set_transmittance_boost(float p_boost) { transmittance_boost = p_boost; RS::get_singleton()->material_set_param(_get_material(), shader_names->transmittance_boost, p_boost); } + float BaseMaterial3D::get_transmittance_boost() const { return transmittance_boost; } void BaseMaterial3D::set_backlight(const Color &p_backlight) { - backlight = p_backlight; RS::get_singleton()->material_set_param(_get_material(), shader_names->backlight, backlight); } Color BaseMaterial3D::get_backlight() const { - return backlight; } void BaseMaterial3D::set_refraction(float p_refraction) { - refraction = p_refraction; RS::get_singleton()->material_set_param(_get_material(), shader_names->refraction, refraction); } float BaseMaterial3D::get_refraction() const { - return refraction; } void BaseMaterial3D::set_detail_uv(DetailUV p_detail_uv) { - - if (detail_uv == p_detail_uv) + if (detail_uv == p_detail_uv) { return; + } detail_uv = p_detail_uv; _queue_shader_change(); } -BaseMaterial3D::DetailUV BaseMaterial3D::get_detail_uv() const { +BaseMaterial3D::DetailUV BaseMaterial3D::get_detail_uv() const { return detail_uv; } void BaseMaterial3D::set_blend_mode(BlendMode p_mode) { - - if (blend_mode == p_mode) + if (blend_mode == p_mode) { return; + } blend_mode = p_mode; _queue_shader_change(); } -BaseMaterial3D::BlendMode BaseMaterial3D::get_blend_mode() const { +BaseMaterial3D::BlendMode BaseMaterial3D::get_blend_mode() const { return blend_mode; } void BaseMaterial3D::set_detail_blend_mode(BlendMode p_mode) { - detail_blend_mode = p_mode; _queue_shader_change(); } -BaseMaterial3D::BlendMode BaseMaterial3D::get_detail_blend_mode() const { +BaseMaterial3D::BlendMode BaseMaterial3D::get_detail_blend_mode() const { return detail_blend_mode; } void BaseMaterial3D::set_transparency(Transparency p_transparency) { - if (transparency == p_transparency) { return; } @@ -1498,7 +1425,6 @@ BaseMaterial3D::Transparency BaseMaterial3D::get_transparency() const { } void BaseMaterial3D::set_shading_mode(ShadingMode p_shading_mode) { - if (shading_mode == p_shading_mode) { return; } @@ -1513,63 +1439,63 @@ BaseMaterial3D::ShadingMode BaseMaterial3D::get_shading_mode() const { } void BaseMaterial3D::set_depth_draw_mode(DepthDrawMode p_mode) { - - if (depth_draw_mode == p_mode) + if (depth_draw_mode == p_mode) { return; + } depth_draw_mode = p_mode; _queue_shader_change(); } -BaseMaterial3D::DepthDrawMode BaseMaterial3D::get_depth_draw_mode() const { +BaseMaterial3D::DepthDrawMode BaseMaterial3D::get_depth_draw_mode() const { return depth_draw_mode; } void BaseMaterial3D::set_cull_mode(CullMode p_mode) { - - if (cull_mode == p_mode) + if (cull_mode == p_mode) { return; + } cull_mode = p_mode; _queue_shader_change(); } -BaseMaterial3D::CullMode BaseMaterial3D::get_cull_mode() const { +BaseMaterial3D::CullMode BaseMaterial3D::get_cull_mode() const { return cull_mode; } void BaseMaterial3D::set_diffuse_mode(DiffuseMode p_mode) { - - if (diffuse_mode == p_mode) + if (diffuse_mode == p_mode) { return; + } diffuse_mode = p_mode; _queue_shader_change(); } -BaseMaterial3D::DiffuseMode BaseMaterial3D::get_diffuse_mode() const { +BaseMaterial3D::DiffuseMode BaseMaterial3D::get_diffuse_mode() const { return diffuse_mode; } void BaseMaterial3D::set_specular_mode(SpecularMode p_mode) { - - if (specular_mode == p_mode) + if (specular_mode == p_mode) { return; + } specular_mode = p_mode; _queue_shader_change(); } -BaseMaterial3D::SpecularMode BaseMaterial3D::get_specular_mode() const { +BaseMaterial3D::SpecularMode BaseMaterial3D::get_specular_mode() const { return specular_mode; } void BaseMaterial3D::set_flag(Flags p_flag, bool p_enabled) { - ERR_FAIL_INDEX(p_flag, FLAG_MAX); - if (flags[p_flag] == p_enabled) + if (flags[p_flag] == p_enabled) { return; + } flags[p_flag] = p_enabled; if (p_flag == FLAG_USE_SHADOW_TO_OPACITY || p_flag == FLAG_USE_TEXTURE_REPEAT || p_flag == FLAG_SUBSURFACE_MODE_SKIN) { @@ -1579,16 +1505,15 @@ void BaseMaterial3D::set_flag(Flags p_flag, bool p_enabled) { } bool BaseMaterial3D::get_flag(Flags p_flag) const { - ERR_FAIL_INDEX_V(p_flag, FLAG_MAX, false); return flags[p_flag]; } void BaseMaterial3D::set_feature(Feature p_feature, bool p_enabled) { - ERR_FAIL_INDEX(p_feature, FEATURE_MAX); - if (features[p_feature] == p_enabled) + if (features[p_feature] == p_enabled) { return; + } features[p_feature] = p_enabled; _change_notify(); @@ -1596,13 +1521,11 @@ void BaseMaterial3D::set_feature(Feature p_feature, bool p_enabled) { } bool BaseMaterial3D::get_feature(Feature p_feature) const { - ERR_FAIL_INDEX_V(p_feature, FEATURE_MAX, false); return features[p_feature]; } void BaseMaterial3D::set_texture(TextureParam p_param, const Ref<Texture2D> &p_texture) { - ERR_FAIL_INDEX(p_param, TEXTURE_MAX); textures[p_param] = p_texture; RID rid = p_texture.is_valid() ? p_texture->get_rid() : RID(); @@ -1612,7 +1535,6 @@ void BaseMaterial3D::set_texture(TextureParam p_param, const Ref<Texture2D> &p_t } Ref<Texture2D> BaseMaterial3D::get_texture(TextureParam p_param) const { - ERR_FAIL_INDEX_V(p_param, TEXTURE_MAX, Ref<Texture2D>()); return textures[p_param]; } @@ -1620,8 +1542,9 @@ Ref<Texture2D> BaseMaterial3D::get_texture(TextureParam p_param) const { Ref<Texture2D> BaseMaterial3D::get_texture_by_name(StringName p_name) const { for (int i = 0; i < (int)BaseMaterial3D::TEXTURE_MAX; i++) { TextureParam param = TextureParam(i); - if (p_name == shader_names->texture_names[param]) + if (p_name == shader_names->texture_names[param]) { return textures[param]; + } } return Ref<Texture2D>(); } @@ -1695,7 +1618,6 @@ void BaseMaterial3D::_validate_property(PropertyInfo &property) const { } if (orm) { - if (property.name == "shading_mode") { property.hint_string = "Unshaded,PerPixel"; //vertex not supported in ORM mode, since no individual roughness. } @@ -1710,9 +1632,7 @@ void BaseMaterial3D::_validate_property(PropertyInfo &property) const { } if (shading_mode != SHADING_MODE_PER_PIXEL) { - if (shading_mode != SHADING_MODE_PER_VERTEX) { - //these may still work per vertex if (property.name.begins_with("ao")) { property.usage = 0; @@ -1761,176 +1681,148 @@ void BaseMaterial3D::_validate_property(PropertyInfo &property) const { } void BaseMaterial3D::set_point_size(float p_point_size) { - point_size = p_point_size; RS::get_singleton()->material_set_param(_get_material(), shader_names->point_size, p_point_size); } float BaseMaterial3D::get_point_size() const { - return point_size; } void BaseMaterial3D::set_uv1_scale(const Vector3 &p_scale) { - uv1_scale = p_scale; RS::get_singleton()->material_set_param(_get_material(), shader_names->uv1_scale, p_scale); } Vector3 BaseMaterial3D::get_uv1_scale() const { - return uv1_scale; } void BaseMaterial3D::set_uv1_offset(const Vector3 &p_offset) { - uv1_offset = p_offset; RS::get_singleton()->material_set_param(_get_material(), shader_names->uv1_offset, p_offset); } -Vector3 BaseMaterial3D::get_uv1_offset() const { +Vector3 BaseMaterial3D::get_uv1_offset() const { return uv1_offset; } void BaseMaterial3D::set_uv1_triplanar_blend_sharpness(float p_sharpness) { - uv1_triplanar_sharpness = p_sharpness; RS::get_singleton()->material_set_param(_get_material(), shader_names->uv1_blend_sharpness, p_sharpness); } float BaseMaterial3D::get_uv1_triplanar_blend_sharpness() const { - return uv1_triplanar_sharpness; } void BaseMaterial3D::set_uv2_scale(const Vector3 &p_scale) { - uv2_scale = p_scale; RS::get_singleton()->material_set_param(_get_material(), shader_names->uv2_scale, p_scale); } Vector3 BaseMaterial3D::get_uv2_scale() const { - return uv2_scale; } void BaseMaterial3D::set_uv2_offset(const Vector3 &p_offset) { - uv2_offset = p_offset; RS::get_singleton()->material_set_param(_get_material(), shader_names->uv2_offset, p_offset); } Vector3 BaseMaterial3D::get_uv2_offset() const { - return uv2_offset; } void BaseMaterial3D::set_uv2_triplanar_blend_sharpness(float p_sharpness) { - uv2_triplanar_sharpness = p_sharpness; RS::get_singleton()->material_set_param(_get_material(), shader_names->uv2_blend_sharpness, p_sharpness); } float BaseMaterial3D::get_uv2_triplanar_blend_sharpness() const { - return uv2_triplanar_sharpness; } void BaseMaterial3D::set_billboard_mode(BillboardMode p_mode) { - billboard_mode = p_mode; _queue_shader_change(); _change_notify(); } BaseMaterial3D::BillboardMode BaseMaterial3D::get_billboard_mode() const { - return billboard_mode; } void BaseMaterial3D::set_particles_anim_h_frames(int p_frames) { - particles_anim_h_frames = p_frames; RS::get_singleton()->material_set_param(_get_material(), shader_names->particles_anim_h_frames, p_frames); } int BaseMaterial3D::get_particles_anim_h_frames() const { - return particles_anim_h_frames; } -void BaseMaterial3D::set_particles_anim_v_frames(int p_frames) { +void BaseMaterial3D::set_particles_anim_v_frames(int p_frames) { particles_anim_v_frames = p_frames; RS::get_singleton()->material_set_param(_get_material(), shader_names->particles_anim_v_frames, p_frames); } int BaseMaterial3D::get_particles_anim_v_frames() const { - return particles_anim_v_frames; } void BaseMaterial3D::set_particles_anim_loop(bool p_loop) { - particles_anim_loop = p_loop; RS::get_singleton()->material_set_param(_get_material(), shader_names->particles_anim_loop, particles_anim_loop); } bool BaseMaterial3D::get_particles_anim_loop() const { - return particles_anim_loop; } void BaseMaterial3D::set_heightmap_deep_parallax(bool p_enable) { - deep_parallax = p_enable; _queue_shader_change(); _change_notify(); } bool BaseMaterial3D::is_heightmap_deep_parallax_enabled() const { - return deep_parallax; } void BaseMaterial3D::set_heightmap_deep_parallax_min_layers(int p_layer) { - deep_parallax_min_layers = p_layer; RS::get_singleton()->material_set_param(_get_material(), shader_names->heightmap_min_layers, p_layer); } -int BaseMaterial3D::get_heightmap_deep_parallax_min_layers() const { +int BaseMaterial3D::get_heightmap_deep_parallax_min_layers() const { return deep_parallax_min_layers; } void BaseMaterial3D::set_heightmap_deep_parallax_max_layers(int p_layer) { - deep_parallax_max_layers = p_layer; RS::get_singleton()->material_set_param(_get_material(), shader_names->heightmap_max_layers, p_layer); } -int BaseMaterial3D::get_heightmap_deep_parallax_max_layers() const { +int BaseMaterial3D::get_heightmap_deep_parallax_max_layers() const { return deep_parallax_max_layers; } void BaseMaterial3D::set_heightmap_deep_parallax_flip_tangent(bool p_flip) { - heightmap_parallax_flip_tangent = p_flip; RS::get_singleton()->material_set_param(_get_material(), shader_names->heightmap_flip, Vector2(heightmap_parallax_flip_tangent ? -1 : 1, heightmap_parallax_flip_binormal ? -1 : 1)); } bool BaseMaterial3D::get_heightmap_deep_parallax_flip_tangent() const { - return heightmap_parallax_flip_tangent; } void BaseMaterial3D::set_heightmap_deep_parallax_flip_binormal(bool p_flip) { - heightmap_parallax_flip_binormal = p_flip; RS::get_singleton()->material_set_param(_get_material(), shader_names->heightmap_flip, Vector2(heightmap_parallax_flip_tangent ? -1 : 1, heightmap_parallax_flip_binormal ? -1 : 1)); } bool BaseMaterial3D::get_heightmap_deep_parallax_flip_binormal() const { - return heightmap_parallax_flip_binormal; } @@ -1950,7 +1842,6 @@ void BaseMaterial3D::set_alpha_scissor_threshold(float p_threshold) { } float BaseMaterial3D::get_alpha_scissor_threshold() const { - return alpha_scissor_threshold; } @@ -1960,7 +1851,6 @@ void BaseMaterial3D::set_grow(float p_grow) { } float BaseMaterial3D::get_grow() const { - return grow; } @@ -1987,7 +1877,6 @@ BaseMaterial3D::TextureChannel BaseMaterial3D::get_metallic_texture_channel() co } void BaseMaterial3D::set_roughness_texture_channel(TextureChannel p_channel) { - ERR_FAIL_INDEX(p_channel, 5); roughness_texture_channel = p_channel; _queue_shader_change(); @@ -1998,7 +1887,6 @@ BaseMaterial3D::TextureChannel BaseMaterial3D::get_roughness_texture_channel() c } void BaseMaterial3D::set_ao_texture_channel(TextureChannel p_channel) { - ERR_FAIL_INDEX(p_channel, 5); ao_texture_channel = p_channel; RS::get_singleton()->material_set_param(_get_material(), shader_names->ao_texture_channel, _get_texture_mask(p_channel)); @@ -2009,7 +1897,6 @@ BaseMaterial3D::TextureChannel BaseMaterial3D::get_ao_texture_channel() const { } void BaseMaterial3D::set_refraction_texture_channel(TextureChannel p_channel) { - ERR_FAIL_INDEX(p_channel, 5); refraction_texture_channel = p_channel; RS::get_singleton()->material_set_param(_get_material(), shader_names->refraction_texture_channel, _get_texture_mask(p_channel)); @@ -2020,22 +1907,28 @@ BaseMaterial3D::TextureChannel BaseMaterial3D::get_refraction_texture_channel() } RID BaseMaterial3D::get_material_rid_for_2d(bool p_shaded, bool p_transparent, bool p_double_sided, bool p_cut_alpha, bool p_opaque_prepass, bool p_billboard, bool p_billboard_y) { - int version = 0; - if (p_shaded) + if (p_shaded) { version = 1; - if (p_transparent) + } + if (p_transparent) { version |= 2; - if (p_cut_alpha) + } + if (p_cut_alpha) { version |= 4; - if (p_opaque_prepass) + } + if (p_opaque_prepass) { version |= 8; - if (p_double_sided) + } + if (p_double_sided) { version |= 16; - if (p_billboard) + } + if (p_billboard) { version |= 32; - if (p_billboard_y) + } + if (p_billboard_y) { version |= 64; + } if (materials_for_2d[version].is_valid()) { return materials_for_2d[version]->get_rid(); @@ -2066,85 +1959,74 @@ void BaseMaterial3D::set_on_top_of_alpha() { } void BaseMaterial3D::set_proximity_fade(bool p_enable) { - proximity_fade_enabled = p_enable; _queue_shader_change(); _change_notify(); } bool BaseMaterial3D::is_proximity_fade_enabled() const { - return proximity_fade_enabled; } void BaseMaterial3D::set_proximity_fade_distance(float p_distance) { - proximity_fade_distance = p_distance; RS::get_singleton()->material_set_param(_get_material(), shader_names->proximity_fade_distance, p_distance); } -float BaseMaterial3D::get_proximity_fade_distance() const { +float BaseMaterial3D::get_proximity_fade_distance() const { return proximity_fade_distance; } void BaseMaterial3D::set_distance_fade(DistanceFadeMode p_mode) { - distance_fade = p_mode; _queue_shader_change(); _change_notify(); } -BaseMaterial3D::DistanceFadeMode BaseMaterial3D::get_distance_fade() const { +BaseMaterial3D::DistanceFadeMode BaseMaterial3D::get_distance_fade() const { return distance_fade; } void BaseMaterial3D::set_distance_fade_max_distance(float p_distance) { - distance_fade_max_distance = p_distance; RS::get_singleton()->material_set_param(_get_material(), shader_names->distance_fade_max, distance_fade_max_distance); } -float BaseMaterial3D::get_distance_fade_max_distance() const { +float BaseMaterial3D::get_distance_fade_max_distance() const { return distance_fade_max_distance; } void BaseMaterial3D::set_distance_fade_min_distance(float p_distance) { - distance_fade_min_distance = p_distance; RS::get_singleton()->material_set_param(_get_material(), shader_names->distance_fade_min, distance_fade_min_distance); } float BaseMaterial3D::get_distance_fade_min_distance() const { - return distance_fade_min_distance; } void BaseMaterial3D::set_emission_operator(EmissionOperator p_op) { - - if (emission_op == p_op) + if (emission_op == p_op) { return; + } emission_op = p_op; _queue_shader_change(); } BaseMaterial3D::EmissionOperator BaseMaterial3D::get_emission_operator() const { - return emission_op; } RID BaseMaterial3D::get_shader_rid() const { - ERR_FAIL_COND_V(!shader_map.has(current_key), RID()); return shader_map[current_key].shader; } Shader::Mode BaseMaterial3D::get_shader_mode() const { - return Shader::MODE_SPATIAL; } void BaseMaterial3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_albedo", "albedo"), &BaseMaterial3D::set_albedo); ClassDB::bind_method(D_METHOD("get_albedo"), &BaseMaterial3D::get_albedo); @@ -2622,7 +2504,6 @@ void BaseMaterial3D::_bind_methods() { BaseMaterial3D::BaseMaterial3D(bool p_orm) : element(this) { - orm = p_orm; // Initialize to the same values as the shader transparency = TRANSPARENCY_DISABLED; @@ -2709,7 +2590,6 @@ BaseMaterial3D::BaseMaterial3D(bool p_orm) : } BaseMaterial3D::~BaseMaterial3D() { - MutexLock lock(material_mutex); if (shader_map.has(current_key)) { diff --git a/scene/resources/material.h b/scene/resources/material.h index 241357ba9b..433e3d304e 100644 --- a/scene/resources/material.h +++ b/scene/resources/material.h @@ -39,7 +39,6 @@ #include "servers/rendering_server.h" class Material : public Resource { - GDCLASS(Material, Resource); RES_BASE_EXTENSION("material") OBJ_SAVE_TYPE(Material); @@ -74,7 +73,6 @@ public: }; class ShaderMaterial : public Material { - GDCLASS(ShaderMaterial, Material); Ref<Shader> shader; @@ -109,7 +107,6 @@ public: class StandardMaterial3D; class BaseMaterial3D : public Material { - GDCLASS(BaseMaterial3D, Material); public: @@ -269,7 +266,6 @@ public: private: union MaterialKey { - struct { uint64_t feature_mask : FEATURE_MAX; uint64_t detail_uv : 1; @@ -316,7 +312,6 @@ private: MaterialKey current_key; _FORCE_INLINE_ MaterialKey _compute_key() const { - MaterialKey mk; mk.key0 = 0; mk.key1 = 0; diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index 6548c65cd7..10f0a040d0 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -40,28 +40,27 @@ Mesh::ConvexDecompositionFunc Mesh::convex_composition_function = nullptr; Ref<TriangleMesh> Mesh::generate_triangle_mesh() const { - - if (triangle_mesh.is_valid()) + if (triangle_mesh.is_valid()) { return triangle_mesh; + } int facecount = 0; for (int i = 0; i < get_surface_count(); i++) { - - if (surface_get_primitive_type(i) != PRIMITIVE_TRIANGLES) + if (surface_get_primitive_type(i) != PRIMITIVE_TRIANGLES) { continue; + } if (surface_get_format(i) & ARRAY_FORMAT_INDEX) { - facecount += surface_get_array_index_len(i); } else { - facecount += surface_get_array_len(i); } } - if (facecount == 0 || (facecount % 3) != 0) + if (facecount == 0 || (facecount % 3) != 0) { return triangle_mesh; + } Vector<Vector3> faces; faces.resize(facecount); @@ -70,9 +69,9 @@ Ref<TriangleMesh> Mesh::generate_triangle_mesh() const { int widx = 0; for (int i = 0; i < get_surface_count(); i++) { - - if (surface_get_primitive_type(i) != PRIMITIVE_TRIANGLES) + if (surface_get_primitive_type(i) != PRIMITIVE_TRIANGLES) { continue; + } Array a = surface_get_arrays(i); ERR_FAIL_COND_V(a.empty(), Ref<TriangleMesh>()); @@ -82,7 +81,6 @@ Ref<TriangleMesh> Mesh::generate_triangle_mesh() const { const Vector3 *vr = vertices.ptr(); if (surface_get_format(i) & ARRAY_FORMAT_INDEX) { - int ic = surface_get_array_index_len(i); Vector<int> indices = a[ARRAY_INDEX]; const int *ir = indices.ptr(); @@ -93,9 +91,9 @@ Ref<TriangleMesh> Mesh::generate_triangle_mesh() const { } } else { - - for (int j = 0; j < vc; j++) + for (int j = 0; j < vc; j++) { facesw[widx++] = vr[j]; + } } } @@ -106,15 +104,15 @@ Ref<TriangleMesh> Mesh::generate_triangle_mesh() const { } void Mesh::generate_debug_mesh_lines(Vector<Vector3> &r_lines) { - if (debug_lines.size() > 0) { r_lines = debug_lines; return; } Ref<TriangleMesh> tm = generate_triangle_mesh(); - if (tm.is_null()) + if (tm.is_null()) { return; + } Vector<int> triangle_indices; tm->get_indices(&triangle_indices); @@ -141,10 +139,12 @@ void Mesh::generate_debug_mesh_lines(Vector<Vector3> &r_lines) { r_lines = debug_lines; } + void Mesh::generate_debug_mesh_indices(Vector<Vector3> &r_points) { Ref<TriangleMesh> tm = generate_triangle_mesh(); - if (tm.is_null()) + if (tm.is_null()) { return; + } Vector<Vector3> vertices = tm->get_vertices(); @@ -161,10 +161,10 @@ bool Mesh::surface_is_softbody_friendly(int p_idx) const { } Vector<Face3> Mesh::get_faces() const { - Ref<TriangleMesh> tm = generate_triangle_mesh(); - if (tm.is_valid()) + if (tm.is_valid()) { return tm->get_faces(); + } return Vector<Face3>(); /* for (int i=0;i<surfaces.size();i++) { @@ -227,11 +227,9 @@ Vector<Face3> Mesh::get_faces() const { } Ref<Shape3D> Mesh::create_convex_shape() const { - Vector<Vector3> vertices; for (int i = 0; i < get_surface_count(); i++) { - Array a = surface_get_arrays(i); ERR_FAIL_COND_V(a.empty(), Ref<ConvexPolygonShape3D>()); Vector<Vector3> v = a[ARRAY_VERTEX]; @@ -244,16 +242,15 @@ Ref<Shape3D> Mesh::create_convex_shape() const { } Ref<Shape3D> Mesh::create_trimesh_shape() const { - Vector<Face3> faces = get_faces(); - if (faces.size() == 0) + if (faces.size() == 0) { return Ref<Shape3D>(); + } Vector<Vector3> face_points; face_points.resize(faces.size() * 3); for (int i = 0; i < face_points.size(); i += 3) { - Face3 f = faces.get(i / 3); face_points.set(i, f.vertex[0]); face_points.set(i + 1, f.vertex[1]); @@ -266,13 +263,12 @@ Ref<Shape3D> Mesh::create_trimesh_shape() const { } Ref<Mesh> Mesh::create_outline(float p_margin) const { - Array arrays; int index_accum = 0; for (int i = 0; i < get_surface_count(); i++) { - - if (surface_get_primitive_type(i) != PRIMITIVE_TRIANGLES) + if (surface_get_primitive_type(i) != PRIMITIVE_TRIANGLES) { continue; + } Array a = surface_get_arrays(i); ERR_FAIL_COND_V(a.empty(), Ref<ArrayMesh>()); @@ -282,10 +278,8 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { Vector<Vector3> v = a[ARRAY_VERTEX]; index_accum += v.size(); } else { - int vcount = 0; for (int j = 0; j < arrays.size(); j++) { - if (arrays[j].get_type() == Variant::NIL || a[j].get_type() == Variant::NIL) { //mismatch, do not use arrays[j] = Variant(); @@ -293,14 +287,13 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { } switch (j) { - case ARRAY_VERTEX: case ARRAY_NORMAL: { - Vector<Vector3> dst = arrays[j]; Vector<Vector3> src = a[j]; - if (j == ARRAY_VERTEX) + if (j == ARRAY_VERTEX) { vcount = src.size(); + } if (dst.size() == 0 || src.size() == 0) { arrays[j] = Variant(); continue; @@ -311,7 +304,6 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { case ARRAY_TANGENT: case ARRAY_BONES: case ARRAY_WEIGHTS: { - Vector<real_t> dst = arrays[j]; Vector<real_t> src = a[j]; if (dst.size() == 0 || src.size() == 0) { @@ -391,7 +383,6 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { //fill normals with triangle normals for (int i = 0; i < vc; i += 3) { - Vector3 t[3]; if (has_indices) { @@ -407,14 +398,14 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { Vector3 n = Plane(t[0], t[1], t[2]).normal; for (int j = 0; j < 3; j++) { - Map<Vector3, Vector3>::Element *E = normal_accum.find(t[j]); if (!E) { normal_accum[t[j]] = n; } else { float d = n.dot(E->get()); - if (d < 1.0) + if (d < 1.0) { E->get() += n * (1.0 - d); + } //E->get()+=n; } } @@ -430,7 +421,6 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { int vc2 = vertices.size(); for (int i = 0; i < vc2; i++) { - Vector3 t = r[i]; Map<Vector3, Vector3>::Element *E = normal_accum.find(t); @@ -443,13 +433,11 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { arrays[ARRAY_VERTEX] = vertices; if (!has_indices) { - Vector<int> new_indices; new_indices.resize(vertices.size()); int *iw = new_indices.ptrw(); for (int j = 0; j < vc2; j += 3) { - iw[j] = j; iw[j + 1] = j + 2; iw[j + 2] = j + 1; @@ -458,9 +446,7 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const { arrays[ARRAY_INDEX] = new_indices; } else { - for (int j = 0; j < vc; j += 3) { - SWAP(ir[j + 1], ir[j + 2]); } arrays[ARRAY_INDEX] = indices; @@ -481,7 +467,6 @@ Size2i Mesh::get_lightmap_size_hint() const { } void Mesh::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_lightmap_size_hint", "size"), &Mesh::set_lightmap_size_hint); ClassDB::bind_method(D_METHOD("get_lightmap_size_hint"), &Mesh::get_lightmap_size_hint); ClassDB::bind_method(D_METHOD("get_aabb"), &Mesh::get_aabb); @@ -542,7 +527,6 @@ void Mesh::clear_cache() const { } Vector<Ref<Shape3D>> Mesh::convex_decompose() const { - ERR_FAIL_COND_V(!convex_composition_function, Vector<Ref<Shape3D>>()); const Vector<Face3> faces = get_faces(); @@ -582,7 +566,6 @@ Mesh::Mesh() { } static Vector<uint8_t> _fix_array_compatibility(const Vector<uint8_t> &p_src, uint32_t p_format, uint32_t p_elements) { - bool vertex_16bit = p_format & ((1 << (Mesh::ARRAY_VERTEX + Mesh::ARRAY_COMPRESS_BASE))); bool has_bones = (p_format & Mesh::ARRAY_FORMAT_BONES); bool bone_8 = has_bones && !(p_format & (Mesh::ARRAY_COMPRESS_INDEX << 2)); @@ -607,7 +590,6 @@ static Vector<uint8_t> _fix_array_compatibility(const Vector<uint8_t> &p_src, ui const uint8_t *r = p_src.ptr(); for (uint32_t i = 0; i < p_elements; i++) { - uint32_t remaining = src_stride; const uint8_t *src = (const uint8_t *)(r + src_stride * i); uint8_t *dst = (uint8_t *)(w + dst_stride * i); @@ -642,7 +624,6 @@ static Vector<uint8_t> _fix_array_compatibility(const Vector<uint8_t> &p_src, ui } if (has_bones) { - remaining -= bone_8 ? 4 : 8; remaining -= weight_32 ? 16 : 8; } @@ -652,12 +633,10 @@ static Vector<uint8_t> _fix_array_compatibility(const Vector<uint8_t> &p_src, ui } if (has_bones) { - dst += remaining; src += remaining; if (bone_8) { - const uint8_t *src_bones = (const uint8_t *)src; uint16_t *dst_bones = (uint16_t *)dst; @@ -678,7 +657,6 @@ static Vector<uint8_t> _fix_array_compatibility(const Vector<uint8_t> &p_src, ui dst += 8; if (weight_32) { - const float *src_weights = (const float *)src; uint16_t *dst_weights = (uint16_t *)dst; @@ -700,43 +678,43 @@ static Vector<uint8_t> _fix_array_compatibility(const Vector<uint8_t> &p_src, ui } bool ArrayMesh::_set(const StringName &p_name, const Variant &p_value) { - String sname = p_name; if (p_name == "blend_shape/names") { - Vector<String> sk = p_value; int sz = sk.size(); const String *r = sk.ptr(); - for (int i = 0; i < sz; i++) + for (int i = 0; i < sz; i++) { add_blend_shape(r[i]); + } return true; } if (p_name == "blend_shape/mode") { - set_blend_shape_mode(BlendShapeMode(int(p_value))); return true; } if (sname.begins_with("surface_")) { - int sl = sname.find("/"); - if (sl == -1) + if (sl == -1) { return false; + } int idx = sname.substr(8, sl - 8).to_int() - 1; String what = sname.get_slicec('/', 1); - if (what == "material") + if (what == "material") { surface_set_material(idx, p_value); - else if (what == "name") + } else if (what == "name") { surface_set_name(idx, p_value); + } return true; } #ifndef DISABLE_DEPRECATED // Kept for compatibility from 3.x to 4.0. - if (!sname.begins_with("surfaces")) + if (!sname.begins_with("surfaces")) { return false; + } WARN_DEPRECATED_MSG("Mesh uses old surface format, which is deprecated (and loads slower). Consider re-importing or re-saving the scene."); @@ -744,7 +722,6 @@ bool ArrayMesh::_set(const StringName &p_name, const Variant &p_value) { String what = sname.get_slicec('/', 2); if (idx == surfaces.size()) { - //create Dictionary d = p_value; ERR_FAIL_COND_V(!d.has("primitive"), false); @@ -759,8 +736,9 @@ bool ArrayMesh::_set(const StringName &p_name, const Variant &p_value) { //older format (3.x) Vector<uint8_t> array_data = d["array_data"]; Vector<uint8_t> array_index_data; - if (d.has("array_index_data")) + if (d.has("array_index_data")) { array_index_data = d["array_index_data"]; + } ERR_FAIL_COND_V(!d.has("format"), false); uint32_t format = d["format"]; @@ -785,8 +763,9 @@ bool ArrayMesh::_set(const StringName &p_name, const Variant &p_value) { array_data = _fix_array_compatibility(array_data, format, vertex_count); int index_count = 0; - if (d.has("index_count")) + if (d.has("index_count")) { index_count = d["index_count"]; + } Vector<Vector<uint8_t>> blend_shapes; @@ -824,7 +803,6 @@ bool ArrayMesh::_set(const StringName &p_name, const Variant &p_value) { } if (d.has("material")) { - surface_set_material(idx, d["material"]); } if (d.has("name")) { @@ -839,7 +817,6 @@ bool ArrayMesh::_set(const StringName &p_name, const Variant &p_value) { } Array ArrayMesh::_get_surfaces() const { - if (mesh.is_null()) { return Array(); } @@ -908,7 +885,6 @@ void ArrayMesh::_create_if_empty() const { } void ArrayMesh::_set_surfaces(const Array &p_surfaces) { - Vector<RS::SurfaceData> surface_data; Vector<Ref<Material>> surface_materials; Vector<String> surface_names; @@ -1031,34 +1007,34 @@ void ArrayMesh::_set_surfaces(const Array &p_surfaces) { } bool ArrayMesh::_get(const StringName &p_name, Variant &r_ret) const { - - if (_is_generated()) + if (_is_generated()) { return false; + } String sname = p_name; if (p_name == "blend_shape/names") { - Vector<String> sk; - for (int i = 0; i < blend_shapes.size(); i++) + for (int i = 0; i < blend_shapes.size(); i++) { sk.push_back(blend_shapes[i]); + } r_ret = sk; return true; } else if (p_name == "blend_shape/mode") { - r_ret = get_blend_shape_mode(); return true; } else if (sname.begins_with("surface_")) { - int sl = sname.find("/"); - if (sl == -1) + if (sl == -1) { return false; + } int idx = sname.substr(8, sl - 8).to_int() - 1; String what = sname.get_slicec('/', 1); - if (what == "material") + if (what == "material") { r_ret = surface_get_material(idx); - else if (what == "name") + } else if (what == "name") { r_ret = surface_get_name(idx); + } return true; } @@ -1066,9 +1042,9 @@ bool ArrayMesh::_get(const StringName &p_name, Variant &r_ret) const { } void ArrayMesh::_get_property_list(List<PropertyInfo> *p_list) const { - - if (_is_generated()) + if (_is_generated()) { return; + } if (blend_shapes.size()) { p_list->push_back(PropertyInfo(Variant::PACKED_STRING_ARRAY, "blend_shape/names", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL)); @@ -1076,7 +1052,6 @@ void ArrayMesh::_get_property_list(List<PropertyInfo> *p_list) const { } for (int i = 0; i < surfaces.size(); i++) { - p_list->push_back(PropertyInfo(Variant::STRING, "surface_" + itos(i + 1) + "/name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); if (surfaces[i].is_2d) { p_list->push_back(PropertyInfo(Variant::OBJECT, "surface_" + itos(i + 1) + "/material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,CanvasItemMaterial", PROPERTY_USAGE_EDITOR)); @@ -1087,23 +1062,21 @@ void ArrayMesh::_get_property_list(List<PropertyInfo> *p_list) const { } void ArrayMesh::_recompute_aabb() { - // regenerate AABB aabb = AABB(); for (int i = 0; i < surfaces.size(); i++) { - - if (i == 0) + if (i == 0) { aabb = surfaces[i].aabb; - else + } else { aabb.merge_with(surfaces[i].aabb); + } } } #ifndef _MSC_VER #warning need to add binding to add_surface using future MeshSurfaceData object #endif void ArrayMesh::add_surface(uint32_t p_format, PrimitiveType p_primitive, const Vector<uint8_t> &p_array, int p_vertex_count, const Vector<uint8_t> &p_index_array, int p_index_count, const AABB &p_aabb, const Vector<Vector<uint8_t>> &p_blend_shapes, const Vector<AABB> &p_bone_aabb, const Vector<RS::SurfaceData::LOD> &p_lods) { - _create_if_empty(); Surface s; @@ -1137,7 +1110,6 @@ void ArrayMesh::add_surface(uint32_t p_format, PrimitiveType p_primitive, const } void ArrayMesh::add_surface_from_arrays(PrimitiveType p_primitive, const Array &p_arrays, const Array &p_blend_shapes, const Dictionary &p_lods, uint32_t p_flags) { - ERR_FAIL_COND(p_arrays.size() != ARRAY_MAX); RS::SurfaceData surface; @@ -1157,36 +1129,32 @@ void ArrayMesh::add_surface_from_arrays(PrimitiveType p_primitive, const Array & } Array ArrayMesh::surface_get_arrays(int p_surface) const { - ERR_FAIL_INDEX_V(p_surface, surfaces.size(), Array()); return RenderingServer::get_singleton()->mesh_surface_get_arrays(mesh, p_surface); } -Array ArrayMesh::surface_get_blend_shape_arrays(int p_surface) const { +Array ArrayMesh::surface_get_blend_shape_arrays(int p_surface) const { ERR_FAIL_INDEX_V(p_surface, surfaces.size(), Array()); return RenderingServer::get_singleton()->mesh_surface_get_blend_shape_arrays(mesh, p_surface); } + Dictionary ArrayMesh::surface_get_lods(int p_surface) const { ERR_FAIL_INDEX_V(p_surface, surfaces.size(), Dictionary()); return RenderingServer::get_singleton()->mesh_surface_get_lods(mesh, p_surface); } int ArrayMesh::get_surface_count() const { - return surfaces.size(); } void ArrayMesh::add_blend_shape(const StringName &p_name) { - ERR_FAIL_COND_MSG(surfaces.size(), "Can't add a shape key count if surfaces are already created."); StringName name = p_name; if (blend_shapes.find(name) != -1) { - int count = 2; do { - name = String(p_name) + " " + itos(count); count++; } while (blend_shapes.find(name) != -1); @@ -1197,22 +1165,21 @@ void ArrayMesh::add_blend_shape(const StringName &p_name) { } int ArrayMesh::get_blend_shape_count() const { - return blend_shapes.size(); } + StringName ArrayMesh::get_blend_shape_name(int p_index) const { ERR_FAIL_INDEX_V(p_index, blend_shapes.size(), StringName()); return blend_shapes[p_index]; } -void ArrayMesh::clear_blend_shapes() { +void ArrayMesh::clear_blend_shapes() { ERR_FAIL_COND_MSG(surfaces.size(), "Can't set shape key count if surfaces are already created."); blend_shapes.clear(); } void ArrayMesh::set_blend_shape_mode(BlendShapeMode p_mode) { - blend_shape_mode = p_mode; if (mesh.is_valid()) { RS::get_singleton()->mesh_set_blend_shape_mode(mesh, (RS::BlendShapeMode)p_mode); @@ -1220,39 +1187,34 @@ void ArrayMesh::set_blend_shape_mode(BlendShapeMode p_mode) { } ArrayMesh::BlendShapeMode ArrayMesh::get_blend_shape_mode() const { - return blend_shape_mode; } int ArrayMesh::surface_get_array_len(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, surfaces.size(), -1); return surfaces[p_idx].array_length; } int ArrayMesh::surface_get_array_index_len(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, surfaces.size(), -1); return surfaces[p_idx].index_array_length; } uint32_t ArrayMesh::surface_get_format(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, surfaces.size(), 0); return surfaces[p_idx].format; } ArrayMesh::PrimitiveType ArrayMesh::surface_get_primitive_type(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, surfaces.size(), PRIMITIVE_LINES); return surfaces[p_idx].primitive; } void ArrayMesh::surface_set_material(int p_idx, const Ref<Material> &p_material) { - ERR_FAIL_INDEX(p_idx, surfaces.size()); - if (surfaces[p_idx].material == p_material) + if (surfaces[p_idx].material == p_material) { return; + } surfaces.write[p_idx].material = p_material; RenderingServer::get_singleton()->mesh_surface_set_material(mesh, p_idx, p_material.is_null() ? RID() : p_material->get_rid()); @@ -1270,7 +1232,6 @@ int ArrayMesh::surface_find_by_name(const String &p_name) const { } void ArrayMesh::surface_set_name(int p_idx, const String &p_name) { - ERR_FAIL_INDEX(p_idx, surfaces.size()); surfaces.write[p_idx].name = p_name; @@ -1278,20 +1239,17 @@ void ArrayMesh::surface_set_name(int p_idx, const String &p_name) { } String ArrayMesh::surface_get_name(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, surfaces.size(), String()); return surfaces[p_idx].name; } void ArrayMesh::surface_update_region(int p_surface, int p_offset, const Vector<uint8_t> &p_data) { - ERR_FAIL_INDEX(p_surface, surfaces.size()); RS::get_singleton()->mesh_surface_update_region(mesh, p_surface, p_offset, p_data); emit_changed(); } void ArrayMesh::surface_set_custom_aabb(int p_idx, const AABB &p_aabb) { - ERR_FAIL_INDEX(p_idx, surfaces.size()); surfaces.write[p_idx].aabb = p_aabb; // set custom aabb too? @@ -1299,18 +1257,16 @@ void ArrayMesh::surface_set_custom_aabb(int p_idx, const AABB &p_aabb) { } Ref<Material> ArrayMesh::surface_get_material(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, surfaces.size(), Ref<Material>()); return surfaces[p_idx].material; } RID ArrayMesh::get_rid() const { - _create_if_empty(); return mesh; } -AABB ArrayMesh::get_aabb() const { +AABB ArrayMesh::get_aabb() const { return aabb; } @@ -1324,7 +1280,6 @@ void ArrayMesh::clear_surfaces() { } void ArrayMesh::set_custom_aabb(const AABB &p_custom) { - _create_if_empty(); custom_aabb = p_custom; RS::get_singleton()->mesh_set_custom_aabb(mesh, custom_aabb); @@ -1332,18 +1287,15 @@ void ArrayMesh::set_custom_aabb(const AABB &p_custom) { } AABB ArrayMesh::get_custom_aabb() const { - return custom_aabb; } void ArrayMesh::regen_normalmaps() { - if (surfaces.size() == 0) { return; } Vector<Ref<SurfaceTool>> surfs; for (int i = 0; i < get_surface_count(); i++) { - Ref<SurfaceTool> st = memnew(SurfaceTool); st->create_from(Ref<ArrayMesh>(this), i); surfs.push_back(st); @@ -1352,7 +1304,6 @@ void ArrayMesh::regen_normalmaps() { clear_surfaces(); for (int i = 0; i < surfs.size(); i++) { - surfs.write[i]->generate_tangents(); surfs.write[i]->commit(Ref<ArrayMesh>(this)); } @@ -1362,7 +1313,6 @@ void ArrayMesh::regen_normalmaps() { bool (*array_mesh_lightmap_unwrap_callback)(float p_texel_size, const float *p_vertices, const float *p_normals, int p_vertex_count, const int *p_indices, int p_index_count, float **r_uv, int **r_vertex, int *r_vertex_count, int **r_index, int *r_index_count, int *r_size_hint_x, int *r_size_hint_y, int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache); struct ArrayMeshLightmapSurface { - Ref<Material> material; Vector<SurfaceTool::Vertex> vertices; Mesh::PrimitiveType primitive; @@ -1377,7 +1327,6 @@ Error ArrayMesh::lightmap_unwrap(const Transform &p_base_transform, float p_texe } Error ArrayMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cache_size, bool &r_used_cache, const Transform &p_base_transform, float p_texel_size) { - ERR_FAIL_COND_V(!array_mesh_lightmap_unwrap_callback, ERR_UNCONFIGURED); ERR_FAIL_COND_V_MSG(blend_shapes.size() != 0, ERR_UNAVAILABLE, "Can't unwrap mesh with blend shapes."); @@ -1422,7 +1371,6 @@ Error ArrayMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cach uv_indices.resize(vertex_ofs + vc); for (int j = 0; j < vc; j++) { - Vector3 v = transform.xform(r[j]); Vector3 n = normal_basis.xform(rn[j]).normalized(); @@ -1439,10 +1387,10 @@ Error ArrayMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cach int ic = rindices.size(); if (ic == 0) { - for (int j = 0; j < vc / 3; j++) { - if (Face3(r[j * 3 + 0], r[j * 3 + 1], r[j * 3 + 2]).is_degenerate()) + if (Face3(r[j * 3 + 0], r[j * 3 + 1], r[j * 3 + 2]).is_degenerate()) { continue; + } indices.push_back(vertex_ofs + j * 3 + 0); indices.push_back(vertex_ofs + j * 3 + 1); @@ -1453,8 +1401,9 @@ Error ArrayMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cach const int *ri = rindices.ptr(); for (int j = 0; j < ic / 3; j++) { - if (Face3(r[ri[j * 3 + 0]], r[ri[j * 3 + 1]], r[ri[j * 3 + 2]]).is_degenerate()) + if (Face3(r[ri[j * 3 + 0]], r[ri[j * 3 + 1]], r[ri[j * 3 + 2]]).is_degenerate()) { continue; + } indices.push_back(vertex_ofs + ri[j * 3 + 0]); indices.push_back(vertex_ofs + ri[j * 3 + 1]); indices.push_back(vertex_ofs + ri[j * 3 + 2]); @@ -1497,7 +1446,6 @@ Error ArrayMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cach print_verbose("Mesh: Gen indices: " + itos(gen_index_count)); //go through all indices for (int i = 0; i < gen_index_count; i += 3) { - ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 0]], uv_indices.size(), ERR_BUG); ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 1]], uv_indices.size(), ERR_BUG); ERR_FAIL_INDEX_V(gen_vertices[gen_indices[i + 2]], uv_indices.size(), ERR_BUG); @@ -1507,7 +1455,6 @@ Error ArrayMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cach int surface = uv_indices[gen_vertices[gen_indices[i + 0]]].first; for (int j = 0; j < 3; j++) { - SurfaceTool::Vertex v = lightmap_surfaces[surface].vertices[uv_indices[gen_vertices[gen_indices[i + j]]].second]; if (lightmap_surfaces[surface].format & ARRAY_FORMAT_COLOR) { @@ -1559,7 +1506,6 @@ Error ArrayMesh::lightmap_unwrap_cached(int *&r_cache_data, unsigned int &r_cach } void ArrayMesh::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_blend_shape", "name"), &ArrayMesh::add_blend_shape); ClassDB::bind_method(D_METHOD("get_blend_shape_count"), &ArrayMesh::get_blend_shape_count); ClassDB::bind_method(D_METHOD("get_blend_shape_name", "index"), &ArrayMesh::get_blend_shape_name); @@ -1634,14 +1580,12 @@ void ArrayMesh::reload_from_file() { } ArrayMesh::ArrayMesh() { - //mesh is now created on demand //mesh = RenderingServer::get_singleton()->mesh_create(); blend_shape_mode = BLEND_SHAPE_MODE_RELATIVE; } ArrayMesh::~ArrayMesh() { - if (mesh.is_valid()) { RenderingServer::get_singleton()->free(mesh); } diff --git a/scene/resources/mesh.h b/scene/resources/mesh.h index 80cd57846b..44e4e78322 100644 --- a/scene/resources/mesh.h +++ b/scene/resources/mesh.h @@ -152,7 +152,6 @@ public: }; class ArrayMesh : public Mesh { - GDCLASS(ArrayMesh, Mesh); RES_BASE_EXTENSION("mesh"); diff --git a/scene/resources/mesh_data_tool.cpp b/scene/resources/mesh_data_tool.cpp index 76d96786bc..a5c360f123 100644 --- a/scene/resources/mesh_data_tool.cpp +++ b/scene/resources/mesh_data_tool.cpp @@ -31,7 +31,6 @@ #include "mesh_data_tool.h" void MeshDataTool::clear() { - vertices.clear(); edges.clear(); faces.clear(); @@ -40,7 +39,6 @@ void MeshDataTool::clear() { } Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surface) { - ERR_FAIL_COND_V(p_mesh.is_null(), ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(p_mesh->surface_get_primitive_type(p_surface) != Mesh::PRIMITIVE_TRIANGLES, ERR_INVALID_PARAMETER); @@ -59,51 +57,61 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf const Vector3 *vr = varray.ptr(); const Vector3 *nr = nullptr; - if (arrays[Mesh::ARRAY_NORMAL].get_type() != Variant::NIL) + if (arrays[Mesh::ARRAY_NORMAL].get_type() != Variant::NIL) { nr = arrays[Mesh::ARRAY_NORMAL].operator Vector<Vector3>().ptr(); + } const real_t *ta = nullptr; - if (arrays[Mesh::ARRAY_TANGENT].get_type() != Variant::NIL) + if (arrays[Mesh::ARRAY_TANGENT].get_type() != Variant::NIL) { ta = arrays[Mesh::ARRAY_TANGENT].operator Vector<real_t>().ptr(); + } const Vector2 *uv = nullptr; - if (arrays[Mesh::ARRAY_TEX_UV].get_type() != Variant::NIL) + if (arrays[Mesh::ARRAY_TEX_UV].get_type() != Variant::NIL) { uv = arrays[Mesh::ARRAY_TEX_UV].operator Vector<Vector2>().ptr(); + } const Vector2 *uv2 = nullptr; - if (arrays[Mesh::ARRAY_TEX_UV2].get_type() != Variant::NIL) + if (arrays[Mesh::ARRAY_TEX_UV2].get_type() != Variant::NIL) { uv2 = arrays[Mesh::ARRAY_TEX_UV2].operator Vector<Vector2>().ptr(); + } const Color *col = nullptr; - if (arrays[Mesh::ARRAY_COLOR].get_type() != Variant::NIL) + if (arrays[Mesh::ARRAY_COLOR].get_type() != Variant::NIL) { col = arrays[Mesh::ARRAY_COLOR].operator Vector<Color>().ptr(); + } const int *bo = nullptr; - if (arrays[Mesh::ARRAY_BONES].get_type() != Variant::NIL) + if (arrays[Mesh::ARRAY_BONES].get_type() != Variant::NIL) { bo = arrays[Mesh::ARRAY_BONES].operator Vector<int>().ptr(); + } const real_t *we = nullptr; - if (arrays[Mesh::ARRAY_WEIGHTS].get_type() != Variant::NIL) + if (arrays[Mesh::ARRAY_WEIGHTS].get_type() != Variant::NIL) { we = arrays[Mesh::ARRAY_WEIGHTS].operator Vector<real_t>().ptr(); + } vertices.resize(vcount); for (int i = 0; i < vcount; i++) { - Vertex v; v.vertex = vr[i]; - if (nr) + if (nr) { v.normal = nr[i]; - if (ta) + } + if (ta) { v.tangent = Plane(ta[i * 4 + 0], ta[i * 4 + 1], ta[i * 4 + 2], ta[i * 4 + 3]); - if (uv) + } + if (uv) { v.uv = uv[i]; - if (uv2) + } + if (uv2) { v.uv2 = uv2[i]; - if (col) + } + if (col) { v.color = col[i]; + } if (we) { - v.weights.push_back(we[i * 4 + 0]); v.weights.push_back(we[i * 4 + 1]); v.weights.push_back(we[i * 4 + 2]); @@ -111,7 +119,6 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf } if (bo) { - v.bones.push_back(bo[i * 4 + 0]); v.bones.push_back(bo[i * 4 + 1]); v.bones.push_back(bo[i * 4 + 2]); @@ -124,14 +131,14 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf Vector<int> indices; if (arrays[Mesh::ARRAY_INDEX].get_type() != Variant::NIL) { - indices = arrays[Mesh::ARRAY_INDEX]; } else { //make code simpler indices.resize(vcount); int *iw = indices.ptrw(); - for (int i = 0; i < vcount; i++) + for (int i = 0; i < vcount; i++) { iw[i] = i; + } } int icount = indices.size(); @@ -140,14 +147,12 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf Map<Point2i, int> edge_indices; for (int i = 0; i < icount; i += 3) { - Vertex *v[3] = { &vertices.write[r[i + 0]], &vertices.write[r[i + 1]], &vertices.write[r[i + 2]] }; int fidx = faces.size(); Face face; for (int j = 0; j < 3; j++) { - face.v[j] = r[i + j]; Point2i edge(r[i + j], r[i + (j + 1) % 3]); @@ -180,7 +185,6 @@ Error MeshDataTool::create_from_surface(const Ref<ArrayMesh> &p_mesh, int p_surf } Error MeshDataTool::commit_to_surface(const Ref<ArrayMesh> &p_mesh) { - ERR_FAIL_COND_V(p_mesh.is_null(), ERR_INVALID_PARAMETER); Array arr; arr.resize(Mesh::ARRAY_MAX); @@ -198,7 +202,6 @@ Error MeshDataTool::commit_to_surface(const Ref<ArrayMesh> &p_mesh) { Vector<int> in; { - v.resize(vcount); Vector3 *vr = v.ptrw(); @@ -245,27 +248,29 @@ Error MeshDataTool::commit_to_surface(const Ref<ArrayMesh> &p_mesh) { } for (int i = 0; i < vcount; i++) { - const Vertex &vtx = vertices[i]; vr[i] = vtx.vertex; - if (nr) + if (nr) { nr[i] = vtx.normal; + } if (ta) { ta[i * 4 + 0] = vtx.tangent.normal.x; ta[i * 4 + 1] = vtx.tangent.normal.y; ta[i * 4 + 2] = vtx.tangent.normal.z; ta[i * 4 + 3] = vtx.tangent.d; } - if (uv) + if (uv) { uv[i] = vtx.uv; - if (uv2) + } + if (uv2) { uv2[i] = vtx.uv2; - if (col) + } + if (col) { col[i] = vtx.color; + } if (we) { - we[i * 4 + 0] = vtx.weights[0]; we[i * 4 + 1] = vtx.weights[1]; we[i * 4 + 2] = vtx.weights[2]; @@ -273,7 +278,6 @@ Error MeshDataTool::commit_to_surface(const Ref<ArrayMesh> &p_mesh) { } if (bo) { - bo[i * 4 + 0] = vtx.bones[0]; bo[i * 4 + 1] = vtx.bones[1]; bo[i * 4 + 2] = vtx.bones[2]; @@ -285,7 +289,6 @@ Error MeshDataTool::commit_to_surface(const Ref<ArrayMesh> &p_mesh) { in.resize(fc * 3); int *iw = in.ptrw(); for (int i = 0; i < fc; i++) { - iw[i * 3 + 0] = faces[i].v[0]; iw[i * 3 + 1] = faces[i].v[1]; iw[i * 3 + 2] = faces[i].v[2]; @@ -294,20 +297,27 @@ Error MeshDataTool::commit_to_surface(const Ref<ArrayMesh> &p_mesh) { arr[Mesh::ARRAY_VERTEX] = v; arr[Mesh::ARRAY_INDEX] = in; - if (n.size()) + if (n.size()) { arr[Mesh::ARRAY_NORMAL] = n; - if (c.size()) + } + if (c.size()) { arr[Mesh::ARRAY_COLOR] = c; - if (u.size()) + } + if (u.size()) { arr[Mesh::ARRAY_TEX_UV] = u; - if (u2.size()) + } + if (u2.size()) { arr[Mesh::ARRAY_TEX_UV2] = u2; - if (t.size()) + } + if (t.size()) { arr[Mesh::ARRAY_TANGENT] = t; - if (b.size()) + } + if (b.size()) { arr[Mesh::ARRAY_BONES] = b; - if (w.size()) + } + if (w.size()) { arr[Mesh::ARRAY_WEIGHTS] = w; + } Ref<ArrayMesh> ncmesh = p_mesh; int sc = ncmesh->get_surface_count(); @@ -318,111 +328,102 @@ Error MeshDataTool::commit_to_surface(const Ref<ArrayMesh> &p_mesh) { } int MeshDataTool::get_format() const { - return format; } int MeshDataTool::get_vertex_count() const { - return vertices.size(); } -int MeshDataTool::get_edge_count() const { +int MeshDataTool::get_edge_count() const { return edges.size(); } -int MeshDataTool::get_face_count() const { +int MeshDataTool::get_face_count() const { return faces.size(); } Vector3 MeshDataTool::get_vertex(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Vector3()); return vertices[p_idx].vertex; } -void MeshDataTool::set_vertex(int p_idx, const Vector3 &p_vertex) { +void MeshDataTool::set_vertex(int p_idx, const Vector3 &p_vertex) { ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].vertex = p_vertex; } Vector3 MeshDataTool::get_vertex_normal(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Vector3()); return vertices[p_idx].normal; } -void MeshDataTool::set_vertex_normal(int p_idx, const Vector3 &p_normal) { +void MeshDataTool::set_vertex_normal(int p_idx, const Vector3 &p_normal) { ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].normal = p_normal; format |= Mesh::ARRAY_FORMAT_NORMAL; } Plane MeshDataTool::get_vertex_tangent(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Plane()); return vertices[p_idx].tangent; } -void MeshDataTool::set_vertex_tangent(int p_idx, const Plane &p_tangent) { +void MeshDataTool::set_vertex_tangent(int p_idx, const Plane &p_tangent) { ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].tangent = p_tangent; format |= Mesh::ARRAY_FORMAT_TANGENT; } Vector2 MeshDataTool::get_vertex_uv(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Vector2()); return vertices[p_idx].uv; } -void MeshDataTool::set_vertex_uv(int p_idx, const Vector2 &p_uv) { +void MeshDataTool::set_vertex_uv(int p_idx, const Vector2 &p_uv) { ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].uv = p_uv; format |= Mesh::ARRAY_FORMAT_TEX_UV; } Vector2 MeshDataTool::get_vertex_uv2(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Vector2()); return vertices[p_idx].uv2; } -void MeshDataTool::set_vertex_uv2(int p_idx, const Vector2 &p_uv2) { +void MeshDataTool::set_vertex_uv2(int p_idx, const Vector2 &p_uv2) { ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].uv2 = p_uv2; format |= Mesh::ARRAY_FORMAT_TEX_UV2; } Color MeshDataTool::get_vertex_color(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Color()); return vertices[p_idx].color; } -void MeshDataTool::set_vertex_color(int p_idx, const Color &p_color) { +void MeshDataTool::set_vertex_color(int p_idx, const Color &p_color) { ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].color = p_color; format |= Mesh::ARRAY_FORMAT_COLOR; } Vector<int> MeshDataTool::get_vertex_bones(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Vector<int>()); return vertices[p_idx].bones; } -void MeshDataTool::set_vertex_bones(int p_idx, const Vector<int> &p_bones) { +void MeshDataTool::set_vertex_bones(int p_idx, const Vector<int> &p_bones) { ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].bones = p_bones; format |= Mesh::ARRAY_FORMAT_BONES; } Vector<float> MeshDataTool::get_vertex_weights(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Vector<float>()); return vertices[p_idx].weights; } + void MeshDataTool::set_vertex_weights(int p_idx, const Vector<float> &p_weights) { ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].weights = p_weights; @@ -430,75 +431,69 @@ void MeshDataTool::set_vertex_weights(int p_idx, const Vector<float> &p_weights) } Variant MeshDataTool::get_vertex_meta(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Variant()); return vertices[p_idx].meta; } void MeshDataTool::set_vertex_meta(int p_idx, const Variant &p_meta) { - ERR_FAIL_INDEX(p_idx, vertices.size()); vertices.write[p_idx].meta = p_meta; } Vector<int> MeshDataTool::get_vertex_edges(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, vertices.size(), Vector<int>()); return vertices[p_idx].edges; } -Vector<int> MeshDataTool::get_vertex_faces(int p_idx) const { +Vector<int> MeshDataTool::get_vertex_faces(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, vertices.size(), Vector<int>()); return vertices[p_idx].faces; } int MeshDataTool::get_edge_vertex(int p_edge, int p_vertex) const { - ERR_FAIL_INDEX_V(p_edge, edges.size(), -1); ERR_FAIL_INDEX_V(p_vertex, 2, -1); return edges[p_edge].vertex[p_vertex]; } -Vector<int> MeshDataTool::get_edge_faces(int p_edge) const { +Vector<int> MeshDataTool::get_edge_faces(int p_edge) const { ERR_FAIL_INDEX_V(p_edge, edges.size(), Vector<int>()); return edges[p_edge].faces; } -Variant MeshDataTool::get_edge_meta(int p_idx) const { +Variant MeshDataTool::get_edge_meta(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, edges.size(), Variant()); return edges[p_idx].meta; } -void MeshDataTool::set_edge_meta(int p_idx, const Variant &p_meta) { +void MeshDataTool::set_edge_meta(int p_idx, const Variant &p_meta) { ERR_FAIL_INDEX(p_idx, edges.size()); edges.write[p_idx].meta = p_meta; } int MeshDataTool::get_face_vertex(int p_face, int p_vertex) const { - ERR_FAIL_INDEX_V(p_face, faces.size(), -1); ERR_FAIL_INDEX_V(p_vertex, 3, -1); return faces[p_face].v[p_vertex]; } -int MeshDataTool::get_face_edge(int p_face, int p_vertex) const { +int MeshDataTool::get_face_edge(int p_face, int p_vertex) const { ERR_FAIL_INDEX_V(p_face, faces.size(), -1); ERR_FAIL_INDEX_V(p_vertex, 3, -1); return faces[p_face].edges[p_vertex]; } -Variant MeshDataTool::get_face_meta(int p_face) const { +Variant MeshDataTool::get_face_meta(int p_face) const { ERR_FAIL_INDEX_V(p_face, faces.size(), Variant()); return faces[p_face].meta; } -void MeshDataTool::set_face_meta(int p_face, const Variant &p_meta) { +void MeshDataTool::set_face_meta(int p_face, const Variant &p_meta) { ERR_FAIL_INDEX(p_face, faces.size()); faces.write[p_face].meta = p_meta; } Vector3 MeshDataTool::get_face_normal(int p_face) const { - ERR_FAIL_INDEX_V(p_face, faces.size(), Vector3()); Vector3 v0 = vertices[faces[p_face].v[0]].vertex; Vector3 v1 = vertices[faces[p_face].v[1]].vertex; @@ -508,17 +503,14 @@ Vector3 MeshDataTool::get_face_normal(int p_face) const { } Ref<Material> MeshDataTool::get_material() const { - return material; } void MeshDataTool::set_material(const Ref<Material> &p_material) { - material = p_material; } void MeshDataTool::_bind_methods() { - ClassDB::bind_method(D_METHOD("clear"), &MeshDataTool::clear); ClassDB::bind_method(D_METHOD("create_from_surface", "mesh", "surface"), &MeshDataTool::create_from_surface); ClassDB::bind_method(D_METHOD("commit_to_surface", "mesh"), &MeshDataTool::commit_to_surface); @@ -578,6 +570,5 @@ void MeshDataTool::_bind_methods() { } MeshDataTool::MeshDataTool() { - clear(); } diff --git a/scene/resources/mesh_data_tool.h b/scene/resources/mesh_data_tool.h index 5ac2c7e702..bf9f0dd25f 100644 --- a/scene/resources/mesh_data_tool.h +++ b/scene/resources/mesh_data_tool.h @@ -34,7 +34,6 @@ #include "scene/resources/mesh.h" class MeshDataTool : public Reference { - GDCLASS(MeshDataTool, Reference); int format; @@ -55,7 +54,6 @@ class MeshDataTool : public Reference { Vector<Vertex> vertices; struct Edge { - int vertex[2]; Vector<int> faces; Variant meta; @@ -64,7 +62,6 @@ class MeshDataTool : public Reference { Vector<Edge> edges; struct Face { - int v[3]; int edges[3]; Variant meta; diff --git a/scene/resources/mesh_library.cpp b/scene/resources/mesh_library.cpp index fffd192348..09b0d4b038 100644 --- a/scene/resources/mesh_library.cpp +++ b/scene/resources/mesh_library.cpp @@ -31,20 +31,19 @@ #include "mesh_library.h" bool MeshLibrary::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; if (name.begins_with("item/")) { - int idx = name.get_slicec('/', 1).to_int(); String what = name.get_slicec('/', 2); - if (!item_map.has(idx)) + if (!item_map.has(idx)) { create_item(idx); + } - if (what == "name") + if (what == "name") { set_item_name(idx, p_value); - else if (what == "mesh") + } else if (what == "mesh") { set_item_mesh(idx, p_value); - else if (what == "shape") { + } else if (what == "shape") { Vector<ShapeData> shapes; ShapeData sd; sd.shape = p_value; @@ -52,14 +51,15 @@ bool MeshLibrary::_set(const StringName &p_name, const Variant &p_value) { set_item_shapes(idx, shapes); } else if (what == "shapes") { _set_item_shapes(idx, p_value); - } else if (what == "preview") + } else if (what == "preview") { set_item_preview(idx, p_value); - else if (what == "navmesh") + } else if (what == "navmesh") { set_item_navmesh(idx, p_value); - else if (what == "navmesh_transform") + } else if (what == "navmesh_transform") { set_item_navmesh_transform(idx, p_value); - else + } else { return false; + } return true; } @@ -68,34 +68,32 @@ bool MeshLibrary::_set(const StringName &p_name, const Variant &p_value) { } bool MeshLibrary::_get(const StringName &p_name, Variant &r_ret) const { - String name = p_name; int idx = name.get_slicec('/', 1).to_int(); ERR_FAIL_COND_V(!item_map.has(idx), false); String what = name.get_slicec('/', 2); - if (what == "name") + if (what == "name") { r_ret = get_item_name(idx); - else if (what == "mesh") + } else if (what == "mesh") { r_ret = get_item_mesh(idx); - else if (what == "shapes") + } else if (what == "shapes") { r_ret = _get_item_shapes(idx); - else if (what == "navmesh") + } else if (what == "navmesh") { r_ret = get_item_navmesh(idx); - else if (what == "navmesh_transform") + } else if (what == "navmesh_transform") { r_ret = get_item_navmesh_transform(idx); - else if (what == "preview") + } else if (what == "preview") { r_ret = get_item_preview(idx); - else + } else { return false; + } return true; } void MeshLibrary::_get_property_list(List<PropertyInfo> *p_list) const { - for (Map<int, Item>::Element *E = item_map.front(); E; E = E->next()) { - String name = "item/" + itos(E->key()) + "/"; p_list->push_back(PropertyInfo(Variant::STRING, name + "name")); p_list->push_back(PropertyInfo(Variant::OBJECT, name + "mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh")); @@ -108,7 +106,6 @@ void MeshLibrary::_get_property_list(List<PropertyInfo> *p_list) const { } void MeshLibrary::create_item(int p_item) { - ERR_FAIL_COND(p_item < 0); ERR_FAIL_COND(item_map.has(p_item)); item_map[p_item] = Item(); @@ -116,7 +113,6 @@ void MeshLibrary::create_item(int p_item) { } void MeshLibrary::set_item_name(int p_item, const String &p_name) { - ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); item_map[p_item].name = p_name; emit_changed(); @@ -124,7 +120,6 @@ void MeshLibrary::set_item_name(int p_item, const String &p_name) { } void MeshLibrary::set_item_mesh(int p_item, const Ref<Mesh> &p_mesh) { - ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); item_map[p_item].mesh = p_mesh; notify_change_to_owners(); @@ -133,7 +128,6 @@ void MeshLibrary::set_item_mesh(int p_item, const Ref<Mesh> &p_mesh) { } void MeshLibrary::set_item_shapes(int p_item, const Vector<ShapeData> &p_shapes) { - ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); item_map[p_item].shapes = p_shapes; _change_notify(); @@ -143,7 +137,6 @@ void MeshLibrary::set_item_shapes(int p_item, const Vector<ShapeData> &p_shapes) } void MeshLibrary::set_item_navmesh(int p_item, const Ref<NavigationMesh> &p_navmesh) { - ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); item_map[p_item].navmesh = p_navmesh; _change_notify(); @@ -153,7 +146,6 @@ void MeshLibrary::set_item_navmesh(int p_item, const Ref<NavigationMesh> &p_navm } void MeshLibrary::set_item_navmesh_transform(int p_item, const Transform &p_transform) { - ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); item_map[p_item].navmesh_transform = p_transform; notify_change_to_owners(); @@ -162,7 +154,6 @@ void MeshLibrary::set_item_navmesh_transform(int p_item, const Transform &p_tran } void MeshLibrary::set_item_preview(int p_item, const Ref<Texture2D> &p_preview) { - ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); item_map[p_item].preview = p_preview; emit_changed(); @@ -170,47 +161,40 @@ void MeshLibrary::set_item_preview(int p_item, const Ref<Texture2D> &p_preview) } String MeshLibrary::get_item_name(int p_item) const { - ERR_FAIL_COND_V_MSG(!item_map.has(p_item), "", "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); return item_map[p_item].name; } Ref<Mesh> MeshLibrary::get_item_mesh(int p_item) const { - ERR_FAIL_COND_V_MSG(!item_map.has(p_item), Ref<Mesh>(), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); return item_map[p_item].mesh; } Vector<MeshLibrary::ShapeData> MeshLibrary::get_item_shapes(int p_item) const { - ERR_FAIL_COND_V_MSG(!item_map.has(p_item), Vector<ShapeData>(), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); return item_map[p_item].shapes; } Ref<NavigationMesh> MeshLibrary::get_item_navmesh(int p_item) const { - ERR_FAIL_COND_V_MSG(!item_map.has(p_item), Ref<NavigationMesh>(), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); return item_map[p_item].navmesh; } Transform MeshLibrary::get_item_navmesh_transform(int p_item) const { - ERR_FAIL_COND_V_MSG(!item_map.has(p_item), Transform(), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); return item_map[p_item].navmesh_transform; } Ref<Texture2D> MeshLibrary::get_item_preview(int p_item) const { - ERR_FAIL_COND_V_MSG(!item_map.has(p_item), Ref<Texture2D>(), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); return item_map[p_item].preview; } bool MeshLibrary::has_item(int p_item) const { - return item_map.has(p_item); } -void MeshLibrary::remove_item(int p_item) { +void MeshLibrary::remove_item(int p_item) { ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); item_map.erase(p_item); notify_change_to_owners(); @@ -219,7 +203,6 @@ void MeshLibrary::remove_item(int p_item) { } void MeshLibrary::clear() { - item_map.clear(); notify_change_to_owners(); _change_notify(); @@ -227,12 +210,10 @@ void MeshLibrary::clear() { } Vector<int> MeshLibrary::get_item_list() const { - Vector<int> ret; ret.resize(item_map.size()); int idx = 0; for (Map<int, Item>::Element *E = item_map.front(); E; E = E->next()) { - ret.write[idx++] = E->key(); } @@ -240,25 +221,23 @@ Vector<int> MeshLibrary::get_item_list() const { } int MeshLibrary::find_item_by_name(const String &p_name) const { - for (Map<int, Item>::Element *E = item_map.front(); E; E = E->next()) { - - if (E->get().name == p_name) + if (E->get().name == p_name) { return E->key(); + } } return -1; } int MeshLibrary::get_last_unused_item_id() const { - - if (!item_map.size()) + if (!item_map.size()) { return 0; - else + } else { return item_map.back()->key() + 1; + } } void MeshLibrary::_set_item_shapes(int p_item, const Array &p_shapes) { - ERR_FAIL_COND(p_shapes.size() & 1); Vector<ShapeData> shapes; for (int i = 0; i < p_shapes.size(); i += 2) { @@ -275,7 +254,6 @@ void MeshLibrary::_set_item_shapes(int p_item, const Array &p_shapes) { } Array MeshLibrary::_get_item_shapes(int p_item) const { - Vector<ShapeData> shapes = get_item_shapes(p_item); Array ret; for (int i = 0; i < shapes.size(); i++) { @@ -287,7 +265,6 @@ Array MeshLibrary::_get_item_shapes(int p_item) const { } void MeshLibrary::_bind_methods() { - ClassDB::bind_method(D_METHOD("create_item", "id"), &MeshLibrary::create_item); ClassDB::bind_method(D_METHOD("set_item_name", "id", "name"), &MeshLibrary::set_item_name); ClassDB::bind_method(D_METHOD("set_item_mesh", "id", "mesh"), &MeshLibrary::set_item_mesh); @@ -311,5 +288,6 @@ void MeshLibrary::_bind_methods() { MeshLibrary::MeshLibrary() { } + MeshLibrary::~MeshLibrary() { } diff --git a/scene/resources/mesh_library.h b/scene/resources/mesh_library.h index 55001f2545..7b78398669 100644 --- a/scene/resources/mesh_library.h +++ b/scene/resources/mesh_library.h @@ -38,7 +38,6 @@ #include "shape_3d.h" class MeshLibrary : public Resource { - GDCLASS(MeshLibrary, Resource); RES_BASE_EXTENSION("meshlib"); diff --git a/scene/resources/multimesh.cpp b/scene/resources/multimesh.cpp index ce561bfaaf..f71cf383e5 100644 --- a/scene/resources/multimesh.cpp +++ b/scene/resources/multimesh.cpp @@ -36,19 +36,20 @@ // Kept for compatibility from 3.x to 4.0. void MultiMesh::_set_transform_array(const Vector<Vector3> &p_array) { - if (transform_format != TRANSFORM_3D) + if (transform_format != TRANSFORM_3D) { return; + } const Vector<Vector3> &xforms = p_array; int len = xforms.size(); ERR_FAIL_COND((len / 4) != instance_count); - if (len == 0) + if (len == 0) { return; + } const Vector3 *r = xforms.ptr(); for (int i = 0; i < len / 4; i++) { - Transform t; t.basis[0] = r[i * 4 + 0]; t.basis[1] = r[i * 4 + 1]; @@ -60,12 +61,13 @@ void MultiMesh::_set_transform_array(const Vector<Vector3> &p_array) { } Vector<Vector3> MultiMesh::_get_transform_array() const { - - if (transform_format != TRANSFORM_3D) + if (transform_format != TRANSFORM_3D) { return Vector<Vector3>(); + } - if (instance_count == 0) + if (instance_count == 0) { return Vector<Vector3>(); + } Vector<Vector3> xforms; xforms.resize(instance_count * 4); @@ -73,7 +75,6 @@ Vector<Vector3> MultiMesh::_get_transform_array() const { Vector3 *w = xforms.ptrw(); for (int i = 0; i < instance_count; i++) { - Transform t = get_instance_transform(i); w[i * 4 + 0] = t.basis[0]; w[i * 4 + 1] = t.basis[1]; @@ -85,20 +86,20 @@ Vector<Vector3> MultiMesh::_get_transform_array() const { } void MultiMesh::_set_transform_2d_array(const Vector<Vector2> &p_array) { - - if (transform_format != TRANSFORM_2D) + if (transform_format != TRANSFORM_2D) { return; + } const Vector<Vector2> &xforms = p_array; int len = xforms.size(); ERR_FAIL_COND((len / 3) != instance_count); - if (len == 0) + if (len == 0) { return; + } const Vector2 *r = xforms.ptr(); for (int i = 0; i < len / 3; i++) { - Transform2D t; t.elements[0] = r[i * 3 + 0]; t.elements[1] = r[i * 3 + 1]; @@ -109,12 +110,13 @@ void MultiMesh::_set_transform_2d_array(const Vector<Vector2> &p_array) { } Vector<Vector2> MultiMesh::_get_transform_2d_array() const { - - if (transform_format != TRANSFORM_2D) + if (transform_format != TRANSFORM_2D) { return Vector<Vector2>(); + } - if (instance_count == 0) + if (instance_count == 0) { return Vector<Vector2>(); + } Vector<Vector2> xforms; xforms.resize(instance_count * 3); @@ -122,7 +124,6 @@ Vector<Vector2> MultiMesh::_get_transform_2d_array() const { Vector2 *w = xforms.ptrw(); for (int i = 0; i < instance_count; i++) { - Transform2D t = get_instance_transform_2d(i); w[i * 3 + 0] = t.elements[0]; w[i * 3 + 1] = t.elements[1]; @@ -133,31 +134,29 @@ Vector<Vector2> MultiMesh::_get_transform_2d_array() const { } void MultiMesh::_set_color_array(const Vector<Color> &p_array) { - const Vector<Color> &colors = p_array; int len = colors.size(); - if (len == 0) + if (len == 0) { return; + } ERR_FAIL_COND(len != instance_count); const Color *r = colors.ptr(); for (int i = 0; i < len; i++) { - set_instance_color(i, r[i]); } } Vector<Color> MultiMesh::_get_color_array() const { - - if (instance_count == 0 || !use_colors) + if (instance_count == 0 || !use_colors) { return Vector<Color>(); + } Vector<Color> colors; colors.resize(instance_count); for (int i = 0; i < instance_count; i++) { - colors.set(i, get_instance_color(i)); } @@ -165,31 +164,29 @@ Vector<Color> MultiMesh::_get_color_array() const { } void MultiMesh::_set_custom_data_array(const Vector<Color> &p_array) { - const Vector<Color> &custom_datas = p_array; int len = custom_datas.size(); - if (len == 0) + if (len == 0) { return; + } ERR_FAIL_COND(len != instance_count); const Color *r = custom_datas.ptr(); for (int i = 0; i < len; i++) { - set_instance_custom_data(i, r[i]); } } Vector<Color> MultiMesh::_get_custom_data_array() const { - - if (instance_count == 0 || !use_custom_data) + if (instance_count == 0 || !use_custom_data) { return Vector<Color>(); + } Vector<Color> custom_datas; custom_datas.resize(instance_count); for (int i = 0; i < instance_count; i++) { - custom_datas.set(i, get_instance_custom_data(i)); } @@ -206,16 +203,15 @@ Vector<float> MultiMesh::get_buffer() const { } void MultiMesh::set_mesh(const Ref<Mesh> &p_mesh) { - mesh = p_mesh; - if (!mesh.is_null()) + if (!mesh.is_null()) { RenderingServer::get_singleton()->multimesh_set_mesh(multimesh, mesh->get_rid()); - else + } else { RenderingServer::get_singleton()->multimesh_set_mesh(multimesh, RID()); + } } Ref<Mesh> MultiMesh::get_mesh() const { - return mesh; } @@ -224,8 +220,8 @@ void MultiMesh::set_instance_count(int p_count) { RenderingServer::get_singleton()->multimesh_allocate(multimesh, p_count, RS::MultimeshTransformFormat(transform_format), use_colors, use_custom_data); instance_count = p_count; } -int MultiMesh::get_instance_count() const { +int MultiMesh::get_instance_count() const { return instance_count; } @@ -235,56 +231,48 @@ void MultiMesh::set_visible_instance_count(int p_count) { RenderingServer::get_singleton()->multimesh_set_visible_instances(multimesh, p_count); visible_instance_count = p_count; } -int MultiMesh::get_visible_instance_count() const { +int MultiMesh::get_visible_instance_count() const { return visible_instance_count; } void MultiMesh::set_instance_transform(int p_instance, const Transform &p_transform) { - RenderingServer::get_singleton()->multimesh_instance_set_transform(multimesh, p_instance, p_transform); } void MultiMesh::set_instance_transform_2d(int p_instance, const Transform2D &p_transform) { - RenderingServer::get_singleton()->multimesh_instance_set_transform_2d(multimesh, p_instance, p_transform); } Transform MultiMesh::get_instance_transform(int p_instance) const { - return RenderingServer::get_singleton()->multimesh_instance_get_transform(multimesh, p_instance); } Transform2D MultiMesh::get_instance_transform_2d(int p_instance) const { - return RenderingServer::get_singleton()->multimesh_instance_get_transform_2d(multimesh, p_instance); } void MultiMesh::set_instance_color(int p_instance, const Color &p_color) { - RenderingServer::get_singleton()->multimesh_instance_set_color(multimesh, p_instance, p_color); } -Color MultiMesh::get_instance_color(int p_instance) const { +Color MultiMesh::get_instance_color(int p_instance) const { return RenderingServer::get_singleton()->multimesh_instance_get_color(multimesh, p_instance); } void MultiMesh::set_instance_custom_data(int p_instance, const Color &p_custom_data) { - RenderingServer::get_singleton()->multimesh_instance_set_custom_data(multimesh, p_instance, p_custom_data); } -Color MultiMesh::get_instance_custom_data(int p_instance) const { +Color MultiMesh::get_instance_custom_data(int p_instance) const { return RenderingServer::get_singleton()->multimesh_instance_get_custom_data(multimesh, p_instance); } AABB MultiMesh::get_aabb() const { - return RenderingServer::get_singleton()->multimesh_get_aabb(multimesh); } RID MultiMesh::get_rid() const { - return multimesh; } @@ -307,17 +295,15 @@ bool MultiMesh::is_using_custom_data() const { } void MultiMesh::set_transform_format(TransformFormat p_transform_format) { - ERR_FAIL_COND(instance_count > 0); transform_format = p_transform_format; } -MultiMesh::TransformFormat MultiMesh::get_transform_format() const { +MultiMesh::TransformFormat MultiMesh::get_transform_format() const { return transform_format; } void MultiMesh::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &MultiMesh::set_mesh); ClassDB::bind_method(D_METHOD("get_mesh"), &MultiMesh::get_mesh); ClassDB::bind_method(D_METHOD("set_use_colors", "enable"), &MultiMesh::set_use_colors); @@ -374,7 +360,6 @@ void MultiMesh::_bind_methods() { } MultiMesh::MultiMesh() { - multimesh = RenderingServer::get_singleton()->multimesh_create(); use_colors = false; use_custom_data = false; @@ -384,6 +369,5 @@ MultiMesh::MultiMesh() { } MultiMesh::~MultiMesh() { - RenderingServer::get_singleton()->free(multimesh); } diff --git a/scene/resources/multimesh.h b/scene/resources/multimesh.h index c1e52bc981..8478789d41 100644 --- a/scene/resources/multimesh.h +++ b/scene/resources/multimesh.h @@ -35,7 +35,6 @@ #include "servers/rendering_server.h" class MultiMesh : public Resource { - GDCLASS(MultiMesh, Resource); RES_BASE_EXTENSION("multimesh"); diff --git a/scene/resources/navigation_mesh.cpp b/scene/resources/navigation_mesh.cpp index e0aff2182e..e815da5d45 100644 --- a/scene/resources/navigation_mesh.cpp +++ b/scene/resources/navigation_mesh.cpp @@ -31,19 +31,19 @@ #include "navigation_mesh.h" void NavigationMesh::create_from_mesh(const Ref<Mesh> &p_mesh) { - vertices = Vector<Vector3>(); clear_polygons(); for (int i = 0; i < p_mesh->get_surface_count(); i++) { - - if (p_mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) + if (p_mesh->surface_get_primitive_type(i) != Mesh::PRIMITIVE_TRIANGLES) { continue; + } Array arr = p_mesh->surface_get_arrays(i); Vector<Vector3> varr = arr[Mesh::ARRAY_VERTEX]; Vector<int> iarr = arr[Mesh::ARRAY_INDEX]; - if (varr.size() == 0 || iarr.size() == 0) + if (varr.size() == 0 || iarr.size() == 0) { continue; + } int from = vertices.size(); vertices.append_array(varr); @@ -82,27 +82,24 @@ int NavigationMesh::get_parsed_geometry_type() const { } void NavigationMesh::set_collision_mask(uint32_t p_mask) { - collision_mask = p_mask; } uint32_t NavigationMesh::get_collision_mask() const { - return collision_mask; } void NavigationMesh::set_collision_mask_bit(int p_bit, bool p_value) { - uint32_t mask = get_collision_mask(); - if (p_value) + if (p_value) { mask |= 1 << p_bit; - else + } else { mask &= ~(1 << p_bit); + } set_collision_mask(mask); } bool NavigationMesh::get_collision_mask_bit(int p_bit) const { - return get_collision_mask() & (1 << p_bit); } @@ -253,18 +250,15 @@ bool NavigationMesh::get_filter_walkable_low_height_spans() const { } void NavigationMesh::set_vertices(const Vector<Vector3> &p_vertices) { - vertices = p_vertices; _change_notify(); } Vector<Vector3> NavigationMesh::get_vertices() const { - return vertices; } void NavigationMesh::_set_polygons(const Array &p_array) { - polygons.resize(p_array.size()); for (int i = 0; i < p_array.size(); i++) { polygons.write[i].indices = p_array[i]; @@ -273,7 +267,6 @@ void NavigationMesh::_set_polygons(const Array &p_array) { } Array NavigationMesh::_get_polygons() const { - Array ret; ret.resize(polygons.size()); for (int i = 0; i < ret.size(); i++) { @@ -284,30 +277,29 @@ Array NavigationMesh::_get_polygons() const { } void NavigationMesh::add_polygon(const Vector<int> &p_polygon) { - Polygon polygon; polygon.indices = p_polygon; polygons.push_back(polygon); _change_notify(); } -int NavigationMesh::get_polygon_count() const { +int NavigationMesh::get_polygon_count() const { return polygons.size(); } -Vector<int> NavigationMesh::get_polygon(int p_idx) { +Vector<int> NavigationMesh::get_polygon(int p_idx) { ERR_FAIL_INDEX_V(p_idx, polygons.size(), Vector<int>()); return polygons[p_idx].indices; } -void NavigationMesh::clear_polygons() { +void NavigationMesh::clear_polygons() { polygons.clear(); } Ref<Mesh> NavigationMesh::get_debug_mesh() { - - if (debug_mesh.is_valid()) + if (debug_mesh.is_valid()) { return debug_mesh; + } Vector<Vector3> vertices = get_vertices(); const Vector3 *vr = vertices.ptr(); @@ -334,26 +326,23 @@ Ref<Mesh> NavigationMesh::get_debug_mesh() { int tidx = 0; for (List<Face3>::Element *E = faces.front(); E; E = E->next()) { - const Face3 &f = E->get(); for (int j = 0; j < 3; j++) { - tw[tidx++] = f.vertex[j]; _EdgeKey ek; ek.from = f.vertex[j].snapped(Vector3(CMP_EPSILON, CMP_EPSILON, CMP_EPSILON)); ek.to = f.vertex[(j + 1) % 3].snapped(Vector3(CMP_EPSILON, CMP_EPSILON, CMP_EPSILON)); - if (ek.from < ek.to) + if (ek.from < ek.to) { SWAP(ek.from, ek.to); + } Map<_EdgeKey, bool>::Element *F = edge_map.find(ek); if (F) { - F->get() = false; } else { - edge_map[ek] = true; } } @@ -362,7 +351,6 @@ Ref<Mesh> NavigationMesh::get_debug_mesh() { List<Vector3> lines; for (Map<_EdgeKey, bool>::Element *E = edge_map.front(); E; E = E->next()) { - if (E->get()) { lines.push_back(E->key().from); lines.push_back(E->key().to); diff --git a/scene/resources/navigation_mesh.h b/scene/resources/navigation_mesh.h index cc3ac6e3fd..6b9d1964f5 100644 --- a/scene/resources/navigation_mesh.h +++ b/scene/resources/navigation_mesh.h @@ -36,7 +36,6 @@ class Mesh; class NavigationMesh : public Resource { - GDCLASS(NavigationMesh, Resource); Vector<Vector3> vertices; @@ -47,7 +46,6 @@ class NavigationMesh : public Resource { Ref<ArrayMesh> debug_mesh; struct _EdgeKey { - Vector3 from; Vector3 to; diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp index 633771506e..058e89cf2e 100644 --- a/scene/resources/packed_scene.cpp +++ b/scene/resources/packed_scene.cpp @@ -42,12 +42,10 @@ #define PACKED_SCENE_VERSION 2 bool SceneState::can_instance() const { - return nodes.size() > 0; } Node *SceneState::instance(GenEditState p_edit_state) const { - // nodes where instancing failed (because something is missing) List<Node *> stray_instances; @@ -66,13 +64,15 @@ Node *SceneState::instance(GenEditState p_edit_state) const { const StringName *snames = nullptr; int sname_count = names.size(); - if (sname_count) + if (sname_count) { snames = &names[0]; + } const Variant *props = nullptr; int prop_count = variants.size(); - if (prop_count) + if (prop_count) { props = &variants[0]; + } //Vector<Variant> properties; @@ -85,18 +85,15 @@ Node *SceneState::instance(GenEditState p_edit_state) const { Map<Ref<Resource>, Ref<Resource>> resources_local_to_scene; for (int i = 0; i < nc; i++) { - const NodeData &n = nd[i]; Node *parent = nullptr; if (i > 0) { - ERR_FAIL_COND_V_MSG(n.parent == -1, nullptr, vformat("Invalid scene: node %s does not specify its parent node.", snames[n.name])); NODE_FROM_ID(nparent, n.parent); #ifdef DEBUG_ENABLED if (!nparent && (n.parent & FLAG_ID_IS_PATH)) { - WARN_PRINT(String("Parent path '" + String(node_paths[n.parent & FLAG_MASK]) + "' for node '" + String(snames[n.name]) + "' has vanished when instancing: '" + get_path() + "'.").ascii().get_data()); } #endif @@ -118,10 +115,8 @@ Node *SceneState::instance(GenEditState p_edit_state) const { } else if (n.instance >= 0) { //instance a scene into this node if (n.instance & FLAG_INSTANCE_IS_PLACEHOLDER) { - String path = props[n.instance & FLAG_MASK]; if (disable_placeholders) { - Ref<PackedScene> sdata = ResourceLoader::load(path, "PackedScene"); ERR_FAIL_COND_V(!sdata.is_valid(), nullptr); node = sdata->instance(p_edit_state == GEN_EDIT_STATE_DISABLED ? PackedScene::GEN_EDIT_STATE_DISABLED : PackedScene::GEN_EDIT_STATE_INSTANCE); @@ -187,11 +182,9 @@ Node *SceneState::instance(GenEditState p_edit_state) const { //properties int nprop_count = n.properties.size(); if (nprop_count) { - const NodeData::Property *nprops = &n.properties[0]; for (int j = 0; j < nprop_count; j++) { - bool valid; ERR_FAIL_INDEX_V(nprops[j].name, sname_count, nullptr); ERR_FAIL_INDEX_V(nprops[j].value, prop_count, nullptr); @@ -213,7 +206,6 @@ Node *SceneState::instance(GenEditState p_edit_state) const { node->set(E->get().first, E->get().second); } } else { - Variant value = props[nprops[j].value]; if (value.get_type() == Variant::OBJECT) { @@ -221,13 +213,11 @@ Node *SceneState::instance(GenEditState p_edit_state) const { Ref<Resource> res = value; if (res.is_valid()) { if (res->is_local_to_scene()) { - Map<Ref<Resource>, Ref<Resource>>::Element *E = resources_local_to_scene.find(res); if (E) { value = E->get(); } else { - Node *base = i == 0 ? node : ret_nodes[0]; if (p_edit_state == GEN_EDIT_STATE_MAIN) { @@ -259,7 +249,6 @@ Node *SceneState::instance(GenEditState p_edit_state) const { //groups for (int j = 0; j < n.groups.size(); j++) { - ERR_FAIL_INDEX_V(n.groups[j], sname_count, nullptr); node->add_to_group(snames[n.groups[j]], true); } @@ -269,8 +258,9 @@ Node *SceneState::instance(GenEditState p_edit_state) const { if (i > 0) { if (parent) { parent->_add_child_nocheck(node, snames[n.name]); - if (n.index >= 0 && n.index < parent->get_child_count() - 1) + if (n.index >= 0 && n.index < parent->get_child_count() - 1) { parent->move_child(node, n.index); + } } else { //it may be possible that an instanced scene has changed //and the node has nowhere to go anymore @@ -287,10 +277,10 @@ Node *SceneState::instance(GenEditState p_edit_state) const { } if (n.owner >= 0) { - NODE_FROM_ID(owner, n.owner); - if (owner) + if (owner) { node->_set_owner_nocheck(owner); + } } } @@ -303,7 +293,6 @@ Node *SceneState::instance(GenEditState p_edit_state) const { } for (Map<Ref<Resource>, Ref<Resource>>::Element *E = resources_local_to_scene.front(); E; E = E->next()) { - E->get()->setup_local_to_scene(); } @@ -313,7 +302,6 @@ Node *SceneState::instance(GenEditState p_edit_state) const { const ConnectionData *cdata = connections.ptr(); for (int i = 0; i < cc; i++) { - const ConnectionData &c = cdata[i]; //ERR_FAIL_INDEX_V( c.from, nc, nullptr ); //ERR_FAIL_INDEX_V( c.to, nc, nullptr ); @@ -321,14 +309,16 @@ Node *SceneState::instance(GenEditState p_edit_state) const { NODE_FROM_ID(cfrom, c.from); NODE_FROM_ID(cto, c.to); - if (!cfrom || !cto) + if (!cfrom || !cto) { continue; + } Vector<Variant> binds; if (c.binds.size()) { binds.resize(c.binds.size()); - for (int j = 0; j < c.binds.size(); j++) + for (int j = 0; j < c.binds.size(); j++) { binds.write[j] = props[c.binds[j]]; + } } cfrom->connect(snames[c.signal], Callable(cto, snames[c.method]), binds, CONNECT_PERSIST | c.flags); @@ -353,9 +343,9 @@ Node *SceneState::instance(GenEditState p_edit_state) const { } static int _nm_get_string(const String &p_string, Map<StringName, int> &name_map) { - - if (name_map.has(p_string)) + if (name_map.has(p_string)) { return name_map[p_string]; + } int idx = name_map.size(); name_map[p_string] = idx; @@ -363,9 +353,9 @@ static int _nm_get_string(const String &p_string, Map<StringName, int> &name_map } static int _vm_get_variant(const Variant &p_variant, HashMap<Variant, int, VariantHasher, VariantComparator> &variant_map) { - - if (variant_map.has(p_variant)) + if (variant_map.has(p_variant)) { return variant_map[p_variant]; + } int idx = variant_map.size(); variant_map[p_variant] = idx; @@ -373,20 +363,21 @@ static int _vm_get_variant(const Variant &p_variant, HashMap<Variant, int, Varia } Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map<StringName, int> &name_map, HashMap<Variant, int, VariantHasher, VariantComparator> &variant_map, Map<Node *, int> &node_map, Map<Node *, int> &nodepath_map) { - // this function handles all the work related to properly packing scenes, be it // instanced or inherited. // given the complexity of this process, an attempt will be made to properly // document it. if you fail to understand something, please ask! //discard nodes that do not belong to be processed - if (p_node != p_owner && p_node->get_owner() != p_owner && !p_owner->is_editable_instance(p_node->get_owner())) + if (p_node != p_owner && p_node->get_owner() != p_owner && !p_owner->is_editable_instance(p_node->get_owner())) { return OK; + } // save the child instanced scenes that are chosen as editable, so they can be restored // upon load back - if (p_node != p_owner && p_node->get_filename() != String() && p_owner->is_editable_instance(p_node)) + if (p_node != p_owner && p_node->get_filename() != String() && p_owner->is_editable_instance(p_node)) { editable_instances.push_back(p_owner->get_path_to(p_node)); + } NodeData nd; @@ -418,9 +409,7 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map Node *n = p_node; while (n) { - if (n == p_owner) { - Ref<SceneState> state = n->get_scene_inherited_state(); if (state.is_valid()) { int node = state->find_node_by_path(n->get_path_to(p_node)); @@ -435,7 +424,6 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map } if (p_node->get_filename() != String() && p_node->get_owner() == p_owner && instanced_by_owner) { - if (p_node->get_scene_instance_load_placeholder()) { //it's a placeholder, use the placeholder path nd.instance = _vm_get_variant(p_node->get_filename(), variant_map); @@ -479,7 +467,6 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map StringName type = p_node->get_class(); for (List<PropertyInfo>::Element *E = plist.front(); E; E = E->next()) { - if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) { continue; } @@ -530,17 +517,16 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map } if (exists) { - //check if already exists and did not change if (value.get_type() == Variant::FLOAT && original.get_type() == Variant::FLOAT) { //this must be done because, as some scenes save as text, there might be a tiny difference in floats due to numerical error float a = value; float b = original; - if (Math::is_equal_approx(a, b)) + if (Math::is_equal_approx(a, b)) { continue; + } } else if (bool(Variant::evaluate(Variant::OP_EQUAL, value, original))) { - continue; } } @@ -552,7 +538,6 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map } } else { - if (isdefault) { //it's the default value, no point in saving it continue; @@ -573,8 +558,9 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map for (List<Node::GroupInfo>::Element *E = groups.front(); E; E = E->next()) { Node::GroupInfo &gi = E->get(); - if (!gi.persistent) + if (!gi.persistent) { continue; + } /* if (instance_state_node>=0 && instance_state->is_node_in_group(instance_state_node,gi.name)) continue; //group was instanced, don't add here @@ -590,8 +576,9 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map } } - if (skip) + if (skip) { continue; + } nd.groups.push_back(_nm_get_string(gi.name, name_map)); } @@ -608,7 +595,6 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map //part of saved scene nd.owner = 0; } else { - nd.owner = -1; } @@ -637,14 +623,12 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map int parent_node = NO_PARENT_SAVED; if (save_node) { - //don't save the node if nothing and subscene node_map[p_node] = idx; //ok validate parent node if (p_parent_idx == NO_PARENT_SAVED) { - int sidx; if (nodepath_map.has(p_node->get_parent())) { sidx = nodepath_map[p_node->get_parent()]; @@ -663,20 +647,20 @@ Error SceneState::_parse_node(Node *p_owner, Node *p_node, int p_parent_idx, Map } for (int i = 0; i < p_node->get_child_count(); i++) { - Node *c = p_node->get_child(i); Error err = _parse_node(p_owner, c, parent_node, name_map, variant_map, node_map, nodepath_map); - if (err) + if (err) { return err; + } } return OK; } Error SceneState::_parse_connections(Node *p_owner, Node *p_node, Map<StringName, int> &name_map, HashMap<Variant, int, VariantHasher, VariantComparator> &variant_map, Map<Node *, int> &node_map, Map<Node *, int> &nodepath_map) { - - if (p_node != p_owner && p_node->get_owner() && p_node->get_owner() != p_owner && !p_owner->is_editable_instance(p_node->get_owner())) + if (p_node != p_owner && p_node->get_owner() && p_node->get_owner() != p_owner && !p_owner->is_editable_instance(p_node->get_owner())) { return OK; + } List<MethodInfo> _signals; p_node->get_signal_list(&_signals); @@ -686,18 +670,17 @@ Error SceneState::_parse_connections(Node *p_owner, Node *p_node, Map<StringName //NodeData &nd = nodes[node_map[p_node]]; for (List<MethodInfo>::Element *E = _signals.front(); E; E = E->next()) { - List<Node::Connection> conns; p_node->get_signal_connection_list(E->get().name, &conns); conns.sort(); for (List<Node::Connection>::Element *F = conns.front(); F; F = F->next()) { - const Node::Connection &c = F->get(); - if (!(c.flags & CONNECT_PERSIST)) //only persistent connections get saved + if (!(c.flags & CONNECT_PERSIST)) { //only persistent connections get saved continue; + } // only connections that originate or end into main saved scene are saved // everything else is discarded @@ -721,16 +704,15 @@ Error SceneState::_parse_connections(Node *p_owner, Node *p_node, Map<StringName //go through ownership chain to see if this exists while (common_parent) { - Ref<SceneState> ps; - if (common_parent == p_owner) + if (common_parent == p_owner) { ps = common_parent->get_scene_inherited_state(); - else + } else { ps = common_parent->get_scene_instance_state(); + } if (ps.is_valid()) { - NodePath signal_from = common_parent->get_path_to(p_node); NodePath signal_to = common_parent->get_path_to(target); @@ -740,10 +722,11 @@ Error SceneState::_parse_connections(Node *p_owner, Node *p_node, Map<StringName } } - if (common_parent == p_owner) + if (common_parent == p_owner) { break; - else + } else { common_parent = common_parent->get_owner(); + } } if (exists) { //already exists (comes from instance or inheritance), so don't save @@ -756,9 +739,7 @@ Error SceneState::_parse_connections(Node *p_owner, Node *p_node, Map<StringName bool exists2 = false; while (nl) { - if (nl == p_owner) { - Ref<SceneState> state = nl->get_scene_inherited_state(); if (state.is_valid()) { int from_node = state->find_node_by_path(nl->get_path_to(p_node)); @@ -835,7 +816,6 @@ Error SceneState::_parse_connections(Node *p_owner, Node *p_node, Map<StringName cd.signal = _nm_get_string(c.signal.get_name(), name_map); cd.flags = c.flags; for (int i = 0; i < c.binds.size(); i++) { - cd.binds.push_back(_vm_get_variant(c.binds[i], variant_map)); } connections.push_back(cd); @@ -843,11 +823,11 @@ Error SceneState::_parse_connections(Node *p_owner, Node *p_node, Map<StringName } for (int i = 0; i < p_node->get_child_count(); i++) { - Node *c = p_node->get_child(i); Error err = _parse_connections(p_owner, c, name_map, variant_map, node_map, nodepath_map); - if (err) + if (err) { return err; + } } return OK; @@ -870,7 +850,6 @@ Error SceneState::pack(Node *p_scene) { String path = scene->get_scene_inherited_state()->get_path(); Ref<PackedScene> instance = ResourceLoader::load(path); if (instance.is_valid()) { - base_scene_idx = _vm_get_variant(instance, variant_map); } } @@ -891,21 +870,18 @@ Error SceneState::pack(Node *p_scene) { names.resize(name_map.size()); for (Map<StringName, int>::Element *E = name_map.front(); E; E = E->next()) { - names.write[E->get()] = E->key(); } variants.resize(variant_map.size()); const Variant *K = nullptr; while ((K = variant_map.next(K))) { - int idx = variant_map[*K]; variants.write[idx] = *K; } node_paths.resize(nodepath_map.size()); for (Map<Node *, int>::Element *E = nodepath_map.front(); E; E = E->next()) { - node_paths.write[E->get()] = scene->get_path_to(E->key()); } @@ -913,17 +889,14 @@ Error SceneState::pack(Node *p_scene) { } void SceneState::set_path(const String &p_path) { - path = p_path; } String SceneState::get_path() const { - return path; } void SceneState::clear() { - names.clear(); variants.clear(); nodes.clear(); @@ -935,9 +908,7 @@ void SceneState::clear() { } Ref<SceneState> SceneState::_get_base_scene_state() const { - if (base_scene_idx >= 0) { - Ref<PackedScene> ps = variants[base_scene_idx]; if (ps.is_valid()) { return ps->get_state(); @@ -948,7 +919,6 @@ Ref<SceneState> SceneState::_get_base_scene_state() const { } int SceneState::find_node_by_path(const NodePath &p_node) const { - if (!node_path_cache.has(p_node)) { if (_get_base_scene_state().is_valid()) { int idx = _get_base_scene_state()->find_node_by_path(p_node); @@ -980,7 +950,6 @@ int SceneState::find_node_by_path(const NodePath &p_node) const { } int SceneState::_find_base_scene_node_remap_key(int p_idx) const { - for (Map<int, int>::Element *E = base_scene_node_remap.front(); E; E = E->next()) { if (E->value() == p_idx) { return E->key(); @@ -990,7 +959,6 @@ int SceneState::_find_base_scene_node_remap_key(int p_idx) const { } Variant SceneState::get_property_value(int p_node, const StringName &p_property, bool &found) const { - found = false; ERR_FAIL_COND_V(p_node < 0, Variant()); @@ -1019,14 +987,14 @@ Variant SceneState::get_property_value(int p_node, const StringName &p_property, } bool SceneState::is_node_in_group(int p_node, const StringName &p_group) const { - ERR_FAIL_COND_V(p_node < 0, false); if (p_node < nodes.size()) { const StringName *namep = names.ptr(); for (int i = 0; i < nodes[p_node].groups.size(); i++) { - if (namep[nodes[p_node].groups[i]] == p_group) + if (namep[nodes[p_node].groups[i]] == p_group) { return true; + } } } @@ -1040,17 +1008,14 @@ bool SceneState::is_node_in_group(int p_node, const StringName &p_group) const { bool SceneState::disable_placeholders = false; void SceneState::set_disable_placeholders(bool p_disable) { - disable_placeholders = p_disable; } bool SceneState::is_connection(int p_node, const StringName &p_signal, int p_to_node, const StringName &p_to_method) const { - ERR_FAIL_COND_V(p_node < 0, false); ERR_FAIL_COND_V(p_to_node < 0, false); if (p_node < nodes.size() && p_to_node < nodes.size()) { - int signal_idx = -1; int method_idx = -1; for (int i = 0; i < names.size(); i++) { @@ -1065,9 +1030,7 @@ bool SceneState::is_connection(int p_node, const StringName &p_signal, int p_to_ //signal and method strings are stored.. for (int i = 0; i < connections.size(); i++) { - if (connections[i].from == p_node && connections[i].to == p_to_node && connections[i].signal == signal_idx && connections[i].method == method_idx) { - return true; } } @@ -1082,7 +1045,6 @@ bool SceneState::is_connection(int p_node, const StringName &p_signal, int p_to_ } void SceneState::set_bundled_scene(const Dictionary &p_dictionary) { - ERR_FAIL_COND(!p_dictionary.has("names")); ERR_FAIL_COND(!p_dictionary.has("variants")); ERR_FAIL_COND(!p_dictionary.has("node_count")); @@ -1092,8 +1054,9 @@ void SceneState::set_bundled_scene(const Dictionary &p_dictionary) { //ERR_FAIL_COND( !p_dictionary.has("path")); int version = 1; - if (p_dictionary.has("version")) + if (p_dictionary.has("version")) { version = p_dictionary["version"]; + } ERR_FAIL_COND_MSG(version > PACKED_SCENE_VERSION, "Save format version too new."); @@ -1107,12 +1070,12 @@ void SceneState::set_bundled_scene(const Dictionary &p_dictionary) { Vector<String> snames = p_dictionary["names"]; if (snames.size()) { - int namecount = snames.size(); names.resize(namecount); const String *r = snames.ptr(); - for (int i = 0; i < names.size(); i++) + for (int i = 0; i < names.size(); i++) { names.write[i] = r[i]; + } } Array svariants = p_dictionary["variants"]; @@ -1121,7 +1084,6 @@ void SceneState::set_bundled_scene(const Dictionary &p_dictionary) { int varcount = svariants.size(); variants.resize(varcount); for (int i = 0; i < varcount; i++) { - variants.write[i] = svariants[i]; } @@ -1145,13 +1107,11 @@ void SceneState::set_bundled_scene(const Dictionary &p_dictionary) { nd.instance = r[idx++]; nd.properties.resize(r[idx++]); for (int j = 0; j < nd.properties.size(); j++) { - nd.properties.write[j].name = r[idx++]; nd.properties.write[j].value = r[idx++]; } nd.groups.resize(r[idx++]); for (int j = 0; j < nd.groups.size(); j++) { - nd.groups.write[j] = r[idx++]; } } @@ -1171,7 +1131,6 @@ void SceneState::set_bundled_scene(const Dictionary &p_dictionary) { cd.binds.resize(r[idx++]); for (int j = 0; j < cd.binds.size(); j++) { - cd.binds.write[j] = r[idx++]; } } @@ -1204,16 +1163,15 @@ void SceneState::set_bundled_scene(const Dictionary &p_dictionary) { } Dictionary SceneState::get_bundled_scene() const { - Vector<String> rnames; rnames.resize(names.size()); if (names.size()) { - String *r = rnames.ptrw(); - for (int i = 0; i < names.size(); i++) + for (int i = 0; i < names.size(); i++) { r[i] = names[i]; + } } Dictionary d; @@ -1224,7 +1182,6 @@ Dictionary SceneState::get_bundled_scene() const { d["node_count"] = nodes.size(); for (int i = 0; i < nodes.size(); i++) { - const NodeData &nd = nodes[i]; rnodes.push_back(nd.parent); rnodes.push_back(nd.owner); @@ -1237,13 +1194,11 @@ Dictionary SceneState::get_bundled_scene() const { rnodes.push_back(nd.instance); rnodes.push_back(nd.properties.size()); for (int j = 0; j < nd.properties.size(); j++) { - rnodes.push_back(nd.properties[j].name); rnodes.push_back(nd.properties[j].value); } rnodes.push_back(nd.groups.size()); for (int j = 0; j < nd.groups.size(); j++) { - rnodes.push_back(nd.groups[j]); } } @@ -1254,7 +1209,6 @@ Dictionary SceneState::get_bundled_scene() const { d["conn_count"] = connections.size(); for (int i = 0; i < connections.size(); i++) { - const ConnectionData &cd = connections[i]; rconns.push_back(cd.from); rconns.push_back(cd.to); @@ -1262,8 +1216,9 @@ Dictionary SceneState::get_bundled_scene() const { rconns.push_back(cd.method); rconns.push_back(cd.flags); rconns.push_back(cd.binds.size()); - for (int j = 0; j < cd.binds.size(); j++) + for (int j = 0; j < cd.binds.size(); j++) { rconns.push_back(cd.binds[j]); + } } d["conns"] = rconns; @@ -1291,20 +1246,18 @@ Dictionary SceneState::get_bundled_scene() const { } int SceneState::get_node_count() const { - return nodes.size(); } StringName SceneState::get_node_type(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, nodes.size(), StringName()); - if (nodes[p_idx].type == TYPE_INSTANCED) + if (nodes[p_idx].type == TYPE_INSTANCED) { return StringName(); + } return names[nodes[p_idx].type]; } StringName SceneState::get_node_name(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, nodes.size(), StringName()); return names[nodes[p_idx].name]; } @@ -1315,7 +1268,6 @@ int SceneState::get_node_index(int p_idx) const { } bool SceneState::is_node_instance_placeholder(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, nodes.size(), false); return nodes[p_idx].instance >= 0 && (nodes[p_idx].instance & FLAG_INSTANCE_IS_PLACEHOLDER); @@ -1325,12 +1277,12 @@ Ref<PackedScene> SceneState::get_node_instance(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, nodes.size(), Ref<PackedScene>()); if (nodes[p_idx].instance >= 0) { - if (nodes[p_idx].instance & FLAG_INSTANCE_IS_PLACEHOLDER) + if (nodes[p_idx].instance & FLAG_INSTANCE_IS_PLACEHOLDER) { return Ref<PackedScene>(); - else + } else { return variants[nodes[p_idx].instance & FLAG_MASK]; + } } else if (nodes[p_idx].parent < 0 || nodes[p_idx].parent == NO_PARENT_SAVED) { - if (base_scene_idx >= 0) { return variants[base_scene_idx]; } @@ -1340,7 +1292,6 @@ Ref<PackedScene> SceneState::get_node_instance(int p_idx) const { } String SceneState::get_node_instance_placeholder(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, nodes.size(), String()); if (nodes[p_idx].instance >= 0 && (nodes[p_idx].instance & FLAG_INSTANCE_IS_PLACEHOLDER)) { @@ -1360,7 +1311,6 @@ Vector<StringName> SceneState::get_node_groups(int p_idx) const { } NodePath SceneState::get_node_path(int p_idx, bool p_for_parent) const { - ERR_FAIL_INDEX_V(p_idx, nodes.size(), NodePath()); if (nodes[p_idx].parent < 0 || nodes[p_idx].parent == NO_PARENT_SAVED) { @@ -1376,7 +1326,6 @@ NodePath SceneState::get_node_path(int p_idx, bool p_for_parent) const { int nidx = p_idx; while (true) { if (nodes[nidx].parent == NO_PARENT_SAVED || nodes[nidx].parent < 0) { - sub_path.insert(0, "."); break; } @@ -1405,15 +1354,16 @@ NodePath SceneState::get_node_path(int p_idx, bool p_for_parent) const { } int SceneState::get_node_property_count(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, nodes.size(), -1); return nodes[p_idx].properties.size(); } + StringName SceneState::get_node_property_name(int p_idx, int p_prop) const { ERR_FAIL_INDEX_V(p_idx, nodes.size(), StringName()); ERR_FAIL_INDEX_V(p_prop, nodes[p_idx].properties.size(), StringName()); return names[nodes[p_idx].properties[p_prop].name]; } + Variant SceneState::get_node_property_value(int p_idx, int p_prop) const { ERR_FAIL_INDEX_V(p_idx, nodes.size(), Variant()); ERR_FAIL_INDEX_V(p_prop, nodes[p_idx].properties.size(), Variant()); @@ -1422,10 +1372,10 @@ Variant SceneState::get_node_property_value(int p_idx, int p_prop) const { } NodePath SceneState::get_node_owner_path(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, nodes.size(), NodePath()); - if (nodes[p_idx].owner < 0 || nodes[p_idx].owner == NO_PARENT_SAVED) + if (nodes[p_idx].owner < 0 || nodes[p_idx].owner == NO_PARENT_SAVED) { return NodePath(); //root likely + } if (nodes[p_idx].owner & FLAG_ID_IS_PATH) { return node_paths[nodes[p_idx].owner & FLAG_MASK]; } else { @@ -1434,11 +1384,10 @@ NodePath SceneState::get_node_owner_path(int p_idx) const { } int SceneState::get_connection_count() const { - return connections.size(); } -NodePath SceneState::get_connection_source(int p_idx) const { +NodePath SceneState::get_connection_source(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, connections.size(), NodePath()); if (connections[p_idx].from & FLAG_ID_IS_PATH) { return node_paths[connections[p_idx].from & FLAG_MASK]; @@ -1448,12 +1397,11 @@ NodePath SceneState::get_connection_source(int p_idx) const { } StringName SceneState::get_connection_signal(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, connections.size(), StringName()); return names[connections[p_idx].signal]; } -NodePath SceneState::get_connection_target(int p_idx) const { +NodePath SceneState::get_connection_target(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, connections.size(), NodePath()); if (connections[p_idx].to & FLAG_ID_IS_PATH) { return node_paths[connections[p_idx].to & FLAG_MASK]; @@ -1461,20 +1409,18 @@ NodePath SceneState::get_connection_target(int p_idx) const { return get_node_path(connections[p_idx].to & FLAG_MASK); } } -StringName SceneState::get_connection_method(int p_idx) const { +StringName SceneState::get_connection_method(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, connections.size(), StringName()); return names[connections[p_idx].method]; } int SceneState::get_connection_flags(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, connections.size(), -1); return connections[p_idx].flags; } Array SceneState::get_connection_binds(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, connections.size(), Array()); Array binds; for (int i = 0; i < connections[p_idx].binds.size(); i++) { @@ -1484,7 +1430,6 @@ Array SceneState::get_connection_binds(int p_idx) const { } bool SceneState::has_connection(const NodePath &p_node_from, const StringName &p_signal, const NodePath &p_node_to, const StringName &p_method) { - // this method cannot be const because of this Ref<SceneState> ss = this; @@ -1525,37 +1470,35 @@ bool SceneState::has_connection(const NodePath &p_node_from, const StringName &p Vector<NodePath> SceneState::get_editable_instances() const { return editable_instances; } + //add int SceneState::add_name(const StringName &p_name) { - names.push_back(p_name); return names.size() - 1; } int SceneState::find_name(const StringName &p_name) const { - for (int i = 0; i < names.size(); i++) { - if (names[i] == p_name) + if (names[i] == p_name) { return i; + } } return -1; } int SceneState::add_value(const Variant &p_value) { - variants.push_back(p_value); return variants.size() - 1; } int SceneState::add_node_path(const NodePath &p_path) { - node_paths.push_back(p_path); return (node_paths.size() - 1) | FLAG_ID_IS_PATH; } -int SceneState::add_node(int p_parent, int p_owner, int p_type, int p_name, int p_instance, int p_index) { +int SceneState::add_node(int p_parent, int p_owner, int p_type, int p_name, int p_instance, int p_index) { NodeData nd; nd.parent = p_parent; nd.owner = p_owner; @@ -1568,8 +1511,8 @@ int SceneState::add_node(int p_parent, int p_owner, int p_type, int p_name, int return nodes.size() - 1; } -void SceneState::add_node_property(int p_node, int p_name, int p_value) { +void SceneState::add_node_property(int p_node, int p_name, int p_value) { ERR_FAIL_INDEX(p_node, nodes.size()); ERR_FAIL_INDEX(p_name, names.size()); ERR_FAIL_INDEX(p_value, variants.size()); @@ -1579,19 +1522,19 @@ void SceneState::add_node_property(int p_node, int p_name, int p_value) { prop.value = p_value; nodes.write[p_node].properties.push_back(prop); } -void SceneState::add_node_group(int p_node, int p_group) { +void SceneState::add_node_group(int p_node, int p_group) { ERR_FAIL_INDEX(p_node, nodes.size()); ERR_FAIL_INDEX(p_group, names.size()); nodes.write[p_node].groups.push_back(p_group); } -void SceneState::set_base_scene(int p_idx) { +void SceneState::set_base_scene(int p_idx) { ERR_FAIL_INDEX(p_idx, variants.size()); base_scene_idx = p_idx; } -void SceneState::add_connection(int p_from, int p_to, int p_signal, int p_method, int p_flags, const Vector<int> &p_binds) { +void SceneState::add_connection(int p_from, int p_to, int p_signal, int p_method, int p_flags, const Vector<int> &p_binds) { ERR_FAIL_INDEX(p_signal, names.size()); ERR_FAIL_INDEX(p_method, names.size()); @@ -1607,24 +1550,23 @@ void SceneState::add_connection(int p_from, int p_to, int p_signal, int p_method c.binds = p_binds; connections.push_back(c); } -void SceneState::add_editable_instance(const NodePath &p_path) { +void SceneState::add_editable_instance(const NodePath &p_path) { editable_instances.push_back(p_path); } Vector<String> SceneState::_get_node_groups(int p_idx) const { - Vector<StringName> groups = get_node_groups(p_idx); Vector<String> ret; - for (int i = 0; i < groups.size(); i++) + for (int i = 0; i < groups.size(); i++) { ret.push_back(groups[i]); + } return ret; } void SceneState::_bind_methods() { - //unbuild API ClassDB::bind_method(D_METHOD("get_node_count"), &SceneState::get_node_count); @@ -1654,7 +1596,6 @@ void SceneState::_bind_methods() { } SceneState::SceneState() { - base_scene_idx = -1; last_modified_time = 0; } @@ -1662,46 +1603,42 @@ SceneState::SceneState() { //////////////// void PackedScene::_set_bundled_scene(const Dictionary &p_scene) { - state->set_bundled_scene(p_scene); } Dictionary PackedScene::_get_bundled_scene() const { - return state->get_bundled_scene(); } Error PackedScene::pack(Node *p_scene) { - return state->pack(p_scene); } void PackedScene::clear() { - state->clear(); } bool PackedScene::can_instance() const { - return state->can_instance(); } Node *PackedScene::instance(GenEditState p_edit_state) const { - #ifndef TOOLS_ENABLED ERR_FAIL_COND_V_MSG(p_edit_state != GEN_EDIT_STATE_DISABLED, nullptr, "Edit state is only for editors, does not work without tools compiled."); #endif Node *s = state->instance((SceneState::GenEditState)p_edit_state); - if (!s) + if (!s) { return nullptr; + } if (p_edit_state != GEN_EDIT_STATE_DISABLED) { s->set_scene_instance_state(state); } - if (get_path() != "" && get_path().find("::") == -1) + if (get_path() != "" && get_path().find("::") == -1) { s->set_filename(get_path()); + } s->notification(Node::NOTIFICATION_INSTANCED); @@ -1709,7 +1646,6 @@ Node *PackedScene::instance(GenEditState p_edit_state) const { } void PackedScene::replace_state(Ref<SceneState> p_by) { - state = p_by; state->set_path(get_path()); #ifdef TOOLS_ENABLED @@ -1718,7 +1654,6 @@ void PackedScene::replace_state(Ref<SceneState> p_by) { } void PackedScene::recreate_state() { - state = Ref<SceneState>(memnew(SceneState)); state->set_path(get_path()); #ifdef TOOLS_ENABLED @@ -1727,18 +1662,15 @@ void PackedScene::recreate_state() { } Ref<SceneState> PackedScene::get_state() { - return state; } void PackedScene::set_path(const String &p_path, bool p_take_over) { - state->set_path(p_path); Resource::set_path(p_path, p_take_over); } void PackedScene::_bind_methods() { - ClassDB::bind_method(D_METHOD("pack", "path"), &PackedScene::pack); ClassDB::bind_method(D_METHOD("instance", "edit_state"), &PackedScene::instance, DEFVAL(GEN_EDIT_STATE_DISABLED)); ClassDB::bind_method(D_METHOD("can_instance"), &PackedScene::can_instance); @@ -1754,6 +1686,5 @@ void PackedScene::_bind_methods() { } PackedScene::PackedScene() { - state = Ref<SceneState>(memnew(SceneState)); } diff --git a/scene/resources/packed_scene.h b/scene/resources/packed_scene.h index c5873a0792..898d5ff11f 100644 --- a/scene/resources/packed_scene.h +++ b/scene/resources/packed_scene.h @@ -35,7 +35,6 @@ #include "scene/main/node.h" class SceneState : public Reference { - GDCLASS(SceneState, Reference); Vector<StringName> names; @@ -54,7 +53,6 @@ class SceneState : public Reference { }; struct NodeData { - int parent; int owner; int type; @@ -63,7 +61,6 @@ class SceneState : public Reference { int index; struct Property { - int name; int value; }; @@ -81,7 +78,6 @@ class SceneState : public Reference { Vector<NodeData> nodes; struct ConnectionData { - int from; int to; int signal; @@ -195,7 +191,6 @@ public: VARIANT_ENUM_CAST(SceneState::GenEditState) class PackedScene : public Resource { - GDCLASS(PackedScene, Resource); RES_BASE_EXTENSION("scn"); diff --git a/scene/resources/particles_material.cpp b/scene/resources/particles_material.cpp index 1a28e2586d..fc92a721db 100644 --- a/scene/resources/particles_material.cpp +++ b/scene/resources/particles_material.cpp @@ -36,7 +36,6 @@ Map<ParticlesMaterial::MaterialKey, ParticlesMaterial::ShaderData> ParticlesMate ParticlesMaterial::ShaderNames *ParticlesMaterial::shader_names = nullptr; void ParticlesMaterial::init_shaders() { - dirty_materials = memnew(SelfList<ParticlesMaterial>::List); shader_names = memnew(ShaderNames); @@ -102,7 +101,6 @@ void ParticlesMaterial::init_shaders() { } void ParticlesMaterial::finish_shaders() { - memdelete(dirty_materials); dirty_materials = nullptr; @@ -110,12 +108,12 @@ void ParticlesMaterial::finish_shaders() { } void ParticlesMaterial::_update_shader() { - dirty_materials->remove(&element); MaterialKey mk = _compute_key(); - if (mk.key == current_key.key) + if (mk.key == current_key.key) { return; //no update required in the end + } if (shader_map.has(current_key)) { shader_map[current_key].users--; @@ -129,7 +127,6 @@ void ParticlesMaterial::_update_shader() { current_key = mk; if (shader_map.has(mk)) { - RS::get_singleton()->material_set_shader(_get_material(), shader_map[mk].shader); shader_map[mk].users++; return; @@ -201,33 +198,46 @@ void ParticlesMaterial::_update_shader() { code += "uniform vec3 gravity;\n"; - if (color_ramp.is_valid()) + if (color_ramp.is_valid()) { code += "uniform sampler2D color_ramp;\n"; + } - if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) + if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) { code += "uniform sampler2D linear_velocity_texture;\n"; - if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid()) + } + if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid()) { code += "uniform sampler2D orbit_velocity_texture;\n"; - if (tex_parameters[PARAM_ANGULAR_VELOCITY].is_valid()) + } + if (tex_parameters[PARAM_ANGULAR_VELOCITY].is_valid()) { code += "uniform sampler2D angular_velocity_texture;\n"; - if (tex_parameters[PARAM_LINEAR_ACCEL].is_valid()) + } + if (tex_parameters[PARAM_LINEAR_ACCEL].is_valid()) { code += "uniform sampler2D linear_accel_texture;\n"; - if (tex_parameters[PARAM_RADIAL_ACCEL].is_valid()) + } + if (tex_parameters[PARAM_RADIAL_ACCEL].is_valid()) { code += "uniform sampler2D radial_accel_texture;\n"; - if (tex_parameters[PARAM_TANGENTIAL_ACCEL].is_valid()) + } + if (tex_parameters[PARAM_TANGENTIAL_ACCEL].is_valid()) { code += "uniform sampler2D tangent_accel_texture;\n"; - if (tex_parameters[PARAM_DAMPING].is_valid()) + } + if (tex_parameters[PARAM_DAMPING].is_valid()) { code += "uniform sampler2D damping_texture;\n"; - if (tex_parameters[PARAM_ANGLE].is_valid()) + } + if (tex_parameters[PARAM_ANGLE].is_valid()) { code += "uniform sampler2D angle_texture;\n"; - if (tex_parameters[PARAM_SCALE].is_valid()) + } + if (tex_parameters[PARAM_SCALE].is_valid()) { code += "uniform sampler2D scale_texture;\n"; - if (tex_parameters[PARAM_HUE_VARIATION].is_valid()) + } + if (tex_parameters[PARAM_HUE_VARIATION].is_valid()) { code += "uniform sampler2D hue_variation_texture;\n"; - if (tex_parameters[PARAM_ANIM_SPEED].is_valid()) + } + if (tex_parameters[PARAM_ANIM_SPEED].is_valid()) { code += "uniform sampler2D anim_speed_texture;\n"; - if (tex_parameters[PARAM_ANIM_OFFSET].is_valid()) + } + if (tex_parameters[PARAM_ANIM_OFFSET].is_valid()) { code += "uniform sampler2D anim_offset_texture;\n"; + } if (trail_size_modifier.is_valid()) { code += "uniform sampler2D trail_size_modifier;\n"; @@ -289,25 +299,27 @@ void ParticlesMaterial::_update_shader() { code += " }\n\n"; code += " if (RESTART || restart) {\n"; - if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) + if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) { code += " float tex_linear_velocity = textureLod(linear_velocity_texture, vec2(0.0, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_linear_velocity = 0.0;\n"; + } - if (tex_parameters[PARAM_ANGLE].is_valid()) + if (tex_parameters[PARAM_ANGLE].is_valid()) { code += " float tex_angle = textureLod(angle_texture, vec2(0.0, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_angle = 0.0;\n"; + } - if (tex_parameters[PARAM_ANIM_OFFSET].is_valid()) + if (tex_parameters[PARAM_ANIM_OFFSET].is_valid()) { code += " float tex_anim_offset = textureLod(anim_offset_texture, vec2(0.0, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_anim_offset = 0.0;\n"; + } code += " float spread_rad = spread * degree_to_rad;\n"; if (flags[FLAG_DISABLE_Z]) { - code += " float angle1_rad = rand_from_seed_m1_p1(alt_seed) * spread_rad;\n"; code += " angle1_rad += direction.x != 0.0 ? atan(direction.y, direction.x) : sign(direction.y) * (pi / 2.0);\n"; code += " vec3 rot = vec3(cos(angle1_rad), sin(angle1_rad), 0.0);\n"; @@ -352,7 +364,6 @@ void ParticlesMaterial::_update_shader() { if (emission_shape == EMISSION_SHAPE_DIRECTED_POINTS) { if (flags[FLAG_DISABLE_Z]) { - code += " mat2 rotm;"; code += " rotm[0] = texelFetch(emission_texture_normal, emission_tex_ofs, 0).xy;\n"; code += " rotm[1] = rotm[0].yx * vec2(1.0, -1.0);\n"; @@ -380,58 +391,67 @@ void ParticlesMaterial::_update_shader() { code += " } else {\n"; code += " CUSTOM.y += DELTA / LIFETIME;\n"; - if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) + if (tex_parameters[PARAM_INITIAL_LINEAR_VELOCITY].is_valid()) { code += " float tex_linear_velocity = textureLod(linear_velocity_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_linear_velocity = 0.0;\n"; + } if (flags[FLAG_DISABLE_Z]) { - - if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid()) + if (tex_parameters[PARAM_ORBIT_VELOCITY].is_valid()) { code += " float tex_orbit_velocity = textureLod(orbit_velocity_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_orbit_velocity = 0.0;\n"; + } } - if (tex_parameters[PARAM_ANGULAR_VELOCITY].is_valid()) + if (tex_parameters[PARAM_ANGULAR_VELOCITY].is_valid()) { code += " float tex_angular_velocity = textureLod(angular_velocity_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_angular_velocity = 0.0;\n"; + } - if (tex_parameters[PARAM_LINEAR_ACCEL].is_valid()) + if (tex_parameters[PARAM_LINEAR_ACCEL].is_valid()) { code += " float tex_linear_accel = textureLod(linear_accel_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_linear_accel = 0.0;\n"; + } - if (tex_parameters[PARAM_RADIAL_ACCEL].is_valid()) + if (tex_parameters[PARAM_RADIAL_ACCEL].is_valid()) { code += " float tex_radial_accel = textureLod(radial_accel_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_radial_accel = 0.0;\n"; + } - if (tex_parameters[PARAM_TANGENTIAL_ACCEL].is_valid()) + if (tex_parameters[PARAM_TANGENTIAL_ACCEL].is_valid()) { code += " float tex_tangent_accel = textureLod(tangent_accel_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_tangent_accel = 0.0;\n"; + } - if (tex_parameters[PARAM_DAMPING].is_valid()) + if (tex_parameters[PARAM_DAMPING].is_valid()) { code += " float tex_damping = textureLod(damping_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_damping = 0.0;\n"; + } - if (tex_parameters[PARAM_ANGLE].is_valid()) + if (tex_parameters[PARAM_ANGLE].is_valid()) { code += " float tex_angle = textureLod(angle_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_angle = 0.0;\n"; + } - if (tex_parameters[PARAM_ANIM_SPEED].is_valid()) + if (tex_parameters[PARAM_ANIM_SPEED].is_valid()) { code += " float tex_anim_speed = textureLod(anim_speed_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_anim_speed = 0.0;\n"; + } - if (tex_parameters[PARAM_ANIM_OFFSET].is_valid()) + if (tex_parameters[PARAM_ANIM_OFFSET].is_valid()) { code += " float tex_anim_offset = textureLod(anim_offset_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_anim_offset = 0.0;\n"; + } code += " vec3 force = gravity;\n"; code += " vec3 pos = TRANSFORM[3].xyz;\n"; @@ -456,7 +476,6 @@ void ParticlesMaterial::_update_shader() { code += " VELOCITY += force * DELTA;\n"; code += " // orbit velocity\n"; if (flags[FLAG_DISABLE_Z]) { - code += " float orbit_amount = (orbit_velocity + tex_orbit_velocity) * mix(1.0, rand_from_seed(alt_seed), orbit_velocity_random);\n"; code += " if (orbit_amount != 0.0) {\n"; code += " float ang = orbit_amount * DELTA * pi * 2.0;\n"; @@ -486,15 +505,17 @@ void ParticlesMaterial::_update_shader() { code += " }\n"; // apply color // apply hue rotation - if (tex_parameters[PARAM_SCALE].is_valid()) + if (tex_parameters[PARAM_SCALE].is_valid()) { code += " float tex_scale = textureLod(scale_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_scale = 1.0;\n"; + } - if (tex_parameters[PARAM_HUE_VARIATION].is_valid()) + if (tex_parameters[PARAM_HUE_VARIATION].is_valid()) { code += " float tex_hue_variation = textureLod(hue_variation_texture, vec2(CUSTOM.y, 0.0), 0.0).r;\n"; - else + } else { code += " float tex_hue_variation = 0.0;\n"; + } code += " float hue_rot_angle = (hue_variation + tex_hue_variation) * pi * 2.0 * mix(1.0, hue_rot_rand * 2.0 - 1.0, hue_variation_random);\n"; code += " float hue_rot_c = cos(hue_rot_angle);\n"; @@ -527,7 +548,6 @@ void ParticlesMaterial::_update_shader() { code += "\n"; if (flags[FLAG_DISABLE_Z]) { - if (flags[FLAG_ALIGN_Y_TO_VELOCITY]) { code += " if (length(VELOCITY) > 0.0) {\n"; code += " TRANSFORM[1].xyz = normalize(VELOCITY);\n"; @@ -603,17 +623,14 @@ void ParticlesMaterial::_update_shader() { } void ParticlesMaterial::flush_changes() { - MutexLock lock(material_mutex); while (dirty_materials->first()) { - dirty_materials->first()->self()->_update_shader(); } } void ParticlesMaterial::_queue_shader_change() { - MutexLock lock(material_mutex); if (!element.in_list()) { @@ -622,46 +639,39 @@ void ParticlesMaterial::_queue_shader_change() { } bool ParticlesMaterial::_is_shader_dirty() const { - MutexLock lock(material_mutex); return element.in_list(); } void ParticlesMaterial::set_direction(Vector3 p_direction) { - direction = p_direction; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->direction, direction); } Vector3 ParticlesMaterial::get_direction() const { - return direction; } void ParticlesMaterial::set_spread(float p_spread) { - spread = p_spread; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->spread, p_spread); } float ParticlesMaterial::get_spread() const { - return spread; } void ParticlesMaterial::set_flatness(float p_flatness) { - flatness = p_flatness; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->flatness, p_flatness); } -float ParticlesMaterial::get_flatness() const { +float ParticlesMaterial::get_flatness() const { return flatness; } void ParticlesMaterial::set_param(Parameter p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); parameters[p_param] = p_value; @@ -707,15 +717,14 @@ void ParticlesMaterial::set_param(Parameter p_param, float p_value) { break; // Can't happen, but silences warning } } -float ParticlesMaterial::get_param(Parameter p_param) const { +float ParticlesMaterial::get_param(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return parameters[p_param]; } void ParticlesMaterial::set_param_randomness(Parameter p_param, float p_value) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); randomness[p_param] = p_value; @@ -761,24 +770,23 @@ void ParticlesMaterial::set_param_randomness(Parameter p_param, float p_value) { break; // Can't happen, but silences warning } } -float ParticlesMaterial::get_param_randomness(Parameter p_param) const { +float ParticlesMaterial::get_param_randomness(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, 0); return randomness[p_param]; } static void _adjust_curve_range(const Ref<Texture2D> &p_texture, float p_min, float p_max) { - Ref<CurveTexture> curve_tex = p_texture; - if (!curve_tex.is_valid()) + if (!curve_tex.is_valid()) { return; + } curve_tex->ensure_default_setup(p_min, p_max); } void ParticlesMaterial::set_param_texture(Parameter p_param, const Ref<Texture2D> &p_texture) { - ERR_FAIL_INDEX(p_param, PARAM_MAX); tex_parameters[p_param] = p_texture; @@ -836,26 +844,23 @@ void ParticlesMaterial::set_param_texture(Parameter p_param, const Ref<Texture2D _queue_shader_change(); } -Ref<Texture2D> ParticlesMaterial::get_param_texture(Parameter p_param) const { +Ref<Texture2D> ParticlesMaterial::get_param_texture(Parameter p_param) const { ERR_FAIL_INDEX_V(p_param, PARAM_MAX, Ref<Texture2D>()); return tex_parameters[p_param]; } void ParticlesMaterial::set_color(const Color &p_color) { - RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->color, p_color); color = p_color; } Color ParticlesMaterial::get_color() const { - return color; } void ParticlesMaterial::set_color_ramp(const Ref<Texture2D> &p_texture) { - color_ramp = p_texture; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->color_ramp, p_texture); _queue_shader_change(); @@ -863,7 +868,6 @@ void ParticlesMaterial::set_color_ramp(const Ref<Texture2D> &p_texture) { } Ref<Texture2D> ParticlesMaterial::get_color_ramp() const { - return color_ramp; } @@ -889,87 +893,74 @@ void ParticlesMaterial::set_emission_shape(EmissionShape p_shape) { } void ParticlesMaterial::set_emission_sphere_radius(float p_radius) { - emission_sphere_radius = p_radius; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_sphere_radius, p_radius); } void ParticlesMaterial::set_emission_box_extents(Vector3 p_extents) { - emission_box_extents = p_extents; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_box_extents, p_extents); } void ParticlesMaterial::set_emission_point_texture(const Ref<Texture2D> &p_points) { - emission_point_texture = p_points; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_texture_points, p_points); } void ParticlesMaterial::set_emission_normal_texture(const Ref<Texture2D> &p_normals) { - emission_normal_texture = p_normals; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_texture_normal, p_normals); } void ParticlesMaterial::set_emission_color_texture(const Ref<Texture2D> &p_colors) { - emission_color_texture = p_colors; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_texture_color, p_colors); _queue_shader_change(); } void ParticlesMaterial::set_emission_point_count(int p_count) { - emission_point_count = p_count; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->emission_texture_point_count, p_count); } ParticlesMaterial::EmissionShape ParticlesMaterial::get_emission_shape() const { - return emission_shape; } float ParticlesMaterial::get_emission_sphere_radius() const { - return emission_sphere_radius; } -Vector3 ParticlesMaterial::get_emission_box_extents() const { +Vector3 ParticlesMaterial::get_emission_box_extents() const { return emission_box_extents; } -Ref<Texture2D> ParticlesMaterial::get_emission_point_texture() const { +Ref<Texture2D> ParticlesMaterial::get_emission_point_texture() const { return emission_point_texture; } -Ref<Texture2D> ParticlesMaterial::get_emission_normal_texture() const { +Ref<Texture2D> ParticlesMaterial::get_emission_normal_texture() const { return emission_normal_texture; } Ref<Texture2D> ParticlesMaterial::get_emission_color_texture() const { - return emission_color_texture; } int ParticlesMaterial::get_emission_point_count() const { - return emission_point_count; } void ParticlesMaterial::set_trail_divisor(int p_divisor) { - trail_divisor = p_divisor; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->trail_divisor, p_divisor); } int ParticlesMaterial::get_trail_divisor() const { - return trail_divisor; } void ParticlesMaterial::set_trail_size_modifier(const Ref<CurveTexture> &p_trail_size_modifier) { - trail_size_modifier = p_trail_size_modifier; Ref<CurveTexture> curve = trail_size_modifier; @@ -982,24 +973,20 @@ void ParticlesMaterial::set_trail_size_modifier(const Ref<CurveTexture> &p_trail } Ref<CurveTexture> ParticlesMaterial::get_trail_size_modifier() const { - return trail_size_modifier; } void ParticlesMaterial::set_trail_color_modifier(const Ref<GradientTexture> &p_trail_color_modifier) { - trail_color_modifier = p_trail_color_modifier; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->trail_color_modifier, p_trail_color_modifier); _queue_shader_change(); } Ref<GradientTexture> ParticlesMaterial::get_trail_color_modifier() const { - return trail_color_modifier; } void ParticlesMaterial::set_gravity(const Vector3 &p_gravity) { - gravity = p_gravity; Vector3 gset = gravity; if (gset == Vector3()) { @@ -1009,29 +996,24 @@ void ParticlesMaterial::set_gravity(const Vector3 &p_gravity) { } Vector3 ParticlesMaterial::get_gravity() const { - return gravity; } void ParticlesMaterial::set_lifetime_randomness(float p_lifetime) { - lifetime_randomness = p_lifetime; RenderingServer::get_singleton()->material_set_param(_get_material(), shader_names->lifetime_randomness, lifetime_randomness); } float ParticlesMaterial::get_lifetime_randomness() const { - return lifetime_randomness; } RID ParticlesMaterial::get_shader_rid() const { - ERR_FAIL_COND_V(!shader_map.has(current_key), RID()); return shader_map[current_key].shader; } void ParticlesMaterial::_validate_property(PropertyInfo &property) const { - if (property.name == "color" && color_ramp.is_valid()) { property.usage = 0; } @@ -1062,12 +1044,10 @@ void ParticlesMaterial::_validate_property(PropertyInfo &property) const { } Shader::Mode ParticlesMaterial::get_shader_mode() const { - return Shader::MODE_PARTICLES; } void ParticlesMaterial::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_direction", "degrees"), &ParticlesMaterial::set_direction); ClassDB::bind_method(D_METHOD("get_direction"), &ParticlesMaterial::get_direction); @@ -1235,7 +1215,6 @@ void ParticlesMaterial::_bind_methods() { ParticlesMaterial::ParticlesMaterial() : element(this) { - set_direction(Vector3(1, 0, 0)); set_spread(45); set_flatness(0); @@ -1276,7 +1255,6 @@ ParticlesMaterial::ParticlesMaterial() : } ParticlesMaterial::~ParticlesMaterial() { - MutexLock lock(material_mutex); if (shader_map.has(current_key)) { diff --git a/scene/resources/particles_material.h b/scene/resources/particles_material.h index c6c8316995..a1a4c38842 100644 --- a/scene/resources/particles_material.h +++ b/scene/resources/particles_material.h @@ -35,7 +35,6 @@ #define PARTICLES_MATERIAL_H class ParticlesMaterial : public Material { - GDCLASS(ParticlesMaterial, Material); public: @@ -74,7 +73,6 @@ public: private: union MaterialKey { - struct { uint32_t texture_mask : 16; uint32_t texture_color : 1; @@ -103,7 +101,6 @@ private: MaterialKey current_key; _FORCE_INLINE_ MaterialKey _compute_key() const { - MaterialKey mk; mk.key = 0; for (int i = 0; i < PARAM_MAX; i++) { diff --git a/scene/resources/physics_material.cpp b/scene/resources/physics_material.cpp index 89fbf7a248..2a5cd1101a 100644 --- a/scene/resources/physics_material.cpp +++ b/scene/resources/physics_material.cpp @@ -31,7 +31,6 @@ #include "physics_material.h" void PhysicsMaterial::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_friction", "friction"), &PhysicsMaterial::set_friction); ClassDB::bind_method(D_METHOD("get_friction"), &PhysicsMaterial::get_friction); diff --git a/scene/resources/physics_material.h b/scene/resources/physics_material.h index 1fac3fa6ef..34aa7066df 100644 --- a/scene/resources/physics_material.h +++ b/scene/resources/physics_material.h @@ -35,7 +35,6 @@ #include "servers/physics_server_3d.h" class PhysicsMaterial : public Resource { - GDCLASS(PhysicsMaterial, Resource); OBJ_SAVE_TYPE(PhysicsMaterial); RES_BASE_EXTENSION("phymat"); diff --git a/scene/resources/polygon_path_finder.cpp b/scene/resources/polygon_path_finder.cpp index c3daedf918..0546c92948 100644 --- a/scene/resources/polygon_path_finder.cpp +++ b/scene/resources/polygon_path_finder.cpp @@ -32,11 +32,9 @@ #include "core/math/geometry.h" bool PolygonPathFinder::_is_point_inside(const Vector2 &p_point) const { - int crosses = 0; for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { - const Edge &e = E->get(); Vector2 a = points[e.points[0]].pos; @@ -51,7 +49,6 @@ bool PolygonPathFinder::_is_point_inside(const Vector2 &p_point) const { } void PolygonPathFinder::setup(const Vector<Vector2> &p_points, const Vector<int> &p_connections) { - ERR_FAIL_COND(p_connections.size() & 1); points.clear(); @@ -64,7 +61,6 @@ void PolygonPathFinder::setup(const Vector<Vector2> &p_points, const Vector<int> bounds = Rect2(); for (int i = 0; i < p_points.size(); i++) { - points.write[i].pos = p_points[i]; points.write[i].penalty = 0; @@ -84,7 +80,6 @@ void PolygonPathFinder::setup(const Vector<Vector2> &p_points, const Vector<int> //insert edges (which are also connetions) for (int i = 0; i < p_connections.size(); i += 2) { - Edge e(p_connections[i], p_connections[i + 1]); ERR_FAIL_INDEX(e.points[0], point_count); ERR_FAIL_INDEX(e.points[1], point_count); @@ -96,25 +91,25 @@ void PolygonPathFinder::setup(const Vector<Vector2> &p_points, const Vector<int> //fill the remaining connections based on visibility for (int i = 0; i < point_count; i++) { - for (int j = i + 1; j < point_count; j++) { - - if (edges.has(Edge(i, j))) + if (edges.has(Edge(i, j))) { continue; //if in edge ignore + } Vector2 from = points[i].pos; Vector2 to = points[j].pos; - if (!_is_point_inside(from * 0.5 + to * 0.5)) //connection between points in inside space + if (!_is_point_inside(from * 0.5 + to * 0.5)) { //connection between points in inside space continue; + } bool valid = true; for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { - const Edge &e = E->get(); - if (e.points[0] == i || e.points[1] == i || e.points[0] == j || e.points[1] == j) + if (e.points[0] == i || e.points[1] == i || e.points[0] == j || e.points[1] == j) { continue; + } Vector2 a = points[e.points[0]].pos; Vector2 b = points[e.points[1]].pos; @@ -134,7 +129,6 @@ void PolygonPathFinder::setup(const Vector<Vector2> &p_points, const Vector<int> } Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector2 &p_to) { - Vector<Vector2> path; Vector2 from = p_from; @@ -143,12 +137,10 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector Edge ignore_to_edge(-1, -1); if (!_is_point_inside(from)) { - float closest_dist = 1e20; Vector2 closest_point; for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { - const Edge &e = E->get(); Vector2 seg[2] = { points[e.points[0]].pos, @@ -173,7 +165,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector Vector2 closest_point; for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { - const Edge &e = E->get(); Vector2 seg[2] = { points[e.points[0]].pos, @@ -195,16 +186,16 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector //test direct connection { - bool can_see_eachother = true; for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { - const Edge &e = E->get(); - if (e.points[0] == ignore_from_edge.points[0] && e.points[1] == ignore_from_edge.points[1]) + if (e.points[0] == ignore_from_edge.points[0] && e.points[1] == ignore_from_edge.points[1]) { continue; - if (e.points[0] == ignore_to_edge.points[0] && e.points[1] == ignore_to_edge.points[1]) + } + if (e.points[0] == ignore_to_edge.points[0] && e.points[1] == ignore_to_edge.points[1]) { continue; + } Vector2 a = points[e.points[0]].pos; Vector2 b = points[e.points[1]].pos; @@ -216,7 +207,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector } if (can_see_eachother) { - path.push_back(from); path.push_back(to); return path; @@ -237,7 +227,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector points.write[bidx].penalty = 0; for (int i = 0; i < points.size() - 2; i++) { - bool valid_a = true; bool valid_b = true; points.write[i].prev = -1; @@ -252,22 +241,20 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector } for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { - const Edge &e = E->get(); - if (e.points[0] == i || e.points[1] == i) + if (e.points[0] == i || e.points[1] == i) { continue; + } Vector2 a = points[e.points[0]].pos; Vector2 b = points[e.points[1]].pos; if (valid_a) { - if (e.points[0] != ignore_from_edge.points[1] && e.points[1] != ignore_from_edge.points[1] && e.points[0] != ignore_from_edge.points[0] && e.points[1] != ignore_from_edge.points[0]) { - if (Geometry::segment_intersects_segment_2d(a, b, from, points[i].pos, nullptr)) { valid_a = false; } @@ -275,20 +262,19 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector } if (valid_b) { - if (e.points[0] != ignore_to_edge.points[1] && e.points[1] != ignore_to_edge.points[1] && e.points[0] != ignore_to_edge.points[0] && e.points[1] != ignore_to_edge.points[0]) { - if (Geometry::segment_intersects_segment_2d(a, b, to, points[i].pos, nullptr)) { valid_b = false; } } } - if (!valid_a && !valid_b) + if (!valid_a && !valid_b) { break; + } } if (valid_a) { @@ -308,7 +294,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector points.write[aidx].distance = 0; points.write[aidx].prev = aidx; for (Set<int>::Element *E = points[aidx].connections.front(); E; E = E->next()) { - open_list.insert(E->get()); points.write[E->get()].distance = from.distance_to(points[E->get()].pos); points.write[E->get()].prev = aidx; @@ -317,7 +302,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector bool found_route = false; while (true) { - if (open_list.size() == 0) { printf("open list empty\n"); break; @@ -329,14 +313,12 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector //this could be faster (cache previous results) for (Set<int>::Element *E = open_list.front(); E; E = E->next()) { - const Point &p = points[E->get()]; float cost = p.distance; cost += p.pos.distance_to(to); cost += p.penalty; if (cost < least_cost) { - least_cost_point = E->get(); least_cost = cost; } @@ -346,7 +328,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector //open the neighbours for search for (Set<int>::Element *E = np.connections.front(); E; E = E->next()) { - Point &p = points.write[E->get()]; float distance = np.pos.distance_to(p.pos) + np.distance; @@ -354,7 +335,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector //oh this was visited already, can we win the cost? if (p.distance > distance) { - p.prev = least_cost_point; //reasign previous p.distance = distance; } @@ -373,8 +353,9 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector } } - if (found_route) + if (found_route) { break; + } open_list.erase(least_cost_point); } @@ -391,7 +372,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector } for (int i = 0; i < points.size() - 2; i++) { - points.write[i].connections.erase(aidx); points.write[i].connections.erase(bidx); points.write[i].prev = -1; @@ -409,7 +389,6 @@ Vector<Vector2> PolygonPathFinder::find_path(const Vector2 &p_from, const Vector } void PolygonPathFinder::_set_data(const Dictionary &p_data) { - ERR_FAIL_COND(!p_data.has("points")); ERR_FAIL_COND(!p_data.has("connections")); ERR_FAIL_COND(!p_data.has("segments")); @@ -419,8 +398,9 @@ void PolygonPathFinder::_set_data(const Dictionary &p_data) { Array c = p_data["connections"]; ERR_FAIL_COND(c.size() != p.size()); - if (c.size()) + if (c.size()) { return; + } int pc = p.size(); points.resize(pc + 2); @@ -432,13 +412,11 @@ void PolygonPathFinder::_set_data(const Dictionary &p_data) { const int *cr = con.ptr(); int cc = con.size(); for (int j = 0; j < cc; j++) { - points.write[i].connections.insert(cr[j]); } } if (p_data.has("penalties")) { - Vector<float> penalties = p_data["penalties"]; if (penalties.size() == pc) { const float *pr2 = penalties.ptr(); @@ -453,7 +431,6 @@ void PolygonPathFinder::_set_data(const Dictionary &p_data) { ERR_FAIL_COND(sc & 1); const int *sr = segs.ptr(); for (int i = 0; i < sc; i += 2) { - Edge e(sr[i], sr[i + 1]); edges.insert(e); } @@ -461,7 +438,6 @@ void PolygonPathFinder::_set_data(const Dictionary &p_data) { } Dictionary PolygonPathFinder::_get_data() const { - Dictionary d; Vector<Vector2> p; Vector<int> ind; @@ -491,7 +467,6 @@ Dictionary PolygonPathFinder::_get_data() const { } } { - int *iw = ind.ptrw(); int idx = 0; for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { @@ -510,17 +485,14 @@ Dictionary PolygonPathFinder::_get_data() const { } bool PolygonPathFinder::is_point_inside(const Vector2 &p_point) const { - return _is_point_inside(p_point); } Vector2 PolygonPathFinder::get_closest_point(const Vector2 &p_point) const { - float closest_dist = 1e20; Vector2 closest_point; for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { - const Edge &e = E->get(); Vector2 seg[2] = { points[e.points[0]].pos, @@ -542,7 +514,6 @@ Vector2 PolygonPathFinder::get_closest_point(const Vector2 &p_point) const { } Vector<Vector2> PolygonPathFinder::get_intersections(const Vector2 &p_from, const Vector2 &p_to) const { - Vector<Vector2> inters; for (Set<Edge>::Element *E = edges.front(); E; E = E->next()) { @@ -559,24 +530,20 @@ Vector<Vector2> PolygonPathFinder::get_intersections(const Vector2 &p_from, cons } Rect2 PolygonPathFinder::get_bounds() const { - return bounds; } void PolygonPathFinder::set_point_penalty(int p_point, float p_penalty) { - ERR_FAIL_INDEX(p_point, points.size() - 2); points.write[p_point].penalty = p_penalty; } float PolygonPathFinder::get_point_penalty(int p_point) const { - ERR_FAIL_INDEX_V(p_point, points.size() - 2, 0); return points[p_point].penalty; } void PolygonPathFinder::_bind_methods() { - ClassDB::bind_method(D_METHOD("setup", "points", "connections"), &PolygonPathFinder::setup); ClassDB::bind_method(D_METHOD("find_path", "from", "to"), &PolygonPathFinder::find_path); ClassDB::bind_method(D_METHOD("get_intersections", "from", "to"), &PolygonPathFinder::get_intersections); diff --git a/scene/resources/polygon_path_finder.h b/scene/resources/polygon_path_finder.h index 2ef5c89e2a..baee4dc20d 100644 --- a/scene/resources/polygon_path_finder.h +++ b/scene/resources/polygon_path_finder.h @@ -34,7 +34,6 @@ #include "core/resource.h" class PolygonPathFinder : public Resource { - GDCLASS(PolygonPathFinder, Resource); struct Point { @@ -46,19 +45,17 @@ class PolygonPathFinder : public Resource { }; struct Edge { - int points[2]; _FORCE_INLINE_ bool operator<(const Edge &p_edge) const { - - if (points[0] == p_edge.points[0]) + if (points[0] == p_edge.points[0]) { return points[1] < p_edge.points[1]; - else + } else { return points[0] < p_edge.points[0]; + } } Edge(int a = 0, int b = 0) { - if (a > b) { SWAP(a, b); } diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp index 46e8575018..99edf26dc1 100644 --- a/scene/resources/primitive_meshes.cpp +++ b/scene/resources/primitive_meshes.cpp @@ -35,7 +35,6 @@ PrimitiveMesh */ void PrimitiveMesh::_update() const { - Array arr; arr.resize(RS::ARRAY_MAX); _create_mesh_array(arr); @@ -47,13 +46,13 @@ void PrimitiveMesh::_update() const { int pc = points.size(); ERR_FAIL_COND(pc == 0); { - const Vector3 *r = points.ptr(); for (int i = 0; i < pc; i++) { - if (i == 0) + if (i == 0) { aabb.position = r[i]; - else + } else { aabb.expand_to(r[i]); + } } } @@ -63,7 +62,6 @@ void PrimitiveMesh::_update() const { Vector<Vector3> normals = arr[RS::ARRAY_NORMAL]; if (normals.size() && indices.size()) { - { int nc = normals.size(); Vector3 *w = normals.ptrw(); @@ -99,9 +97,9 @@ void PrimitiveMesh::_update() const { } void PrimitiveMesh::_request_update() { - - if (pending_request) + if (pending_request) { return; + } _update(); } @@ -142,8 +140,8 @@ Array PrimitiveMesh::surface_get_arrays(int p_surface) const { Dictionary PrimitiveMesh::surface_get_lods(int p_surface) const { return Dictionary(); //not really supported } -Array PrimitiveMesh::surface_get_blend_shape_arrays(int p_surface) const { +Array PrimitiveMesh::surface_get_blend_shape_arrays(int p_surface) const { return Array(); //not really supported } @@ -230,14 +228,12 @@ Array PrimitiveMesh::get_mesh_arrays() const { } void PrimitiveMesh::set_custom_aabb(const AABB &p_custom) { - custom_aabb = p_custom; RS::get_singleton()->mesh_set_custom_aabb(mesh, custom_aabb); emit_changed(); } AABB PrimitiveMesh::get_custom_aabb() const { - return custom_aabb; } @@ -251,7 +247,6 @@ bool PrimitiveMesh::get_flip_faces() const { } PrimitiveMesh::PrimitiveMesh() { - flip_faces = false; // defaults mesh = RenderingServer::get_singleton()->mesh_create(); @@ -1382,7 +1377,6 @@ void QuadMesh::_create_mesh_array(Array &p_arr) const { }; for (int i = 0; i < 6; i++) { - int j = indices[i]; faces.set(i, quad_faces[j]); normals.set(i, Vector3(0, 0, 1)); diff --git a/scene/resources/primitive_meshes.h b/scene/resources/primitive_meshes.h index 5f17680c9e..3cffa44e3a 100644 --- a/scene/resources/primitive_meshes.h +++ b/scene/resources/primitive_meshes.h @@ -42,7 +42,6 @@ This class is set apart that it assumes a single surface is always generated for our mesh. */ class PrimitiveMesh : public Mesh { - GDCLASS(PrimitiveMesh, Mesh); private: @@ -134,7 +133,6 @@ public: Similar to test cube but with subdivision support and different texture coordinates */ class CubeMesh : public PrimitiveMesh { - GDCLASS(CubeMesh, PrimitiveMesh); private: @@ -168,7 +166,6 @@ public: */ class CylinderMesh : public PrimitiveMesh { - GDCLASS(CylinderMesh, PrimitiveMesh); private: @@ -205,7 +202,6 @@ public: Similar to quadmesh but with tessellation support */ class PlaneMesh : public PrimitiveMesh { - GDCLASS(PlaneMesh, PrimitiveMesh); private: @@ -234,7 +230,6 @@ public: A prism shapen, handy for ramps, triangles, etc. */ class PrismMesh : public PrimitiveMesh { - GDCLASS(PrismMesh, PrimitiveMesh); private: @@ -272,7 +267,6 @@ public: */ class QuadMesh : public PrimitiveMesh { - GDCLASS(QuadMesh, PrimitiveMesh); private: @@ -293,7 +287,6 @@ public: A sphere.. */ class SphereMesh : public PrimitiveMesh { - GDCLASS(SphereMesh, PrimitiveMesh); private: @@ -331,7 +324,6 @@ public: */ class PointMesh : public PrimitiveMesh { - GDCLASS(PointMesh, PrimitiveMesh) protected: diff --git a/scene/resources/ray_shape_3d.cpp b/scene/resources/ray_shape_3d.cpp index 0211c55f46..17205a500a 100644 --- a/scene/resources/ray_shape_3d.cpp +++ b/scene/resources/ray_shape_3d.cpp @@ -33,7 +33,6 @@ #include "servers/physics_server_3d.h" Vector<Vector3> RayShape3D::get_debug_mesh_lines() { - Vector<Vector3> points; points.push_back(Vector3()); points.push_back(Vector3(0, 0, get_length())); @@ -46,7 +45,6 @@ real_t RayShape3D::get_enclosing_radius() const { } void RayShape3D::_update_shape() { - Dictionary d; d["length"] = length; d["slips_on_slope"] = slips_on_slope; @@ -55,7 +53,6 @@ void RayShape3D::_update_shape() { } void RayShape3D::set_length(float p_length) { - length = p_length; _update_shape(); notify_change_to_owners(); @@ -63,12 +60,10 @@ void RayShape3D::set_length(float p_length) { } float RayShape3D::get_length() const { - return length; } void RayShape3D::set_slips_on_slope(bool p_active) { - slips_on_slope = p_active; _update_shape(); notify_change_to_owners(); @@ -80,7 +75,6 @@ bool RayShape3D::get_slips_on_slope() const { } void RayShape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_length", "length"), &RayShape3D::set_length); ClassDB::bind_method(D_METHOD("get_length"), &RayShape3D::get_length); @@ -93,7 +87,6 @@ void RayShape3D::_bind_methods() { RayShape3D::RayShape3D() : Shape3D(PhysicsServer3D::get_singleton()->shape_create(PhysicsServer3D::SHAPE_RAY)) { - length = 1.0; slips_on_slope = false; diff --git a/scene/resources/ray_shape_3d.h b/scene/resources/ray_shape_3d.h index 83bb71cca3..ef849d2dee 100644 --- a/scene/resources/ray_shape_3d.h +++ b/scene/resources/ray_shape_3d.h @@ -33,7 +33,6 @@ #include "scene/resources/shape_3d.h" class RayShape3D : public Shape3D { - GDCLASS(RayShape3D, Shape3D); float length; bool slips_on_slope; diff --git a/scene/resources/rectangle_shape_2d.cpp b/scene/resources/rectangle_shape_2d.cpp index 19e72a65b0..949fddf2e7 100644 --- a/scene/resources/rectangle_shape_2d.cpp +++ b/scene/resources/rectangle_shape_2d.cpp @@ -33,29 +33,24 @@ #include "servers/physics_server_2d.h" #include "servers/rendering_server.h" void RectangleShape2D::_update_shape() { - PhysicsServer2D::get_singleton()->shape_set_data(get_rid(), extents); emit_changed(); } void RectangleShape2D::set_extents(const Vector2 &p_extents) { - extents = p_extents; _update_shape(); } Vector2 RectangleShape2D::get_extents() const { - return extents; } void RectangleShape2D::draw(const RID &p_to_rid, const Color &p_color) { - RenderingServer::get_singleton()->canvas_item_add_rect(p_to_rid, Rect2(-extents, extents * 2.0), p_color); } Rect2 RectangleShape2D::get_rect() const { - return Rect2(-extents, extents * 2.0); } @@ -64,7 +59,6 @@ real_t RectangleShape2D::get_enclosing_radius() const { } void RectangleShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_extents", "extents"), &RectangleShape2D::set_extents); ClassDB::bind_method(D_METHOD("get_extents"), &RectangleShape2D::get_extents); @@ -73,7 +67,6 @@ void RectangleShape2D::_bind_methods() { RectangleShape2D::RectangleShape2D() : Shape2D(PhysicsServer2D::get_singleton()->rectangle_shape_create()) { - extents = Vector2(10, 10); _update_shape(); } diff --git a/scene/resources/resource_format_text.cpp b/scene/resources/resource_format_text.cpp index 41146036f6..93db8b725f 100644 --- a/scene/resources/resource_format_text.cpp +++ b/scene/resources/resource_format_text.cpp @@ -46,17 +46,14 @@ /// void ResourceLoaderText::set_local_path(const String &p_local_path) { - res_path = p_local_path; } Ref<Resource> ResourceLoaderText::get_resource() { - return resource; } Error ResourceLoaderText::_parse_sub_resource_dummy(DummyReadData *p_data, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) { - VariantParser::Token token; VariantParser::get_token(p_stream, token, line, r_err_str); if (token.type != VariantParser::TK_NUMBER) { @@ -86,7 +83,6 @@ Error ResourceLoaderText::_parse_sub_resource_dummy(DummyReadData *p_data, Varia } Error ResourceLoaderText::_parse_ext_resource_dummy(DummyReadData *p_data, VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) { - VariantParser::Token token; VariantParser::get_token(p_stream, token, line, r_err_str); if (token.type != VariantParser::TK_NUMBER) { @@ -110,7 +106,6 @@ Error ResourceLoaderText::_parse_ext_resource_dummy(DummyReadData *p_data, Varia } Error ResourceLoaderText::_parse_sub_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) { - VariantParser::Token token; VariantParser::get_token(p_stream, token, line, r_err_str); if (token.type != VariantParser::TK_NUMBER) { @@ -123,11 +118,9 @@ Error ResourceLoaderText::_parse_sub_resource(VariantParser::Stream *p_stream, R if (use_nocache) { r_res = int_resources[index]; } else { - String path = local_path + "::" + itos(index); if (!ignore_resource_parsing) { - if (!ResourceCache::has(path)) { r_err_str = "Can't load cached sub-resource: " + path; return ERR_PARSE_ERROR; @@ -149,7 +142,6 @@ Error ResourceLoaderText::_parse_sub_resource(VariantParser::Stream *p_stream, R } Error ResourceLoaderText::_parse_ext_resource(VariantParser::Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str) { - VariantParser::Token token; VariantParser::get_token(p_stream, token, line, r_err_str); if (token.type != VariantParser::TK_NUMBER) { @@ -160,7 +152,6 @@ Error ResourceLoaderText::_parse_ext_resource(VariantParser::Stream *p_stream, R int id = token.value; if (!ignore_resource_parsing) { - if (!ext_resources.has(id)) { r_err_str = "Can't load cached ext-resource #" + itos(id); return ERR_PARSE_ERROR; @@ -172,10 +163,8 @@ Error ResourceLoaderText::_parse_ext_resource(VariantParser::Stream *p_stream, R if (ext_resources[id].cache.is_valid()) { r_res = ext_resources[id].cache; } else if (use_sub_threads) { - RES res = ResourceLoader::load_threaded_get(path); if (res.is_null()) { - if (ResourceLoader::get_abort_on_missing_resources()) { error = ERR_FILE_CORRUPT; error_text = "[ext_resource] referenced nonexistent resource at: " + path; @@ -212,9 +201,7 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars packed_scene.instance(); while (true) { - if (next_tag.name == "node") { - int parent = -1; int owner = -1; int type = -1; @@ -240,7 +227,6 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars } if (next_tag.fields.has("instance")) { - instance = packed_scene->get_state()->add_value(next_tag.fields["instance"]); if (packed_scene->get_state()->get_node_count() == 0 && parent == -1) { @@ -250,7 +236,6 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars } if (next_tag.fields.has("instance_placeholder")) { - String path = next_tag.fields["instance_placeholder"]; int path_v = packed_scene->get_state()->add_value(path); @@ -268,8 +253,9 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars if (next_tag.fields.has("owner")) { owner = packed_scene->get_state()->add_node_path(next_tag.fields["owner"]); } else { - if (parent != -1 && !(type == SceneState::TYPE_INSTANCED && instance == -1)) + if (parent != -1 && !(type == SceneState::TYPE_INSTANCED && instance == -1)) { owner = 0; //if no owner, owner is root + } } if (next_tag.fields.has("index")) { @@ -279,7 +265,6 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars int node_id = packed_scene->get_state()->add_node(parent, owner, type, name, instance, index); if (next_tag.fields.has("groups")) { - Array groups = next_tag.fields["groups"]; for (int i = 0; i < groups.size(); i++) { packed_scene->get_state()->add_node_group(node_id, packed_scene->get_state()->add_name(groups[i])); @@ -287,7 +272,6 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars } while (true) { - String assign; Variant value; @@ -313,7 +297,6 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars } } } else if (next_tag.name == "connection") { - if (!next_tag.fields.has("from")) { error = ERR_FILE_CORRUPT; error_text = "missing 'from' field from connection tag"; @@ -378,7 +361,6 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars } } } else if (next_tag.name == "editable") { - if (!next_tag.fields.has("path")) { error = ERR_FILE_CORRUPT; error_text = "missing 'path' field from connection tag"; @@ -402,7 +384,6 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars } } } else { - error = ERR_FILE_CORRUPT; _printerr(); return Ref<PackedScene>(); @@ -411,9 +392,9 @@ Ref<PackedScene> ResourceLoaderText::_parse_node_tag(VariantParser::ResourcePars } Error ResourceLoaderText::load() { - - if (error != OK) + if (error != OK) { return error; + } while (true) { if (next_tag.name != "ext_resource") { @@ -459,7 +440,6 @@ Error ResourceLoaderText::load() { er.type = type; if (use_sub_threads) { - Error err = ResourceLoader::load_threaded_request(path, type, use_sub_threads, local_path); if (err != OK) { @@ -477,7 +457,6 @@ Error ResourceLoaderText::load() { RES res = ResourceLoader::load(path, type); if (res.is_null()) { - if (ResourceLoader::get_abort_on_missing_resources()) { error = ERR_FILE_CORRUPT; error_text = "[ext_resource] referenced nonexistent resource at: " + path; @@ -487,7 +466,6 @@ Error ResourceLoaderText::load() { ResourceLoader::notify_dependency_error(local_path, path, type); } } else { - #ifdef TOOLS_ENABLED //remember ID for saving res->set_id_for_path(local_path, index); @@ -544,7 +522,6 @@ Error ResourceLoaderText::load() { Object *obj = ClassDB::instance(type); if (!obj) { - error_text += "Can't create sub resource of type: " + type; _printerr(); error = ERR_FILE_CORRUPT; @@ -553,7 +530,6 @@ Error ResourceLoaderText::load() { Resource *r = Object::cast_to<Resource>(obj); if (!r) { - error_text += "Can't create sub resource of type, because not a resource: " + type; _printerr(); error = ERR_FILE_CORRUPT; @@ -570,7 +546,6 @@ Error ResourceLoaderText::load() { resource_current++; while (true) { - String assign; Variant value; @@ -587,7 +562,6 @@ Error ResourceLoaderText::load() { } //it's assignment } else if (next_tag.name != String()) { - error = OK; break; } else { @@ -609,7 +583,6 @@ Error ResourceLoaderText::load() { } if (is_scene) { - error_text += "found the 'resource' tag on a scene file!"; _printerr(); error = ERR_FILE_CORRUPT; @@ -618,7 +591,6 @@ Error ResourceLoaderText::load() { Object *obj = ClassDB::instance(res_type); if (!obj) { - error_text += "Can't create sub resource of type: " + res_type; _printerr(); error = ERR_FILE_CORRUPT; @@ -627,7 +599,6 @@ Error ResourceLoaderText::load() { Resource *r = Object::cast_to<Resource>(obj); if (!r) { - error_text += "Can't create sub resource of type, because not a resource: " + res_type; _printerr(); error = ERR_FILE_CORRUPT; @@ -639,7 +610,6 @@ Error ResourceLoaderText::load() { resource_current++; while (true) { - String assign; Variant value; @@ -664,7 +634,6 @@ Error ResourceLoaderText::load() { resource->set(assign, value); //it's assignment } else if (next_tag.name != String()) { - error = ERR_FILE_CORRUPT; error_text = "Extra tag found when parsing main resource file"; _printerr(); @@ -683,9 +652,7 @@ Error ResourceLoaderText::load() { //for scene files if (next_tag.name == "node") { - if (!is_scene) { - error_text += "found the 'node' tag on a resource file!"; _printerr(); error = ERR_FILE_CORRUPT; @@ -694,8 +661,9 @@ Error ResourceLoaderText::load() { Ref<PackedScene> packed_scene = _parse_node_tag(rp); - if (!packed_scene.is_valid()) + if (!packed_scene.is_valid()) { return error; + } error = OK; //get it here @@ -720,21 +688,18 @@ Error ResourceLoaderText::load() { } int ResourceLoaderText::get_stage() const { - return resource_current; } -int ResourceLoaderText::get_stage_count() const { +int ResourceLoaderText::get_stage_count() const { return resources_total; //+ext_resources; } void ResourceLoaderText::set_translation_remapped(bool p_remapped) { - translation_remapped = p_remapped; } ResourceLoaderText::ResourceLoaderText() { - use_nocache = false; resources_total = 0; @@ -749,18 +714,15 @@ ResourceLoaderText::ResourceLoaderText() { } ResourceLoaderText::~ResourceLoaderText() { - memdelete(f); } void ResourceLoaderText::get_dependencies(FileAccess *p_f, List<String> *p_dependencies, bool p_add_types) { - open(p_f); ignore_resource_parsing = true; ERR_FAIL_COND(error != OK); while (next_tag.name == "ext_resource") { - if (!next_tag.fields.has("type")) { error = ERR_FILE_CORRUPT; error_text = "Missing 'type' in external resource tag"; @@ -801,7 +763,6 @@ void ResourceLoaderText::get_dependencies(FileAccess *p_f, List<String> *p_depen } Error ResourceLoaderText::rename_dependencies(FileAccess *p_f, const String &p_path, const Map<String, String> &p_map) { - open(p_f, true); ERR_FAIL_COND_V(error != OK, error); ignore_resource_parsing = true; @@ -814,7 +775,6 @@ Error ResourceLoaderText::rename_dependencies(FileAccess *p_f, const String &p_p uint64_t tag_end = f->get_position(); while (true) { - Error err = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp); if (err != OK) { @@ -826,17 +786,15 @@ Error ResourceLoaderText::rename_dependencies(FileAccess *p_f, const String &p_p } if (next_tag.name != "ext_resource") { - //nothing was done - if (!fw) + if (!fw) { return OK; + } break; } else { - if (!fw) { - fw = FileAccess::open(p_path + ".depren", FileAccess::WRITE); if (is_scene) { fw->store_line("[gd_scene load_steps=" + itos(resources_total) + " format=" + itos(FORMAT_VERSION) + "]\n"); @@ -903,7 +861,6 @@ Error ResourceLoaderText::rename_dependencies(FileAccess *p_f, const String &p_p } void ResourceLoaderText::open(FileAccess *p_f, bool p_skip_first_tag) { - error = OK; lines = 1; @@ -918,7 +875,6 @@ void ResourceLoaderText::open(FileAccess *p_f, bool p_skip_first_tag) { Error err = VariantParser::parse_tag(&stream, lines, error_text, tag); if (err) { - error = err; _printerr(); return; @@ -961,7 +917,6 @@ void ResourceLoaderText::open(FileAccess *p_f, bool p_skip_first_tag) { } if (!p_skip_first_tag) { - err = VariantParser::parse_tag(&stream, lines, error_text, next_tag, &rp); if (err) { @@ -978,7 +933,6 @@ void ResourceLoaderText::open(FileAccess *p_f, bool p_skip_first_tag) { } static void bs_save_unicode_string(FileAccess *f, const String &p_string, bool p_bit_on_len = false) { - CharString utf8 = p_string.utf8(); if (p_bit_on_len) { f->store_32((utf8.length() + 1) | 0x80000000); @@ -989,9 +943,9 @@ static void bs_save_unicode_string(FileAccess *f, const String &p_string, bool p } Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) { - - if (error) + if (error) { return error; + } FileAccessRef wf = FileAccess::open(p_path, FileAccess::WRITE); if (!wf) { @@ -1011,8 +965,9 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) bs_save_unicode_string(wf.f, is_scene ? "PackedScene" : resource_type); wf->store_64(0); //offset to import metadata, this is no longer used - for (int i = 0; i < 14; i++) + for (int i = 0; i < 14; i++) { wf->store_32(0); // reserved + } wf->store_32(0); //string table size, will not be in use size_t ext_res_count_pos = wf->get_position(); @@ -1028,7 +983,6 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) rp.userdata = &dummy_read; while (next_tag.name == "ext_resource") { - if (!next_tag.fields.has("path")) { error = ERR_FILE_CORRUPT; error_text = "Missing 'path' in external resource tag"; @@ -1092,7 +1046,6 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) Vector<size_t> local_pointers_pos; while (next_tag.name == "sub_resource" || next_tag.name == "resource") { - String type; int id = -1; bool main_res; @@ -1134,7 +1087,6 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) int prop_count = 0; while (true) { - String assign; Variant value; @@ -1151,14 +1103,12 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) } if (assign != String()) { - Map<StringName, int> empty_string_map; //unused bs_save_unicode_string(wf2, assign, true); ResourceFormatSaverBinaryInstance::write_variant(wf2, value, dummy_read.resource_set, dummy_read.external_resources, empty_string_map); prop_count++; } else if (next_tag.name != String()) { - error = OK; break; } else { @@ -1178,7 +1128,6 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) //this is a node, must save one more! if (!is_scene) { - error_text += "found the 'node' tag on a resource file!"; _printerr(); error = ERR_FILE_CORRUPT; @@ -1187,8 +1136,9 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) Ref<PackedScene> packed_scene = _parse_node_tag(rp); - if (!packed_scene.is_valid()) + if (!packed_scene.is_valid()) { return error; + } error = OK; //get it here @@ -1207,9 +1157,9 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) int prop_count = 0; for (List<PropertyInfo>::Element *E = props.front(); E; E = E->next()) { - - if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) + if (!(E->get().usage & PROPERTY_USAGE_STORAGE)) { continue; + } String name = E->get().name; Variant value = packed_scene->get(name); @@ -1253,7 +1203,6 @@ Error ResourceLoaderText::save_as_binary(FileAccess *p_f, const String &p_path) } String ResourceLoaderText::recognize(FileAccess *p_f) { - error = OK; lines = 1; @@ -1280,11 +1229,13 @@ String ResourceLoaderText::recognize(FileAccess *p_f) { } } - if (tag.name == "gd_scene") + if (tag.name == "gd_scene") { return "PackedScene"; + } - if (tag.name != "gd_resource") + if (tag.name != "gd_resource") { return ""; + } if (!tag.fields.has("type")) { error_text = "Missing 'type' field in 'gd_resource' tag"; @@ -1298,9 +1249,9 @@ String ResourceLoaderText::recognize(FileAccess *p_f) { ///////////////////// RES ResourceFormatLoaderText::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { - - if (r_error) + if (r_error) { *r_error = ERR_CANT_OPEN; + } Error err; @@ -1329,41 +1280,39 @@ RES ResourceFormatLoaderText::load(const String &p_path, const String &p_origina } void ResourceFormatLoaderText::get_recognized_extensions_for_type(const String &p_type, List<String> *p_extensions) const { - if (p_type == "") { get_recognized_extensions(p_extensions); return; } - if (p_type == "PackedScene") + if (p_type == "PackedScene") { p_extensions->push_back("tscn"); - else + } else { p_extensions->push_back("tres"); + } } void ResourceFormatLoaderText::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back("tscn"); p_extensions->push_back("tres"); } bool ResourceFormatLoaderText::handles_type(const String &p_type) const { - return true; } -String ResourceFormatLoaderText::get_resource_type(const String &p_path) const { +String ResourceFormatLoaderText::get_resource_type(const String &p_path) const { String ext = p_path.get_extension().to_lower(); - if (ext == "tscn") + if (ext == "tscn") { return "PackedScene"; - else if (ext != "tres") + } else if (ext != "tres") { return String(); + } //for anyhting else must test.. FileAccess *f = FileAccess::open(p_path, FileAccess::READ); if (!f) { - return ""; //could not rwead } @@ -1376,10 +1325,8 @@ String ResourceFormatLoaderText::get_resource_type(const String &p_path) const { } void ResourceFormatLoaderText::get_dependencies(const String &p_path, List<String> *p_dependencies, bool p_add_types) { - FileAccess *f = FileAccess::open(p_path, FileAccess::READ); if (!f) { - ERR_FAIL(); } @@ -1391,10 +1338,8 @@ void ResourceFormatLoaderText::get_dependencies(const String &p_path, List<Strin } Error ResourceFormatLoaderText::rename_dependencies(const String &p_path, const Map<String, String> &p_map) { - FileAccess *f = FileAccess::open(p_path, FileAccess::READ); if (!f) { - ERR_FAIL_V(ERR_CANT_OPEN); } @@ -1408,7 +1353,6 @@ Error ResourceFormatLoaderText::rename_dependencies(const String &p_path, const ResourceFormatLoaderText *ResourceFormatLoaderText::singleton = nullptr; Error ResourceFormatLoaderText::convert_file_to_binary(const String &p_src_path, const String &p_dst_path) { - Error err; FileAccess *f = FileAccess::open(p_src_path, FileAccess::READ, &err); @@ -1435,18 +1379,14 @@ Error ResourceFormatLoaderText::convert_file_to_binary(const String &p_src_path, /*****************************************************************************************************/ String ResourceFormatSaverTextInstance::_write_resources(void *ud, const RES &p_resource) { - ResourceFormatSaverTextInstance *rsi = (ResourceFormatSaverTextInstance *)ud; return rsi->_write_resource(p_resource); } String ResourceFormatSaverTextInstance::_write_resource(const RES &res) { - if (external_resources.has(res)) { - return "ExtResource( " + itos(external_resources[res]) + " )"; } else { - if (internal_resources.has(res)) { return "SubResource( " + itos(internal_resources[res]) + " )"; } else if (res->get_path().length() && res->get_path().find("::") == -1) { @@ -1464,14 +1404,13 @@ String ResourceFormatSaverTextInstance::_write_resource(const RES &res) { } void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant, bool p_main) { - switch (p_variant.get_type()) { case Variant::OBJECT: { - RES res = p_variant; - if (res.is_null() || external_resources.has(res)) + if (res.is_null() || external_resources.has(res)) { return; + } if (!p_main && (!bundle_resources) && res->get_path().length() && res->get_path().find("::") == -1) { if (res->get_path() == local_path) { @@ -1483,8 +1422,9 @@ void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant, return; } - if (resource_set.has(res)) + if (resource_set.has(res)) { return; + } List<PropertyInfo> property_list; @@ -1494,11 +1434,9 @@ void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant, List<PropertyInfo>::Element *I = property_list.front(); while (I) { - PropertyInfo pi = I->get(); if (pi.usage & PROPERTY_USAGE_STORAGE) { - Variant v = res->get(I->get().name); if (pi.usage & PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT) { @@ -1524,23 +1462,19 @@ void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant, } break; case Variant::ARRAY: { - Array varray = p_variant; int len = varray.size(); for (int i = 0; i < len; i++) { - const Variant &v = varray.get(i); _find_resources(v); } } break; case Variant::DICTIONARY: { - Dictionary d = p_variant; List<Variant> keys; d.get_key_list(&keys); for (List<Variant>::Element *E = keys.front(); E; E = E->next()) { - Variant v = d[E->get()]; _find_resources(v); } @@ -1551,7 +1485,6 @@ void ResourceFormatSaverTextInstance::_find_resources(const Variant &p_variant, } Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_resource, uint32_t p_flags) { - if (p_path.ends_with(".tscn")) { packed_scene = p_resource; } @@ -1577,8 +1510,9 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r if (packed_scene.is_valid()) { //add instances to external resources if saving a packed scene for (int i = 0; i < packed_scene->get_state()->get_node_count(); i++) { - if (packed_scene->get_state()->is_node_instance_placeholder(i)) + if (packed_scene->get_state()->is_node_instance_placeholder(i)) { continue; + } Ref<PackedScene> instance = packed_scene->get_state()->get_node_instance(i); if (instance.is_valid() && !external_resources.has(instance)) { @@ -1590,8 +1524,9 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r { String title = packed_scene.is_valid() ? "[gd_scene " : "[gd_resource "; - if (packed_scene.is_null()) + if (packed_scene.is_null()) { title += "type=\"" + p_resource->get_class() + "\" "; + } int load_steps = saved_resources.size() + external_resources.size(); /* if (packed_scene.is_valid()) { @@ -1648,7 +1583,6 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r Vector<ResourceSort> sorted_er; for (Map<RES, int>::Element *E = external_resources.front(); E; E = E->next()) { - ResourceSort rs; rs.resource = E->key(); rs.index = E->get(); @@ -1663,16 +1597,15 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r f->store_string("[ext_resource path=\"" + p + "\" type=\"" + sorted_er[i].resource->get_save_class() + "\" id=" + itos(sorted_er[i].index) + "]\n"); //bundled } - if (external_resources.size()) + if (external_resources.size()) { f->store_line(String()); //separate + } Set<int> used_indices; for (List<RES>::Element *E = saved_resources.front(); E; E = E->next()) { - RES res = E->get(); if (E->next() && (res->get_path() == "" || res->get_path().find("::") != -1)) { - if (res->get_subindex() != 0) { if (used_indices.has(res->get_subindex())) { res->set_subindex(0); //repeated @@ -1684,13 +1617,13 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r } for (List<RES>::Element *E = saved_resources.front(); E; E = E->next()) { - RES res = E->get(); ERR_CONTINUE(!resource_set.has(res)); bool main = (E->next() == nullptr); - if (main && packed_scene.is_valid()) + if (main && packed_scene.is_valid()) { break; //save as a scene + } if (main) { f->store_line("[resource]"); @@ -1723,12 +1656,11 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r res->get_property_list(&property_list); //property_list.sort(); for (List<PropertyInfo>::Element *PE = property_list.front(); PE; PE = PE->next()) { - - if (skip_editor && PE->get().name.begins_with("__editor")) + if (skip_editor && PE->get().name.begins_with("__editor")) { continue; + } if (PE->get().usage & PROPERTY_USAGE_STORAGE) { - String name = PE->get().name; Variant value; if (PE->get().usage & PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT) { @@ -1747,8 +1679,9 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r continue; } - if (PE->get().type == Variant::OBJECT && value.is_zero() && !(PE->get().usage & PROPERTY_USAGE_STORE_IF_NULL)) + if (PE->get().type == Variant::OBJECT && value.is_zero() && !(PE->get().usage & PROPERTY_USAGE_STORE_IF_NULL)) { continue; + } String vars; VariantWriter::write_to_string(value, vars, _write_resources, this); @@ -1756,15 +1689,15 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r } } - if (E->next()) + if (E->next()) { f->store_line(String()); + } } if (packed_scene.is_valid()) { //if this is a scene, save nodes and connections! Ref<SceneState> state = packed_scene->get_state(); for (int i = 0; i < state->get_node_count(); i++) { - StringName type = state->get_node_type(i); StringName name = state->get_node_name(i); int index = state->get_node_index(i); @@ -1802,7 +1735,6 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r f->store_string(header); if (instance_placeholder != String()) { - String vars; f->store_string(" instance_placeholder="); VariantWriter::write_to_string(instance_placeholder, vars, _write_resources, this); @@ -1810,7 +1742,6 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r } if (instance.is_valid()) { - String vars; f->store_string(" instance="); VariantWriter::write_to_string(instance, vars, _write_resources, this); @@ -1820,19 +1751,18 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r f->store_line("]"); for (int j = 0; j < state->get_node_property_count(i); j++) { - String vars; VariantWriter::write_to_string(state->get_node_property_value(i, j), vars, _write_resources, this); f->store_string(String(state->get_node_property_name(i, j)).property_name_encode() + " = " + vars + "\n"); } - if (i < state->get_node_count() - 1) + if (i < state->get_node_count() - 1) { f->store_line(String()); + } } for (int i = 0; i < state->get_connection_count(); i++) { - String connstr = "[connection"; connstr += " signal=\"" + String(state->get_connection_signal(i)) + "\""; connstr += " from=\"" + String(state->get_connection_source(i).simplified()) + "\""; @@ -1872,7 +1802,6 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r } Error ResourceFormatSaverText::save(const String &p_path, const RES &p_resource, uint32_t p_flags) { - if (p_path.ends_with(".sct") && p_resource->get_class() != "PackedScene") { return ERR_FILE_UNRECOGNIZED; } @@ -1882,15 +1811,15 @@ Error ResourceFormatSaverText::save(const String &p_path, const RES &p_resource, } bool ResourceFormatSaverText::recognize(const RES &p_resource) const { - return true; // all recognized! } -void ResourceFormatSaverText::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const { - if (p_resource->get_class() == "PackedScene") +void ResourceFormatSaverText::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const { + if (p_resource->get_class() == "PackedScene") { p_extensions->push_back("tscn"); //text scene - else + } else { p_extensions->push_back("tres"); //text resource + } } ResourceFormatSaverText *ResourceFormatSaverText::singleton = nullptr; diff --git a/scene/resources/resource_format_text.h b/scene/resources/resource_format_text.h index b9a6db5f36..cf522c9364 100644 --- a/scene/resources/resource_format_text.h +++ b/scene/resources/resource_format_text.h @@ -38,7 +38,6 @@ #include "scene/resources/packed_scene.h" class ResourceLoaderText { - bool translation_remapped; String local_path; String res_path; @@ -92,7 +91,6 @@ class ResourceLoaderText { }; struct DummyReadData { - Map<RES, int> external_resources; Map<int, RES> rev_external_resources; Set<RES> resource_set; @@ -150,7 +148,6 @@ public: }; class ResourceFormatSaverTextInstance { - String local_path; Ref<PackedScene> packed_scene; diff --git a/scene/resources/segment_shape_2d.cpp b/scene/resources/segment_shape_2d.cpp index 814c349784..7b409eebbb 100644 --- a/scene/resources/segment_shape_2d.cpp +++ b/scene/resources/segment_shape_2d.cpp @@ -34,14 +34,12 @@ #include "servers/rendering_server.h" bool SegmentShape2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - Vector2 l[2] = { a, b }; Vector2 closest = Geometry::get_closest_point_to_segment_2d(p_point, l); return p_point.distance_to(closest) < p_tolerance; } void SegmentShape2D::_update_shape() { - Rect2 r; r.position = a; r.size = b; @@ -50,32 +48,28 @@ void SegmentShape2D::_update_shape() { } void SegmentShape2D::set_a(const Vector2 &p_a) { - a = p_a; _update_shape(); } -Vector2 SegmentShape2D::get_a() const { +Vector2 SegmentShape2D::get_a() const { return a; } void SegmentShape2D::set_b(const Vector2 &p_b) { - b = p_b; _update_shape(); } -Vector2 SegmentShape2D::get_b() const { +Vector2 SegmentShape2D::get_b() const { return b; } void SegmentShape2D::draw(const RID &p_to_rid, const Color &p_color) { - RenderingServer::get_singleton()->canvas_item_add_line(p_to_rid, a, b, p_color, 3); } Rect2 SegmentShape2D::get_rect() const { - Rect2 rect; rect.position = a; rect.expand_to(b); @@ -87,7 +81,6 @@ real_t SegmentShape2D::get_enclosing_radius() const { } void SegmentShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_a", "a"), &SegmentShape2D::set_a); ClassDB::bind_method(D_METHOD("get_a"), &SegmentShape2D::get_a); @@ -100,7 +93,6 @@ void SegmentShape2D::_bind_methods() { SegmentShape2D::SegmentShape2D() : Shape2D(PhysicsServer2D::get_singleton()->segment_shape_create()) { - a = Vector2(); b = Vector2(0, 10); _update_shape(); @@ -109,7 +101,6 @@ SegmentShape2D::SegmentShape2D() : //////////////////////////////////////////////////////////// void RayShape2D::_update_shape() { - Dictionary d; d["length"] = length; d["slips_on_slope"] = slips_on_slope; @@ -118,7 +109,6 @@ void RayShape2D::_update_shape() { } void RayShape2D::draw(const RID &p_to_rid, const Color &p_color) { - Vector2 tip = Vector2(0, get_length()); RS::get_singleton()->canvas_item_add_line(p_to_rid, Vector2(), tip, p_color, 3); Vector<Vector2> pts; @@ -127,14 +117,14 @@ void RayShape2D::draw(const RID &p_to_rid, const Color &p_color) { pts.push_back(tip + Vector2(Math_SQRT12 * tsize, 0)); pts.push_back(tip + Vector2(-Math_SQRT12 * tsize, 0)); Vector<Color> cols; - for (int i = 0; i < 3; i++) + for (int i = 0; i < 3; i++) { cols.push_back(p_color); + } RS::get_singleton()->canvas_item_add_primitive(p_to_rid, pts, cols, Vector<Point2>(), RID()); } Rect2 RayShape2D::get_rect() const { - Rect2 rect; rect.position = Vector2(); rect.expand_to(Vector2(0, length)); @@ -147,7 +137,6 @@ real_t RayShape2D::get_enclosing_radius() const { } void RayShape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_length", "length"), &RayShape2D::set_length); ClassDB::bind_method(D_METHOD("get_length"), &RayShape2D::get_length); @@ -159,17 +148,15 @@ void RayShape2D::_bind_methods() { } void RayShape2D::set_length(real_t p_length) { - length = p_length; _update_shape(); } -real_t RayShape2D::get_length() const { +real_t RayShape2D::get_length() const { return length; } void RayShape2D::set_slips_on_slope(bool p_active) { - slips_on_slope = p_active; _update_shape(); } @@ -180,7 +167,6 @@ bool RayShape2D::get_slips_on_slope() const { RayShape2D::RayShape2D() : Shape2D(PhysicsServer2D::get_singleton()->ray_shape_create()) { - length = 20; slips_on_slope = false; _update_shape(); diff --git a/scene/resources/shader.cpp b/scene/resources/shader.cpp index 1ac2f7c3c9..4ca8032d65 100644 --- a/scene/resources/shader.cpp +++ b/scene/resources/shader.cpp @@ -36,12 +36,10 @@ #include "texture.h" Shader::Mode Shader::get_mode() const { - return mode; } void Shader::set_code(const String &p_code) { - String type = ShaderLanguage::get_shader_type(p_code); if (type == "canvas_item") { @@ -61,13 +59,11 @@ void Shader::set_code(const String &p_code) { } String Shader::get_code() const { - _update_shader(); return RenderingServer::get_singleton()->shader_get_code(shader); } void Shader::get_param_list(List<PropertyInfo> *p_params) const { - _update_shader(); List<PropertyInfo> local; @@ -76,7 +72,6 @@ void Shader::get_param_list(List<PropertyInfo> *p_params) const { params_cache_dirty = false; for (List<PropertyInfo>::Element *E = local.front(); E; E = E->next()) { - PropertyInfo pi = E->get(); if (default_textures.has(pi.name)) { //do not show default textures continue; @@ -84,24 +79,22 @@ void Shader::get_param_list(List<PropertyInfo> *p_params) const { pi.name = "shader_param/" + pi.name; params_cache[pi.name] = E->get().name; if (p_params) { - //small little hack - if (pi.type == Variant::_RID) + if (pi.type == Variant::_RID) { pi.type = Variant::OBJECT; + } p_params->push_back(pi); } } } RID Shader::get_rid() const { - _update_shader(); return shader; } void Shader::set_default_texture_param(const StringName &p_param, const Ref<Texture2D> &p_texture) { - if (p_texture.is_valid()) { default_textures[p_param] = p_texture; RS::get_singleton()->shader_set_default_texture_param(shader, p_param, p_texture->get_rid()); @@ -114,17 +107,15 @@ void Shader::set_default_texture_param(const StringName &p_param, const Ref<Text } Ref<Texture2D> Shader::get_default_texture_param(const StringName &p_param) const { - - if (default_textures.has(p_param)) + if (default_textures.has(p_param)) { return default_textures[p_param]; - else + } else { return Ref<Texture2D>(); + } } void Shader::get_default_texture_param_list(List<StringName> *r_textures) const { - for (const Map<StringName, Ref<Texture2D>>::Element *E = default_textures.front(); E; E = E->next()) { - r_textures->push_back(E->key()); } } @@ -134,7 +125,6 @@ bool Shader::is_text_shader() const { } bool Shader::has_param(const StringName &p_param) const { - return params_cache.has(p_param); } @@ -142,7 +132,6 @@ void Shader::_update_shader() const { } void Shader::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_mode"), &Shader::get_mode); ClassDB::bind_method(D_METHOD("set_code", "code"), &Shader::set_code); @@ -164,22 +153,21 @@ void Shader::_bind_methods() { } Shader::Shader() { - mode = MODE_SPATIAL; shader = RenderingServer::get_singleton()->shader_create(); params_cache_dirty = true; } Shader::~Shader() { - RenderingServer::get_singleton()->free(shader); } + //////////// RES ResourceFormatLoaderShader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { - - if (r_error) + if (r_error) { *r_error = ERR_FILE_CANT_OPEN; + } Ref<Shader> shader; shader.instance(); @@ -191,32 +179,30 @@ RES ResourceFormatLoaderShader::load(const String &p_path, const String &p_origi shader->set_code(str); - if (r_error) + if (r_error) { *r_error = OK; + } return shader; } void ResourceFormatLoaderShader::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back("shader"); } bool ResourceFormatLoaderShader::handles_type(const String &p_type) const { - return (p_type == "Shader"); } String ResourceFormatLoaderShader::get_resource_type(const String &p_path) const { - String el = p_path.get_extension().to_lower(); - if (el == "shader") + if (el == "shader") { return "Shader"; + } return ""; } Error ResourceFormatSaverShader::save(const String &p_path, const RES &p_resource, uint32_t p_flags) { - Ref<Shader> shader = p_resource; ERR_FAIL_COND_V(shader.is_null(), ERR_INVALID_PARAMETER); @@ -239,14 +225,13 @@ Error ResourceFormatSaverShader::save(const String &p_path, const RES &p_resourc } void ResourceFormatSaverShader::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const { - if (const Shader *shader = Object::cast_to<Shader>(*p_resource)) { if (shader->is_text_shader()) { p_extensions->push_back("shader"); } } } -bool ResourceFormatSaverShader::recognize(const RES &p_resource) const { +bool ResourceFormatSaverShader::recognize(const RES &p_resource) const { return p_resource->get_class_name() == "Shader"; //only shader, not inherited } diff --git a/scene/resources/shader.h b/scene/resources/shader.h index 75c38bd561..2cdc2ec93f 100644 --- a/scene/resources/shader.h +++ b/scene/resources/shader.h @@ -37,7 +37,6 @@ #include "scene/resources/texture.h" class Shader : public Resource { - GDCLASS(Shader, Resource); OBJ_SAVE_TYPE(Shader); @@ -83,12 +82,14 @@ public: virtual bool is_text_shader() const; _FORCE_INLINE_ StringName remap_param(const StringName &p_param) const { - if (params_cache_dirty) + if (params_cache_dirty) { get_param_list(nullptr); + } const Map<StringName, StringName>::Element *E = params_cache.find(p_param); - if (E) + if (E) { return E->get(); + } return StringName(); } diff --git a/scene/resources/shape_2d.cpp b/scene/resources/shape_2d.cpp index 4fe585053a..99e8020e34 100644 --- a/scene/resources/shape_2d.cpp +++ b/scene/resources/shape_2d.cpp @@ -31,23 +31,19 @@ #include "shape_2d.h" #include "servers/physics_server_2d.h" RID Shape2D::get_rid() const { - return shape; } void Shape2D::set_custom_solver_bias(real_t p_bias) { - custom_bias = p_bias; PhysicsServer2D::get_singleton()->shape_set_custom_solver_bias(shape, custom_bias); } real_t Shape2D::get_custom_solver_bias() const { - return custom_bias; } bool Shape2D::collide_with_motion(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion) { - ERR_FAIL_COND_V(p_shape.is_null(), false); int r; return PhysicsServer2D::get_singleton()->shape_collide(get_rid(), p_local_xform, p_local_motion, p_shape->get_rid(), p_shape_xform, p_shape_motion, nullptr, 0, r); @@ -60,14 +56,14 @@ bool Shape2D::collide(const Transform2D &p_local_xform, const Ref<Shape2D> &p_sh } Array Shape2D::collide_with_motion_and_get_contacts(const Transform2D &p_local_xform, const Vector2 &p_local_motion, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform, const Vector2 &p_shape_motion) { - ERR_FAIL_COND_V(p_shape.is_null(), Array()); const int max_contacts = 16; Vector2 result[max_contacts * 2]; int contacts = 0; - if (!PhysicsServer2D::get_singleton()->shape_collide(get_rid(), p_local_xform, p_local_motion, p_shape->get_rid(), p_shape_xform, p_shape_motion, result, max_contacts, contacts)) + if (!PhysicsServer2D::get_singleton()->shape_collide(get_rid(), p_local_xform, p_local_motion, p_shape->get_rid(), p_shape_xform, p_shape_motion, result, max_contacts, contacts)) { return Array(); + } Array results; results.resize(contacts * 2); @@ -77,15 +73,16 @@ Array Shape2D::collide_with_motion_and_get_contacts(const Transform2D &p_local_x return results; } -Array Shape2D::collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform) { +Array Shape2D::collide_and_get_contacts(const Transform2D &p_local_xform, const Ref<Shape2D> &p_shape, const Transform2D &p_shape_xform) { ERR_FAIL_COND_V(p_shape.is_null(), Array()); const int max_contacts = 16; Vector2 result[max_contacts * 2]; int contacts = 0; - if (!PhysicsServer2D::get_singleton()->shape_collide(get_rid(), p_local_xform, Vector2(), p_shape->get_rid(), p_shape_xform, Vector2(), result, max_contacts, contacts)) + if (!PhysicsServer2D::get_singleton()->shape_collide(get_rid(), p_local_xform, Vector2(), p_shape->get_rid(), p_shape_xform, Vector2(), result, max_contacts, contacts)) { return Array(); + } Array results; results.resize(contacts * 2); @@ -97,7 +94,6 @@ Array Shape2D::collide_and_get_contacts(const Transform2D &p_local_xform, const } void Shape2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_custom_solver_bias", "bias"), &Shape2D::set_custom_solver_bias); ClassDB::bind_method(D_METHOD("get_custom_solver_bias"), &Shape2D::get_custom_solver_bias); ClassDB::bind_method(D_METHOD("collide", "local_xform", "with_shape", "shape_xform"), &Shape2D::collide); @@ -114,6 +110,5 @@ Shape2D::Shape2D(const RID &p_rid) { } Shape2D::~Shape2D() { - PhysicsServer2D::get_singleton()->free(shape); } diff --git a/scene/resources/shape_3d.cpp b/scene/resources/shape_3d.cpp index 97d03b3cfc..59766f4f1f 100644 --- a/scene/resources/shape_3d.cpp +++ b/scene/resources/shape_3d.cpp @@ -36,11 +36,9 @@ #include "servers/physics_server_3d.h" void Shape3D::add_vertices_to_array(Vector<Vector3> &array, const Transform &p_xform) { - Vector<Vector3> toadd = get_debug_mesh_lines(); if (toadd.size()) { - int base = array.size(); array.resize(base + toadd.size()); Vector3 *w = array.ptrw(); @@ -60,9 +58,9 @@ void Shape3D::set_margin(real_t p_margin) { } Ref<ArrayMesh> Shape3D::get_debug_mesh() { - - if (debug_mesh_cache.is_valid()) + if (debug_mesh_cache.is_valid()) { return debug_mesh_cache; + } Vector<Vector3> lines = get_debug_mesh_lines(); @@ -73,7 +71,6 @@ Ref<ArrayMesh> Shape3D::get_debug_mesh() { Vector<Vector3> array; array.resize(lines.size()); { - Vector3 *w = array.ptrw(); for (int i = 0; i < lines.size(); i++) { w[i] = lines[i]; @@ -102,7 +99,6 @@ void Shape3D::_update_shape() { } void Shape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_margin", "margin"), &Shape3D::set_margin); ClassDB::bind_method(D_METHOD("get_margin"), &Shape3D::get_margin); diff --git a/scene/resources/shape_3d.h b/scene/resources/shape_3d.h index 6516868fd5..a83b2ed009 100644 --- a/scene/resources/shape_3d.h +++ b/scene/resources/shape_3d.h @@ -36,7 +36,6 @@ class ArrayMesh; class Shape3D : public Resource { - GDCLASS(Shape3D, Resource); OBJ_SAVE_TYPE(Shape3D); RES_BASE_EXTENSION("shape"); diff --git a/scene/resources/skin.cpp b/scene/resources/skin.cpp index df0620b6c4..e88841a531 100644 --- a/scene/resources/skin.cpp +++ b/scene/resources/skin.cpp @@ -46,7 +46,6 @@ void Skin::add_bind(int p_bone, const Transform &p_pose) { } void Skin::add_named_bind(const String &p_name, const Transform &p_pose) { - uint32_t index = bind_count; set_bind_count(bind_count + 1); set_bind_name(index, p_name); @@ -105,7 +104,6 @@ bool Skin::_set(const StringName &p_name, const Variant &p_value) { } bool Skin::_get(const StringName &p_name, Variant &r_ret) const { - String name = p_name; if (name == "bind_count") { r_ret = get_bind_count(); @@ -126,6 +124,7 @@ bool Skin::_get(const StringName &p_name, Variant &r_ret) const { } return false; } + void Skin::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::INT, "bind_count", PROPERTY_HINT_RANGE, "0,16384,1,or_greater")); for (int i = 0; i < get_bind_count(); i++) { @@ -136,7 +135,6 @@ void Skin::_get_property_list(List<PropertyInfo> *p_list) const { } void Skin::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_bind_count", "bind_count"), &Skin::set_bind_count); ClassDB::bind_method(D_METHOD("get_bind_count"), &Skin::get_bind_count); diff --git a/scene/resources/sky.cpp b/scene/resources/sky.cpp index cbe86b16b2..54b6cde8bd 100644 --- a/scene/resources/sky.cpp +++ b/scene/resources/sky.cpp @@ -43,7 +43,6 @@ void Sky::set_radiance_size(RadianceSize p_size) { } Sky::RadianceSize Sky::get_radiance_size() const { - return radiance_size; } @@ -59,8 +58,9 @@ Sky::ProcessMode Sky::get_process_mode() const { void Sky::set_material(const Ref<Material> &p_material) { sky_material = p_material; RID material_rid; - if (sky_material.is_valid()) + if (sky_material.is_valid()) { material_rid = sky_material->get_rid(); + } RS::get_singleton()->sky_set_material(sky, material_rid); } @@ -69,12 +69,10 @@ Ref<Material> Sky::get_material() const { } RID Sky::get_rid() const { - return sky; } void Sky::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_radiance_size", "size"), &Sky::set_radiance_size); ClassDB::bind_method(D_METHOD("get_radiance_size"), &Sky::get_radiance_size); @@ -108,6 +106,5 @@ Sky::Sky() { } Sky::~Sky() { - RS::get_singleton()->free(sky); }
\ No newline at end of file diff --git a/scene/resources/sky_material.cpp b/scene/resources/sky_material.cpp index a0b6ab1e30..92c5151d7a 100644 --- a/scene/resources/sky_material.cpp +++ b/scene/resources/sky_material.cpp @@ -31,103 +31,92 @@ #include "sky_material.h" void ProceduralSkyMaterial::set_sky_top_color(const Color &p_sky_top) { - sky_top_color = p_sky_top; RS::get_singleton()->material_set_param(_get_material(), "sky_top_color", sky_top_color.to_linear()); } Color ProceduralSkyMaterial::get_sky_top_color() const { - return sky_top_color; } void ProceduralSkyMaterial::set_sky_horizon_color(const Color &p_sky_horizon) { - sky_horizon_color = p_sky_horizon; RS::get_singleton()->material_set_param(_get_material(), "sky_horizon_color", sky_horizon_color.to_linear()); } -Color ProceduralSkyMaterial::get_sky_horizon_color() const { +Color ProceduralSkyMaterial::get_sky_horizon_color() const { return sky_horizon_color; } void ProceduralSkyMaterial::set_sky_curve(float p_curve) { - sky_curve = p_curve; RS::get_singleton()->material_set_param(_get_material(), "sky_curve", sky_curve); } -float ProceduralSkyMaterial::get_sky_curve() const { +float ProceduralSkyMaterial::get_sky_curve() const { return sky_curve; } void ProceduralSkyMaterial::set_sky_energy(float p_energy) { - sky_energy = p_energy; RS::get_singleton()->material_set_param(_get_material(), "sky_energy", sky_energy); } -float ProceduralSkyMaterial::get_sky_energy() const { +float ProceduralSkyMaterial::get_sky_energy() const { return sky_energy; } void ProceduralSkyMaterial::set_ground_bottom_color(const Color &p_ground_bottom) { - ground_bottom_color = p_ground_bottom; RS::get_singleton()->material_set_param(_get_material(), "ground_bottom_color", ground_bottom_color.to_linear()); } -Color ProceduralSkyMaterial::get_ground_bottom_color() const { +Color ProceduralSkyMaterial::get_ground_bottom_color() const { return ground_bottom_color; } void ProceduralSkyMaterial::set_ground_horizon_color(const Color &p_ground_horizon) { - ground_horizon_color = p_ground_horizon; RS::get_singleton()->material_set_param(_get_material(), "ground_horizon_color", ground_horizon_color.to_linear()); } -Color ProceduralSkyMaterial::get_ground_horizon_color() const { +Color ProceduralSkyMaterial::get_ground_horizon_color() const { return ground_horizon_color; } void ProceduralSkyMaterial::set_ground_curve(float p_curve) { - ground_curve = p_curve; RS::get_singleton()->material_set_param(_get_material(), "ground_curve", ground_curve); } -float ProceduralSkyMaterial::get_ground_curve() const { +float ProceduralSkyMaterial::get_ground_curve() const { return ground_curve; } void ProceduralSkyMaterial::set_ground_energy(float p_energy) { - ground_energy = p_energy; RS::get_singleton()->material_set_param(_get_material(), "ground_energy", ground_energy); } -float ProceduralSkyMaterial::get_ground_energy() const { +float ProceduralSkyMaterial::get_ground_energy() const { return ground_energy; } void ProceduralSkyMaterial::set_sun_angle_max(float p_angle) { - sun_angle_max = p_angle; RS::get_singleton()->material_set_param(_get_material(), "sun_angle_max", Math::deg2rad(sun_angle_max)); } -float ProceduralSkyMaterial::get_sun_angle_max() const { +float ProceduralSkyMaterial::get_sun_angle_max() const { return sun_angle_max; } void ProceduralSkyMaterial::set_sun_curve(float p_curve) { - sun_curve = p_curve; RS::get_singleton()->material_set_param(_get_material(), "sun_curve", sun_curve); } -float ProceduralSkyMaterial::get_sun_curve() const { +float ProceduralSkyMaterial::get_sun_curve() const { return sun_curve; } @@ -136,17 +125,14 @@ bool ProceduralSkyMaterial::_can_do_next_pass() const { } Shader::Mode ProceduralSkyMaterial::get_shader_mode() const { - return Shader::MODE_SKY; } RID ProceduralSkyMaterial::get_shader_rid() const { - return shader; } void ProceduralSkyMaterial::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_sky_top_color", "color"), &ProceduralSkyMaterial::set_sky_top_color); ClassDB::bind_method(D_METHOD("get_sky_top_color"), &ProceduralSkyMaterial::get_sky_top_color); @@ -195,7 +181,6 @@ void ProceduralSkyMaterial::_bind_methods() { } ProceduralSkyMaterial::ProceduralSkyMaterial() { - String code = "shader_type sky;\n\n"; code += "uniform vec4 sky_top_color : hint_color = vec4(0.35, 0.46, 0.71, 1.0);\n"; @@ -285,13 +270,11 @@ ProceduralSkyMaterial::~ProceduralSkyMaterial() { /* PanoramaSkyMaterial */ void PanoramaSkyMaterial::set_panorama(const Ref<Texture2D> &p_panorama) { - panorama = p_panorama; RS::get_singleton()->material_set_param(_get_material(), "source_panorama", panorama); } Ref<Texture2D> PanoramaSkyMaterial::get_panorama() const { - return panorama; } @@ -300,17 +283,14 @@ bool PanoramaSkyMaterial::_can_do_next_pass() const { } Shader::Mode PanoramaSkyMaterial::get_shader_mode() const { - return Shader::MODE_SKY; } RID PanoramaSkyMaterial::get_shader_rid() const { - return shader; } void PanoramaSkyMaterial::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_panorama", "texture"), &PanoramaSkyMaterial::set_panorama); ClassDB::bind_method(D_METHOD("get_panorama"), &PanoramaSkyMaterial::get_panorama); @@ -336,105 +316,97 @@ PanoramaSkyMaterial::~PanoramaSkyMaterial() { RS::get_singleton()->free(shader); RS::get_singleton()->material_set_shader(_get_material(), RID()); } + ////////////////////////////////// /* PhysicalSkyMaterial */ void PhysicalSkyMaterial::set_rayleigh_coefficient(float p_rayleigh) { - rayleigh = p_rayleigh; RS::get_singleton()->material_set_param(_get_material(), "rayleigh", rayleigh); } -float PhysicalSkyMaterial::get_rayleigh_coefficient() const { +float PhysicalSkyMaterial::get_rayleigh_coefficient() const { return rayleigh; } void PhysicalSkyMaterial::set_rayleigh_color(Color p_rayleigh_color) { - rayleigh_color = p_rayleigh_color; RS::get_singleton()->material_set_param(_get_material(), "rayleigh_color", rayleigh_color); } -Color PhysicalSkyMaterial::get_rayleigh_color() const { +Color PhysicalSkyMaterial::get_rayleigh_color() const { return rayleigh_color; } void PhysicalSkyMaterial::set_mie_coefficient(float p_mie) { - mie = p_mie; RS::get_singleton()->material_set_param(_get_material(), "mie", mie); } -float PhysicalSkyMaterial::get_mie_coefficient() const { +float PhysicalSkyMaterial::get_mie_coefficient() const { return mie; } void PhysicalSkyMaterial::set_mie_eccentricity(float p_eccentricity) { - mie_eccentricity = p_eccentricity; RS::get_singleton()->material_set_param(_get_material(), "mie_eccentricity", mie_eccentricity); } -float PhysicalSkyMaterial::get_mie_eccentricity() const { +float PhysicalSkyMaterial::get_mie_eccentricity() const { return mie_eccentricity; } void PhysicalSkyMaterial::set_mie_color(Color p_mie_color) { - mie_color = p_mie_color; RS::get_singleton()->material_set_param(_get_material(), "mie_color", mie_color); } + Color PhysicalSkyMaterial::get_mie_color() const { return mie_color; } void PhysicalSkyMaterial::set_turbidity(float p_turbidity) { - turbidity = p_turbidity; RS::get_singleton()->material_set_param(_get_material(), "turbidity", turbidity); } -float PhysicalSkyMaterial::get_turbidity() const { +float PhysicalSkyMaterial::get_turbidity() const { return turbidity; } void PhysicalSkyMaterial::set_sun_disk_scale(float p_sun_disk_scale) { - sun_disk_scale = p_sun_disk_scale; RS::get_singleton()->material_set_param(_get_material(), "sun_disk_scale", sun_disk_scale); } -float PhysicalSkyMaterial::get_sun_disk_scale() const { +float PhysicalSkyMaterial::get_sun_disk_scale() const { return sun_disk_scale; } void PhysicalSkyMaterial::set_ground_color(Color p_ground_color) { - ground_color = p_ground_color; RS::get_singleton()->material_set_param(_get_material(), "ground_color", ground_color); } -Color PhysicalSkyMaterial::get_ground_color() const { +Color PhysicalSkyMaterial::get_ground_color() const { return ground_color; } void PhysicalSkyMaterial::set_exposure(float p_exposure) { - exposure = p_exposure; RS::get_singleton()->material_set_param(_get_material(), "exposure", exposure); } -float PhysicalSkyMaterial::get_exposure() const { +float PhysicalSkyMaterial::get_exposure() const { return exposure; } void PhysicalSkyMaterial::set_dither_strength(float p_dither_strength) { - dither_strength = p_dither_strength; RS::get_singleton()->material_set_param(_get_material(), "dither_strength", dither_strength); } -float PhysicalSkyMaterial::get_dither_strength() const { +float PhysicalSkyMaterial::get_dither_strength() const { return dither_strength; } @@ -443,17 +415,14 @@ bool PhysicalSkyMaterial::_can_do_next_pass() const { } Shader::Mode PhysicalSkyMaterial::get_shader_mode() const { - return Shader::MODE_SKY; } RID PhysicalSkyMaterial::get_shader_rid() const { - return shader; } void PhysicalSkyMaterial::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_rayleigh_coefficient", "rayleigh"), &PhysicalSkyMaterial::set_rayleigh_coefficient); ClassDB::bind_method(D_METHOD("get_rayleigh_coefficient"), &PhysicalSkyMaterial::get_rayleigh_coefficient); diff --git a/scene/resources/sky_material.h b/scene/resources/sky_material.h index 9bd9d7ec8b..cd245a2897 100644 --- a/scene/resources/sky_material.h +++ b/scene/resources/sky_material.h @@ -35,7 +35,6 @@ #define SKY_MATERIAL_H class ProceduralSkyMaterial : public Material { - GDCLASS(ProceduralSkyMaterial, Material); private: diff --git a/scene/resources/sphere_shape_3d.cpp b/scene/resources/sphere_shape_3d.cpp index 153db4c291..d24998ff18 100644 --- a/scene/resources/sphere_shape_3d.cpp +++ b/scene/resources/sphere_shape_3d.cpp @@ -32,13 +32,11 @@ #include "servers/physics_server_3d.h" Vector<Vector3> SphereShape3D::get_debug_mesh_lines() { - float r = get_radius(); Vector<Vector3> points; for (int i = 0; i <= 360; i++) { - float ra = Math::deg2rad((float)i); float rb = Math::deg2rad((float)i + 1); Point2 a = Vector2(Math::sin(ra), Math::cos(ra)) * r; @@ -60,13 +58,11 @@ real_t SphereShape3D::get_enclosing_radius() const { } void SphereShape3D::_update_shape() { - PhysicsServer3D::get_singleton()->shape_set_data(get_shape(), radius); Shape3D::_update_shape(); } void SphereShape3D::set_radius(float p_radius) { - radius = p_radius; _update_shape(); notify_change_to_owners(); @@ -74,12 +70,10 @@ void SphereShape3D::set_radius(float p_radius) { } float SphereShape3D::get_radius() const { - return radius; } void SphereShape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_radius", "radius"), &SphereShape3D::set_radius); ClassDB::bind_method(D_METHOD("get_radius"), &SphereShape3D::get_radius); @@ -88,6 +82,5 @@ void SphereShape3D::_bind_methods() { SphereShape3D::SphereShape3D() : Shape3D(PhysicsServer3D::get_singleton()->shape_create(PhysicsServer3D::SHAPE_SPHERE)) { - set_radius(1.0); } diff --git a/scene/resources/sphere_shape_3d.h b/scene/resources/sphere_shape_3d.h index 3ed50cfe83..ee31bb615c 100644 --- a/scene/resources/sphere_shape_3d.h +++ b/scene/resources/sphere_shape_3d.h @@ -34,7 +34,6 @@ #include "scene/resources/shape_3d.h" class SphereShape3D : public Shape3D { - GDCLASS(SphereShape3D, Shape3D); float radius; diff --git a/scene/resources/style_box.cpp b/scene/resources/style_box.cpp index 56fb5d441f..eb65f10ec9 100644 --- a/scene/resources/style_box.cpp +++ b/scene/resources/style_box.cpp @@ -35,32 +35,30 @@ #include <limits.h> bool StyleBox::test_mask(const Point2 &p_point, const Rect2 &p_rect) const { - return true; } void StyleBox::set_default_margin(Margin p_margin, float p_value) { - ERR_FAIL_INDEX((int)p_margin, 4); margin[p_margin] = p_value; emit_changed(); } -float StyleBox::get_default_margin(Margin p_margin) const { +float StyleBox::get_default_margin(Margin p_margin) const { ERR_FAIL_INDEX_V((int)p_margin, 4, 0.0); return margin[p_margin]; } float StyleBox::get_margin(Margin p_margin) const { - ERR_FAIL_INDEX_V((int)p_margin, 4, 0.0); - if (margin[p_margin] < 0) + if (margin[p_margin] < 0) { return get_style_margin(p_margin); - else + } else { return margin[p_margin]; + } } CanvasItem *StyleBox::get_current_item_drawn() const { @@ -68,17 +66,14 @@ CanvasItem *StyleBox::get_current_item_drawn() const { } Size2 StyleBox::get_minimum_size() const { - return Size2(get_margin(MARGIN_LEFT) + get_margin(MARGIN_RIGHT), get_margin(MARGIN_TOP) + get_margin(MARGIN_BOTTOM)); } Point2 StyleBox::get_offset() const { - return Point2(get_margin(MARGIN_LEFT), get_margin(MARGIN_TOP)); } Size2 StyleBox::get_center_size() const { - return Size2(); } @@ -87,7 +82,6 @@ Rect2 StyleBox::get_draw_rect(const Rect2 &p_rect) const { } void StyleBox::_bind_methods() { - ClassDB::bind_method(D_METHOD("test_mask", "point", "rect"), &StyleBox::test_mask); ClassDB::bind_method(D_METHOD("set_default_margin", "margin", "offset"), &StyleBox::set_default_margin); @@ -112,17 +106,15 @@ void StyleBox::_bind_methods() { } StyleBox::StyleBox() { - for (int i = 0; i < 4; i++) { - margin[i] = -1; } } void StyleBoxTexture::set_texture(Ref<Texture2D> p_texture) { - - if (texture == p_texture) + if (texture == p_texture) { return; + } texture = p_texture; if (p_texture.is_null()) { region_rect = Rect2(0, 0, 0, 0); @@ -135,25 +127,22 @@ void StyleBoxTexture::set_texture(Ref<Texture2D> p_texture) { } Ref<Texture2D> StyleBoxTexture::get_texture() const { - return texture; } void StyleBoxTexture::set_normal_map(Ref<Texture2D> p_normal_map) { - - if (normal_map == p_normal_map) + if (normal_map == p_normal_map) { return; + } normal_map = p_normal_map; emit_changed(); } Ref<Texture2D> StyleBoxTexture::get_normal_map() const { - return normal_map; } void StyleBoxTexture::set_margin_size(Margin p_margin, float p_size) { - ERR_FAIL_INDEX((int)p_margin, 4); margin[p_margin] = p_size; @@ -166,15 +155,14 @@ void StyleBoxTexture::set_margin_size(Margin p_margin, float p_size) { }; _change_notify(margin_prop[p_margin]); } -float StyleBoxTexture::get_margin_size(Margin p_margin) const { +float StyleBoxTexture::get_margin_size(Margin p_margin) const { ERR_FAIL_INDEX_V((int)p_margin, 4, 0.0); return margin[p_margin]; } float StyleBoxTexture::get_style_margin(Margin p_margin) const { - ERR_FAIL_INDEX_V((int)p_margin, 4, 0.0); return margin[p_margin]; @@ -185,8 +173,9 @@ Rect2 StyleBoxTexture::get_draw_rect(const Rect2 &p_rect) const { } void StyleBoxTexture::draw(RID p_canvas_item, const Rect2 &p_rect) const { - if (texture.is_null()) + if (texture.is_null()) { return; + } Rect2 rect = p_rect; Rect2 src_rect = region_rect; @@ -199,33 +188,31 @@ void StyleBoxTexture::draw(RID p_canvas_item, const Rect2 &p_rect) const { rect.size.y += expand_margin[MARGIN_TOP] + expand_margin[MARGIN_BOTTOM]; RID normal_rid; - if (normal_map.is_valid()) + if (normal_map.is_valid()) { normal_rid = normal_map->get_rid(); + } RenderingServer::get_singleton()->canvas_item_add_nine_patch(p_canvas_item, rect, src_rect, texture->get_rid(), Vector2(margin[MARGIN_LEFT], margin[MARGIN_TOP]), Vector2(margin[MARGIN_RIGHT], margin[MARGIN_BOTTOM]), RS::NinePatchAxisMode(axis_h), RS::NinePatchAxisMode(axis_v), draw_center, modulate, normal_rid); } void StyleBoxTexture::set_draw_center(bool p_enabled) { - draw_center = p_enabled; emit_changed(); } bool StyleBoxTexture::is_draw_center_enabled() const { - return draw_center; } Size2 StyleBoxTexture::get_center_size() const { - - if (texture.is_null()) + if (texture.is_null()) { return Size2(); + } return region_rect.size - get_minimum_size(); } void StyleBoxTexture::set_expand_margin_size(Margin p_expand_margin, float p_size) { - ERR_FAIL_INDEX((int)p_expand_margin, 4); expand_margin[p_expand_margin] = p_size; emit_changed(); @@ -241,70 +228,62 @@ void StyleBoxTexture::set_expand_margin_size_individual(float p_left, float p_to void StyleBoxTexture::set_expand_margin_size_all(float p_expand_margin_size) { for (int i = 0; i < 4; i++) { - expand_margin[i] = p_expand_margin_size; } emit_changed(); } float StyleBoxTexture::get_expand_margin_size(Margin p_expand_margin) const { - ERR_FAIL_INDEX_V((int)p_expand_margin, 4, 0); return expand_margin[p_expand_margin]; } void StyleBoxTexture::set_region_rect(const Rect2 &p_region_rect) { - - if (region_rect == p_region_rect) + if (region_rect == p_region_rect) { return; + } region_rect = p_region_rect; emit_changed(); } Rect2 StyleBoxTexture::get_region_rect() const { - return region_rect; } void StyleBoxTexture::set_h_axis_stretch_mode(AxisStretchMode p_mode) { - ERR_FAIL_INDEX((int)p_mode, 3); axis_h = p_mode; emit_changed(); } StyleBoxTexture::AxisStretchMode StyleBoxTexture::get_h_axis_stretch_mode() const { - return axis_h; } void StyleBoxTexture::set_v_axis_stretch_mode(AxisStretchMode p_mode) { - ERR_FAIL_INDEX((int)p_mode, 3); axis_v = p_mode; emit_changed(); } StyleBoxTexture::AxisStretchMode StyleBoxTexture::get_v_axis_stretch_mode() const { - return axis_v; } void StyleBoxTexture::set_modulate(const Color &p_modulate) { - if (modulate == p_modulate) + if (modulate == p_modulate) { return; + } modulate = p_modulate; emit_changed(); } Color StyleBoxTexture::get_modulate() const { - return modulate; } void StyleBoxTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_texture", "texture"), &StyleBoxTexture::set_texture); ClassDB::bind_method(D_METHOD("get_texture"), &StyleBoxTexture::get_texture); @@ -362,7 +341,6 @@ void StyleBoxTexture::_bind_methods() { } StyleBoxTexture::StyleBoxTexture() { - for (int i = 0; i < 4; i++) { margin[i] = 0; expand_margin[i] = 0; @@ -373,29 +351,27 @@ StyleBoxTexture::StyleBoxTexture() { axis_h = AXIS_STRETCH_MODE_STRETCH; axis_v = AXIS_STRETCH_MODE_STRETCH; } + StyleBoxTexture::~StyleBoxTexture() { } //////////////// void StyleBoxFlat::set_bg_color(const Color &p_color) { - bg_color = p_color; emit_changed(); } Color StyleBoxFlat::get_bg_color() const { - return bg_color; } void StyleBoxFlat::set_border_color(const Color &p_color) { - border_color = p_color; emit_changed(); } -Color StyleBoxFlat::get_border_color() const { +Color StyleBoxFlat::get_border_color() const { return border_color; } @@ -406,8 +382,8 @@ void StyleBoxFlat::set_border_width_all(int p_size) { border_width[3] = p_size; emit_changed(); } -int StyleBoxFlat::get_border_width_min() const { +int StyleBoxFlat::get_border_width_min() const { return MIN(MIN(border_width[0], border_width[1]), MIN(border_width[2], border_width[3])); } @@ -423,23 +399,22 @@ int StyleBoxFlat::get_border_width(Margin p_margin) const { } void StyleBoxFlat::set_border_blend(bool p_blend) { - blend_border = p_blend; emit_changed(); } -bool StyleBoxFlat::get_border_blend() const { +bool StyleBoxFlat::get_border_blend() const { return blend_border; } void StyleBoxFlat::set_corner_radius_all(int radius) { - for (int i = 0; i < 4; i++) { corner_radius[i] = radius; } emit_changed(); } + void StyleBoxFlat::set_corner_radius_individual(const int radius_top_left, const int radius_top_right, const int radius_botton_right, const int radius_bottom_left) { corner_radius[0] = radius_top_left; corner_radius[1] = radius_top_right; @@ -448,6 +423,7 @@ void StyleBoxFlat::set_corner_radius_individual(const int radius_top_left, const emit_changed(); } + int StyleBoxFlat::get_corner_radius_min() const { int smallest = corner_radius[0]; for (int i = 1; i < 4; i++) { @@ -459,19 +435,17 @@ int StyleBoxFlat::get_corner_radius_min() const { } void StyleBoxFlat::set_corner_radius(const Corner p_corner, const int radius) { - ERR_FAIL_INDEX((int)p_corner, 4); corner_radius[p_corner] = radius; emit_changed(); } -int StyleBoxFlat::get_corner_radius(const Corner p_corner) const { +int StyleBoxFlat::get_corner_radius(const Corner p_corner) const { ERR_FAIL_INDEX_V((int)p_corner, 4, 0); return corner_radius[p_corner]; } void StyleBoxFlat::set_expand_margin_size(Margin p_expand_margin, float p_size) { - ERR_FAIL_INDEX((int)p_expand_margin, 4); expand_margin[p_expand_margin] = p_size; emit_changed(); @@ -487,54 +461,49 @@ void StyleBoxFlat::set_expand_margin_size_individual(float p_left, float p_top, void StyleBoxFlat::set_expand_margin_size_all(float p_expand_margin_size) { for (int i = 0; i < 4; i++) { - expand_margin[i] = p_expand_margin_size; } emit_changed(); } float StyleBoxFlat::get_expand_margin_size(Margin p_expand_margin) const { - ERR_FAIL_INDEX_V((int)p_expand_margin, 4, 0.0); return expand_margin[p_expand_margin]; } -void StyleBoxFlat::set_draw_center(bool p_enabled) { +void StyleBoxFlat::set_draw_center(bool p_enabled) { draw_center = p_enabled; emit_changed(); } -bool StyleBoxFlat::is_draw_center_enabled() const { +bool StyleBoxFlat::is_draw_center_enabled() const { return draw_center; } void StyleBoxFlat::set_shadow_color(const Color &p_color) { - shadow_color = p_color; emit_changed(); } -Color StyleBoxFlat::get_shadow_color() const { +Color StyleBoxFlat::get_shadow_color() const { return shadow_color; } void StyleBoxFlat::set_shadow_size(const int &p_size) { - shadow_size = p_size; emit_changed(); } -int StyleBoxFlat::get_shadow_size() const { +int StyleBoxFlat::get_shadow_size() const { return shadow_size; } void StyleBoxFlat::set_shadow_offset(const Point2 &p_offset) { - shadow_offset = p_offset; emit_changed(); } -Point2 StyleBoxFlat::get_shadow_offset() const { +Point2 StyleBoxFlat::get_shadow_offset() const { return shadow_offset; } @@ -542,6 +511,7 @@ void StyleBoxFlat::set_anti_aliased(const bool &p_anti_aliased) { anti_aliased = p_anti_aliased; emit_changed(); } + bool StyleBoxFlat::is_anti_aliased() const { return anti_aliased; } @@ -550,6 +520,7 @@ void StyleBoxFlat::set_aa_size(const int &p_aa_size) { aa_size = CLAMP(p_aa_size, 1, 5); emit_changed(); } + int StyleBoxFlat::get_aa_size() const { return aa_size; } @@ -558,12 +529,12 @@ void StyleBoxFlat::set_corner_detail(const int &p_corner_detail) { corner_detail = CLAMP(p_corner_detail, 1, 20); emit_changed(); } + int StyleBoxFlat::get_corner_detail() const { return corner_detail; } Size2 StyleBoxFlat::get_center_size() const { - return Size2(); } @@ -593,7 +564,6 @@ inline void set_inner_corner_radius(const Rect2 style_rect, const Rect2 inner_re inline void draw_ring(Vector<Vector2> &verts, Vector<int> &indices, Vector<Color> &colors, const Rect2 &style_rect, const int corner_radius[4], const Rect2 &ring_rect, const Rect2 &inner_rect, const Color &inner_color, const Color &outer_color, const int corner_detail, const bool fill_center = false) { - int vert_offset = verts.size(); if (!vert_offset) { vert_offset = 0; @@ -705,7 +675,6 @@ Rect2 StyleBoxFlat::get_draw_rect(const Rect2 &p_rect) const { } void StyleBoxFlat::draw(RID p_canvas_item, const Rect2 &p_rect) const { - //PREPARATIONS bool draw_border = (border_width[0] > 0) || (border_width[1] > 0) || (border_width[2] > 0) || (border_width[3] > 0); bool draw_shadow = (shadow_size > 0); @@ -861,8 +830,8 @@ float StyleBoxFlat::get_style_margin(Margin p_margin) const { ERR_FAIL_INDEX_V((int)p_margin, 4, 0.0); return border_width[p_margin]; } -void StyleBoxFlat::_bind_methods() { +void StyleBoxFlat::_bind_methods() { ClassDB::bind_method(D_METHOD("set_bg_color", "color"), &StyleBoxFlat::set_bg_color); ClassDB::bind_method(D_METHOD("get_bg_color"), &StyleBoxFlat::get_bg_color); @@ -950,7 +919,6 @@ void StyleBoxFlat::_bind_methods() { } StyleBoxFlat::StyleBoxFlat() { - bg_color = Color(0.6, 0.6, 0.6); shadow_color = Color(0, 0, 0, 0.6); border_color = Color(0.8, 0.8, 0.8); @@ -979,6 +947,7 @@ StyleBoxFlat::StyleBoxFlat() { corner_radius[2] = 0; corner_radius[3] = 0; } + StyleBoxFlat::~StyleBoxFlat() { } @@ -986,6 +955,7 @@ void StyleBoxLine::set_color(const Color &p_color) { color = p_color; emit_changed(); } + Color StyleBoxLine::get_color() const { return color; } @@ -994,6 +964,7 @@ void StyleBoxLine::set_thickness(int p_thickness) { thickness = p_thickness; emit_changed(); } + int StyleBoxLine::get_thickness() const { return thickness; } @@ -1002,6 +973,7 @@ void StyleBoxLine::set_vertical(bool p_vertical) { vertical = p_vertical; emit_changed(); } + bool StyleBoxLine::is_vertical() const { return vertical; } @@ -1010,6 +982,7 @@ void StyleBoxLine::set_grow_end(float p_grow_end) { grow_end = p_grow_end; emit_changed(); } + float StyleBoxLine::get_grow_end() const { return grow_end; } @@ -1018,12 +991,12 @@ void StyleBoxLine::set_grow_begin(float p_grow_begin) { grow_begin = p_grow_begin; emit_changed(); } + float StyleBoxLine::get_grow_begin() const { return grow_begin; } void StyleBoxLine::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_color", "color"), &StyleBoxLine::set_color); ClassDB::bind_method(D_METHOD("get_color"), &StyleBoxLine::get_color); ClassDB::bind_method(D_METHOD("set_thickness", "thickness"), &StyleBoxLine::set_thickness); @@ -1041,10 +1014,12 @@ void StyleBoxLine::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "thickness", PROPERTY_HINT_RANGE, "0,10"), "set_thickness", "get_thickness"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "vertical"), "set_vertical", "is_vertical"); } + float StyleBoxLine::get_style_margin(Margin p_margin) const { ERR_FAIL_INDEX_V((int)p_margin, 4, thickness); return thickness; } + Size2 StyleBoxLine::get_center_size() const { return Size2(); } @@ -1073,4 +1048,5 @@ StyleBoxLine::StyleBoxLine() { color = Color(0.0, 0.0, 0.0); vertical = false; } + StyleBoxLine::~StyleBoxLine() {} diff --git a/scene/resources/style_box.h b/scene/resources/style_box.h index f19b93d00d..99adbe589a 100644 --- a/scene/resources/style_box.h +++ b/scene/resources/style_box.h @@ -38,7 +38,6 @@ class CanvasItem; class StyleBox : public Resource { - GDCLASS(StyleBox, Resource); RES_BASE_EXTENSION("stylebox"); OBJ_SAVE_TYPE(StyleBox); @@ -68,7 +67,6 @@ public: }; class StyleBoxEmpty : public StyleBox { - GDCLASS(StyleBoxEmpty, StyleBox); virtual float get_style_margin(Margin p_margin) const { return 0; } @@ -78,7 +76,6 @@ public: }; class StyleBoxTexture : public StyleBox { - GDCLASS(StyleBoxTexture, StyleBox); public: @@ -144,7 +141,6 @@ public: VARIANT_ENUM_CAST(StyleBoxTexture::AxisStretchMode) class StyleBoxFlat : public StyleBox { - GDCLASS(StyleBoxFlat, StyleBox); Color bg_color; @@ -238,7 +234,6 @@ public: // just used to draw lines. class StyleBoxLine : public StyleBox { - GDCLASS(StyleBoxLine, StyleBox); Color color; int thickness; diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp index 4b392e23b7..1a2dcc84bb 100644 --- a/scene/resources/surface_tool.cpp +++ b/scene/resources/surface_tool.cpp @@ -36,43 +36,50 @@ #define EQ_VERTEX_DIST 0.00001 bool SurfaceTool::Vertex::operator==(const Vertex &p_vertex) const { - - if (vertex != p_vertex.vertex) + if (vertex != p_vertex.vertex) { return false; + } - if (uv != p_vertex.uv) + if (uv != p_vertex.uv) { return false; + } - if (uv2 != p_vertex.uv2) + if (uv2 != p_vertex.uv2) { return false; + } - if (normal != p_vertex.normal) + if (normal != p_vertex.normal) { return false; + } - if (binormal != p_vertex.binormal) + if (binormal != p_vertex.binormal) { return false; + } - if (color != p_vertex.color) + if (color != p_vertex.color) { return false; + } - if (bones.size() != p_vertex.bones.size()) + if (bones.size() != p_vertex.bones.size()) { return false; + } for (int i = 0; i < bones.size(); i++) { - if (bones[i] != p_vertex.bones[i]) + if (bones[i] != p_vertex.bones[i]) { return false; + } } for (int i = 0; i < weights.size(); i++) { - if (weights[i] != p_vertex.weights[i]) + if (weights[i] != p_vertex.weights[i]) { return false; + } } return true; } uint32_t SurfaceTool::VertexHasher::hash(const Vertex &p_vtx) { - uint32_t h = hash_djb2_buffer((const uint8_t *)&p_vtx.vertex, sizeof(real_t) * 3); h = hash_djb2_buffer((const uint8_t *)&p_vtx.normal, sizeof(real_t) * 3, h); h = hash_djb2_buffer((const uint8_t *)&p_vtx.binormal, sizeof(real_t) * 3, h); @@ -86,7 +93,6 @@ uint32_t SurfaceTool::VertexHasher::hash(const Vertex &p_vtx) { } void SurfaceTool::begin(Mesh::PrimitiveType p_primitive) { - clear(); primitive = p_primitive; @@ -95,7 +101,6 @@ void SurfaceTool::begin(Mesh::PrimitiveType p_primitive) { } void SurfaceTool::add_vertex(const Vector3 &p_vertex) { - ERR_FAIL_COND(!begun); Vertex vtx; @@ -159,8 +164,8 @@ void SurfaceTool::add_vertex(const Vector3 &p_vertex) { format |= Mesh::ARRAY_FORMAT_VERTEX; } -void SurfaceTool::add_color(Color p_color) { +void SurfaceTool::add_color(Color p_color) { ERR_FAIL_COND(!begun); ERR_FAIL_COND(!first && !(format & Mesh::ARRAY_FORMAT_COLOR)); @@ -168,8 +173,8 @@ void SurfaceTool::add_color(Color p_color) { format |= Mesh::ARRAY_FORMAT_COLOR; last_color = p_color; } -void SurfaceTool::add_normal(const Vector3 &p_normal) { +void SurfaceTool::add_normal(const Vector3 &p_normal) { ERR_FAIL_COND(!begun); ERR_FAIL_COND(!first && !(format & Mesh::ARRAY_FORMAT_NORMAL)); @@ -179,7 +184,6 @@ void SurfaceTool::add_normal(const Vector3 &p_normal) { } void SurfaceTool::add_tangent(const Plane &p_tangent) { - ERR_FAIL_COND(!begun); ERR_FAIL_COND(!first && !(format & Mesh::ARRAY_FORMAT_TANGENT)); @@ -188,7 +192,6 @@ void SurfaceTool::add_tangent(const Plane &p_tangent) { } void SurfaceTool::add_uv(const Vector2 &p_uv) { - ERR_FAIL_COND(!begun); ERR_FAIL_COND(!first && !(format & Mesh::ARRAY_FORMAT_TEX_UV)); @@ -197,7 +200,6 @@ void SurfaceTool::add_uv(const Vector2 &p_uv) { } void SurfaceTool::add_uv2(const Vector2 &p_uv2) { - ERR_FAIL_COND(!begun); ERR_FAIL_COND(!first && !(format & Mesh::ARRAY_FORMAT_TEX_UV2)); @@ -206,7 +208,6 @@ void SurfaceTool::add_uv2(const Vector2 &p_uv2) { } void SurfaceTool::add_bones(const Vector<int> &p_bones) { - ERR_FAIL_COND(!begun); ERR_FAIL_COND(!first && !(format & Mesh::ARRAY_FORMAT_BONES)); @@ -215,7 +216,6 @@ void SurfaceTool::add_bones(const Vector<int> &p_bones) { } void SurfaceTool::add_weights(const Vector<float> &p_weights) { - ERR_FAIL_COND(!begun); ERR_FAIL_COND(!first && !(format & Mesh::ARRAY_FORMAT_WEIGHTS)); @@ -224,12 +224,10 @@ void SurfaceTool::add_weights(const Vector<float> &p_weights) { } void SurfaceTool::add_smooth_group(bool p_smooth) { - ERR_FAIL_COND(!begun); if (index_array.size()) { smooth_groups[index_array.size()] = p_smooth; } else { - smooth_groups[vertex_array.size()] = p_smooth; } } @@ -264,7 +262,6 @@ void SurfaceTool::add_triangle_fan(const Vector<Vector3> &p_vertices, const Vect } void SurfaceTool::add_index(int p_index) { - ERR_FAIL_COND(!begun); format |= Mesh::ARRAY_FORMAT_INDEX; @@ -272,29 +269,25 @@ void SurfaceTool::add_index(int p_index) { } Array SurfaceTool::commit_to_arrays() { - int varr_len = vertex_array.size(); Array a; a.resize(Mesh::ARRAY_MAX); for (int i = 0; i < Mesh::ARRAY_MAX; i++) { - - if (!(format & (1 << i))) + if (!(format & (1 << i))) { continue; //not in format + } switch (i) { - case Mesh::ARRAY_VERTEX: case Mesh::ARRAY_NORMAL: { - Vector<Vector3> array; array.resize(varr_len); Vector3 *w = array.ptrw(); int idx = 0; for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next(), idx++) { - const Vertex &v = E->get(); switch (i) { @@ -313,18 +306,15 @@ Array SurfaceTool::commit_to_arrays() { case Mesh::ARRAY_TEX_UV: case Mesh::ARRAY_TEX_UV2: { - Vector<Vector2> array; array.resize(varr_len); Vector2 *w = array.ptrw(); int idx = 0; for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next(), idx++) { - const Vertex &v = E->get(); switch (i) { - case Mesh::ARRAY_TEX_UV: { w[idx] = v.uv; } break; @@ -337,14 +327,12 @@ Array SurfaceTool::commit_to_arrays() { a[i] = array; } break; case Mesh::ARRAY_TANGENT: { - Vector<float> array; array.resize(varr_len * 4); float *w = array.ptrw(); int idx = 0; for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next(), idx += 4) { - const Vertex &v = E->get(); w[idx + 0] = v.tangent.x; @@ -360,14 +348,12 @@ Array SurfaceTool::commit_to_arrays() { } break; case Mesh::ARRAY_COLOR: { - Vector<Color> array; array.resize(varr_len); Color *w = array.ptrw(); int idx = 0; for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next(), idx++) { - const Vertex &v = E->get(); w[idx] = v.color; } @@ -375,14 +361,12 @@ Array SurfaceTool::commit_to_arrays() { a[i] = array; } break; case Mesh::ARRAY_BONES: { - Vector<int> array; array.resize(varr_len * 4); int *w = array.ptrw(); int idx = 0; for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next(), idx += 4) { - const Vertex &v = E->get(); ERR_CONTINUE(v.bones.size() != 4); @@ -396,19 +380,16 @@ Array SurfaceTool::commit_to_arrays() { } break; case Mesh::ARRAY_WEIGHTS: { - Vector<float> array; array.resize(varr_len * 4); float *w = array.ptrw(); int idx = 0; for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next(), idx += 4) { - const Vertex &v = E->get(); ERR_CONTINUE(v.weights.size() != 4); for (int j = 0; j < 4; j++) { - w[idx + j] = v.weights[j]; } } @@ -417,7 +398,6 @@ Array SurfaceTool::commit_to_arrays() { } break; case Mesh::ARRAY_INDEX: { - ERR_CONTINUE(index_array.size() == 0); Vector<int> array; @@ -426,7 +406,6 @@ Array SurfaceTool::commit_to_arrays() { int idx = 0; for (List<int>::Element *E = index_array.front(); E; E = E->next(), idx++) { - w[idx] = E->get(); } @@ -442,17 +421,18 @@ Array SurfaceTool::commit_to_arrays() { } Ref<ArrayMesh> SurfaceTool::commit(const Ref<ArrayMesh> &p_existing, uint32_t p_flags) { - Ref<ArrayMesh> mesh; - if (p_existing.is_valid()) + if (p_existing.is_valid()) { mesh = p_existing; - else + } else { mesh.instance(); + } int varr_len = vertex_array.size(); - if (varr_len == 0) + if (varr_len == 0) { return mesh; + } int surface = mesh->get_surface_count(); @@ -460,22 +440,22 @@ Ref<ArrayMesh> SurfaceTool::commit(const Ref<ArrayMesh> &p_existing, uint32_t p_ mesh->add_surface_from_arrays(primitive, a, Array(), Dictionary(), p_flags); - if (material.is_valid()) + if (material.is_valid()) { mesh->surface_set_material(surface, material); + } return mesh; } void SurfaceTool::index() { - - if (index_array.size()) + if (index_array.size()) { return; //already indexed + } HashMap<Vertex, int, VertexHasher> indices; List<Vertex> new_vertices; for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next()) { - int *idxptr = indices.getptr(E->get()); int idx; if (!idxptr) { @@ -496,19 +476,17 @@ void SurfaceTool::index() { } void SurfaceTool::deindex() { - - if (index_array.size() == 0) + if (index_array.size() == 0) { return; //nothing to deindex + } Vector<Vertex> varr; varr.resize(vertex_array.size()); int idx = 0; for (List<Vertex>::Element *E = vertex_array.front(); E; E = E->next()) { - varr.write[idx++] = E->get(); } vertex_array.clear(); for (List<int>::Element *E = index_array.front(); E; E = E->next()) { - ERR_FAIL_INDEX(E->get(), varr.size()); vertex_array.push_back(varr[E->get()]); } @@ -517,14 +495,12 @@ void SurfaceTool::deindex() { } void SurfaceTool::_create_list(const Ref<Mesh> &p_existing, int p_surface, List<Vertex> *r_vertex, List<int> *r_index, int &lformat) { - Array arr = p_existing->surface_get_arrays(p_surface); ERR_FAIL_COND(arr.size() != RS::ARRAY_MAX); _create_list_from_arrays(arr, r_vertex, r_index, lformat); } Vector<SurfaceTool::Vertex> SurfaceTool::create_vertex_array_from_triangle_arrays(const Array &p_arrays) { - Vector<SurfaceTool::Vertex> ret; Vector<Vector3> varr = p_arrays[RS::ARRAY_VERTEX]; @@ -537,8 +513,9 @@ Vector<SurfaceTool::Vertex> SurfaceTool::create_vertex_array_from_triangle_array Vector<float> warr = p_arrays[RS::ARRAY_WEIGHTS]; int vc = varr.size(); - if (vc == 0) + if (vc == 0) { return ret; + } int lformat = 0; if (varr.size()) { @@ -568,21 +545,26 @@ Vector<SurfaceTool::Vertex> SurfaceTool::create_vertex_array_from_triangle_array for (int i = 0; i < vc; i++) { Vertex v; - if (lformat & RS::ARRAY_FORMAT_VERTEX) + if (lformat & RS::ARRAY_FORMAT_VERTEX) { v.vertex = varr[i]; - if (lformat & RS::ARRAY_FORMAT_NORMAL) + } + if (lformat & RS::ARRAY_FORMAT_NORMAL) { v.normal = narr[i]; + } if (lformat & RS::ARRAY_FORMAT_TANGENT) { Plane p(tarr[i * 4 + 0], tarr[i * 4 + 1], tarr[i * 4 + 2], tarr[i * 4 + 3]); v.tangent = p.normal; v.binormal = p.normal.cross(v.tangent).normalized() * p.d; } - if (lformat & RS::ARRAY_FORMAT_COLOR) + if (lformat & RS::ARRAY_FORMAT_COLOR) { v.color = carr[i]; - if (lformat & RS::ARRAY_FORMAT_TEX_UV) + } + if (lformat & RS::ARRAY_FORMAT_TEX_UV) { v.uv = uvarr[i]; - if (lformat & RS::ARRAY_FORMAT_TEX_UV2) + } + if (lformat & RS::ARRAY_FORMAT_TEX_UV2) { v.uv2 = uv2arr[i]; + } if (lformat & RS::ARRAY_FORMAT_BONES) { Vector<int> b; b.resize(4); @@ -609,7 +591,6 @@ Vector<SurfaceTool::Vertex> SurfaceTool::create_vertex_array_from_triangle_array } void SurfaceTool::_create_list_from_arrays(Array arr, List<Vertex> *r_vertex, List<int> *r_index, int &lformat) { - Vector<Vector3> varr = arr[RS::ARRAY_VERTEX]; Vector<Vector3> narr = arr[RS::ARRAY_NORMAL]; Vector<float> tarr = arr[RS::ARRAY_TANGENT]; @@ -620,8 +601,9 @@ void SurfaceTool::_create_list_from_arrays(Array arr, List<Vertex> *r_vertex, Li Vector<float> warr = arr[RS::ARRAY_WEIGHTS]; int vc = varr.size(); - if (vc == 0) + if (vc == 0) { return; + } lformat = 0; if (varr.size()) { @@ -651,21 +633,26 @@ void SurfaceTool::_create_list_from_arrays(Array arr, List<Vertex> *r_vertex, Li for (int i = 0; i < vc; i++) { Vertex v; - if (lformat & RS::ARRAY_FORMAT_VERTEX) + if (lformat & RS::ARRAY_FORMAT_VERTEX) { v.vertex = varr[i]; - if (lformat & RS::ARRAY_FORMAT_NORMAL) + } + if (lformat & RS::ARRAY_FORMAT_NORMAL) { v.normal = narr[i]; + } if (lformat & RS::ARRAY_FORMAT_TANGENT) { Plane p(tarr[i * 4 + 0], tarr[i * 4 + 1], tarr[i * 4 + 2], tarr[i * 4 + 3]); v.tangent = p.normal; v.binormal = p.normal.cross(v.tangent).normalized() * p.d; } - if (lformat & RS::ARRAY_FORMAT_COLOR) + if (lformat & RS::ARRAY_FORMAT_COLOR) { v.color = carr[i]; - if (lformat & RS::ARRAY_FORMAT_TEX_UV) + } + if (lformat & RS::ARRAY_FORMAT_TEX_UV) { v.uv = uvarr[i]; - if (lformat & RS::ARRAY_FORMAT_TEX_UV2) + } + if (lformat & RS::ARRAY_FORMAT_TEX_UV2) { v.uv2 = uv2arr[i]; + } if (lformat & RS::ARRAY_FORMAT_BONES) { Vector<int> b; b.resize(4); @@ -693,7 +680,6 @@ void SurfaceTool::_create_list_from_arrays(Array arr, List<Vertex> *r_vertex, Li Vector<int> idx = arr[RS::ARRAY_INDEX]; int is = idx.size(); if (is) { - lformat |= RS::ARRAY_FORMAT_INDEX; const int *iarr = idx.ptr(); for (int i = 0; i < is; i++) { @@ -703,14 +689,12 @@ void SurfaceTool::_create_list_from_arrays(Array arr, List<Vertex> *r_vertex, Li } void SurfaceTool::create_from_triangle_arrays(const Array &p_arrays) { - clear(); primitive = Mesh::PRIMITIVE_TRIANGLES; _create_list_from_arrays(p_arrays, &vertex_array, &index_array, format); } void SurfaceTool::create_from(const Ref<Mesh> &p_existing, int p_surface) { - clear(); primitive = p_existing->surface_get_primitive_type(p_surface); _create_list(p_existing, p_surface, &vertex_array, &index_array, format); @@ -738,7 +722,6 @@ void SurfaceTool::create_from_blend_shape(const Ref<Mesh> &p_existing, int p_sur } void SurfaceTool::append_from(const Ref<Mesh> &p_existing, int p_surface, const Transform &p_xform) { - if (vertex_array.size() == 0) { primitive = p_existing->surface_get_primitive_type(p_surface); format = 0; @@ -752,7 +735,6 @@ void SurfaceTool::append_from(const Ref<Mesh> &p_existing, int p_surface, const int vfrom = vertex_array.size(); for (List<Vertex>::Element *E = nvertices.front(); E; E = E->next()) { - Vertex v = E->get(); v.vertex = p_xform.xform(v.vertex); if (nformat & RS::ARRAY_FORMAT_NORMAL) { @@ -767,7 +749,6 @@ void SurfaceTool::append_from(const Ref<Mesh> &p_existing, int p_surface, const } for (List<int>::Element *E = nindices.front(); E; E = E->next()) { - int dst_index = E->get() + vfrom; index_array.push_back(dst_index); } @@ -785,7 +766,6 @@ struct TangentGenerationContextUserData { } // namespace int SurfaceTool::mikktGetNumFaces(const SMikkTSpaceContext *pContext) { - TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData); if (triangle_data.indices.size() > 0) { @@ -794,12 +774,12 @@ int SurfaceTool::mikktGetNumFaces(const SMikkTSpaceContext *pContext) { return triangle_data.vertices.size() / 3; } } -int SurfaceTool::mikktGetNumVerticesOfFace(const SMikkTSpaceContext *pContext, const int iFace) { +int SurfaceTool::mikktGetNumVerticesOfFace(const SMikkTSpaceContext *pContext, const int iFace) { return 3; //always 3 } -void SurfaceTool::mikktGetPosition(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert) { +void SurfaceTool::mikktGetPosition(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert) { TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData); Vector3 v; if (triangle_data.indices.size() > 0) { @@ -817,7 +797,6 @@ void SurfaceTool::mikktGetPosition(const SMikkTSpaceContext *pContext, float fvP } void SurfaceTool::mikktGetNormal(const SMikkTSpaceContext *pContext, float fvNormOut[], const int iFace, const int iVert) { - TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData); Vector3 v; if (triangle_data.indices.size() > 0) { @@ -833,8 +812,8 @@ void SurfaceTool::mikktGetNormal(const SMikkTSpaceContext *pContext, float fvNor fvNormOut[1] = v.y; fvNormOut[2] = v.z; } -void SurfaceTool::mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert) { +void SurfaceTool::mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert) { TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData); Vector2 v; if (triangle_data.indices.size() > 0) { @@ -852,7 +831,6 @@ void SurfaceTool::mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvT void SurfaceTool::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT, const tbool bIsOrientationPreserving, const int iFace, const int iVert) { - TangentGenerationContextUserData &triangle_data = *reinterpret_cast<TangentGenerationContextUserData *>(pContext->m_pUserData); Vertex *vtx = nullptr; if (triangle_data.indices.size() > 0) { @@ -871,7 +849,6 @@ void SurfaceTool::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, cons } void SurfaceTool::generate_tangents() { - ERR_FAIL_COND(!(format & Mesh::ARRAY_FORMAT_TEX_UV)); ERR_FAIL_COND(!(format & Mesh::ARRAY_FORMAT_NORMAL)); @@ -909,7 +886,6 @@ void SurfaceTool::generate_tangents() { } void SurfaceTool::generate_normals(bool p_flip) { - ERR_FAIL_COND(primitive != Mesh::PRIMITIVE_TRIANGLES); bool was_indexed = index_array.size(); @@ -920,12 +896,12 @@ void SurfaceTool::generate_normals(bool p_flip) { int count = 0; bool smooth = false; - if (smooth_groups.has(0)) + if (smooth_groups.has(0)) { smooth = smooth_groups[0]; + } List<Vertex>::Element *B = vertex_array.front(); for (List<Vertex>::Element *E = B; E;) { - List<Vertex>::Element *v[3]; v[0] = E; v[1] = v[0]->next(); @@ -935,15 +911,14 @@ void SurfaceTool::generate_normals(bool p_flip) { E = v[2]->next(); Vector3 normal; - if (!p_flip) + if (!p_flip) { normal = Plane(v[0]->get().vertex, v[1]->get().vertex, v[2]->get().vertex).normal; - else + } else { normal = Plane(v[2]->get().vertex, v[1]->get().vertex, v[0]->get().vertex).normal; + } if (smooth) { - for (int i = 0; i < 3; i++) { - Vector3 *lv = vertex_hash.getptr(v[i]->get()); if (!lv) { vertex_hash.set(v[i]->get(), normal); @@ -952,20 +927,15 @@ void SurfaceTool::generate_normals(bool p_flip) { } } } else { - for (int i = 0; i < 3; i++) { - v[i]->get().normal = normal; } } count += 3; if (smooth_groups.has(count) || !E) { - if (vertex_hash.size()) { - while (B != E) { - Vector3 *lv = vertex_hash.getptr(B->get()); if (lv) { B->get().normal = lv->normalized(); @@ -994,12 +964,10 @@ void SurfaceTool::generate_normals(bool p_flip) { } void SurfaceTool::set_material(const Ref<Material> &p_material) { - material = p_material; } void SurfaceTool::clear() { - begun = false; primitive = Mesh::PRIMITIVE_LINES; format = 0; @@ -1012,7 +980,6 @@ void SurfaceTool::clear() { } void SurfaceTool::_bind_methods() { - ClassDB::bind_method(D_METHOD("begin", "primitive"), &SurfaceTool::begin); ClassDB::bind_method(D_METHOD("add_vertex", "vertex"), &SurfaceTool::add_vertex); @@ -1046,7 +1013,6 @@ void SurfaceTool::_bind_methods() { } SurfaceTool::SurfaceTool() { - first = false; begun = false; primitive = Mesh::PRIMITIVE_LINES; diff --git a/scene/resources/surface_tool.h b/scene/resources/surface_tool.h index 89034f656d..d7b255e695 100644 --- a/scene/resources/surface_tool.h +++ b/scene/resources/surface_tool.h @@ -36,12 +36,10 @@ #include "thirdparty/misc/mikktspace.h" class SurfaceTool : public Reference { - GDCLASS(SurfaceTool, Reference); public: struct Vertex { - Vector3 vertex; Color color; Vector3 normal; // normal, binormal, tangent diff --git a/scene/resources/text_file.cpp b/scene/resources/text_file.cpp index e291dcb67e..e3bd5ce0ae 100644 --- a/scene/resources/text_file.cpp +++ b/scene/resources/text_file.cpp @@ -49,7 +49,6 @@ void TextFile::reload_from_file() { } Error TextFile::load_text(const String &p_path) { - Vector<uint8_t> sourcef; Error err; FileAccess *f = FileAccess::open(p_path, FileAccess::READ, &err); diff --git a/scene/resources/text_file.h b/scene/resources/text_file.h index 666c088d04..356b070ea0 100644 --- a/scene/resources/text_file.h +++ b/scene/resources/text_file.h @@ -35,7 +35,6 @@ #include "core/io/resource_saver.h" class TextFile : public Resource { - GDCLASS(TextFile, Resource); private: diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index b212bba826..331cffed5d 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -39,7 +39,6 @@ #include "servers/camera/camera_feed.h" Size2 Texture2D::get_size() const { - return Size2(get_width(), get_height()); } @@ -48,28 +47,24 @@ bool Texture2D::is_pixel_opaque(int p_x, int p_y) const { } void Texture2D::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect(p_canvas_item, Rect2(p_pos, get_size()), get_rid(), false, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } void Texture2D::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect(p_canvas_item, p_rect, get_rid(), p_tile, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } void Texture2D::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { - RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas_item, p_rect, get_rid(), p_src_rect, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_clip_uv, p_texture_filter, p_texture_repeat); } bool Texture2D::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, Rect2 &r_rect, Rect2 &r_src_rect) const { - r_rect = p_rect; r_src_rect = p_src_rect; @@ -77,7 +72,6 @@ bool Texture2D::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, Re } void Texture2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_width"), &Texture2D::get_width); ClassDB::bind_method(D_METHOD("get_height"), &Texture2D::get_height); ClassDB::bind_method(D_METHOD("get_size"), &Texture2D::get_size); @@ -96,10 +90,10 @@ Texture2D::Texture2D() { ///////////////////// void ImageTexture::reload_from_file() { - String path = ResourceLoader::path_remap(get_path()); - if (!path.is_resource_file()) + if (!path.is_resource_file()) { return; + } Ref<Image> img; img.instance(); @@ -114,43 +108,42 @@ void ImageTexture::reload_from_file() { } bool ImageTexture::_set(const StringName &p_name, const Variant &p_value) { - - if (p_name == "image") + if (p_name == "image") { create_from_image(p_value); - else if (p_name == "size") { + } else if (p_name == "size") { Size2 s = p_value; w = s.width; h = s.height; RenderingServer::get_singleton()->texture_set_size_override(texture, w, h); - } else + } else { return false; + } return true; } bool ImageTexture::_get(const StringName &p_name, Variant &r_ret) const { - - if (p_name == "image") + if (p_name == "image") { r_ret = get_data(); - else if (p_name == "size") + } else if (p_name == "size") { r_ret = Size2(w, h); - else + } else { return false; + } return true; } void ImageTexture::_get_property_list(List<PropertyInfo> *p_list) const { - p_list->push_back(PropertyInfo(Variant::OBJECT, "image", PROPERTY_HINT_RESOURCE_TYPE, "Image", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESOURCE_NOT_PERSISTENT)); p_list->push_back(PropertyInfo(Variant::VECTOR2, "size", PROPERTY_HINT_NONE, "")); } void ImageTexture::_reload_hook(const RID &p_hook) { - String path = get_path(); - if (!path.is_resource_file()) + if (!path.is_resource_file()) { return; + } Ref<Image> img; img.instance(); @@ -166,7 +159,6 @@ void ImageTexture::_reload_hook(const RID &p_hook) { } void ImageTexture::create_from_image(const Ref<Image> &p_image) { - ERR_FAIL_COND(p_image.is_null()); w = p_image->get_width(); h = p_image->get_height(); @@ -186,12 +178,10 @@ void ImageTexture::create_from_image(const Ref<Image> &p_image) { } Image::Format ImageTexture::get_format() const { - return format; } void ImageTexture::update(const Ref<Image> &p_image, bool p_immediate) { - ERR_FAIL_COND(p_image.is_null()); ERR_FAIL_COND(texture.is_null()); ERR_FAIL_COND(p_image->get_width() != w || p_image->get_height() != h); @@ -212,12 +202,10 @@ void ImageTexture::update(const Ref<Image> &p_image, bool p_immediate) { } void ImageTexture::_resource_path_changed() { - String path = get_path(); } Ref<Image> ImageTexture::get_data() const { - if (image_stored) { return RenderingServer::get_singleton()->texture_2d_get(texture); } else { @@ -226,17 +214,14 @@ Ref<Image> ImageTexture::get_data() const { } int ImageTexture::get_width() const { - return w; } int ImageTexture::get_height() const { - return h; } RID ImageTexture::get_rid() const { - if (texture.is_null()) { //we are in trouble, create something temporary texture = RenderingServer::get_singleton()->texture_2d_placeholder_create(); @@ -245,37 +230,37 @@ RID ImageTexture::get_rid() const { } bool ImageTexture::has_alpha() const { - return (format == Image::FORMAT_LA8 || format == Image::FORMAT_RGBA8); } void ImageTexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - - if ((w | h) == 0) + if ((w | h) == 0) { return; + } RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect(p_canvas_item, Rect2(p_pos, Size2(w, h)), texture, false, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } -void ImageTexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - if ((w | h) == 0) +void ImageTexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { + if ((w | h) == 0) { return; + } RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect(p_canvas_item, p_rect, texture, p_tile, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } -void ImageTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { - if ((w | h) == 0) +void ImageTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { + if ((w | h) == 0) { return; + } RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas_item, p_rect, texture, p_src_rect, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_clip_uv, p_texture_filter, p_texture_repeat); } bool ImageTexture::is_pixel_opaque(int p_x, int p_y) const { - if (!alpha_cache.is_valid()) { Ref<Image> img = get_data(); if (img.is_valid()) { @@ -290,7 +275,6 @@ bool ImageTexture::is_pixel_opaque(int p_x, int p_y) const { } if (alpha_cache.is_valid()) { - int aw = int(alpha_cache->get_size().width); int ah = int(alpha_cache->get_size().height); if (aw == 0 || ah == 0) { @@ -310,17 +294,17 @@ bool ImageTexture::is_pixel_opaque(int p_x, int p_y) const { } void ImageTexture::set_size_override(const Size2 &p_size) { - Size2 s = p_size; - if (s.x != 0) + if (s.x != 0) { w = s.x; - if (s.y != 0) + } + if (s.y != 0) { h = s.y; + } RenderingServer::get_singleton()->texture_set_size_override(texture, w, h); } void ImageTexture::set_path(const String &p_path, bool p_take_over) { - if (texture.is_valid()) { RenderingServer::get_singleton()->texture_set_path(texture, p_path); } @@ -329,7 +313,6 @@ void ImageTexture::set_path(const String &p_path, bool p_take_over) { } void ImageTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("create_from_image", "image"), &ImageTexture::create_from_image); ClassDB::bind_method(D_METHOD("get_format"), &ImageTexture::get_format); @@ -339,7 +322,6 @@ void ImageTexture::_bind_methods() { } ImageTexture::ImageTexture() { - w = h = 0; image_stored = false; mipmaps = false; @@ -347,7 +329,6 @@ ImageTexture::ImageTexture() { } ImageTexture::~ImageTexture() { - if (texture.is_valid()) { RenderingServer::get_singleton()->free(texture); } @@ -356,7 +337,6 @@ ImageTexture::~ImageTexture() { ////////////////////////////////////////// Ref<Image> StreamTexture2D::load_image_from_file(FileAccess *f, int p_size_limit) { - uint32_t data_format = f->get_32(); uint32_t w = f->get_16(); uint32_t h = f->get_16(); @@ -376,7 +356,6 @@ Ref<Image> StreamTexture2D::load_image_from_file(FileAccess *f, int p_size_limit bool first = true; for (uint32_t i = 0; i < mipmaps + 1; i++) { - uint32_t size = f->get_32(); if (p_size_limit > 0 && i < (mipmaps - 1) && (sw > p_size_limit || sh > p_size_limit)) { @@ -444,7 +423,6 @@ Ref<Image> StreamTexture2D::load_image_from_file(FileAccess *f, int p_size_limit int ofs = 0; for (int i = 0; i < mipmap_images.size(); i++) { - Vector<uint8_t> id = mipmap_images[i]->get_data(); int len = id.size(); const uint8_t *r = id.ptr(); @@ -458,7 +436,6 @@ Ref<Image> StreamTexture2D::load_image_from_file(FileAccess *f, int p_size_limit } } else if (data_format == DATA_FORMAT_IMAGE) { - int size = Image::get_image_data_size(w, h, format, mipmaps ? true : false); for (uint32_t i = 0; i < mipmaps + 1; i++) { @@ -493,7 +470,6 @@ Ref<Image> StreamTexture2D::load_image_from_file(FileAccess *f, int p_size_limit } void StreamTexture2D::set_path(const String &p_path, bool p_take_over) { - if (texture.is_valid()) { RenderingServer::get_singleton()->texture_set_path(texture, p_path); } @@ -502,7 +478,6 @@ void StreamTexture2D::set_path(const String &p_path, bool p_take_over) { } void StreamTexture2D::_requested_3d(void *p_ud) { - StreamTexture2D *st = (StreamTexture2D *)p_ud; Ref<StreamTexture2D> stex(st); ERR_FAIL_COND(!request_3d_callback); @@ -510,7 +485,6 @@ void StreamTexture2D::_requested_3d(void *p_ud) { } void StreamTexture2D::_requested_roughness(void *p_ud, const String &p_normal_path, RS::TextureDetectRoughnessChannel p_roughness_channel) { - StreamTexture2D *st = (StreamTexture2D *)p_ud; Ref<StreamTexture2D> stex(st); ERR_FAIL_COND(!request_roughness_callback); @@ -518,7 +492,6 @@ void StreamTexture2D::_requested_roughness(void *p_ud, const String &p_normal_pa } void StreamTexture2D::_requested_normal(void *p_ud) { - StreamTexture2D *st = (StreamTexture2D *)p_ud; Ref<StreamTexture2D> stex(st); ERR_FAIL_COND(!request_normal_callback); @@ -530,12 +503,10 @@ StreamTexture2D::TextureFormatRoughnessRequestCallback StreamTexture2D::request_ StreamTexture2D::TextureFormatRequestCallback StreamTexture2D::request_normal_callback = nullptr; Image::Format StreamTexture2D::get_format() const { - return format; } Error StreamTexture2D::_load_data(const String &p_path, int &tw, int &th, int &tw_custom, int &th_custom, Ref<Image> &image, bool &r_request_3d, bool &r_request_normal, bool &r_request_roughness, int &mipmap_limit, int p_size_limit) { - alpha_cache.unref(); ERR_FAIL_COND_V(image.is_null(), ERR_INVALID_PARAMETER); @@ -596,7 +567,6 @@ Error StreamTexture2D::_load_data(const String &p_path, int &tw, int &th, int &t } Error StreamTexture2D::load(const String &p_path) { - int lw, lh, lwc, lhc; Ref<Image> image; image.instance(); @@ -607,8 +577,9 @@ Error StreamTexture2D::load(const String &p_path) { int mipmap_limit; Error err = _load_data(p_path, lw, lh, lwc, lhc, image, request_3d, request_normal, request_roughness, mipmap_limit); - if (err) + if (err) { return err; + } if (texture.is_valid()) { RID new_texture = RS::get_singleton()->texture_2d_create(image); @@ -661,21 +632,20 @@ Error StreamTexture2D::load(const String &p_path) { emit_changed(); return OK; } -String StreamTexture2D::get_load_path() const { +String StreamTexture2D::get_load_path() const { return path_to_file; } int StreamTexture2D::get_width() const { - return w; } -int StreamTexture2D::get_height() const { +int StreamTexture2D::get_height() const { return h; } -RID StreamTexture2D::get_rid() const { +RID StreamTexture2D::get_rid() const { if (!texture.is_valid()) { texture = RS::get_singleton()->texture_2d_placeholder_create(); } @@ -683,37 +653,37 @@ RID StreamTexture2D::get_rid() const { } void StreamTexture2D::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - - if ((w | h) == 0) + if ((w | h) == 0) { return; + } RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect(p_canvas_item, Rect2(p_pos, Size2(w, h)), texture, false, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } -void StreamTexture2D::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - if ((w | h) == 0) +void StreamTexture2D::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { + if ((w | h) == 0) { return; + } RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect(p_canvas_item, p_rect, texture, p_tile, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } -void StreamTexture2D::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { - if ((w | h) == 0) +void StreamTexture2D::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { + if ((w | h) == 0) { return; + } RID normal_rid = p_normal_map.is_valid() ? p_normal_map->get_rid() : RID(); RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_texture_rect_region(p_canvas_item, p_rect, texture, p_src_rect, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, p_clip_uv, p_texture_filter, p_texture_repeat); } bool StreamTexture2D::has_alpha() const { - return false; } Ref<Image> StreamTexture2D::get_data() const { - if (texture.is_valid()) { return RS::get_singleton()->texture_2d_get(texture); } else { @@ -722,7 +692,6 @@ Ref<Image> StreamTexture2D::get_data() const { } bool StreamTexture2D::is_pixel_opaque(int p_x, int p_y) const { - if (!alpha_cache.is_valid()) { Ref<Image> img = get_data(); if (img.is_valid()) { @@ -738,7 +707,6 @@ bool StreamTexture2D::is_pixel_opaque(int p_x, int p_y) const { } if (alpha_cache.is_valid()) { - int aw = int(alpha_cache->get_size().width); int ah = int(alpha_cache->get_size().height); if (aw == 0 || ah == 0) { @@ -758,15 +726,16 @@ bool StreamTexture2D::is_pixel_opaque(int p_x, int p_y) const { } void StreamTexture2D::reload_from_file() { - String path = get_path(); - if (!path.is_resource_file()) + if (!path.is_resource_file()) { return; + } path = ResourceLoader::path_remap(path); //remap for translation path = ResourceLoader::import_remap(path); //remap for import - if (!path.is_resource_file()) + if (!path.is_resource_file()) { return; + } load(path); } @@ -775,7 +744,6 @@ void StreamTexture2D::_validate_property(PropertyInfo &property) const { } void StreamTexture2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("load", "path"), &StreamTexture2D::load); ClassDB::bind_method(D_METHOD("get_load_path"), &StreamTexture2D::get_load_path); @@ -783,140 +751,137 @@ void StreamTexture2D::_bind_methods() { } StreamTexture2D::StreamTexture2D() { - format = Image::FORMAT_MAX; w = 0; h = 0; } StreamTexture2D::~StreamTexture2D() { - if (texture.is_valid()) { RS::get_singleton()->free(texture); } } RES ResourceFormatLoaderStreamTexture2D::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { - Ref<StreamTexture2D> st; st.instance(); Error err = st->load(p_path); - if (r_error) + if (r_error) { *r_error = err; - if (err != OK) + } + if (err != OK) { return RES(); + } return st; } void ResourceFormatLoaderStreamTexture2D::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back("stex"); } + bool ResourceFormatLoaderStreamTexture2D::handles_type(const String &p_type) const { return p_type == "StreamTexture2D"; } -String ResourceFormatLoaderStreamTexture2D::get_resource_type(const String &p_path) const { - if (p_path.get_extension().to_lower() == "stex") +String ResourceFormatLoaderStreamTexture2D::get_resource_type(const String &p_path) const { + if (p_path.get_extension().to_lower() == "stex") { return "StreamTexture2D"; + } return ""; } ////////////////////////////////////////// int AtlasTexture::get_width() const { - if (region.size.width == 0) { - if (atlas.is_valid()) + if (atlas.is_valid()) { return atlas->get_width(); + } return 1; } else { return region.size.width + margin.size.width; } } -int AtlasTexture::get_height() const { +int AtlasTexture::get_height() const { if (region.size.height == 0) { - if (atlas.is_valid()) + if (atlas.is_valid()) { return atlas->get_height(); + } return 1; } else { return region.size.height + margin.size.height; } } -RID AtlasTexture::get_rid() const { - if (atlas.is_valid()) +RID AtlasTexture::get_rid() const { + if (atlas.is_valid()) { return atlas->get_rid(); + } return RID(); } bool AtlasTexture::has_alpha() const { - - if (atlas.is_valid()) + if (atlas.is_valid()) { return atlas->has_alpha(); + } return false; } void AtlasTexture::set_atlas(const Ref<Texture2D> &p_atlas) { - ERR_FAIL_COND(p_atlas == this); - if (atlas == p_atlas) + if (atlas == p_atlas) { return; + } atlas = p_atlas; emit_changed(); _change_notify("atlas"); } -Ref<Texture2D> AtlasTexture::get_atlas() const { +Ref<Texture2D> AtlasTexture::get_atlas() const { return atlas; } void AtlasTexture::set_region(const Rect2 &p_region) { - - if (region == p_region) + if (region == p_region) { return; + } region = p_region; emit_changed(); _change_notify("region"); } Rect2 AtlasTexture::get_region() const { - return region; } void AtlasTexture::set_margin(const Rect2 &p_margin) { - - if (margin == p_margin) + if (margin == p_margin) { return; + } margin = p_margin; emit_changed(); _change_notify("margin"); } Rect2 AtlasTexture::get_margin() const { - return margin; } void AtlasTexture::set_filter_clip(const bool p_enable) { - filter_clip = p_enable; emit_changed(); _change_notify("filter_clip"); } bool AtlasTexture::has_filter_clip() const { - return filter_clip; } void AtlasTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_atlas", "atlas"), &AtlasTexture::set_atlas); ClassDB::bind_method(D_METHOD("get_atlas"), &AtlasTexture::get_atlas); @@ -936,9 +901,9 @@ void AtlasTexture::_bind_methods() { } void AtlasTexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - - if (!atlas.is_valid()) + if (!atlas.is_valid()) { return; + } Rect2 rc = region; @@ -956,9 +921,9 @@ void AtlasTexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_m } void AtlasTexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - - if (!atlas.is_valid()) + if (!atlas.is_valid()) { return; + } Rect2 rc = region; @@ -977,11 +942,12 @@ void AtlasTexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RS::get_singleton()->canvas_item_add_texture_rect_region(p_canvas_item, dr, atlas->get_rid(), rc, p_modulate, p_transpose, normal_rid, specular_rid, p_specular_color_shininess, filter_clip, p_texture_filter, p_texture_repeat); } -void AtlasTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { +void AtlasTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { //this might not necessarily work well if using a rect, needs to be fixed properly - if (!atlas.is_valid()) + if (!atlas.is_valid()) { return; + } Rect2 dr; Rect2 src_c; @@ -993,9 +959,9 @@ void AtlasTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, cons } bool AtlasTexture::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, Rect2 &r_rect, Rect2 &r_src_rect) const { - - if (!atlas.is_valid()) + if (!atlas.is_valid()) { return false; + } Rect2 rc = region; @@ -1007,8 +973,9 @@ bool AtlasTexture::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, src.position += (rc.position - margin.position); Rect2 src_c = rc.clip(src); - if (src_c.size == Size2()) + if (src_c.size == Size2()) { return false; + } Vector2 ofs = (src_c.position - src.position); if (scale.x < 0) { @@ -1029,18 +996,20 @@ bool AtlasTexture::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, } bool AtlasTexture::is_pixel_opaque(int p_x, int p_y) const { - - if (!atlas.is_valid()) + if (!atlas.is_valid()) { return true; + } int x = p_x + region.position.x - margin.position.x; int y = p_y + region.position.y - margin.position.y; // margin edge may outside of atlas - if (x < 0 || x >= atlas->get_width()) + if (x < 0 || x >= atlas->get_width()) { return false; - if (y < 0 || y >= atlas->get_height()) + } + if (y < 0 || y >= atlas->get_height()) { return false; + } return atlas->is_pixel_opaque(x, y); } @@ -1054,9 +1023,11 @@ AtlasTexture::AtlasTexture() { int MeshTexture::get_width() const { return size.width; } + int MeshTexture::get_height() const { return size.height; } + RID MeshTexture::get_rid() const { return RID(); } @@ -1068,6 +1039,7 @@ bool MeshTexture::has_alpha() const { void MeshTexture::set_mesh(const Ref<Mesh> &p_mesh) { mesh = p_mesh; } + Ref<Mesh> MeshTexture::get_mesh() const { return mesh; } @@ -1077,7 +1049,6 @@ void MeshTexture::set_image_size(const Size2 &p_size) { } Size2 MeshTexture::get_image_size() const { - return size; } @@ -1090,7 +1061,6 @@ Ref<Texture2D> MeshTexture::get_base_texture() const { } void MeshTexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - if (mesh.is_null() || base_texture.is_null()) { return; } @@ -1104,6 +1074,7 @@ void MeshTexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_mo RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_mesh(p_canvas_item, mesh->get_rid(), xform, p_modulate, base_texture->get_rid(), normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } + void MeshTexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { if (mesh.is_null() || base_texture.is_null()) { return; @@ -1127,8 +1098,8 @@ void MeshTexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_mesh(p_canvas_item, mesh->get_rid(), xform, p_modulate, base_texture->get_rid(), normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } -void MeshTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { +void MeshTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { if (mesh.is_null() || base_texture.is_null()) { return; } @@ -1151,6 +1122,7 @@ void MeshTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const RID specular_rid = p_specular_map.is_valid() ? p_specular_map->get_rid() : RID(); RenderingServer::get_singleton()->canvas_item_add_mesh(p_canvas_item, mesh->get_rid(), xform, p_modulate, base_texture->get_rid(), normal_rid, specular_rid, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } + bool MeshTexture::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, Rect2 &r_rect, Rect2 &r_src_rect) const { r_rect = p_rect; r_src_rect = p_src_rect; @@ -1180,30 +1152,28 @@ MeshTexture::MeshTexture() { ////////////////////////////////////////// int LargeTexture::get_width() const { - return size.width; } -int LargeTexture::get_height() const { +int LargeTexture::get_height() const { return size.height; } -RID LargeTexture::get_rid() const { +RID LargeTexture::get_rid() const { return RID(); } bool LargeTexture::has_alpha() const { - for (int i = 0; i < pieces.size(); i++) { - if (pieces[i].texture->has_alpha()) + if (pieces[i].texture->has_alpha()) { return true; + } } return false; } int LargeTexture::add_piece(const Point2 &p_offset, const Ref<Texture2D> &p_texture) { - ERR_FAIL_COND_V(p_texture.is_null(), -1); Piece p; p.offset = p_offset; @@ -1214,13 +1184,11 @@ int LargeTexture::add_piece(const Point2 &p_offset, const Ref<Texture2D> &p_text } void LargeTexture::set_piece_offset(int p_idx, const Point2 &p_offset) { - ERR_FAIL_INDEX(p_idx, pieces.size()); pieces.write[p_idx].offset = p_offset; }; void LargeTexture::set_piece_texture(int p_idx, const Ref<Texture2D> &p_texture) { - ERR_FAIL_COND(p_texture == this); ERR_FAIL_COND(p_texture.is_null()); ERR_FAIL_INDEX(p_idx, pieces.size()); @@ -1228,17 +1196,15 @@ void LargeTexture::set_piece_texture(int p_idx, const Ref<Texture2D> &p_texture) }; void LargeTexture::set_size(const Size2 &p_size) { - size = p_size; } -void LargeTexture::clear() { +void LargeTexture::clear() { pieces.clear(); size = Size2i(); } Array LargeTexture::_get_data() const { - Array arr; for (int i = 0; i < pieces.size(); i++) { arr.push_back(pieces[i].offset); @@ -1247,8 +1213,8 @@ Array LargeTexture::_get_data() const { arr.push_back(Size2(size)); return arr; } -void LargeTexture::_set_data(const Array &p_array) { +void LargeTexture::_set_data(const Array &p_array) { ERR_FAIL_COND(p_array.size() < 1); ERR_FAIL_COND(!(p_array.size() & 1)); clear(); @@ -1259,24 +1225,22 @@ void LargeTexture::_set_data(const Array &p_array) { } int LargeTexture::get_piece_count() const { - return pieces.size(); } -Vector2 LargeTexture::get_piece_offset(int p_idx) const { +Vector2 LargeTexture::get_piece_offset(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, pieces.size(), Vector2()); return pieces[p_idx].offset; } -Ref<Texture2D> LargeTexture::get_piece_texture(int p_idx) const { +Ref<Texture2D> LargeTexture::get_piece_texture(int p_idx) const { ERR_FAIL_INDEX_V(p_idx, pieces.size(), Ref<Texture2D>()); return pieces[p_idx].texture; } -Ref<Image> LargeTexture::to_image() const { +Ref<Image> LargeTexture::to_image() const { Ref<Image> img = memnew(Image(this->get_width(), this->get_height(), false, Image::FORMAT_RGBA8)); for (int i = 0; i < pieces.size(); i++) { - Ref<Image> src_img = pieces[i].texture->get_data(); img->blit_rect(src_img, Rect2(0, 0, src_img->get_width(), src_img->get_height()), pieces[i].offset); } @@ -1285,7 +1249,6 @@ Ref<Image> LargeTexture::to_image() const { } void LargeTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_piece", "ofs", "texture"), &LargeTexture::add_piece); ClassDB::bind_method(D_METHOD("set_piece_offset", "idx", "ofs"), &LargeTexture::set_piece_offset); ClassDB::bind_method(D_METHOD("set_piece_texture", "idx", "texture"), &LargeTexture::set_piece_texture); @@ -1303,42 +1266,40 @@ void LargeTexture::_bind_methods() { } void LargeTexture::draw(RID p_canvas_item, const Point2 &p_pos, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - for (int i = 0; i < pieces.size(); i++) { - // TODO pieces[i].texture->draw(p_canvas_item, pieces[i].offset + p_pos, p_modulate, p_transpose, p_normal_map, p_specular_map, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } } void LargeTexture::draw_rect(RID p_canvas_item, const Rect2 &p_rect, bool p_tile, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat) const { - //tiling not supported for this - if (size.x == 0 || size.y == 0) + if (size.x == 0 || size.y == 0) { return; + } Size2 scale = p_rect.size / size; for (int i = 0; i < pieces.size(); i++) { - // TODO pieces[i].texture->draw_rect(p_canvas_item, Rect2(pieces[i].offset * scale + p_rect.position, pieces[i].texture->get_size() * scale), false, p_modulate, p_transpose, p_normal_map, p_specular_map, p_specular_color_shininess, p_texture_filter, p_texture_repeat); } } -void LargeTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { +void LargeTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, bool p_transpose, const Ref<Texture2D> &p_normal_map, const Ref<Texture2D> &p_specular_map, const Color &p_specular_color_shininess, RS::CanvasItemTextureFilter p_texture_filter, RS::CanvasItemTextureRepeat p_texture_repeat, bool p_clip_uv) const { //tiling not supported for this - if (p_src_rect.size.x == 0 || p_src_rect.size.y == 0) + if (p_src_rect.size.x == 0 || p_src_rect.size.y == 0) { return; + } Size2 scale = p_rect.size / p_src_rect.size; for (int i = 0; i < pieces.size(); i++) { - // TODO Rect2 rect(pieces[i].offset, pieces[i].texture->get_size()); - if (!p_src_rect.intersects(rect)) + if (!p_src_rect.intersects(rect)) { continue; + } Rect2 local = p_src_rect.clip(rect); Rect2 target = local; target.size *= scale; @@ -1349,12 +1310,11 @@ void LargeTexture::draw_rect_region(RID p_canvas_item, const Rect2 &p_rect, cons } bool LargeTexture::is_pixel_opaque(int p_x, int p_y) const { - for (int i = 0; i < pieces.size(); i++) { - // TODO - if (!pieces[i].texture.is_valid()) + if (!pieces[i].texture.is_valid()) { continue; + } Rect2 rect(pieces[i].offset, pieces[i].texture->get_size()); if (rect.has_point(Point2(p_x, p_y))) { @@ -1371,7 +1331,6 @@ LargeTexture::LargeTexture() { /////////////////// void CurveTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_width", "width"), &CurveTexture::set_width); ClassDB::bind_method(D_METHOD("set_curve", "curve"), &CurveTexture::set_curve); @@ -1384,14 +1343,12 @@ void CurveTexture::_bind_methods() { } void CurveTexture::set_width(int p_width) { - ERR_FAIL_COND(p_width < 32 || p_width > 4096); _width = p_width; _update(); } int CurveTexture::get_width() const { - return _width; } @@ -1421,7 +1378,6 @@ void CurveTexture::set_curve(Ref<Curve> p_curve) { } void CurveTexture::_update() { - Vector<uint8_t> data; data.resize(_width * sizeof(float)); @@ -1457,12 +1413,10 @@ void CurveTexture::_update() { } Ref<Curve> CurveTexture::get_curve() const { - return _curve; } RID CurveTexture::get_rid() const { - if (!_texture.is_valid()) { _texture = RS::get_singleton()->texture_2d_placeholder_create(); } @@ -1472,11 +1426,13 @@ RID CurveTexture::get_rid() const { CurveTexture::CurveTexture() { _width = 2048; } + CurveTexture::~CurveTexture() { if (_texture.is_valid()) { RS::get_singleton()->free(_texture); } } + ////////////////// //setter and getter names for property serialization @@ -1499,7 +1455,6 @@ GradientTexture::~GradientTexture() { } void GradientTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_gradient", "gradient"), &GradientTexture::set_gradient); ClassDB::bind_method(D_METHOD("get_gradient"), &GradientTexture::get_gradient); @@ -1512,8 +1467,9 @@ void GradientTexture::_bind_methods() { } void GradientTexture::set_gradient(Ref<Gradient> p_gradient) { - if (p_gradient == gradient) + if (p_gradient == gradient) { return; + } if (gradient.is_valid()) { gradient->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &GradientTexture::_update)); } @@ -1530,20 +1486,20 @@ Ref<Gradient> GradientTexture::get_gradient() const { } void GradientTexture::_queue_update() { - - if (update_pending) + if (update_pending) { return; + } update_pending = true; call_deferred("_update"); } void GradientTexture::_update() { - update_pending = false; - if (gradient.is_null()) + if (gradient.is_null()) { return; + } Vector<uint8_t> data; data.resize(width * 4); @@ -1552,7 +1508,6 @@ void GradientTexture::_update() { Gradient &g = **gradient; for (int i = 0; i < width; i++) { - float ofs = float(i) / (width - 1); Color color = g.get_color_at_offset(ofs); @@ -1576,12 +1531,11 @@ void GradientTexture::_update() { } void GradientTexture::set_width(int p_width) { - width = p_width; _queue_update(); } -int GradientTexture::get_width() const { +int GradientTexture::get_width() const { return width; } @@ -1595,7 +1549,6 @@ Ref<Image> GradientTexture::get_data() const { ////////////////////////////////////// void ProxyTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_base", "base"), &ProxyTexture::set_base); ClassDB::bind_method(D_METHOD("get_base"), &ProxyTexture::get_base); @@ -1603,7 +1556,6 @@ void ProxyTexture::_bind_methods() { } void ProxyTexture::set_base(const Ref<Texture2D> &p_texture) { - ERR_FAIL_COND(p_texture == this); base = p_texture; @@ -1621,24 +1573,24 @@ void ProxyTexture::set_base(const Ref<Texture2D> &p_texture) { } Ref<Texture2D> ProxyTexture::get_base() const { - return base; } int ProxyTexture::get_width() const { - - if (base.is_valid()) + if (base.is_valid()) { return base->get_width(); + } return 1; } -int ProxyTexture::get_height() const { - if (base.is_valid()) +int ProxyTexture::get_height() const { + if (base.is_valid()) { return base->get_height(); + } return 1; } -RID ProxyTexture::get_rid() const { +RID ProxyTexture::get_rid() const { if (proxy.is_null()) { proxy_ph = RS::get_singleton()->texture_2d_placeholder_create(); proxy = RS::get_singleton()->texture_proxy_create(proxy_ph); @@ -1647,19 +1599,17 @@ RID ProxyTexture::get_rid() const { } bool ProxyTexture::has_alpha() const { - - if (base.is_valid()) + if (base.is_valid()) { return base->has_alpha(); + } return false; } ProxyTexture::ProxyTexture() { - //proxy = RS::get_singleton()->texture_create(); } ProxyTexture::~ProxyTexture() { - if (proxy_ph.is_valid()) { RS::get_singleton()->free(proxy_ph); } @@ -1667,10 +1617,10 @@ ProxyTexture::~ProxyTexture() { RS::get_singleton()->free(proxy); } } + ////////////////////////////////////////////// void AnimatedTexture::_update_proxy() { - RWLockRead r(rw_lock); float delta; @@ -1726,6 +1676,7 @@ void AnimatedTexture::set_frames(int p_frames) { frame_count = p_frames; } + int AnimatedTexture::get_frames() const { return frame_count; } @@ -1737,6 +1688,7 @@ void AnimatedTexture::set_current_frame(int p_frame) { current_frame = p_frame; } + int AnimatedTexture::get_current_frame() const { return current_frame; } @@ -1745,6 +1697,7 @@ void AnimatedTexture::set_pause(bool p_pause) { RWLockWrite r(rw_lock); pause = p_pause; } + bool AnimatedTexture::get_pause() const { return pause; } @@ -1753,12 +1706,12 @@ void AnimatedTexture::set_oneshot(bool p_oneshot) { RWLockWrite r(rw_lock); oneshot = p_oneshot; } + bool AnimatedTexture::get_oneshot() const { return oneshot; } void AnimatedTexture::set_frame_texture(int p_frame, const Ref<Texture2D> &p_texture) { - ERR_FAIL_COND(p_texture == this); ERR_FAIL_INDEX(p_frame, MAX_FRAMES); @@ -1766,6 +1719,7 @@ void AnimatedTexture::set_frame_texture(int p_frame, const Ref<Texture2D> &p_tex frames[p_frame].texture = p_texture; } + Ref<Texture2D> AnimatedTexture::get_frame_texture(int p_frame) const { ERR_FAIL_INDEX_V(p_frame, MAX_FRAMES, Ref<Texture2D>()); @@ -1781,6 +1735,7 @@ void AnimatedTexture::set_frame_delay(int p_frame, float p_delay_sec) { frames[p_frame].delay_sec = p_delay_sec; } + float AnimatedTexture::get_frame_delay(int p_frame) const { ERR_FAIL_INDEX_V(p_frame, MAX_FRAMES, 0); @@ -1794,6 +1749,7 @@ void AnimatedTexture::set_fps(float p_fps) { fps = p_fps; } + float AnimatedTexture::get_fps() const { return fps; } @@ -1807,6 +1763,7 @@ int AnimatedTexture::get_width() const { return frames[current_frame].texture->get_width(); } + int AnimatedTexture::get_height() const { RWLockRead r(rw_lock); @@ -1816,12 +1773,12 @@ int AnimatedTexture::get_height() const { return frames[current_frame].texture->get_height(); } + RID AnimatedTexture::get_rid() const { return proxy; } bool AnimatedTexture::has_alpha() const { - RWLockRead r(rw_lock); if (!frames[current_frame].texture.is_valid()) { @@ -1832,7 +1789,6 @@ bool AnimatedTexture::has_alpha() const { } Ref<Image> AnimatedTexture::get_data() const { - RWLockRead r(rw_lock); if (!frames[current_frame].texture.is_valid()) { @@ -1843,7 +1799,6 @@ Ref<Image> AnimatedTexture::get_data() const { } bool AnimatedTexture::is_pixel_opaque(int p_x, int p_y) const { - RWLockRead r(rw_lock); if (frames[current_frame].texture.is_valid()) { @@ -1853,7 +1808,6 @@ bool AnimatedTexture::is_pixel_opaque(int p_x, int p_y) const { } void AnimatedTexture::_validate_property(PropertyInfo &property) const { - String prop = property.name; if (prop.begins_with("frame_")) { int frame = prop.get_slicec('/', 0).get_slicec('_', 1).to_int(); @@ -1928,10 +1882,10 @@ AnimatedTexture::~AnimatedTexture() { memdelete(rw_lock); } } + /////////////////////////////// void TextureLayered::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_format"), &TextureLayered::get_format); ClassDB::bind_method(D_METHOD("get_layered_type"), &TextureLayered::get_layered_type); ClassDB::bind_method(D_METHOD("get_width"), &TextureLayered::get_width); @@ -1990,7 +1944,6 @@ Array ImageTextureLayered::_get_images() const { } Error ImageTextureLayered::create_from_images(Vector<Ref<Image>> p_images) { - int new_layers = p_images.size(); ERR_FAIL_COND_V(new_layers == 0, ERR_INVALID_PARAMETER); if (layered_type == LAYERED_TYPE_CUBEMAP) { @@ -2065,7 +2018,6 @@ void ImageTextureLayered::set_path(const String &p_path, bool p_take_over) { } void ImageTextureLayered::_bind_methods() { - ClassDB::bind_method(D_METHOD("create_from_images", "images"), &ImageTextureLayered::_create_from_images); ClassDB::bind_method(D_METHOD("update_layer", "image", "layer"), &ImageTextureLayered::update_layer); @@ -2092,7 +2044,6 @@ ImageTextureLayered::~ImageTextureLayered() { /////////////////////////////////////////// void StreamTextureLayered::set_path(const String &p_path, bool p_take_over) { - if (texture.is_valid()) { RenderingServer::get_singleton()->texture_set_path(texture, p_path); } @@ -2101,12 +2052,10 @@ void StreamTextureLayered::set_path(const String &p_path, bool p_take_over) { } Image::Format StreamTextureLayered::get_format() const { - return format; } Error StreamTextureLayered::_load_data(const String &p_path, Vector<Ref<Image>> &images, int &mipmap_limit, int p_size_limit) { - ERR_FAIL_COND_V(images.size() != 0, ERR_INVALID_PARAMETER); FileAccessRef f = FileAccess::open(p_path, FileAccess::READ); @@ -2151,14 +2100,14 @@ Error StreamTextureLayered::_load_data(const String &p_path, Vector<Ref<Image>> } Error StreamTextureLayered::load(const String &p_path) { - Vector<Ref<Image>> images; int mipmap_limit; Error err = _load_data(p_path, images, mipmap_limit); - if (err) + if (err) { return err; + } if (texture.is_valid()) { RID new_texture = RS::get_singleton()->texture_2d_layered_create(images, RS::TextureLayeredType(layered_type)); @@ -2184,34 +2133,32 @@ Error StreamTextureLayered::load(const String &p_path) { emit_changed(); return OK; } -String StreamTextureLayered::get_load_path() const { +String StreamTextureLayered::get_load_path() const { return path_to_file; } int StreamTextureLayered::get_width() const { - return w; } -int StreamTextureLayered::get_height() const { +int StreamTextureLayered::get_height() const { return h; } -int StreamTextureLayered::get_layers() const { +int StreamTextureLayered::get_layers() const { return layers; } + bool StreamTextureLayered::has_mipmaps() const { return mipmaps; } TextureLayered::LayeredType StreamTextureLayered::get_layered_type() const { - return layered_type; } RID StreamTextureLayered::get_rid() const { - if (!texture.is_valid()) { texture = RS::get_singleton()->texture_2d_layered_placeholder_create(RS::TextureLayeredType(layered_type)); } @@ -2219,7 +2166,6 @@ RID StreamTextureLayered::get_rid() const { } Ref<Image> StreamTextureLayered::get_layer_data(int p_layer) const { - if (texture.is_valid()) { return RS::get_singleton()->texture_2d_layer_get(texture, p_layer); } else { @@ -2228,15 +2174,16 @@ Ref<Image> StreamTextureLayered::get_layer_data(int p_layer) const { } void StreamTextureLayered::reload_from_file() { - String path = get_path(); - if (!path.is_resource_file()) + if (!path.is_resource_file()) { return; + } path = ResourceLoader::path_remap(path); //remap for translation path = ResourceLoader::import_remap(path); //remap for import - if (!path.is_resource_file()) + if (!path.is_resource_file()) { return; + } load(path); } @@ -2245,7 +2192,6 @@ void StreamTextureLayered::_validate_property(PropertyInfo &property) const { } void StreamTextureLayered::_bind_methods() { - ClassDB::bind_method(D_METHOD("load", "path"), &StreamTextureLayered::load); ClassDB::bind_method(D_METHOD("get_load_path"), &StreamTextureLayered::get_load_path); @@ -2253,7 +2199,6 @@ void StreamTextureLayered::_bind_methods() { } StreamTextureLayered::StreamTextureLayered(LayeredType p_type) { - layered_type = p_type; format = Image::FORMAT_MAX; w = 0; @@ -2263,7 +2208,6 @@ StreamTextureLayered::StreamTextureLayered(LayeredType p_type) { } StreamTextureLayered::~StreamTextureLayered() { - if (texture.is_valid()) { RS::get_singleton()->free(texture); } @@ -2272,7 +2216,6 @@ StreamTextureLayered::~StreamTextureLayered() { ///////////////////////////////////////////////// RES ResourceFormatLoaderStreamTextureLayered::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, bool p_no_cache) { - Ref<StreamTextureLayered> st; if (p_path.get_extension().to_lower() == "stexarray") { Ref<StreamTexture2DArray> s; @@ -2293,31 +2236,36 @@ RES ResourceFormatLoaderStreamTextureLayered::load(const String &p_path, const S return RES(); } Error err = st->load(p_path); - if (r_error) + if (r_error) { *r_error = err; - if (err != OK) + } + if (err != OK) { return RES(); + } return st; } void ResourceFormatLoaderStreamTextureLayered::get_recognized_extensions(List<String> *p_extensions) const { - p_extensions->push_back("stexarray"); p_extensions->push_back("scube"); p_extensions->push_back("scubearray"); } + bool ResourceFormatLoaderStreamTextureLayered::handles_type(const String &p_type) const { return p_type == "StreamTexture2DArray" || p_type == "StreamCubemap" || p_type == "StreamCubemapArray"; } -String ResourceFormatLoaderStreamTextureLayered::get_resource_type(const String &p_path) const { - if (p_path.get_extension().to_lower() == "stexarray") +String ResourceFormatLoaderStreamTextureLayered::get_resource_type(const String &p_path) const { + if (p_path.get_extension().to_lower() == "stexarray") { return "StreamTexture2DArray"; - if (p_path.get_extension().to_lower() == "scube") + } + if (p_path.get_extension().to_lower() == "scube") { return "StreamCubemap"; - if (p_path.get_extension().to_lower() == "scubearray") + } + if (p_path.get_extension().to_lower() == "scubearray") { return "StreamCubemapArray"; + } return ""; } diff --git a/scene/resources/texture.h b/scene/resources/texture.h index 5d4131ec4c..005f899512 100644 --- a/scene/resources/texture.h +++ b/scene/resources/texture.h @@ -51,7 +51,6 @@ public: }; class Texture2D : public Texture { - GDCLASS(Texture2D, Texture); OBJ_SAVE_TYPE(Texture2D); // Saves derived classes with common type so they can be interchanged. @@ -81,7 +80,6 @@ public: class BitMap; class ImageTexture : public Texture2D { - GDCLASS(ImageTexture, Texture2D); RES_BASE_EXTENSION("tex"); @@ -133,7 +131,6 @@ public: }; class StreamTexture2D : public Texture2D { - GDCLASS(StreamTexture2D, Texture2D); public: @@ -220,7 +217,6 @@ public: }; class AtlasTexture : public Texture2D { - GDCLASS(AtlasTexture, Texture2D); RES_BASE_EXTENSION("atlastex"); @@ -264,7 +260,6 @@ public: class Mesh; class MeshTexture : public Texture2D { - GDCLASS(MeshTexture, Texture2D); RES_BASE_EXTENSION("meshtex"); @@ -302,13 +297,11 @@ public: }; class LargeTexture : public Texture2D { - GDCLASS(LargeTexture, Texture2D); RES_BASE_EXTENSION("largetex"); protected: struct Piece { - Point2 offset; Ref<Texture2D> texture; }; @@ -373,7 +366,6 @@ public: VARIANT_ENUM_CAST(TextureLayered::LayeredType) class ImageTextureLayered : public TextureLayered { - GDCLASS(ImageTextureLayered, TextureLayered); LayeredType layered_type; @@ -413,7 +405,6 @@ public: }; class Texture2DArray : public ImageTextureLayered { - GDCLASS(Texture2DArray, ImageTextureLayered) public: Texture2DArray() : @@ -421,7 +412,6 @@ public: }; class Cubemap : public ImageTextureLayered { - GDCLASS(Cubemap, ImageTextureLayered); public: @@ -430,7 +420,6 @@ public: }; class CubemapArray : public ImageTextureLayered { - GDCLASS(CubemapArray, ImageTextureLayered); public: @@ -439,7 +428,6 @@ public: }; class StreamTextureLayered : public TextureLayered { - GDCLASS(StreamTextureLayered, TextureLayered); public: @@ -498,7 +486,6 @@ public: }; class StreamTexture2DArray : public StreamTextureLayered { - GDCLASS(StreamTexture2DArray, StreamTextureLayered) public: StreamTexture2DArray() : @@ -506,7 +493,6 @@ public: }; class StreamCubemap : public StreamTextureLayered { - GDCLASS(StreamCubemap, StreamTextureLayered); public: @@ -515,7 +501,6 @@ public: }; class StreamCubemapArray : public StreamTextureLayered { - GDCLASS(StreamCubemapArray, StreamTextureLayered); public: @@ -532,7 +517,6 @@ public: }; class CurveTexture : public Texture2D { - GDCLASS(CurveTexture, Texture2D); RES_BASE_EXTENSION("curvetex") @@ -582,7 +566,6 @@ class GradientTexture : public Texture2D { public: struct Point { - float offset; Color color; bool operator<(const Point &p_ponit) const { @@ -659,7 +642,6 @@ private: RID proxy; struct Frame { - Ref<Texture2D> texture; float delay_sec; diff --git a/scene/resources/theme.cpp b/scene/resources/theme.cpp index 325ada69ea..6a85d357ff 100644 --- a/scene/resources/theme.cpp +++ b/scene/resources/theme.cpp @@ -33,12 +33,10 @@ #include "core/print_string.h" void Theme::_emit_theme_changed() { - emit_changed(); } Vector<String> Theme::_get_icon_list(const String &p_type) const { - Vector<String> ilret; List<StringName> il; @@ -54,7 +52,6 @@ Vector<String> Theme::_get_icon_list(const String &p_type) const { } Vector<String> Theme::_get_stylebox_list(const String &p_type) const { - Vector<String> ilret; List<StringName> il; @@ -70,7 +67,6 @@ Vector<String> Theme::_get_stylebox_list(const String &p_type) const { } Vector<String> Theme::_get_stylebox_types() const { - Vector<String> ilret; List<StringName> il; @@ -86,7 +82,6 @@ Vector<String> Theme::_get_stylebox_types() const { } Vector<String> Theme::_get_font_list(const String &p_type) const { - Vector<String> ilret; List<StringName> il; @@ -102,7 +97,6 @@ Vector<String> Theme::_get_font_list(const String &p_type) const { } Vector<String> Theme::_get_color_list(const String &p_type) const { - Vector<String> ilret; List<StringName> il; @@ -118,7 +112,6 @@ Vector<String> Theme::_get_color_list(const String &p_type) const { } Vector<String> Theme::_get_constant_list(const String &p_type) const { - Vector<String> ilret; List<StringName> il; @@ -134,7 +127,6 @@ Vector<String> Theme::_get_constant_list(const String &p_type) const { } Vector<String> Theme::_get_type_list(const String &p_type) const { - Vector<String> ilret; List<StringName> il; @@ -150,32 +142,26 @@ Vector<String> Theme::_get_type_list(const String &p_type) const { } bool Theme::_set(const StringName &p_name, const Variant &p_value) { - String sname = p_name; if (sname.find("/") != -1) { - String type = sname.get_slicec('/', 1); String node_type = sname.get_slicec('/', 0); String name = sname.get_slicec('/', 2); if (type == "icons") { - set_icon(name, node_type, p_value); } else if (type == "styles") { - set_stylebox(name, node_type, p_value); } else if (type == "fonts") { - set_font(name, node_type, p_value); } else if (type == "colors") { - set_color(name, node_type, p_value); } else if (type == "constants") { - set_constant(name, node_type, p_value); - } else + } else { return false; + } return true; } @@ -184,41 +170,38 @@ bool Theme::_set(const StringName &p_name, const Variant &p_value) { } bool Theme::_get(const StringName &p_name, Variant &r_ret) const { - String sname = p_name; if (sname.find("/") != -1) { - String type = sname.get_slicec('/', 1); String node_type = sname.get_slicec('/', 0); String name = sname.get_slicec('/', 2); if (type == "icons") { - - if (!has_icon(name, node_type)) + if (!has_icon(name, node_type)) { r_ret = Ref<Texture2D>(); - else + } else { r_ret = get_icon(name, node_type); + } } else if (type == "styles") { - - if (!has_stylebox(name, node_type)) + if (!has_stylebox(name, node_type)) { r_ret = Ref<StyleBox>(); - else + } else { r_ret = get_stylebox(name, node_type); + } } else if (type == "fonts") { - - if (!has_font(name, node_type)) + if (!has_font(name, node_type)) { r_ret = Ref<Font>(); - else + } else { r_ret = get_font(name, node_type); + } } else if (type == "colors") { - r_ret = get_color(name, node_type); } else if (type == "constants") { - r_ret = get_constant(name, node_type); - } else + } else { return false; + } return true; } @@ -227,17 +210,14 @@ bool Theme::_get(const StringName &p_name, Variant &r_ret) const { } void Theme::_get_property_list(List<PropertyInfo> *p_list) const { - List<PropertyInfo> list; const StringName *key = nullptr; while ((key = icon_map.next(key))) { - const StringName *key2 = nullptr; while ((key2 = icon_map[*key].next(key2))) { - list.push_back(PropertyInfo(Variant::OBJECT, String() + *key + "/icons/" + *key2, PROPERTY_HINT_RESOURCE_TYPE, "Texture2D", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_STORE_IF_NULL)); } } @@ -245,11 +225,9 @@ void Theme::_get_property_list(List<PropertyInfo> *p_list) const { key = nullptr; while ((key = style_map.next(key))) { - const StringName *key2 = nullptr; while ((key2 = style_map[*key].next(key2))) { - list.push_back(PropertyInfo(Variant::OBJECT, String() + *key + "/styles/" + *key2, PROPERTY_HINT_RESOURCE_TYPE, "StyleBox", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_STORE_IF_NULL)); } } @@ -257,11 +235,9 @@ void Theme::_get_property_list(List<PropertyInfo> *p_list) const { key = nullptr; while ((key = font_map.next(key))) { - const StringName *key2 = nullptr; while ((key2 = font_map[*key].next(key2))) { - list.push_back(PropertyInfo(Variant::OBJECT, String() + *key + "/fonts/" + *key2, PROPERTY_HINT_RESOURCE_TYPE, "Font", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_STORE_IF_NULL)); } } @@ -269,11 +245,9 @@ void Theme::_get_property_list(List<PropertyInfo> *p_list) const { key = nullptr; while ((key = color_map.next(key))) { - const StringName *key2 = nullptr; while ((key2 = color_map[*key].next(key2))) { - list.push_back(PropertyInfo(Variant::COLOR, String() + *key + "/colors/" + *key2)); } } @@ -281,11 +255,9 @@ void Theme::_get_property_list(List<PropertyInfo> *p_list) const { key = nullptr; while ((key = constant_map.next(key))) { - const StringName *key2 = nullptr; while ((key2 = constant_map[*key].next(key2))) { - list.push_back(PropertyInfo(Variant::INT, String() + *key + "/constants/" + *key2)); } } @@ -297,9 +269,9 @@ void Theme::_get_property_list(List<PropertyInfo> *p_list) const { } void Theme::set_default_theme_font(const Ref<Font> &p_default_font) { - - if (default_theme_font == p_default_font) + if (default_theme_font == p_default_font) { return; + } if (default_theme_font.is_valid()) { default_theme_font->disconnect("changed", callable_mp(this, &Theme::_emit_theme_changed)); @@ -316,7 +288,6 @@ void Theme::set_default_theme_font(const Ref<Font> &p_default_font) { } Ref<Font> Theme::get_default_theme_font() const { - return default_theme_font; } @@ -327,40 +298,34 @@ Ref<StyleBox> Theme::default_style; Ref<Font> Theme::default_font; Ref<Theme> Theme::get_default() { - return default_theme; } void Theme::set_default(const Ref<Theme> &p_default) { - default_theme = p_default; } Ref<Theme> Theme::get_project_default() { - return project_default_theme; } void Theme::set_project_default(const Ref<Theme> &p_project_default) { - project_default_theme = p_project_default; } void Theme::set_default_icon(const Ref<Texture2D> &p_icon) { - default_icon = p_icon; } -void Theme::set_default_style(const Ref<StyleBox> &p_style) { +void Theme::set_default_style(const Ref<StyleBox> &p_style) { default_style = p_style; } -void Theme::set_default_font(const Ref<Font> &p_font) { +void Theme::set_default_font(const Ref<Font> &p_font) { default_font = p_font; } void Theme::set_icon(const StringName &p_name, const StringName &p_type, const Ref<Texture2D> &p_icon) { - //ERR_FAIL_COND(p_icon.is_null()); bool new_value = !icon_map.has(p_type) || !icon_map[p_type].has(p_name); @@ -380,10 +345,9 @@ void Theme::set_icon(const StringName &p_name, const StringName &p_type, const R emit_changed(); } } -Ref<Texture2D> Theme::get_icon(const StringName &p_name, const StringName &p_type) const { +Ref<Texture2D> Theme::get_icon(const StringName &p_name, const StringName &p_type) const { if (icon_map.has(p_type) && icon_map[p_type].has(p_name) && icon_map[p_type][p_name].is_valid()) { - return icon_map[p_type][p_name]; } else { return default_icon; @@ -391,12 +355,10 @@ Ref<Texture2D> Theme::get_icon(const StringName &p_name, const StringName &p_typ } bool Theme::has_icon(const StringName &p_name, const StringName &p_type) const { - return (icon_map.has(p_type) && icon_map[p_type].has(p_name) && icon_map[p_type][p_name].is_valid()); } void Theme::clear_icon(const StringName &p_name, const StringName &p_type) { - ERR_FAIL_COND(!icon_map.has(p_type)); ERR_FAIL_COND(!icon_map[p_type].has(p_name)); @@ -411,16 +373,15 @@ void Theme::clear_icon(const StringName &p_name, const StringName &p_type) { } void Theme::get_icon_list(StringName p_type, List<StringName> *p_list) const { - ERR_FAIL_NULL(p_list); - if (!icon_map.has(p_type)) + if (!icon_map.has(p_type)) { return; + } const StringName *key = nullptr; while ((key = icon_map[p_type].next(key))) { - p_list->push_back(*key); } } @@ -458,22 +419,20 @@ void Theme::clear_shader(const StringName &p_name, const StringName &p_type) { } void Theme::get_shader_list(const StringName &p_type, List<StringName> *p_list) const { - ERR_FAIL_NULL(p_list); - if (!shader_map.has(p_type)) + if (!shader_map.has(p_type)) { return; + } const StringName *key = nullptr; while ((key = shader_map[p_type].next(key))) { - p_list->push_back(*key); } } void Theme::set_stylebox(const StringName &p_name, const StringName &p_type, const Ref<StyleBox> &p_style) { - //ERR_FAIL_COND(p_style.is_null()); bool new_value = !style_map.has(p_type) || !style_map[p_type].has(p_name); @@ -488,15 +447,14 @@ void Theme::set_stylebox(const StringName &p_name, const StringName &p_type, con style_map[p_type][p_name]->connect("changed", callable_mp(this, &Theme::_emit_theme_changed), varray(), CONNECT_REFERENCE_COUNTED); } - if (new_value) + if (new_value) { _change_notify(); + } emit_changed(); } Ref<StyleBox> Theme::get_stylebox(const StringName &p_name, const StringName &p_type) const { - if (style_map.has(p_type) && style_map[p_type].has(p_name) && style_map[p_type][p_name].is_valid()) { - return style_map[p_type][p_name]; } else { return default_style; @@ -504,12 +462,10 @@ Ref<StyleBox> Theme::get_stylebox(const StringName &p_name, const StringName &p_ } bool Theme::has_stylebox(const StringName &p_name, const StringName &p_type) const { - return (style_map.has(p_type) && style_map[p_type].has(p_name) && style_map[p_type][p_name].is_valid()); } void Theme::clear_stylebox(const StringName &p_name, const StringName &p_type) { - ERR_FAIL_COND(!style_map.has(p_type)); ERR_FAIL_COND(!style_map[p_type].has(p_name)); @@ -524,16 +480,15 @@ void Theme::clear_stylebox(const StringName &p_name, const StringName &p_type) { } void Theme::get_stylebox_list(StringName p_type, List<StringName> *p_list) const { - ERR_FAIL_NULL(p_list); - if (!style_map.has(p_type)) + if (!style_map.has(p_type)) { return; + } const StringName *key = nullptr; while ((key = style_map[p_type].next(key))) { - p_list->push_back(*key); } } @@ -548,7 +503,6 @@ void Theme::get_stylebox_types(List<StringName> *p_list) const { } void Theme::set_font(const StringName &p_name, const StringName &p_type, const Ref<Font> &p_font) { - //ERR_FAIL_COND(p_font.is_null()); bool new_value = !font_map.has(p_type) || !font_map[p_type].has(p_name); @@ -568,23 +522,22 @@ void Theme::set_font(const StringName &p_name, const StringName &p_type, const R emit_changed(); } } -Ref<Font> Theme::get_font(const StringName &p_name, const StringName &p_type) const { - if (font_map.has(p_type) && font_map[p_type].has(p_name) && font_map[p_type][p_name].is_valid()) +Ref<Font> Theme::get_font(const StringName &p_name, const StringName &p_type) const { + if (font_map.has(p_type) && font_map[p_type].has(p_name) && font_map[p_type][p_name].is_valid()) { return font_map[p_type][p_name]; - else if (default_theme_font.is_valid()) + } else if (default_theme_font.is_valid()) { return default_theme_font; - else + } else { return default_font; + } } bool Theme::has_font(const StringName &p_name, const StringName &p_type) const { - return (font_map.has(p_type) && font_map[p_type].has(p_name) && font_map[p_type][p_name].is_valid()); } void Theme::clear_font(const StringName &p_name, const StringName &p_type) { - ERR_FAIL_COND(!font_map.has(p_type)); ERR_FAIL_COND(!font_map[p_type].has(p_name)); @@ -598,22 +551,20 @@ void Theme::clear_font(const StringName &p_name, const StringName &p_type) { } void Theme::get_font_list(StringName p_type, List<StringName> *p_list) const { - ERR_FAIL_NULL(p_list); - if (!font_map.has(p_type)) + if (!font_map.has(p_type)) { return; + } const StringName *key = nullptr; while ((key = font_map[p_type].next(key))) { - p_list->push_back(*key); } } void Theme::set_color(const StringName &p_name, const StringName &p_type, const Color &p_color) { - bool new_value = !color_map.has(p_type) || !color_map[p_type].has(p_name); color_map[p_type][p_name] = p_color; @@ -625,20 +576,18 @@ void Theme::set_color(const StringName &p_name, const StringName &p_type, const } Color Theme::get_color(const StringName &p_name, const StringName &p_type) const { - - if (color_map.has(p_type) && color_map[p_type].has(p_name)) + if (color_map.has(p_type) && color_map[p_type].has(p_name)) { return color_map[p_type][p_name]; - else + } else { return Color(); + } } bool Theme::has_color(const StringName &p_name, const StringName &p_type) const { - return (color_map.has(p_type) && color_map[p_type].has(p_name)); } void Theme::clear_color(const StringName &p_name, const StringName &p_type) { - ERR_FAIL_COND(!color_map.has(p_type)); ERR_FAIL_COND(!color_map[p_type].has(p_name)); @@ -648,22 +597,20 @@ void Theme::clear_color(const StringName &p_name, const StringName &p_type) { } void Theme::get_color_list(StringName p_type, List<StringName> *p_list) const { - ERR_FAIL_NULL(p_list); - if (!color_map.has(p_type)) + if (!color_map.has(p_type)) { return; + } const StringName *key = nullptr; while ((key = color_map[p_type].next(key))) { - p_list->push_back(*key); } } void Theme::set_constant(const StringName &p_name, const StringName &p_type, int p_constant) { - bool new_value = !constant_map.has(p_type) || !constant_map[p_type].has(p_name); constant_map[p_type][p_name] = p_constant; @@ -674,21 +621,18 @@ void Theme::set_constant(const StringName &p_name, const StringName &p_type, int } int Theme::get_constant(const StringName &p_name, const StringName &p_type) const { - - if (constant_map.has(p_type) && constant_map[p_type].has(p_name)) + if (constant_map.has(p_type) && constant_map[p_type].has(p_name)) { return constant_map[p_type][p_name]; - else { + } else { return 0; } } bool Theme::has_constant(const StringName &p_name, const StringName &p_type) const { - return (constant_map.has(p_type) && constant_map[p_type].has(p_name)); } void Theme::clear_constant(const StringName &p_name, const StringName &p_type) { - ERR_FAIL_COND(!constant_map.has(p_type)); ERR_FAIL_COND(!constant_map[p_type].has(p_name)); @@ -698,22 +642,20 @@ void Theme::clear_constant(const StringName &p_name, const StringName &p_type) { } void Theme::get_constant_list(StringName p_type, List<StringName> *p_list) const { - ERR_FAIL_NULL(p_list); - if (!constant_map.has(p_type)) + if (!constant_map.has(p_type)) { return; + } const StringName *key = nullptr; while ((key = constant_map[p_type].next(key))) { - p_list->push_back(*key); } } void Theme::clear() { - //these need disconnecting { const StringName *K = nullptr; @@ -766,13 +708,11 @@ void Theme::clear() { } void Theme::copy_default_theme() { - Ref<Theme> default_theme2 = get_default(); copy_theme(default_theme2); } void Theme::copy_theme(const Ref<Theme> &p_other) { - if (p_other.is_null()) { clear(); @@ -821,53 +761,45 @@ void Theme::copy_theme(const Ref<Theme> &p_other) { } void Theme::get_type_list(List<StringName> *p_list) const { - ERR_FAIL_NULL(p_list); Set<StringName> types; const StringName *key = nullptr; while ((key = icon_map.next(key))) { - types.insert(*key); } key = nullptr; while ((key = style_map.next(key))) { - types.insert(*key); } key = nullptr; while ((key = font_map.next(key))) { - types.insert(*key); } key = nullptr; while ((key = color_map.next(key))) { - types.insert(*key); } key = nullptr; while ((key = constant_map.next(key))) { - types.insert(*key); } for (Set<StringName>::Element *E = types.front(); E; E = E->next()) { - p_list->push_back(E->get()); } } void Theme::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_icon", "name", "type", "texture"), &Theme::set_icon); ClassDB::bind_method(D_METHOD("get_icon", "name", "type"), &Theme::get_icon); ClassDB::bind_method(D_METHOD("has_icon", "name", "type"), &Theme::has_icon); diff --git a/scene/resources/theme.h b/scene/resources/theme.h index b5043c35e8..3c72ddd8a2 100644 --- a/scene/resources/theme.h +++ b/scene/resources/theme.h @@ -39,7 +39,6 @@ #include "scene/resources/texture.h" class Theme : public Resource { - GDCLASS(Theme, Resource); RES_BASE_EXTENSION("theme"); diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 1b68b7486b..c17b6f8817 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -33,50 +33,52 @@ #include "core/engine.h" bool TileSet::_set(const StringName &p_name, const Variant &p_value) { - String n = p_name; int slash = n.find("/"); - if (slash == -1) + if (slash == -1) { return false; + } int id = String::to_int(n.c_str(), slash); - if (!tile_map.has(id)) + if (!tile_map.has(id)) { create_tile(id); + } String what = n.substr(slash + 1, n.length()); - if (what == "name") + if (what == "name") { tile_set_name(id, p_value); - else if (what == "texture") + } else if (what == "texture") { tile_set_texture(id, p_value); - else if (what == "normal_map") + } else if (what == "normal_map") { tile_set_normal_map(id, p_value); - else if (what == "tex_offset") + } else if (what == "tex_offset") { tile_set_texture_offset(id, p_value); - else if (what == "material") + } else if (what == "material") { tile_set_material(id, p_value); - else if (what == "modulate") + } else if (what == "modulate") { tile_set_modulate(id, p_value); - else if (what == "region") + } else if (what == "region") { tile_set_region(id, p_value); - else if (what == "tile_mode") + } else if (what == "tile_mode") { tile_set_tile_mode(id, (TileMode)((int)p_value)); - else if (what == "is_autotile") { + } else if (what == "is_autotile") { // backward compatibility for Godot 3.0.x // autotile used to be a bool, it's now an enum bool is_autotile = p_value; - if (is_autotile) + if (is_autotile) { tile_set_tile_mode(id, AUTO_TILE); + } } else if (what.left(9) == "autotile/") { what = what.right(9); - if (what == "bitmask_mode") + if (what == "bitmask_mode") { autotile_set_bitmask_mode(id, (BitmaskMode)((int)p_value)); - else if (what == "icon_coordinate") + } else if (what == "icon_coordinate") { autotile_set_icon_coordinate(id, p_value); - else if (what == "tile_size") + } else if (what == "tile_size") { autotile_set_size(id, p_value); - else if (what == "spacing") + } else if (what == "spacing") { autotile_set_spacing(id, p_value); - else if (what == "bitmask_flags") { + } else if (what == "bitmask_flags") { tile_map[id].autotile_data.flags.clear(); if (p_value.is_array()) { Array p = p_value; @@ -147,7 +149,7 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { p.pop_front(); } } - } else if (what == "shape") + } else if (what == "shape") { if (tile_get_shape_count(id) > 0) { for (int i = 0; i < tile_get_shape_count(id); i++) { tile_set_shape(id, i, p_value); @@ -155,7 +157,7 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { } else { tile_set_shape(id, 0, p_value); } - else if (what == "shape_offset") + } else if (what == "shape_offset") { if (tile_get_shape_count(id) > 0) { for (int i = 0; i < tile_get_shape_count(id); i++) { tile_set_shape_offset(id, i, p_value); @@ -163,7 +165,7 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { } else { tile_set_shape_offset(id, 0, p_value); } - else if (what == "shape_transform") + } else if (what == "shape_transform") { if (tile_get_shape_count(id) > 0) { for (int i = 0; i < tile_get_shape_count(id); i++) { tile_set_shape_transform(id, i, p_value); @@ -171,7 +173,7 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { } else { tile_set_shape_transform(id, 0, p_value); } - else if (what == "shape_one_way") + } else if (what == "shape_one_way") { if (tile_get_shape_count(id) > 0) { for (int i = 0; i < tile_get_shape_count(id); i++) { tile_set_shape_one_way(id, i, p_value); @@ -179,7 +181,7 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { } else { tile_set_shape_one_way(id, 0, p_value); } - else if (what == "shape_one_way_margin") + } else if (what == "shape_one_way_margin") { if (tile_get_shape_count(id) > 0) { for (int i = 0; i < tile_get_shape_count(id); i++) { tile_set_shape_one_way_margin(id, i, p_value); @@ -187,63 +189,64 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) { } else { tile_set_shape_one_way_margin(id, 0, p_value); } - else if (what == "shapes") + } else if (what == "shapes") { _tile_set_shapes(id, p_value); - else if (what == "occluder") + } else if (what == "occluder") { tile_set_light_occluder(id, p_value); - else if (what == "occluder_offset") + } else if (what == "occluder_offset") { tile_set_occluder_offset(id, p_value); - else if (what == "navigation") + } else if (what == "navigation") { tile_set_navigation_polygon(id, p_value); - else if (what == "navigation_offset") + } else if (what == "navigation_offset") { tile_set_navigation_polygon_offset(id, p_value); - else if (what == "z_index") + } else if (what == "z_index") { tile_set_z_index(id, p_value); - else + } else { return false; + } return true; } bool TileSet::_get(const StringName &p_name, Variant &r_ret) const { - String n = p_name; int slash = n.find("/"); - if (slash == -1) + if (slash == -1) { return false; + } int id = String::to_int(n.c_str(), slash); ERR_FAIL_COND_V(!tile_map.has(id), false); String what = n.substr(slash + 1, n.length()); - if (what == "name") + if (what == "name") { r_ret = tile_get_name(id); - else if (what == "texture") + } else if (what == "texture") { r_ret = tile_get_texture(id); - else if (what == "normal_map") + } else if (what == "normal_map") { r_ret = tile_get_normal_map(id); - else if (what == "tex_offset") + } else if (what == "tex_offset") { r_ret = tile_get_texture_offset(id); - else if (what == "material") + } else if (what == "material") { r_ret = tile_get_material(id); - else if (what == "modulate") + } else if (what == "modulate") { r_ret = tile_get_modulate(id); - else if (what == "region") + } else if (what == "region") { r_ret = tile_get_region(id); - else if (what == "tile_mode") + } else if (what == "tile_mode") { r_ret = tile_get_tile_mode(id); - else if (what.left(9) == "autotile/") { + } else if (what.left(9) == "autotile/") { what = what.right(9); - if (what == "bitmask_mode") + if (what == "bitmask_mode") { r_ret = autotile_get_bitmask_mode(id); - else if (what == "icon_coordinate") + } else if (what == "icon_coordinate") { r_ret = autotile_get_icon_coordinate(id); - else if (what == "tile_size") + } else if (what == "tile_size") { r_ret = autotile_get_size(id); - else if (what == "spacing") + } else if (what == "spacing") { r_ret = autotile_get_spacing(id); - else if (what == "bitmask_flags") { + } else if (what == "bitmask_flags") { Array p; for (Map<Vector2, uint32_t>::Element *E = tile_map[id].autotile_data.flags.front(); E; E = E->next()) { p.push_back(E->key()); @@ -291,38 +294,37 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const { } r_ret = p; } - } else if (what == "shape") + } else if (what == "shape") { r_ret = tile_get_shape(id, 0); - else if (what == "shape_offset") + } else if (what == "shape_offset") { r_ret = tile_get_shape_offset(id, 0); - else if (what == "shape_transform") + } else if (what == "shape_transform") { r_ret = tile_get_shape_transform(id, 0); - else if (what == "shape_one_way") + } else if (what == "shape_one_way") { r_ret = tile_get_shape_one_way(id, 0); - else if (what == "shape_one_way_margin") + } else if (what == "shape_one_way_margin") { r_ret = tile_get_shape_one_way_margin(id, 0); - else if (what == "shapes") + } else if (what == "shapes") { r_ret = _tile_get_shapes(id); - else if (what == "occluder") + } else if (what == "occluder") { r_ret = tile_get_light_occluder(id); - else if (what == "occluder_offset") + } else if (what == "occluder_offset") { r_ret = tile_get_occluder_offset(id); - else if (what == "navigation") + } else if (what == "navigation") { r_ret = tile_get_navigation_polygon(id); - else if (what == "navigation_offset") + } else if (what == "navigation_offset") { r_ret = tile_get_navigation_polygon_offset(id); - else if (what == "z_index") + } else if (what == "z_index") { r_ret = tile_get_z_index(id); - else + } else { return false; + } return true; } void TileSet::_get_property_list(List<PropertyInfo> *p_list) const { - for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) { - int id = E->key(); String pre = itos(id) + "/"; p_list->push_back(PropertyInfo(Variant::STRING, pre + "name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR)); @@ -382,13 +384,11 @@ void TileSet::autotile_set_bitmask_mode(int p_id, BitmaskMode p_mode) { } TileSet::BitmaskMode TileSet::autotile_get_bitmask_mode(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), BITMASK_2X2); return tile_map[p_id].autotile_data.bitmask_mode; } void TileSet::tile_set_texture(int p_id, const Ref<Texture2D> &p_texture) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].texture = p_texture; emit_changed(); @@ -396,39 +396,33 @@ void TileSet::tile_set_texture(int p_id, const Ref<Texture2D> &p_texture) { } Ref<Texture2D> TileSet::tile_get_texture(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<Texture2D>()); return tile_map[p_id].texture; } void TileSet::tile_set_normal_map(int p_id, const Ref<Texture2D> &p_normal_map) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].normal_map = p_normal_map; emit_changed(); } Ref<Texture2D> TileSet::tile_get_normal_map(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<Texture2D>()); return tile_map[p_id].normal_map; } void TileSet::tile_set_material(int p_id, const Ref<ShaderMaterial> &p_material) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].material = p_material; emit_changed(); } Ref<ShaderMaterial> TileSet::tile_get_material(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<ShaderMaterial>()); return tile_map[p_id].material; } void TileSet::tile_set_modulate(int p_id, const Color &p_modulate) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].modulate = p_modulate; emit_changed(); @@ -436,26 +430,22 @@ void TileSet::tile_set_modulate(int p_id, const Color &p_modulate) { } Color TileSet::tile_get_modulate(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Color(1, 1, 1)); return tile_map[p_id].modulate; } void TileSet::tile_set_texture_offset(int p_id, const Vector2 &p_offset) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].offset = p_offset; emit_changed(); } Vector2 TileSet::tile_get_texture_offset(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector2()); return tile_map[p_id].offset; } void TileSet::tile_set_region(int p_id, const Rect2 &p_region) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].region = p_region; emit_changed(); @@ -463,7 +453,6 @@ void TileSet::tile_set_region(int p_id, const Rect2 &p_region) { } Rect2 TileSet::tile_get_region(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Rect2()); return tile_map[p_id].region; } @@ -476,26 +465,22 @@ void TileSet::tile_set_tile_mode(int p_id, TileMode p_tile_mode) { } TileSet::TileMode TileSet::tile_get_tile_mode(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), SINGLE_TILE); return tile_map[p_id].tile_mode; } void TileSet::autotile_set_icon_coordinate(int p_id, Vector2 coord) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].autotile_data.icon_coord = coord; emit_changed(); } Vector2 TileSet::autotile_get_icon_coordinate(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector2()); return tile_map[p_id].autotile_data.icon_coord; } void TileSet::autotile_set_spacing(int p_id, int p_spacing) { - ERR_FAIL_COND(!tile_map.has(p_id)); ERR_FAIL_COND(p_spacing < 0); tile_map[p_id].autotile_data.spacing = p_spacing; @@ -503,39 +488,33 @@ void TileSet::autotile_set_spacing(int p_id, int p_spacing) { } int TileSet::autotile_get_spacing(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), 0); return tile_map[p_id].autotile_data.spacing; } void TileSet::autotile_set_size(int p_id, Size2 p_size) { - ERR_FAIL_COND(!tile_map.has(p_id)); ERR_FAIL_COND(p_size.x <= 0 || p_size.y <= 0); tile_map[p_id].autotile_data.size = p_size; } Size2 TileSet::autotile_get_size(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Size2()); return tile_map[p_id].autotile_data.size; } void TileSet::autotile_clear_bitmask_map(int p_id) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].autotile_data.flags.clear(); } void TileSet::autotile_set_subtile_priority(int p_id, const Vector2 &p_coord, int p_priority) { - ERR_FAIL_COND(!tile_map.has(p_id)); ERR_FAIL_COND(p_priority <= 0); tile_map[p_id].autotile_data.priority_map[p_coord] = p_priority; } int TileSet::autotile_get_subtile_priority(int p_id, const Vector2 &p_coord) { - ERR_FAIL_COND_V(!tile_map.has(p_id), 1); if (tile_map[p_id].autotile_data.priority_map.has(p_coord)) { return tile_map[p_id].autotile_data.priority_map[p_coord]; @@ -545,21 +524,18 @@ int TileSet::autotile_get_subtile_priority(int p_id, const Vector2 &p_coord) { } const Map<Vector2, int> &TileSet::autotile_get_priority_map(int p_id) const { - static Map<Vector2, int> dummy; ERR_FAIL_COND_V(!tile_map.has(p_id), dummy); return tile_map[p_id].autotile_data.priority_map; } void TileSet::autotile_set_z_index(int p_id, const Vector2 &p_coord, int p_z_index) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].autotile_data.z_index_map[p_coord] = p_z_index; emit_changed(); } int TileSet::autotile_get_z_index(int p_id, const Vector2 &p_coord) { - ERR_FAIL_COND_V(!tile_map.has(p_id), 1); if (tile_map[p_id].autotile_data.z_index_map.has(p_coord)) { return tile_map[p_id].autotile_data.z_index_map[p_coord]; @@ -569,25 +545,23 @@ int TileSet::autotile_get_z_index(int p_id, const Vector2 &p_coord) { } const Map<Vector2, int> &TileSet::autotile_get_z_index_map(int p_id) const { - static Map<Vector2, int> dummy; ERR_FAIL_COND_V(!tile_map.has(p_id), dummy); return tile_map[p_id].autotile_data.z_index_map; } void TileSet::autotile_set_bitmask(int p_id, Vector2 p_coord, uint32_t p_flag) { - ERR_FAIL_COND(!tile_map.has(p_id)); if (p_flag == 0) { - if (tile_map[p_id].autotile_data.flags.has(p_coord)) + if (tile_map[p_id].autotile_data.flags.has(p_coord)) { tile_map[p_id].autotile_data.flags.erase(p_coord); + } } else { tile_map[p_id].autotile_data.flags[p_coord] = p_flag; } } uint32_t TileSet::autotile_get_bitmask(int p_id, Vector2 p_coord) { - ERR_FAIL_COND_V(!tile_map.has(p_id), 0); if (!tile_map[p_id].autotile_data.flags.has(p_coord)) { return 0; @@ -596,7 +570,6 @@ uint32_t TileSet::autotile_get_bitmask(int p_id, Vector2 p_coord) { } const Map<Vector2, uint32_t> &TileSet::autotile_get_bitmask_map(int p_id) { - static Map<Vector2, uint32_t> dummy; static Map<Vector2, uint32_t> dummy_atlas; ERR_FAIL_COND_V(!tile_map.has(p_id), dummy); @@ -611,12 +584,12 @@ const Map<Vector2, uint32_t> &TileSet::autotile_get_bitmask_map(int p_id) { } } return dummy_atlas; - } else + } else { return tile_map[p_id].autotile_data.flags; + } } Vector2 TileSet::autotile_get_subtile_for_bitmask(int p_id, uint16_t p_bitmask, const Node *p_tilemap_node, const Vector2 &p_tile_location) { - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector2()); //First try to forward selection to script if (p_tilemap_node->get_class_name() == "TileMap") { @@ -678,7 +651,6 @@ Vector2 TileSet::autotile_get_subtile_for_bitmask(int p_id, uint16_t p_bitmask, } Vector2 TileSet::atlastile_get_subtile_by_priority(int p_id, const Node *p_tilemap_node, const Vector2 &p_tile_location) { - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector2()); //First try to forward selection to script if (get_script_instance() != nullptr) { @@ -708,7 +680,6 @@ Vector2 TileSet::atlastile_get_subtile_by_priority(int p_id, const Node *p_tilem } void TileSet::tile_set_name(int p_id, const String &p_name) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].name = p_name; emit_changed(); @@ -716,19 +687,16 @@ void TileSet::tile_set_name(int p_id, const String &p_name) { } String TileSet::tile_get_name(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), String()); return tile_map[p_id].name; } void TileSet::tile_clear_shapes(int p_id) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].shapes_data.clear(); } void TileSet::tile_add_shape(int p_id, const Ref<Shape2D> &p_shape, const Transform2D &p_transform, bool p_one_way, const Vector2 &p_autotile_coord) { - ERR_FAIL_COND(!tile_map.has(p_id)); ShapeData new_data = ShapeData(); @@ -741,52 +709,51 @@ void TileSet::tile_add_shape(int p_id, const Ref<Shape2D> &p_shape, const Transf } int TileSet::tile_get_shape_count(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), 0); return tile_map[p_id].shapes_data.size(); } void TileSet::tile_set_shape(int p_id, int p_shape_id, const Ref<Shape2D> &p_shape) { - ERR_FAIL_COND(!tile_map.has(p_id)); ERR_FAIL_COND(p_shape_id < 0); - if (p_shape_id >= tile_map[p_id].shapes_data.size()) + if (p_shape_id >= tile_map[p_id].shapes_data.size()) { tile_map[p_id].shapes_data.resize(p_shape_id + 1); + } tile_map[p_id].shapes_data.write[p_shape_id].shape = p_shape; _decompose_convex_shape(p_shape); emit_changed(); } Ref<Shape2D> TileSet::tile_get_shape(int p_id, int p_shape_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<Shape2D>()); ERR_FAIL_COND_V(p_shape_id < 0, Ref<Shape2D>()); - if (p_shape_id < tile_map[p_id].shapes_data.size()) + if (p_shape_id < tile_map[p_id].shapes_data.size()) { return tile_map[p_id].shapes_data[p_shape_id].shape; + } return Ref<Shape2D>(); } void TileSet::tile_set_shape_transform(int p_id, int p_shape_id, const Transform2D &p_offset) { - ERR_FAIL_COND(!tile_map.has(p_id)); ERR_FAIL_COND(p_shape_id < 0); - if (p_shape_id >= tile_map[p_id].shapes_data.size()) + if (p_shape_id >= tile_map[p_id].shapes_data.size()) { tile_map[p_id].shapes_data.resize(p_shape_id + 1); + } tile_map[p_id].shapes_data.write[p_shape_id].shape_transform = p_offset; emit_changed(); } Transform2D TileSet::tile_get_shape_transform(int p_id, int p_shape_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Transform2D()); ERR_FAIL_COND_V(p_shape_id < 0, Transform2D()); - if (p_shape_id < tile_map[p_id].shapes_data.size()) + if (p_shape_id < tile_map[p_id].shapes_data.size()) { return tile_map[p_id].shapes_data[p_shape_id].shape_transform; + } return Transform2D(); } @@ -802,57 +769,55 @@ Vector2 TileSet::tile_get_shape_offset(int p_id, int p_shape_id) const { } void TileSet::tile_set_shape_one_way(int p_id, int p_shape_id, const bool p_one_way) { - ERR_FAIL_COND(!tile_map.has(p_id)); ERR_FAIL_COND(p_shape_id < 0); - if (p_shape_id >= tile_map[p_id].shapes_data.size()) + if (p_shape_id >= tile_map[p_id].shapes_data.size()) { tile_map[p_id].shapes_data.resize(p_shape_id + 1); + } tile_map[p_id].shapes_data.write[p_shape_id].one_way_collision = p_one_way; emit_changed(); } bool TileSet::tile_get_shape_one_way(int p_id, int p_shape_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), false); ERR_FAIL_COND_V(p_shape_id < 0, false); - if (p_shape_id < tile_map[p_id].shapes_data.size()) + if (p_shape_id < tile_map[p_id].shapes_data.size()) { return tile_map[p_id].shapes_data[p_shape_id].one_way_collision; + } return false; } void TileSet::tile_set_shape_one_way_margin(int p_id, int p_shape_id, float p_margin) { - ERR_FAIL_COND(!tile_map.has(p_id)); ERR_FAIL_COND(p_shape_id < 0); - if (p_shape_id >= tile_map[p_id].shapes_data.size()) + if (p_shape_id >= tile_map[p_id].shapes_data.size()) { tile_map[p_id].shapes_data.resize(p_shape_id + 1); + } tile_map[p_id].shapes_data.write[p_shape_id].one_way_collision_margin = p_margin; emit_changed(); } float TileSet::tile_get_shape_one_way_margin(int p_id, int p_shape_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), 0); ERR_FAIL_COND_V(p_shape_id < 0, 0); - if (p_shape_id < tile_map[p_id].shapes_data.size()) + if (p_shape_id < tile_map[p_id].shapes_data.size()) { return tile_map[p_id].shapes_data[p_shape_id].one_way_collision_margin; + } return 0; } void TileSet::tile_set_light_occluder(int p_id, const Ref<OccluderPolygon2D> &p_light_occluder) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].occluder = p_light_occluder; } Ref<OccluderPolygon2D> TileSet::tile_get_light_occluder(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<OccluderPolygon2D>()); return tile_map[p_id].occluder; } @@ -869,7 +834,6 @@ void TileSet::autotile_set_light_occluder(int p_id, const Ref<OccluderPolygon2D> } Ref<OccluderPolygon2D> TileSet::autotile_get_light_occluder(int p_id, const Vector2 &p_coord) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<OccluderPolygon2D>()); if (!tile_map[p_id].autotile_data.occluder_map.has(p_coord)) { @@ -880,38 +844,32 @@ Ref<OccluderPolygon2D> TileSet::autotile_get_light_occluder(int p_id, const Vect } void TileSet::tile_set_navigation_polygon_offset(int p_id, const Vector2 &p_offset) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].navigation_polygon_offset = p_offset; } Vector2 TileSet::tile_get_navigation_polygon_offset(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector2()); return tile_map[p_id].navigation_polygon_offset; } void TileSet::tile_set_navigation_polygon(int p_id, const Ref<NavigationPolygon> &p_navigation_polygon) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].navigation_polygon = p_navigation_polygon; } Ref<NavigationPolygon> TileSet::tile_get_navigation_polygon(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<NavigationPolygon>()); return tile_map[p_id].navigation_polygon; } const Map<Vector2, Ref<OccluderPolygon2D>> &TileSet::autotile_get_light_oclusion_map(int p_id) const { - static Map<Vector2, Ref<OccluderPolygon2D>> dummy; ERR_FAIL_COND_V(!tile_map.has(p_id), dummy); return tile_map[p_id].autotile_data.occluder_map; } void TileSet::autotile_set_navigation_polygon(int p_id, const Ref<NavigationPolygon> &p_navigation_polygon, const Vector2 &p_coord) { - ERR_FAIL_COND(!tile_map.has(p_id)); if (p_navigation_polygon.is_null()) { if (tile_map[p_id].autotile_data.navpoly_map.has(p_coord)) { @@ -923,7 +881,6 @@ void TileSet::autotile_set_navigation_polygon(int p_id, const Ref<NavigationPoly } Ref<NavigationPolygon> TileSet::autotile_get_navigation_polygon(int p_id, const Vector2 &p_coord) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Ref<NavigationPolygon>()); if (!tile_map[p_id].autotile_data.navpoly_map.has(p_coord)) { return Ref<NavigationPolygon>(); @@ -933,26 +890,22 @@ Ref<NavigationPolygon> TileSet::autotile_get_navigation_polygon(int p_id, const } const Map<Vector2, Ref<NavigationPolygon>> &TileSet::autotile_get_navigation_map(int p_id) const { - static Map<Vector2, Ref<NavigationPolygon>> dummy; ERR_FAIL_COND_V(!tile_map.has(p_id), dummy); return tile_map[p_id].autotile_data.navpoly_map; } void TileSet::tile_set_occluder_offset(int p_id, const Vector2 &p_offset) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].occluder_offset = p_offset; } Vector2 TileSet::tile_get_occluder_offset(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector2()); return tile_map[p_id].occluder_offset; } void TileSet::tile_set_shapes(int p_id, const Vector<ShapeData> &p_shapes) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].shapes_data = p_shapes; for (int i = 0; i < p_shapes.size(); i++) { @@ -962,27 +915,23 @@ void TileSet::tile_set_shapes(int p_id, const Vector<ShapeData> &p_shapes) { } Vector<TileSet::ShapeData> TileSet::tile_get_shapes(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Vector<ShapeData>()); return tile_map[p_id].shapes_data; } int TileSet::tile_get_z_index(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), 0); return tile_map[p_id].z_index; } void TileSet::tile_set_z_index(int p_id, int p_z_index) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map[p_id].z_index = p_z_index; emit_changed(); } void TileSet::_tile_set_shapes(int p_id, const Array &p_shapes) { - ERR_FAIL_COND(!tile_map.has(p_id)); Vector<ShapeData> shapes_data; Transform2D default_transform = tile_get_shape_transform(p_id, 0); @@ -993,8 +942,9 @@ void TileSet::_tile_set_shapes(int p_id, const Array &p_shapes) { if (p_shapes[i].get_type() == Variant::OBJECT) { Ref<Shape2D> shape = p_shapes[i]; - if (shape.is_null()) + if (shape.is_null()) { continue; + } s.shape = shape; s.shape_transform = default_transform; @@ -1006,30 +956,35 @@ void TileSet::_tile_set_shapes(int p_id, const Array &p_shapes) { if (d.has("shape") && d["shape"].get_type() == Variant::OBJECT) { s.shape = d["shape"]; _decompose_convex_shape(s.shape); - } else + } else { continue; + } - if (d.has("shape_transform") && d["shape_transform"].get_type() == Variant::TRANSFORM2D) + if (d.has("shape_transform") && d["shape_transform"].get_type() == Variant::TRANSFORM2D) { s.shape_transform = d["shape_transform"]; - else if (d.has("shape_offset") && d["shape_offset"].get_type() == Variant::VECTOR2) + } else if (d.has("shape_offset") && d["shape_offset"].get_type() == Variant::VECTOR2) { s.shape_transform = Transform2D(0, (Vector2)d["shape_offset"]); - else + } else { s.shape_transform = default_transform; + } - if (d.has("one_way") && d["one_way"].get_type() == Variant::BOOL) + if (d.has("one_way") && d["one_way"].get_type() == Variant::BOOL) { s.one_way_collision = d["one_way"]; - else + } else { s.one_way_collision = default_one_way; + } - if (d.has("one_way_margin") && d["one_way_margin"].is_num()) + if (d.has("one_way_margin") && d["one_way_margin"].is_num()) { s.one_way_collision_margin = d["one_way_margin"]; - else + } else { s.one_way_collision_margin = 1.0; + } - if (d.has("autotile_coord") && d["autotile_coord"].get_type() == Variant::VECTOR2) + if (d.has("autotile_coord") && d["autotile_coord"].get_type() == Variant::VECTOR2) { s.autotile_coord = d["autotile_coord"]; - else + } else { s.autotile_coord = default_autotile_coord; + } } else { ERR_CONTINUE_MSG(true, "Expected an array of objects or dictionaries for tile_set_shapes."); @@ -1043,7 +998,6 @@ void TileSet::_tile_set_shapes(int p_id, const Array &p_shapes) { } Array TileSet::_tile_get_shapes(int p_id) const { - ERR_FAIL_COND_V(!tile_map.has(p_id), Array()); Array arr; @@ -1062,7 +1016,6 @@ Array TileSet::_tile_get_shapes(int p_id) const { } Array TileSet::_get_tiles_ids() const { - Array arr; for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) { @@ -1073,11 +1026,13 @@ Array TileSet::_get_tiles_ids() const { } void TileSet::_decompose_convex_shape(Ref<Shape2D> p_shape) { - if (Engine::get_singleton()->is_editor_hint()) + if (Engine::get_singleton()->is_editor_hint()) { return; + } Ref<ConvexPolygonShape2D> convex = p_shape; - if (!convex.is_valid()) + if (!convex.is_valid()) { return; + } Vector<Vector<Vector2>> decomp = Geometry::decompose_polygon_in_convex(convex->get_points()); if (decomp.size() > 1) { Array sub_shapes; @@ -1093,20 +1048,16 @@ void TileSet::_decompose_convex_shape(Ref<Shape2D> p_shape) { } void TileSet::get_tile_list(List<int> *p_tiles) const { - for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) { - p_tiles->push_back(E->key()); } } bool TileSet::has_tile(int p_id) const { - return tile_map.has(p_id); } bool TileSet::is_tile_bound(int p_drawn_id, int p_neighbor_id) { - if (p_drawn_id == p_neighbor_id) { return true; } else if (get_script_instance() != nullptr) { @@ -1121,7 +1072,6 @@ bool TileSet::is_tile_bound(int p_drawn_id, int p_neighbor_id) { } void TileSet::remove_tile(int p_id) { - ERR_FAIL_COND(!tile_map.has(p_id)); tile_map.erase(p_id); _change_notify(""); @@ -1129,32 +1079,29 @@ void TileSet::remove_tile(int p_id) { } int TileSet::get_last_unused_tile_id() const { - - if (tile_map.size()) + if (tile_map.size()) { return tile_map.back()->key() + 1; - else + } else { return 0; + } } int TileSet::find_tile_by_name(const String &p_name) const { - for (Map<int, TileData>::Element *E = tile_map.front(); E; E = E->next()) { - - if (p_name == E->get().name) + if (p_name == E->get().name) { return E->key(); + } } return -1; } void TileSet::clear() { - tile_map.clear(); _change_notify(""); emit_changed(); } void TileSet::_bind_methods() { - ClassDB::bind_method(D_METHOD("create_tile", "id"), &TileSet::create_tile); ClassDB::bind_method(D_METHOD("autotile_clear_bitmask_map", "id"), &TileSet::autotile_clear_bitmask_map); ClassDB::bind_method(D_METHOD("autotile_set_icon_coordinate", "id", "coord"), &TileSet::autotile_set_icon_coordinate); diff --git a/scene/resources/tile_set.h b/scene/resources/tile_set.h index 5f01959253..78f34e46ce 100644 --- a/scene/resources/tile_set.h +++ b/scene/resources/tile_set.h @@ -40,7 +40,6 @@ #include "scene/resources/texture.h" class TileSet : public Resource { - GDCLASS(TileSet, Resource); public: @@ -105,7 +104,6 @@ public: private: struct TileData { - String name; Ref<Texture2D> texture; Ref<Texture2D> normal_map; diff --git a/scene/resources/video_stream.h b/scene/resources/video_stream.h index a9b96214c3..379ba53a34 100644 --- a/scene/resources/video_stream.h +++ b/scene/resources/video_stream.h @@ -34,7 +34,6 @@ #include "scene/resources/texture.h" class VideoStreamPlayback : public Resource { - GDCLASS(VideoStreamPlayback, Resource); public: @@ -68,7 +67,6 @@ public: }; class VideoStream : public Resource { - GDCLASS(VideoStream, Resource); OBJ_SAVE_TYPE(VideoStream); // Saves derived classes with common type so they can be interchanged. diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp index 5637aaec9a..77d4dee21e 100644 --- a/scene/resources/visual_shader.cpp +++ b/scene/resources/visual_shader.cpp @@ -39,12 +39,10 @@ bool VisualShaderNode::is_simple_decl() const { } void VisualShaderNode::set_output_port_for_preview(int p_index) { - port_preview = p_index; } int VisualShaderNode::get_output_port_for_preview() const { - return port_preview; } @@ -68,6 +66,7 @@ bool VisualShaderNode::is_port_separator(int p_index) const { Vector<VisualShader::DefaultTextureParam> VisualShaderNode::get_default_texture_parameters(VisualShader::Type p_type, int p_id) const { return Vector<VisualShader::DefaultTextureParam>(); } + String VisualShaderNode::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { return String(); } @@ -85,7 +84,6 @@ Vector<StringName> VisualShaderNode::get_editable_properties() const { } Array VisualShaderNode::get_default_input_values() const { - Array ret; for (Map<int, Variant>::Element *E = default_input_values.front(); E; E = E->next()) { ret.push_back(E->key()); @@ -93,8 +91,8 @@ Array VisualShaderNode::get_default_input_values() const { } return ret; } -void VisualShaderNode::set_default_input_values(const Array &p_values) { +void VisualShaderNode::set_default_input_values(const Array &p_values) { if (p_values.size() % 2 == 0) { for (int i = 0; i < p_values.size(); i += 2) { default_input_values[p_values[i + 0]] = p_values[i + 1]; @@ -113,7 +111,6 @@ String VisualShaderNode::get_input_port_default_hint(int p_port) const { } void VisualShaderNode::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_output_port_for_preview", "port"), &VisualShaderNode::set_output_port_for_preview); ClassDB::bind_method(D_METHOD("get_output_port_for_preview"), &VisualShaderNode::get_output_port_for_preview); @@ -225,7 +222,6 @@ String VisualShaderNodeCustom::get_output_port_name(int p_port) const { } String VisualShaderNodeCustom::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - ERR_FAIL_COND_V(!get_script_instance(), ""); ERR_FAIL_COND_V(!get_script_instance()->has_method("_get_code"), ""); Array input_vars; @@ -264,7 +260,6 @@ String VisualShaderNodeCustom::generate_global_per_node(Shader::Mode p_mode, Vis } void VisualShaderNodeCustom::_bind_methods() { - BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_name")); BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_description")); BIND_VMETHOD(MethodInfo(Variant::STRING, "_get_category")); @@ -396,6 +391,7 @@ Vector<int> VisualShader::get_node_list(Type p_type) const { return ret; } + int VisualShader::get_valid_node_id(Type p_type) const { ERR_FAIL_INDEX_V(p_type, TYPE_MAX, NODE_ID_INVALID); const Graph *g = &graph[p_type]; @@ -404,8 +400,9 @@ int VisualShader::get_valid_node_id(Type p_type) const { int VisualShader::find_node_id(Type p_type, const Ref<VisualShaderNode> &p_node) const { for (const Map<int, Node>::Element *E = graph[p_type].nodes.front(); E; E = E->next()) { - if (E->get().node == p_node) + if (E->get().node == p_node) { return E->key(); + } } return NODE_ID_INVALID; @@ -445,7 +442,6 @@ bool VisualShader::is_node_connection(Type p_type, int p_from_node, int p_from_p const Graph *g = &graph[p_type]; for (const List<Connection>::Element *E = g->connections.front(); E; E = E->next()) { - if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) { return true; } @@ -460,7 +456,6 @@ bool VisualShader::is_nodes_connected_relatively(const Graph *p_graph, int p_nod const VisualShader::Node &node = p_graph->nodes[p_node]; for (const List<int>::Element *E = node.prev_connected_nodes.front(); E; E = E->next()) { - if (E->get() == p_target) { return true; } @@ -474,24 +469,28 @@ bool VisualShader::is_nodes_connected_relatively(const Graph *p_graph, int p_nod } bool VisualShader::can_connect_nodes(Type p_type, int p_from_node, int p_from_port, int p_to_node, int p_to_port) const { - ERR_FAIL_INDEX_V(p_type, TYPE_MAX, false); const Graph *g = &graph[p_type]; - if (!g->nodes.has(p_from_node)) + if (!g->nodes.has(p_from_node)) { return false; + } - if (p_from_node == p_to_node) + if (p_from_node == p_to_node) { return false; + } - if (p_from_port < 0 || p_from_port >= g->nodes[p_from_node].node->get_output_port_count()) + if (p_from_port < 0 || p_from_port >= g->nodes[p_from_node].node->get_output_port_count()) { return false; + } - if (!g->nodes.has(p_to_node)) + if (!g->nodes.has(p_to_node)) { return false; + } - if (p_to_port < 0 || p_to_port >= g->nodes[p_to_node].node->get_input_port_count()) + if (p_to_port < 0 || p_to_port >= g->nodes[p_to_node].node->get_input_port_count()) { return false; + } VisualShaderNode::PortType from_port_type = g->nodes[p_from_node].node->get_output_port_type(p_from_port); VisualShaderNode::PortType to_port_type = g->nodes[p_to_node].node->get_input_port_type(p_to_port); @@ -501,14 +500,14 @@ bool VisualShader::can_connect_nodes(Type p_type, int p_from_node, int p_from_po } for (const List<Connection>::Element *E = g->connections.front(); E; E = E->next()) { - if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) { return false; } } - if (is_nodes_connected_relatively(g, p_from_node, p_to_node)) + if (is_nodes_connected_relatively(g, p_from_node, p_to_node)) { return false; + } return true; } @@ -546,7 +545,6 @@ Error VisualShader::connect_nodes(Type p_type, int p_from_node, int p_from_port, ERR_FAIL_COND_V_MSG(!is_port_types_compatible(from_port_type, to_port_type), ERR_INVALID_PARAMETER, "Incompatible port types (scalar/vec/bool) with transform."); for (List<Connection>::Element *E = g->connections.front(); E; E = E->next()) { - if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) { ERR_FAIL_V(ERR_ALREADY_EXISTS); } @@ -569,7 +567,6 @@ void VisualShader::disconnect_nodes(Type p_type, int p_from_node, int p_from_por Graph *g = &graph[p_type]; for (List<Connection>::Element *E = g->connections.front(); E; E = E->next()) { - if (E->get().from_node == p_from_node && E->get().from_port == p_from_port && E->get().to_node == p_to_node && E->get().to_port == p_to_port) { g->connections.erase(E); g->nodes[p_to_node].prev_connected_nodes.erase(p_from_node); @@ -615,9 +612,7 @@ void VisualShader::set_mode(Mode p_mode) { flags.clear(); shader_mode = p_mode; for (int i = 0; i < TYPE_MAX; i++) { - for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) { - Ref<VisualShaderNodeInput> input = E->get().node; if (input.is_valid()) { input->shader_mode = shader_mode; @@ -630,7 +625,6 @@ void VisualShader::set_mode(Mode p_mode) { // clear connections since they are no longer valid for (List<Connection>::Element *E = graph[i].connections.front(); E;) { - bool keep = true; List<Connection>::Element *N = E->next(); @@ -684,7 +678,6 @@ bool VisualShader::is_text_shader() const { } String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port, Vector<DefaultTextureParam> &default_tex_params) const { - Ref<VisualShaderNode> node = get_node(p_type, p_node); ERR_FAIL_COND_V(!node.is_valid(), String()); ERR_FAIL_COND_V(p_port < 0 || p_port >= node->get_output_port_count(), String()); @@ -703,7 +696,6 @@ String VisualShader::generate_preview_shader(Type p_type, int p_node, int p_port for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) { Ref<VisualShaderNodeGlobalExpression> global_expression = Object::cast_to<VisualShaderNodeGlobalExpression>(E->get().node.ptr()); if (global_expression.is_valid()) { - String expr = ""; expr += "// " + global_expression->get_caption() + ":" + itos(index++) + "\n"; expr += global_expression->generate_global(get_mode(), Type(i), -1); @@ -772,7 +764,6 @@ String VisualShader::validate_port_name(const String &p_name, const List<String> } if (name != String()) { - String valid_name; for (int i = 0; i < name.length(); i++) { @@ -813,13 +804,11 @@ String VisualShader::validate_port_name(const String &p_name, const List<String> } String VisualShader::validate_uniform_name(const String &p_name, const Ref<VisualShaderNodeUniform> &p_uniform) const { - String name = p_name; //validate name first while (name.length() && !IS_INITIAL_CHAR(name[0])) { name = name.substr(1, name.length() - 1); } if (name != String()) { - String valid_name; for (int i = 0; i < name.length(); i++) { @@ -840,7 +829,6 @@ String VisualShader::validate_uniform_name(const String &p_name, const Ref<Visua int attempt = 1; while (true) { - bool exists = false; for (int i = 0; i < TYPE_MAX; i++) { for (const Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) { @@ -890,7 +878,6 @@ static const char *type_string[VisualShader::TYPE_MAX] = { "light" }; bool VisualShader::_set(const StringName &p_name, const Variant &p_value) { - String name = p_name; if (name == "mode") { set_mode(Shader::Mode(int(p_value))); @@ -927,7 +914,6 @@ bool VisualShader::_set(const StringName &p_name, const Variant &p_value) { String index = name.get_slicec('/', 2); if (index == "connections") { - Vector<int> conns = p_value; if (conns.size() % 4 == 0) { for (int i = 0; i < conns.size(); i += 4) { @@ -964,7 +950,6 @@ bool VisualShader::_set(const StringName &p_name, const Variant &p_value) { } bool VisualShader::_get(const StringName &p_name, Variant &r_ret) const { - String name = p_name; if (name == "mode") { r_ret = get_mode(); @@ -993,7 +978,6 @@ bool VisualShader::_get(const StringName &p_name, Variant &r_ret) const { String index = name.get_slicec('/', 2); if (index == "connections") { - Vector<int> conns; for (const List<Connection>::Element *E = graph[type].connections.front(); E; E = E->next()) { conns.push_back(E->get().from_node); @@ -1074,13 +1058,11 @@ void VisualShader::_get_property_list(List<PropertyInfo> *p_list) const { for (int i = 0; i < TYPE_MAX; i++) { for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) { - String prop_name = "nodes/"; prop_name += type_string[i]; prop_name += "/" + itos(E->key()); if (E->key() != NODE_ID_OUTPUT) { - p_list->push_back(PropertyInfo(Variant::OBJECT, prop_name + "/node", PROPERTY_HINT_RESOURCE_TYPE, "VisualShaderNode", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE)); } p_list->push_back(PropertyInfo(Variant::VECTOR2, prop_name + "/position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR)); @@ -1099,7 +1081,6 @@ void VisualShader::_get_property_list(List<PropertyInfo> *p_list) const { } Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBuilder &global_code_per_node, Map<Type, StringBuilder> &global_code_per_func, StringBuilder &code, Vector<VisualShader::DefaultTextureParam> &def_tex_params, const VMap<ConnectionKey, const List<Connection>::Element *> &input_connections, const VMap<ConnectionKey, const List<Connection>::Element *> &output_connections, int node, Set<int> &processed, bool for_preview, Set<StringName> &r_classes) const { - const Ref<VisualShaderNode> vsnode = graph[type].nodes[node].node; //check inputs recursively first @@ -1116,8 +1097,9 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui } Error err = _write_node(type, global_code, global_code_per_node, global_code_per_func, code, def_tex_params, input_connections, output_connections, from_node, processed, for_preview, r_classes); - if (err) + if (err) { return err; + } } } @@ -1181,7 +1163,6 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui inputs[i] = "int(" + src_var + ")"; } } else { - Variant defval = vsnode->get_input_port_default_value(i); if (defval.get_type() == Variant::FLOAT) { float val = defval; @@ -1283,7 +1264,6 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui bool skip_global = input.is_valid() && for_preview; if (!skip_global) { - global_code += vsnode->generate_global(get_mode(), type, node); String class_name = vsnode->get_class_name(); @@ -1308,8 +1288,9 @@ Error VisualShader::_write_node(Type type, StringBuilder &global_code, StringBui } void VisualShader::_update_shader() const { - if (!dirty) + if (!dirty) { return; + } dirty = false; @@ -1330,11 +1311,8 @@ void VisualShader::_update_shader() const { //fill render mode enums int idx = 0; while (render_mode_enums[idx].string) { - if (shader_mode == render_mode_enums[idx].mode) { - if (modes.has(render_mode_enums[idx].string)) { - int which = modes[render_mode_enums[idx].string]; int count = 0; for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode)).size(); i++) { @@ -1357,7 +1335,6 @@ void VisualShader::_update_shader() const { //fill render mode flags for (int i = 0; i < ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode)).size(); i++) { - String mode = ShaderTypes::get_singleton()->get_modes(RenderingServer::ShaderMode(shader_mode))[i]; if (flags.has(mode)) { if (render_mode != String()) { @@ -1369,7 +1346,6 @@ void VisualShader::_update_shader() const { } if (render_mode != String()) { - global_code += "render_mode " + render_mode + ";\n\n"; } @@ -1377,7 +1353,6 @@ void VisualShader::_update_shader() const { String global_expressions; for (int i = 0, index = 0; i < TYPE_MAX; i++) { - if (!ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader_mode)).has(func_name[i])) { continue; } @@ -1385,7 +1360,6 @@ void VisualShader::_update_shader() const { for (Map<int, Node>::Element *E = graph[i].nodes.front(); E; E = E->next()) { Ref<VisualShaderNodeGlobalExpression> global_expression = Object::cast_to<VisualShaderNodeGlobalExpression>(E->get().node.ptr()); if (global_expression.is_valid()) { - String expr = ""; expr += "// " + global_expression->get_caption() + ":" + itos(index++) + "\n"; expr += global_expression->generate_global(get_mode(), Type(i), -1); @@ -1397,7 +1371,6 @@ void VisualShader::_update_shader() const { } for (int i = 0; i < TYPE_MAX; i++) { - if (!ShaderTypes::get_singleton()->get_functions(RenderingServer::ShaderMode(shader_mode)).has(func_name[i])) { continue; } @@ -1483,7 +1456,6 @@ void VisualShader::rebuild() { } void VisualShader::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_mode", "mode"), &VisualShader::set_mode); ClassDB::bind_method(D_METHOD("add_node", "type", "node", "position", "id"), &VisualShader::add_node); @@ -1762,26 +1734,25 @@ const VisualShaderNodeInput::Port VisualShaderNodeInput::preview_ports[] = { }; int VisualShaderNodeInput::get_input_port_count() const { - return 0; } -VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_port_type(int p_port) const { +VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_port_type(int p_port) const { return PORT_TYPE_SCALAR; } -String VisualShaderNodeInput::get_input_port_name(int p_port) const { +String VisualShaderNodeInput::get_input_port_name(int p_port) const { return ""; } int VisualShaderNodeInput::get_output_port_count() const { - return 1; } -VisualShaderNodeInput::PortType VisualShaderNodeInput::get_output_port_type(int p_port) const { +VisualShaderNodeInput::PortType VisualShaderNodeInput::get_output_port_type(int p_port) const { return get_input_type_by_name(input_name); } + String VisualShaderNodeInput::get_output_port_name(int p_port) const { return ""; } @@ -1791,7 +1762,6 @@ String VisualShaderNodeInput::get_caption() const { } String VisualShaderNodeInput::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - if (get_output_port_type(0) == PORT_TYPE_SAMPLER) { return ""; } @@ -1868,7 +1838,6 @@ String VisualShaderNodeInput::get_input_name() const { } String VisualShaderNodeInput::get_input_real_name() const { - int idx = 0; while (ports[idx].mode != Shader::MODE_MAX) { @@ -1882,7 +1851,6 @@ String VisualShaderNodeInput::get_input_real_name() const { } VisualShaderNodeInput::PortType VisualShaderNodeInput::get_input_type_by_name(String p_name) const { - int idx = 0; while (ports[idx].mode != Shader::MODE_MAX) { @@ -1944,7 +1912,6 @@ String VisualShaderNodeInput::get_input_index_name(int p_index) const { } void VisualShaderNodeInput::_validate_property(PropertyInfo &property) const { - if (property.name == "input_name") { String port_list; @@ -1974,7 +1941,6 @@ Vector<StringName> VisualShaderNodeInput::get_editable_properties() const { } void VisualShaderNodeInput::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_input_name", "name"), &VisualShaderNodeInput::set_input_name); ClassDB::bind_method(D_METHOD("get_input_name"), &VisualShaderNodeInput::get_input_name); ClassDB::bind_method(D_METHOD("get_input_real_name"), &VisualShaderNodeInput::get_input_real_name); @@ -1982,6 +1948,7 @@ void VisualShaderNodeInput::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "input_name", PROPERTY_HINT_ENUM, ""), "set_input_name", "get_input_name"); ADD_SIGNAL(MethodInfo("input_type_changed")); } + VisualShaderNodeInput::VisualShaderNodeInput() { input_name = "[None]"; // changed when set @@ -2060,7 +2027,6 @@ const VisualShaderNodeOutput::Port VisualShaderNodeOutput::ports[] = { }; int VisualShaderNodeOutput::get_input_port_count() const { - int idx = 0; int count = 0; @@ -2075,7 +2041,6 @@ int VisualShaderNodeOutput::get_input_port_count() const { } VisualShaderNodeOutput::PortType VisualShaderNodeOutput::get_input_port_type(int p_port) const { - int idx = 0; int count = 0; @@ -2093,7 +2058,6 @@ VisualShaderNodeOutput::PortType VisualShaderNodeOutput::get_input_port_type(int } String VisualShaderNodeOutput::get_input_port_name(int p_port) const { - int idx = 0; int count = 0; @@ -2115,18 +2079,18 @@ Variant VisualShaderNodeOutput::get_input_port_default_value(int p_port) const { } int VisualShaderNodeOutput::get_output_port_count() const { - return 0; } + VisualShaderNodeOutput::PortType VisualShaderNodeOutput::get_output_port_type(int p_port) const { return PORT_TYPE_SCALAR; } + String VisualShaderNodeOutput::get_output_port_name(int p_port) const { return String(); } bool VisualShaderNodeOutput::is_port_separator(int p_index) const { - if (shader_mode == Shader::MODE_SPATIAL && shader_type == VisualShader::TYPE_FRAGMENT) { String name = get_input_port_name(p_index); return (name == "Normal" || name == "Rim" || name == "Alpha Scissor"); @@ -2139,14 +2103,12 @@ String VisualShaderNodeOutput::get_caption() const { } String VisualShaderNodeOutput::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - int idx = 0; int count = 0; String code; while (ports[idx].mode != Shader::MODE_MAX) { if (ports[idx].mode == shader_mode && ports[idx].shader_type == shader_type) { - if (p_input_vars[count] != String()) { String s = ports[idx].string; if (s.find(":") != -1) { @@ -2188,7 +2150,6 @@ VisualShaderNodeUniform::Qualifier VisualShaderNodeUniform::get_qualifier() cons } void VisualShaderNodeUniform::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_uniform_name", "name"), &VisualShaderNodeUniform::set_uniform_name); ClassDB::bind_method(D_METHOD("get_uniform_name"), &VisualShaderNodeUniform::get_uniform_name); @@ -2218,7 +2179,6 @@ String VisualShaderNodeUniform::_get_qual_str() const { } String VisualShaderNodeUniform::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const { - List<String> keyword_list; ShaderLanguage::get_keyword_list(&keyword_list); if (keyword_list.find(uniform_name)) { @@ -2256,9 +2216,9 @@ Vector2 VisualShaderNodeGroupBase::get_size() const { } void VisualShaderNodeGroupBase::set_inputs(const String &p_inputs) { - - if (inputs == p_inputs) + if (inputs == p_inputs) { return; + } clear_input_ports(); @@ -2269,7 +2229,6 @@ void VisualShaderNodeGroupBase::set_inputs(const String &p_inputs) { int input_port_count = input_strings.size(); for (int i = 0; i < input_port_count; i++) { - Vector<String> arr = input_strings[i].split(","); ERR_FAIL_COND(arr.size() != 3); @@ -2289,9 +2248,9 @@ String VisualShaderNodeGroupBase::get_inputs() const { } void VisualShaderNodeGroupBase::set_outputs(const String &p_outputs) { - - if (outputs == p_outputs) + if (outputs == p_outputs) { return; + } clear_output_ports(); @@ -2302,7 +2261,6 @@ void VisualShaderNodeGroupBase::set_outputs(const String &p_outputs) { int output_port_count = output_strings.size(); for (int i = 0; i < output_port_count; i++) { - Vector<String> arr = output_strings[i].split(","); ERR_FAIL_COND(arr.size() != 3); @@ -2339,7 +2297,6 @@ bool VisualShaderNodeGroupBase::is_valid_port_name(const String &p_name) const { } void VisualShaderNodeGroupBase::add_input_port(int p_id, int p_type, const String &p_name) { - String str = itos(p_id) + "," + itos(p_type) + "," + p_name + ";"; Vector<String> inputs_strings = inputs.split(";", false); int index = 0; @@ -2376,7 +2333,6 @@ void VisualShaderNodeGroupBase::add_input_port(int p_id, int p_type, const Strin } void VisualShaderNodeGroupBase::remove_input_port(int p_id) { - ERR_FAIL_COND(!has_input_port(p_id)); Vector<String> inputs_strings = inputs.split(";", false); @@ -2409,7 +2365,6 @@ bool VisualShaderNodeGroupBase::has_input_port(int p_id) const { } void VisualShaderNodeGroupBase::add_output_port(int p_id, int p_type, const String &p_name) { - String str = itos(p_id) + "," + itos(p_type) + "," + p_name + ";"; Vector<String> outputs_strings = outputs.split(";", false); int index = 0; @@ -2446,7 +2401,6 @@ void VisualShaderNodeGroupBase::add_output_port(int p_id, int p_type, const Stri } void VisualShaderNodeGroupBase::remove_output_port(int p_id) { - ERR_FAIL_COND(!has_output_port(p_id)); Vector<String> outputs_strings = outputs.split(";", false); @@ -2487,12 +2441,12 @@ void VisualShaderNodeGroupBase::clear_output_ports() { } void VisualShaderNodeGroupBase::set_input_port_type(int p_id, int p_type) { - ERR_FAIL_COND(!has_input_port(p_id)); ERR_FAIL_COND(p_type < 0 || p_type >= PORT_TYPE_MAX); - if (input_ports[p_id].type == p_type) + if (input_ports[p_id].type == p_type) { return; + } Vector<String> inputs_strings = inputs.split(";", false); int count = 0; @@ -2522,12 +2476,12 @@ VisualShaderNodeGroupBase::PortType VisualShaderNodeGroupBase::get_input_port_ty } void VisualShaderNodeGroupBase::set_input_port_name(int p_id, const String &p_name) { - ERR_FAIL_COND(!has_input_port(p_id)); ERR_FAIL_COND(!is_valid_port_name(p_name)); - if (input_ports[p_id].name == p_name) + if (input_ports[p_id].name == p_name) { return; + } Vector<String> inputs_strings = inputs.split(";", false); int count = 0; @@ -2557,12 +2511,12 @@ String VisualShaderNodeGroupBase::get_input_port_name(int p_id) const { } void VisualShaderNodeGroupBase::set_output_port_type(int p_id, int p_type) { - ERR_FAIL_COND(!has_output_port(p_id)); ERR_FAIL_COND(p_type < 0 || p_type >= PORT_TYPE_MAX); - if (output_ports[p_id].type == p_type) + if (output_ports[p_id].type == p_type) { return; + } Vector<String> output_strings = outputs.split(";", false); int count = 0; @@ -2592,12 +2546,12 @@ VisualShaderNodeGroupBase::PortType VisualShaderNodeGroupBase::get_output_port_t } void VisualShaderNodeGroupBase::set_output_port_name(int p_id, const String &p_name) { - ERR_FAIL_COND(!has_output_port(p_id)); ERR_FAIL_COND(!is_valid_port_name(p_name)); - if (output_ports[p_id].name == p_name) + if (output_ports[p_id].name == p_name) { return; + } Vector<String> output_strings = outputs.split(";", false); int count = 0; @@ -2644,7 +2598,6 @@ Control *VisualShaderNodeGroupBase::get_control(int p_index) { } void VisualShaderNodeGroupBase::_apply_port_changes() { - Vector<String> inputs_strings = inputs.split(";", false); Vector<String> outputs_strings = outputs.split(";", false); @@ -2680,7 +2633,6 @@ bool VisualShaderNodeGroupBase::is_editable() const { } void VisualShaderNodeGroupBase::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_size", "size"), &VisualShaderNodeGroupBase::set_size); ClassDB::bind_method(D_METHOD("get_size"), &VisualShaderNodeGroupBase::get_size); @@ -2742,7 +2694,6 @@ String VisualShaderNodeExpression::get_expression() const { } String VisualShaderNodeExpression::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String _expression = expression; _expression = _expression.insert(0, "\n"); @@ -2842,7 +2793,6 @@ String VisualShaderNodeExpression::generate_code(Shader::Mode p_mode, VisualShad } void VisualShaderNodeExpression::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_expression", "expression"), &VisualShaderNodeExpression::set_expression); ClassDB::bind_method(D_METHOD("get_expression"), &VisualShaderNodeExpression::get_expression); diff --git a/scene/resources/visual_shader.h b/scene/resources/visual_shader.h index 56f8e74d2b..8bd09df512 100644 --- a/scene/resources/visual_shader.h +++ b/scene/resources/visual_shader.h @@ -98,7 +98,6 @@ private: void _queue_update(); union ConnectionKey { - struct { uint64_t node : 32; uint64_t port : 32; diff --git a/scene/resources/visual_shader_nodes.cpp b/scene/resources/visual_shader_nodes.cpp index 03db8c3ac5..87720cf110 100644 --- a/scene/resources/visual_shader_nodes.cpp +++ b/scene/resources/visual_shader_nodes.cpp @@ -65,13 +65,11 @@ String VisualShaderNodeFloatConstant::generate_code(Shader::Mode p_mode, VisualS } void VisualShaderNodeFloatConstant::set_constant(float p_value) { - constant = p_value; emit_changed(); } float VisualShaderNodeFloatConstant::get_constant() const { - return constant; } @@ -82,7 +80,6 @@ Vector<StringName> VisualShaderNodeFloatConstant::get_editable_properties() cons } void VisualShaderNodeFloatConstant::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeFloatConstant::set_constant); ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeFloatConstant::get_constant); @@ -143,7 +140,6 @@ Vector<StringName> VisualShaderNodeIntConstant::get_editable_properties() const } void VisualShaderNodeIntConstant::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeIntConstant::set_constant); ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeIntConstant::get_constant); @@ -204,7 +200,6 @@ Vector<StringName> VisualShaderNodeBooleanConstant::get_editable_properties() co } void VisualShaderNodeBooleanConstant::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeBooleanConstant::set_constant); ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeBooleanConstant::get_constant); @@ -246,7 +241,6 @@ String VisualShaderNodeColorConstant::get_output_port_name(int p_port) const { } String VisualShaderNodeColorConstant::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code; code += "\t" + p_output_vars[0] + " = " + vformat("vec3(%.6f, %.6f, %.6f)", constant.r, constant.g, constant.b) + ";\n"; code += "\t" + p_output_vars[1] + " = " + vformat("%.6f", constant.a) + ";\n"; @@ -255,13 +249,11 @@ String VisualShaderNodeColorConstant::generate_code(Shader::Mode p_mode, VisualS } void VisualShaderNodeColorConstant::set_constant(Color p_value) { - constant = p_value; emit_changed(); } Color VisualShaderNodeColorConstant::get_constant() const { - return constant; } @@ -272,7 +264,6 @@ Vector<StringName> VisualShaderNodeColorConstant::get_editable_properties() cons } void VisualShaderNodeColorConstant::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeColorConstant::set_constant); ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeColorConstant::get_constant); @@ -318,13 +309,11 @@ String VisualShaderNodeVec3Constant::generate_code(Shader::Mode p_mode, VisualSh } void VisualShaderNodeVec3Constant::set_constant(Vector3 p_value) { - constant = p_value; emit_changed(); } Vector3 VisualShaderNodeVec3Constant::get_constant() const { - return constant; } @@ -335,7 +324,6 @@ Vector<StringName> VisualShaderNodeVec3Constant::get_editable_properties() const } void VisualShaderNodeVec3Constant::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeVec3Constant::set_constant); ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeVec3Constant::get_constant); @@ -388,13 +376,11 @@ String VisualShaderNodeTransformConstant::generate_code(Shader::Mode p_mode, Vis } void VisualShaderNodeTransformConstant::set_constant(Transform p_value) { - constant = p_value; emit_changed(); } Transform VisualShaderNodeTransformConstant::get_constant() const { - return constant; } @@ -405,7 +391,6 @@ Vector<StringName> VisualShaderNodeTransformConstant::get_editable_properties() } void VisualShaderNodeTransformConstant::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_constant", "value"), &VisualShaderNodeTransformConstant::set_constant); ClassDB::bind_method(D_METHOD("get_constant"), &VisualShaderNodeTransformConstant::get_constant); @@ -426,7 +411,6 @@ int VisualShaderNodeTexture::get_input_port_count() const { } VisualShaderNodeTexture::PortType VisualShaderNodeTexture::get_input_port_type(int p_port) const { - switch (p_port) { case 0: return PORT_TYPE_VECTOR; @@ -440,7 +424,6 @@ VisualShaderNodeTexture::PortType VisualShaderNodeTexture::get_input_port_type(i } String VisualShaderNodeTexture::get_input_port_name(int p_port) const { - switch (p_port) { case 0: return "uv"; @@ -458,14 +441,16 @@ int VisualShaderNodeTexture::get_output_port_count() const { } VisualShaderNodeTexture::PortType VisualShaderNodeTexture::get_output_port_type(int p_port) const { - if (p_port == 0 && source == SOURCE_DEPTH) + if (p_port == 0 && source == SOURCE_DEPTH) { return PORT_TYPE_SCALAR; + } return p_port == 0 ? PORT_TYPE_VECTOR : PORT_TYPE_SCALAR; } String VisualShaderNodeTexture::get_output_port_name(int p_port) const { - if (p_port == 0 && source == SOURCE_DEPTH) + if (p_port == 0 && source == SOURCE_DEPTH) { return "depth"; + } return p_port == 0 ? "rgb" : "alpha"; } @@ -477,7 +462,6 @@ String VisualShaderNodeTexture::get_input_port_default_hint(int p_port) const { } static String make_unique_id(VisualShader::Type p_type, int p_id, const String &p_name) { - static const char *typepf[VisualShader::TYPE_MAX] = { "vtx", "frg", "lgt" }; return p_name + "_" + String(typepf[p_type]) + "_" + itos(p_id); } @@ -492,9 +476,7 @@ Vector<VisualShader::DefaultTextureParam> VisualShaderNodeTexture::get_default_t } String VisualShaderNodeTexture::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - if (source == SOURCE_TEXTURE) { - String u = "uniform sampler2D " + make_unique_id(p_type, p_id, "tex"); switch (texture_type) { case TYPE_DATA: @@ -513,7 +495,6 @@ String VisualShaderNodeTexture::generate_global(Shader::Mode p_mode, VisualShade } String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - if (source == SOURCE_TEXTURE) { String id = make_unique_id(p_type, p_id, "tex"); String code; @@ -568,7 +549,6 @@ String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader: } if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) { - String code = "\t{\n"; if (p_input_vars[0] == String() || p_for_preview) { // Use UV by default. @@ -592,7 +572,6 @@ String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader: } if (source == SOURCE_2D_TEXTURE && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) { - String code = "\t{\n"; if (p_input_vars[0] == String()) { // Use UV by default. @@ -616,7 +595,6 @@ String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader: } if (source == SOURCE_2D_NORMAL && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) { - String code = "\t{\n"; if (p_input_vars[0] == String()) { // Use UV by default. @@ -650,7 +628,6 @@ String VisualShaderNodeTexture::generate_code(Shader::Mode p_mode, VisualShader: } if (source == SOURCE_DEPTH && p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) { - String code = "\t{\n"; if (p_input_vars[0] == String()) { // Use UV by default. @@ -716,13 +693,11 @@ VisualShaderNodeTexture::Source VisualShaderNodeTexture::get_source() const { } void VisualShaderNodeTexture::set_texture(Ref<Texture2D> p_value) { - texture = p_value; emit_changed(); } Ref<Texture2D> VisualShaderNodeTexture::get_texture() const { - return texture; } @@ -746,7 +721,6 @@ Vector<StringName> VisualShaderNodeTexture::get_editable_properties() const { } String VisualShaderNodeTexture::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const { - if (source == SOURCE_TEXTURE) { return String(); // all good } @@ -756,22 +730,18 @@ String VisualShaderNodeTexture::get_warning(Shader::Mode p_mode, VisualShader::T } if (source == SOURCE_SCREEN && (p_mode == Shader::MODE_SPATIAL || p_mode == Shader::MODE_CANVAS_ITEM) && p_type == VisualShader::TYPE_FRAGMENT) { - return String(); // all good } if (source == SOURCE_2D_TEXTURE && p_mode == Shader::MODE_CANVAS_ITEM && p_type == VisualShader::TYPE_FRAGMENT) { - return String(); // all good } if (source == SOURCE_2D_NORMAL && p_mode == Shader::MODE_CANVAS_ITEM) { - return String(); // all good } if (source == SOURCE_DEPTH && p_mode == Shader::MODE_SPATIAL && p_type == VisualShader::TYPE_FRAGMENT) { - if (get_output_port_for_preview() == 0) { // DEPTH_TEXTURE is not supported in preview(canvas_item) shader return TTR("Invalid source for preview."); } @@ -782,7 +752,6 @@ String VisualShaderNodeTexture::get_warning(Shader::Mode p_mode, VisualShader::T } void VisualShaderNodeTexture::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_source", "value"), &VisualShaderNodeTexture::set_source); ClassDB::bind_method(D_METHOD("get_source"), &VisualShaderNodeTexture::get_source); @@ -870,7 +839,6 @@ Vector<VisualShader::DefaultTextureParam> VisualShaderNodeCubemap::get_default_t } String VisualShaderNodeCubemap::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - if (source == SOURCE_TEXTURE) { String u = "uniform samplerCube " + make_unique_id(p_type, p_id, "cube"); switch (texture_type) { @@ -889,7 +857,6 @@ String VisualShaderNodeCubemap::generate_global(Shader::Mode p_mode, VisualShade } String VisualShaderNodeCubemap::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code; String id; if (source == SOURCE_TEXTURE) { @@ -949,13 +916,11 @@ VisualShaderNodeCubemap::Source VisualShaderNodeCubemap::get_source() const { } void VisualShaderNodeCubemap::set_cube_map(Ref<Cubemap> p_value) { - cube_map = p_value; emit_changed(); } Ref<Cubemap> VisualShaderNodeCubemap::get_cube_map() const { - return cube_map; } @@ -979,7 +944,6 @@ Vector<StringName> VisualShaderNodeCubemap::get_editable_properties() const { } void VisualShaderNodeCubemap::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_source", "value"), &VisualShaderNodeCubemap::set_source); ClassDB::bind_method(D_METHOD("get_source"), &VisualShaderNodeCubemap::get_source); @@ -1038,10 +1002,8 @@ String VisualShaderNodeFloatOp::get_output_port_name(int p_port) const { } String VisualShaderNodeFloatOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code = "\t" + p_output_vars[0] + " = "; switch (op) { - case OP_ADD: code += p_input_vars[0] + " + " + p_input_vars[1] + ";\n"; break; @@ -1078,13 +1040,11 @@ String VisualShaderNodeFloatOp::generate_code(Shader::Mode p_mode, VisualShader: } void VisualShaderNodeFloatOp::set_operator(Operator p_op) { - op = p_op; emit_changed(); } VisualShaderNodeFloatOp::Operator VisualShaderNodeFloatOp::get_operator() const { - return op; } @@ -1095,7 +1055,6 @@ Vector<StringName> VisualShaderNodeFloatOp::get_editable_properties() const { } void VisualShaderNodeFloatOp::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeFloatOp::set_operator); ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeFloatOp::get_operator); @@ -1150,10 +1109,8 @@ String VisualShaderNodeIntOp::get_output_port_name(int p_port) const { } String VisualShaderNodeIntOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code = "\t" + p_output_vars[0] + " = "; switch (op) { - case OP_ADD: code += p_input_vars[0] + " + " + p_input_vars[1] + ";\n"; break; @@ -1181,7 +1138,6 @@ String VisualShaderNodeIntOp::generate_code(Shader::Mode p_mode, VisualShader::T } void VisualShaderNodeIntOp::set_operator(Operator p_op) { - op = p_op; emit_changed(); } @@ -1197,7 +1153,6 @@ Vector<StringName> VisualShaderNodeIntOp::get_editable_properties() const { } void VisualShaderNodeIntOp::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeIntOp::set_operator); ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeIntOp::get_operator); @@ -1249,10 +1204,8 @@ String VisualShaderNodeVectorOp::get_output_port_name(int p_port) const { } String VisualShaderNodeVectorOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code = "\t" + p_output_vars[0] + " = "; switch (op) { - case OP_ADD: code += p_input_vars[0] + " + " + p_input_vars[1] + ";\n"; break; @@ -1295,13 +1248,11 @@ String VisualShaderNodeVectorOp::generate_code(Shader::Mode p_mode, VisualShader } void VisualShaderNodeVectorOp::set_operator(Operator p_op) { - op = p_op; emit_changed(); } VisualShaderNodeVectorOp::Operator VisualShaderNodeVectorOp::get_operator() const { - return op; } @@ -1312,7 +1263,6 @@ Vector<StringName> VisualShaderNodeVectorOp::get_editable_properties() const { } void VisualShaderNodeVectorOp::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeVectorOp::set_operator); ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeVectorOp::get_operator); @@ -1369,29 +1319,23 @@ String VisualShaderNodeColorOp::get_output_port_name(int p_port) const { } String VisualShaderNodeColorOp::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code; static const char *axisn[3] = { "x", "y", "z" }; switch (op) { case OP_SCREEN: { - code += "\t" + p_output_vars[0] + " = vec3(1.0) - (vec3(1.0) - " + p_input_vars[0] + ") * (vec3(1.0) - " + p_input_vars[1] + ");\n"; } break; case OP_DIFFERENCE: { - code += "\t" + p_output_vars[0] + " = abs(" + p_input_vars[0] + " - " + p_input_vars[1] + ");\n"; } break; case OP_DARKEN: { - code += "\t" + p_output_vars[0] + " = min(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n"; } break; case OP_LIGHTEN: { - code += "\t" + p_output_vars[0] + " = max(" + p_input_vars[0] + ", " + p_input_vars[1] + ");\n"; } break; case OP_OVERLAY: { - for (int i = 0; i < 3; i++) { code += "\t{\n"; code += "\t\tfloat base = " + p_input_vars[0] + "." + axisn[i] + ";\n"; @@ -1406,16 +1350,13 @@ String VisualShaderNodeColorOp::generate_code(Shader::Mode p_mode, VisualShader: } break; case OP_DODGE: { - code += "\t" + p_output_vars[0] + " = (" + p_input_vars[0] + ") / (vec3(1.0) - " + p_input_vars[1] + ");\n"; } break; case OP_BURN: { - code += "\t" + p_output_vars[0] + " = vec3(1.0) - (vec3(1.0) - " + p_input_vars[0] + ") / (" + p_input_vars[1] + ");\n"; } break; case OP_SOFT_LIGHT: { - for (int i = 0; i < 3; i++) { code += "\t{\n"; code += "\t\tfloat base = " + p_input_vars[0] + "." + axisn[i] + ";\n"; @@ -1430,7 +1371,6 @@ String VisualShaderNodeColorOp::generate_code(Shader::Mode p_mode, VisualShader: } break; case OP_HARD_LIGHT: { - for (int i = 0; i < 3; i++) { code += "\t{\n"; code += "\t\tfloat base = " + p_input_vars[0] + "." + axisn[i] + ";\n"; @@ -1450,7 +1390,6 @@ String VisualShaderNodeColorOp::generate_code(Shader::Mode p_mode, VisualShader: } void VisualShaderNodeColorOp::set_operator(Operator p_op) { - op = p_op; switch (op) { case OP_SCREEN: @@ -1485,7 +1424,6 @@ void VisualShaderNodeColorOp::set_operator(Operator p_op) { } VisualShaderNodeColorOp::Operator VisualShaderNodeColorOp::get_operator() const { - return op; } @@ -1496,7 +1434,6 @@ Vector<StringName> VisualShaderNodeColorOp::get_editable_properties() const { } void VisualShaderNodeColorOp::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeColorOp::set_operator); ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeColorOp::get_operator); @@ -1550,7 +1487,6 @@ String VisualShaderNodeTransformMult::get_output_port_name(int p_port) const { } String VisualShaderNodeTransformMult::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - if (op == OP_AxB) { return "\t" + p_output_vars[0] + " = " + p_input_vars[0] + " * " + p_input_vars[1] + ";\n"; } else if (op == OP_BxA) { @@ -1563,13 +1499,11 @@ String VisualShaderNodeTransformMult::generate_code(Shader::Mode p_mode, VisualS } void VisualShaderNodeTransformMult::set_operator(Operator p_op) { - op = p_op; emit_changed(); } VisualShaderNodeTransformMult::Operator VisualShaderNodeTransformMult::get_operator() const { - return op; } @@ -1580,7 +1514,6 @@ Vector<StringName> VisualShaderNodeTransformMult::get_editable_properties() cons } void VisualShaderNodeTransformMult::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeTransformMult::set_operator); ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeTransformMult::get_operator); @@ -1641,13 +1574,11 @@ String VisualShaderNodeTransformVecMult::generate_code(Shader::Mode p_mode, Visu } void VisualShaderNodeTransformVecMult::set_operator(Operator p_op) { - op = p_op; emit_changed(); } VisualShaderNodeTransformVecMult::Operator VisualShaderNodeTransformVecMult::get_operator() const { - return op; } @@ -1658,7 +1589,6 @@ Vector<StringName> VisualShaderNodeTransformVecMult::get_editable_properties() c } void VisualShaderNodeTransformVecMult::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_operator", "op"), &VisualShaderNodeTransformVecMult::set_operator); ClassDB::bind_method(D_METHOD("get_operator"), &VisualShaderNodeTransformVecMult::get_operator); @@ -1707,7 +1637,6 @@ String VisualShaderNodeFloatFunc::get_output_port_name(int p_port) const { } String VisualShaderNodeFloatFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - static const char *scalar_func_id[FUNC_ONEMINUS + 1] = { "sin($)", "cos($)", @@ -1747,13 +1676,11 @@ String VisualShaderNodeFloatFunc::generate_code(Shader::Mode p_mode, VisualShade } void VisualShaderNodeFloatFunc::set_function(Function p_func) { - func = p_func; emit_changed(); } VisualShaderNodeFloatFunc::Function VisualShaderNodeFloatFunc::get_function() const { - return func; } @@ -1764,7 +1691,6 @@ Vector<StringName> VisualShaderNodeFloatFunc::get_editable_properties() const { } void VisualShaderNodeFloatFunc::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeFloatFunc::set_function); ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeFloatFunc::get_function); @@ -1878,7 +1804,6 @@ void VisualShaderNodeIntFunc::set_function(Function p_func) { } VisualShaderNodeIntFunc::Function VisualShaderNodeIntFunc::get_function() const { - return func; } @@ -1889,7 +1814,6 @@ Vector<StringName> VisualShaderNodeIntFunc::get_editable_properties() const { } void VisualShaderNodeIntFunc::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeIntFunc::set_function); ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeIntFunc::get_function); @@ -1937,7 +1861,6 @@ String VisualShaderNodeVectorFunc::get_output_port_name(int p_port) const { } String VisualShaderNodeVectorFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - static const char *vec_func_id[FUNC_ONEMINUS + 1] = { "normalize($)", "max(min($, vec3(1.0)), vec3(0.0))", @@ -2004,7 +1927,6 @@ String VisualShaderNodeVectorFunc::generate_code(Shader::Mode p_mode, VisualShad } void VisualShaderNodeVectorFunc::set_function(Function p_func) { - func = p_func; if (func == FUNC_RGB2HSV) { simple_decl = false; @@ -2017,7 +1939,6 @@ void VisualShaderNodeVectorFunc::set_function(Function p_func) { } VisualShaderNodeVectorFunc::Function VisualShaderNodeVectorFunc::get_function() const { - return func; } @@ -2028,7 +1949,6 @@ Vector<StringName> VisualShaderNodeVectorFunc::get_editable_properties() const { } void VisualShaderNodeVectorFunc::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeVectorFunc::set_function); ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeVectorFunc::get_function); @@ -2107,7 +2027,6 @@ String VisualShaderNodeColorFunc::get_output_port_name(int p_port) const { } String VisualShaderNodeColorFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code; switch (func) { @@ -2135,13 +2054,11 @@ String VisualShaderNodeColorFunc::generate_code(Shader::Mode p_mode, VisualShade } void VisualShaderNodeColorFunc::set_function(Function p_func) { - func = p_func; emit_changed(); } VisualShaderNodeColorFunc::Function VisualShaderNodeColorFunc::get_function() const { - return func; } @@ -2152,7 +2069,6 @@ Vector<StringName> VisualShaderNodeColorFunc::get_editable_properties() const { } void VisualShaderNodeColorFunc::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeColorFunc::set_function); ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeColorFunc::get_function); @@ -2199,7 +2115,6 @@ String VisualShaderNodeTransformFunc::get_output_port_name(int p_port) const { } String VisualShaderNodeTransformFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - static const char *funcs[FUNC_TRANSPOSE + 1] = { "inverse($)", "transpose($)" @@ -2211,13 +2126,11 @@ String VisualShaderNodeTransformFunc::generate_code(Shader::Mode p_mode, VisualS } void VisualShaderNodeTransformFunc::set_function(Function p_func) { - func = p_func; emit_changed(); } VisualShaderNodeTransformFunc::Function VisualShaderNodeTransformFunc::get_function() const { - return func; } @@ -2228,7 +2141,6 @@ Vector<StringName> VisualShaderNodeTransformFunc::get_editable_properties() cons } void VisualShaderNodeTransformFunc::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeTransformFunc::set_function); ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeTransformFunc::get_function); @@ -2389,7 +2301,6 @@ String VisualShaderNodeScalarDerivativeFunc::get_output_port_name(int p_port) co } String VisualShaderNodeScalarDerivativeFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - static const char *funcs[FUNC_Y + 1] = { "fwidth($)", "dFdx($)", @@ -2402,13 +2313,11 @@ String VisualShaderNodeScalarDerivativeFunc::generate_code(Shader::Mode p_mode, } void VisualShaderNodeScalarDerivativeFunc::set_function(Function p_func) { - func = p_func; emit_changed(); } VisualShaderNodeScalarDerivativeFunc::Function VisualShaderNodeScalarDerivativeFunc::get_function() const { - return func; } @@ -2419,7 +2328,6 @@ Vector<StringName> VisualShaderNodeScalarDerivativeFunc::get_editable_properties } void VisualShaderNodeScalarDerivativeFunc::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeScalarDerivativeFunc::set_function); ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeScalarDerivativeFunc::get_function); @@ -2466,7 +2374,6 @@ String VisualShaderNodeVectorDerivativeFunc::get_output_port_name(int p_port) co } String VisualShaderNodeVectorDerivativeFunc::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - static const char *funcs[FUNC_Y + 1] = { "fwidth($)", "dFdx($)", @@ -2479,13 +2386,11 @@ String VisualShaderNodeVectorDerivativeFunc::generate_code(Shader::Mode p_mode, } void VisualShaderNodeVectorDerivativeFunc::set_function(Function p_func) { - func = p_func; emit_changed(); } VisualShaderNodeVectorDerivativeFunc::Function VisualShaderNodeVectorDerivativeFunc::get_function() const { - return func; } @@ -2496,7 +2401,6 @@ Vector<StringName> VisualShaderNodeVectorDerivativeFunc::get_editable_properties } void VisualShaderNodeVectorDerivativeFunc::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeVectorDerivativeFunc::set_function); ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeVectorDerivativeFunc::get_function); @@ -2527,12 +2431,13 @@ VisualShaderNodeScalarClamp::PortType VisualShaderNodeScalarClamp::get_input_por } String VisualShaderNodeScalarClamp::get_input_port_name(int p_port) const { - if (p_port == 0) + if (p_port == 0) { return ""; - else if (p_port == 1) + } else if (p_port == 1) { return "min"; - else if (p_port == 2) + } else if (p_port == 2) { return "max"; + } return ""; } @@ -2573,12 +2478,13 @@ VisualShaderNodeVectorClamp::PortType VisualShaderNodeVectorClamp::get_input_por } String VisualShaderNodeVectorClamp::get_input_port_name(int p_port) const { - if (p_port == 0) + if (p_port == 0) { return ""; - else if (p_port == 1) + } else if (p_port == 1) { return "min"; - else if (p_port == 2) + } else if (p_port == 2) { return "max"; + } return ""; } @@ -2717,10 +2623,11 @@ VisualShaderNodeVectorScalarStep::PortType VisualShaderNodeVectorScalarStep::get } String VisualShaderNodeVectorScalarStep::get_input_port_name(int p_port) const { - if (p_port == 0) + if (p_port == 0) { return "edge"; - else if (p_port == 1) + } else if (p_port == 1) { return "x"; + } return ""; } @@ -2760,12 +2667,13 @@ VisualShaderNodeScalarSmoothStep::PortType VisualShaderNodeScalarSmoothStep::get } String VisualShaderNodeScalarSmoothStep::get_input_port_name(int p_port) const { - if (p_port == 0) + if (p_port == 0) { return "edge0"; - else if (p_port == 1) + } else if (p_port == 1) { return "edge1"; - else if (p_port == 2) + } else if (p_port == 2) { return "x"; + } return ""; } @@ -2806,12 +2714,13 @@ VisualShaderNodeVectorSmoothStep::PortType VisualShaderNodeVectorSmoothStep::get } String VisualShaderNodeVectorSmoothStep::get_input_port_name(int p_port) const { - if (p_port == 0) + if (p_port == 0) { return "edge0"; - else if (p_port == 1) + } else if (p_port == 1) { return "edge1"; - else if (p_port == 2) + } else if (p_port == 2) { return "x"; + } return ""; } @@ -2857,12 +2766,13 @@ VisualShaderNodeVectorScalarSmoothStep::PortType VisualShaderNodeVectorScalarSmo } String VisualShaderNodeVectorScalarSmoothStep::get_input_port_name(int p_port) const { - if (p_port == 0) + if (p_port == 0) { return "edge0"; - else if (p_port == 1) + } else if (p_port == 1) { return "edge1"; - else if (p_port == 2) + } else if (p_port == 2) { return "x"; + } return ""; } @@ -2943,7 +2853,6 @@ int VisualShaderNodeVectorRefract::get_input_port_count() const { } VisualShaderNodeVectorRefract::PortType VisualShaderNodeVectorRefract::get_input_port_type(int p_port) const { - if (p_port == 2) { return PORT_TYPE_SCALAR; } @@ -3087,8 +2996,9 @@ int VisualShaderNodeVectorScalarMix::get_input_port_count() const { } VisualShaderNodeVectorScalarMix::PortType VisualShaderNodeVectorScalarMix::get_input_port_type(int p_port) const { - if (p_port == 2) + if (p_port == 2) { return PORT_TYPE_SCALAR; + } return PORT_TYPE_VECTOR; } @@ -3165,7 +3075,6 @@ String VisualShaderNodeVectorCompose::generate_code(Shader::Mode p_mode, VisualS } VisualShaderNodeVectorCompose::VisualShaderNodeVectorCompose() { - set_input_port_default_value(0, 0.0); set_input_port_default_value(1, 0.0); set_input_port_default_value(2, 0.0); @@ -3214,7 +3123,6 @@ String VisualShaderNodeTransformCompose::generate_code(Shader::Mode p_mode, Visu } VisualShaderNodeTransformCompose::VisualShaderNodeTransformCompose() { - set_input_port_default_value(0, Vector3()); set_input_port_default_value(1, Vector3()); set_input_port_default_value(2, Vector3()); @@ -3647,7 +3555,6 @@ String VisualShaderNodeColorUniform::get_output_port_name(int p_port) const { } String VisualShaderNodeColorUniform::generate_global(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - return _get_qual_str() + "uniform vec4 " + get_uniform_name() + " : hint_color;\n"; } @@ -3777,7 +3684,6 @@ int VisualShaderNodeTextureUniform::get_output_port_count() const { } VisualShaderNodeTextureUniform::PortType VisualShaderNodeTextureUniform::get_output_port_type(int p_port) const { - switch (p_port) { case 0: return PORT_TYPE_VECTOR; @@ -3791,7 +3697,6 @@ VisualShaderNodeTextureUniform::PortType VisualShaderNodeTextureUniform::get_out } String VisualShaderNodeTextureUniform::get_output_port_name(int p_port) const { - switch (p_port) { case 0: return "rgb"; @@ -3809,16 +3714,18 @@ String VisualShaderNodeTextureUniform::generate_global(Shader::Mode p_mode, Visu switch (texture_type) { case TYPE_DATA: - if (color_default == COLOR_DEFAULT_BLACK) + if (color_default == COLOR_DEFAULT_BLACK) { code += " : hint_black;\n"; - else + } else { code += ";\n"; + } break; case TYPE_COLOR: - if (color_default == COLOR_DEFAULT_BLACK) + if (color_default == COLOR_DEFAULT_BLACK) { code += " : hint_black_albedo;\n"; - else + } else { code += " : hint_albedo;\n"; + } break; case TYPE_NORMALMAP: code += " : hint_normal;\n"; @@ -3832,7 +3739,6 @@ String VisualShaderNodeTextureUniform::generate_global(Shader::Mode p_mode, Visu } String VisualShaderNodeTextureUniform::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String id = get_uniform_name(); String code = "\t{\n"; if (p_input_vars[0] == String()) { // Use UV by default. @@ -3855,7 +3761,6 @@ String VisualShaderNodeTextureUniform::generate_code(Shader::Mode p_mode, Visual } void VisualShaderNodeTextureUniform::set_texture_type(TextureType p_type) { - texture_type = p_type; emit_changed(); } @@ -3953,7 +3858,6 @@ String VisualShaderNodeTextureUniformTriplanar::get_input_port_name(int p_port) } String VisualShaderNodeTextureUniformTriplanar::generate_global_per_node(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - String code; code += "// TRIPLANAR FUNCTION GLOBAL CODE\n"; @@ -3976,11 +3880,9 @@ String VisualShaderNodeTextureUniformTriplanar::generate_global_per_node(Shader: } String VisualShaderNodeTextureUniformTriplanar::generate_global_per_func(Shader::Mode p_mode, VisualShader::Type p_type, int p_id) const { - String code; if (p_type == VisualShader::TYPE_VERTEX) { - code += "\t// TRIPLANAR FUNCTION VERTEX CODE\n"; code += "\t\ttriplanar_power_normal = pow(abs(NORMAL), vec3(triplanar_sharpness));\n"; code += "\t\ttriplanar_power_normal /= dot(triplanar_power_normal, vec3(1.0));\n"; @@ -3992,7 +3894,6 @@ String VisualShaderNodeTextureUniformTriplanar::generate_global_per_func(Shader: } String VisualShaderNodeTextureUniformTriplanar::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String id = get_uniform_name(); String code = "\t{\n"; @@ -4064,16 +3965,18 @@ String VisualShaderNodeCubemapUniform::generate_global(Shader::Mode p_mode, Visu switch (texture_type) { case TYPE_DATA: - if (color_default == COLOR_DEFAULT_BLACK) + if (color_default == COLOR_DEFAULT_BLACK) { code += " : hint_black;\n"; - else + } else { code += ";\n"; + } break; case TYPE_COLOR: - if (color_default == COLOR_DEFAULT_BLACK) + if (color_default == COLOR_DEFAULT_BLACK) { code += " : hint_black_albedo;\n"; - else + } else { code += " : hint_albedo;\n"; + } break; case TYPE_NORMALMAP: code += " : hint_normal;\n"; @@ -4142,7 +4045,6 @@ String VisualShaderNodeIf::get_output_port_name(int p_port) const { } String VisualShaderNodeIf::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code; code += "\tif(abs(" + p_input_vars[0] + " - " + p_input_vars[1] + ") < " + p_input_vars[2] + ")\n"; // abs(a - b) < tolerance eg. a == b code += "\t{\n"; @@ -4212,7 +4114,6 @@ String VisualShaderNodeSwitch::get_output_port_name(int p_port) const { } String VisualShaderNodeSwitch::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String code; code += "\tif(" + p_input_vars[0] + ")\n"; code += "\t{\n"; @@ -4308,7 +4209,6 @@ String VisualShaderNodeFresnel::get_output_port_name(int p_port) const { } String VisualShaderNodeFresnel::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - String normal; String view; if (p_input_vars[0] == String()) { @@ -4342,42 +4242,34 @@ VisualShaderNodeFresnel::VisualShaderNodeFresnel() { ////////////// Is String VisualShaderNodeIs::get_caption() const { - return "Is"; } int VisualShaderNodeIs::get_input_port_count() const { - return 1; } VisualShaderNodeIs::PortType VisualShaderNodeIs::get_input_port_type(int p_port) const { - return PORT_TYPE_SCALAR; } String VisualShaderNodeIs::get_input_port_name(int p_port) const { - return ""; } int VisualShaderNodeIs::get_output_port_count() const { - return 1; } VisualShaderNodeIs::PortType VisualShaderNodeIs::get_output_port_type(int p_port) const { - return PORT_TYPE_BOOLEAN; } String VisualShaderNodeIs::get_output_port_name(int p_port) const { - return ""; } String VisualShaderNodeIs::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - static const char *funcs[FUNC_IS_NAN + 1] = { "isinf($)", "isnan($)" @@ -4389,25 +4281,21 @@ String VisualShaderNodeIs::generate_code(Shader::Mode p_mode, VisualShader::Type } void VisualShaderNodeIs::set_function(Function p_func) { - func = p_func; emit_changed(); } VisualShaderNodeIs::Function VisualShaderNodeIs::get_function() const { - return func; } Vector<StringName> VisualShaderNodeIs::get_editable_properties() const { - Vector<StringName> props; props.push_back("function"); return props; } void VisualShaderNodeIs::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_function", "func"), &VisualShaderNodeIs::set_function); ClassDB::bind_method(D_METHOD("get_function"), &VisualShaderNodeIs::get_function); @@ -4418,7 +4306,6 @@ void VisualShaderNodeIs::_bind_methods() { } VisualShaderNodeIs::VisualShaderNodeIs() { - func = FUNC_IS_INF; set_input_port_default_value(0, 0.0); } @@ -4426,12 +4313,10 @@ VisualShaderNodeIs::VisualShaderNodeIs() { ////////////// Compare String VisualShaderNodeCompare::get_caption() const { - return "Compare"; } int VisualShaderNodeCompare::get_input_port_count() const { - if (ctype == CTYPE_SCALAR && (func == FUNC_EQUAL || func == FUNC_NOT_EQUAL)) { return 3; } @@ -4439,9 +4324,9 @@ int VisualShaderNodeCompare::get_input_port_count() const { } VisualShaderNodeCompare::PortType VisualShaderNodeCompare::get_input_port_type(int p_port) const { - - if (p_port == 2) + if (p_port == 2) { return PORT_TYPE_SCALAR; + } switch (ctype) { case CTYPE_SCALAR: return PORT_TYPE_SCALAR; @@ -4458,12 +4343,13 @@ VisualShaderNodeCompare::PortType VisualShaderNodeCompare::get_input_port_type(i } String VisualShaderNodeCompare::get_input_port_name(int p_port) const { - if (p_port == 0) + if (p_port == 0) { return "a"; - else if (p_port == 1) + } else if (p_port == 1) { return "b"; - else if (p_port == 2) + } else if (p_port == 2) { return "tolerance"; + } return ""; } @@ -4476,13 +4362,13 @@ VisualShaderNodeCompare::PortType VisualShaderNodeCompare::get_output_port_type( } String VisualShaderNodeCompare::get_output_port_name(int p_port) const { - if (p_port == 0) + if (p_port == 0) { return "result"; + } return ""; } String VisualShaderNodeCompare::get_warning(Shader::Mode p_mode, VisualShader::Type p_type) const { - if (ctype == CTYPE_BOOLEAN || ctype == CTYPE_TRANSFORM) { if (func > FUNC_NOT_EQUAL) { return TTR("Invalid comparison function for that type."); @@ -4493,7 +4379,6 @@ String VisualShaderNodeCompare::get_warning(Shader::Mode p_mode, VisualShader::T } String VisualShaderNodeCompare::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { - static const char *ops[FUNC_LESS_THAN_EQUAL + 1] = { "==", "!=", @@ -4541,14 +4426,16 @@ String VisualShaderNodeCompare::generate_code(Shader::Mode p_mode, VisualShader: break; case CTYPE_BOOLEAN: - if (func > FUNC_NOT_EQUAL) + if (func > FUNC_NOT_EQUAL) { return "\t" + p_output_vars[0] + " = false;\n"; + } code += "\t" + p_output_vars[0] + " = " + (p_input_vars[0] + " $ " + p_input_vars[1]).replace("$", ops[func]) + ";\n"; break; case CTYPE_TRANSFORM: - if (func > FUNC_NOT_EQUAL) + if (func > FUNC_NOT_EQUAL) { return "\t" + p_output_vars[0] + " = false;\n"; + } code += "\t" + p_output_vars[0] + " = " + (p_input_vars[0] + " $ " + p_input_vars[1]).replace("$", ops[func]) + ";\n"; break; @@ -4559,7 +4446,6 @@ String VisualShaderNodeCompare::generate_code(Shader::Mode p_mode, VisualShader: } void VisualShaderNodeCompare::set_comparison_type(ComparisonType p_type) { - ctype = p_type; switch (ctype) { @@ -4593,29 +4479,24 @@ void VisualShaderNodeCompare::set_comparison_type(ComparisonType p_type) { } VisualShaderNodeCompare::ComparisonType VisualShaderNodeCompare::get_comparison_type() const { - return ctype; } void VisualShaderNodeCompare::set_function(Function p_func) { - func = p_func; emit_changed(); } VisualShaderNodeCompare::Function VisualShaderNodeCompare::get_function() const { - return func; } void VisualShaderNodeCompare::set_condition(Condition p_cond) { - condition = p_cond; emit_changed(); } VisualShaderNodeCompare::Condition VisualShaderNodeCompare::get_condition() const { - return condition; } @@ -4623,13 +4504,13 @@ Vector<StringName> VisualShaderNodeCompare::get_editable_properties() const { Vector<StringName> props; props.push_back("type"); props.push_back("function"); - if (ctype == CTYPE_VECTOR) + if (ctype == CTYPE_VECTOR) { props.push_back("condition"); + } return props; } void VisualShaderNodeCompare::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_comparison_type", "type"), &VisualShaderNodeCompare::set_comparison_type); ClassDB::bind_method(D_METHOD("get_comparison_type"), &VisualShaderNodeCompare::get_comparison_type); diff --git a/scene/resources/world_2d.cpp b/scene/resources/world_2d.cpp index f2f67d3814..1c753fdb91 100644 --- a/scene/resources/world_2d.cpp +++ b/scene/resources/world_2d.cpp @@ -38,9 +38,7 @@ #include "servers/rendering_server.h" struct SpatialIndexer2D { - struct CellRef { - int ref; _FORCE_INLINE_ int inc() { @@ -58,7 +56,6 @@ struct SpatialIndexer2D { }; struct CellKey { - union { struct { int32_t x; @@ -74,7 +71,6 @@ struct SpatialIndexer2D { }; struct CellData { - Map<VisibilityNotifier2D *, CellRef> notifiers; }; @@ -84,7 +80,6 @@ struct SpatialIndexer2D { Map<VisibilityNotifier2D *, Rect2> notifiers; struct ViewportData { - Map<VisibilityNotifier2D *, uint64_t> notifiers; Rect2 rect; }; @@ -96,30 +91,25 @@ struct SpatialIndexer2D { uint64_t pass; void _notifier_update_cells(VisibilityNotifier2D *p_notifier, const Rect2 &p_rect, bool p_add) { - Point2i begin = p_rect.position; begin /= cell_size; Point2i end = p_rect.position + p_rect.size; end /= cell_size; for (int i = begin.x; i <= end.x; i++) { - for (int j = begin.y; j <= end.y; j++) { - CellKey ck; ck.x = i; ck.y = j; Map<CellKey, CellData>::Element *E = cells.find(ck); if (p_add) { - - if (!E) + if (!E) { E = cells.insert(ck, CellData()); + } E->get().notifiers[p_notifier].inc(); } else { - ERR_CONTINUE(!E); if (E->get().notifiers[p_notifier].dec() == 0) { - E->get().notifiers.erase(p_notifier); if (E->get().notifiers.empty()) { cells.erase(E); @@ -131,7 +121,6 @@ struct SpatialIndexer2D { } void _notifier_add(VisibilityNotifier2D *p_notifier, const Rect2 &p_rect) { - ERR_FAIL_COND(notifiers.has(p_notifier)); notifiers[p_notifier] = p_rect; _notifier_update_cells(p_notifier, p_rect, true); @@ -139,11 +128,11 @@ struct SpatialIndexer2D { } void _notifier_update(VisibilityNotifier2D *p_notifier, const Rect2 &p_rect) { - Map<VisibilityNotifier2D *, Rect2>::Element *E = notifiers.find(p_notifier); ERR_FAIL_COND(!E); - if (E->get() == p_rect) + if (E->get() == p_rect) { return; + } _notifier_update_cells(p_notifier, p_rect, true); _notifier_update_cells(p_notifier, E->get(), false); @@ -152,7 +141,6 @@ struct SpatialIndexer2D { } void _notifier_remove(VisibilityNotifier2D *p_notifier) { - Map<VisibilityNotifier2D *, Rect2>::Element *E = notifiers.find(p_notifier); ERR_FAIL_COND(!E); _notifier_update_cells(p_notifier, E->get(), false); @@ -160,7 +148,6 @@ struct SpatialIndexer2D { List<Viewport *> removed; for (Map<Viewport *, ViewportData>::Element *F = viewports.front(); F; F = F->next()) { - Map<VisibilityNotifier2D *, uint64_t>::Element *G = F->get().notifiers.find(p_notifier); if (G) { @@ -170,7 +157,6 @@ struct SpatialIndexer2D { } while (!removed.empty()) { - p_notifier->_exit_viewport(removed.front()->get()); removed.pop_front(); } @@ -179,7 +165,6 @@ struct SpatialIndexer2D { } void _add_viewport(Viewport *p_viewport, const Rect2 &p_rect) { - ERR_FAIL_COND(viewports.has(p_viewport)); ViewportData vd; vd.rect = p_rect; @@ -188,11 +173,11 @@ struct SpatialIndexer2D { } void _update_viewport(Viewport *p_viewport, const Rect2 &p_rect) { - Map<Viewport *, ViewportData>::Element *E = viewports.find(p_viewport); ERR_FAIL_COND(!E); - if (E->get().rect == p_rect) + if (E->get().rect == p_rect) { return; + } E->get().rect = p_rect; changed = true; } @@ -201,7 +186,6 @@ struct SpatialIndexer2D { ERR_FAIL_COND(!viewports.has(p_viewport)); List<VisibilityNotifier2D *> removed; for (Map<VisibilityNotifier2D *, uint64_t>::Element *E = viewports[p_viewport].notifiers.front(); E; E = E->next()) { - removed.push_back(E->key()); } @@ -214,12 +198,11 @@ struct SpatialIndexer2D { } void _update() { - - if (!changed) + if (!changed) { return; + } for (Map<Viewport *, ViewportData>::Element *E = viewports.front(); E; E = E->next()) { - Point2i begin = E->get().rect.position; begin /= cell_size; Point2i end = E->get().rect.position + E->get().rect.size; @@ -231,24 +214,22 @@ struct SpatialIndexer2D { int visible_cells = (end.x - begin.x) * (end.y - begin.y); if (visible_cells > 10000) { - //well you zoomed out a lot, it's your problem. To avoid freezing in the for loops below, we'll manually check cell by cell for (Map<CellKey, CellData>::Element *F = cells.front(); F; F = F->next()) { - const CellKey &ck = F->key(); - if (ck.x < begin.x || ck.x > end.x) + if (ck.x < begin.x || ck.x > end.x) { continue; - if (ck.y < begin.y || ck.y > end.y) + } + if (ck.y < begin.y || ck.y > end.y) { continue; + } //notifiers in cell for (Map<VisibilityNotifier2D *, CellRef>::Element *G = F->get().notifiers.front(); G; G = G->next()) { - Map<VisibilityNotifier2D *, uint64_t>::Element *H = E->get().notifiers.find(G->key()); if (!H) { - H = E->get().notifiers.insert(G->key(), pass); added.push_back(G->key()); } else { @@ -258,12 +239,9 @@ struct SpatialIndexer2D { } } else { - //check cells in grid fashion for (int i = begin.x; i <= end.x; i++) { - for (int j = begin.y; j <= end.y; j++) { - CellKey ck; ck.x = i; ck.y = j; @@ -275,10 +253,8 @@ struct SpatialIndexer2D { //notifiers in cell for (Map<VisibilityNotifier2D *, CellRef>::Element *G = F->get().notifiers.front(); G; G = G->next()) { - Map<VisibilityNotifier2D *, uint64_t>::Element *H = E->get().notifiers.find(G->key()); if (!H) { - H = E->get().notifiers.insert(G->key(), pass); added.push_back(G->key()); } else { @@ -290,9 +266,9 @@ struct SpatialIndexer2D { } for (Map<VisibilityNotifier2D *, uint64_t>::Element *F = E->get().notifiers.front(); F; F = F->next()) { - - if (F->get() != pass) + if (F->get() != pass) { removed.push_back(F->key()); + } } while (!added.empty()) { @@ -311,7 +287,6 @@ struct SpatialIndexer2D { } SpatialIndexer2D() { - pass = 0; changed = false; cell_size = GLOBAL_DEF("world/2d/cell_size", 100); @@ -319,56 +294,48 @@ struct SpatialIndexer2D { }; void World2D::_register_viewport(Viewport *p_viewport, const Rect2 &p_rect) { - indexer->_add_viewport(p_viewport, p_rect); } void World2D::_update_viewport(Viewport *p_viewport, const Rect2 &p_rect) { - indexer->_update_viewport(p_viewport, p_rect); } -void World2D::_remove_viewport(Viewport *p_viewport) { +void World2D::_remove_viewport(Viewport *p_viewport) { indexer->_remove_viewport(p_viewport); } void World2D::_register_notifier(VisibilityNotifier2D *p_notifier, const Rect2 &p_rect) { - indexer->_notifier_add(p_notifier, p_rect); } -void World2D::_update_notifier(VisibilityNotifier2D *p_notifier, const Rect2 &p_rect) { +void World2D::_update_notifier(VisibilityNotifier2D *p_notifier, const Rect2 &p_rect) { indexer->_notifier_update(p_notifier, p_rect); } -void World2D::_remove_notifier(VisibilityNotifier2D *p_notifier) { +void World2D::_remove_notifier(VisibilityNotifier2D *p_notifier) { indexer->_notifier_remove(p_notifier); } void World2D::_update() { - indexer->_update(); } RID World2D::get_canvas() { - return canvas; } RID World2D::get_space() { - return space; } void World2D::get_viewport_list(List<Viewport *> *r_viewports) { - for (Map<Viewport *, SpatialIndexer2D::ViewportData>::Element *E = indexer->viewports.front(); E; E = E->next()) { r_viewports->push_back(E->key()); } } void World2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_canvas"), &World2D::get_canvas); ClassDB::bind_method(D_METHOD("get_space"), &World2D::get_space); @@ -380,12 +347,10 @@ void World2D::_bind_methods() { } PhysicsDirectSpaceState2D *World2D::get_direct_space_state() { - return PhysicsServer2D::get_singleton()->space_get_direct_state(space); } World2D::World2D() { - canvas = RenderingServer::get_singleton()->canvas_create(); space = PhysicsServer2D::get_singleton()->space_create(); @@ -401,7 +366,6 @@ World2D::World2D() { } World2D::~World2D() { - RenderingServer::get_singleton()->free(canvas); PhysicsServer2D::get_singleton()->free(space); memdelete(indexer); diff --git a/scene/resources/world_2d.h b/scene/resources/world_2d.h index 88b4c2594c..c330719104 100644 --- a/scene/resources/world_2d.h +++ b/scene/resources/world_2d.h @@ -40,7 +40,6 @@ class Viewport; struct SpatialIndexer2D; class World2D : public Resource { - GDCLASS(World2D, Resource); RID canvas; diff --git a/scene/resources/world_3d.cpp b/scene/resources/world_3d.cpp index dee00dd82a..8100f150ef 100644 --- a/scene/resources/world_3d.cpp +++ b/scene/resources/world_3d.cpp @@ -37,18 +37,15 @@ #include "scene/scene_string_names.h" struct SpatialIndexer { - Octree<VisibilityNotifier3D> octree; struct NotifierData { - AABB aabb; OctreeElementID id; }; Map<VisibilityNotifier3D *, NotifierData> notifiers; struct CameraData { - Map<VisibilityNotifier3D *, uint64_t> notifiers; }; @@ -65,7 +62,6 @@ struct SpatialIndexer { uint64_t last_frame; void _notifier_add(VisibilityNotifier3D *p_notifier, const AABB &p_rect) { - ERR_FAIL_COND(notifiers.has(p_notifier)); notifiers[p_notifier].aabb = p_rect; notifiers[p_notifier].id = octree.create(p_notifier, p_rect); @@ -73,11 +69,11 @@ struct SpatialIndexer { } void _notifier_update(VisibilityNotifier3D *p_notifier, const AABB &p_rect) { - Map<VisibilityNotifier3D *, NotifierData>::Element *E = notifiers.find(p_notifier); ERR_FAIL_COND(!E); - if (E->get().aabb == p_rect) + if (E->get().aabb == p_rect) { return; + } E->get().aabb = p_rect; octree.move(E->get().id, E->get().aabb); @@ -85,7 +81,6 @@ struct SpatialIndexer { } void _notifier_remove(VisibilityNotifier3D *p_notifier) { - Map<VisibilityNotifier3D *, NotifierData>::Element *E = notifiers.find(p_notifier); ERR_FAIL_COND(!E); @@ -94,7 +89,6 @@ struct SpatialIndexer { List<Camera3D *> removed; for (Map<Camera3D *, CameraData>::Element *F = cameras.front(); F; F = F->next()) { - Map<VisibilityNotifier3D *, uint64_t>::Element *G = F->get().notifiers.find(p_notifier); if (G) { @@ -104,7 +98,6 @@ struct SpatialIndexer { } while (!removed.empty()) { - p_notifier->_exit_camera(removed.front()->get()); removed.pop_front(); } @@ -113,7 +106,6 @@ struct SpatialIndexer { } void _add_camera(Camera3D *p_camera) { - ERR_FAIL_COND(cameras.has(p_camera)); CameraData vd; cameras[p_camera] = vd; @@ -121,7 +113,6 @@ struct SpatialIndexer { } void _update_camera(Camera3D *p_camera) { - Map<Camera3D *, CameraData>::Element *E = cameras.find(p_camera); ERR_FAIL_COND(!E); changed = true; @@ -131,7 +122,6 @@ struct SpatialIndexer { ERR_FAIL_COND(!cameras.has(p_camera)); List<VisibilityNotifier3D *> removed; for (Map<VisibilityNotifier3D *, uint64_t>::Element *E = cameras[p_camera].notifiers.front(); E; E = E->next()) { - removed.push_back(E->key()); } @@ -144,16 +134,16 @@ struct SpatialIndexer { } void _update(uint64_t p_frame) { - - if (p_frame == last_frame) + if (p_frame == last_frame) { return; + } last_frame = p_frame; - if (!changed) + if (!changed) { return; + } for (Map<Camera3D *, CameraData>::Element *E = cameras.front(); E; E = E->next()) { - pass++; Camera3D *c = E->key(); @@ -168,12 +158,10 @@ struct SpatialIndexer { List<VisibilityNotifier3D *> removed; for (int i = 0; i < culled; i++) { - //notifiers in frustum Map<VisibilityNotifier3D *, uint64_t>::Element *H = E->get().notifiers.find(ptr[i]); if (!H) { - E->get().notifiers.insert(ptr[i], pass); added.push_back(ptr[i]); } else { @@ -182,9 +170,9 @@ struct SpatialIndexer { } for (Map<VisibilityNotifier3D *, uint64_t>::Element *F = E->get().notifiers.front(); F; F = F->next()) { - - if (F->get() != pass) + if (F->get() != pass) { removed.push_back(F->key()); + } } while (!added.empty()) { @@ -202,7 +190,6 @@ struct SpatialIndexer { } SpatialIndexer() { - pass = 0; last_frame = 0; changed = false; @@ -211,60 +198,52 @@ struct SpatialIndexer { }; void World3D::_register_camera(Camera3D *p_camera) { - #ifndef _3D_DISABLED indexer->_add_camera(p_camera); #endif } void World3D::_update_camera(Camera3D *p_camera) { - #ifndef _3D_DISABLED indexer->_update_camera(p_camera); #endif } -void World3D::_remove_camera(Camera3D *p_camera) { +void World3D::_remove_camera(Camera3D *p_camera) { #ifndef _3D_DISABLED indexer->_remove_camera(p_camera); #endif } void World3D::_register_notifier(VisibilityNotifier3D *p_notifier, const AABB &p_rect) { - #ifndef _3D_DISABLED indexer->_notifier_add(p_notifier, p_rect); #endif } void World3D::_update_notifier(VisibilityNotifier3D *p_notifier, const AABB &p_rect) { - #ifndef _3D_DISABLED indexer->_notifier_update(p_notifier, p_rect); #endif } void World3D::_remove_notifier(VisibilityNotifier3D *p_notifier) { - #ifndef _3D_DISABLED indexer->_notifier_remove(p_notifier); #endif } void World3D::_update(uint64_t p_frame) { - #ifndef _3D_DISABLED indexer->_update(p_frame); #endif } RID World3D::get_space() const { - return space; } RID World3D::get_scenario() const { - return scenario; } @@ -274,16 +253,16 @@ void World3D::set_environment(const Ref<Environment> &p_environment) { } environment = p_environment; - if (environment.is_valid()) + if (environment.is_valid()) { RS::get_singleton()->scenario_set_environment(scenario, environment->get_rid()); - else + } else { RS::get_singleton()->scenario_set_environment(scenario, RID()); + } emit_changed(); } Ref<Environment> World3D::get_environment() const { - return environment; } @@ -293,47 +272,43 @@ void World3D::set_fallback_environment(const Ref<Environment> &p_environment) { } fallback_environment = p_environment; - if (fallback_environment.is_valid()) + if (fallback_environment.is_valid()) { RS::get_singleton()->scenario_set_fallback_environment(scenario, p_environment->get_rid()); - else + } else { RS::get_singleton()->scenario_set_fallback_environment(scenario, RID()); + } emit_changed(); } Ref<Environment> World3D::get_fallback_environment() const { - return fallback_environment; } void World3D::set_camera_effects(const Ref<CameraEffects> &p_camera_effects) { - camera_effects = p_camera_effects; - if (camera_effects.is_valid()) + if (camera_effects.is_valid()) { RS::get_singleton()->scenario_set_camera_effects(scenario, camera_effects->get_rid()); - else + } else { RS::get_singleton()->scenario_set_camera_effects(scenario, RID()); + } } Ref<CameraEffects> World3D::get_camera_effects() const { - return camera_effects; } PhysicsDirectSpaceState3D *World3D::get_direct_space_state() { - return PhysicsServer3D::get_singleton()->space_get_direct_state(space); } void World3D::get_camera_list(List<Camera3D *> *r_cameras) { - for (Map<Camera3D *, SpatialIndexer::CameraData>::Element *E = indexer->cameras.front(); E; E = E->next()) { r_cameras->push_back(E->key()); } } void World3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_space"), &World3D::get_space); ClassDB::bind_method(D_METHOD("get_scenario"), &World3D::get_scenario); ClassDB::bind_method(D_METHOD("set_environment", "env"), &World3D::set_environment); @@ -352,7 +327,6 @@ void World3D::_bind_methods() { } World3D::World3D() { - space = PhysicsServer3D::get_singleton()->space_create(); scenario = RenderingServer::get_singleton()->scenario_create(); @@ -372,7 +346,6 @@ World3D::World3D() { } World3D::~World3D() { - PhysicsServer3D::get_singleton()->free(space); RenderingServer::get_singleton()->free(scenario); diff --git a/scene/resources/world_margin_shape_3d.cpp b/scene/resources/world_margin_shape_3d.cpp index aa96f8aa68..d613413b33 100644 --- a/scene/resources/world_margin_shape_3d.cpp +++ b/scene/resources/world_margin_shape_3d.cpp @@ -33,7 +33,6 @@ #include "servers/physics_server_3d.h" Vector<Vector3> WorldMarginShape3D::get_debug_mesh_lines() { - Plane p = get_plane(); Vector<Vector3> points; @@ -62,13 +61,11 @@ Vector<Vector3> WorldMarginShape3D::get_debug_mesh_lines() { } void WorldMarginShape3D::_update_shape() { - PhysicsServer3D::get_singleton()->shape_set_data(get_shape(), plane); Shape3D::_update_shape(); } void WorldMarginShape3D::set_plane(Plane p_plane) { - plane = p_plane; _update_shape(); notify_change_to_owners(); @@ -76,12 +73,10 @@ void WorldMarginShape3D::set_plane(Plane p_plane) { } Plane WorldMarginShape3D::get_plane() const { - return plane; } void WorldMarginShape3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_plane", "plane"), &WorldMarginShape3D::set_plane); ClassDB::bind_method(D_METHOD("get_plane"), &WorldMarginShape3D::get_plane); @@ -90,6 +85,5 @@ void WorldMarginShape3D::_bind_methods() { WorldMarginShape3D::WorldMarginShape3D() : Shape3D(PhysicsServer3D::get_singleton()->shape_create(PhysicsServer3D::SHAPE_PLANE)) { - set_plane(Plane(0, 1, 0, 0)); } diff --git a/scene/resources/world_margin_shape_3d.h b/scene/resources/world_margin_shape_3d.h index 5e0f046628..acb479972b 100644 --- a/scene/resources/world_margin_shape_3d.h +++ b/scene/resources/world_margin_shape_3d.h @@ -34,7 +34,6 @@ #include "scene/resources/shape_3d.h" class WorldMarginShape3D : public Shape3D { - GDCLASS(WorldMarginShape3D, Shape3D); Plane plane; diff --git a/scene/scene_string_names.cpp b/scene/scene_string_names.cpp index e761354cc9..7f87da3724 100644 --- a/scene/scene_string_names.cpp +++ b/scene/scene_string_names.cpp @@ -33,7 +33,6 @@ SceneStringNames *SceneStringNames::singleton = nullptr; SceneStringNames::SceneStringNames() { - _estimate_cost = StaticCString::create("_estimate_cost"); _compute_cost = StaticCString::create("_compute_cost"); @@ -189,7 +188,6 @@ SceneStringNames::SceneStringNames() { _default = StaticCString::create("default"); for (int i = 0; i < MAX_MATERIALS; i++) { - mesh_materials[i] = "material/" + itos(i); } diff --git a/scene/scene_string_names.h b/scene/scene_string_names.h index c5c98ba9e5..1a6ffbd5dd 100644 --- a/scene/scene_string_names.h +++ b/scene/scene_string_names.h @@ -35,7 +35,6 @@ #include "core/string_name.h" class SceneStringNames { - friend void register_scene_types(); friend void unregister_scene_types(); |