Files
blender-portable-repo/scripts/addons/SimpleBake/ui/panel_operators.py
T
2026-07-16 12:41:53 -06:00

327 lines
9.5 KiB
Python

import bpy
from bpy.utils import register_class, unregister_class
from bpy.types import Operator
from bpy.props import StringProperty
import os
from ..utils import SBConstants, specials_selection_to_list, get_base_folder_patho
from ..messages import print_message
from ..presets_local import sb_prop_group_to_dict, deep_getattr
from ..presets import scene_props
import json
def auto_set_bake_margin():
context = bpy.context
multiplier = 4
current_width = context.scene.SimpleBake_Props.imgwidth
margin = (current_width / 1024) * multiplier
margin = round(margin, 0)
context.scene.render.bake.margin = int(margin)
return True
class SimpleBake_OT_selectall_pbr(Operator):
"""Select all PBR bake types"""
bl_idname = "simplebake.selectall_pbr"
bl_label = "Select All"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
sbp.selected_col = True
sbp.selected_metal = True
sbp.selected_rough = True
sbp.selected_normal = True
sbp.selected_trans = True
sbp.selected_transrough = True
sbp.selected_emission = True
sbp.selected_emission_strength = True
sbp.selected_clearcoat = True
sbp.selected_clearcoat_rough = True
sbp.selected_specular = True
sbp.selected_alpha = True
sbp.selected_sss = True
sbp.selected_sss_scale = True
sbp.selected_ssscol = True
sbp.selected_bump = True
sbp.selected_displacement = True
return {'FINISHED'}
class SimpleBake_OT_selectnone_pbr(Operator):
"""Select none PBR bake types"""
bl_idname = "simplebake.selectnone_pbr"
bl_label = "Select None"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
sbp.selected_col = False
sbp.selected_metal = False
sbp.selected_rough = False
sbp.selected_normal = False
sbp.selected_trans = False
sbp.selected_transrough = False
sbp.selected_emission = False
sbp.selected_emission_strength = False
sbp.selected_clearcoat = False
sbp.selected_clearcoat_rough = False
sbp.selected_specular = False
sbp.selected_sss = False
sbp.selected_sss_scale = False
sbp.selected_ssscol = False
sbp.selected_bump = False
sbp.selected_displacement = False
if not (sbp.selected_s2a == True and sbp.s2a_opmode == "decals"):
sbp.selected_alpha = False
return {'FINISHED'}
class SimpleBake_OT_increase_texture_res(Operator):
"""Increase texture resolution by 1k"""
bl_idname = "simplebake.increase_texture_res"
bl_label = "+1k"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
x = sbp.imgwidth
sbp.imgwidth = x + 1024
y = sbp.imgheight
sbp.imgheight = y + 1024
while sbp.imgheight % 1024 != 0:
sbp.imgheight -= 1
while sbp.imgwidth % 1024 != 0:
sbp.imgwidth -= 1
result = min(sbp.imgwidth, sbp.imgheight)
sbp.imgwidth = result
sbp.imgheight = result
auto_set_bake_margin()
return {'FINISHED'}
class SimpleBake_OT_decrease_texture_res(Operator):
"""Decrease texture resolution by 1k"""
bl_idname = "simplebake.decrease_texture_res"
bl_label = "-1k"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
x = sbp.imgwidth
sbp.imgwidth = x - 1024
y = sbp.imgheight
sbp.imgheight = y - 1024
if sbp.imgheight < 1:
sbp.imgheight = 1024
if sbp.imgwidth < 1:
sbp.imgwidth = 1024
while sbp.imgheight % 1024 != 0:
sbp.imgheight += 1
while sbp.imgwidth % 1024 != 0:
sbp.imgwidth += 1
result = max(sbp.imgwidth, sbp.imgheight)
sbp.imgwidth = result
sbp.imgheight = result
auto_set_bake_margin()
return {'FINISHED'}
class SimpleBake_OT_increase_output_res(Operator):
"""Increase output resolution by 1k"""
bl_idname = "simplebake.increase_output_res"
bl_label = "+1k"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
x = sbp.outputwidth
sbp.outputwidth = x + 1024
y = sbp.outputheight
sbp.outputheight = y + 1024
while sbp.outputheight % 1024 != 0:
sbp.outputheight -= 1
while sbp.outputwidth % 1024 != 0:
sbp.outputwidth -= 1
result = min(sbp.outputwidth, sbp.outputheight)
sbp.outputwidth = result
sbp.outputheight = result
auto_set_bake_margin()
return {'FINISHED'}
class SimpleBake_OT_decrease_output_res(Operator):
"""Decrease output resolution by 1k"""
bl_idname = "simplebake.decrease_output_res"
bl_label = "-1k"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
x = sbp.outputwidth
sbp.outputwidth = x - 1024
y = sbp.outputheight
sbp.outputheight = y - 1024
if sbp.outputheight < 1:
sbp.outputheight = 1024
if sbp.outputwidth < 1:
sbp.outputwidth = 1024
while sbp.outputheight % 1024 != 0:
sbp.outputheight += 1
while sbp.outputwidth % 1024 != 0:
sbp.outputwidth += 1
result = max(sbp.outputwidth, sbp.outputheight)
sbp.outputwidth = result
sbp.outputheight = result
auto_set_bake_margin()
return {'FINISHED'}
class SimpleBake_OT_panel_show_all(Operator):
"""Show all SimpleBake panel items"""
bl_idname = "simplebake.panel_show_all"
bl_label = "Show all"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
sbp.showtips = True
sbp.presets_show = True
sbp.bake_objects_show = True
sbp.materials_show = True
sbp.pbr_settings_show = True
sbp.aov_settings_show = True
sbp.cyclesbake_settings_show = True
sbp.specials_show = True
sbp.textures_show = True
sbp.export_show = True
sbp.uv_show = True
sbp.other_show = True
sbp.channelpacking_show = True
sbp.admin_settings_show = True
return {'FINISHED'}
class SimpleBake_OT_panel_hide_all(Operator):
"""Hide all SimpleBake panel items"""
bl_idname = "simplebake.panel_hide_all"
bl_label = "Hide all"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
sbp.showtips = False
sbp.presets_show = False
sbp.bake_objects_show = False
sbp.materials_show = False
sbp.pbr_settings_show = False
sbp.aov_settings_show = False
sbp.cyclesbake_settings_show = False
sbp.specials_show = False
sbp.textures_show = False
sbp.export_show = False
sbp.uv_show = False
sbp.other_show = False
sbp.channelpacking_show = False
sbp.admin_settings_show = False
return {'FINISHED'}
class SimpleBake_OT_Protect_Clear(Operator):
"""If you are online, you likely need to complete the 'I am not a robot' check on the web server. Click here to do that. All will be explained..."""
bl_idname = "simplebake.protect_clear"
bl_label = "Launch web browser"
def execute(self, context):
import webbrowser
webbrowser.open('http://www.toohey.co.uk/SimpleBake/protect_clear.html', new=2)
return {'FINISHED'}
class SimpleBake_OT_Copy_Settings_Clipboard(Operator):
"""Copy all current SimpleBake settings to the clipboard as JSON"""
bl_idname = "simplebake.copy_settings_clipboard"
bl_label = "Copy Settings to Clipboard"
def execute(self, context):
d = sb_prop_group_to_dict(context)
for p in scene_props:
d[p] = deep_getattr(context.scene, p)
context.window_manager.clipboard = json.dumps(d, indent=2)
self.report({"INFO"}, "SimpleBake settings copied to clipboard")
return {'FINISHED'}
class SimpleBake_OT_Export_Path_To_Blend_Location(Operator):
"""Set export path to the location of current blend file"""
bl_idname = "simplebake.export_path_to_blend_location"
bl_label = "Set"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
sbp.export_path = get_base_folder_patho(context).as_posix() + "/SimpleBake_Bakes"
sbp.export_path = bpy.path.relpath(sbp.export_path)
return {'FINISHED'}
#def invoke(self, context, event):b
#context.window_manager.fileselect_add(self)
#return {'RUNNING_MODAL'}
classes = ([
SimpleBake_OT_selectall_pbr,
SimpleBake_OT_selectnone_pbr,
SimpleBake_OT_increase_texture_res,
SimpleBake_OT_decrease_texture_res,
SimpleBake_OT_increase_output_res,
SimpleBake_OT_decrease_output_res,
SimpleBake_OT_panel_show_all,
SimpleBake_OT_panel_hide_all,
SimpleBake_OT_Protect_Clear,
SimpleBake_OT_Export_Path_To_Blend_Location,
SimpleBake_OT_Copy_Settings_Clipboard,
])
def register():
global classes
for cls in classes:
register_class(cls)
def unregister():
global classes
for cls in classes:
unregister_class(cls)