2
0
Эх сурвалжийг харах

-HttpClient: ’Content-Length’ is added to httprequest if not provided in the headers and a body exists
-expressions in GDScript can take multiple lines if inside parenthesis (python-like)
-Added \ to force linebreaks to GDscript (python-like)
-added exclude objects from raycast
-fixed crashes

Juan Linietsky 11 жил өмнө
parent
commit
b4969373b3

+ 8 - 0
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;

+ 1 - 1
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: {

+ 16 - 0
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="";
 

+ 1 - 0
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;

+ 18 - 0
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 ' ':

+ 3 - 1
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: {
 

+ 214 - 170
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);
+}

+ 48 - 40
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