summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/io/http_client.cpp8
-rw-r--r--core/variant.cpp2
-rw-r--r--modules/gdscript/gd_parser.cpp16
-rw-r--r--modules/gdscript/gd_parser.h1
-rw-r--r--modules/gdscript/gd_tokenizer.cpp18
-rw-r--r--scene/2d/canvas_item.cpp4
-rw-r--r--scene/2d/ray_cast_2d.cpp384
-rw-r--r--scene/2d/ray_cast_2d.h88
8 files changed, 309 insertions, 212 deletions
diff --git a/core/io/http_client.cpp b/core/io/http_client.cpp
index 1b53ee6104..f9da846844 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 Vector<St
String request=String(_methods[p_method])+" "+p_url+" HTTP/1.1\r\n";
request+="Host: "+conn_host+":"+itos(conn_port)+"\r\n";
+ bool add_clen=p_body.length()>0;
for(int i=0;i<p_headers.size();i++) {
request+=p_headers[i]+"\r\n";
+ if (add_clen && p_headers[i].find("Content-Length:")==0) {
+ add_clen=false;
+ }
+ }
+ if (add_clen) {
+ request+="Content-Length: "+itos(p_body.utf8().length())+"\r\n";
+ //should it add utf8 encoding? not sure
}
request+="\r\n";
request+=p_body;
diff --git a/core/variant.cpp b/core/variant.cpp
index efb6b8296b..e02c9c33a1 100644
--- a/core/variant.cpp
+++ b/core/variant.cpp
@@ -56,7 +56,7 @@ String Variant::get_type_name(Variant::Type p_type) {
} break;
case REAL: {
- return "real";
+ return "float";
} break;
case STRING: {
diff --git a/modules/gdscript/gd_parser.cpp b/modules/gdscript/gd_parser.cpp
index f962f8c5fb..f540660cd3 100644
--- a/modules/gdscript/gd_parser.cpp
+++ b/modules/gdscript/gd_parser.cpp
@@ -174,10 +174,19 @@ GDParser::Node* GDParser::_parse_expression(Node *p_parent,bool p_static,bool p_
/* Parse Operand */
/*****************/
+ if (parenthesis>0) {
+ //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 1925808cac..278e5f543d 100644
--- a/modules/gdscript/gd_parser.h
+++ b/modules/gdscript/gd_parser.h
@@ -356,6 +356,7 @@ private:
template<class T>
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 ff9be7926b..aeee1f6667 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 0f87d52d63..2e10ae2edb 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<CanvasItem>()->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 a2c57b8ffb..540c825485 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<Vector2> 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<Color> cols;
- for(int i=0;i<3;i++)
- cols.push_back(dcol);
-
- draw_primitive(pts,cols,Vector<Vector2>()); //small arrow
-
- } break;
-#endif
-
- case NOTIFICATION_FIXED_PROCESS: {
-
- if (!enabled)
- break;
-
-
-
- Ref<World2D> 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<Vector2> 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<Color> cols;
+ for(int i=0;i<3;i++)
+ cols.push_back(dcol);
+
+ draw_primitive(pts,cols,Vector<Vector2>()); //small arrow
+
+ } break;
+#endif
+
+ case NOTIFICATION_FIXED_PROCESS: {
+
+ if (!enabled)
+ break;
+
+
+
+ Ref<World2D> 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<CollisionObject2D>();
+ 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<CollisionObject2D>();
+ 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 62bcb946a6..32b95fbefe 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<RID> 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