Для того чтобы быстро переключaть шейдинг геометрии из плоского режима flat в сглаженный режим smooth и обратно, нужно соответствующим образом менять значение свойства “smooth” для каждого полигона меша.
Простое включение сглаженного smooth шейдинга для текущего активного объекта можно выполнить следующим образом:
1 2 |
obj = bpy.context.object obj.data.polygons.foreach_set('use_smooth', [True] * len(obj.data.polygons)) |
Если вместо True указать False – будет включен плоский flat шейдинг.
Чтобы сделать тогглинг – переключение шейдинга туда-сюда между этими двумя режимами, можно использовать для свойства “smooth” оператор “not”:
1 2 3 |
obj = bpy.context.object for i in range(len(obj.data.polygons)): setattr(obj.data.polygons[i], 'use_smooth', not obj.data.polygons[i].use_smooth) |
Каждый раз при выполнении этого кода шейдинг будет переключаться с текущего режима на противоположный.
Определим стандартный оператор, в функцию execute которого поместим код тогглинга режимов шейдинга:
1 2 3 4 5 6 7 8 9 10 11 |
class Shade_OP_Toggle(bpy.types.Operator): bl_idname = 'shade.toggle' bl_label = 'SHADE' def execute(self, context): # toggle shade flat-smooth for obj in context.selected_objects: for p in obj.data.polygons: setattr(p, 'use_smooth', not p.use_smooth) context.object.data.update() return {'FINISHED'} |
Для каждого из выделенных объектов мы проходим по его полигонам и переключаем шейдинг на обратный.
Для того чтобы изменения сразу же отразились в 3D вьюпорте, мы выполняем команду обновления для данных объекта:
1 |
context.object.data.update() |
Определим пользовательскую панель в окне 3D вьюпорта с именем SHADE:
1 2 3 4 5 6 7 8 9 |
class SHADE_PT_Panel(bpy.types.Panel): bl_idname = 'SHADE_PT_panel' bl_label = 'SHADE' bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'SHADE' def draw(self, context): self.layout.operator('shade.toggle', text = 'Toggle Shade') |
В функции draw мы задаем кнопку с надписью Toggle Shade, которая вызывает определенный нами ранее оператор тогглинга шейдинга.
Не забудем зарегистрировать классы оператора и панели в Blender Python API:
1 2 |
register_class(Shade_OP_Toggle) register_class(SHADE_PT_Panel) |
Теперь при каждом нажатии на кнопку на нашей панели у всех выбранных объектов шейдинг будет переключаться на противоположный.