Bläddra i källkod

Attempt to see if this can solve the problem with #13338

Juan Linietsky 7 år sedan
förälder
incheckning
431dfc1458
1 ändrade filer med 11 tillägg och 4 borttagningar
  1. 11 4
      servers/visual/visual_server_scene.cpp

+ 11 - 4
servers/visual/visual_server_scene.cpp

@@ -303,6 +303,17 @@ void VisualServerScene::instance_set_base(RID p_instance, RID p_base) {
 
 
 		VSG::storage->instance_remove_dependency(instance->base, instance);
 		VSG::storage->instance_remove_dependency(instance->base, instance);
 
 
+		if (instance->base_type == VS::INSTANCE_GI_PROBE) {
+			//if gi probe is baking, wait until done baking, else race condition may happen when removing it
+			//from octree
+			InstanceGIProbeData *gi_probe = static_cast<InstanceGIProbeData *>(instance->base_data);
+
+			while (gi_probe->dynamic.updating_stage == GI_UPDATE_STAGE_LIGHTING) {
+				//wait until bake is done if it's baking
+				OS::get_singleton()->delay_usec(1);
+			}
+		}
+
 		if (scenario && instance->octree_id) {
 		if (scenario && instance->octree_id) {
 			scenario->octree.erase(instance->octree_id); //make dependencies generated by the octree go away
 			scenario->octree.erase(instance->octree_id); //make dependencies generated by the octree go away
 			instance->octree_id = 0;
 			instance->octree_id = 0;
@@ -331,10 +342,6 @@ void VisualServerScene::instance_set_base(RID p_instance, RID p_base) {
 
 
 				InstanceGIProbeData *gi_probe = static_cast<InstanceGIProbeData *>(instance->base_data);
 				InstanceGIProbeData *gi_probe = static_cast<InstanceGIProbeData *>(instance->base_data);
 
 
-				while (gi_probe->dynamic.updating_stage == GI_UPDATE_STAGE_LIGHTING) {
-					//wait until bake is done if it's baking
-					OS::get_singleton()->delay_usec(1);
-				}
 				if (gi_probe->update_element.in_list()) {
 				if (gi_probe->update_element.in_list()) {
 					gi_probe_update_list.remove(&gi_probe->update_element);
 					gi_probe_update_list.remove(&gi_probe->update_element);
 				}
 				}