feat: integrate render swarm companion app
This commit is contained in:
@@ -16,6 +16,7 @@ classes = (
|
|||||||
properties.SceneRendererSettings,
|
properties.SceneRendererSettings,
|
||||||
operators.SCENERENDERER_OT_render_all,
|
operators.SCENERENDERER_OT_render_all,
|
||||||
operators.SCENERENDERER_OT_cancel_batch,
|
operators.SCENERENDERER_OT_cancel_batch,
|
||||||
|
operators.SCENERENDERER_OT_launch_swarm,
|
||||||
panel.SCENERENDERER_PT_panel,
|
panel.SCENERENDERER_PT_panel,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -180,6 +180,53 @@ class SCENERENDERER_OT_cancel_batch(bpy.types.Operator):
|
|||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
|
class SCENERENDERER_OT_launch_swarm(bpy.types.Operator):
|
||||||
|
bl_idname = "scenerenderer.launch_swarm"
|
||||||
|
bl_label = "Launch Render Swarm"
|
||||||
|
bl_description = "Start the Render Swarm Companion App as Host"
|
||||||
|
|
||||||
|
def execute(self, context):
|
||||||
|
# Ensure file is saved
|
||||||
|
if not bpy.data.is_saved:
|
||||||
|
self.report({'ERROR'}, "Please save your .blend file first!")
|
||||||
|
return {'CANCELLED'}
|
||||||
|
|
||||||
|
bpy.ops.wm.save_mainfile()
|
||||||
|
|
||||||
|
filepath = bpy.data.filepath
|
||||||
|
render_dir = bpy.path.abspath("//renders")
|
||||||
|
os.makedirs(render_dir, exist_ok=True)
|
||||||
|
|
||||||
|
# Determine path to swarm app
|
||||||
|
swarm_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "scene-renderer-swarm"))
|
||||||
|
if not os.path.exists(swarm_dir):
|
||||||
|
self.report({'ERROR'}, f"Swarm App not found at {swarm_dir}")
|
||||||
|
return {'CANCELLED'}
|
||||||
|
|
||||||
|
import platform
|
||||||
|
if platform.system() == "Windows":
|
||||||
|
script = os.path.join(swarm_dir, "run.bat")
|
||||||
|
else:
|
||||||
|
script = os.path.join(swarm_dir, "run.sh")
|
||||||
|
|
||||||
|
cmd = [
|
||||||
|
script,
|
||||||
|
"--blend", filepath,
|
||||||
|
"--out", render_dir,
|
||||||
|
"--start", str(context.scene.frame_start),
|
||||||
|
"--end", str(context.scene.frame_end)
|
||||||
|
]
|
||||||
|
|
||||||
|
try:
|
||||||
|
# We use Popen so we don't block Blender
|
||||||
|
subprocess.Popen(cmd, cwd=swarm_dir)
|
||||||
|
self.report({'INFO'}, "Render Swarm Host launched!")
|
||||||
|
except Exception as e:
|
||||||
|
self.report({'ERROR'}, f"Failed to launch Swarm: {e}")
|
||||||
|
|
||||||
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
_FORMAT_TO_EXT = {
|
_FORMAT_TO_EXT = {
|
||||||
'PNG': '.png',
|
'PNG': '.png',
|
||||||
'JPEG': '.jpg',
|
'JPEG': '.jpg',
|
||||||
|
|||||||
@@ -120,4 +120,9 @@ class SCENERENDERER_PT_panel(bpy.types.Panel):
|
|||||||
op1 = row.operator("scenerenderer.render_all", text="Current Scene", icon='RENDER_STILL')
|
op1 = row.operator("scenerenderer.render_all", text="Current Scene", icon='RENDER_STILL')
|
||||||
op1.render_only_current = True
|
op1.render_only_current = True
|
||||||
op2 = row.operator("scenerenderer.render_all", text="All Scenes", icon='RENDER_ANIMATION')
|
op2 = row.operator("scenerenderer.render_all", text="All Scenes", icon='RENDER_ANIMATION')
|
||||||
op2.render_only_current = False
|
op2.render_only_current = False
|
||||||
|
|
||||||
|
layout.separator()
|
||||||
|
row = layout.row(align=True)
|
||||||
|
row.scale_y = 2.0
|
||||||
|
row.operator("scenerenderer.launch_swarm", text="Start Render Swarm (Network)", icon='NODETREE')
|
||||||
Reference in New Issue
Block a user