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