Merge branch 'master' into blender2.8
[blender-addons.git] / render_clay.py
blobda53aa64a7f7b84700195796ac31f6032672622e
1 # ##### BEGIN GPL LICENSE BLOCK #####
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software Foundation,
15 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # ##### END GPL LICENSE BLOCK #####
19 # <pep8 compliant>
21 bl_info = {
22 "name": "Clay Render",
23 "author": "Fabio Russo <ruesp83@libero.it>",
24 "version": (1, 2, 1),
25 "blender": (2, 56, 0),
26 "location": "Render > Clay Render",
27 "description": "This script, applies a temporary material to all objects"
28 " of the scene",
29 "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
30 "Scripts/Clay_Render",
31 "category": "Render"}
33 import bpy
34 from bpy.types import Operator
35 from bpy.props import BoolProperty
38 def Create_Mat():
39 mat_id = bpy.data.materials.new("Clay_Render")
40 # diffuse
41 mat_id.diffuse_shader = "OREN_NAYAR"
42 mat_id.diffuse_color = 0.800, 0.741, 0.536
43 mat_id.diffuse_intensity = 1
44 mat_id.roughness = 0.909
45 # specular
46 mat_id.specular_shader = "COOKTORR"
47 mat_id.specular_color = 1, 1, 1
48 mat_id.specular_hardness = 10
49 mat_id.specular_intensity = 0.115
52 def Alternative_Clay(self, msg):
53 Find = False
54 AM = None
55 i = 0
56 for mat in bpy.data.materials:
57 if (mat.Mat_Clay) and (not Find):
58 Find = True
59 AM = mat
60 i += 1
61 else:
62 if (mat.Mat_Clay):
63 i += 1
65 if msg is True:
66 if (i == 1):
67 self.report({'INFO'},
68 "The material \"" + AM.name + "\" is set as Clay")
69 else:
70 if (i > 1):
71 self.report({'WARNING'},
72 "Two or more materials are set as "
73 "Clay. \"" + AM.name + "\" will be used")
75 return AM
78 def Get_Mat():
79 Mat = bpy.data.materials["Clay_Render"]
80 return Mat
83 def Exist_Mat():
84 if bpy.data.materials.get("Clay_Render"):
85 return True
87 return False
90 class ClayPinned(Operator):
91 bl_idname = "render.clay_pinned"
92 bl_label = "Clay Pinned"
93 bl_description = ("Keep current Clay Material settings if Clay Render is disabled\n"
94 "The Material will not have a Fake User set, so it'll be lost\n"
95 "on quitting Blender or loading / reloading a blend file")
97 def execute(self, context):
98 if bpy.types.Scene.Clay_Pinned:
99 bpy.types.Scene.Clay_Pinned = False
100 else:
101 if bpy.types.Scene.Clay:
102 if bpy.data.materials[0].users == 0:
103 bpy.data.materials.remove(Get_Mat())
104 bpy.types.Scene.Clay_Pinned = True
105 else:
106 bpy.types.Scene.Clay_Pinned = True
108 return {'FINISHED'}
111 class CheckClay(Operator):
112 bl_idname = "render.clay"
113 bl_label = "Clay Render"
114 bl_description = "Enable Clay render override"
116 def execute(self, context):
117 if bpy.types.Scene.Clay:
118 # Clay activated
119 ac = Alternative_Clay(self, True)
120 if ac is None:
121 if not Exist_Mat():
122 Create_Mat()
123 rl = context.scene.render.layers
124 rl.active.material_override = Get_Mat()
126 else:
127 context.scene.render.layers.active.material_override = ac
129 bpy.types.Scene.Clay = False
131 else:
132 context.scene.render.layers.active.material_override = None
133 if bpy.types.Scene.Clay_Pinned:
134 if bpy.data.materials[0].users == 0:
135 bpy.data.materials.remove(Get_Mat())
136 bpy.types.Scene.Clay = True
138 return {'FINISHED'}
141 def draw_clay_render(self, context):
142 ok_clay = not bpy.types.Scene.Clay
143 pin = not bpy.types.Scene.Clay_Pinned
145 box = self.layout.box()
146 row = box.row(align=True)
147 row.operator(CheckClay.bl_idname, emboss=True, icon='RADIOBUT_ON' if
148 ok_clay else 'RADIOBUT_OFF')
150 if Alternative_Clay(self, False) is None:
151 if Exist_Mat():
152 if (bpy.data.materials[0].users == 0) or ok_clay:
153 im = Get_Mat()
154 row.prop(im, "diffuse_color", text="")
155 row.operator(ClayPinned.bl_idname, text="", icon='PINNED' if
156 pin else 'UNPINNED')
157 row.active = ok_clay
158 else:
159 spacer_box = row.box()
160 sub_row = spacer_box.row(align=True)
161 sub_row.scale_y = 0.5
162 sub_row.label(text="Clay Material applied to an Object", icon="INFO")
163 else:
164 spacer_box = row.box()
165 sub_row = spacer_box.row(align=True)
166 sub_row.scale_y = 0.5
167 sub_row.label(text="Custom Material Clay", icon="INFO")
170 def draw_clay_options(self, context):
171 cm = context.material
172 layout = self.layout
173 layout.prop(cm, "Mat_Clay", text="Use as Clay", icon="META_EMPTY", toggle=True)
176 def draw_clay_warning(self, context):
177 if not bpy.types.Scene.Clay:
178 self.layout.label(text="Clay Render Enabled", icon="INFO")
181 def register():
182 bpy.types.Scene.Clay = BoolProperty(
183 name="Clay Render",
184 description="Use Clay Render",
185 default=False
187 bpy.types.Scene.Clay_Pinned = BoolProperty(
188 name="Clay Pinned",
189 description="Keep Clay Material",
190 default=False
192 bpy.types.Material.Mat_Clay = BoolProperty(
193 name="Use as Clay",
194 description="Use as Clay Material render override",
195 default=False
198 bpy.utils.register_class(ClayPinned)
199 bpy.utils.register_class(CheckClay)
200 bpy.types.RENDER_PT_render.prepend(draw_clay_render)
201 bpy.types.MATERIAL_PT_options.append(draw_clay_options)
202 bpy.types.INFO_HT_header.append(draw_clay_warning)
205 def unregister():
206 bpy.context.scene.render.layers.active.material_override = None
207 if (Exist_Mat()) and (bpy.data.materials[0].users == 0):
208 bpy.data.materials.remove(Get_Mat())
209 bpy.utils.unregister_class(ClayPinned)
210 bpy.utils.unregister_class(CheckClay)
211 bpy.types.RENDER_PT_render.remove(draw_clay_render)
212 bpy.types.MATERIAL_PT_options.remove(draw_clay_options)
213 bpy.types.INFO_HT_header.remove(draw_clay_warning)
215 del bpy.types.Scene.Clay
216 del bpy.types.Scene.Clay_Pinned
217 del bpy.types.Material.Mat_Clay
220 if __name__ == "__main__":
221 register()