-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmbl_multi_render.py
158 lines (126 loc) · 5.09 KB
/
mbl_multi_render.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import bpy
bl_info = {
"name": "Multi Render",
"author": "Mike Lundahl <[email protected]>",
"description": "Renders filtered objects to their own image file",
"blender": (3, 1, 2),
"version": (1, 2, 0),
"category": "3D View"
}
class OBJECT_OT_multi_render(bpy.types.Operator):
bl_idname = "object.multi_render"
bl_label = "OBJECT_OT_multi_render"
bl_options = {'REGISTER', 'UNDO'}
my_filter: bpy.props.StringProperty(name="String Value")
my_filter_freeze: bpy.props.StringProperty(name="String Value")
my_ray_visibility: bpy.props.BoolProperty(name="Boolean Value")
def execute(self, context):
self.report(
{'INFO'}, 'Render finished!'
)
print("Render started")
initRender(self.my_filter, self.my_filter_freeze, self.my_ray_visibility)
return {'FINISHED'}
class VIEW3D_PT_multi_render(bpy.types.Panel):
bl_label = "Multi Render"
bl_idname = "VIEW3D_PT_panel_multi_render"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'MBL utils'
def draw(self, context):
layout = self.layout
row = layout.row()
row.prop(context.scene, 'filter_check')
row_freeze = layout.row()
row_freeze.prop(context.scene, 'filter_freeze')
row_ray_viz = layout.row()
row_ray_viz.prop(context.scene, 'ray_vis')
props = self.layout.operator('object.multi_render', text='RENDER')
props.my_filter = context.scene.filter_check
props.my_filter_freeze = context.scene.filter_freeze
props.my_ray_visibility = context.scene.ray_vis
def register():
bpy.types.Scene.filter_check = bpy.props.StringProperty(name="Filter")
bpy.types.Scene.filter_freeze = bpy.props.StringProperty(name="Freeze")
bpy.types.Scene.ray_vis = bpy.props.BoolProperty(
name="Ray Visibility",
description="Hides from camera but keeps visible in ray calculations, like reflections, shadows etc.",
)
bpy.utils.register_class(OBJECT_OT_multi_render)
bpy.utils.register_class(VIEW3D_PT_multi_render)
def unregister():
bpy.types.Scene.filter_check = bpy.props.StringProperty(name="Filter")
bpy.types.Scene.filter_freeze = bpy.props.StringProperty(name="Freeze")
bpy.types.Scene.ray_vis = bpy.props.BoolProperty(
name="Ray_vis",
description="Hides from camera but keeps visible in ray calculations, like reflections, shadows etc.",
default = False
)
bpy.utils.unregister_class(OBJECT_OT_multi_render)
bpy.utils.unregister_class(VIEW3D_PT_multi_render)
def selectObjects(the_object_name):
bpy.ops.object.select_pattern(pattern="*" + the_object_name + "*", case_sensitive=True, extend=False)
return bpy.context.selected_objects
def deselectUnselectedObjects(ray_visibility):
bpy.ops.object.select_all(action='INVERT')
selected_objects = bpy.context.selected_objects
hideAllEditableObjects(selected_objects, ray_visibility)
def renderObject():
print('Rendering image')
bpy.ops.render.render(animation=False, write_still=True, use_viewport=True, layer="gold", scene="")
def setOutput(index, the_object_name, base_path):
bpy.context.scene.render.filepath = base_path + the_object_name + str(index) + ".png"
def hideAllEditableObjects(objects, ray_visibility):
for o in objects:
if o.type == 'MESH':
if ray_visibility:
o.visible_camera = False
else:
o.hide_viewport = True
o.hide_render = True
def unhideAndRender(objects, object_names, base_path, selected_freezed_objects, freeze_objects, ray_visibility):
for index, o in enumerate(objects):
print("Rendering ", str(index + 1), "of ", str(len(objects)))
setOutput(index, object_names, base_path)
if ray_visibility:
o.visible_camera = True
else:
o.hide_viewport = False
o.hide_render = False
if len(freeze_objects) >= 1 and len(selected_freezed_objects) >= 1:
unhide_freezed(selected_freezed_objects, ray_visibility)
renderObject()
if ray_visibility:
o.visible_camera = False
else:
o.hide_viewport = True
o.hide_render = True
def unhide_freezed(objects, ray_visibility):
print("Unhiding freezed")
for index, o in enumerate(objects):
if ray_visibility:
o.visible_camera = True
else:
o.hide_viewport = False
o.hide_render = False
def unhideAllObjects(objects, ray_visibility):
for o in objects:
if ray_visibility:
o.visible_camera = True
else:
o.hide_viewport = False
o.hide_render = False
def resetOutput(base_path):
bpy.context.scene.render.filepath = base_path
def initRender(the_objects, freeze_objects, ray_visibility):
base_path = bpy.context.scene.render.filepath
print("Render initiated")
print("Freeze filter: ", freeze_objects)
selected_objects = selectObjects(the_objects)
selected_freezed_objects = selectObjects(freeze_objects)
deselectUnselectedObjects(ray_visibility)
hideAllEditableObjects(selected_objects, ray_visibility)
unhideAndRender(selected_objects, the_objects, base_path, selected_freezed_objects, freeze_objects, ray_visibility)
unhideAllObjects(selected_objects, ray_visibility)
resetOutput(base_path)
print("Rendering finished!")