Add an unloaded operator (for potential later use) to adjust scale custom prop of the plane to fit camera frame.
173 lines
6.7 KiB
Python
173 lines
6.7 KiB
Python
import bpy
|
|
from bpy.types import Panel
|
|
from .. constants import BGCOL, PREFIX
|
|
|
|
class BPM_PT_bg_manager_panel(Panel):
|
|
bl_idname = 'BPM_PT_bg_manager_panel'
|
|
bl_space_type = "VIEW_3D"
|
|
bl_region_type = "UI"
|
|
bl_category = "View"
|
|
bl_label = "BG Plane Manager"
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
scn = bpy.context.scene
|
|
|
|
# layout.label(text='Manual tests:')
|
|
# layout.operator('bpm.import_bg_images')
|
|
# layout.operator('bpm.convert_planes')
|
|
|
|
## Camera swapping
|
|
row = layout.row(align=True)
|
|
cam = context.scene.camera
|
|
|
|
# cam_name = cam.name if cam else 'None'
|
|
# if cam and cam_name == 'draw_cam':
|
|
# cam_name = f'{cam.parent.name} > {cam_name}'
|
|
# row.operator("bpm.swap_cams", text=cam_name, icon='OUTLINER_OB_CAMERA')
|
|
|
|
if cam:
|
|
anim_cam_name = 'anim_cam'
|
|
bg_cam_name = 'bg_cam'
|
|
in_anim = in_bg = False
|
|
|
|
if cam.name == 'anim_cam':
|
|
in_anim = True
|
|
|
|
elif cam.name == 'bg_cam':
|
|
in_bg = True
|
|
|
|
elif cam.name == 'draw_cam' and cam.parent:
|
|
if cam.parent.name == 'anim_cam':
|
|
in_anim = True
|
|
anim_cam_name = anim_cam_name + '> draw_cam'
|
|
|
|
elif cam.parent.name == 'bg_cam':
|
|
in_bg = True
|
|
bg_cam_name = bg_cam_name + '> draw_cam'
|
|
|
|
# in_bg_cam = context.scene.camera.name != 'bg_cam'
|
|
row.operator("bpm.swap_cams", text=anim_cam_name, icon='OUTLINER_OB_CAMERA', depress=in_anim)
|
|
row.operator("bpm.swap_cams", text=bg_cam_name, icon='OUTLINER_OB_CAMERA', depress=in_bg)
|
|
|
|
planes = [i.plane for i in scn.bg_props.planes]
|
|
|
|
if not planes:
|
|
## Show import/reload if nothing is in list
|
|
row = layout.row()
|
|
row.operator("bpm.import_bg_images", icon="IMPORT", text="Import Planes")
|
|
row.operator("bpm.reload_list", icon="FILE_REFRESH", text="")
|
|
return
|
|
|
|
## Show settings related to active plane
|
|
active_item = scn.bg_props.planes[scn.bg_props.index]
|
|
ob = active_item.plane
|
|
if not ob:
|
|
layout.operator("bpm.reload_list", icon="FILE_REFRESH", text="Need refresh")
|
|
return
|
|
|
|
bg_main_col = context.view_layer.layer_collection.children.get(BGCOL)
|
|
if not bg_main_col:
|
|
layout.label(text="No Background collection")
|
|
layout.label(text="Import plane automatically create hierarchy")
|
|
return
|
|
|
|
if active_item.type == 'bg':
|
|
layercol = bg_main_col.children.get(ob.name[len(PREFIX):])
|
|
if not layercol:
|
|
layout.label(text=f"No {ob.name} collection")
|
|
# return
|
|
|
|
col= layout.column()
|
|
## Backgrounds and Objects UI List
|
|
col.separator()
|
|
row = col.row()
|
|
list_row = row.row()
|
|
list_row.scale_y = scn.bg_props.ui_list_scale # 1.6
|
|
minimum_rows = 8
|
|
list_row.template_list("BPM_UL_bg_list", "", scn.bg_props, "planes", scn.bg_props, "index", rows=minimum_rows)
|
|
#https://docs.blender.org/api/blender2.8/bpy.types.UILayout.html#bpy.types.UILayout.template_list
|
|
|
|
col = row.column(align=True)
|
|
|
|
col.operator('bpm.create_and_place_in_camera', icon='OUTLINER_OB_GREASEPENCIL', text='').create = True
|
|
|
|
col.separator()
|
|
|
|
col.menu("BPM_MT_more_option", icon='DOWNARROW_HLT', text='')
|
|
|
|
col.separator()
|
|
|
|
col.operator('bpm.move_plane', icon='TRIA_UP', text='').direction = 'UP'
|
|
col.operator('bpm.move_plane', icon='TRIA_DOWN', text='').direction = 'DOWN'
|
|
|
|
col.separator()
|
|
# select toggle
|
|
# icon = 'RESTRICT_SELECT_ON' if ob.select_get() else 'RESTRICT_SELECT_OFF'
|
|
# col.operator("bpm.select_swap_active_bg", icon=icon, text='')
|
|
|
|
# lock
|
|
bg_col = bpy.data.collections.get(BGCOL)
|
|
if bg_col:
|
|
# lock_icon = 'LOCKED' if bg_col.hide_select else 'UNLOCKED'
|
|
col.prop(bg_col, 'hide_select', icon='LOCKED', text='', invert_checkbox=True) # # emboss=False
|
|
# col.prop(bg_col, 'hide_select', text='') # origin select icon
|
|
|
|
# select all
|
|
col.operator('bpm.select_all', icon='RESTRICT_SELECT_OFF', text='')
|
|
|
|
col = layout.column()
|
|
col.use_property_split = True
|
|
if active_item.type == 'bg':
|
|
row = col.row()
|
|
tex_ob = next((o for o in ob.children), None)
|
|
if not tex_ob:
|
|
layout.label(text='Missing Image Child', icon='ERROR')
|
|
return
|
|
|
|
row.prop(scn.bg_props, 'opacity', slider=True)
|
|
|
|
# row.operator("bpm.change_background_type", icon="NODE_TEXTURE", text=text_bg_type)
|
|
|
|
if tex_ob.type == 'MESH' and len(tex_ob.data.materials):
|
|
text_mode = 'Clip' if tex_ob.data.materials[0].blend_method == 'CLIP' else 'Blend'
|
|
row.operator("bpm.change_material_alpha_mode", icon="MATERIAL", text=text_mode)
|
|
|
|
# located under list
|
|
row = layout.row()
|
|
row.label(text='Move:')
|
|
if active_item.type == 'bg':
|
|
row.operator("bpm.set_distance", text=f"Distance {ob['distance']:.1f}m")
|
|
row.prop(scn.bg_props, 'move_hidden', text='Hidden')
|
|
|
|
elif active_item.type == 'obj':
|
|
cam = context.scene.objects.get('bg_cam') or context.scene.camera
|
|
if hasattr(bpy.types, 'OBJECT_OT_depth_proportional_move'):
|
|
distance = (ob.matrix_world.to_translation() - cam.matrix_world.to_translation()).length
|
|
row.operator("object.depth_proportional_move", text=f"Distance {distance:.1f}m") # icon='TRANSFORM_ORIGINS'
|
|
else:
|
|
row.label(text=f"Distance {(ob.matrix_world.to_translation() - cam.matrix_world.to_translation()).length:.1f}m")
|
|
|
|
if active_item.type == 'bg':
|
|
row = layout.row()
|
|
# row.label(text='Actions:')
|
|
## Send object to a plane
|
|
row = layout.row()
|
|
row.operator("bpm.send_gp_to_plane")
|
|
## parent to object
|
|
active = context.object
|
|
if active and active.parent and active not in planes:
|
|
layout.label(text=f'{active.parent.name} > {active.name}')
|
|
text='Clear Parent '
|
|
else:
|
|
text='Parent To Plane'
|
|
row.operator("bpm.parent_to_bg", text=text)
|
|
|
|
|
|
def register():
|
|
bpy.utils.register_class(BPM_PT_bg_manager_panel)
|
|
|
|
def unregister():
|
|
if hasattr(bpy.types, BPM_PT_bg_manager_panel.bl_idname):
|
|
bpy.utils.unregister_class(BPM_PT_bg_manager_panel)
|