-Fix crash opening and closing the scene, closes #3491
This commit is contained in:
parent
987bfb4b5e
commit
53e237dfe4
3 changed files with 41 additions and 20 deletions
|
@ -213,8 +213,7 @@ void Camera::_notification(int p_what) {
|
||||||
case NOTIFICATION_ENTER_WORLD: {
|
case NOTIFICATION_ENTER_WORLD: {
|
||||||
|
|
||||||
|
|
||||||
bool first_camera = get_viewport()->cameras.size()==0;
|
bool first_camera = get_viewport()->_camera_add(this);
|
||||||
get_viewport()->cameras.insert(this);
|
|
||||||
if (!get_tree()->is_node_being_edited(this) && (current || first_camera))
|
if (!get_tree()->is_node_being_edited(this) && (current || first_camera))
|
||||||
make_current();
|
make_current();
|
||||||
|
|
||||||
|
@ -236,7 +235,7 @@ void Camera::_notification(int p_what) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get_viewport()->cameras.erase(this);
|
get_viewport()->_camera_remove(this);
|
||||||
|
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
@ -304,7 +303,7 @@ void Camera::make_current() {
|
||||||
if (!is_inside_tree())
|
if (!is_inside_tree())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
get_viewport()->_set_camera(this);
|
get_viewport()->_camera_set(this);
|
||||||
|
|
||||||
//get_scene()->call_group(SceneMainLoop::GROUP_CALL_REALTIME,camera_group,"_camera_make_current",this);
|
//get_scene()->call_group(SceneMainLoop::GROUP_CALL_REALTIME,camera_group,"_camera_make_current",this);
|
||||||
}
|
}
|
||||||
|
@ -319,20 +318,8 @@ void Camera::clear_current() {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (get_viewport()->get_camera()==this) {
|
if (get_viewport()->get_camera()==this) {
|
||||||
get_viewport()->_set_camera(NULL);
|
get_viewport()->_camera_set(NULL);
|
||||||
//a group is used beause this needs to be in order to be deterministic
|
get_viewport()->_camera_make_next_current(this);
|
||||||
|
|
||||||
for (Set<Camera*>::Element *E=get_viewport()->cameras.front();E;E=E->next()) {
|
|
||||||
|
|
||||||
if (this==E->get())
|
|
||||||
continue;
|
|
||||||
if (!E->get()->is_inside_tree())
|
|
||||||
continue;
|
|
||||||
if (get_viewport()->get_camera()!=NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
E->get()->make_current();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -855,7 +855,7 @@ void Viewport::_camera_transform_changed_notify() {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewport::_set_camera(Camera* p_camera) {
|
void Viewport::_camera_set(Camera* p_camera) {
|
||||||
|
|
||||||
#ifndef _3D_DISABLED
|
#ifndef _3D_DISABLED
|
||||||
|
|
||||||
|
@ -880,6 +880,36 @@ void Viewport::_set_camera(Camera* p_camera) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Viewport::_camera_add(Camera* p_camera) {
|
||||||
|
|
||||||
|
cameras.insert(p_camera);
|
||||||
|
return cameras.size()==1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Viewport::_camera_remove(Camera* p_camera) {
|
||||||
|
|
||||||
|
cameras.erase(p_camera);
|
||||||
|
if (camera==p_camera) {
|
||||||
|
camera=NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Viewport::_camera_make_next_current(Camera* p_exclude) {
|
||||||
|
|
||||||
|
for(Set<Camera*>::Element *E=cameras.front();E;E=E->next()) {
|
||||||
|
|
||||||
|
if (p_exclude==E->get())
|
||||||
|
continue;
|
||||||
|
if (!E->get()->is_inside_tree())
|
||||||
|
continue;
|
||||||
|
if (camera!=NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
E->get()->make_current();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Viewport::set_transparent_background(bool p_enable) {
|
void Viewport::set_transparent_background(bool p_enable) {
|
||||||
|
|
||||||
|
|
|
@ -264,7 +264,11 @@ friend class Control;
|
||||||
|
|
||||||
friend class Camera;
|
friend class Camera;
|
||||||
void _camera_transform_changed_notify();
|
void _camera_transform_changed_notify();
|
||||||
void _set_camera(Camera* p_camera);
|
void _camera_set(Camera* p_camera);
|
||||||
|
bool _camera_add(Camera* p_camera); //true if first
|
||||||
|
void _camera_remove(Camera* p_camera);
|
||||||
|
void _camera_make_next_current(Camera* p_exclude);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _notification(int p_what);
|
void _notification(int p_what);
|
||||||
|
|
Loading…
Reference in a new issue