Pārlūkot izejas kodu

Showing and hiding geometry updates shadows

Showing and hiding geometry nodes was not showing or hiding their respective shadows. This fixes this by marking any affected lights as dirty.
Fixes #29856
lawnjelly 6 gadi atpakaļ
vecāks
revīzija
236ce550c0
1 mainītis faili ar 12 papildinājumiem un 0 dzēšanām
  1. 12 0
      servers/visual/visual_server_scene.cpp

+ 12 - 0
servers/visual/visual_server_scene.cpp

@@ -660,6 +660,18 @@ void VisualServerScene::instance_set_visible(RID p_instance, bool p_visible) {
 
 	instance->visible = p_visible;
 
+	// when showing or hiding geometry, lights must be kept up to date to show / hide shadows
+	if ((1 << instance->base_type) & VS::INSTANCE_GEOMETRY_MASK) {
+		InstanceGeometryData *geom = static_cast<InstanceGeometryData *>(instance->base_data);
+
+		if (geom->can_cast_shadows) {
+			for (List<Instance *>::Element *E = geom->lighting.front(); E; E = E->next()) {
+				InstanceLightData *light = static_cast<InstanceLightData *>(E->get()->base_data);
+				light->shadow_dirty = true;
+			}
+		}
+	}
+
 	switch (instance->base_type) {
 		case VS::INSTANCE_LIGHT: {
 			if (VSG::storage->light_get_type(instance->base) != VS::LIGHT_DIRECTIONAL && instance->octree_id && instance->scenario) {