camera swap
0.3.4: feat: swap cams button, code copied from `bg_plane_manager`
This commit is contained in:
		
							parent
							
								
									3c37fb7dc1
								
							
						
					
					
						commit
						22d9d53626
					
				@ -12,6 +12,10 @@ Activate / deactivate layer opaticty according to prefix
 | 
				
			|||||||
Activate / deactivate all masks using MA layers
 | 
					Activate / deactivate all masks using MA layers
 | 
				
			||||||
-->
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					0.3.4:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					feat: swap cams button, code copied from `bg_plane_manager`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
0.3.3:
 | 
					0.3.3:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fix: norm name : lowercase first (else bad naming break prefix)
 | 
					fix: norm name : lowercase first (else bad naming break prefix)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,5 @@
 | 
				
			|||||||
import bpy
 | 
					import bpy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
class GPEXP_OT_render_scene_switch(bpy.types.Operator):
 | 
					class GPEXP_OT_render_scene_switch(bpy.types.Operator):
 | 
				
			||||||
    bl_idname = "gp.render_scene_switch"
 | 
					    bl_idname = "gp.render_scene_switch"
 | 
				
			||||||
    bl_label = "Render Scene Switch"
 | 
					    bl_label = "Render Scene Switch"
 | 
				
			||||||
@ -37,8 +36,83 @@ class GPEXP_OT_render_scene_switch(bpy.types.Operator):
 | 
				
			|||||||
        bpy.context.window.scene = scn
 | 
					        bpy.context.window.scene = scn
 | 
				
			||||||
        return {"FINISHED"}
 | 
					        return {"FINISHED"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def set_resolution_from_cam_prop(cam=None):
 | 
				
			||||||
 | 
					    if not cam:
 | 
				
			||||||
 | 
					        cam = bpy.context.scene.camera
 | 
				
			||||||
 | 
					    if not cam:
 | 
				
			||||||
 | 
					        return ('ERROR', 'No active camera')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    res = cam.get('resolution')
 | 
				
			||||||
 | 
					    if not res:
 | 
				
			||||||
 | 
					        return ('ERROR', 'Cam has no resolution attribute')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rd = bpy.context.scene.render
 | 
				
			||||||
 | 
					    if rd.resolution_x == res[0] and rd.resolution_y == res[1]:
 | 
				
			||||||
 | 
					        return ('INFO', f'Resolution already at {res[0]}x{res[1]}')
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        rd.resolution_x, rd.resolution_y = res[0], res[1]
 | 
				
			||||||
 | 
					        return ('INFO', f'Resolution to {res[0]}x{res[1]}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    def poll(cls, context):
 | 
				
			||||||
 | 
					        return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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"}
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        cam = context.scene.camera
 | 
				
			||||||
 | 
					        if not cam:
 | 
				
			||||||
 | 
					            context.scene.camera = anim_cam
 | 
				
			||||||
 | 
					            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 = set_resolution_from_cam_prop(main)
 | 
				
			||||||
 | 
					        if ret:
 | 
				
			||||||
 | 
					            self.report({ret[0]}, ret[1])
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return {"FINISHED"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
classes=(
 | 
					classes=(
 | 
				
			||||||
GPEXP_OT_render_scene_switch,
 | 
					GPEXP_OT_render_scene_switch,
 | 
				
			||||||
 | 
					GPEXP_OT_swap_render_cams,
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def register(): 
 | 
					def register(): 
 | 
				
			||||||
 | 
				
			|||||||
@ -2,7 +2,7 @@ bl_info = {
 | 
				
			|||||||
    "name": "GP Render",
 | 
					    "name": "GP Render",
 | 
				
			||||||
    "description": "Organise export of gp layers through compositor output",
 | 
					    "description": "Organise export of gp layers through compositor output",
 | 
				
			||||||
    "author": "Samuel Bernou",
 | 
					    "author": "Samuel Bernou",
 | 
				
			||||||
    "version": (0, 3, 3),
 | 
					    "version": (0, 3, 4),
 | 
				
			||||||
    "blender": (2, 93, 0),
 | 
					    "blender": (2, 93, 0),
 | 
				
			||||||
    "location": "View3D",
 | 
					    "location": "View3D",
 | 
				
			||||||
    "warning": "",
 | 
					    "warning": "",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										16
									
								
								ui.py
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								ui.py
									
									
									
									
									
								
							@ -15,9 +15,23 @@ class GPEXP_PT_gp_node_ui(Panel):
 | 
				
			|||||||
        layout = self.layout
 | 
					        layout = self.layout
 | 
				
			||||||
        layout.operator('gp.render_scene_switch', icon='SCENE_DATA', text='Switch Scene')
 | 
					        layout.operator('gp.render_scene_switch', icon='SCENE_DATA', text='Switch Scene')
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        if not context.scene.use_nodes or not context.scene.node_tree:
 | 
					        scn = context.scene
 | 
				
			||||||
 | 
					        if not scn.use_nodes or not scn.node_tree:
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        ## Camera swapping
 | 
				
			||||||
 | 
					        row = layout.row()
 | 
				
			||||||
 | 
					        cam = scn.camera
 | 
				
			||||||
 | 
					        if cam:
 | 
				
			||||||
 | 
					            text = f'{cam.name} : {scn.render.resolution_x}x{scn.render.resolution_y}' # Cam: 
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            text = f'None' # Cam: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        layout.separator()
 | 
				
			||||||
 | 
					        # if cam and cam_name == 'draw_cam':
 | 
				
			||||||
 | 
					        #     cam_name = f'{cam.parent.name} > {cam_name}'
 | 
				
			||||||
 | 
					        row.operator("gp.swap_render_cams", text=text, icon='OUTLINER_OB_CAMERA')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # TODO : add advanced bool checkbox to hide some options from the user
 | 
					        # TODO : add advanced bool checkbox to hide some options from the user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        col = layout.column(align=True)
 | 
					        col = layout.column(align=True)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user