47b5d42bb5
M1 — dead code removed: - Delete blender-renderer/ and threejs-renderer/ source files - Remove PIL/Pillow fallback block from step_processor.py (_generate_thumbnail_placeholder, _finalise_image JPG path) - Remove stl_quality param from render_blender.py, render_still_task, render_turntable_task (was always "low"; hardcode deflection values) - render_turntable_task now reads scene_linear/angular_deflection from system_settings (consistent with export_glb.py pipeline) M3 — blender_render.py split from 263 → 68 lines: - _blender_args.py: parse_args() — all 25 positional + named args - _blender_scene_setup.py: setup_scene() — MODE A/B including USD import - _blender_render_config.py: configure_and_render() — engine + output Post-review fixes: - _db_engine.dispose() after settings read in render_turntable_task - _finalise_image() fmt param removed (always PNG; PIL never installed) - _blender_import.py committed together with new submodules to satisfy import_usd_file dependency Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
"""Engine configuration and final render call for blender_render.py."""
|
|
import sys
|
|
from typing import Callable
|
|
|
|
import bpy # type: ignore[import]
|
|
|
|
from _blender_gpu import configure_engine
|
|
|
|
|
|
def configure_and_render(args, early_gpu_type, use_template: bool, lap_fn: Callable[[str], None]) -> None:
|
|
"""Configure render engine, colour management, resolution, then render.
|
|
|
|
Reads engine, samples, device, denoiser, and output settings from args.
|
|
lap_fn is called with label strings at timing checkpoints.
|
|
"""
|
|
scene = bpy.context.scene
|
|
configure_engine(
|
|
scene, args.engine, args.samples, args.cycles_device, early_gpu_type,
|
|
args.noise_threshold, args.denoiser,
|
|
args.denoising_input_passes, args.denoising_prefilter,
|
|
args.denoising_quality, args.denoising_use_gpu,
|
|
)
|
|
|
|
if not use_template:
|
|
scene.view_settings.view_transform = "Standard"
|
|
scene.view_settings.exposure = 0.0
|
|
scene.view_settings.gamma = 1.0
|
|
try:
|
|
scene.view_settings.look = "None"
|
|
except Exception:
|
|
pass
|
|
|
|
scene.render.resolution_x = args.width
|
|
scene.render.resolution_y = args.height
|
|
scene.render.resolution_percentage = 100
|
|
scene.render.image_settings.file_format = "PNG"
|
|
scene.render.filepath = args.output_path
|
|
scene.render.film_transparent = args.transparent_bg
|
|
|
|
if scene.render.engine == "CYCLES":
|
|
cprefs = bpy.context.preferences.addons["cycles"].preferences
|
|
print(
|
|
f"[blender_render] VERIFY: engine={scene.render.engine}, "
|
|
f"cycles.device={scene.cycles.device}, "
|
|
f"compute_device_type={cprefs.compute_device_type}, "
|
|
f"gpu_devices={[(d.name, d.type, d.use) for d in cprefs.devices if d.type != 'CPU']}",
|
|
flush=True,
|
|
)
|
|
|
|
lap_fn("pre_render_setup")
|
|
print(f"[blender_render] Rendering → {args.output_path} (Blender {bpy.app.version_string})", flush=True)
|
|
sys.stdout.flush()
|
|
bpy.ops.render.render(write_still=True)
|
|
print("[blender_render] render done.", flush=True)
|
|
lap_fn("gpu_render")
|