| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  ray_cast_2d.cpp                                                      */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2017-01-01 22:01:57 +01:00
										 |  |  | /* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							| 
									
										
										
										
											2017-04-08 00:11:42 +02:00
										 |  |  | /* Copyright (c) 2014-2017 Godot Engine contributors (cf. AUTHORS.md)    */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | #include "ray_cast_2d.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-19 01:02:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | #include "collision_object_2d.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-19 01:02:56 +02:00
										 |  |  | #include "engine.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | #include "physics_body_2d.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "servers/physics_2d_server.h"
 | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void RayCast2D::set_cast_to(const Vector2 &p_point) { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	cast_to = p_point; | 
					
						
							| 
									
										
										
										
											2017-08-19 01:02:56 +02:00
										 |  |  | 	if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_collisions_hint())) | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 		update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Vector2 RayCast2D::get_cast_to() const { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return cast_to; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 22:17:26 +02:00
										 |  |  | void RayCast2D::set_collision_mask(uint32_t p_mask) { | 
					
						
							| 
									
										
										
										
											2014-05-14 01:22:15 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 22:17:26 +02:00
										 |  |  | 	collision_mask = p_mask; | 
					
						
							| 
									
										
										
										
											2014-05-14 01:22:15 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 22:17:26 +02:00
										 |  |  | uint32_t RayCast2D::get_collision_mask() const { | 
					
						
							| 
									
										
										
										
											2014-05-14 01:22:15 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 22:17:26 +02:00
										 |  |  | 	return collision_mask; | 
					
						
							| 
									
										
										
										
											2014-05-14 01:22:15 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-10 05:46:47 +02:00
										 |  |  | void RayCast2D::set_type_mask(uint32_t p_mask) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	type_mask = p_mask; | 
					
						
							| 
									
										
										
										
											2015-10-10 05:46:47 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | uint32_t RayCast2D::get_type_mask() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return type_mask; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool RayCast2D::is_colliding() const { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return collided; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Object *RayCast2D::get_collider() const { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (against == 0) | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ObjectDB::get_instance(against); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int RayCast2D::get_collider_shape() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return against_shape; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Vector2 RayCast2D::get_collision_point() const { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return collision_point; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | Vector2 RayCast2D::get_collision_normal() const { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return collision_normal; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RayCast2D::set_enabled(bool p_enabled) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	enabled = p_enabled; | 
					
						
							| 
									
										
										
										
											2017-08-19 01:02:56 +02:00
										 |  |  | 	if (is_inside_tree() && !Engine::get_singleton()->is_editor_hint()) | 
					
						
							| 
									
										
										
										
											2017-09-30 16:19:07 +02:00
										 |  |  | 		set_physics_process(p_enabled); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 	if (!p_enabled) | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		collided = false; | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool RayCast2D::is_enabled() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return enabled; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | void RayCast2D::set_exclude_parent_body(bool p_exclude_parent_body) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (exclude_parent_body == p_exclude_parent_body) | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	exclude_parent_body = p_exclude_parent_body; | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (!is_inside_tree()) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 	if (Object::cast_to<PhysicsBody2D>(get_parent())) { | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 		if (exclude_parent_body) | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 			exclude.insert(Object::cast_to<PhysicsBody2D>(get_parent())->get_rid()); | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 		else | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 			exclude.erase(Object::cast_to<PhysicsBody2D>(get_parent())->get_rid()); | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | bool RayCast2D::get_exclude_parent_body() const { | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return exclude_parent_body; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | void RayCast2D::_notification(int p_what) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_what) { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-05 21:20:42 -03:00
										 |  |  | 		case NOTIFICATION_ENTER_TREE: { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-19 01:02:56 +02:00
										 |  |  | 			if (enabled && !Engine::get_singleton()->is_editor_hint()) | 
					
						
							| 
									
										
										
										
											2017-09-30 16:19:07 +02:00
										 |  |  | 				set_physics_process(true); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 			else | 
					
						
							| 
									
										
										
										
											2017-09-30 16:19:07 +02:00
										 |  |  | 				set_physics_process(false); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 			if (Object::cast_to<PhysicsBody2D>(get_parent())) { | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 				if (exclude_parent_body) | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 					exclude.insert(Object::cast_to<PhysicsBody2D>(get_parent())->get_rid()); | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 				else | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 					exclude.erase(Object::cast_to<PhysicsBody2D>(get_parent())->get_rid()); | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2014-11-05 21:20:42 -03:00
										 |  |  | 		case NOTIFICATION_EXIT_TREE: { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if (enabled) | 
					
						
							| 
									
										
										
										
											2017-09-30 16:19:07 +02:00
										 |  |  | 				set_physics_process(false); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2015-09-20 13:03:46 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 		case NOTIFICATION_DRAW: { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-19 01:02:56 +02:00
										 |  |  | 			if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 				break; | 
					
						
							| 
									
										
										
										
											2017-01-11 00:52:51 -03:00
										 |  |  | 			Transform2D xf; | 
					
						
							| 
									
										
										
										
											2015-11-19 10:41:20 -03:00
										 |  |  | 			xf.rotate(cast_to.angle()); | 
					
						
							| 
									
										
										
										
											2017-05-08 16:12:40 +07:00
										 |  |  | 			xf.translate(Vector2(cast_to.length(), 0)); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			//Vector2 tip = Vector2(0,s->get_length());
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			Color dcol = get_tree()->get_debug_collisions_color(); //0.9,0.2,0.2,0.4);
 | 
					
						
							|  |  |  | 			draw_line(Vector2(), cast_to, dcol, 3); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 			Vector<Vector2> pts; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			float tsize = 4; | 
					
						
							| 
									
										
										
										
											2017-05-08 16:12:40 +07:00
										 |  |  | 			pts.push_back(xf.xform(Vector2(tsize, 0))); | 
					
						
							|  |  |  | 			pts.push_back(xf.xform(Vector2(0, 0.707 * tsize))); | 
					
						
							|  |  |  | 			pts.push_back(xf.xform(Vector2(0, -0.707 * tsize))); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 			Vector<Color> cols; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (int i = 0; i < 3; i++) | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 				cols.push_back(dcol); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			draw_primitive(pts, cols, Vector<Vector2>()); //small arrow
 | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2015-09-20 13:03:46 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-30 16:19:07 +02:00
										 |  |  | 		case NOTIFICATION_PHYSICS_PROCESS: { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if (!enabled) | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 19:52:15 +02:00
										 |  |  | 			_update_raycast_state(); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 19:52:15 +02:00
										 |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 19:52:15 +02:00
										 |  |  | void RayCast2D::_update_raycast_state() { | 
					
						
							|  |  |  | 	Ref<World2D> w2d = get_world_2d(); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(w2d.is_null()); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 19:52:15 +02:00
										 |  |  | 	Physics2DDirectSpaceState *dss = Physics2DServer::get_singleton()->space_get_direct_state(w2d->get_space()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_COND(!dss); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-11 00:52:51 -03:00
										 |  |  | 	Transform2D gt = get_global_transform(); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 19:52:15 +02:00
										 |  |  | 	Vector2 to = cast_to; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (to == Vector2()) | 
					
						
							|  |  |  | 		to = Vector2(0, 0.01); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 19:52:15 +02:00
										 |  |  | 	Physics2DDirectSpaceState::RayResult rr; | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 22:17:26 +02:00
										 |  |  | 	if (dss->intersect_ray(gt.get_origin(), gt.xform(to), rr, exclude, collision_mask, type_mask)) { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		collided = true; | 
					
						
							|  |  |  | 		against = rr.collider_id; | 
					
						
							|  |  |  | 		collision_point = rr.position; | 
					
						
							|  |  |  | 		collision_normal = rr.normal; | 
					
						
							|  |  |  | 		against_shape = rr.shape; | 
					
						
							| 
									
										
										
										
											2016-08-09 19:52:15 +02:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		collided = false; | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-09 19:52:15 +02:00
										 |  |  | void RayCast2D::force_raycast_update() { | 
					
						
							|  |  |  | 	_update_raycast_state(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void RayCast2D::add_exception_rid(const RID &p_rid) { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	exclude.insert(p_rid); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void RayCast2D::add_exception(const Object *p_object) { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ERR_FAIL_NULL(p_object); | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 	const CollisionObject2D *co = Object::cast_to<CollisionObject2D>(p_object); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 	if (!co) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	add_exception_rid(co->get_rid()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void RayCast2D::remove_exception_rid(const RID &p_rid) { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	exclude.erase(p_rid); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void RayCast2D::remove_exception(const Object *p_object) { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ERR_FAIL_NULL(p_object); | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 	const CollisionObject2D *co = Object::cast_to<CollisionObject2D>(p_object); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 	if (!co) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	remove_exception_rid(co->get_rid()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void RayCast2D::clear_exceptions() { | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	exclude.clear(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void RayCast2D::_bind_methods() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &RayCast2D::set_enabled); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("is_enabled"), &RayCast2D::is_enabled); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_cast_to", "local_point"), &RayCast2D::set_cast_to); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_cast_to"), &RayCast2D::get_cast_to); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("is_colliding"), &RayCast2D::is_colliding); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("force_raycast_update"), &RayCast2D::force_raycast_update); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_collider"), &RayCast2D::get_collider); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_collider_shape"), &RayCast2D::get_collider_shape); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_collision_point"), &RayCast2D::get_collision_point); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_collision_normal"), &RayCast2D::get_collision_normal); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("add_exception_rid", "rid"), &RayCast2D::add_exception_rid); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("add_exception", "node"), &RayCast2D::add_exception); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("remove_exception_rid", "rid"), &RayCast2D::remove_exception_rid); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("remove_exception", "node"), &RayCast2D::remove_exception); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("clear_exceptions"), &RayCast2D::clear_exceptions); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-21 22:17:26 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_collision_mask", "mask"), &RayCast2D::set_collision_mask); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_collision_mask"), &RayCast2D::get_collision_mask); | 
					
						
							| 
									
										
										
										
											2014-05-14 01:22:15 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_type_mask", "mask"), &RayCast2D::set_type_mask); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_type_mask"), &RayCast2D::get_type_mask); | 
					
						
							| 
									
										
										
										
											2015-10-10 05:46:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_exclude_parent_body", "mask"), &RayCast2D::set_exclude_parent_body); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_exclude_parent_body"), &RayCast2D::get_exclude_parent_body); | 
					
						
							| 
									
										
										
										
											2016-08-31 17:58:51 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "exclude_parent"), "set_exclude_parent_body", "get_exclude_parent_body"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "cast_to"), "set_cast_to", "get_cast_to"); | 
					
						
							| 
									
										
										
										
											2017-10-21 22:17:26 +02:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_collision_mask", "get_collision_mask"); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::INT, "type_mask", PROPERTY_HINT_FLAGS, "Static,Kinematic,Rigid,Character,Area"), "set_type_mask", "get_type_mask"); | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | RayCast2D::RayCast2D() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	enabled = false; | 
					
						
							|  |  |  | 	against = 0; | 
					
						
							|  |  |  | 	collided = false; | 
					
						
							|  |  |  | 	against_shape = 0; | 
					
						
							| 
									
										
										
										
											2017-10-21 22:17:26 +02:00
										 |  |  | 	collision_mask = 1; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	type_mask = Physics2DDirectSpaceState::TYPE_MASK_COLLISION; | 
					
						
							|  |  |  | 	cast_to = Vector2(0, 50); | 
					
						
							|  |  |  | 	exclude_parent_body = true; | 
					
						
							| 
									
										
										
										
											2014-04-05 18:50:09 -03:00
										 |  |  | } |