init
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
"""Panels package."""
|
||||
|
||||
from . import vse_panel
|
||||
|
||||
|
||||
def register():
|
||||
vse_panel.register()
|
||||
|
||||
|
||||
def unregister():
|
||||
vse_panel.unregister()
|
||||
@@ -0,0 +1,127 @@
|
||||
"""
|
||||
VSE Panel for Face Mask controls.
|
||||
|
||||
Provides a sidebar panel in the Video Sequence Editor
|
||||
for controlling mask generation and blur application.
|
||||
"""
|
||||
|
||||
import bpy
|
||||
from bpy.types import Panel
|
||||
|
||||
from ..core.async_generator import get_generator
|
||||
|
||||
|
||||
class SEQUENCER_PT_face_mask(Panel):
|
||||
"""Panel for face mask blur controls."""
|
||||
|
||||
bl_label = "Face Mask"
|
||||
bl_idname = "SEQUENCER_PT_face_mask"
|
||||
bl_space_type = 'SEQUENCE_EDITOR'
|
||||
bl_region_type = 'UI'
|
||||
bl_category = "Face Mask"
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
wm = context.window_manager
|
||||
seq_editor = context.scene.sequence_editor
|
||||
# Note: Blender 5.0 uses 'strips' instead of 'sequences'
|
||||
|
||||
generator = get_generator()
|
||||
|
||||
# Show progress if generating
|
||||
if generator.is_running:
|
||||
self._draw_progress(layout, wm, generator)
|
||||
return
|
||||
|
||||
# Show controls if strip selected
|
||||
if seq_editor and seq_editor.active_strip:
|
||||
strip = seq_editor.active_strip
|
||||
|
||||
if strip.type in {'MOVIE', 'IMAGE'}:
|
||||
self._draw_generation_controls(layout, context, strip)
|
||||
self._draw_blur_controls(layout, context, strip)
|
||||
else:
|
||||
layout.label(text="Select a video or image strip")
|
||||
else:
|
||||
layout.label(text="No strip selected")
|
||||
|
||||
def _draw_progress(self, layout, wm, generator):
|
||||
"""Draw progress bar during generation."""
|
||||
box = layout.box()
|
||||
box.label(text="Generating Masks...", icon='RENDER_ANIMATION')
|
||||
|
||||
# Progress bar
|
||||
progress = wm.mask_progress / max(wm.mask_total, 1)
|
||||
box.progress(
|
||||
factor=progress,
|
||||
text=f"Frame {wm.mask_progress} / {wm.mask_total}",
|
||||
)
|
||||
|
||||
# Cancel button
|
||||
box.operator(
|
||||
"sequencer.cancel_mask_generation",
|
||||
text="Cancel",
|
||||
icon='CANCEL',
|
||||
)
|
||||
|
||||
def _draw_generation_controls(self, layout, context, strip):
|
||||
"""Draw mask generation controls."""
|
||||
box = layout.box()
|
||||
box.label(text="Mask Generation", icon='MOD_MASK')
|
||||
|
||||
# Info about selected strip
|
||||
row = box.row()
|
||||
row.label(text=f"Strip: {strip.name}")
|
||||
|
||||
# Check for existing mask
|
||||
seq_editor = context.scene.sequence_editor
|
||||
mask_name = f"{strip.name}_mask"
|
||||
has_mask = mask_name in seq_editor.strips
|
||||
|
||||
if has_mask:
|
||||
row = box.row()
|
||||
row.label(text="✓ Mask exists", icon='CHECKMARK')
|
||||
|
||||
# Generate button
|
||||
op = box.operator(
|
||||
"sequencer.generate_face_mask",
|
||||
text="Generate Face Mask" if not has_mask else "Regenerate Mask",
|
||||
icon='FACE_MAPS',
|
||||
)
|
||||
|
||||
def _draw_blur_controls(self, layout, context, strip):
|
||||
"""Draw blur application controls."""
|
||||
box = layout.box()
|
||||
box.label(text="Blur Application", icon='MATFLUID')
|
||||
|
||||
# Check for mask strip
|
||||
seq_editor = context.scene.sequence_editor
|
||||
mask_name = f"{strip.name}_mask"
|
||||
has_mask = mask_name in seq_editor.strips
|
||||
|
||||
if not has_mask:
|
||||
box.label(text="Generate a mask first", icon='INFO')
|
||||
return
|
||||
|
||||
# Apply blur button
|
||||
op = box.operator(
|
||||
"sequencer.apply_mask_blur",
|
||||
text="Apply Mask Blur",
|
||||
icon='PROP_CON',
|
||||
)
|
||||
|
||||
|
||||
# Registration
|
||||
classes = [
|
||||
SEQUENCER_PT_face_mask,
|
||||
]
|
||||
|
||||
|
||||
def register():
|
||||
for cls in classes:
|
||||
bpy.utils.register_class(cls)
|
||||
|
||||
|
||||
def unregister():
|
||||
for cls in reversed(classes):
|
||||
bpy.utils.unregister_class(cls)
|
||||
Reference in New Issue
Block a user