diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp index 1b53ee61048..f9da846844d 100644 --- a/core/io/http_client.cpp +++ b/core/io/http_client.cpp @@ -97,8 +97,16 @@ Error HTTPClient::request( Method p_method, const String& p_url, const Vector0; for(int i=0;i0) { + //remove empty space (only allowed if inside parenthesis + while(tokenizer->get_token()==GDTokenizer::TK_NEWLINE) { + tokenizer->advance(); + } + } + if (tokenizer->get_token()==GDTokenizer::TK_PARENTHESIS_OPEN) { //subexpression () tokenizer->advance(); + parenthesis++; Node* subexpr = _parse_expression(p_parent,p_static); + parenthesis--; if (!subexpr) return NULL; @@ -629,6 +638,12 @@ GDParser::Node* GDParser::_parse_expression(Node *p_parent,bool p_static,bool p_ /* Parse Operator */ /******************/ + if (parenthesis>0) { + //remove empty space (only allowed if inside parenthesis + while(tokenizer->get_token()==GDTokenizer::TK_NEWLINE) { + tokenizer->advance(); + } + } Expression e; e.is_op=false; @@ -2475,6 +2490,7 @@ void GDParser::clear() { tab_level.push_back(0); error_line=0; error_column=0; + parenthesis=0; current_export.type=Variant::NIL; error=""; diff --git a/modules/gdscript/gd_parser.h b/modules/gdscript/gd_parser.h index 1925808cac5..278e5f543d8 100644 --- a/modules/gdscript/gd_parser.h +++ b/modules/gdscript/gd_parser.h @@ -356,6 +356,7 @@ private: template T* alloc_node(); + int parenthesis; bool error_set; String error; int error_line; diff --git a/modules/gdscript/gd_tokenizer.cpp b/modules/gdscript/gd_tokenizer.cpp index ff9be7926b8..aeee1f66675 100644 --- a/modules/gdscript/gd_tokenizer.cpp +++ b/modules/gdscript/gd_tokenizer.cpp @@ -242,6 +242,24 @@ void GDTokenizerText::_advance() { case 0: _make_token(TK_EOF); break; + case '\\': + INCPOS(1); + if (GETCHAR(0)=='\r') { + INCPOS(1); + } + + if (GETCHAR(0)!='\n') { + _make_error("Expected newline after '\\'."); + return; + } + + INCPOS(1); + + while(GETCHAR(0)==' ' || GETCHAR(0)=='\t') { + INCPOS(1); + } + + continue; case '\t': case '\r': case ' ': diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp index 0f87d52d630..2e10ae2edb0 100644 --- a/scene/2d/canvas_item.cpp +++ b/scene/2d/canvas_item.cpp @@ -350,8 +350,10 @@ void CanvasItem::_notification(int p_what) { if (xform_change.in_list()) get_scene()->xform_change_list.remove(&xform_change); _exit_canvas(); - if (C) + if (C) { get_parent()->cast_to()->children_items.erase(C); + C=NULL; + } } break; case NOTIFICATION_DRAW: { diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp index a2c57b8ffb1..540c825485a 100644 --- a/scene/2d/ray_cast_2d.cpp +++ b/scene/2d/ray_cast_2d.cpp @@ -26,173 +26,217 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "ray_cast_2d.h" -#include "servers/physics_2d_server.h" - -void RayCast2D::set_cast_to(const Vector2& p_point) { - - cast_to=p_point; - if (is_inside_scene() && get_scene()->is_editor_hint()) - update(); - -} - -Vector2 RayCast2D::get_cast_to() const{ - - return cast_to; -} - -bool RayCast2D::is_colliding() const{ - - return collided; -} -Object *RayCast2D::get_collider() const{ - - if (against==0) - return NULL; - - return ObjectDB::get_instance(against); -} - -int RayCast2D::get_collider_shape() const { - - return against_shape; -} -Vector2 RayCast2D::get_collision_point() const{ - - return collision_point; -} -Vector2 RayCast2D::get_collision_normal() const{ - - return collision_normal; -} - - -void RayCast2D::set_enabled(bool p_enabled) { - - enabled=p_enabled; - if (is_inside_scene() && !get_scene()->is_editor_hint()) - set_fixed_process(p_enabled); - if (!p_enabled) - collided=false; - -} - - -bool RayCast2D::is_enabled() const { - - - return enabled; -} - - -void RayCast2D::_notification(int p_what) { - - switch(p_what) { - - case NOTIFICATION_ENTER_SCENE: { - - if (enabled && !get_scene()->is_editor_hint()) - set_fixed_process(true); - else - set_fixed_process(false); - - } break; - case NOTIFICATION_EXIT_SCENE: { - - if (enabled) - set_fixed_process(false); - - } break; -#ifdef TOOLS_ENABLED - case NOTIFICATION_DRAW: { - - if (!get_scene()->is_editor_hint()) - break; - Matrix32 xf; - xf.rotate(cast_to.atan2()); - xf.translate(Vector2(0,cast_to.length())); - - //Vector2 tip = Vector2(0,s->get_length()); - Color dcol(0.9,0.2,0.2,0.4); - draw_line(Vector2(),cast_to,dcol,3); - Vector pts; - float tsize=4; - pts.push_back(xf.xform(Vector2(0,tsize))); - pts.push_back(xf.xform(Vector2(0.707*tsize,0))); - pts.push_back(xf.xform(Vector2(-0.707*tsize,0))); - Vector cols; - for(int i=0;i<3;i++) - cols.push_back(dcol); - - draw_primitive(pts,cols,Vector()); //small arrow - - } break; -#endif - - case NOTIFICATION_FIXED_PROCESS: { - - if (!enabled) - break; - - - - Ref w2d = get_world_2d(); - ERR_BREAK( w2d.is_null() ); - - Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(w2d->get_space()); - ERR_BREAK( !dss ); - - Matrix32 gt = get_global_transform(); - - Vector2 to = cast_to; - if (to==Vector2()) - to=Vector2(0,0.01); - - Physics2DDirectSpaceState::RayResult rr; - - if (dss->intersect_ray(gt.get_origin(),gt.xform(to),rr)) { - - collided=true; - against=rr.collider_id; - collision_point=rr.position; - collision_normal=rr.normal; - against_shape=rr.shape; - } else { - collided=false; - } - - - - } break; - } -} - -void RayCast2D::_bind_methods() { - - - ObjectTypeDB::bind_method(_MD("set_enabled","enabled"),&RayCast2D::set_enabled); - ObjectTypeDB::bind_method(_MD("is_enabled"),&RayCast2D::is_enabled); - - ObjectTypeDB::bind_method(_MD("set_cast_to","local_point"),&RayCast2D::set_cast_to); - ObjectTypeDB::bind_method(_MD("get_cast_to"),&RayCast2D::get_cast_to); - - ObjectTypeDB::bind_method(_MD("is_colliding"),&RayCast2D::is_colliding); - - ObjectTypeDB::bind_method(_MD("get_collider"),&RayCast2D::get_collider); - ObjectTypeDB::bind_method(_MD("get_collider_shape"),&RayCast2D::get_collider_shape); - ObjectTypeDB::bind_method(_MD("get_collision_point"),&RayCast2D::get_collision_point); - ObjectTypeDB::bind_method(_MD("get_collision_normal"),&RayCast2D::get_collision_normal); - - ADD_PROPERTY(PropertyInfo(Variant::BOOL,"enabled"),_SCS("set_enabled"),_SCS("is_enabled")); - ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"cast_to"),_SCS("set_cast_to"),_SCS("get_cast_to")); -} - -RayCast2D::RayCast2D() { - - enabled=false; - against=0; - collided=false; - against_shape=0; - cast_to=Vector2(0,50); -} +#include "ray_cast_2d.h" +#include "servers/physics_2d_server.h" +#include "collision_object_2d.h" + +void RayCast2D::set_cast_to(const Vector2& p_point) { + + cast_to=p_point; + if (is_inside_scene() && get_scene()->is_editor_hint()) + update(); + +} + +Vector2 RayCast2D::get_cast_to() const{ + + return cast_to; +} + +bool RayCast2D::is_colliding() const{ + + return collided; +} +Object *RayCast2D::get_collider() const{ + + if (against==0) + return NULL; + + return ObjectDB::get_instance(against); +} + +int RayCast2D::get_collider_shape() const { + + return against_shape; +} +Vector2 RayCast2D::get_collision_point() const{ + + return collision_point; +} +Vector2 RayCast2D::get_collision_normal() const{ + + return collision_normal; +} + + +void RayCast2D::set_enabled(bool p_enabled) { + + enabled=p_enabled; + if (is_inside_scene() && !get_scene()->is_editor_hint()) + set_fixed_process(p_enabled); + if (!p_enabled) + collided=false; + +} + + +bool RayCast2D::is_enabled() const { + + + return enabled; +} + + +void RayCast2D::_notification(int p_what) { + + switch(p_what) { + + case NOTIFICATION_ENTER_SCENE: { + + if (enabled && !get_scene()->is_editor_hint()) + set_fixed_process(true); + else + set_fixed_process(false); + + } break; + case NOTIFICATION_EXIT_SCENE: { + + if (enabled) + set_fixed_process(false); + + } break; +#ifdef TOOLS_ENABLED + case NOTIFICATION_DRAW: { + + if (!get_scene()->is_editor_hint()) + break; + Matrix32 xf; + xf.rotate(cast_to.atan2()); + xf.translate(Vector2(0,cast_to.length())); + + //Vector2 tip = Vector2(0,s->get_length()); + Color dcol(0.9,0.2,0.2,0.4); + draw_line(Vector2(),cast_to,dcol,3); + Vector pts; + float tsize=4; + pts.push_back(xf.xform(Vector2(0,tsize))); + pts.push_back(xf.xform(Vector2(0.707*tsize,0))); + pts.push_back(xf.xform(Vector2(-0.707*tsize,0))); + Vector cols; + for(int i=0;i<3;i++) + cols.push_back(dcol); + + draw_primitive(pts,cols,Vector()); //small arrow + + } break; +#endif + + case NOTIFICATION_FIXED_PROCESS: { + + if (!enabled) + break; + + + + Ref w2d = get_world_2d(); + ERR_BREAK( w2d.is_null() ); + + Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(w2d->get_space()); + ERR_BREAK( !dss ); + + Matrix32 gt = get_global_transform(); + + Vector2 to = cast_to; + if (to==Vector2()) + to=Vector2(0,0.01); + + Physics2DDirectSpaceState::RayResult rr; + + if (dss->intersect_ray(gt.get_origin(),gt.xform(to),rr,exclude)) { + + collided=true; + against=rr.collider_id; + collision_point=rr.position; + collision_normal=rr.normal; + against_shape=rr.shape; + } else { + collided=false; + } + + + + } break; + } +} + +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); + CollisionObject2D *co=((Object*)p_object)->cast_to(); + 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); + CollisionObject2D *co=((Object*)p_object)->cast_to(); + if (!co) + return; + remove_exception_rid(co->get_rid()); +} + + +void RayCast2D::clear_exceptions(){ + + exclude.clear(); +} + + +void RayCast2D::_bind_methods() { + + + ObjectTypeDB::bind_method(_MD("set_enabled","enabled"),&RayCast2D::set_enabled); + ObjectTypeDB::bind_method(_MD("is_enabled"),&RayCast2D::is_enabled); + + ObjectTypeDB::bind_method(_MD("set_cast_to","local_point"),&RayCast2D::set_cast_to); + ObjectTypeDB::bind_method(_MD("get_cast_to"),&RayCast2D::get_cast_to); + + ObjectTypeDB::bind_method(_MD("is_colliding"),&RayCast2D::is_colliding); + + ObjectTypeDB::bind_method(_MD("get_collider"),&RayCast2D::get_collider); + ObjectTypeDB::bind_method(_MD("get_collider_shape"),&RayCast2D::get_collider_shape); + ObjectTypeDB::bind_method(_MD("get_collision_point"),&RayCast2D::get_collision_point); + ObjectTypeDB::bind_method(_MD("get_collision_normal"),&RayCast2D::get_collision_normal); + + ObjectTypeDB::bind_method(_MD("add_exception_rid","rid"),&RayCast2D::add_exception_rid); + ObjectTypeDB::bind_method(_MD("add_exception","node"),&RayCast2D::add_exception); + + ObjectTypeDB::bind_method(_MD("remove_exception_rid","rid"),&RayCast2D::remove_exception_rid); + ObjectTypeDB::bind_method(_MD("remove_exception","node"),&RayCast2D::remove_exception); + + ObjectTypeDB::bind_method(_MD("clear_exceptions"),&RayCast2D::clear_exceptions); + + ADD_PROPERTY(PropertyInfo(Variant::BOOL,"enabled"),_SCS("set_enabled"),_SCS("is_enabled")); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2,"cast_to"),_SCS("set_cast_to"),_SCS("get_cast_to")); +} + +RayCast2D::RayCast2D() { + + enabled=false; + against=0; + collided=false; + against_shape=0; + cast_to=Vector2(0,50); +} diff --git a/scene/2d/ray_cast_2d.h b/scene/2d/ray_cast_2d.h index 62bcb946a67..32b95fbefeb 100644 --- a/scene/2d/ray_cast_2d.h +++ b/scene/2d/ray_cast_2d.h @@ -26,43 +26,51 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef RAY_CAST_2D_H -#define RAY_CAST_2D_H - -#include "scene/2d/node_2d.h" - -class RayCast2D : public Node2D { - - OBJ_TYPE(RayCast2D,Node2D); - - - bool enabled; - bool collided; - ObjectID against; - int against_shape; - Vector2 collision_point; - Vector2 collision_normal; - - Vector2 cast_to; -protected: - - void _notification(int p_what); - static void _bind_methods(); -public: - - void set_enabled(bool p_enabled); - bool is_enabled() const; - - void set_cast_to(const Vector2& p_point); - Vector2 get_cast_to() const; - - bool is_colliding() const; - Object *get_collider() const; - int get_collider_shape() const; - Vector2 get_collision_point() const; - Vector2 get_collision_normal() const; - - RayCast2D(); -}; - -#endif // RAY_CAST_2D_H +#ifndef RAY_CAST_2D_H +#define RAY_CAST_2D_H + +#include "scene/2d/node_2d.h" + +class RayCast2D : public Node2D { + + OBJ_TYPE(RayCast2D,Node2D); + + + bool enabled; + bool collided; + ObjectID against; + int against_shape; + Vector2 collision_point; + Vector2 collision_normal; + Set exclude; + + + Vector2 cast_to; +protected: + + void _notification(int p_what); + static void _bind_methods(); +public: + + void set_enabled(bool p_enabled); + bool is_enabled() const; + + void set_cast_to(const Vector2& p_point); + Vector2 get_cast_to() const; + + bool is_colliding() const; + Object *get_collider() const; + int get_collider_shape() const; + Vector2 get_collision_point() const; + Vector2 get_collision_normal() const; + + void add_exception_rid(const RID& p_rid); + void add_exception(const Object* p_object); + void remove_exception_rid(const RID& p_rid); + void remove_exception(const Object* p_object); + void clear_exceptions(); + + RayCast2D(); +}; + +#endif // RAY_CAST_2D_H