fix(render): cache settings at batch start so they apply consistently to all scenes

This commit is contained in:
2026-06-02 23:08:33 +02:00
parent 634700e4db
commit 49cd08494b

View File

@@ -82,7 +82,7 @@ class SCENERENDERER_OT_render_all(bpy.types.Operator):
bpy.app.handlers.render_cancel.remove(on_render_cancel) bpy.app.handlers.render_cancel.remove(on_render_cancel)
def _render_scene(self, context, scene_name): def _render_scene(self, context, scene_name):
settings = context.scene.scene_renderer settings = SCENERENDERER_OT_render_all._cached_settings
scene = bpy.data.scenes.get(scene_name) scene = bpy.data.scenes.get(scene_name)
if not scene: if not scene:
print(f" [SKIP] Scene not found: {scene_name}") print(f" [SKIP] Scene not found: {scene_name}")
@@ -110,26 +110,26 @@ class SCENERENDERER_OT_render_all(bpy.types.Operator):
r.film_transparent = True r.film_transparent = True
c = scene.cycles c = scene.cycles
c.samples = 1 if settings.test_mode else settings.samples c.samples = 1 if settings["test_mode"] else settings["samples"]
if settings.exposure != 0.0: if settings["exposure"] != 0.0:
scene.view_settings.exposure = settings.exposure scene.view_settings.exposure = settings["exposure"]
scene.cycles.film_exposure = 2.0 ** settings.exposure scene.cycles.film_exposure = 2.0 ** settings["exposure"]
if settings.look != 'None': if settings["look"] != 'None':
scene.view_settings.look = settings.look scene.view_settings.look = settings["look"]
if settings.test_mode: if settings["test_mode"]:
r.resolution_percentage = 10 r.resolution_percentage = 10
render_dir = bpy.path.abspath("//renders") render_dir = bpy.path.abspath("//renders")
if settings.test_mode: if settings["test_mode"]:
render_dir = os.path.join(render_dir, "test") render_dir = os.path.join(render_dir, "test")
os.makedirs(render_dir, exist_ok=True) os.makedirs(render_dir, exist_ok=True)
safe_name = scene.name.replace("/", "_").replace("\\", "_").replace(":", "_").strip() safe_name = scene.name.replace("/", "_").replace("\\", "_").replace(":", "_").strip()
output_path = os.path.join(render_dir, safe_name) output_path = os.path.join(render_dir, safe_name)
if settings.skip_existing and os.path.exists(output_path + ".png"): if settings["skip_existing"] and os.path.exists(output_path + ".png"):
print(f" [SKIP] Already exists: {safe_name}.png") print(f" [SKIP] Already exists: {safe_name}.png")
SCENERENDERER_OT_render_all._is_rendering = False SCENERENDERER_OT_render_all._is_rendering = False
return return
@@ -161,6 +161,17 @@ class SCENERENDERER_OT_render_all(bpy.types.Operator):
def execute(self, context): def execute(self, context):
settings = context.scene.scene_renderer settings = context.scene.scene_renderer
# Cache the settings exactly as they were when the user pressed "Render All Scenes".
# This prevents the settings from reverting to defaults when Blender switches the active scene context.
SCENERENDERER_OT_render_all._cached_settings = {
"test_mode": settings.test_mode,
"skip_existing": settings.skip_existing,
"use_cpu": settings.use_cpu,
"samples": settings.samples,
"exposure": settings.exposure,
"look": settings.look,
}
if on_render_complete not in bpy.app.handlers.render_complete: if on_render_complete not in bpy.app.handlers.render_complete:
bpy.app.handlers.render_complete.append(on_render_complete) bpy.app.handlers.render_complete.append(on_render_complete)