Merge pull request #6486 from Faless/viewport2d

Restore Viewport::set_world_2d() functionality (2D Split Screen)
This commit is contained in:
Juan Linietsky 2016-09-14 14:32:53 -03:00 committed by GitHub
commit 51466ae5d2
2 changed files with 37 additions and 25 deletions

View file

@ -359,13 +359,7 @@ void Viewport::_notification(int p_what) {
_update_listener_2d(); _update_listener_2d();
_update_rect(); _update_rect();
if (world_2d.is_valid()) { find_world_2d()->_register_viewport(this,Rect2());
find_world_2d()->_register_viewport(this,Rect2());
//best to defer this and not do it here, as it can annoy a lot of setup logic if user
//adds a node and then moves it, will get enter/exit screen/viewport notifications
//unnecesarily
// update_worlds();
}
add_to_group("_viewports"); add_to_group("_viewports");
if (get_tree()->is_debugging_collisions_hint()) { if (get_tree()->is_debugging_collisions_hint()) {
@ -1001,19 +995,34 @@ bool Viewport::has_transparent_background() const {
return transparent_bg; return transparent_bg;
} }
#if 0
void Viewport::set_world_2d(const Ref<World2D>& p_world_2d) { void Viewport::set_world_2d(const Ref<World2D>& p_world_2d) {
if (world_2d==p_world_2d)
return;
world_2d=p_world_2d; if (parent && parent->find_world_2d()==p_world_2d) {
_update_listener_2d(); WARN_PRINT("Unable to use parent world as world_2d");
return;
if (is_inside_scene()) {
if (current_canvas.is_valid())
VisualServer::get_singleton()->viewport_remove_canvas(viewport,current_canvas);
current_canvas=find_world_2d()->get_canvas();
VisualServer::get_singleton()->viewport_attach_canvas(viewport,current_canvas);
} }
if (is_inside_tree()) {
find_world_2d()->_remove_viewport(this);
VisualServer::get_singleton()->viewport_remove_canvas(viewport,current_canvas);
}
if (p_world_2d.is_valid())
world_2d=p_world_2d;
else {
WARN_PRINT("Invalid world");
world_2d=Ref<World2D>( memnew( World2D ));
}
_update_listener_2d();
if (is_inside_tree()) {
current_canvas=find_world_2d()->get_canvas();
VisualServer::get_singleton()->viewport_attach_canvas(viewport,current_canvas);
find_world_2d()->_register_viewport(this,Rect2());
}
} }
Ref<World2D> Viewport::find_world_2d() const{ Ref<World2D> Viewport::find_world_2d() const{
@ -1025,13 +1034,6 @@ Ref<World2D> Viewport::find_world_2d() const{
else else
return Ref<World2D>(); return Ref<World2D>();
} }
#endif
Ref<World2D> Viewport::find_world_2d() const{
return world_2d;
}
void Viewport::_propagate_enter_world(Node *p_node) { void Viewport::_propagate_enter_world(Node *p_node) {
@ -1141,6 +1143,11 @@ Ref<World> Viewport::get_world() const{
return world; return world;
} }
Ref<World2D> Viewport::get_world_2d() const{
return world_2d;
}
Ref<World> Viewport::find_world() const{ Ref<World> Viewport::find_world() const{
if (own_world.is_valid()) if (own_world.is_valid())
@ -1303,6 +1310,9 @@ void Viewport::render_target_clear() {
void Viewport::set_render_target_filter(bool p_enable) { void Viewport::set_render_target_filter(bool p_enable) {
if(!render_target)
return;
render_target_texture->set_flags(p_enable?int(Texture::FLAG_FILTER):int(0)); render_target_texture->set_flags(p_enable?int(Texture::FLAG_FILTER):int(0));
} }
@ -2587,8 +2597,8 @@ void Viewport::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_rect","rect"), &Viewport::set_rect); ObjectTypeDB::bind_method(_MD("set_rect","rect"), &Viewport::set_rect);
ObjectTypeDB::bind_method(_MD("get_rect"), &Viewport::get_rect); ObjectTypeDB::bind_method(_MD("get_rect"), &Viewport::get_rect);
//ObjectTypeDB::bind_method(_MD("set_world_2d","world_2d:World2D"), &Viewport::set_world_2d); ObjectTypeDB::bind_method(_MD("set_world_2d","world_2d:World2D"), &Viewport::set_world_2d);
//ObjectTypeDB::bind_method(_MD("get_world_2d:World2D"), &Viewport::get_world_2d); ObjectTypeDB::bind_method(_MD("get_world_2d:World2D"), &Viewport::get_world_2d);
ObjectTypeDB::bind_method(_MD("find_world_2d:World2D"), &Viewport::find_world_2d); ObjectTypeDB::bind_method(_MD("find_world_2d:World2D"), &Viewport::find_world_2d);
ObjectTypeDB::bind_method(_MD("set_world","world:World"), &Viewport::set_world); ObjectTypeDB::bind_method(_MD("set_world","world:World"), &Viewport::set_world);
ObjectTypeDB::bind_method(_MD("get_world:World"), &Viewport::get_world); ObjectTypeDB::bind_method(_MD("get_world:World"), &Viewport::get_world);

View file

@ -305,9 +305,11 @@ public:
RID get_viewport() const; RID get_viewport() const;
void set_world(const Ref<World>& p_world); void set_world(const Ref<World>& p_world);
void set_world_2d(const Ref<World2D>& p_world_2d);
Ref<World> get_world() const; Ref<World> get_world() const;
Ref<World> find_world() const; Ref<World> find_world() const;
Ref<World2D> get_world_2d() const;
Ref<World2D> find_world_2d() const; Ref<World2D> find_world_2d() const;