| 
									
										
										
										
											2023-01-05 13:25:55 +01:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*  camera_2d.h                                                           */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*                         This file is part of:                          */ | 
					
						
							|  |  |  | /*                             GODOT ENGINE                               */ | 
					
						
							|  |  |  | /*                        https://godotengine.org                         */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ | 
					
						
							|  |  |  | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* 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.                 */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | #ifndef CAMERA_2D_H
 | 
					
						
							|  |  |  | #define CAMERA_2D_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "scene/2d/node_2d.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Camera2D : public Node2D { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	GDCLASS(Camera2D, Node2D); | 
					
						
							| 
									
										
										
										
											2015-06-11 09:55:38 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2015-06-11 09:55:38 -03:00
										 |  |  | 	enum AnchorMode { | 
					
						
							|  |  |  | 		ANCHOR_MODE_FIXED_TOP_LEFT, | 
					
						
							|  |  |  | 		ANCHOR_MODE_DRAG_CENTER | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-18 15:52:29 -03:00
										 |  |  | 	enum Camera2DProcessCallback { | 
					
						
							| 
									
										
										
										
											2019-01-06 14:57:41 +01:00
										 |  |  | 		CAMERA2D_PROCESS_PHYSICS, | 
					
						
							|  |  |  | 		CAMERA2D_PROCESS_IDLE | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | protected: | 
					
						
							|  |  |  | 	Point2 camera_pos; | 
					
						
							|  |  |  | 	Point2 smoothed_camera_pos; | 
					
						
							| 
									
										
										
										
											2021-02-07 22:29:31 +01:00
										 |  |  | 	bool first = true; | 
					
						
							| 
									
										
										
										
											2023-02-10 23:46:55 +01:00
										 |  |  | 	bool just_exited_tree = false; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-14 15:55:14 -03:00
										 |  |  | 	ObjectID custom_viewport_id; // to check validity
 | 
					
						
							| 
									
										
										
										
											2021-02-07 22:29:31 +01:00
										 |  |  | 	Viewport *custom_viewport = nullptr; | 
					
						
							|  |  |  | 	Viewport *viewport = nullptr; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	StringName group_name; | 
					
						
							|  |  |  | 	StringName canvas_group_name; | 
					
						
							|  |  |  | 	RID canvas; | 
					
						
							|  |  |  | 	Vector2 offset; | 
					
						
							| 
									
										
										
										
											2021-02-07 22:29:31 +01:00
										 |  |  | 	Vector2 zoom = Vector2(1, 1); | 
					
						
							| 
									
										
										
										
											2022-01-29 08:16:55 +00:00
										 |  |  | 	Vector2 zoom_scale = Vector2(1, 1); | 
					
						
							| 
									
										
										
										
											2021-02-07 22:29:31 +01:00
										 |  |  | 	AnchorMode anchor_mode = ANCHOR_MODE_DRAG_CENTER; | 
					
						
							| 
									
										
										
										
											2022-08-13 13:37:10 +02:00
										 |  |  | 	bool ignore_rotation = true; | 
					
						
							| 
									
										
										
										
											2022-09-12 14:47:24 +02:00
										 |  |  | 	bool enabled = true; | 
					
						
							| 
									
										
										
										
											2022-09-14 13:38:15 +02:00
										 |  |  | 	real_t position_smoothing_speed = 5.0; | 
					
						
							| 
									
										
										
										
											2023-03-02 20:53:25 +01:00
										 |  |  | 	bool position_smoothing_enabled = false; | 
					
						
							| 
									
										
										
										
											2020-04-28 07:34:27 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	real_t camera_angle = 0.0; | 
					
						
							|  |  |  | 	real_t rotation_smoothing_speed = 5.0; | 
					
						
							|  |  |  | 	bool rotation_smoothing_enabled = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	int limit[4]; | 
					
						
							| 
									
										
										
										
											2021-02-07 22:29:31 +01:00
										 |  |  | 	bool limit_smoothing_enabled = false; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-29 23:10:32 -05:00
										 |  |  | 	real_t drag_margin[4]; | 
					
						
							| 
									
										
										
										
											2021-02-07 22:29:31 +01:00
										 |  |  | 	bool drag_horizontal_enabled = false; | 
					
						
							|  |  |  | 	bool drag_vertical_enabled = false; | 
					
						
							| 
									
										
										
										
											2021-01-29 23:10:32 -05:00
										 |  |  | 	real_t drag_horizontal_offset = 0.0; | 
					
						
							|  |  |  | 	real_t drag_vertical_offset = 0.0; | 
					
						
							| 
									
										
										
										
											2021-02-07 22:29:31 +01:00
										 |  |  | 	bool drag_horizontal_offset_changed = false; | 
					
						
							|  |  |  | 	bool drag_vertical_offset_changed = false; | 
					
						
							| 
									
										
										
										
											2019-03-14 13:58:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	Point2 camera_screen_center; | 
					
						
							| 
									
										
										
										
											2023-08-13 22:14:13 +00:00
										 |  |  | 	bool _is_editing_in_editor() const; | 
					
						
							| 
									
										
										
										
											2021-02-18 15:52:29 -03:00
										 |  |  | 	void _update_process_callback(); | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	void _update_scroll(); | 
					
						
							| 
									
										
										
										
											2024-06-10 19:14:39 +02:00
										 |  |  | #ifdef TOOLS_ENABLED
 | 
					
						
							|  |  |  | 	void _project_settings_changed(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void _make_current(Object *p_which); | 
					
						
							| 
									
										
										
										
											2023-02-10 23:46:55 +01:00
										 |  |  | 	void _reset_just_exited() { just_exited_tree = false; } | 
					
						
							| 
									
										
										
										
											2015-12-12 09:26:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-29 23:10:32 -05:00
										 |  |  | 	void _set_old_smoothing(real_t p_enable); | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 07:34:27 -06:00
										 |  |  | 	void _update_process_internal_for_smoothing(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-07 22:29:31 +01:00
										 |  |  | 	bool screen_drawing_enabled = true; | 
					
						
							|  |  |  | 	bool limit_drawing_enabled = false; | 
					
						
							|  |  |  | 	bool margin_drawing_enabled = false; | 
					
						
							| 
									
										
										
										
											2017-06-20 17:00:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-18 15:52:29 -03:00
										 |  |  | 	Camera2DProcessCallback process_callback = CAMERA2D_PROCESS_IDLE; | 
					
						
							| 
									
										
										
										
											2019-01-06 14:57:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-17 00:57:32 +01:00
										 |  |  | 	struct InterpolationData { | 
					
						
							|  |  |  | 		Transform2D xform_curr; | 
					
						
							|  |  |  | 		Transform2D xform_prev; | 
					
						
							| 
									
										
										
										
											2024-07-07 17:34:50 +02:00
										 |  |  | 		uint32_t last_update_physics_tick = UINT32_MAX; // Ensure tick 0 is detected as a change.
 | 
					
						
							| 
									
										
										
										
											2024-02-17 00:57:32 +01:00
										 |  |  | 	} _interpolation_data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void _ensure_update_interpolation_data(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-29 19:45:07 -04:00
										 |  |  | 	Size2 _get_camera_screen_size() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2017-01-11 00:52:51 -03:00
										 |  |  | 	virtual Transform2D get_camera_transform(); | 
					
						
							| 
									
										
										
										
											2021-03-03 20:51:35 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	void _notification(int p_what); | 
					
						
							|  |  |  | 	static void _bind_methods(); | 
					
						
							| 
									
										
										
										
											2022-08-12 23:57:11 +03:00
										 |  |  | 	void _validate_property(PropertyInfo &p_property) const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | public: | 
					
						
							|  |  |  | 	void set_offset(const Vector2 &p_offset); | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	Vector2 get_offset() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 09:55:38 -03:00
										 |  |  | 	void set_anchor_mode(AnchorMode p_anchor_mode); | 
					
						
							|  |  |  | 	AnchorMode get_anchor_mode() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-13 13:37:10 +02:00
										 |  |  | 	void set_ignore_rotation(bool p_ignore); | 
					
						
							|  |  |  | 	bool is_ignoring_rotation() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-22 16:24:29 +00:00
										 |  |  | 	void set_limit(Side p_side, int p_limit); | 
					
						
							|  |  |  | 	int get_limit(Side p_side) const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-13 11:48:50 +02:00
										 |  |  | 	void set_limit_smoothing_enabled(bool enable); | 
					
						
							|  |  |  | 	bool is_limit_smoothing_enabled() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-09 16:14:29 +00:00
										 |  |  | 	void set_drag_horizontal_enabled(bool p_enabled); | 
					
						
							|  |  |  | 	bool is_drag_horizontal_enabled() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-09 16:14:29 +00:00
										 |  |  | 	void set_drag_vertical_enabled(bool p_enabled); | 
					
						
							|  |  |  | 	bool is_drag_vertical_enabled() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-29 23:10:32 -05:00
										 |  |  | 	void set_drag_margin(Side p_side, real_t p_drag_margin); | 
					
						
							|  |  |  | 	real_t get_drag_margin(Side p_side) const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-29 23:10:32 -05:00
										 |  |  | 	void set_drag_horizontal_offset(real_t p_offset); | 
					
						
							|  |  |  | 	real_t get_drag_horizontal_offset() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-29 23:10:32 -05:00
										 |  |  | 	void set_drag_vertical_offset(real_t p_offset); | 
					
						
							|  |  |  | 	real_t get_drag_vertical_offset() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-14 13:38:15 +02:00
										 |  |  | 	void set_position_smoothing_enabled(bool p_enabled); | 
					
						
							|  |  |  | 	bool is_position_smoothing_enabled() const; | 
					
						
							| 
									
										
										
										
											2015-12-12 09:26:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-14 13:38:15 +02:00
										 |  |  | 	void set_position_smoothing_speed(real_t p_speed); | 
					
						
							|  |  |  | 	real_t get_position_smoothing_speed() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-28 07:34:27 -06:00
										 |  |  | 	void set_rotation_smoothing_speed(real_t p_speed); | 
					
						
							|  |  |  | 	real_t get_rotation_smoothing_speed() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_rotation_smoothing_enabled(bool p_enabled); | 
					
						
							|  |  |  | 	bool is_rotation_smoothing_enabled() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-18 15:52:29 -03:00
										 |  |  | 	void set_process_callback(Camera2DProcessCallback p_mode); | 
					
						
							|  |  |  | 	Camera2DProcessCallback get_process_callback() const; | 
					
						
							| 
									
										
										
										
											2019-01-06 14:57:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-12 14:47:24 +02:00
										 |  |  | 	void set_enabled(bool p_enabled); | 
					
						
							|  |  |  | 	bool is_enabled() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	void make_current(); | 
					
						
							|  |  |  | 	void clear_current(); | 
					
						
							|  |  |  | 	bool is_current() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	void set_zoom(const Vector2 &p_zoom); | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	Vector2 get_zoom() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Point2 get_camera_screen_center() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-14 15:55:14 -03:00
										 |  |  | 	void set_custom_viewport(Node *p_viewport); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	Node *get_custom_viewport() const; | 
					
						
							| 
									
										
										
										
											2016-09-14 15:55:14 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-10 15:37:49 +02:00
										 |  |  | 	Vector2 get_camera_position() const; | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	void force_update_scroll(); | 
					
						
							| 
									
										
										
										
											2016-06-29 17:39:29 +02:00
										 |  |  | 	void reset_smoothing(); | 
					
						
							| 
									
										
										
										
											2016-06-30 16:07:48 +02:00
										 |  |  | 	void align(); | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-20 17:00:46 -04:00
										 |  |  | 	void set_screen_drawing_enabled(bool enable); | 
					
						
							|  |  |  | 	bool is_screen_drawing_enabled() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_limit_drawing_enabled(bool enable); | 
					
						
							|  |  |  | 	bool is_limit_drawing_enabled() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void set_margin_drawing_enabled(bool enable); | 
					
						
							|  |  |  | 	bool is_margin_drawing_enabled() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | 	Camera2D(); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-11 09:55:38 -03:00
										 |  |  | VARIANT_ENUM_CAST(Camera2D::AnchorMode); | 
					
						
							| 
									
										
										
										
											2021-02-18 15:52:29 -03:00
										 |  |  | VARIANT_ENUM_CAST(Camera2D::Camera2DProcessCallback); | 
					
						
							| 
									
										
										
										
											2015-06-11 09:55:38 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-03 14:39:13 -03:00
										 |  |  | #endif // CAMERA_2D_H
 |