aboutsummaryrefslogtreecommitdiff
path: root/scene/2d
diff options
context:
space:
mode:
authorJuan Linietsky2016-05-17 18:27:15 -0300
committerJuan Linietsky2016-05-17 18:28:44 -0300
commitc195c0df6b36debc870216dd42e49fbda70fa861 (patch)
tree194a26e39ace86d7a471f3e86159c2aed6be261c /scene/2d
parent3a26e14a2bab777c9ba6aedceff6e4ef2666faf0 (diff)
downloadgodot-c195c0d.tar.gz
godot-c195c0d.tar.zst
godot-c195c0d.zip
-Added configuration warning system for nodes
-Added a new "add" and "instance" buttons for scene tree -Added a vformat() function to ease translation work
Diffstat (limited to 'scene/2d')
-rw-r--r--scene/2d/animated_sprite.cpp12
-rw-r--r--scene/2d/animated_sprite.h2
-rw-r--r--scene/2d/canvas_modulate.cpp29
-rw-r--r--scene/2d/canvas_modulate.h2
-rw-r--r--scene/2d/collision_polygon_2d.cpp14
-rw-r--r--scene/2d/collision_polygon_2d.h2
-rw-r--r--scene/2d/collision_shape_2d.cpp13
-rw-r--r--scene/2d/collision_shape_2d.h2
-rw-r--r--scene/2d/light_2d.cpp12
-rw-r--r--scene/2d/light_2d.h2
-rw-r--r--scene/2d/light_occluder_2d.cpp16
-rw-r--r--scene/2d/light_occluder_2d.h2
-rw-r--r--scene/2d/navigation_polygon.cpp23
-rw-r--r--scene/2d/navigation_polygon.h2
-rw-r--r--scene/2d/parallax_layer.cpp10
-rw-r--r--scene/2d/parallax_layer.h1
-rw-r--r--scene/2d/particles_2d.cpp8
-rw-r--r--scene/2d/particles_2d.h2
-rw-r--r--scene/2d/path_2d.cpp13
-rw-r--r--scene/2d/path_2d.h2
-rw-r--r--scene/2d/remote_transform_2d.cpp11
-rw-r--r--scene/2d/remote_transform_2d.h2
-rw-r--r--scene/2d/sample_player_2d.cpp9
-rw-r--r--scene/2d/sample_player_2d.h2
-rw-r--r--scene/2d/sprite.cpp19
-rw-r--r--scene/2d/sprite.h2
-rw-r--r--scene/2d/visibility_notifier_2d.cpp10
-rw-r--r--scene/2d/visibility_notifier_2d.h2
28 files changed, 223 insertions, 3 deletions
diff --git a/scene/2d/animated_sprite.cpp b/scene/2d/animated_sprite.cpp
index 1d2f91278..c062a6d1f 100644
--- a/scene/2d/animated_sprite.cpp
+++ b/scene/2d/animated_sprite.cpp
@@ -452,6 +452,7 @@ void AnimatedSprite::set_sprite_frames(const Ref<SpriteFrames> &p_frames) {
_change_notify();
_reset_timeout();
update();
+ update_configuration_warning();
}
@@ -486,6 +487,8 @@ void AnimatedSprite::set_frame(int p_frame) {
_change_notify("frame");
emit_signal(SceneStringNames::get_singleton()->frame_changed);
+
+
}
int AnimatedSprite::get_frame() const {
@@ -646,6 +649,15 @@ StringName AnimatedSprite::get_animation() const{
return animation;
}
+String AnimatedSprite::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.");
+ }
+
+ return String();
+}
+
void AnimatedSprite::_bind_methods() {
diff --git a/scene/2d/animated_sprite.h b/scene/2d/animated_sprite.h
index bbf9c7aaf..968cd9aa3 100644
--- a/scene/2d/animated_sprite.h
+++ b/scene/2d/animated_sprite.h
@@ -176,7 +176,7 @@ public:
virtual Rect2 get_item_rect() const;
-
+ virtual String get_configuration_warning() const;
AnimatedSprite();
};
diff --git a/scene/2d/canvas_modulate.cpp b/scene/2d/canvas_modulate.cpp
index 77203a711..cc0db2da7 100644
--- a/scene/2d/canvas_modulate.cpp
+++ b/scene/2d/canvas_modulate.cpp
@@ -5,19 +5,30 @@ void CanvasModulate::_notification(int p_what) {
if (p_what==NOTIFICATION_ENTER_CANVAS) {
- if (is_visible())
+ if (is_visible()) {
VS::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())
+ if (is_visible()) {
VS::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()) {
VS::get_singleton()->canvas_set_modulate(get_canvas(),color);
+ add_to_group("_canvas_modulate_"+itos(get_canvas().get_id()));
} else {
VS::get_singleton()->canvas_set_modulate(get_canvas(),Color(1,1,1,1));
+ remove_from_group("_canvas_modulate_"+itos(get_canvas().get_id()));
}
+
+ update_configuration_warning();
}
}
@@ -42,6 +53,20 @@ Color CanvasModulate::get_color() const {
return color;
}
+String CanvasModulate::get_configuration_warning() const {
+
+ if (!is_visible() || !is_inside_tree())
+ return String();
+
+ List<Node*> nodes;
+ get_tree()->get_nodes_in_group("_canvas_modulate_"+itos(get_canvas().get_id()),&nodes);
+
+ if (nodes.size()>1) {
+ return TTR("Only one visible CanvasModulate is allowed per scene (or set of instanced scenes). The first one created will work, while the rest will be ignored.");
+ }
+
+ return String();
+}
CanvasModulate::CanvasModulate()
{
diff --git a/scene/2d/canvas_modulate.h b/scene/2d/canvas_modulate.h
index a6894f29c..73f920d5c 100644
--- a/scene/2d/canvas_modulate.h
+++ b/scene/2d/canvas_modulate.h
@@ -16,6 +16,8 @@ public:
void set_color(const Color& p_color);
Color get_color() const;
+ String CanvasModulate::get_configuration_warning() const;
+
CanvasModulate();
~CanvasModulate();
};
diff --git a/scene/2d/collision_polygon_2d.cpp b/scene/2d/collision_polygon_2d.cpp
index 2a40a6207..544f0e208 100644
--- a/scene/2d/collision_polygon_2d.cpp
+++ b/scene/2d/collision_polygon_2d.cpp
@@ -297,6 +297,20 @@ Vector2 CollisionPolygon2D::_get_shape_range() const {
return Vector2(shape_from,shape_to);
}
+String CollisionPolygon2D::get_configuration_warning() const {
+
+ if (!get_parent()->cast_to<CollisionObject2D>()) {
+ 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.");
+ }
+
+ if (polygon.empty()) {
+ return TTR("An empty CollisionPolygon2D has no effect on collision.");
+
+ }
+
+ return String();
+}
+
void CollisionPolygon2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("_add_to_collision_object"),&CollisionPolygon2D::_add_to_collision_object);
diff --git a/scene/2d/collision_polygon_2d.h b/scene/2d/collision_polygon_2d.h
index b2bd4d189..9c0e4e0c0 100644
--- a/scene/2d/collision_polygon_2d.h
+++ b/scene/2d/collision_polygon_2d.h
@@ -85,6 +85,8 @@ public:
int get_collision_object_first_shape() const { return shape_from; }
int get_collision_object_last_shape() const { return shape_to; }
+ virtual String get_configuration_warning() const;
+
CollisionPolygon2D();
};
diff --git a/scene/2d/collision_shape_2d.cpp b/scene/2d/collision_shape_2d.cpp
index 405310450..c737cf0fa 100644
--- a/scene/2d/collision_shape_2d.cpp
+++ b/scene/2d/collision_shape_2d.cpp
@@ -201,6 +201,19 @@ int CollisionShape2D::_get_update_shape_index() const{
return update_shape_index;
}
+String CollisionShape2D::get_configuration_warning() const {
+
+ if (!get_parent()->cast_to<CollisionObject2D>()) {
+ 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.");
+ }
+
+ if (!shape.is_valid()) {
+ return TTR("A shape must be provided for CollisionShape2D to function. Please create a shape resource for it!");
+ }
+
+ return String();
+}
+
void CollisionShape2D::_bind_methods() {
diff --git a/scene/2d/collision_shape_2d.h b/scene/2d/collision_shape_2d.h
index b14dad73b..6f3f17d41 100644
--- a/scene/2d/collision_shape_2d.h
+++ b/scene/2d/collision_shape_2d.h
@@ -63,6 +63,8 @@ public:
int get_collision_object_shape_index() const { return _get_update_shape_index(); }
+ virtual String get_configuration_warning() const;
+
CollisionShape2D();
};
diff --git a/scene/2d/light_2d.cpp b/scene/2d/light_2d.cpp
index 9715afeaa..b79c07360 100644
--- a/scene/2d/light_2d.cpp
+++ b/scene/2d/light_2d.cpp
@@ -61,6 +61,8 @@ void Light2D::set_texture( const Ref<Texture>& p_texture) {
VS::get_singleton()->canvas_light_set_texture(canvas_light,texture->get_rid());
else
VS::get_singleton()->canvas_light_set_texture(canvas_light,RID());
+
+ update_configuration_warning();
}
Ref<Texture> Light2D::get_texture() const {
@@ -282,6 +284,16 @@ void Light2D::_notification(int p_what) {
}
+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.");
+ }
+
+ return String();
+}
+
+
void Light2D::_bind_methods() {
diff --git a/scene/2d/light_2d.h b/scene/2d/light_2d.h
index ca437769e..a8b0ef3b2 100644
--- a/scene/2d/light_2d.h
+++ b/scene/2d/light_2d.h
@@ -104,6 +104,8 @@ public:
virtual Rect2 get_item_rect() const;
+ String get_configuration_warning() const;
+
Light2D();
~Light2D();
};
diff --git a/scene/2d/light_occluder_2d.cpp b/scene/2d/light_occluder_2d.cpp
index d98bed0ea..ce617b173 100644
--- a/scene/2d/light_occluder_2d.cpp
+++ b/scene/2d/light_occluder_2d.cpp
@@ -45,6 +45,8 @@ RID OccluderPolygon2D::get_rid() const {
return occ_polygon;
}
+
+
void OccluderPolygon2D::_bind_methods() {
@@ -178,6 +180,20 @@ 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.");
+ }
+
+ if (occluder_polygon.is_valid() && occluder_polygon->get_polygon().size()==0) {
+ return TTR("The occluder polygon for this occluder is empty. Please draw a polygon!");
+ }
+
+ return String();
+}
+
void LightOccluder2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_occluder_polygon","polygon:OccluderPolygon2D"),&LightOccluder2D::set_occluder_polygon);
diff --git a/scene/2d/light_occluder_2d.h b/scene/2d/light_occluder_2d.h
index 0343e3697..ccc2a1cd9 100644
--- a/scene/2d/light_occluder_2d.h
+++ b/scene/2d/light_occluder_2d.h
@@ -66,6 +66,8 @@ public:
void set_occluder_light_mask(int p_mask);
int get_occluder_light_mask() const;
+ String get_configuration_warning() const;
+
LightOccluder2D();
~LightOccluder2D();
};
diff --git a/scene/2d/navigation_polygon.cpp b/scene/2d/navigation_polygon.cpp
index 376aeb2d8..8c0d9cf35 100644
--- a/scene/2d/navigation_polygon.cpp
+++ b/scene/2d/navigation_polygon.cpp
@@ -413,6 +413,7 @@ void NavigationPolygonInstance::set_navigation_polygon(const Ref<NavigationPolyg
}
//update_gizmo();
_change_notify("navpoly");
+ update_configuration_warning();
}
@@ -427,6 +428,28 @@ void NavigationPolygonInstance::_navpoly_changed() {
update();
}
+
+String NavigationPolygonInstance::get_configuration_warning() const {
+
+ if (!is_visible() || !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 (c->cast_to<Navigation2D>()) {
+ return String();
+ }
+
+ c=c->get_parent()->cast_to<Node2D>();
+ }
+
+ return TTR("NavigationPolygonInstance must be a child or grandchild to a Navigation2D node. It only provides navigation data.");
+}
+
void NavigationPolygonInstance::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_navigation_polygon","navpoly:NavigationPolygon"),&NavigationPolygonInstance::set_navigation_polygon);
diff --git a/scene/2d/navigation_polygon.h b/scene/2d/navigation_polygon.h
index 01307a170..07fee571f 100644
--- a/scene/2d/navigation_polygon.h
+++ b/scene/2d/navigation_polygon.h
@@ -77,6 +77,8 @@ public:
void set_navigation_polygon(const Ref<NavigationPolygon>& p_navpoly);
Ref<NavigationPolygon> get_navigation_polygon() const;
+ String get_configuration_warning() const;
+
NavigationPolygonInstance();
};
diff --git a/scene/2d/parallax_layer.cpp b/scene/2d/parallax_layer.cpp
index 7a898e43c..bf559deb0 100644
--- a/scene/2d/parallax_layer.cpp
+++ b/scene/2d/parallax_layer.cpp
@@ -118,6 +118,16 @@ void ParallaxLayer::set_base_offset_and_scale(const Point2& p_offset,float p_sca
}
+
+String ParallaxLayer::get_configuration_warning() const {
+
+ if (!get_parent() || !get_parent()->cast_to<ParallaxBackground>()) {
+ return TTR("ParallaxLayer node only works when set as child of a ParallaxBackground node.");
+ }
+
+ return String();
+}
+
void ParallaxLayer::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_motion_scale","scale"),&ParallaxLayer::set_motion_scale);
diff --git a/scene/2d/parallax_layer.h b/scene/2d/parallax_layer.h
index 6c24a9b9f..c2d345da4 100644
--- a/scene/2d/parallax_layer.h
+++ b/scene/2d/parallax_layer.h
@@ -56,6 +56,7 @@ public:
void set_base_offset_and_scale(const Point2& p_offsetf,float p_scale);
+ virtual String get_configuration_warning() const;
ParallaxLayer();
};
diff --git a/scene/2d/particles_2d.cpp b/scene/2d/particles_2d.cpp
index ffea060e8..29dad630d 100644
--- a/scene/2d/particles_2d.cpp
+++ b/scene/2d/particles_2d.cpp
@@ -198,13 +198,21 @@ void ParticleAttractor2D::set_particles_path(NodePath p_path) {
path=p_path;
_update_owner();
+ update_configuration_warning();
}
NodePath ParticleAttractor2D::get_particles_path() const {
return path;
}
+String ParticleAttractor2D::get_configuration_warning() const {
+ if (!has_node(path) || !get_node(path) || !get_node(path)->cast_to<Particles2D>()) {
+ return TTR("Path property must point to a valid Particles2D node to work.");
+ }
+
+ return String();
+}
ParticleAttractor2D::ParticleAttractor2D() {
diff --git a/scene/2d/particles_2d.h b/scene/2d/particles_2d.h
index 06dcda716..b1ae1f5bc 100644
--- a/scene/2d/particles_2d.h
+++ b/scene/2d/particles_2d.h
@@ -75,6 +75,8 @@ public:
void set_particles_path(NodePath p_path);
NodePath get_particles_path() const;
+ virtual String get_configuration_warning() const;
+
ParticleAttractor2D();
};
diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp
index bd7415aa0..dee67a829 100644
--- a/scene/2d/path_2d.cpp
+++ b/scene/2d/path_2d.cpp
@@ -237,6 +237,19 @@ void PathFollow2D::_get_property_list( List<PropertyInfo> *p_list) const{
}
+String PathFollow2D::get_configuration_warning() const {
+
+ if (!is_visible() || !is_inside_tree())
+ return String();
+
+ if (!get_parent() || !get_parent()->cast_to<Path2D>()) {
+ return TTR("PathFolow2D only works when set as a child of a Path2D node.");
+ }
+
+ return String();
+
+}
+
void PathFollow2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_offset","offset"),&PathFollow2D::set_offset);
diff --git a/scene/2d/path_2d.h b/scene/2d/path_2d.h
index 486a8ac9a..84725e712 100644
--- a/scene/2d/path_2d.h
+++ b/scene/2d/path_2d.h
@@ -109,6 +109,8 @@ public:
void set_cubic_interpolation(bool p_enable);
bool get_cubic_interpolation() const;
+ String get_configuration_warning() const;
+
PathFollow2D();
};
diff --git a/scene/2d/remote_transform_2d.cpp b/scene/2d/remote_transform_2d.cpp
index 6dcd98082..4de648a1d 100644
--- a/scene/2d/remote_transform_2d.cpp
+++ b/scene/2d/remote_transform_2d.cpp
@@ -97,6 +97,8 @@ void RemoteTransform2D::set_remote_node(const NodePath& p_remote_node) {
remote_node=p_remote_node;
if (is_inside_tree())
_update_cache();
+
+ update_configuration_warning();
}
NodePath RemoteTransform2D::get_remote_node() const{
@@ -105,6 +107,15 @@ NodePath RemoteTransform2D::get_remote_node() const{
}
+String RemoteTransform2D::get_configuration_warning() const {
+
+ if (!has_node(remote_node) || !get_node(remote_node) || !get_node(remote_node)->cast_to<Node2D>()) {
+ return TTR("Path property must point to a valid Node2D node to work.");
+ }
+
+ return String();
+}
+
void RemoteTransform2D::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_remote_node","path"),&RemoteTransform2D::set_remote_node);
diff --git a/scene/2d/remote_transform_2d.h b/scene/2d/remote_transform_2d.h
index 4a5f5f72e..0ea1438f0 100644
--- a/scene/2d/remote_transform_2d.h
+++ b/scene/2d/remote_transform_2d.h
@@ -48,5 +48,7 @@ public:
void set_remote_node(const NodePath& p_remote_node);
NodePath get_remote_node() const;
+ virtual String get_configuration_warning() const;
+
RemoteTransform2D();
};
diff --git a/scene/2d/sample_player_2d.cpp b/scene/2d/sample_player_2d.cpp
index bf0913023..4d719b532 100644
--- a/scene/2d/sample_player_2d.cpp
+++ b/scene/2d/sample_player_2d.cpp
@@ -103,6 +103,7 @@ void SamplePlayer2D::set_sample_library(const Ref<SampleLibrary>& p_library) {
library=p_library;
_change_notify();
+ update_configuration_warning();
}
Ref<SampleLibrary> SamplePlayer2D::get_sample_library() const {
@@ -207,6 +208,14 @@ float SamplePlayer2D::get_random_pitch_scale() const {
return random_pitch_scale;
}
+String SamplePlayer2D::get_configuration_warning() const {
+
+ if (library.is_null()) {
+ return TTR("A SampleLibrary resource must be created or set in the 'samples' property in order for SamplePlayer to play sound.");
+ }
+
+ return String();
+}
void SamplePlayer2D::_bind_methods() {
diff --git a/scene/2d/sample_player_2d.h b/scene/2d/sample_player_2d.h
index eddf84f77..5ab7f024d 100644
--- a/scene/2d/sample_player_2d.h
+++ b/scene/2d/sample_player_2d.h
@@ -83,6 +83,8 @@ public:
void set_random_pitch_scale(float p_scale);
float get_random_pitch_scale() const;
+ String get_configuration_warning() const;
+
SamplePlayer2D();
~SamplePlayer2D();
diff --git a/scene/2d/sprite.cpp b/scene/2d/sprite.cpp
index b2902b286..aebb9a4c2 100644
--- a/scene/2d/sprite.cpp
+++ b/scene/2d/sprite.cpp
@@ -529,6 +529,25 @@ Rect2 ViewportSprite::get_item_rect() const {
return Rect2(ofs,s);
}
+String ViewportSprite::get_configuration_warning() const {
+
+ if (!has_node(viewport_path) || !get_node(viewport_path) || !get_node(viewport_path)->cast_to<Viewport>()) {
+ return TTR("Path property must point to a valid Viewport node to work. Such Viewport must be set to 'render target' mode.");
+ } else {
+
+ Node *n = get_node(viewport_path);
+ if (n) {
+ Viewport *vp = n->cast_to<Viewport>();
+ if (!vp->is_set_as_render_target()) {
+
+ return TTR("The Viewport set in the path property must be set as 'render taget' in order for this sprite to work");
+ }
+ }
+ }
+
+ return String();
+
+}
void ViewportSprite::_bind_methods() {
diff --git a/scene/2d/sprite.h b/scene/2d/sprite.h
index cbcaec9ae..f789538b1 100644
--- a/scene/2d/sprite.h
+++ b/scene/2d/sprite.h
@@ -142,6 +142,8 @@ public:
virtual Rect2 get_item_rect() const;
+ virtual String get_configuration_warning() const;
+
ViewportSprite();
};
diff --git a/scene/2d/visibility_notifier_2d.cpp b/scene/2d/visibility_notifier_2d.cpp
index 426e86fa1..2a5108c62 100644
--- a/scene/2d/visibility_notifier_2d.cpp
+++ b/scene/2d/visibility_notifier_2d.cpp
@@ -346,6 +346,16 @@ void VisibilityEnabler2D::_node_removed(Node* p_node) {
}
+String VisibilityEnabler2D::get_configuration_warning() const {
+
+ if (is_inside_tree() && get_parent() && (get_parent()->get_filename()==String() && get_parent()!=get_tree()->get_edited_scene_root())) {
+ return TTR("VisibilityEnable2D works best when used with the edited scene root directly as parent.");
+ }
+
+ return String();
+}
+
+
void VisibilityEnabler2D::_bind_methods(){
ObjectTypeDB::bind_method(_MD("set_enabler","enabler","enabled"),&VisibilityEnabler2D::set_enabler);
diff --git a/scene/2d/visibility_notifier_2d.h b/scene/2d/visibility_notifier_2d.h
index 647a5b6e9..354ccf434 100644
--- a/scene/2d/visibility_notifier_2d.h
+++ b/scene/2d/visibility_notifier_2d.h
@@ -103,6 +103,8 @@ public:
void set_enabler(Enabler p_enabler,bool p_enable);
bool is_enabler_enabled(Enabler p_enabler) const;
+ String get_configuration_warning() const;
+
VisibilityEnabler2D();
};