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

135 lines
5.2 KiB
Python

import bpy
from bpy.types import Operator
from bpy.props import StringProperty
from bpy.utils import register_class, unregister_class
from .messages import print_message
from .utils import SBConstants
class SimpleBake_OT_PreviewBakeType(Operator):
"""Preview what will be baked for this bake type by configuring materials"""
bl_idname = "simplebake.preview_bake_type"
bl_label = "Preview"
bl_description = "Preview this bake type in the viewport by configuring object materials"
bake_type: StringProperty()
def execute(self, context):
sbp = context.scene.SimpleBake_Props
bake_type = self.bake_type
# Start by removing any existing preview
bpy.ops.simplebake.restore_preview()
bake_objects = [item.obj_point for item in sbp.objects_list if item.obj_point is not None]
if bake_type in SBConstants.ALL_SPECIALS:
if bake_type == SBConstants.COLOURID:
from .bake_operators.specials_bake_operators import SimpleBake_OT_Setup_Col_ID
SimpleBake_OT_Setup_Col_ID.clear()
for obj in bake_objects:
bpy.ops.simplebake.specials_mats_swapping(mode="record", obj_name=obj.name)
if bake_type == SBConstants.COLOURID:
bpy.ops.simplebake.setup_col_id(obj_name=obj.name)
elif bake_type == SBConstants.VERTEXCOL:
if not obj.data.color_attributes:
continue
bpy.ops.simplebake.import_and_assign_specials(bake_mode=bake_type, obj_name=obj.name)
bpy.ops.simplebake.setup_vertex_col(obj_name=obj.name)
else: # AO, Thickness, Curvature, Lightmap
bpy.ops.simplebake.import_and_assign_specials(bake_mode=bake_type, obj_name=obj.name)
else:
# Initialise / clear any stale material tags from a previous preview or bake
bpy.ops.simplebake.material_backup(mode="initialise")
# Remove node groups (also performs master backup of all object materials).
# Only available on Blender 4.1+, which is the minimum for this addon.
bpy.ops.simplebake.pbr_pre_bake()
# Remove reroute nodes from all object materials
bpy.ops.simplebake.remove_reroutes()
# Per-object: working backup then configure materials for the target bake type
for obj in bake_objects:
bpy.ops.simplebake.material_backup(
target_object_name=obj.name,
mode="working_backup"
)
bpy.ops.simplebake.prepare_object_mats_pbr(
target_name=obj.name,
this_bake=bake_type,
bake_operation_id="",
no_bake_image_node=True
)
# Switch Solid viewports to Material Preview so the preview is visible
sbp.preview_changed_shading = False
for area in context.screen.areas:
if area.type == 'VIEW_3D':
for space in area.spaces:
if space.type == 'VIEW_3D':
if space.shading.type == 'SOLID':
space.shading.type = 'MATERIAL'
sbp.preview_changed_shading = True
print_message(context, f"Preview active: {bake_type}")
sbp.preview_active = True
sbp.preview_bake_type = bake_type
return {'FINISHED'}
class SimpleBake_OT_RestorePreview(Operator):
"""Restore materials after a bake type preview"""
bl_idname = "simplebake.restore_preview"
bl_label = "Restore Materials"
bl_description = "Restore object materials to their original state after previewing"
def execute(self, context):
sbp = context.scene.SimpleBake_Props
if sbp.preview_bake_type in SBConstants.ALL_SPECIALS:
bake_objects = [item.obj_point for item in sbp.objects_list if item.obj_point is not None]
for obj in bake_objects:
bpy.ops.simplebake.specials_mats_swapping(mode="restore", obj_name=obj.name)
else:
# Restore working-mode duplicates first (scene-wide, no object name needed)
bpy.ops.simplebake.material_backup(mode="working_restore")
# Then restore master duplicates (scene-wide)
bpy.ops.simplebake.material_backup(mode="master_restore")
if sbp.preview_changed_shading:
for area in context.screen.areas:
if area.type == 'VIEW_3D':
for space in area.spaces:
if space.type == 'VIEW_3D':
if space.shading.type == 'MATERIAL':
space.shading.type = 'SOLID'
sbp.preview_changed_shading = False
print_message(context, "Preview materials restored")
sbp.preview_active = False
sbp.preview_bake_type = ""
return {'FINISHED'}
classes = [
SimpleBake_OT_PreviewBakeType,
SimpleBake_OT_RestorePreview,
]
def register():
global classes
for cls in classes:
register_class(cls)
def unregister():
global classes
for cls in classes:
unregister_class(cls)