Skip to content
Snippets Groups Projects
render_clay.py 6.44 KiB
Newer Older
  • Learn to ignore specific revisions
  • Fabio Russo's avatar
    Fabio Russo committed
    # ##### 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 #####
    
    # <pep8 compliant>
    
    
    bl_info = {
    
    Fabio Russo's avatar
    Fabio Russo committed
        "name": "Clay Render",
        "author": "Fabio Russo <ruesp83@libero.it>",
    
    Fabio Russo's avatar
    Fabio Russo committed
        "version": (1, 2),
    
        "blender": (2, 56, 0),
    
    Fabio Russo's avatar
    Fabio Russo committed
        "location": "Render > Clay Render",
        "description": "This script, applies a temporary material to all objects"\
    
    Fabio Russo's avatar
    Fabio Russo committed
            " of the scene.",
    
        "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
    
    Fabio Russo's avatar
    Fabio Russo committed
            "Scripts/Clay_Render",
    
        "tracker_url": "https://developer.blender.org/T22971",
    
    Fabio Russo's avatar
    Fabio Russo committed
        "category": "Render"}
    
    import bpy
    from bpy.props import BoolProperty
    
    
    
    Fabio Russo's avatar
    Fabio Russo committed
    def Create_Mat():
    
    Fabio Russo's avatar
    Fabio Russo committed
        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
    
    Fabio Russo's avatar
    Fabio Russo committed
    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
    
    
    Campbell Barton's avatar
    Campbell Barton committed
        if msg is True:
    
    Fabio Russo's avatar
    Fabio Russo committed
            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
    
    
    
    Fabio Russo's avatar
    Fabio Russo committed
    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
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    
    
    Fabio Russo's avatar
    Fabio Russo committed
    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'}
    
    
    
    Fabio Russo's avatar
    Fabio Russo committed
    class CheckClay(bpy.types.Operator):
        bl_idname = "render.clay"
        bl_label = "Clay Render"
    
    Fabio Russo's avatar
    Fabio Russo committed
        bl_description = "Use Clay Render"
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    
    Fabio Russo's avatar
    Fabio Russo committed
        def execute(self, context):
            if bpy.types.Scene.Clay:
    
    Fabio Russo's avatar
    Fabio Russo committed
                #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
    
    
    Fabio Russo's avatar
    Fabio Russo committed
                bpy.types.Scene.Clay = False
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    
    Fabio Russo's avatar
    Fabio Russo committed
            else:
                context.scene.render.layers.active.material_override = None
    
    Fabio Russo's avatar
    Fabio Russo committed
                if bpy.types.Scene.Clay_Pinned:
                    if bpy.data.materials[0].users == 0:
                        bpy.data.materials.remove(Get_Mat())
    
    Fabio Russo's avatar
    Fabio Russo committed
                bpy.types.Scene.Clay = True
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    
    Fabio Russo's avatar
    Fabio Russo committed
            return {'FINISHED'}
    
    Fabio Russo's avatar
    Fabio Russo committed
    def draw_clay_render(self, context):
    
    Fabio Russo's avatar
    Fabio Russo committed
        ok_clay = not bpy.types.Scene.Clay
    
    Fabio Russo's avatar
    Fabio Russo committed
        pin = not bpy.types.Scene.Clay_Pinned
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    
    Fabio Russo's avatar
    Fabio Russo committed
        rnl = context.scene.render.layers.active
    
    Fabio Russo's avatar
    Fabio Russo committed
        split = self.layout.split()
        col = split.column()
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    
    Fabio Russo's avatar
    Fabio Russo committed
        col.operator(CheckClay.bl_idname, emboss=False, icon='CHECKBOX_HLT'\
            if ok_clay else 'CHECKBOX_DEHLT')
    
    Fabio Russo's avatar
    Fabio Russo committed
        col = split.column()
    
    Fabio Russo's avatar
    Fabio Russo committed
        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')
    
    
    Fabio Russo's avatar
    Fabio Russo committed
        self.layout.separator()
    
    Fabio Russo's avatar
    Fabio Russo committed
    def draw_clay_options(self, context):
        cm = context.material
        layout = self.layout
        layout.prop(cm, "Mat_Clay", text="Clay")
    
    
    
    Fabio Russo's avatar
    Fabio Russo committed
    def draw_clay_warning(self, context):
        if not bpy.types.Scene.Clay:
            self.layout.label("Render Clay Enabled", "ERROR")
    
    
    
    Fabio Russo's avatar
    Fabio Russo committed
    def register():
    
    Fabio Russo's avatar
    Fabio Russo committed
        bpy.types.Scene.Clay = BoolProperty(
        name='Clay Render',
        description='Use Clay Render',
        default=False)
    
    Fabio Russo's avatar
    Fabio Russo committed
    
        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)
    
    
    Fabio Russo's avatar
    Fabio Russo committed
        bpy.utils.register_class(ClayPinned)
        bpy.utils.register_class(CheckClay)
    
    Fabio Russo's avatar
    Fabio Russo committed
        bpy.types.RENDER_PT_render.prepend(draw_clay_render)
        bpy.types.MATERIAL_PT_options.append(draw_clay_options)
    
    Fabio Russo's avatar
    Fabio Russo committed
        bpy.types.INFO_HT_header.append(draw_clay_warning)
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    
    def unregister():
    
    Fabio Russo's avatar
    Fabio Russo committed
        bpy.context.scene.render.layers.active.material_override = None
        if (Exist_Mat()) and (bpy.data.materials[0].users == 0):
    
    Fabio Russo's avatar
    Fabio Russo committed
            bpy.data.materials.remove(Get_Mat())
    
    Fabio Russo's avatar
    Fabio Russo committed
        del bpy.types.Scene.Clay
    
    Fabio Russo's avatar
    Fabio Russo committed
        del bpy.types.Scene.Clay_Pinned
        del bpy.types.Material.Mat_Clay
    
    Fabio Russo's avatar
    Fabio Russo committed
        bpy.utils.unregister_class(ClayPinned)
        bpy.utils.unregister_class(CheckClay)
    
    Fabio Russo's avatar
    Fabio Russo committed
        bpy.types.RENDER_PT_render.remove(draw_clay_render)
        bpy.types.MATERIAL_PT_options.remove(draw_clay_options)
    
    Fabio Russo's avatar
    Fabio Russo committed
        bpy.types.INFO_HT_header.remove(draw_clay_warning)
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    
    Fabio Russo's avatar
    Fabio Russo committed
    
    if __name__ == "__main__":
        register()