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 }