gp_render/OP_scene_switch.py

124 lines
3.9 KiB
Python
Raw Permalink Normal View History

import bpy
from .import fn
from .constant import RD_SCENE_NAME
class GPEXP_OT_render_scene_switch(bpy.types.Operator):
bl_idname = "gp.render_scene_switch"
bl_label = "Render Scene Switch"
bl_description = "Switch between render"
bl_options = {"REGISTER"}
@classmethod
def poll(cls, context):
return True
scene : bpy.props.StringProperty(default='', options={'SKIP_SAVE'})
def execute(self, context):
scenes = bpy.data.scenes
if len(scenes) < 2:
self.report({'ERROR'},'No other scene to go to')
return {"CANCELLED"}
2023-01-18 14:28:27 +01:00
## Case where a scene name is passed
if self.scene:
scn = bpy.data.scenes.get(self.scene)
if not scn:
self.report({'ERROR'},f'No scene "{self.scene}"')
return {"CANCELLED"}
self.report({'INFO'},f'Switched to scene "{scn.name}"')
bpy.context.window.scene = scn
return {"FINISHED"}
if context.scene.name == RD_SCENE_NAME:
scn = scenes.get('Scene')
if not scn: # get the next available scene
self.report({'WARNING'},'No scene named "Scene"')
slist = [s.name for s in scenes]
scn = scenes[(slist.index(bpy.context.scene.name) + 1) % len(scenes)]
2023-01-18 14:28:27 +01:00
else:
scn = fn.get_render_scene(create=False)
if not scn:
self.report({'ERROR'},f'No "{RD_SCENE_NAME}" scene yet')
return {"CANCELLED"}
self.report({'INFO'},f'Switched to scene "{scn.name}"')
bpy.context.window.scene = scn
return {"FINISHED"}
class GPEXP_OT_swap_render_cams(bpy.types.Operator):
bl_idname = "gp.swap_render_cams"
bl_label = "Swap Cameras"
bl_description = "Toggle between anim and bg cam"
bl_options = {"REGISTER"}
def execute(self, context):
anim_cam = bpy.context.scene.objects.get('anim_cam')
bg_cam = bpy.context.scene.objects.get('bg_cam')
if not anim_cam or not bg_cam:
self.report({'ERROR'}, 'anim_cam or bg_cam is missing')
return {"CANCELLED"}
2023-01-18 14:28:27 +01:00
cam = context.scene.camera
if not cam:
context.scene.camera = anim_cam
fn.set_resolution_from_cam_prop()
return {"FINISHED"}
in_draw = False
if cam.parent and cam.name in ('draw_cam', 'action_cam'):
if cam.name == 'draw_cam':
draw_cam = cam
in_draw = True
cam = cam.parent
## swap
# context.scene.camera = bg_cam if cam is anim_cam else anim_cam
if cam is anim_cam:
main = context.scene.camera = bg_cam
anim_cam.hide_viewport = True
bg_cam.hide_viewport = False
else:
main = context.scene.camera = anim_cam
anim_cam.hide_viewport = False
bg_cam.hide_viewport = True
if in_draw:
draw_cam.parent = main
draw_cam.data = main.data
# back in draw_cam
context.scene.camera = draw_cam
bg_cam.hide_viewport = anim_cam.hide_viewport = True
# set res
ret = fn.set_resolution_from_cam_prop(main)
if ret:
self.report({ret[0]}, ret[1])
return {"FINISHED"}
class GPEXP_OT_set_gp_render_workspace(bpy.types.Operator):
bl_idname = "gp.set_gp_render_workspace"
bl_label = 'Set GP Render Workspace'
bl_description = "Switch to GP render workspace, append and activate if not exists"
bl_options = {'REGISTER', 'INTERNAL'}
def execute(self, context):
fn.activate_workspace(name='GP Render', context=context)
return {"FINISHED"}
classes=(
GPEXP_OT_render_scene_switch,
GPEXP_OT_swap_render_cams,
GPEXP_OT_set_gp_render_workspace,
)
2023-01-18 14:28:27 +01:00
def register():
for cls in classes:
bpy.utils.register_class(cls)
def unregister():
for cls in reversed(classes):
bpy.utils.unregister_class(cls)