diff options
Diffstat (limited to 'scene/2d')
| -rw-r--r-- | scene/2d/canvas_item.cpp | 19 | ||||
| -rw-r--r-- | scene/2d/particles_2d.cpp | 23 | ||||
| -rw-r--r-- | scene/2d/particles_2d.h | 4 |
3 files changed, 41 insertions, 5 deletions
diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp index 57d178abe3..4a80aba355 100644 --- a/scene/2d/canvas_item.cpp +++ b/scene/2d/canvas_item.cpp @@ -96,8 +96,8 @@ void CanvasItemMaterial::_update_shader() { switch (light_mode) { case LIGHT_MODE_NORMAL: break; - case LIGHT_MODE_UNSHADED: code += "unshaded"; break; - case LIGHT_MODE_LIGHT_ONLY: code += "light_only"; break; + case LIGHT_MODE_UNSHADED: code += ",unshaded"; break; + case LIGHT_MODE_LIGHT_ONLY: code += ",light_only"; break; } code += ";\n"; //thats it. @@ -367,7 +367,9 @@ Transform2D CanvasItem::get_global_transform_with_canvas() const { } Transform2D CanvasItem::get_global_transform() const { - +#ifdef DEBUG_ENABLED + ERR_FAIL_COND_V(!is_inside_tree(), get_transform()); +#endif if (global_invalid) { const CanvasItem *pi = get_parent_item(); @@ -765,8 +767,9 @@ float CanvasItem::draw_char(const Ref<Font> &p_font, const Point2 &p_pos, const void CanvasItem::_notify_transform(CanvasItem *p_node) { - if (/*p_node->xform_change.in_list() &&*/ p_node->global_invalid) + if (/*p_node->xform_change.in_list() &&*/ p_node->global_invalid) { return; //nothing to do + } p_node->global_invalid = true; @@ -1067,7 +1070,15 @@ bool CanvasItem::is_local_transform_notification_enabled() const { } void CanvasItem::set_notify_transform(bool p_enable) { + if (notify_transform == p_enable) + return; + notify_transform = p_enable; + + if (notify_transform && is_inside_tree()) { + //this ensures that invalid globals get resolved, so notifications can be received + get_global_transform(); + } } bool CanvasItem::is_transform_notification_enabled() const { diff --git a/scene/2d/particles_2d.cpp b/scene/2d/particles_2d.cpp index beff247264..ba795d58f4 100644 --- a/scene/2d/particles_2d.cpp +++ b/scene/2d/particles_2d.cpp @@ -50,6 +50,12 @@ void Particles2D::set_lifetime(float p_lifetime) { lifetime = p_lifetime; VS::get_singleton()->particles_set_lifetime(particles, lifetime); } + +void Particles2D::set_one_shot(bool p_enable) { + + one_shot = p_enable; + VS::get_singleton()->particles_set_one_shot(particles, one_shot); +} void Particles2D::set_pre_process_time(float p_time) { pre_process_time = p_time; @@ -84,7 +90,7 @@ void Particles2D::set_use_local_coordinates(bool p_enable) { local_coords = p_enable; VS::get_singleton()->particles_set_use_local_coordinates(particles, local_coords); set_notify_transform(!p_enable); - if (!p_enable) { + if (!p_enable && is_inside_tree()) { _update_particle_emission_transform(); } } @@ -135,6 +141,11 @@ float Particles2D::get_lifetime() const { return lifetime; } + +bool Particles2D::get_one_shot() const { + + return one_shot; +} float Particles2D::get_pre_process_time() const { return pre_process_time; @@ -264,6 +275,10 @@ int Particles2D::get_h_frames() const { return h_frames; } +void Particles2D::restart() { + VS::get_singleton()->particles_restart(particles); +} + void Particles2D::_notification(int p_what) { if (p_what == NOTIFICATION_DRAW) { @@ -295,6 +310,7 @@ void Particles2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_emitting", "emitting"), &Particles2D::set_emitting); ClassDB::bind_method(D_METHOD("set_amount", "amount"), &Particles2D::set_amount); ClassDB::bind_method(D_METHOD("set_lifetime", "secs"), &Particles2D::set_lifetime); + ClassDB::bind_method(D_METHOD("set_one_shot", "secs"), &Particles2D::set_one_shot); ClassDB::bind_method(D_METHOD("set_pre_process_time", "secs"), &Particles2D::set_pre_process_time); ClassDB::bind_method(D_METHOD("set_explosiveness_ratio", "ratio"), &Particles2D::set_explosiveness_ratio); ClassDB::bind_method(D_METHOD("set_randomness_ratio", "ratio"), &Particles2D::set_randomness_ratio); @@ -308,6 +324,7 @@ void Particles2D::_bind_methods() { ClassDB::bind_method(D_METHOD("is_emitting"), &Particles2D::is_emitting); ClassDB::bind_method(D_METHOD("get_amount"), &Particles2D::get_amount); ClassDB::bind_method(D_METHOD("get_lifetime"), &Particles2D::get_lifetime); + ClassDB::bind_method(D_METHOD("get_one_shot"), &Particles2D::get_one_shot); ClassDB::bind_method(D_METHOD("get_pre_process_time"), &Particles2D::get_pre_process_time); ClassDB::bind_method(D_METHOD("get_explosiveness_ratio"), &Particles2D::get_explosiveness_ratio); ClassDB::bind_method(D_METHOD("get_randomness_ratio"), &Particles2D::get_randomness_ratio); @@ -335,10 +352,13 @@ void Particles2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_h_frames", "frames"), &Particles2D::set_h_frames); ClassDB::bind_method(D_METHOD("get_h_frames"), &Particles2D::get_h_frames); + ClassDB::bind_method(D_METHOD("restart"), &Particles2D::restart); + ADD_GROUP("Parameters", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "emitting"), "set_emitting", "is_emitting"); ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,100000,1"), "set_amount", "get_amount"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "lifetime", PROPERTY_HINT_RANGE, "0.01,600.0,0.01"), "set_lifetime", "get_lifetime"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "one_shot"), "set_one_shot", "get_one_shot"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "preprocess", PROPERTY_HINT_RANGE, "0.00,600.0,0.01"), "set_pre_process_time", "get_pre_process_time"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "speed_scale", PROPERTY_HINT_RANGE, "0.01,64,0.01"), "set_speed_scale", "get_speed_scale"); ADD_PROPERTY(PropertyInfo(Variant::REAL, "explosiveness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_explosiveness_ratio", "get_explosiveness_ratio"); @@ -365,6 +385,7 @@ Particles2D::Particles2D() { particles = VS::get_singleton()->particles_create(); set_emitting(true); + set_one_shot(false); set_amount(8); set_lifetime(1); set_fixed_fps(0); diff --git a/scene/2d/particles_2d.h b/scene/2d/particles_2d.h index ab7dcb1464..23278ce746 100644 --- a/scene/2d/particles_2d.h +++ b/scene/2d/particles_2d.h @@ -48,6 +48,7 @@ private: RID particles; bool emitting; + bool one_shot; int amount; float lifetime; float pre_process_time; @@ -79,6 +80,7 @@ public: void set_emitting(bool p_emitting); void set_amount(int p_amount); void set_lifetime(float p_lifetime); + void set_one_shot(bool p_enabled); void set_pre_process_time(float p_time); void set_explosiveness_ratio(float p_ratio); void set_randomness_ratio(float p_ratio); @@ -90,6 +92,7 @@ public: bool is_emitting() const; int get_amount() const; float get_lifetime() const; + bool get_one_shot() const; float get_pre_process_time() const; float get_explosiveness_ratio() const; float get_randomness_ratio() const; @@ -121,6 +124,7 @@ public: void set_h_frames(int p_count); int get_h_frames() const; + void restart(); Rect2 capture_rect() const; Particles2D(); ~Particles2D(); |