Browse Source

Setting visibility on GridMap now works. Closes #907.

Basically, `GridMap` wasn't reacting to the
`NOTIFICATION_VISIBILITY_CHANGED` event. This reacts to such events and
walks over the set of `Octants` and all of their `MultiMeshInstances` to
set their visibility on the `VisualServer`.
David Saltares 8 years ago
parent
commit
f43a0ef327
2 changed files with 20 additions and 0 deletions
  1. 19 0
      modules/gridmap/grid_map.cpp
  2. 1 0
      modules/gridmap/grid_map.h

+ 19 - 0
modules/gridmap/grid_map.cpp

@@ -655,6 +655,24 @@ void GridMap::_notification(int p_what) {
 			//_update_area_instances();
 
 		} break;
+		case NOTIFICATION_VISIBILITY_CHANGED: {
+			_update_visibility();
+		} break;
+	}
+}
+
+void GridMap::_update_visibility() {
+	if (!is_inside_tree())
+		return;
+
+	_change_notify("visible");
+
+	for (Map<OctantKey, Octant *>::Element *e = octant_map.front(); e; e = e->next()) {
+		Octant *octant = e->value();
+		for (int i = 0; i < octant->multimesh_instances.size(); i++) {
+			Octant::MultimeshInstance &mi = octant->multimesh_instances[i];
+			VS::get_singleton()->instance_set_visible(mi.instance, is_visible());
+		}
 	}
 }
 
@@ -720,6 +738,7 @@ void GridMap::_update_octants_callback() {
 		to_delete.pop_back();
 	}
 
+	_update_visibility();
 	awaiting_update = false;
 }
 

+ 1 - 0
modules/gridmap/grid_map.h

@@ -190,6 +190,7 @@ protected:
 	void _get_property_list(List<PropertyInfo> *p_list) const;
 
 	void _notification(int p_what);
+	void _update_visibility();
 	static void _bind_methods();
 
 public: