diff options
Diffstat (limited to 'scene/2d/camera_2d.cpp')
| -rw-r--r-- | scene/2d/camera_2d.cpp | 70 | 
1 files changed, 56 insertions, 14 deletions
diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index e576aa10e0..f33faaabd8 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -44,6 +44,9 @@ void Camera2D::_update_scroll() {  	}  	if (current) { + +		ERR_FAIL_COND( custom_viewport && !ObjectDB::get_instance(custom_viewport_id) ); +  		Matrix32 xform = get_camera_transform();  		if (viewport) { @@ -73,8 +76,9 @@ Matrix32 Camera2D::get_camera_transform()  {  	if (!get_tree())  		return Matrix32(); -	Size2 screen_size = get_viewport_rect().size; -	screen_size=get_viewport_rect().size; +	ERR_FAIL_COND_V( custom_viewport && !ObjectDB::get_instance(custom_viewport_id), Matrix32() ); + +	Size2 screen_size = viewport->get_visible_rect().size;  	Point2 new_camera_pos = get_global_transform().get_origin(); @@ -240,14 +244,10 @@ void Camera2D::_notification(int p_what) {  		case NOTIFICATION_ENTER_TREE: { -			viewport = NULL; -			Node *n=this; -			while(n){ - -				viewport = n->cast_to<Viewport>(); -				if (viewport) -					break; -				n=n->get_parent(); +			if (custom_viewport && ObjectDB::get_instance(custom_viewport_id)) { +				viewport=custom_viewport; +			} else { +				viewport=get_viewport();  			}  			canvas = get_canvas(); @@ -270,8 +270,8 @@ void Camera2D::_notification(int p_what) {  		} break;  		case NOTIFICATION_EXIT_TREE: { -			if (is_current()) { -				if (viewport) { +			if (is_current()) {				 +				if (viewport && !(custom_viewport && !ObjectDB::get_instance(custom_viewport_id))) {  					viewport->set_canvas_transform( Matrix32() );  				}  			} @@ -447,8 +447,10 @@ void Camera2D::reset_smoothing() {  void Camera2D::align() { -	Size2 screen_size = get_viewport_rect().size; -	screen_size=get_viewport_rect().size; +	ERR_FAIL_COND( custom_viewport && !ObjectDB::get_instance(custom_viewport_id) ); + +	Size2 screen_size = viewport->get_visible_rect().size; +  	Point2 current_camera_pos = get_global_transform().get_origin();  	if (anchor_mode==ANCHOR_MODE_DRAG_CENTER) {  		if (h_ofs<0) { @@ -549,6 +551,42 @@ bool Camera2D::is_follow_smoothing_enabled() const {  	return smoothing_enabled;  } +void Camera2D::set_custom_viewport(Node *p_viewport) { +	ERR_FAIL_NULL(p_viewport); +	if (is_inside_tree()) { +		remove_from_group(group_name); +		remove_from_group(canvas_group_name); +	} + +	custom_viewport=p_viewport->cast_to<Viewport>(); + +	if (custom_viewport) { +		custom_viewport_id=custom_viewport->get_instance_ID(); +	} else { +		custom_viewport_id=0; +	} + +	if (is_inside_tree()) { + +		if (custom_viewport) +			viewport=custom_viewport; +		else +			viewport=get_viewport(); + +		RID vp = viewport->get_viewport(); +		group_name = "__cameras_"+itos(vp.get_id()); +		canvas_group_name ="__cameras_c"+itos(canvas.get_id()); +		add_to_group(group_name); +		add_to_group(canvas_group_name); +	} + +} + +Node* Camera2D::get_custom_viewport() const { + +	return custom_viewport; +} +  void Camera2D::_bind_methods() { @@ -597,6 +635,8 @@ void Camera2D::_bind_methods() {  	ObjectTypeDB::bind_method(_MD("set_zoom","zoom"),&Camera2D::set_zoom);  	ObjectTypeDB::bind_method(_MD("get_zoom"),&Camera2D::get_zoom); +	ObjectTypeDB::bind_method(_MD("set_custom_viewport","viewport:Viewport"),&Camera2D::set_custom_viewport); +	ObjectTypeDB::bind_method(_MD("get_custom_viewport:Viewport"),&Camera2D::get_custom_viewport);  	ObjectTypeDB::bind_method(_MD("set_follow_smoothing","follow_smoothing"),&Camera2D::set_follow_smoothing);  	ObjectTypeDB::bind_method(_MD("get_follow_smoothing"),&Camera2D::get_follow_smoothing); @@ -662,6 +702,8 @@ Camera2D::Camera2D() {  	first=true;  	smoothing_enabled=false;  	limit_smoothing_enabled=false; +	custom_viewport=NULL; +	custom_viewport_id=0;  	smoothing=5.0;  	zoom = Vector2(1, 1);  |