|
@@ -41,11 +41,26 @@ AABB VisualInstance::get_transformed_aabb() const {
|
|
|
|
|
|
void VisualInstance::_update_visibility() {
|
|
void VisualInstance::_update_visibility() {
|
|
|
|
|
|
- if (!is_inside_tree())
|
|
|
|
|
|
+ if (!is_inside_tree()) {
|
|
return;
|
|
return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ bool visible = is_visible_in_tree();
|
|
|
|
+
|
|
|
|
+ // keep a quick flag available in each node.
|
|
|
|
+ // no need to call is_visible_in_tree all over the place,
|
|
|
|
+ // providing it is propagated with a notification.
|
|
|
|
+ bool already_visible = (_get_spatial_flags() & SPATIAL_FLAG_VI_VISIBLE) != 0;
|
|
|
|
+ _set_spatial_flag(SPATIAL_FLAG_VI_VISIBLE, visible);
|
|
|
|
+
|
|
|
|
+ // if making visible, make sure the visual server is up to date with the transform
|
|
|
|
+ if (visible && (!already_visible)) {
|
|
|
|
+ Transform gt = get_global_transform();
|
|
|
|
+ VisualServer::get_singleton()->instance_set_transform(instance, gt);
|
|
|
|
+ }
|
|
|
|
|
|
_change_notify("visible");
|
|
_change_notify("visible");
|
|
- VS::get_singleton()->instance_set_visible(get_instance(), is_visible_in_tree());
|
|
|
|
|
|
+ VS::get_singleton()->instance_set_visible(get_instance(), visible);
|
|
}
|
|
}
|
|
|
|
|
|
void VisualInstance::_notification(int p_what) {
|
|
void VisualInstance::_notification(int p_what) {
|
|
@@ -67,8 +82,10 @@ void VisualInstance::_notification(int p_what) {
|
|
} break;
|
|
} break;
|
|
case NOTIFICATION_TRANSFORM_CHANGED: {
|
|
case NOTIFICATION_TRANSFORM_CHANGED: {
|
|
|
|
|
|
- Transform gt = get_global_transform();
|
|
|
|
- VisualServer::get_singleton()->instance_set_transform(instance, gt);
|
|
|
|
|
|
+ if (_get_spatial_flags() & SPATIAL_FLAG_VI_VISIBLE) {
|
|
|
|
+ Transform gt = get_global_transform();
|
|
|
|
+ VisualServer::get_singleton()->instance_set_transform(instance, gt);
|
|
|
|
+ }
|
|
} break;
|
|
} break;
|
|
case NOTIFICATION_EXIT_WORLD: {
|
|
case NOTIFICATION_EXIT_WORLD: {
|
|
|
|
|
|
@@ -76,6 +93,10 @@ void VisualInstance::_notification(int p_what) {
|
|
VisualServer::get_singleton()->instance_attach_skeleton(instance, RID());
|
|
VisualServer::get_singleton()->instance_attach_skeleton(instance, RID());
|
|
//VS::get_singleton()->instance_geometry_set_baked_light_sampler(instance, RID() );
|
|
//VS::get_singleton()->instance_geometry_set_baked_light_sampler(instance, RID() );
|
|
|
|
|
|
|
|
+ // the vi visible flag is always set to invisible when outside the tree,
|
|
|
|
+ // so it can detect re-entering the tree and becoming visible, and send
|
|
|
|
+ // the transform to the visual server
|
|
|
|
+ _set_spatial_flag(SPATIAL_FLAG_VI_VISIBLE, false);
|
|
} break;
|
|
} break;
|
|
case NOTIFICATION_VISIBILITY_CHANGED: {
|
|
case NOTIFICATION_VISIBILITY_CHANGED: {
|
|
|
|
|