import bpy from .models import BEN2_MODEL, MODELS from .operators import active_job from .runtime import model_ready, runtime_ready class RuntimeModelsPanel(bpy.types.Panel): bl_label = "Setup" bl_idname = "SNAPFORM_PT_runtime_models" bl_space_type = "VIEW_3D" bl_region_type = "UI" bl_category = "SnapForm" def draw(self, _context): layout = self.layout running = active_job() is not None if not runtime_ready(): layout.label(text="Runtime is not installed", icon="ERROR") install_row = layout.row() install_row.enabled = not running operator = install_row.operator( "snapform.run_job", text="Install Runtime", icon="IMPORT", ) operator.job_type = "INSTALL_RUNTIME" for model in MODELS.values(): self._draw_model(layout, model, running) self._draw_model(layout, BEN2_MODEL, running) def _draw_model(self, layout, model, running): row = layout.row(align=True) row.label(text=model.label) if model_ready(model.key): row.label(text="Ready", icon="CHECKMARK") else: download_row = row.row(align=True) download_row.enabled = runtime_ready() and not running operator = download_row.operator( "snapform.run_job", text="Download", icon="IMPORT", ) operator.job_type = "DOWNLOAD_MODEL" operator.model_key = model.key class DebugPanel(bpy.types.Panel): bl_label = "Debug" bl_idname = "SNAPFORM_PT_debug" bl_space_type = "VIEW_3D" bl_region_type = "UI" bl_category = "SnapForm" bl_options = {"DEFAULT_CLOSED"} def draw(self, context): layout = self.layout settings = context.scene.snapform_settings layout.prop(settings, "export_format") model_property = ( "gs_model" if settings.export_format == "gs_ply" else "model" ) layout.prop(settings, model_property) layout.prop(settings, "input_path") input_path = bpy.path.abspath(settings.input_path) if input_path.lower().endswith( ( ".mp4", ".mov", ".avi", ".mkv", ".webm", ".m4v", ".mts", ".mpg", ".mpeg", ) ): layout.prop(settings, "video_frames") layout.prop(settings, "device") layout.prop(settings, "process_res") layout.prop(settings, "process_res_method") layout.prop(settings, "use_ray_pose") layout.prop(settings, "ref_view_strategy") if settings.export_format == "glb": glb_box = layout.box() glb_box.label(text="GLB Settings") glb_box.prop(settings, "conf_thresh_percentile") glb_box.prop(settings, "num_max_points") glb_box.prop(settings, "show_cameras") elif settings.export_format == "gs_ply": ply_box = layout.box() ply_box.label(text="PLY (3DGS) Settings") ply_box.prop(settings, "gs_views_interval") export_row = layout.row() export_row.enabled = active_job() is None operator = export_row.operator( "snapform.run_job", text="Export", icon="EXPORT", ) operator.job_type = "RECONSTRUCT" background_box = layout.box() background_box.label(text="BEN2 Background Removal") background_box.prop(settings, "background_input_path") background_row = background_box.row() background_row.enabled = active_job() is None operator = background_row.operator( "snapform.run_job", text="Remove Background", icon="IMAGE_ALPHA", ) operator.job_type = "REMOVE_BACKGROUND"