1 /** 2 2D area for detection and 2D physics influence. 3 4 Copyright: 5 Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. 6 Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md) 7 Copyright (c) 2017-2018 Godot-D contributors 8 9 License: $(LINK2 https://opensource.org/licenses/MIT, MIT License) 10 11 12 */ 13 module godot.area2d; 14 import std.meta : AliasSeq, staticIndexOf; 15 import std.traits : Unqual; 16 import godot.d.traits; 17 import godot.core; 18 import godot.c; 19 import godot.d.bind; 20 import godot.d.reference; 21 import godot.globalenums; 22 import godot.object; 23 import godot.classdb; 24 import godot.collisionobject2d; 25 import godot.node; 26 /** 27 2D area for detection and 2D physics influence. 28 29 2D area that detects $(D CollisionObject2D) nodes overlapping, entering, or exiting. Can also alter or override local physics parameters (gravity, damping). 30 */ 31 @GodotBaseClass struct Area2D 32 { 33 package(godot) enum string _GODOT_internal_name = "Area2D"; 34 public: 35 @nogc nothrow: 36 union { /** */ godot_object _godot_object; /** */ CollisionObject2D _GODOT_base; } 37 alias _GODOT_base this; 38 alias BaseClasses = AliasSeq!(typeof(_GODOT_base), typeof(_GODOT_base).BaseClasses); 39 package(godot) __gshared bool _classBindingInitialized = false; 40 package(godot) static struct GDNativeClassBinding 41 { 42 __gshared: 43 @GodotName("_area_enter_tree") GodotMethod!(void, long) _areaEnterTree; 44 @GodotName("_area_exit_tree") GodotMethod!(void, long) _areaExitTree; 45 @GodotName("_area_inout") GodotMethod!(void, long, RID, long, long, long) _areaInout; 46 @GodotName("_body_enter_tree") GodotMethod!(void, long) _bodyEnterTree; 47 @GodotName("_body_exit_tree") GodotMethod!(void, long) _bodyExitTree; 48 @GodotName("_body_inout") GodotMethod!(void, long, RID, long, long, long) _bodyInout; 49 @GodotName("get_angular_damp") GodotMethod!(double) getAngularDamp; 50 @GodotName("get_audio_bus_name") GodotMethod!(String) getAudioBusName; 51 @GodotName("get_collision_layer") GodotMethod!(long) getCollisionLayer; 52 @GodotName("get_collision_layer_bit") GodotMethod!(bool, long) getCollisionLayerBit; 53 @GodotName("get_collision_mask") GodotMethod!(long) getCollisionMask; 54 @GodotName("get_collision_mask_bit") GodotMethod!(bool, long) getCollisionMaskBit; 55 @GodotName("get_gravity") GodotMethod!(double) getGravity; 56 @GodotName("get_gravity_distance_scale") GodotMethod!(double) getGravityDistanceScale; 57 @GodotName("get_gravity_vector") GodotMethod!(Vector2) getGravityVector; 58 @GodotName("get_linear_damp") GodotMethod!(double) getLinearDamp; 59 @GodotName("get_overlapping_areas") GodotMethod!(Array) getOverlappingAreas; 60 @GodotName("get_overlapping_bodies") GodotMethod!(Array) getOverlappingBodies; 61 @GodotName("get_priority") GodotMethod!(double) getPriority; 62 @GodotName("get_space_override_mode") GodotMethod!(Area2D.SpaceOverride) getSpaceOverrideMode; 63 @GodotName("is_gravity_a_point") GodotMethod!(bool) isGravityAPoint; 64 @GodotName("is_monitorable") GodotMethod!(bool) isMonitorable; 65 @GodotName("is_monitoring") GodotMethod!(bool) isMonitoring; 66 @GodotName("is_overriding_audio_bus") GodotMethod!(bool) isOverridingAudioBus; 67 @GodotName("overlaps_area") GodotMethod!(bool, Node) overlapsArea; 68 @GodotName("overlaps_body") GodotMethod!(bool, Node) overlapsBody; 69 @GodotName("set_angular_damp") GodotMethod!(void, double) setAngularDamp; 70 @GodotName("set_audio_bus_name") GodotMethod!(void, String) setAudioBusName; 71 @GodotName("set_audio_bus_override") GodotMethod!(void, bool) setAudioBusOverride; 72 @GodotName("set_collision_layer") GodotMethod!(void, long) setCollisionLayer; 73 @GodotName("set_collision_layer_bit") GodotMethod!(void, long, bool) setCollisionLayerBit; 74 @GodotName("set_collision_mask") GodotMethod!(void, long) setCollisionMask; 75 @GodotName("set_collision_mask_bit") GodotMethod!(void, long, bool) setCollisionMaskBit; 76 @GodotName("set_gravity") GodotMethod!(void, double) setGravity; 77 @GodotName("set_gravity_distance_scale") GodotMethod!(void, double) setGravityDistanceScale; 78 @GodotName("set_gravity_is_point") GodotMethod!(void, bool) setGravityIsPoint; 79 @GodotName("set_gravity_vector") GodotMethod!(void, Vector2) setGravityVector; 80 @GodotName("set_linear_damp") GodotMethod!(void, double) setLinearDamp; 81 @GodotName("set_monitorable") GodotMethod!(void, bool) setMonitorable; 82 @GodotName("set_monitoring") GodotMethod!(void, bool) setMonitoring; 83 @GodotName("set_priority") GodotMethod!(void, double) setPriority; 84 @GodotName("set_space_override_mode") GodotMethod!(void, long) setSpaceOverrideMode; 85 } 86 /// 87 pragma(inline, true) bool opEquals(in Area2D other) const 88 { return _godot_object.ptr is other._godot_object.ptr; } 89 /// 90 pragma(inline, true) typeof(null) opAssign(typeof(null) n) 91 { _godot_object.ptr = n; return null; } 92 /// 93 pragma(inline, true) bool opEquals(typeof(null) n) const 94 { return _godot_object.ptr is n; } 95 /// 96 size_t toHash() const @trusted { return cast(size_t)_godot_object.ptr; } 97 mixin baseCasts; 98 /// Construct a new instance of Area2D. 99 /// Note: use `memnew!Area2D` instead. 100 static Area2D _new() 101 { 102 static godot_class_constructor constructor; 103 if(constructor is null) constructor = _godot_api.godot_get_class_constructor("Area2D"); 104 if(constructor is null) return typeof(this).init; 105 return cast(Area2D)(constructor()); 106 } 107 @disable new(size_t s); 108 /// 109 enum SpaceOverride : int 110 { 111 /** 112 This area does not affect gravity/damping. 113 */ 114 spaceOverrideDisabled = 0, 115 /** 116 This area adds its gravity/damping values to whatever has been calculated so far (in $(D priority) order). 117 */ 118 spaceOverrideCombine = 1, 119 /** 120 This area adds its gravity/damping values to whatever has been calculated so far (in $(D priority) order), ignoring any lower priority areas. 121 */ 122 spaceOverrideCombineReplace = 2, 123 /** 124 This area replaces any gravity/damping, even the defaults, ignoring any lower priority areas. 125 */ 126 spaceOverrideReplace = 3, 127 /** 128 This area replaces any gravity/damping calculated so far (in $(D priority) order), but keeps calculating the rest of the areas. 129 */ 130 spaceOverrideReplaceCombine = 4, 131 } 132 /// 133 enum Constants : int 134 { 135 spaceOverrideDisabled = 0, 136 spaceOverrideCombine = 1, 137 spaceOverrideCombineReplace = 2, 138 spaceOverrideReplace = 3, 139 spaceOverrideReplaceCombine = 4, 140 } 141 /** 142 143 */ 144 void _areaEnterTree(in long id) 145 { 146 Array _GODOT_args = Array.make(); 147 _GODOT_args.append(id); 148 String _GODOT_method_name = String("_area_enter_tree"); 149 this.callv(_GODOT_method_name, _GODOT_args); 150 } 151 /** 152 153 */ 154 void _areaExitTree(in long id) 155 { 156 Array _GODOT_args = Array.make(); 157 _GODOT_args.append(id); 158 String _GODOT_method_name = String("_area_exit_tree"); 159 this.callv(_GODOT_method_name, _GODOT_args); 160 } 161 /** 162 163 */ 164 void _areaInout(in long arg0, in RID arg1, in long arg2, in long arg3, in long arg4) 165 { 166 Array _GODOT_args = Array.make(); 167 _GODOT_args.append(arg0); 168 _GODOT_args.append(arg1); 169 _GODOT_args.append(arg2); 170 _GODOT_args.append(arg3); 171 _GODOT_args.append(arg4); 172 String _GODOT_method_name = String("_area_inout"); 173 this.callv(_GODOT_method_name, _GODOT_args); 174 } 175 /** 176 177 */ 178 void _bodyEnterTree(in long id) 179 { 180 Array _GODOT_args = Array.make(); 181 _GODOT_args.append(id); 182 String _GODOT_method_name = String("_body_enter_tree"); 183 this.callv(_GODOT_method_name, _GODOT_args); 184 } 185 /** 186 187 */ 188 void _bodyExitTree(in long id) 189 { 190 Array _GODOT_args = Array.make(); 191 _GODOT_args.append(id); 192 String _GODOT_method_name = String("_body_exit_tree"); 193 this.callv(_GODOT_method_name, _GODOT_args); 194 } 195 /** 196 197 */ 198 void _bodyInout(in long arg0, in RID arg1, in long arg2, in long arg3, in long arg4) 199 { 200 Array _GODOT_args = Array.make(); 201 _GODOT_args.append(arg0); 202 _GODOT_args.append(arg1); 203 _GODOT_args.append(arg2); 204 _GODOT_args.append(arg3); 205 _GODOT_args.append(arg4); 206 String _GODOT_method_name = String("_body_inout"); 207 this.callv(_GODOT_method_name, _GODOT_args); 208 } 209 /** 210 211 */ 212 double getAngularDamp() const 213 { 214 checkClassBinding!(typeof(this))(); 215 return ptrcall!(double)(GDNativeClassBinding.getAngularDamp, _godot_object); 216 } 217 /** 218 219 */ 220 String getAudioBusName() const 221 { 222 checkClassBinding!(typeof(this))(); 223 return ptrcall!(String)(GDNativeClassBinding.getAudioBusName, _godot_object); 224 } 225 /** 226 227 */ 228 long getCollisionLayer() const 229 { 230 checkClassBinding!(typeof(this))(); 231 return ptrcall!(long)(GDNativeClassBinding.getCollisionLayer, _godot_object); 232 } 233 /** 234 Returns an individual bit on the layer mask. Describes whether other areas will collide with this one on the given layer. 235 */ 236 bool getCollisionLayerBit(in long bit) const 237 { 238 checkClassBinding!(typeof(this))(); 239 return ptrcall!(bool)(GDNativeClassBinding.getCollisionLayerBit, _godot_object, bit); 240 } 241 /** 242 243 */ 244 long getCollisionMask() const 245 { 246 checkClassBinding!(typeof(this))(); 247 return ptrcall!(long)(GDNativeClassBinding.getCollisionMask, _godot_object); 248 } 249 /** 250 Returns an individual bit on the collision mask. Describes whether this area will collide with others on the given layer. 251 */ 252 bool getCollisionMaskBit(in long bit) const 253 { 254 checkClassBinding!(typeof(this))(); 255 return ptrcall!(bool)(GDNativeClassBinding.getCollisionMaskBit, _godot_object, bit); 256 } 257 /** 258 259 */ 260 double getGravity() const 261 { 262 checkClassBinding!(typeof(this))(); 263 return ptrcall!(double)(GDNativeClassBinding.getGravity, _godot_object); 264 } 265 /** 266 267 */ 268 double getGravityDistanceScale() const 269 { 270 checkClassBinding!(typeof(this))(); 271 return ptrcall!(double)(GDNativeClassBinding.getGravityDistanceScale, _godot_object); 272 } 273 /** 274 275 */ 276 Vector2 getGravityVector() const 277 { 278 checkClassBinding!(typeof(this))(); 279 return ptrcall!(Vector2)(GDNativeClassBinding.getGravityVector, _godot_object); 280 } 281 /** 282 283 */ 284 double getLinearDamp() const 285 { 286 checkClassBinding!(typeof(this))(); 287 return ptrcall!(double)(GDNativeClassBinding.getLinearDamp, _godot_object); 288 } 289 /** 290 Returns a list of intersecting $(D Area2D)s. For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. 291 */ 292 Array getOverlappingAreas() const 293 { 294 checkClassBinding!(typeof(this))(); 295 return ptrcall!(Array)(GDNativeClassBinding.getOverlappingAreas, _godot_object); 296 } 297 /** 298 Returns a list of intersecting $(D PhysicsBody2D)s. For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved. Consider using signals instead. 299 */ 300 Array getOverlappingBodies() const 301 { 302 checkClassBinding!(typeof(this))(); 303 return ptrcall!(Array)(GDNativeClassBinding.getOverlappingBodies, _godot_object); 304 } 305 /** 306 307 */ 308 double getPriority() const 309 { 310 checkClassBinding!(typeof(this))(); 311 return ptrcall!(double)(GDNativeClassBinding.getPriority, _godot_object); 312 } 313 /** 314 315 */ 316 Area2D.SpaceOverride getSpaceOverrideMode() const 317 { 318 checkClassBinding!(typeof(this))(); 319 return ptrcall!(Area2D.SpaceOverride)(GDNativeClassBinding.getSpaceOverrideMode, _godot_object); 320 } 321 /** 322 323 */ 324 bool isGravityAPoint() const 325 { 326 checkClassBinding!(typeof(this))(); 327 return ptrcall!(bool)(GDNativeClassBinding.isGravityAPoint, _godot_object); 328 } 329 /** 330 331 */ 332 bool isMonitorable() const 333 { 334 checkClassBinding!(typeof(this))(); 335 return ptrcall!(bool)(GDNativeClassBinding.isMonitorable, _godot_object); 336 } 337 /** 338 339 */ 340 bool isMonitoring() const 341 { 342 checkClassBinding!(typeof(this))(); 343 return ptrcall!(bool)(GDNativeClassBinding.isMonitoring, _godot_object); 344 } 345 /** 346 347 */ 348 bool isOverridingAudioBus() const 349 { 350 checkClassBinding!(typeof(this))(); 351 return ptrcall!(bool)(GDNativeClassBinding.isOverridingAudioBus, _godot_object); 352 } 353 /** 354 If `true`, the given area overlaps the Area2D. 355 $(B Note:) The result of this test is not immediate after moving objects. For performance, the list of overlaps is updated once per frame and before the physics step. Consider using signals instead. 356 */ 357 bool overlapsArea(Node area) const 358 { 359 checkClassBinding!(typeof(this))(); 360 return ptrcall!(bool)(GDNativeClassBinding.overlapsArea, _godot_object, area); 361 } 362 /** 363 If `true`, the given physics body overlaps the Area2D. 364 $(B Note:) The result of this test is not immediate after moving objects. For performance, list of overlaps is updated once per frame and before the physics step. Consider using signals instead. 365 The `body` argument can either be a $(D PhysicsBody2D) or a $(D TileMap) instance (while TileMaps are not physics bodies themselves, they register their tiles with collision shapes as a virtual physics body). 366 */ 367 bool overlapsBody(Node _body) const 368 { 369 checkClassBinding!(typeof(this))(); 370 return ptrcall!(bool)(GDNativeClassBinding.overlapsBody, _godot_object, _body); 371 } 372 /** 373 374 */ 375 void setAngularDamp(in double angular_damp) 376 { 377 checkClassBinding!(typeof(this))(); 378 ptrcall!(void)(GDNativeClassBinding.setAngularDamp, _godot_object, angular_damp); 379 } 380 /** 381 382 */ 383 void setAudioBusName(in String name) 384 { 385 checkClassBinding!(typeof(this))(); 386 ptrcall!(void)(GDNativeClassBinding.setAudioBusName, _godot_object, name); 387 } 388 /** 389 390 */ 391 void setAudioBusOverride(in bool enable) 392 { 393 checkClassBinding!(typeof(this))(); 394 ptrcall!(void)(GDNativeClassBinding.setAudioBusOverride, _godot_object, enable); 395 } 396 /** 397 398 */ 399 void setCollisionLayer(in long collision_layer) 400 { 401 checkClassBinding!(typeof(this))(); 402 ptrcall!(void)(GDNativeClassBinding.setCollisionLayer, _godot_object, collision_layer); 403 } 404 /** 405 Set/clear individual bits on the layer mask. This makes getting an area in/out of only one layer easier. 406 */ 407 void setCollisionLayerBit(in long bit, in bool value) 408 { 409 checkClassBinding!(typeof(this))(); 410 ptrcall!(void)(GDNativeClassBinding.setCollisionLayerBit, _godot_object, bit, value); 411 } 412 /** 413 414 */ 415 void setCollisionMask(in long collision_mask) 416 { 417 checkClassBinding!(typeof(this))(); 418 ptrcall!(void)(GDNativeClassBinding.setCollisionMask, _godot_object, collision_mask); 419 } 420 /** 421 Set/clear individual bits on the collision mask. This makes selecting the areas scanned easier. 422 */ 423 void setCollisionMaskBit(in long bit, in bool value) 424 { 425 checkClassBinding!(typeof(this))(); 426 ptrcall!(void)(GDNativeClassBinding.setCollisionMaskBit, _godot_object, bit, value); 427 } 428 /** 429 430 */ 431 void setGravity(in double gravity) 432 { 433 checkClassBinding!(typeof(this))(); 434 ptrcall!(void)(GDNativeClassBinding.setGravity, _godot_object, gravity); 435 } 436 /** 437 438 */ 439 void setGravityDistanceScale(in double distance_scale) 440 { 441 checkClassBinding!(typeof(this))(); 442 ptrcall!(void)(GDNativeClassBinding.setGravityDistanceScale, _godot_object, distance_scale); 443 } 444 /** 445 446 */ 447 void setGravityIsPoint(in bool enable) 448 { 449 checkClassBinding!(typeof(this))(); 450 ptrcall!(void)(GDNativeClassBinding.setGravityIsPoint, _godot_object, enable); 451 } 452 /** 453 454 */ 455 void setGravityVector(in Vector2 vector) 456 { 457 checkClassBinding!(typeof(this))(); 458 ptrcall!(void)(GDNativeClassBinding.setGravityVector, _godot_object, vector); 459 } 460 /** 461 462 */ 463 void setLinearDamp(in double linear_damp) 464 { 465 checkClassBinding!(typeof(this))(); 466 ptrcall!(void)(GDNativeClassBinding.setLinearDamp, _godot_object, linear_damp); 467 } 468 /** 469 470 */ 471 void setMonitorable(in bool enable) 472 { 473 checkClassBinding!(typeof(this))(); 474 ptrcall!(void)(GDNativeClassBinding.setMonitorable, _godot_object, enable); 475 } 476 /** 477 478 */ 479 void setMonitoring(in bool enable) 480 { 481 checkClassBinding!(typeof(this))(); 482 ptrcall!(void)(GDNativeClassBinding.setMonitoring, _godot_object, enable); 483 } 484 /** 485 486 */ 487 void setPriority(in double priority) 488 { 489 checkClassBinding!(typeof(this))(); 490 ptrcall!(void)(GDNativeClassBinding.setPriority, _godot_object, priority); 491 } 492 /** 493 494 */ 495 void setSpaceOverrideMode(in long space_override_mode) 496 { 497 checkClassBinding!(typeof(this))(); 498 ptrcall!(void)(GDNativeClassBinding.setSpaceOverrideMode, _godot_object, space_override_mode); 499 } 500 /** 501 The rate at which objects stop spinning in this area. Represents the angular velocity lost per second. 502 See $(D ProjectSettings.physics/2d/defaultAngularDamp) for more details about damping. 503 */ 504 @property double angularDamp() 505 { 506 return getAngularDamp(); 507 } 508 /// ditto 509 @property void angularDamp(double v) 510 { 511 setAngularDamp(v); 512 } 513 /** 514 The name of the area's audio bus. 515 */ 516 @property String audioBusName() 517 { 518 return getAudioBusName(); 519 } 520 /// ditto 521 @property void audioBusName(String v) 522 { 523 setAudioBusName(v); 524 } 525 /** 526 If `true`, the area's audio bus overrides the default audio bus. 527 */ 528 @property bool audioBusOverride() 529 { 530 return isOverridingAudioBus(); 531 } 532 /// ditto 533 @property void audioBusOverride(bool v) 534 { 535 setAudioBusOverride(v); 536 } 537 /** 538 The area's physics layer(s). Collidable objects can exist in any of 32 different layers. A contact is detected if object A is in any of the layers that object B scans, or object B is in any layers that object A scans. See also $(D collisionMask). See $(D url=https://docs.godotengine.org/en/3.3/tutorials/physics/physics_introduction.html#collision-layers-and-masks)Collision layers and masks$(D /url) in the documentation for more information. 539 */ 540 @property long collisionLayer() 541 { 542 return getCollisionLayer(); 543 } 544 /// ditto 545 @property void collisionLayer(long v) 546 { 547 setCollisionLayer(v); 548 } 549 /** 550 The physics layers this area scans to determine collision detection. See $(D url=https://docs.godotengine.org/en/3.3/tutorials/physics/physics_introduction.html#collision-layers-and-masks)Collision layers and masks$(D /url) in the documentation for more information. 551 */ 552 @property long collisionMask() 553 { 554 return getCollisionMask(); 555 } 556 /// ditto 557 @property void collisionMask(long v) 558 { 559 setCollisionMask(v); 560 } 561 /** 562 The area's gravity intensity (in pixels per second squared). This value multiplies the gravity vector. This is useful to alter the force of gravity without altering its direction. 563 */ 564 @property double gravity() 565 { 566 return getGravity(); 567 } 568 /// ditto 569 @property void gravity(double v) 570 { 571 setGravity(v); 572 } 573 /** 574 The falloff factor for point gravity. The greater the value, the faster gravity decreases with distance. 575 */ 576 @property double gravityDistanceScale() 577 { 578 return getGravityDistanceScale(); 579 } 580 /// ditto 581 @property void gravityDistanceScale(double v) 582 { 583 setGravityDistanceScale(v); 584 } 585 /** 586 If `true`, gravity is calculated from a point (set via $(D gravityVec)). See also $(D spaceOverride). 587 */ 588 @property bool gravityPoint() 589 { 590 return isGravityAPoint(); 591 } 592 /// ditto 593 @property void gravityPoint(bool v) 594 { 595 setGravityIsPoint(v); 596 } 597 /** 598 The area's gravity vector (not normalized). If gravity is a point (see $(D gravityPoint)), this will be the point of attraction. 599 */ 600 @property Vector2 gravityVec() 601 { 602 return getGravityVector(); 603 } 604 /// ditto 605 @property void gravityVec(Vector2 v) 606 { 607 setGravityVector(v); 608 } 609 /** 610 The rate at which objects stop moving in this area. Represents the linear velocity lost per second. 611 See $(D ProjectSettings.physics/2d/defaultLinearDamp) for more details about damping. 612 */ 613 @property double linearDamp() 614 { 615 return getLinearDamp(); 616 } 617 /// ditto 618 @property void linearDamp(double v) 619 { 620 setLinearDamp(v); 621 } 622 /** 623 If `true`, other monitoring areas can detect this area. 624 */ 625 @property bool monitorable() 626 { 627 return isMonitorable(); 628 } 629 /// ditto 630 @property void monitorable(bool v) 631 { 632 setMonitorable(v); 633 } 634 /** 635 If `true`, the area detects bodies or areas entering and exiting it. 636 */ 637 @property bool monitoring() 638 { 639 return isMonitoring(); 640 } 641 /// ditto 642 @property void monitoring(bool v) 643 { 644 setMonitoring(v); 645 } 646 /** 647 The area's priority. Higher priority areas are processed first. 648 */ 649 @property double priority() 650 { 651 return getPriority(); 652 } 653 /// ditto 654 @property void priority(double v) 655 { 656 setPriority(v); 657 } 658 /** 659 Override mode for gravity and damping calculations within this area. See $(D spaceoverride) for possible values. 660 */ 661 @property Area2D.SpaceOverride spaceOverride() 662 { 663 return getSpaceOverrideMode(); 664 } 665 /// ditto 666 @property void spaceOverride(long v) 667 { 668 setSpaceOverrideMode(v); 669 } 670 }