area_2d.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. /*************************************************************************/
  2. /* area_2d.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
  9. /* */
  10. /* Permission is hereby granted, free of charge, to any person obtaining */
  11. /* a copy of this software and associated documentation files (the */
  12. /* "Software"), to deal in the Software without restriction, including */
  13. /* without limitation the rights to use, copy, modify, merge, publish, */
  14. /* distribute, sublicense, and/or sell copies of the Software, and to */
  15. /* permit persons to whom the Software is furnished to do so, subject to */
  16. /* the following conditions: */
  17. /* */
  18. /* The above copyright notice and this permission notice shall be */
  19. /* included in all copies or substantial portions of the Software. */
  20. /* */
  21. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  22. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  23. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  24. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  25. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  26. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  27. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  28. /*************************************************************************/
  29. #include "area_2d.h"
  30. #include "scene/scene_string_names.h"
  31. #include "servers/physics_2d_server.h"
  32. void Area2D::set_space_override_mode(SpaceOverride p_mode) {
  33. space_override=p_mode;
  34. Physics2DServer::get_singleton()->area_set_space_override_mode(get_rid(),Physics2DServer::AreaSpaceOverrideMode(p_mode));
  35. }
  36. Area2D::SpaceOverride Area2D::get_space_override_mode() const{
  37. return space_override;
  38. }
  39. void Area2D::set_gravity_is_point(bool p_enabled){
  40. gravity_is_point=p_enabled;
  41. Physics2DServer::get_singleton()->area_set_param(get_rid(),Physics2DServer::AREA_PARAM_GRAVITY_IS_POINT,p_enabled);
  42. }
  43. bool Area2D::is_gravity_a_point() const{
  44. return gravity_is_point;
  45. }
  46. void Area2D::set_gravity_distance_scale(real_t p_scale){
  47. gravity_distance_scale=p_scale;
  48. Physics2DServer::get_singleton()->area_set_param(get_rid(),Physics2DServer::AREA_PARAM_GRAVITY_DISTANCE_SCALE,p_scale);
  49. }
  50. real_t Area2D::get_gravity_distance_scale() const{
  51. return gravity_distance_scale;
  52. }
  53. void Area2D::set_gravity_vector(const Vector2& p_vec){
  54. gravity_vec=p_vec;
  55. Physics2DServer::get_singleton()->area_set_param(get_rid(),Physics2DServer::AREA_PARAM_GRAVITY_VECTOR,p_vec);
  56. }
  57. Vector2 Area2D::get_gravity_vector() const{
  58. return gravity_vec;
  59. }
  60. void Area2D::set_gravity(real_t p_gravity){
  61. gravity=p_gravity;
  62. Physics2DServer::get_singleton()->area_set_param(get_rid(),Physics2DServer::AREA_PARAM_GRAVITY,p_gravity);
  63. }
  64. real_t Area2D::get_gravity() const{
  65. return gravity;
  66. }
  67. void Area2D::set_linear_damp(real_t p_linear_damp){
  68. linear_damp=p_linear_damp;
  69. Physics2DServer::get_singleton()->area_set_param(get_rid(),Physics2DServer::AREA_PARAM_LINEAR_DAMP,p_linear_damp);
  70. }
  71. real_t Area2D::get_linear_damp() const{
  72. return linear_damp;
  73. }
  74. void Area2D::set_angular_damp(real_t p_angular_damp){
  75. angular_damp=p_angular_damp;
  76. Physics2DServer::get_singleton()->area_set_param(get_rid(),Physics2DServer::AREA_PARAM_ANGULAR_DAMP,p_angular_damp);
  77. }
  78. real_t Area2D::get_angular_damp() const{
  79. return angular_damp;
  80. }
  81. void Area2D::set_priority(real_t p_priority){
  82. priority=p_priority;
  83. Physics2DServer::get_singleton()->area_set_param(get_rid(),Physics2DServer::AREA_PARAM_PRIORITY,p_priority);
  84. }
  85. real_t Area2D::get_priority() const{
  86. return priority;
  87. }
  88. void Area2D::_body_enter_tree(ObjectID p_id) {
  89. Object *obj = ObjectDB::get_instance(p_id);
  90. Node *node = obj ? obj->cast_to<Node>() : NULL;
  91. ERR_FAIL_COND(!node);
  92. Map<ObjectID,BodyState>::Element *E=body_map.find(p_id);
  93. ERR_FAIL_COND(!E);
  94. ERR_FAIL_COND(E->get().in_tree);
  95. E->get().in_tree=true;
  96. emit_signal(SceneStringNames::get_singleton()->body_enter,node);
  97. for(int i=0;i<E->get().shapes.size();i++) {
  98. emit_signal(SceneStringNames::get_singleton()->body_enter_shape,p_id,node,E->get().shapes[i].body_shape,E->get().shapes[i].area_shape);
  99. }
  100. }
  101. void Area2D::_body_exit_tree(ObjectID p_id) {
  102. Object *obj = ObjectDB::get_instance(p_id);
  103. Node *node = obj ? obj->cast_to<Node>() : NULL;
  104. ERR_FAIL_COND(!node);
  105. Map<ObjectID,BodyState>::Element *E=body_map.find(p_id);
  106. ERR_FAIL_COND(!E);
  107. ERR_FAIL_COND(!E->get().in_tree);
  108. E->get().in_tree=false;
  109. emit_signal(SceneStringNames::get_singleton()->body_exit,node);
  110. for(int i=0;i<E->get().shapes.size();i++) {
  111. emit_signal(SceneStringNames::get_singleton()->body_exit_shape,p_id,node,E->get().shapes[i].body_shape,E->get().shapes[i].area_shape);
  112. }
  113. }
  114. void Area2D::_body_inout(int p_status,const RID& p_body, int p_instance, int p_body_shape,int p_area_shape) {
  115. bool body_in = p_status==Physics2DServer::AREA_BODY_ADDED;
  116. ObjectID objid=p_instance;
  117. Object *obj = ObjectDB::get_instance(objid);
  118. Node *node = obj ? obj->cast_to<Node>() : NULL;
  119. Map<ObjectID,BodyState>::Element *E=body_map.find(objid);
  120. ERR_FAIL_COND(!body_in && !E);
  121. locked=true;
  122. if (body_in) {
  123. if (!E) {
  124. E = body_map.insert(objid,BodyState());
  125. E->get().rc=0;
  126. E->get().in_tree=node && node->is_inside_tree();
  127. if (node) {
  128. node->connect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_body_enter_tree,make_binds(objid));
  129. node->connect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_body_exit_tree,make_binds(objid));
  130. if (E->get().in_tree) {
  131. emit_signal(SceneStringNames::get_singleton()->body_enter,node);
  132. }
  133. }
  134. }
  135. E->get().rc++;
  136. if (node)
  137. E->get().shapes.insert(ShapePair(p_body_shape,p_area_shape));
  138. if (!node || E->get().in_tree) {
  139. emit_signal(SceneStringNames::get_singleton()->body_enter_shape,objid,node,p_body_shape,p_area_shape);
  140. }
  141. } else {
  142. E->get().rc--;
  143. if (node)
  144. E->get().shapes.erase(ShapePair(p_body_shape,p_area_shape));
  145. bool eraseit=false;
  146. if (E->get().rc==0) {
  147. if (node) {
  148. node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_body_enter_tree);
  149. node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_body_exit_tree);
  150. if (E->get().in_tree)
  151. emit_signal(SceneStringNames::get_singleton()->body_exit,obj);
  152. }
  153. eraseit=true;
  154. }
  155. if (!node || E->get().in_tree) {
  156. emit_signal(SceneStringNames::get_singleton()->body_exit_shape,objid,obj,p_body_shape,p_area_shape);
  157. }
  158. if (eraseit)
  159. body_map.erase(E);
  160. }
  161. locked=false;
  162. }
  163. void Area2D::_area_enter_tree(ObjectID p_id) {
  164. Object *obj = ObjectDB::get_instance(p_id);
  165. Node *node = obj ? obj->cast_to<Node>() : NULL;
  166. ERR_FAIL_COND(!node);
  167. Map<ObjectID,AreaState>::Element *E=area_map.find(p_id);
  168. ERR_FAIL_COND(!E);
  169. ERR_FAIL_COND(E->get().in_tree);
  170. E->get().in_tree=true;
  171. emit_signal(SceneStringNames::get_singleton()->area_enter,node);
  172. for(int i=0;i<E->get().shapes.size();i++) {
  173. emit_signal(SceneStringNames::get_singleton()->area_enter_shape,p_id,node,E->get().shapes[i].area_shape,E->get().shapes[i].self_shape);
  174. }
  175. }
  176. void Area2D::_area_exit_tree(ObjectID p_id) {
  177. Object *obj = ObjectDB::get_instance(p_id);
  178. Node *node = obj ? obj->cast_to<Node>() : NULL;
  179. ERR_FAIL_COND(!node);
  180. Map<ObjectID,AreaState>::Element *E=area_map.find(p_id);
  181. ERR_FAIL_COND(!E);
  182. ERR_FAIL_COND(!E->get().in_tree);
  183. E->get().in_tree=false;
  184. emit_signal(SceneStringNames::get_singleton()->area_exit,node);
  185. for(int i=0;i<E->get().shapes.size();i++) {
  186. emit_signal(SceneStringNames::get_singleton()->area_exit_shape,p_id,node,E->get().shapes[i].area_shape,E->get().shapes[i].self_shape);
  187. }
  188. }
  189. void Area2D::_area_inout(int p_status,const RID& p_area, int p_instance, int p_area_shape,int p_self_shape) {
  190. bool area_in = p_status==Physics2DServer::AREA_BODY_ADDED;
  191. ObjectID objid=p_instance;
  192. Object *obj = ObjectDB::get_instance(objid);
  193. Node *node = obj ? obj->cast_to<Node>() : NULL;
  194. Map<ObjectID,AreaState>::Element *E=area_map.find(objid);
  195. ERR_FAIL_COND(!area_in && !E);
  196. locked=true;
  197. if (area_in) {
  198. if (!E) {
  199. E = area_map.insert(objid,AreaState());
  200. E->get().rc=0;
  201. E->get().in_tree=node && node->is_inside_tree();
  202. if (node) {
  203. node->connect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_area_enter_tree,make_binds(objid));
  204. node->connect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_area_exit_tree,make_binds(objid));
  205. if (E->get().in_tree) {
  206. emit_signal(SceneStringNames::get_singleton()->area_enter,node);
  207. }
  208. }
  209. }
  210. E->get().rc++;
  211. if (node)
  212. E->get().shapes.insert(AreaShapePair(p_area_shape,p_self_shape));
  213. if (!node || E->get().in_tree) {
  214. emit_signal(SceneStringNames::get_singleton()->area_enter_shape,objid,node,p_area_shape,p_self_shape);
  215. }
  216. } else {
  217. E->get().rc--;
  218. if (node)
  219. E->get().shapes.erase(AreaShapePair(p_area_shape,p_self_shape));
  220. bool eraseit=false;
  221. if (E->get().rc==0) {
  222. if (node) {
  223. node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_area_enter_tree);
  224. node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_area_exit_tree);
  225. if (E->get().in_tree)
  226. emit_signal(SceneStringNames::get_singleton()->area_exit,obj);
  227. }
  228. eraseit=true;
  229. }
  230. if (!node || E->get().in_tree) {
  231. emit_signal(SceneStringNames::get_singleton()->area_exit_shape,objid,obj,p_area_shape,p_self_shape);
  232. }
  233. if (eraseit)
  234. area_map.erase(E);
  235. }
  236. locked=false;
  237. }
  238. void Area2D::_clear_monitoring() {
  239. if (locked) {
  240. ERR_EXPLAIN("This function can't be used during the in/out signal.");
  241. }
  242. ERR_FAIL_COND(locked);
  243. {
  244. Map<ObjectID,BodyState> bmcopy = body_map;
  245. body_map.clear();
  246. //disconnect all monitored stuff
  247. for (Map<ObjectID,BodyState>::Element *E=bmcopy.front();E;E=E->next()) {
  248. Object *obj = ObjectDB::get_instance(E->key());
  249. Node *node = obj ? obj->cast_to<Node>() : NULL;
  250. ERR_CONTINUE(!node);
  251. if (!E->get().in_tree)
  252. continue;
  253. for(int i=0;i<E->get().shapes.size();i++) {
  254. emit_signal(SceneStringNames::get_singleton()->body_exit_shape,E->key(),node,E->get().shapes[i].body_shape,E->get().shapes[i].area_shape);
  255. }
  256. emit_signal(SceneStringNames::get_singleton()->body_exit,obj);
  257. node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_body_enter_tree);
  258. node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_body_exit_tree);
  259. }
  260. }
  261. {
  262. Map<ObjectID,AreaState> bmcopy = area_map;
  263. area_map.clear();
  264. //disconnect all monitored stuff
  265. for (Map<ObjectID,AreaState>::Element *E=bmcopy.front();E;E=E->next()) {
  266. Object *obj = ObjectDB::get_instance(E->key());
  267. Node *node = obj ? obj->cast_to<Node>() : NULL;
  268. if (!node) //node may have been deleted in previous frame, this should not be an error
  269. continue;
  270. //ERR_CONTINUE(!node);
  271. if (!E->get().in_tree)
  272. continue;
  273. for(int i=0;i<E->get().shapes.size();i++) {
  274. emit_signal(SceneStringNames::get_singleton()->area_exit_shape,E->key(),node,E->get().shapes[i].area_shape,E->get().shapes[i].self_shape);
  275. }
  276. emit_signal(SceneStringNames::get_singleton()->area_exit,obj);
  277. node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_area_enter_tree);
  278. node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_area_exit_tree);
  279. }
  280. }
  281. }
  282. void Area2D::_notification(int p_what) {
  283. switch(p_what) {
  284. case NOTIFICATION_EXIT_TREE: {
  285. _clear_monitoring();
  286. } break;
  287. }
  288. }
  289. void Area2D::set_enable_monitoring(bool p_enable) {
  290. if (p_enable==monitoring)
  291. return;
  292. if (locked) {
  293. ERR_EXPLAIN("Function blocked during in/out signal. Use call_deferred(\"set_enable_monitoring\",true/false)");
  294. }
  295. ERR_FAIL_COND(locked);
  296. monitoring=p_enable;
  297. if (monitoring) {
  298. Physics2DServer::get_singleton()->area_set_monitor_callback(get_rid(),this,SceneStringNames::get_singleton()->_body_inout);
  299. Physics2DServer::get_singleton()->area_set_area_monitor_callback(get_rid(),this,SceneStringNames::get_singleton()->_area_inout);
  300. } else {
  301. Physics2DServer::get_singleton()->area_set_monitor_callback(get_rid(),NULL,StringName());
  302. Physics2DServer::get_singleton()->area_set_area_monitor_callback(get_rid(),NULL,StringName());
  303. _clear_monitoring();
  304. }
  305. }
  306. bool Area2D::is_monitoring_enabled() const {
  307. return monitoring;
  308. }
  309. void Area2D::set_monitorable(bool p_enable) {
  310. if (locked) {
  311. ERR_EXPLAIN("This function can't be used during the in/out signal.");
  312. }
  313. ERR_FAIL_COND(locked);
  314. if (p_enable==monitorable)
  315. return;
  316. monitorable=p_enable;
  317. Physics2DServer::get_singleton()->area_set_monitorable(get_rid(),monitorable);
  318. }
  319. bool Area2D::is_monitorable() const {
  320. return monitorable;
  321. }
  322. Array Area2D::get_overlapping_bodies() const {
  323. ERR_FAIL_COND_V(!monitoring,Array());
  324. Array ret;
  325. ret.resize(body_map.size());
  326. int idx=0;
  327. for (const Map<ObjectID,BodyState>::Element *E=body_map.front();E;E=E->next()) {
  328. Object *obj = ObjectDB::get_instance(E->key());
  329. if (!obj) {
  330. ret.resize( ret.size() -1 ); //ops
  331. } else {
  332. ret[idx++]=obj;
  333. }
  334. }
  335. return ret;
  336. }
  337. Array Area2D::get_overlapping_areas() const {
  338. ERR_FAIL_COND_V(!monitoring,Array());
  339. Array ret;
  340. ret.resize(area_map.size());
  341. int idx=0;
  342. for (const Map<ObjectID,AreaState>::Element *E=area_map.front();E;E=E->next()) {
  343. Object *obj = ObjectDB::get_instance(E->key());
  344. if (!obj) {
  345. ret.resize( ret.size() -1 ); //ops
  346. } else {
  347. ret[idx++]=obj;
  348. }
  349. }
  350. return ret;
  351. }
  352. bool Area2D::overlaps_area(Node* p_area) const {
  353. ERR_FAIL_NULL_V(p_area,false);
  354. const Map<ObjectID,AreaState>::Element *E=area_map.find(p_area->get_instance_ID());
  355. if (!E)
  356. return false;
  357. return E->get().in_tree;
  358. }
  359. bool Area2D::overlaps_body(Node* p_body) const{
  360. ERR_FAIL_NULL_V(p_body,false);
  361. const Map<ObjectID,BodyState>::Element *E=body_map.find(p_body->get_instance_ID());
  362. if (!E)
  363. return false;
  364. return E->get().in_tree;
  365. }
  366. void Area2D::set_collision_mask(uint32_t p_mask) {
  367. collision_mask=p_mask;
  368. Physics2DServer::get_singleton()->area_set_collision_mask(get_rid(),p_mask);
  369. }
  370. uint32_t Area2D::get_collision_mask() const {
  371. return collision_mask;
  372. }
  373. void Area2D::set_layer_mask(uint32_t p_mask) {
  374. layer_mask=p_mask;
  375. Physics2DServer::get_singleton()->area_set_layer_mask(get_rid(),p_mask);
  376. }
  377. uint32_t Area2D::get_layer_mask() const {
  378. return layer_mask;
  379. }
  380. void Area2D::set_collision_mask_bit(int p_bit, bool p_value) {
  381. uint32_t mask = get_collision_mask();
  382. if (p_value)
  383. mask|=1<<p_bit;
  384. else
  385. mask&=~(1<<p_bit);
  386. set_collision_mask(mask);
  387. }
  388. bool Area2D::get_collision_mask_bit(int p_bit) const{
  389. return get_collision_mask()&(1<<p_bit);
  390. }
  391. void Area2D::set_layer_mask_bit(int p_bit, bool p_value) {
  392. uint32_t mask = get_layer_mask();
  393. if (p_value)
  394. mask|=1<<p_bit;
  395. else
  396. mask&=~(1<<p_bit);
  397. set_layer_mask(mask);
  398. }
  399. bool Area2D::get_layer_mask_bit(int p_bit) const{
  400. return get_layer_mask()&(1<<p_bit);
  401. }
  402. void Area2D::_bind_methods() {
  403. ObjectTypeDB::bind_method(_MD("_body_enter_tree","id"),&Area2D::_body_enter_tree);
  404. ObjectTypeDB::bind_method(_MD("_body_exit_tree","id"),&Area2D::_body_exit_tree);
  405. ObjectTypeDB::bind_method(_MD("_area_enter_tree","id"),&Area2D::_area_enter_tree);
  406. ObjectTypeDB::bind_method(_MD("_area_exit_tree","id"),&Area2D::_area_exit_tree);
  407. ObjectTypeDB::bind_method(_MD("set_space_override_mode","enable"),&Area2D::set_space_override_mode);
  408. ObjectTypeDB::bind_method(_MD("get_space_override_mode"),&Area2D::get_space_override_mode);
  409. ObjectTypeDB::bind_method(_MD("set_gravity_is_point","enable"),&Area2D::set_gravity_is_point);
  410. ObjectTypeDB::bind_method(_MD("is_gravity_a_point"),&Area2D::is_gravity_a_point);
  411. ObjectTypeDB::bind_method(_MD("set_gravity_distance_scale","distance_scale"),&Area2D::set_gravity_distance_scale);
  412. ObjectTypeDB::bind_method(_MD("get_gravity_distance_scale"),&Area2D::get_gravity_distance_scale);
  413. ObjectTypeDB::bind_method(_MD("set_gravity_vector","vector"),&Area2D::set_gravity_vector);
  414. ObjectTypeDB::bind_method(_MD("get_gravity_vector"),&Area2D::get_gravity_vector);
  415. ObjectTypeDB::bind_method(_MD("set_gravity","gravity"),&Area2D::set_gravity);
  416. ObjectTypeDB::bind_method(_MD("get_gravity"),&Area2D::get_gravity);
  417. ObjectTypeDB::bind_method(_MD("set_linear_damp","linear_damp"),&Area2D::set_linear_damp);
  418. ObjectTypeDB::bind_method(_MD("get_linear_damp"),&Area2D::get_linear_damp);
  419. ObjectTypeDB::bind_method(_MD("set_angular_damp","angular_damp"),&Area2D::set_angular_damp);
  420. ObjectTypeDB::bind_method(_MD("get_angular_damp"),&Area2D::get_angular_damp);
  421. ObjectTypeDB::bind_method(_MD("set_priority","priority"),&Area2D::set_priority);
  422. ObjectTypeDB::bind_method(_MD("get_priority"),&Area2D::get_priority);
  423. ObjectTypeDB::bind_method(_MD("set_collision_mask","collision_mask"),&Area2D::set_collision_mask);
  424. ObjectTypeDB::bind_method(_MD("get_collision_mask"),&Area2D::get_collision_mask);
  425. ObjectTypeDB::bind_method(_MD("set_layer_mask","layer_mask"),&Area2D::set_layer_mask);
  426. ObjectTypeDB::bind_method(_MD("get_layer_mask"),&Area2D::get_layer_mask);
  427. ObjectTypeDB::bind_method(_MD("set_collision_mask_bit","bit","value"),&Area2D::set_collision_mask_bit);
  428. ObjectTypeDB::bind_method(_MD("get_collision_mask_bit","bit"),&Area2D::get_collision_mask_bit);
  429. ObjectTypeDB::bind_method(_MD("set_layer_mask_bit","bit","value"),&Area2D::set_layer_mask_bit);
  430. ObjectTypeDB::bind_method(_MD("get_layer_mask_bit","bit"),&Area2D::get_layer_mask_bit);
  431. ObjectTypeDB::bind_method(_MD("set_enable_monitoring","enable"),&Area2D::set_enable_monitoring);
  432. ObjectTypeDB::bind_method(_MD("is_monitoring_enabled"),&Area2D::is_monitoring_enabled);
  433. ObjectTypeDB::bind_method(_MD("set_monitorable","enable"),&Area2D::set_monitorable);
  434. ObjectTypeDB::bind_method(_MD("is_monitorable"),&Area2D::is_monitorable);
  435. ObjectTypeDB::bind_method(_MD("get_overlapping_bodies"),&Area2D::get_overlapping_bodies);
  436. ObjectTypeDB::bind_method(_MD("get_overlapping_areas"),&Area2D::get_overlapping_areas);
  437. ObjectTypeDB::bind_method(_MD("overlaps_body","body"),&Area2D::overlaps_body);
  438. ObjectTypeDB::bind_method(_MD("overlaps_area","area"),&Area2D::overlaps_area);
  439. ObjectTypeDB::bind_method(_MD("_body_inout"),&Area2D::_body_inout);
  440. ObjectTypeDB::bind_method(_MD("_area_inout"),&Area2D::_area_inout);
  441. ADD_SIGNAL( MethodInfo("body_enter_shape",PropertyInfo(Variant::INT,"body_id"),PropertyInfo(Variant::OBJECT,"body",PROPERTY_HINT_RESOURCE_TYPE,"PhysicsBody2D"),PropertyInfo(Variant::INT,"body_shape"),PropertyInfo(Variant::INT,"area_shape")));
  442. ADD_SIGNAL( MethodInfo("body_exit_shape",PropertyInfo(Variant::INT,"body_id"),PropertyInfo(Variant::OBJECT,"body",PROPERTY_HINT_RESOURCE_TYPE,"PhysicsBody2D"),PropertyInfo(Variant::INT,"body_shape"),PropertyInfo(Variant::INT,"area_shape")));
  443. ADD_SIGNAL( MethodInfo("body_enter",PropertyInfo(Variant::OBJECT,"body",PROPERTY_HINT_RESOURCE_TYPE,"PhysicsBody2D")));
  444. ADD_SIGNAL( MethodInfo("body_exit",PropertyInfo(Variant::OBJECT,"body",PROPERTY_HINT_RESOURCE_TYPE,"PhysicsBody2D")));
  445. ADD_SIGNAL( MethodInfo("area_enter_shape",PropertyInfo(Variant::INT,"area_id"),PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D"),PropertyInfo(Variant::INT,"area_shape"),PropertyInfo(Variant::INT,"area_shape")));
  446. ADD_SIGNAL( MethodInfo("area_exit_shape",PropertyInfo(Variant::INT,"area_id"),PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D"),PropertyInfo(Variant::INT,"area_shape"),PropertyInfo(Variant::INT,"area_shape")));
  447. ADD_SIGNAL( MethodInfo("area_enter",PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D")));
  448. ADD_SIGNAL( MethodInfo("area_exit",PropertyInfo(Variant::OBJECT,"area",PROPERTY_HINT_RESOURCE_TYPE,"Area2D")));
  449. ADD_PROPERTYNZ( PropertyInfo(Variant::INT,"space_override",PROPERTY_HINT_ENUM,"Disabled,Combine,Combine-Replace,Replace,Replace-Combine"),_SCS("set_space_override_mode"),_SCS("get_space_override_mode"));
  450. ADD_PROPERTYNZ( PropertyInfo(Variant::BOOL,"gravity_point"),_SCS("set_gravity_is_point"),_SCS("is_gravity_a_point"));
  451. ADD_PROPERTYNZ( PropertyInfo(Variant::REAL,"gravity_distance_scale", PROPERTY_HINT_RANGE,"0,1024,0.001"),_SCS("set_gravity_distance_scale"),_SCS("get_gravity_distance_scale"));
  452. ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"gravity_vec"),_SCS("set_gravity_vector"),_SCS("get_gravity_vector"));
  453. ADD_PROPERTY( PropertyInfo(Variant::REAL,"gravity",PROPERTY_HINT_RANGE,"-1024,1024,0.001"),_SCS("set_gravity"),_SCS("get_gravity"));
  454. ADD_PROPERTY( PropertyInfo(Variant::REAL,"linear_damp",PROPERTY_HINT_RANGE,"0,100,0.01"),_SCS("set_linear_damp"),_SCS("get_linear_damp"));
  455. ADD_PROPERTY( PropertyInfo(Variant::REAL,"angular_damp",PROPERTY_HINT_RANGE,"0,100,0.01"),_SCS("set_angular_damp"),_SCS("get_angular_damp"));
  456. ADD_PROPERTYNZ( PropertyInfo(Variant::INT,"priority",PROPERTY_HINT_RANGE,"0,128,1"),_SCS("set_priority"),_SCS("get_priority"));
  457. ADD_PROPERTYNO( PropertyInfo(Variant::BOOL,"monitoring"),_SCS("set_enable_monitoring"),_SCS("is_monitoring_enabled"));
  458. ADD_PROPERTYNO( PropertyInfo(Variant::BOOL,"monitorable"),_SCS("set_monitorable"),_SCS("is_monitorable"));
  459. ADD_PROPERTYNO( PropertyInfo(Variant::INT,"collision/layers",PROPERTY_HINT_ALL_FLAGS),_SCS("set_layer_mask"),_SCS("get_layer_mask"));
  460. ADD_PROPERTYNO( PropertyInfo(Variant::INT,"collision/mask",PROPERTY_HINT_ALL_FLAGS),_SCS("set_collision_mask"),_SCS("get_collision_mask"));
  461. }
  462. Area2D::Area2D() : CollisionObject2D(Physics2DServer::get_singleton()->area_create(),true) {
  463. space_override=SPACE_OVERRIDE_DISABLED;
  464. set_gravity(98);;
  465. set_gravity_vector(Vector2(0,1));
  466. gravity_is_point=false;
  467. gravity_distance_scale=0;
  468. linear_damp=0.1;
  469. angular_damp=1;
  470. locked=false;
  471. priority=0;
  472. monitoring=false;
  473. monitorable=false;
  474. collision_mask=1;
  475. layer_mask=1;
  476. set_enable_monitoring(true);
  477. set_monitorable(true);
  478. }
  479. Area2D::~Area2D() {
  480. }