[Bf-extensions-cvs] [1de24bff] master: render_clay: moved to contrib: T63750

meta-androcto noreply at git.blender.org
Fri May 24 09:06:05 CEST 2019


Commit: 1de24bfff7653185368ccf680e880c570dd4d7a5
Author: meta-androcto
Date:   Fri May 24 17:05:41 2019 +1000
Branches: master
https://developer.blender.org/rBAC1de24bfff7653185368ccf680e880c570dd4d7a5

render_clay: moved to contrib: T63750

===================================================================

A	render_clay.py

===================================================================

diff --git a/render_clay.py b/render_clay.py
new file mode 100644
index 00000000..da53aa64
--- /dev/null
+++ b/render_clay.py
@@ -0,0 +1,221 @@
+# ##### 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 = {
+    "name": "Clay Render",
+    "author": "Fabio Russo <ruesp83 at libero.it>",
+    "version": (1, 2, 1),
+    "blender": (2, 56, 0),
+    "location": "Render > Clay Render",
+    "description": "This script, applies a temporary material to all objects"
+                   " of the scene",
+    "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
+                "Scripts/Clay_Render",
+    "category": "Render"}
+
+import bpy
+from bpy.types import Operator
+from bpy.props import BoolProperty
+
+
+def Create_Mat():
+    mat_id = bpy.data.materials.new("Clay_Render")
+    # diffuse
+    mat_id.diffuse_shader = "OREN_NAYAR"
+    mat_id.diffuse_color = 0.800, 0.741, 0.536
+    mat_id.diffuse_intensity = 1
+    mat_id.roughness = 0.909
+    # specular
+    mat_id.specular_shader = "COOKTORR"
+    mat_id.specular_color = 1, 1, 1
+    mat_id.specular_hardness = 10
+    mat_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
+
+    return False
+
+
+class ClayPinned(Operator):
+    bl_idname = "render.clay_pinned"
+    bl_label = "Clay Pinned"
+    bl_description = ("Keep current Clay Material settings if Clay Render is disabled\n"
+                      "The Material will not have a Fake User set, so it'll be lost\n"
+                      "on quitting Blender or loading / reloading a blend file")
+
+    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(Operator):
+    bl_idname = "render.clay"
+    bl_label = "Clay Render"
+    bl_description = "Enable Clay render override"
+
+    def execute(self, context):
+        if bpy.types.Scene.Clay:
+            # Clay activated
+            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
+
+    box = self.layout.box()
+    row = box.row(align=True)
+    row.operator(CheckClay.bl_idname, emboss=True, icon='RADIOBUT_ON' if
+                 ok_clay else 'RADIOBUT_OFF')
+
+    if Alternative_Clay(self, False) is None:
+        if Exist_Mat():
+            if (bpy.data.materials[0].users == 0) or ok_clay:
+                im = Get_Mat()
+                row.prop(im, "diffuse_color", text="")
+                row.operator(ClayPinned.bl_idname, text="", icon='PINNED' if
+                             pin else 'UNPINNED')
+                row.active = ok_clay
+            else:
+                spacer_box = row.box()
+                sub_row = spacer_box.row(align=True)
+                sub_row.scale_y = 0.5
+                sub_row.label(text="Clay Material applied to an Object", icon="INFO")
+    else:
+        spacer_box = row.box()
+        sub_row = spacer_box.row(align=True)
+        sub_row.scale_y = 0.5
+        sub_row.label(text="Custom Material Clay", icon="INFO")
+
+
+def draw_clay_options(self, context):
+    cm = context.material
+    layout = self.layout
+    layout.prop(cm, "Mat_Clay", text="Use as Clay", icon="META_EMPTY", toggle=True)
+
+
+def draw_clay_warning(self, context):
+    if not bpy.types.Scene.Clay:
+        self.layout.label(text="Clay Render Enabled", icon="INFO")
+
+
+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="Keep Clay Material",
+            default=False
+            )
+    bpy.types.Material.Mat_Clay = BoolProperty(
+            name="Use as Clay",
+            description="Use as Clay Material render override",
+            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())
+    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)
+
+    del bpy.types.Scene.Clay
+    del bpy.types.Scene.Clay_Pinned
+    del bpy.types.Material.Mat_Clay
+
+
+if __name__ == "__main__":
+    register()



More information about the Bf-extensions-cvs mailing list