From 2def7cb534c97b6b99999a0829cfb28bc1dfe694 Mon Sep 17 00:00:00 2001 From: meta-androcto Date: Mon, 17 Apr 2017 12:22:40 +1000 Subject: Initial Commit Render Clay: T51229 T50357 --- render_clay.py | 225 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 render_clay.py (limited to 'render_clay.py') diff --git a/render_clay.py b/render_clay.py new file mode 100644 index 00000000..d53878b0 --- /dev/null +++ b/render_clay.py @@ -0,0 +1,225 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# + +bl_info = { + "name": "Clay Render", + "author": "Fabio Russo ", + "version": (1, 2), + "blender": (2, 56, 0), + "location": "Render > Clay Render", + "description": "This script, applies a temporary material to all objects"\ + " of the scene.", + "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/" + "Scripts/Clay_Render", + "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/", + "category": "Render"} + +import bpy +from bpy.props import BoolProperty + + +def Create_Mat(): + id = bpy.data.materials.new("Clay_Render") + #diffuse + id.diffuse_shader = "OREN_NAYAR" + id.diffuse_color = 0.800, 0.741, 0.536 + id.diffuse_intensity = 1 + id.roughness = 0.909 + #specular + id.specular_shader = "COOKTORR" + id.specular_color = 1, 1, 1 + id.specular_hardness = 10 + id.specular_intensity = 0.115 + + +def Alternative_Clay(self, msg): + Find = False + AM = None + i = 0 + for mat in bpy.data.materials: + if (mat.Mat_Clay) and (not Find): + Find = True + AM = mat + i += 1 + + else: + if (mat.Mat_Clay): + i += 1 + + if msg is True: + if (i == 1): + self.report({'INFO'}, "The material \"" + AM.name + "\" is set "\ + "as Clay!") + else: + if (i > 1): + self.report({'WARNING'}, "Two or more materials are set as "\ + "Clay. \"" + AM.name + "\" will be used!") + + return AM + + +def Get_Mat(): + Mat = bpy.data.materials["Clay_Render"] + return Mat + + +def Exist_Mat(): + if bpy.data.materials.get("Clay_Render"): + return True + + else: + return False + + +class ClayPinned(bpy.types.Operator): + bl_idname = "render.clay_pinned" + bl_label = "Clay Pinned" + bl_description = "Clay Material Stores" + + def execute(self, context): + if bpy.types.Scene.Clay_Pinned: + bpy.types.Scene.Clay_Pinned = False + else: + if bpy.types.Scene.Clay: + if bpy.data.materials[0].users == 0: + bpy.data.materials.remove(Get_Mat()) + bpy.types.Scene.Clay_Pinned = True + + else: + bpy.types.Scene.Clay_Pinned = True + + return {'FINISHED'} + + +class CheckClay(bpy.types.Operator): + bl_idname = "render.clay" + bl_label = "Clay Render" + bl_description = "Use Clay Render" + + def execute(self, context): + if bpy.types.Scene.Clay: + #Clay Attivato + ac = Alternative_Clay(self, True) + if ac is None: + if not Exist_Mat(): + Create_Mat() + rl = context.scene.render.layers + rl.active.material_override = Get_Mat() + + else: + context.scene.render.layers.active.material_override = ac + + bpy.types.Scene.Clay = False + + else: + context.scene.render.layers.active.material_override = None + if bpy.types.Scene.Clay_Pinned: + if bpy.data.materials[0].users == 0: + bpy.data.materials.remove(Get_Mat()) + bpy.types.Scene.Clay = True + + return {'FINISHED'} + + +def draw_clay_render(self, context): + ok_clay = not bpy.types.Scene.Clay + pin = not bpy.types.Scene.Clay_Pinned + + rnl = context.scene.render.layers.active + split = self.layout.split() + col = split.column() + + col.operator(CheckClay.bl_idname, emboss=False, icon='CHECKBOX_HLT'\ + if ok_clay else 'CHECKBOX_DEHLT') + col = split.column() + if Alternative_Clay(self, False) is None: + if Exist_Mat(): + if (bpy.data.materials[0].users == 0) or (ok_clay): + row = col.row(align=True) + im = Get_Mat() + row.prop(im, "diffuse_color", text="") + row.operator(ClayPinned.bl_idname, text="", icon='PINNED'\ + if pin else 'UNPINNED') + + if ok_clay: + row.active = True + + else: + row.active = False + + else: + col.label('Clay Material applied to an object') + + else: + col.label('Custom Material Clay') + + self.layout.separator() + + +def draw_clay_options(self, context): + cm = context.material + layout = self.layout + layout.prop(cm, "Mat_Clay", text="Clay") + + +def draw_clay_warning(self, context): + if not bpy.types.Scene.Clay: + self.layout.label("Render Clay Enabled", "ERROR") + + +def register(): + bpy.types.Scene.Clay = BoolProperty( + name='Clay Render', + description='Use Clay Render', + default=False) + + bpy.types.Scene.Clay_Pinned = BoolProperty( + name='Clay Pinned', + description='Clay Material Stores', + default=False) + + bpy.types.Material.Mat_Clay = bpy.props.BoolProperty( + name='Use as Clay', + description='Use as Clay', + default=False) + + bpy.utils.register_class(ClayPinned) + bpy.utils.register_class(CheckClay) + bpy.types.RENDER_PT_render.prepend(draw_clay_render) + bpy.types.MATERIAL_PT_options.append(draw_clay_options) + bpy.types.INFO_HT_header.append(draw_clay_warning) + + +def unregister(): + bpy.context.scene.render.layers.active.material_override = None + if (Exist_Mat()) and (bpy.data.materials[0].users == 0): + bpy.data.materials.remove(Get_Mat()) + del bpy.types.Scene.Clay + del bpy.types.Scene.Clay_Pinned + del bpy.types.Material.Mat_Clay + bpy.utils.unregister_class(ClayPinned) + bpy.utils.unregister_class(CheckClay) + bpy.types.RENDER_PT_render.remove(draw_clay_render) + bpy.types.MATERIAL_PT_options.remove(draw_clay_options) + bpy.types.INFO_HT_header.remove(draw_clay_warning) + + +if __name__ == "__main__": + register() -- cgit v1.2.3